From b58c88bda381ec654d54c57606f54b4c69e6acad Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Sat, 29 Aug 2020 18:28:07 -0700 Subject: [PATCH] initial checkin for lispusers --- .../0001READ-ME-BEFORE-YOU-TRY-TO-PRINT.TEDIT | Bin 0 -> 1342 bytes lispusers/001-TITLE-PAGE.TEDIT | Bin 0 -> 5632 bytes lispusers/002TABLE-OF-CONTENTS.TEDIT | Bin 0 -> 5819 bytes lispusers/ACE | 1893 +++++++++++++++++ lispusers/ACE-APPLEDEMO.ACE | 1 + lispusers/ACE-BOUNCINGBALL.ACE | 1 + lispusers/ACE-FOUETTE.ACE | 1 + lispusers/ACE-MAIN | 1 + lispusers/ACE-PRIM | 1 + lispusers/ACE.TEDIT | Bin 0 -> 36207 bytes lispusers/ADDRESSBOOK | 1 + lispusers/ADDRESSBOOK.TEDIT | Bin 0 -> 16442 bytes lispusers/AIREGIONS | 1 + lispusers/AIREGIONS-DEMO | 1 + lispusers/AIREGIONS.TEDIT | 70 + lispusers/AISBLT | 1 + lispusers/AISBLT.TEDIT | Bin 0 -> 7463 bytes lispusers/ANALYZER | 1 + lispusers/ANALYZER.TEDIT | Bin 0 -> 2279 bytes lispusers/AUTOSAMEDIR | 1 + lispusers/AUTOSAMEDIR.TEDIT | Bin 0 -> 3432 bytes lispusers/AUXMENU | 1 + lispusers/AUXMENU.TEDIT | Bin 0 -> 5285 bytes lispusers/BACKGROUND-DurerCats.BITMAP | 1 + lispusers/BACKGROUND-RHINE.PRESS | Bin 0 -> 105472 bytes lispusers/BACKGROUND-STEINHEIM.PRESS | Bin 0 -> 105472 bytes lispusers/BACKGROUND-TIFFANY.PRESS | Bin 0 -> 105472 bytes lispusers/BACKGROUND-moonwithstars.press | Bin 0 -> 106496 bytes lispusers/BACKGROUND-parc.PRESS | Bin 0 -> 105472 bytes lispusers/BACKGROUND-twodollar.PRESS | Bin 0 -> 105472 bytes lispusers/BACKGROUNDIMAGES | 1 + lispusers/BACKGROUNDMENU | 1 + lispusers/BICLOCK | 1 + lispusers/BICLOCK.TEDIT | Bin 0 -> 12352 bytes lispusers/BIGGER-FONT | 1 + lispusers/BITMAP-GALLERY | 1 + lispusers/BITMAP-GALLERY.TEDIT | Bin 0 -> 84639 bytes lispusers/BITMAPFNS | 1 + lispusers/BITMAPFNS.TEDIT | Bin 0 -> 4240 bytes lispusers/BLACKBOX | 1 + lispusers/BLACKBOX.TEDIT | Bin 0 -> 27768 bytes lispusers/BLOCKS-HKB | 1 + lispusers/BMENCODE | 1 + lispusers/BOYERMOORE | 1 + lispusers/BRKDWNREPORT | 1 + lispusers/BUTTONS | 1 + lispusers/BUTTONS.TEDIT | Bin 0 -> 8481 bytes lispusers/BackgroundImages.TEDIT | Bin 0 -> 15363 bytes lispusers/BackgroundMenu.TEDIT | Bin 0 -> 11441 bytes lispusers/C150STREAM | 1 + lispusers/CALENDAR | 1 + lispusers/CALENDAR.TEDIT | 19 + lispusers/CANVASCONVERTER.TEDIT | Bin 0 -> 6107 bytes lispusers/CD | 1 + lispusers/CD.TEDIT | Bin 0 -> 6591 bytes lispusers/CHATEMACS | 1 + lispusers/CHATEMACS.TEDIT | Bin 0 -> 7205 bytes lispusers/CHATSERVER | 1 + lispusers/CHATSERVER-NS | 1 + lispusers/CHATSERVER-RS232 | 1 + lispusers/CHATSERVER-TCP | 1 + lispusers/CHATSERVER.TEDIT | Bin 0 -> 8331 bytes lispusers/CHECKSET | 1 + lispusers/CHECKSET.TEDIT | Bin 0 -> 3627 bytes lispusers/CIRCLPRINT | 1 + lispusers/CIRCLPRINT.SKETCH | Bin 0 -> 7855 bytes lispusers/CL-TTYEDIT | 1 + lispusers/CL-TTYEDIT.TEDIT | Bin 0 -> 3444 bytes lispusers/COLOR | 1 + lispusers/COLORDEMO | 1 + lispusers/COLORNNCC | 1 + lispusers/COLOROBJ | 1 + lispusers/COLORPOLYGONS | 1 + lispusers/COMMENTHACKS | 1 + lispusers/COMMON-MAKE | 1 + lispusers/COMMWINDOW | 1 + lispusers/COMMWINDOW.TEDIT | Bin 0 -> 9241 bytes lispusers/COMPARE-PATHS | 1 + lispusers/COMPAREDIRECTORIES | 145 ++ lispusers/COMPAREDIRECTORIES.TEDIT | Bin 0 -> 4442 bytes lispusers/COMPARESOURCES | 1 + lispusers/COMPARESOURCES.TEDIT | Bin 0 -> 9365 bytes lispusers/COMPARETEXT | 654 ++++++ lispusers/COMPARETEXT.TEDIT | Bin 0 -> 6144 bytes lispusers/COMPILEBANG | 1 + lispusers/COMPILEBANG.TEDIT | Bin 0 -> 3934 bytes lispusers/COURIERDEFS | 1 + lispusers/COURIERDEFS.TEDIT | Bin 0 -> 3555 bytes lispusers/COURIEREVALSERVE | 1 + lispusers/COURIEREVALSERVE.TEDIT | Bin 0 -> 3517 bytes lispusers/COURIERIMAGESTREAM | 1 + lispusers/COURIERIMAGESTREAM.TEDIT | Bin 0 -> 6767 bytes lispusers/COURIERSERVE | 1 + lispusers/COURIERSERVE.TEDIT | Bin 0 -> 9906 bytes lispusers/COURIERSERVEPATCH | 1 + lispusers/CROCK | 1 + lispusers/CROCK.TEDIT | Bin 0 -> 6651 bytes lispusers/CUT-HKB | 1 + lispusers/DANDELIONUFO | 1 + lispusers/DANDELIONUFO4096 | 1 + lispusers/DATATYPESPLUS | 1 + lispusers/DATE | 1 + lispusers/DATEFNS | 1 + lispusers/DATEFORMAT-EDITOR | 1 + lispusers/DATEFORMAT-EDITOR.TEDIT | Bin 0 -> 12050 bytes lispusers/DATESORT | 1 + lispusers/DATESORT.TEDIT | 1 + lispusers/DEBUGGER-CONTEXT | 1 + lispusers/DECL | 1 + lispusers/DECL.TEDIT | 110 + lispusers/DEDITHARDCOPY | 1 + lispusers/DEFAULTICON | 1 + lispusers/DEFAULTSUBITEMFN | 1 + lispusers/DEFAULTSUBITEMFN.TEDIT | Bin 0 -> 3427 bytes lispusers/DEFINERPRINT | 1 + lispusers/DIALPHONE | 1 + lispusers/DIALPHONE.TEDIT | Bin 0 -> 5916 bytes lispusers/DICOLOR | 1 + lispusers/DICT-WINDOW-TYPES | 1 + lispusers/DICTTOOL | 1 + lispusers/DICTTOOL.TEDIT | 16 + lispusers/DIGEST | 1 + lispusers/DIGI-CLOCK | 1 + lispusers/DIGI-CLOCK.TEDIT | Bin 0 -> 5617 bytes lispusers/DINFO | 1 + lispusers/DIR-TREE.TEDIT | Bin 0 -> 9615 bytes lispusers/DIRGRAPHER | 1 + lispusers/DLIONFNKEYS | 1 + lispusers/DOC-OBJECTS | 1 + lispusers/DOC-OBJECTS.TEDIT | Bin 0 -> 10114 bytes lispusers/DONZ | 1 + lispusers/DONZ.TEDIT | Bin 0 -> 4994 bytes lispusers/DORADOCOLOR | 1 + lispusers/DPUPFTPPATCH | 1 + lispusers/DSPSCALE | 1 + lispusers/DSPSCALE.TEDIT | Bin 0 -> 10181 bytes lispusers/DUMPER | 1 + lispusers/DUMPLOAD | 1 + lispusers/Debugger-Context.TEdit | Bin 0 -> 3587 bytes lispusers/DocumentationTemplate.TEdit | Bin 0 -> 15425 bytes lispusers/EDITBG | 1 + lispusers/EDITBG.TEDIT | Bin 0 -> 15150 bytes lispusers/EDITFONT | 1 + lispusers/EDITKEYS | 1 + lispusers/EDITKEYS.TEDIT | Bin 0 -> 3774 bytes lispusers/EMACS | 1 + lispusers/ENDNOTE | 1 + lispusers/EQUATIONEXAMPLES.TEDIT | 10 + lispusers/EQUATIONFORMS | 1 + lispusers/EQUATIONS | 1 + lispusers/EQUATIONS.TEDIT | Bin 0 -> 10901 bytes lispusers/ETHERBOOT | 1 + lispusers/ETHERBOOT.TEDIT | Bin 0 -> 8706 bytes lispusers/EVAL-WHEN-PATCH | 1 + lispusers/EVALOBJ | 1 + lispusers/EXAMPLES.LGC | 1 + lispusers/EYECON | 1 + lispusers/EquationEditorPrgmersGuide.TEDIT | Bin 0 -> 30564 bytes lispusers/ExtendedVmem-Lisp.run | Bin 0 -> 90266 bytes lispusers/ExtendedVmem-Lisp.syms | Bin 0 -> 17094 bytes lispusers/FASTEDITBM | 1 + lispusers/FILECACHE-FIX | 1 + lispusers/FILENAMES | 1 + lispusers/FILEWATCH | 1 + lispusers/FILEWATCH.TEDIT | Bin 0 -> 10388 bytes lispusers/FILLREGION | 1 + lispusers/FILLREGION.TEDIT | Bin 0 -> 11080 bytes lispusers/FIND-CITATION | 1 + lispusers/FINGER | 1 + lispusers/FINGER.TEDIT | Bin 0 -> 6149 bytes lispusers/FM-CREATOR | 1 + lispusers/FM-CREATOR.TEDIT | Bin 0 -> 88255 bytes lispusers/FONTDECLS | 1 + lispusers/FONTSAMPLER | 1 + lispusers/FONTSAMPLER.TEDIT | Bin 0 -> 4921 bytes lispusers/FORMACRO | 1 + lispusers/FTPSERVER-MULTI-CONNECTIONS.TEDIT | Bin 0 -> 5304 bytes lispusers/FTPSERVERPATCH | 1 + lispusers/FileCacheMsgWindow | 1 + lispusers/GACHAE.LC1-SF | 1 + lispusers/GACHAE.LC2-SF | 1 + lispusers/GACHAE.NUM-SF | 1 + lispusers/GACHAE.S1-SF | 1 + lispusers/GACHAE.S2-SF | 1 + lispusers/GACHAE.UC1-SF | 1 + lispusers/GACHAE.UC2-SF | 1 + lispusers/GENERIC-INIT | 1 + lispusers/GRAPHCALLS | 1 + lispusers/GRAPHCALLS.TEDIT | 26 + lispusers/GRAPHGROUP.TEDIT | Bin 0 -> 3630 bytes lispusers/GREP | 1 + lispusers/GREP.TEDIT | Bin 0 -> 3697 bytes lispusers/GRID-ICONS | 1 + lispusers/GRID-ICONS.TEDIT | Bin 0 -> 19996 bytes lispusers/GraphGroup | 1 + lispusers/H-BLOCKS.HKB | 1 + lispusers/H-CUT.HKB | 1 + lispusers/H-ENV | 1 + lispusers/H-LOAD | 1 + lispusers/H-LOOPS.HKB | 1 + lispusers/H-MAZE.HKB | 1 + lispusers/H-PATCHES | 1 + lispusers/H-SOURCE | 1 + lispusers/H.TEDIT | Bin 0 -> 11139 bytes lispusers/HANOI | 1 + lispusers/HANOI.TEDIT | Bin 0 -> 3194 bytes lispusers/HARDCOPY-RETAIN | 1 + lispusers/HARDCOPY-RETAIN.TEDIT | Bin 0 -> 2930 bytes lispusers/HASHBUFFER | 1 + lispusers/HASHBUFFER.TEDIT | Bin 0 -> 6420 bytes lispusers/HASHDATUM | 1 + lispusers/HASHDATUM.TEDIT | Bin 0 -> 5389 bytes lispusers/HEADLINE | 1 + lispusers/HEADLINE.TEDIT | Bin 0 -> 4898 bytes lispusers/HELPSYS | 1 + lispusers/HELPSYS.TEDIT | Bin 0 -> 6547 bytes lispusers/HGRAPH | 1 + lispusers/HOSTUP | 1 + lispusers/HOSTUP.TEDIT | Bin 0 -> 3382 bytes lispusers/HPGL | 1 + lispusers/HPGL.TEDIT | Bin 0 -> 9313 bytes lispusers/HYPERDESK-INIT | 1 + lispusers/HYPERDESK-LOG | 1 + lispusers/HYPERDESK.SUITE | 1 + lispusers/HYPERDESK.TEDIT | Bin 0 -> 9425 bytes lispusers/HYPERFLOOR.SUITE | 1 + lispusers/IDEASKETCH | 1 + lispusers/IDEASKETCH.TEDIT | Bin 0 -> 2891 bytes lispusers/IDLEDRAIN | 1 + lispusers/IDLEHAX | 1 + lispusers/IDLEHAX.TEDIT | Bin 0 -> 5253 bytes lispusers/IDLESWAP | 1 + lispusers/INDEX | 1 + lispusers/INSPECTCODE-TEDIT | 1 + lispusers/INSPECTCODE-TEDIT.TEDIT | Bin 0 -> 6338 bytes lispusers/IPTALK | 1 + lispusers/IRIS.TEdit | Bin 0 -> 34594 bytes lispusers/IRISCONSTANTS | 1 + lispusers/IRISDEMOFNS | 1 + lispusers/IRISIO | 1 + lispusers/IRISLIB | 1 + lispusers/IRISNET | 1 + lispusers/IRISSTREAM | 1 + lispusers/IRISVIEW | 1 + lispusers/KEYOBJ | 1 + lispusers/KEYOBJ.TEDIT | Bin 0 -> 3988 bytes lispusers/KINETIC | 1 + lispusers/KINETIC.TEDIT | Bin 0 -> 6476 bytes lispusers/KOTOLOGO | 1 + lispusers/KOTOLOGO.TEDIT | Bin 0 -> 11140 bytes lispusers/LABEL | 1 + lispusers/LAFITE-INDENT | 1 + lispusers/LAFITE-INDENT.TEDIT | Bin 0 -> 11839 bytes lispusers/LAFITEABBREV | 1 + lispusers/LAFITEABBREV.TEDIT | Bin 0 -> 11885 bytes lispusers/LAFITEPRIVATEDL | 1 + lispusers/LAFITETIMEDDELETE | 1 + lispusers/LAFITETIMEDDELETE.TEDIT | Bin 0 -> 9759 bytes lispusers/LAMBDATRAN | 1 + lispusers/LAMBDATRAN.TEDIT | Bin 0 -> 6645 bytes lispusers/LAYOUT-SEDIT | 1 + lispusers/LICENSE | 21 + lispusers/LIFE | 1 + lispusers/LIFE.TEDIT | Bin 0 -> 3211 bytes lispusers/LISPNERD | 1 + lispusers/LISPNERD.TEDIT | Bin 0 -> 5071 bytes lispusers/LISPUSERS-DEPENDENCIES.TEDIT | 1 + lispusers/LOADIRIS | 1 + lispusers/LOADMENUITEMS | 1 + lispusers/LOADMENUITEMS.TEDIT | Bin 0 -> 16032 bytes lispusers/LOGIC | 1 + lispusers/LOGIC-DEVEL | 1 + lispusers/LOGIC-EXAMPLES.LGC | 1 + lispusers/LOGIC-UNIFIER | 1 + lispusers/LOGIC.LGC | 1 + lispusers/LOGIC.LISP | 1 + lispusers/LOGIC.TEDIT | Bin 0 -> 34376 bytes lispusers/LOGTIME | 1 + lispusers/LOGTIME.TEDIT | Bin 0 -> 6437 bytes lispusers/LOOKUPINFILES | 1 + lispusers/LOOKUPINFILES.TEDIT | Bin 0 -> 15771 bytes lispusers/LUPINE | 1 + lispusers/LispUsers-README.tedit | Bin 0 -> 3240 bytes lispusers/LispUsers-Rules.TEdit | Bin 0 -> 7344 bytes lispusers/LispUsers-Summary.TEdit | 10 + lispusers/LispUsers-Template-Instr.TEdit | Bin 0 -> 66027 bytes lispusers/LispUsers-Template.TEdit | Bin 0 -> 4417 bytes lispusers/LispUsers.tty | 1 + lispusers/LoadPatches | 1 + lispusers/MACINTERFACE | 1 + lispusers/MACINTERFACE.TXT | 52 + lispusers/MACWINDOW | 1 + lispusers/MAGNIFIER | 1 + lispusers/MAGNIFIER.TEDIT | Bin 0 -> 4089 bytes lispusers/MAILSHARE | 1 + lispusers/MAIN.LGC | 1 + lispusers/MAKEGRAPH | 1 + lispusers/MAKEGRAPH.TEDIT | Bin 0 -> 11709 bytes lispusers/MANAGER | 1 + lispusers/MANAGER.HISTORY | 1 + lispusers/MANAGER.TEDIT | Bin 0 -> 33601 bytes lispusers/MANDELBROT | 1 + lispusers/MATHSERVER | 1 + lispusers/MATHSERVER.COMMANDFILES | 13 + lispusers/MATHTONS | 1 + lispusers/MATHTONS.TEDIT | Bin 0 -> 2734 bytes lispusers/MATRIXOPS | 1 + lispusers/MESATOLISP | 1 + lispusers/MICROTEK | 1 + lispusers/MICROTEKPRINT | 1 + lispusers/MISSILE | 1 + lispusers/MISSILE.tedit | Bin 0 -> 3053 bytes lispusers/MONITOR | 1 + lispusers/MONITOR.TEDIT | Bin 0 -> 34437 bytes lispusers/MTP | 1 + lispusers/MULTIPLE-HARDCOPY | 1 + lispusers/NEATICONS | 1 + lispusers/NEATICONS.TEDIT | Bin 0 -> 29466 bytes lispusers/NGROUP | 1 + lispusers/NOTECARDS-4045XLPPATCH | 1 + lispusers/NOTEPAD | 1 + lispusers/NOTEPAD-CORESTYLES | 1 + lispusers/NOTEPAD.TEDIT | Bin 0 -> 10253 bytes lispusers/NOVAFONT | 1 + lispusers/NOVAFONT.TEDIT | Bin 0 -> 2439 bytes lispusers/NSALLOCATION | 1 + lispusers/NSCOPYFILE | 1 + lispusers/NSCOPYFILE.TEDIT | Bin 0 -> 5238 bytes lispusers/NSDISPLAYSIZES | 1 + lispusers/NSDISPLAYSIZES.TEDIT | Bin 0 -> 6436 bytes lispusers/NSPROTECTION | 1 + lispusers/NSPROTECTION.TEDIT | Bin 0 -> 31497 bytes lispusers/NSREADERPATCH | 1 + lispusers/NSROUTINGHASH | 1 + lispusers/NSTALK | 1 + lispusers/NSTALKGAP | 1 + lispusers/NSTHASIZE | 1 + lispusers/OSS-LYRIC-PATCHES | 1 + lispusers/PAC-MAN-IDLE | 1 + lispusers/PACKED-STRUCTURE | 1 + lispusers/PACMAN | 1 + lispusers/PACMAN.TEDIT | Bin 0 -> 10408 bytes lispusers/PAGEHOLD | 1 + lispusers/PAGEHOLD.TEDIT | Bin 0 -> 11753 bytes lispusers/PARSER | 1 + lispusers/PARSERG | 1 + lispusers/PATCH-LARGEIPBITMAP | 1 + lispusers/PATCH-TWOSIDED | 1 + lispusers/PCMEMTEST | 1 + lispusers/PHONE-DIRECTORY | 1 + lispusers/PHONE-DIRECTORY.TEDIT | Bin 0 -> 10456 bytes lispusers/PIECE-MENUS | 1 + lispusers/PIECE-MENUS.TEDIT | Bin 0 -> 6994 bytes lispusers/PIXELBLT | 1 + lispusers/PLAY | 1 + lispusers/PLOT | 1 + lispusers/PLOT.TEDIT | 348 +++ lispusers/PLOTANDNC-PATCH | 1 + lispusers/PLOTBOXPATCH | 1 + lispusers/PLOTBOXPATCH.TEDIT | Bin 0 -> 2910 bytes lispusers/PLOTEXAMPLES | 1 + lispusers/PLOTEXAMPLES.TEDIT | Bin 0 -> 3753 bytes lispusers/PLOTINSKETCH | 1 + lispusers/PLOTOBJECTS | 1 + lispusers/PLOTOBJECTS.TEDIT | 145 ++ lispusers/PLOTOBJECTS1 | 1 + lispusers/PLOTOBJECTS1.TEDIT | Bin 0 -> 6850 bytes lispusers/PLOTOBJECTS2 | 1 + lispusers/PLOTOBJECTS2.TEDIT | Bin 0 -> 4581 bytes lispusers/PORT-CLFILE | 1 + lispusers/POSTSCRIPT/BECKMAN01-MRR-C0.PSCFONT | Bin 0 -> 554 bytes lispusers/POSTSCRIPT/POSTSCRIPTSTREAM | 1 + lispusers/POSTSCRIPTSTREAM.TEDIT | 11 + lispusers/PP-CODE-FILE | 1 + lispusers/PREEMPTIVE | 1 + lispusers/PREEMPTIVE.TEDIT | Bin 0 -> 3695 bytes lispusers/PRESSFROMNS | 1 + lispusers/PRESSFROMNS.TEDIT | Bin 0 -> 9032 bytes lispusers/PRETTYFILEINDEX | 1 + lispusers/PRETTYFILEINDEX.TEDIT | 22 + lispusers/PRINTERMENU | 1 + lispusers/PRINTERMENU.TEDIT | Bin 0 -> 4047 bytes lispusers/PROGRAMCHAT | 1 + lispusers/PROGRAMCHAT.TEDIT | Bin 0 -> 4268 bytes lispusers/PROMPTREMINDERS | 1 + lispusers/PROMPTREMINDERS.TEDIT | Bin 0 -> 8056 bytes lispusers/PROOFREADER | 1 + lispusers/PROOFREADER.TEDIT | Bin 0 -> 9531 bytes lispusers/PS-PATCH | 1 + lispusers/PS-RS232 | 1 + lispusers/PS-RS232.TEDIT | Bin 0 -> 3223 bytes lispusers/PS-SEND | 1 + lispusers/PS-SEND.TEDIT | Bin 0 -> 5099 bytes lispusers/PS-SKETCH-PATCH | 1 + lispusers/PS-SKETCH-PATCH.TEDIT | Bin 0 -> 2289 bytes lispusers/PS-TTY | 1 + lispusers/PS-TTY.TEDIT | Bin 0 -> 3181 bytes lispusers/PS-patch.tedit | Bin 0 -> 2443 bytes lispusers/PSCFONT-FIX-FILENAME | 1 + lispusers/QEDIT | 1 + lispusers/QEDIT.TEDIT | Bin 0 -> 14804 bytes lispusers/QIX | 1 + lispusers/READAIS | 1 + lispusers/READAIS.TEDIT | Bin 0 -> 8293 bytes lispusers/READAPPLEFONT | 1 + lispusers/READAPPLEFONT.TEDIT | Bin 0 -> 21327 bytes lispusers/READBRUSH | 1 + lispusers/READBRUSH.TEDIT | Bin 0 -> 3501 bytes lispusers/READDATATYPE | 1 + lispusers/READDATATYPE.TEDIT | Bin 0 -> 3781 bytes lispusers/READDISPLAYFONT | 1 + lispusers/READDISPLAYFONT.TEDIT | Bin 0 -> 3415 bytes lispusers/READEBCDIC | 1 + lispusers/READINTERPRESS | 1 + lispusers/README.md | 5 + lispusers/REGION | 1 + lispusers/REGION.TEDIT | Bin 0 -> 6358 bytes lispusers/REGISTER-MACHINE | 1 + lispusers/REMOTEPSW | 1 + lispusers/REMOTEPSW.TEDIT | Bin 0 -> 10713 bytes lispusers/RPC | 1 + lispusers/RPC.TEDIT | Bin 0 -> 25147 bytes lispusers/RPCCOMMON | Bin 0 -> 26605 bytes lispusers/RPCLOWLEVEL | 1 + lispusers/RPCOS | 1 + lispusers/RPCPORTMAPPER | 1 + lispusers/RPCRPC | 1 + lispusers/RPCSTRUCT | 1 + lispusers/RPCXDR | 1 + lispusers/RS232CNETWORK | 1 + lispusers/RS232CNETWORK.TEDIT | Bin 0 -> 5314 bytes lispusers/SCREENPAPER | 1 + lispusers/SCREENPAPER.TEDIT | Bin 0 -> 12208 bytes lispusers/SEARCHMENU | 1 + lispusers/SEARCHMENU.TEDIT | Bin 0 -> 8490 bytes lispusers/SEDIT-COMMONLISP | 1 + lispusers/SEDIT-MENU-ALWAYS | 1 + lispusers/SEDIT-MENU-ALWAYS.TEDIT | Bin 0 -> 2675 bytes lispusers/SEDIT-PATCHES | 1 + lispusers/SEDIT-PROFILE | 1 + lispusers/SETDEFAULTPRINTER | 1 + lispusers/SETDEFAULTPRINTER.TEDIT | Bin 0 -> 10148 bytes lispusers/SFFONT | 1 + lispusers/SHOWTIME | 1 + lispusers/SHOWTIME.TEDIT | Bin 0 -> 5830 bytes lispusers/SIGMA20-MRR-C0.DISPLAYFONT | Bin 0 -> 898 bytes lispusers/SIMPLECHAT | 1 + lispusers/SIMPLIFY | 1 + lispusers/SINGLEFILEINDEX | 1 + lispusers/SKETCHCOLOR | 1 + lispusers/SKETCHTALK | 1 + lispusers/SNAPW-ICON | 1 + lispusers/SNAPW-ICON.TEDIT | Bin 0 -> 2912 bytes lispusers/SOLID-MOVEW | 1 + lispusers/SOLID-MOVEW.TEDIT | Bin 0 -> 8033 bytes lispusers/SOLITAIRE | 1 + lispusers/SOLITAIRE.TEDIT | Bin 0 -> 3790 bytes lispusers/SPELLINGARRAY | Bin 0 -> 103732 bytes lispusers/STARBG | 1 + lispusers/STARBG.TEDIT | Bin 0 -> 7862 bytes lispusers/STEP-COMMAND-MENU | 1 + lispusers/STEP-COMMAND-MENU.TEDIT | Bin 0 -> 3163 bytes lispusers/STORAGE | 1 + lispusers/STORAGE.TEDIT | Bin 0 -> 17973 bytes lispusers/STREAMDECLS | 1 + lispusers/STYLESHEET | 1 + lispusers/STYLESHEET.TEDIT | Bin 0 -> 8315 bytes lispusers/SUPERPARENTHESES | 1 + lispusers/SUPERPARENTHESES.TEDIT | Bin 0 -> 3346 bytes lispusers/SYSTATS | 1 + lispusers/SYSTATS.TEDIT | Bin 0 -> 5194 bytes lispusers/SetStringLength.Tedit | Bin 0 -> 5450 bytes .../Standalone-LispUsers-Templ-Instr.TEdit | Bin 0 -> 66027 bytes lispusers/TALK | 1 + lispusers/TALK.TEDIT | Bin 0 -> 49882 bytes lispusers/TALKGAP | 1 + lispusers/TCPTIME | 1 + lispusers/TCPTIME.TEDIT | Bin 0 -> 6502 bytes lispusers/TEDIT-CLOSE-ON-SHRINK | 1 + lispusers/TEDIT-CLOSE-ON-SHRINK.TEDIT | Bin 0 -> 3188 bytes lispusers/TEDIT-LINE-NUMBERING | 1 + lispusers/TEDIT-LINE-NUMBERING.TEDIT | Bin 0 -> 6870 bytes lispusers/TEDITDORADOKEYS | 1 + lispusers/TEDITDORADOKEYS.DATABASE | 1 + lispusers/TEDITKEY | 1 + lispusers/TEDITKEY.TEDIT | 149 ++ lispusers/TEDITTALK | 1 + lispusers/TEK4010 | 1 + lispusers/TEK4010CHAT | 1 + lispusers/TEXTMODULES | 1 + lispusers/THINFILES | 143 ++ lispusers/TILED-SEDIT | 1 + lispusers/TILED-SEDIT.TEDIT | Bin 0 -> 6381 bytes lispusers/TIMESROMAN.LC1-SF | 1 + lispusers/TIMESROMAN.LC2-SF | 1 + lispusers/TIMESROMAN.NUM-SF | 1 + lispusers/TIMESROMAN.S1-SF | 1 + lispusers/TIMESROMAN.S3-SF | 1 + lispusers/TIMESROMAN.UC1-SF | 1 + lispusers/TMAX | 242 +++ lispusers/TMAX-DATE | 1 + lispusers/TMAX-ENDNOTE | 1 + lispusers/TMAX-INDEX | 186 ++ lispusers/TMAX-INTRO.TXT | 27 + lispusers/TMAX-NGRAPH | 1 + lispusers/TMAX-NGROUP | 662 ++++++ lispusers/TMAX-NUMBER | 1 + lispusers/TMAX-XREF | 236 ++ lispusers/TMAX.INDEX | Bin 0 -> 244 bytes lispusers/TMAX.TEDIT | Bin 0 -> 68521 bytes lispusers/TMAX.TOC | Bin 0 -> 2115 bytes lispusers/TMENU.TEDIT | Bin 0 -> 9947 bytes lispusers/TRAJECTORY-FOLLOWER | 1 + lispusers/TRAJECTORY-FOLLOWER.TEDIT | Bin 0 -> 4528 bytes lispusers/TRANSOR | 985 +++++++++ lispusers/TRANSOR-LOADTRAN | 58 + lispusers/TRANSOR-TO-COMMONLISP.XFORMS | 1 + lispusers/TRANSOR.BUGREPORTS | 1 + lispusers/TRANSOR.TEDIT | 1 + lispusers/TRICKLE | 1 + lispusers/TRICKLE.TEDIT | Bin 0 -> 5292 bytes lispusers/TSET | 1 + lispusers/TTYTALK | 1 + lispusers/TURBO-WINDOWS | 1 + lispusers/TURBO-WINDOWS.TEDIT | 12 + lispusers/TWODGRAPHICS | 1 + lispusers/TWODGRAPHICS.TEDIT | Bin 0 -> 10817 bytes lispusers/Tek4010CHAT.TEdit | Bin 0 -> 4770 bytes lispusers/UNBOXEDOPS | 1 + lispusers/UNBOXEDOPS.TEDIT | Bin 0 -> 10379 bytes lispusers/UNDIGESTIFY | 1 + lispusers/UNDIGESTIFY.TEDIT | Bin 0 -> 3835 bytes lispusers/UNIFIER | 1 + lispusers/UNIFIER.LISP | 1 + lispusers/UPCSTATS | 1 + lispusers/UPCSTATS.TEDIT | Bin 0 -> 2971 bytes lispusers/UTILISOPRS | 1 + lispusers/UUENCODE | 1 + lispusers/UUENCODE.TEDIT | Bin 0 -> 4682 bytes lispusers/VANILLA-INIT | 1 + lispusers/VSTATS | 1 + lispusers/VSTATS.IP | Bin 0 -> 31435 bytes lispusers/VSTATS.TEDIT | Bin 0 -> 16916 bytes lispusers/WALKFILES | 1 + lispusers/WALKFILES.TEDIT | Bin 0 -> 4518 bytes lispusers/WDWHACKS | 1 + lispusers/WDWHACKS.TEDIT | Bin 0 -> 3720 bytes lispusers/WHO-LINE | 1 + lispusers/WHO-LINE.TEDIT | 16 + lispusers/WHOCALLS | 1 + lispusers/WHOCALLS.TEDIT | Bin 0 -> 3642 bytes lispusers/WINK | 1 + lispusers/WINK.TEDIT | Bin 0 -> 14780 bytes lispusers/WORDNERD | 1 + lispusers/Wordfns.Tedit | 14 + lispusers/XCL-BRIDGE | 1 + lispusers/XORCURSORPATCH | 1 + lispusers/XORCursorPatch.TEdit | Bin 0 -> 4359 bytes lispusers/XREF | 1 + lispusers/bsearch | 1 + lispusers/canvasconverter | 1 + lispusers/chatemacs.el | 1 + lispusers/chatemacs.elc | Bin 0 -> 4438 bytes lispusers/circlprint.tedit | 20 + lispusers/classic10-c0.c150font | Bin 0 -> 8668 bytes lispusers/classic14-c0.c150font | Bin 0 -> 11982 bytes lispusers/classic18-c0.c150font | Bin 0 -> 14788 bytes lispusers/dinfo.tedit | Bin 0 -> 20165 bytes lispusers/document | 1 + lispusers/eyecon.tedit | Bin 0 -> 3885 bytes lispusers/fm-creator-examples/BACH.FMC | Bin 0 -> 6747 bytes lispusers/fm-creator-examples/DEMO.FMC | 1 + lispusers/formacro.tedit | Bin 0 -> 551 bytes lispusers/iso8859io | 362 ++++ lispusers/lispusers-info-msg.tedit | Bin 0 -> 4445 bytes lispusers/mathserverplot | 1 + lispusers/microtek.tedit | Bin 0 -> 65505 bytes lispusers/oss.lisp | 1 + lispusers/oss.txt | 1 + lispusers/osstst.lisp | 1 + lispusers/simplechat.tedit | Bin 0 -> 3535 bytes lispusers/sourcecompare.txt | 0 lispusers/tedit-process-killer | 1 + lispusers/tedit-process-killer.tedit | Bin 0 -> 5105 bytes lispusers/teditdoradokeys.tedit | Bin 0 -> 2606 bytes lispusers/timesroman10-c0.c150font | Bin 0 -> 17304 bytes lispusers/timesroman12-c0.c150font | Bin 0 -> 24274 bytes lispusers/timesroman14-c0.c150font | Bin 0 -> 28262 bytes lispusers/tkdorado | 1 + lispusers/tkdorado.tedit | Bin 0 -> 3066 bytes lispusers/tmenu | 1 + lispusers/xcl-bridge.tedit | Bin 0 -> 5180 bytes lispusers/xerox-to-xbm.lisp | 1 + lispusers/xerox-to-xbm.txt | Bin 0 -> 830 bytes 594 files changed, 7043 insertions(+) create mode 100644 lispusers/0001READ-ME-BEFORE-YOU-TRY-TO-PRINT.TEDIT create mode 100644 lispusers/001-TITLE-PAGE.TEDIT create mode 100644 lispusers/002TABLE-OF-CONTENTS.TEDIT create mode 100644 lispusers/ACE create mode 100644 lispusers/ACE-APPLEDEMO.ACE create mode 100644 lispusers/ACE-BOUNCINGBALL.ACE create mode 100644 lispusers/ACE-FOUETTE.ACE create mode 100644 lispusers/ACE-MAIN create mode 100644 lispusers/ACE-PRIM create mode 100644 lispusers/ACE.TEDIT create mode 100644 lispusers/ADDRESSBOOK create mode 100644 lispusers/ADDRESSBOOK.TEDIT create mode 100644 lispusers/AIREGIONS create mode 100644 lispusers/AIREGIONS-DEMO create mode 100644 lispusers/AIREGIONS.TEDIT create mode 100644 lispusers/AISBLT create mode 100644 lispusers/AISBLT.TEDIT create mode 100644 lispusers/ANALYZER create mode 100644 lispusers/ANALYZER.TEDIT create mode 100644 lispusers/AUTOSAMEDIR create mode 100644 lispusers/AUTOSAMEDIR.TEDIT create mode 100644 lispusers/AUXMENU create mode 100644 lispusers/AUXMENU.TEDIT create mode 100644 lispusers/BACKGROUND-DurerCats.BITMAP create mode 100644 lispusers/BACKGROUND-RHINE.PRESS create mode 100644 lispusers/BACKGROUND-STEINHEIM.PRESS create mode 100644 lispusers/BACKGROUND-TIFFANY.PRESS create mode 100644 lispusers/BACKGROUND-moonwithstars.press create mode 100644 lispusers/BACKGROUND-parc.PRESS create mode 100644 lispusers/BACKGROUND-twodollar.PRESS create mode 100644 lispusers/BACKGROUNDIMAGES create mode 100644 lispusers/BACKGROUNDMENU create mode 100644 lispusers/BICLOCK create mode 100644 lispusers/BICLOCK.TEDIT create mode 100644 lispusers/BIGGER-FONT create mode 100644 lispusers/BITMAP-GALLERY create mode 100644 lispusers/BITMAP-GALLERY.TEDIT create mode 100644 lispusers/BITMAPFNS create mode 100644 lispusers/BITMAPFNS.TEDIT create mode 100644 lispusers/BLACKBOX create mode 100644 lispusers/BLACKBOX.TEDIT create mode 100644 lispusers/BLOCKS-HKB create mode 100644 lispusers/BMENCODE create mode 100644 lispusers/BOYERMOORE create mode 100644 lispusers/BRKDWNREPORT create mode 100644 lispusers/BUTTONS create mode 100644 lispusers/BUTTONS.TEDIT create mode 100644 lispusers/BackgroundImages.TEDIT create mode 100644 lispusers/BackgroundMenu.TEDIT create mode 100644 lispusers/C150STREAM create mode 100644 lispusers/CALENDAR create mode 100644 lispusers/CALENDAR.TEDIT create mode 100644 lispusers/CANVASCONVERTER.TEDIT create mode 100644 lispusers/CD create mode 100644 lispusers/CD.TEDIT create mode 100644 lispusers/CHATEMACS create mode 100644 lispusers/CHATEMACS.TEDIT create mode 100644 lispusers/CHATSERVER create mode 100644 lispusers/CHATSERVER-NS create mode 100644 lispusers/CHATSERVER-RS232 create mode 100644 lispusers/CHATSERVER-TCP create mode 100644 lispusers/CHATSERVER.TEDIT create mode 100644 lispusers/CHECKSET create mode 100644 lispusers/CHECKSET.TEDIT create mode 100644 lispusers/CIRCLPRINT create mode 100644 lispusers/CIRCLPRINT.SKETCH create mode 100644 lispusers/CL-TTYEDIT create mode 100644 lispusers/CL-TTYEDIT.TEDIT create mode 100644 lispusers/COLOR create mode 100644 lispusers/COLORDEMO create mode 100644 lispusers/COLORNNCC create mode 100644 lispusers/COLOROBJ create mode 100644 lispusers/COLORPOLYGONS create mode 100644 lispusers/COMMENTHACKS create mode 100644 lispusers/COMMON-MAKE create mode 100644 lispusers/COMMWINDOW create mode 100644 lispusers/COMMWINDOW.TEDIT create mode 100644 lispusers/COMPARE-PATHS create mode 100644 lispusers/COMPAREDIRECTORIES create mode 100644 lispusers/COMPAREDIRECTORIES.TEDIT create mode 100644 lispusers/COMPARESOURCES create mode 100644 lispusers/COMPARESOURCES.TEDIT create mode 100644 lispusers/COMPARETEXT create mode 100644 lispusers/COMPARETEXT.TEDIT create mode 100644 lispusers/COMPILEBANG create mode 100644 lispusers/COMPILEBANG.TEDIT create mode 100644 lispusers/COURIERDEFS create mode 100644 lispusers/COURIERDEFS.TEDIT create mode 100644 lispusers/COURIEREVALSERVE create mode 100644 lispusers/COURIEREVALSERVE.TEDIT create mode 100644 lispusers/COURIERIMAGESTREAM create mode 100644 lispusers/COURIERIMAGESTREAM.TEDIT create mode 100644 lispusers/COURIERSERVE create mode 100644 lispusers/COURIERSERVE.TEDIT create mode 100644 lispusers/COURIERSERVEPATCH create mode 100644 lispusers/CROCK create mode 100644 lispusers/CROCK.TEDIT create mode 100644 lispusers/CUT-HKB create mode 100644 lispusers/DANDELIONUFO create mode 100644 lispusers/DANDELIONUFO4096 create mode 100644 lispusers/DATATYPESPLUS create mode 100644 lispusers/DATE create mode 100644 lispusers/DATEFNS create mode 100644 lispusers/DATEFORMAT-EDITOR create mode 100644 lispusers/DATEFORMAT-EDITOR.TEDIT create mode 100644 lispusers/DATESORT create mode 100644 lispusers/DATESORT.TEDIT create mode 100644 lispusers/DEBUGGER-CONTEXT create mode 100644 lispusers/DECL create mode 100644 lispusers/DECL.TEDIT create mode 100644 lispusers/DEDITHARDCOPY create mode 100644 lispusers/DEFAULTICON create mode 100644 lispusers/DEFAULTSUBITEMFN create mode 100644 lispusers/DEFAULTSUBITEMFN.TEDIT create mode 100644 lispusers/DEFINERPRINT create mode 100644 lispusers/DIALPHONE create mode 100644 lispusers/DIALPHONE.TEDIT create mode 100644 lispusers/DICOLOR create mode 100644 lispusers/DICT-WINDOW-TYPES create mode 100644 lispusers/DICTTOOL create mode 100644 lispusers/DICTTOOL.TEDIT create mode 100644 lispusers/DIGEST create mode 100644 lispusers/DIGI-CLOCK create mode 100644 lispusers/DIGI-CLOCK.TEDIT create mode 100644 lispusers/DINFO create mode 100644 lispusers/DIR-TREE.TEDIT create mode 100644 lispusers/DIRGRAPHER create mode 100644 lispusers/DLIONFNKEYS create mode 100644 lispusers/DOC-OBJECTS create mode 100644 lispusers/DOC-OBJECTS.TEDIT create mode 100644 lispusers/DONZ create mode 100644 lispusers/DONZ.TEDIT create mode 100644 lispusers/DORADOCOLOR create mode 100644 lispusers/DPUPFTPPATCH create mode 100644 lispusers/DSPSCALE create mode 100644 lispusers/DSPSCALE.TEDIT create mode 100644 lispusers/DUMPER create mode 100644 lispusers/DUMPLOAD create mode 100644 lispusers/Debugger-Context.TEdit create mode 100644 lispusers/DocumentationTemplate.TEdit create mode 100644 lispusers/EDITBG create mode 100644 lispusers/EDITBG.TEDIT create mode 100644 lispusers/EDITFONT create mode 100644 lispusers/EDITKEYS create mode 100644 lispusers/EDITKEYS.TEDIT create mode 100644 lispusers/EMACS create mode 100644 lispusers/ENDNOTE create mode 100644 lispusers/EQUATIONEXAMPLES.TEDIT create mode 100644 lispusers/EQUATIONFORMS create mode 100644 lispusers/EQUATIONS create mode 100644 lispusers/EQUATIONS.TEDIT create mode 100644 lispusers/ETHERBOOT create mode 100644 lispusers/ETHERBOOT.TEDIT create mode 100644 lispusers/EVAL-WHEN-PATCH create mode 100644 lispusers/EVALOBJ create mode 100644 lispusers/EXAMPLES.LGC create mode 100644 lispusers/EYECON create mode 100644 lispusers/EquationEditorPrgmersGuide.TEDIT create mode 100644 lispusers/ExtendedVmem-Lisp.run create mode 100644 lispusers/ExtendedVmem-Lisp.syms create mode 100644 lispusers/FASTEDITBM create mode 100644 lispusers/FILECACHE-FIX create mode 100644 lispusers/FILENAMES create mode 100644 lispusers/FILEWATCH create mode 100644 lispusers/FILEWATCH.TEDIT create mode 100644 lispusers/FILLREGION create mode 100644 lispusers/FILLREGION.TEDIT create mode 100644 lispusers/FIND-CITATION create mode 100644 lispusers/FINGER create mode 100644 lispusers/FINGER.TEDIT create mode 100644 lispusers/FM-CREATOR create mode 100644 lispusers/FM-CREATOR.TEDIT create mode 100644 lispusers/FONTDECLS create mode 100644 lispusers/FONTSAMPLER create mode 100644 lispusers/FONTSAMPLER.TEDIT create mode 100644 lispusers/FORMACRO create mode 100644 lispusers/FTPSERVER-MULTI-CONNECTIONS.TEDIT create mode 100644 lispusers/FTPSERVERPATCH create mode 100644 lispusers/FileCacheMsgWindow create mode 100644 lispusers/GACHAE.LC1-SF create mode 100644 lispusers/GACHAE.LC2-SF create mode 100644 lispusers/GACHAE.NUM-SF create mode 100644 lispusers/GACHAE.S1-SF create mode 100644 lispusers/GACHAE.S2-SF create mode 100644 lispusers/GACHAE.UC1-SF create mode 100644 lispusers/GACHAE.UC2-SF create mode 100644 lispusers/GENERIC-INIT create mode 100644 lispusers/GRAPHCALLS create mode 100644 lispusers/GRAPHCALLS.TEDIT create mode 100644 lispusers/GRAPHGROUP.TEDIT create mode 100644 lispusers/GREP create mode 100644 lispusers/GREP.TEDIT create mode 100644 lispusers/GRID-ICONS create mode 100644 lispusers/GRID-ICONS.TEDIT create mode 100644 lispusers/GraphGroup create mode 100644 lispusers/H-BLOCKS.HKB create mode 100644 lispusers/H-CUT.HKB create mode 100644 lispusers/H-ENV create mode 100644 lispusers/H-LOAD create mode 100644 lispusers/H-LOOPS.HKB create mode 100644 lispusers/H-MAZE.HKB create mode 100644 lispusers/H-PATCHES create mode 100644 lispusers/H-SOURCE create mode 100644 lispusers/H.TEDIT create mode 100644 lispusers/HANOI create mode 100644 lispusers/HANOI.TEDIT create mode 100644 lispusers/HARDCOPY-RETAIN create mode 100644 lispusers/HARDCOPY-RETAIN.TEDIT create mode 100644 lispusers/HASHBUFFER create mode 100644 lispusers/HASHBUFFER.TEDIT create mode 100644 lispusers/HASHDATUM create mode 100644 lispusers/HASHDATUM.TEDIT create mode 100644 lispusers/HEADLINE create mode 100644 lispusers/HEADLINE.TEDIT create mode 100644 lispusers/HELPSYS create mode 100644 lispusers/HELPSYS.TEDIT create mode 100644 lispusers/HGRAPH create mode 100644 lispusers/HOSTUP create mode 100644 lispusers/HOSTUP.TEDIT create mode 100644 lispusers/HPGL create mode 100644 lispusers/HPGL.TEDIT create mode 100644 lispusers/HYPERDESK-INIT create mode 100644 lispusers/HYPERDESK-LOG create mode 100644 lispusers/HYPERDESK.SUITE create mode 100644 lispusers/HYPERDESK.TEDIT create mode 100644 lispusers/HYPERFLOOR.SUITE create mode 100644 lispusers/IDEASKETCH create mode 100644 lispusers/IDEASKETCH.TEDIT create mode 100644 lispusers/IDLEDRAIN create mode 100644 lispusers/IDLEHAX create mode 100644 lispusers/IDLEHAX.TEDIT create mode 100644 lispusers/IDLESWAP create mode 100644 lispusers/INDEX create mode 100644 lispusers/INSPECTCODE-TEDIT create mode 100644 lispusers/INSPECTCODE-TEDIT.TEDIT create mode 100644 lispusers/IPTALK create mode 100644 lispusers/IRIS.TEdit create mode 100644 lispusers/IRISCONSTANTS create mode 100644 lispusers/IRISDEMOFNS create mode 100644 lispusers/IRISIO create mode 100644 lispusers/IRISLIB create mode 100644 lispusers/IRISNET create mode 100644 lispusers/IRISSTREAM create mode 100644 lispusers/IRISVIEW create mode 100644 lispusers/KEYOBJ create mode 100644 lispusers/KEYOBJ.TEDIT create mode 100644 lispusers/KINETIC create mode 100644 lispusers/KINETIC.TEDIT create mode 100644 lispusers/KOTOLOGO create mode 100644 lispusers/KOTOLOGO.TEDIT create mode 100644 lispusers/LABEL create mode 100644 lispusers/LAFITE-INDENT create mode 100644 lispusers/LAFITE-INDENT.TEDIT create mode 100644 lispusers/LAFITEABBREV create mode 100644 lispusers/LAFITEABBREV.TEDIT create mode 100644 lispusers/LAFITEPRIVATEDL create mode 100644 lispusers/LAFITETIMEDDELETE create mode 100644 lispusers/LAFITETIMEDDELETE.TEDIT create mode 100644 lispusers/LAMBDATRAN create mode 100644 lispusers/LAMBDATRAN.TEDIT create mode 100644 lispusers/LAYOUT-SEDIT create mode 100644 lispusers/LICENSE create mode 100644 lispusers/LIFE create mode 100644 lispusers/LIFE.TEDIT create mode 100644 lispusers/LISPNERD create mode 100644 lispusers/LISPNERD.TEDIT create mode 100644 lispusers/LISPUSERS-DEPENDENCIES.TEDIT create mode 100644 lispusers/LOADIRIS create mode 100644 lispusers/LOADMENUITEMS create mode 100644 lispusers/LOADMENUITEMS.TEDIT create mode 100644 lispusers/LOGIC create mode 100644 lispusers/LOGIC-DEVEL create mode 100644 lispusers/LOGIC-EXAMPLES.LGC create mode 100644 lispusers/LOGIC-UNIFIER create mode 100644 lispusers/LOGIC.LGC create mode 100644 lispusers/LOGIC.LISP create mode 100644 lispusers/LOGIC.TEDIT create mode 100644 lispusers/LOGTIME create mode 100644 lispusers/LOGTIME.TEDIT create mode 100644 lispusers/LOOKUPINFILES create mode 100644 lispusers/LOOKUPINFILES.TEDIT create mode 100644 lispusers/LUPINE create mode 100644 lispusers/LispUsers-README.tedit create mode 100644 lispusers/LispUsers-Rules.TEdit create mode 100644 lispusers/LispUsers-Summary.TEdit create mode 100644 lispusers/LispUsers-Template-Instr.TEdit create mode 100644 lispusers/LispUsers-Template.TEdit create mode 100644 lispusers/LispUsers.tty create mode 100644 lispusers/LoadPatches create mode 100644 lispusers/MACINTERFACE create mode 100644 lispusers/MACINTERFACE.TXT create mode 100644 lispusers/MACWINDOW create mode 100644 lispusers/MAGNIFIER create mode 100644 lispusers/MAGNIFIER.TEDIT create mode 100644 lispusers/MAILSHARE create mode 100644 lispusers/MAIN.LGC create mode 100644 lispusers/MAKEGRAPH create mode 100644 lispusers/MAKEGRAPH.TEDIT create mode 100644 lispusers/MANAGER create mode 100644 lispusers/MANAGER.HISTORY create mode 100644 lispusers/MANAGER.TEDIT create mode 100644 lispusers/MANDELBROT create mode 100644 lispusers/MATHSERVER create mode 100644 lispusers/MATHSERVER.COMMANDFILES create mode 100644 lispusers/MATHTONS create mode 100644 lispusers/MATHTONS.TEDIT create mode 100644 lispusers/MATRIXOPS create mode 100644 lispusers/MESATOLISP create mode 100644 lispusers/MICROTEK create mode 100644 lispusers/MICROTEKPRINT create mode 100644 lispusers/MISSILE create mode 100644 lispusers/MISSILE.tedit create mode 100644 lispusers/MONITOR create mode 100644 lispusers/MONITOR.TEDIT create mode 100644 lispusers/MTP create mode 100644 lispusers/MULTIPLE-HARDCOPY create mode 100644 lispusers/NEATICONS create mode 100644 lispusers/NEATICONS.TEDIT create mode 100644 lispusers/NGROUP create mode 100644 lispusers/NOTECARDS-4045XLPPATCH create mode 100644 lispusers/NOTEPAD create mode 100644 lispusers/NOTEPAD-CORESTYLES create mode 100644 lispusers/NOTEPAD.TEDIT create mode 100644 lispusers/NOVAFONT create mode 100644 lispusers/NOVAFONT.TEDIT create mode 100644 lispusers/NSALLOCATION create mode 100644 lispusers/NSCOPYFILE create mode 100644 lispusers/NSCOPYFILE.TEDIT create mode 100644 lispusers/NSDISPLAYSIZES create mode 100644 lispusers/NSDISPLAYSIZES.TEDIT create mode 100644 lispusers/NSPROTECTION create mode 100644 lispusers/NSPROTECTION.TEDIT create mode 100644 lispusers/NSREADERPATCH create mode 100644 lispusers/NSROUTINGHASH create mode 100644 lispusers/NSTALK create mode 100644 lispusers/NSTALKGAP create mode 100644 lispusers/NSTHASIZE create mode 100644 lispusers/OSS-LYRIC-PATCHES create mode 100644 lispusers/PAC-MAN-IDLE create mode 100644 lispusers/PACKED-STRUCTURE create mode 100644 lispusers/PACMAN create mode 100644 lispusers/PACMAN.TEDIT create mode 100644 lispusers/PAGEHOLD create mode 100644 lispusers/PAGEHOLD.TEDIT create mode 100644 lispusers/PARSER create mode 100644 lispusers/PARSERG create mode 100644 lispusers/PATCH-LARGEIPBITMAP create mode 100644 lispusers/PATCH-TWOSIDED create mode 100644 lispusers/PCMEMTEST create mode 100644 lispusers/PHONE-DIRECTORY create mode 100644 lispusers/PHONE-DIRECTORY.TEDIT create mode 100644 lispusers/PIECE-MENUS create mode 100644 lispusers/PIECE-MENUS.TEDIT create mode 100644 lispusers/PIXELBLT create mode 100644 lispusers/PLAY create mode 100644 lispusers/PLOT create mode 100644 lispusers/PLOT.TEDIT create mode 100644 lispusers/PLOTANDNC-PATCH create mode 100644 lispusers/PLOTBOXPATCH create mode 100644 lispusers/PLOTBOXPATCH.TEDIT create mode 100644 lispusers/PLOTEXAMPLES create mode 100644 lispusers/PLOTEXAMPLES.TEDIT create mode 100644 lispusers/PLOTINSKETCH create mode 100644 lispusers/PLOTOBJECTS create mode 100644 lispusers/PLOTOBJECTS.TEDIT create mode 100644 lispusers/PLOTOBJECTS1 create mode 100644 lispusers/PLOTOBJECTS1.TEDIT create mode 100644 lispusers/PLOTOBJECTS2 create mode 100644 lispusers/PLOTOBJECTS2.TEDIT create mode 100644 lispusers/PORT-CLFILE create mode 100644 lispusers/POSTSCRIPT/BECKMAN01-MRR-C0.PSCFONT create mode 100644 lispusers/POSTSCRIPT/POSTSCRIPTSTREAM create mode 100644 lispusers/POSTSCRIPTSTREAM.TEDIT create mode 100644 lispusers/PP-CODE-FILE create mode 100644 lispusers/PREEMPTIVE create mode 100644 lispusers/PREEMPTIVE.TEDIT create mode 100644 lispusers/PRESSFROMNS create mode 100644 lispusers/PRESSFROMNS.TEDIT create mode 100644 lispusers/PRETTYFILEINDEX create mode 100644 lispusers/PRETTYFILEINDEX.TEDIT create mode 100644 lispusers/PRINTERMENU create mode 100644 lispusers/PRINTERMENU.TEDIT create mode 100644 lispusers/PROGRAMCHAT create mode 100644 lispusers/PROGRAMCHAT.TEDIT create mode 100644 lispusers/PROMPTREMINDERS create mode 100644 lispusers/PROMPTREMINDERS.TEDIT create mode 100644 lispusers/PROOFREADER create mode 100644 lispusers/PROOFREADER.TEDIT create mode 100644 lispusers/PS-PATCH create mode 100644 lispusers/PS-RS232 create mode 100644 lispusers/PS-RS232.TEDIT create mode 100644 lispusers/PS-SEND create mode 100644 lispusers/PS-SEND.TEDIT create mode 100644 lispusers/PS-SKETCH-PATCH create mode 100644 lispusers/PS-SKETCH-PATCH.TEDIT create mode 100644 lispusers/PS-TTY create mode 100644 lispusers/PS-TTY.TEDIT create mode 100644 lispusers/PS-patch.tedit create mode 100644 lispusers/PSCFONT-FIX-FILENAME create mode 100644 lispusers/QEDIT create mode 100644 lispusers/QEDIT.TEDIT create mode 100644 lispusers/QIX create mode 100644 lispusers/READAIS create mode 100644 lispusers/READAIS.TEDIT create mode 100644 lispusers/READAPPLEFONT create mode 100644 lispusers/READAPPLEFONT.TEDIT create mode 100644 lispusers/READBRUSH create mode 100644 lispusers/READBRUSH.TEDIT create mode 100644 lispusers/READDATATYPE create mode 100644 lispusers/READDATATYPE.TEDIT create mode 100644 lispusers/READDISPLAYFONT create mode 100644 lispusers/READDISPLAYFONT.TEDIT create mode 100644 lispusers/READEBCDIC create mode 100644 lispusers/READINTERPRESS create mode 100644 lispusers/README.md create mode 100644 lispusers/REGION create mode 100644 lispusers/REGION.TEDIT create mode 100644 lispusers/REGISTER-MACHINE create mode 100644 lispusers/REMOTEPSW create mode 100644 lispusers/REMOTEPSW.TEDIT create mode 100644 lispusers/RPC create mode 100644 lispusers/RPC.TEDIT create mode 100644 lispusers/RPCCOMMON create mode 100644 lispusers/RPCLOWLEVEL create mode 100644 lispusers/RPCOS create mode 100644 lispusers/RPCPORTMAPPER create mode 100644 lispusers/RPCRPC create mode 100644 lispusers/RPCSTRUCT create mode 100644 lispusers/RPCXDR create mode 100644 lispusers/RS232CNETWORK create mode 100644 lispusers/RS232CNETWORK.TEDIT create mode 100644 lispusers/SCREENPAPER create mode 100644 lispusers/SCREENPAPER.TEDIT create mode 100644 lispusers/SEARCHMENU create mode 100644 lispusers/SEARCHMENU.TEDIT create mode 100644 lispusers/SEDIT-COMMONLISP create mode 100644 lispusers/SEDIT-MENU-ALWAYS create mode 100644 lispusers/SEDIT-MENU-ALWAYS.TEDIT create mode 100644 lispusers/SEDIT-PATCHES create mode 100644 lispusers/SEDIT-PROFILE create mode 100644 lispusers/SETDEFAULTPRINTER create mode 100644 lispusers/SETDEFAULTPRINTER.TEDIT create mode 100644 lispusers/SFFONT create mode 100644 lispusers/SHOWTIME create mode 100644 lispusers/SHOWTIME.TEDIT create mode 100644 lispusers/SIGMA20-MRR-C0.DISPLAYFONT create mode 100644 lispusers/SIMPLECHAT create mode 100644 lispusers/SIMPLIFY create mode 100644 lispusers/SINGLEFILEINDEX create mode 100644 lispusers/SKETCHCOLOR create mode 100644 lispusers/SKETCHTALK create mode 100644 lispusers/SNAPW-ICON create mode 100644 lispusers/SNAPW-ICON.TEDIT create mode 100644 lispusers/SOLID-MOVEW create mode 100644 lispusers/SOLID-MOVEW.TEDIT create mode 100644 lispusers/SOLITAIRE create mode 100644 lispusers/SOLITAIRE.TEDIT create mode 100644 lispusers/SPELLINGARRAY create mode 100644 lispusers/STARBG create mode 100644 lispusers/STARBG.TEDIT create mode 100644 lispusers/STEP-COMMAND-MENU create mode 100644 lispusers/STEP-COMMAND-MENU.TEDIT create mode 100644 lispusers/STORAGE create mode 100644 lispusers/STORAGE.TEDIT create mode 100644 lispusers/STREAMDECLS create mode 100644 lispusers/STYLESHEET create mode 100644 lispusers/STYLESHEET.TEDIT create mode 100644 lispusers/SUPERPARENTHESES create mode 100644 lispusers/SUPERPARENTHESES.TEDIT create mode 100644 lispusers/SYSTATS create mode 100644 lispusers/SYSTATS.TEDIT create mode 100644 lispusers/SetStringLength.Tedit create mode 100644 lispusers/Standalone-LispUsers-Templ-Instr.TEdit create mode 100644 lispusers/TALK create mode 100644 lispusers/TALK.TEDIT create mode 100644 lispusers/TALKGAP create mode 100644 lispusers/TCPTIME create mode 100644 lispusers/TCPTIME.TEDIT create mode 100644 lispusers/TEDIT-CLOSE-ON-SHRINK create mode 100644 lispusers/TEDIT-CLOSE-ON-SHRINK.TEDIT create mode 100644 lispusers/TEDIT-LINE-NUMBERING create mode 100644 lispusers/TEDIT-LINE-NUMBERING.TEDIT create mode 100644 lispusers/TEDITDORADOKEYS create mode 100644 lispusers/TEDITDORADOKEYS.DATABASE create mode 100644 lispusers/TEDITKEY create mode 100644 lispusers/TEDITKEY.TEDIT create mode 100644 lispusers/TEDITTALK create mode 100644 lispusers/TEK4010 create mode 100644 lispusers/TEK4010CHAT create mode 100644 lispusers/TEXTMODULES create mode 100644 lispusers/THINFILES create mode 100644 lispusers/TILED-SEDIT create mode 100644 lispusers/TILED-SEDIT.TEDIT create mode 100644 lispusers/TIMESROMAN.LC1-SF create mode 100644 lispusers/TIMESROMAN.LC2-SF create mode 100644 lispusers/TIMESROMAN.NUM-SF create mode 100644 lispusers/TIMESROMAN.S1-SF create mode 100644 lispusers/TIMESROMAN.S3-SF create mode 100644 lispusers/TIMESROMAN.UC1-SF create mode 100644 lispusers/TMAX create mode 100644 lispusers/TMAX-DATE create mode 100644 lispusers/TMAX-ENDNOTE create mode 100644 lispusers/TMAX-INDEX create mode 100644 lispusers/TMAX-INTRO.TXT create mode 100644 lispusers/TMAX-NGRAPH create mode 100644 lispusers/TMAX-NGROUP create mode 100644 lispusers/TMAX-NUMBER create mode 100644 lispusers/TMAX-XREF create mode 100644 lispusers/TMAX.INDEX create mode 100644 lispusers/TMAX.TEDIT create mode 100644 lispusers/TMAX.TOC create mode 100644 lispusers/TMENU.TEDIT create mode 100644 lispusers/TRAJECTORY-FOLLOWER create mode 100644 lispusers/TRAJECTORY-FOLLOWER.TEDIT create mode 100644 lispusers/TRANSOR create mode 100644 lispusers/TRANSOR-LOADTRAN create mode 100644 lispusers/TRANSOR-TO-COMMONLISP.XFORMS create mode 100644 lispusers/TRANSOR.BUGREPORTS create mode 100644 lispusers/TRANSOR.TEDIT create mode 100644 lispusers/TRICKLE create mode 100644 lispusers/TRICKLE.TEDIT create mode 100644 lispusers/TSET create mode 100644 lispusers/TTYTALK create mode 100644 lispusers/TURBO-WINDOWS create mode 100644 lispusers/TURBO-WINDOWS.TEDIT create mode 100644 lispusers/TWODGRAPHICS create mode 100644 lispusers/TWODGRAPHICS.TEDIT create mode 100644 lispusers/Tek4010CHAT.TEdit create mode 100644 lispusers/UNBOXEDOPS create mode 100644 lispusers/UNBOXEDOPS.TEDIT create mode 100644 lispusers/UNDIGESTIFY create mode 100644 lispusers/UNDIGESTIFY.TEDIT create mode 100644 lispusers/UNIFIER create mode 100644 lispusers/UNIFIER.LISP create mode 100644 lispusers/UPCSTATS create mode 100644 lispusers/UPCSTATS.TEDIT create mode 100644 lispusers/UTILISOPRS create mode 100644 lispusers/UUENCODE create mode 100644 lispusers/UUENCODE.TEDIT create mode 100644 lispusers/VANILLA-INIT create mode 100644 lispusers/VSTATS create mode 100644 lispusers/VSTATS.IP create mode 100644 lispusers/VSTATS.TEDIT create mode 100644 lispusers/WALKFILES create mode 100644 lispusers/WALKFILES.TEDIT create mode 100644 lispusers/WDWHACKS create mode 100644 lispusers/WDWHACKS.TEDIT create mode 100644 lispusers/WHO-LINE create mode 100644 lispusers/WHO-LINE.TEDIT create mode 100644 lispusers/WHOCALLS create mode 100644 lispusers/WHOCALLS.TEDIT create mode 100644 lispusers/WINK create mode 100644 lispusers/WINK.TEDIT create mode 100644 lispusers/WORDNERD create mode 100644 lispusers/Wordfns.Tedit create mode 100644 lispusers/XCL-BRIDGE create mode 100644 lispusers/XORCURSORPATCH create mode 100644 lispusers/XORCursorPatch.TEdit create mode 100644 lispusers/XREF create mode 100644 lispusers/bsearch create mode 100644 lispusers/canvasconverter create mode 100644 lispusers/chatemacs.el create mode 100644 lispusers/chatemacs.elc create mode 100644 lispusers/circlprint.tedit create mode 100644 lispusers/classic10-c0.c150font create mode 100644 lispusers/classic14-c0.c150font create mode 100644 lispusers/classic18-c0.c150font create mode 100644 lispusers/dinfo.tedit create mode 100644 lispusers/document create mode 100644 lispusers/eyecon.tedit create mode 100644 lispusers/fm-creator-examples/BACH.FMC create mode 100644 lispusers/fm-creator-examples/DEMO.FMC create mode 100644 lispusers/formacro.tedit create mode 100644 lispusers/iso8859io create mode 100644 lispusers/lispusers-info-msg.tedit create mode 100644 lispusers/mathserverplot create mode 100644 lispusers/microtek.tedit create mode 100644 lispusers/oss.lisp create mode 100644 lispusers/oss.txt create mode 100644 lispusers/osstst.lisp create mode 100644 lispusers/simplechat.tedit create mode 100644 lispusers/sourcecompare.txt create mode 100644 lispusers/tedit-process-killer create mode 100644 lispusers/tedit-process-killer.tedit create mode 100644 lispusers/teditdoradokeys.tedit create mode 100644 lispusers/timesroman10-c0.c150font create mode 100644 lispusers/timesroman12-c0.c150font create mode 100644 lispusers/timesroman14-c0.c150font create mode 100644 lispusers/tkdorado create mode 100644 lispusers/tkdorado.tedit create mode 100644 lispusers/tmenu create mode 100644 lispusers/xcl-bridge.tedit create mode 100644 lispusers/xerox-to-xbm.lisp create mode 100644 lispusers/xerox-to-xbm.txt diff --git a/lispusers/0001READ-ME-BEFORE-YOU-TRY-TO-PRINT.TEDIT b/lispusers/0001READ-ME-BEFORE-YOU-TRY-TO-PRINT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..d54254d0e9c785226629cb74878180687e0f3ed7 GIT binary patch literal 1342 zcma)4-EPw`7|psN6p2V6;Qr$Rt&^Zq2N$D4NLklzk=jnQ8CM9&OWY>l*u{2M0^`NF z;5m2&?sx<~JIR!`lOUBEf5+$hJ1566V+i=O9pJ8m$y3?eDt*C2Dw@d{FI%SClVPH7BU023sJ zZ&ar0`)k|ejr~ueWzk_G$~^ZFOL7QCz4!jC9|Ym~WCl?}_<{oES{BefdI8FeLNwrz zl9E_iFy%^P0AdcS>XHkY5ypy=)$vY*84h<=6!gjz!C0Xjxx!7276X1I6pp#TOHpZr zTSyvdR&)Tu8dM^qrjKX+MQS#`yxcrFv zDK{2Tb+omhZB|kc6Ky`tjA#oVc*%0XT=j|SC@GtIp68h74*m}9$(-@o-Eo{9=g(e+ z-TtaGT8)g`nKfEx*x2^id1SL|!q$5`!}+yES_7UnqZaP*k7v(mIgg#Y{gFSL1%2n< z4gJ)4)jk;v{fkjJJfDQnh4$HC^llIaeIL4qa6FwJK>O71pZRcvr*JSG2NQpU!9iW7 zTCQbPoto0+KqWBS1U_s6zc&G!URG^6#-685#x4dAn}9KMEyV=TWSCm_H-R;VNqO01 T7~nw@*y{3MKWBI^;F literal 0 HcmV?d00001 diff --git a/lispusers/001-TITLE-PAGE.TEDIT b/lispusers/001-TITLE-PAGE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..4d5d51bd04af8840cc41ca9eb1a521c54cc01511 GIT binary patch literal 5632 zcmeI0-A)@v6vt;V$tF!UuA;W;hl-C{`3) z1Xsuq?0ZX|kRV{DN%zC}M<|8O-)kNyZvFCT@{AbRYIkR?1 zCgu`}gtSIW6`ejS9BfUG7~r|O?cb8Myao7b?%V%W z7ubw5y9dFMH>>J+G4-pCQ`4&hP9E^*NWWM)^<|v;GERLNBVWeImoaLEJcAqgTJ`-X z-`t*XEFSOUx5F4<-_?+Qk-7h+fV%Q++|(nfNk(H`9=WFd7!#4qk9NgX21 z$411*&Vff!q)v=cE7shPE{I2rVu!6%YhOeLyw-JXRO(E=ZrpkJV?=&l`y(+?U}L06rVobjhgJ zO>L)a1N_P@uvLc>L5)jtr2^c~0!)IM4{2$<7rbVH3bv`1=&ou$0Au^4Ub;t3WA7<& zSCj5&mQ77s3ahwJa4W{8&0OZ*Q#fBHE1xQ`NHM;wy2UopFg0q8OMYfm)39lgZ7yhf zu~I8h3wBkEKvOHQLv@NG3})LjcEK)Fu#9c{k!n&v;f|^9T2RugYDKN16VAb1iYBG{ z7+AGp8B`0jqM=)e-0ZnS#V{VARn;+5oVTJqpyN_}a#WHOL`~l|OpL>g3q5dmN=C89 zii4$W)waIJu(3>_SXT8N3Xe3qY}9Pf4O=TxKCgv_N{Lxui(+Z%mTlHBPK-(Am8RKz zzEe*X;G42mp+Fx}vkr6{8i*jUL_F*I#Ut7vu|a2*UDS2Rt-#CuRyZCtGmYPCvLbDV!+MB-T53dG~<@@g7# znJi#$9sk3W`7RAvYUA<2NZsBVbHWay_WOA!a`w2{pLOcNp zn3oEc@_XuOD)Ey6?zn8qo5 zt&+Z{@I`q-I6CDzp2Fw5DgSIcnl zFx@kFEwerCI7df$HD4lckulaADv`_lGs5j>y>VY*8CBSZgtOeZ-Ss{0`3_&ecbV`R zUo!6(Y$lB1clLS0S5TO_-zHfPoq3Dk^n$Q_v9P%Ur%#ZluKJXBZ|gkYQ(XF{Mb;CJ zUG9f{joqr=%_Y|Yx4f_OJ4>v4{tVXxGw{@Xb-y=EM6yce;>+n3c{8i52od@)DsRa8G!Nsd240NXQcYfJMz>=jY_!&>^;|SAW9|xxToTU;NtL zwxsY+l}vBP_{rhA?C?T+&%${Z|MicRg~d1AJ7;EiZ_tBRhv&hbVIKxPm?2av%n%KF zupM}N(7+45A0g9xH0Tlvl}+;bpvUb&!~CG($3esJIYsMVzTU>UcWj8Aq405UCTX3d He)#!sleuwY literal 0 HcmV?d00001 diff --git a/lispusers/002TABLE-OF-CONTENTS.TEDIT b/lispusers/002TABLE-OF-CONTENTS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..cb3f2789ee6412092fe5c3d079899e28f30cbaf9 GIT binary patch literal 5819 zcmeHJOOGQ-5w7mpogo>L=Pu$#Y5}QR!Yfz#eN0zn*@>$vYcsRj?Liy{X@C)m1_l`{`Ae$F#3Tv))R4+Cgax%AEu~`;Q z8?|$6Hsb2DPWk}NY|Pn#61{KHTC=jUu9bDGP8YBi^J)6&X zi3)9{&)00eAfoEgXN!!NzU`41)JO;kn5IF{A%Ml0!&$pVz?EZ*2`JUFbU4I87XuAh zG|({RYuOl$(-(WYgg!kSJhRgPQTRl0~H(1!B(E?W)3I!F5rowY)_qrd&6! zh4VJU8@_a2ku5gjvjAxiH-r4f!e5$F{lx!1`|LxGo1a}hjh`RwMKV%wP7hbv^GuX ziWIHYC_vX&WisXsWLjCU6kXI{CfXhOW$82pS!mZ*a_965iUjS0%*kjdJs4x&!ui@% z(4Q`Nt5vQBlozDYF>M88Q|b^p-200Xh>2@x+&Bxc(7zK#me?;0&wlym4=^X zfDAM&T2+&Zg&iOVo+&YgV6Y6^=Cgo%hAl%(sUd|W6V5HVyTrl+XC639+qpHUMWE1W z((hV?3uH-QU*uk8l!8Y~57!xvHNoSypvK&`Ild{Bd0B06Sa6>MCvuHd6XpgZ17gNK;3j_x9D@+t;7py?pcLPvXt1-@FySe)IC~_rKx^eV$xZ+IewxMYAFr zT?w3k9Zi*}(4KhIkfz4lQW|j;(nSZ#Mtt%K{;ma8-s@&X`acorwYVCJp_rzbm@P6; zS3&z=*-Ba734!@9&w(S>})KCEuC+=Dp*0yl=fn z?&-Z89WDWEk^s#9Uym(_kS4Li;TaAgx*oY+=@NI(*S4$Frz_>l=He*7cfsr}92Dt0 zm^?7ZM=;$N_A-ei2u}(iL`o48<2$E}@Kd1At(S-xADyZMw~wlX`W;LB;M7LAJeG*u z2B?oE&NHIGqHNDIqHKS78v1un8SIqt@hKxR8s!oN_Ki~;QB6ay92Y2(cu-Sn(Vra~ zB}NqK0~KnRh!KVU<71W|79;8o<2Sy`__im{uxd^!^mng7k2qTGzab6_? zJBsu{`tKc&2lXI{$ZeEugl)7gqFkcpj~EfQ=W80p5k(q#i3$`k&JS`FX_Rev=^tH= k5iSu7QTmbFDBDQlJmY~Edd$O;K0NbaJY&g!{`~j<0$l|}W&i*H literal 0 HcmV?d00001 diff --git a/lispusers/ACE b/lispusers/ACE new file mode 100644 index 00000000..a8018f00 --- /dev/null +++ b/lispusers/ACE @@ -0,0 +1,1893 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") +(FILECREATED "16-Nov-93 14:13:50" {DSK}export>lispcore>lispusers>ACE.;3 148254 + + changes to%: (VARS ACE.BITMAP.MASK ACE-EDITCOMS ACELOGOMAP) + (FNS ACE ACE.ANIMATE ACE.RUN ACEGETFRAME# ACERUNLOOP ACE.NEW.SEQUENCE + ACE.NEW.FRAME ACE.QUIT.ACE ACE.RESET.SEQ ACE.RUN.CURRENT.SEQ ACE.DELAY + ACE.DELAY.FRAME ACE.DELAY.SEQ ACE.DECREMENT.FRAME ACE.INCREMENT.FRAME + ACE.DELETE.FRAME ACE.SET.DEVICE ACE.QUICKDRAW&UPD ACE.RECONSTRUCT.FRAME + SUBLIST ACE.TRILLIUM ACE.TRILLIUM.LOOP ACE.RUN.TRILLIUM ACE.QUIT.TRILLIUM + ACE.CREATE.EDITING.BORDER ACE.GET.SEQ.FILE ACE.PUT.SEQ.FILE + ACE.GET.A.FILE.NAME ACE.ASKEM ACE.TELLEM ACE.CONFIRMIT ACE.DEFINE.SEQ.WINDOW + ACE.FIGURE.OUT.WINDOW ACE.RETURN.CLOSEST.VERTEX ACE.NEW.SEQ.ASST + ACE.DELAY.FRAME.ASST ACE.SETUP.CW.CLIPPING.REGIONS ACE.CHECKSTUFF + ACE.UPD.CONTROL.WINDOW ACE.UPD.CW.MULE ACE.UPD.CLEAR.SET.LINE + ACE.CREATE.CONTROL.MENU ACE.SEQ.FETCH.WIDTH ACE.SEQ.FETCH.HEIGHT + ACE.SET.SEQ.CLIP.REGION ACE.ASKEM2 ACE.TELLEM2 ACE.UPD.CONTROL.WINDOW2 + ACE.COMPILE.FRAME ACE.EXTRACT ACESETTHRESHOLD ACE.MAX.REGIONS + ACE.PICK.BEST.REGION ACE.COMPUTE.AREA ACE.SCAN.BITMAPS ACE.SCAN.PRIMBLOCKS + ACE.FETCH.BLOCK) + + previous date%: "16-Nov-93 13:52:56" {DSK}export>lispcore>lispusers>ACE.;2) + + +(* ; " +Copyright (c) 1988, 1993 by Michel Denber. All rights reserved. +") + +(PRETTYCOMPRINT ACECOMS) + +(RPAQQ ACECOMS + ( + (* ;; "Animation Compiler and Environment") + + + (* ;; "THIS IS THE START UP FILE FOR THE ACE SYSTEM") + + (DECLARE%: DONTCOPY (RECORDS ACE.FRAME ACE.BLIT) + (MACROS ACE.MT.SCRX.SEQX ACE.MT.SCRY.SEQY ACE.MT.SCRX.AWX ACE.MT.SCRY.AWY + ACE.MT.SEQ.SCR.REGION ACE.MT.SEQ.AW.REGION ACE.MT.AW.SCR.POINT ACE.MT.AWX.SCRX + ACE.MT.AWY.SCRY ACE.MT.AWX.SEQX ACE.MT.AWY.SEQY ACE.MT.SEQX.SCRX + ACE.MT.SEQY.SCRY ACE.MT.SEQX.AWX ACE.MT.SEQY.AWY)) + + (* ;; "ANIMATION FILES") + + (COMS * ACE-MAINCOMS) + (COMS * ACE-PRIMCOMS) + (COMS * ACE-EDITCOMS))) + + + +(* ;; "Animation Compiler and Environment") + + + + +(* ;; "THIS IS THE START UP FILE FOR THE ACE SYSTEM") + +(DECLARE%: DONTCOPY +(DECLARE%: EVAL@COMPILE + +(RECORD ACE.FRAME (DELAY BLITS)) + +(RECORD ACE.BLIT (BITMAP XCOOR . YCOOR)) +) + +(DECLARE%: EVAL@COMPILE + +(PUTPROPS ACE.MT.SCRX.SEQX MACRO ((SCREENXCOOR) + (IDIFFERENCE [IDIFFERENCE SCREENXCOOR (DSPXOFFSET + NIL + (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + ACE.SEQ.WINDOW.XOFF))) + +(PUTPROPS ACE.MT.SCRY.SEQY MACRO ((SCREENYCOOR) + (IDIFFERENCE [IDIFFERENCE SCREENYCOOR (DSPYOFFSET + NIL + (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + ACE.SEQ.WINDOW.YOFF))) + +[PUTPROPS ACE.MT.SCRX.AWX MACRO ((SCREENXCOOR) + (IDIFFERENCE SCREENXCOOR (DSPXOFFSET NIL (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + +[PUTPROPS ACE.MT.SCRY.AWY MACRO ((SCREENYCOOR) + (IDIFFERENCE SCREENYCOOR (DSPYOFFSET NIL (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + +(PUTPROPS ACE.MT.SEQ.SCR.REGION MACRO (NIL (CREATEREGION (ACE.MT.SEQX.SCRX 0) + (ACE.MT.SEQY.SCRY 0) + ACE.SEQ.WIDTH ACE.SEQ.HEIGHT))) + +(PUTPROPS ACE.MT.SEQ.AW.REGION MACRO (NIL (CREATEREGION ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF + ACE.SEQ.WIDTH ACE.SEQ.HEIGHT))) + +[PUTPROPS ACE.MT.AW.SCR.POINT MACRO ((POINT) + (CONS (ACE.MT.AWX.SCRX (CAR POINT)) + (ACE.MT.AWY.SCRY (CDR POINT] + +[PUTPROPS ACE.MT.AWX.SCRX MACRO ((WINDOWXCOOR) + (IPLUS WINDOWXCOOR (DSPXOFFSET NIL (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + +[PUTPROPS ACE.MT.AWY.SCRY MACRO ((WINDOWYCOOR) + (IPLUS WINDOWYCOOR (DSPYOFFSET NIL (WINDOWPROP ACE.SEQ.WINDOW + 'DSP] + +(PUTPROPS ACE.MT.AWX.SEQX MACRO ((WINDOWX) + (IDIFFERENCE WINDOWX ACE.SEQ.WINDOW.XOFF))) + +(PUTPROPS ACE.MT.AWY.SEQY MACRO ((WINDOWY) + (IDIFFERENCE WINDOWY ACE.SEQ.WINDOW.YOFF))) + +[PUTPROPS ACE.MT.SEQX.SCRX MACRO ((SEQXCOOR) + (IPLUS ACE.SEQ.WINDOW.XOFF (ACE.MT.AWX.SCRX SEQXCOOR] + +[PUTPROPS ACE.MT.SEQY.SCRY MACRO ((SEQYCOOR) + (IPLUS ACE.SEQ.WINDOW.YOFF (ACE.MT.AWY.SCRY SEQYCOOR] + +(PUTPROPS ACE.MT.SEQX.AWX MACRO ((SEQXCOOR) + (IPLUS SEQXCOOR ACE.SEQ.WINDOW.XOFF))) + +(PUTPROPS ACE.MT.SEQY.AWY MACRO ((SEQYCOOR) + (IPLUS SEQYCOOR ACE.SEQ.WINDOW.YOFF))) +) +) + + + +(* ;; "ANIMATION FILES") + + +(RPAQQ ACE-MAINCOMS + [(* MAIN TOP LEVEL STUFF) + (FNS ACE ACE.ANIMATE ACE.RUN ACEGETFRAME# ACERUNLOOP ACE.NEW.SEQUENCE ACE.NEW.FRAME + ACE.QUIT.ACE ACE.RESET.SEQ ACE.RUN.CURRENT.SEQ ACE.DELAY ACE.DELAY.FRAME ACE.DELAY.SEQ + ACE.DECREMENT.FRAME ACE.INCREMENT.FRAME ACE.DELETE.FRAME ACE.SET.DEVICE + ACE.QUICKDRAW&UPD ACE.RECONSTRUCT.FRAME SUBLIST) + (* TRILLIUM STUFF) + (FNS ACE.TRILLIUM ACE.TRILLIUM.LOOP ACE.RUN.TRILLIUM ACE.QUIT.TRILLIUM + ACE.CREATE.EDITING.BORDER) + (* I/O STUFF) + (FNS ACE.GET.SEQ.FILE ACE.PUT.SEQ.FILE ACE.GET.A.FILE.NAME) + (* HELPER FNS) + (FNS ACE.ASKEM ACE.TELLEM ACE.CONFIRMIT ACE.DEFINE.SEQ.WINDOW ACE.FIGURE.OUT.WINDOW + ACE.RETURN.CLOSEST.VERTEX ACE.NEW.SEQ.ASST ACE.DELAY.FRAME.ASST + ACE.SETUP.CW.CLIPPING.REGIONS ACE.CHECKSTUFF ACE.UPD.CONTROL.WINDOW ACE.UPD.CW.MULE + ACE.UPD.CLEAR.SET.LINE ACE.CREATE.CONTROL.MENU ACE.SEQ.FETCH.WIDTH ACE.SEQ.FETCH.HEIGHT + ACE.SET.SEQ.CLIP.REGION ACE.ASKEM2 ACE.TELLEM2 ACE.UPD.CONTROL.WINDOW2) + (* The following Macros set up restricting clipping regions) + (MACROS ACE.MAC.CW.INFO.CLIP ACE.MAC.CW.PROMPT.CLIP ACE.MAC.SEQ.CLIP) + (MACROS ACE.MAC.FETCH.WIDTH ACE.MAC.FETCH.HEIGHT) + (CURSORS ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR ACE.RIGHTMOUSE.CURSOR + ACE.ALLMOUSE.CURSOR) + (GLOBALVARS ACE.CONTROL.WINDOW ACE.DIRECTORY ACE.SEQ.WINDOW ACE.SEQ.WIDTH ACE.SEQ.HEIGHT + ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF ACE.CURRENT.SEQUENCE ACE.CURRENT.SEQUENCE.NAME + ACE.FRAME.TAIL ACE.CURRENT.FRAME ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD + ACE.RUNNING.UNDER.TRILLIUM ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR + ACE.RIGHTMOUSE.CURSOR ACE.ALLMOUSE.CURSOR) + (* MENUS IN MAIN) + (GLOBALVARS ACE.CONTROL.MENU ACE.DELAY.MENU ACE.SET.DEVICE.MENU) + (P (SETQ ACE.CONTROL.WINDOW NIL) + (SETQ ACE.CONTROL.MENU NIL) + (SETQ ACE.DELAY.MENU NIL) + (SETQ ACE.SET.DEVICE.MENU NIL)) + (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) + (NLAML) + (LAMA]) + + + +(* MAIN TOP LEVEL STUFF) + +(DEFINEQ + +(ACE + [LAMBDA (SEQUENCE WINDOW POSITION APPLICATION) (* MD "14-Jun-85 17:34") + + (* Top level function to run animation. + All ARGs are optional (No ARGs means just run "normal" ACE); + Current APPLICATIONs are NIL (Normal) and TRILLIUM. + If TRILLIUM, then POSITION is necessary + (and WINDOW very highly reccommended!); + ACE creates ACE.CONTROL.WINDOW and menu if necessary; + then decides about APPLICATION) + + (PROG (FONT TEMP.REGION) + (OR ACE.CONTROL.MENU (ACE.CREATE.CONTROL.MENU)) + (SETQ FONT (FONTCREATE 'HELVETICA 10 'BOLD)) + (COND + ((WINDOWP ACE.CONTROL.WINDOW) + (TOTOPW ACE.CONTROL.WINDOW)) + (T (SETQ ACE.CONTROL.WINDOW (CREATEW (LIST 500 500 (IPLUS 2 (fetch IMAGEWIDTH + of ACE.CONTROL.MENU)) + (IPLUS (ITIMES 4 (FONTPROP FONT 'HEIGHT)) + (fetch IMAGEHEIGHT of + ACE.CONTROL.MENU + ) + 25)) + (CONCAT "ACE v. " "2.1" " Control Window") + 1)) + (DSPFONT FONT ACE.CONTROL.WINDOW) + (WINDOWPROP ACE.CONTROL.WINDOW 'RESHAPEFN 'DON'T) + (WINDOWPROP ACE.CONTROL.WINDOW 'REPAINTFN 'DON'T) + (ACE.SETUP.CW.CLIPPING.REGIONS ACE.CONTROL.MENU))) + (ACE.TELLEM "Position This Window" T) + (WINDOWPROP ACE.CONTROL.WINDOW 'MOVEFN NIL) + (MOVEW ACE.CONTROL.WINDOW) + (SETQ ACE.AREA.THRESHOLD 50) + (SETQ ACE.VERTICAL.BLOCK 16) + (SETQ ACE.CURRENT.SEQUENCE.NAME NIL) + (COND + ((EQ APPLICATION 'TRILLIUM) + (RETURN (ACE.TRILLIUM WINDOW SEQUENCE POSITION))) + (T (SETQ ACE.RUNNING.UNDER.TRILLIUM NIL) + (SETQ ACE.DIRECTORY (ACE.ASKEM "Animation Directory? " T LOGINHOST/DIR)) + (ACE.TELLEM "If using the Tablet," T) + (ACE.TELLEM "Be sure and Initialize it." 'L) + (SETQ ACE.SEQ.WINDOW NIL) + (SETQ ACE.SEQ.WIDTH NIL) + (SETQ ACE.SEQ.HEIGHT NIL) + (SETQ ACE.SEQ.WINDOW.XOFF 0) + (SETQ ACE.SEQ.WINDOW.YOFF 0) + (SETQ ACE.CURRENT.SEQUENCE NIL) + (SETQ ACE.FRAME.TAIL NIL) + (SETQ ACE.CURRENT.FRAME NIL) + (replace (MENU WHENSELECTEDFN) of ACE.CONTROL.MENU with 'ACE.ANIMATE) + (ADDMENU ACE.CONTROL.MENU ACE.CONTROL.WINDOW (CONS 0 0)) + (ACE.UPD.CONTROL.WINDOW 'RESET]) + +(ACE.ANIMATE + [LAMBDA (ITEM WHO CARES) (* MD "26-Jun-85 14:21") + + (* When running "normal" ACE, this is the WHENSELECTEDFN for deciding what to + do. ITEM is the only ARG of significance + (WHO & CARES just to keep MENU package happy); + "TRILLIUM ACE" has its own loop thingy) + + (ACE.TELLEM "" T) + (SELECTQ (CADADR ITEM) + (NIL NIL) + (FRAME (ACE.NEW.FRAME)) + (EDIT (ACE.EDIT)) + (RUN (ACE.RUN.CURRENT.SEQ)) + (LOOP (ACERUNLOOP 1 'END)) + (SUBLOOP (ACEGETFRAME#)) + (NEW (ACE.NEW.SEQUENCE)) + (I/O%:GET (ACE.GET.SEQ.FILE)) + (I/O%:PUT (ACE.PUT.SEQ.FILE)) + (DEL (ACE.DELETE.FRAME)) + (RESET (ACE.RESET.SEQ)) + (INC (ACE.INCREMENT.FRAME)) + (DEC (ACE.DECREMENT.FRAME)) + (TIME (ACE.DELAY)) + (INIT.MM1201 (ACE.MM1201.INIT T)) + (DEVICE (ACE.SET.DEVICE)) + (ACESETTHRESHOLD + (ACESETTHRESHOLD)) + (QUIT (ACE.QUIT.ACE)) + NIL) + (AND (OPENWP ACE.CONTROL.WINDOW) + (ACE.UPD.CONTROL.WINDOW 'UPD)) + (TTY.PROCESS T]) + +(ACE.RUN + [LAMBDA (SEQ WINDOW XOFFSET YOFFSET TIMER) (* PmT "18-Apr-85 18:21") + + (* This runs animation sequences. Simple, eh? Gots to have a SEQ and a WINDOW + to show it in, and where in the window to show it + (i.e. XOFFSET YOFFSET); TIMER is wholly unecessary NOTE%: this thang doesn't + use any clipping region, just an offset) + + (for FRAME in SEQ do ((SETQ TIMER (SETUPTIMER (fetch (ACE.FRAME DELAY) + of FRAME) + TIMER + 'MILLISECONDS)) + (for FRAME.PART in (fetch (ACE.FRAME BLITS) + of FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of + FRAME.PART + ) + NIL NIL WINDOW (IPLUS XOFFSET + (fetch (ACE.BLIT + XCOOR) + of FRAME.PART)) + (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) + of FRAME.PART)) + NIL NIL 'INPUT 'REPLACE)) + (until (TIMEREXPIRED? TIMER 'MILLISECONDS) do]) + +(ACEGETFRAME# + [LAMBDA NIL (* MD "27-Jun-85 12:51") + (ACERUNLOOP (RNUMBER "From frame #") + (RNUMBER "To frame #:"]) + +(ACERUNLOOP + [LAMBDA (START END) (* MD "26-Jun-85 17:07") + (if (EQ END 'END) + then (SETQ END (LENGTH ACE.CURRENT.SEQUENCE))) + [ACE.QUICKDRAW&UPD (LIST (CAR (NTH ACE.CURRENT.SEQUENCE START] + (until (KEYDOWNP 'SPACE) do (ACE.RUN (SUBLIST ACE.CURRENT.SEQUENCE START END) + ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF + ]) + +(ACE.NEW.SEQUENCE + [LAMBDA (REGION) (* PmT "30-Apr-85 16:21") + (PROG (TEMP.REGION) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "NEW") + (COND + ((OR (NULL ACE.CURRENT.SEQUENCE) + (ACE.TELLEM "Creating a NEW Sequence will ERASE" T) + (ACE.TELLEM "the Current Animation Sequence." 'L) + (ACE.CONFIRMIT "Click LEFT to Create NEW Sequence." 'L)) + [COND + ((REGIONP REGION) + (SETQ TEMP.REGION REGION)) + (T (ACE.TELLEM "Specify SIZE of the NEW Sequence." T) + (ACE.TELLEM "Watch ACE window for COORs." 'L) + (SETQ TEMP.REGION (GETREGION NIL NIL NIL 'ACE.NEW.SEQ.ASST NIL] + (SETQ ACE.SEQ.WIDTH (fetch (REGION WIDTH) of TEMP.REGION)) + (SETQ ACE.SEQ.HEIGHT (fetch (REGION HEIGHT) of TEMP.REGION)) + [SETQ ACE.CURRENT.SEQUENCE (LIST (create ACE.FRAME + DELAY _ 0 + BLITS _ + (LIST (create ACE.BLIT + BITMAP _ (BITMAPCREATE + ACE.SEQ.WIDTH + ACE.SEQ.HEIGHT 1) + XCOOR _ 0 + YCOOR _ 0] + (ACE.FIGURE.OUT.WINDOW) + (ACE.QUICKDRAW&UPD (LIST (CAR ACE.CURRENT.SEQUENCE]) + +(ACE.NEW.FRAME + [LAMBDA NIL (* PmT "24-Jan-85 13:22") + (ACE.UPD.CONTROL.WINDOW 'OPERATION "FRAME") + (COND + ([NULL (AND (ACE.CHECKSTUFF 'SEQ) + (OR (ACE.CHECKSTUFF 'FRAME) + (ACE.TELLEM "Can't put a frame before the First Frame." T] + NIL) + (T (RPLACD ACE.CURRENT.FRAME (CONS (create ACE.FRAME + DELAY _ 0 + BLITS _ NIL) + (CDR ACE.CURRENT.FRAME))) + (SETQ ACE.CURRENT.FRAME (CDR ACE.CURRENT.FRAME)) + (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME)) + (ACE.TELLEM "Going to EDIT ..." T) + (ACE.EDIT]) + +(ACE.QUIT.ACE + [LAMBDA NIL (* MD "24-Jun-85 14:49") + (ACE.UPD.CONTROL.WINDOW 'OPERATION "QUIT") + (ACE.TELLEM "QUITing will Close All Animation Windows;" T) + (ACE.TELLEM "All Images and Data will be LOST." 'L) + (COND + ((ACE.CONFIRMIT "Click LEFT to QUIT." 'L) + (CLOSEW ACE.SEQ.WINDOW) + (CLOSEW ACE.CONTROL.WINDOW) + ACE.CURRENT.SEQUENCE) + (T + + (* MAKE THIS BE SOME KINDA ICON IN THE FUTURE; + ASK%: DO YOU WANT TO QUIT COMPLETELY OR JUST STOP FOR A WHILE) + + (ACE.TELLEM "QUIT Aborted." T]) + +(ACE.RESET.SEQ + [LAMBDA NIL (* PmT "30-Apr-85 16:37") + (ACE.UPD.CONTROL.WINDOW 'OPERATION "RESET") + (COND + [(AND ACE.SEQ.WINDOW (ACE.CHECKSTUFF 'SEQ)) + (ACE.QUICKDRAW&UPD (LIST (CAR ACE.CURRENT.SEQUENCE] + (T (ACE.TELLEM "There is No Current Sequence." T]) + +(ACE.RUN.CURRENT.SEQ + [LAMBDA NIL (* PmT "18-Apr-85 18:23") + (* just a pretty interface to + ACE.RUN) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "RUN") + (COND + ((ACE.CHECKSTUFF 'SEQ) + (RECLAIM) + (ACE.RUN ACE.FRAME.TAIL ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF) + (SETQ ACE.FRAME.TAIL NIL) + (SETQ ACE.CURRENT.FRAME (LAST ACE.CURRENT.SEQUENCE]) + +(ACE.DELAY + [LAMBDA NIL (* PmT " 2-May-85 20:53") + (* For setting delays + (in MSECs) between frames. + Lots of work needed here; + esp. delay in-betweening) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "DELAY") + (SELECTQ [MENU (OR ACE.DELAY.MENU (SETQ ACE.DELAY.MENU (create MENU + ITEMS _ + '(("Set Delay on a Frame" + 'FDELAY + "Adjust the delay on any frame by number" + ) + ("Reset Entire Sequence" + 'SDELAY + "Set the delay on every frame")) + CENTERFLG _ T + TITLE _ + "Sequence Timing Adjustments"] + (NIL NIL) + (SDELAY (ACE.DELAY.SEQ)) + (FDELAY (ACE.DELAY.FRAME)) + NIL]) + +(ACE.DELAY.FRAME + [LAMBDA NIL (* MD "21-Jun-85 14:14") + (PROG (CHOICE FRAME) + LOOP + [SETQ CHOICE (MENU (create MENU + ITEMS _ (NCONC1 (for FRAME in ACE.CURRENT.SEQUENCE + bind (COUNT _ 0) + collect + ((SETQ COUNT (ADD1 COUNT)) + (LIST (CONCAT "Frame " COUNT " : " + (fetch (ACE.FRAME DELAY) + of FRAME)) + COUNT))) + '(Quit 'QUIT "Stop adjusting delays")) + TITLE _ "Frame Delays" + WHENHELDFN _ 'ACE.DELAY.FRAME.ASST] + [COND + ((NULL CHOICE) + NIL) + ((EQ CHOICE 'QUIT) + (RETURN NIL)) + (T (SETQ FRAME (CAR (NTH ACE.CURRENT.SEQUENCE CHOICE))) + (AND FRAME (replace (ACE.FRAME DELAY) of FRAME + with (SETQ CHOICE (RNUMBER (CONCAT "Frame " CHOICE "; New Delay: "] + (GO LOOP]) + +(ACE.DELAY.SEQ + [LAMBDA NIL (* MD "21-Jun-85 14:31") + (PROG (NEW.DELAY.VALUE) + (COND + [(FIXP (SETQ NEW.DELAY.VALUE (RNUMBER "Delay for entire sequence:"] + (T (RETURN NIL))) + (for FRAME in ACE.CURRENT.SEQUENCE do (replace (ACE.FRAME DELAY) + of FRAME with NEW.DELAY.VALUE]) + +(ACE.DECREMENT.FRAME + [LAMBDA NIL (* PmT "21-Dec-84 14:12") + (ACE.UPD.CONTROL.WINDOW 'OPERATION "DEC") + (AND (ACE.CHECKSTUFF 'SEQ) + (ACE.CHECKSTUFF 'FRAME) + (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME]) + +(ACE.INCREMENT.FRAME + [LAMBDA NIL (* MD "18-Jun-85 16:12") + (PROG (CUR.FRAME) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "INC") + (COND + ([NULL (AND (ACE.CHECKSTUFF 'SEQ) + (ACE.CHECKSTUFF 'TAIL] + NIL) + (T (SETQ CUR.FRAME (CAR ACE.FRAME.TAIL)) + (SETQ ACE.CURRENT.FRAME ACE.FRAME.TAIL) + (SETQ ACE.FRAME.TAIL (CDR ACE.FRAME.TAIL)) + (COND + ((NULL (fetch (ACE.FRAME BLITS) of CUR.FRAME)) + NIL) + (T (ACE.MAC.SEQ.CLIP (for FRAME.PART in (fetch (ACE.FRAME BLITS) + of CUR.FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of + FRAME.PART + ) + NIL NIL ACE.SEQ.WINDOW + (IPLUS ACE.SEQ.WINDOW.XOFF + (fetch (ACE.BLIT XCOOR) + of FRAME.PART)) + (IPLUS ACE.SEQ.WINDOW.YOFF + (fetch (ACE.BLIT YCOOR) + of FRAME.PART)) + NIL NIL 'INPUT 'REPLACE]) + +(ACE.DELETE.FRAME + [LAMBDA NIL (* PmT "24-Apr-85 14:19") + (* Deletes the current frame; + recompiles the previous frame with + the successor frame) + (PROG (BEFORE.BM AFTER.BM) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "DELETE") + (COND + ([NULL (AND (ACE.CHECKSTUFF 'SEQ) + (ACE.CHECKSTUFF 'FRAME] + NIL) + ((EQ ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME) + (ACE.TELLEM "Can't DELETE first frame. Aborted." T)) + ((NULL (ACE.CONFIRMIT "Click LEFT to Confirm Delete" T)) + NIL) + ((NULL ACE.FRAME.TAIL) + (SETQ ACE.CURRENT.SEQUENCE (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME)) + (ACE.QUICKDRAW&UPD ACE.CURRENT.SEQUENCE)) + (T (SETQ BEFORE.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE + ACE.CURRENT.FRAME))) + [SETQ AFTER.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE (CDR + ACE.FRAME.TAIL + ] + (replace (ACE.FRAME BLITS) of (CAR ACE.CURRENT.FRAME) + with (ACE.COMPILE.FRAME BEFORE.BM AFTER.BM ACE.VERTICAL.BLOCK + ACE.AREA.THRESHOLD)) + (RPLACD ACE.CURRENT.FRAME (CDR ACE.FRAME.TAIL)) + (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE (CDR ACE.CURRENT.FRAME]) + +(ACE.SET.DEVICE + [LAMBDA NIL (* PmT "23-Apr-85 13:44") + (* Selects MOUSE or TABLET as the + primary input device) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "SET DEVICE") + (ACE.UPD.CONTROL.WINDOW 'DEVICE) + (ACE.UPD.CONTROL.WINDOW 'DEVICE (MENU (OR ACE.SET.DEVICE.MENU + (SETQ ACE.SET.DEVICE.MENU + (create MENU + ITEMS _ '(("Mouse" 'MOUSE + "Use the standard mouse for drawing and such" + ) + ("Tablet" 'MM1201 + "Use the MM1201 Tablet as the input device" + )) + TITLE _ "Select Input Device" + CENTERFLG _ T]) + +(ACE.QUICKDRAW&UPD + [LAMBDA (PARTIAL.SEQ) (* PmT "30-Apr-85 16:11") + + (* Updates the frame showing in the A.S.Window and update sequence pointers and + stuff. PARTIAL.SEQ is a list of frames to show; + The last frame in PARTIAL.SEQ becomes the new current frame) + + (COND + (PARTIAL.SEQ [ACE.MAC.SEQ.CLIP + (for FRAME in PARTIAL.SEQ + do (COND + ((NULL (fetch (ACE.FRAME BLITS) of FRAME)) + NIL) + (T (for FRAME.PART in (fetch (ACE.FRAME BLITS) + of FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART + ) + NIL NIL ACE.SEQ.WINDOW + (IPLUS ACE.SEQ.WINDOW.XOFF (fetch + (ACE.BLIT XCOOR) + of FRAME.PART + )) + (IPLUS ACE.SEQ.WINDOW.YOFF (fetch + (ACE.BLIT YCOOR) + of FRAME.PART + )) + NIL NIL 'INPUT 'REPLACE] + (SETQ ACE.CURRENT.FRAME ACE.CURRENT.SEQUENCE) + (for X from 1 to (SUB1 (LENGTH PARTIAL.SEQ)) do (SETQ ACE.CURRENT.FRAME + (CDR ACE.CURRENT.FRAME + ))) + (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME]) + +(ACE.RECONSTRUCT.FRAME + [LAMBDA (SEQ) (* PmT "18-Apr-85 18:54") + + (* Creates a bitmap out of SEQ; Essentially, the last virtual frame in SEQ is + converted to a "real" frame and returned) + + (PROG (ABITMAP) + [SETQ ABITMAP (BITMAPCOPY (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME + BLITS) + of (CAR SEQ] + [for FRAME in (CDR SEQ) + do (COND + ((NULL (fetch (ACE.FRAME BLITS) of FRAME))) + (T (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) + NIL NIL ABITMAP (fetch (ACE.BLIT XCOOR) of + FRAME.PART + ) + (fetch (ACE.BLIT YCOOR) of FRAME.PART) + NIL NIL 'INPUT 'REPLACE] + (RETURN ABITMAP]) + +(SUBLIST + [LAMBDA (L M N) (* MD "26-Jun-85 16:00") + (LDIFF (NTH L M) + (NTH L (ADD1 N]) +) + + + +(* TRILLIUM STUFF) + +(DEFINEQ + +(ACE.TRILLIUM + [LAMBDA (WINDOW SEQUENCE POSITION) (* PmT "30-Apr-85 16:44") + + (* This here sets up stuff for running animation + (functionally) from Trillium. ARGS%: WINDOW is opt + (but really should be given)%, SEQUENCE is opt, POSITION *MUST* be given; + if not, ACE bags it (Trillium must always supply a place to put the animation!) + %: This FN just checks args and sets the state of ACE, then calls the actual "polling" + FN NOTE%: This should only be called from ACE; + take a look at ACE) + + (PROG NIL + (SETQ ACE.RUNNING.UNDER.TRILLIUM T) + (DISPLAY.FRAME CURRENT.FRAME) (* See if got a valid window or not) + [COND + ((WINDOWP WINDOW) + (SETQ ACE.SEQ.WINDOW WINDOW)) + (T (ACE.TELLEM "There is no Window Specification" T) + (COND + ((ACE.CONFIRMIT "Click LEFT to use Current Interface Window." 'L) + (SETQ ACE.SEQ.WINDOW CURRENT.INTERFACE.WINDOW)) + (T (ACE.TELLEM "Error in Window Specification." T) + (ACE.TELLEM "Likely a Trillium error. ACE aborted." 'L) + (ACE.CONFIRMIT "Click any button to Exit." 'L 'ANY) + (RETURN NIL] (* The following *might* be used + instead of a window error; + you decide) + (* SETQ ACE.SEQ.WINDOW + (EVAL (ACE.ASKEM + "Enter the Name of the Window: " T + NIL 60))) + (* Was given a valid postion?) + (COND + ((POSITIONP POSITION) + (SETQ ACE.SEQ.WINDOW.XOFF (fetch (POSITION XCOORD) of POSITION)) + (SETQ ACE.SEQ.WINDOW.YOFF (fetch (POSITION YCOORD) of POSITION))) + (T (ACE.TELLEM "No Position Specification. Aborted." T) + (ACE.TELLEM "This is likely a Trillium error." 'L) + (ACE.CONFIRMIT "Click any button to Exit." 'L 'ANY) + (RETURN NIL))) (* Now check if given a sequence) + (COND + ((LISTP SEQUENCE) + (SETQ ACE.CURRENT.SEQUENCE SEQUENCE) + (SETQ ACE.CURRENT.FRAME ACE.CURRENT.SEQUENCE) + (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME)) + (SETQ ACE.SEQ.WIDTH (ACE.SEQ.FETCH.WIDTH)) + (SETQ ACE.SEQ.HEIGHT (ACE.SEQ.FETCH.HEIGHT)) + (ACE.CREATE.EDITING.BORDER) + (ACE.SET.SEQ.CLIP.REGION)) + (T (SETQ ACE.CURRENT.SEQUENCE NIL) + (SETQ ACE.FRAME.TAIL NIL) + (SETQ ACE.CURRENT.FRAME NIL))) (* The WHENSELECTEDFN is different + for Trillium; make it act like a + regular old menu) + (replace (MENU WHENSELECTEDFN) of ACE.CONTROL.MENU with 'DEFAULTWHENSELECTEDFN) + (SETQ ACE.DIRECTORY (DIRECTORYNAME T T)) + (AND ACE.CURRENT.SEQUENCE (ACE.RESET.SEQ)) + (ACE.UPD.CONTROL.WINDOW 'RESET) (* Lock down window so menu coors + only figured once; + see ACE.TRILLIUM.LOOP) + (WINDOWPROP ACE.CONTROL.WINDOW 'MOVEFN 'DON'T) + (RETURN (ACE.TRILLIUM.LOOP]) + +(ACE.TRILLIUM.LOOP + [LAMBDA NIL (* PmT "18-Apr-85 18:41") + (* This is the repeating loop for + Trillium-Ace; just sits in here till + QUIT) + (PROG (CHOICE MENU.POS) + [SETQ MENU.POS (CONS (DSPXOFFSET NIL (WINDOWPROP ACE.CONTROL.WINDOW 'DSP)) + (DSPYOFFSET NIL (WINDOWPROP ACE.CONTROL.WINDOW 'DSP] + LOOP + (ACE.TELLEM "" T) + (SELECTQ (SETQ CHOICE (MENU ACE.CONTROL.MENU MENU.POS)) + (NIL NIL) + (FRAME (ACE.NEW.FRAME)) + (EDIT (ACE.EDIT)) + (RUN (ACE.RUN.CURRENT.SEQ)) + (NEW (ACE.NEW.SEQUENCE)) + (I/O%:GET (ACE.GET.SEQ.FILE)) + (I/O%:PUT (ACE.PUT.SEQ.FILE)) + (DEL (ACE.DELETE.FRAME)) + (RESET (ACE.RESET.SEQ)) + (INC (ACE.INCREMENT.FRAME)) + (DEC (ACE.DECREMENT.FRAME)) + (TIME (ACE.DELAY)) + (INIT.MM1201 (ACE.MM1201.INIT T)) + (DEVICE (ACE.SET.DEVICE)) + (QUIT NIL) + NIL) + (ACE.UPD.CONTROL.WINDOW 'UPD) + (OR (EQ CHOICE 'QUIT) + (GO LOOP)) + (RETURN (ACE.QUIT.TRILLIUM]) + +(ACE.RUN.TRILLIUM + [LAMBDA (SEQ WINDOW XOFFSET YOFFSET UPTO TIMER) (* PmT "18-Apr-85 18:45") + + (* Just like ACE.RUN except UPTO can be a FIXP denoting a frame; + If UPTO is given, that frame is displayed + (without delays); Good for initializing in Trillium) + + (COND + [(NULL UPTO) + (for FRAME in SEQ do ((SETQ TIMER (SETUPTIMER (fetch (ACE.FRAME DELAY) + of FRAME) + TIMER + 'MILLISECONDS)) + (for FRAME.PART in (fetch (ACE.FRAME BLITS) + of FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of + FRAME.PART) + NIL NIL WINDOW (IPLUS XOFFSET + (fetch + (ACE.BLIT XCOOR) + of FRAME.PART + )) + (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) + of FRAME.PART)) + NIL NIL 'INPUT 'REPLACE)) + (until (TIMEREXPIRED? TIMER 'MILLISECONDS) do] + ((AND (FIXP UPTO) + (IGREATERP (ADD1 (LENGTH SEQ)) + UPTO) + (IGREATERP UPTO 0)) + (for FRAME in (LDIFF SEQ (NTH SEQ (ADD1 UPTO))) + do (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) + do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) + NIL NIL WINDOW (IPLUS XOFFSET (fetch (ACE.BLIT XCOOR) + of FRAME.PART)) + (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) of FRAME.PART)) + NIL NIL 'INPUT 'REPLACE]) + +(ACE.QUIT.TRILLIUM + [LAMBDA NIL (* PmT "15-Mar-85 13:48") + (CLOSEW ACE.CONTROL.WINDOW) + (SETQ ACE.RUNNING.UNDER.TRILLIUM NIL) + ACE.CURRENT.SEQUENCE]) + +(ACE.CREATE.EDITING.BORDER + [LAMBDA (MODE) (* PmT "30-Apr-85 16:42") + (PROG (X1 X2 Y1 Y2) + (OR MODE (SETQ MODE 'PAINT)) + (COND + ((AND (NUMBERP ACE.SEQ.WIDTH) + (NUMBERP ACE.SEQ.HEIGHT)) + (SETQ X1 (IDIFFERENCE ACE.SEQ.WINDOW.XOFF 2)) + (SETQ X2 (IPLUS ACE.SEQ.WINDOW.XOFF ACE.SEQ.WIDTH)) + (SETQ Y1 (IDIFFERENCE ACE.SEQ.WINDOW.YOFF 2)) + (SETQ Y2 (IPLUS ACE.SEQ.WINDOW.YOFF ACE.SEQ.HEIGHT)) + (DRAWLINE X1 Y1 X1 Y2 2 MODE ACE.SEQ.WINDOW) + (DRAWLINE X1 Y2 X2 Y2 2 MODE ACE.SEQ.WINDOW) + (DRAWLINE X2 Y2 X2 Y1 2 MODE ACE.SEQ.WINDOW) + (DRAWLINE X2 Y1 X1 Y1 2 MODE ACE.SEQ.WINDOW]) +) + + + +(* I/O STUFF) + +(DEFINEQ + +(ACE.GET.SEQ.FILE + [LAMBDA NIL (* PmT "25-Apr-85 21:18") + (* Gets an animation sequence. + Resets ACE.CURRENT.SEQUENCE and the + sequence clipping region) + (RESETFORM (TTYDISPLAYSTREAM \TopLevelTtyWindow) + (PROG (FILENAME TEMP.SEQUENCE.NAME) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "GET FILE") + (OR (NULL ACE.CURRENT.SEQUENCE) + (ACE.TELLEM "Loading a Sequence will ERASE the Current" T) + (ACE.CONFIRMIT "Sequence; Click LEFT to confirm LOAD." 'L) + (ACE.TELLEM "Get Sequence ABORTED." T) + (RETURN NIL)) + (SETQ FILENAME (ACE.GET.A.FILE.NAME)) + [COND + ((NULL FILENAME) + (ACE.TELLEM "No NAME. Aborted" T) + (RETURN NIL)) + (T (SETQ FILENAME (PACKFILENAME 'BODY FILENAME 'HOST (FILENAMEFIELD ACE.DIRECTORY + 'HOST) + 'DIRECTORY + (FILENAMEFIELD ACE.DIRECTORY 'DIRECTORY] + (ACE.TELLEM "Loading: " T) + (ACE.TELLEM (CONCAT FILENAME " ... ") + 'L) + (RESETLST + [RESETSAVE (PROGN (CURSOR WAITINGCURSOR) + (SETTOPVAL 'HELPFLAG NIL)) + (LIST 'PROGN (LIST 'CURSOR 'DEFAULTCURSOR) + (LIST 'SETTOPVAL ''HELPFLAG (KWOTE (GETTOPVAL 'HELPFLAG] + [SETQ TEMP.SEQUENCE.NAME (CAR (ERRORSET '(LOAD FILENAME 'SYSLOAD) + 'NOBREAK]) + (COND + (TEMP.SEQUENCE.NAME (SETQ ACE.CURRENT.SEQUENCE.NAME TEMP.SEQUENCE.NAME) + (SETQ ACE.SEQ.WIDTH (ACE.SEQ.FETCH.WIDTH)) + (SETQ ACE.SEQ.HEIGHT (ACE.SEQ.FETCH.HEIGHT)) + (ACE.FIGURE.OUT.WINDOW) + (ACE.RESET.SEQ)) + (T (ACE.TELLEM "Not Found.") + (ACE.TELLEM "No Such File or File Server Problems." 'L]) + +(ACE.PUT.SEQ.FILE + [LAMBDA NIL (* PmT " 2-May-85 20:50") + (* Writes a sequence to a file; + the file is NOT pretty printed) + (PROG (FILENAME TEMP.SEQUENCE.NAME) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "PUT FILE") + [COND + ((NULL (ACE.CHECKSTUFF 'SEQ)) + (RETURN NIL)) + ((AND ACE.CURRENT.SEQUENCE.NAME (ACE.CONFIRMIT "Click LEFT to Keep Same Name." T)) + (SETQ FILENAME ACE.CURRENT.SEQUENCE.NAME)) + (T (SETQ FILENAME (ACE.GET.A.FILE.NAME)) + (COND + ((NULL FILENAME) + (ACE.TELLEM "NIL ain't no good. Aborted." T) + (RETURN NIL))) + (SETQ FILENAME (PACKFILENAME 'BODY FILENAME 'HOST (FILENAMEFIELD ACE.DIRECTORY + 'HOST) + 'DIRECTORY + (FILENAMEFIELD ACE.DIRECTORY 'DIRECTORY] + (COND + ((AND (FILENAMEFIELD FILENAME 'VERSION) + (NULL (ACE.TELLEM "Click LEFT to Write a New Version." T)) + (ACE.CONFIRMIT "Click any Other to Write Over Existing Version." 'L)) + (SETQ FILENAME (PACKFILENAME 'VERSION NIL 'BODY FILENAME))) + (T NIL)) + [SET (PACK* (FILENAMEFIELD FILENAME 'NAME) + 'COMS) + '((UGLYVARS ACE.CURRENT.SEQUENCE] + (PUTPROP (FILENAMEFIELD FILENAME 'NAME) + 'FILETYPE + '(DON'TLIST DON'TCOMPILE)) + (ACE.TELLEM "Putting to File: " T) + (ACE.TELLEM (CONCAT FILENAME " ... ") + 'L) + (RESETLST + [RESETSAVE (PROGN (CURSOR WAITINGCURSOR) + (SETTOPVAL 'HELPFLAG NIL)) + (LIST 'PROGN (LIST 'CURSOR 'DEFAULTCURSOR) + (LIST 'SETTOPVAL ''HELPFLAG (KWOTE (GETTOPVAL 'HELPFLAG] + [SETQ TEMP.SEQUENCE.NAME (CAR (ERRORSET '(MAKEFILE FILENAME '(NEW FAST)) + 'NOBREAK]) + (COND + (TEMP.SEQUENCE.NAME (SETQ ACE.CURRENT.SEQUENCE.NAME TEMP.SEQUENCE.NAME) + (ACE.TELLEM "Done") + (DREMOVE (FILENAMEFIELD FILENAME 'NAME) + FILELST)) + (T (ACE.TELLEM "Aborted.") + (ACE.TELLEM "Nothing doing. Can't write this File out." 'L) + (ACE.TELLEM "Check the Name. Is the File Server Down?" 'L]) + +(ACE.GET.A.FILE.NAME + [LAMBDA NIL (* PmT "18-Apr-85 19:44") + (ACE.ASKEM "Enter FILENAME: " T NIL 120]) +) + + + +(* HELPER FNS) + +(DEFINEQ + +(ACE.ASKEM + [LAMBDA (STRING FLG DEFAULTANSWER TIMELIMIT? SPACES?) (* MD "14-Jun-85 16:48") + + (* a prompting fn. STRING is the prompt string; + FLG either T,L or NIL (T means clear before prompting, L means new line); + DEFAULTANSWER just what it sounds like. + TIMELIMIT? number or seconds to wait for answer + (defaults to 120); if SPACES? is T, then the answer can have spaces in it) + (* TIMELIMIT? removed - + now waits forever. + - + MJD) + (ACE.MAC.CW.PROMPT.CLIP (PROGN (OR TIMELIMIT? (SETQ TIMELIMIT? 120)) + (COND + ((EQ FLG T) + (DSPRESET ACE.CONTROL.WINDOW)) + ((EQ FLG 'L) + (TERPRI ACE.CONTROL.WINDOW))) + (MKATOM (PROMPTFORWORD STRING DEFAULTANSWER NIL ACE.CONTROL.WINDOW + NIL NIL (AND SPACES? (CHARCODE (EOL ESCAPE LF]) + +(ACE.TELLEM + [LAMBDA (STRING FLG) (* PmT "23-Apr-85 13:49") + + (* Writes STRING in the A.C.W prompt region; + FLG=T means clear prompt region first; L means new line; + NIL means put it at the next char position) + + (ACE.MAC.CW.PROMPT.CLIP (PROGN (COND + ((EQ FLG T) + (DSPRESET ACE.CONTROL.WINDOW)) + ((EQ FLG 'L) + (TERPRI ACE.CONTROL.WINDOW))) + (printout ACE.CONTROL.WINDOW STRING) + NIL]) + +(ACE.CONFIRMIT + [LAMBDA (CONFIRMSTRING FLG WHICHKEYS?) (* PmT "25-Apr-85 17:47") + + (* Prints CONFIRMSTRING in A.C.W prompt region; + then waits for the button form WHICHKEYS? to become true. + WHICHKEYS? defaults to LEFT. Code identfies the valid button forms) + + (OR WHICHKEYS? (SETQ WHICHKEYS? 'LEFT)) + (ACE.TELLEM CONFIRMSTRING FLG) + (DISMISS 100 NIL T) + (RESETFORM (CURSOR (SELECTQ WHICHKEYS? + (LEFT ACE.LEFTMOUSE.CURSOR) + (MIDDLE ACE.MIDDLEMOUSE.CURSOR) + (RIGHT ACE.RIGHTMOUSE.CURSOR) + (ANY (PROGN (SETQ WHICHKEYS? '(NOT UP)) + ACE.ALLMOUSE.CURSOR)) + NIL)) + (do (GETMOUSESTATE) until (NEQ LASTMOUSEBUTTONS 0)) + (PROG1 (EVAL (MOUSESTATE-EXPR WHICHKEYS? T)) + (do (GETMOUSESTATE) until (EQP LASTMOUSEBUTTONS 0)))]) + +(ACE.DEFINE.SEQ.WINDOW + [LAMBDA NIL (* PmT " 2-May-85 20:32") + [COND + ((ACE.CONFIRMIT "Click LEFT to Create a Sequence Window." T) + (AND ACE.SEQ.WINDOW (CLOSEW ACE.SEQ.WINDOW)) + (SETQ ACE.SEQ.WINDOW (CREATEW (LIST 50 50 (IPLUS ACE.SEQ.WIDTH 8) + (IPLUS ACE.SEQ.HEIGHT 17)) + '"Animation Sequence Window" 4)) + (ACE.TELLEM "Position the Sequence Window" T) + (MOVEW ACE.SEQ.WINDOW)) + ((AND ACE.SEQ.WINDOW (ILEQ ACE.SEQ.WIDTH (WINDOWPROP ACE.SEQ.WINDOW 'WIDTH)) + (ILEQ ACE.SEQ.HEIGHT (WINDOWPROP ACE.SEQ.WINDOW 'HEIGHT)) + (ACE.CONFIRMIT "Click LEFT to Keep Current Window." T)) + (* CLEARW ACE.SEQ.WINDOW) + ) + (T (ACE.TELLEM "CAUTION: Enter NIL if Unsure at this Stage." T) + (SETQ ACE.SEQ.WINDOW (EVAL (ACE.ASKEM "Enter the Window: " 'L NIL 120] + (OR ACE.SEQ.WINDOW (ACE.DEFINE.SEQ.WINDOW]) + +(ACE.FIGURE.OUT.WINDOW + [LAMBDA (REGION/POSITION) (* PmT "22-Apr-85 19:05") + + (* This is where all reasoning about which window to use and where offsets + should be placed goes. Right now (|4/20/85|) Trillium's just gonna go with + positions; but that should (?) change) + + (COND + (ACE.RUNNING.UNDER.TRILLIUM (DISPLAY.FRAME CURRENT.FRAME) + (ACE.CREATE.EDITING.BORDER 'INVERT) (* KEEP OFFSETS THE SAME FOR NOW) + ) + ((POSITIONP REGION/POSITION) + (SETQ ACE.SEQ.WINDOW.XOFF (CAR REGION/POSITION)) + (SETQ ACE.SEQ.WINDOW.YOFF (CDR REGION/POSITION))) + (T (SETQ ACE.SEQ.WINDOW.XOFF 0) + (SETQ ACE.SEQ.WINDOW.YOFF 0) + (ACE.DEFINE.SEQ.WINDOW))) + (ACE.SET.SEQ.CLIP.REGION]) + +(ACE.RETURN.CLOSEST.VERTEX + [LAMBDA (POINT REGION) (* PmT "28-Nov-84 16:15") + (PROG (NEW.XCOOR NEW.YCOOR) + [COND + [(IGREATERP (CAR POINT) + (SETQ NEW.XCOOR (fetch (REGION RIGHT) of REGION] + [(ILESSP (CAR POINT) + (SETQ NEW.XCOOR (fetch (REGION LEFT) of REGION] + (T (SETQ NEW.XCOOR (CAR POINT] + [COND + [(IGREATERP (CDR POINT) + (SETQ NEW.YCOOR (fetch (REGION TOP) of REGION] + [(ILESSP (CDR POINT) + (SETQ NEW.YCOOR (fetch (REGION BOTTOM) of REGION] + (T (SETQ NEW.YCOOR (CDR POINT] + (RETURN (CONS NEW.XCOOR NEW.YCOOR]) + +(ACE.NEW.SEQ.ASST + [LAMBDA (FIXED MOVE DUM) (* PmT "23-Jan-85 19:52") + (COND + ((NULL MOVE) + (ACE.UPD.CONTROL.WINDOW 'CURSOR FIXED) + FIXED) + (T [ACE.UPD.CONTROL.WINDOW 'CURSOR (CONS (ABS (IDIFFERENCE (fetch (POSITION XCOORD) + of MOVE) + (fetch (POSITION XCOORD) + of FIXED))) + (ABS (IDIFFERENCE (fetch (POSITION YCOORD) + of MOVE) + (fetch (POSITION YCOORD) + of FIXED] + MOVE]) + +(ACE.DELAY.FRAME.ASST + [LAMBDA (ITEM MENU MOUSE) (* PmT "21-Dec-84 16:42") + (COND + [(FIXP (CADR ITEM)) + (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE (CDR (NTH ACE.CURRENT.SEQUENCE + (CADR ITEM] + (T NIL]) + +(ACE.SETUP.CW.CLIPPING.REGIONS + [LAMBDA (MENU) (* PmT "23-Apr-85 13:47") + + (* Sets the clipping region on ACE.CONTROL.WINDOW; + There is a menu region, prompt region and status region) + + (PROG (NORMAL ABOVEMENU INFO) + (WINDOWPROP ACE.CONTROL.WINDOW 'NORMAL.CLIP.REGION (SETQ NORMAL (DSPCLIPPINGREGION NIL + ACE.CONTROL.WINDOW)) + ) + [WINDOWPROP ACE.CONTROL.WINDOW 'ABOVEMENU.CLIP.REGION (SETQ ABOVEMENU + (CREATEREGION + (fetch (REGION LEFT) + of NORMAL) + (fetch IMAGEHEIGHT of + MENU) + (fetch (REGION WIDTH) + of NORMAL) + (IDIFFERENCE (fetch + (REGION HEIGHT) + of NORMAL) + (fetch IMAGEHEIGHT + of MENU] + [WINDOWPROP ACE.CONTROL.WINDOW 'INFO.CLIP.REGION (SETQ INFO + (CREATEREGION (fetch (REGION LEFT) + of ABOVEMENU) + (fetch (REGION BOTTOM) + of ABOVEMENU) + 130 + (IDIFFERENCE (fetch + (REGION HEIGHT) + of ABOVEMENU) + 5] + (WINDOWPROP ACE.CONTROL.WINDOW 'PROMPT.CLIP.REGION (CREATEREGION + (IPLUS 3 (fetch (REGION RIGHT) + of INFO)) + (fetch (REGION BOTTOM) of + ABOVEMENU) + (IDIFFERENCE (fetch (REGION RIGHT) + of ABOVEMENU) + (IPLUS 3 (fetch (REGION + RIGHT) + of INFO))) + (IDIFFERENCE (fetch (REGION HEIGHT) + of ABOVEMENU) + 5))) + (DRAWLINE (ADD1 (fetch (REGION RIGHT) of INFO)) + (fetch (REGION BOTTOM) of ABOVEMENU) + (ADD1 (fetch (REGION RIGHT) of INFO)) + (fetch (REGION TOP) of ABOVEMENU) + 1 + 'PAINT ACE.CONTROL.WINDOW) + (DSPFILL (CREATEREGION 0 0 (fetch IMAGEWIDTH of MENU) + (fetch IMAGEHEIGHT of MENU)) + 38505 + 'PAINT ACE.CONTROL.WINDOW]) + +(ACE.CHECKSTUFF + [LAMBDA (CONDITIONS) (* PmT "26-Oct-84 16:10") + (COND + ((EQ CONDITIONS 'SEQ) + (OR ACE.CURRENT.SEQUENCE (ACE.TELLEM "No Current Sequence defined. Aborted" T))) + ((EQ CONDITIONS 'FRAME) + (OR ACE.CURRENT.FRAME (ACE.TELLEM "No Current Frame. Aborted" T))) + ((EQ CONDITIONS 'TAIL) + (OR ACE.FRAME.TAIL (ACE.TELLEM "Sequence is at End." T]) + +(ACE.UPD.CONTROL.WINDOW + [LAMBDA (ITEM VALUE) (* MD "18-Jun-85 16:19") + + (* This puts info in the status region of the control window; + ITEM one of%: CURSOR, FRAME, DEVICE, OPERATION, UPD, T, RESET. + VALUE is the value for the ITEM; The ITEMs and VALUEs are stored as WINDOWPROPs + on A.C.W) + + (ACE.MAC.CW.INFO.CLIP (COND + ((AND (KEYDOWNP 'T) + (EQ ITEM 'CURSOR)) + (ACE.UPD.CW.MULE 'ACE.CURSOR VALUE)) + ((EQ ITEM 'FRAME) + [COND + ((EQ VALUE T) + (SETQ VALUE (COND + ((NULL ACE.CURRENT.SEQUENCE) + 'NA) + ((EQ ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL) + 'START) + (T (LENGTH (LDIFF ACE.CURRENT.SEQUENCE + ACE.FRAME.TAIL] + (ACE.UPD.CW.MULE 'ACE.FRAME VALUE)) + ((EQ ITEM 'DEVICE) + (ACE.UPD.CW.MULE 'ACE.DEVICE VALUE)) + ((EQ ITEM 'OPERATION) + (ACE.UPD.CW.MULE 'ACE.OPERATION VALUE)) + ((EQ ITEM 'UPD) + (ACE.UPD.CONTROL.WINDOW2 'FRAME T) + (ACE.UPD.CW.MULE 'ACE.DEVICE) + (ACE.UPD.CW.MULE 'ACE.OPERATION 'OK) + (ACE.UPD.CW.MULE 'ACE.CURSOR 'NA)) + ((EQ ITEM T) + (ACE.UPD.CW.MULE 'ACE.FRAME) + (ACE.UPD.CW.MULE 'ACE.DEVICE) + (ACE.UPD.CW.MULE 'ACE.OPERATION) + (ACE.UPD.CW.MULE 'ACE.CURSOR)) + ((EQ ITEM 'RESET) + (ACE.UPD.CONTROL.WINDOW2 'FRAME T) + (ACE.UPD.CW.MULE 'ACE.DEVICE 'MOUSE) + (ACE.UPD.CW.MULE 'ACE.OPERATION 'NA) + (ACE.UPD.CW.MULE 'ACE.CURSOR 'NA]) + +(ACE.UPD.CW.MULE + [LAMBDA (ITEM VALUE) (* MD "18-Jun-85 16:49") + + (* An elaborate WINDOWPROPer. If VALUE is given, it's put on A.C.W as prop + ITEM; if VALUE = NIL, returns the current value of ITEM. + Also, writes the value in the status region of A.C.W. + ITEM one of%: ACE.CURSOR ACE.FRAME ACE.OPERATION ACE.DEVICE. + Some restrictions of what VALUE can be (see code); + Returns VALUE) + + (COND + [(AND (KEYDOWNP 'T) + (EQ ITEM 'ACE.CURSOR)) + [COND + ((OR (POSITIONP VALUE) + (EQ VALUE 'NA)) + (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) + (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] + (ACE.UPD.CLEAR.SET.LINE 4) + (COND + ((POSITIONP VALUE) + (printout ACE.CONTROL.WINDOW " Cursor: " (CAR VALUE) + " " + (CDR VALUE) + .SP 10)) + (T (printout ACE.CONTROL.WINDOW " Cursor: " VALUE .SP 10] + ((EQ ITEM 'ACE.FRAME) + [COND + ((OR (FIXP VALUE) + (EQ VALUE 'START) + (EQ VALUE 'NA)) + (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) + (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] + (ACE.UPD.CLEAR.SET.LINE 1) + (printout ACE.CONTROL.WINDOW " Frame: " VALUE .SP 20)) + ((EQ ITEM 'ACE.OPERATION) + (COND + ((NULL VALUE) + (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM))) + (T (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE))) + (ACE.UPD.CLEAR.SET.LINE 3) + (printout ACE.CONTROL.WINDOW " State: " VALUE .SP 20)) + ((EQ ITEM 'ACE.DEVICE) + [COND + ((OR (EQ VALUE 'MOUSE) + (EQ VALUE 'MM1201)) + (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) + (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] + (ACE.UPD.CLEAR.SET.LINE 2) + (printout ACE.CONTROL.WINDOW " Device: " (COND + ((EQ VALUE 'MOUSE) + 'MOUSE) + ((EQ VALUE 'MM1201) + 'TABLET) + (T 'NA)) + .SP 10))) + VALUE]) + +(ACE.UPD.CLEAR.SET.LINE + [LAMBDA (LINES) (* PmT "17-Dec-84 19:11") + (MOVETOUPPERLEFT ACE.CONTROL.WINDOW) + (RELMOVETO 0 (ITIMES (DSPLINEFEED NIL ACE.CONTROL.WINDOW) + (SUB1 LINES)) + ACE.CONTROL.WINDOW]) + +(ACE.CREATE.CONTROL.MENU + [LAMBDA NIL (* MD "26-Jun-85 14:11") + (SETQ ACE.CONTROL.MENU (create MENU + ITEMS _ '(("Get Sequence" 'I/O%:GET "Fetch a sequence-file") + ("Edit Frame" 'EDIT "Edits the CURRENT frame") + ("Run Sequence" 'RUN "Runs the sequence" + (SUBITEMS ("Loop" 'LOOP + "Runs sequence repeatedly until you type a space" + ) + ("Loop part" 'SUBLOOP + "Runs part of the sequence repeatedly " + ))) + ("Put Sequence" 'I/O%:PUT + "Writes current sequence out to a file") + ("New Frame" 'FRAME + "Adds in another frame AFTER the current one") + ("Increment Frame" 'INC + "Moves forward one frame and displays") + ("New Sequence" 'NEW "Make a new sequence from scratch") + ("Delete Frame" 'DEL + "Removes CURRENT frame and smoothes over") + ("Decrement Frame" 'DEC "Goes back one frame") + ("Reset Sequence" 'RESET + "Clears window and resets to start of sequence") + (" Adjust Timing Delays " 'TIME + "Manipulate the timing adjustments") + ("Initialize MM1201 Tablet" 'INIT.MM1201 + "Sets up the Tablet for use") + ("Change compression %%" 'ACESETTHRESHOLD + "Changes the space compression factor: 0 to 100 (100 = max compression)" + ) + ("Change Input Device" 'DEVICE + "Select Mouse or Tablet (for now)") + ("Quit" 'QUIT + "Exit ACE; Trillium user's MUST quit when done")) + CENTERFLG _ T + MENUCOLUMNS _ 3]) + +(ACE.SEQ.FETCH.WIDTH + [LAMBDA NIL (* PmT "22-Apr-85 19:12") + (fetch (BITMAP BITMAPWIDTH) of (fetch (ACE.BLIT BITMAP) + of (CAR (fetch (ACE.FRAME BLITS) + of (CAR ACE.CURRENT.SEQUENCE]) + +(ACE.SEQ.FETCH.HEIGHT + [LAMBDA NIL (* PmT "22-Apr-85 19:14") + (fetch (BITMAP BITMAPHEIGHT) of (fetch (ACE.BLIT BITMAP) + of (CAR (fetch (ACE.FRAME BLITS) + of (CAR ACE.CURRENT.SEQUENCE]) + +(ACE.SET.SEQ.CLIP.REGION + [LAMBDA (LEFT BOTTOM WIDTH HEIGHT) (* "PmT" "17-Apr-85 18:03") + (OR LEFT (SETQ LEFT ACE.SEQ.WINDOW.XOFF)) + (OR BOTTOM (SETQ BOTTOM ACE.SEQ.WINDOW.YOFF)) + (OR WIDTH (SETQ WIDTH ACE.SEQ.WIDTH)) + (OR HEIGHT (SETQ HEIGHT ACE.SEQ.HEIGHT)) + (WINDOWPROP ACE.CONTROL.WINDOW 'SEQUENCE.CLIPPING.REGION (CREATEREGION LEFT BOTTOM WIDTH HEIGHT]) + +(ACE.ASKEM2 + [LAMBDA (STRING FLG DEFAULTANSWER TIMELIMIT? SPACES?) (* PmT "22-Apr-85 15:56") + (* Like ASKEM but uses whole control + window (use cautiously)) + (OR TIMELIMIT? (SETQ TIMELIMIT? 60)) + (COND + ((EQ FLG T) + (DSPRESET ACE.CONTROL.WINDOW)) + ((EQ FLG 'L) + (TERPRI ACE.CONTROL.WINDOW))) + (MKATOM (PROMPTFORWORD STRING DEFAULTANSWER NIL ACE.CONTROL.WINDOW NIL TIMELIMIT? + (AND SPACES? (CHARCODE (EOL ESCAPE LF]) + +(ACE.TELLEM2 + [LAMBDA (STRING FLG) (* PmT "19-Dec-84 19:15") + (COND + ((EQ FLG T) + (DSPRESET ACE.CONTROL.WINDOW)) + ((EQ FLG 'L) + (TERPRI ACE.CONTROL.WINDOW))) + (printout ACE.CONTROL.WINDOW STRING) + NIL]) + +(ACE.UPD.CONTROL.WINDOW2 + [LAMBDA (ITEM VALUE) (* PmT "19-Dec-84 15:49") + (COND + ((EQ ITEM 'FRAME) + [COND + ((EQ VALUE T) + (SETQ VALUE (COND + ((NULL ACE.CURRENT.SEQUENCE) + 'NA) + ((EQ ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL) + 'START) + (T (LENGTH (LDIFF ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL] + (ACE.UPD.CW.MULE 'ACE.FRAME VALUE)) + ((EQ ITEM 'DEVICE) + (ACE.UPD.CW.MULE 'ACE.DEVICE VALUE)) + ((EQ ITEM 'OPERATION) + (ACE.UPD.CW.MULE 'ACE.OPERATION VALUE)) + ((EQ ITEM 'CURSOR) + (ACE.UPD.CW.MULE 'ACE.CURSOR VALUE)) + ((EQ ITEM 'UPD) + (ACE.UPD.CONTROL.WINDOW2 'FRAME T) + (ACE.UPD.CW.MULE 'ACE.DEVICE) + (ACE.UPD.CW.MULE 'ACE.OPERATION 'OK) + (ACE.UPD.CW.MULE 'ACE.CURSOR 'NA)) + ((EQ ITEM T) + (ACE.UPD.CW.MULE 'ACE.FRAME) + (ACE.UPD.CW.MULE 'ACE.DEVICE) + (ACE.UPD.CW.MULE 'ACE.OPERATION) + (ACE.UPD.CW.MULE 'ACE.CURSOR)) + ((EQ ITEM 'RESET) + (ACE.UPD.CONTROL.WINDOW2 'FRAME T) + (ACE.UPD.CW.MULE 'ACE.DEVICE 'MOUSE) + (ACE.UPD.CW.MULE 'ACE.OPERATION 'NA) + (ACE.UPD.CW.MULE 'ACE.CURSOR 'NA]) +) + + + +(* The following Macros set up restricting clipping regions) + +(DECLARE%: EVAL@COMPILE + +(PUTPROPS ACE.MAC.CW.INFO.CLIP MACRO ((FORM) + (RESETLST + [RESETSAVE (PROGN (DSPCLIPPINGREGION (WINDOWPROP + ACE.CONTROL.WINDOW + 'INFO.CLIP.REGION) + ACE.CONTROL.WINDOW) + (DSPLEFTMARGIN (fetch (REGION LEFT) + of + (WINDOWPROP + ACE.CONTROL.WINDOW + 'INFO.CLIP.REGION)) + ACE.CONTROL.WINDOW)) + '(PROGN (DSPCLIPPINGREGION (WINDOWPROP + ACE.CONTROL.WINDOW + + ' + NORMAL.CLIP.REGION + ) + ACE.CONTROL.WINDOW) + (DSPLEFTMARGIN (fetch (REGION LEFT) + of (WINDOWPROP + ACE.CONTROL.WINDOW + + ' + NORMAL.CLIP.REGION + )) + ACE.CONTROL.WINDOW] + FORM))) + +(PUTPROPS ACE.MAC.CW.PROMPT.CLIP MACRO + ((FORM) + (RESETLST + [RESETSAVE (PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW 'PROMPT.CLIP.REGION) + ACE.CONTROL.WINDOW) + (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP + ACE.CONTROL.WINDOW + + ' + PROMPT.CLIP.REGION + )) + ACE.CONTROL.WINDOW)) + '(PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW 'NORMAL.CLIP.REGION) + ACE.CONTROL.WINDOW) + (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP + ACE.CONTROL.WINDOW + 'NORMAL.CLIP.REGION) + ) + ACE.CONTROL.WINDOW] + FORM))) + +[PUTPROPS ACE.MAC.SEQ.CLIP MACRO ((FORM) + (COND + ((WINDOWPROP ACE.CONTROL.WINDOW 'SEQUENCE.CLIPPING.REGION) + (RESETLST + (RESETSAVE (DSPCLIPPINGREGION (WINDOWPROP + ACE.CONTROL.WINDOW + + ' + SEQUENCE.CLIPPING.REGION + ) + ACE.SEQ.WINDOW) + (LIST 'DSPCLIPPINGREGION (DSPCLIPPINGREGION NIL + ACE.SEQ.WINDOW) + ACE.SEQ.WINDOW)) + FORM)) + (T FORM] +) +(DECLARE%: EVAL@COMPILE + +[PUTPROPS ACE.MAC.FETCH.WIDTH MACRO (NIL (fetch (BITMAP BITMAPWIDTH) + of (fetch (ACE.BLIT BITMAP) + of (CAR (fetch (ACE.FRAME BLITS) + of (CAR ACE.CURRENT.SEQUENCE + ] + +[PUTPROPS ACE.MAC.FETCH.HEIGHT MACRO (NIL (fetch (BITMAP BITMAPHEIGHT) + of (fetch (ACE.BLIT BITMAP) + of (CAR (fetch (ACE.FRAME BLITS) + of (CAR + ACE.CURRENT.SEQUENCE + ] +) +(RPAQ ACE.LEFTMOUSE.CURSOR (CURSORCREATE (QUOTE #*(16 16)GOOLD@@DELIDELIDELIDELIDELIDELIDELIDD@@DD@@DD@@DD@@DD@@DD@@DGOOL +) (QUOTE NIL) 8 8)) +(RPAQ ACE.MIDDLEMOUSE.CURSOR (CURSORCREATE (QUOTE #*(16 16)GOOLD@@DECIDECIDECIDECIDECIDECIDECIDD@@DD@@DD@@DD@@DD@@DD@@DGOOL +) (QUOTE NIL) 8 8)) +(RPAQ ACE.RIGHTMOUSE.CURSOR (CURSORCREATE (QUOTE #*(16 16)GOOLD@@DEBGDEBGDEBGDEBGDEBGDEBGDEBGDD@@DD@@DD@@DD@@DD@@DD@@DGOOL +) (QUOTE NIL) 8 8)) +(RPAQ ACE.ALLMOUSE.CURSOR (CURSORCREATE (QUOTE #*(16 16)GOOLD@@DDMKDDMKDDMKDDMKDDMKDDMKDDMKDD@@DD@@DD@@DD@@DD@@DD@@DGOOL +) (QUOTE NIL) 8 8)) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS ACE.CONTROL.WINDOW ACE.DIRECTORY ACE.SEQ.WINDOW ACE.SEQ.WIDTH ACE.SEQ.HEIGHT + ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF ACE.CURRENT.SEQUENCE ACE.CURRENT.SEQUENCE.NAME + ACE.FRAME.TAIL ACE.CURRENT.FRAME ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD + ACE.RUNNING.UNDER.TRILLIUM ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR ACE.RIGHTMOUSE.CURSOR + ACE.ALLMOUSE.CURSOR) +) + + + +(* MENUS IN MAIN) + +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS ACE.CONTROL.MENU ACE.DELAY.MENU ACE.SET.DEVICE.MENU) +) + +(SETQ ACE.CONTROL.WINDOW NIL) + +(SETQ ACE.CONTROL.MENU NIL) + +(SETQ ACE.DELAY.MENU NIL) + +(SETQ ACE.SET.DEVICE.MENU NIL) +(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS + +(ADDTOVAR NLAMA ) + +(ADDTOVAR NLAML ) + +(ADDTOVAR LAMA ) +) + +(RPAQQ ACE-PRIMCOMS ((* COMPILER STUFF) + (VARS ACE.PIXPERWORD ACE.BITMAP.MASK) + (* LOW LEVEL COMPILER FNS) + (FNS ACE.COMPILE.FRAME ACE.EXTRACT ACESETTHRESHOLD) + (* REGION MAXING ROUTINES) + (FNS ACE.MAX.REGIONS ACE.PICK.BEST.REGION ACE.COMPUTE.AREA) + (* LOW LEVEL BITMAP COMPARISON) + (FNS ACE.SCAN.BITMAPS ACE.SCAN.PRIMBLOCKS ACE.FETCH.BLOCK))) + + + +(* COMPILER STUFF) + + +(RPAQQ ACE.PIXPERWORD 16) + +(RPAQ ACE.BITMAP.MASK (READARRAY-FROM-LIST 16 (QUOTE SMALLPOSP) 0 (QUOTE (65535 32768 49152 57344 +61440 63488 64512 65024 65280 65408 65472 65504 65520 65528 65532 65534 NIL)))) + + + + +(* LOW LEVEL COMPILER FNS) + +(DEFINEQ + +(ACE.COMPILE.FRAME + [LAMBDA (BM.ORIG BM.CHANGED VERTICAL.BLOCK THRESHOLD) (* MJD "28-May-86 16:35") + (* MAIN ENTRY POINT FOR DIFFERENTIAL + BITMAP COMPILING) + (* WARNING%: NO ERROR CHECKING DONE + FROM HERE DOWN!) + (* RETURNS A FRAMEPATCH LIST OF + ACTUAL BITMAP CHANGES) + (* RETURN FORMAT%: + ((BM X . Y) (BM X . Y) |...|)) + (PROG (CHANGES) + (SETQ CHANGES (ACE.SCAN.BITMAPS BM.ORIG BM.CHANGED VERTICAL.BLOCK)) + (AND CHANGES (SETQ CHANGES (ACE.MAX.REGIONS CHANGES THRESHOLD))) + (SETQ CHANGES (ACE.EXTRACT CHANGES BM.CHANGED)) + (ACE.UPD.CONTROL.WINDOW 'OPERATION "DONE") + (RETURN CHANGES]) + +(ACE.EXTRACT + [LAMBDA (REGIONS BITMAP) (* MJD "28-May-86 13:12") + + (* TAKES LIST OF REGIONS OF CHANGED AREAS AND MAKES INTO ACTUAL FRAMEPATCH LIST + BY EXTRACTING FROM NEW BM) + + (PROG (TEMP.BITMAP LEFT BOTTOM WIDTH HEIGHT (FRAMEBLITLIST (CONS))) + [COND + ((NULL REGIONS) + NIL) + (T (for X in REGIONS + do (BLOCK) + (SETQ LEFT (fetch (REGION LEFT) of X)) + (SETQ BOTTOM (fetch (REGION BOTTOM) of X)) + (SETQ WIDTH (fetch (REGION WIDTH) of X)) + (SETQ HEIGHT (fetch (REGION HEIGHT) of X)) + (SETQ TEMP.BITMAP (BITMAPCREATE WIDTH HEIGHT 1)) + (BITBLT BITMAP LEFT BOTTOM TEMP.BITMAP 0 0 WIDTH HEIGHT 'INPUT 'REPLACE) + (NCONC1 FRAMEBLITLIST + (create ACE.BLIT + BITMAP _ TEMP.BITMAP + XCOOR _ LEFT + YCOOR _ BOTTOM] + (RETURN (CDR FRAMEBLITLIST]) + +(ACESETTHRESHOLD + [LAMBDA NIL (* MD "19-Jun-85 15:46") + (PROG NIL + LOOP + (SETQ ACE.AREA.THRESHOLD (RNUMBER (CONCAT "Compression factor(0-100), currently " + ACE.AREA.THRESHOLD ": "))) + (IF (OR (ILESSP ACE.AREA.THRESHOLD 0) + (IGREATERP ACE.AREA.THRESHOLD 100)) + THEN (GO LOOP)) + (RETURN ACE.AREA.THRESHOLD]) +) + + + +(* REGION MAXING ROUTINES) + +(DEFINEQ + +(ACE.MAX.REGIONS + [LAMBDA (REGIONS THRESHOLD) (* MJD "28-May-86 13:11") + + (* Merges the changed regions picked out by ACE.SCAN.BITMAPS; + REGIONS are small areas of change, THRESHOLD specifies how much bitmap area + must by "good" for a combination (i.e. 100 - + THRESHOLD is how much space may be wasted in combining two REGIONS); + Both ARGS required!) + (* RETURNS A LIST OF + (REGION REGION |...|)) + (PROG (BEST.POSS) + LOOP + (BLOCK) + (COND + [(IGREATERP (LENGTH REGIONS) + 1) + (SETQ BEST.POSS (ACE.PICK.BEST.REGION REGIONS)) + (COND + ((IGEQ (CADDR BEST.POSS) + THRESHOLD) + (NCONC1 REGIONS (CONS (UNIONREGIONS (CAAR BEST.POSS) + (CAADR BEST.POSS)) + (CADDR BEST.POSS))) + (DREMOVE (CAR BEST.POSS) + REGIONS) + (DREMOVE (CADR BEST.POSS) + REGIONS)) + (T (GO DONE] + (T (GO DONE))) + (GO LOOP) + DONE + (RETURN (for X in REGIONS collect (CAR X]) + +(ACE.PICK.BEST.REGION + [LAMBDA (REGIONS) (* MJD "28-May-86 13:11") + + (* SLOWest part of animation! Selects the most efficient + (i.e. least amount of wasted space resulting from combining two regions) + combination of two regions from REGIONS; + First tries to find 100% match up; failing that goes for highest efficiency) + + (PROG (EFFICIENCY BEST.SO.FAR) + [COND + [(for X in REGIONS + thereis + (AND (EQP (CDR X) + 100) + (for Y in (CDR (MEMB X REGIONS)) + thereis (AND (PROG1 T (BLOCK)) + (EQP (CDR Y) + 100) + [OR [AND (EQP (fetch (REGION LEFT) of (CAR X)) + (fetch (REGION LEFT) of (CAR Y))) + (OR [EQP (fetch (REGION BOTTOM) + of (CAR Y)) + (ADD1 (fetch (REGION TOP) + of (CAR X] + (EQP (ADD1 (fetch (REGION TOP) + of (CAR Y))) + (fetch (REGION BOTTOM) + of (CAR X] + (AND (EQP (fetch (REGION BOTTOM) + of (CAR X)) + (fetch (REGION BOTTOM) + of (CAR Y))) + (OR [EQP (fetch (REGION LEFT) + of (CAR Y)) + (ADD1 (fetch (REGION RIGHT) + of (CAR X] + (EQP (ADD1 (fetch (REGION RIGHT) + of (CAR Y))) + (fetch (REGION LEFT) + of (CAR X] + (SETQ BEST.SO.FAR (LIST X Y 100] + (T (SETQ BEST.SO.FAR '(NIL NIL -1)) + (for X in REGIONS + do (for Y in (CDR (MEMB X REGIONS)) + do ((SETQ EFFICIENCY (IQUOTIENT [ITIMES 100 + (IPLUS (ACE.COMPUTE.AREA + (CAR X) + (CDR X)) + (ACE.COMPUTE.AREA + (CAR Y) + (CDR Y] + (ACE.COMPUTE.AREA + (UNIONREGIONS (CAR X) + (CAR Y)) + 100))) + (AND (IGREATERP EFFICIENCY (CADDR BEST.SO.FAR)) + (SETQ BEST.SO.FAR (LIST X Y EFFICIENCY] + (RETURN BEST.SO.FAR]) + +(ACE.COMPUTE.AREA + [LAMBDA (REGION EFF) (* MJD "28-May-86 13:10") + (BLOCK) + (IQUOTIENT (ITIMES (ffetch (REGION WIDTH) of REGION) + (ffetch (REGION HEIGHT) of REGION) + EFF) + 100]) +) + + + +(* LOW LEVEL BITMAP COMPARISON) + +(DEFINEQ + +(ACE.SCAN.BITMAPS + [LAMBDA (BM.ORIG BM.NEW BLOCKINGHEIGHT) (* PmT "25-Apr-85 15:14") + + (* Compares BM.ORIG and BM.NEW in one word + (ACE.PIXPERWORD bits; 16) by BLOCKINGHEIGHT rectangles. + Note masking when get to last word in bitmap and compression of region below + ACE.PIXPERWORD (16); All ARGS required; + BM.ORIG and BM.NEW must have the same dimensions!) + (* RETURNS A LIST OF TYPE + (REGION . 100)) + (PROG [TEMP.ENTRY (BM.WIDTH (ffetch BITMAPWIDTH of BM.ORIG)) + (CHANGED.REGIONS (CONS)) + (RASTERWIDTH (SUB1 (ffetch BITMAPRASTERWIDTH of BM.ORIG))) + (HEIGHT (SUB1 (ffetch BITMAPHEIGHT of BM.ORIG))) + (ALLMASK (ELT ACE.BITMAP.MASK 0)) + (PARTIALMASK (ELT ACE.BITMAP.MASK (IMOD (ffetch BITMAPWIDTH of BM.ORIG) + ACE.PIXPERWORD] + [while (ILESSP Y HEIGHT) bind (Y _ 0) + do [for HORZ.BLOCK from 0 to RASTERWIDTH + do (AND [SETQ TEMP.ENTRY (COND + ((EQP HORZ.BLOCK RASTERWIDTH) + (ACE.SCAN.PRIMBLOCKS BM.ORIG BM.NEW + HORZ.BLOCK Y BLOCKINGHEIGHT + PARTIALMASK)) + (T (ACE.SCAN.PRIMBLOCKS BM.ORIG BM.NEW + HORZ.BLOCK Y BLOCKINGHEIGHT ALLMASK] + (NCONC1 CHANGED.REGIONS + (CONS [CREATEREGION (ITIMES HORZ.BLOCK ACE.PIXPERWORD) + (CAR TEMP.ENTRY) + (IMIN ACE.PIXPERWORD (IDIFFERENCE BM.WIDTH + (ITIMES HORZ.BLOCK + + ACE.PIXPERWORD + ))) + (ADD1 (IDIFFERENCE (CDR TEMP.ENTRY) + (CAR TEMP.ENTRY] + 100] + (SETQ Y (IPLUS Y BLOCKINGHEIGHT)) + (SETQ BLOCKINGHEIGHT (IMIN BLOCKINGHEIGHT (ADD1 (IDIFFERENCE HEIGHT Y] + (RETURN (CDR CHANGED.REGIONS]) + +(ACE.SCAN.PRIMBLOCKS + [LAMBDA (BM1 BM2 WORDOFFSET Y0 BLOCKH MASK) (* MJD "28-May-86 13:05") + + (* Does the actual comparison of primitive areas in the two bitmaps BM1 and BM2 + ; WORDOFFSET is the raster word offset; + Y0 is the low scanline and (IPLUS Y0 BLOCKH) is the hi one; + MASK is usually $FFFF, otherwise it is used to ignore extra bits trailing off + the end of the last raster word) + + (PROG [TEMP1 (MAXY (SUB1 (IPLUS Y0 BLOCKH] + [SETQ TEMP1 (for Y from Y0 to MAXY + thereis (NOT (EQP (LOGAND (LOGXOR (ACE.FETCH.BLOCK BM1 WORDOFFSET Y) + (ACE.FETCH.BLOCK BM2 WORDOFFSET Y)) + MASK) + 0] + (RETURN (AND TEMP1 (CONS TEMP1 + (for Y from MAXY to TEMP1 by -1 + thereis (NOT (EQP (LOGAND (LOGXOR (ACE.FETCH.BLOCK + BM1 WORDOFFSET Y) + (ACE.FETCH.BLOCK + BM2 WORDOFFSET Y)) + MASK) + 0]) + +(ACE.FETCH.BLOCK + [LAMBDA (BITMAP WORDOFFSET VERTICAL) (* MJD "28-May-86 13:04") + (* Nabs a word from bitmap on line + VERTICAL with word offset WORDOFFSET) + (BLOCK) + (\GETBASE (\ADDBASE (ffetch BITMAPBASE of BITMAP) + (ITIMES (IDIFFERENCE (ffetch BITMAPHEIGHT of BITMAP) + (ADD1 VERTICAL)) + (ffetch BITMAPRASTERWIDTH of BITMAP))) + WORDOFFSET]) +) + +(RPAQQ ACE-EDITCOMS + [(FILES (LOADCOMP) + ACE) + (* TOP LEVEL EDITING STUFF) + (FNS ACE.EDIT ACE.EDIT.FRAME ACE.EDIT.SETUP.EDIT.MENU ACEGETREGIONFACTOR ACEROTATEREGION + ACESCALEREGION) + (* LINEART FNS) + (FNS ACE.EDIT.LINEART ACE.EDIT.LINEART.DRAW ACE.EDIT.LINEART.ADJ ACE.EDIT.LINEART.TRACKLINE) + (* OTHER EDITING STUFF) + (FNS ACE.EDIT.MOVE.REGION ACE.EDIT.COMBINE.REGION ACE.EDIT.TEXT ACE.EDIT.TEXTURE.REGION + ACE.EDIT.TEXTURE.AREA ACE.EDIT.PAINT ACE.FILLWITHTEXTURE ACE.SCANLINESEEDFILL + ACE.EDIT.CREATE.MENU.TEXTURES ACE.EDIT.PUTDOWN.BITMAP ACE.EDIT.MOVE.REGION.ASST + ACEEDITBM ACE.READBRUSHSHAPE) + (* TABLET AND SUPPORT FNS) + (FNS ACE.EDIT.POINT&CODE ACE.GET.DEVICE.STATE ACE.GET.DEVICE.STATE&CURSOR ACE.EXTRACTBM + ACE.EDIT.REDRAW.ABITMAP ACE.SCALE.BITMAP ACE.COMPILE.FRAME.ACE ACE.MM1201.INIT + ACE.MM1201POLL ACE.MM1201.PROBLEM ACE.EDIT.CLEAR.ALL.MENUS ROTATEBM SIGN TEXTURELINE + \TEXTURELINE RS232LOSTCHARFN) + (MACROS ACE.POPPOS ACE.PUSHPOS) + (CURSORS ACE.EDIT.LINEART.SQUARE.CURSOR) + (BITMAPS ACELOGOMAP) + (VARS (RS232LOSTCHARFN 'RS232LOSTCHARFN)) + (* MENUS FOR ACE-EDIT) + (GLOBALVARS ACE.CONTROL.WINDOW ACE.EDIT.FRAME.MENU ACE.EDIT.LINEART.ADJ.MENU + ACE.EDIT.MOVE.MENU ACE.EDIT.TEXT.FONT.MENU ACE.EDIT.TEXT.SIZE.MENU + ACE.EDIT.TEXT.FACE.MENU ACE.EDIT.TEXTURE.MENU ACE.EDIT.PUTDOWN.MENU) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (ACE.EDIT.CLEAR.ALL.MENUS]) + +(FILESLOAD (LOADCOMP) + ACE) + + + +(* TOP LEVEL EDITING STUFF) + +(DEFINEQ + +(ACE.EDIT (LAMBDA (FLG) (* PmT "24-Apr-85 14:51") (* Entry into frame editing. Reconstructs CURRENT frame, previous (if any) ; and successor (if any) ; Calls ACE.EDIT.FRAME on the recontructed CURRENT frame (a bitmap) ; when editing is complete, recompiles current frame with previous and successor) (PROG (BEFORE.BM PRESENT.BM AFTER.BM) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "EDIT") (COND ((NULL (AND (ACE.CHECKSTUFF (QUOTE SEQ)) (ACE.CHECKSTUFF (QUOTE FRAME)))) NIL) (T (COND ((EQ ACE.CURRENT.FRAME ACE.CURRENT.SEQUENCE) (SETQ BEFORE.BM NIL)) (T (SETQ BEFORE.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME))))) (COND (BEFORE.BM (SETQ PRESENT.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL)))) (T (SETQ PRESENT.BM (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME BLITS) of (CAR ACE.CURRENT.SEQUENCE))))))) (COND ((NULL ACE.FRAME.TAIL) (SETQ AFTER.BM NIL)) (T (SETQ AFTER.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE (CDR ACE.FRAME.TAIL)))))) (COND ((ACE.MAC.SEQ.CLIP (ACE.EDIT.FRAME PRESENT.BM)) (COND ((NULL (OR BEFORE.BM AFTER.BM)) NIL) ((NULL BEFORE.BM) (replace (ACE.FRAME BLITS) of (CAR ACE.FRAME.TAIL) with (ACE.COMPILE.FRAME.ACE PRESENT.BM AFTER.BM ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD))) ((NULL AFTER.BM) (replace (ACE.FRAME BLITS) of (CAR ACE.CURRENT.FRAME) with (ACE.COMPILE.FRAME.ACE BEFORE.BM PRESENT.BM ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD))) (T (replace (ACE.FRAME BLITS) of (CAR ACE.CURRENT.FRAME) with (ACE.COMPILE.FRAME.ACE BEFORE.BM PRESENT.BM ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD)) (replace (ACE.FRAME BLITS) of (CAR ACE.FRAME.TAIL) with (ACE.COMPILE.FRAME.ACE PRESENT.BM AFTER.BM ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD)))))) (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL)))))) ) + +(ACE.EDIT.FRAME (LAMBDA (ABITMAP) (* MJD "23-May-86 15:51") (* Does editing on ABITMAP (this suppose to be a frame; but not necessarily) ; Loops through an options menu until QUIT is selected. The BITBLT just redraws the frame as it really is after every editing option) (PROG NIL LOOP (BITBLT ABITMAP 0 0 ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF NIL NIL (QUOTE INPUT) (QUOTE REPLACE) NIL NIL) (ACE.UPD.CONTROL.WINDOW (QUOTE FRAME) T) (SELECTQ (MENU (OR ACE.EDIT.FRAME.MENU (ACE.EDIT.SETUP.EDIT.MENU))) (NIL NIL) (PAINT (ACE.EDIT.PAINT ABITMAP)) (EDITBM (ACEEDITBM)) (LINEART (ACE.EDIT.LINEART ABITMAP)) (MOVE.REG (ACE.EDIT.MOVE.REGION ABITMAP)) (COMBINE.REG (ACE.EDIT.COMBINE.REGION ABITMAP)) (SNAPREG (SNAPW)) (TEXT (ACE.EDIT.TEXT ABITMAP)) (TEXTURE.AREA (ACE.EDIT.TEXTURE.AREA ABITMAP)) (TEXTURE.REG (ACE.EDIT.TEXTURE.REGION ABITMAP)) (CLEAR (ACE.EDIT.TEXTURE.REGION ABITMAP WHITESHADE)) (SCALEREG (ACESCALEREGION (QUOTE SWEEP))) (SCALEREGXY (ACESCALEREGION (QUOTE XY))) (SCALEREGX (ACESCALEREGION (QUOTE X))) (SCALEREGY (ACESCALEREGION (QUOTE Y))) (ROTATEREG (ACEROTATEREGION)) (|2D| (EDIT.SEQ.2D ABITMAP)) (|3D| (EDIT.SEQ.3D ABITMAP)) (QUIT (RETURN T)) (ABORT (AND (ACE.CONFIRMIT "Click LEFT to Ignore Changes." T) (RETURN NIL))) NIL) (GO LOOP))) ) + +(ACE.EDIT.SETUP.EDIT.MENU (LAMBDA NIL (* MJD "23-May-86 15:42") (SETQ ACE.EDIT.FRAME.MENU (create MENU ITEMS _ (QUOTE (("Paint" (QUOTE PAINT) "Does standard Paint on frame") ("Line art" (QUOTE LINEART) "Enter lines through various devices") ("Text" (QUOTE TEXT) "Put text into frame") ("Edit bits" (QUOTE EDITBM) "Calls the Bitmap Editor on frame") (" " NIL "Just a Spacer") ("Move region" (QUOTE MOVE.REG) "Move a rectangular region in frame") ("Combine region" (QUOTE COMBINE.REG) "Combine any region on screen into frame") ("Snap region" (QUOTE SNAPREG) "Save a region in a scratch window") ("Scale region" (QUOTE SCALEREG) "Change size of a region in the frame" (SUBITEMS ("To a new region" (QUOTE SCALEREG)) ("In x and y" (QUOTE SCALEREGXY)) ("In x only" (QUOTE SCALEREGX)) ("In y only" (QUOTE SCALEREGY)))) ("Rotate region" (QUOTE ROTATEREG) "Rotates a region any number of degrees") ("Texture region fill" (QUOTE TEXTURE.AREA) "Texture any closed area within frame") ("Texture box fill" (QUOTE TEXTURE.REG) "Fills a bounded rectangle with a texture.") ("Clear region" (QUOTE CLEAR) "Erases a specified Region") (" " NIL "Just a Spacer") ("Compile frame" (QUOTE QUIT) "Exits the editor and compiles the frame.") ("Quit - ABORT" (QUOTE ABORT) "Stops editor; frame reverts to original state."))) CENTERFLG _ T TITLE _ "Edit Options" CHANGEOFFSETFLG _ T))) ) + +(ACEGETREGIONFACTOR (LAMBDA (W H) (* MD "19-Jun-85 14:29") (PROG (TEMPREGION) (ACE.TELLEM "Select desired size for new region" T) (SETQ TEMPREGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (RETURN (CONS (FQUOTIENT (fetch (REGION WIDTH) of TEMPREGION) W) (FQUOTIENT (fetch (REGION HEIGHT) of TEMPREGION) H))))) ) + +(ACEROTATEREGION (LAMBDA (TYPE) (* MJD "23-May-86 15:15") (PROG (TEMPREGION TEMPBM NEWBM) (ACE.TELLEM "Select a Region inside the Sequence" T) (SETQ TEMPREGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (SETQ TEMPBM (BITMAPCREATE (fetch (REGION WIDTH) of TEMPREGION) (fetch (REGION HEIGHT) of TEMPREGION) 1)) (BITBLT ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) TEMPBM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (SETQ NEWBM (BITMAPCREATE (fetch (REGION WIDTH) of TEMPREGION) (fetch (REGION HEIGHT) of TEMPREGION) 1)) (ROTATEBM TEMPBM NEWBM (RNUMBER "Angle in degrees:")) (BITBLT TEMPBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE ERASE)) (BITBLT NEWBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE)))) ) + +(ACESCALEREGION (LAMBDA (TYPE) (* MD "19-Jun-85 14:29") (PROG (TEMPREGION TEMPBM NEWBM) (ACE.TELLEM "Select a Region inside the Sequence" T) (SETQ TEMPREGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (SETQ TEMPBM (BITMAPCREATE (fetch (REGION WIDTH) of TEMPREGION) (fetch (REGION HEIGHT) of TEMPREGION) 1)) (BITBLT ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) TEMPBM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (SETQ NEWBM (COND ((EQ TYPE (QUOTE SWEEP)) (ACE.SCALE.BITMAP TEMPBM (ACEGETREGIONFACTOR (fetch (REGION WIDTH) of TEMPREGION) (fetch (REGION HEIGHT) of TEMPREGION)))) ((EQ TYPE (QUOTE XY)) (ACE.SCALE.BITMAP TEMPBM (CONS (RNUMBER "%% scale in x") (RNUMBER "%% scale in y")))) ((EQ TYPE (QUOTE X)) (ACE.SCALE.BITMAP TEMPBM (CONS (RNUMBER "%% scale in x") 100))) ((EQ TYPE (QUOTE Y)) (ACE.SCALE.BITMAP TEMPBM (CONS 100 (RNUMBER "%% scale in y")))))) (BITBLT TEMPBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE ERASE)) (BITBLT NEWBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE)))) ) +) + + + +(* LINEART FNS) + +(DEFINEQ + +(ACE.EDIT.LINEART (LAMBDA (ABITMAP) (* MD "19-Jun-85 17:23") (* Entry into Lineart on ABITMAP. LSHIFT brings up options menu) (RESETFORM (CURSOR ACE.EDIT.LINEART.SQUARE.CURSOR) (PROG (POINT&CODE DEVICE BRUSH MODE) (DECLARE (SPECVARS BRUSH MODE)) (* So ...LINEART.ADJ sees them. Overkill but a good reminder) (SETQ DEVICE (ACE.UPD.CONTROL.WINDOW (QUOTE DEVICE))) (COND ((EQ DEVICE (QUOTE MOUSE)) (ACE.TELLEM "LEFT button Draws (puts Vertices)" T) (ACE.TELLEM "MIDDLE Stops drawing; IDLES (Square cursor)" (QUOTE L))) ((EQ DEVICE (QUOTE MM1201)) (ACE.TELLEM "STYLUS Draws (puts down Vertices)" T) (ACE.TELLEM "BARREL Stops; IDLES (Square cursor)" (QUOTE L)))) (ACE.TELLEM "Right button selects drawing options" (QUOTE L)) (ACE.TELLEM "To exit, use right button, or stylus + barrel (tablet)" (QUOTE L)) LOOP (SETQ POINT&CODE (ACE.EDIT.POINT&CODE DEVICE)) (COND ((EQUAL (CAR POINT&CODE) (QUOTE VERTEX)) (ACE.EDIT.LINEART.DRAW ABITMAP POINT&CODE DEVICE BRUSH MODE)) ((EQUAL (CAR POINT&CODE) (QUOTE OPTIONS)) (if (NOT (ACE.EDIT.LINEART.ADJ)) then (RETURN NIL))) ((KEYDOWNP (QUOTE RSHIFT)) (RETURN NIL))) (forDuration 30 timerUnits (QUOTE MILLISECONDS)) (GO LOOP)))) ) + +(ACE.EDIT.LINEART.DRAW (LAMBDA (ABITMAP POINT&CODE DEVICE BRUSH MODE) (* PmT "24-Apr-85 15:02") (* The actual mule for LineArt. Draws the lines on ABITMAP and in the Sequence Window) (PROG ((LASTVERTEX NIL) (LASTPOINT NIL) STUPID.DSP.FOR.ABITMAP TEMP.CURSOR) (SETQ STUPID.DSP.FOR.ABITMAP (DSPCREATE ABITMAP)) (SETQ TEMP.CURSOR (CURSOR CROSSHAIRS)) LOOP (AND LASTPOINT (ACE.EDIT.LINEART.TRACKLINE LASTVERTEX LASTPOINT BRUSH)) (COND ((EQUAL (CAR POINT&CODE) (QUOTE VERTEX)) (AND LASTVERTEX (DRAWLINE (ACE.MT.SEQX.AWX (CADR POINT&CODE)) (ACE.MT.SEQY.AWY (CDDR POINT&CODE)) (ACE.MT.SEQX.AWX (CAR LASTVERTEX)) (ACE.MT.SEQY.AWY (CDR LASTVERTEX)) BRUSH MODE ACE.SEQ.WINDOW) (DRAWLINE (CADR POINT&CODE) (CDDR POINT&CODE) (CAR LASTVERTEX) (CDR LASTVERTEX) BRUSH MODE STUPID.DSP.FOR.ABITMAP)) (SETQ LASTVERTEX (CDR POINT&CODE)) (SETQ LASTPOINT NIL)) ((EQUAL (CAR POINT&CODE) (QUOTE TOGGLE)) (CURSOR TEMP.CURSOR) (RETURN NIL)) ((KEYDOWNP (QUOTE RSHIFT)) (CURSOR TEMP.CURSOR) (RETURN NIL)) (T (SETQ LASTPOINT (CDR POINT&CODE)) (ACE.EDIT.LINEART.TRACKLINE LASTVERTEX LASTPOINT BRUSH))) (SETQ POINT&CODE (ACE.EDIT.POINT&CODE DEVICE)) (GO LOOP))) ) + +(ACE.EDIT.LINEART.ADJ (LAMBDA NIL (* MD "19-Jun-85 17:26") (* Options for changing how lineart draws; affects brush and drawing mode) (SELECTQ (MENU (OR ACE.EDIT.LINEART.ADJ.MENU (SETQ ACE.EDIT.LINEART.ADJ.MENU (create MENU ITEMS _ (QUOTE (("Replace Mode" (QUOTE REPLACE) "Puts bits there") ("Paint Mode" (QUOTE PAINT) "Cause lines to OR with background") ("Invert Mode" (QUOTE INVERT) "Lines will XOR with background") ("Erase Mode" (QUOTE ERASE) "Erases whats there") (" " NIL "Ah! you found the magic command: nothing") ("Line width 1" 1 "Sets the Brush width to 1 pixel") ("Line width 2" 2 "Brush width 2 pixels") ("Line width 3" 3 "Brush width 3 pixels") ("Line width 4" 4 "Brush width 4 pixels") ("Line width 5" 5 "Brush width 5 pixels") ("Quit" (QUOTE QUIT) "Returns to Edit menu"))) CENTERFLG _ T TITLE _ "Drawing Adjustments")))) (NIL NIL) (PAINT (SETQ MODE (QUOTE PAINT))) (INVERT (SETQ MODE (QUOTE INVERT))) (REPLACE (SETQ MODE (QUOTE REPLACE))) (ERASE (SETQ MODE (QUOTE ERASE))) (1 (SETQ BRUSH 1)) (2 (SETQ BRUSH 2)) (3 (SETQ BRUSH 3)) (4 (SETQ BRUSH 4)) (5 (SETQ BRUSH 5)) (QUIT NIL) NIL)) ) + +(ACE.EDIT.LINEART.TRACKLINE (LAMBDA (VERTEX POINT BRUSH) (* PmT "24-Apr-85 15:25") (* Makes a line from the current vertex to the cursor; shows where a line would go and what it looks like) (AND VERTEX POINT (DRAWLINE (ACE.MT.SEQX.AWX (CAR VERTEX)) (ACE.MT.SEQY.AWY (CDR VERTEX)) (ACE.MT.SEQX.AWX (CAR POINT)) (ACE.MT.SEQY.AWY (CDR POINT)) BRUSH (QUOTE INVERT) ACE.SEQ.WINDOW))) ) +) + + + +(* OTHER EDITING STUFF) + +(DEFINEQ + +(ACE.EDIT.MOVE.REGION (LAMBDA (ABITMAP) (* MD "21-Jun-85 13:52") (* Moves a region inside the sequence; similar to COMBINE.REGION except the old image may be erased (thus MOVE) ; region is confined to sequence by ACE.EDIT.MOVE.REGION.ASST) (PROG (TEMP.REGION TEMP.BM) (ACE.TELLEM "Select a region inside the sequence" T) (SETQ TEMP.REGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (SETQ TEMP.BM (BITMAPCREATE (fetch (REGION WIDTH) of TEMP.REGION) (fetch (REGION HEIGHT) of TEMP.REGION) 1)) (BITBLT ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMP.REGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMP.REGION)) TEMP.BM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (SELECTQ (MENU (OR ACE.EDIT.MOVE.MENU (SETQ ACE.EDIT.MOVE.MENU (create MENU ITEMS _ (QUOTE ((Erase (QUOTE ERASE) "NAND the old image") (Invert (QUOTE XOR) "XOR the old image with itself") (Nothing NIL "Just leave the old image as is"))) CENTERFLG _ T TITLE _ "Do What with Old Image?" CHANGEOFFSETFLG _ T)))) (NIL NIL) (ERASE (BITBLT TEMP.BM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMP.REGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMP.REGION)) NIL NIL (QUOTE INPUT) (QUOTE ERASE))) (XOR (BITBLT TEMP.BM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMP.REGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMP.REGION)) NIL NIL (QUOTE INPUT) (QUOTE INVERT))) NIL) (ACE.EDIT.PUTDOWN.BITMAP TEMP.BM ABITMAP))) ) + +(ACE.EDIT.COMBINE.REGION (LAMBDA (ABITMAP) (* PmT "25-Apr-85 15:22") (* Grabs a region from the screen; makes it into a bitmap, then pastes it into the current frame; see ACE.EDIT.PUTDOWN.BITMAP) (PROG (TEMP.BM TEMP.REGION) (ACE.TELLEM "Select a Region from Screen" T) (SETQ TEMP.REGION (GETREGION)) (SETQ TEMP.BM (BITMAPCREATE (fetch (REGION WIDTH) of TEMP.REGION) (fetch (REGION HEIGHT) of TEMP.REGION) 1)) (BITBLT (SCREENBITMAP) (fetch (REGION LEFT) of TEMP.REGION) (fetch (REGION BOTTOM) of TEMP.REGION) TEMP.BM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (ACE.EDIT.PUTDOWN.BITMAP TEMP.BM ABITMAP))) ) + +(ACE.EDIT.TEXT (LAMBDA (ABITMAP) (* PmT "25-Apr-85 17:57") (* Puts text into current frame; actually, puts text into ABITMAP and the sequence window) (PROG ((FONT.FAMILY NIL) (FONT.SIZE NIL) (FONT.FACE NIL) (DUMB.DSP.FOR.BM (DSPCREATE ABITMAP)) BMX BMY USERSTRING POSITION POINT&CODE FONT) (GETMOUSESTATE) (* This so MENUs stay in one (the same) place!) (SETQ POSITION (CONS LASTMOUSEX LASTMOUSEY)) (SETQ FONT.FAMILY (MENU (OR ACE.EDIT.TEXT.FONT.MENU (SETQ ACE.EDIT.TEXT.FONT.MENU (create MENU ITEMS _ (QUOTE ((Classic (QUOTE CLASSIC)) (Cream (QUOTE CREAM)) (Gacha (QUOTE GACHA)) (Helvetica (QUOTE HELVETICA)) (Modern (QUOTE MODERN)) (TimesRoman (QUOTE TIMESROMAN)) (" " NIL) ("* Same *" (QUOTE SAME) "Use same descriptor as last time") ("* Other *" (QUOTE OTHER)))) TITLE _ "Select a Font Family" CENTERFLG _ T))) POSITION)) (COND ((EQ FONT.FAMILY (QUOTE SAME)) (SETQ FONT.FAMILY (FONTPROP (DSPFONT NIL ACE.SEQ.WINDOW) (QUOTE FAMILY))) (SETQ FONT.SIZE (FONTPROP (DSPFONT NIL ACE.SEQ.WINDOW) (QUOTE SIZE))) (SETQ FONT.FACE (FONTPROP (DSPFONT NIL ACE.SEQ.WINDOW) (QUOTE FACE)))) ((EQ FONT.FAMILY (QUOTE OTHER)) (SETQ FONT.FAMILY (ACE.ASKEM "Enter a Font Family: " T))) ((NULL FONT.FAMILY) (RETURN NIL))) (COND (FONT.SIZE NIL) ((NEQ (QUOTE OTHER) (SETQ FONT.SIZE (MENU (OR ACE.EDIT.TEXT.SIZE.MENU (SETQ ACE.EDIT.TEXT.SIZE.MENU (create MENU ITEMS _ (QUOTE (6 8 10 12 14 16 18 24 36 ("* Other *" (QUOTE OTHER)))) TITLE _ "Select Font Size" CENTERFLG _ T MENUROWS _ 2))) POSITION)))) (T (SETQ FONT.SIZE (ACE.ASKEM "Enter a Font Size: " T)))) (COND (FONT.FACE NIL) ((NEQ (QUOTE OTHER) (SETQ FONT.FACE (MENU (OR ACE.EDIT.TEXT.FACE.MENU (SETQ ACE.EDIT.TEXT.FACE.MENU (create MENU ITEMS _ (QUOTE (("Standard" (QUOTE STANDARD) "Normal font face") ("Italic" (QUOTE ITALIC) "A standard face in italic") ("Expanded" (QUOTE MRE)) ("Bold" (QUOTE BOLD) "A heavy bold face") ("Bold Italic" (QUOTE BIR)) ("Compressed" (QUOTE MRC)) (" " NIL) ("* Other *" (QUOTE OTHER)) (" " NIL))) TITLE _ "Select a Font Face" CENTERFLG _ T MENUROWS _ 3 MENUCOLUMNS _ 3))) POSITION)))) (T (SETQ FONT.FACE (ACE.ASKEM "Enter a Font Face: " T)))) (COND ((SETQ FONT (FONTCREATE FONT.FAMILY FONT.SIZE FONT.FACE NIL NIL T)) (ACE.TELLEM "Ready to start Entering Text." T) (ACE.TELLEM "Position Mouse and Click LEFT." (QUOTE L)) (until (EQ (CAR (SETQ POINT&CODE (ACE.EDIT.POINT&CODE (QUOTE MOUSE)))) (QUOTE VERTEX)) do) (ACE.TELLEM "A RETURN Stops Text." T) (SETQ BMX (CADR POINT&CODE)) (SETQ BMY (CDDR POINT&CODE)) (MOVETO (ACE.MT.SEQX.AWX BMX) (ACE.MT.SEQY.AWY BMY) ACE.SEQ.WINDOW) (MOVETO BMX BMY DUMB.DSP.FOR.BM) (RESETFORM (DSPFONT FONT ACE.SEQ.WINDOW) (SETQ USERSTRING (PROMPTFORWORD NIL NIL NIL ACE.SEQ.WINDOW NIL NIL (CHARCODE (EOL ESCAPE LF))))) (RESETFORM (DSPFONT FONT DUMB.DSP.FOR.BM) (AND USERSTRING (PRIN1 USERSTRING DUMB.DSP.FOR.BM)))) (T (ACE.TELLEM "Can't find any such Font. Aborted." T))))) ) + +(ACE.EDIT.TEXTURE.REGION (LAMBDA (ABITMAP SHADE) (* PmT "25-Apr-85 15:33") (* Textures a region in ABITMAP; SHADE is optional; if not given, user is asked for a shade) (PROG (OPERATION SHADEREGION) (COND (SHADE NIL) ((NEQ (QUOTE OTHER) (SETQ SHADE (MENU (OR ACE.EDIT.TEXTURE.MENU (SETQ ACE.EDIT.TEXTURE.MENU (ACE.EDIT.CREATE.MENU.TEXTURES))))))) (T (SETQ SHADE (EDITSHADE)))) (OR SHADE (RETURN NIL)) (ACE.TELLEM "Select a Region in the Sequence" T) (SETQ SHADEREGION (GETREGION)) (SETQ OPERATION (COND ((EQ SHADE WHITESHADE) (QUOTE REPLACE)) ((MENU (OR ACE.EDIT.PUTDOWN.MENU (SETQ ACE.EDIT.PUTDOWN.MENU (create MENU ITEMS _ (QUOTE (("Paint" (QUOTE PAINT) "ORs with Frame") ("Replace" (QUOTE REPLACE) "Puts onto Frame") ("Invert" (QUOTE INVERT) "XORs with Frame") ("Erase" (QUOTE ERASE) "NANDs with Frame"))) CENTERFLG _ T TITLE _ "Select a Drawing Mode"))))))) (replace (REGION LEFT) of SHADEREGION with (ACE.MT.SCRX.AWX (fetch (REGION LEFT) of SHADEREGION))) (replace (REGION BOTTOM) of SHADEREGION with (ACE.MT.SCRY.AWY (fetch (REGION BOTTOM) of SHADEREGION))) (BITBLT NIL NIL NIL ACE.SEQ.WINDOW (fetch (REGION LEFT) of SHADEREGION) (fetch (REGION BOTTOM) of SHADEREGION) (fetch (REGION WIDTH) of SHADEREGION) (fetch (REGION HEIGHT) of SHADEREGION) (QUOTE TEXTURE) OPERATION SHADE (ACE.MT.SEQ.AW.REGION)) (BITBLT NIL NIL NIL ABITMAP (ACE.MT.AWX.SEQX (fetch (REGION LEFT) of SHADEREGION)) (ACE.MT.AWY.SEQY (fetch (REGION BOTTOM) of SHADEREGION)) (fetch (REGION WIDTH) of SHADEREGION) (fetch (REGION HEIGHT) of SHADEREGION) (QUOTE TEXTURE) OPERATION SHADE))) ) + +(ACE.EDIT.TEXTURE.AREA (LAMBDA (ABITMAP SHADE) (* PmT " 2-May-85 19:47") (* Does an area flood on a bounded region. ABITMAP is the frame (required) ; SHADE is an optional shade arg (SMALLP) ; Works by making a bitmap copy of a user selected region. Then flooding whatever area is enclosed with a user seed point.) (PROG (BOUNDING.REGION SEED.POINT TEMP.BM) (ACE.TELLEM "Select a Maximum Bounding Region." T) (SETQ BOUNDING.REGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (ACE.TELLEM "Select a Starting Point Inside the Region." T) (SETQ SEED.POINT (GETPOSITION)) (ACE.TELLEM "Select a Fill Shade." T) (COND (SHADE) ((NEQ (QUOTE OTHER) (SETQ SHADE (MENU (OR ACE.EDIT.TEXTURE.MENU (SETQ ACE.EDIT.TEXTURE.MENU (ACE.EDIT.CREATE.MENU.TEXTURES))))))) (T (SETQ SHADE (EDITSHADE)))) (COND ((NOT (INSIDEP BOUNDING.REGION SEED.POINT)) (ACE.TELLEM "Your Seed Point lies Outside of your Region." T) (ACE.TELLEM "Texture Area Fill Aborted." (QUOTE L)) (RETURN NIL)) ((NULL SHADE) (ACE.TELLEM "No Shade selected. Aborted." T) (RETURN NIL)) (T (SETQ SEED.POINT (CONS (IDIFFERENCE (CAR SEED.POINT) (fetch (REGION LEFT) of BOUNDING.REGION)) (IDIFFERENCE (CDR SEED.POINT) (fetch (REGION BOTTOM) of BOUNDING.REGION)))))) (SETQ TEMP.BM (BITMAPCREATE (fetch (REGION WIDTH) of BOUNDING.REGION) (fetch (REGION HEIGHT) of BOUNDING.REGION) 1)) (BITBLT ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of BOUNDING.REGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of BOUNDING.REGION)) TEMP.BM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (ACE.TELLEM "Texturing Area..." T) (RESETFORM (CURSOR WAITINGCURSOR) (ACE.FILLWITHTEXTURE TEMP.BM SHADE (CAR SEED.POINT) (CDR SEED.POINT) (LOGXOR 1 (BITMAPBIT TEMP.BM (CAR SEED.POINT) (CDR SEED.POINT))))) (BITBLT TEMP.BM 0 0 ACE.SEQ.WINDOW (ACE.MT.SCRX.AWX (fetch (REGION LEFT) of BOUNDING.REGION)) (ACE.MT.SCRY.AWY (fetch (REGION BOTTOM) of BOUNDING.REGION)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE) NIL NIL) (COND ((ACE.CONFIRMIT "Click LEFT to Confirm Fill as Shown." T) (BITBLT TEMP.BM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of BOUNDING.REGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of BOUNDING.REGION)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE) NIL NIL)) (T (ACE.TELLEM "Texture Area Fill Aborted." T))))) ) + +(ACE.EDIT.PAINT [LAMBDA (ABITMAP) (* ; "Edited 3-Sep-88 15:00 by masinter") (* Hacked from rrb "18-OCT-83 18:37") (* Paint on current frame with  either Mouse or Tablet) (* should make sure cursor has moved or a button has change before proceeding  with the inner loop.) (* has some of the stuff to allow the brush to be an arbitrary bitmap but not  all.) (ACE.TELLEM "Left (Mouse), Stylus (Tablet) Paints." T) (ACE.TELLEM "Middle (Mouse), Barrel (Tablet) Erases." 'L) (ACE.TELLEM "Right (Mouse) or Left Shift for Menu." 'L) (ACE.TELLEM "To Quit, select Quit from Menu." 'L) (BITBLT ABITMAP 0 0 ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF NIL NIL 'INPUT 'REPLACE NIL NIL) (PROG (OLDX OLDY (NEWBRUSHQ T) BRUSH WINDOW (ORIG.CURSOR (CURSOR)) (ORIG.REGION (DSPCLIPPINGREGION NIL ACE.SEQ.WINDOW))) (SETQ WINDOW ACE.SEQ.WINDOW) (SETQ WINDOW (\INSUREWINDOW WINDOW)) (RESETLST (RESETSAVE NIL (LIST 'CURSOR (CURSOR))) (PROG (DS HOTX HOTY) (TOTOPW WINDOW) (* look for a previously stored  brush.) [COND ((SETQ BRUSH (WINDOWPROP WINDOW 'PAINTBRUSH)) (SETQ PAINTCOMMANDMODE (CAR BRUSH)) (SETQ PAINTCOMMANDSHADE (CADR BRUSH)) (SETQ PAINTCOMMANDBRUSH (CADDR BRUSH] (SETQ DS (WINDOWPROP WINDOW 'DSP)) BRUSHLP [AND NEWBRUSHQ (SETQ BRUSH (COND ((BITMAPP PAINTCOMMANDBRUSH)) ((EQ (CAR PAINTCOMMANDBRUSH) 'other) (SETQ NEWBRUSHQ NIL) (ACE.EXTRACTBM)) (T (\GETBRUSH PAINTCOMMANDBRUSH] [AND (BITMAPP PAINTCOMMANDBRUSH) (SETQ PAINTCOMMANDBRUSH '(SQUARE 2] (* clear cursor) (BITBLT NIL NIL NIL (CURSORBITMAP) 0 0 16 16 'TEXTURE 'REPLACE WHITESHADE) (* put lower left part of brush  shape in cursor) (* BITBLT BRUSH 0 0  (SCREENBITMAP) 0 0 NIL NIL  (QUOTE INPUT) (QUOTE REPLACE)) (* set the hot spot to the middle of  the brush.) [CURSORHOTSPOT (create POSITION XCOORD _ (SETQ HOTX (IDIFFERENCE (IMIN (fetch BITMAPWIDTH of BRUSH) 16) 2)) YCOORD _ (SETQ HOTY (IDIFFERENCE (IMIN (fetch BITMAPHEIGHT of BRUSH) 16) 2] PAINTLP (ACE.GET.DEVICE.STATE&CURSOR) [COND ((KEYDOWNP 'RSHIFT) (RETURN)) ((OR (LASTMOUSESTATE RIGHT) (KEYDOWNP 'LSHIFT)) (COND ((OR (INSIDE? (DSPCLIPPINGREGION NIL DS) (LASTMOUSEX DS) (LASTMOUSEY DS)) (NOT (WHICHW LASTMOUSEX LASTMOUSEY))) (* inside the interior, give command  menu) (SELECTQ [MENU (COND ((type? MENU PAINTCOMMANDMENU) PAINTCOMMANDMENU) (T (SETQ PAINTCOMMANDMENU (create MENU ITEMS _ '((HardCopy 'HARDCOPY "Makes a press file of the window and prints it" ) (SetMode 'MODE "Allows specification of how new bits are merged" ) (SetShade 'SHADE "Allows specification of new shade." ) (SetShape 'SHAPE "Allows specification of brush shape" ) (SetSize 'SIZE "Allows specification of the brush size" ) (QUIT 'QUIT "Exits painting mode") ) CHANGEOFFSETFLG _ T] (SHADE (SETQ PAINTCOMMANDSHADE (OR (PAINTW.READBRUSHSHADE) PAINTCOMMANDSHADE)) (GO BRUSHLP)) (MODE (SETQ PAINTCOMMANDMODE (OR (PAINTW.READMODE) PAINTCOMMANDMODE)) (GO BRUSHLP)) (SHAPE (RPLACA PAINTCOMMANDBRUSH (OR (ACE.READBRUSHSHAPE) (CAR PAINTCOMMANDBRUSH))) (SETQ NEWBRUSHQ T) (GO BRUSHLP)) (SIZE (RPLACA (CDR PAINTCOMMANDBRUSH) (OR (PAINTW.READBRUSHSIZE) (CADR PAINTCOMMANDBRUSH))) (GO BRUSHLP)) (QUIT (WINDOWPROP ACE.SEQ.WINDOW 'PAINTBRUSH (LIST PAINTCOMMANDMODE PAINTCOMMANDSHADE (OR (BITMAPP BRUSH) PAINTCOMMANDBRUSH))) (SETQ PAINTCOMMANDBRUSH '(ROUND 16)) (RETURN)) (HARDCOPY (RESETFORM (TTYDISPLAYSTREAM PROMPTWINDOW) (HARDCOPYW WINDOW))) NIL)) (T (* do NOT do the window menu) NIL))) [(AND (LASTMOUSESTATE LEFT) (OR (EQ PAINTCOMMANDMODE 'REPLACE) (NEQ PAINTCOMMANDSHADE BLACKSHADE))) (* painting in grey is slightly  harder.) (COND ((EQ PAINTCOMMANDMODE 'REPLACE) (* erase what is there now) (BITBLT BRUSH 0 0 DS (IDIFFERENCE (LASTMOUSEX DS) HOTX) (IDIFFERENCE (LASTMOUSEY DS) HOTY) NIL NIL 'INPUT 'ERASE) (* put in grey) (BITBLT BRUSH 0 0 DS (IDIFFERENCE (LASTMOUSEX DS) HOTX) (IDIFFERENCE (LASTMOUSEY DS) HOTY) NIL NIL 'MERGE 'PAINT PAINTCOMMANDSHADE)) (T (BITBLT BRUSH 0 0 DS (IDIFFERENCE (LASTMOUSEX DS) HOTX) (IDIFFERENCE (LASTMOUSEY DS) HOTY) NIL NIL 'MERGE PAINTCOMMANDMODE PAINTCOMMANDSHADE] [(LASTMOUSESTATE (OR MIDDLE LEFT)) (BITBLT BRUSH 0 0 DS (IDIFFERENCE (LASTMOUSEX DS) HOTX) (IDIFFERENCE (LASTMOUSEY DS) HOTY) NIL NIL 'INPUT (COND ((LASTMOUSESTATE MIDDLE) 'ERASE) (T PAINTCOMMANDMODE] ((LASTMOUSESTATE UP) (* Idle -  just mark brush loc.) (BITBLT BRUSH 0 0 DS (SETQ OLDX (IDIFFERENCE (LASTMOUSEX DS) HOTX)) (SETQ OLDY (IDIFFERENCE (LASTMOUSEY DS) HOTY)) NIL NIL 'INPUT 'INVERT) (DISMISS 2) (BITBLT BRUSH 0 0 DS OLDX OLDY NIL NIL 'INPUT 'INVERT] (GO PAINTLP)) (WINDOWPROP WINDOW 'PAINTBRUSH (LIST PAINTCOMMANDMODE PAINTCOMMANDSHADE (COPY PAINTCOMMANDBRUSH ))) (BITBLT WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF ABITMAP 0 0 ACE.SEQ.WIDTH ACE.SEQ.HEIGHT 'INPUT 'REPLACE NIL NIL)) (WINDOWPROP ACE.SEQ.WINDOW 'PAINTBRUSH (LIST PAINTCOMMANDMODE PAINTCOMMANDSHADE (OR (BITMAPP BRUSH) PAINTCOMMANDBRUSH]) + +(ACE.FILLWITHTEXTURE (LAMBDA (BitmapOrWindow Texture X Y BoundaryValue) (* PmT " 2-May-85 18:45") (* hdj " 5-Mar-85 15:53") (* This code created by Herb Jellinek and Kelly Roach. Renamed for organizational purposes. Paints in TEXTURE into supplied BitmapOrWindow (Only a bitmap here) ; BoundaryValue should be either a 1 or 0 (No color bitmaps or anything fancy for now) ; X and Y specify the seed point for the fill) (PROG ((COPYBM (COPYALL BitmapOrWindow))) (ACE.SCANLINESEEDFILL COPYBM X Y BoundaryValue BoundaryValue) (BITBLT BitmapOrWindow 0 0 COPYBM 0 0 NIL NIL (QUOTE INPUT) (QUOTE INVERT)) (BITBLT COPYBM 0 0 COPYBM 0 0 NIL NIL (QUOTE MERGE) (QUOTE TEXTURE) Texture) (BITBLT COPYBM 0 0 BitmapOrWindow 0 0 NIL NIL (QUOTE INPUT) (QUOTE PAINT)) BitmapOrWindow)) ) + +(ACE.SCANLINESEEDFILL (LAMBDA (BitmapOrWindow X Y BoundaryValue FillValue) (* PmT " 2-May-85 20:19") (* hdj "30-Jan-85 15:01") (* This code created by Herb Jellinek and Kelly Roach. Renamed for organizational purposes) (PROG (Xcoord Ycoord STACK SaveX SaveY XLeft XRight XMax YMax) (if (BITMAPP BitmapOrWindow) then (SETQ XMax (SUB1 (BITMAPWIDTH BitmapOrWindow))) (SETQ YMax (SUB1 (BITMAPHEIGHT BitmapOrWindow))) else (SETQ XMax (SUB1 (WINDOWPROP BitmapOrWindow (QUOTE WIDTH)))) (SETQ YMax (SUB1 (WINDOWPROP BitmapOrWindow (QUOTE HEIGHT))))) (* "initialize stack") (ACE.PUSHPOS X Y STACK) (while STACK do (* get seed pixel and set to new value) (ACE.POPPOS STACK SaveX SaveY) (BITMAPBIT BitmapOrWindow SaveX SaveY FillValue) (* fill span to right of seed pixel) (SETQ XRight XMax) (for Xcoord from (ADD1 SaveX) while (ILEQ Xcoord XMax) do (if (NEQ (BITMAPBIT BitmapOrWindow Xcoord SaveY) BoundaryValue) then (BITMAPBIT BitmapOrWindow Xcoord SaveY FillValue) else (* save the extreme right pixel) (SETQ XRight (SUB1 Xcoord)) (RETURN))) (* fill span to left of seed pixel) (SETQ XLeft 0) (for Xcoord from (SUB1 SaveX) by -1 while (IGEQ Xcoord 0) do (if (NEQ (BITMAPBIT BitmapOrWindow Xcoord SaveY) BoundaryValue) then (BITMAPBIT BitmapOrWindow Xcoord SaveY FillValue) else (* save the extreme left pixel) (SETQ XLeft (ADD1 Xcoord)) (RETURN))) (* Push seed points for scan line above. *) (COND ((ILESSP SaveY YMax) (SETQ Ycoord (ADD1 SaveY)) (for Xcoord from XLeft to XRight when (AND (NEQ (BITMAPBIT BitmapOrWindow Xcoord Ycoord) BoundaryValue) (OR (EQ Xcoord XRight) (OR (EQ (BITMAPBIT BitmapOrWindow (ADD1 Xcoord) Ycoord) BoundaryValue) (EQ (BITMAPBIT BitmapOrWindow (ADD1 Xcoord) Ycoord) FillValue)))) do (ACE.PUSHPOS Xcoord Ycoord STACK)))) (* Push seed points for scan line below. *) (COND ((IGREATERP SaveY 0) (SETQ Ycoord (SUB1 SaveY)) (for Xcoord from XLeft to XRight when (AND (NEQ (BITMAPBIT BitmapOrWindow Xcoord Ycoord) BoundaryValue) (OR (EQ Xcoord XRight) (OR (EQ (BITMAPBIT BitmapOrWindow (ADD1 Xcoord) Ycoord) BoundaryValue) (EQ (BITMAPBIT BitmapOrWindow (ADD1 Xcoord) Ycoord) FillValue)))) do (ACE.PUSHPOS Xcoord Ycoord STACK))))))) ) + +(ACE.EDIT.CREATE.MENU.TEXTURES (LAMBDA NIL (* PmT "25-Apr-85 15:27") (* Creates a textures menu for TEXTURE.REGION and FILL routines) (PROG (TEMP.BM) (RETURN (create MENU ITEMS _ (NCONC1 (for TEXTURE in (QUOTE (65535 34850 43605 63624 42405 4080 64250 26214 65488 34925 15 4680 33825 1185 1 3784 3591)) collect (PROGN (BITBLT NIL NIL NIL (SETQ TEMP.BM (BITMAPCREATE 36 36 1)) 4 4 28 28 (QUOTE TEXTURE) (QUOTE REPLACE) TEXTURE NIL) (LIST TEMP.BM TEXTURE))) (QUOTE ("* Other *" (QUOTE OTHER) "Make your own shade"))) TITLE _ "Texture Menu" CENTERFLG _ T MENUROWS _ 3)))) ) + +(ACE.EDIT.PUTDOWN.BITMAP (LAMBDA (IMAGE.BM TARGET.BM) (* MD "21-Jun-85 13:56") (* Pastes IMAGE.BM onto TARGET.BM; IMAGE.BM is tied to mouse until left click; asks user how to combine the two) (PROG (MODE POINT) (ACE.TELLEM "Click Left to paste down image." T) (SETQ POINT (PROG (OLD.X OLD.Y) LOOP (BITBLT IMAGE.BM 0 0 ACE.SEQ.WINDOW (SETQ OLD.X (LASTMOUSEX ACE.SEQ.WINDOW)) (SETQ OLD.Y (LASTMOUSEY ACE.SEQ.WINDOW)) NIL NIL (QUOTE INPUT) (QUOTE INVERT) NIL (ACE.MT.SEQ.AW.REGION)) (GETMOUSESTATE) (ACE.UPD.CONTROL.WINDOW (QUOTE CURSOR) (CONS (ACE.MT.SCRX.SEQX LASTMOUSEX) (ACE.MT.SCRY.SEQY LASTMOUSEY))) (COND ((LASTMOUSESTATE LEFT) (do (GETMOUSESTATE) until (LASTMOUSESTATE UP)) (BITBLT IMAGE.BM 0 0 ACE.SEQ.WINDOW OLD.X OLD.Y NIL NIL (QUOTE INPUT) (QUOTE INVERT) NIL (ACE.MT.SEQ.AW.REGION)) (RETURN (CONS (LASTMOUSEX ACE.SEQ.WINDOW) (LASTMOUSEY ACE.SEQ.WINDOW)))) (T (BITBLT IMAGE.BM 0 0 ACE.SEQ.WINDOW OLD.X OLD.Y NIL NIL (QUOTE INPUT) (QUOTE INVERT) NIL (ACE.MT.SEQ.AW.REGION)))) (GO LOOP))) (SETQ MODE (MENU (OR ACE.EDIT.PUTDOWN.MENU (SETQ ACE.EDIT.PUTDOWN.MENU (create MENU ITEMS _ (QUOTE (("Paint" (QUOTE PAINT) "ORs with Frame") ("Replace" (QUOTE REPLACE) "Puts onto Frame") ("Invert" (QUOTE INVERT) "XORs with Frame") ("Erase" (QUOTE ERASE) "NANDs with Frame"))) CENTERFLG _ T TITLE _ "Select a Drawing Mode" CHANGEOFFSETFLG _ T))))) (BITBLT IMAGE.BM 0 0 ACE.SEQ.WINDOW (CAR POINT) (CDR POINT) NIL NIL (QUOTE INPUT) MODE NIL (ACE.MT.SEQ.AW.REGION)) (BITBLT IMAGE.BM 0 0 TARGET.BM (ACE.MT.AWX.SEQX (CAR POINT)) (ACE.MT.AWY.SEQY (CDR POINT)) NIL NIL (QUOTE INPUT) MODE NIL))) ) + +(ACE.EDIT.MOVE.REGION.ASST (LAMBDA (FIXED MOVE EXTRA) (* PmT "23-Jan-85 20:03") (COND ((NULL MOVE) (ACE.NEW.SEQ.ASST (CONS (ACE.MT.SCRX.SEQX (CAR FIXED)) (ACE.MT.SCRY.SEQY (CDR FIXED))) MOVE EXTRA) (COND ((INSIDEP (ACE.MT.SEQ.SCR.REGION) FIXED) FIXED) (T (ACE.RETURN.CLOSEST.VERTEX FIXED (ACE.MT.SEQ.SCR.REGION))))) (T (ACE.NEW.SEQ.ASST FIXED MOVE EXTRA) (COND ((INSIDEP (ACE.MT.SEQ.SCR.REGION) MOVE) MOVE) (T (ACE.RETURN.CLOSEST.VERTEX MOVE (ACE.MT.SEQ.SCR.REGION))))))) ) + +(ACEEDITBM (LAMBDA (TYPE) (* MJD "23-May-86 15:51") (PROG (TEMPREGION TEMPBM NEWBM) (ACE.TELLEM "Select a Region inside the Sequence" T) (SETQ TEMPREGION (GETREGION NIL NIL NIL (QUOTE ACE.EDIT.MOVE.REGION.ASST) NIL)) (SETQ TEMPBM (BITMAPCREATE (fetch (REGION WIDTH) of TEMPREGION) (fetch (REGION HEIGHT) of TEMPREGION) 1)) (BITBLT ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) TEMPBM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (SETQ NEWBM (EDITBM TEMPBM)) (BITBLT TEMPBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE ERASE)) (BITBLT NEWBM 0 0 ABITMAP (ACE.MT.SCRX.SEQX (fetch (REGION LEFT) of TEMPREGION)) (ACE.MT.SCRY.SEQY (fetch (REGION BOTTOM) of TEMPREGION)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE)))) ) + +(ACE.READBRUSHSHAPE (LAMBDA NIL (* MJD "15-May-86 15:15") (MENU (create MENU ITEMS _ (QUOTE (DIAGONAL VERTICAL HORIZONTAL SQUARE ROUND other))))) ) +) + + + +(* TABLET AND SUPPORT FNS) + +(DEFINEQ + +(ACE.EDIT.POINT&CODE (LAMBDA (DEVICE) (* MD "19-Jun-85 16:56") (* THIS MESS RETURNS (CODE X NIL) FOR THE DEVICE SELECTED) (* CODE IS NIL, VERTEX OR TOGGLE) (* X AND Y ARE RELATIVE TO THE SEQUENCE. USUALLY THE SEQUENCE'S 0,0 IS AT THE WINDOW'S 0,0 THEREFORE, COORS IN THE A.C.W ARE SEQUENCE COORS, NOT WINDOW COORS. E.S.L.DRAW TAKES CARE TO CORRECT FOR ANY DIFFERENCE) (PROG (POINT&CODE XCOOR YCOOR) (ACE.GET.DEVICE.STATE DEVICE) (SETQ XCOOR (ACE.MT.SCRX.SEQX LASTMOUSEX)) (SETQ YCOOR (ACE.MT.SCRY.SEQY LASTMOUSEY)) (SETQ POINT&CODE (DECODEBUTTONS (QUOTE (LEFT MIDDLE RIGHT)))) (COND (POINT&CODE (FLIPCURSOR) (until (EQP LASTMOUSEBUTTONS 0) do (ACE.GET.DEVICE.STATE DEVICE)) (FLIPCURSOR) (SETQ POINT&CODE (COND ((EQUAL POINT&CODE (QUOTE (LEFT))) (QUOTE VERTEX)) ((EQUAL POINT&CODE (QUOTE (MIDDLE))) (QUOTE TOGGLE)) ((EQUAL POINT&CODE (QUOTE (RIGHT))) (QUOTE OPTIONS)))))) (COND ((EQ DEVICE (QUOTE MOUSE)) NIL) ((EQ DEVICE (QUOTE MM1201)) (\SETCURSORPOSITION LASTMOUSEX LASTMOUSEY))) (ACE.UPD.CONTROL.WINDOW (QUOTE CURSOR) (CONS XCOOR YCOOR)) (RETURN (CONS POINT&CODE (CONS XCOOR YCOOR))))) ) + +(ACE.GET.DEVICE.STATE (LAMBDA (DEVICE) (* PmT "24-Apr-85 16:57") (* Updates LASTMOUSEX LASTMOUSEY LASTMOUSEBUTTONS LASTKEYBOARD based on DEVICE (mouse or tablet (MM1201))) (PROG (POINT&CODE) (COND ((EQ DEVICE (QUOTE MOUSE)) (GETMOUSESTATE)) ((EQ DEVICE (QUOTE MM1201)) (SETQ POINT&CODE (ACE.MM1201POLL 1)) (COND ((BITTEST (CDR POINT&CODE) 64) NIL) (T (COND ((BITTEST (CDR POINT&CODE) 2) (SETQ LASTMOUSEBUTTONS 1)) ((BITTEST (CDR POINT&CODE) 1) (SETQ LASTMOUSEBUTTONS 4)) (T (SETQ LASTMOUSEBUTTONS 0))) (SETQ LASTMOUSEX (CAAR POINT&CODE)) (SETQ LASTMOUSEY (CDAR POINT&CODE)) (SETQ LASTKEYBOARD (\EVENTKEYS)))))))) ) + +(ACE.GET.DEVICE.STATE&CURSOR (LAMBDA NIL (* PmT "25-Apr-85 14:10") (* Updates LASTMOUSEX LASTMOUSEY LASTMOUSEBUTTONS LASTKEYBOARD based on the window prop value of DEVICE; Also, puts cursor info in status window (sequence referrenced)) (PROG (DEVICE POINT&CODE) (SETQ DEVICE (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE ACE.DEVICE))) (COND ((EQ DEVICE (QUOTE MOUSE)) (GETMOUSESTATE)) ((EQ DEVICE (QUOTE MM1201)) (SETQ POINT&CODE (ACE.MM1201POLL 1)) (COND ((BITTEST (CDR POINT&CODE) 64) NIL) (T (COND ((BITTEST (CDR POINT&CODE) 2) (SETQ LASTMOUSEBUTTONS 1)) ((BITTEST (CDR POINT&CODE) 1) (SETQ LASTMOUSEBUTTONS 4)) (T (SETQ LASTMOUSEBUTTONS 0))) (SETQ LASTMOUSEX (CAAR POINT&CODE)) (SETQ LASTMOUSEY (CDAR POINT&CODE)) (\SETCURSORPOSITION LASTMOUSEX LASTMOUSEY) (SETQ LASTKEYBOARD (\EVENTKEYS)))))) (ACE.MAC.CW.INFO.CLIP (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) (CONS (ACE.MT.SCRX.SEQX LASTMOUSEX) (ACE.MT.SCRY.SEQY LASTMOUSEY)))))) ) + +(ACE.EXTRACTBM (LAMBDA NIL (* MJD "22-May-86 15:16") (PROG (SHAPE BMNAME) (SETQ SHAPE (GETREGION 4 4 (QUOTE (32 . 32)))) (SETQ BMNAME (BITMAPCREATE (CADDR SHAPE) (CADDDR SHAPE))) (BITBLT (SCREENBITMAP) (CAR SHAPE) (CADR SHAPE) (EVAL BMNAME) 0 0 (CADDR SHAPE) (CADDDR SHAPE) (QUOTE INPUT) (QUOTE REPLACE)) (RETURN BMNAME))) ) + +(ACE.EDIT.REDRAW.ABITMAP (LAMBDA (ABITMAP) (* PmT " 2-Jan-85 18:28") (BITBLT ABITMAP 0 0 ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF NIL NIL (QUOTE INPUT) (QUOTE REPLACE) NIL NIL)) ) + +(ACE.SCALE.BITMAP (LAMBDA (BITMAP FACTOR) (* PmT " 2-May-85 20:19") (* SCALES BITMAPS BY AN ARBITRARY AMOUNT OF 2 DECIMAL PLACES. FACTOR CAN BE OF THE FOLLOWING FORMS%: I (AN INTEGER REPRESENTING A PERCENTAGE AMOUNT; E.G. I=67 MEANS REDUCE THE X AND Y AXIS TO 67% OF THEIR ORIGINAL) ; R (A REAL; E.G. R=1.3 MEANS INCREASE THE X AND Y AXIS BY A FACTOR OF 1.3) ; (IX . IY) (A DOTTED PAIR OF INTEGERS; E.G. (75 . 125) MEANS REDUCE THE X AXIS TO 75% OF ORIGINAL; INCREASE Y TO 125% OF ORIGINAL) ; (RX . RY) (A DOTTED PAIR OF REALS; E.G. (2.3 . 0.81) MEANS 2.3 TIMES ORIGINAL X AXIS, 0.81 TIMES ORIGINAL Y)) (PROG (XFACTOR YFACTOR DELTAX DELTAY XROUND YROUND BITMAPWIDTH BITMAPHEIGHT HEIGHT-1 RASTERWIDTH BITMAPBASE NEWBITMAP NEWHEIGHT-1 NEWBITMAPBASE NEWRASTERWIDTH ORIGBASE NEWBASE ORIGWORD NEWWORD XSTART YSTART ENDX ENDY ONLINE) (OR (type? BITMAP BITMAP) (\ILLEGAL.ARG BITMAP)) (SETQ BITMAPWIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP)) (SETQ BITMAPHEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) (COND ((NUMBERP FACTOR) (SETQ XFACTOR FACTOR) (SETQ YFACTOR FACTOR)) ((POSITIONP FACTOR) (SETQ XFACTOR (CAR FACTOR)) (SETQ YFACTOR (CDR FACTOR))) (T (\ILLEGAL.ARG FACTOR))) (AND (FLOATP XFACTOR) (SETQ XFACTOR (FIX (FTIMES XFACTOR 100)))) (AND (FLOATP YFACTOR) (SETQ YFACTOR (FIX (FTIMES YFACTOR 100)))) (SETQ XFACTOR (IMIN SCREENWIDTH XFACTOR)) (SETQ YFACTOR (IMIN SCREENHEIGHT YFACTOR)) (COND ((ILESSP XFACTOR 101) (SETQ DELTAX 100) (SETQ XROUND (IQUOTIENT XFACTOR 2))) (T (SETQ DELTAX XFACTOR) (SETQ XROUND 50))) (COND ((ILESSP YFACTOR 101) (SETQ DELTAY 100) (SETQ YROUND (IQUOTIENT YFACTOR 2))) (T (SETQ DELTAY YFACTOR) (SETQ YROUND 50))) (SETQ NEWBITMAP (BITMAPCREATE (IQUOTIENT (IPLUS XROUND DELTAX (ITIMES (SUB1 BITMAPWIDTH) XFACTOR)) 100) (IQUOTIENT (IPLUS YROUND DELTAY (ITIMES (SUB1 BITMAPHEIGHT) YFACTOR)) 100) 1)) (* MAKE ALL VALUES QUICKLY AVAILABLE) (SETQ HEIGHT-1 (SUB1 BITMAPHEIGHT)) (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP)) (SETQ BITMAPBASE (fetch (BITMAP BITMAPBASE) of BITMAP)) (* AND THE NEW BITMAP VALUES) (SETQ NEWHEIGHT-1 (SUB1 (fetch (BITMAP BITMAPHEIGHT) of NEWBITMAP))) (SETQ NEWRASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of NEWBITMAP)) (SETQ NEWBITMAPBASE (fetch (BITMAP BITMAPBASE) of NEWBITMAP)) (* OK, CRANK IT OUT) (* ORIGWORD AND NEWWORD ARE SORTA CACHED FOR SPEED PURPOSES) (for Y from 0 to HEIGHT-1 do (SETQ ORIGBASE (\ADDBASE BITMAPBASE (ITIMES RASTERWIDTH (IDIFFERENCE HEIGHT-1 Y)))) (SETQ ONLINE NIL) (for X from 0 to (SUB1 BITMAPWIDTH) do (AND (ZEROP (IMOD X 16)) (SETQ ORIGWORD (\GETBASE ORIGBASE (LRSH X 4)))) (* LOOK FOR STRINGS OF "ON" BITS; THEN TREAT AS A LINE FOR TRANSLATIONAL PURPOSES) (COND ((BITTEST ORIGWORD (\WORDELT BITMASKARRAY (IMOD X 16))) (OR ONLINE (AND (SETQ ONLINE T) (SETQ XSTART X) (SETQ YSTART Y)))) ((NULL ONLINE) (* JUST SKIP OVER BLANKS)) (T (* SPELL THIS ALL OUT SO I CAN SEE WHAT'S GOIN' ON HERE) (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR)) 100)) (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR) YROUND DELTAY) 100)) (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR)) 100)) (SETQ ENDX (IQUOTIENT (IPLUS XROUND (ITIMES (SUB1 X) XFACTOR)) 100)) (for NY from YSTART to (SUB1 ENDY) do (SETQ NEWWORD (\GETBASE (SETQ NEWBASE (\ADDBASE NEWBITMAPBASE (ITIMES NEWRASTERWIDTH (IDIFFERENCE NEWHEIGHT-1 NY)))) (LRSH XSTART 4))) (for NX from XSTART to ENDX do (AND (ZEROP (IMOD NX 16)) (SETQ NEWWORD (\GETBASE NEWBASE (LRSH NX 4)))) (SETQ NEWWORD (LOGOR NEWWORD (\WORDELT BITMASKARRAY (IMOD NX 16)))) (AND (ZEROP (IMOD (ADD1 NX) 16)) (\PUTBASE NEWBASE (LRSH NX 4) NEWWORD))) (\PUTBASE NEWBASE (LRSH ENDX 4) NEWWORD)) (SETQ ONLINE NIL)))) (COND (ONLINE (* GOTTA CLEANUP AFTER THE LAST CASE) (* THIS IN CASE WORKING ON A LINE THAT GOES TO END OF BITMAP) (* GAWD! WHAT A WASTE O SPACE THIS IS. FIX LATER) (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR)) 100)) (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR) YROUND DELTAY) 100)) (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR)) 100)) (SETQ ENDX (IQUOTIENT (IPLUS XROUND (ITIMES (SUB1 BITMAPWIDTH) XFACTOR)) 100)) (for NY from YSTART to (SUB1 ENDY) do (SETQ NEWWORD (\GETBASE (SETQ NEWBASE (\ADDBASE NEWBITMAPBASE (ITIMES NEWRASTERWIDTH (IDIFFERENCE NEWHEIGHT-1 NY)))) (LRSH XSTART 4))) (for NX from XSTART to ENDX do (AND (ZEROP (IMOD NX 16)) (SETQ NEWWORD (\GETBASE NEWBASE (LRSH NX 4)))) (SETQ NEWWORD (LOGOR NEWWORD (\WORDELT BITMASKARRAY (IMOD NX 16)))) (AND (ZEROP (IMOD (ADD1 NX) 16)) (\PUTBASE NEWBASE (LRSH NX 4) NEWWORD))) (\PUTBASE NEWBASE (LRSH ENDX 4) NEWWORD))))) (RETURN NEWBITMAP))) ) + +(ACE.COMPILE.FRAME.ACE (LAMBDA (PREC SUCC VERTICAL THRESHOLD) (* MJD "28-May-86 17:14") (* Calls the frame compiler on PREC and SUCC (bitmaps) ; returns the changes required to go from PREC to SUCC; supplies defaults if not given. VERTICAL and THRESHOLD are special args to the compiler) (* NEXT TWO ARE ARBITRARY DEFAULTS) (OR VERTICAL (SETQ VERTICAL 16)) (OR THRESHOLD (SETQ THRESHOLD 50)) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "COMPILING") (* ACE.COMPILE.FRAME PREC SUCC VERTICAL THRESHOLD) (SETQ ACE.COMPILER (ADD.PROCESS (BQUOTE (ACE.COMPILE.FRAME %, PREC %, SUCC %, VERTICAL %, THRESHOLD))))) ) + +(ACE.MM1201.INIT (LAMBDA (INIT?) (* PmT "24-Apr-85 17:16") (* Inits the RS232 port and the MM1201 graphics tablet; If INIT? = ASK then the user is asked if s/he wants to init; If = T then else auto init; else just the tablet is initialized) (* DEFAULT RS232 IS 4800; DOESN'T QUITE WORK AT 9600) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "INIT TABLET") (COND ((OR (EQ INIT? T) (AND (EQ INIT? (QUOTE ASK)) (ACE.CONFIRMIT "Click LEFT to Initialize Tablet." T))) (RS232INIT (COND ((KEYDOWNP (QUOTE LSHIFT)) (OR (MENU (create MENU ITEMS _ (QUOTE (9600 4800 2400 1200 600 300 150 75)) TITLE _ "Select Baud Rate" CENTERFLG _ T)) 4800)) (T 4800)) 8 NIL 1) (forDuration 50 timerUnits (QUOTE MILLISECONDS)) (RS232CLEARBUFFER (QUOTE BOTH)) (RS232WRITEBYTE 32 T) (* set tablet baud rate%:) (forDuration 50 timerUnits (QUOTE MILLISECONDS)))) (RS232CLEARBUFFER (QUOTE BOTH)) (* Set x and y scale factors%: USE SCREEN SIZE (Scaling to window size is an interesting idea)) (RS232WRITEBYTE 114) (RS232WRITEBYTE (LOGAND SCREENWIDTH 255)) (RS232WRITEBYTE (LRSH SCREENWIDTH 8)) (RS232WRITEBYTE (LOGAND SCREENHEIGHT 255)) (RS232WRITEBYTE (LRSH SCREENHEIGHT 8) T) (forDuration 50 timerUnits (QUOTE MILLISECONDS)) (RS232WRITEBYTE 68 T) (* SET TABLET FOR POLLING MODE)) ) + +(ACE.MM1201POLL (LAMBDA (COUNT) (* PmT "24-Apr-85 17:22") (* Returns a point in the form ((X . Y) . CODE) Sends out the command to poll the pen; receives data describing the pen's current state) (* HACKED FROM MD "13-Jun-84 16:08") (PROG (PT) (AND (EQP COUNT 3) (RETURN (ACE.MM1201.PROBLEM (QUOTE NODATA)))) (RS232WRITEBYTE 80 T) (* CONDUCT A POLL!) (SETQ PT (LIST (RS232READBYTE 30 (QUOTE MILLISECONDS)) (RS232READBYTE 15 (QUOTE MILLISECONDS)) (RS232READBYTE 15 (QUOTE MILLISECONDS)) (RS232READBYTE 15 (QUOTE MILLISECONDS)) (RS232READBYTE 15 (QUOTE MILLISECONDS)))) (COND ((FMEMB NIL PT) (RETURN (ACE.MM1201POLL (ADD1 COUNT))) (* If read screws up, try again (up to 3 times) ; then tell user trouble)) (T (RETURN (CONS (CONS (LOGOR (CADR PT) (LLSH (CADDR PT) 7)) (LOGOR (CADDDR PT) (LLSH (CAR (LAST PT)) 7))) (CAR PT))))))) ) + +(ACE.MM1201.PROBLEM (LAMBDA (PROBLEM) (* PmT "24-Apr-85 17:25") (* Called if tablet ain't woikin right; try a re-init) (ACE.TELLEM "Tablet (MM1201) data problem." T) (ACE.TELLEM "Will try to Re-Initialize Tablet" (QUOTE L)) (ACE.CONFIRMIT "Click ANY to continue." (QUOTE L) (QUOTE ANY)) (ACE.MM1201.INIT (QUOTE ASK)) (ACE.MM1201POLL 1)) ) + +(ACE.EDIT.CLEAR.ALL.MENUS (LAMBDA NIL (* PmT "24-Apr-85 17:27") (* THIS JUST ZAPS ALL MENUS AT LOAD TIME) (* MAKE THIS NICER SOME TIME) (SETQ ACE.EDIT.FRAME.MENU NIL) (SETQ ACE.EDIT.LINEART.ADJ.MENU NIL) (SETQ ACE.EDIT.MOVE.MENU NIL) (SETQ ACE.EDIT.TEXT.FONT.MENU NIL) (SETQ ACE.EDIT.TEXT.SIZE.MENU NIL) (SETQ ACE.EDIT.TEXT.FACE.MENU NIL) (SETQ ACE.EDIT.TEXTURE.MENU NIL) (SETQ ACE.EDIT.PUTDOWN.MENU NIL)) ) + +(ROTATEBM (LAMBDA (SOURCE DEST ANGLE) (* MJD "23-May-86 15:20") (* Original code by Kelly Roach (Roach.pa)) (PROG (SWIDTH SWIDTH2 SHEIGHT2 DWIDTH DWIDTH2 DHEIGHT2 DHEIGHT SIN COS AU BU CU AV BV CV U1 V1 U2 V2 DELTAU DELTAV) (CURSOR WAITINGCURSOR) (SETQ SWIDTH (COND ((WINDOWP SOURCE) (WINDOWPROP SOURCE (QUOTE WIDTH))) ((BITMAPP SOURCE) (BITMAPWIDTH SOURCE)) (T (\ILLEGAL.ARG SOURCE)))) (SETQ SWIDTH2 (IQUOTIENT SWIDTH 2)) (SETQ SHEIGHT2 (IQUOTIENT (COND ((WINDOWP SOURCE) (WINDOWPROP SOURCE (QUOTE HEIGHT))) ((BITMAPP SOURCE) (BITMAPHEIGHT SOURCE)) (T (\ILLEGAL.ARG SOURCE))) 2)) (SETQ DWIDTH (COND ((WINDOWP DEST) (WINDOWPROP DEST (QUOTE WIDTH))) ((BITMAPP DEST) (BITMAPWIDTH DEST)) (T (\ILLEGAL.ARG DEST)))) (SETQ DWIDTH2 (IQUOTIENT DWIDTH 2)) (SETQ DHEIGHT (COND ((WINDOWP DEST) (WINDOWPROP DEST (QUOTE HEIGHT))) ((BITMAPP DEST) (BITMAPHEIGHT DEST)) (T (\ILLEGAL.ARG DEST)))) (SETQ DHEIGHT2 (IQUOTIENT DHEIGHT 2)) (SETQ SIN (SIN ANGLE)) (SETQ COS (COS ANGLE)) (SETQ AU COS) (SETQ BU SIN) (SETQ CU (FPLUS SWIDTH2 (FTIMES (FMINUS DWIDTH2) COS) (FTIMES (FMINUS DHEIGHT2) SIN))) (SETQ AV (FMINUS SIN)) (SETQ BV COS) (SETQ CV (FPLUS SHEIGHT2 (FTIMES DWIDTH2 SIN) (FTIMES (FMINUS DHEIGHT2) COS))) (SETQ U1 CU) (SETQ V1 CV) (SETQ U2 (FPLUS (FTIMES AU DWIDTH) CU)) (SETQ V2 (FPLUS (FTIMES AV DWIDTH) CV)) (for Y from 0 to DHEIGHT do (SETQ DELTAU (FTIMES Y BU)) (SETQ DELTAV (FTIMES Y BV)) (TEXTURELINE SOURCE (FIXR (FPLUS U1 DELTAU)) (FIXR (FPLUS V1 DELTAV)) (FIXR (FPLUS U2 DELTAU)) (FIXR (FPLUS V2 DELTAV)) DEST 0 Y DWIDTH)) (CURSOR T))) ) + + + + +(RS232LOSTCHARFN (LAMBDA NIL (* PmT "20-Nov-84 14:19") NIL)) +) +(DECLARE%: EVAL@COMPILE + +[PUTPROPS ACE.POPPOS MACRO ((STACK X Y) + (SETQ Y (pop STACK)) + (SETQ X (fetch (POSITION XCOORD) of Y)) + (SETQ Y (fetch (POSITION YCOORD) of Y] + +[PUTPROPS ACE.PUSHPOS MACRO ((X Y STACK) + (push STACK (CREATEPOSITION X Y] +) +(RPAQ ACE.EDIT.LINEART.SQUARE.CURSOR (CURSORCREATE (QUOTE #*(16 16)@@@@OOONHA@BHA@BHA@BHA@BHA@BHA@BOOONHA@BHA@BHA@BHA@BHA@BHA@BOOON +) (QUOTE NIL) 7 7)) + +(RPAQQ ACELOGOMAP #*(64 128)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AL@@@@@@@@@@@@@@CG@@@@@@@@@@@@@@CAL@@@@@@@@@@@@@B@G@@@@@@@@@@@@@F@AL@@@@@@@@@@@@FC@F@@@@@@@@@@@@DG@CH@@@@@@@@@@@LM@AL@@@@@@@@@@@IM@@G@@@@@@@@@@@KG@@AL@@@@@@C@@MJC@@@F@@@@@@C@@M@A@@@CH@@@@@@@AI@A@@@@L@@@G@C@AK@@@@@@C@@@EHCCKB@@@@@@AH@CLHCBNF@@@@@@@F@NDMCFFD@@@@@@@K@BFMCFDL@@@@@@CILCFEJFLH@@@@@@GHFAB@NCIH@@@@@@OHAAH@@@A@@@B@@@OHG@@GO@C@@@F@@@OHL@CLAON@@@N@@@OAH@N@@@D@@AN@@@LC@AH@@@L@@CN@@@HF@B@@@@H@@GN@@@@L@C@@@AH@@ON@@@AH@C@@@O@@AON@@@C@@B@@AJ@@CMN@@@F@@B@@AF@@GIN@@@L@@B@@AL@@OAN@@AH@@B@@AH@ANAN@@A@@@C@@@H@CLAN@@C@@@A@@@H@GHAN@@B@@@AH@@L@ONAN@@F@@@@L@@FAOOIN@@OH@@@O@@CCLOOL@@MH@@@GH@AOHCOL@AHN@@@CN@@C@AOL@A@CH@@AO@@AH@GL@CL@L@@@OL@@N@CL@FF@F@@@GN@@CHCL@DB@C@@@COH@@OCL@HC@@H@@COL@@AOLAHA@@L@@FGO@@@CLA@CH@F@@FAOL@@@FC@CH@C@@F@OO@@@CJ@O@@A@@L@COL@@@GOH@@A@@L@@ON@@@@@@@@A@@L@@GOL@@@@@@@A@@H@@AOO@@@@@@@C@AH@@@CON@@@@@@G@AH@@@@OOH@@@@GO@AH@@@@COOHAOOON@A@@@@@@OOOOOOOL@C@@@@@@COOOOOOH@B@@@@@@FGOOOOO@@B@@@@@@DOOOOO@@@D@@@@@@LONGL@@@@D@@@@@@HOL@@@LH@L@@@@@AIOH@@@EH@H@@@@@ACOA@HDO@@H@@@@@CCNCNNNN@AH@@@@@BGNCBONB@A@@@@@@FGLFFICCAA@@@@@@DOLFDIKAKC@@@@@@LOHOLLIHNB@@@@@@IOHL@LHH@F@@@@@AKOAH@@@@@F@@@@@ACNAH@@@@@D@@@@@CGNA@@@@@@D@@@@@FGL@@@@@@@D@@@@@DOH@@@@@@@D@@@@@MOH@@@@@@@D@@@@@IO@@@@@@@@F@@@@AKO@@@@@@AHC@@@@CCN@@@@@@C@AH@@@BGL@@@@@@F@AL@@@FGL@@@@CLD@@N@@@LOH@@@@FFL@@OH@AIOH@@@@FFO@@GN@CGO@@@@@BDIH@AOOOOL@@@@@CLHH@@GOOOH@@@@@FFOH@@AOON@@@@@@FFG@@@@@@@@@@@@@FF@@@@@@@@@@@@@@CL@@@@@@@@@@@@@@@@@@ +) + +(RPAQQ RS232LOSTCHARFN RS232LOSTCHARFN) + + + +(* MENUS FOR ACE-EDIT) + +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS ACE.CONTROL.WINDOW ACE.EDIT.FRAME.MENU ACE.EDIT.LINEART.ADJ.MENU ACE.EDIT.MOVE.MENU + ACE.EDIT.TEXT.FONT.MENU ACE.EDIT.TEXT.SIZE.MENU ACE.EDIT.TEXT.FACE.MENU ACE.EDIT.TEXTURE.MENU + ACE.EDIT.PUTDOWN.MENU) +) +(DECLARE%: DONTEVAL@LOAD DOCOPY + +(ACE.EDIT.CLEAR.ALL.MENUS) +) +(PUTPROPS ACE COPYRIGHT ("Michel Denber" 1988 1993)) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (8402 32042 (ACE 8412 . 11427) (ACE.ANIMATE 11429 . 12643) (ACE.RUN 12645 . 14531) ( +ACEGETFRAME# 14533 . 14721) (ACERUNLOOP 14723 . 15234) (ACE.NEW.SEQUENCE 15236 . 17042) (ACE.NEW.FRAME + 17044 . 17853) (ACE.QUIT.ACE 17855 . 18494) (ACE.RESET.SEQ 18496 . 18848) (ACE.RUN.CURRENT.SEQ 18850 + . 19432) (ACE.DELAY 19434 . 21072) (ACE.DELAY.FRAME 21074 . 22544) (ACE.DELAY.SEQ 22546 . 23005) ( +ACE.DECREMENT.FRAME 23007 . 23324) (ACE.INCREMENT.FRAME 23326 . 25083) (ACE.DELETE.FRAME 25085 . 26954 +) (ACE.SET.DEVICE 26956 . 28256) (ACE.QUICKDRAW&UPD 28258 . 30527) (ACE.RECONSTRUCT.FRAME 30529 . +31887) (SUBLIST 31889 . 32040)) (32070 41108 (ACE.TRILLIUM 32080 . 36038) (ACE.TRILLIUM.LOOP 36040 . +37514) (ACE.RUN.TRILLIUM 37516 . 40110) (ACE.QUIT.TRILLIUM 40112 . 40326) (ACE.CREATE.EDITING.BORDER +40328 . 41106)) (41131 46621 (ACE.GET.SEQ.FILE 41141 . 43680) (ACE.PUT.SEQ.FILE 43682 . 46452) ( +ACE.GET.A.FILE.NAME 46454 . 46619)) (46645 69991 (ACE.ASKEM 46655 . 47960) (ACE.TELLEM 47962 . 48645) +(ACE.CONFIRMIT 48647 . 49654) (ACE.DEFINE.SEQ.WINDOW 49656 . 50754) (ACE.FIGURE.OUT.WINDOW 50756 . +51595) (ACE.RETURN.CLOSEST.VERTEX 51597 . 52368) (ACE.NEW.SEQ.ASST 52370 . 53315) ( +ACE.DELAY.FRAME.ASST 53317 . 53657) (ACE.SETUP.CW.CLIPPING.REGIONS 53659 . 57954) (ACE.CHECKSTUFF +57956 . 58409) (ACE.UPD.CONTROL.WINDOW 58411 . 60894) (ACE.UPD.CW.MULE 60896 . 63307) ( +ACE.UPD.CLEAR.SET.LINE 63309 . 63600) (ACE.CREATE.CONTROL.MENU 63602 . 66540) (ACE.SEQ.FETCH.WIDTH +66542 . 66912) (ACE.SEQ.FETCH.HEIGHT 66914 . 67288) (ACE.SET.SEQ.CLIP.REGION 67290 . 67696) ( +ACE.ASKEM2 67698 . 68307) (ACE.TELLEM2 68309 . 68593) (ACE.UPD.CONTROL.WINDOW2 68595 . 69989)) (78287 +81190 (ACE.COMPILE.FRAME 78297 . 79466) (ACE.EXTRACT 79468 . 80697) (ACESETTHRESHOLD 80699 . 81188)) ( +81226 87040 (ACE.MAX.REGIONS 81236 . 82654) (ACE.PICK.BEST.REGION 82656 . 86738) (ACE.COMPUTE.AREA +86740 . 87038)) (87081 92213 (ACE.SCAN.BITMAPS 87091 . 90057) (ACE.SCAN.PRIMBLOCKS 90059 . 91588) ( +ACE.FETCH.BLOCK 91590 . 92211)) (93893 101007 (ACE.EDIT 93903 . 95686) (ACE.EDIT.FRAME 95688 . 96959) +(ACE.EDIT.SETUP.EDIT.MENU 96961 . 98326) (ACEGETREGIONFACTOR 98328 . 98664) (ACEROTATEREGION 98666 . +99692) (ACESCALEREGION 99694 . 101005)) (101032 104846 (ACE.EDIT.LINEART 101042 . 102207) ( +ACE.EDIT.LINEART.DRAW 102209 . 103346) (ACE.EDIT.LINEART.ADJ 103348 . 104458) ( +ACE.EDIT.LINEART.TRACKLINE 104460 . 104844)) (104879 132278 (ACE.EDIT.MOVE.REGION 104889 . 106327) ( +ACE.EDIT.COMBINE.REGION 106329 . 106937) (ACE.EDIT.TEXT 106939 . 109812) (ACE.EDIT.TEXTURE.REGION +109814 . 111378) (ACE.EDIT.TEXTURE.AREA 111380 . 113636) (ACE.EDIT.PAINT 113638 . 125658) ( +ACE.FILLWITHTEXTURE 125660 . 126432) (ACE.SCANLINESEEDFILL 126434 . 128587) ( +ACE.EDIT.CREATE.MENU.TEXTURES 128589 . 129163) (ACE.EDIT.PUTDOWN.BITMAP 129165 . 130752) ( +ACE.EDIT.MOVE.REGION.ASST 130754 . 131231) (ACEEDITBM 131233 . 132123) (ACE.READBRUSHSHAPE 132125 . +132276)) (132314 145153 (ACE.EDIT.POINT&CODE 132324 . 133418) (ACE.GET.DEVICE.STATE 133420 . 134038) ( +ACE.GET.DEVICE.STATE&CURSOR 134040 . 134964) (ACE.EXTRACTBM 134966 . 135294) (ACE.EDIT.REDRAW.ABITMAP +135296 . 135493) (ACE.SCALE.BITMAP 135495 . 140087) (ACE.COMPILE.FRAME.ACE 140089 . 140697) ( +ACE.MM1201.INIT 140699 . 141950) (ACE.MM1201POLL 141952 . 142782) (ACE.MM1201.PROBLEM 142784 . 143126) + (ACE.EDIT.CLEAR.ALL.MENUS 143128 . 143539) (ROTATEBM 143541 . 145082) (RS232LOSTCHARFN 145087 . +145151))))) +STOP diff --git a/lispusers/ACE-APPLEDEMO.ACE b/lispusers/ACE-APPLEDEMO.ACE new file mode 100644 index 00000000..b121a692 --- /dev/null +++ b/lispusers/ACE-APPLEDEMO.ACE @@ -0,0 +1 @@ +(FILECREATED "11-Jan-85 14:00:00" {ICE}LISP>ACE>APPLE1.;4 206417 previous date: "10-Jan-85 15:25:13" {ICE}LISP>ACE>APPLE1.;1) (* Copyright (c) by NIL. All rights reserved.) (PRETTYCOMPRINT APPLE1COMS) (RPAQQ APPLE1COMS ((VARS ACE.SEQ.WIDTH ACE.SEQ.HEIGHT) (UGLYVARS ACE.CURRENT.SEQUENCE))) (RPAQQ ACE.SEQ.WIDTH 400) (RPAQQ ACE.SEQ.HEIGHT 225) (READVARS ACE.CURRENT.SEQUENCE) (((1000 (({(READBITMAP)(400 225 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@C@@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@C" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CN@@@AOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CN@@@OOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@MMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@MED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMEEGGEEEEEEGGGGGGGGGGGGGGOGGOGOGGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJJJJJJJJJJJJJJJJJJJJJJJJKNJKJOJJJNO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKJKKCJJJJJKKCKCCCCCKKKKCKOKKKOKKCFO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOMOMMMEEEEGMMMMOOOMMMMMOOOMOOOOOOMO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGGOEEEEEGGGGGGGGGGGGGGOGGOGGGGGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJJJKNJJJJJJJJJJJJJJJJJJOJJNJJOJJJMK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKKKKOJJJJJKKKCCCCCKKKKCOKKOKKOKCCFK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOOOOMEEEEEMMMMMOOMMMMMOMMOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGGOGEEEEEGGGGGGGGGGGGGGGOGGGGGGKG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJJJONJJJJJJJJJJJJJJJJJJJKNIOJJJJKOK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKKKOOKJJJJJKKCCCCCKKKKKKKKOMKKKCCMC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOOOOMEEEGGEMMMMMOMMMMMMMOOOOMOOOCO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOGOOGEEEEEGGGGGGGGGGGGGGGGGGGGGGOG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKNKNJJJJJJJJJJJJJJJJJJJOJJJJOJJJKLK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKOKOKCJJJJKKKCCCCCKKKKKOKKOKOKCCBOF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOMMMEEGGMMMMMMMMMMMMOMOOOOOOOOMN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGOGGGEEEEGGGGGGGGGGGGGGGOGGGGGGGF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANOJOJJJJJJJJJJJJJJJJJJKJJJNJJJJJKJN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AIOKOKCJJJJKKKCCCCCKKKKCOCKKKKKCCBKF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOMMMEEGGOMMMMMMMMMMOOOOOOOOOOOMN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOGGGEEEEEGGGGGGGGGGGGOGGGGGGGGGGD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJOJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMNL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OCKKCCJJJJJKKCCCCCKKKKKKKKKKKKCCGCD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOMMMMOGGGGMMMMMMMMMMMOOOOMOOOOOML@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@MGOGGGGEEEEEGGGGGGGGGGGGGGGGGGG@KGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NKOJJJJJJJJJJJJJJJJJJJNJJJJOJJJ@NJH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GCOKCCKJJJJKKCCCCKKKKKOKKOKOKK@@GCH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOMMMGGGGMMMMMMMMMMMOMOOMOOOLAMMH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGGOGGGEEEEEGGGGGGGGGGGGGOGGGGFBOGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ANKJJJJJJJJJJJJJJJJJKJJJJOJJJJJJJKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOKKCCJJJJJKCKCCCCKKKOCKKOKKKKCGCC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOMMMGGGGEMMMMOOMMOMMMMOOOOOMLMO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GGOGGGGEEEGGGGGGGGGGOOGGGGGGGGGGG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FKNJJJJJJJJJJJJJJJJKKNJOJJJJJJNKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GCOCCCJJJKKCKCCKKKKKKOKOKKKKKKCCN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOMMOGGGMMMMOOMMMOMMOOMOOOOMJLL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GGOGGGEGEGGGGGGGGGGOGGGGGGGGGAOAL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FKOJJJJJJJJJJJJJJJJOJJJJJJJJJ@JKL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GCOKCCKKJKKKCCCKKKKOKKKKKKKKJ@KCH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOMMMOGGEMMMMOOMMMMOOOOOOMONAEMH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGOGGGGEEGGGGGGGGGGGGGGOOGGGGCOG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CJJJJJJJJJJJJJJJJJJJJJJONJJJJKBK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOKKCCKKKKKCCKKKKKKCCCKOOKKKKBKO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOMMMMOOMMMMOOMMMMOOOOOOOMOOOMG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OGGGGGGGGGGGGGGGGGGGGGGGGGGGANN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJJJJJJJJJJJJJJJJJJJJJJJJJJJAIF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GKKKCCCCKKCCKKKKKKCCKKKKKKKJ@JL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOMMOOMMMMOOMMMMOOOMMOOOMMCLL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGOGGGGGGGGGGGGGGGGGOGGGGGGGMGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COJJJJJJJJJJJJJJJJJKOJJJJJJJJKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CKKKKCCCCCCCCCKKKKCKOKKKKKKKOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOOMOMMMMMMMMMMOOOOOOOOOOMMOGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGGGGGGGGGGGGGOGGGGGGGGGGEEO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJJJJJJJJJJJJJOJJJNJJJJJJJJKKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OKKKCCCCCCCCCKKKJKKKKKKKKJJKKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GMOOOOMMMOOMMMOGOOGEMMMMOOGGO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GGGGGGGGGGGGGGEEEEEOEEGGGEEEG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GJJJJJJJJJKKJJJNJJOKNJJJJJJKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCKKCCCCKKCKKJJJJJJNKKKKJJJKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CMOOOMOOGGOMMOOGGOOGGGOOGGGGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGGGGGGGEGGGGGMEEEEGOGEEEGOEL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CBJJJJJJJJJJKKNJNJJKJKNJJOOKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COKKCCCJJKCKKNOJJJJJJJKJJOOKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CMOOMMOOGGOMEEGEEEEEEOOGKGOGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGGGGGGEEEGGEEEEGEDEGGEMGGEG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CBJJJJJJJJJJJJJJJJHBJJKKNJJK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOKKCKKJJJJJJJJJJJH@JJKNJKJN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMMOMMMGGGGEEEEEMEDDEGGGOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMGGGGGEEEEMEEEDJMEDEEEEEOOD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOJJJJJKNNKJJJJK@@JJJJJNJKOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NKKCKKJJJJJJJJJ@@BJJJNJJKJL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OMOOMMGGGGGGGGE@@AGGGGGGOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@MGGGGGEEEEEEEEE@@AEEEEEEGOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@MJJJJJJKJJJJJJJL@BJNKJJJOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NKKCKKKNJJJJJJJJMJJKJKKKOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NMOOOMMEOGGEGEEEJFEGGGOMMN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NGGGGGEEEEEEEEEEEEEEEGOGNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GJJKJJJJNNJJJJJJJJJKJKNKOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FCKOKKKKKKKJJJJJJJNKKKOKOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GMOOMMMMMEEMMEEEGEEEOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGGGGGGGGEGGEEEEEEGOGGOGKH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CJJJJJJJJJJJJJJJJJJJJKNOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CCKKKKKKKKKKJJJJJOKKKKOKO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CMMOOMMMMMMMMMEGGGEMOOOKF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOGGGGGGGGGGGGEEEEOOGGOEOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOJJJKJJJJJJJJJJJJNJJJKNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CKKKKOKKKKKKKKKJJJKKKCOEN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMMMOMMMMMMMMMMMEEEMOOONL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGOOGGGGCGGGGGEEGGGONKL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AJJKNJJJJJAJJJJJJJJJKOJML@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOKKOKKKKJHGKCCKJKKKCOCGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOOMMMMMNCOOMOOMMMMOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OGGGGGGGOGGGGGGGGGGGONGH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJJJKHNHBJJJJJJJJJKOOKM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GKKKKHGDGKKKCCCCCKKOONG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GMOOMDE@OOOMMOOOMMOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GGGGG@OGGGGGOGGGGGGOOFG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CJJJJOJJJJJOOJJJJJKONNN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CKKKKKKKKKKGCCCCCCKOOKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AMOOOGOOOOEOCMOOOOOOOMF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOGGGGGGGGOLAOGGGOOGOGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NJJJJJJJKOH@FJJKONKNIL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GCCKKKKKKO@@AKCCOOKKKL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GMOOOOOOOL@@AMOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COGGGGGGO@@@@OGGGGGGCH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OJJJJJKN@@@@GNJJJJJO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COCCEGGH@@@@COCCCCFO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOMOOOOH@@@@AOMMONKN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOON@@@@@@GOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOH@@@@@@COOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 0 . 0))) (40 (({(READBITMAP)(16 14 "H@@@" "L@@@" "N@@@" "N@@@" "O@@@" "O@@@" "O@@@" "O@@@" "O@@@" "O@@@" "N@@@" "N@@@" "L@@@" "H@@@")} 0 . 93))) (40 (({(READBITMAP)(16 18 "L@@@" "O@@@" "IH@@" "OL@@" "ON@@" "ON@@" "OO@@" "OO@@" "OO@@" "OO@@" "OO@@" "OO@@" "ON@@" "ON@@" "OL@@" "OH@@" "O@@@" "N@@@")} 0 . 91))) (40 (({(READBITMAP)(16 18 "OL@@" "JO@@" "@AH@" "JKL@" "OON@" "OON@" "OOO@" "OOO@" "OOO@" "OOO@" "OOO@" "OOO@" "OON@" "OON@" "OOL@" "OOH@" "OO@@" "ON@@")} 0 . 91))) (40 (({(READBITMAP)(16 18 "OOL@" "JJO@" "@@AH" "JJKL" "OOON" "OOON" "OOOO" "OOOO" "OOOO" "OOOO" "OOOO" "OOOO" "OOON" "OOON" "OOOL" "OOOH" "OOO@" "OON@")} 0 . 91))) (40 (({(READBITMAP)(32 18 "OOOL@@@@" "JJJO@@@@" "@@@AH@@@" "JJJKL@@@" "OOOON@@@" "OOOON@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOON@@@" "OOOON@@@" "OOOOL@@@" "OOOOH@@@" "OOOO@@@@" "OOON@@@@")} 0 . 91))) (40 (({(READBITMAP)(32 18 "OOOOL@@@" "JJJJO@@@" "@@@@AH@@" "JJJJKL@@" "OOOOON@@" "OOOOON@@" "OOOOOO@@" "OOOOOO@@" "OOOOOO@@" "OOOOOO@@" "OOOOOO@@" "OOOOOO@@" "OOOOON@@" "OOOOON@@" "OOOOOL@@" "OOOOOH@@" "OOOOO@@@" "OOOON@@@")} 0 . 91))) (40 (({(READBITMAP)(16 18 "OL@@" "JO@@" "@AH@" "JKL@" "OON@" "OON@" "OOO@" "OOO@" "OOO@" "OOO@" "OOO@" "OOO@" "OON@" "OON@" "OOL@" "OOH@" "OO@@" "ON@@")} 16 . 91))) (40 (({(READBITMAP)(16 18 "OOL@" "JJO@" "@@AH" "JJKL" "OOON" "OOON" "OOOO" "OOOO" "OOOO" "OOOO" "OOOO" "OOOO" "OOON" "OOON" "OOOL" "OOOH" "OOO@" "OON@")} 16 . 91))) (40 (({(READBITMAP)(32 18 "OOOL@@@@" "JJJO@@@@" "@@@AH@@@" "JJJKL@@@" "OOOON@@@" "OOOON@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOON@@@" "OOOON@@@" "OOOOL@@@" "OOOOH@@@" "OOOO@@@@" "OOON@@@@")} 16 . 91))) (40 (({(READBITMAP)(48 18 "GOOOOOOOL@@@" "FJJJJJJJO@@@" "D@@@@@@@AH@@" "FJJJJJJJKL@@" "GOOOOOOOON@@" "GOOOOOOOON@@" "GOOOOOOOOO@@" "GOOOOOOOOO@@" "GOOOOOOOOO@@" "GOOOOOOOOO@@" "GOOOOOOOOO@@" "GOOOOOOOOO@@" "GOOOOOOOON@@" "GOOOOOOOON@@" "GOOOOOOOOL@@" "GOOOOOOOOH@@" "GOOOOOOOO@@@" "GOOOOOOON@@@")} 0 . 91))) (40 (({(READBITMAP)(48 18 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@D@@@@@@@AH@" "@FJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@")} 0 . 91))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@D@@@@@@@AH" "@@FJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 0 . 91))) (40 (({(READBITMAP)(64 18 "@@@GOOOOOOOL@@@@" "@@@FJJJJJJJO@@@@" "@@@D@@@@@@@AH@@@" "@@@FJJJJJJJKL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOOH@@@" "@@@GOOOOOOOO@@@@" "@@@GOOOOOOON@@@@")} 0 . 91))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@D@@@@@@@AH@@" "@@@@FJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 0 . 91))) (40 (({(READBITMAP)(48 18 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@D@@@@@@@AH@" "@FJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@")} 16 . 91))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@D@@@@@@@AH" "@@FJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 16 . 91))) (40 (({(READBITMAP)(64 18 "@@@GOOOOOOOL@@@@" "@@@FJJJJJJJO@@@@" "@@@D@@@@@@@AH@@@" "@@@FJJJJJJJKL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOOH@@@" "@@@GOOOOOOOO@@@@" "@@@GOOOOOOON@@@@")} 16 . 91))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@D@@@@@@@AH@@" "@@@@FJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 16 . 91))) (40 (({(READBITMAP)(48 18 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@D@@@@@@@AH@" "@FJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@")} 32 . 91))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@D@@@@@@@AH" "@@FJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 32 . 91))) (40 (({(READBITMAP)(64 18 "@@@GOOOOOOOL@@@@" "@@@FJJJJJJJO@@@@" "@@@D@@@@@@@AH@@@" "@@@FJJJJJJJKL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOOH@@@" "@@@GOOOOOOOO@@@@" "@@@GOOOOOOON@@@@")} 32 . 91))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@D@@@@@@@AH@@" "@@@@FJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 32 . 91))) (40 (({(READBITMAP)(48 18 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@D@@@@@@@AH@" "@FJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@")} 48 . 91))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@D@@@@@@@AH" "@@FJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 48 . 91))) (40 (({(READBITMAP)(64 18 "@@@GOOOOOOOL@@@@" "@@@FJJJJJJJO@@@@" "@@@D@@@@@@@AH@@@" "@@@FJJJJJJJKL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOOH@@@" "@@@GOOOOOOOO@@@@" "@@@GOOOOOOON@@@@")} 48 . 91))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@D@@@@@@@AH@@" "@@@@FJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 48 . 91))) (40 (({(READBITMAP)(48 18 "@OOOOOOOOH@@" "@MEEEEEEEN@@" "@H@@@@@@@C@@" "@MEEEEEEEGH@" "@OOOOOOOOOL@" "@OOOOOOOOOL@" "@OOOOOOOOON@" "@OOOOOOOOON@" "@OOOOOOOOON@" "@OOOOOOOOON@" "@OOOOOOOOON@" "@OOOOOOOOON@" "@OOOOOOOOOL@" "@OOOOOOOOOL@" "@OOOOOOOOOH@" "@OOOOOOOOO@@" "@OOOOOOOON@@" "@OOOOOOOOL@@")} 64 . 91))) (40 (({(READBITMAP)(48 18 "@@OOOOOOOOH@" "@@MEEEEEEEN@" "@@H@@@@@@@C@" "@@MEEEEEEEGH" "@@OOOOOOOOOL" "@@OOOOOOOOOL" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOOL" "@@OOOOOOOOOL" "@@OOOOOOOOOH" "@@OOOOOOOOO@" "@@OOOOOOOON@" "@@OOOOOOOOL@")} 64 . 91))) (40 (({(READBITMAP)(64 18 "@@@OOOOOOOOH@@AJ" "@@@MEEEEEEEN@@AK" "@@@H@@@@@@@C@@AO" "@@@MEEEEEEEGH@AO" "@@@OOOOOOOOOL@AJ" "@@@OOOOOOOOOL@AK" "@@@OOOOOOOOON@AM" "@@@OOOOOOOOON@AO" "@@@OOOOOOOOON@AJ" "@@@OOOOOOOOON@AK" "@@@OOOOOOOOON@AM" "@@@OOOOOOOOON@AO" "@@@OOOOOOOOOL@AK" "@@@OOOOOOOOOL@AK" "@@@OOOOOOOOOH@AO" "@@@OOOOOOOOO@@AO" "@@@OOOOOOOON@@AN" "@@@OOOOOOOOL@@AI")} 64 . 91))) (40 (({(READBITMAP)(64 18 "@@@@OOOOOOOOH@AJ" "@@@@MEEEEEEEN@AK" "@@@@H@@@@@@@C@AO" "@@@@MEEEEEEEGHAO" "@@@@OOOOOOOOOLAJ" "@@@@OOOOOOOOOLAK" "@@@@OOOOOOOOONAM" "@@@@OOOOOOOOONAO" "@@@@OOOOOOOOONAJ" "@@@@OOOOOOOOONAK" "@@@@OOOOOOOOONAM" "@@@@OOOOOOOOONAO" "@@@@OOOOOOOOOLAK" "@@@@OOOOOOOOOLAK" "@@@@OOOOOOOOOHAO" "@@@@OOOOOOOOO@AO" "@@@@OOOOOOOON@AN" "@@@@OOOOOOOOL@AI")} 64 . 91))) (40 (({(READBITMAP)(48 18 "@OOOOOOOOHAJ" "@MEEEEEEENAK" "@H@@@@@@@CAO" "@MEEEEEEEGIO" "@OOOOOOOOOMJ" "@OOOOOOOOOMK" "@OOOOOOOOOOM" "@OOOOOOOOOOO" "@OOOOOOOOOOJ" "@OOOOOOOOOOK" "@OOOOOOOOOOM" "@OOOOOOOOOOO" "@OOOOOOOOOMK" "@OOOOOOOOOMK" "@OOOOOOOOOIO" "@OOOOOOOOOAO" "@OOOOOOOONAN" "@OOOOOOOOLAI")} 80 . 91))) (40 (({(READBITMAP)(48 32 "@@@@@@@@@@MN" "@@@@@@@@@@MM" "@@@@@@@@GHAO" "@@@@@@@@GIIJ" "@@@@@@@@AIMN" "@@@@@@@@@AMO" "@@@@@@@@@@AM" "@@OOOOOOOOIJ" "@@MEEEEEEEOK" "@@H@@@@@@@BO" "@@MEEEEEEEFG" "@@OOOOOOOONF" "@@OOOOOOOONG" "@@OOOOOOOONC" "@@OOOOOOOONA" "@@OOOOOOOOND" "@@OOOOOOOONE" "@@OOOOOOOONC" "@@OOOOOOOONA" "@@OOOOOOOONG" "@@OOOOOOOONG" "@@OOOOOOOONG" "@@OOOOOOOONO" "@@OOOOOOOOON" "@@OOOOOOOOMI" "@@@@@@@@@@AO" "@@@@@@@@@@AO" "@@@@@@@@@AMJ" "@@@@@@@@@MLO" "@@@@@@@@AL@O" "@@@@@@@@AKHM" "@@@@@@@@@CHN")} 80 . 84))) (40 (({(READBITMAP)(32 4 "@@ALALAM" "@@ANANAM" "@@@G@NAN" "@@@G@NMN")} 96 . 115) ({(READBITMAP)(64 29 "@@@OOOOOOONBJJJJ" "@@@MEEEEEEDEJKKC" "@@@H@@@@@@ALMOMM" "@@@MEEEEEEDHOGGO" "@@@OOOOOOONEFJKN" "@@@OOOOOOONDGKKO" "@@@OOOOOOONBAOOO" "@@@OOOOOOON@IGGO" "@@@OOOOOOONEDJON" "@@@OOOOOOONDEKOO" "@@@OOOOOOONBAOOO" "@@@OOOOOOON@AGOO" "@@@OOOOOOONDBKNJ" "@@@OOOOOOONDCKOK" "@@@OOOOOOON@GOOM" "@@@OOOOOOON@GGOG" "@@@OOOOOOON@OJOJ" "@@@OOOOOOONEOKOK" "@@@@@@@@@@AOOOOM" "@@@@@@@@@@AOOOGG" "@@@@@@@@LAMJOJJJ" "@@@@@@@ALMLOCKKC" "@@@@@@@AML@OOOMM" "@@@@@@@@AKHMGOGG" "@@@@@@@@@CHNKOJJ" "@@@@@@@@AH@GCOKC" "@@@@@@@@CHCGOOOM" "@@@@@@@@GHCCGGOG" "@@@@@@@@G@@ANKJJ")} 80 . 80))) (40 (({(READBITMAP)(32 30 "OONEBJJJ" "EEDNDKKC" "@@AONOMM" "EEDJ@OGO" "OONEEFKN" "OONDDGKO" "OONB@AOO" "OON@HIGO" "OONEEDON" "OONDDEOO" "OONB@AOO" "OON@@IOO" "OONDAGNJ" "OOND@GOK" "OON@@GOM" "OON@HGOG" "OONAAJOJ" "OONFCKOK" "@@AOOOOM" "@@AOOOGG" "LAMJOJJJ" "LMLOCKKC" "ML@OOOMM" "AKHMGOGG" "@CHNKOJJ" "AH@GCOKC" "CHCGOOOM" "GHCCGGOG" "GC@ANKJJ" "@C@AOKKC")} 112 . 79) ({(READBITMAP)(48 22 "@@@@@@@FGIIJ" "@@@@@@@FAIMN" "@@@@@@@@@AMO" "@@@@@@@@@@AM" "@@@@OOOOOONE" "@@@@MEEEEEDN" "@@@@H@@@@@AO" "@@@@MEEEEEDJ" "@@@@OOOOOONE" "@@@@OOOOOOND" "@@@@OOOOOONB" "@@@@OOOOOON@" "@@@@OOOOOONE" "@@@@OOOOOOND" "@@@@OOOOOONB" "@@@@OOOOOON@" "@@@@OOOOOOND" "@@@@OOOOOOND" "@@@@OOOOOON@" "@@@@OOOOOON@" "@@@@OOOOOONA" "@@@@OOOOOONF")} 80 . 91))) (40 (({(READBITMAP)(48 45 "@@@@AH@MED@@" "@@CLCH@NJL@A" "@@CLCH@NJH@J" "@@AOALAMEDAE" "@@AOAHAMEDEE" "@@@@@HANJHJJ" "@@@A@BMNJLJK" "@@@@@@MMMGEM" "@@@@GHAOEEEG" "@@@FGIIJJJJJ" "@@@FAIMNJJKK" "@@@@@AMOMEMM" "@@@@@@AMEEGG" "@OOOOONEEBJJ" "@MEEEEDNOEKC" "@H@@@@AOMLMM" "@MEEEEDJB@OO" "@OOOOONEEEGN" "@OOOOONDDDGO" "@OOOOONB@@AO" "@OOOOON@HHIO" "@OOOOONEEEAN" "@OOOOONDDDAO" "@OOOOONB@@AO" "@OOOOON@@HAO" "@OOOOONDADBJ" "@OOOOOND@DCK" "@OOOOON@@@GM" "@OOOOON@HHOG" "@OOOOONA@DOJ" "@OOOOONF@GOK" "@@@@@@AOOOOM" "@@@@@@AOOOGG" "@@@@LAMJOJJJ" "@@@ALMLOCKKC" "@@@AML@OOOMM" "@@@AIKHMGOGG" "@@@@@CHNKOJJ" "@@@@@H@GCOKC" "@@@@@@@GOOOM" "@@@AL@@CGGOG" "@@@AOC@ANKJJ" "@@@@NCCAOKKC" "@@@ANCC@OOOM" "@@@AHC@@GGOG")} 96 . 77))) (40 (({(READBITMAP)(48 51 "@@@@F@@GEE@@" "@@@@F@@GJJ@@" "@@@@GH@OJJ@@" "@AO@GH@MMD@@" "@AOHGH@MED@@" "@AOLC@LNJL@A" "@@CLC@LNJH@J" "@@@DALMMEDAE" "@@@@@@AMEDEE" "@@C@@@ANJHJJ" "@@CA@BMNJLJK" "@@@@@@MMMGEM" "@@@@GHAOEEEG" "@@@FGIIJJJJJ" "@@@FAIMNJJKK" "@@@@@AMOMEMM" "@@@@@@AMEEGG" "@@OOOONEEEBJ" "@@MEEEDNONEC" "@@H@@@AOMONM" "@@MEEEDJBB@G" "@@OOOONEEEDB" "@@OOOONDDDDC" "@@OOOONB@@@A" "@@OOOON@HHHA" "@@OOOONEEE@@" "@@OOOONDDD@A" "@@OOOONB@@@A" "@@OOOON@@H@A" "@@OOOONDADAF" "@@OOOOND@D@G" "@@OOOON@@@@E" "@@OOOON@HH@G" "@@OOOONA@EAJ" "@@OOOONF@DCK" "@@@@@@AOOOOM" "@@@@@@AOOOGG" "@@@@LAMJOJJJ" "@@@ALMLOCKKC" "@@@AML@OOOMM" "@@@GIKHMGOGG" "@@@F@CHNKOJJ" "@@@@@H@GCOKC" "@@@@@@CGOOOM" "@@@CH@CCGGOG" "@@@CHC@ANKJJ" "@@@CHCFAOKKC" "@@@OHGF@OOOM" "@@@OHOL@GGOG" "@@@F@LN@FKNJ" "@@@F@@N@GCOC")} 96 . 75))) (40 (({(READBITMAP)(32 19 "JJJJJJJJ" "EDDKJJJJ" "HJHCMEEE" "GGGLEEEE" "OONIBJJJ" "DDD@FJJJ" "@@@@AEEE" "HHH@IEEE" "EE@ADJJJ" "DD@@EJJJ" "@@@@CEEE" "@H@@IEEE" "ADAEDJJJ" "@D@DOJJJ" "@@@BAMEE" "HH@HOGEE" "@E@EJJJJ" "@D@ECJJJ" "@@@AMMEE")} 128 . 90) ({(READBITMAP)(32 57 "@@@@F@@A" "@@@AN@@C" "@@@AN@@C" "@@AINAHG" "@@CILAHG" "@@OHLIHO" "@AOHN@@M" "@GOHFF@M" "@GL@@@LN" "@F@@@@LN" "@@@@ALMM" "@@@@@@AM" "@@C@@@AN" "@CCA@BMN" "@G@@@@MM" "@G@@GHAO" "@C@FGIIJ" "@@@FAIMN" "@@@@@AMO" "@@@@@@AM" "@@@@@@AJ" "@@@OOOND" "@@@MEEDJ" "@@@H@@AO" "@@@MEEDO" "@@@OOOND" "@@@OOONB" "@@@OOON@" "@@@OOONE" "@@@OOOND" "@@@OOONB" "@@@OOON@" "@@@OOOND" "@@@OOOND" "@@@OOON@" "@@@OOON@" "@@@OOONA" "@@@OOONF" "@@@OOON@" "@@@@@@AO" "@@@AHAMJ" "@@@AHMLO" "@@@@AL@O" "@@@GIKHM" "@@GNCCHN" "@@GHCH@G" "@@G@F@CG" "@@@BFFCC" "@@@F@F@A" "@@@F@@FA" "@@COHDF@" "@@COHOL@" "@@GN@OB@" "@@GNAOB@" "@@AHAL@@" "@@@@@L@@" "@@@@@L@@")} 96 . 72))) (40 (({(READBITMAP)(16 18 "BJJJ" "DJJJ" "NEEE" "BMEE" "EFJJ" "EFJJ" "BKEE" "HKEE" "EDJJ" "DDJJ" "BKEE" "HKEE" "EFJJ" "LFJJ" "BEEE" "HGEE" "DJJJ" "OJJJ")} 144 . 91) ({(READBITMAP)(48 65 "@@@@F@@@NJJJ" "@@@@F@@@OJJJ" "@@@AN@LAMMEE" "@@@AN@LAOEEH" "@@@ANANANJJ@" "@@AINANCJJL@" "@@GIH@FCME@@" "@@GIH@DGEE@@" "@@OHDC@GJJ@@" "@AOH@C@OJJ@@" "@AN@@@@MMD@@" "@GN@AN@MED@@" "@GH@AHLNJL@A" "@F@@AHLNJH@J" "@@@@ALMMEDAE" "@@@CH@AMEDEE" "@@COH@ANJHJJ" "@@COHBMNJLJK" "@@@@@@MMMGEM" "@@@@GHAOEEEG" "@@@FGIIJJJJJ" "CLANAIMNJJKK" "CLAL@AMOMEMM" "ALAH@@AMEEGG" "@L@@OONEEEEE" "@@@@MEDNONNF" "@@@@H@AOMOMM" "@@@@MEDJBBBJ" "@@@@OONEEEDA" "@@@@OONDDDD@" "@@@@OONB@@@@" "@@@@OON@HHH@" "@@@@OONEEE@A" "@@@@OONDDD@@" "@@@@OONB@@@@" "@@@@OON@@H@@" "@@@@OONDADAE" "@@@@OOND@D@D" "@@@@OON@@@@B" "@@@@OON@HH@H" "@@@@OONA@E@E" "@@@@OONF@D@D" "@@@@@@AOOOOM" "@@@@@@AOOOGG" "@@@@@AMJOJJJ" "@@AH@MLOCKKC" "@@AHAL@OOOMM" "@@@@AKHMGOGG" "@@GHCCHNKOJJ" "@@OHCH@GCOKC" "@OOFF@CGOOOM" "@OLFFFCCGGOG" "@AH@@F@ANKJJ" "@@@@@@FAOKKC" "@@B@@@F@OOOM" "@@B@@@D@GGOG" "@@FAHCN@FKNJ" "@ANAICN@GCOC" "@AN@A@L@GOOO" "@AO@ALL@GGOG" "@AOHAL@@FKOJ" "@COHCL@@GCOK" "@CMHCL@@COOM" "@CL@AL@@CGOG" "@@@@AH@@CJJJ")} 96 . 68))) (40 (({(READBITMAP)(16 2 "@@@A" "@@@A")} 80 . 80) ({(READBITMAP)(16 18 "EBJJ" "ODJJ" "MFEE" "@BME" "EEFJ" "EEFJ" "BJKE" "HJKE" "EEDJ" "DEDJ" "BJKE" "HJKE" "EEFJ" "LEFJ" "BBME" "HHEE" "EDJJ" "LFJJ")} 144 . 91) ({(READBITMAP)(32 75 "@@@@@@F@" "@@@@@@GH" "@@@@@@OH" "@@@@F@OH" "@@@AN@C@" "@@@CN@C@" "@@@CN@@@" "@@@AN@DA" "@ANAH@@A" "@CNAH@@A" "@GNA@@LC" "@GNA@@LC" "@GH@@@LG" "@OH@D@LG" "AOH@FCLO" "AO@@F@@M" "AN@@GN@M" "AL@@GH@N" "@@@@GH@N" "@@ANALMM" "@@AOH@AM" "@@COH@AN" "@@COHBMN" "@@@@@@MM" "@@@@GHAO" "@@@FGIIJ" "CLANAIMN" "CLAL@AMO" "ALAH@@AM" "@L@@@ONE" "@@@@@MDN" "@@@@@HAO" "@@@@@MDJ" "@@@@@ONE" "@@@@@OND" "@@@@@ONB" "@@@@@ON@" "@@@@@ONE" "@@@@@OND" "@@@@@ONB" "@@@@@ON@" "@@@@@OND" "@@@@@OND" "@@@@@ON@" "@@@@@ON@" "@@@@@ONA" "@@@@@ONF" "@@@@@@AO" "@@@@@@AO" "@@@@@AMJ" "@@AH@MLO" "@@AHML@O" "@@@CMKHM" "@O@GCCHN" "@O@FCH@G" "AOANF@CG" "OOMNFFCC" "OMH@@F@A" "N@@@@@@A" "@@B@@@@@" "@@@@@@@@" "@@@AHBFL" "@A@AKBFL" "@AL@O@N@" "@AL@N@N@" "AOL@LCL@" "AOL@LCL@" "AOL@CKL@" "AOL@COH@" "AOHFCH@@" "@OHFGL@@" "@@@NGL@@" "@@@NGL@@" "@@@@CL@@" "@@@@CH@@")} 96 . 63))) (40 (({(READBITMAP)(32 9 "@@@@B@AN" "@@@@@@AL" "@@@G@@AH" "@@@OH@@@" "@@@OH@@@" "@@@GH@@@" "@@@GN@@@" "@@@AN@@@" "@@@@F@@@")} 80 . 103) ({(READBITMAP)(48 29 "@@@@@I@GCCHN" "@@@@@@@FCH@G" "@@@@F@ANF@CG" "@@@AN@ANFFCC" "@@@AL@@@@F@A" "@@COL@@@@@@A" "@@CO@@B@@@@@" "@AOL@@@@@@@@" "@CO@@@@AHBBL" "@CK@@A@AKBBO" "@@@@@@D@O@NC" "@@@@@@@@N@NC" "@@@@@@@@@C@C" "@@@@@@@@@C@C" "@@@@AN@@@KL@" "@@@@AO@@@GH@" "@@@@GO@F@GL@" "@@@ANO@F@GL@" "@@@AOH@N@GH@" "@@@AOH@N@GH@" "@@@AOH@GH@@@" "@@@@@@@GJ@@@" "@@@@@@@GL@@@" "@@@@@@@GL@@@" "@@@@@@@OL@@@" "@@@@@@@OL@@@" "@@@@@@@OL@@@" "@@@@@@@GH@@@" "@@@@@@@G@@@@")} 80 . 56) ({(READBITMAP)(32 23 "@@@@@AL@" "@@@@@AL@" "@@@@N@OH" "@@@@N@OH" "@@@AO@GH" "@@@AO@GH" "@@@AO@AH" "@@@AO@H@" "@@@AN@H@" "@@@AN@@@" "@F@CN@C@" "GN@@@@@@" "GO@@@@DA" "GO@@@@@A" "GH@@@@@A" "GN@@@@LC" "GN@@@@LC" "GL@@@@LG" "GL@@D@LG" "GL@@FCLO" "GL@@F@@M" "G@@@GN@M" "AH@@GH@N")} 96 . 120) ({(READBITMAP)(48 18 "@@NEEEEEEEBJ" "@@LNONNFOODJ" "@@IOMOMMMEFE" "@@LJBBBJ@@BM" "@@NEEEDAEEEF" "@@NDDDD@EEEF" "@@NB@@@@BJJK" "@@N@HHH@HJJK" "@@NEEE@AEEED" "@@NDDD@@DEED" "@@NB@@@@BJJK" "@@N@@H@@HJJK" "@@NDADAEEEEF" "@@ND@D@DLEEF" "@@N@@@@BBBJM" "@@N@HH@HHHJE" "@@NA@E@EEEDJ" "@@NF@D@DLEFJ")} 112 . 91))) (40 (({(READBITMAP)(32 18 "EEEBJJJJ" "OOODJKKC" "MEEFEGMM" "@@@BMGGG" "EEEEFJJJ" "EEEEFKKK" "BJJJKEMM" "HJJJKEGG" "EEEEDJJJ" "DEEEDJKK" "BJJJIGEM" "HJJJKEGG" "EEEEFJJJ" "LEEEFKKK" "BBJJOGMM" "HHJJEEGG" "EEEDJJJJ" "LEEFJKKK")} 144 . 91) ({(READBITMAP)(64 98 "@@@@@@@@@@@C@@@@" "@@@@@@@@@@@CH@@@" "@@@@@@@@@@AOH@@@" "@@@@@@@@@@AOH@@@" "@@@@@@@@@@AOHAL@" "@@@@@@@@@@AOHAL@" "@@@@@@@@@@AOJ@OH" "@@@@@@@@@@@OH@OH" "@@@@@@@@@@@C@@GH" "@@@@@@@@@@@C@@GH" "@@@@@@@@@@@C@@AH" "@@@@@@@@@@@@@@H@" "@@@@@@@@@@@@@@H@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@C@" "@@@@@@@AL@@@@@@@" "@@@@@@@GN@@AH@DA" "@@@@@@@GN@@AH@@A" "@@@@@@@GN@@AO@@A" "@@@@@@@GOALAO@LC" "@@@@@@@GOAL@C@LC" "@@@@@@@GOHN@@@LG" "@@@@@@@AOHO@D@LG" "@@@@@@@AOHGHFCLO" "@@@@@@@@GHGH@@@M" "@@@@@@@@G@@@AN@M" "@@@@@@@@AH@@DH@N" "@@@@@@@@@@@@D@@N" "@@@@@@@@@@ANA@MM" "@@@@@@@@@@CN@@AM" "@@@@@@@@@AON@@AN" "@@@@@@@@@AOOHBMN" "@@@@@@@@@@@@@@MM" "@@@@@@@@@@@@GHAO" "@@@@@@@@@@@@GIIJ" "@@@@@@@@B@@@AIMN" "@@@@@@@@@@A@@AMO" "@@@@@@@@@GO@@@AM" "@@@@@@@@@GN@@@AE" "@@@@@@@@@G@@@@AF" "@@@@@AO@@G@@@@AG" "@@@@@AO@@@@@@@AB" "@@@@@AO@@@@@@@AE" "@@@@@AO@@@@@@@AD" "@@@@@AOH@@@@@@AB" "@@@@@@OH@@@@@@A@" "@@@@@@CH@@@@@@AE" "@@@@@@@@@@@@@@AD" "@@@@@@@@@@@@@@AB" "@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@AD" "@@@@@@@@@@@@@@AD" "@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@AA" "@@@@@@@@@@@@@@AF" "@@@@@@@@@@@@@@AO" "@@@@@@@@@@@@@@AO" "@@@@@@@@@@@@@AMJ" "@@@@@@@@@@AH@MLO" "@@@@@@@@@@AHML@O" "@@@@@@@@@@@CMKHM" "@@@@@@@@@A@GCCHN" "@@@@@@@@@@@FCH@G" "@@@@@@@@@@ANF@CG" "@@@@@@@A@@ANFFCC" "@@@@@@@@@@@@@F@A" "@@@@@@C@@L@@@@@A" "@@@@@@C@@LB@@@@@" "@@@@@AOL@@@@@@@@" "@@@@AOO@@@@AHBBL" "@@@AOOK@@A@AKBBO" "@@@AOL@@@@D@O@NC" "@@@AK@@@@@@@N@NA" "@@@CN@@@@@@@@B@A" "@@@CN@@@@@@@@@@@" "@@@@@@@@@@@@@H@@" "@@@@@@@@@@@@@@@L" "@@@@@@@@@@C@@@DN" "@@@@@@@CK@C@@@DF" "@@@@@@@CK@@L@@HF" "@@@@@@@CG@@N@GH@" "@@@@@@@GOH@F@CH@" "@@@@@@GON@@F@CL@" "@@@@@@GOH@@G@GL@" "@@@@@@GOH@@GHGL@" "@@@@@@GMH@@OIOL@" "@@@@@@OOH@@OIO@@" "@@@@@@OO@@@OH@@@" "@@@@@@@@@@@GH@@@" "@@@@@@@@@@AOH@@@" "@@@@@@@@@@CNL@@@" "@@@@@@@@@@GOL@@@" "@@@@@@@@@@GOH@@@" "@@@@@@@@@@GO@@@@" "@@@@@@@@@@GL@@@@" "@@@@@@@@@@AH@@@@" "@@@@@@@@@@AH@@@@")} 64 . 49))) (40 (({(READBITMAP)(48 18 "EEEEEEEEBJJJ" "GNNFOOOODKKC" "EOMMMEEEFGMM" "JBBJ@@@@BOGG" "EEDAEEEEEFJJ" "DDD@EEEEEGKK" "@@@@BJJJJKMM" "HHH@HJJJJKGG" "EE@AEEEEEDJJ" "DD@@DEEEEDKK" "@@@@BJJJHIEM" "@H@@HJJJJKGG" "ADAEEEEEEFJJ" "@D@DLEEEEGKK" "@@@BBBJJHOMM" "HH@HHHJJJEGG" "@E@EEEEEDJJJ" "@D@DLEEEFKKK")} 128 . 91) ({(READBITMAP)(64 89 "@@@@@@@A@@@@@@@@" "@@@@@@@@@@@AH@DA" "@@@@@@N@@@@AH@@A" "@@@@@GOL@@@AO@@A" "@@@@@GOL@ALAO@LC" "@@@@AOOH@AL@C@LC" "@@@@AOOH@@N@@@LG" "@@@@@CON@@O@D@LG" "@@@@@CON@@GHFCLO" "@@@@@@GN@@GH@@@M" "@@@@@@GO@@@@AN@M" "@@@@@@GO@@@@DH@N" "@@@@@@GO@@@@D@@N" "@@@@@@@@@@ANA@MM" "@@@@@@@@@@@N@@AM" "@@@@@@@@@@@N@@AN" "@@@@@@@@AHAOHBMN" "@@@@@@@@AI@@@@MM" "@@@@@@@@AH@@GHAO" "@@@@@@@@@@@@GIIJ" "@@@@@@@@B@@@AIMN" "@@@@@@@@@@@@@AMO" "@@@@@@@@GG@AN@AM" "@@@@@@@@GG@AN@AJ" "@@@@@@@ANG@@@@AK" "@@@@@AAAOG@@@LAO" "@@@@@@ACO@@@@LAO" "@@@@@@@CN@@@@@AJ" "@@@@@@@CN@@@@@AK" "@@@@L@@CH@@@@@AM" "@@@GL@@@@@@@@@AO" "@@@GL@@@@@@@@@AJ" "@@@CN@@@@@@@@@AK" "@@@CN@@@@@@@@@AM" "@@@AN@@@@@@@@@AO" "@@@@OH@@@@@@@@AK" "@@@@OH@@@@@@@@AK" "@@@@OH@@@@@@@@AO" "@@@@CH@@@@@@@@AO" "@@@@@@@@@@@@@@AN" "@@@@@@@@@@@@@@AI" "@@@@@@@@@@@@@@AO" "@@@@@@@@@@@@@@AO" "@@@@@@@@@@@@@AMJ" "@@@@@@@@@@AH@MLO" "@@@@@@@@@@AHML@O" "@@@@@@@@@@@@MKHM" "@@@@@@@@@A@@CCHN" "@@@@@@@@@@@@CH@G" "@@@@@@@@@@ABF@CG" "@@@@@@@@@@ABFFCC" "@@@@@@@@@@@@@F@A" "@@@@@@C@@O@@@@@A" "@@@@@@@@@OB@@@@@" "@@@@@AH@@@L@@@@@" "@@@@@CH@@ALAHBBL" "@@@AB@C@@AHAKBBO" "@@@CL@@@@CD@O@NC" "@@COH@@@@C@CN@NA" "@CGON@@@@@@G@B@A" "@GGKL@@@@@@G@@@@" "@GO@@@@@@@@@@H@@" "@GN@@@@@@@@@@@@L" "@GH@@@@@@@B@@@DN" "@OH@@@@CC@C@@@DN" "@N@@@@@@A@@@@@@F" "@@@@@@@@@@@B@G@N" "@@@@@@@@@H@B@@@L" "@@@@@@FDB@@B@@AL" "@@@@@@GL@@@C@DAH" "@@@@@@GL@@@CHD@@" "@@@@@@GLH@@CIL@@" "@@@@@@OOH@@CIN@@" "@@@@@COO@@@B@@@L" "@@@@@GON@@@CH@@L" "@@@@AOON@@@OH@AL" "@@@AAOL@@@ANDCOL" "@@@@@MOH@@@ODCON" "@@@@@OOL@@@O@CON" "@@@@@OOL@@AO@COL" "@@@@@CCH@@GO@@C@" "@@@@@@@@@@AO@@@@" "@@@@@@@@@@CN@@@@" "@@@@@@@@@CON@@@@" "@@@@@@@@@CON@@@@" "@@@@@@@@@COL@@@@" "@@@@@@@@@CO@@@@@" "@@@@@@@@@CL@@@@@" "@@@@@@@@@CL@@@@@")} 64 . 43))) (40 (({(READBITMAP)(16 3 "@@FO" "@@FO" "@@FO")} 96 . 137) ({(READBITMAP)(48 18 "JEEEEEEEEBJJ" "JFNFOOOOOEKC" "MGMMMEEEEDMM" "GJBJ@@@@@@OG" "JEDAEEEEEEFJ" "KDD@EEEEEDGK" "O@@@BJJJJJCM" "GHH@HJJJJJIG" "JE@AEEEEEEDJ" "KD@@DEEEEEEK" "O@@@BJJJHHKM" "OH@@HJJJJJIG" "NDAEEEEEEEFJ" "OD@DLEEEEDGK" "O@@BBBJJHHEM" "GH@HHHJJJJGG" "OE@EEEEEEDJJ" "OD@DLEEEEGKK")} 128 . 91) ({(READBITMAP)(48 29 "@@@@@@@@@@@@" "@@@@@@@H@@@@" "@@@@@ADIN@@@" "@@@@@G@IL@@@" "@@@@@GH@@@@@" "@@@@AOL@@@@@" "@@@AIOH@@@@@" "@@@CKOH@@@@C" "@@@CON@@@@@@" "@@@COH@@@@@@" "@@@GO@@@@@@@" "@@@GF@@@@@@@" "@@@ON@@@@@DL" "@@@OH@@@@@DL" "@@@G@@@@@@DH" "@@@G@@@@@@L@" "@@@F@@@@@CL@" "@@@@@@@@@GLH" "@@@@@@@@AOLH" "@@@@@@@AAOL@" "@@@@@@@@@MOH" "@@@@@@@@@OOL" "@@@@@@@@@OOL" "@@@@@@@@AOCH" "@@@@@@@COL@@" "@@@@@@@COOL@" "@@@@@@@@GOL@" "@@@@@@@@GOH@" "@@@@@@@@G@@@")} 48 . 46) ({(READBITMAP)(48 31 "@@F@@@DNCJJJ" "C@G@@@DNAOKK" "A@@@@@@FAMOM" "@@@B@G@N@OGG" "@H@@@@@L@NJJ" "B@@@@@AL@GKK" "@@@A@D@@@GOO" "@@@AHD@@@CGO" "H@@AIL@@@COJ" "H@@AIN@@@CKK" "@@@@@@@@@AMO" "@@@CH@@@@AOG" "@@@AH@@@@@NJ" "@F@@DCHD@@OK" "@F@CDCHF@@GM" "@@@C@C@F@@GG" "@@@C@CAL@@GJ" "@@FC@@C@@@CC" "@@@C@@@L@@CM" "@@BB@@AO@@CG" "@COB@@AO@@CB" "@CON@@GOH@CO" "@COO@@GGH@CM" "@COC@@OKH@CG" "@COC@@OK@@CB" "@COF@@GH@@AO" "@GLN@@F@@@AM" "@GLL@@@@@@AM" "@COL@@@@@@AO" "@COO@@@@@@@N" "@COO@@@@@@@O")} 96 . 38) ({(READBITMAP)(64 37 "@@@@@@@@@@@AH@@A" "@@@@@@@D@@@AO@@A" "@@@@@@BD@ALAO@LC" "@@@@AOJ@@AL@C@LC" "@@@@GOKH@@N@@@LG" "@@@COOOK@@O@D@LG" "@@@COOOC@@GHFCLO" "@@@@GOON@@GH@@@M" "@@@AOOOOL@@@AN@M" "@@@COOOOL@@@DH@N" "@@@CNLGOL@@@@@@N" "@@@@@@@@@@ANA@MM" "@@@@@@@@@@@N@@AM" "@@@@@@@@@@@N@@AN" "@@@@@@@@AHAOHBMN" "@@@@@@@@AI@@@@MM" "@@@@@@@@AH@@@HAO" "@@@@@@@@@@@@DIIJ" "@@@@@@@@B@@@AIMN" "@@@@@@@@@@@@@AMO" "@@@@@@@@GG@AN@AM" "@@@@@@@@DG@AN@AJ" "@@@@@@@M@G@C@@AK" "@@@@@ACLCG@C@LAO" "@@@@@@C@G@@@@LAO" "@@@@@@G@N@F@@@AJ" "@@@@@@NCN@F@@@AK" "@@@@L@LCH@@@@@AM" "@@@D@@@@@@L@@@AO" "@@@G@@@@@@L@@@AJ" "@@@@@@@@@@@@@@AK" "@@GL@@@@@@@@@@AM" "@@OMH@@@@@@@@@AO" "@@OOIH@@@@@@@@AK" "@@OON@@@@@@@@@AK" "@@OLN@@@@@@@@@AO" "@@CLB@@@@@@@@@AO")} 64 . 93))) (40 (({(READBITMAP)(32 5 "@@@@@@LF" "@@@@@@@F" "@@@@@@@@" "H@@AN@@@" "IH@AN@@@")} 80 . 96) ({(READBITMAP)(32 12 "@@@@@@@D" "@@@@@@@@" "@@@@@@@@" "@@@@F@C@" "@@@@OOO@" "@@@AOOON" "@@AIOOOO" "@@AIOOOO" "@@AKNOGO" "@@COFO@@" "@@OONMH@" "@@OONMH@")} 64 . 116) ({(READBITMAP)(48 18 "JJEEEEEEEEBJ" "JKFFOOOOONEC" "MOEMMEEEEGNM" "GGJJ@@@@@B@O" "JJDAEEEEEEEF" "KKD@EEEEEDDG" "OO@@BJJJJJBC" "GGH@HJJJJJHI" "JJ@AEEEEEEED" "KK@@DEEEEEDE" "OO@@BJJJHHJC" "OG@@HJJJJJHI" "NKAEEEEEEEEF" "OK@DLEEEEDDG" "OO@BBBJJHHBE" "GG@HHHJJJJHG" "OJ@EEEEEEEDJ" "OK@DLEEEEDGK")} 128 . 91) ({(READBITMAP)(32 21 "@@@@@@@I" "@@@@@@@I" "@@@@@GH@" "@@@@@O@@" "@@@AHO@@" "@@@@KOH@" "@@@@LN@@" "@@@@LH@@" "@@@LOH@@" "@@@OGH@@" "@@@ON@@@" "@@GOH@@@" "@@OO@@@@" "@@OO@@@@" "@GMN@@@@" "@GOH@@@@" "@AK@@@@@" "@CL@@@@A" "@GL@@@@@" "@G@@@@@@" "@F@@@@@@")} 48 . 52) ({(READBITMAP)(16 51 "FBDO" "@@@M" "@D@M" "D@@N" "@@@N" "A@EM" "@@AM" "@@AN" "H@MN" "@@MM" "@@AO" "D@IJ" "@@MN" "@@MO" "L@AM" "L@AJ" "@@AK" "FLAO" "FLAO" "@@AJ" "@@AK" "@@AM" "@@AO" "@@AJ" "@@AK" "@@AM" "@@AO" "@@AK" "@@AK" "@@AO" "@@AO" "@@AN" "@@AI" "@@AO" "@@AO" "@AMJ" "@ALO" "M@@O" "MAHM" "C@HN" "B@@G" "F@CG" "F@AC" "@@@A" "@@@A" "@@@@" "@@@@" "HB@L" "KBBO" "O@BC" "N@@A")} 112 . 73) ({(READBITMAP)(80 33 "H@@@@@@L@@@AHD@@@CGO" "@@@@@@@HH@@AIL@@@COJ" "@@@@@@@@H@@AIN@@@CKK" "@@@@@@@@@@@@@@@@@AMO" "@@@@@F@H@@@CH@@@@AOG" "@@@@AO@H@@@AH@@@@@NJ" "@@@AAL@@@F@@DCHD@@OK" "@@@@@@@H@F@CDC@F@@GM" "@@@@@CIL@@@C@C@F@@GG" "@@@@@COL@@@C@BAL@@GJ" "@@@@ACCH@@@@@@C@@@CC" "@@@COL@@@@@@@@@L@@CM" "@@@COOL@@@@@@@AO@@CG" "@@@@GOL@@BA@@@@G@@CB" "@@ALGOH@@BAN@@@GH@CO" "@@AMOH@@@@AO@@GGH@CM" "@@AKOL@@@@AC@@OKH@CG" "@@@OOL@@@BAC@@OK@@CB" "@@@OOL@@@CCF@@GMH@AO" "@@@COH@@@G@N@@GOH@AM" "@@@CH@@@@GLL@@GON@AM" "@@@@@@@@@COL@@GNN@AO" "@@@@@@@@@COO@@GLN@@N" "@@@@@@@@@COO@@GOL@@O" "@@@@@@@@@OH@@@AOH@@M" "@@@@@@@@@OOFL@@O@@@M" "@@@@@@@@@AONL@@@@@@N" "@@@@@@@@@CKN@@@@@@@N" "@@@@@@@@@CKN@@@@@@@N" "@@@@@@@@@CKF@@@@@@@G" "@@@@@@@@@COF@@@@@@@F" "@@@@@@@@@@OOL@@@@@@G" "@@@@@@@@@@MOL@@@@@@C")} 64 . 29))) (40 (({(READBITMAP)(32 6 "@CON@AOO" "@GOOL@AO" "@GOOL@@@" "@CGH@@@@" "@@FLNAH@" "@@CLNAH@")} 96 . 26) ({(READBITMAP)(64 18 "JJJEEEEEEEEBJJJJ" "JKKNOOOOONNMKCCC" "MOMEMEEEEGMNMMOO" "GGGB@@@@@BB@OGGG" "JJKAEEEEEEEEFJJJ" "KKK@EEEEEDDDOCCC" "OOO@BJJJJJBBCMMO" "GGG@HJJJJJHHIGGG" "JJOAEEEEEEEEDJJJ" "KKO@DEEEEEDDMCCC" "OOO@BJJJHHJBCMMM" "OGO@HJJJJJHHIGGG" "NKNEEEEEEEEEFJJJ" "OKODLEEEEDDDOCCC" "OOOBBBJJHHBBEMMM" "GGOHHHJJJJHHGGGG" "OJOEEEEEEEEDJJJJ" "OKODLEEEEDDGCCCC")} 128 . 91) ({(READBITMAP)(32 33 "@D@L@GOO" "HD@@@CGO" "IL@@@COJ" "IN@@@CKK" "@@@@@AMO" "H@@@@AOG" "H@@C@@NJ" "DCHG@@OK" "DC@F@@GM" "@C@F@@GG" "@B@L@@GJ" "@@@@@@CC" "@@@L@@CM" "@@AC@@CG" "@@@C@@CB" "@@@CH@CO" "@@ACH@CM" "@@CAH@CG" "@@NA@@CB" "@@FAH@AO" "@@@AH@AM" "@@@CN@AM" "@@FFN@AO" "@@GLN@@N" "@@GOL@@O" "@@AOK@@M" "L@@OK@@M" "L@COO@@N" "@@COO@@N" "@@CON@@N" "@AOOH@@G" "@AOOH@@F" "L@AOH@@G")} 112 . 30) ({(READBITMAP)(48 24 "@@@@@F@@@@@C" "@@@@AO@@@@@A" "@@@AAL@@@F@@" "@@@@@@@H@F@C" "@@@@@A@L@@@C" "@@@@@CIL@@@C" "@@@@@@CH@@@@" "@@@CH@@@@@@@" "@@@CH@L@@@@@" "@@@@GIL@@BA@" "@@ALGOH@@B@H" "@@AMOH@@@@@G" "@@AKOL@@@@@C" "@@COOL@@@B@C" "@@COOL@@@B@@" "@@CCOH@@@@@@" "@@CCHL@@@@@@" "@@C@GL@@@@A@" "@@COGH@@@@GI" "@@COOH@@@BGO" "@@COO@@@@OH@" "@COOH@@@@OOF" "@COIH@@@@AON" "@@AIH@@@@CKN")} 64 . 34) ({(READBITMAP)(80 57 "@@@@@@@D@@@AO@LCJJL@" "@@@@@@@@@@@@C@LCME@@" "@@@@@@@@@@@@@@LGEE@@" "@@@@@@@@@L@@D@LGJJ@@" "@@@@@@@@AL@@FBDOJJ@@" "@@@@@@@HAL@@@@@MMD@@" "@@A@O@CHEL@@@D@MED@@" "@@A@ODOBAOH@D@@NJL@A" "@@AKOGO@@OH@@@@NJH@J" "@@COGN@@@OHBA@EMEDAE" "@@OOONL@@AHB@@AMEDEE" "@MOOOOL@@AHB@@ANJHJJ" "@MOKOK@@AH@CH@MNJLJK" "@OOOOH@@AI@@@@MMMGEM" "@OOOOH@@AH@@@@AOEEEG" "@COO@@@@@@@@D@IJJJJJ" "@@G@@@@@B@C@@@MNJJKK" "@@@@@@@@AIKH@@MOMEMM" "@@@@@@@@GKKIL@AMEEGG" "@@@@@@@@DAHAH@AJJJJE" "@@@@@@@L@@@C@@AKJKKN" "@@@@@ACLA@@C@DAOMOME" "@@@@@@C@@@@@@DAOGGGB" "@@@@@@D@D@F@@@AJJJKA" "@@@@@@HAN@F@@LAKKKK@" "@@@@L@HCH@@@@LAMOOO@" "@@@D@@CH@@L@@LAOGGG@" "@@@G@@CH@@NF@LAJJJOA" "@@@@AIIH@@FF@LAKKKO@" "@@A@AOIL@@N@@@AMOOO@" "@@A@ANAMN@L@@@AOOGO@" "@@N@A@@CNAL@@@AKNKNE" "@@NB@@@C@AH@@@AKOKOD" "@GOLN@@G@@@@@@AOOOOB" "AOKLB@@G@@@@@@AOGGOH" "AOON@@@@@@@@@@ANOJOE" "AOOO@@@@@@@@@@AIOKOD" "AOOO@@@@@@@@@@AOOOOM" "@NGO@@@@@@@@@@AOOOGG" "@@@@@@@@@@@@@@AJOJJJ" "@@@@@@@@@@@@@@@OCKKC" "@@@@@@@@@@AHM@@OOOMM" "@@@@@@@@@@@@A@@MGOGG" "@@@@@@@@@A@@@@@NKOJJ" "@@@@@@@@@@@@@@@GCOKC" "@@@@@@@@@@A@@@@GOOOM" "@@@@@@@@@@A@B@@CGGOG" "@@@@@@@@@@@@@@@ANKJJ" "@@@@@@C@@O@@@@@AOKKC" "@@@@@@@@@OB@@@@@OOOM" "@@@@@AH@@@L@@@@AOGOG" "@@@@@CH@@ALAHB@ENKNJ" "@@@AB@C@@AHAABBDOCOC" "@@@@@@@@@CD@A@BCGOOO" "@@@H@@@@@C@CL@@@FGOG" "@@@IN@@@@@@G@B@@GKOJ" "@@@IL@@@@@@G@@@@CCOK")} 64 . 71) ({(READBITMAP)(48 27 "@@@@@@@@@D@@" "@@@@@@@@@@@@" "@@@@@@@AH@@@" "@@@@@@@@K@@@" "@@@@@@@@L@@@" "@@@@@@@@@@@@" "@@@@@@@H@H@@" "@@@@@@@OGH@@" "@@@@@@@NF@@@" "@@@@@@GN@@@@" "@@@@@@O@@@@@" "@@@@@@O@@@@@" "@@@@@GMN@@@@" "@@@@@GOH@@@@" "@@@@@AK@@@@@" "@@@@GKL@@@@A" "@@@@GOL@@@@@" "@@@AOO@@@@@@" "@@@AMN@@@@@@" "@@@AN@@@@@@@" "@@@AO@@@@@@C" "@@@@O@@@@@@C" "@@@CO@@@@@@@" "@@@CL@@@@@AL" "@@@AL@@@@@AM" "@@@@L@@@@@AK" "@@@@L@@@@@CO")} 32 . 44))) (40 (({(READBITMAP)(16 4 "@@@C" "@@@G" "@@@G" "@@@G")} 48 . 104) ({(READBITMAP)(48 27 "@@@C@@C@H@CG" "@B@C@@N@@@CB" "@B@@@@F@@@AO" "@@@@@@@@@@AM" "@@@@@@@@@@AM" "@@A@@@F@@@AO" "@@BA@@F@B@@N" "@@@G@@FD@@@O" "@N@@@@@FD@@M" "@I@@@@@CL@@M" "@@D@D@CCL@@N" "@@@B@@COO@@N" "@AKB@@CON@@N" "@COF@AOOL@@G" "@COOHAOOL@@F" "@GOOL@AOL@@G" "@GOOL@AOL@@C" "@CGOH@COL@@C" "@COONAKOL@@C" "@AOONAKOH@@C" "OOOOOOOOOOOO" "OOOOOOOOOOOO" "@AOOH@@O@@@C" "@AOOH@@O@@@A" "@AON@@@L@@@A" "@@GH@@@C@@@A" "@@G@@@@C@@@A")} 96 . 19) ({(READBITMAP)(80 39 "@@@@@@@A@@@@@@@@@@B@" "@@@@@@@@C@@@@@@CB@G@" "@@@@@@@@@@@C@@@@@@@@" "@@@@@@@@@@@C@@@@@@@B" "@@@@@@@@@H@@@@@@@H@@" "@@@@@@@@GH@@@@@@B@@@" "@@@@@@@HF@@@@@DL@@@A" "@@@@@@CH@@L@@@@L@@@A" "@@@@@@@@@@L@@@@HH@@A" "@@@@@@@@@@@@L@@@H@@A" "@@@@@A@F@@@@L@@@@@@@" "@@@@@@HH@@@@@F@@@@@C" "@@@@@@@@@@@@AO@@@@@A" "@@@@@@@@@@@AAL@@@F@@" "@@@@@GL@@@@@@@@H@F@C" "@@@ACD@@@@@@@A@L@@@C" "@@@ACD@@@@@@@CIL@@@C" "@@@AN@@@@@@@@@CN@@@@" "@@@GN@@@@@@@@@@F@@@@" "@@@GO@@@@@@@@@@@F@@@" "@@@OO@@@@@@@@@L@FBA@" "@@@OL@@@@@A@@CH@@B@H" "@@@OL@@@@@@DDH@@@@@G" "@@AOL@@@@@@@D@@@@@@C" "@@AOL@@@@@A@G@@@@B@C" "@@AO@@@@@@ANG@@@@B@@" "@@AN@@@@@@C@G@@@@@@@" "@@MN@@@@@@CCKL@@@@@@" "@AMN@@@@@@CCOL@@@@A@" "@AIH@@@@@@COGH@@@@BA" "@@AH@@@@@@COOH@@@@@G" "@@@@@@@@@@COO@@@@N@@" "@@@@@@@@@COOOH@@@I@@" "@@@@@@@@@COKKH@@@@D@" "@@@@@@@@@@GOO@@@@@@B" "@@@@@@@@@@GOO@@@@AKB" "@@@@@@@@@@GOK@@@@COF" "@@@@@@@@@@CO@@@@@COO" "@@@@@@@@@@CO@@@@@GOO")} 32 . 30) ({(READBITMAP)(80 18 "H@AJJJJJEEEEEEEEBJJJ" "@@AKJKKCGOOOONNFECCC" "@@AOMOMMEEEEEGMMNMOO" "@DAOGGGOH@@@@BBB@OGG" "@@AJJJKNEEEEEEEEEFJJ" "@@AKKKKOEEEEEDDDLOCC" "@@AMOOOOBJJJJJBBBCMO" "@@AOGGGOHJJJJJHHHIGG" "@LAJJJONEEEEEEEEEDJJ" "@LAKKKOODEEEEEDDLMCC" "@@AMOOOOBJJJHHJBBCMM" "@@AOOGOOHJJJJJHHHIGG" "L@AKNKNJEEEEEEEEEFJJ" "L@AKOKOKLEEEEDDDLOCC" "L@AOOOOMBBJJHHBBBEMM" "L@AOGGOGHHJJJJHHHGGG" "@@ANOJOJEEEEEEEEDJJJ" "@@AIOKOKLEEEEDDDOCCC")} 112 . 91) ({(READBITMAP)(64 86 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@HAH@" "@@@@@@@@@@AHHAH@" "@@@@@@@@@@AOH@MH" "@@@@@@@@@@FOHAMH" "@@@@@@@@@@GO@ANH" "@@@@@@@@@@OO@AON" "@@@@@@@@@@OG@AON" "@@@@@@@@@@ON@AON" "@@@@@@@@@@ON@ALN" "@@@@@@@@@@AN@@ON" "@@@@@@@@@@AN@@GL" "@@@@@@@A@@@@@@@@" "@@@@@@@@@@@@@@DA" "@@@@@@@@@@@@@@@A" "@@@@@@@D@@@@D@@A" "@@@@@@@D@@@@F@@C" "@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@@@@G" "@@@@@@@@@L@AL@DG" "@@@@@@@@AL@AN@DO" "@@@@@@@HAL@AH@@M" "@@@@C@AHEL@AHF@M" "@@@@BDGBAOHALF@N" "@@@@NGO@@OH@@F@N" "@@@@GN@@@OHBAFEM" "@@DAONL@@AHB@FAM" "@MOOOOL@@AHB@@AN" "@MOKOK@@AH@CH@MN" "@OOOOH@@AI@@@@MM" "@OOOOH@@AH@@@@AO" "@OOO@@@@@@@@D@IJ" "@OOH@@@@B@C@@@MN" "AOONC@@@AIKH@@MO" "AOLNC@@@GKKIL@AM" "LOLO@@@@DAHAH@AJ" "OO@C@@@L@@@C@@AK" "GK@@@ACLA@@C@@AO" "OH@@@@C@@@@@@DAO" "IH@@@@D@D@@@@@AJ" "AH@@@@HAN@@@@@AK" "@@@@L@HCH@@@@@AM" "@@@D@@CH@@D@@@AO" "@@@G@@CH@@FF@LAJ" "@@@@AIIH@@FF@LAK" "@@A@AOIL@@F@@@AM" "@@A@ANAMN@D@@@AO" "@@B@A@@CN@N@L@AK" "@@BB@@@C@AN@L@AK" "@ACLN@@G@@N@L@AO" "@A@DB@@G@@N@L@AO" "A@@D@@@@@@@@@@AN" "AL@@@@@@@@@@@@AI" "ANDC@@L@@@@@@@AO" "@OLA@@N@AH@@@@AO" "GON@@@GHGH@@@@AJ" "GOO@@@AHGH@@@@@O" "GON@@@@@@@@HM@@O" "GOL@@@@@@@@@A@@M" "@@@@@@@@@A@@@@@N" "@@@@@@@@@@@@@@@G" "@@@@@@@@@@@@@@@G" "@@@@@@@@@@@@B@@C" "@@@@@@@@@@@@@@@A" "@@@@@@C@@@@@@@@A" "@@@@@@@@@H@@@@@@" "@@@@@AH@@@L@@@@A" "@@@@@CH@@@DAHB@E" "@@@AB@C@@@@@@@BD" "@@@@@@@@@B@@@@BC" "@@@H@@@@@A@C@@@@" "@@@IN@@@@@@A@@@@" "@@@IL@@@@@@@@@@@" "@D@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@D" "@@@@@@@@@@B@@@@F" "C@@@@@@CB@G@@@@B" "@@@C@@@@@@@@@@@B" "@@@C@@@@@@@B@G@@" "@H@@@@@@@H@@@@@@" "GH@@@@@@B@@@@@@@" "F@@@@@DL@@@A@D@C" "@@L@@@@L@@@AHD@C")} 64 . 61))) (40 (({(READBITMAP)(48 18 "JEEEEEEEEBJJ" "JGOOONNFNMCC" "MMEEEGMMMNOO" "EH@@@BBBB@OG" "JEEEEEEEEEFJ" "JEEEEDDDLLOC" "MJJJJJBBBBCO" "GJJJJJHHHHIG" "JEEEEEEEEEDJ" "KEEEEEDDLLMC" "MJJJHHJBBBCM" "GJJJJJHHHHIG" "JEEEEEEEEEFJ" "CEEEEDDDLLOC" "MBJJHHBBBBEM" "GHJJJJHHHHGG" "JEEEEEEEEDJJ" "CEEEEDDDLOCC")} 144 . 91) ({(READBITMAP)(32 33 "@@@@@@@@" "@@@@@@B@" "@@@@@@@@" "@@@@@@@@" "@@@@@A@F" "@@@@@@HH" "@@@@@@@@" "@@@@@@@@" "@@@@@CL@" "@@@A@D@@" "@@@ACD@@" "@@@AN@@@" "@@@DB@@@" "@@@DC@@@" "@@@LA@@@" "@@@LH@@@" "@@@OL@@@" "@@AOL@@@" "@@AO@@@@" "@@MO@@@@" "@@MN@@@@" "@@MN@@@@" "@AON@@@@" "@AOL@@@@" "@@OH@@@@" "@@O@@@@@" "@@O@@@@@" "@@N@@@@@" "@@N@@@@@" "@AL@@@@@" "@AL@@@@@" "@N@@@@@@" "@N@@@@@@")} 32 . 30) ({(READBITMAP)(96 129 "@@@@@@@@@@@@@@@@@@@@@@CO" "@@@@@@@@@@@@@@@@@@@@@@OJ" "@@@@@@@@@@@@@@@@@@@@@ANN" "@@@@@@@@@@@@@@@@@@@@@CMK" "@@@@@@@@@@@@@@@H@@@@@OOG" "@@@@@@@@@@@@@@CI@@@BAOGO" "@@@@@@@@@@@@@@CA@A@BCNKJ" "@@@@@@@@@@@@@@OH@@CNCOKJ" "@@@@@@@@@@@@@@ON@@DNGOOE" "@@@@@@@@@@@@@@MN@@ONGGEE" "@@@@@@@@@@@@@@ON@@OLNJJJ" "@@@@@@@@@@@A@@OF@@ONOJJJ" "@@@@@@@@@@@@@@ON@AOOMMEE" "@@@@@@@@@@@@@@ON@AOOOEEH" "@@@@@@@@@@@D@@OND@CONJJ@" "@@@@@@@@@@@D@@GNF@AOJJL@" "@@@@@@@@@@@@@@AL@@AOME@@" "@@@@@@@@@@@@@@@L@@@GEE@@" "@@@@@@@@@@@@@@@AL@DGJJ@@" "@@@@@@@@@@@@@@@@B@DOJJ@@" "@@@@@@@@@@@HAH@@@@@MMD@@" "@@@@@@@@@@AH@@@AHB@MED@@" "@@@@@@@@@@CB@@@@LB@NJL@A" "@@@@@@@@FAA@@N@@@B@NJH@J" "@@@@@@@@@B@@@B@BABEMEDAE" "@@@@@@D@AB@@@AHB@BAMEDEE" "@@@@@ABLB@@@@F@B@@ANJHJJ" "@@@@@L@LD@@@AN@CH@MNJLJK" "@@@@@@OLLH@@AN@@@@MMMGEM" "@@@@@AOLIH@@AO@@@@AOEEEG" "@@@@AOGK@@@@@OH@D@IJJJJJ" "@@@@COOH@@@@BOH@@@MNJJKK" "@@@@COOHC@@@AIH@@@MOMEMM" "@@@AKOLLC@@@GCJAL@AMEEGG" "@@@AOOLL@@@@DAHAH@AJJJJJ" "@@@COO@@@@@L@@@C@@AKJKKC" "@@@GGK@@@AC@A@@C@@AOMOMM" "@@@GOH@@@@C@@@@@@DAOGGGO" "@@@GOH@@@@D@D@@@@@AJJJKN" "@@@COH@@@@HAN@@@@@AKKKKO" "@@@COH@@L@HCH@@@@@AMOOOO" "@@@ON@@D@@CH@@@@@@AOGGGO" "@@AON@@G@@CH@@@F@HAJJJON" "@@AON@@@AIIH@@@B@@AKKKOO" "@@@CH@A@AOIL@@D@@@AMOOOO" "@@@@@@A@ANAMN@@@@@AOOGOO" "@@@@@@B@A@@CN@BAH@AKNKNJ" "@@@@@@BB@@@C@ABAH@AKOKOK" "@@@@@ACLN@@G@@BAH@AOOOOM" "@@@@@A@DB@@G@@N@@@AOGGOG" "@@@@@@@D@@@@@@L@@@ANOJOJ" "@@@@@@@@@@@@@@L@@CAIOKOK" "@@@@AB@C@@@@@@L@@CAOOOOM" "@@@@@N@A@@@@@@L@@@AOOOGG" "@@@@@@F@@@@@@@L@@@AJOJJJ" "@@@@DAO@@@AHB@L@@@@OCKKC" "@@@@GON@@@@@@@LH@@@OOOMM" "@@@AOON@@@@@@@@@@@@MGOGG" "@@@AOON@@@@@@@@@@@@NKOJJ" "@@@AOOL@@@@@@@@@@@@GCOKC" "@@@@OLN@@N@@CL@@@@@GOOOM" "@@@@OLN@@NOHCL@@@@@CGGOG" "@@@@@@@@@@OH@@@@@@@ANKJJ" "@@@@@@@@@@B@@@@@@@@AOKKC" "@@@@@@@@@@@@@H@@@@@@OOOM" "@@@@@@@@@@@@@@@@@@@AOGOG" "@@@@@@@@@@@@@@@@@@@ANKNJ" "@@@@@@@@B@B@@@@@@@@@OCOC" "@@@@@@@@@@@@@@@@@@@AGOOO" "@@@@@@@@@@@@@@@@@@@@FGOG" "@@@@@@@@@@@@@@@@@@@@GKOJ" "@@@@@@@@H@@@@@@@@@@@CCOK" "@@@@@D@@@@@@@@@@@@@@COOM" "@@@@@@@@@@@@@@@@@@@@CGOG" "@@@A@@@@@@@@@@@@@@@@CJJJ" "@@@@C@@@@@@C@@@@@@@FAOKK" "@@@@@@C@C@@@@@@@@@@FAMOM" "@@@@@@CCC@@@@@@B@G@@@OGG" "@@@@@@@@@@@@@H@@@@@@@NJJ" "@@@@B@@@@@@@B@@@@@@@@GKK" "@@@@B@@@@@DL@@@A@D@C@GOO" "@@B@@@L@@@@L@@@AHD@C@CGO" "@@@@@@L@@@@HH@@AIL@@@COJ" "@@@@@@@@L@@@H@@AIN@@@CKK" "@A@F@@@@L@@@@@@@@@@@@AMO" "@@HH@@@@@F@@@@@CH@@@@AOG" "@@@@@@@@AO@@@@@AH@@C@@NJ" "@@@@@@@AAL@@@F@@DCHG@@OK" "@CL@@@@@@@@H@F@CDC@F@@GM" "@D@@@@@@@A@L@@@C@C@F@@GG" "CD@@@@@@@CIL@@@C@B@L@@GJ" "N@@@@@@@@@CN@@@@@@@@@@CC" "B@@@@@@@@@@F@@@@@@@L@@CM" "C@@@@@@@@@@@F@@@@@AC@@CG" "A@@@@@@@@@L@FBA@@@@C@@CB" "H@@@@@@@@CH@@B@H@@@CH@CO" "L@@@@@@D@H@@@@@G@@ACH@CM" "L@@@@@@@@@@@@@@C@@C@H@CG" "@@@@@@A@C@@@@B@C@@N@@@CB" "@@@@@@AN@@@@@B@@@@F@@@AO" "@@@@@@@@@@@@@@@@@@@CH@AM" "@@@@@@@@@@F@@@@@@@@CH@AM" "@@@@@@@@H@F@@@A@@@F@@@AO" "@@@@@@@@@@@@@@BA@@F@@@@N" "@@@@@@@@@@@@@@@G@@F@@@@O" "@@@@@@CIH@@@@N@@@@@AH@@M" "@@@@@@GOH@@@@H@@@@@AH@@M" "@@@@@COKKH@@@@@@D@C@L@@N" "@@@@@@GOO@@@@@@@@@B@@@@N" "@@@@@@GOO@@@@@@@@@B@@@@N" "@@@@@@GOK@@@@@@@@ALC@@@G" "@@@@@@COL@@@@B@L@ALO@@@F" "@@@@@@CON@@@@DD@@@@OL@@G" "@@@@@@OKO@@@@DLB@@AOL@@C" "@@@@@@OOO@@@@CGCH@COL@@C" "@@@@@COOL@@@@COCNAKOL@@C" "@@@@@COOL@@@@AOONAKOH@@C" "OOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOLOOOOOOOOO" "@@@@@@@@@@@@@AOOH@@O@@@C" "@@@@@@@@@@@@@AOOH@@O@@@A" "@@@@@@@@@@@@@AOO@@AO@@@A" "@@@@@@@@@@@@@GOK@@AOH@@A" "@@@@@@@@@@@@@GOO@@AOH@@A" "@@@@@@@@@@@@@GOO@@AOH@@A" "@@@@@@@@@@@@@GOO@@AOH@@@" "@@@@@@@@@@@@@GOO@@AO@@@@" "@@@@@@@@@@@@@COH@@AN@@@@" "@@@@@@@@@@@@@AO@@@@@@@@@")} 48 . 14))) (40 (({(READBITMAP)(16 4 "KNKJ" "KOKJ" "OOOE" "OGEE")} 128 . 133) ({(READBITMAP)(16 28 "@@@@" "@@@@" "@@@@" "@@@D" "@@@@" "@@@H" "@@@H" "@@@H" "@@AH" "@@A@" "@@ML" "@@OH" "@@OH" "@@OH" "@@OH" "@@OH" "@@O@" "@GO@" "@ON@" "AON@" "@OL@" "COL@" "COL@" "COH@" "CO@@" "CN@@" "CN@@" "AL@@")} 32 . 26) ({(READBITMAP)(48 18 "IIEEEEEEDLJJ" "IAOOONNFLBKC" "OOEEEGMMMBCO" "FN@@@BBBBKAG" "IIEEEEEEEEIJ" "IIEEEDDDLL@C" "NFJJJJBBBBDG" "DFJJJJHHHHNO" "IIEEEEEEEECB" "HIEEEEDDLLJK" "NFJJHHJBBBDE" "DFJJJJHHHHNO" "IIEEEEEEEEIJ" "@IEEEDDDLL@C" "NNJJHHBBBCKM" "DDJJJJHHHKKG" "IIEEEEEEECBJ" "@IEEEDDDL@CC")} 144 . 91) ({(READBITMAP)(80 94 "@@@@@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@@A@@@B" "@@@@@@@@@@@@@@B@@@@C" "@@@@@@@@@@@@@@B@@@CO" "@@@@@@@@@@@@@@A@@D@O" "@@@@@@@@@@@@@@@@@DIO" "@@@@@@@@@@@@@@N@@NOO" "@@@@@@@@@@@A@@N@@NON" "@@@@@@@@@@@@@@NH@OOO" "@@@@@@@@@@@@@@OHAKOO" "@@@@@@@@@@@D@AOHAHGO" "@@@@@@@@@@@D@AOHF@GO" "@@@@@@@@@@@@@AOL@@GO" "@@@@@@@@@@@@@COL@@GO" "@@@@@@@@@@@@@COH@@GO" "@@@@@@@@@@@@@AOHB@GO" "@@@@@@@@@@@HAHOH@@GM" "@@@@@@@@@@AH@@OH@@GM" "@@@@@@@@@@CB@@GH@@@N" "@@@@@@@@DAA@@N@@@@@N" "@@@@@@@@@B@@@B@B@@AM" "@@@@@@@@AB@@@AHB@@AM" "@@@@@A@L@@@@@F@B@@AN" "@@@@@@@L@@@@AN@CH@AN" "@@@@@@L@LH@@AN@@@@AM" "@@@@@@@@IH@@AO@@@@AO" "@@@@AO@H@@@@@OH@@@AJ" "@@@@CA@H@@@@BOH@@@AN" "@@@@CAAHC@@@AIH@@@AO" "@@@AJC@LC@@@GCJA@@AM" "@@@ANG@L@@@@DAHA@@AJ" "@@@COO@@@@@L@@@C@@AK" "@@@GGK@@@AC@A@@C@@AO" "@@@GOH@@@@C@@@@@@DAO" "@@@GOH@@@@D@D@@@@@AJ" "@@@COH@@@@HAN@@@@@AK" "@@@OOH@@L@HCH@@@@@AM" "@@@ON@@D@@CH@@@@@@AO" "@@AON@@G@@CH@@@F@HAJ" "@@AON@@@AIIH@@@B@@AK" "@@@OL@A@AOIL@@@@@@AM" "@@AOL@A@ANAMN@@@@@AO" "@@AOH@B@A@@CN@@AH@AK" "@@CO@@BB@@@C@A@AH@AK" "@@GO@ACLN@@G@@@AH@AO" "@@ON@A@DB@@G@@H@@@AO" "@@OF@@@D@@@@@@H@@@AN" "@@O@@@@@@@@@@@H@@@AI" "@@@@AB@C@@@@@@@@@@AO" "@@@@@N@A@@@@@@@@@@AO" "@@@@@@B@@@@@@@@@@@AJ" "@@@@@@@@@@AHB@@@@@@O" "@@@@@@@@@@@@@@HH@@@O" "@@@AOON@@@@@@@@@@@@M" "@@@AOON@@@@@@@@@@@@N" "@@@AOOL@@@@@@@@@@@@G" "@@@@OLN@@N@@B@AH@@@G" "@@@@OON@@@@@@@AH@@@C" "@@@@OOH@@@@@@@@@@@@A" "@@@OOO@@@@@@@@@@@@@A" "@@@OON@@@@@@@H@@@@@@" "@@@GON@@@@@@@@@@@@@A" "@@@GOH@@@@@@@@@@@@@A" "@@@@@@@@BAO@@OL@@@@@" "@@@@@@@@@AO@COL@@@@A" "@@@@@@@@@AN@CL@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@D@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@C@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@A@@@@@@@@@@@@@" "@@@@@@@@@@@@@H@@@@@@" "@@@@B@@@@@@@B@@@@@@@" "@@@@@@@@@@DL@@@@@@@@" "@@B@@@H@@@@L@@@@@@@@" "@@@@@@@@@@@H@@@@@@@@" "@@@@@@@@L@@@H@@@@@@@" "@@@D@@@@L@@@@@@@@@@@" "@@@H@@@@@F@@@@@@@@@@" "@@@@@@@@@L@@@@@@@@@@" "@@@@@@@@@L@@@F@@@@@G" "@A@@@@@@@@@@@F@A@A@F" "@D@@F@@@@A@L@@@A@@@F" "CD@@F@@@@AA@@@@A@@@D" "F@@@F@@@@@CB@@@@@@L@" "@@@@F@@@@@@@@@@@@ALL" "@@@@@@@@@@@@F@@@@AHC" "@@@@@@@@@@L@F@A@@@@C" "@@@@@@@@@CH@@B@H@@@C" "@@@@@@@D@H@@@@@G@@AC" "D@@@@C@@@@@@@@@C@@C@")} 48 . 45) ({(READBITMAP)(80 36 "@C@@@@@@@@@C@@C@H@CG" "@CA@C@@@@B@C@@N@@@CB" "@@AH@@@@@B@@@@F@@@AO" "@@@@@@@@@@@@@@@CH@AM" "@@@@@@F@@@@@@@@CH@AM" "@@@@H@F@@@A@@@F@@@AO" "@@@@@@@@@@BA@@F@@@@N" "@@@@@@@@@@@G@@B@@@@O" "@@@I@@@@@N@@@@@AH@@M" "@@@I@@@@@H@@@@@AH@@M" "@B@AL@@@@@@@D@@@L@@N" "@@@@L@@@@@@@@@B@@@@N" "@@@DN@@@@@@@@@B@@@@N" "@@FGN@@@@@@@@ALAC@@G" "@@BCH@@@@B@L@AL@C@@F" "@@BOH@@@@@@@@@@@C@@G" "@@OOO@@@@@@@@@@@@@@C" "@@OOO@@@@@@@@@@@@@@C" "@COOL@@@@@@CNAH@@@@C" "@COOL@@@@AOONAKOH@@C" "OOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOLOOOOOOOOO" "AOOO@@@@@AOOH@@O@@@C" "AOOO@@@@@AOOH@@O@@@A" "AOOO@@@@@AOO@@AO@@@A" "AOOO@@@@@GOK@@AOH@@A" "@NOGL@@@@GOO@@AOH@@A" "@NOOH@@@@GOO@@AON@@A" "@@OH@@@@AOOO@@AON@@@" "@@@@@@@@COOO@@AON@@@" "@@@@@@@@GOOO@@AOH@@@" "@@@@@@@@OOOOH@@OH@@@" "@@@@@@@@AONGH@@OH@@@" "@@@@@@@@@@@@@@@OH@@@" "@@@@@@@@@@@@@@@N@@@@" "@@@@@@@@@@@@@@@F@@@@")} 64 . 10))) (40 (({(READBITMAP)(16 4 "OO@@" "ON@@" "ON@@" "OL@@")} 32 . 26) ({(READBITMAP)(16 2 "@@@@" "@@@@")} 96 . 26) ({(READBITMAP)(48 8 "AOOOH@@OH@@@" "@OON@@@ON@@@" "@MON@@@OO@@@" "@@OH@@AOO@@@" "@@@@@@AMO@@@" "@@@@@@COOH@@" "@@@@@@COOH@@" "@@@@@@@@D@@@")} 96 . 6) ({(READBITMAP)(32 12 "@AH@@@@C" "@AKOH@@C" "OOOOOOOO" "OOOOOOOO" "H@@H@@@C" "H@C@@@@A" "@@C@@@@A" "@@OO@@@A" "@@OO@@@A" "@@CN@@@A" "@@AO@@@@" "@@AOL@@@")} 112 . 16) ({(READBITMAP)(64 24 "EFJJNNLONIGGGGGG" "IJCNCIC@@DLJJJJJ" "ICLJJKJKIG@KCCKK" "OLBALBOHHGMCOMMM" "FMLJJHHHHAKIGGGG" "IJIEEEEEEEIEJJJJ" "IJIEEDDDLL@DCKKK" "NEFJJJBBBB@@GMMM" "FEFJJJHHHHNHOGGG" "OJIEEEEEEECEBJJJ" "HJIEEEDDLLJLKKKK" "NEFJHHJBB@DBGMMM" "FEFJJJHHHHN@OGGG" "OJIEEEEEEEIEJJJJ" "@JIEEDDDLLALCKKK" "NMFJHHBBBCHCMMMM" "DGFJJJHHHJDKGGGG" "OJIEEEEEABEBJJJJ" "FIFJJKKKANDCCKKK" "MMEEGGOMOMMMMMMM" "GEEEEEGOGGGGGGGG" "JJJJJJKKJJJJJJJJ" "CJJJJJKKKCGCCKKK" "MMOGGGGMMMOMMMMM")} 144 . 86) ({(READBITMAP)(48 12 "@@@@@@@@F@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@H@@@@@@@@" "@@@H@@@@@@@D" "@@AH@@@@@C@@" "@@@@@@@@@CA@" "@@@@@@@AH@AH" "@@@@@@@AH@@@" "@@@@@@@AH@@@" "@@L@@@@@@@@@" "@@L@@@@@@@@@")} 32 . 39) ({(READBITMAP)(32 62 "@@@@AH@H" "@@@@B@@H" "@@@@@@AH" "@@@AHA@L" "@@@A@@@D" "@@@@A@@@" "@@@@@@@@" "@@@@@@@@" "@@@AH@@@" "@@@AH@@@" "@@@IL@@@" "@@@OL@@D" "@@@OL@@G" "@@@OL@@@" "@@@OL@A@" "@@AOL@@@" "@@AOH@B@" "@@CO@@BB" "@@GO@ACL" "@@ON@A@D" "@AON@@@D" "@AOH@@@@" "@CO@AB@C" "@GN@@N@A" "AOH@@@B@" "GOH@@@@@" "GOH@@@@@" "AO@@@BB@" "@G@@C@B@" "@F@@H@@@" "@@@@@@B@" "@@@@@CB@" "@@@@OO@@" "@@@OOO@@" "@@@OON@@" "@@@GOOH@" "@@@GOOH@" "@@@CMOH@" "@@@AOL@@" "@@@GOL@@" "@@@OOL@@" "@@@OOH@@" "@@@OOD@@" "@@@GN@@@" "@@@CL@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@A@" "@@@@@@@@" "@@@@B@@@" "@@@@@@@@" "@@B@@@H@" "@@@@@@@@" "@@@@@@@@" "@@@D@@@@" "@@@H@@@@" "@@@@@@@@" "@@@@@@@@" "@A@@@@@@" "@D@@@@@@" "CD@@@@@@" "F@@@@@@@")} 48 . 51) ({(READBITMAP)(48 76 "@@@@@@@@@NOO" "@@@A@@@@@NON" "@@@@@@B@@OOO" "@@@@@@B@AKOO" "@@@D@@B@AHGO" "@@@D@@AHF@GO" "@@@@@@CH@@GO" "@@@@@BGH@@GO" "@@@@@CO@@@GO" "@@@@@AO@B@GO" "@@@HAHOH@@GM" "@@AH@AOH@@GM" "@@CB@AOH@@@N" "DAA@@OOH@@@N" "@B@@@COJ@@AM" "AB@@@AOJ@@AM" "@@@@@GOJ@@AN" "@@@@@GOKH@AN" "DH@@@AOH@@AM" "IH@@@AOH@@AO" "@@@@@@OH@@AJ" "@@@@@DGH@@AN" "C@@@AH@@@@AO" "C@@@G@@A@@AM" "@@@@D@@A@@AJ" "@@@L@@@A@@AK" "@AC@A@@@@@AO" "@@C@@@@@@@AO" "@@D@@@@@@@AJ" "@@HAB@@@@@AK" "L@H@H@@@@@AM" "@@@@@@@@@@AO" "@@@@@@@@@@AJ" "@@@@@@@@@@AK" "AN@D@@@@@@AM" "@@@EB@@@@@AO" "@@@@B@@@@@AK" "@@@@@A@@@@AK" "L@@@@@@@@@AO" "B@@D@@H@@@AO" "@@@@@@H@@@AN" "@@@@@@H@@@AI" "AH@@@@@@@@AO" "CHAO@@@@@@AO" "CHCO@@@@@@AJ" "C@GHB@@@@@@O" "C@F@@@HH@@@O" "@@F@@@@@@@@M" "@@@@@@@@@@@N" "@@@@@@@@@@@G" "@N@@B@AH@@@G" "@@@@@@AH@@@C" "@@@@@@@@@@@A" "@@@@@@@@@@@A" "@@@@@H@@@@@@" "@@@@@@@@@@@A" "@@@@@@@@@@@A" "B@D@@@@@@@@@" "@@@@@@@@@@@A" "@@@@@D@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@AH@@@@@@@@@" "@AN@@@@@@@@@" "@ANC@@@@@@@@" "@@@@@@L@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@B@@@@@@@" "@@DL@@@@@@@@" "@@@L@@@@@@@@" "@@@H@@@@@@@@" "L@@@H@@@@@@@" "L@@@@GN@@@@@" "@F@@@GN@@@@@")} 80 . 57) ({(READBITMAP)(32 5 "AOOOH@@@" "AOOOH@@@" "@OOGL@@@" "@OOOH@@@" "@@OK@@@@")} 64 . 17))) (40 (({(READBITMAP)(64 18 "IJ@ALFLOOKBJJJJJ" "ICOOONONLBGCCCKK" "OL@ALBOHHGMOOMMM" "FMOOOMMMMDNGGGGG" "IJJJJJJJJJFJJJJJ" "IJJJJKKKCCOKCKKK" "NEEEEEMMMMOOOMMM" "FEEEEEGGGGAGGGGG" "OJJJJJJJJJLJJJJJ" "HJJJJJKKCCECCKKK" "NEEEGGEMMOKMOMMM" "FEEEEEGGGGAOGGGG" "OJJJJJJJJJFJJJJJ" "@JJJJKKKCCNCCKKK" "NMEEGGMMMLGMMMMM" "DGEEEEGGGEKGGGGG" "OJJJJJJJNMJJJJJJ" "FIEEEDDDNAKCCKKK")} 144 . 91) ({(READBITMAP)(112 114 "@@@@@@@@@@@@@@@D@@@@F@GOJJL@" "@@@@@@@@@@@@@@@@@@@@@@GOME@@" "@@@@@@@@@@@@@@@@@B@H@@GOEE@@" "@@@@@@@@@@@@@@@@@C@@@@GOJJ@@" "@@@@@@@@@@@@@@@@@@C@@@GOJJ@@" "@@@@@@@@@@@@@@@@AHC@@@GMMD@@" "@@@@@@@@@@@@@@@@@AC@@@GMED@@" "@@@@@@@@@@@@@@@B@AC@@@@NJL@A" "@@@@@@@@@@@@DA@@@CCH@@@NJH@J" "@@@@@@@@@@@@@B@@@COH@@AMEDAE" "@@@@@@@@@@@@@B@@@AOH@@AMEDEE" "@@@@@@@@@A@H@@@@@GOH@@ANJHJJ" "@@@@@@@@@@@@@@@@@GOJ@@ANJLJK" "@@@@@@@@@@@@@@@@@AOH@@AMMGEM" "@@@@@@@@@@@@@@@@@AOH@@AOEEEG" "@@@@@@@@A@@@@@@@@AOH@@AJJJJJ" "@@@@@@@@@@@@@@@@@DOH@@ANJJKK" "@@@@@@@@@@@@B@@@AHOH@@AOMEMM" "@@@@@@@@@@@@B@@@GCOH@@AMEEGG" "@@@@@@@A@@@@@@@@DCOH@@AJJJJJ" "@@@@@@@@A@@@@@@L@COH@@AKJKKC" "@@@@@@@@@@@@@A@@@@OH@@AOMOMM" "@@@@@@@@@@@@@@A@@@CH@@AOGGGO" "@@@@@@@@@@@@@@@@@@C@@@AJJJKN" "@@@@@@@AH@@@@@HAB@@@@@AKKKKO" "@@@@@@@@@@@@H@H@H@@@@@AMOOOO" "@@@@@@@@@@@D@@@@@@@@@@AOGGGO" "@@@@@@@@H@@D@@@@@@@@@@AJJJON" "@@@@@@@@H@@@@@@@@@@@@@AKKKOO" "@@@@@@@@L@@@A@@D@@@@@@AMOOOO" "@@@@@@@@L@@@@@@DB@@@@@AOOGOO" "@@@@@@AHH@@@@@@@B@@@@@AKNKNJ" "@@@@@@CH@@@@@@@@@A@@@@AKOKOK" "@@@@@@GH@AALL@@@@@@@@@AOOOOM" "@@@@@@OL@@@D@@@D@@H@@@AOGGOG" "@@@@@AOH@@@D@@@@@@H@@@ANOJOJ" "@@@@@ALH@@@@@@@@@@H@@@AIOKOK" "@@@@@CL@A@@C@@@@@@@@@@AOOOOM" "@@@@@GN@@N@A@@@@@@@@@@AOOOGG" "@@@@AOH@@@@@@@B@@@@@@@AJOJJJ" "@@@@GOH@@@@@C@@@B@@@@@@OCKKC" "@@@@GOH@@@@@C@D@@@@H@@@OOOMM" "@@@@AO@@@@B@@@D@@@@@@@@MGOGG" "@@@@CO@@B@B@@@@@@@@@@@@NKOJJ" "@@@@CN@@@@@@@@@@@@@@@@@GCOKC" "@@@@GL@@@@B@@B@@B@@H@@@GOOOM" "@@@COH@@@A@@@@@@@@@H@@@CGGOG" "@@@COH@@@A@@L@@C@@@@@@@ANKJJ" "@@@@G@@H@A@@L@AO@@@@@@@AOKKC" "@@@@F@@H@H@@O@CN@@@@@@@@OOOM" "@@@@@@@@N@H@O@C@@@@@@@@AOGOG" "@@@@@@@AN@H@C@@@@@@@@@@ANKNJ" "@@@@@@@CL@@@CHD@@@@@@@@@OCOC" "@@@@@@@AO@@@AH@@@@@@@@@AGOOO" "@@@@@@@GOH@@AH@@@@@@@@@@FGOG" "@@@@@@@OOH@@@@@@@@@@@@@@GKOJ" "@@@@@@@OOH@@@@@@@@@@@@@@CCOK" "@@@@@@@OOL@@@@@@@@@@@@@@COOM" "@@@@@@AOOH@@@@@@@@@@@@@@CGOG" "@@@@@@AOOH@@@@@@@@@@@@@@CJJJ" "@@@@@@AOOH@@@@@@@@@@@@@@AOKK" "@@@@@@AOO@@@@@@@@@@@@@@@AMOM" "@@@@@@@OO@A@@@@@@@@@@@@@@OGG" "@@@@@@@CN@@@@@@@@@@@@@@@@NJJ" "@@@@@@@@B@@@@@@@@@@@@@@@@GKK" "@@@@@@@@@@@@@@@@@@@@@@@@@GOO" "@@@@@@B@@@H@@@@@@@@@@@@@@CGO" "@@@@@@@@@@@@@@@H@@@@@@@@@COJ" "@@@@@@@@@@@@@@@@@@@@@@@@@CKK" "@@@@@@@@@@@@@@@@@@@@@@@@@AMO" "@@@@@@@H@@@@@B@@@@@@@@@@@AOG" "@@@@@@@@@@@@@L@@@@@@@@@@@@NJ" "@@@@@@@@@@@@@@@@@@@@@@@A@@OK" "@@@@@@@@@@@@@@@@@D@A@@@B@@GM" "@@@@@D@@@@@@@A@L@@@@@@@@@@GG" "@@@@AD@@@@@@@AA@@GN@@@@@@@GJ" "@@@@@@@@@@@@@@CB@GN@@@D@@@CC" "@@@@@@@@F@@@@@@@@@@@@@H@@@CM" "@@@@@@@@@@@@@@@@F@@@@@@@@@CG" "@@@@@@@@@@@@@@L@F@A@@@@@@@CB" "@@@@@@@@@@@@@CH@@G@H@@@B@@CO" "@@@@@@@@@@@D@H@@@GHG@@@@@@CM" "@@AH@@@@@C@@@@@@@AHC@@@@@@CG" "@@@@@@@@@CA@C@@@@B@C@@N@@@CB" "@@@@@L@AH@AH@@@@@B@@@@F@@@AO" "@@@@@L@AH@@@@@@@@@@@@@@B@@AM" "@@@@@@@AH@@@@@F@@@@@@@@B@@AM" "@@@@@@@@@@@@H@F@@@A@@@F@@@AO" "@@HAH@@@@@@@@@@@@@BA@@F@@@@N" "@@@AHF@@C@@@@@@@@@@G@@B@@@@O" "@@@@@F@@C@@A@@@@@N@@@@@@@@@M" "@D@@@@@@@@@H@@C@@H@@@@@@@@@M" "@D@@@@@GHB@@@@C@L@@@D@@@L@@N" "@CL@@@@GH@@@D@CAL@@@@@B@@@@N" "@CL@@@@AH@@D@@@AH@@@@@B@@@@N" "AOL@@@@AH@@G@@@C@@@@@ALAC@@G" "AOL@@@@@@@BCH@@C@B@L@ML@C@@F" "COH@@@@@@@BOH@@@@@@@@L@@C@@G" "OO@@@@@@@@OOO@@@@@@@AH@@L@@C" "ON@@@@@@@@OOO@@@@@@@AH@@L@@C" "ON@@@@@@@COOL@@@@@@@@@@@@@@C" "OL@@@@@@@COOL@@@@@@@@@@@@@@C" "OOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@AOOO@@@@@@@@@@@@@@@C" "@@@@@@@@AOOO@@@@@@@@@@@@@@@A" "@@@@@@@@AOOOH@@@@@@C@@@@@@@A" "@@@@@@@@AOOOH@@@@COK@@@@@@@A" "@@@@@@@@@OOGL@@@@GOO@@OI@@@A" "@@@@@@@@@OOOH@@@@GOO@@ON@@@A" "@@@@@@@@@@OK@@@@AOOO@@OO@@@@" "@@@@@@@@@@@@@@@@COOO@@OO@@@@" "@@@@@@@@@@@@@@@@GOOO@@MOH@@@" "@@@@@@@@@@@@@@@@OOOOH@LOH@@@")} 32 . 14))) (40 (({(READBITMAP)(16 2 "CAHG" "LAHC")} 128 . 29) ({(READBITMAP)(16 10 "@@@A" "@@@C" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@AO" "@@AO" "@@AH")} 32 . 73) ({(READBITMAP)(48 18 "NDMEEEEEEJJK" "MHMIIIAA@GCK" "IGMOOMMMMKOO" "LNDMMMMMMHGO" "KEIEEEEEEEGJ" "BL@DLDDDDLGK" "LB@@@BBBBBCM" "FHNHHHHHHHKG" "KECEEEEEEEFK" "BLJLLDDDDDGK" "L@DB@BBBBBAM" "FHN@HHHHHHKG" "KEIEEEEEEEGJ" "BLALLDDDDDGK" "LCHBBBBBBBOM" "FJDHHHHHHIGG" "OBEEEEEEEGJJ" "ONDLLDDDDKOC")} 176 . 91) ({(READBITMAP)(32 15 "@@@@@D@A" "@@@@@@@A" "@@@@@@@A" "@@@@@@@@" "@@H@@@@@" "@@@@@B@@" "@@@@@B@@" "@@@@@@@@" "@@@@@@@G" "@@@@@@@G" "@@@@@@@A" "@@@@@@@A" "@@@@L@@@" "@F@@LF@@" "AN@@@F@@")} 32 . 29) ({(READBITMAP)(80 111 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@A" "@@@@@@@@@@@@@@@@@@@A" "@@@@@@@@@@@@@@@@@@@G" "@@@@@@@@@@@@@@@@@@@F" "@@@@@@@@@@@@@@@@@@@G" "@@@@@@@@@@@@@@@@@@@O" "@@@@@@@@@@@@@@@@@@@O" "@@@@@@@@@@@@@@@@@@CO" "@@@@@@@@@@@@@@@@@@CO" "@@@@@@@@@@@@@@@@@@CO" "@@@@@@@@@@@@@@@@@@GO" "@@@@@@@@@@@@@@@@@@GO" "@@@@@@@@@@@@@@@@@@GM" "@@@@@@@@@@@@@@@@@@GM" "@@@@@@@@@@@@@@@@@@@N" "@@@@@@@@@@@@@@@@@@@N" "@@@@@@@@@@@@@@@@@@AM" "@@@@@@@@@@@@@@@@@@AM" "@@@@@@@@@@@@@@@@@@AN" "@@@@@@@@@@@@@@@@@@AN" "@@@@@@@@@@@@@@D@@@AM" "@@@@@@@@@@@@@AL@@@AO" "@@@@@@@@@@@@@@@@@@AJ" "@@@@@@@@@@@@@D@@@@AN" "@@@@@@@@B@@@AHCH@@AO" "@@@@@@@@B@@@GBGH@@AM" "@@@@@@@@@@@@DBGH@@AJ" "@@@@@@@@@@@L@COH@@AK" "@@@@@@@@@A@@@AOH@@AO" "@@@@@@@@@@A@@AOH@@AO" "@@@@@@@@@@@@@AO@@@AJ" "@@@AH@@@@@HABAOL@@AK" "@@@@@@@@H@H@@AON@@AM" "@@@@@@@D@@@@@@ON@@AO" "@@@@H@@D@@@@@COL@@AJ" "@@@@H@@@@@@@@AGL@@AK" "@@@@L@@@A@@D@@OL@@AM" "@@@@L@@@@@@D@@OL@@AO" "@@@@H@@@@@@@@@OL@@AK" "@@@@@@@@@@@@@COL@@AK" "@@@@@AALL@@@@@L@@@AO" "@@@@@@@D@@@D@@L@@@AO" "@@@@@@@D@@@@@@@@@@AN" "@@@H@@@@@@@@@@@@@@AI" "@@@@A@@C@@@@@@@@@@AO" "@D@@@N@A@@@@@@@@@@AO" "AOH@@@@@@@B@@@@@@@AJ" "GOH@@@@@C@@@@@@@@@@O" "GOH@@@@@A@D@@@@H@@@O" "AO@@@@B@@@D@@@@@@@@M" "OO@@B@B@@@@@@@@@@@@N" "ON@@@@@@@@@@@@@@@@@G" "OL@@@@B@@B@AH@@@@@@G" "OH@@@A@@@@@AN@@H@@@C" "OH@@@A@@@@@@F@@@@@@A" "O@@H@A@@@@@@@@@@@@@A" "L@@H@H@@A@@@@@@@@@@@" "L@@@@@H@A@@@@@@@@@@A" "MH@@@@H@@@@@@@@@@@@A" "I@@B@@@@@@D@@@CH@@@@" "@@@@@@@@A@@@@@CH@@@A" "@@@@@H@@@@@@@@@@@@@@" "@@@@@H@@@@@@@@@@@@@@" "@@@A@@@@@@@@@@C@@@@@" "@@@CLD@@@@@@@@C@@@@@" "@@AON@@@@@@@@@@@@@@@" "@@AOOH@@@@@@@@@F@@@@" "@@AOOH@C@@@@@@@F@@@@" "@@AOO@@C@@AL@@@@@@@@" "@@@OO@ACH@AL@@@F@@@@" "@@AOO@@AL@@@@@@F@@@@" "@@AOO@@@L@@@@@@@@@@@" "@@AOO@@@L@@@@@@@@@@@" "@@CON@H@@@@@@@@@@@@@" "@@AOL@@@@@@@@@@@@@@@" "@@@GL@@@@@@@@@@@@@@@" "@@@@L@@@@@@@@@@@@@@@" "@@@H@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "A@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@F@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@D@@@@@@HC@@@@" "@@@@@C@@@@@@@@H@@@@@" "@@@@@CA@C@@@@B@@@@@@" "@D@AH@AH@@@@@B@@@@F@" "@@@AH@@@@@@@@@@@@@@B" "@@@AH@@@@@F@@@@@@@@@" "@@@@@@@@H@F@@@A@@@F@" "@@@@@@@@@@@AHGNA@@F@" "@B@@C@@@@@@AHGNG@@B@" "@B@@C@@A@@@@@N@@@@@@" "@@@@@@@H@@C@@H@@@@@@" "@@@GHB@@@@C@L@@@D@@@" "@@@GH@@@D@CAL@AH@@B@" "@@@AH@@D@@@AH@AH@@B@" "@@@AH@@G@@@C@@C@@ALA" "L@@@@@BCH@@C@BCL@ML@" "LF@@@@BOH@@@@AH@@L@@" "@F@@@@OOO@L@@AH@AH@@" "@@@@@@OOO@L@@@@@AH@@")} 48 . 28))) (40 (({(READBITMAP)(16 9 "@@AO" "@@AO" "@@CO" "@@GO" "@@OO" "@@ON" "@AOL" "@AO@" "@@F@")} 32 . 68) ({(READBITMAP)(32 5 "@@AOO@@@" "@@COOH@@" "@@COOH@@" "@@@GL@@@" "@@@G@@@@")} 112 . 5) ({(READBITMAP)(64 63 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@LF" "@@@@@@@@@@@@@CHL" "@@@@@@@@@@@@@AAL" "@@@@@@@@@@@@@@OL" "@@@@@@@@@@@@@@OL" "@@@@@@@@@@@@@@OL" "@@@@@@@@@@@@@COL" "@@@@@@@D@@@@@@ON" "@@@@@@@@@@@D@@ON" "@@@@@@@@@@@@@@ON" "@@@H@@@@@@@@@@ON" "@@@@A@@C@@@@@@ON" "@@@@@N@A@@@@@@OL" "@B@@@@@@@@B@@@OL" "@B@@@@@@A@@@@@OL" "@@@@@@@@A@D@@@GL" "A@@@@@B@@@D@@@C@" "AH@@B@B@@@@@@@C@" "OL@@@@@@@@@@@@C@" "ML@@@@B@@B@AH@@@" "OH@@@A@@@@@AN@@H" "KH@@@A@@@@@@F@@@" "IH@H@A@@@@@@@@@@" "IH@H@H@@A@@@@@@@" "MH@@@@H@A@@@@@@@" "MH@@@@H@@@@@@@@@" "I@@B@@@@@@D@@@@H" "@@@@@@@@A@@@@@@@" "@@@@@H@@@@@@@@@@" "@@@@@H@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@D@@@@@@@@C@" "@@@L@@@@@@@@@@@@" "@@@L@@@@@@@@@@@@" "@@@LL@@@@@@@@@@@" "@@@HD@@B@@@@@C@@" "@@@CL@A@@@@@@C@B" "@@@CL@@@@@@@@@@B" "@@AML@@@@@@@@@@@" "@@AMO@@@@@@@@C@@" "@@CON@H@@@@@@C@@" "@@AOL@@@@@@@@C@@" "@@AOL@@@@@@@@@@@" "@@AOL@@@@@@@@@@@" "@@AOL@@L@@@@@@CL" "@@AOL@@L@@@@@@CL" "@@COL@@L@@@L@@@@" "@@CK@@@N@@OL@@@@" "@@@@@@@G@@OL@@@@" "A@@@@@@G@@@@@@@@")} 48 . 52) ({(READBITMAP)(32 16 "@@@@CNKJ" "@@@@COKJ" "@@@@GOOE" "@@@@OGEE" "@@@@NJJJ" "@@@@OJJJ" "@@@AMMEE" "@@@COEEH" "@@@CNJJ@" "@@@GJJL@" "@@@OME@@" "@@@OEE@@" "@@@OJJ@@" "@@@OJJ@@" "@@AMMD@@" "@@AMED@@")} 112 . 121))) (40 (({(READBITMAP)(16 24 "@@@@" "@C@@" "@@@@" "@@@@" "@@@@" "@@CH" "@BB@" "@@B@" "@@GB" "@@G@" "@@G@" "@@O@" "@AOH" "@AOL" "@AOL" "@AOL" "@AOH" "@AOH" "@AOH" "@AOH" "BAOH" "FAOH" "@@N@" "@@N@")} 96 . 78) ({(READBITMAP)(48 18 "OKBJJJJJJJJK" "LBGCCCKKKKCK" "HGMOOMMMMMOO" "MDNGGGGGGGGO" "JJFJJJJJJJOJ" "CCOKCKKKKCOK" "MMOOOMMMMMOM" "GGAGGGGGGGGG" "JJLJJJJJJJJK" "CCECCKKKKKKK" "MOKMOMMMMMMM" "GGAOGGGGGGGG" "JJFJJJJJJJOJ" "CCNCCKKKKKOK" "MLGMMMMMMMOM" "GEKGGGGGGGGG" "NMJJJJJJJKJJ" "NAKCCKKKKCOC")} 176 . 91) ({(READBITMAP)(48 7 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "OOHH@OOOOOOO")} 16 . 25) ({(READBITMAP)(64 48 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@B@@@@@@@@@@" "@@@@@B@@@@@@A@@@" "@@@@@@@@@@@@A@D@" "@@@@@@@@@@B@@@D@" "@@@@@@@@@@B@@@@@" "@@@@LD@@@@@@@@@@" "@@@AHD@@@@B@@B@A" "@@@B@@@@@A@@@@@A" "@@@DC@@@@A@@@@@@" "@@@@H@@H@A@@@@@@" "@@@@@@@H@H@@@@@@" "@@@FD@@@@@H@@@@@" "@@AOH@@@@@H@@@@@" "@@AOH@@B@@@@@@D@" "@@CO@@@@@@@@@@@@" "@@GN@@@@@H@@@@@@" "@@OLA@@@@H@@@@@@" "@@OL@@@@@@@@@@@@" "@AOL@@@@@D@@@@@@" "@AOLH@@@@@@@@@@@" "@AOH@@@@@@@@@@@@" "@COH@@@@L@@@@@@@" "@COH@@@HD@@B@@@@" "@COH@@@CH@A@@@@@" "@CN@@@@C@@@@@@@@" "@@N@@@AM@@@@@@@@" "@CH@@@A@A@@@@@@@" "@C@@@@C@@@H@@@@@" "@C@@@@AH@@@@@@@@" "@@@@@@AI@@@@@@@@" "@@@@@@ACL@@@@@@@" "@@@@@@@CL@@@@@@@" "@@@@@@@GL@@@@@@@" "@@@@@@@OL@@@@@@@" "@@@@@@COO@@@@@@@" "@@@@@@AOOH@@@@@@" "@@@@A@COOH@@@@@@" "@@@@@@CON@@@@@@@" "@@@@@@AON@@@@@@@" "@@@@@@AOL@AH@@@@" "@@@@@@AOL@AL@@AN" "@@@@@@@@@@AN@@AN" "@@@@@@@@@@@G@@@@" "@@AH@@@@@C@CH@@@" "@@@@@@@@@CAAK@@@")} 32 . 44))) (40 (({(READBITMAP)(64 18 "OKCEEEEEEEEKNJKJ" "LBFIIIAAAAHGOKKK" "HGLOOMMMMMOIOMOO" "MDOMMMMMMMM@GGOG" "JJGEEEEEEE@EBNJJ" "CCNDLDDDDL@DCOKK" "MMN@@BBBBB@BAOOO" "GG@HHHHHHHHHKOGG" "JJMEEEEEEEEDBIOJ" "CCDLLDDDDDDDGOMK" "MOJB@BBBBBBBCOOO" "GG@@HHHHHHHHKGGG" "JJGEEEEEEE@EBJJO" "CCOLLDDDDD@DCOKO" "MLFBBBBBBB@BOOOO" "GEJHHHHHHHHIGOGG" "NMKEEEEEEDEFJNJJ" "NAJLLDDDDL@KKKKK")} 176 . 91) ({(READBITMAP)(80 74 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@G@" "@@@@@@@@@@@@@@@@@@O@" "@@@@@@@@@@@@@@@@@@N@" "@@@@@D@@@@@@@@@@@@O@" "@@@@HD@@@@@@@@@@@AO@" "@@@@@@@@@@@@@@@@@AO@" "@@@@@@@@@A@@@@@@@AO@" "@@@@@@@@@@@@@@@@@AO@" "@@@@@@@H@@@@@@@@@CO@" "@@@@@@@@@@H@@@@@@CO@" "@@AA@@@@@@@@@@@@@CO@" "@@@A@@@B@@@@@@@@@COH" "@@@B@@@@@@@@@@@@@CO@" "@@@@@@@@@H@@@@@@@CO@" "@@N@A@@@@H@@@@@@@@O@" "@@ND@@@@@@@@@@@@@@O@" "@AN@@@@@@D@@@@@@@@O@" "@AO@H@@@@@@@@@@@@@L@" "@AOH@@@@@@@@@@@@@@@@" "@CO@@@@@L@@@@@@@@@@@" "@GO@@@@H@@@B@@@@@B@@" "AOOH@@@@@@A@@@@@@C@@" "AKN@@@@@@@@@@@@@@@@@" "AON@@@A@@@@@@@@@@@@@" "AON@@@A@A@@@@@@@@@@@" "COL@@@@@@@H@@@@@@A@@" "COH@@@@@@@@@@@@@@A@@" "COH@@@@@@@@@@@@@@@@@" "CN@@@@@@H@@@@@@@@@@@" "GN@@@@@@H@@@@@@@@@@@" "GH@@@@@D@@@@@@@@@@@@" "GH@@@@@O@@@@@@@@@@@@" "F@@@@@CO@@@@@@@@@@@@" "F@@@@@AO@@@@@@@@@@@@" "@@@@A@CO@@@@@@@@@@@@" "@@@@@@COL@@@@@@@@@@@" "@@@@@@AOL@@@@@@@@@@@" "@@@@@@AOL@@@@@@@@@@@" "@@@@@@GOL@@@@@@@@@OK" "@@@@@@GOH@@@@@@F@@OK" "@@@@@@GOL@@A@@@@@@HC" "@@AH@@GOLC@@@@@@@@H@" "@@@@@@COHCA@@@@@@B@@" "@@@@@DCOH@AH@@@@@B@@" "@@@@@@@AH@F@@@@@@@@@" "@@@@@@@AH@G@@@F@@@@@" "@@@@@@@@@@GHH@FL@@@@" "@@H@@@@@@@CL@@CMH@BA" "@@@@@B@@C@AO@COMH@CO" "@@@@@B@@C@@G@GO@@BCH" "@@@@@@@@@@@H@FB@@HG@" "@@@@@@@GHB@@@@@@L@G@" "@@@@@@@GH@@@D@@ALCMH" "@@@@@@@AH@@D@@@AHGMH" "@@@@@@@AH@@G@@@C@GC@" "@@@@@@@@@@BCH@@C@BCL" "@@@@@@@@@@BOH@@C@AH@" "@@@@@@@@@@OOO@LG@AH@" "@@@@@@@@@@OOO@LN@@@@" "@@@@@@@@@COOL@@L@@@@")} 32 . 27))) (40 (({(READBITMAP)(16 2 "@AHC" "@@@C")} 128 . 28) ({(READBITMAP)(48 10 "@@AMH@@A@@@@" "@CHAH@@G@@@@" "@GN@@B@H@@@@" "@FB@@H@@@@@@" "@@@@@@A@D@@@" "D@@@@@AH@@@@" "@@@@@DAH@@@@" "@@@C@DC@@@@A" "H@@A@BCL@LD@" "H@@A@AH@@L@@")} 80 . 30) ({(READBITMAP)(96 55 "@@@@@@@@@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@D@@@@@@@@@@@@@@" "@@@@@@@@HD@@@@@@@@@@@@A@" "@@@@@@@@@@@@@@@@@@@@@@A@" "@@@@@@@@@@@@@A@@@@@@@@F@" "@@@@@@@@@@@@@@@@@@@@@@F@" "@@@@@@@@@@@H@@@@@@@@@@O@" "@@@@@@@@@@@@@@H@@@@@@@O@" "@@@@@@AA@@@@@@@@@@@@@AO@" "@@@@@@@A@@@B@@@@@@@@@AOH" "@@@@@@@B@@@@@@@@@@@@@CO@" "@@@@@@@@@@@@@H@@@@@@@CO@" "@@@@@@H@A@@@@H@@@@@@@CO@" "@@@@@@HD@@@@@@@@@@@@@CO@" "@@@@@A@@@@@@@D@@@@@@@CO@" "@@@@@A@@H@@@@@@@@@@@@CN@" "@@@@@A@@@@@@@@@@@@@@@CN@" "@@@@@OA@@@@@L@@@@@@@@CN@" "@@@@@O@@@@@H@@@B@@@@@CN@" "@@@@AO@@@@@@@@A@@@@@@CN@" "@@@AAK@@@@@@@@@@@@@@@CN@" "@@@@AOB@@@@@@@@@@@@@@CN@" "@@@@GOB@@@@@A@@@@@@@@CH@" "@@@@GO@@@@@@@@H@@@@@@A@@" "@@@@CO@@@@@@@@@@@@@@@A@@" "@@@@OO@@@@@@@@@@@@@@@@@@" "@@@@ON@@@@@@H@@@@AH@@@@@" "@@@GON@@@@@@H@@@@AH@@@@@" "@@@GOH@@@@@@@@@@@@@@@@@@" "@@@EOH@@@@@@@@@@@@@@@@@@" "@@@ON@@@@@C@@@@@@@AH@@@@" "@@@ON@@@@@@A@@@@AHAH@@@@" "@@@ON@@@A@@A@@@@AH@@@@@@" "@@@ON@@@@@@OH@@@@@@@@@@@" "@@@OL@@@@@AOH@@@@@@@@H@@" "@@@OL@@@@@AN@@@@@@@@@H@@" "@@AOL@@@@@GN@@@@@@@@A@CH" "@@AOH@@@@@GOH@@@@@@FA@OH" "@@AOH@@@@@GOL@@A@@@@@@@B" "@@@C@@AH@@GOLC@@@@@@@@@@" "@@@@@@@@@LGOHCA@@@@@@B@@" "@@@@@@@@@LOOL@AH@@@@@B@@" "@@@@@@@@@@OOL@F@@@@@@@@@" "@@@@@@@@@@MMH@G@@@F@@@@@" "@@@@@@@L@@GO@@GHH@FL@@@@" "@@@@@@HL@@GO@@CL@@AMH@@A" "@@@@@@@@@B@@C@AO@CHAH@@G" "@@@@@@@@@B@@C@@G@GN@@B@H" "@@@@@@@@@@@@@@@H@FB@@H@@" "@@@@@@@@@@@GHB@@@@@@@@A@" "@@@@@@@@@@@GH@@@D@@@@@AH" "@@@@@@@@@@@AH@@D@@@@@DAH" "@@@@@@@@@@@AH@@G@@@C@DC@")} 16 . 32))) (40 (({(READBITMAP)(64 18 "OKBJJEEEEEEDABKJ" "LBGCCNNNNNFNJEKK" "HGMOOEMMMMOOONOO" "MDNGGJBBBBBJB@GG" "JJFJJEEEEE@EEAFJ" "CCOKCDDDDL@DD@GK" "MMOOOBBBBB@BB@AO" "GGAGGHHHHHHHH@IG" "JJLJJEEEEEEDAFAJ" "CCECCDDDDDDDD@CK" "MOKMOBBBBBBB@@AO" "GGAOGHHHHHHHHHIG" "JJFJJEEEEE@EEEFO" "CCNCCDDDDD@DD@GO" "MLGMMBBBBB@B@@GO" "GEKGGHHHHHHHH@GG" "NMJJJEEEEDEEE@JJ" "NAKCCDDDDL@LDGKK")} 176 . 91) ({(READBITMAP)(16 58 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@AH@" "@@A@" "@@D@" "@@D@" "@B@@" "@C@@" "@C@@" "@CN@" "@CN@" "@CN@" "@CN@" "@CN@" "@ON@" "@ON@" "@ON@" "@ON@" "@CN@" "@CN@" "@CN@" "@CN@" "@CF@" "@CN@" "@AN@" "@@@@" "@@@@" "@@@@" "@H@@" "@H@@" "A@CH" "@@L@" "@@@@" "@@@@" "@B@@" "@B@@" "@@@@" "@@@@" "@@@@" "H@@A" "@@@A" "@B@@" "@@@@" "@@@@" "@@@H" "@@@H" "@D@@" "@BB@" "@@@@" "@@@@")} 96 . 29) ({(READBITMAP)(64 52 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@H@@@@" "@@@@@@@@@@@@@@H@" "@@@@@@A@@@@@@@@@" "@@@@@@@@@@@B@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@H@@" "@@@@@@@@A@@@@H@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@D@@" "@@@@@@@@H@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@A@@@@@@@@@" "@@@@@@@@@@@H@@@B" "@@@@@@@@@@@@@@A@" "@@@A@@@@@@@@@@@@" "@@@@@AB@@@@@@@@@" "@@@@@AB@@@@@A@@@" "@@@@@@@@@@@@@@H@" "@@@@@@@@@@@@@@@@" "@@@@@A@@@@@@@@@@" "@@@@@@@@@@@@H@@@" "@@@@@@@@@@@@H@@@" "@@@G@@@@@@@@@@@@" "@@@@L@@@@@@@@@@@" "@@@@H@@@@@C@@@@@" "@@@AH@@@@@@@@@@@" "@@@AL@@@A@@@@@@@" "@@@AH@@@@@@AH@@@" "@@@OH@@@@@@@@@@@" "@@AOH@@@@@@@@@@@" "@@AOH@@@@@C@@@@@" "@@COH@@@@@D@H@@@" "@@GOH@@@@@DLH@@A" "@@GO@@AH@@GLLC@@" "@@GN@@@@@LGL@CA@" "@@GN@@@@@HOL@@AH" "@@GN@@@@@@OLL@F@" "@@GN@@@@@AONH@@@" "@@CN@@@L@AON@@@@" "@@CN@@HL@AOO@@@@" "@@CN@@@@@COOC@@@" "@@CH@@@@@COLC@@@" "@@CH@@@@@GOL@@@@" "@@AH@@@@@GON@B@@" "@@@@@@@@@GOO@@@@" "@@@@@@@@@@LA@@@D" "@@@@@@@@@@L@@@@G")} 16 . 32) ({(READBITMAP)(64 25 "@@B@@@@@@@@@@@AM" "@@BH@@@@@@@@@@AO" "@@@@H@@A@@@@@@@N" "@@@@@@@A@@@@@@@O" "@@D@@B@@@@@@@@@M" "@@B@@@@@@@@@@@@M" "@@@@@@@@@@@@L@@N" "D@@@@@@H@@@@@@@N" "@@@@@@@H@@@@@@@N" "@@@C@D@@@@@A@@@G" "H@@@@BB@@@@@@@@F" "H@@@@@@@@@@@B@HG" "O@LB@@@@@H@@@@@C" "O@LB@@@@@@@@@@@C" "L@@L@@@@@@@@@@@C" "L@@@@@@@@@@@@@@C" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@C" "@@@@@@@@@@@@@@@A" "H@@L@@@C@@@@@@@A" "H@@L@COKC@@@C@@A" "L@@@@GOOC@OICH@A" "H@@@@GOO@@ONCL@A" "@@@@AOOO@@OO@L@@")} 80 . 17))) (40 (({(READBITMAP)(112 68 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@A" "@@@@@@@@@@@@@@@@@@@@@@@@@@@A" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@A" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@G@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@" "@@@@@@@@@@@@@@@@@@@@@OH@@@@@" "@@@@@@@@@@@@@@H@@@@@@ON@@@@@" "@@@@@@@@@@@@@@@@@@@@@CN@@@@@" "@@@@@@@@@@@@@@@@@@@@@CN@@@@@" "@@@@@@@@@@@@@@@@@@@@@GN@@@@@" "@@@@@@@@@@@@@@@@@@@@@GN@@@@@" "@@@@@@@@@@@@@@@@@@@@@GF@@@@@" "@@@@D@@@@@@@@@@@@@@@@ON@@@@@" "@@@@H@@@@@@@@@@@@@AH@ON@@@@@" "@@@@H@@@@@@@@@@@@@A@@ON@@@@@" "@@@@@@@@A@@@@@@@@@@@@ON@@@@@" "@@@@@@@@@@@@@@@@@@@@@ON@@@@@" "@@@LH@@@@@@@@@@@@@@@AOL@@@@@" "@@@DH@@@@@@@@@@@@@@@AOL@@@@@" "@@@D@@@@@@@@@@@@@L@@AOOH@@@@" "@@BD@@@@@@D@@@@@@L@BAOL@@@@@" "@@FDH@@@@@DD@@@A@@@@@OL@@@@@" "@@G@@@AH@@@D@@@@@@@@@OL@@@@@" "@@G@@@@@@H@D@@@@@@@@@O@@@@@@" "@@GH@@@@@HL@@@@H@@@@@B@@@@F@" "@AOL@@@@@@@@@@D@L@@@@@@@@@@B" "@AOL@@@@@@@BH@@@L@B@@@@@@@@@" "@AOL@@@@@@@B@@@@@@BH@@@@@@@@" "@AOL@@@D@ANC@@@@@@@@H@@A@@@@" "@COL@@@@@ANCA@@@@@@@@@@A@@@@" "@COH@@@@@AN@A@@@@@D@@B@@@@@@" "@COH@@@@@AO@@@@@@@B@@@@@@@@@" "@COH@@@@@AON@B@@@@@@@@@@@@@@" "@CO@@@@@@AOO@@@@D@@@@@@H@@@@" "@AO@@@@@@GMI@@@D@@@@@@@H@@@@" "@AO@@AHH@OOH@@@G@@@C@D@@@@@A" "@AO@@AHH@OOL@@BCH@@@@BB@@@F@" "@AO@@@@@@OOL@@BOH@@@@@@@@@F@" "@AO@@@@@AOO@@@OOO@LB@@@@@H@@" "@AO@@@@@AOO@@@OOO@LB@@@@@@@@" "@AN@@@@@AOO@@COOL@@L@@@@@@@@" "@@@@@@@@@OO@@COOL@@@@@@@@@@@" "OOHH@OOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@AOOO@@@@@@@@@@@@" "@@@@@@@@@@@@AOOO@@@@@@@@@@@@" "@@@@@@@@@@@@AOOOH@@L@@@C@@@@" "@@@@@@@@@@@@AOOOH@LL@COKC@@@" "@@@@@@@@@@@@@OOGL@L@@GOOC@OI" "@@@@@@@@@@@@@OOOH@L@@GOO@@ON" "@@@@@@@@@@@@@@OK@@L@AOOO@@OO" "@@@@@@@@@@@@@@@@@@@@COOO@@OO" "@@@@@@@@@@@@@@@@@@@@GOOO@@MO" "@@@@@@@@@@@@@@@@@@@@OOOOHLLO" "@@@@@@@@@@@@@@@@@@@@AOOOHN@O" "@@@@@@@@@@@@@@@@@@@@@OON@F@O" "@@@@@@@@@@@@@@@@@@@@@MON@F@O")} 16 . 11))) (40 (({(READBITMAP)(64 18 "JJJEEEEDAEDBOJJJ" "CCKFNNFNJNNEOKKC" "OMMEMMOOOMOLOOOO" "GGGJBBBJBBJ@OGGG" "JJJEEE@EEAEECJJJ" "CKKDDL@DD@DDCKCC" "OMMBBB@BB@@@AOOO" "GGGHHHHHH@HHIGGG" "JJJEEEEDAF@EDJJK" "CKKDDDDDD@BDEKCC" "OMMBBBBB@@@@COOO" "GGGHHHHHHHHHIGGG" "JJJEEE@EEEE@FJJK" "CKKDDD@DD@D@GCCB" "MMMBBB@B@@@@GOOO" "GGGHHHHHH@HHGGGG" "JJJEEDEEEAEDJJJK" "CKKDDL@LDDDGKCCB")} 192 . 91) ({(READBITMAP)(32 31 "@@@@@@AO" "@@@@@@AM" "@@@@@@AM" "@@@@@@AO" "@@@@@@@N" "@@@@@@@O" "@@@@@@@M" "@@@@@@@M" "@@@@@@@N" "@@@@@@@N" "@@@@@@@N" "@@@@@@@G" "@@@@@@@F" "@@@@@@@G" "@@@@@@@C" "@@@@@@@C" "@@@@@@@C" "@@@@@@@C" "OOOOOOOO" "OOOOOOOO" "@@@@CH@C" "@@@@OH@A" "@@AHO@@A" "C@@@A@@A" "C@OICH@A" "@@ONCL@A" "@@OO@L@@" "@@OO@@@@" "@@MOH@@@" "HLLOH@@@" "HN@OH@B@")} 112 . 13) ({(READBITMAP)(48 31 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@B@@" "@@@@@@@@@B@@" "@@@@@@@@@A@@" "@@@@@@@@@A@@" "@@@@@@@@@A@@" "@@@@@@@@@C@@" "@@@@@@@@@CH@" "@@@@@@@@@CH@" "@@@@@@@@@GH@" "@@@@@@@@@GN@" "@@@@@@@@@OL@" "@@@@@@@@@OL@" "@@@@@@@@AOO@" "@@@@@@@B@OL@" "@@@@@@@@@OL@" "@@@@@@@@@OL@" "@@@@@@@@AO@@" "@@@H@@@@CO@@" "@@D@D@@@CO@@" "@@@@@@B@CO@@" "@@@@@@BHGOH@" "@@@@@@@@OOHA" "A@@@@@@@GOHA" "A@@@@@D@FOH@" "@@@@@@B@AOH@" "@B@@@@@@AKH@" "@@@@D@@@@CHH")} 64 . 34) ({(READBITMAP)(48 36 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@D@" "@@D@H@@@@@@D" "@@F@@@A@@@@@" "@@D@@@@@@@@@" "@@D@@@@@@HL@" "@@OH@@@@@@@@" "@@M@@@@@@@@B" "@@M@@@@@@@@@" "@@GH@@@D@@@@" "@AOH@@@@@@DA" "@COH@@@@@@@@" "@COH@@@@@@@@" "@COH@@@@@AL@" "@CO@@@@@@ALA" "@AO@@@@@@GOA" "@CO@@AHH@OOH" "@CO@@AHH@OIH" "@GO@@@@@@OOL" "@GO@@@@@AOO@" "@GO@@@@@AOO@" "@GN@@@@@AOO@" "@@@@L@@@@OO@" "OOHHOOOOOOOO" "OOOOOOOOOOOO" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@L@@@D" "@@@@@@OL@@@D" "@@@@@@O@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@AH")} 16 . 15))) (40 (({(READBITMAP)(16 1 "@L@@")} 80 . 8) ({(READBITMAP)(96 48 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@D@@" "@@@@@@@@@@@@@@@@@@@@@F@@" "@@@@@@@@@@@@@@@@@@@@@N@@" "@@@@@@@@@@@@@@@@@@@@@L@@" "@@@@@@@@@@@@@@@@@@@@CN@@" "@@@@@@@@@@@@@@@@@@@@AN@@" "@@@@@@@@@@@@@@@@@@@@CN@@" "@@@@@@@@@@@@@@@@@@@@CO@@" "@@@@@@@@@@@@@@@@@@@HCOH@" "@@@@@@@@@@@@@@@@@@@@COH@" "@@@@@@@@@@@@@@@@@@@@COH@" "@@A@@@@@@@@@@@@@@@D@BOH@" "@@@@@@@@@@@@@@@@@@@@COH@" "@@D@@@@@@@@@@@@@@@@@COH@" "@@L@@@@@@@@@@@@@D@@@CGL@" "@@L@@@@@@@@@@@@D@@@@AGL@" "@@L@@@@@@@@@@@@G@@@CAOL@" "@CL@@@@@@@@@@@BCH@@@AON@" "@GO@@@@@@@@@@@BOH@@@ANL@" "@GO@@@@@@CI@@@OOO@LBAOL@" "@GO@@@@@AOO@@@OOO@LB@OH@" "@GN@@@@@AOO@@COOL@@L@G@@" "@@@@@@@@@OO@@COOL@@@@@@@" "OOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@AOOO@@@@@@@@" "@@@@@@@@@@@@AOOO@@@@@@@@" "@@@AL@@L@@@DAOOOH@@LD@@C" "@@@@@@OL@@@DAOOOH@LLDCOK" "@@@B@@O@@@@@@OOGL@L@HGOO" "@CH@@@@@@@@@@OOOH@LAHGOO" "@C@@@@@@@@@@@@OK@@L@AOOO" "@@@@@@@@@@@@@@@@@@@@COOO" "@@@@@@@@@@AH@@@@@@@@GOOO" "@@B@@@@@@@@@@@@@@@@@OOOO" "@@CH@@@@@@@@@@@@@@@@AOOO")} 16 . 13))) (40 (({(READBITMAP)(16 1 "@@@A")} 32 . 12) ({(READBITMAP)(16 1 "@@@B")} 80 . 32) ({(READBITMAP)(64 18 "JJJJJEEDAEDE@BJJ" "CCKKKFFNJNNNJEKC" "OMMMMEOOOMOOOLOO" "GGGGGJBJBBJBB@OG" "JJJJJE@EEAEE@EFJ" "CKKKKL@DD@DD@DOC" "OMMMMB@BB@@@@@AO" "GGGGGHHHH@HHHHIG" "JJJJJEEDAF@EEEDK" "CKKKKDDDD@BDDDMC" "OMMMMBBB@@@@B@AO" "GGGGGHHHHHHHHHIG" "JJJJJE@EEEE@EEFK" "CKKKKD@DD@D@DLOB" "MMMMMB@B@@@@@@GO" "GGGGGHHHH@HHHHGG" "JJJJJDEEEAEEEDJK" "CKKKKL@LDDDDDOCB")} 192 . 91) ({(READBITMAP)(16 20 "@L@@" "@L@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OOOO" "OOOO" "@@@@" "@@@@" "@@@D" "@@@D" "@@@@" "@L@@" "@L@@" "@@@@" "L@AH" "L@@@" "L@@@")} 48 . 13) ({(READBITMAP)(32 11 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@C" "@@@@@@@C" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@")} 16 . 27) ({(READBITMAP)(32 23 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "B@H@@@@@" "@@@@@@@@" "@C@@@@@@" "@GL@@@@@" "@GN@@@@@" "ACL@AH@@" "BCL@AH@@" "BGN@@@@@" "COOH@@@@" "COOH@@@@")} 96 . 26))) (40 (({(READBITMAP)(16 22 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OOOO" "OOOO" "@@@@" "@@@@" "L@@L" "@AOL" "@AO@" "@AO@" "@@O@" "@@G@" "@@@@" "@@@@" "AOH@" "AOHA" "@AH@" "@AH@")} 32 . 10) ({(READBITMAP)(32 5 "C@@@@L@@" "CH@@@L@@" "AH@@@@H@" "@@@@@@L@" "@@@@@@A@")} 64 . 10) ({(READBITMAP)(80 10 "@@@@@@ML@@@@B@@@@@@@" "@@@@@@OLD@@@@@@@@@@@" "@@@@@@GL@@@@@B@@@@@@" "@@@@@@GN@@@B@@@@@@@@" "@@@@@@GK@@@@@@B@@@@@" "@@@@@@BOH@@@@A@@@@@@" "@@@@@@OOH@LB@@@@@@@@" "@@@@@@LOH@LB@@@@@@@@" "@@@@@CLOH@@L@@@@@@@@" "@@@@@COOH@@@@@@@@@@@")} 48 . 26))) (40 (({(READBITMAP)(16 4 "@@H@" "@@L@" "@@C@" "@@C@")} 48 . 6) ({(READBITMAP)(16 2 "@@@C" "@@@C")} 0 . 20) ({(READBITMAP)(48 18 "JJEDAEDE@EBJ" "KKNNJNNNJNEC" "MMGOOMOOOOLO" "GGJJBBJBBB@O" "JJ@EEAEE@EEF" "KC@DD@DD@DLO" "MM@BB@@@@@@A" "GGHHH@HHHHHI" "JJEDAF@EEEEE" "KKDDD@BDDDLM" "MMBB@@@@B@@A" "GGHHHHHHHHHI" "JJ@EEEE@EEEG" "KK@DD@D@DLLN" "MM@B@@@@@@@G" "GGHHH@HHHHHG" "JKEEEAEEEEDK" "KC@LDDDDDLOB")} 208 . 91) ({(READBITMAP)(32 14 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "H@@@@@@@" "H@@@@@@@" "H@@@@@@@" "H@@@@@@@")} 80 . 27))) (40 (({(READBITMAP)(64 18 "JJJDAEDE@EEBNO@@" "KKCFJNNNJNNMFO@@" "MMOGOMOOOOOLMO@@" "GGGBBBJBBBB@OO@@" "JJOEEAEE@EEEAK@@" "KCODD@DD@DLLJK@@" "MMOBB@@@@@@@AO@@" "GGGHH@HHHHHHEG@@" "JJJDAF@EEEEDAK@@" "KKKDD@BDDDLLCC@@" "MMMB@@@@B@@@MO@@" "GGGHHHHHHHHHAG@@" "JJOEEEE@EEED@K@@" "KKODD@D@DLLMCF@@" "MMOB@@@@@@@@EN@@" "GGGHH@HHHHHHGF@@" "JKJEEAEEEEEEJN@@" "KCOLDDDDDLLNKF@@")} 208 . 91))) (40 (({(READBITMAP)(80 21 "JJJKNJKJOJJJNO@@@@@@" "KKCJ@DDD@DDLFO@@@@@@" "MMONEGEEEEEDAO@AH@@@" "GGGNGGOGGGGGAONOH@@@" "JJOK@D@@E@@@BKOOH@@@" "KCOJD@DD@DLLICOOL@@@" "MMOLB@@@@@@@@GOOL@@@" "GGGFH@HHHHHHDKOOH@@@" "JJJJAF@EEEED@GOOH@@@" "KKKJD@BDDDLLBOOL@@@@" "MMML@@@@B@@@LCGN@@@@" "GGGFHHHHHHHH@KCI@@@@" "JJOKEEE@EEEDCG@@@@@@" "KKOJD@D@DLLM@N@L@@@@" "MMOL@@@@@@@@BFOL@@@@" "GGGFH@HHHHHHHFOL@@@@" "JKJKEAEEEEEDDOON@@@@" "KCOBDDDDDLLMGGOO@@@@" "MOON@@@@@@@@EOOOH@@@" "GGOGGGGGGGGGGGOCH@@@" "JJJJJJJJJJJMNONCH@@@")} 208 . 88))) (40 (({(READBITMAP)(32 26 "OO@@N@@@" "GO@AN@@@" "NOGOO@@@" "FOGOO@@@" "AOOOH@@@" "AOOOK@@@" "BK@OOH@@" "ICAOOH@@" "@GCOL@@@" "DKCON@@@" "@GION@@@" "BOLOL@@@" "LCOAKL@@" "@KOMOL@@" "CGNOO@@@" "@ONGN@@@" "BFCOGL@@" "HFGOOL@@" "DNGGL@@@" "GFGNO@@@" "EOONO@@@" "GEON@@@@" "NLCN@@@@" "CDCN@@@@" "ML@F@@@@" "GL@F@@@@")} 256 . 85))) (40 (({(READBITMAP)(64 22 "JJJKNJKJOJJJNO@G" "KKCKODDD@DDLIGGO" "MMOOO@JJJJJJHAOO" "GGGOGOOGGGGGGLHO" "JJOJJCOOJOOOHLHG" "KCOKK@DD@DLLIDLO" "MMOMM@@@@@@@@@LO" "GGGGG@HHHHHHDHNO" "JJJKNF@EEEED@DNG" "KKKKK@BDDDLLBLNC" "MMMMO@@@B@@@L@NC" "GGGGGHHHHHHH@HNG" "JJOJJEE@EEEDCDNG" "KKOKK@D@DLLM@HMO" "MMOMO@@@@@@@BAOK" "GGGGG@HHHHHHHIKO" "JKJJJAEEEEEDEACO" "KCOCKDDDDLLMDIKN" "MOOOO@@@@@@@BCON" "GGOGGGGGGGGGGDOO" "JJJJJJJJJJJMNLCO" "KKKKKKKKKCCGCDAN")} 208 . 87) ({(READBITMAP)(16 33 "AH@@" "AH@@" "CH@@" "OOOH" "OOOH" "O@GH" "O@OH" "H@O@" "K@O@" "OHO@" "OH@@" "L@@@" "N@@@" "N@@@" "L@@@" "KL@@" "OL@@" "O@@@" "N@@@" "GL@@" "OL@@" "L@@@" "O@@@" "O@@@" "AH@@" "CN@@" "ON@@" "ON@@" "GN@@" "@N@@" "@N@@" "@N@@" "@N@@")} 272 . 81))) (40 (({(READBITMAP)(80 48 "KKKKKOCCCL@@@@@@AL@@" "MMOOMOOOON@@@@@AIL@@" "GGOGGGOGGF@@@@@AH@@@" "JJJNJMJJKN@@@@@C@@@@" "KKKOKOKCCF@@@@AK@@@@" "MOOOOOOOOF@@@@CH@@@@" "OOGOGMOGGN@@@@G@@@@@" "ONKJJOJJKN@@CHFAL@@@" "LOKKKOKCBO@@ONGIL@@@" "MOOOOOOONO@@OOOKL@@@" "OOGOGOGGGO@@GKIK@@@@" "KJNJJNJJJG@AOCAH@@@@" "KKKKKKKCCO@AO@@@@@@@" "OOOOOOOOOO@OOOOH@@@@" "OGGOGOGGGO@OOOOH@@@@" "NJKJOJJJNO@@O@GH@@@@" "OKDD@DDLI@HAL@OH@@@@" "OMBJJJJJHJFCO@O@@@@@" "GGGGGGGGGOKCO@O@@@@@" "JNGOJOOOHNGHGHO@@@@@" "KODD@DLLIDOMKL@@@@@@" "MO@@@@@@@@OMKL@@@@@@" "GOHHHHHHDHON@L@@@@@@" "NI@EEEED@DONN@F@@@@@" "KOBDDDLLBLONN@F@MH@@" "OO@@B@@@L@ONMLF@MH@@" "GGHHHHHH@IOOML@@@@@@" "JJE@EEEDCEOOI@CL@@@@" "KOD@DLLM@IOMN@COH@@@" "OO@@@@@@BAOLOLCOH@@@" "GOHHHHHHHIOHGL@O@@@@" "JNEEEEEDEAO@G@@L@@@@" "KKDDDLLMDIN@C@@@@@@@" "OO@@@@@@BAL@CH@@@@@@" "GGGGGGGGGDALCKHCH@@@" "JJJJJJJMNLAOOOIKH@@@" "KKKKKCCGCD@OONCOH@@@" "OOMOOOOOML@OKNCOH@@@" "GGGGGG@KGL@OONCO@@@@" "JJOJJJ@NJH@@ONCO@@@@" "OKOKK@@GCHC@CLCOL@@@" "OMOOOLAMMHCOOLCCL@@@" "OGGGGFBOGHGOLN@AL@@@" "OJJJJJJJKHGOLLGN@@@@" "OKKKKCGCC@CO@@GN@@@@" "OOOOOMLMO@OO@@GO@@@@" "GGGGGGGGGCOK@@@G@@@@" "JJJJJJNKNCO@@@@C@@@@")} 224 . 76))) (40 (({(READBITMAP)(16 18 "OKKD" "OMOB" "GGOO" "JNJG" "KOKD" "MOO@" "GOGH" "NIOE" "KOMD" "OOO@" "GGGH" "JJJ@" "KOK@" "OOO@" "GOGH" "JNJE" "KKKD" "OOO@")} 224 . 90) ({(READBITMAP)(48 61 "GH@@@@@@@@GH" "KH@@@@@@@AOH" "CH@@@@@@AKH@" "ML@@@@@@AKL@" "GL@@@@@@CIL@" "JL@@@@@@C@@@" "CL@@@@L@AL@@" "ON@@@@LAIL@@" "GF@@@@@AH@@@" "KN@@@@@C@@@@" "CF@@@@AK@@@@" "OF@@@@CH@@@@" "GN@@@@G@@@@@" "KN@@CHFAL@@@" "BO@@ONGIL@@@" "NO@@OOOKL@@@" "GO@@GKIK@@@@" "JG@@OCAH@@@@" "CO@@O@@@@O@@" "OO@@OOOIOO@@" "GO@@OOOAOO@@" "NO@@GGOHOO@@" "I@OH@COHCO@@" "HJMNAAOHCO@@" "GOHCAAOHC@@@" "HNEGIIN@@@@@" "IDOOMLN@@@@@" "@@OOML@@@@@@" "DHOONL@@@@@@" "@DOON@F@@@@@" "BLOON@F@MH@@" "L@OONLF@MH@@" "@IOONL@@@@@@" "CEOON@CL@@@@" "@IOOL@COOH@@" "BAOOMLCOOH@@" "HIOOOLAOO@@@" "EAOOC@AON@@@" "DIONC@AON@@@" "BAOLCHAOH@@@" "GD@@CKIO@@@@" "NL@HCOIN@@@@" "CD@HCNB@@@@@" "ML@ACNBAH@@@" "GL@GONBA@@@@" "JH@@ON@@AO@@" "CHF@CL@@AO@@" "MHF@OL@@GO@@" "GH@@DN@@OO@@" "KHF@DLDFOO@@" "C@FF@@DDGO@@" "O@@F@@@@GO@@" "GBF@@@@@GO@@" "N@F@CH@@GO@@" "N@@@OL@@GO@@" "L@@AOL@@GN@@" "L@@GOH@@GN@@" "L@AOO@@@@F@@" "H@AON@@@@@@@" "H@AOH@@@@@@@" "@@@CH@@@@@@@")} 256 . 69))) (40 (({(READBITMAP)(16 18 "OKKK" "OMOO" "GGOG" "JNJJ" "KOKK" "MOOO" "GOGG" "NIOJ" "KOMK" "OOOO" "GGGG" "JJJO" "KOKO" "OOOO" "GOGG" "JNJJ" "KKKK" "OOOO")} 224 . 90) ({(READBITMAP)(80 76 "OKOL@@@@@@@@F@@@@@@@" "MMMN@@@@@@@@F@@@@@@@" "GGGO@@@@@@@@F@@@@@@@" "JJJOH@@@@@@AN@@@@@@@" "KKKCL@@@@@@CH@@@@@@@" "OMOMN@@@@@@C@@@OH@@@" "GGGGG@@@@@@C@@AOH@@@" "JJJJK@@@@@@L@@AON@@@" "KKKKC@@@@@@L@@CON@@@" "OOMMOH@@@@@@@COOL@@@" "GGGGGH@@@@@@@COOH@@@" "JJJJKH@@@CA@@@KOH@@@" "KKKKCH@@@DC@A@H@@@@@" "MOOOML@@@DC@A@H@@@@@" "GGGGGL@@@@L@@@@@@@@@" "NNNJJL@@@@L@@@@@@@@@" "KOCCCL@@AKL@@@@@@@@@" "MOOOON@@AOLAH@@@@@@@" "GGOGGF@@MLLAH@@@@@@@" "JMJJKN@@D@@C@@@@@@@@" "KOKCCF@@D@AK@@@@@@@@" "OOOOOF@L@@CH@@@@@@@@" "GMOGGN@L@@G@@AH@@@@@" "JOJJKN@LCHFALAH@L@@@" "KOKCBO@@ONGIL@@AOH@@" "OOOONO@ALOOKL@@COH@@" "GOGGGO@ALAIKC@@CON@@" "JNJJJG@@@AAHC@@OON@@" "KKKCCO@N@@@@CFLOOL@@" "OOOOOO@NFMOK@@LGOH@@" "GOGGGO@@FLOG@@@GN@@@" "OJJJNO@@@@OO@@@CN@@@" "@DDLI@OOH@OO@@@@@@@@" "BJJJHJMEN@OOB@@@@@@@" "OGGGGOH@C@OOC@@@@@@@" "BOOOHNEEGHNG@@@@@@@@" "@DLLIDOOOLNC@@@@@@@@" "@@@@@@OOOL@@@@@@@@@@" "HHHHDHOOON@@@@@@@@@@" "EEED@DOOONF@@@@@@@@@" "DDLLBLOOONF@MH@@@@@@" "B@@@L@OOONF@MH@@@@@@" "HHHH@IOOON@@@@@@@@@@" "EEEDCEOOON@@@@@@@@@@" "DLLM@IOOOLB@AH@@@@@@" "@@@@BAOOOLBGGOH@@@@@" "HHHHHIOOOH@GGOH@@@@@" "EEEDEAOOO@@FGON@@@@@" "DLLMDIOOO@@FGON@@@@@" "@@@@BAOOMH@COOH@@@@@" "GGGGGD@@CKI@OOH@@@@@" "JJJMNL@HCOI@OO@@@@@@" "KCCGCD@HCNC@ON@@@@@@" "OOOOML@ACNBAOL@@@@@@" "GG@KGL@GONBAG@@@@@@@" "JJ@NJH@@ON@@@@@@@@@@" "K@@GCHF@CL@@@@AH@@@@" "OLAMMHF@OL@@@@AH@@@@" "GFBOGH@@DN@@@@CH@@@@" "JJJJKHF@DLDF@@OH@@@@" "KCGCC@FF@@DD@AON@@@@" "OMLMO@@F@@@@@CON@@@@" "GGGGGBF@@@@@@AON@@@@" "JJNKN@F@@@@@@AON@@@@" "KKCCN@@@C@@@@AON@@@@" "OMJLL@@@C@L@@AON@@@@" "GAOAL@@@@@L@@AON@@@@" "J@JKL@@D@@@@@AON@@@@" "J@KCH@@@@IH@@AOL@@@@" "NAEMH@@@@IH@@COH@@@@" "GCOG@@@@@OH@@@OH@@@@" "JKBK@@@@COH@@@@@@@@@" "KBKO@@@@COH@@@@@@@@@" "OOMG@@@AOOH@@@@@@@@@" "GANN@@@COOH@@@@@@@@@" "JAIF@@@COOH@@@@@@@@@")} 240 . 64))) (40 (({(READBITMAP)(80 86 "COH@@@@@@@@@@AN@@@@@" "MON@@@@@@@@@@GN@@@@@" "GGO@@@@@@@@@@OL@@@@@" "OJKH@@@@@@@@@OL@@@@@" "OKOL@@@@@@@@FGH@@@@@" "MMMN@@@@@@@@GO@@@@@@" "GGGO@@@@@@@@GL@@@L@@" "JJJOH@@@@@@AN@@@OL@@" "KKKCL@@@@@@CH@@@OO@@" "OMOMN@@@@@@C@@@HOO@@" "GGGGG@@@@@@C@@AHOO@@" "JJJJK@@@@@@L@@@@ON@@" "KKKKC@@@@@@L@@@AOO@@" "OOMMOH@@@@@@@@@GOO@@" "GGGGGH@@@@@@@@@A@@@@" "JJJJKH@@@CA@@F@@@@@@" "KKKKCH@@@DC@AF@@@@@@" "MOOOML@@@DC@A@@@@@@@" "GGGGGL@@@@L@@F@L@@@@" "NNNJJL@@@@L@@F@L@@@@" "KOCCCL@@AKL@@@@L@@@@" "MOOOON@@AOLAH@@@@@@@" "GGOGGF@@MLLAHCL@@@@@" "JMJJKN@@D@@C@CL@@@@@" "KOKCCF@@D@AK@@@@@@@@" "OOOOOF@L@@CH@@@@AH@@" "GMOGGN@L@@G@@AH@AL@@" "JOJJKN@LCHFALAH@CL@@" "KOKCBO@@ONGIL@@ACON@" "OOOONO@ALOOKLN@COON@" "GOGGGO@ALAIKCO@COON@" "JNJJJG@@@AAHCO@COON@" "KKKCCO@N@@@@GOL@OON@" "OOOOOO@NFMOKGOL@C@@@" "GOGGGO@@FLOGGO@@@@@@" "OJJJNO@@@@@GGO@@@@@@" "OLDLI@OOOL@AON@@@@@@" "OIEEGEBJJO@AN@@@@@@@" "GCGGGOH@@AH@A@@@@@@@" "OL@@GAJJJKL@@@@@@@@@" "OLLLIDOOOON@@@@@@@@@" "OH@@@@OOOON@@@@L@@@@" "G@HHDHOOOOO@@@@L@@@@" "JMED@DOOOOO@@@@@@@@@" "KLLLBLOOOOO@@F@@@@@@" "MH@@L@OOOOO@@F@@@@@@" "G@HH@IOOOOO@@@@@@@@@" "JMEDCEOOOOO@@@AH@@@@" "KDLM@IOOOON@@@AH@@@@" "OH@@BAOOOONADGKH@@@@" "G@HHHIOOOOL@@OOH@@@@" "JMEDEAOOOOH@@OOH@@@@" "KDLMDIOOOO@FAOOH@@@@" "OH@@BAOOOFCCAOOH@@@@" "GGGGGD@@BAK@COOH@@@@" "JJJMNL@HBCK@COMH@@@@" "KCCGCD@HBBC@COOL@@@@" "OOOOML@A@BCLCMOL@@@@" "GG@KGL@GHHCLC@CL@@@@" "JJ@NJH@@@A@L@@@H@@@@" "K@@GCHF@@GFL@@@@@@@@" "OLAMMHF@OMOL@@@@@@@@" "GFBOGH@@DOOL@@@@@@@@" "JJJJKHF@DMON@AH@@@@@" "KCGCC@FF@AOL@AHN@@@@" "OMLMO@@F@ON@L@@N@@@@" "GGGGGBF@@ON@@@DOL@@@" "JJNKN@F@@CH@AHGOL@@@" "KKCCN@@@CCL@AHGOL@@@" "OMJLL@@@C@LAIHOON@@@" "GAOAL@@C@@@CIHOON@@@" "J@JKL@@G@@@C@@GON@@@" "J@KCH@@@@AH@@@GON@@@" "NAEMH@@@@@H@@@GON@@@" "GCOG@@@@@@H@@@OON@@@" "JKBK@@@@@@AH@@AOL@@@" "KBKO@@@LC@@N@@AOL@@@" "OOMG@@@L@D@N@@AMH@@@" "GANN@@@L@D@N@@@AH@@@" "JAIF@@@C@OON@@@@@@@@" "J@JL@@@@@@ON@@@@@@@@" "MCLL@@@@AOON@@@@@@@@" "GMGL@@@NAOOL@@@@@@@@" "JJKH@@@NAOON@@@@@@@@" "KOOH@@@@AOOOL@@@@@@@" "MOGH@@@@AOIML@@@@@@@")} 240 . 58))) (40 (({(READBITMAP)(16 5 "IJFA" "ICOO" "OL@A" "FMOO" "IJKJ")} 144 . 104) ({(READBITMAP)(80 99 "@@@@@@@@@@@@@@AN@@@@" "@@@@@@@@@@@@@@COH@@@" "N@@@@@@@@@@@@@GOH@@@" "OL@@@@@@@@@@@@GOH@@@" "COH@@@@@@@@@@AON@@@@" "MON@@@@@@@@@@GOH@@@@" "GGO@@@@@@@@@@NF@@@@@" "OJKH@@@@@@@@@LD@@GL@" "OKOL@@@@@@@@FDH@AOL@" "MMMN@@@@@@@@GI@@AOL@" "GGGO@@@@@@@@GH@@@OL@" "JJJOH@@@@@@AN@@@COL@" "KKKCL@@@@@@CH@@@GOL@" "OMOMN@@@@@@C@@@HCOL@" "GGGGG@@@@@@C@@AHCOL@" "JJJJK@@@@@@L@@@@COL@" "KKKKC@@@@@@L@@@@COL@" "OOMMOH@@@@@@@@@FGO@@" "GGGGGH@@@@@@@@@@@@@@" "JJJJKH@@@CA@@F@CH@@@" "KKKKCH@@@DC@AGOCH@@@" "MOOOML@@@DC@AAO@@@@@" "GGGGGL@@@@L@@F@L@@@@" "NNNJJL@@@@L@@F@L@@@@" "KOCCCL@@AKL@@@@L@@@@" "MOOOON@@AOLAHGH@@@@@" "GGOGGF@@MLLAHGML@@@@" "JMJJKN@@D@@C@CML@@@@" "KOKCCF@@D@AK@OMH@@LH" "OOOOOF@L@@CH@MOHAHOL" "GMOGGN@L@@G@@MN@ALGH" "JOJJKN@LCHFAMOL@CMOH" "KOKCBO@@ONGIMOLACOOH" "OOOONO@ALOOKMOLCOOOH" "GOGGGO@ALAIKCOHCOOO@" "JNJJJG@@@AAH@B@COOO@" "KKKCCO@N@@@@D@@@OON@" "OOOOOO@NFMOKF@@@C@@@" "GOGGGO@@FLOG@@@F@@@@" "OJJJNO@@@@@F@@@F@@@@" "OKLLI@OOOOL@@AH@@@@@" "OOIEGEBJJJO@@AH@@@@@" "GGCGGOH@@@AH@@@@@@@@" "OJL@GAJJJJKL@@@@@@@@" "OKDLIDOOOOON@@@@@@@@" "OOH@@@OOOOON@@@L@@@@" "GG@HDHOOOOOO@@@L@@@@" "JJMD@DOOOOOO@@@@@@@@" "KKDLBLOOOOOO@@@@@@@@" "MOH@L@OOOOOO@@@@@@@@" "GG@H@IOOOOOO@@@@@@@@" "JJMDCEOOOOOO@@AH@@@@" "KCDM@IOOOOON@@@@@@@@" "OOH@BAOOOOON@L@@@@@@" "GG@HHIOOOOOL@L@H@@@@" "JJMDEAOOOOOH@LGH@@@@" "KCDMDIOOOOO@@LGO@@@@" "OOH@BAOOOON@AHGOH@@@" "GGGGGD@@@@@@AHGOH@@@" "JJJMNL@H@@A@@@GOH@@@" "KCCGCD@HBBC@AHOOL@@@" "OOOOML@A@BCL@EOOL@@@" "GG@KGL@GHHCH@@OOL@@@" "JJ@NJH@@@A@H@@OOL@@@" "K@@GCHF@@GFH@@OOL@@@" "OLAMMHF@OMOH@@NOH@@@" "GFBOGH@@DOOL@@@@@@@@" "JJJJKH@@DMON@AH@@@@@" "KCGCC@@F@AOL@AHN@@@@" "OMLMO@@F@ON@L@@H@@@@" "GGGGGBD@@ON@@@D@D@@@" "JJNKOLF@@CH@AHF@L@@@" "KKCCOLF@CCL@AHF@L@@@" "OMJLL@G@C@LAIH@@N@@@" "GAOAMHCC@@@CIH@GO@@@" "J@JKMH@G@@@C@@@GO@@@" "J@KCHF@@@AH@@@@OO@@@" "NAEMHFCH@@H@@@BOOL@@" "GCOGALCH@@H@@@CIOL@@" "JKBKALG@@@@H@@AOOL@@" "KBKOAL@LC@@F@@AOOL@@" "OOMGAH@L@D@D@@AOOL@@" "GANNAHCL@D@D@@@GOL@@" "JAIF@@@C@N@D@@@GOL@@" "J@JL@@@@@@@@@@@GN@@@" "MCLL@AL@A@@B@@@GN@@@" "GMGL@ALL@@@D@@@GN@@@" "JJKH@@@L@H@N@@@@F@@@" "KOOH@@@@A@DOL@@@F@@@" "MOGH@@@@A@HML@@@@@@@" "EEO@@@@@@@@OL@@@@@@@" "JKKH@@@@@@AOL@@@@@@@" "JKKH@@@@@COOL@@@@@@@" "GGO@@@@@@COOH@@@@@@@" "EEG@@@@@@GOOH@@@@@@@" "JKN@@@@@@OOK@@@@@@@@" "JKN@@@@@@OOL@@@@@@@@" "GGL@@@@@ALLL@@@@@@@@" "OEL@@@@@AL@@@@@@@@@@")} 240 . 49))) (40 (({(READBITMAP)(16 15 "NL@@" "CDAI" "MLCI" "GLCK" "JHCC" "CHF@" "MHN@" "GHL@" "KH@@" "C@@F" "OAHF" "GCL@" "OLF@" "OOF@" "LCG@")} 256 . 74) ({(READBITMAP)(32 24 "@AL@A@@@" "@ALL@@@@" "@@@L@@@H" "@@@@A@D@" "@@@@A@H@" "@C@@@@@@" "@CK@@@@L" "@BC@@C@C" "CBAN@B@@" "C@@@@D@@" "CH@@@D@@" "AHMH@N@D" "@IO@@DLL" "@OI@@D@@" "@@@@@@@@" "@@@@@@@G" "@@@@@@AO" "@@@@@COO" "@@@@@COO" "@@@@@@GO" "@@@@@@ON" "@@@@@@N@" "@@@@@AH@" "@@@@@AH@")} 256 . 39) ({(READBITMAP)(32 112 "@@@@CO@@" "@@@@OO@@" "@@@CON@@" "@@@GOH@@" "@@@GO@@@" "@@@GN@@@" "@@AOL@@@" "@@COL@@@" "@@GOH@@@" "@@GOH@@@" "@AON@@@@" "@GOH@@@@" "@NF@@@OH" "@LD@@GOH" "FDH@AOOH" "GI@LAOOH" "GH@L@OOH" "N@C@COOH" "HFC@AOOH" "@F@HAOO@" "F@AHAON@" "F@@@AON@" "@@@@AON@" "@@@F@G@@" "@@@@@@@@" "@F@CK@@@" "AGOCK@@@" "AAO@@@@@" "@F@L@@@@" "@F@L@@@@" "@@@L@@N@" "HGH@@@OL" "HGML@AOL" "@CML@AOH" "@OMIHCOH" "@MOIIOOL" "@MN@AOOH" "MOL@COOH" "MOLACOOH" "MOLCOON@" "COHCOOH@" "@B@CON@@" "D@@@O@@@" "F@B@@@@@" "@@B@@@@@" "@@@@@@@@" "@A@@@@@@" "@@@@@@@@" "H@@@@@@@" "L@@@@@@@" "N@@@@@@@" "N@@@@@@@" "O@@@@@@@" "O@@@@@@@" "O@@@@@@@" "O@@@@@@@" "O@@@@@@@" "O@@@@@@@" "N@@@@@@@" "N@@@@@@@" "L@@@@@@@" "H@@@@@@@" "@@@@@@@@" "@@@D@@@@" "@@@@@@@@" "@L@@@@@@" "@LAOL@@@" "@MIOL@@@" "@LOOO@@@" "AHOOO@@@" "AHOOO@@@" "N@OOO@@@" "N@GOO@@@" "@AOOL@@@" "@AOOH@@@" "L@CL@@@@" "@@DLD@@@" "AHF@L@@@" "AHF@H@@@" "IH@@H@@@" "IH@GA@@@" "@@@B@@@@" "@@@@B@@@" "@@@@GL@@" "@@BAOL@@" "@@@AOL@@" "@@@AOL@@" "@@@COL@@" "AN@GOL@@" "AN@GON@@" "@@@GON@@" "@@@GON@@" "@@@GON@@" "@@@CON@@" "D@@CON@@" "@@@CON@@" "@@@@ON@@" "@@@@C@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "AH@@@@@@" "AH@@@@@@" "GH@@@@@@" "OL@@@@@@" "OL@@@@@@" "OH@@@@@@" "O@@@@@@@" "N@@@@@@@" "L@@@@@@@" "L@@@@@@@")} 288 . 42) ({(READBITMAP)(48 24 "OKKDI@OOOOOL" "OOOIGEBJJJJO" "GGGCGOH@@@@A" "OJJLGAJJJJJK" "OKCDIDOOOOOO" "OOOH@@OOOOOO" "GGG@DHOOOOOO" "JJJL@DOOOOOO" "KKCDBLOOOOOO" "MOOHL@OOOOOO" "GGG@@IOOOOOO" "JJJLCEOOOOOO" "KCCE@IOOOOOO" "OOOHBAOOOOOO" "GGG@HIOOOOOO" "JJJLEAOOOOOO" "KCCEDIOOOOOO" "OOOHBAOOOOON" "GGGGGD@@@@@@" "JJJMNL@@@@@@" "KCCGCDAIL@C@" "OOOOMLCIL@C@" "GG@KGLCKKH@H" "JJ@NJHCCK@@H")} 240 . 84))) (40 (({(READBITMAP)(80 123 "@@@@@@@@@@@@@@@@@AH@" "@@@@@@@@@@@@@@@@AOH@" "@@@@@@@@@@@@@@@@AOL@" "@@@@@@@@@@@@@@@@AOL@" "@@@@@@@@@@@@@@@@COL@" "@@@@@@@@@@@@@@@@OO@@" "@@@@@@@@@@@@@@@CON@@" "@@@@@@@@@@@@@@@GOH@@" "@@@@@@@@@@@@@@@GO@@@" "@@@@@@@@@@@@@@@GN@@@" "@@@@@@@@@@@@@@AOL@@@" "@@@@@@@@@@@@@@COL@@@" "N@@@@@@@@@@@@@GOH@@@" "OL@@@@@@@@@@@@GOH@CL" "COH@@@@@@@@@@AON@@CL" "MON@@@@@@@@@@GOH@@CL" "GGO@@@@@@@@@@NF@@@OL" "OJKH@@@@@@@@@LD@@GOL" "OKOL@@@@@@@@FDH@AOON" "MMMN@@@@@@@@GI@LAOOO" "GGGO@@@@@@@@GH@L@OOO" "JJJOH@@@@@@AN@C@COOO" "KKKCL@@@@@@CHFC@AOOO" "OMOMN@@@@@@C@F@H@OOL" "GGGGG@@@@@@CF@AH@ON@" "JJJJK@@@@@@LF@@@@H@@" "KKKKC@@@@@@L@@@@@@@@" "OOMMOH@FL@@@@@@F@@@@" "GGGGGH@FL@@@@@@@@@@@" "JJJJKH@F@CA@@F@CK@@@" "KKKKCH@@@DC@AGOCK@@@" "MOOOMLAH@DC@AAO@@@@@" "GGGGGLAN@@L@@F@L@F@@" "NNNJJLAN@@L@@F@L@FF@" "KOCCCL@@AKL@@@@L@FN@" "MOOOON@FAOLAHGH@@GOL" "GGOGGF@FMLLAHGMLAOOL" "JMJJKN@FD@@C@CMLAOOH" "KOKCCF@@D@AK@OMIOOOH" "OOOOOF@L@@CH@MOIOOOL" "GMOGGN@L@@G@@MNGOOOH" "JOJJKN@LCHFAMOLGOON@" "KOKCBO@@ONGIMOLAOOL@" "OOOONO@ALOOKMOLCOO@@" "GOGGGO@ALAIKCOHCON@@" "JNJJJG@@@AAH@B@CL@@@" "KKKCCO@@@@@@@@@@@@@@" "OOOOOL@@@@@@@@@@@@@@" "GOGGGL@@@@@@@@F@@@@@" "OJJJNO@@@@@@@@FF@@@@" "OKKCA@OOOOOOL@@N@@@@" "OOOOKEBJJJJJO@@N@@@@" "GGGGCOH@@@@@AH@@@@@@" "OJJJKAJJJJJJKL@AH@@@" "OKCCADOOOOOOON@AL@@@" "OOOOH@OOOOOOON@AL@@@" "GGGGLHOOOOOOOO@@@@@@" "JJJKHDOOOOOOOO@@@@@@" "KKCCJLOOOOOOOO@@@@@@" "MOOOD@OOOOOOOO@@@@@@" "GGGGHIOOOOOOOO@@@@@@" "JJJKKEOOOOOOOO@@@@@@" "KCCBHIOOOOOOON@@@@@@" "OOOOJAOOOOOOON@@@@@@" "GGGG@IOOOOOOOL@AH@@@" "JJJKMAOOOOOOOH@AH@@@" "KCCBLIOOOOOOO@AH@L@@" "OOOOJAOOOOOON@AH@L@@" "GGGGGD@@@@@@@@@@@L@@" "JJJMNL@@@@@@@L@@@@@@" "KCCGCDAIL@C@@LAOH@@@" "OOOOMLCIL@C@@MHHH@@@" "GG@KGLCKKH@H@LL@L@@@" "JJ@NJHCCK@@HAHH@@@@@" "K@@GCHF@@GFHAHH@@@@@" "OLAMMHN@LMN@N@@@OH@@" "GFBOGHL@@ONDH@@OOH@@" "JJJJKH@@@LCN@@@OON@@" "KCGCC@@F@@CL@@@OON@@" "OMLMOAHF@ON@L@CMON@@" "GGGGGCL@@LN@@@DOON@@" "JJNKOLF@@@@@AHFCON@@" "KKCCOOF@@@@@AHFAON@@" "OMJLLCG@C@@AIH@CON@@" "GAOAMHCC@@@CIH@GOL@@" "J@JKMH@G@@@C@@@COH@@" "J@KCHF@@@AJ@@@@@B@@@" "NAEMHFCH@@I@FN@@@D@@" "GCOGALCH@@H@FNB@@@@@" "JKBKALG@@C@IH@@@@@@@" "KBKOAL@LGO@GOL@@@@@@" "OOMGAH@LF@FDIN@CAL@@" "GANNAHCMI@@@IN@DCN@@" "JAIF@@@CKL@CIN@DOOH@" "J@JL@@@AK@AH@@@@OOL@" "MCLL@AL@A@GHF@@@OOL@" "GMGL@ALD@LB@F@@@OOL@" "JJKH@@@D@L@H@@@@OON@" "KOOH@@@@A@@@@@@@OOOH" "MOGH@@@@A@@@@@@@OOOH" "EEO@@@@@@L@@@@@@OON@" "JKKH@@H@AL@L@@@DOOL@" "JKKH@@C@AK@C@@@DOOL@" "GGO@C@@N@B@@@@@AOOH@" "EEG@C@@@@D@@@@@@COH@" "JKN@C@@@@D@@@@@@COH@" "JKN@AHAH@N@@@@@@@@@@" "GGL@@IO@@DLH@@@@@@@@" "OEL@@OI@@D@@DH@@@@@@" "OKH@@@@@@@@@DL@@@@@@" "OKH@@@@@@@@DGL@@@@@@" "OGHAH@@@@@A@DH@@@@@@" "EG@ALGBDH@@@D@@@@@@@" "JK@@FGN@H@H@@@@@@@@@" "JN@@@AH@H@D@@GH@@@@@" "ON@@@AKD@ALHMOKH@@@@" "OD@@@@CF@AN@AOOH@@@@" "OL@@@@@@@ALAONF@@@@@" "JL@@@@@@@AOOOO@@@@@@" "OH@@@@@@@OOOOOH@@@@@" "OH@@@@@@@OOOOOH@@@@@" "O@@@@@@@@@@OOL@@@@@@" "O@@@@@@@@@@MN@@@@@@@")} 240 . 35))) (40 (({(READBITMAP)(96 129 "@@@@@@@@@@@@@@@@AOOH@@@@" "@@@@@@@@@@@@@@@@AOOO@@@@" "@@@@@@@@@@@@@@@@AOOO@@@@" "@@@@@@@@@@@@@@@@COOL@@@@" "@@@@@@@@@@@@@@@@OOO@@@@@" "@@@@@@@@@@@@@@@CON@@@@@@" "@@@@@@@@@@@@@@@GOH@@@@@@" "@@@@@@@@@@@@@@@GO@@@@@@@" "@@@@@@@@@@@@@@@CN@@@@@@@" "@@@@@@@@@@@@@@@@@@@OH@@@" "@@@@@@@@@@@@@@B@@@@ON@@@" "N@@@@@@@@@@@@@D@H@@ON@@@" "OL@@@@@@@@@@@@@GH@COH@@@" "COH@@@@@@@@@@A@N@@COL@@@" "MON@@@@@@@@@@F@H@@CON@@@" "GGO@@@@@@@@@@NF@@@OON@@@" "OJKH@@@L@@@@@LD@@AMON@@@" "OKOL@@@L@@@@FDH@AAOON@@@" "MMMN@@@@C@@@GI@LAAOOH@@@" "GGGO@@@@C@@@GH@L@AOOH@@@" "JJJOH@@@H@@AN@C@A@GO@@@@" "KKKCL@CL@@@CHFC@A@GO@@@@" "OMOMN@CN@@@C@FAH@@@D@@@@" "GGGGG@@@@F@CF@AH@CH@@@@@" "JJJJK@@@@F@LF@AH@@@@@@@@" "KKKKC@@@@@@L@@@GL@@@@@@@" "OOMMOH@@L@@@@AHOL@@@@@@@" "GGGGGH@F@@@@@AOOL@@@@@@@" "JJJJKH@D@CA@@OOOO@@@@@@@" "KKKKCH@@@DC@AOOOK@AIH@@@" "MOOOMLAH@DC@AAOOH@GON@@@" "GGGGGLAH@@L@@GOMHGOON@@@" "NNNJJLAN@@L@@FNL@GOON@@@" "KOCCCL@@@KL@@@@L@GOOL@@@" "MOOOON@@AOLAHGH@@GOOH@@@" "GGOGGF@FILL@@GMLAOOOH@@@" "JMJJKN@F@@@B@CMLAOOO@@@@" "KOKCCF@@@@AJ@OAIOOON@@@@" "OOOOOF@L@@B@@LCIOOOH@@@@" "GMOGGN@L@@@@@@BGOON@@@@@" "JOJJKN@LCH@@@@@GOOH@@@@@" "KOKCBO@@OLBAH@DAOL@@@@@@" "OOOONO@ALLBCH@DCN@@@@@@@" "GOGGGO@AL@AKCOHCB@@@@@@@" "JNJJJG@@@@AH@B@@@@@@@@@@" "KKKCCO@@@@@@@@@@@@@@@@@@" "OOOOOL@@@@@@@@@@@@@@@@@@" "GOGGGL@@@@@@@@@@@@@@@@@@" "OJJJNO@@@@@@@@@@@@@@@@@@" "OKKCFHOOOOOOOL@@@@@@@@@@" "OOOOMIBJJJJJJO@@@@@@@@@@" "GGGGGKH@@@@@@AH@@@@@@@@@" "OJJJMMJJJJJJJKL@@@@@@@@@" "OKCCFLOOOOOOOON@@@@@@@@@" "OOOOOHOOOOOOOON@@@@@@@@@" "GGGGK@OOOOOOOOO@@@@@@@@@" "JJJKOLOOOOOOOOO@@@@@@@@@" "KKCCMDOOOOOOOOO@@@@@@@@@" "MOOOCHOOOOOOOOO@@@@@@@@@" "GGGGOAOOOOOOOOO@@@@@@@@@" "JJJKLMOOOOOOOOO@@@@@@@@@" "KCCBOAOOOOOOOON@@@@@@@@@" "OOOOMIOOOOOOOON@@@@@@@@@" "GGGGGAOOOOOOOOL@@@@@@@@@" "JJJKJIOOOOOOOOH@@@@@@@@@" "KCCBKAOOOOOOOO@@@@@@@@@@" "OOOOMIOOOOOOON@@@@@@@@@@" "GGGGGD@@@@@@@@@@@@@@@@@@" "JJJMNL@@@@@@@@@@@@@@@@@@" "KCCGCDAIH@@@@@@@H@@@@@@@" "OOOOMLB@@@@@@@@HH@@@@@@@" "GG@KGLB@@@@@@@@@L@@@@@@@" "JJ@NJHB@A@@@AH@@@@@@@@@@" "K@@GCHF@@B@@AH@@@@@@@@@@" "OLAMMHN@H@@@@@@@@@@@@@@@" "GFBOGHL@@CBD@@L@@@@@@@@@" "JJJJKH@@@@CN@@O@@@@@@@@@" "KCGCC@@D@@AH@@CNAN@@@@@@" "OMLMOAHF@CH@L@@LAO@@@@@@" "GGGGGAL@@GN@@@@@GOH@@@@@" "JJNKOHD@AH@@AH@@OON@@@@@" "KKCCOID@AN@@AHDAOON@@@@@" "OMJLLCD@GN@AIH@COON@@@@@" "GAOAM@@COH@CIH@GOOL@@@@@" "J@JKMH@AH@@C@@@COOL@@@@@" "J@KCH@@C@AJ@@@@GOOL@@@@@" "NAEMH@AK@@I@FNAOOOL@@@@@" "GCOGAL@@@@H@FNCOOOH@@@@@" "JKBK@D@@@C@IH@@GO@@@@@@@" "KBKO@DC@GO@GOL@@@@@@@@@@" "OOMG@HC@F@FDIN@C@@@@@@@@" "GANN@@@EI@@@IN@DCB@@@@@@" "JAIF@@@CKL@CIN@DH@@@@@@@" "J@JL@@@AK@AH@@@@@@L@@@@@" "MCLL@AL@A@GHF@@@C@L@@@@@" "GMGL@ALD@LB@F@@@@CMH@@@@" "JJKH@@@D@L@H@@@@@COH@@@@" "KOOH@@@@A@@@@@@@@GOL@@@@" "MOGH@@@@A@@@@@@@IOOL@@@@" "EEO@@@@@@L@@@@@@AOOL@@@@" "JKKH@@@@AL@L@@@@COOL@@@@" "JKKH@@C@AK@C@@@DOOOL@@@@" "GGO@C@@N@B@@@@CIOOOH@@@@" "EEG@C@@@@D@@@@CHCOOH@@@@" "JKN@C@@@@D@@@@AHCOO@@@@@" "JKN@AHAH@N@@@@@@COO@@@@@" "GGL@@HG@@DLH@@@@GOO@@@@@" "OEL@@NA@@D@@DH@@GOL@@@@@" "OKH@@@@@@@@@DL@@CO@@@@@@" "OKH@@@@@@@@DGL@@@@@@@@@@" "OGHAH@@@@@A@DH@@@@@@@@@@" "EG@AL@BDH@@@D@@@@@@@@@@@" "JK@@F@N@H@H@@@@@@@@@@@@@" "JN@@@AH@H@D@@@@@@@@@@@@@" "ON@@@AKD@ALHMHCH@@@@@@@@" "OD@@@@CF@AB@@GOH@@@@@@@@" "OL@@@@@@@A@@@F@@@@@@@@@@" "JL@@@@@@@A@BA@@@@@@@@@@@" "OH@@@@@@@OL@F@@@@@@@@@@@" "OH@DHA@@@OLLF@H@@@@@@@@@" "O@@DDI@@@@@ACL@@@@@@@@@@" "O@@@AOL@@L@A@@CG@@@@@@@@" "N@@AAKLI@@@DL@CL@@@@@@@@" "N@@AAHIIH@@DAHOL@@@@@@@@" "L@@@@@@@@@@FGOOOH@@@@@@@" "L@@@@@@@@@COOOOO@@@@@@@@" "H@@@@@@@@@OOOOON@@@@@@@@" "H@@@@@@@@@OOOOON@@@@@@@@" "@@@@@@@@@@@CIKOL@@@@@@@@")} 240 . 28))) (40 (({(READBITMAP)(16 2 "H@@@" "H@@@")} 320 . 52) ({(READBITMAP)(16 4 "H@@@" "@@@@" "@@@@" "H@@@")} 320 . 151) ({(READBITMAP)(16 3 "N@@@" "N@@@" "L@@@")} 320 . 127) ({(READBITMAP)(80 128 "@@@@@@@@@@@@@@@@COOO" "@@@@@@@@@@@@@@@@@LOO" "@@@@@@@@@@@@@@@B@D@@" "@@@@@@@@@@@@@@@A@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@BD@@@" "@@@@@@@@@@@@@@@@@@@O" "@@@@@@@@@@@@@@B@@@@O" "N@@@@@@@@@@@@@D@H@@O" "OL@@@@@@@@@@@@@GK@CO" "COH@@@@@@@@@@A@NC@CO" "MON@@@@@@@FF@F@H@@CO" "GGO@@@@@@ANF@NF@@@OO" "OJKH@@@L@AN@@LD@@AMO" "OKOL@@@L@CF@FDH@AAOO" "MMMN@@@@CCF@GI@LAAOO" "GGGO@@@@CCF@GH@L@AOO" "JJJOH@@@H@@AN@C@A@GO" "KKKCL@CL@@@CHFC@A@GO" "OMOMN@CN@@@C@FAH@@@D" "GGGGG@@@@F@CF@AH@CH@" "JJJJK@@@@F@LF@AH@@@@" "KKKKC@@@@@@L@@@GL@@@" "OOMMOH@@L@@@@AHOL@@@" "GGGGGH@F@@@@@AOOL@OO" "JJJJKH@D@CA@@OOOO@OO" "KKKKCH@@@DB@AOOOKAOO" "MOOOMLAH@DB@AAOOHCOO" "GGGGGLAH@@L@@GOMHGOO" "NNNJJLAN@@@@@FNL@OOO" "KOCCCL@@@I@@@@@L@OOO" "MOOOON@@AIHAHGH@@GOO" "GGOGGF@FI@@@@GMLAOOO" "JMJJKN@F@@@B@CMLAOON" "KOKCCF@@@@AJ@OAIOOOH" "OOOOOF@L@@B@@LCIOOA@" "GMOGGN@L@@@@@@BF@@@@" "JOJJKN@LAH@@@@@D@@@@" "KOKCBO@@L@@@@@D@@@@@" "OOOONO@@H@@A@@D@@@@@" "GOGGGO@@H@@@@@@@@@@@" "JNJJJG@@@@@@@B@@@@@@" "KKKCCO@@@@@@@@@@@@@@" "OOOOOL@@@@@@@@@@@@@@" "GOGGGL@@@@@@@@@@@@@@" "OJJJNO@@@@@@@@@@@@@@" "OKKCFOAOOOOOOOO@@@@@" "OOOOMOIJJJJJJJKL@@@@" "GGGGGOI@@@@@@@@F@@@@" "OJJJMKAJJJJJJJJO@@@@" "OKCCFKAOOOOOOOOOH@@@" "OOOOOOAOOOOOOOOOH@@@" "GGGGKGAOOOOOOOOOL@@@" "JJJKOKAOOOOOOOOOL@@@" "KKCCMCAOOOOOOOOOL@@@" "MOOOCOAOOOOOOOOOL@@@" "GGGGOFAOOOOOOOOOL@@@" "JJJKLJAOOOOOOOOOL@@@" "KCCBOFAOOOOOOOOOH@@@" "OOOOMNAOOOOOOOOOH@@@" "GGGGGFAOOOOOOOOO@@@@" "JJJKJNAOOOOOOOON@@@@" "KCCBKFAOOOOOOOOL@@@@" "OOOOMNAOOOOOOOOH@@@@" "GGGGGD@@@@@@@@@@@@@@" "JJJMNL@@@@@@@@@@@@@@" "KCCGCD@@@@@@@@@@@@@@" "OOOOML@@@@@@@@@@@@@@" "GG@KGL@@@@@@@@@@@@@@" "JJ@NJH@@@@@@@@@@@@@@" "K@@GCHF@@@@@@@@@@@@@" "OLAMMHH@H@@@@@@@@@@@" "GFBOGH@@@@B@@@@@@@@@" "JJJJKH@@@@CN@@@@@@@@" "KCGCC@@@@@@@@@B@A@@@" "OMLMO@@@@CH@D@@@@@@@" "GGGGG@@@@F@@@@@@D@@@" "JJNKOH@@@@@@AH@@H@D@" "KKCCOI@@@B@@AHDA@@@@" "OMJLLC@@BD@AIH@CAO@@" "GAOAM@@@B@@CI@@FALN@" "J@JKMH@AH@@@@@@@G@N@" "J@KCH@@A@AJ@@@@DOCN@" "NAEMH@AK@@I@FNALLOO@" "GCOGAH@@@@H@BNACLOOL" "JKBK@@@@@C@L@@@CLOOL" "KBKO@DC@@D@DIL@@@OOL" "OOMG@HC@@@FL@F@ALOOL" "GANN@@@DA@@L@GHAIOOL" "JAIF@@@CKL@@HOH@HOGH" "J@JL@@@AK@@@@@@@AOOH" "MCLL@@D@A@DKB@@@COOH" "GMGL@@DD@LB@B@@@AOOH" "JJKH@@@D@L@HF@L@AOH@" "KOOH@@@@A@@@@@L@AH@@" "MOGH@@@@A@@@@@C@I@F@" "EEO@@@@@@L@@@@O@@ALB" "JKKH@@@@AL@L@@L@@ALN" "JKKH@@C@AK@C@@@@LAOO" "GGO@C@@N@B@@@@OILGOO" "EEG@C@@@@D@@@@OHBCOO" "JKN@C@@@@D@@@@MHBCOO" "JKN@AHAH@N@@@@L@AOOO" "GGL@@HG@@DLH@@L@AOOO" "OEL@@NA@@D@@DH@@EOON" "OKH@@@@@@@@@DLL@COOL" "OKH@@@@@@@@DGLL@GMOL" "OGHAH@@@@@A@DHL@OOOL" "EG@AL@BDH@@@D@LAMOOL" "JK@@F@N@H@H@@@@AMOOL" "JN@@@AH@H@D@@@LAOOOH" "ON@@@AKD@ALHMHOIOON@" "OD@@@@CF@AB@@GOH@CL@" "OL@@@@@@@A@@@F@@@C@@" "JL@@@@@@@A@BA@@@@C@@" "OH@@@@@@@OL@F@@@@C@@" "OH@DHA@@@OLLB@@@@@@@" "O@@DDI@@@@@AC@@@@@@@" "O@@@AOL@@L@A@@@G@@@@" "N@@AAKLI@@@@@@AL@@@@" "N@@AAHIIH@@@@@GH@@@@" "L@@@@@@@@@@@@ABAH@@@" "L@CC@@@@@@@D@IBG@@@@" "H@CCL@@@@@@LOION@@@@" "H@@COH@@@@OOOOON@@@@" "@@@@CH@@@@COOOOL@@@@" "@@@@AH@@@@GOOOOL@@@@" "@@@@@@@@@@GOOOO@@@@@")} 240 . 26))) (40 (({(READBITMAP)(16 1 "@@@@")} 320 . 53) ({(READBITMAP)(32 4 "L@@@@AO@" "L@CC@AO@" "H@COL@C@" "H@AOOHC@")} 240 . 29) ({(READBITMAP)(64 88 "FO@AOOOOOOOO@@@@" "MOFIJJJJJJJKL@@@" "GOFI@@@@@@@@F@@@" "MKFAJJJJJJJJO@@@" "FKFAOOOOOOOOOH@@" "OOAIOOOOOOOOOH@@" "KGAIOOOOOOOOOL@@" "OK@AOOOOOOOOOL@@" "MC@AOOOOOOOOOL@@" "COAIOOOOOOOOOL@@" "OFAIOOOOOOOOOL@@" "LJ@AOOOOOOOOOL@@" "OF@AOOOOOOOOOH@@" "MN@AOOOOOOOOOH@@" "GFCAOOOOOOOOO@@@" "JNGIOOOOOOOON@@@" "KFGIOOOOOOOOL@@@" "MNCIOOOOOOOOH@@@" "GDAH@@@@@@@@@@@@" "NL@@@@@@@@@@@@@@" "CD@@@@@@@@@@@@@@" "ML@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@" "JH@@@@@@@@@@@@@@" "CHF@@@@@@@@@@@@@" "MHH@H@@@@@@@@@@@" "GH@@@@B@@@@@@@@@" "KH@@@@CN@AH@@@@@" "C@@@@@@@@AJ@A@@@" "O@@@@CH@D@@@@@@@" "G@@@@F@@@@@@D@@@" "OH@@@@@@AH@@H@D@" "OI@@@B@@AHDA@@@@" "LC@@BD@AIH@C@G@@" "M@@@B@@AI@@F@D@@" "MH@AH@@@@@@@@@B@" "H@@A@AJ@@@@@GC@@" "H@AK@@I@FN@DLI@@" "AH@@@@H@BN@CLA@@" "@@@@@C@L@@@CL@A@" "@DC@@D@DHD@@@@GN" "@HC@@@FL@D@AL@ON" "@@@DA@@L@D@AHCON" "@@@CKL@@HN@@HGGN" "@@@AK@@@@@@@@CON" "@@D@A@DCB@@@ACON" "@@DD@LB@B@@@AOON" "@@@D@L@@F@@@AOON" "@@@@A@@@@@@@@GOO" "@@@@A@@@@@C@HGOO" "@@@@LO@@@@O@@GOO" "@@@@MOHL@@L@@AOL" "@@C@AKHC@@@@LAOH" "C@@N@CH@@@LILAHA" "C@@@@D@@@@OHBAIA" "C@@@@D@@@@MHB@@@" "AHAHFON@@@L@AH@H" "@HG@FENH@@L@@@GA" "@NA@@G@@DH@@@@O@" "@@@@@C@@DLL@@GOL" "@@@@@@@DGLL@@EOL" "H@@@F@A@DHL@DGOL" "L@BDN@@@D@L@LGOL" "F@N@O@N@@@@AMOOL" "@AH@O@N@@@L@GOOH" "@AKD@ALHMHOHGOOH" "@@CF@AB@@GOHOKOH" "@@@@@A@@@F@@OOOH" "@@@@@A@BA@@@GOOH" "@@@@@OL@F@@@GOMH" "HA@@@OLLB@@@@@@@" "DI@@@@@AC@@@@@@@" "AOL@@L@A@@@G@@@@" "AKLI@@@@@@@@@@@@" "AHIIH@@@@@@@@@@@" "@AO@@@@@@@@AH@@@" "@AO@@@@@@A@C@@@@" "L@C@@@@@@@CN@@@@" "OHC@@@@@@HGN@@@@" "CH@@@@B@OHOL@@@@" "AH@@@@GOOOOL@@@@" "@@@@@@GOOOO@@@@@" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "@@@@@GOOOON@@@@@" "@@@@@@OOOOL@@@@@" "@@@@@@OOOOL@@@@@" "@@@@@@COOO@@@@@@")} 256 . 20))) (40 (({(READBITMAP)(80 116 "@@@@@@@@F@@BD@@@@@@@" "@@@@@F@FF@@@@@@OH@@@" "@@@@@F@FF@B@@@@ON@@@" "@@@@@@@@F@D@H@@ON@@@" "@@@@@@@@F@@GK@COH@@@" "@@@@@@@@GA@NC@COL@@@" "@@@@@@FFCF@H@@CON@@@" "@@@@@ANF@NF@@@OON@@@" "@@@L@AN@@LDC@AMON@@@" "@@@L@CF@FDHCAAOON@@@" "@@@@CCF@GI@LAAOOH@@@" "@@@@CCF@GH@L@AOOH@@@" "H@@@H@@AN@C@A@GO@@@@" "L@CL@@@CHFC@CNGO@@@@" "N@CN@@@C@FANGN@D@@@@" "G@@@@F@CF@ANGCH@@@@@" "K@@@@F@LF@GNFAH@@@@@" "C@@@@@@L@@GONAH@@@@@" "OH@@L@@@@AHONGH@@@@@" "GH@F@@@@@AOOLGOON@@@" "KH@D@CA@@OOIO@OON@@@" "CH@@@DB@AO@IKAOOL@@@" "MLAH@DB@AA@B@COON@@@" "GLAH@@L@@A@@@GOON@@@" "JLAN@@@@@@@@@OOON@@@" "CL@@@I@@@@@L@OOOL@@@" "ON@@AIHAHGH@@GOOH@@@" "GF@FI@@@@GMLAOOOH@@@" "KN@F@@@B@CMLAOON@@@@" "CF@@@@AJ@OAIOOOH@@@@" "OF@H@@B@@LCIOOA@@@@@" "GN@@@@@@@@BF@@@@@@@@" "KN@@@@@@@@@D@@@@@@@@" "BO@@@@@@@@@@@@@@@@@@" "NO@@@@@A@@@@@@@@@@@@" "GO@@@@@@@@@@@@@@@@@@" "JG@@@@@@@@@@@@@@@@@@" "CO@@@@@@@@@@@@@@@@@@" "OL@@@@@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@@@@@" "NO@@@@@@@@@@@@@@@@@@" "FO@@@OOOOOOOOH@@@@@@" "MOF@DMEEEEEEEN@@@@@@" "GOF@DH@@@@@@@C@@@@@@" "MKFC@MEEEEEEEGH@@@@@" "FKFC@OOOOOOOOOL@@@@@" "OO@CLOOOOOOOOOL@@@@@" "KG@CLOOOOOOOOON@@@@@" "OK@C@OOOOOOOOON@@@@@" "MC@@@OOOOOOOOON@@@@@" "CO@@LOOOOOOOOON@@@@@" "OF@FLOOOOOOOOON@@@@@" "LJ@N@OOOOOOOOON@@@@@" "OF@L@OOOOOOOOOL@@@@@" "MN@@@OOOOOOOOOL@@@@@" "GFB@HOOOOOOOOOH@@@@@" "JNF@LOOOOOOOOO@@@@@@" "KFFLLOOOOOOOON@@@@@@" "MNBOLOOOOOOOOL@@@@@@" "GD@OL@@@@@@@@@@@@@@@" "NL@@@@@@@@@@@@@@@@@@" "CD@@@@@@@@@@@@@@@@@@" "ML@@@@@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@@@@@" "JH@@@@@@@@@@@@@@@@@@" "CHF@@@@@@@@@@@@@@@@@" "MHH@H@@@@@@@@@@@@@@@" "GH@@@@@@@@@@@@@@@@@@" "KH@@@@@H@@@@@@@@@@@@" "C@@@@@@@@@H@@@@@@@@@" "O@@@@B@@@@@@@@@@@@@@" "G@@@@@@@@@@@@@@@@@@@" "OH@@@@@@@@@@@@@@@@@@" "OI@@@B@@A@@A@@@@@@@@" "LA@@@D@AH@@A@@@@@@@@" "M@@@@@@AH@@F@@@@@@@@" "M@@@@@@@@@@@@@B@@@@@" "H@@A@@B@@@@@F@@@@@@@" "H@@K@@A@@D@@@A@@@@@@" "@@@@@@H@@H@@@@@@@@@@" "@@@@@C@D@@@@@@@@@@@@" "@DC@@D@@HD@@@@@@@@@@" "@@A@@@@@@D@@@@@@@@@@" "@@@DA@@D@D@@HCHHL@@@" "@@@@IL@@HF@@H@AHL@@@" "@@@@C@@@@DF@@@HOL@@@" "@@@@A@@CC@F@@@HON@@@" "@@DD@@B@A@@@@LION@@@" "@@@D@@@@@@@@A@AON@@@" "@@@@@@@@@A@@@@CON@@@" "@@@@@@@@@GC@HDCON@@@" "@@@@LO@@@FC@@GCON@@@" "@@@@LAHL@@@@@ACON@@@" "@@C@@@@C@O@@LAOON@@@" "C@@N@B@@@OMIL@CON@@@" "C@@@@D@@@AOHB@CON@@@" "C@@@@@@AH@MHB@AMH@@@" "AH@HD@DAH@MHAH@L@@@@" "@HD@FELHF@MHAHGM@@@@" "@NA@@G@@FNL@L@A@@@@@" "@@@@@C@@DNLANFAH@@@@" "@@@@@@@DGLLAO@CH@@@@" "H@@@F@A@FHL@G@A@@@@@" "L@BDN@@MN@L@L@AB@@@@" "F@N@O@NMH@CAL@CN@@@@" "@AH@O@O@AHO@@DON@@@@" "@AKD@GOHMIOH@@ON@@@@" "@@CF@GBAIOOH@COO@@@@" "@@@@@A@AIN@@@GOO@@@@" "@@@@@A@BA@@@DGOOH@@@" "@@@@LOL@F@@@@OMOH@@@" "HAF@LOLLB@@@@GOOH@@@" "DIF@@@@AC@@@@GOOH@@@" "AOL@@L@A@@@F@AOO@@@@" "AKLI@@@@@@@@@@ON@@@@" "AHIIH@@@@@@@@@OL@@@@")} 256 . 33))) (40 (({(READBITMAP)(16 2 "OH@@" "L@@@")} 256 . 74) ({(READBITMAP)(64 130 "@@@@@@@@@GH@@@@@" "@@@@@@@@AOOH@@@@" "@@@@@@@O@NOON@@@" "@@@@@@@OGCNDN@@@" "@@@@@@@NGCND@@@@" "@@@@@@@AOOOO@@@@" "@@@@@@@CLD@@H@@@" "@@G@CB@A@@@@@@@@" "@AO@BB@@@@COH@@@" "@CH@B@@BD@GOL@@@" "@N@@G@@@@ANOL@@@" "AN@@D@B@@AHON@@@" "AH@@D@D@HAHNN@@@" "@@@@A@@GKAINL@@@" "@@@@AA@NCAIIL@@@" "@@FDBF@H@AKBF@@@" "@ABF@@F@@@OBF@@@" "@AB@@HDC@AM@F@@@" "@CB@FDHCAAOAN@@@" "CCB@GH@LAAOOL@@@" "CCF@GH@L@AOOL@@@" "H@@AC@@@A@GO@@@@" "@@@C@FC@@IOO@@@@" "@@@C@F@FDOIO@@@@" "@F@CF@@FGCH@AK@@" "@F@LF@GNFAH@AK@@" "@@@LA@AOLAH@@@@@" "L@@@AAHGLGH@@@@@" "@@@@@A@GLGOONCL@" "@CA@@OAII@OONCL@" "@DB@AO@IIAOOLC@@" "@DB@AALB@COLNC@@" "@@L@CAL@@GOLNC@@" "@@@@C@LAHOLON@@@" "@I@@@CLAHOLOL@@@" "AIHAAGH@@GOOHC@@" "I@@@@GLLAOCOHG@@" "@@@B@CLLAOCN@F@@" "@@AJCOAIOOOH@@@@" "@@BCCLCIOOA@@@@@" "@@@C@@BF@@@@@@@@" "@@@@@@@D@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@A@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@OOOOOOOOH@@@@@" "@DMEEEEEEEN@@@@@" "@DH@@@@@@@C@@@@@" "@@MEEEEEEEGH@@@@" "C@OOOOOOOOOL@@@@" "CLOOOOOOOOOL@@@@" "@LOOOOOOOOON@@@@" "@@OOOOOOOOON@@@@" "@@OOOOOOOOON@@@@" "@LOOOOOOOOON@@@@" "LLOOOOOOOOON@@@@" "L@OOOOOOOOON@@@@" "L@OOOOOOOOOL@@@@" "@@OOOOOOOOOL@@@@" "@HOOOOOOOOOH@@@@" "@LOOOOOOOOO@@@@@" "@LOOOOOOOON@@@@@" "@LOOOOOOOOL@@@@@" "@L@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "H@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@" "@@@A@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@B@@@@@" "@@B@@@@@F@@@@@@@" "@@@@@D@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@C@D@@@@@@@@@@@@" "@@@@@D@@@@@@@@@@" "@@@@@D@@@@@@@@@@" "@@@D@D@@HCHHD@@@" "HL@@@F@@H@@HD@@@" "C@@@@DD@@@H@@@@@" "A@@CC@D@@@H@B@@@" "@@B@@@@@@LH@F@@@" "@@@@@@@@A@@IN@@@" "@@@@@@@@@@@ON@@@" "@@@@@DB@HD@OO@@@" "LO@@@@B@@FAOO@@@" "LAHL@@@@@@AOO@@@" "@@@C@O@@L@OOO@@@" "@B@@@OMIL@COO@@@" "@D@@@AOHB@COO@@@" "@@@AH@MHB@GOO@@@" "D@DAH@MHAHGOO@@@" "FELHF@MHAHGOO@@@" "@G@@FNL@L@AAO@@@" "@C@@DNLANFAIO@@@" "@@@DGLLAO@AHN@@@" "F@A@FHL@G@A@@@@@" "N@@MN@L@L@A@@@@@" "O@NMH@CAL@@H@@@@" "O@O@AHO@@D@H@@@@" "@GOHMIOH@@ABA@@@" "@GBAIOOH@BAOA@@@" "@A@AIN@@@@COH@@@" "@A@BA@@@D@CKH@@@" "LOL@F@@@@BCOH@@@" "LOLLB@@@@BGON@@@" "@@@AC@@@@@GON@@@" "@L@A@@@F@@OON@@@" "@@@@@@@@@@OOL@@@" "H@@@@@@@@@OOL@@@" "@@@@@@@AH@OOL@@@" "@@@@@A@C@@OOL@@@" "@@@@@@CN@@OOH@@@" "@@@@@HGN@@AO@@@@" "@@B@OHOL@@AL@@@@")} 272 . 28))) (40 (({(READBITMAP)(48 31 "OH@@@@@@@@@@" "L@@@@@@A@@@@" "M@@@@@@@@@@@" "M@@@@@@@@@@@" "H@@A@@@@@@@@" "H@@@@@@@@D@@" "@@@@@@@@@@@@" "@@@@@B@D@@@@" "@@@@@@@@@@@@" "@@A@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@L@@@@@@" "@@@@A@@@@D@@" "@@@@A@@CB@D@" "@@D@@@@@@@@@" "@@@D@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@DB@" "@@@@LO@@@@B@" "@@@@LAHL@@@@" "@@C@@@@C@O@@" "C@@N@B@@@OLA" "C@@@@D@@@AO@" "C@@@@@@@@@IH" "AH@H@@D@@@IH" "@HD@@ALHF@EH" "@NA@@G@@FLD@" "@@@@@C@@D@LA" "@@@@@@@DD@LA" "H@@@B@A@DHL@" "L@B@N@@MN@L@")} 256 . 45) ({(READBITMAP)(32 19 "FO@@C@@O" "MOF@C@DM" "GOF@@CDH" "MKFCAO@M" "FKFCCO@O" "OO@CCFLO" "KG@C@@LO" "OK@O@@@O" "MC@L@@@O" "CO@@@LLO" "OFANLLLO" "LJANLL@O" "OFALL@@O" "MN@@@@@O" "GFB@@@HO" "JNF@C@LO" "KFFLC@LO" "MNBO@@LO" "GD@O@@L@")} 256 . 89) ({(READBITMAP)(32 82 "OOOH@@@@" "EEEN@@@@" "@@@C@@@@" "EEEGH@@@" "OOOOL@@@" "OOOOL@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOOL@@@" "OOOOL@@@" "OOOOH@@@" "OOOO@@@@" "OOON@@@@" "OOOL@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "F@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "HCH@D@@@" "H@@@D@@@" "@@H@@@@@" "@@@@B@@@" "@@@@B@@@" "A@@@B@@@" "@@@AB@@@" "HD@@BC@@" "@FAHBC@@" "@@@OCO@@" "L@@DCO@@" "L@@@OO@@" "@@@@OO@@" "B@AAOO@@" "AHCAON@@" "AHCOON@@" "L@AAON@@" "L@AKON@@" "L@AOON@@" "G@AOON@@" "L@AIOL@@" "L@@H@@@@" "@D@H@@@@" "@@A@@@@@" "@BA@@@@@" "@@@@@@@@" "D@@@@@@@" "@B@CH@@@" "@B@ON@@@" "@@@ON@@@" "@@OON@@@" "@@OOL@@@" "@@OOO@@@" "H@OOOH@@" "@@OOOH@@" "@@OOOH@@" "@@OOO@@@" "@@COO@@@" "@@FON@@@" "@@GOL@@@")} 304 . 26) ({(READBITMAP)(80 42 "@@@@@@@O@FOOOH@@@@@@" "@@@@@@LODCNDON@@@@@@" "@@@@L@LNGCND@F@@@@@@" "@@@@L@GMOOOOCF@@@@@@" "@@@@@@GOLD@@K@@@@@@@" "@@G@CB@A@@@@@@L@@@@@" "@AO@BB@@@@COH@L@@@@@" "@CK@B@@BD@GOL@@@@@@@" "@NC@G@@@@ANOO@@@@@@@" "AN@@D@B@@GHOOF@@@@@@" "AH@@D@D@IOHNNF@@@@@@" "@@@@A@@GKIINLF@@@@@@" "@@@@AA@NCAIILF@@@@@@" "@@FDBF@KHAKBFF@@@@@@" "@ABF@@FCH@OBFF@@@@@@" "@AB@@HDC@AM@F@F@@@@@" "@CB@FDHCAAOAN@F@@@@@" "CCB@GH@LAAOOLNF@@@@@" "CCF@GH@L@AOOLN@@@@@@" "H@@AC@@@A@DC@@@@@@@@" "@@@C@FC@@ILC@@@@@@@@" "@@@C@F@FDOIO@@@@@@@@" "@F@CF@@FGCHAIK@F@@@@" "@F@LF@GNFAHAKO@G@@@@" "@@@LA@AOLAH@CL@C@@@@" "L@@@AAHGLGH@CL@@@@@@" "@@@@@A@GLGOLNCL@@@@@" "@CA@@OAII@GLNCMH@@@@" "@DB@AO@II@GOLCGH@@@@" "@DB@AALBCCOLNCFAH@@@" "@@L@CAL@CGOLNC@AH@@@" "@@@@C@LAHLDONC@@@@@@" "@I@@@CLAHLDLNC@@@@@@" "AIHAAGH@@GOLLC@@@@@@" "I@@@@GLLAOCOHG@GL@@@" "@@@B@CLLAO@GHF@GL@@@" "@@AJCOAIOOLGN@@@@@@@" "@@BCCLCIOOA@F@@@@@@@" "@@@C@@BF@@@CHOL@@@@@" "@@@@@@@D@F@CHOL@@@@@" "@@@@@@L@LF@@@@@@@@@@" "@@@A@@L@L@@@@@@@@@@@")} 272 . 114))) (40 (({(READBITMAP)(16 6 "L@GH" "N@FA" "FC@A" "FC@@" "BC@@" "@C@@")} 320 . 122) ({(READBITMAP)(16 2 "GH@@" "GH@@")} 288 . 137) ({(READBITMAP)(16 52 "@FOC" "DCN@" "DCND" "COON" "@D@@" "@@@@" "@@CN" "D@GL" "@ANL" "@GHL" "IOHN" "KIHL" "CAAH" "HAA@" "H@A@" "@AM@" "A@IA" "@@IO" "@ANG" "A@@C" "@I@C" "DOIO" "DCHA" "@AHA" "HAH@" "LDH@" "L@OL" "I@GL" "I@GL" "CCOL" "CGND" "HDDB" "HDD@" "@GL@" "ACAC" "@C@G" "LCLG" "OOA@" "@@@C" "@F@C" "LF@@" "L@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OOOO" "EEEE" "@@@@" "EEEE")} 304 . 104) ({(READBITMAP)(32 17 "@@L@C@@@" "@@L@C@@@" "D@@@@@@@" "O@@@@@@@" "OFAH@@@@" "NFAK@@@@" "LF@C@@@@" "LF@@@@@@" "FF@@AH@@" "@F@@AH@@" "@@F@@@@@" "N@FCL@@@" "LNFCL@@@" "LN@@@@@@" "@@@@@@@@" "@@@@@F@@" "@@@@@F@@")} 320 . 134) ({(READBITMAP)(80 81 "FO@@C@@@OOOOOOOOH@@@" "MOF@C@@DMEEEEEEEN@@@" "GOF@@@@D@@@@@@@@C@@@" "MKF@@HL@EEEEEEEEGH@@" "FKFA@OH@OOOOOOOOOL@@" "OO@DMCIDGOOOOOOOOL@@" "KG@DL@ADGOOOOOOOON@@" "OJ@H@@@@OOOOOOOOON@@" "MB@@@@A@OOOOOOOOON@@" "CO@@LLCDOOOOOOOOON@@" "OFA@LH@DOOOOOOOOON@@" "LJAHL@C@OOOOOOOOON@@" "OFAH@CC@OOOOOOOOOL@@" "MN@@@@C@OOOOOOOOOL@@" "GF@@@@C@OOOOOOOOOH@@" "JNF@C@@DOOOOOOOOO@@@" "KFDDC@@DOOOOOOOON@@@" "MN@D@@HDOOOOOOOOL@@@" "GD@L@AHD@@@@@@@@@@@@" "NL@@@AH@@@@@@@@@@@@@" "CD@@@@@@@@@@@@@@@@@@" "ML@@@@@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@@@@@" "JH@@@@@@@@@@@@@@@@@@" "CHF@@@@@@@@@@@@@@@@@" "MHH@H@@@@@@@@@@@@@@@" "GH@@@@@@@@@@@@@@@@@@" "KH@@@@@@@@@@@@@@@@@@" "C@@@@@@@@@@@@@@@@@@@" "O@@@@@@@@@@@@@@@@@@@" "G@@@@@@@@@@@@@@@@@@@" "OH@@@@@@@@@@@@@@@@@@" "OH@@@@@@@@@@@@@@@@@@" "L@@@@@@A@@@@@@@@@@@@" "M@@@@@@@@@@@@@@@@@@@" "M@@@@@@@@@@@@@@@@@@@" "H@@A@@@@@@@@F@@@@@@@" "H@@@@@@@@D@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@B@D@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@A@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@HCH@D@@@" "@@@@@L@@@@@@H@@@@@@@" "@@@@A@@@@D@@@@H@@@@@" "@@@@A@@C@@D@@@@@B@@@" "@@D@@@@@@@@@@@@@B@@@" "@@@D@@@@@@@@@@@@B@@@" "@@@@@@@@@@@@@@@@B@@@" "@@@@@@@@@@B@HD@@B@@@" "@@@@LO@@@@B@@@AHB@@@" "@@@@LAHL@@@@@@@L@A@@" "@@A@@@@C@O@@L@@D@O@@" "C@@N@@@@@LH@@@@@@C@@" "C@@@@D@@@@@@@@@@@CL@" "B@@@@@@@@@AHB@A@AOL@" "@@@@@@D@@@AHAHA@@NL@" "@@D@@AL@@@AHAH@@DOL@" "@L@@@G@@@@@@L@@AAOL@" "@@@@@C@@D@HAL@@AAOL@" "@@@@@@@@D@H@D@@CAOL@" "H@@@B@@@D@@@@@@OIOL@" "L@B@N@@@N@@@H@@AOOL@" "F@N@O@NAH@CAL@@@COL@" "@AH@O@O@AHO@@D@HCOL@" "@AKD@GOHMIOH@@A@COL@" "@@CF@GBAIOOH@BA@GKH@" "@@@@@A@AIN@@@@@@GOH@" "@@@@@A@BA@@@D@@@GN@@" "@@@@LOL@F@@@@B@BAH@@" "HAF@LOLLBAH@@B@N@@@@" "DIF@@@@MCAN@@@@@@@@@" "AOL@@N@A@@FGHLH@@@@@" "AKLI@FGO@@@AHL@A@@@@" "AHIIH@GO@@@@@@@A@@@@" "@AO@@@@@@@@AH@DCH@@@" "@AO@@@@@@A@C@@DOL@@@" "L@C@@@@@@@CN@@OOL@@@" "OHC@@@@@@HGN@@OOO@@@" "CH@@@@B@OHOL@@COO@@@" "AH@@@@GOOOOL@@GON@@@")} 256 . 27))) (40 (({(READBITMAP)(96 50 "JJNKO@@@@@@@@@@@@@@@@@@@" "KKCCN@@@@@@@@@@@@@@@@@@@" "OMJLL@@@@@@@@@@@@@@@@@@@" "GAOAL@@@@@@@@@@@@@@@@@@@" "J@JKL@@@@@@@@@@@@@@@@@@@" "J@KCH@@@@@@@@@@@@@@@@@@@" "NAEMH@@@@@@@@@@@@@@@@@@@" "GCOG@@@@@@@@@@@@@@@@@@@@" "JKBK@@@@@@@@@@@@@@@@@@@@" "KBKO@@@@@@@@@@@@@@@@@@@@" "OOMG@@@@@@@@@@@@@@@@@@@@" "GANN@@@@@@@@@@@@@@@@@@@@" "JAIF@@@@@@@@@@@@@@@@@@@@" "J@JL@@@@@@@@@@@@@@@@@@@@" "MCLL@@@@@@@A@@D@@@@@@@@@" "GMGL@@D@@@@@@@@@@@@@@@@@" "JJKH@@@D@@@@@@@@@@@@@@@@" "KOOH@@@@@@@@@@@@@@@@B@@@" "MOGH@@@@@@@@@@@@HD@@@@@@" "EEO@@@@@L@@@@@B@@@@@@@@@" "JKKH@@@@LAHL@@@@@@@@@@@@" "JKKH@@A@@@@A@O@@L@@@@@@@" "GGO@C@@N@@@@@LH@@@@@@@@@" "EEG@C@@@@D@@@@@@@@@@@@H@" "JKN@B@@@@@@@@@AHB@A@AH@@" "JKN@@@@@@@D@@@AHAHA@@@@@" "GGL@@@D@@AL@@@AHAH@@@@@@" "OEL@@L@@@D@@@@@@D@@@@D@@" "OKH@@@@@@@@@D@H@D@@AA@N@" "OKH@@@@@@@@@D@H@D@@CA@N@" "OGHAH@@@B@@@D@@@@@@OI@N@" "EG@AL@B@N@@@N@@@H@@@F@N@" "JK@@F@N@O@NAH@AAL@@@BGOH" "JN@@@AH@G@O@A@I@@D@H@GOH" "ON@@@AK@@GN@IACH@@A@@GOH" "OD@@@@@@@CB@@LB@@BA@CKOH" "OL@@@@@@@A@@@L@@@@@@COO@" "JL@@@@@@@A@BA@@@D@@@@OO@" "OH@@@@@@@HL@@@@@@B@B@KO@" "OH@DHA@@@H@@@@@@@B@N@OO@" "O@@DD@@@@@@EB@B@@@@@@ON@" "O@@@@@H@@N@A@@FGHLH@CON@" "N@@A@@HI@FGO@@@AHL@@COL@" "N@@A@@@IH@GO@@@@@@@@@OL@" "L@@@@@@@@@@@@@@AH@@@@O@@" "L@C@@@@@@@@@@A@C@@@@@@@@" "H@B@@@@@@@@@@@CN@@@L@@@@" "H@@@B@@@@@@@@HGN@@DL@@@@" "@@@@B@@@@@B@OHOL@@COH@@@" "@@@@@@@@@@GOOOOL@@GOL@@@")} 240 . 27) ({(READBITMAP)(96 68 "@@@@@@@@@@@@@DEH@@@@@@@@" "@@@@@@@@@@@O@BOCH@@@@@@@" "@@@@@@@@@@LHDCJ@KN@@@@@@" "@@@@@@@@L@LDD@FD@B@@@@@@" "@@@@@@@@L@CEC@NDCF@@@@@@" "@@@@@@@@@@GO@@@@K@@@@@@@" "@@@@@@G@CB@A@@@@@@L@C@@@" "@@@@@AO@BB@@@@AN@@L@C@@@" "@@@@@CK@B@@BD@DH@@@@@@@@" "@@@@@NC@G@@@@@JLI@@@@@@@" "@@@@AN@@D@B@@EHHGDAH@D@@" "@@@@AH@@D@D@IOHNNFAI@@@@" "@@@@@@@@A@@FKHHLHF@C@@@@" "@@@@@@@@AA@NCAAHLF@@@D@@" "@@@A@@FDBF@KHAA@FF@@AH@@" "@@@@DEBF@@FCH@A@@F@@AH@@" "@@@L@AB@@HDC@AM@@@F@@@@@" "@@@L@CB@FDHCA@IAN@DCLAB@" "@@@@CCB@GH@@@@IO@BFCL@@@" "@@@@CCF@GH@@@AFGLN@@@@@@" "H@@@H@@AC@@@A@@C@@@@@@@@" "L@CL@@@C@FC@@I@B@@@@@F@@" "N@CN@@@C@F@FDOII@@@@@F@@" "G@@@@F@CF@@FDB@@AK@F@@@@" "K@@@@F@LF@GN@A@AKC@G@@@@" "C@@@@@@LA@AOHAH@CL@C@@@@" "OH@@L@@@AAHGLDH@CL@@@@@@" "GH@F@@@C@A@FL@OLNCL@@@@@" "KH@D@CA@@OAIH@EHNCMH@A@@" "CH@@@DB@AO@AI@AH@@GH@@A@" "MLAH@DB@AALBCAKLB@FAH@A@" "GLAH@@L@CAL@AGJDFC@AH@A@" "JLAN@@@@C@@AHDD@FC@@@D@@" "CL@@@I@A@CL@@DD@BC@@@@@@" "ON@@AIHAAF@@@DD@@C@@@@A@" "GF@FI@@@@CHDAAACHC@GL@@@" "KN@F@@@B@CDL@C@GHF@EL@@@" "CF@@@@AJCOAILCHGN@@AE@M@" "OF@I@@BCCLCIOOA@F@@D@@@@" "GN@@@@HC@@BF@@@CHAD@@@@@" "KN@@@A@@@@@D@F@C@GL@@@@@" "BO@@@L@@@@L@LF@@@@@@@@@@" "NO@@@@@A@@L@L@@@@@@@D@@@" "GO@@@@@@@@@@@@@@@@@@@@@@" "JG@@@@@@@@@@@@@@@@@@@@@@" "CO@@@@D@@@@@@@@@@@@@@@@@" "OL@@@@@@@@@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@@@@@@@@@" "NO@@@@@@@@@@@@@@@@@@@@@@" "FO@@C@@@@OOOOOOOOH@@@@@@" "MOF@C@@@DMEEEEEEEN@@@@@@" "GOF@@@@@D@@@@@@@@C@@@@@@" "MKF@@HD@@EEEEEEEEGH@@@@@" "FKFA@GH@@OOOOOOOOOL@@@@@" "OO@DLCA@DGOOOOOOOOL@@@@@" "KG@DL@A@DGOOOOOOOON@@@@@" "OJ@H@@@@@OOOOOOOOON@@@@@" "MB@@@@A@@OOOOOOOOON@@@@@" "CO@@LHC@DOOOOOOOOON@@@@@" "OFA@LH@@DOOOOOOOOON@@@@@" "LJAHL@A@@OOOOOOOOON@@@@@" "OFAH@CC@@OOOOOOOOOL@@@@@" "MN@@@@C@@OOOOOOOOOL@@@@@" "GF@@@@@@@OOOOOOOOOH@@@@@" "JNF@A@@@DOOOOOOOOO@@@@@@" "KFDDC@@@DOOOOOOOON@@@@@@" "MN@D@@H@DOOOOOOOOL@@@@@@" "GD@L@AH@D@@@@@@@@@@@@@@@")} 256 . 89))) (40 (({(READBITMAP)(32 24 "D@@@@@@@" "D@@A@@@@" "D@@C@@@@" "@@@N@@@@" "H@@@@@@@" "L@@@@@@H" "@D@H@@GH" "@@A@@@OH" "@BA@@@OH" "@@@@@AOH" "D@@@@AOL" "@B@B@COL" "@B@N@COL" "@@@@@COL" "HLH@@COL" "HL@@@GOL" "@@@@@OON" "H@@@@OOO" "@@@@@COO" "@@@@@COO" "@@@@@AOO" "@@@@@@OO" "@@@@@@GN" "@@@@@@@@")} 304 . 26) ({(READBITMAP)(80 19 "FO@@C@@@@@GOOOOOOOL@" "MOF@C@@@D@FJJJJJJJO@" "GOF@@@@B@@@@@@@@@@AH" "MKF@@HDD@@BJJJJJJJKL" "FKFA@GH@@@GOOOOOOOON" "OO@DLCA@A@COOOOOOOON" "KG@DL@A@@@COOOOOOOOO" "OJ@H@H@@@BGOOOOOOOOO" "MB@@@BAB@BGOOOOOOOOO" "CO@@LHCAD@GOOOOOOOOO" "OFA@LH@@D@GOOOOOOOOO" "LJAHLBA@DBGOOOOOOOOO" "OFAH@CC@H@GOOOOOOOON" "MN@@@AC@H@GOOOOOOOON" "GF@@@HHB@@GOOOOOOOOL" "JNFFAB@@@@GOOOOOOOOH" "KFDLC@@@F@GOOOOOOOO@" "MN@F@@H@@@GOOOOOOON@" "GDBO@AH@@@@@@@@@@@@@")} 256 . 89) ({(READBITMAP)(80 42 "@@@@@@@@@FH@@@@@@@@@" "@@@@@@@@@DEH@@@@@@@@" "@@@@@@@H@BFAH@@@@@@@" "@@@@@@LHDCH@BF@@@@@@" "@@@@L@LD@@DD@B@@@@@@" "@@@@L@BEA@FDCF@@@@@@" "@@@@@@GO@@@@H@@@@@@@" "@@F@CB@A@@@@@@L@C@@@" "@AM@BB@@@@@N@@L@C@@@" "@CK@@@@BD@DH@@@@@@@@" "@J@@G@@@@@JLI@@@@@@@" "AN@@D@B@@A@HGDAH@D@@" "AH@@D@@@HB@DBB@A@@@@" "@@@@A@@FC@HLH@@C@@@@" "@@@@AA@NCAAHLF@@@D@@" "@@FDBF@KHAA@@@@@AH@@" "DEBF@@DAH@@@@F@@AH@@" "@AB@@HDA@AL@@@B@@@@@" "@CB@F@@BA@IAJ@DCLAB@" "CCB@GH@@@@HH@@FCL@@@" "CCF@GH@@@ADGLN@@@@@@" "H@@AC@@@A@@C@@@@@@@@" "@@@C@FC@@I@@@@@@@F@@" "@@@C@F@FDO@I@@@@@F@@" "@F@CF@@FDB@@AC@F@@@@" "@F@LF@GN@A@AKC@F@@@@" "@@@LA@AKHAH@CD@C@@@@" "L@@@AAHFLDH@BD@@@@@@" "@@@C@A@FL@OLJCL@@@@@" "@CA@@OAIH@EHNCLH@A@@" "@DB@AK@AI@AH@@CH@@A@" "@DB@AAHBBAKL@@F@H@A@" "@@L@AAD@@GB@F@@A@@A@" "@@@@C@@AHDD@FC@@@D@@" "@I@A@CH@@D@@B@@@@@@@" "AIHAAF@@@DD@@C@@@@A@" "I@@@@@HDAAAA@C@EH@@@" "@@@B@@@L@A@C@D@D@@@@" "@@AJCGAILCHC@@@@D@M@" "@@BCCLCIOLA@D@@@@@@@" "@@HC@@@D@@@CHAD@@@@@" "@A@@@@@D@F@B@FD@@@@@")} 272 . 116))) (40 (({(READBITMAP)(16 1 "NL@A")} 256 . 88) ({(READBITMAP)(32 18 "OOOL@@@@" "JJJO@@@@" "@@@AH@@@" "JJJKL@@@" "OOOON@@@" "OOOON@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOOO@@@" "OOOON@@@" "OOOON@@@" "OOOOL@@@" "OOOOH@@@" "OOOO@@@@" "OOON@@@@")} 320 . 90) ({(READBITMAP)(80 21 "MCLL@@@@@@@@@@@@@@@@" "GMGL@@@@@@@@@@@@@@@@" "JJKH@@@@@@@@@@@@@@@@" "KOOH@@@@@@@@@@@@@@@@" "MOGH@@@@@@@@@@@@@@@@" "EEO@@@@@@@@@@@@@@@@@" "JKKH@@@@@@@@@@@@@@@@" "JKKH@@@@@@@@@@@@@@@@" "GGO@@@@@@@@@@@@@@@@@" "EEG@@@@@@@@@@@@@@@@@" "JKN@@@@@@@@@@@@@@@@@" "JKN@@@@@@@@@@@@@@@@@" "GGL@@@@@@@@@@@@@@@@@" "OEL@@@@@@@@@@@@@@@@@" "OKH@@@@@@@@@D@@@@@@@" "OKH@@@@@@@@@@@@@D@@@" "OGH@@@@@@@@@@@@@@@@L" "EG@@@@B@N@@@L@@@H@@@" "JK@@@@N@O@NAH@AAL@@@" "JN@@@@H@G@O@A@I@@D@H" "ON@@@@K@@GN@IACH@@A@")} 240 . 42) ({(READBITMAP)(32 26 "A@@@@@@G" "@@@@D@@F" "@B@B@@A@" "@@DD@H@B" "@GH@@ICG" "LCA@AAAG" "L@A@@@@G" "@H@@@KBG" "@BABAC@G" "LHCAD@@G" "LH@@D@@G" "LBA@DJ@G" "@CC@HI@G" "@AC@LN@G" "@HHB@H@G" "AB@@CB@G" "C@@@G@@G" "@@I@A@@G" "@AI@@@@@" "@AJ@AH@@" "@@@@@@@@" "B@@@@@@@" "AH@H@@@@" "@BF@@@@@" "@@@@@@@@" "H@@D@@@@")} 272 . 82) ({(READBITMAP)(80 35 "@@A@BB@@@@@N@@L@C@@@" "@BK@@@@BD@DH@@@@@@@@" "@J@@G@@@@@JLI@@@@@@@" "AL@@D@B@@A@HGDAH@D@@" "AH@@D@@@HB@DBB@A@@@@" "@@@@A@@FC@HLH@@C@@@@" "@@@@AA@NCAAHLF@@@@@@" "@@FDBF@KHAA@@@@@@H@@" "DEBF@@DAH@@@@D@@AH@@" "@@@@@HDA@AL@@@@@@@@@" "@BB@F@@BA@IAJ@D@@@B@" "CBB@G@@@@@@H@@FCL@@@" "CC@@D@@@@ADGLN@@@@@@" "H@@@A@@@A@@C@@@@@@@@" "@@@C@FA@@I@@@@@@@B@@" "@@@B@F@DDG@H@@@@@F@@" "@F@CD@@FD@@@AC@FB@@@" "@F@LB@EJ@A@AKCBF@@@@" "@@@LA@@KHAH@BD@@@@@@" "L@@@AAHDLDH@@@@@@@@@" "@@@C@A@@L@ELJA@@@@@@" "@BA@@OAIH@D@NBDH@A@@" "@DB@AJ@AH@AH@@CH@@A@" "@DB@AA@B@AAL@@F@H@A@" "@@L@@AD@@D@@F@@A@@A@" "@@@@C@@AH@D@FC@@@D@@" "@A@A@CH@@D@@B@@@@@@@" "AIHAAB@@@DD@@C@@@@A@" "I@@@@@HDAAAA@C@EH@@@" "@@@B@@@D@A@C@D@D@@@@" "@@AJCCAADCHC@@@@D@M@" "@@BCCHCAGLA@D@@@@@@@" "@@HC@@@@@@@C@AD@@@@@" "@A@@@@@D@F@B@FD@@@@@" "@L@@@@D@DD@@@@@@@@@@")} 272 . 115) ({(READBITMAP)(32 34 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@H@@@@" "@@@@@@@@" "@@@@@@@@" "@A@L@@@@" "@@AN@@@@" "@BAN@@@@" "@@AO@@@@" "@@AOH@@@" "@@COH@@@" "@@COH@@@" "@IOOH@@@" "@OOGH@@@" "@COOH@@@" "@COOH@@@" "@COOL@@@" "@GOOH@@@" "@GOOH@@@" "@COO@@@@")} 320 . 26) ({(READBITMAP)(32 3 "@@@H@@D@" "@@LHDB@@" "L@@D@@DD")} 288 . 153))) (40 (({(READBITMAP)(32 18 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@A@@@@@@" "@@C@@@@@" "@BGH@@@@" "@@GH@@@@" "@@GH@@@@" "@AOL@@@@" "@COL@@@@" "@COL@@@@" "@COL@@@@" "@CON@@@@" "@GON@@@@" "@GON@@@@" "@CON@@@@" "@@OO@@@@" "@AOO@@@@")} 320 . 26) ({(READBITMAP)(80 16 "OKH@@@@@@@@@@@@@@@@@" "OKH@@@@@@@@@@@@@@@@@" "OGH@@@@@@@@@@@@@@@@@" "EG@@@@@@@@@@@@@@@@@@" "JK@@@@@@@@@@@@@@@@@@" "JN@@@@@@@@@@@@@@@@@@" "ON@@@@@@@@@@@@@@@@@@" "OD@@@@@@@@@@@@B@@@@@" "OL@@@@@@@@@@@@@@@@@@" "JL@@@@@@@@@@@@@@D@@@" "OH@@@@@@@@@@@@@@@@@@" "OH@@@@@@@@@@@@@@@B@@" "O@@@@@@@@@@@B@B@@@@@" "O@@@@@@@@@@@@@FGHLH@" "N@@@@@@H@B@A@@@AHL@@" "N@@@@@@IH@@C@@@@@@@@")} 240 . 33) ({(READBITMAP)(80 33 "A@@@@@@@GOOOOOOOL@@@" "@@@@D@@@FJJJJJJJO@@@" "@B@B@@@A@@@@@@@@AH@@" "@@D@@@@@BJJJJJJJKL@@" "@EH@@I@CGOOOOOOOON@@" "L@A@AA@AGOOOOOOOON@@" "L@A@@@@@GOOOOOOOOO@@" "@@@@@@@BGOOOOOOOOO@@" "@BABAC@@GOOOOOOOOO@@" "DHCAD@@@GOOOOOOOOO@@" "@H@@D@@@GOOOOOOOOO@@" "DBA@DJ@@GOOOOOOOOO@@" "@CC@HI@@GOOOOOOOON@@" "@AC@LN@@GOOOOOOOON@@" "@HHB@HH@GOOOOOOOOL@@" "AB@@CB@@GOOOOOOOOH@@" "C@@@G@@@GOOOOOOOO@@@" "@@I@A@@HGOOOOOOON@@@" "@AI@@@@@@@@@@@@@@@@@" "@AJ@AH@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "B@@@@@@@@@@@@@@@@@@@" "AH@H@@B@@@@@@@@@@@@@" "@BF@B@@@@@@@@@@@@@@@" "@@@@@@H@@@@@@@@@@@@@" "H@@D@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@L@@@@@@@@@@@@@@@@" "@@@@BH@@@@@@@@@@@@@@" "B@D@@@@@@@@@@@@@@@@@" "DA@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@D@@@@@@@@@@@@")} 272 . 75) ({(READBITMAP)(112 41 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@H@@@@@@@@@@@" "@@@@@@@@@@L@@@@@BF@@@@@@@@@@" "@@@@@@@@L@@D@@@D@B@@@@@@@@@@" "@@@@@@@@H@@EA@F@CF@@@@@@@@@@" "@@@@@@@@@@AO@@@@@@@@D@@@@@@@" "@@@@B@F@@@@A@@@@@@L@CB@@@@@@" "@@@@@@@@BB@@@@@N@@L@I@@@@@@@" "@@@@@@I@@@@@D@@@@@@H@@@@@@@@" "@@@@@H@@C@@@@@H@A@@@@@@@@@@@" "@@@L@D@@D@B@@A@HCDAH@D@@@@@@" "@@@@@@@@D@@@@B@@BB@A@@@@@@@@" "@@@@@@@@A@@DA@@@H@@C@@@@@@@@" "@@@@@@@@AA@DC@AHH@@@@@@@@@@@" "@@@A@@FDBF@B@@@@@@@@@H@@@@@@" "@@@@DEBF@@@@@@@@@D@@AH@@@@@@" "@@@L@@@@@H@@@@L@@@@@@@@@@@@@" "@@@L@BB@F@@@A@HAB@D@@@B@@@@@" "@@@@CBB@D@@@@@@H@@FCL@@@D@@@" "@@@@CC@@@@@@@AD@LN@@@@@@@@@@" "H@@@H@@@A@@@A@@C@@@@@@@@@@@@" "L@CL@@@C@FA@@I@@@@@@@B@B@@@@" "N@CN@@@B@F@D@G@H@@@@@F@@@B@@" "G@@@@F@CD@@@@@@@AC@FB@@@@@@@" "K@@@@F@LB@AH@A@@HB@F@@@@@@@@" "C@@@@@@LA@@H@A@@@@@@@@@@@@@@" "OH@@L@@@AA@DDD@@@@@@@@@@H@@@" "GH@F@@@C@A@@D@D@JA@@@@@@@@@@" "KH@D@BA@@IA@@@@@L@@@@A@@@@H@" "CH@@@DB@A@@@@@@H@@CH@@A@@@D@" "MLAH@DB@AA@@@A@H@@F@H@A@@@@@" "GLAH@@L@@@D@@D@@@@@A@@A@@D@@" "JLAN@@@@C@@@@@@@FC@@@D@@A@@@" "CL@@@A@@@B@@@D@@B@@@@@@@@@@@" "ON@@AIHAAB@@@D@@@@@@@@AB@@B@" "GF@FI@@@@@H@AAA@@@@DH@@B@@@@" "KN@F@@@B@@@@@A@@@@@D@@@@@@A@" "CF@@@@AHC@@ADC@A@@@@D@M@D@@@" "OF@I@@BA@HBA@H@@D@@@@@@@@H@@" "GN@@@@HC@@@@@@@@@@D@@@@@@@@@")} 256 . 117))) (40 (({(READBITMAP)(96 67 "@@@@@@@@@@@@@@@@BD@@@@@@" "@@@@@@@@@@@@@@@D@@@@@@@@" "@@@@@@@@@@@@@@D@@F@@@@@@" "@@@@@@@@@@@A@@@@@@@@@@@@" "@@@@B@@@@@@@@@@@@@@@@@@@" "@@@@@@@@B@@@@@@F@@D@@@@@" "@@@@@@A@@@@@D@@@@@@@@@@@" "@@@@@@@@@@@@@@H@@@@@@@@@" "@@@@@D@@@@B@@A@H@D@H@D@@" "@@@@@@@@D@@@@B@@@B@A@@@@" "@@@@@@@@@@@DA@@@H@@C@@@@" "@@@@@@@@A@@@B@A@H@@@@@@@" "@@@A@@F@B@@@@@@@@@@@@H@@" "@@@@DEB@@@@@@@@@@D@@@H@@" "@@@@@@@@@H@@@@@@@@@@@@@@" "@@@@@BB@F@@@A@H@@@@@@@B@" "@@@@CBB@@@@@@@@@@@@@D@@@" "@@@@C@@@@@@@@A@@LH@@@@@@" "H@@@H@@@@@@@A@@A@@@@@@@@" "L@@@@@@C@@A@@I@@@@@@@B@B" "N@@@@@@B@@@D@G@@@@@@@F@@" "G@@@@D@C@@@@@@@@AC@@B@@@" "K@@@@F@DB@AH@@@@HB@@@@@@" "C@@@@@@D@@@H@A@@@@@@@@@@" "OH@@L@@@AA@DD@@@@@@@@@@@" "GH@@@@@C@A@@D@D@BA@@@@@@" "KH@@@BA@@IA@@@@@@@@@@A@@" "CH@@@DB@@@@@@@@H@@@@@@A@" "MLA@@DB@@A@@@A@H@@@@H@A@" "GLA@@@L@@@@@@D@@@@@A@@A@" "JLA@@@@@C@@@@@@@FA@@@D@@" "CL@@@A@@@B@@@D@@@@@@@@@@" "ON@@AIH@AB@@@D@@@@@@@@AB" "GF@BI@@@@@H@AAA@@@@DH@@B" "KN@B@@@B@@@@@A@@@@@D@@@@" "CF@@@@AHC@@ADC@A@@@@D@M@" "OF@@@@B@@HBA@H@@D@@@@@@@" "GN@@@@HC@@@@@@@@@@D@@@@@" "KN@@@A@@@@@@@F@B@FD@@@@@" "BO@@@L@@@@D@@D@@@@@@@@@@" "NO@@@@@A@@L@L@@@@@@@D@@@" "GO@@@@@@@@@@@@@@@@@@@@@@" "JG@@@@@@@@@@@@@@@@@@@@@@" "CO@@@@D@@@@@@@@@@@@@@@@@" "OL@@@@@@@@@@@@@@@@@@@@@@" "GL@@@@@@@@@@@@@@@@@@@@@@" "NO@@@@@@@@@@@@@@@@@@@@@@" "FO@@A@@@@@@@@GOOOOOOOL@@" "MOD@@@@@D@@@@FJJJJJJJO@@" "GOD@@B@B@@@@A@@@@@@@@AH@" "MKD@@@@@@@@@@BJJJJJJJKL@" "FKDA@E@@@I@@CGOOOOOOOON@" "OO@@@@A@AA@@AGOOOOOOOON@" "KG@@L@A@@@@@@GOOOOOOOOO@" "OJ@@@@@@@@@@BGOOOOOOOOO@" "MB@@@B@@@A@@@GOOOOOOOOO@" "CO@@D@@AD@@@@GOOOOOOOOO@" "OFA@@@@@D@@@@GOOOOOOOOO@" "LJAHD@@@@@@@@GOOOOOOOOO@" "OFAH@@@@@@@@@GOOOOOOOON@" "MN@@@@@@@N@@@GOOOOOOOON@" "GF@@@@@@@@H@@GOOOOOOOOL@" "JNFFA@@@@@@@@GOOOOOOOOH@" "KFD@B@@@@@@@@GOOOOOOOO@@" "MN@B@@@@A@@H@GOOOOOOON@@" "GDBB@@@@@@@@@@@@@@@@@@@@" "NL@@@AJ@AH@@@@@@@@@@@@@@")} 256 . 88) ({(READBITMAP)(80 14 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@B@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@D@" "@@@@@@@@@A@@@@@@@@N@" "@@@@@@@@@@CN@@@@@@OH" "B@@@@@@@@HGN@@@@@@ON" "B@@@@@B@OHOL@@@@@@ON")} 256 . 28))) (40 (({(READBITMAP)(16 1 "B@@@")} 288 . 79) ({(READBITMAP)(16 1 "@@@@")} 352 . 124) ({(READBITMAP)(16 2 "@@@@" "@@@@")} 336 . 141) ({(READBITMAP)(32 35 "NO@@@@@@" "GO@@@@@@" "JG@@@@@@" "CO@@@@@@" "OL@@@@@@" "GL@@@@@@" "NO@@@@@@" "FO@@@@@@" "MOD@@@@@" "GOD@@@@@" "MKD@@@@@" "FKD@@@@@" "OO@@@@@@" "KG@@@@@@" "OJ@@@@@@" "MB@@@B@@" "CO@@@@@@" "OF@@@@@@" "LJ@@@@@@" "OF@@@@@@" "MN@@@@@@" "GF@@@@@@" "JNF@@@@@" "KFD@B@@@" "MN@@@@@@" "GD@B@@@@" "NL@@@AJ@" "CD@@@@@@" "ML@@B@@@" "GL@@AH@H" "JH@@@BF@" "CHF@@@@@" "MHH@H@@D" "GH@@@@@@" "KH@@@@@@")} 256 . 80) ({(READBITMAP)(96 20 "N@@@@@@@@@@@@@@@@@@@@@@@" "N@@@@@@@@@@@@@@@@@@@@@@@" "L@@@@@@@@@@@@@@@@@@@@@@@" "L@@@@@@@@@@@@@@@@@@@@@@@" "H@@@@@@@@@@@@@AN@@@@@@@@" "H@@@@@@@@@@@@HGN@@@@@@@@" "@@@@@@@@@@B@OHOL@@@@@@@@" "@@@@@@@@@@GOOOOL@@@@@@@@" "@@@@@@@@@@GOOOO@@@@@@@@@" "OOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@GOOOON@@@@@@@@@" "@@@@@@@@@@OOOOL@@@@@@@F@" "@@@@L@@@@@OOOOL@@@@@C@G@" "@@@H@@@@@@COOO@@@@@@CHG@" "@@@H@@DG@@@@@@@AH@@@AL@@" "@@@@@@@G@@@@@@@AH@@@AL@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@B@@@@@@@@@@@@@@@@@@@@@" "@@L@@@@@@@@@@@@@@@@@@@@@")} 240 . 15) ({(READBITMAP)(16 22 "@@@@" "FA@@" "@@@@" "@@@@" "@@@D" "@@@D" "@@@@" "@@@@" "@@D@" "@D@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OOOO" "EEEE" "@@@@" "EEEE")} 320 . 104) ({(READBITMAP)(16 33 "@@A@" "H@@B" "@@@@" "D@M@" "@@@@" "@@@@" "@@@@" "@@@@" "D@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OOH@" "EEN@" "@@C@" "EEGH" "OOOL" "OOOL" "OOON" "OOON" "OOON" "OOON" "OOON" "OOON" "OOOL" "OOOL" "OOOH" "OOO@" "OON@" "OOL@")} 336 . 90) ({(READBITMAP)(32 32 "@@H@A@@@" "@@@@@@@@" "C@@A@@@A" "@@B@@H@@" "@@@@@@@@" "@@@@@B@B" "@@D@@@@@" "@@L@D@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@OO" "@@@@@@ME" "@@@@@@@@" "@@@@@@EE" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "@N@@@@OO" "@@@@@@OO" "@@@@@@OO" "@@@@@@OO" "A@@H@@OO")} 288 . 90) ({(READBITMAP)(80 13 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@H@@@@@@@@@" "@@@@@@B@@@@@@@@@@@@@" "@@@@D@@@@@@@@@@@@@@@" "@@@@@@@D@@@@@@@@@@@@" "@@@@A@@@@@A@@@@@@@@@")} 272 . 143))) (40 (({(READBITMAP)(16 1 "@@@@")} 272 . 99) ({(READBITMAP)(48 11 "JL@@@@@@C@@@" "CL@@@@@@@B@@" "ON@@@@@@@B@@" "GF@@@@@@@@H@" "KN@@@@@@@@@@" "CF@@@@A@C@@A" "OF@@@@@@@@B@" "GN@@@@HC@@@@" "KN@@@@@@@@@@" "BO@@@@@@@@@@" "NO@@@@@@@@@@")} 256 . 114) ({(READBITMAP)(64 18 "@@@OOOOOOOOH@@@@" "@@@MEEEEEEEN@@@@" "@@@@@@@@@@@C@@@@" "@@@EEEEEEEEGH@@@" "@@@OOOOOOOOOL@@@" "@@@OOOOOOOOOL@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOON@@@" "@@@OOOOOOOOOL@@@" "@@@OOOOOOOOOL@@@" "@@@OOOOOOOOOH@@@" "@@@OOOOOOOOO@@@@" "@@@OOOOOOOON@@@@" "@@@OOOOOOOOL@@@@")} 304 . 90) ({(READBITMAP)(32 10 "AHHG@@@@" "AI@@@@@@" "A@@@@@@@" "A@@@@@@F" "AH@@@@@@" "@@@@@@@@" "@@@@@@@F" "@@@@@@@D" "@@@@@@@D" "@@@@@@@B")} 256 . 9) ({(READBITMAP)(32 20 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "B@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@AH@@@@@" "@@@@@@@@" "B@@@@@@@" "AH@@@@@@" "@B@@B@@@" "@@@@@@@@" "H@@D@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "B@D@@@@@" "DA@@@@@@" "@@@@@@@@" "@@@@@@@@")} 272 . 75) ({(READBITMAP)(16 8 "@@L@" "H@HH" "H@@@" "@@@@" "@@@@" "@@@@" "@AH@" "@AH@")} 304 . 13) ({(READBITMAP)(96 27 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@@@@B@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@B@@A@@H@@@@@@@B@@@@@@" "@@@@@@@D@F@@@@@@@D@@@B@@" "@D@@@@@@@@@@@@@@@@@@@@@@" "@F@DB@AH@@@@H@@@@@@@@@@@" "@@@D@@@H@A@@@@@@@@@@@@@@" "L@@@AA@@@@@@@@@@@@@@@@@@" "@@@C@A@@D@D@BA@@@@@@@@@@" "@BA@@IA@@@@@@@@@@@@@@@H@" "@DB@@@@@@@@H@@@@@@@@@@D@" "@DB@@A@@@A@H@@@@H@@@@@@@" "@@L@@@@@@@@@@@@@@@@@@D@@" "@@@@C@@@@@@@FA@@@@@@@@@@" "@@@@@B@@@D@@@@@@@@@@@@@@" "@@@@@B@@@D@@@@@@@@A@@@B@" "@@@@@@H@A@@@@@@D@@@B@@@@")} 272 . 121))) (40 (({(READBITMAP)(16 2 "GD@F" "NL@G")} 256 . 88) ({(READBITMAP)(16 1 "@@@@")} 288 . 84) ({(READBITMAP)(16 1 "@@@@")} 256 . 142) ({(READBITMAP)(16 6 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 336 . 134) ({(READBITMAP)(16 9 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@B@" "@@@@" "@@@@")} 352 . 120) ({(READBITMAP)(16 15 "@@@@" "@@@@" "@@@@" "H@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 272 . 77) ({(READBITMAP)(16 29 "@@@@" "@@@@" "@@@B" "@@@@" "D@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 304 . 90) ({(READBITMAP)(48 18 "OOOOOOOOH@@@" "MEEEEEEEN@@@" "@@@@@@@@C@@@" "EEEEEEEEGH@@" "OOOOOOOOOL@@" "OOOOOOOOOL@@" "OOOOOOOOON@@" "OOOOOOOOON@@" "OOOOOOOOON@@" "OOOOOOOOON@@" "OOOOOOOOON@@" "OOOOOOOOON@@" "OOOOOOOOOL@@" "OOOOOOOOOL@@" "OOOOOOOOOH@@" "OOOOOOOOO@@@" "OOOOOOOON@@@" "OOOOOOOOL@@@")} 320 . 90) ({(READBITMAP)(80 15 "L@@@@@@@@@@@@@@@@@@@" "N@@@@@@@@@@@@D@@@@@@" "G@@@@@@@@@@@@@@@@@@@" "K@@@@@@@B@@@@@@@@@@@" "C@@@@@@D@@@@@A@@@@@@" "OH@@@@@@@@@@@@@@@@@@" "GH@@@@@@@@@@@@D@B@@@" "KH@@@@@@@H@@@@@@@@@@" "CH@@@@@@@@@@@@@H@@@@" "ML@@@DB@@A@@@A@H@@@@" "GL@@@@@@@@@@@@@@@@@@" "JL@@@@@@C@@@@@@@DA@@" "CL@@@@@@@B@@@D@@@@@@" "ON@@@@@@@B@@@D@@@@@@" "GF@@@@@@@@H@A@@@@@@@")} 256 . 121) ({(READBITMAP)(64 1 "C@@@@@@A@@@@D@A@")} 288 . 119))) (40 (({(READBITMAP)(16 1 "@@H@")} 272 . 117) ({(READBITMAP)(16 18 "@OOO" "@MEE" "@@@@" "@EEE" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO" "@OOO")} 320 . 90) ({(READBITMAP)(64 18 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@H@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@A@" "@@H@@@@@@@@@@@@B" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@D@@@" "@@B@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@D@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 288 . 114) ({(READBITMAP)(32 11 "JN@@@@@@" "KF@@@@@@" "MN@@@@@@" "GD@@@@@@" "NL@@@@@@" "CD@@@@@@" "ML@@@@@@" "GL@@@@@@" "JH@@@@@@" "CH@@@@@@" "MH@@@@@@")} 256 . 82) ({(READBITMAP)(16 45 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@H@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "OH@@" "EN@@" "@C@@" "EGH@" "OOL@" "OOL@" "OON@" "OON@" "OON@" "OON@" "OON@" "OON@" "OOL@" "OOL@" "OOH@" "OO@@" "ON@@" "OL@@")} 352 . 90))) (40 (({(READBITMAP)(16 8 "OO@@" "GO@@" "NO@@" "FO@@" "MO@@" "GO@@" "MK@@" "FK@@")} 256 . 103) ({(READBITMAP)(16 1 "@D@@")} 272 . 126) ({(READBITMAP)(16 6 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 336 . 121) ({(READBITMAP)(16 6 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 304 . 134) ({(READBITMAP)(48 18 "@@OOOOOOOOH@" "@@MEEEEEEEN@" "@@@@@@@@@@C@" "@@EEEEEEEEGH" "@@OOOOOOOOOL" "@@OOOOOOOOOL" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOON" "@@OOOOOOOOOL" "@@OOOOOOOOOL" "@@OOOOOOOOOH" "@@OOOOOOOOO@" "@@OOOOOOOON@" "@@OOOOOOOOL@")} 320 . 90) ({(READBITMAP)(32 2 "@@@@@@@@" "@@@@@@@@")} 272 . 131))) (40 (({(READBITMAP)(16 1 "@@@@")} 336 . 119) ({(READBITMAP)(16 35 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@O" "@@@M" "@@@@" "@@@E" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O" "@@@O")} 320 . 90) ({(READBITMAP)(32 10 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@")} 272 . 117) ({(READBITMAP)(32 29 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "OOOH@@@@" "EEEN@@@@" "@@@C@@@@" "EEEGH@@@" "OOOOL@@@" "OOOOL@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOON@@@" "OOOOL@@@" "OOOOL@@@" "OOOOH@@@" "OOOO@@@@" "OOON@@@@" "OOOL@@@@")} 352 . 90))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@@@@@@@@@AH@@" "@@@@BJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 320 . 90))) (40 (({(READBITMAP)(48 19 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@@@@@@@@@AH@" "@BJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@" "@@@@@@@@@@@@")} 336 . 90))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@@@@@@@@@AH" "@@BJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 336 . 91))) (40 (({(READBITMAP)(64 18 "@@@GOOOOOOOL@@@@" "@@@FJJJJJJJO@@@@" "@@@@@@@@@@@AH@@@" "@@@BJJJJJJJKL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOOH@@@" "@@@GOOOOOOOO@@@@" "@@@GOOOOOOON@@@@")} 336 . 91))) (40 (({(READBITMAP)(64 18 "@@@@GOOOOOOOL@@@" "@@@@FJJJJJJJO@@@" "@@@@@@@@@@@@AH@@" "@@@@BJJJJJJJKL@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOOO@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOON@@" "@@@@GOOOOOOOOL@@" "@@@@GOOOOOOOOH@@" "@@@@GOOOOOOOO@@@" "@@@@GOOOOOOON@@@")} 336 . 91))) (40 (({(READBITMAP)(48 18 "@GOOOOOOOL@@" "@FJJJJJJJO@@" "@@@@@@@@@AH@" "@BJJJJJJJKL@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOOO@" "@GOOOOOOOON@" "@GOOOOOOOON@" "@GOOOOOOOOL@" "@GOOOOOOOOH@" "@GOOOOOOOO@@" "@GOOOOOOON@@")} 352 . 91))) (40 (({(READBITMAP)(48 18 "@@GOOOOOOOL@" "@@FJJJJJJJO@" "@@@@@@@@@@AH" "@@BJJJJJJJKL" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOOO" "@@GOOOOOOOON" "@@GOOOOOOOON" "@@GOOOOOOOOL" "@@GOOOOOOOOH" "@@GOOOOOOOO@" "@@GOOOOOOON@")} 352 . 91))) (40 (({(READBITMAP)(48 18 "@@@GOOOOOOOL" "@@@FJJJJJJJO" "@@@@@@@@@@@A" "@@@BJJJJJJJK" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOOO" "@@@GOOOOOOON")} 352 . 91))) (40 (({(READBITMAP)(48 18 "@@@@GOOOOOOO" "@@@@FJJJJJJK" "@@@@@@@@@@@A" "@@@@BJJJJJJK" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO" "@@@@GOOOOOOO")} 352 . 91))) (40 (({(READBITMAP)(16 18 "@GOO" "@FJJ" "@@@@" "@BJJ" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO")} 368 . 91))) (40 (({(READBITMAP)(16 18 "@@GO" "@@FJ" "@@@@" "@@BJ" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO" "@@GO")} 368 . 91))) (40 (({(READBITMAP)(16 18 "@@@G" "@@@F" "@@@@" "@@@B" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G")} 368 . 91))) (40 (({(READBITMAP)(32 18 "@@@@GOOO" "@@@@FJJK" "@@@@@@@A" "@@@@BJJK" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO" "@@@@GOOO")} 368 . 91))) (40 (({(READBITMAP)(16 18 "@GOO" "@FJK" "@@@A" "@BJK" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO" "@GOO")} 384 . 91))) (40 (({(READBITMAP)(16 18 "@@CO" "@@CE" "@@@A" "@@AE" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO" "@@CO")} 384 . 91))) (40 (({(READBITMAP)(16 18 "@@@G" "@@@G" "@@@A" "@@@C" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G" "@@@G")} 384 . 91))) (40 (({(READBITMAP)(16 18 "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A" "@@@A")} 384 . 91))) (500 (({(READBITMAP)(16 18 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 384 . 91))) (40 (({(READBITMAP)(160 90 "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@CL@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GL@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@AOOOOON@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@OOOOOOON@@@@@@@" "@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@" "@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@" "@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 86))) (40 (({(READBITMAP)(160 90 "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@AOOOOON@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@OOOOOOON@@@@@@@" "@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@" "@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@" "@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 88))) (40 (({(READBITMAP)(160 90 "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@AOOOOON@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@OOOOOOON@@@@@@@" "@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@" "@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@" "@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 90))) (40 (({(READBITMAP)(160 90 "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@@@O@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@AOOOOON@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CN@@@OOOOOOON@@@@@@@" "@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@" "@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@" "@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 92))) (40 (({(READBITMAP)(160 92 "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AH@@" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" "@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@" "@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@" "@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@" "@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 94))) (40 (({(READBITMAP)(160 105 "AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C" "AHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOLCC" "@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOLC@" "@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AHC@" "@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@" "OOL@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AHGO" "OOL@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AHGO" "@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@" "@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@" "CHL@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@" "CHL@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AHAH" "ALOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOLAH" "@LOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOLF@" "@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@GH" "AH@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@GH" "AH@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@" "@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@" "OO@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@GO" "OO@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@GO" "@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@" "@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@" "@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@" "@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@" "@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@" "@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@" "@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@" "@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@" "@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@" "@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@" "@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@" "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 98))) (40 (({(READBITMAP)(192 107 "@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@F@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@F@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@L@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@L@@@@" "@@AN@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@AN@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@@@@@" "OOOOOOL@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AHGOOOOO" "OOOOOOL@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AHGOOOOO" "@@@@@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@N@@@" "@@AN@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@AN@@@" "@@AN@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@CH@@@" "@@@@@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@C@@@@" "@@@@@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@@@@@" "@@@@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@HC@@@" "@@G@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@CL@@" "@@G@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@AL@@" "@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@" "@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@" "@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@" "@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@" "OOOOOO@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@GOOOOO" "OOOOOO@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@GOOOOO" "@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@@@" "@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@@@" "@@@@@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@@@@@" "@@@@@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@@@@@" "@@@@@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@@@" "@@@@@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@" "@@@@@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@" "@@@@@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@" "@@@@@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@@@@@" "@@@@@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@@@@@" "@@@@@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@" "@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@@" "@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@@" "@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@" "@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@" "@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@@" "@@@@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@@@@@" "@@@@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@@@@@" "@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@@@@@" "@@@@@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@@@@@" "@@@@@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@@@@@" "@@@@@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@@@@@" "@@@@@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@@@@@" "@@@@@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@@@@@" "@@@@@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@@@@@" "@@@@@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@@@@@" "@@@@@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@@@@@" "@@@@@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@@@@@" "@@@@@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@@@@@" "@@@@@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@@@@@" "@@@@@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@@@@@" "@@@@@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@@@@@" "@@@@@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@@@@@" "@@@@@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@@@@@" "@@@@@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@@@@@" "@@@@@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@@@@@" "@@@@@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@@@@@" "@@@@@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@@@@@" "@@@@@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@@@@@" "@@@@@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@@@@@" "@@@@@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@@@@@" "@@@@@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@@@@@" "@@@@@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@@@@@" "@@@@@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@@@@@" "@@@@@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@@@@@" "@@@@@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 96 . 104))) (40 (({(READBITMAP)(192 103 "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@C@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@C@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@C@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@@AH@" "@@@@@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@@AH@" "@@@@@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@@F@@" "@@@@@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@@F@@" "@@@@@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@@@@@" "@G@@@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@@@@@" "@G@@@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@C@@@" "@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@C@@@" "@@@@@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "OOOOOOL@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AHGOOOOO" "OOOOOOL@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AHGOOOOO" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@L@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@@@@@" "@@@@@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@@@@@" "@@@@@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@@@F@" "@@@@@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@@@F@" "@@@@@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@@CH@" "@@O@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@@CH@" "@@O@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@@C@@" "@@@@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@@@@@" "@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@" "@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@" "@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@" "@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@" "@@@@@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@@@@@" "@@@@@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@@@@@" "@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@@@" "@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@@@" "@@@@@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@@@@@" "@@@@@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@@@AN" "@@@@@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@AN" "@@@@@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@" "@@@@@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@" "@@@@@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@" "OOOOOO@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCLGOOOOO" "OOOOOOAMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOONGOOOOO" "@@@@@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@" "@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@@" "@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@@" "@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@" "@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@" "@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@@" "@@@@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBO@@@@@@" "@@@@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONO@@@@@@" "@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGO@@@@@@" "@@@@@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJG@@@@@@" "@@@@@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCO@@@@@@" "@@@@@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOOO@@@@@@" "@@@@@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGO@@@@@@" "@@@@@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNO@@@@@@" "@@@@@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFO@@@@@@" "@@@@@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMO@@@@@@" "@@@@@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGO@@@@@@" "@@@@@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMK@@@@@@" "@@@@@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@@@@@" "@@@@@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@@@@@" "@@@@@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@@@@@" "@@@@@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@@@@@" "@@@@@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@@@@@" "@@@@@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@@@@@" "@@@@@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@@@@@" "@@@@@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@@@@@" "@@@@@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@@@@@" "@@@@@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@@@@@" "@@@@@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@@@@@" "@@@@@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@@@@@" "@@@@@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@@@@@" "@@@@@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@@@@@" "@@@@@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@@@@@" "@@@@@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@@@@@" "@@@@@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@@@@@" "@@@@@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 96 . 112))) (40 (({(READBITMAP)(208 102 "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LF@@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LO@@@@@@@@@@@@@@@AH@@@@@@" "@@@@C@@@@@L@@@@@@@@@@@@@@@@MO@@@@@@@@@@@@@@@AH@@@@@@" "@@@@C@@@@@L@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@OOL@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@MOL@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LON@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LOO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LGO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LCOH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@B@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@AH@" "@@B@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@AH@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@B@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@B@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@@@@@" "@@@@@@@@@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@@@@@" "@@@@@@@@@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@@@@@" "OOOOOOOOOO@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@GOOOOO" "OOOOOOOOOO@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@GOOOOO" "@@@@@@@@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@@@@@" "@@@@@@@@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@@@@@" "@@@@@@@@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@@@@@" "@@@@@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@" "@@@@@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@" "@@@@@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@" "@@@@@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@" "@@@@@@@@@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@@@@@" "@@@@@@@@@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@@@@@" "@@@@@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@F@" "@@@@@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@F@" "@@@@@@@@@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@@@@@" "@@@@@@N@@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@@@@@" "@@@@@@N@@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@@@" "@@@@@@@@@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@" "@@@@@@@@@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@" "@@@@@@@@@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@" "@@@@@@@@@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@@@@@" "@@@@@@@@@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@@@@@" "@@@@@@@@@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@" "@@@@@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@@" "@@@@@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@@" "@@@@@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@" "@@@@@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@" "@@@@@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@B" "@@@@@@@@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBN@@@@@F" "@@@@@@@@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONN@@@@@@" "@@@@@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGN@@@@@@" "@@@@@@@@@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJF@@@@@@" "OOOOOOOOOOANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCNGOOOOO" "OOOOOOOOOOAOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOONGOOOOO" "@@@@@@@@@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGN@@@@@@" "@@@@@@@@@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNN@@@@@@" "@@@@@@@@@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFN@@@@@@" "@@@@@@@@@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMN@@@@@@" "@@@@@@@@@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGN@@@@@@" "@@@@@@@@@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMJ@@@@@@" "@@@@@@@@@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@@@@@" "@@@@@@@@@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@@@@@" "@@@@@@@@@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@@@@@" "@@@@@@@@@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOK@@@@@@" "@@@@@@@@@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMC@@@@@@" "@@@@@@@@@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@@@@@" "@@@@@@@@@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOG@@@@@@" "@@@@@@@@@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLK@@@@@@" "@@@@@@@@@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOG@@@@@@" "@@@@@@@@@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMO@@@@@@" "@@@@@@@@@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGG@@@@@@" "@@@@@@@@@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJO@@@@@@" "@@@@@@@@@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKG@@@@@@" "@@@@@@@@@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMO@@@@@@" "@@@@@@@@@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGG@@@@@@" "@@@@@@@@@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNO@@@@@@" "@@@@@@@@@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@@@@@" "@@@@@@@@@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOMM@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 80 . 122))) (40 (({(READBITMAP)(208 90 "@@@@@@@@@@L@@@@@@@@@@@@@@@@LAOL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@B@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@B@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@GL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OL@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@OH@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@L@O@@@@@@@@@@@@@@AH@@@@@@" "@@@@@@@@@@L@@@@@@@@@@@@@@@@LAO@@@@@@@@@@@@@@AH@@@@B@" "@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@B@" "@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@@@@@" "@@@@@@@@@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@@@@@" "@@@@@@@@@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@@@@@" "@@@@@@@@@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@@@@@" "@@@@@@@@@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@@@@@" "@@@@@@@@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@@@@@" "@@@@@@@@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@@@@@" "@@@@@@@@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@@@@@" "@@@@@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@" "@@@@@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@" "@@@@@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@" "@@@@@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@" "@@@@@@@@@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@@@@@" "@@@@@@@@@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@@@@@" "@@@@@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@@@" "@@@@@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@@@" "OOOOOOOOOO@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGHGOOOOO" "OOOOOOOOOO@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKHGOOOOO" "@@@@@@@@@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@@@" "@@@@@@@@@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@" "@@@@@@@@@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@" "@@@@@@@@@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@" "@@@@@@@@@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@@@@@" "@@@@@@@@@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@@@@@" "@@@@@@@@@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@" "@@@@@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@L" "@@@@@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@L" "@@@@@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@" "@@@@@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@" "@@@@@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@@" "@@@@@@B@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBN@@@@@@" "@@@@@@B@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONN@@@@@@" "@@@@@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGN@@@@@@" "@@@@@@@@@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJF@@@@@@" "@@@@@@@@@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCN@@@@@@" "@@@@@@@@@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOON@@@@@@" "@@@@@@@@@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGN@@@@@@" "@@@@@@@@@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNN@@@@@@" "@@@@@@@@@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFN@@@@@@" "@@@@@@@@@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMN@@@@@@" "@@@@@@@@@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGN@@@@@@" "@@@@@@@@@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMJ@@@@@@" "@@@@@@@@@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@@@@@" "@@@@@@@@@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@@@@@" "@@@@@@@@@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@@@@@" "@@@@@@@@@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOK@@@@@@" "@@@@@@@@@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMC@@@@@@" "OOOOOOOOOOAMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCOGOOOOO" "OOOOOOOOOOAOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOGGOOOOO" "@@@@@@@@@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLK@@@@@@" "@@@@@@@@@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOG@@@@@@" "@@@@@@@@@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMO@@@@@@" "@@@@@@@@@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGG@@@@@@" "@@@@@@@@@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJO@@@@@@" "@@@@@@@@@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKG@@@@@@" "@@@@@@@@@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMO@@@@@@" "@@@@@@@@@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGG@@@@@@" "@@@@@@@@@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNO@@@@@@" "@@@@@@@@@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@@@@@" "@@@@@@@@@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOMM@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 80 . 134))) (40 (({(READBITMAP)(192 77 "@@@@@@@@@@@@@@@@@@@@@@@LCN@@@OOOOOOON@@@@@@@@@@@" "@@@@@@@@@@@@OOOOOOL@@@@@CL@@CONJJJJOOL@@@@@@@@@@" "@@@@@@@@@@@OKOOOOGOL@@@@GL@@OOCCCCCCCOH@@@@@@@@@" "@@@@@@@@@@COMOOOOOOOH@@@GH@COHMMMMMMMON@@@@@@@@@" "@@@@@@@@@@OJKGGGOGOGN@@@GH@GOGGGGGGGGGO@@@@@@@@@" "@@@@@@@@@ANNJKJKOKOKOL@@OHAOJJJKJOKNOJKH@@@@@@@@" "@@@@@@@@@CMKCOKKOCOCOO@@OHCOCCKKKOKOOKOL@@@@@@@@" "@@@@@@@@@OOGOOOOOOOOMOH@O@OMOOOOOMMMMMMN@@@@@@@@" "@@@@@@@@AOGOGGGGGGGGOGL@OAOOGGEEEEGGGGGO@@@@@@@@" "@@@@@@@@CNKJJJJJJJJJJKN@OCNJJJJJH@@JJJJOH@@@@@@@" "@@@@@@@@COKJJJJJKKCCCKO@OGOOCJJH@@CKKKKCL@@@@@@@" "@@@@@@@@GOOEEEEEEOOOOOOIOOMGOED@@@OOOMOMN@@@@@@@" "@@@@@@@@OGEEEEEEEGGGGOOIOOFKEE@@@AGGGGGGG@@@@@@@" "@@@@@@@@NJJJJJJJJJJJOJKOONKNJH@@@@JJJJJJK@@@@@@@" "@@@@@@@@OJJJK@FJJKKKOCBOOKCJJH@@@CKKKKKKC@@@@@@@" "@@@@@@@AMMEE@@@MEGOOOOMGOMOOD@@@@OOOOOMMOH@@@@@@" "@@@@@@@COEEH@@CEEGGGGGGGOGGED@@@AGGGGGGGGH@@@@@@" "@@@@@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@@@@@" "@@@@@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@@@@@" "@@@@@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@@@@@" "@@@@@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@@@@@" "@@@@@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@@@@@" "@@@@@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@@@@@" "@@@@@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@@@@@" "@@@@@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@@@@@" "@@@@@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@@@@@" "@@@@@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@@@@@" "@@@@@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@@@@@" "@@@@@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@@@@@" "@@@@@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@@@@@" "@@@@@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBN@@@@@@" "@@@@@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONN@@@@@@" "@@@@@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGN@@@@@@" "OOOOOOAJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJFGOOOOO" "OOOOOOANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCNGOOOOO" "@@@@@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOON@@@@@@" "@@@@@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGN@@@@@@" "@@@@@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNN@@@@@@" "@@@@@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFN@@@@@@" "@@@@@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMN@@@@@@" "@@@@@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGN@@@@@@" "@@@@@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMJ@@@@@@" "@@@@@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFK@@@@@@" "@@@@@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOOO@@@@@@" "@@@@@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKG@@@@@@" "@@@@@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOK@@@@@@" "@@@@@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMC@@@@@@" "@@@@@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCO@@@@@@" "@@@@@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOG@@@@@@" "@@@@@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLK@@@@@@" "@@@@@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOG@@@@@@" "@@@@@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMO@@@@@@" "@@@@@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGG@@@@@@" "@@@@@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJO@@@@@@" "@@@@@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKG@@@@@@" "@@@@@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMO@@@@@@" "@@@@@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGG@@@@@@" "@@@@@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNO@@@@@@" "@@@@@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@@@@@" "@@@@@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOMM@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "OOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOO" "OOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOO" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 96 . 147))) (40 (({(READBITMAP)(160 60 "@@@CNJJ@@@BJJJJJNONOOJJJ@@@@JJJJJJJJKH@@" "@@@GJJL@@@NJKKKCCMOCOCBJ@@@BKKKKKKKKCH@@" "@@@OME@@@AEEEMOOOMOOOOOD@@@MMMOMMOOOML@@" "@@@OEE@@@EEEEGGGGOOCOGED@@EGGGGGGGGGGL@@" "@@@OJJ@@@JJJJJJJJOJKNNJJ@JJJJJJJNNNJJL@@" "@@@OJJ@@AJJJKKCCCGCCOOJHBJKKKKKKKOCCCL@@" "@@AMMD@@CEEEEMMOOOMOOOMFMEOOMMOOMOOOON@@" "@@AMED@@EEEEEGGGGGGGOOGDEGGGGGOGGGOGGF@@" "@@@NJL@AJJJJJJJJJJJKNNJJJJJJJJJNJMJJKN@@" "@@@NJH@JJJJJKKKKCCKCOKJJKKKKKKKOKOKCCF@@" "@@AMEDAEEEEEEMMMOOOOOGOEMMOOMOOOOOOOOF@@" "@@AMEDEEEEEEEGGGGGGGOOGEGGGGOOGOGMOGGN@@" "@@ANJHJJJJJJJJJJJJJKNBJJJJJKONKJJOJJKN@@" "@@ANJLJKJJJKJKKCKCKCOKKKKKKKLOKKKOKCBN@@" "@@AMMGEMMEEEEEMMMOOONOMMMMONMOOOOOOONN@@" "@@AOEEEGGEEEEEGGGGOGOGGGGGGGOOGOGOGGGN@@" "@@AJJJJJJJJJJJJJJKNKNJJJJJJKKJNJJNJJJF@@" "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCN@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOON@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGN@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNN@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFN@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMN@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGN@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMJ@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFJ@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOON@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKF@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCN@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "OOAKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOFGO" "OOAOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMNGO" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 164))) (40 (({(READBITMAP)(160 43 "@@ANJJKKJJJJJKKCKCOCMCKKKKKKKKKKKKKCCN@@" "@@AOMEMMMEEEEEOOMMOMLMMMMOOOOOOOOOOOON@@" "@@AMEEGGEFJJNNLONIGGGGGGGGGGOGGOGOGGGN@@" "@@AJJJJJIJFALFLOOKBJJJJJJJJKNJKJOJJJNN@@" "@@AKJKKCICOOONONLBGCCCKKKKCKOKKKOKKCFN@@" "@@AOMOMMOL@ALBOHHGMOOMMMMMOOOMOOOOOOMN@@" "@@AOGGGOFMOOOMMMMDNGGGGGGGGOGGOGGGGGGN@@" "@@AJJJKNIJKJJJJJJJFJJJJJJJOJJNJJOJJJMJ@@" "@@AKKKKOIJJJJKKKCCOKCKKKKCOKKOKKOKCCFJ@@" "@@AMOOOONEEEEEMMMMOOOMMMMMOMMOOOOOOOON@@" "@@AOGGGOFEEEEEGGGGAGGGGGGGGGGOGGGGGGKF@@" "@@AJJJONOJJJJJJJJJLJJJJJJJJKNIOJJJJKOJ@@" "@@AKKKOOHJJJJJKKCCECCKKKKKKKKOMKKKCCMB@@" "@@AMOOOONEEEGGEMMOKMOMMMMMMMOOOOMOOOCN@@" "@@AOOGOOFEEEEEGGGGAOGGGGGGGGGGGGGGGGOF@@" "@@AKNKNJOJJJJJJJJJFJJJJJJJOJJJJOJJJKLJ@@" "@@AKOKOK@JJJJKKKCCNCCKKKKKOKKOKOKCCBOF@@" "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "OO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GO" "OO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GO" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 181))) (40 (({(READBITMAP)(160 26 "@@AOOOOMNMEEGGMMMLGMMMMMMMOMOOOOOOOOMN@@" "@@AOGGOGDGEEEEGGGEKGGGGGGGGGGOGGGGGGGF@@" "@@ANOJOJOJJJJJJJNMJJJJJJJKJJJNJJJJJKJN@@" "@@AIOKOKFIEEEDDDNAKCCKKKKCOCKKKKKCCBKF@@" "@@AOOOOMMMEEGGOMOMMMMMMMMOOOOOOOOOOOMN@@" "@@AOOOGGGEEEEEGOGGGGGGGGGGOGGGGGGGGGGD@@" "@@AJOJJJJJJJJJKKJJJJJJJJJJJJJJJJJJJMNL@@" "@@@OCKKCCJJJJJKKKCGCCKKKKKKKKKKKKCCGCD@@" "@@@OOOMMMMOGGGGMMMOMMMMMMMOOOOMOOOOOML@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 198))) (40 (({(READBITMAP)(160 9 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 215))))) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/ACE-BOUNCINGBALL.ACE b/lispusers/ACE-BOUNCINGBALL.ACE new file mode 100644 index 00000000..79f0605a --- /dev/null +++ b/lispusers/ACE-BOUNCINGBALL.ACE @@ -0,0 +1 @@ +(FILECREATED "16-Oct-85 14:36:45" {ICE}LISP>BOUNCINGBALL.ACE;1 36754 ) (PRETTYCOMPRINT BOUNCINGBALLCOMS) (RPAQQ BOUNCINGBALLCOMS ((UGLYVARS ACE.CURRENT.SEQUENCE))) (READVARS ACE.CURRENT.SEQUENCE) (((100 (({(READBITMAP)(358 304 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 0 . 0))) (100 (({(READBITMAP)(80 72 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@AOO@@@@@@@@@" "@@@@@@@AOOOO@@@@@@@@" "@@@@@@@GOOOOL@@@@@@@" "@@@@@@AOOOOOO@@@@@@@" "@@@@@@GOOOOOOL@@@@@@" "@@@@@@OOOOOOON@@@@@@" "@@@@@AOOOOOOOO@@@@@@" "@@@@@COOOOOOOOH@@@@@" "@@@@@GOOOOOOOOL@@@@@" "@@@@@OOOOOOOOON@@@@@" "@@@@AOOOOOOOOOO@@@@@" "@@@@COOOOOOOOOOH@@@@" "@@@@COOOOOOOOOOH@@@@" "@@@@GOOOOOOOOOOL@@@@" "@@@@GOOOOOOOOOOL@@@@" "@@@@OOOOOOOOOOON@@@@" "@@@@OOOOOOOOOOON@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@COOOOOOOOOOOOH@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@AOOOOOOOOOOOO@@@@" "@@@@OOOOOOOOOOON@@@@" "@@@@OOOOOOOOOOON@@@@" "@@@@GOOOOOOOOOOL@@@@" "@@@@GOOOOOOOOOOL@@@@" "@@@@COOOOOOOOOOH@@@@" "@@@@COOOOOOOOOOH@@@@" "@@@@AOOOOOOOOOO@@@@@" "@@@@@OOOOOOOOON@@@@@" "@@@@@GOOOOOOOOL@@@@@" "@@@@@COOOOOOOOH@@@@@" "@@@@@AOOOOOOOO@@@@@@" "@@@@@@OOOOOOON@@@@@@" "@@@@@@GOOOOOOL@@@@@@" "@@@@@@AOOOOOO@@@@@@@" "@@@@@@@GOOOOL@@@@@@@" "@@@@@@@AOOOO@@@@@@@@" "@@@@@@@@AOO@@@@@@@@@")} 128 . 102))) (100 (({(READBITMAP)(96 76 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@COOOOH@@@@@@@" "@@@@@@@@@AOOOOOOOO@@@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@OOOOOOOOOOOOON@@@" "@@@@@@GOOOOOOOOOOOOOOL@@" "@@@@@AOOOOOOOOOOOOOOOO@@" "@@@@@COOOOOOOOOOOOOOOOH@" "@@@@@OOOOOOOOOOOOOOOOON@" "@@@@AOOOOOOOOOOOOOOOOOO@" "@@@@COOOOOOOOOOOOOOOOOOH" "@@@@GOOOOOOOOOOOOOOOOOOL" "@@@@OOOOOOOOOOOOOOOOOOON" "@@@@OOOOOOOOOOOOOOOOOOON" "@@@AOOOOOOOOOOOOOOOOOOOO" "@@@AOOOOOOOOOOOOOOOOOOOO" "@@@AOOOOOOOOOOOOOOOOOOOO" "@@@AOOOOOOOOOOOOOOOOOOOO" "@@@AOOOOOOOOOOOOOOOOOOOO" "@@@@OOOOOOOOOOOOOOOOOOON" "@@@@OOOOOOOOOOOOOOOOOOON" "@@@@GOOOOOOOOOOOOOOOOOOL" "@@@@COOOOOOOOOOOOOOOOOOH" "@@@@AOOOOOOOOOOOOOOOOOO@" "@@@@@OOOOOOOOOOOOOOOOON@" "@@@@@COOOOOOOOOOOOOOOOH@" "@@@@@AOOOOOOOOOOOOOOOO@@" "@@@@@@GOOOOOOOOOOOOOOL@@" "@@@@@@@OOOOOOOOOOOOON@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@@@AOOOOOOOO@@@@@@" "@@@@@@@@@@@COOOOH@@@@@@@")} 112 . 77))) (100 (({(READBITMAP)(96 76 "@@@@@@@@@@@@AOO@@@@@@@@@" "@@@@@@@@@@@AOOOO@@@@@@@@" "@@@@@@@@@@@GOOOOL@@@@@@@" "@@@@@@@@@@AOOOOOO@@@@@@@" "@@@@@@@@@@GOOOOOOL@@@@@@" "@@@@@@@@@@OOOOOOON@@@@@@" "@@@@@@@@@AOOOOOOOO@@@@@@" "@@@@@@@@@COOOOOOOOH@@@@@" "@@@@@@@@@GOOOOOOOOL@@@@@" "@@@@@@@@@OOOOOOOOON@@@@@" "@@@@@@@@AOOOOOOOOOO@@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@@GOOOOOOOOOOL@@@@" "@@@@@@@@GOOOOOOOOOOL@@@@" "@@@@@@@@OOOOOOOOOOON@@@@" "@@@@@@@@OOOOOOOOOOON@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@COOOOOOOOOOOOH@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@AOOOOOOOOOOOO@@@@" "@@@@@@@@OOOOOOOOOOON@@@@" "@@@@@@@@OOOOOOOOOOON@@@@" "@@@@@@@@GOOOOOOOOOOL@@@@" "@@@@@@@@GOOOOOOOOOOL@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@@COOOOOOOOOOH@@@@" "@@@@@@@@AOOOOOOOOOO@@@@@" "@@@@@@@@@OOOOOOOOON@@@@@" "@@@@@@@@@GOOOOOOOOL@@@@@" "@@@@@@@@@COOOOOOOOH@@@@@" "@@@@@@@@@AOOOOOOOO@@@@@@" "@@@@@@@@@@OOOOOOON@@@@@@" "@@@@@@@@@@GOOOOOOL@@@@@@" "@@@@@@@@@@AOOOOOO@@@@@@@" "@@@@@@@@@@@GOOOOL@@@@@@@" "@@@@@@@@@@@AOOOO@@@@@@@@" "@@@@@@@@@@@@AOO@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@")} 112 . 77))) (100 (({(READBITMAP)(80 72 "@@@@@@@@@OOH@@@@@@@@" "@@@@@@@@OOOOH@@@@@@@" "@@@@@@@COOOON@@@@@@@" "@@@@@@@OOOOOOH@@@@@@" "@@@@@@COOOOOON@@@@@@" "@@@@@@GOOOOOOO@@@@@@" "@@@@@@OOOOOOOOH@@@@@" "@@@@@AOOOOOOOOL@@@@@" "@@@@@COOOOOOOON@@@@@" "@@@@@GOOOOOOOOO@@@@@" "@@@@@OOOOOOOOOOH@@@@" "@@@@AOOOOOOOOOOL@@@@" "@@@@AOOOOOOOOOOL@@@@" "@@@@COOOOOOOOOON@@@@" "@@@@COOOOOOOOOON@@@@" "@@@@GOOOOOOOOOOO@@@@" "@@@@GOOOOOOOOOOO@@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@AOOOOOOOOOOOOL@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@OOOOOOOOOOOOH@@@" "@@@@GOOOOOOOOOOO@@@@" "@@@@GOOOOOOOOOOO@@@@" "@@@@COOOOOOOOOON@@@@" "@@@@COOOOOOOOOON@@@@" "@@@@AOOOOOOOOOOL@@@@" "@@@@AOOOOOOOOOOL@@@@" "@@@@@OOOOOOOOOOH@@@@" "@@@@@GOOOOOOOOO@@@@@" "@@@@@COOOOOOOON@@@@@" "@@@@@AOOOOOOOOL@@@@@" "@@@@@@OOOOOOOOH@@@@@" "@@@@@@GOOOOOOO@@@@@@" "@@@@@@COOOOOON@@@@@@" "@@@@@@@OOOOOOH@@@@@@" "@@@@@@@COOOON@@@@@@@" "@@@@@@@@OOOOH@@@@@@@" "@@@@@@@@@OOH@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 128 . 102))))) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/ACE-FOUETTE.ACE b/lispusers/ACE-FOUETTE.ACE new file mode 100644 index 00000000..3a40c563 --- /dev/null +++ b/lispusers/ACE-FOUETTE.ACE @@ -0,0 +1 @@ +(FILECREATED "25-Sep-85 15:41:11" {ICE}LISP>FOUETTE.ACE;1 69626 ) (PRETTYCOMPRINT FOUETTECOMS) (RPAQQ FOUETTECOMS ((UGLYVARS ACE.CURRENT.SEQUENCE))) (READVARS ACE.CURRENT.SEQUENCE) (((200 (({(READBITMAP)(456 360 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CNCO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GN@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@GN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GFGL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CGOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CHC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GHCH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GO@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GN@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@LLN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@OOG@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@GOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@COOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@OOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@G@GN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@CNAO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@L@@@OLCL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@OL@@GOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@CON@@COOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@OOH@@GOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@CO@@@COOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@OOH@@OOOOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@COOL@COOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@OOO@AOOHAO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@ALCOOONCOHOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@GH@AOOOLGHAH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@N@@@@@GNCHAL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@AL@@@@@@G@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOON@@@@OL@G@@@@CO@GL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOH@AOOOOOOH@@@OOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOHOOOOOOOOLOH@@@@OON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@GOOOLAH@@CH@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@@@@@@@@@@CH@@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@CON@@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OL@@FOOOOOH@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OH@@GOOOHCO@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@@OLF@@AOOLCN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@@O@@@@ALGOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@O@@@@AH@ON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@@AO@@@@AOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@COH@@@AOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@@OKH@@@AMOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@ANCH@@@@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@CLCH@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@O@AH@@@@@@CL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@GN@@L@@@@@@@OH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@AOH@@O@@@@@@@GN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@GH@@@O@@@@@@@AOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@O@@@@O@@@@@@@@GOOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@NAL@@@@CH@@@@@@@@OOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ALCH@@@@CH@AOON@@@@F@OOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ALC@@@@@CN@OOOO@@@@@@@@OOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ALF@@@@@AOOOLGOL@@@@@@@@ON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ALN@@@@@@GO@@@GO@@@@@@@@GOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOL@@@@@@GH@@@GON@@@@@@@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OH@@@@@@C@@@@CAOL@@N@@@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@@@@C@@@@AHCOOOOOH@@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CL@@@AH@GOOIOL@@@OH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@@@AH@@@@@AOIOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@AH@@@@@@COOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@AH@@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@CL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@O@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@OL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@GO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@CON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@@FOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OF@COOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ONMOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COMO@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 0 . 0))) (200 (({(READBITMAP)(32 9 "@@@@O@@@" "@@AOON@@" "@@GOOOOO" "@@GH@COO" "@@G@@@@@" "@@GO@OKH" "@@AOOOOL" "@@@GOOOO" "@@@@@@@O")} 128 . 184) ({(READBITMAP)(48 29 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@C" "@@@@@@@@@@@O" "@@@@@@@@@@AO" "@@@@@@@@@@GN" "@@@@@@@@GOO@" "@@@@@@@OOOL@" "@@@@@@COON@@" "@@@@@AOL@@@@" "@@@@AOO@@@@@" "@@@COOH@@@@@" "@@GOO@@@@@@@" "@AOO@@@@@@@A" "@CO@@@@@CMKG" "@GHL@@@AOOOO" "@GOOOH@AOOON" "@GOOON@GH@@@" "@@@@@OHG@@@@" "@@@@@CLN@@@@" "@@@@@ANN@@@@" "@@@@@@OL@@@@" "@@@@@@AH@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 112 . 130) ({(READBITMAP)(112 142 "@@@@@LL@@@@@@@@@@@@@@@@@@@@@" "@@@@@OO@@@@@@@@@@@@@@@@@@@@@" "@@@@@OON@@@@@@@@@@@@@@@@@@@@" "@@@@@OOO@@@@@@@@@@@@@@@@@@@@" "@@@@AO@GH@@@@@@@@@@@@@@@@@@@" "@@@@AL@CH@@@@@@@@@@@@@@@@@@@" "@@@@CH@AH@@@@@@@@@@@@@@@@@@@" "@@@@CH@AL@@@@@@@@@@@@@@@@@@@" "@@@@CH@@L@@@@@@@@@@@@@@@@@@@" "@@@@CL@@N@@@@@@@@@@@@@@@@@@@" "@@@@AL@@F@@@@@@@@@@@@@@@@@@@" "@@@@AL@@F@@@@@@@@@@@@@@@@@@@" "@@@@AN@@F@@@@@@@@@@@@@@@@@@@" "@@@@@O@@O@@@@@@@@@@@@@@@@@@@" "@@@@@GHAO@@@@@@@@@@@@@@@@@@@" "@@@@@COON@@@@@@@@@@@@@@@@@@@" "@@@@@AOOF@@@@@@@@@@@@@@@@@@@" "@@@@@@@@F@@@@@@@@@@@@@@@@@@@" "@@@@@C@@G@@@@@@@@@@@@@@@@@@@" "@@@@@CH@G@@@@@@@@@@@@@@@@@@@" "@@@@@CH@C@@@@@@@@@@@@@@@@@@@" "@@@@@G@@C@@@@@@@@@@@@@@@@@@@" "@@@@CO@@CHL@@@@@@@@@@@@@@@@@" "@@@GON@@AMOH@@@@@@@@@@@@@@@@" "@@AOO@@@AOOOH@@@@@@@@@@@@@@@" "@@ON@@@@@OOON@@@@@@@@@@@@@@@" "OOO@@@@@@@COOOL@@@@@@@@@@@@@" "OOH@@@@@@@@AOOOH@@@@@@@@@@@@" "@@@@@@@@@@@@@GGOL@@@@@@@@@@@" "@@@GL@@@@@@@@@@OOOOON@@@@@@@" "@@CON@@@@@@@@@@AOOOOOO@@@@@@" "NGOLN@@@@@@@@@@@@@@OOOL@@@@@" "OON@N@@@@@@@@@@@@GOOOGOK@@@@" "CN@@N@@@@@@@@@@@COOOOOOOH@@@" "@@@@F@@@@@@GOH@GON@@AOHOL@@@" "@@@@F@@@@@@GOOOOOH@@@AOAO@@@" "@@@@G@@@@@@FOOON@@@@@@OOO@@@" "@@@@C@@@@@@F@@F@@@@@@@COL@@@" "@@@@C@@@@@@N@@@@@@@@@@@@@@@@" "@@@@C@@@@@@N@@@@@@@@@@@@@@@@" "@@@@C@@@@@AL@@@@@@@@@@@@@@@@" "@@@@CH@@@@CH@@@@@@@@@@@@@@@@" "@@@@CH@@@@G@@@@@@@@@@@@@@@@@" "@@@@CH@@@@F@@@@@@@@@@@@@@@@@" "@@@@AH@@@@N@@@@@@@@@@@@@@@@@" "@@@@AL@@@@N@@@@@@@@@@@@@@@@@" "@@@@AOL@@AL@@@@@@@@@@@@@@@@@" "@@@@AOOO@AL@@@@@@@@@@@@@@@@@" "@@@@CLOOOOL@@@@@@@@@@@@@@@@@" "@@@@GH@COOL@@@@@@@@@@@@@@@@@" "@@@@O@@@@CN@@@@@@@@@@@@@@@@@" "@@@AN@@@@AO@@@@@@@@@@@@@@@@@" "@@@GH@@@@@GH@@@@@@@@@@@@@@@@" "@@@OH@@@@@AL@@@@@@@@@@@@@@@@" "@@ON@@@@@@@N@@@@@@@@@@@@@@@@" "@@OL@@@@@@@N@@@@@@@@@@@@@@@@" "@AON@@@@@@@N@@@@@@@@@@@@@@@@" "@GNO@@@@@@@N@@@@@@@@@@@@@@@@" "AOHGH@@@@@@GH@@@@@@@@@@@@@@@" "OOHCH@@@@@@CH@@@@@@@@@@@@@@@" "OL@AL@@@@AOOH@@@@@@@@@@@@@@@" "H@@AN@@@@GOOH@@@@@@@@@@@@@@@" "@@@@N@@@@GON@@@@@@@@@@@@@@@@" "@@@@F@@@@NAH@@@@@@@@@@@@@@@@" "@@@@G@@@GLAL@@@@@@@@@@@@@@@@" "@@@COH@@OHAL@@@@@@@@@@@@@@@@" "@@@GOL@AL@AL@@@@@@@@@@@@@@@@" "@@AOKN@AL@AL@@@@@@@@@@@@@@@@" "@OOL@G@CH@AH@@@@@@@@@@@@@@@@" "COO@@COO@@AH@@@@@@@@@@@@@@@@" "GH@@@CON@@AH@@@@@@@@@@@@@@@@" "OH@@@@OL@@AH@@@@@@@@@@@@@@@@" "N@@@@@GH@@AH@@@@@@@@@@@@@@@@" "H@@@@@CH@@AH@@@@@@@@@@@@@@@@" "@@@@@@CH@@AH@@@@@@@@@@@@@@@@" "@@@@@@AH@@CH@@@@@@@@@@@@@@@@" "@@@@@@AH@@CH@@@@@@@@@@@@@@@@" "@@@@@@CH@@CH@@@@@@@@@@@@@@@@" "@@@@@@CH@@C@@@@@@@@@@@@@@@@@" "@@@@@@C@@@G@@@@@@@@@@@@@@@@@" "@@@@@@C@@@G@@@@@@@@@@@@@@@@@" "@@@@@@C@@@G@@@@@@@@@@@@@@@@@" "@@@@@@G@@@N@@@@@@@@@@@@@@@@@" "@@@@@@G@@@L@@@@@@@@@@@@@@@@@" "@@@@@@G@@@L@@@@@@@@@@@@@@@@@" "@@@@@@F@@AL@@@@@@@@@@@@@@@@@" "@@@@@@F@@AL@@@@@@@@@@@@@@@@@" "@@@@@@N@@CH@@@@@@@@@@@@@@@@@" "@@@@@@N@@CH@@@@@@@@@@@@@@@@@" "@@@@@@L@@C@@@@@@@@@@@@@@@@@@" "@@@@@AL@@G@@@@@@@@@@@@@@@@@@" "@@@@@AL@@F@@@@@@@@@@@@@@@@@@" "@@@@@AH@@N@@@@@@@@@@@@@@@@@@" "@@@@@AH@@L@@@@@@@@@@@@@@@@@@" "@@@@@AH@@L@@@@@@@@@@@@@@@@@@" "@@@@@CH@AL@@@@@@@@@@@@@@@@@@" "@@@@@C@@AL@@@@@@@@@@@@@@@@@@" "@@@@@G@@CH@@@@@@@@@@@@@@@@@@" "@@@@@N@@CH@@@@@@@@@@@@@@@@@@" "@@@@@N@@C@@@@@@@@@@@@@@@@@@@" "@@@@AL@@C@@@@@@@@@@@@@@@@@@@" "@@@@AL@AK@@@@@@@@@@@@@@@@@@@" "@@@@AL@CO@@@@@@@@@@@@@@@@@@@" "@@@@AH@CN@@@@@@@@@@@@@@@@@@@" "@@@@AH@AN@@@@@@@@@@@@@@@@@@@" "@@@@AH@CN@@@@@@@@@@@@@@@@@@@" "@@@@CH@CN@@@@@@@@@@@@@@@@@@@" "@@@@C@@GL@@@@@@@@@@@@@@@@@@@" "@@@@C@@GL@@@@@@@@@@@@@@@@@@@" "@@@@C@@OL@@@@@@@@@@@@@@@@@@@" "@@@@C@@OH@@@@@@@@@@@@@@@@@@@" "@@@@C@AL@@@@@@@@@@@@@@@@@@@@" "@@@@G@AL@@@@@@@@@@@@@@@@@@@@" "@@@@F@CH@@@@@@@@@@@@@@@@@@@@" "@@@@G@CH@@@@@@@@@@@@@@@@@@@@" "@@@@G@C@@@@@@@@@@@@@@@@@@@@@" "@@@@N@G@@@@@@@@@@@@@@@@@@@@@" "@@@@L@G@@@@@@@@@@@@@@@@@@@@@" "@@@AL@F@@@@@@@@@@@@@@@@@@@@@" "@@@AL@N@@@@@@@@@@@@@@@@@@@@@" "@@@CHAN@@@@@@@@@@@@@@@@@@@@@" "@@@CHAL@@@@@@@@@@@@@@@@@@@@@" "@@@G@AL@@@@@@@@@@@@@@@@@@@@@" "@@@G@AH@@@@@@@@@@@@@@@@@@@@@" "@@@N@AH@@@@@@@@@@@@@@@@@@@@@" "@@@L@AH@@@@@@@@@@@@@@@@@@@@@" "@@@L@AL@@@@@@@@@@@@@@@@@@@@@" "@@@L@AL@@@@@@@@@@@@@@@@@@@@@" "@@@N@AL@@@@@@@@@@@@@@@@@@@@@" "@@@O@AN@@@@@@@@@@@@@@@@@@@@@" "@@@GL@O@@@@@@@@@@@@@@@@@@@@@" "@@@AN@GH@@@@@@@@@@@@@@@@@@@@" "@@@@GHCL@@@@@@@@@@@@@@@@@@@@" "@@@@COAN@@@@@@@@@@@@@@@@@@@@" "@@@@AOHN@@@@@@@@@@@@@@@@@@@@" "@@@@@GMO@@@@@@@@@@@@@@@@@@@@" "@@@@@FOO@@@@@@@@@@@@@@@@@@@@" "@@@@@@GO@@@@@@@@@@@@@@@@@@@@" "@@@@@@CO@@@@@@@@@@@@@@@@@@@@" "@@@@@@@L@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 160 . 75))) (200 (({(READBITMAP)(64 13 "@@@@@@@@@@@@@@@A" "@@@@@@@@@@@COOOO" "@@@@@@@@@@COOOOO" "@@@@@@@@AKOOH@F@" "@@@@@@@COON@@@@A" "@@@@@AOOOO@@@@@G" "@@@@AOOO@@@@@@CO" "@@@GOO@@OL@@AOOH" "@@AOOHANOOOOKON@" "@@CN@@GNMOOOKH@@" "@@COOOO@@@@@@@@@" "@@@GOOH@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 96 . 184) ({(READBITMAP)(48 148 "@@@@COL@@@@@" "@@@@GOO@@@@@" "@@@@OHGL@@@@" "@@@AN@CN@@@@" "@@@AL@@N@@@@" "@@@AH@@F@@@@" "@@@AH@@G@@@@" "@@@CH@@G@@@@" "@@@CH@@C@@@@" "@@@AH@@CH@@@" "@@@AL@@CH@@@" "@@@AL@@CH@@@" "@@@@L@@C@@@@" "@@@@N@@C@@@@" "@@@@O@@G@@@@" "@@@@OMOO@@@@" "@@@@GOOL@@@@" "@@@@COLL@@@@" "@@@@AH@L@@@@" "@@@@AN@N@@@@" "@@@@@N@OL@@@" "@@@@AL@COL@@" "@@@@OL@@OOOO" "@@@OOH@@@GOO" "@@GON@@@@AL@" "@AOH@@@@@@@@" "@GN@@@@@@@@@" "COH@@@@@@@@@" "ON@@@@@@@@@@" "O@@@@@@@@@@G" "@@@@@@@@@@CO" "@OH@@@@@@@CN" "OOOH@@@@@@CH" "OOGL@@@@@@C@" "H@AN@@@@@@C@" "@@@O@@@@@@C@" "@@@G@@@@@@C@" "@@@G@@@@@@C@" "@@@CH@@@@@C@" "@@@CH@@@@@G@" "@@@AH@@@@@F@" "@@@AH@@@@@F@" "@@@AL@@@@@F@" "@@@@N@@@@@F@" "@@@@F@@@@@N@" "@@@@F@@@@@O@" "@@@@G@@@@@G@" "@@@@G@@@@@N@" "@@@@G@@@@@N@" "@@@AOON@@AL@" "@@@CLOOOOON@" "@@@CH@GOOOO@" "@@@G@@@@AHG@" "@@AO@@@@@@C@" "@@ON@@@@@@CH" "@OO@@@@@@@AH" "OOH@@@@@@@AL" "OL@@@@@@@@@L" "L@@@@@@@@@@N" "@@@@@@@@@@@F" "@@@@@@@@@@@G" "MH@@@@@@@@@G" "OOH@@@@@@@@C" "OON@@@@@@@@C" "@AOOL@@@@@@A" "@@GOO@@@@@@@" "@@@AO@@@@@@@" "@@@AH@@@@@@@" "@@@CO@@@@@@@" "GOOOOL@@@@@@" "OOOOIOH@@@@@" "O@@@@ON@@@@@" "GL@@@CN@@@@@" "COOH@AON@@@@" "@OOO@AOON@@@" "@@AO@@LCN@@@" "@@@CH@L@OO@C" "@@@AH@L@COOO" "@@@AH@L@@COO" "@@@AL@L@@C@@" "@@@AN@L@@C@@" "@@@@OOO@@COO" "@@@@COO@@COO" "@@@@@OO@@C@C" "@@@@@@N@@C@@" "@@@@@@F@@C@@" "@@@@@@F@@C@@" "@@@@@@N@@C@@" "@@@@@@N@@G@@" "@@@@@@N@@G@@" "@@@@@@N@@G@@" "@@@@@@N@@F@@" "@@@@@@N@@N@@" "@@@@@@N@@N@@" "@@@@@@L@@L@@" "@@@@@@L@@N@@" "@@@@@@L@@N@@" "@@@@@@L@@L@@" "@@@@@@L@@L@@" "@@@@@@N@@L@@" "@@@@@@F@@N@@" "@@@@@@F@@N@@" "@@@@@@N@@L@@" "@@@@@@N@@L@@" "@@@@@@F@AL@@" "@@@@@@N@AL@@" "@@@@@@N@@L@@" "@@@@@AL@@L@@" "@@@@@AL@AL@@" "@@@@@@L@AH@@" "@@@@@AL@AH@@" "@@@@@AL@AH@@" "@@@@@@L@AH@@" "@@@@@@L@AH@@" "@@@@@@N@AH@@" "@@@@@@F@CH@@" "@@@@@@F@CH@@" "@@@@@@F@CH@@" "@@@@@@N@C@@@" "@@@@@@N@C@@@" "@@@@@@N@C@@@" "@@@@@@N@G@@@" "@@@@@@F@G@@@" "@@@@@@N@F@@@" "@@@@@@N@F@@@" "@@@@@@L@N@@@" "@@@@@@L@L@@@" "@@@@@AL@L@@@" "@@@@@CH@L@@@" "@@@@@CH@L@@@" "@@@@@C@@L@@@" "@@@@@C@@L@@@" "@@@@@C@@N@@@" "@@@@@C@@N@@@" "@@@@@CH@N@@@" "@@@@@AH@O@@@" "@@@@@AH@O@@@" "@@@@@AL@O@@@" "@@@@@AL@O@@@" "@@@@@@L@O@@@" "@@@@@@L@G@@@" "@@@@@@N@G@@@" "@@@@@@N@G@@@" "@@@@@@N@F@@@" "@@@@@@N@N@@@" "@@@@@@GGL@@@" "@@@@@@GOL@@@" "@@@@@@GN@@@@")} 160 . 77) ({(READBITMAP)(80 26 "@@@@@@CAOO@@C@@@@@@@" "@@@@@AOOOOOOOON@@@@@" "OL@@@OOOOMOONOOL@@@@" "OON@AMOOOOOGHAON@@@@" "CONGOMH@COOOO@@O@@@@" "@AOOOH@COHGOOLAOH@@@" "@@@@@@GON@@@AOOOH@@@" "@@@@@@ON@@@@@OON@@@@" "@@@@@GOL@@@@@CH@@@@@" "OOOOOOH@@@@@@@@@@@@@" "OOOOOL@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 208 . 179) ({(READBITMAP)(160 40 "@@@@@@@@@@@@@@@@@@@@@@@@@@@AOON@@AL@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@CLOOOOON@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@GOOOO@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@AHG@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@AO@@@@@@C@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@ON@@@@@@CH@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@OO@@@@@@@AH@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@OOH@@@@@@@AL@@@@" "@@@@@@@@@@@@@@@@@@@@@@@COL@@@@@@@@@L@@@@" "@@@@@@@@@@@@@@@@@@@@@@@OL@@@@@@@@@@N@@@@" "@@@@@@@@@@@@@@@@@@@@@FOO@@@@@@@@@@@F@@@@" "@@@@@@@@@@@@@@@@@@@@@FOH@@@@@@@@@@@G@@@@" "@@@@@@@@@@@@@@@@@@@GKOOOMH@@@@@@@@@G@@@@" "@@@@@@@@@@@@@@@@@@OOOOOOOOH@@@@@@@@CH@@@" "@@@@@@@@@@@@@@@@@OONGH@COON@@@@@@@@CL@@@" "@@@@@@@@@@@@@L@AOOL@@@@@@AOOL@@@@@@AN@@@" "@@@@@@@@FLGONOOOOL@@@@@@@@GOO@@@@@@@OH@@" "@@@@@@AOOOOONOON@@@@@@@@@@@AO@@@@@@@GN@@" "@@@@@GOOMOOH@@@@@@@@@@@@@@@AH@@@@@@@AO@@" "@@@AOOOH@@@@@@@@@@@@@@@@@@@CO@@@@@@@@CL@" "@@@CON@@@@@@@@@@@@@@@CONGOOOOL@@@@@@@@N@" "@@@COO@@@@@N@@@@COHCOOOOOOOOIOH@@@@@@@O@" "@@@COON@@@OO@OOOOOOOOOHGO@@@@ON@@@@@@@CH" "@@@@@CN@@@OOOOOOO@OOH@@@GL@@@CN@@@@@@@AH" "@@@@@@GL@AL@ON@@@@@@@@@@COOH@AON@@@@@@AL" "@@@@@@AO@CH@@@@@@@@@@@@@@OOO@AOON@@@@@@L" "@@@@@@@OHO@@@@@@@@@@@@@@@@AO@@LCN@@@@@@L" "@@@@@@@AON@@@@@@@@@@@@@@@@@CH@L@OO@CLCNN" "@@@@@@@AOL@@@@@@@@@@@@@@@@@AH@L@COOOOOON" "@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@L@@COOOLGN" "@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@L@@C@@@@AN" "@@@@@@@@@@@@@@@@@@@@@@@@@@@AN@L@@C@@@@@N" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOO@@COOO@@N" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@COO@@COOOOKN" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OO@@C@CKOOH" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@C@@@@N@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@C@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@C@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@C@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@G@@@@@@")} 64 . 136))) (200 (({(READBITMAP)(64 15 "@@@@@@@@@@@@@@CO" "@@@@GL@@@@@@@OOO" "@@@COOOKOOOOOONF" "@@@COOOKOOOOOH@@" "@@@CL@@@@AIN@@@@" "@@@AOH@@@@@@@@@A" "@@@AOOOOOOOOOOGO" "@@@@COOOOOOOOOOO" "@@@@@O@@@L@N@AL@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 96 . 185) ({(READBITMAP)(64 13 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "N@@@@@@@@@@@@@@@" "OO@@CKOLOOO@@@@@" "GOOOOOOOOOOOLO@@" "@GOONOOOGOOOOON@" "@@@@@@GOOOONCOO@" "OF@@@OOOLOGOOOO@" "OOOOOOH@@@@OOIO@" "AKOOOL@@@@@@C@@@" "@@AH@@@@@@@@@@@@")} 224 . 192) ({(READBITMAP)(64 14 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 64 . 147) ({(READBITMAP)(112 153 "@@@@@@@@@@@@@@@@GN@@@@@@@@@@" "@@@@@@@@@@@@@@@CON@@@@@@@@@@" "@@@@@@@@@@@@@@@GOOH@@@@@@@@@" "@@@@@@@@@@@@@@@OHCL@@@@@@@@@" "@@@@@@@@@@@@@@@N@AN@@@@@@@@@" "@@@@@@@@@@@@@@@L@@G@@@@@@@@@" "@@@@@@@@@@@@@@AL@@C@@@@@@@@@" "@@@@@@@@@@@@@@AL@@CH@@@@@@@@" "@@@@@@@@@@@@@@AH@@CH@@@@@@@@" "@@@@@@@@@@@@@@AH@@C@@@@@@@@@" "@@@@@@@@@@@@@@AH@@C@@@@@@@@@" "@@@@@@@@@@@@@@CH@@C@@@@@@@@@" "@@@@@@@@@@@@@@CH@@G@@@@@@@@@" "@@@@@@@@@@@@@@CL@@F@@@@@@@@@" "@@@@@@@@@@@@@@AO@AN@@@@@@@@@" "@@@@@@@@@@@@@@@ONCN@@@@@@@@@" "@@@@@@@@@@@@@@@GOOL@@@@@@@@@" "@@@@@@@@@@@@@@@COOL@@@@@@@@@" "@@@@@@@@@@@@@@@AH@N@@@@@@@@@" "@@@@@@@@@@@@@@@AH@F@@@@@@@@@" "@@@@@@@@@@@@@@@AH@F@@@@@@@@@" "@@@@@@@@@@@@@@@AH@F@@@@@@@@@" "@@@@@@@@@@@@@@@GH@F@@@@@@@@@" "@@@@@@@@@@@@@@@G@@N@@@@@@@@@" "@@@@@@@@@@@@@MOF@@O@@@@@@@@@" "@@@@@@@@@@@@OOO@@@GH@@@@@@@@" "@@@@@@@@@@@AOOH@@@CN@@@@@@@@" "@@@@@@@@@@COL@@@@@@OH@C@@@@@" "@@@@@@@@@COOH@@@@@@COOON@@@@" "@@@@@@@@CON@@@@@@@@@OOOON@@@" "@@@@@@COOO@@@@@@@@@@@@@COO@@" "@@@@@OOOL@@@@@@@@@@@@@@@GOOO" "OOOOOONF@@@@F@@@@@@@@CH@@GOO" "OOOOOH@@@OMOO@@@@@@@@GK@@@@@" "@AIN@@@@OOMOOO@@@@@@@GOOOF@@" "@@@@@@@AON@@CO@@@@@@@CMOOOOO" "OOOOOOGOL@@@@N@@@@@@@G@@AKOO" "OOOOOOOO@@@@@F@@@@@@@G@@@@AH" "@L@N@AL@@@@@@G@@@@@@@G@@@@@@" "@@@@@@@@@@@@@C@@@@@@@F@@@@@@" "@@@@@@@@@@@@@C@@@@@@@F@@@@@@" "@@@@@@@@@@@@@C@@@@@@@F@@@@@@" "@@@@@@@@@@@@@CH@@@@@@N@@@@@@" "@@@@@@@@@@@@@AH@@@@@@N@@@@@@" "@@@@@@@@@@@@@AH@@@@@AL@@@@@@" "@@@@@@@@@@@@@AH@@@@@AL@@@@@@" "@@@@@@@@@@@@@AL@@@@@CL@@@@@@" "@@@@@@@@@@@@@@N@@@@@CH@@@@@@" "@@@@@@@@@@@@@@N@@@@@C@@@@@@@" "@@@@@@@@@@@@@@F@@@@@G@@@@@@@" "@@@@@@@@@@@@@@GOL@@@G@@@@@@@" "@@@@@@@@@@@@@@GOOON@C@@@@@@@" "@@@@@@@@@@@@@COIOOOOOH@@@@@@" "@@@@@@@@@@@@@CN@@COOON@@@@@@" "@@@@@@@@@@@@@O@@@@@@@O@@@@@@" "@@@@@@@@@@@@CN@@@@@@@GH@@@@@" "@@@@@@@@@@@@OH@@@@@@@AL@@@@@" "@@@@@@@@@@@AN@@@@@@@@@N@@@@@" "@@@@@@@@@@@OL@@@@@@@@@GH@@@@" "@@@@@@@@@@CO@@@@@@@@@@CN@@@@" "@@@@@@@@@OOL@@@@@@@@@@AO@@@@" "@@@@@@@AOOO@@@@@@@@@@@@CL@@@" "@@@@@@AOOMKL@@@@@@@@@@@AN@@@" "@@@@AOOO@@AO@@@@@@@@@@@@GL@@" "@@@AOOO@@@@GH@@@@@@@@@@@CN@@" "@@@GNL@@@@@CN@@@@@@@@@@@@G@@" "@@@GH@@@@@@@OL@@@@@@@@@@@CL@" "@@@G@@@@@@@@CO@@@@@@@@@@@AN@" "@@@N@@@@@@@@AOH@@@@@@@@@@@O@" "@@AL@@@@@@@@@CN@@@@@@@@@@@CH" "@@AL@@@@@@@@@GOC@@@@@@@@@@CH" "@@CH@@@@@@OOOOOOHLF@@@@@@ON@" "@@CH@@@@GOOOOO@ONOO@@@@@COOH" "@@G@@@COOONOMH@COOOL@@@@G@GH" "@@G@@@GOOL@CH@@@ONAO@@@CN@AH" "@@O@@AON@@@AL@@@L@@GHFCOL@C@" "@@N@@CN@@@@AL@@AL@@ALNOL@@G@" "@AN@@GL@@@@@L@@AL@@@OOO@@@G@" "@AL@@G@@@@@@O@@@L@@@OOL@OLF@" "@AH@@F@@@@@@OO@@L@@@AOOOONG@" "@AH@@N@@@@@@CON@L@@@AOOOHOG@" "@CH@CL@@@@@@@CO@N@@@GH@@@CO@" "@G@@CH@@@@@@@@GLN@@@G@@@@AN@" "@O@@G@@@@@@@@@COOH@@N@@@@@@@" "@N@@F@@@@@@@@@@GOH@@N@@@@@@@" "@N@@N@@@@@@@@@@@N@@@N@@@@@@@" "AL@AN@@@@@@@@@@@L@@AL@@@@@@@" "AL@OL@@@@@@@@@@@L@@CH@@@@@@@" "AHGOL@@@@@@@@@@@L@@CH@@@@@@@" "AIONL@@@@@@@@@@@L@@C@@@@@@@@" "CIOAL@@@@@@@@@@AL@@G@@@@@@@@" "CILCL@@@@@@@@@@AL@@G@@@@@@@@" "C@@OH@@@@@@@@@@AH@@F@@@@@@@@" "G@GO@@@@@@@@@@@AH@@N@@@@@@@@" "GAOL@@@@@@@@@@@CH@@L@@@@@@@@" "GON@@@@@@@@@@@@CH@@L@@@@@@@@" "GOH@@@@@@@@@@@@C@@AL@@@@@@@@" "GL@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@G@@AH@@@@@@@@" "@@@@@@@@@@@@@@@C@@CH@@@@@@@@" "@@@@@@@@@@@@@@@C@@CH@@@@@@@@" "@@@@@@@@@@@@@@@CH@C@@@@@@@@@" "@@@@@@@@@@@@@@@CH@C@@@@@@@@@" "@@@@@@@@@@@@@@@C@@GH@@@@@@@@" "@@@@@@@@@@@@@@@G@@GH@@@@@@@@" "@@@@@@@@@@@@@@@F@@G@@@@@@@@@" "@@@@@@@@@@@@@@@F@@G@@@@@@@@@" "@@@@@@@@@@@@@@@N@@G@@@@@@@@@" "@@@@@@@@@@@@@@AL@@O@@@@@@@@@" "@@@@@@@@@@@@@@AL@@N@@@@@@@@@" "@@@@@@@@@@@@@@@L@@N@@@@@@@@@" "@@@@@@@@@@@@@@@L@@L@@@@@@@@@" "@@@@@@@@@@@@@@@L@AL@@@@@@@@@" "@@@@@@@@@@@@@@@N@AL@@@@@@@@@" "@@@@@@@@@@@@@@@N@AH@@@@@@@@@" "@@@@@@@@@@@@@@@N@AH@@@@@@@@@" "@@@@@@@@@@@@@@@N@C@@@@@@@@@@" "@@@@@@@@@@@@@@@L@G@@@@@@@@@@" "@@@@@@@@@@@@@@@L@G@@@@@@@@@@" "@@@@@@@@@@@@@@@L@G@@@@@@@@@@" "@@@@@@@@@@@@@@@L@G@@@@@@@@@@" "@@@@@@@@@@@@@@@L@F@@@@@@@@@@" "@@@@@@@@@@@@@@@L@N@@@@@@@@@@" "@@@@@@@@@@@@@@@L@L@@@@@@@@@@" "@@@@@@@@@@@@@@AL@L@@@@@@@@@@" "@@@@@@@@@@@@@@AL@L@@@@@@@@@@" "@@@@@@@@@@@@@@CHAL@@@@@@@@@@" "@@@@@@@@@@@@@@G@AL@@@@@@@@@@" "@@@@@@@@@@@@@@N@AH@@@@@@@@@@" "@@@@@@@@@@@@@@N@CH@@@@@@@@@@" "@@@@@@@@@@@@@AL@CH@@@@@@@@@@" "@@@@@@@@@@@@@AL@CH@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@G@@@@@@@@@@@" "@@@@@@@@@@@@@@L@G@@@@@@@@@@@" "@@@@@@@@@@@@@@L@G@@@@@@@@@@@" "@@@@@@@@@@@@@@L@C@@@@@@@@@@@" "@@@@@@@@@@@@@@L@G@@@@@@@@@@@" "@@@@@@@@@@@@@@L@F@@@@@@@@@@@" "@@@@@@@@@@@@@@N@N@@@@@@@@@@@" "@@@@@@@@@@@@@@OMN@@@@@@@@@@@" "@@@@@@@@@@@@@@OOH@@@@@@@@@@@" "@@@@@@@@@@@@@@GO@@@@@@@@@@@@")} 128 . 77))) (200 (({(READBITMAP)(48 7 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 240 . 193) ({(READBITMAP)(144 153 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@GOOO@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@AOOLC@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@AOL@CH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@CN@@CH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GN@@AL@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GN@@AL@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GO@@@L@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GGN@@L@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GCO@@L@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@F@CH@L@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@N@AHAL@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@N@AHAH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@F@AHMH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@F@AHOH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@G@COO@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@G@GOO@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GNFGN@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GN@@N@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@AN@@N@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@N@@OH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@AL@@GO@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@AOL@@AOL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@GO@@@@ON@@@@@@@@@@@" "@@@@@@@@@@@@@@@@COH@@@@@GH@@@@@@@@@@" "@@@@@@@@@@@@@@@@OL@@@@@@CH@@@@@@@@@@" "@@@@@@@@@@@@@@GOO@@@@@@@AL@@@@@@@@@@" "@@@@@@@@@@@@@AOOH@@@@@@@@N@@@@@@@@@@" "@@@@@@@@@@@@@GL@@@@@@@@@@N@@@@@@@@@@" "@@@@@@@@@@@@@OH@@@@@@@@@@G@@@@@@@@@@" "@@@@@@@@@@@@AL@@@@@@@@@@@C@@@@@@@@@@" "@@@@@@@@@@@@CHAH@@@@@@@@CKH@@@@@@@@@" "@@@@@@@@@@@@OHCOOL@@@@@@CIH@@@@@@@@@" "@@@@@@@@@@@CNAOOON@@@@@@CIH@@@@@@@@@" "@@@@@@@@@@@GHGO@@N@@@@@@CIH@@@@@@@@@" "@@@@@@@@@@CNCOH@@F@@@@@@GAH@@@@@@@@@" "@@@@@@@@@@OMOL@@@N@@@@@@GAH@@@@@@@@@" "@@@@@@@@@AOAN@@@@N@@@@@@FAH@@@@@@@@@" "@@@@@@@@@CLGH@@@@N@@@@@@NAL@@@@@@@@@" "@@@@@@@@@GAO@@@@@N@@@@@@LAL@@@@@@@@@" "@@@@@@@@@OON@@@@@G@@@@@ALCL@@@@@@@@@" "@@@@@@@@@OO@@@@@@G@@@@@ALGH@@@@@@@@@" "@@@@@@@@@OH@@@@@@CH@@@@ALN@@@@@@@@@@" "@@@@@@@@@O@@@@@@@CH@@@@ALN@@@@@@@@@@" "@@@@@@@@@N@@@@@@@AL@@OOOML@@@@@@@@@@" "@@@@@@@@@@@@@@@@@AL@OOOOOL@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@LCOL@@OH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@NO@@@@GH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@OO@@@@CN@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@GH@@@@AO@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@C@@@@@@CN@@@@@@@@@" "@@@@@@@@@@@@@@@@@@C@@@@@@AOH@@@@@@@@" "@@@@@@@@@@@@@@@@@@C@@@@@@@GN@@@@@@@@" "@@@@@@@@@@@@@@@@@@G@@@@@@@@O@@@@@@@@" "@@@@@@@@@@@@@@@@@@F@@@@@@@@CH@@@@@@@" "@@@@@@@@@@@@@@@@@@N@@@@@@@@CL@@@@@@@" "@@@@@@@@@@@@@@@@@AL@@@@@@@@@N@@@@@@@" "@@@@@@@@@@@@@@@@@AL@@@@@@@@@G@@@@@@@" "@@@@@@@@@@@@@@@@@AH@@@@@@@@@GH@@@@@@" "@@@@@@@@@@@@@@@@@AH@@@@@@@@@AL@@@@@@" "@@@@@@@@@@@@@@@@@OH@@@@@@@@@@O@@@@@@" "@@@@@@@@@@@@@@@@GOH@@@@@@@@@@GH@@@@@" "@@@@@@@@@@@@@@@@GL@@@@@@@@@@@CH@@@@@" "@@@@@@@@@@@@@@@@G@@@@@@@@@@@@AN@@@@@" "@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@O@@@@@" "@@@@@@@@@@@@@@@@F@@@@@GOOOOO@@GO@@@@" "@@@@@@@@@@@@@@@@GH@@@AOOOOOOL@AON@@@" "@@@@@@@@@@@@@@@@CN@@AOO@AOL@OH@GO@@@" "@@@@@@@@@@@@@@@@@OLAONG@@CN@GL@@CH@@" "@@@@@@@@@@@@@@@@@OOOO@G@@@N@AL@@AH@@" "@@@@@@@@@@@@@@@@@@ONL@CH@@N@@N@@CH@@" "@@@@@@@@@@@@@@@@@@L@@@CH@@N@AN@AOH@@" "@@@@@@@@@@@@@@@@@@F@@@CH@AL@AO@CN@@@" "@@@@@@@@@@@@@@@@@@F@@@CH@CL@AOOO@@@@" "@@@@@@@@@@@@@@@@@@F@@@CH@CH@AIOO@@@@" "@@@@@@@@@@@@@@@@@@G@@@AH@CH@CIKH@@@@" "@@@@@@@@@@@@@@@@@@G@@@AH@O@@G@@@@@@@" "@@@@@@@@@@@@@@@@@@CH@@AL@N@@O@@@@@@@" "@@@@@@@@@@@@@@@@@@AL@@ALAL@AN@@@@@@@" "@@@@@@@@@@@@@@@@@@AL@@@LAL@AL@@@@@@@" "@@@@@@@@@@@@@@@@@@AL@@@LCH@CH@@@@@@@" "@@@@@@@@@@@@@@@@@@AN@@@LC@@GH@@@@@@@" "@@@@@@@@@@@@@@@@@@AN@@@LG@@N@@@@@@@@" "@@@@@@@@@@@@@@@@@@@F@@@LG@CL@@@@@@@@" "@@@@@@@@@@@@@@@@@@@F@@@NF@GH@@@@@@@@" "@@@@@@@@@@@@@@@@@@@GH@@FF@G@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@GH@@GN@O@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@CH@@GLCL@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@AL@@GHCH@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@L@@CHG@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@N@@CHG@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@F@@CHN@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@F@@CIL@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@CKH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@CCH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@F@@CO@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@F@@CN@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@AL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@GH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@GH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@C@@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@G@@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@GH@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@CH@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AH@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AH@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AH@AH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AH@AL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AL@AL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@L@AL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@F@@L@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@G@@L@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@C@@L@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@CH@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@AH@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@AL@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@AL@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@N@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@N@N@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@F@G@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@G@G@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@G@CL@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHCN@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CH@N@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@AH@N@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@AH@N@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@AH@L@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHAL@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHCH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHCH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHGH@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHO@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHN@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CHN@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CIL@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CCH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CGH@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CO@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@CN@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@AL@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 96 . 77))) (200 (({(READBITMAP)(112 150 "@@@@@@@@@@AH@@@@@@@@@@@@@@@@" "@@@@@@@@@@OON@@@@@@@@@@@@@@@" "@@@@@@@@@COOOH@@@@@@@@@@@@@@" "@@@@@@@@@CL@GH@@@@@@@@@@@@@@" "@@@@@@@@@CH@AH@@@@@@@@@@@@@@" "@@@@@@@@@G@@@L@@@@@@@@@@@@@@" "@@@@@@@@@G@@@N@@@@@@@@@@@@@@" "@@@@@@@@@G@@@F@@@@@@@@@@@@@@" "@@@@@@@@@G@@@G@@@@@@@@@@@@@@" "@@@@@@@@@G@@@CH@@@@@@@@@@@@@" "@@@@@@@@@G@@@CH@@@@@@@@@@@@@" "@@@@@@@@@GH@@CH@@@@@@@@@@@@@" "@@@@@@@@@CN@@AL@@@@@@@@@@@@@" "@@@@@@@@@AO@@@L@@@@@@@@@@@@@" "@@@@@@@@@AONL@N@@@@@@@@@@@@@" "@@@@@@@@@@COLCN@@@@@@@@@@@@@" "@@@@@@@@@@GCOON@@@@@@@@@@@@@" "@@@@@@@@@@GAOO@@@@@@@@@@@@@@" "@@@@@@@@@@CAL@@@@@@@@@@@@@@@" "@@@@@@@@@@CAL@@@@@@@@@@@@@@@" "@@@@@@@@@@LAOOH@@@@@@@@@@@@@" "@@@@@@@@@AL@OOOH@@@@@@@@@@@@" "@@@@@@@@@CL@@COH@@@@@@@@@@@@" "@@@@@@@@@CH@@@CL@@@@@@@@@@@@" "@@@@@@@@@CH@@@@O@@@@@@@@@@@@" "@@@@@@@@@CH@@@@G@@@@@@@@@@@@" "@@@@@@@@@CH@@@@CN@@@@@@@@@@@" "@@@@@@@@@CH@@@@AO@@@@@@@@@@@" "@@@@@@@@@CH@@@@@GL@@@@@@@@@@" "@@@@@@@@@CH@@@@@AO@@@@@@@@@@" "@@@@@@@@@G@@@@@@@GN@@@@@@@@@" "@@@@@@@@@G@@@OOH@AOH@@@@@@@@" "@@@@@@@@@G@@AOON@@GL@@@@@@@@" "@@@@@@@@@F@@CNCOH@AOH@@@@@@@" "@@@@@@@@@F@@O@OCL@@GN@@@@@@@" "@@@@@@@@@F@ANAO@L@@AN@@@@@@@" "@@@@@@@@@F@AHAN@O@@@G@@@@@@@" "@@@@@@@@@N@@@AN@CH@@G@@@@@@@" "@@@@@@@@@N@@@@N@CO@@GH@@@@@@" "@@@@@@@@@L@@@AN@@GH@CH@@@@@@" "@@@@@@@@@L@@@AH@@CN@CH@@@@@@" "@@@@@@@@@L@@@AH@@@ONN@@@@@@@" "@@@@@@@@@L@@@AL@@@GOL@@@@@@@" "@@@@@@@@@L@@@@L@@@@@@@@@@@@@" "@@@@@@@@@L@@@AL@@@@@@@@@@@@@" "@@@@@@@@AL@@@AL@@@@@@@@@@@@@" "@@@@@@@@AL@@@AL@@@@@@@@@@@@@" "@@@@@@@@AL@@@@L@@@@@@@@@@@@@" "@@@@@@@@AH@@@@L@@@@@@@@@@@@@" "@@@@@@@@ANOOO@L@@@@@@@@@@@@@" "@@@@@@@@COOOO@N@@@@@@@@@@@@@" "@@@@@@@@GON@CHN@@@@@@@@@@@@@" "@@@@@@@@G@@@CON@@@@@@@@@@@@@" "@@@@@@@@N@@@AOOH@@@@@@@@@@@@" "@@@@@@@AL@@@@AOO@@@@@@@@@@@@" "@@@@@@@AL@@@@@@OHOOL@@@@@@@@" "@@@@@@@CH@@@@@@AOOOOOH@@@@@@" "@@@@@@@CH@@@@@@@OOOOOL@@@@@@" "@@@@@@@C@@@@@@@@@@@@GO@@@@@@" "@@@@@@@G@@@@@@@@@@@@CO@@@@@@" "@@@@@@@G@@@@@@@@@@@@GK@@@@@@" "@@@@@@@F@@@@@@@@@@@@OKH@@@@@" "@@@@@@@F@@@@@@@@@@@@OOH@@@@@" "@@@@@@@N@@@@@@@@@@@AMOL@@@@@" "@@@@@@AL@@@@@@@@@@@ALAL@@@@@" "@@@@@@OL@@@@@@@@@@@CH@L@@@@@" "@@@@@OOH@@@@@@@@@@@C@@L@@@@@" "@@@@OOH@@@@@@@@@@@@O@@N@@@@@" "@@@COH@@@@@@@@@@@@CN@@F@@@@@" "@@@OL@@@@@@@@@@@@AOO@@G@@@@@" "@@AO@@@@@@@@@@@@@AOOH@G@@@@@" "@@AL@@@@@@@@@@@@@AOKH@G@@@@@" "@@CH@@@@@@@@@@@@@GLCH@C@@@@@" "@@CH@@@@@@@@@@FAOOLAL@C@@@@@" "@@G@@@@@@@@@@@GOOO@AL@C@@@@@" "@@F@@@AOOOH@@@COL@@AL@C@@@@@" "@@F@@@COOOL@@@CN@@@AL@CH@@@@" "@@N@@@GOCOO@@@OH@@@@N@AH@@@@" "@@L@@@G@@COH@COH@@@@N@AL@@@@" "@@L@@@F@@CKH@OIH@@@@G@AL@@@@" "@@L@@@F@@AIOOOAH@@@@G@AL@@@@" "@@N@@@F@@ALOOHAH@@@@CHAL@@@@" "@@GH@@F@@ALO@@AH@@@@AH@L@@@@" "@@GL@@F@@@N@@@AL@@@@AH@N@@@@" "@@AO@@F@@@N@@@AL@@@@AH@N@@@@" "@@@GOON@@@N@@@AL@@@@AH@F@@@@" "@@@@OOL@@@F@@@AL@@@@AL@G@@@@" "@@@@AOH@@@F@@@AH@@@@@N@G@@@@" "@@@@@@@@@@G@@@AH@@@@@F@CH@@@" "@@@@@@@@@@C@@@AL@@@@@G@AH@@@" "@@@@@@@@@@CH@@AL@@@@@GHAH@@@" "@@@@@@@@@@CH@@AH@@@@@AHAL@@@" "@@@@@@@@@@AL@@AL@@@@@AH@L@@@" "@@@@@@@@@@AL@@AL@@@@@AL@O@@@" "@@@@@@@@@@AL@@AL@@@@@@L@G@@@" "@@@@@@@@@@@L@@AH@@@@@@N@CH@@" "@@@@@@@@@@@N@@AL@@@@@@N@AN@@" "@@@@@@@@@@@G@@AL@@@@@@N@@N@@" "@@@@@@@@@@@G@@CH@@@@@@N@@G@@" "@@@@@@@@@@@G@@CH@@@@@@N@@GH@" "@@@@@@@@@@@C@@C@@@@@@@G@@CH@" "@@@@@@@@@@@O@@C@@@@@@@G@@CH@" "@@@@@@@@@@@N@@G@@@@@@@CH@AH@" "@@@@@@@@@@AN@@N@@@@@@@CL@AH@" "@@@@@@@@@@AL@@L@@@@@@@AN@AH@" "@@@@@@@@@@AL@@L@@@@@@@@O@AL@" "@@@@@@@@@@CH@AL@@@@@@@@G@AL@" "@@@@@@@@@@CH@AH@@@@@@@@G@AH@" "@@@@@@@@@@C@@CH@@@@@@@@C@AH@" "@@@@@@@@@@G@@C@@@@@@@@@C@CH@" "@@@@@@@@@@G@@C@@@@@@@@@CHC@@" "@@@@@@@@@@G@@G@@@@@@@@@CHG@@" "@@@@@@@@@@G@@G@@@@@@@@@AON@@" "@@@@@@@@@@G@@F@@@@@@@@@@ON@@" "@@@@@@@@@@G@@N@@@@@@@@@@GL@@" "@@@@@@@@@@G@@L@@@@@@@@@@@@@@" "@@@@@@@@@@C@@L@@@@@@@@@@@@@@" "@@@@@@@@@@CHAL@@@@@@@@@@@@@@" "@@@@@@@@@@CHAL@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@AHAH@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@AHAH@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@AHAH@@@@@@@@@@@@@@" "@@@@@@@@@@AHAH@@@@@@@@@@@@@@" "@@@@@@@@@@CHCH@@@@@@@@@@@@@@" "@@@@@@@@@@CHCH@@@@@@@@@@@@@@" "@@@@@@@@@@CHAH@@@@@@@@@@@@@@" "@@@@@@@@@@GHAH@@@@@@@@@@@@@@" "@@@@@@@@@@G@AH@@@@@@@@@@@@@@" "@@@@@@@@@@C@AL@@@@@@@@@@@@@@" "@@@@@@@@@@G@AL@@@@@@@@@@@@@@" "@@@@@@@@@@F@@L@@@@@@@@@@@@@@" "@@@@@@@@@@N@@N@@@@@@@@@@@@@@" "@@@@@@@@@@N@@G@@@@@@@@@@@@@@" "@@@@@@@@@@L@@G@@@@@@@@@@@@@@" "@@@@@@@@@AL@@CH@@@@@@@@@@@@@" "@@@@@@@@@AL@@CH@@@@@@@@@@@@@" "@@@@@@@@@@N@@CN@@@@@@@@@@@@@" "@@@@@@@@@@GH@@N@@@@@@@@@@@@@" "@@@@@@@@@@GN@@GH@@@@@@@@@@@@" "@@@@@@@@@@AOH@GH@@@@@@@@@@@@" "@@@@@@@@@@@GOHAN@@@@@@@@@@@@" "@@@@@@@@@@@@OO@N@@@@@@@@@@@@" "@@@@@@@@@@@@@OLF@@@@@@@@@@@@" "@@@@@@@@@@@@@AON@@@@@@@@@@@@" "@@@@@@@@@@@@@@GN@@@@@@@@@@@@")} 128 . 78))))) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/ACE-MAIN b/lispusers/ACE-MAIN new file mode 100644 index 00000000..2293e53c --- /dev/null +++ b/lispusers/ACE-MAIN @@ -0,0 +1 @@ +(FILECREATED "28-Jul-85 21:16:32" {ICE}LISP>ACE-MAIN.;4 55935 changes to: (VARS ACE-MAINCOMS) (FNS ACEGETFRAME# ACE.DELAY.FRAME ACE.DELAY.SEQ ACE.QUIT.ACE ACE.ANIMATE ACE.CREATE.CONTROL.MENU SUBLIST ACERUNLOOP ACE.INCREMENT.FRAME ACE.UPD.CONTROL.WINDOW ACE.UPD.CW.MULE ACE.ASKEM ACE) previous date: " 2-May-85 20:56:43" {ICE}LISP>ACE>ACE-MAIN.;25) (PRETTYCOMPRINT ACE-MAINCOMS) (RPAQQ ACE-MAINCOMS [(* MAIN TOP LEVEL STUFF) (FNS ACE ACE.ANIMATE ACE.RUN ACEGETFRAME# ACERUNLOOP ACE.NEW.SEQUENCE ACE.NEW.FRAME ACE.QUIT.ACE ACE.RESET.SEQ ACE.RUN.CURRENT.SEQ ACE.DELAY ACE.DELAY.FRAME ACE.DELAY.SEQ ACE.DECREMENT.FRAME ACE.INCREMENT.FRAME ACE.DELETE.FRAME ACE.SET.DEVICE ACE.QUICKDRAW&UPD ACE.RECONSTRUCT.FRAME SUBLIST) (* TRILLIUM STUFF) (FNS ACE.TRILLIUM ACE.TRILLIUM.LOOP ACE.RUN.TRILLIUM ACE.QUIT.TRILLIUM ACE.CREATE.EDITING.BORDER) (* I/O STUFF) (FNS ACE.GET.SEQ.FILE ACE.PUT.SEQ.FILE ACE.GET.A.FILE.NAME) (* HELPER FNS) (FNS ACE.ASKEM ACE.TELLEM ACE.CONFIRMIT ACE.DEFINE.SEQ.WINDOW ACE.FIGURE.OUT.WINDOW ACE.RETURN.CLOSEST.VERTEX ACE.NEW.SEQ.ASST ACE.DELAY.FRAME.ASST ACE.SETUP.CW.CLIPPING.REGIONS ACE.CHECKSTUFF ACE.UPD.CONTROL.WINDOW ACE.UPD.CW.MULE ACE.UPD.CLEAR.SET.LINE ACE.CREATE.CONTROL.MENU ACE.SEQ.FETCH.WIDTH ACE.SEQ.FETCH.HEIGHT ACE.SET.SEQ.CLIP.REGION ACE.ASKEM2 ACE.TELLEM2 ACE.UPD.CONTROL.WINDOW2) (* The following Macros set up restricting clipping regions) (MACROS ACE.MAC.CW.INFO.CLIP ACE.MAC.CW.PROMPT.CLIP ACE.MAC.SEQ.CLIP) (MACROS ACE.MAC.FETCH.WIDTH ACE.MAC.FETCH.HEIGHT) (CURSORS ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR ACE.RIGHTMOUSE.CURSOR ACE.ALLMOUSE.CURSOR) (GLOBALVARS ACE.CONTROL.WINDOW ACE.DIRECTORY ACE.SEQ.WINDOW ACE.SEQ.WIDTH ACE.SEQ.HEIGHT ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF ACE.CURRENT.SEQUENCE ACE.CURRENT.SEQUENCE.NAME ACE.FRAME.TAIL ACE.CURRENT.FRAME ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD ACE.RUNNING.UNDER.TRILLIUM ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR ACE.RIGHTMOUSE.CURSOR ACE.ALLMOUSE.CURSOR) (* MENUS IN MAIN) (GLOBALVARS ACE.CONTROL.MENU ACE.DELAY.MENU ACE.SET.DEVICE.MENU) (P (SETQ ACE.CONTROL.WINDOW NIL) (SETQ ACE.CONTROL.MENU NIL) (SETQ ACE.DELAY.MENU NIL) (SETQ ACE.SET.DEVICE.MENU NIL)) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA]) (* MAIN TOP LEVEL STUFF) (DEFINEQ (ACE [LAMBDA (SEQUENCE WINDOW POSITION APPLICATION) (* MD "14-Jun-85 17:34") (* Top level function to run animation. All ARGs are optional (No ARGs means just run "normal" ACE); Current  APPLICATIONs are NIL (Normal) and TRILLIUM. If TRILLIUM, then POSITION is necessary (and WINDOW very highly  reccommended!); ACE creates ACE.CONTROL.WINDOW and menu if necessary; then decides about APPLICATION) (PROG (FONT TEMP.REGION) (OR ACE.CONTROL.MENU (ACE.CREATE.CONTROL.MENU)) (SETQ FONT (FONTCREATE (QUOTE HELVETICA) 10 (QUOTE BOLD))) (COND ((WINDOWP ACE.CONTROL.WINDOW) (TOTOPW ACE.CONTROL.WINDOW)) (T (SETQ ACE.CONTROL.WINDOW (CREATEW (LIST 500 500 (IPLUS 2 (fetch IMAGEWIDTH of ACE.CONTROL.MENU)) (IPLUS (ITIMES 4 (FONTPROP FONT (QUOTE HEIGHT)) ) (fetch IMAGEHEIGHT of ACE.CONTROL.MENU) 25)) (CONCAT "ACE v. " "2.1" " Control Window") 1)) (DSPFONT FONT ACE.CONTROL.WINDOW) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE RESHAPEFN) (QUOTE DON'T)) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE REPAINTFN) (QUOTE DON'T)) (ACE.SETUP.CW.CLIPPING.REGIONS ACE.CONTROL.MENU))) (ACE.TELLEM "Position This Window" T) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE MOVEFN) NIL) (MOVEW ACE.CONTROL.WINDOW) (SETQ ACE.AREA.THRESHOLD 50) (SETQ ACE.VERTICAL.BLOCK 16) (SETQ ACE.CURRENT.SEQUENCE.NAME NIL) (COND ((EQ APPLICATION (QUOTE TRILLIUM)) (RETURN (ACE.TRILLIUM WINDOW SEQUENCE POSITION))) (T (SETQ ACE.RUNNING.UNDER.TRILLIUM NIL) (SETQ ACE.DIRECTORY (ACE.ASKEM "Animation Directory? " T LOGINHOST/DIR)) (ACE.TELLEM "If using the Tablet," T) (ACE.TELLEM "Be sure and Initialize it." (QUOTE L)) (SETQ ACE.SEQ.WINDOW NIL) (SETQ ACE.SEQ.WIDTH NIL) (SETQ ACE.SEQ.HEIGHT NIL) (SETQ ACE.SEQ.WINDOW.XOFF 0) (SETQ ACE.SEQ.WINDOW.YOFF 0) (SETQ ACE.CURRENT.SEQUENCE NIL) (SETQ ACE.FRAME.TAIL NIL) (SETQ ACE.CURRENT.FRAME NIL) (replace (MENU WHENSELECTEDFN) of ACE.CONTROL.MENU with (QUOTE ACE.ANIMATE)) (ADDMENU ACE.CONTROL.MENU ACE.CONTROL.WINDOW (CONS 0 0)) (ACE.UPD.CONTROL.WINDOW (QUOTE RESET]) (ACE.ANIMATE [LAMBDA (ITEM WHO CARES) (* MD "26-Jun-85 14:21") (* When running "normal" ACE, this is the WHENSELECTEDFN for deciding what to do. ITEM is the only ARG of  significance (WHO & CARES just to keep MENU package happy); "TRILLIUM ACE" has its own loop thingy) (ACE.TELLEM "" T) (SELECTQ (CADADR ITEM) (NIL NIL) (FRAME (ACE.NEW.FRAME)) (EDIT (ACE.EDIT)) (RUN (ACE.RUN.CURRENT.SEQ)) (LOOP (ACERUNLOOP 1 (QUOTE END))) (SUBLOOP (ACEGETFRAME#)) (NEW (ACE.NEW.SEQUENCE)) (I/O:GET (ACE.GET.SEQ.FILE)) (I/O:PUT (ACE.PUT.SEQ.FILE)) (DEL (ACE.DELETE.FRAME)) (RESET (ACE.RESET.SEQ)) (INC (ACE.INCREMENT.FRAME)) (DEC (ACE.DECREMENT.FRAME)) (TIME (ACE.DELAY)) (INIT.MM1201 (ACE.MM1201.INIT T)) (DEVICE (ACE.SET.DEVICE)) (ACESETTHRESHOLD (ACESETTHRESHOLD)) (QUIT (ACE.QUIT.ACE)) NIL) (AND (OPENWP ACE.CONTROL.WINDOW) (ACE.UPD.CONTROL.WINDOW (QUOTE UPD))) (TTY.PROCESS T]) (ACE.RUN [LAMBDA (SEQ WINDOW XOFFSET YOFFSET TIMER) (* PmT "18-Apr-85 18:21") (* This runs animation sequences. Simple, eh? Gots to have a SEQ and a WINDOW to show it in, and where in the window to show it (i.e. XOFFSET YOFFSET); TIMER is wholly unecessary NOTE: this thang doesn't use any clipping region, just an offset) (for FRAME in SEQ do ((SETQ TIMER (SETUPTIMER (fetch (ACE.FRAME DELAY) of FRAME) TIMER (QUOTE MILLISECONDS))) (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL WINDOW (IPLUS XOFFSET (fetch (ACE.BLIT XCOOR) of FRAME.PART)) (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) of FRAME.PART)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE))) (until (TIMEREXPIRED? TIMER (QUOTE MILLISECONDS)) do]) (ACEGETFRAME# [LAMBDA NIL (* MD "27-Jun-85 12:51") (ACERUNLOOP (RNUMBER "From frame #") (RNUMBER "To frame #:"]) (ACERUNLOOP [LAMBDA (START END) (* MD "26-Jun-85 17:07") (if (EQ END (QUOTE END)) then (SETQ END (LENGTH ACE.CURRENT.SEQUENCE))) [ACE.QUICKDRAW&UPD (LIST (CAR (NTH ACE.CURRENT.SEQUENCE START] (until (KEYDOWNP (QUOTE SPACE)) do (ACE.RUN (SUBLIST ACE.CURRENT.SEQUENCE START END) ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF]) (ACE.NEW.SEQUENCE [LAMBDA (REGION) (* PmT "30-Apr-85 16:21") (PROG (TEMP.REGION) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "NEW") (COND ((OR (NULL ACE.CURRENT.SEQUENCE) (ACE.TELLEM "Creating a NEW Sequence will ERASE" T) (ACE.TELLEM "the Current Animation Sequence." (QUOTE L)) (ACE.CONFIRMIT "Click LEFT to Create NEW Sequence." (QUOTE L))) [COND ((REGIONP REGION) (SETQ TEMP.REGION REGION)) (T (ACE.TELLEM "Specify SIZE of the NEW Sequence." T) (ACE.TELLEM "Watch ACE window for COORs." (QUOTE L)) (SETQ TEMP.REGION (GETREGION NIL NIL NIL (QUOTE ACE.NEW.SEQ.ASST) NIL] (SETQ ACE.SEQ.WIDTH (fetch (REGION WIDTH) of TEMP.REGION)) (SETQ ACE.SEQ.HEIGHT (fetch (REGION HEIGHT) of TEMP.REGION)) [SETQ ACE.CURRENT.SEQUENCE (LIST (create ACE.FRAME DELAY _ 0 BLITS _(LIST (create ACE.BLIT BITMAP _(BITMAPCREATE ACE.SEQ.WIDTH ACE.SEQ.HEIGHT 1) XCOOR _ 0 YCOOR _ 0] (ACE.FIGURE.OUT.WINDOW) (ACE.QUICKDRAW&UPD (LIST (CAR ACE.CURRENT.SEQUENCE]) (ACE.NEW.FRAME [LAMBDA NIL (* PmT "24-Jan-85 13:22") (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "FRAME") (COND ([NULL (AND (ACE.CHECKSTUFF (QUOTE SEQ)) (OR (ACE.CHECKSTUFF (QUOTE FRAME)) (ACE.TELLEM "Can't put a frame before the First Frame." T] NIL) (T (RPLACD ACE.CURRENT.FRAME (CONS (create ACE.FRAME DELAY _ 0 BLITS _ NIL) (CDR ACE.CURRENT.FRAME))) (SETQ ACE.CURRENT.FRAME (CDR ACE.CURRENT.FRAME)) (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME)) (ACE.TELLEM "Going to EDIT ..." T) (ACE.EDIT]) (ACE.QUIT.ACE [LAMBDA NIL (* MD "24-Jun-85 14:49") (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "QUIT") (ACE.TELLEM "QUITing will Close All Animation Windows;" T) (ACE.TELLEM "All Images and Data will be LOST." (QUOTE L)) (COND ((ACE.CONFIRMIT "Click LEFT to QUIT." (QUOTE L)) (CLOSEW ACE.SEQ.WINDOW) (CLOSEW ACE.CONTROL.WINDOW) ACE.CURRENT.SEQUENCE) (T (* MAKE THIS BE SOME KINDA ICON IN THE FUTURE; ASK: DO YOU WANT TO QUIT COMPLETELY OR JUST STOP FOR A  WHILE) (ACE.TELLEM "QUIT Aborted." T]) (ACE.RESET.SEQ [LAMBDA NIL (* PmT "30-Apr-85 16:37") (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "RESET") (COND [(AND ACE.SEQ.WINDOW (ACE.CHECKSTUFF (QUOTE SEQ))) (ACE.QUICKDRAW&UPD (LIST (CAR ACE.CURRENT.SEQUENCE] (T (ACE.TELLEM "There is No Current Sequence." T]) (ACE.RUN.CURRENT.SEQ [LAMBDA NIL (* PmT "18-Apr-85 18:23") (* just a pretty interface to ACE.RUN) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "RUN") (COND ((ACE.CHECKSTUFF (QUOTE SEQ)) (RECLAIM) (ACE.RUN ACE.FRAME.TAIL ACE.SEQ.WINDOW ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF) (SETQ ACE.FRAME.TAIL NIL) (SETQ ACE.CURRENT.FRAME (LAST ACE.CURRENT.SEQUENCE]) (ACE.DELAY [LAMBDA NIL (* PmT " 2-May-85 20:53") (* For setting delays (in MSECs) between frames. Lots of work needed here; esp. delay in-betweening) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "DELAY") (SELECTQ [MENU (OR ACE.DELAY.MENU (SETQ ACE.DELAY.MENU (create MENU ITEMS _(QUOTE (("Set Delay on a Frame" (QUOTE FDELAY) "Adjust the delay on any frame by number") ("Reset Entire Sequence" (QUOTE SDELAY) "Set the delay on every frame"))) CENTERFLG _ T TITLE _ "Sequence Timing Adjustments"] (NIL NIL) (SDELAY (ACE.DELAY.SEQ)) (FDELAY (ACE.DELAY.FRAME)) NIL]) (ACE.DELAY.FRAME [LAMBDA NIL (* MD "21-Jun-85 14:14") (PROG (CHOICE FRAME) LOOP[SETQ CHOICE (MENU (create MENU ITEMS _(NCONC1 (for FRAME in ACE.CURRENT.SEQUENCE bind (COUNT _ 0) collect ((SETQ COUNT (ADD1 COUNT)) (LIST (CONCAT "Frame " COUNT " : " (fetch (ACE.FRAME DELAY) of FRAME)) COUNT))) (QUOTE (Quit (QUOTE QUIT) "Stop adjusting delays"))) TITLE _ "Frame Delays" WHENHELDFN _(QUOTE ACE.DELAY.FRAME.ASST] [COND ((NULL CHOICE) NIL) ((EQ CHOICE (QUOTE QUIT)) (RETURN NIL)) (T (SETQ FRAME (CAR (NTH ACE.CURRENT.SEQUENCE CHOICE))) (AND FRAME (replace (ACE.FRAME DELAY) of FRAME with (SETQ CHOICE (RNUMBER (CONCAT "Frame " CHOICE "; New Delay: "] (GO LOOP]) (ACE.DELAY.SEQ [LAMBDA NIL (* MD "21-Jun-85 14:31") (PROG (NEW.DELAY.VALUE) (COND [(FIXP (SETQ NEW.DELAY.VALUE (RNUMBER "Delay for entire sequence:"] (T (RETURN NIL))) (for FRAME in ACE.CURRENT.SEQUENCE do (replace (ACE.FRAME DELAY) of FRAME with NEW.DELAY.VALUE]) (ACE.DECREMENT.FRAME [LAMBDA NIL (* PmT "21-Dec-84 14:12") (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "DEC") (AND (ACE.CHECKSTUFF (QUOTE SEQ)) (ACE.CHECKSTUFF (QUOTE FRAME)) (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME]) (ACE.INCREMENT.FRAME [LAMBDA NIL (* MD "18-Jun-85 16:12") (PROG (CUR.FRAME) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "INC") (COND ([NULL (AND (ACE.CHECKSTUFF (QUOTE SEQ)) (ACE.CHECKSTUFF (QUOTE TAIL] NIL) (T (SETQ CUR.FRAME (CAR ACE.FRAME.TAIL)) (SETQ ACE.CURRENT.FRAME ACE.FRAME.TAIL) (SETQ ACE.FRAME.TAIL (CDR ACE.FRAME.TAIL)) (COND ((NULL (fetch (ACE.FRAME BLITS) of CUR.FRAME)) NIL) (T (ACE.MAC.SEQ.CLIP (for FRAME.PART in (fetch (ACE.FRAME BLITS) of CUR.FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL ACE.SEQ.WINDOW (IPLUS ACE.SEQ.WINDOW.XOFF (fetch (ACE.BLIT XCOOR) of FRAME.PART)) (IPLUS ACE.SEQ.WINDOW.YOFF (fetch (ACE.BLIT YCOOR) of FRAME.PART)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE]) (ACE.DELETE.FRAME [LAMBDA NIL (* PmT "24-Apr-85 14:19") (* Deletes the current frame; recompiles the previous frame with the successor frame) (PROG (BEFORE.BM AFTER.BM) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "DELETE") (COND ([NULL (AND (ACE.CHECKSTUFF (QUOTE SEQ)) (ACE.CHECKSTUFF (QUOTE FRAME] NIL) ((EQ ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME) (ACE.TELLEM "Can't DELETE first frame. Aborted." T)) ((NULL (ACE.CONFIRMIT "Click LEFT to Confirm Delete" T)) NIL) ((NULL ACE.FRAME.TAIL) (SETQ ACE.CURRENT.SEQUENCE (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME)) (ACE.QUICKDRAW&UPD ACE.CURRENT.SEQUENCE)) (T (SETQ BEFORE.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE ACE.CURRENT.FRAME))) [SETQ AFTER.BM (ACE.RECONSTRUCT.FRAME (LDIFF ACE.CURRENT.SEQUENCE (CDR ACE.FRAME.TAIL] (replace (ACE.FRAME BLITS) of (CAR ACE.CURRENT.FRAME) with (ACE.COMPILE.FRAME BEFORE.BM AFTER.BM ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD)) (RPLACD ACE.CURRENT.FRAME (CDR ACE.FRAME.TAIL)) (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE (CDR ACE.CURRENT.FRAME]) (ACE.SET.DEVICE [LAMBDA NIL (* PmT "23-Apr-85 13:44") (* Selects MOUSE or TABLET as the primary input device) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "SET DEVICE") (ACE.UPD.CONTROL.WINDOW (QUOTE DEVICE)) (ACE.UPD.CONTROL.WINDOW (QUOTE DEVICE) (MENU (OR ACE.SET.DEVICE.MENU (SETQ ACE.SET.DEVICE.MENU (create MENU ITEMS _(QUOTE (("Mouse" (QUOTE MOUSE) "Use the standard mouse for drawing and such") ("Tablet" (QUOTE MM1201) "Use the MM1201 Tablet as the input device"))) TITLE _ "Select Input Device" CENTERFLG _ T]) (ACE.QUICKDRAW&UPD [LAMBDA (PARTIAL.SEQ) (* PmT "30-Apr-85 16:11") (* Updates the frame showing in the A.S.Window and update sequence pointers and stuff. PARTIAL.SEQ is a list of  frames to show; The last frame in PARTIAL.SEQ becomes the new current frame) (COND (PARTIAL.SEQ [ACE.MAC.SEQ.CLIP (for FRAME in PARTIAL.SEQ do (COND ((NULL (fetch (ACE.FRAME BLITS) of FRAME)) NIL) (T (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL ACE.SEQ.WINDOW (IPLUS ACE.SEQ.WINDOW.XOFF (fetch (ACE.BLIT XCOOR) of FRAME.PART)) (IPLUS ACE.SEQ.WINDOW.YOFF (fetch (ACE.BLIT YCOOR) of FRAME.PART)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE] (SETQ ACE.CURRENT.FRAME ACE.CURRENT.SEQUENCE) (for X from 1 to (SUB1 (LENGTH PARTIAL.SEQ)) do (SETQ ACE.CURRENT.FRAME (CDR ACE.CURRENT.FRAME))) (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME]) (ACE.RECONSTRUCT.FRAME [LAMBDA (SEQ) (* PmT "18-Apr-85 18:54") (* Creates a bitmap out of SEQ; Essentially, the last virtual frame in SEQ is converted to a "real" frame and returned) (PROG (ABITMAP) [SETQ ABITMAP (BITMAPCOPY (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME BLITS) of (CAR SEQ] [for FRAME in (CDR SEQ) do (COND ((NULL (fetch (ACE.FRAME BLITS) of FRAME))) (T (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL ABITMAP (fetch (ACE.BLIT XCOOR) of FRAME.PART) (fetch (ACE.BLIT YCOOR) of FRAME.PART) NIL NIL (QUOTE INPUT) (QUOTE REPLACE] (RETURN ABITMAP]) (SUBLIST [LAMBDA (L M N) (* MD "26-Jun-85 16:00") (LDIFF (NTH L M) (NTH L (ADD1 N]) ) (* TRILLIUM STUFF) (DEFINEQ (ACE.TRILLIUM [LAMBDA (WINDOW SEQUENCE POSITION) (* PmT "30-Apr-85 16:44") (* This here sets up stuff for running animation (functionally) from Trillium. ARGS: WINDOW is opt  (but really should be given), SEQUENCE is opt, POSITION *MUST* be given; if not, ACE bags it  (Trillium must always supply a place to put the animation!): This FN just checks args and sets the state of ACE,  then calls the actual "polling" FN NOTE: This should only be called from ACE; take a look at ACE) (PROG NIL (SETQ ACE.RUNNING.UNDER.TRILLIUM T) (DISPLAY.FRAME CURRENT.FRAME) (* See if got a valid window or not) [COND ((WINDOWP WINDOW) (SETQ ACE.SEQ.WINDOW WINDOW)) (T (ACE.TELLEM "There is no Window Specification" T) (COND ((ACE.CONFIRMIT "Click LEFT to use Current Interface Window." (QUOTE L)) (SETQ ACE.SEQ.WINDOW CURRENT.INTERFACE.WINDOW)) (T (ACE.TELLEM "Error in Window Specification." T) (ACE.TELLEM "Likely a Trillium error. ACE aborted." (QUOTE L)) (ACE.CONFIRMIT "Click any button to Exit." (QUOTE L) (QUOTE ANY)) (RETURN NIL] (* The following *might* be used instead of a window  error; you decide) (* SETQ ACE.SEQ.WINDOW (EVAL  (ACE.ASKEM "Enter the Name of the Window: " T NIL 60))) (* Was given a valid postion?) (COND ((POSITIONP POSITION) (SETQ ACE.SEQ.WINDOW.XOFF (fetch (POSITION XCOORD) of POSITION)) (SETQ ACE.SEQ.WINDOW.YOFF (fetch (POSITION YCOORD) of POSITION))) (T (ACE.TELLEM "No Position Specification. Aborted." T) (ACE.TELLEM "This is likely a Trillium error." (QUOTE L)) (ACE.CONFIRMIT "Click any button to Exit." (QUOTE L) (QUOTE ANY)) (RETURN NIL))) (* Now check if given a sequence) (COND ((LISTP SEQUENCE) (SETQ ACE.CURRENT.SEQUENCE SEQUENCE) (SETQ ACE.CURRENT.FRAME ACE.CURRENT.SEQUENCE) (SETQ ACE.FRAME.TAIL (CDR ACE.CURRENT.FRAME)) (SETQ ACE.SEQ.WIDTH (ACE.SEQ.FETCH.WIDTH)) (SETQ ACE.SEQ.HEIGHT (ACE.SEQ.FETCH.HEIGHT)) (ACE.CREATE.EDITING.BORDER) (ACE.SET.SEQ.CLIP.REGION)) (T (SETQ ACE.CURRENT.SEQUENCE NIL) (SETQ ACE.FRAME.TAIL NIL) (SETQ ACE.CURRENT.FRAME NIL))) (* The WHENSELECTEDFN is different for Trillium; make it act like a regular old menu) (replace (MENU WHENSELECTEDFN) of ACE.CONTROL.MENU with (QUOTE DEFAULTWHENSELECTEDFN)) (SETQ ACE.DIRECTORY (DIRECTORYNAME T T)) (AND ACE.CURRENT.SEQUENCE (ACE.RESET.SEQ)) (ACE.UPD.CONTROL.WINDOW (QUOTE RESET)) (* Lock down window so menu coors only figured once; see ACE.TRILLIUM.LOOP) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE MOVEFN) (QUOTE DON'T)) (RETURN (ACE.TRILLIUM.LOOP]) (ACE.TRILLIUM.LOOP [LAMBDA NIL (* PmT "18-Apr-85 18:41") (* This is the repeating loop for Trillium-Ace; just sits in here till QUIT) (PROG (CHOICE MENU.POS) [SETQ MENU.POS (CONS (DSPXOFFSET NIL (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE DSP))) (DSPYOFFSET NIL (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE DSP] LOOP(ACE.TELLEM "" T) (SELECTQ (SETQ CHOICE (MENU ACE.CONTROL.MENU MENU.POS)) (NIL NIL) (FRAME (ACE.NEW.FRAME)) (EDIT (ACE.EDIT)) (RUN (ACE.RUN.CURRENT.SEQ)) (NEW (ACE.NEW.SEQUENCE)) (I/O:GET (ACE.GET.SEQ.FILE)) (I/O:PUT (ACE.PUT.SEQ.FILE)) (DEL (ACE.DELETE.FRAME)) (RESET (ACE.RESET.SEQ)) (INC (ACE.INCREMENT.FRAME)) (DEC (ACE.DECREMENT.FRAME)) (TIME (ACE.DELAY)) (INIT.MM1201 (ACE.MM1201.INIT T)) (DEVICE (ACE.SET.DEVICE)) (QUIT NIL) NIL) (ACE.UPD.CONTROL.WINDOW (QUOTE UPD)) (OR (EQ CHOICE (QUOTE QUIT)) (GO LOOP)) (RETURN (ACE.QUIT.TRILLIUM]) (ACE.RUN.TRILLIUM [LAMBDA (SEQ WINDOW XOFFSET YOFFSET UPTO TIMER) (* PmT "18-Apr-85 18:45") (* Just like ACE.RUN except UPTO can be a FIXP denoting a frame; If UPTO is given, that frame is displayed  (without delays); Good for initializing in Trillium) (COND [(NULL UPTO) (for FRAME in SEQ do ((SETQ TIMER (SETUPTIMER (fetch (ACE.FRAME DELAY) of FRAME) TIMER (QUOTE MILLISECONDS))) (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL WINDOW (IPLUS XOFFSET (fetch (ACE.BLIT XCOOR) of FRAME.PART)) (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) of FRAME.PART)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE))) (until (TIMEREXPIRED? TIMER (QUOTE MILLISECONDS)) do] ((AND (FIXP UPTO) (IGREATERP (ADD1 (LENGTH SEQ)) UPTO) (IGREATERP UPTO 0)) (for FRAME in (LDIFF SEQ (NTH SEQ (ADD1 UPTO))) do (for FRAME.PART in (fetch (ACE.FRAME BLITS) of FRAME) do (BITBLT (fetch (ACE.BLIT BITMAP) of FRAME.PART) NIL NIL WINDOW (IPLUS XOFFSET (fetch (ACE.BLIT XCOOR) of FRAME.PART)) (IPLUS YOFFSET (fetch (ACE.BLIT YCOOR) of FRAME.PART)) NIL NIL (QUOTE INPUT) (QUOTE REPLACE]) (ACE.QUIT.TRILLIUM [LAMBDA NIL (* PmT "15-Mar-85 13:48") (CLOSEW ACE.CONTROL.WINDOW) (SETQ ACE.RUNNING.UNDER.TRILLIUM NIL) ACE.CURRENT.SEQUENCE]) (ACE.CREATE.EDITING.BORDER [LAMBDA (MODE) (* PmT "30-Apr-85 16:42") (PROG (X1 X2 Y1 Y2) (OR MODE (SETQ MODE (QUOTE PAINT))) (COND ((AND (NUMBERP ACE.SEQ.WIDTH) (NUMBERP ACE.SEQ.HEIGHT)) (SETQ X1 (IDIFFERENCE ACE.SEQ.WINDOW.XOFF 2)) (SETQ X2 (IPLUS ACE.SEQ.WINDOW.XOFF ACE.SEQ.WIDTH)) (SETQ Y1 (IDIFFERENCE ACE.SEQ.WINDOW.YOFF 2)) (SETQ Y2 (IPLUS ACE.SEQ.WINDOW.YOFF ACE.SEQ.HEIGHT)) (DRAWLINE X1 Y1 X1 Y2 2 MODE ACE.SEQ.WINDOW) (DRAWLINE X1 Y2 X2 Y2 2 MODE ACE.SEQ.WINDOW) (DRAWLINE X2 Y2 X2 Y1 2 MODE ACE.SEQ.WINDOW) (DRAWLINE X2 Y1 X1 Y1 2 MODE ACE.SEQ.WINDOW]) ) (* I/O STUFF) (DEFINEQ (ACE.GET.SEQ.FILE [LAMBDA NIL (* PmT "25-Apr-85 21:18") (* Gets an animation sequence. Resets ACE.CURRENT.SEQUENCE and the sequence clipping  region) (RESETFORM (TTYDISPLAYSTREAM \TopLevelTtyWindow) (PROG (FILENAME TEMP.SEQUENCE.NAME) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "GET FILE") (OR (NULL ACE.CURRENT.SEQUENCE) (ACE.TELLEM "Loading a Sequence will ERASE the Current" T) (ACE.CONFIRMIT "Sequence; Click LEFT to confirm LOAD." (QUOTE L)) (ACE.TELLEM "Get Sequence ABORTED." T) (RETURN NIL)) (SETQ FILENAME (ACE.GET.A.FILE.NAME)) [COND ((NULL FILENAME) (ACE.TELLEM "No NAME. Aborted" T) (RETURN NIL)) (T (SETQ FILENAME (PACKFILENAME (QUOTE BODY) FILENAME (QUOTE HOST) (FILENAMEFIELD ACE.DIRECTORY (QUOTE HOST)) (QUOTE DIRECTORY) (FILENAMEFIELD ACE.DIRECTORY (QUOTE DIRECTORY] (ACE.TELLEM "Loading: " T) (ACE.TELLEM (CONCAT FILENAME " ... ") (QUOTE L)) [RESETLST [RESETSAVE (PROGN (CURSOR WAITINGCURSOR) (SETTOPVAL (QUOTE HELPFLAG) NIL)) (LIST (QUOTE PROGN) (LIST (QUOTE CURSOR) (QUOTE DEFAULTCURSOR)) (LIST (QUOTE SETTOPVAL) (QUOTE (QUOTE HELPFLAG)) (KWOTE (GETTOPVAL (QUOTE HELPFLAG] (SETQ TEMP.SEQUENCE.NAME (CAR (ERRORSET (QUOTE (LOAD FILENAME (QUOTE SYSLOAD))) (QUOTE NOBREAK] (COND (TEMP.SEQUENCE.NAME (SETQ ACE.CURRENT.SEQUENCE.NAME TEMP.SEQUENCE.NAME) (SETQ ACE.SEQ.WIDTH (ACE.SEQ.FETCH.WIDTH)) (SETQ ACE.SEQ.HEIGHT (ACE.SEQ.FETCH.HEIGHT)) (ACE.FIGURE.OUT.WINDOW) (ACE.RESET.SEQ)) (T (ACE.TELLEM "Not Found.") (ACE.TELLEM "No Such File or File Server Problems." (QUOTE L]) (ACE.PUT.SEQ.FILE [LAMBDA NIL (* PmT " 2-May-85 20:50") (* Writes a sequence to a file; the file is NOT pretty printed) (PROG (FILENAME TEMP.SEQUENCE.NAME) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "PUT FILE") [COND ((NULL (ACE.CHECKSTUFF (QUOTE SEQ))) (RETURN NIL)) ((AND ACE.CURRENT.SEQUENCE.NAME (ACE.CONFIRMIT "Click LEFT to Keep Same Name." T)) (SETQ FILENAME ACE.CURRENT.SEQUENCE.NAME)) (T (SETQ FILENAME (ACE.GET.A.FILE.NAME)) (COND ((NULL FILENAME) (ACE.TELLEM "NIL ain't no good. Aborted." T) (RETURN NIL))) (SETQ FILENAME (PACKFILENAME (QUOTE BODY) FILENAME (QUOTE HOST) (FILENAMEFIELD ACE.DIRECTORY (QUOTE HOST)) (QUOTE DIRECTORY) (FILENAMEFIELD ACE.DIRECTORY (QUOTE DIRECTORY] (COND ((AND (FILENAMEFIELD FILENAME (QUOTE VERSION)) (NULL (ACE.TELLEM "Click LEFT to Write a New Version." T)) (ACE.CONFIRMIT "Click any Other to Write Over Existing Version." (QUOTE L))) (SETQ FILENAME (PACKFILENAME (QUOTE VERSION) NIL (QUOTE BODY) FILENAME))) (T NIL)) [SET (PACK* (FILENAMEFIELD FILENAME (QUOTE NAME)) (QUOTE COMS)) (QUOTE ((UGLYVARS ACE.CURRENT.SEQUENCE] (PUTPROP (FILENAMEFIELD FILENAME (QUOTE NAME)) (QUOTE FILETYPE) (QUOTE (DON'TLIST DON'TCOMPILE))) (ACE.TELLEM "Putting to File: " T) (ACE.TELLEM (CONCAT FILENAME " ... ") (QUOTE L)) [RESETLST [RESETSAVE (PROGN (CURSOR WAITINGCURSOR) (SETTOPVAL (QUOTE HELPFLAG) NIL)) (LIST (QUOTE PROGN) (LIST (QUOTE CURSOR) (QUOTE DEFAULTCURSOR)) (LIST (QUOTE SETTOPVAL) (QUOTE (QUOTE HELPFLAG)) (KWOTE (GETTOPVAL (QUOTE HELPFLAG] (SETQ TEMP.SEQUENCE.NAME (CAR (ERRORSET [QUOTE (MAKEFILE FILENAME (QUOTE (NEW FAST] (QUOTE NOBREAK] (COND (TEMP.SEQUENCE.NAME (SETQ ACE.CURRENT.SEQUENCE.NAME TEMP.SEQUENCE.NAME) (ACE.TELLEM "Done") (DREMOVE (FILENAMEFIELD FILENAME (QUOTE NAME)) FILELST)) (T (ACE.TELLEM "Aborted.") (ACE.TELLEM "Nothing doing. Can't write this File out." (QUOTE L)) (ACE.TELLEM "Check the Name. Is the File Server Down?" (QUOTE L]) (ACE.GET.A.FILE.NAME [LAMBDA NIL (* PmT "18-Apr-85 19:44") (ACE.ASKEM "Enter FILENAME: " T NIL 120]) ) (* HELPER FNS) (DEFINEQ (ACE.ASKEM [LAMBDA (STRING FLG DEFAULTANSWER TIMELIMIT? SPACES?) (* MD "14-Jun-85 16:48") (* a prompting fn. STRING is the prompt string; FLG either T,L or NIL (T means clear before prompting, L means new  line); DEFAULTANSWER just what it sounds like. TIMELIMIT? number or seconds to wait for answer  (defaults to 120); if SPACES? is T, then the answer can have spaces in it) (* TIMELIMIT? removed - now waits forever. - MJD) (ACE.MAC.CW.PROMPT.CLIP (PROGN (OR TIMELIMIT? (SETQ TIMELIMIT? 120)) (COND ((EQ FLG T) (DSPRESET ACE.CONTROL.WINDOW)) ((EQ FLG (QUOTE L)) (TERPRI ACE.CONTROL.WINDOW))) (MKATOM (PROMPTFORWORD STRING DEFAULTANSWER NIL ACE.CONTROL.WINDOW NIL NIL (AND SPACES? (CHARCODE (EOL ESCAPE LF]) (ACE.TELLEM [LAMBDA (STRING FLG) (* PmT "23-Apr-85 13:49") (* Writes STRING in the A.C.W prompt region; FLG=T means clear prompt region first; L means new line; NIL means put it at the next char position) (ACE.MAC.CW.PROMPT.CLIP (PROGN (COND ((EQ FLG T) (DSPRESET ACE.CONTROL.WINDOW)) ((EQ FLG (QUOTE L)) (TERPRI ACE.CONTROL.WINDOW))) (printout ACE.CONTROL.WINDOW STRING) NIL]) (ACE.CONFIRMIT [LAMBDA (CONFIRMSTRING FLG WHICHKEYS?) (* PmT "25-Apr-85 17:47") (* Prints CONFIRMSTRING in A.C.W prompt region; then waits for the button form WHICHKEYS? to become true. WHICHKEYS? defaults to LEFT. Code identfies the valid button forms) (OR WHICHKEYS? (SETQ WHICHKEYS? (QUOTE LEFT))) (ACE.TELLEM CONFIRMSTRING FLG) (DISMISS 100 NIL T) (RESETFORM (CURSOR (SELECTQ WHICHKEYS? (LEFT ACE.LEFTMOUSE.CURSOR) (MIDDLE ACE.MIDDLEMOUSE.CURSOR) (RIGHT ACE.RIGHTMOUSE.CURSOR) (ANY (PROGN (SETQ WHICHKEYS? (QUOTE (NOT UP))) ACE.ALLMOUSE.CURSOR)) NIL)) (do (GETMOUSESTATE) until (NEQ LASTMOUSEBUTTONS 0)) (PROG1 (EVAL (MOUSESTATE-EXPR WHICHKEYS? T)) (do (GETMOUSESTATE) until (EQP LASTMOUSEBUTTONS 0]) (ACE.DEFINE.SEQ.WINDOW [LAMBDA NIL (* PmT " 2-May-85 20:32") [COND ((ACE.CONFIRMIT "Click LEFT to Create a Sequence Window." T) (AND ACE.SEQ.WINDOW (CLOSEW ACE.SEQ.WINDOW)) (SETQ ACE.SEQ.WINDOW (CREATEW (LIST 50 50 (IPLUS ACE.SEQ.WIDTH 8) (IPLUS ACE.SEQ.HEIGHT 17)) (QUOTE "Animation Sequence Window") 4)) (ACE.TELLEM "Position the Sequence Window" T) (MOVEW ACE.SEQ.WINDOW)) ((AND ACE.SEQ.WINDOW (ILEQ ACE.SEQ.WIDTH (WINDOWPROP ACE.SEQ.WINDOW (QUOTE WIDTH))) (ILEQ ACE.SEQ.HEIGHT (WINDOWPROP ACE.SEQ.WINDOW (QUOTE HEIGHT))) (ACE.CONFIRMIT "Click LEFT to Keep Current Window." T)) (* CLEARW ACE.SEQ.WINDOW) ) (T (ACE.TELLEM "CAUTION: Enter NIL if Unsure at this Stage." T) (SETQ ACE.SEQ.WINDOW (EVAL (ACE.ASKEM "Enter the Window: " (QUOTE L) NIL 120] (OR ACE.SEQ.WINDOW (ACE.DEFINE.SEQ.WINDOW]) (ACE.FIGURE.OUT.WINDOW [LAMBDA (REGION/POSITION) (* PmT "22-Apr-85 19:05") (* This is where all reasoning about which window to use and where offsets should be placed goes. Right now (4/20/85) Trillium's just gonna go with positions; but that should (?) change) (COND (ACE.RUNNING.UNDER.TRILLIUM (DISPLAY.FRAME CURRENT.FRAME) (ACE.CREATE.EDITING.BORDER (QUOTE INVERT)) (* KEEP OFFSETS THE SAME FOR NOW) ) ((POSITIONP REGION/POSITION) (SETQ ACE.SEQ.WINDOW.XOFF (CAR REGION/POSITION)) (SETQ ACE.SEQ.WINDOW.YOFF (CDR REGION/POSITION))) (T (SETQ ACE.SEQ.WINDOW.XOFF 0) (SETQ ACE.SEQ.WINDOW.YOFF 0) (ACE.DEFINE.SEQ.WINDOW))) (ACE.SET.SEQ.CLIP.REGION]) (ACE.RETURN.CLOSEST.VERTEX [LAMBDA (POINT REGION) (* PmT "28-Nov-84 16:15") (PROG (NEW.XCOOR NEW.YCOOR) [COND [(IGREATERP (CAR POINT) (SETQ NEW.XCOOR (fetch (REGION RIGHT) of REGION] [(ILESSP (CAR POINT) (SETQ NEW.XCOOR (fetch (REGION LEFT) of REGION] (T (SETQ NEW.XCOOR (CAR POINT] [COND [(IGREATERP (CDR POINT) (SETQ NEW.YCOOR (fetch (REGION TOP) of REGION] [(ILESSP (CDR POINT) (SETQ NEW.YCOOR (fetch (REGION BOTTOM) of REGION] (T (SETQ NEW.YCOOR (CDR POINT] (RETURN (CONS NEW.XCOOR NEW.YCOOR]) (ACE.NEW.SEQ.ASST [LAMBDA (FIXED MOVE DUM) (* PmT "23-Jan-85 19:52") (COND ((NULL MOVE) (ACE.UPD.CONTROL.WINDOW (QUOTE CURSOR) FIXED) FIXED) (T [ACE.UPD.CONTROL.WINDOW (QUOTE CURSOR) (CONS (ABS (IDIFFERENCE (fetch (POSITION XCOORD) of MOVE) (fetch (POSITION XCOORD) of FIXED))) (ABS (IDIFFERENCE (fetch (POSITION YCOORD) of MOVE) (fetch (POSITION YCOORD) of FIXED] MOVE]) (ACE.DELAY.FRAME.ASST [LAMBDA (ITEM MENU MOUSE) (* PmT "21-Dec-84 16:42") (COND [(FIXP (CADR ITEM)) (ACE.QUICKDRAW&UPD (LDIFF ACE.CURRENT.SEQUENCE (CDR (NTH ACE.CURRENT.SEQUENCE (CADR ITEM] (T NIL]) (ACE.SETUP.CW.CLIPPING.REGIONS [LAMBDA (MENU) (* PmT "23-Apr-85 13:47") (* Sets the clipping region on ACE.CONTROL.WINDOW; There is a menu region, prompt region and status  region) (PROG (NORMAL ABOVEMENU INFO) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE NORMAL.CLIP.REGION) (SETQ NORMAL (DSPCLIPPINGREGION NIL ACE.CONTROL.WINDOW))) [WINDOWPROP ACE.CONTROL.WINDOW (QUOTE ABOVEMENU.CLIP.REGION) (SETQ ABOVEMENU (CREATEREGION (fetch (REGION LEFT) of NORMAL) (fetch IMAGEHEIGHT of MENU) (fetch (REGION WIDTH) of NORMAL) (IDIFFERENCE (fetch (REGION HEIGHT) of NORMAL) (fetch IMAGEHEIGHT of MENU] [WINDOWPROP ACE.CONTROL.WINDOW (QUOTE INFO.CLIP.REGION) (SETQ INFO (CREATEREGION (fetch (REGION LEFT) of ABOVEMENU) (fetch (REGION BOTTOM) of ABOVEMENU) 130 (IDIFFERENCE (fetch (REGION HEIGHT) of ABOVEMENU) 5] (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE PROMPT.CLIP.REGION) (CREATEREGION (IPLUS 3 (fetch (REGION RIGHT) of INFO)) (fetch (REGION BOTTOM) of ABOVEMENU) (IDIFFERENCE (fetch (REGION RIGHT) of ABOVEMENU) (IPLUS 3 (fetch (REGION RIGHT) of INFO))) (IDIFFERENCE (fetch (REGION HEIGHT) of ABOVEMENU) 5))) (DRAWLINE (ADD1 (fetch (REGION RIGHT) of INFO)) (fetch (REGION BOTTOM) of ABOVEMENU) (ADD1 (fetch (REGION RIGHT) of INFO)) (fetch (REGION TOP) of ABOVEMENU) 1 (QUOTE PAINT) ACE.CONTROL.WINDOW) (DSPFILL (CREATEREGION 0 0 (fetch IMAGEWIDTH of MENU) (fetch IMAGEHEIGHT of MENU)) 38505 (QUOTE PAINT) ACE.CONTROL.WINDOW]) (ACE.CHECKSTUFF [LAMBDA (CONDITIONS) (* PmT "26-Oct-84 16:10") (COND ((EQ CONDITIONS (QUOTE SEQ)) (OR ACE.CURRENT.SEQUENCE (ACE.TELLEM "No Current Sequence defined. Aborted" T))) ((EQ CONDITIONS (QUOTE FRAME)) (OR ACE.CURRENT.FRAME (ACE.TELLEM "No Current Frame. Aborted" T))) ((EQ CONDITIONS (QUOTE TAIL)) (OR ACE.FRAME.TAIL (ACE.TELLEM "Sequence is at End." T]) (ACE.UPD.CONTROL.WINDOW [LAMBDA (ITEM VALUE) (* MD "18-Jun-85 16:19") (* This puts info in the status region of the control window; ITEM one of: CURSOR, FRAME, DEVICE, OPERATION, UPD, T, RESET. VALUE is the value for the ITEM; The ITEMs and VALUEs are stored as WINDOWPROPs on A.C.W) (ACE.MAC.CW.INFO.CLIP (COND ((AND (KEYDOWNP (QUOTE T)) (EQ ITEM (QUOTE CURSOR))) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) VALUE)) ((EQ ITEM (QUOTE FRAME)) [COND ((EQ VALUE T) (SETQ VALUE (COND ((NULL ACE.CURRENT.SEQUENCE) (QUOTE NA)) ((EQ ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL) (QUOTE START)) (T (LENGTH (LDIFF ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL] (ACE.UPD.CW.MULE (QUOTE ACE.FRAME) VALUE)) ((EQ ITEM (QUOTE DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE) VALUE)) ((EQ ITEM (QUOTE OPERATION)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) VALUE)) ((EQ ITEM (QUOTE UPD)) (ACE.UPD.CONTROL.WINDOW2 (QUOTE FRAME) T) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) (QUOTE OK)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) (QUOTE NA))) ((EQ ITEM T) (ACE.UPD.CW.MULE (QUOTE ACE.FRAME)) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR))) ((EQ ITEM (QUOTE RESET)) (ACE.UPD.CONTROL.WINDOW2 (QUOTE FRAME) T) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE) (QUOTE MOUSE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) (QUOTE NA)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) (QUOTE NA]) (ACE.UPD.CW.MULE [LAMBDA (ITEM VALUE) (* MD "18-Jun-85 16:49") (* An elaborate WINDOWPROPer. If VALUE is given, it's put on A.C.W as prop ITEM; if VALUE = NIL, returns the current value of ITEM. Also, writes the value in the status region of A.C.W. ITEM one of: ACE.CURSOR ACE.FRAME ACE.OPERATION ACE.DEVICE. Some restrictions of what VALUE can be (see code); Returns VALUE) (COND [(AND (KEYDOWNP (QUOTE T)) (EQ ITEM (QUOTE ACE.CURSOR))) [COND ((OR (POSITIONP VALUE) (EQ VALUE (QUOTE NA))) (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] (ACE.UPD.CLEAR.SET.LINE 4) (COND ((POSITIONP VALUE) (printout ACE.CONTROL.WINDOW " Cursor: " (CAR VALUE) " " (CDR VALUE) .SP 10)) (T (printout ACE.CONTROL.WINDOW " Cursor: " VALUE .SP 10] ((EQ ITEM (QUOTE ACE.FRAME)) [COND ((OR (FIXP VALUE) (EQ VALUE (QUOTE START)) (EQ VALUE (QUOTE NA))) (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] (ACE.UPD.CLEAR.SET.LINE 1) (printout ACE.CONTROL.WINDOW " Frame: " VALUE .SP 20)) ((EQ ITEM (QUOTE ACE.OPERATION)) (COND ((NULL VALUE) (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM))) (T (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE))) (ACE.UPD.CLEAR.SET.LINE 3) (printout ACE.CONTROL.WINDOW " State: " VALUE .SP 20)) ((EQ ITEM (QUOTE ACE.DEVICE)) [COND ((OR (EQ VALUE (QUOTE MOUSE)) (EQ VALUE (QUOTE MM1201))) (WINDOWPROP ACE.CONTROL.WINDOW ITEM VALUE)) (T (SETQ VALUE (WINDOWPROP ACE.CONTROL.WINDOW ITEM] (ACE.UPD.CLEAR.SET.LINE 2) (printout ACE.CONTROL.WINDOW " Device: " (COND ((EQ VALUE (QUOTE MOUSE)) (QUOTE MOUSE)) ((EQ VALUE (QUOTE MM1201)) (QUOTE TABLET)) (T (QUOTE NA))) .SP 10))) VALUE]) (ACE.UPD.CLEAR.SET.LINE [LAMBDA (LINES) (* PmT "17-Dec-84 19:11") (MOVETOUPPERLEFT ACE.CONTROL.WINDOW) (RELMOVETO 0 (ITIMES (DSPLINEFEED NIL ACE.CONTROL.WINDOW) (SUB1 LINES)) ACE.CONTROL.WINDOW]) (ACE.CREATE.CONTROL.MENU [LAMBDA NIL (* MD "26-Jun-85 14:11") (SETQ ACE.CONTROL.MENU (create MENU ITEMS _(QUOTE (("Get Sequence" (QUOTE I/O:GET) "Fetch a sequence-file") ("Edit Frame" (QUOTE EDIT) "Edits the CURRENT frame") ("Run Sequence" (QUOTE RUN) "Runs the sequence" (SUBITEMS ("Loop" (QUOTE LOOP) "Runs sequence repeatedly until you type a space") ("Loop part" (QUOTE SUBLOOP) "Runs part of the sequence repeatedly "))) ("Put Sequence" (QUOTE I/O:PUT) "Writes current sequence out to a file") ("New Frame" (QUOTE FRAME) "Adds in another frame AFTER the current one") ("Increment Frame" (QUOTE INC) "Moves forward one frame and displays") ("New Sequence" (QUOTE NEW) "Make a new sequence from scratch") ("Delete Frame" (QUOTE DEL) "Removes CURRENT frame and smoothes over") ("Decrement Frame" (QUOTE DEC) "Goes back one frame") ("Reset Sequence" (QUOTE RESET) "Clears window and resets to start of sequence") (" Adjust Timing Delays " (QUOTE TIME) "Manipulate the timing adjustments") ("Initialize MM1201 Tablet" (QUOTE INIT.MM1201) "Sets up the Tablet for use") ("Change compression %%" (QUOTE ACESETTHRESHOLD) "Changes the space compression factor: 0 to 100 (100 = max compression)") ("Change Input Device" (QUOTE DEVICE) "Select Mouse or Tablet (for now)") ("Quit" (QUOTE QUIT) "Exit ACE; Trillium user's MUST quit when done"))) CENTERFLG _ T MENUCOLUMNS _ 3]) (ACE.SEQ.FETCH.WIDTH [LAMBDA NIL (* PmT "22-Apr-85 19:12") (FETCH (BITMAP BITMAPWIDTH) OF (FETCH (ACE.BLIT BITMAP) OF (CAR (FETCH (ACE.FRAME BLITS) OF (CAR ACE.CURRENT.SEQUENCE]) (ACE.SEQ.FETCH.HEIGHT [LAMBDA NIL (* PmT "22-Apr-85 19:14") (fetch (BITMAP BITMAPHEIGHT) of (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME BLITS) of (CAR ACE.CURRENT.SEQUENCE]) (ACE.SET.SEQ.CLIP.REGION [LAMBDA (LEFT BOTTOM WIDTH HEIGHT) (* "PmT" "17-Apr-85 18:03") (OR LEFT (SETQ LEFT ACE.SEQ.WINDOW.XOFF)) (OR BOTTOM (SETQ BOTTOM ACE.SEQ.WINDOW.YOFF)) (OR WIDTH (SETQ WIDTH ACE.SEQ.WIDTH)) (OR HEIGHT (SETQ HEIGHT ACE.SEQ.HEIGHT)) (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE SEQUENCE.CLIPPING.REGION) (CREATEREGION LEFT BOTTOM WIDTH HEIGHT]) (ACE.ASKEM2 [LAMBDA (STRING FLG DEFAULTANSWER TIMELIMIT? SPACES?) (* PmT "22-Apr-85 15:56") (* Like ASKEM but uses whole control window  (use cautiously)) (OR TIMELIMIT? (SETQ TIMELIMIT? 60)) (COND ((EQ FLG T) (DSPRESET ACE.CONTROL.WINDOW)) ((EQ FLG (QUOTE L)) (TERPRI ACE.CONTROL.WINDOW))) (MKATOM (PROMPTFORWORD STRING DEFAULTANSWER NIL ACE.CONTROL.WINDOW NIL TIMELIMIT? (AND SPACES? (CHARCODE (EOL ESCAPE LF]) (ACE.TELLEM2 [LAMBDA (STRING FLG) (* PmT "19-Dec-84 19:15") (COND ((EQ FLG T) (DSPRESET ACE.CONTROL.WINDOW)) ((EQ FLG (QUOTE L)) (TERPRI ACE.CONTROL.WINDOW))) (printout ACE.CONTROL.WINDOW STRING) NIL]) (ACE.UPD.CONTROL.WINDOW2 [LAMBDA (ITEM VALUE) (* PmT "19-Dec-84 15:49") (COND ((EQ ITEM (QUOTE FRAME)) [COND ((EQ VALUE T) (SETQ VALUE (COND ((NULL ACE.CURRENT.SEQUENCE) (QUOTE NA)) ((EQ ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL) (QUOTE START)) (T (LENGTH (LDIFF ACE.CURRENT.SEQUENCE ACE.FRAME.TAIL] (ACE.UPD.CW.MULE (QUOTE ACE.FRAME) VALUE)) ((EQ ITEM (QUOTE DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE) VALUE)) ((EQ ITEM (QUOTE OPERATION)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) VALUE)) ((EQ ITEM (QUOTE CURSOR)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) VALUE)) ((EQ ITEM (QUOTE UPD)) (ACE.UPD.CONTROL.WINDOW2 (QUOTE FRAME) T) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) (QUOTE OK)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) (QUOTE NA))) ((EQ ITEM T) (ACE.UPD.CW.MULE (QUOTE ACE.FRAME)) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR))) ((EQ ITEM (QUOTE RESET)) (ACE.UPD.CONTROL.WINDOW2 (QUOTE FRAME) T) (ACE.UPD.CW.MULE (QUOTE ACE.DEVICE) (QUOTE MOUSE)) (ACE.UPD.CW.MULE (QUOTE ACE.OPERATION) (QUOTE NA)) (ACE.UPD.CW.MULE (QUOTE ACE.CURSOR) (QUOTE NA]) ) (* The following Macros set up restricting clipping regions) (DECLARE: EVAL@COMPILE (PUTPROPS ACE.MAC.CW.INFO.CLIP MACRO ((FORM) (RESETLST [RESETSAVE (PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE INFO.CLIP.REGION)) ACE.CONTROL.WINDOW) (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE INFO.CLIP.REGION))) ACE.CONTROL.WINDOW)) (QUOTE (PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE NORMAL.CLIP.REGION)) ACE.CONTROL.WINDOW) (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE NORMAL.CLIP.REGION))) ACE.CONTROL.WINDOW] FORM))) (PUTPROPS ACE.MAC.CW.PROMPT.CLIP MACRO ((FORM) (RESETLST [RESETSAVE (PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE PROMPT.CLIP.REGION)) ACE.CONTROL.WINDOW) (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE PROMPT.CLIP.REGION))) ACE.CONTROL.WINDOW)) (QUOTE (PROGN (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE NORMAL.CLIP.REGION)) ACE.CONTROL.WINDOW) (DSPLEFTMARGIN (fetch (REGION LEFT) of (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE NORMAL.CLIP.REGION))) ACE.CONTROL.WINDOW] FORM))) (PUTPROPS ACE.MAC.SEQ.CLIP MACRO ((FORM) (COND ((WINDOWPROP ACE.CONTROL.WINDOW (QUOTE SEQUENCE.CLIPPING.REGION)) (RESETLST (RESETSAVE (DSPCLIPPINGREGION (WINDOWPROP ACE.CONTROL.WINDOW (QUOTE SEQUENCE.CLIPPING.REGION)) ACE.SEQ.WINDOW) (LIST (QUOTE DSPCLIPPINGREGION) (DSPCLIPPINGREGION NIL ACE.SEQ.WINDOW) ACE.SEQ.WINDOW)) FORM)) (T FORM)))) ) (DECLARE: EVAL@COMPILE (PUTPROPS ACE.MAC.FETCH.WIDTH MACRO [NIL (fetch (BITMAP BITMAPWIDTH) of (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME BLITS) of (CAR ACE.CURRENT.SEQUENCE]) (PUTPROPS ACE.MAC.FETCH.HEIGHT MACRO [NIL (fetch (BITMAP BITMAPHEIGHT) of (fetch (ACE.BLIT BITMAP) of (CAR (fetch (ACE.FRAME BLITS) of (CAR ACE.CURRENT.SEQUENCE]) ) (RPAQ ACE.LEFTMOUSE.CURSOR (CURSORCREATE (READBITMAP) 8 8)) (16 16 "GOOL" "D@@D" "ELID" "ELID" "ELID" "ELID" "ELID" "ELID" "ELID" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "GOOL")(RPAQ ACE.MIDDLEMOUSE.CURSOR (CURSORCREATE (READBITMAP) 8 8)) (16 16 "GOOL" "D@@D" "ECID" "ECID" "ECID" "ECID" "ECID" "ECID" "ECID" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "GOOL")(RPAQ ACE.RIGHTMOUSE.CURSOR (CURSORCREATE (READBITMAP) 8 8)) (16 16 "GOOL" "D@@D" "EBGD" "EBGD" "EBGD" "EBGD" "EBGD" "EBGD" "EBGD" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "GOOL")(RPAQ ACE.ALLMOUSE.CURSOR (CURSORCREATE (READBITMAP) 8 8)) (16 16 "GOOL" "D@@D" "DMKD" "DMKD" "DMKD" "DMKD" "DMKD" "DMKD" "DMKD" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "D@@D" "GOOL")(DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS ACE.CONTROL.WINDOW ACE.DIRECTORY ACE.SEQ.WINDOW ACE.SEQ.WIDTH ACE.SEQ.HEIGHT ACE.SEQ.WINDOW.XOFF ACE.SEQ.WINDOW.YOFF ACE.CURRENT.SEQUENCE ACE.CURRENT.SEQUENCE.NAME ACE.FRAME.TAIL ACE.CURRENT.FRAME ACE.VERTICAL.BLOCK ACE.AREA.THRESHOLD ACE.RUNNING.UNDER.TRILLIUM ACE.LEFTMOUSE.CURSOR ACE.MIDDLEMOUSE.CURSOR ACE.RIGHTMOUSE.CURSOR ACE.ALLMOUSE.CURSOR) ) (* MENUS IN MAIN) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS ACE.CONTROL.MENU ACE.DELAY.MENU ACE.SET.DEVICE.MENU) ) (SETQ ACE.CONTROL.WINDOW NIL) (SETQ ACE.CONTROL.MENU NIL) (SETQ ACE.DELAY.MENU NIL) (SETQ ACE.SET.DEVICE.MENU NIL) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (DECLARE: DONTCOPY (FILEMAP (NIL (2486 20306 (ACE 2496 . 5159) (ACE.ANIMATE 5161 . 6340) (ACE.RUN 6342 . 7336) ( ACEGETFRAME# 7338 . 7525) (ACERUNLOOP 7527 . 7999) (ACE.NEW.SEQUENCE 8001 . 9336) (ACE.NEW.FRAME 9338 . 10040) (ACE.QUIT.ACE 10042 . 10763) (ACE.RESET.SEQ 10765 . 11153) (ACE.RUN.CURRENT.SEQ 11155 . 11693) (ACE.DELAY 11695 . 12629) (ACE.DELAY.FRAME 12631 . 13715) (ACE.DELAY.SEQ 13717 . 14134) ( ACE.DECREMENT.FRAME 14136 . 14487) (ACE.INCREMENT.FRAME 14489 . 15586) (ACE.DELETE.FRAME 15588 . 17033 ) (ACE.SET.DEVICE 17035 . 17826) (ACE.QUICKDRAW&UPD 17828 . 19115) (ACE.RECONSTRUCT.FRAME 19117 . 20142) (SUBLIST 20144 . 20304)) (20334 27610 (ACE.TRILLIUM 20344 . 23762) (ACE.TRILLIUM.LOOP 23764 . 25048) (ACE.RUN.TRILLIUM 25050 . 26596) (ACE.QUIT.TRILLIUM 26598 . 26820) (ACE.CREATE.EDITING.BORDER 26822 . 27608)) (27633 32897 (ACE.GET.SEQ.FILE 27643 . 29909) (ACE.PUT.SEQ.FILE 29911 . 32728) ( ACE.GET.A.FILE.NAME 32730 . 32895)) (32921 51702 (ACE.ASKEM 32931 . 33917) (ACE.TELLEM 33919 . 34458) (ACE.CONFIRMIT 34460 . 35379) (ACE.DEFINE.SEQ.WINDOW 35381 . 36490) (ACE.FIGURE.OUT.WINDOW 36492 . 37362) (ACE.RETURN.CLOSEST.VERTEX 37364 . 38107) (ACE.NEW.SEQ.ASST 38109 . 38672) ( ACE.DELAY.FRAME.ASST 38674 . 38964) (ACE.SETUP.CW.CLIPPING.REGIONS 38966 . 41073) (ACE.CHECKSTUFF 41075 . 41565) (ACE.UPD.CONTROL.WINDOW 41567 . 43687) (ACE.UPD.CW.MULE 43689 . 45893) ( ACE.UPD.CLEAR.SET.LINE 45895 . 46183) (ACE.CREATE.CONTROL.MENU 46185 . 48212) (ACE.SEQ.FETCH.WIDTH 48214 . 48500) (ACE.SEQ.FETCH.HEIGHT 48502 . 48784) (ACE.SET.SEQ.CLIP.REGION 48786 . 49245) ( ACE.ASKEM2 49247 . 49835) (ACE.TELLEM2 49837 . 50140) (ACE.UPD.CONTROL.WINDOW2 50142 . 51700))))) STOP \ No newline at end of file diff --git a/lispusers/ACE-PRIM b/lispusers/ACE-PRIM new file mode 100644 index 00000000..66aabc69 --- /dev/null +++ b/lispusers/ACE-PRIM @@ -0,0 +1 @@ +(FILECREATED "28-May-86 17:27:25" {ICE}LISP>ACE-PRIM.;3 11267 changes to: (FNS ACE.SCAN.PRIMBLOCKS ACE.FETCH.BLOCK ACE.MAX.REGIONS ACE.PICK.BEST.REGION ACE.COMPUTE.AREA ACE.COMPILE.FRAME ACE.EXTRACT) previous date: "20-Jun-85 10:39:15" {ICE}LISP>ACE-PRIM.;2) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT ACE-PRIMCOMS) (RPAQQ ACE-PRIMCOMS ((* COMPILER STUFF) (VARS ACE.PIXPERWORD ACE.BITMAP.MASK) (* LOW LEVEL COMPILER FNS) (FNS ACE.COMPILE.FRAME ACE.EXTRACT ACESETTHRESHOLD) (* REGION MAXING ROUTINES) (FNS ACE.MAX.REGIONS ACE.PICK.BEST.REGION ACE.COMPUTE.AREA) (* LOW LEVEL BITMAP COMPARISON) (FNS ACE.SCAN.BITMAPS ACE.SCAN.PRIMBLOCKS ACE.FETCH.BLOCK))) (* COMPILER STUFF) (RPAQQ ACE.PIXPERWORD 16) (RPAQ ACE.BITMAP.MASK (READARRAY 16 (QUOTE SMALLPOSP) 0)) (65535 32768 49152 57344 61440 63488 64512 65024 65280 65408 65472 65504 65520 65528 65532 65534 NIL ) (* LOW LEVEL COMPILER FNS) (DEFINEQ (ACE.COMPILE.FRAME [LAMBDA (BM.ORIG BM.CHANGED VERTICAL.BLOCK THRESHOLD) (* MJD "28-May-86 16:35") (* MAIN ENTRY POINT FOR DIFFERENTIAL BITMAP COMPILING) (* WARNING: NO ERROR CHECKING DONE FROM HERE DOWN!) (* RETURNS A FRAMEPATCH LIST OF ACTUAL BITMAP CHANGES) (* RETURN FORMAT: ((BM X . Y)  (BM X . Y) ...)) (PROG (CHANGES) (SETQ CHANGES (ACE.SCAN.BITMAPS BM.ORIG BM.CHANGED VERTICAL.BLOCK)) (AND CHANGES (SETQ CHANGES (ACE.MAX.REGIONS CHANGES THRESHOLD))) (SETQ CHANGES (ACE.EXTRACT CHANGES BM.CHANGED)) (ACE.UPD.CONTROL.WINDOW (QUOTE OPERATION) "DONE") (RETURN CHANGES]) (ACE.EXTRACT [LAMBDA (REGIONS BITMAP) (* MJD "28-May-86 13:12") (* TAKES LIST OF REGIONS OF CHANGED AREAS AND MAKES  INTO ACTUAL FRAMEPATCH LIST BY EXTRACTING FROM NEW BM) (PROG (TEMP.BITMAP LEFT BOTTOM WIDTH HEIGHT (FRAMEBLITLIST (CONS))) [COND ((NULL REGIONS) NIL) (T (for X in REGIONS do (BLOCK) (SETQ LEFT (fetch (REGION LEFT) of X)) (SETQ BOTTOM (fetch (REGION BOTTOM) of X)) (SETQ WIDTH (fetch (REGION WIDTH) of X)) (SETQ HEIGHT (fetch (REGION HEIGHT) of X)) (SETQ TEMP.BITMAP (BITMAPCREATE WIDTH HEIGHT 1)) (BITBLT BITMAP LEFT BOTTOM TEMP.BITMAP 0 0 WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (NCONC1 FRAMEBLITLIST (create ACE.BLIT BITMAP _ TEMP.BITMAP XCOOR _ LEFT YCOOR _ BOTTOM] (RETURN (CDR FRAMEBLITLIST]) (ACESETTHRESHOLD [LAMBDA NIL (* MD "19-Jun-85 15:46") (PROG NIL LOOP(SETQ ACE.AREA.THRESHOLD (RNUMBER (CONCAT "Compression factor(0-100), currently " ACE.AREA.THRESHOLD ": "))) (IF (OR (ILESSP ACE.AREA.THRESHOLD 0) (IGREATERP ACE.AREA.THRESHOLD 100)) THEN (GO LOOP)) (RETURN ACE.AREA.THRESHOLD]) ) (* REGION MAXING ROUTINES) (DEFINEQ (ACE.MAX.REGIONS [LAMBDA (REGIONS THRESHOLD) (* MJD "28-May-86 13:11") (* Merges the changed regions picked out by ACE.SCAN.BITMAPS; REGIONS are small areas of change, THRESHOLD  specifies how much bitmap area must by "good" for a combination (i.e. 100 - THRESHOLD is how much space may be wasted in combining two REGIONS); Both ARGS required!) (* RETURNS A LIST OF (REGION REGION ...)) (PROG (BEST.POSS) LOOP(BLOCK) (COND [(IGREATERP (LENGTH REGIONS) 1) (SETQ BEST.POSS (ACE.PICK.BEST.REGION REGIONS)) (COND ((IGEQ (CADDR BEST.POSS) THRESHOLD) (NCONC1 REGIONS (CONS (UNIONREGIONS (CAAR BEST.POSS) (CAADR BEST.POSS)) (CADDR BEST.POSS))) (DREMOVE (CAR BEST.POSS) REGIONS) (DREMOVE (CADR BEST.POSS) REGIONS)) (T (GO DONE] (T (GO DONE))) (GO LOOP) DONE(RETURN (for X in REGIONS collect (CAR X]) (ACE.PICK.BEST.REGION [LAMBDA (REGIONS) (* MJD "28-May-86 13:11") (* SLOWest part of animation! Selects the most efficient (i.e. least amount of wasted space resulting from  combining two regions) combination of two regions from REGIONS; First tries to find 100% match up; failing that goes for highest efficiency) (PROG (EFFICIENCY BEST.SO.FAR) [COND [(for X in REGIONS thereis (AND (EQP (CDR X) 100) (for Y in (CDR (MEMB X REGIONS)) thereis (AND (PROG1 T (BLOCK)) (EQP (CDR Y) 100) [OR [AND (EQP (fetch (REGION LEFT) of (CAR X)) (fetch (REGION LEFT) of (CAR Y))) (OR [EQP (fetch (REGION BOTTOM) of (CAR Y)) (ADD1 (fetch (REGION TOP) of (CAR X] (EQP (ADD1 (fetch (REGION TOP) of (CAR Y))) (fetch (REGION BOTTOM) of (CAR X] (AND (EQP (fetch (REGION BOTTOM) of (CAR X)) (fetch (REGION BOTTOM) of (CAR Y))) (OR [EQP (fetch (REGION LEFT) of (CAR Y)) (ADD1 (fetch (REGION RIGHT) of (CAR X] (EQP (ADD1 (fetch (REGION RIGHT) of (CAR Y))) (fetch (REGION LEFT) of (CAR X] (SETQ BEST.SO.FAR (LIST X Y 100] (T (SETQ BEST.SO.FAR (QUOTE (NIL NIL -1))) (for X in REGIONS do (for Y in (CDR (MEMB X REGIONS)) do ((SETQ EFFICIENCY (IQUOTIENT [ITIMES 100 (IPLUS (ACE.COMPUTE.AREA (CAR X) (CDR X)) (ACE.COMPUTE.AREA (CAR Y) (CDR Y] (ACE.COMPUTE.AREA (UNIONREGIONS (CAR X) (CAR Y)) 100))) (AND (IGREATERP EFFICIENCY (CADDR BEST.SO.FAR)) (SETQ BEST.SO.FAR (LIST X Y EFFICIENCY] (RETURN BEST.SO.FAR]) (ACE.COMPUTE.AREA [LAMBDA (REGION EFF) (* MJD "28-May-86 13:10") (BLOCK) (IQUOTIENT (ITIMES (ffetch (REGION WIDTH) of REGION) (ffetch (REGION HEIGHT) of REGION) EFF) 100]) ) (* LOW LEVEL BITMAP COMPARISON) (DEFINEQ (ACE.SCAN.BITMAPS [LAMBDA (BM.ORIG BM.NEW BLOCKINGHEIGHT) (* PmT "25-Apr-85 15:14") (* Compares BM.ORIG and BM.NEW in one word (ACE.PIXPERWORD bits; 16) by BLOCKINGHEIGHT rectangles. Note masking when get to last word in bitmap and compression of region below ACE.PIXPERWORD  (16); All ARGS required; BM.ORIG and BM.NEW must have the same dimensions!) (* RETURNS A LIST OF TYPE (REGION . 100)) (PROG [TEMP.ENTRY (BM.WIDTH (ffetch BITMAPWIDTH of BM.ORIG)) (CHANGED.REGIONS (CONS)) (RASTERWIDTH (SUB1 (ffetch BITMAPRASTERWIDTH of BM.ORIG))) (HEIGHT (SUB1 (ffetch BITMAPHEIGHT of BM.ORIG))) (ALLMASK (ELT ACE.BITMAP.MASK 0)) (PARTIALMASK (ELT ACE.BITMAP.MASK (IMOD (ffetch BITMAPWIDTH of BM.ORIG) ACE.PIXPERWORD] [while (ILESSP Y HEIGHT) bind (Y _ 0) do [for HORZ.BLOCK from 0 to RASTERWIDTH do (AND [SETQ TEMP.ENTRY (COND ((EQP HORZ.BLOCK RASTERWIDTH) (ACE.SCAN.PRIMBLOCKS BM.ORIG BM.NEW HORZ.BLOCK Y BLOCKINGHEIGHT PARTIALMASK)) (T (ACE.SCAN.PRIMBLOCKS BM.ORIG BM.NEW HORZ.BLOCK Y BLOCKINGHEIGHT ALLMASK] (NCONC1 CHANGED.REGIONS (CONS [CREATEREGION (ITIMES HORZ.BLOCK ACE.PIXPERWORD) (CAR TEMP.ENTRY) (IMIN ACE.PIXPERWORD (IDIFFERENCE BM.WIDTH (ITIMES HORZ.BLOCK ACE.PIXPERWORD))) (ADD1 (IDIFFERENCE (CDR TEMP.ENTRY) (CAR TEMP.ENTRY] 100] (SETQ Y (IPLUS Y BLOCKINGHEIGHT)) (SETQ BLOCKINGHEIGHT (IMIN BLOCKINGHEIGHT (ADD1 (IDIFFERENCE HEIGHT Y] (RETURN (CDR CHANGED.REGIONS]) (ACE.SCAN.PRIMBLOCKS [LAMBDA (BM1 BM2 WORDOFFSET Y0 BLOCKH MASK) (* MJD "28-May-86 13:05") (* Does the actual comparison of primitive areas in the two bitmaps BM1 and BM2 ; WORDOFFSET is the raster word  offset; Y0 is the low scanline and (IPLUS Y0 BLOCKH) is the hi one; MASK is usually $FFFF, otherwise it is used to  ignore extra bits trailing off the end of the last raster word) (PROG [TEMP1 (MAXY (SUB1 (IPLUS Y0 BLOCKH] [SETQ TEMP1 (for Y from Y0 to MAXY thereis (NOT (EQP (LOGAND (LOGXOR (ACE.FETCH.BLOCK BM1 WORDOFFSET Y) (ACE.FETCH.BLOCK BM2 WORDOFFSET Y)) MASK) 0] (RETURN (AND TEMP1 (CONS TEMP1 (for Y from MAXY to TEMP1 by -1 thereis (NOT (EQP (LOGAND (LOGXOR (ACE.FETCH.BLOCK BM1 WORDOFFSET Y) (ACE.FETCH.BLOCK BM2 WORDOFFSET Y)) MASK) 0]) (ACE.FETCH.BLOCK [LAMBDA (BITMAP WORDOFFSET VERTICAL) (* MJD "28-May-86 13:04") (* Nabs a word from bitmap on line VERTICAL with word  offset WORDOFFSET) (BLOCK) (\GETBASE (\ADDBASE (ffetch BITMAPBASE of BITMAP) (ITIMES (IDIFFERENCE (ffetch BITMAPHEIGHT of BITMAP) (ADD1 VERTICAL)) (ffetch BITMAPRASTERWIDTH of BITMAP))) WORDOFFSET]) ) (PUTPROPS ACE-PRIM COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (1061 3539 (ACE.COMPILE.FRAME 1071 . 2018) (ACE.EXTRACT 2020 . 3087) (ACESETTHRESHOLD 3089 . 3537)) (3575 7485 (ACE.MAX.REGIONS 3585 . 4741) (ACE.PICK.BEST.REGION 4743 . 7211) ( ACE.COMPUTE.AREA 7213 . 7483)) (7526 11188 (ACE.SCAN.BITMAPS 7536 . 9541) (ACE.SCAN.PRIMBLOCKS 9543 . 10652) (ACE.FETCH.BLOCK 10654 . 11186))))) STOP \ No newline at end of file diff --git a/lispusers/ACE.TEDIT b/lispusers/ACE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b1eaace851959dffc7f8ca16279cf4bb75d38477 GIT binary patch literal 36207 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.;2| 4326 changes to%: (FILES LOOKUPINFILES) previous date%: "19-Nov-86 15:02:45" |{FS8:PARC:XEROX}LISP>ADDRESSBOOK.;1|) (* " Copyright (c) 1986, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT ADDRESSBOOKCOMS) (RPAQQ ADDRESSBOOKCOMS ((FNS MakeAddressBook) (INITVARS (*Address-Book-Pos* (create POSITION XCOORD _ 970 YCOORD _ (DIFFERENCE SCREENHEIGHT 90))) (*Address-Book-Region* (CREATEREGION 300 (DIFFERENCE SCREENHEIGHT 500) 400 200)) (*AddressBookFiles* (COND ((BOUNDP (QUOTE PHONELISTFILES)) PHONELISTFILES)))) (VARS AddressBookBM AddressBookMask) (FILES LOOKUPINFILES) (P (MakeAddressBook))) ) (DEFINEQ (MakeAddressBook (LAMBDA NIL (* dgb%: "19-Nov-86 10:34") (* * Create a lookup window for address books) (MakeLookupWindow *AddressBookFiles* (QUOTE Address% Book) *Address-Book-Region* AddressBookBM AddressBookMask *Address-Book-Pos*)) ) ) (RPAQ? *Address-Book-Pos* (create POSITION XCOORD _ 970 YCOORD _ (DIFFERENCE SCREENHEIGHT 90))) (RPAQ? *Address-Book-Region* (CREATEREGION 300 (DIFFERENCE SCREENHEIGHT 500) 400 200)) (RPAQ? *AddressBookFiles* (COND ((BOUNDP (QUOTE PHONELISTFILES)) PHONELISTFILES))) (RPAQQ AddressBookBM #*(50 87)@COOOOOOOOO@@@@@@OOOOOOOOOOL@@@@AN@@@@@@@@AN@@@@CH@@@@@@@@@G@@@@G@@@@@@@@@@CH@@@F@@@@@@@@@@AH@@@NCOOOOOOOOOAL@@@LB@@@@@B@AA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@GOHL@@@LB@@@@@B@OOHL@@@LB@@@@@BAOOHL@@@LB@@@@@BC@GHL@@@LB@@@@@BAOOHL@@@LB@@@@@B@OOHL@@@LB@@@@@B@GOHL@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@BAIA@L@@@LB@@@@@BAIA@L@@@LB@@@@@B@AA@L@@@LB@@@@@B@AA@L@@@LB@@@@@COOA@L@@@LB@@@@@@@@A@L@@@LB@@@@@@@@A@L@@@LB@@@@@@@@A@L@@@LB@@@@@@@@A@L@@@LB@@@@@@@@A@L@@@LCOOOOOOOOO@L@@@N@@D@@@@@H@AL@@@F@@D@@@@@H@AH@@@G@@D@@@@@H@CH@@@CH@GOOOOOH@G@@@@AN@@@@@@@@AN@@@@@OOOOOOOOOOL@@@@@COOOOOOOOO@@@@@ ) (RPAQQ AddressBookMask #*(50 87)@COOOOOOOOO@@@@@@OOOOOOOOOOL@@@@AOOOOOOOOOON@@@@COOOOOOOOOOO@@@@GOOOOOOOOOOOH@@@GOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOH@@@GOOOOOOOOOOOH@@@GOOOOOOOOOOO@@@@COOOOOOOOOON@@@@AOOOOOOOOOOL@@@@@OOOOOOOOOOH@@@@@COOOOOOOON@@@@@ ) (FILESLOAD LOOKUPINFILES) (MakeAddressBook) (PUTPROPS ADDRESSBOOK COPYRIGHT ("Xerox Corporation" 1986 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (798 1051 (MakeAddressBook 808 . 1049))))) STOP \ No newline at end of file diff --git a/lispusers/ADDRESSBOOK.TEDIT b/lispusers/ADDRESSBOOK.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..76d388341382f253936a1f05bcee8b1515ae1164 GIT binary patch literal 16442 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.;1 37025 changes to%: (VARS AIREGIONSCOMS) previous date%: " 9-Mar-87 16:37:52" {DANTE}LYRIC>AIREGIONS.;1) (* " Copyright (c) 1985, 1986, 1987 by XEROX Corporation. All rights reserved. ") (PRETTYCOMPRINT AIREGIONSCOMS) (RPAQQ AIREGIONSCOMS [(FILES FILLREGION) (FNS ADD.IREGION ALL.IREGIONS CREATEIR REMOVE.IREGION DOSELECTED.IREGION EDIT.MASK IREGIONP IREGIONPROP SHOW.ALL.IREGIONS INTERSECTING.IREGIONS? INVERT.IREGION WHICH.IREGIONS SURROUNDIR) (FNS IN.CURSOR.REGION \IR.CLIP.REGION \IR.SHOW.REGION \VALID.POSITION.LIST \SAME.IREGIONS.LIST \WITH.INTERSECTION \IREGION.ON.WINDOWP) (RECORDS IREGION) (PROP ARGNAMES IREGIONPROP) (VARS (DEFAULT.IREGION.SHADE 65535)) (GLOBALVARS DEFAULT.IREGION.SHADE) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA IREGIONPROP]) (FILESLOAD FILLREGION) (DEFINEQ (ADD.IREGION [LAMBDA (WINDOW IREGION) (* GWexler " 7-Feb-86 10:22") (if (AND (NOT (\IREGION.ON.WINDOWP IREGION WINDOW)) (IREGIONP IREGION) (WINDOWP WINDOW)) then (WINDOWPROP WINDOW 'BUTTONEVENTFN 'IN.CURSOR.REGION) (WINDOWADDPROP WINDOW 'IREGIONSLIST IREGION T) IREGION]) (ALL.IREGIONS [LAMBDA (WINDOW) (* GWexler " 7-Feb-86 10:23") (* * This function returns all the IREGIONs of WINDOW.) (if (WINDOWP WINDOW) then (WINDOWPROP WINDOW 'IREGIONSLIST) else NIL]) (CREATEIR [LAMBDA (WINDOW SHADE BUTTONEVENTFN HELPSTRING REGION POSLIST) (* GWexler " 7-Feb-86 10:30") (* * This function is the top-level interface to creating IREGIONS and  associating them with a given window.) (PROG (TEMP-REGION TEMP-BITMAP POS MASK POSITIONS) (* If WINDOW is not a window, then return.  If the user wants just an IREGION record, he/she should use  (create IREGION BUTTONEVENTFN _ ??? USERDATA _ ??? REGION _ ??? MASK _ ???  SHADE _ ??? HELPSTRING _ ???)) (OR (WINDOWP WINDOW) (RETURN NIL)) (WINDOWPROP WINDOW 'BUTTONEVENTFN 'IN.CURSOR.REGION) (SETQ TEMP-REGION (if (REGIONP REGION) then (* Here, the user passes us a REGION relative to WINDOW and we translate it to  screen coordinates. (We need this in screen coordinates since that is what  GETREGION returns.)) (LIST [IPLUS (CAR REGION) (CAR (WINDOWPROP WINDOW 'REGION] [IPLUS (CADR REGION) (CADR (WINDOWPROP WINDOW 'REGION] (CADDR REGION) (CADDDR REGION)) else (* If REGION was not a region, then we prompt the user for one.) (PROMPTPRINT "Please closely surround the irregular region " "without cutting off the region's borders") (TOTOPW WINDOW) (GETREGION))) (* Here, we clip TEMP-REGION so that it fits inside the window so that we don't  waste any space with too large bitmaps. If the region did not fall inside the  window at all, then \IR.CLIP.REGION returns NIL and we return from CREATEIR.) (SETQ TEMP-REGION (OR (\IR.CLIP.REGION TEMP-REGION WINDOW) (RETURN NIL))) (* We create two bitmaps the size of TEMP-REGION that will contain the mask for  the IREGION. We need one extra just for temporary storage in CREATEIR.) (SETQ TEMP-BITMAP (BITMAPCREATE (CADDR TEMP-REGION) (CADDDR TEMP-REGION) 1)) (* We save the window image in  TEMP-REGION in TEMP-BITMAP.) (TOTOPW WINDOW) (BITBLT WINDOW (CAR TEMP-REGION) (CADR TEMP-REGION) TEMP-BITMAP 0 0) (* MASK is just a copy of TEMP-BITMAP) (SETQ MASK (BITMAPCOPY TEMP-BITMAP)) (* The user can pass either NIL or a list of positions to fill from in the  argument POSLIST. \VALID.POSITION.LIST returns either NIL %, ERROR, or a list  of positions. ERROR means to abort the call to CREATEIR since POSLIST was not  in any valid form.) (SETQ POSITIONS (\VALID.POSITION.LIST POSLIST)) (OR (NOT (EQ 'ERROR POSITIONS)) (RETURN NIL)) (* If the user did not specify POSLIST %, then we box out TEMP-REGION to let  him/her know where they are working.) (OR POSITIONS (\IR.SHOW.REGION WINDOW TEMP-REGION)) [if (NOT POSITIONS) then (* This part prompts for positions to area fill from until the user buttons  outside of TEMP-REGION.) (PROMPTPRINT "Point your mouse to the inside of the region and " "left-button the irregular shapes in that region. " "To stop selection(s), left-button anywhere away " "from the squared-off region.") (TOTOPW WINDOW) (until (NOT (INSIDEP TEMP-REGION (CAR (SETQ POS (GETPOSITION WINDOW))) (CDR POS))) do (FILL.REGION MASK (CONS (IDIFFERENCE (CAR POS) (CAR TEMP-REGION)) (IDIFFERENCE (CDR POS) (CADR TEMP-REGION))) 65535) (* Show in WINDOW, what was just  filled.) (BITBLT MASK 0 0 WINDOW (CAR TEMP-REGION) (CADR TEMP-REGION)) (TOTOPW WINDOW)) else (* Here, the user has given us a list of positions, and we just go through each  one and fill.) (for P in POSITIONS do (if (INSIDEP TEMP-REGION P) then (FILL.REGION MASK (CONS (IDIFFERENCE (CAR P) (CAR TEMP-REGION)) (IDIFFERENCE (CDR P) (CADR TEMP-REGION))) 65535] (PROMPTPRINT) (* Unbox the region if need be.) (OR POSITIONS (\IR.SHOW.REGION WINDOW TEMP-REGION)) (* Set up MASK to have only black where the area fill filled.) (BITBLT TEMP-BITMAP 0 0 MASK 0 0 NIL NIL 'INPUT 'ERASE) (* Restore the window to its original  image.) (BITBLT TEMP-BITMAP 0 0 WINDOW (CAR TEMP-REGION) (CADR TEMP-REGION)) (* Add the appropriate IREGION to the  windows IREGIONSLIST...) (RETURN (ADD.IREGION WINDOW (create IREGION BUTTONEVENTFN _ BUTTONEVENTFN USERDATA _ NIL REGION _ TEMP-REGION MASK _ MASK SHADE _ (if (NOT (OR (NUMBERP SHADE) (BITMAPP SHADE))) then DEFAULT.IREGION.SHADE else SHADE) HELPSTRING _ HELPSTRING]) (REMOVE.IREGION [LAMBDA (WINDOW IREGION) (* GWexler " 7-Feb-86 10:24") (* Given a window and an IREGION, remove it from that windows IREGIONSLIST) (if (\IREGION.ON.WINDOWP IREGION WINDOW) then (WINDOWDELPROP WINDOW 'IREGIONSLIST IREGION) IREGION]) (DOSELECTED.IREGION [LAMBDA (WINDOW IREGION BUTTON) (* GWexler " 7-Feb-86 10:24") (if (AND (\IREGION.ON.WINDOWP IREGION WINDOW) (IREGIONPROP IREGION 'BUTTONEVENTFN)) then (APPLY* (IREGIONPROP IREGION 'BUTTONEVENTFN) WINDOW IREGION BUTTON]) (EDIT.MASK [LAMBDA (IREGION) (* GWexler " 7-Feb-86 10:24") (* A way of simply editing the MASK of an IREGION) (if (IREGIONP IREGION) then (EDITBM (fetch (IREGION MASK) of IREGION]) (IREGIONP [LAMBDA (IREGION) (* GWexler " 7-Feb-86 10:24") (* Tests to see if IREGION is a valid IREGION.  Returns IREGION if true NIL otherwise.) (if (type? IREGION IREGION) then IREGION else NIL]) (IREGIONPROP [LAMBDA X (* GWexler " 7-Feb-86 10:24") (* Modeled after WINDOWPROP. This is a convenient way of associating  information with an IREGION. If the property of the IREGION is not one of the  fields, then it is stored on the USERDATA field in property list format.) (PROG (IREGION PROP NEWVALUE) (SETQ IREGION (ARG X 1)) (SETQ PROP (ARG X 2)) (* Abort if we do not have an IREGION.) (OR (IREGIONP IREGION) (RETURN NIL)) (if (EQ X 3) then (* In this case, we have a value to set, so do replaces or LISTPUTs.) (SETQ NEWVALUE (ARG X 3)) [if [NOT (MEMB PROP (RECORDFIELDNAMES 'IREGION] then (* In this case, we store the property on the USERDATA field.) (if (NOT (fetch (IREGION USERDATA) of IREGION)) then (* If USERDATA is NIL, we need to set it to  (PROPNAME VALUE)) (replace (IREGION USERDATA) of IREGION with (LIST PROP NEWVALUE) ) else (* USERDATA should already be in proplist format so just do a LISTPUT) (LISTPUT (fetch (IREGION USERDATA) of IREGION) PROP NEWVALUE)) [if (NOT NEWVALUE) then (replace (IREGION USERDATA) of IREGION with (for X on (fetch (IREGION USERDATA) of IREGION) by (CDDR X) when (NOT (EQ (CAR X) PROP)) join (LIST (CAR X) (CADR X] (RETURN NEWVALUE) else (* Here, PROP is one of the IREGIONS fields, so we just replace it.) (RETURN (SELECTQ PROP (BUTTONEVENTFN (replace (IREGION BUTTONEVENTFN) of IREGION with NEWVALUE)) (USERDATA (replace (IREGION USERDATA) of IREGION with NEWVALUE)) (REGION (replace (IREGION REGION) of IREGION with NEWVALUE)) (MASK (replace (IREGION MASK) of IREGION with NEWVALUE)) (SHADE (replace (IREGION SHADE) of IREGION with NEWVALUE)) (HELPSTRING (replace (IREGION HELPSTRING) of IREGION with NEWVALUE)) (ERROR "Not a valid IREGION prop: " PROP] else (* No NEWVALUE was specified so we just want to fetch the right info.) (if [NOT (MEMB PROP (RECORDFIELDNAMES 'IREGION] then (* PROP is not one of IREGIONs fields, so we need to get it off of USERDATA) (RETURN (LISTGET (fetch (IREGION USERDATA) of IREGION) PROP)) else (* Simply fetch the right field of  IREGION.) (RETURN (SELECTQ PROP (BUTTONEVENTFN (fetch (IREGION BUTTONEVENTFN) of IREGION)) (USERDATA (fetch (IREGION USERDATA) of IREGION)) (REGION (fetch (IREGION REGION) of IREGION)) (MASK (fetch (IREGION MASK) of IREGION)) (SHADE (fetch (IREGION SHADE) of IREGION)) (HELPSTRING (fetch (IREGION HELPSTRING) of IREGION)) (ERROR "Not a valid IREGION prop: " PROP]) (SHOW.ALL.IREGIONS [LAMBDA (WINDOW SHADE DELAY) (* GWexler " 7-Feb-86 10:24") (* This function cycles through each IREGION on WINDOW and flashes it in black  and waits DELAY milliseconds. There is code here to do the right thing when the  user aborts.) (LET ((IRS (ALL.IREGIONS WINDOW))) (for X in IRS do (RESETLST [RESETSAVE NIL (LIST 'IREGIONPROP X 'SHADE (IREGIONPROP X 'SHADE] (IREGIONPROP X 'SHADE (OR SHADE 65535)) (INVERT.IREGION WINDOW X) (RESETSAVE NIL (LIST 'INVERT.IREGION WINDOW X)) (BLOCK (OR (NUMBERP DELAY) 500]) (INTERSECTING.IREGIONS? [LAMBDA (WINDOW FLG) (* GWexler " 7-Feb-86 10:24") (* This sets up WINDOW to specify whether or not its overlapping active regions  all get called when buttoned in the overlapping area %.  NIL means no overlapping and T means yes.) (WINDOWPROP WINDOW 'IR.INTERSECTIONFLG FLG]) (INVERT.IREGION [LAMBDA (WINDOW IREGION) (* GWexler " 7-Feb-86 10:25") (* Simply inverts IREGION associated with WINDOW %.  Doesn't do anything if IREGION is not on the window's IREGIONLIST.) (if (\IREGION.ON.WINDOWP IREGION WINDOW) then (TOTOPW WINDOW) (BITBLT (fetch (IREGION MASK) of IREGION) 0 0 WINDOW (CAR (fetch (IREGION REGION) of IREGION)) (CADR (fetch (IREGION REGION) of IREGION)) NIL NIL 'MERGE 'INVERT (fetch (IREGION SHADE) of IREGION]) (WHICH.IREGIONS [LAMBDA (WINDOW POSORX Y) (* GWexler " 7-Feb-86 10:25") (* Returns all the IREGIONS of WINDOW in a list.  NIL if there were none.) (* * IF CURSOR IN REGION'S WINDOW AND REGION'S MASK, IDENTIFY REGION) (* * X AND Y are optional arguments. Same with WINDOW.  The user could just say (WHICHIR) and it would notice where it is, or  Programmatically, the user could pass a window and an X and Y to get which  Iregion.) (LET* [(W (OR (WINDOWP WINDOW) (WHICHW))) (POSITION (if (POSITIONP POSORX) then POSORX else (if (OR (NOT (NUMBERP POSORX)) (NOT (NUMBERP Y))) then (CONS (LASTMOUSEX W) (LASTMOUSEY W)) else (CONS POSORX Y] (for SOME-IREGION in (WINDOWPROP W 'IREGIONSLIST) when [NOT (ZEROP (BITMAPBIT (fetch (IREGION MASK) of SOME-IREGION) (IDIFFERENCE (CAR POSITION) (CAR (fetch (IREGION REGION) of SOME-IREGION))) (IDIFFERENCE (CDR POSITION) (CADR (fetch (IREGION REGION) of SOME-IREGION] collect SOME-IREGION]) (SURROUNDIR [LAMBDA (WINDOW SHADE BUTTONEVENTFN HELPSTRING POSLIST INSIDE.POS) (* GWexler " 7-Feb-86 10:46") (* * This function is the top-level interface to creating IREGIONS inwhich the  innereds specified are ignored and the entire surround regions becomes the  AIREGION which is associated with the given window) (PROG (TEMPW TEMP-REGION TEMP-BITMAP POS MASK POSITIONS POINTS.LST TEMPPOS) (* If WINDOW is not a window, then return.  If the user wants just an IREGION record, he/she should use  (create IREGION BUTTONEVENTFN _ ??? USERDATA _ ??? REGION _ ??? MASK _ ???  SHADE _ ??? HELPSTRING _ ???)) (OR (WINDOWP WINDOW) (RETURN NIL)) (WINDOWPROP WINDOW 'BUTTONEVENTFN 'IN.CURSOR.REGION) (PROMPTPRINT "Please button the area around the particular region. To end, hold the SHIFT key when hitting the last point with the mouse." ) (FLASHWINDOW PROMPTWINDOW 2) (TOTOPW WINDOW) [OR (LISTP POSLIST) (while [AND (NOT (KEYDOWNP 'LSHIFT)) (NOT (KEYDOWNP 'RSHIFT] do [SETQ POSLIST (APPEND POSLIST (LIST (SETQ TEMPPOS (GETPOSITION WINDOW] (BITBLT (CAR CROSSHAIRS) 0 0 WINDOW (DIFFERENCE (CAR TEMPPOS) (CADR CROSSHAIRS)) (DIFFERENCE (CDR TEMPPOS) (CDDR CROSSHAIRS)) NIL NIL 'INPUT 'INVERT] [OR [NLSETQ (SETQ TEMP-REGION (WINDOWPROP (SETQ TEMPW (CREATEW (LIST 0 0 (PLUS (APPLY 'MAX (for I in POSLIST collect (CAR I))) 50) (PLUS (APPLY 'MAX (for I in POSLIST collect (CDR I))) 50)) NIL NIL T)) 'REGION] (SETQ TEMP-REGION (WINDOWPROP (SETQ TEMPW (CREATEW '(0 0 10 10) NIL NIL T)) 'REGION] (PROMPTPRINT "Please button once INSIDE the region") (FLASHWINDOW PROMPTWINDOW 2) [OR (POSITIONP INSIDE.POS) (AND (SETQ INSIDE.POS (GETPOSITION WINDOW)) (for POSITION in POSLIST do (BITBLT (CAR CROSSHAIRS) 0 0 WINDOW (DIFFERENCE (CAR POSITION) (CADR CROSSHAIRS)) (DIFFERENCE (CDR POSITION) (CDDR CROSSHAIRS)) NIL NIL 'INPUT 'INVERT] (* * MAYBE TEMPORARILY XOR IT ON...) (DRAWCURVE POSLIST T 1 NIL TEMPW) (* * Note that having the window open when drawing the curve is kludgy.  In the KOTO release, DIG will be implemented in the system so rather than  having the TEMPW, use an IMAGESTREAM via OPENIMAGESTREAM and do a IMDRAWCURVE  and IMBITBLT. In this mannor, all drawing is hidden from the user and it makes  the package a lot cleaner.) (SETQ TEMP-BITMAP (BITMAPCREATE (CADDR TEMP-REGION) (CADDDR TEMP-REGION) 1)) (* We save the window image in  TEMP-REGION in TEMP-BITMAP.) (TOTOPW TEMPW) (BITBLT TEMPW (CAR TEMP-REGION) (CADR TEMP-REGION) TEMP-BITMAP 0 0) (CLOSEW TEMPW) (* MASK is just a copy of TEMP-BITMAP) (SETQ MASK (BITMAPCOPY TEMP-BITMAP)) (* The user can pass either NIL or a list of positions to fill from in the  argument POSLIST. \VALID.POSITION.LIST returns either NIL %, ERROR, or a list  of positions. ERROR means to abort the call to CREATEIR since POSLIST was not  in any valid form.) (FILL.REGION MASK (CONS (IDIFFERENCE (CAR INSIDE.POS) (CAR TEMP-REGION)) (IDIFFERENCE (CDR INSIDE.POS) (CADR TEMP-REGION))) 65535) (* (BITBLT MASK 0 0 WINDOW  (CAR TEMP-REGION) (CADR TEMP-REGION))) (* * Removing the border) (BITBLT TEMP-BITMAP 0 0 MASK 0 0 NIL NIL 'INPUT 'ERASE) (* (BITBLT TEMP-BITMAP 0 0 WINDOW  (CAR TEMP-REGION) (CADR TEMP-REGION))) (RETURN (ADD.IREGION WINDOW (create IREGION BUTTONEVENTFN _ BUTTONEVENTFN USERDATA _ NIL REGION _ TEMP-REGION MASK _ MASK SHADE _ (if (NOT (OR (NUMBERP SHADE) (BITMAPP SHADE))) then DEFAULT.IREGION.SHADE else SHADE) HELPSTRING _ HELPSTRING]) ) (DEFINEQ (IN.CURSOR.REGION [LAMBDA (WINDOW) (* GWexler " 7-Feb-86 10:27") (* This is WINDOWs BUTTONEVENTFN that gets called for windows with IREGIONS.) (* * IF CURSOR IN REGION'S WINDOW AND REGION'S MASK, SHADE REGION) (PROG [OLD-REGIONS TEMPX TEMPY BUTTON ALLREADY.PROMPT (TIMEOUT.WAIT 1500) (TIMEOUT (SETUPTIMER 1500 NIL 'TICKS 'MILLISECONDS)) (INTERSECTIONFLG (WINDOWPROP WINDOW 'IR.INTERSECTIONFLG] (TOTOPW WINDOW) (* OLD-REGIONS starts out to be all the IREGIONS currently pointed to.  \WITH.INTERSECTION is used to determine whether this is a list of all the  IREGIONS or just one.) (SETQ OLD-REGIONS (\WITH.INTERSECTION (WHICH.IREGIONS WINDOW) INTERSECTIONFLG)) (SETQ TEMPX (LASTMOUSEX WINDOW)) (SETQ TEMPY (LASTMOUSEY WINDOW)) (* Start out and invert all the IREGIONS being pointed to.) (for IR in OLD-REGIONS do (INVERT.IREGION WINDOW IR)) (* BUTTON is set so that the user can use this value.) (SETQ BUTTON (SELECTQ LASTMOUSEBUTTONS (4 'LEFT) (2 'RIGHT) (1 'MIDDLE) (NULL))) (* Now we loop until the mouse comes  back up.) [while (NOT (MOUSESTATE UP)) do (PROG NIL (if (OR (if (EQ TEMPX (SETQ TEMPX (LASTMOUSEX WINDOW))) then (EQ TEMPY (SETQ TEMPY (LASTMOUSEY WINDOW))) else (SETQ TEMPY (LASTMOUSEY WINDOW)) NIL) (\SAME.IREGIONS.LIST OLD-REGIONS (\WITH.INTERSECTION (WHICH.IREGIONS WINDOW (CONS TEMPX TEMPY)) INTERSECTIONFLG))) then (COND ((AND (NOT ALLREADY.PROMPT) (TIMEREXPIRED? TIMEOUT 'TICKS) (NOT (NULL OLD-REGIONS))) (PROMPTPRINT) (for IR in OLD-REGIONS do (printout PROMPTWINDOW (OR (fetch (IREGION HELPSTRING) of IR) "Will select this IRREGULAR region when you release the button." ) T)) (SETQ ALLREADY.PROMPT T))) else (* * WE have moved AND we are at a new Iregion) (if ALLREADY.PROMPT then (PROMPTPRINT)) (for IR in OLD-REGIONS do (INVERT.IREGION WINDOW IR)) (SETQ OLD-REGIONS (\WITH.INTERSECTION (WHICH.IREGIONS WINDOW (CONS TEMPX TEMPY)) INTERSECTIONFLG)) (for IR in OLD-REGIONS do (INVERT.IREGION WINDOW IR)) (SETQ TIMEOUT (SETUPTIMER 1500 TIMEOUT 'TICKS 'MILLISECONDS)) (SETQ ALLREADY.PROMPT NIL] (if ALLREADY.PROMPT then (PROMPTPRINT)) (for IR in OLD-REGIONS do (INVERT.IREGION WINDOW IR)) (for IR in OLD-REGIONS do (DOSELECTED.IREGION WINDOW IR BUTTON]) (\IR.CLIP.REGION [LAMBDA (REG WINDOW) (* GWexler " 7-Feb-86 10:27") (* This function takes a regions and a window and returns a new region that  fits inside the window. If region starts out completely outside of window, then  NIL is returned.) (PROG [LEFT RIGHT TOP BOTTOM (W.REG (WINDOWPROP WINDOW 'REGION] [SETQ W.REG (LIST (CAR W.REG) (CADR W.REG) [IDIFFERENCE (CADDR W.REG) (ITIMES 2 (WINDOWPROP WINDOW 'BORDER] (IDIFFERENCE (CADDDR W.REG) (ITIMES 2 (WINDOWPROP WINDOW 'BORDER] (if (OR (GREATERP (fetch (REGION LEFT) of REG) (fetch (REGION PRIGHT) of W.REG)) (GREATERP (fetch (REGION BOTTOM) of REG) (fetch (REGION PTOP) of W.REG)) (ILESSP (fetch (REGION PRIGHT) of REG) (fetch (REGION LEFT) of W.REG)) (ILESSP (fetch (REGION PTOP) of REG) (fetch (REGION BOTTOM) of W.REG))) then (printout T "None of the region was inside the window." T) (RETURN NIL)) (SETQ LEFT (IMAX (fetch (REGION LEFT) of REG) (fetch (REGION LEFT) of W.REG))) (SETQ RIGHT (IMIN (fetch (REGION PRIGHT) of REG) (fetch (REGION PRIGHT) of W.REG))) (SETQ TOP (IMIN (fetch (REGION PTOP) of REG) (fetch (REGION PTOP) of W.REG))) (SETQ BOTTOM (IMAX (fetch (REGION BOTTOM) of REG) (fetch (REGION BOTTOM) of W.REG))) (RETURN (LIST (IDIFFERENCE LEFT (fetch (REGION LEFT) of W.REG)) (IDIFFERENCE BOTTOM (fetch (REGION BOTTOM) of W.REG)) (IDIFFERENCE RIGHT LEFT) (IDIFFERENCE TOP BOTTOM]) (\IR.SHOW.REGION [LAMBDA (WINDOW REGION) (* GWexler " 7-Feb-86 10:27") (* This function draws a box specified by REGION on WINDOW using invert mode.) (LET ((REG (COPY REGION)) (W (IPLUS (CADDR REGION) (CAR REGION) 1)) (H (IPLUS (CADDDR REGION) (CADR REGION) 1))) (RPLACA REG (SUB1 (CAR REG))) (RPLACA (CDR REG) (SUB1 (CADR REG))) (DRAWLINE (CAR REG) (CADR REG) W (CADR REG) 1 'INVERT WINDOW) (DRAWLINE (CAR REG) H W H 1 'INVERT WINDOW) (DRAWLINE (CAR REG) (CADR REG) (CAR REG) H 1 'INVERT WINDOW) (DRAWLINE W (CADR REG) W H 1 'INVERT WINDOW]) (\VALID.POSITION.LIST [LAMBDA (POSITIONLIST) (* GWexler " 7-Feb-86 10:34") (* Checks out to see if POSITIONLIST is either NIL a valid position, or a list  of valid positions. Returns either NIL ERROR or a list of positions  (maybe only one element list.)) (if (NOT POSITIONLIST) then NIL else (if (POSITIONP POSITIONLIST) then (LIST POSITIONLIST) else (if (LISTP POSITIONLIST) then (if (for P in POSITIONLIST always (POSITIONP P)) then POSITIONLIST else (printout T "Not all elements in this list are positions." T) 'ERROR) else (printout T "POSITIONLIST must be NIL, a position, or a list of positions." T) 'ERROR]) (\SAME.IREGIONS.LIST [LAMBDA (LIST1 LIST2) (* GWexler " 7-Feb-86 10:27") (* Tests to see if two lists of regions are lists of the same regions.) (if (NEQ (LENGTH LIST1) (LENGTH LIST2)) then NIL else (for ELT in LIST1 always (FMEMB ELT LIST2]) (\WITH.INTERSECTION [LAMBDA (IRLIST FLG) (* GWexler " 7-Feb-86 10:34") (* If FLG is T then return IRLIST, otherwise return NIL or a list with just one  element.) (if FLG then IRLIST else (if (NOT IRLIST) then NIL else (LIST (CAR IRLIST]) (\IREGION.ON.WINDOWP [LAMBDA (IREGION WINDOW) (* GWexler " 7-Feb-86 10:27") (if [AND (IREGIONP IREGION) (WINDOWP WINDOW) (FMEMB IREGION (WINDOWPROP WINDOW 'IREGIONSLIST] then IREGION else NIL]) ) (DECLARE%: EVAL@COMPILE (DATATYPE IREGION (BUTTONEVENTFN (* The users function to be called.) USERDATA (* This is where the users data is kept in proplist format.) REGION (* The region relative to the window where the IREGION is located.) MASK (* The mask is the same size as region and contains black where ever the  IREGION is to be active.) SHADE (* The shade which IREGION inverts to  %.) HELPSTRING (* The helpstring to be printed when the button is held down in this IREGION) ) (* there used to be a TYPE? here but it was useless and removed) ) ) (/DECLAREDATATYPE 'IREGION '(POINTER POINTER POINTER POINTER POINTER POINTER) '((IREGION 0 POINTER) (IREGION 2 POINTER) (IREGION 4 POINTER) (IREGION 6 POINTER) (IREGION 8 POINTER) (IREGION 10 POINTER)) '12) (PUTPROPS IREGIONPROP ARGNAMES (NIL (IREGION PROP {NEWVALUE}) . U)) (RPAQQ DEFAULT.IREGION.SHADE 65535) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DEFAULT.IREGION.SHADE) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA IREGIONPROP) ) (PUTPROPS AIREGIONS COPYRIGHT ("XEROX Corporation" 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1346 25783 (ADD.IREGION 1356 . 1755) (ALL.IREGIONS 1757 . 2056) (CREATEIR 2058 . 9584) (REMOVE.IREGION 9586 . 9944) (DOSELECTED.IREGION 9946 . 10291) (EDIT.MASK 10293 . 10586) (IREGIONP 10588 . 10913) (IREGIONPROP 10915 . 15583) (SHOW.ALL.IREGIONS 15585 . 16587) (INTERSECTING.IREGIONS? 16589 . 16998) (INVERT.IREGION 17000 . 17666) (WHICH.IREGIONS 17668 . 19254) (SURROUNDIR 19256 . 25781 )) (25784 35336 (IN.CURSOR.REGION 25794 . 30072) (\IR.CLIP.REGION 30074 . 32280) (\IR.SHOW.REGION 32282 . 33233) (\VALID.POSITION.LIST 33235 . 34254) (\SAME.IREGIONS.LIST 34256 . 34630) ( \WITH.INTERSECTION 34632 . 35031) (\IREGION.ON.WINDOWP 35033 . 35334))))) STOP \ No newline at end of file diff --git a/lispusers/AIREGIONS-DEMO b/lispusers/AIREGIONS-DEMO new file mode 100644 index 00000000..748e1234 --- /dev/null +++ b/lispusers/AIREGIONS-DEMO @@ -0,0 +1 @@ +(FILECREATED "24-Jun-85 08:59:13" {DANTE}LISP>AIREGIONS-DEMO.;3 97308 changes to: (VARS AIREGIONS-DEMOCOMS \AIR.DEMO.BM \ALL.AIR.IREGIONS) (FNS AIREGIONS.CIRCLES.DEMO SETUP.AIREGION.DEMO IREGION.DEMOFN) previous date: "23-Jun-85 18:27:53" {DANTE}LISP>AIREGIONS-DEMO.;2) (* Copyright (c) 1985 by XEROX Corporation. All rights reserved.) (PRETTYCOMPRINT AIREGIONS-DEMOCOMS) (RPAQQ AIREGIONS-DEMOCOMS ((FILES AIREGIONS) (UGLYVARS \ALL.AIR.IREGIONS) (VARS \AIR.DEMO.BM) (FNS AIREGIONS.CIRCLES.DEMO IREGION.DEMOFN SETUP.AIREGION.DEMO) (P (SETUP.AIREGION.DEMO) (AIREGIONS.CIRCLES.DEMO)))) (FILESLOAD AIREGIONS) (READVARS \ALL.AIR.IREGIONS) (({$IREGION (POINTER POINTER POINTER POINTER POINTER POINTER)IREGION.DEMOFN (NAME "Delaware") (383 151 21 24) {(READBITMAP)(21 24 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@D@@@@@@" "@D@@@@@@" "@D@@@@@@" "@F@@@@@@" "@F@@@@@@" "@G@@@@@@" "@GH@@@@@" "@G@@@@@@" "@GH@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@")} 36181 NIL } {$IREGION IREGION.DEMOFN (NAME "Rhode Island") (417 181 15 18) {(READBITMAP)(15 18 "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@" "L@@@" "L@@@" "N@@@" "O@@@" "H@@@" "@@@@" "@@@@" "@@@@" "@@@@" "@@@@")} 25343 NIL } {$IREGION IREGION.DEMOFN (NAME "Connecticut") (398 179 25 23) {(READBITMAP)(25 23 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@COOL@@@" "@COOL@@@" "@COOL@@@" "@COOL@@@" "@COOL@@@" "@COOH@@@" "@CL@@@@@" "@B@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@")} 63153 NIL } {$IREGION IREGION.DEMOFN (NAME "Massachusetts") (402 185 35 20) {(READBITMAP)(35 20 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@OOOOH@@@@@@" "AOOOO@@@@@@@" "AOOOO@@@@@@@" "AOOOO@@@@@@@" "AOOOOL@@@@@@" "COOOOL@@@@@@" "@@@@GN@@@@@@" "@@@@CN@@@@@@" "@@@@CN@@@@@@" "@@@@AOL@@@@@" "@@@@@N@@@@@@" "@@@@@B@@@@@@" "@@@@@@@@@@@@")} 48938 NIL } {$IREGION IREGION.DEMOFN (NAME "Maine") (415 200 41 60) {(READBITMAP)(41 60 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@I@@@@@@" "@@@@AOO@@@@@" "@@@@COOH@@@@" "@@@@GOOL@@@@" "@@@@OOOL@@@@" "@@@@OOON@@@@" "@@@AOOON@@@@" "@@@AOOON@@@@" "@@@AOOON@@@@" "@@@COOON@@@@" "@@@GOOON@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@@OOOOL@@@@" "@@@OOOON@@@@" "@@COOOOO@@@@" "@@COOOOO@@@@" "@@COOOOOH@@@" "@@OOOOOOH@@@" "@AOOOOOOH@@@" "@AOOOOOON@@@" "@AOOOOOON@@@" "@AOOOOOON@@@" "@AOOOOOON@@@" "@AOOOOOO@@@@" "@AOOOOOL@@@@" "@AOOOOL@@@@@" "@AOOOL@@@@@@" "@AOOOH@@@@@@" "@@OOOH@@@@@@" "@@OON@@@@@@@" "@@OOL@@@@@@@" "@@ON@@@@@@@@" "@@O@@@@@@@@@" "@@O@@@@@@@@@" "@@N@@@@@@@@@" "@@N@@@@@@@@@" "@@L@@@@@@@@@" "@@L@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 21942 NIL } {$IREGION IREGION.DEMOFN (NAME "New Hampshire") (410 195 21 34) {(READBITMAP)(21 34 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@F@@@@@" "@@F@@@@@" "@@N@@@@@" "@@N@@@@@" "@@N@@@@@" "@@N@@@@@" "@CN@@@@@" "@GN@@@@@" "@GO@@@@@" "@OO@@@@@" "@OO@@@@@" "@OO@@@@@" "AOO@@@@@" "AOO@@@@@" "COO@@@@@" "COO@@@@@" "COO@@@@@" "COO@@@@@" "COOH@@@@" "GOOL@@@@" "GOOH@@@@" "GOOH@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@")} 30297 NIL } {$IREGION IREGION.DEMOFN (NAME "Vermont") (400 199 25 33) {(READBITMAP)(25 33 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@GL@@@" "@GOOL@@@" "@GOOH@@@" "@GOOH@@@" "@GOOH@@@" "@GOO@@@@" "@GON@@@@" "@GOL@@@@" "@GOL@@@@" "@GOH@@@@" "@GOH@@@@" "@GOH@@@@" "@GO@@@@@" "@GO@@@@@" "@CN@@@@@" "@CN@@@@@" "@CN@@@@@" "@CN@@@@@" "@CN@@@@@" "@CL@@@@@" "@CL@@@@@" "@CL@@@@@")} 61806 NIL } {$IREGION IREGION.DEMOFN (NAME "New York") (356 179 58 57) {(READBITMAP)(58 57 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@OOO@@@@" "@@@@@@@@COOO@@@@" "@@@@@@@@COOO@@@@" "@@@@@@@@OOOO@@@@" "@@@@@@@AOOOO@@@@" "@@@@@@@AOOOO@@@@" "@@@@@@@COOOO@@@@" "@@@@@@@COOOO@@@@" "@@@@@@@GOOOO@@@@" "@@@@@@@GOOOO@@@@" "@@@@@@@OOOOO@@@@" "@@@@@@@OOOOO@@@@" "@@@@@@@OOOOO@@@@" "@@@@@@AOOOOO@@@@" "@@@@@@COOOOOH@@@" "@@CL@@GOOOOOH@@@" "@AOOOOOOOOOOH@@@" "@AOOOOOOOOOOH@@@" "@@OOOOOOOOOOH@@@" "@@GOOOOOOOOOH@@@" "@@GOOOOOOOOOH@@@" "@@OOOOOOOOOOH@@@" "@AOOOOOOOOOOH@@@" "@COOOOOOOOOO@@@@" "@GOOOOOOOOOO@@@@" "AOOOOOOOOOOO@@@@" "COOOOOOOOOOO@@@@" "COOOOOOOOOON@@@@" "@@@@@@@@COON@@@@" "@@@@@@@@AOON@@@@" "@@@@@@@@@OON@@@@" "@@@@@@@@@GON@@@@" "@@@@@@@@@GON@@@@" "@@@@@@@@@CON@@@@" "@@@@@@@@@AON@@@@" "@@@@@@@@@@GN@@@@" "@@@@@@@@@@CL@@@@" "@@@@@@@@@@@D@@@@" "@@@@@@@@@@@D@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 41374 NIL } {$IREGION IREGION.DEMOFN (NAME "Maryland") (358 150 45 31) {(READBITMAP)(45 31 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "COOOOOOH@@@@" "CHCOOOOH@@@@" "C@AOOOOH@@@@" "B@@OOOKH@@@@" "@@@@GOCH@@@@" "@@@@GOCH@@@@" "@@@@COCH@@@@" "@@@@@OCH@@@@" "@@@@@FCH@@@@" "@@@@@NCH@@@@" "@@@@@LCH@@@@" "@@@@ALAH@@@@" "@@@@@NAL@@@@" "@@@@@NAOH@@@" "@@@@@BAOH@@@" "@@@@@@@O@@@@" "@@@@@@@H@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 16880 NIL } {$IREGION IREGION.DEMOFN (NAME "New Jersey") (383 162 25 37) {(READBITMAP)(25 37 "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@@@@@@@" "@@AL@@@@" "@@CN@@@@" "@@GOH@@@" "@@COH@@@" "@@GOH@@@" "@@GOH@@@" "@@GOH@@@" "@@COH@@@" "@@AOH@@@" "@@AOH@@@" "@@@OH@@@" "@@AO@@@@" "@@CO@@@@" "@@GO@@@@" "@AOO@@@@" "@AON@@@@" "@COL@@@@" "@AOL@@@@" "@@O@@@@@" "@@G@@@@@" "@@C@@@@@" "@@@@@@@@")} 44104 NIL } {$IREGION IREGION.DEMOFN (NAME "Pennsylvania") (340 167 63 37) {(READBITMAP)(63 37 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@H@@@@@@@@@@@" "@@@CH@@@@@@@@@@@" "@@@GOOOOOOOOL@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOOH@@" "@@@GOOOOOOOOOL@@" "@@@GOOOOOOOOOL@@" "@@@GOOOOOOOOOH@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOOOH@@" "@@@GOOOOOOOOOH@@" "@@@GOOOOOOOOOL@@" "@@@GOOOOOOOOO@@@" "@@@GOOOOOOOON@@@" "@@@GOOOOOOOO@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 24883 NIL } {$IREGION IREGION.DEMOFN (NAME "Florida") (289 19 88 76) {(READBITMAP)(88 76 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@OOOOL@@@@@@@@@@@@@@@@" "@@@OOOON@@@@@D@@@@@@@@@@" "@@@GOOON@@@@@G@@@@@@@@@@" "@@@GOOOOOOOL@G@@@@@@@@@@" "@@@EOOOOOOOOLG@@@@@@@@@@" "@@@@@COOOOOONO@@@@@@@@@@" "@@@@@@OOOOOOOO@@@@@@@@@@" "@@@@@@COOOOOOOH@@@@@@@@@" "@@@@@@AONAOOOOH@@@@@@@@@" "@@@@@@@OH@OOOOH@@@@@@@@@" "@@@@@@@O@@GOOOH@@@@@@@@@" "@@@@@@@H@@COOOL@@@@@@@@@" "@@@@@@@@@@AOOOL@@@@@@@@@" "@@@@@@@@@@AOOOL@@@@@@@@@" "@@@@@@@@@@@OOON@@@@@@@@@" "@@@@@@@@@@@OOON@@@@@@@@@" "@@@@@@@@@@@GOON@@@@@@@@@" "@@@@@@@@@@@AOOO@@@@@@@@@" "@@@@@@@@@@@@OOO@@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@@OOOH@@@@@@@@" "@@@@@@@@@@@AOOOL@@@@@@@@" "@@@@@@@@@@@AOOOL@@@@@@@@" "@@@@@@@@@@@@OOON@@@@@@@@" "@@@@@@@@@@@@COON@@@@@@@@" "@@@@@@@@@@@@COON@@@@@@@@" "@@@@@@@@@@@@GOON@@@@@@@@" "@@@@@@@@@@@@GOOO@@@@@@@@" "@@@@@@@@@@@@OOOO@@@@@@@@" "@@@@@@@@@@@@OOOOH@@@@@@@" "@@@@@@@@@@@@GOOOH@@@@@@@" "@@@@@@@@@@@@GOOCH@@@@@@@" "@@@@@@@@@@@@COOAL@@@@@@@" "@@@@@@@@@@@@@GNAL@@@@@@@" "@@@@@@@@@@@@@GNAL@@@@@@@" "@@@@@@@@@@@@@GOAL@@@@@@@" "@@@@@@@@@@@@@COKL@@@@@@@" "@@@@@@@@@@@@@COOL@@@@@@@" "@@@@@@@@@@@@@COOL@@@@@@@" "@@@@@@@@@@@@@COOL@@@@@@@" "@@@@@@@@@@@@@COOL@@@@@@@" "@@@@@@@@@@@@@AOOL@@@@@@@" "@@@@@@@@@@@@@AOOL@@@@@@@" "@@@@@@@@@@@@@AOOL@@@@@@@" "@@@@@@@@@@@@@@COL@@@@@@@" "@@@@@@@@@@@@@@COH@@@@@@@" "@@@@@@@@@@@@@@CO@@@@@@@@" "@@@@@@@@@@@@@@AO@@@@@@@@" "@@@@@@@@@@@@@@AO@@@@@@@@" "@@@@@@@@@@@@@@@O@@@@@@@@" "@@@@@@@@@@@@@@@N@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@")} 3049 NIL } {$IREGION IREGION.DEMOFN (NAME "South Carolina") (330 88 48 51) {(READBITMAP)(48 51 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@GOOL@@@@@@@" "@OOOO@@@@@@@" "AOOOO@@@@@@@" "COOOOOO@@@@@" "AOOOOOOL@@@@" "@OOOOOOL@@@@" "@GOOOOON@@@@" "@COOOOOO@@@@" "@COOOOOOH@@@" "@AOOOOOOL@@@" "@@OOOOOON@@@" "@@GOOOOOO@@@" "@@COOOOON@@@" "@@COOOOOL@@@" "@@AOOOOO@@@@" "@@@OOOOO@@@@" "@@@GOOON@@@@" "@@@GOOON@@@@" "@@@GOOON@@@@" "@@@COOOL@@@@" "@@@AOOO@@@@@" "@@@@OOO@@@@@" "@@@@OOL@@@@@" "@@@@OOL@@@@@" "@@@@GO@@@@@@" "@@@@CN@@@@@@" "@@@@CL@@@@@@" "@@@@CL@@@@@@" "@@@@CH@@@@@@" "@@@@A@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 9930 NIL } {$IREGION IREGION.DEMOFN (NAME "North Carolina") (328 112 66 38) {(READBITMAP)(66 38 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@OOOOOOOOOOH@@@@@" "@@@@OOOOOOOOOOH@@@@@" "@@@COOOOOOOOOO@@@@@@" "@@@COOOOOOOOOM@@@@@@" "@@AOOOOOOOOOOH@@@@@@" "@@COOOOOOOOOOH@@@@@@" "@AOOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@OOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOOH@@@@@" "OOOOOOOOOOOOLAH@@@@@" "OOOOOOOOOOOON@@@@@@@" "OOOOOOOOOOOOOH@@@@@@" "ON@@@OOOOOOOK@@@@@@@" "OH@@@COOOOOOL@@@@@@@" "@@@@@AOOOOOOND@@@@@@" "@@@@@@@COOOOOL@@@@@@" "@@@@@@@@OOOLL@@@@@@@" "@@@@@@@@GOON@@@@@@@@" "@@@@@@@@GOOL@@@@@@@@" "@@@@@@@@COOH@@@@@@@@" "@@@@@@@@AOO@@@@@@@@@" "@@@@@@@@@OO@@@@@@@@@" "@@@@@@@@@GN@@@@@@@@@" "@@@@@@@@@CN@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 1855 NIL } {$IREGION IREGION.DEMOFN (NAME "Virginia") (331 134 66 36) {(READBITMAP)(66 36 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@B@@@@@@@@@@" "@@@@@@@@@GN@@@@@@@@@" "@@@@@@@@@OO@@@@@@@@@" "@@@@@@@@@OOH@@@@@@@@" "@@@@@@@@COOL@@@@@@@@" "@@@@@@@@OOOL@@@@@@@@" "@@@@@@@@OOOH@@@@@@@@" "@@@@@@@AOOOH@@@@@@@@" "@@@@@@@COOOL@@@@@@@@" "@@@@@@AOOOOL@@@@@@@@" "@@@@@@AOOOON@@@@@@@@" "@@@@@@COOOOH@@@@@@@@" "@@@@@@COOOOH@@@@@@@@" "@@@@@@GOOOOL@@@@@@@@" "@@@@@@OOOOOOH@@@@@@@" "@@@@@AOOOOOOL@@@@@@@" "@@@@@AOOOOOON@@@@@@@" "@@@@@AOOOOOOH@@@@@@@" "@@B@@COOOOOOH@@@@@@@" "@@O@COOOOOOOL@@@@@@@" "@AOIOOOOOOOOO@@@@@@@" "@COOOOOOOOOOOL@@@@@@" "@GOOOOOOOOOON@@@@@@@" "@GOOOOOOOOOON@@@@@@@" "OOOOOOOOOOOOO@@@@@@@" "OOOOOOOOOOOOOH@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 39005 NIL } {$IREGION IREGION.DEMOFN (NAME "West Virginia") (334 144 43 41) {(READBITMAP)(43 41 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@D@@@@@@@" "@@@@D@@@@@@@" "@@@@D@@@@@@@" "@@@@D@@@@@@@" "@@@@OOH@@@@@" "@@@AOOH@@@@@" "@@@AOOHGL@@@" "@@@COOHOL@@@" "@@AOOOIOL@@@" "@@COOOOOH@@@" "@@GOOOOO@@@@" "@@COOOON@@@@" "@@OOOOOH@@@@" "@AOOOOO@@@@@" "@AOOOOO@@@@@" "@COOOOJ@@@@@" "@GOOOO@@@@@@" "@OOOON@@@@@@" "@OOOON@@@@@@" "AOOOOL@@@@@@" "@OOOOL@@@@@@" "@GOOOH@@@@@@" "@GOOO@@@@@@@" "@COON@@@@@@@" "@AOON@@@@@@@" "@@OON@@@@@@@" "@@GN@@@@@@@@" "@@C@@@@@@@@@" "@@@@@@@@@@@@")} 24190 NIL } {$IREGION IREGION.DEMOFN (NAME "Georgia") (311 70 44 66) {(READBITMAP)(44 66 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@GOOO@@@@@@@" "@GOOO@@@@@@@" "@GOOO@@@@@@@" "@GOOOL@@@@@@" "@GOOOL@@@@@@" "@GOOON@@@@@@" "@COOOO@@@@@@" "@COOOOH@@@@@" "@COOOOL@@@@@" "@COOOOL@@@@@" "@COOOON@@@@@" "@COOOOO@@@@@" "@AOOOOO@@@@@" "@AOOOOOL@@@@" "@AOOOOON@@@@" "@AOOOOON@@@@" "@AOOOOON@@@@" "@AOOOOOO@@@@" "@@OOOOOOH@@@" "@@OOOOOOL@@@" "@@OOOOOOL@@@" "@@OOOOOOL@@@" "@@OOOOOON@@@" "@@GOOOOOO@@@" "@@GOOOOOO@@@" "@@GOOOOOO@@@" "@@GOOOOOO@@@" "@@OOOOOOOH@@" "@@GOOOOOOL@@" "@@OOOOOOOL@@" "@@OOOOOON@@@" "@@OOOOOOO@@@" "@@OOOOOOO@@@" "@@OOOOOON@@@" "@@OOOOOOL@@@" "@@OOOOOON@@@" "@@OOOOOON@@@" "@@GOOOOOL@@@" "@@GOOOOOL@@@" "@@AOOOONL@@@" "@@COOOOL@@@@" "@@@@@@OL@@@@" "@@@@@@@L@@@@" "@@@@@@@D@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 6013 NIL } {$IREGION IREGION.DEMOFN NIL (338 140 39 38) {(READBITMAP)(39 38 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 52911 NIL } {$IREGION IREGION.DEMOFN (NAME "Ohio") (315 157 47 44) {(READBITMAP)(47 44 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@H@@" "@@@@@@@@CH@@" "@@@@@@@@OH@@" "@COOH@@AOH@@" "@COON@@OOH@@" "@COONNGOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOOH@@" "@COOOOOOO@@@" "@COOOOOOO@@@" "@COOOOOON@@@" "@COOOOOON@@@" "@COOOOOON@@@" "@COOOOOON@@@" "@COOOOOOL@@@" "@COOOOOOH@@@" "@COOOOOOH@@@" "@COOOOOL@@@@" "@COOOOO@@@@@" "@COOOOO@@@@@" "@@COOOL@@@@@" "@@COOOH@@@@@" "@@@GOOH@@@@@" "@@@CMOH@@@@@" "@@@@@GH@@@@@" "@@@@@C@@@@@@")} 3846 NIL } {$IREGION IREGION.DEMOFN (NAME "Alabama") (292 72 40 61) {(READBITMAP)(40 61 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOON@@@@@@" "@GOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOOH@@@@@" "@OOOOOH@@@@@" "@OOOOOH@@@@@" "@OOOOOH@@@@@" "@OOOOOH@@@@@" "@OOOOOH@@@@@" "AOOOOOH@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOON@@@@@" "AOOOOON@@@@@" "AOOOOON@@@@@" "AOOOOON@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "COOOOOL@@@@@" "COOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOOL@@@@@" "AOOOOON@@@@@" "AO@@@@@@@@@@" "AO@@@@@@@@@@" "AO@@@@@@@@@@" "AOH@@@@@@@@@" "AOH@@@@@@@@@" "AOH@@@@@@@@@" "@E@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 4772 NIL } {$IREGION IREGION.DEMOFN (NAME "Mississippi") (266 74 41 59) {(READBITMAP)(41 59 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@AOOOL@@@@" "@@@COOOL@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@@GOOOL@@@@" "@@AOOOOL@@@@" "@@AOOOOL@@@@" "@@COOOOH@@@@" "@@COOOOH@@@@" "@@COOOOH@@@@" "@@COOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOOH@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@COOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@GOOOO@@@@@" "@@OOOON@@@@@" "@AOOOON@@@@@" "@AOOOOO@@@@@" "@COOOOO@@@@@" "@COOOOO@@@@@" "@COOOOO@@@@@" "@COOOOO@@@@@" "@GOOOOO@@@@@" "@GOOOOO@@@@@" "@@@@AOO@@@@@" "@@@@AOO@@@@@" "@@@@AOO@@@@@" "@@@@AOO@@@@@" "@@@@AOO@@@@@" "@@@@AOC@@@@@" "@@@@@L@@@@@@" "@@@@@H@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 19282 NIL } {$IREGION IREGION.DEMOFN (NAME "Tennessee") (281 118 71 31) {(READBITMAP)(71 31 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@GOOO@@@@@@@@@@@@" "@@@@OOOOOOOOOOOL@@@@" "@COOOOOOOOOOOOOH@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOL@@@@@" "@GOOOOOOOOOOOOH@@@@@" "@OOOOOOOOOOOOL@@@@@@" "@OOOOOOOOOOOOH@@@@@@" "@OOOOOOOOOOON@@@@@@@" "AOOOOOOOOOOOL@@@@@@@" "AOOOOOOOOOON@@@@@@@@" "COOOOOOOOOOL@@@@@@@@" "COOOOOOOOOOH@@@@@@@@" "COOOOOOOOOO@@@@@@@@@" "COOOOOOOOON@@@@@@@@@" "GOOOOOOOOON@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 50710 NIL } {$IREGION IREGION.DEMOFN (NAME "Kentucky") (287 136 62 30) {(READBITMAP)(62 30 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@CH@@@@@@" "@@@@@@@@CL@@@@@@" "@@@@@@@@GOH@@@@@" "@@@@@@@COOL@@@@@" "@@@@@@@GOOOO@@@@" "@@@@@@@OOOOOH@@@" "@@@@@@@OOOOOL@@@" "@@@@@@COOOOOL@@@" "@@@@@@COOOOOH@@@" "@@@@@BGOOOOOL@@@" "@@@@@COOOOOON@@@" "@@AOGGOOOOOON@@@" "@@COOOOOOOOOO@@@" "@@COOOOOOOOOOH@@" "@@GOOOOOOOOOOL@@" "@@OOOOOOOOOOO@@@" "@AOOOOOOOOOON@@@" "@COOOOOOOOOOL@@@" "COOOOOOOOOOO@@@@" "AOOOOOOOOOON@@@@" "AOOOOOOOOOO@@@@@" "AOOOOOOOOON@@@@@" "COL@@@COOOL@@@@@" "GOH@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 24831 NIL } {$IREGION IREGION.DEMOFN (NAME "Indiana") (296 146 33 55) {(READBITMAP)(33 55 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@GOOO@@@@@@" "@DOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOOO@@@@@@" "@GOOO@@@@@@@" "@GOOO@@@@@@@" "@GOON@@@@@@@" "@OOOL@@@@@@@" "AOOOH@@@@@@@" "COOO@@@@@@@@" "COOC@@@@@@@@" "COO@@@@@@@@@" "@AA@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 56068 NIL } {$IREGION IREGION.DEMOFN (NAME "Illinois") (266 140 45 69) {(READBITMAP)(45 69 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@COOOO@@@@" "@@@COOOO@@@@" "@@@AOOOO@@@@" "@@@@OOOOH@@@" "@@@@OOOOH@@@" "@@@@OOOOL@@@" "@@@@OOOOL@@@" "@@@AOOOOL@@@" "@@@AOOOOL@@@" "@@@COOOOL@@@" "@@AOOOOOL@@@" "@@COOOOOL@@@" "@@GOOOOOL@@@" "@@COOOOOL@@@" "@@COOOOOL@@@" "@@COOOOOL@@@" "@@GOOOOOL@@@" "@@GOOOOOL@@@" "@AOOOOOOL@@@" "@AOOOOOOL@@@" "@AOOOOOOL@@@" "@COOOOOOL@@@" "@COOOOOOL@@@" "@COOOOOOL@@@" "@AOOOOOOL@@@" "@AOOOOOOL@@@" "@AOOOOOOL@@@" "@@OOOOOOL@@@" "@@GOOOOOL@@@" "@@COOOOOL@@@" "@@AOOOOOL@@@" "@@@OOOOOL@@@" "@@@GOOOOL@@@" "@@@GOOOOL@@@" "@@@COOOOL@@@" "@@@@OOOOL@@@" "@@@@OOOOL@@@" "@@@@OOOOL@@@" "@@@@OOOOL@@@" "@@@AOOOOH@@@" "@@@AOOOO@@@@" "@@@AOOON@@@@" "@@@@OOON@@@@" "@@@@OOON@@@@" "@@@@AOON@@@@" "@@@@@OON@@@@" "@@@@@OOL@@@@" "@@@@@GOL@@@@" "@@@@@GOH@@@@" "@@@@@GO@@@@@" "@@@@@GN@@@@@" "@@@@@F@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 62612 NIL } {$IREGION IREGION.DEMOFN (NAME "Michigan") (279 183 68 68) {(READBITMAP)(68 68 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@D@@@@@@@@@@@@@@@@" "@@@N@@@@@@@@@@@@@@@@" "@@GO@@@@@@@@@@@@@@@@" "@@OOOH@@@@@@@@@@@@@@" "@GOOOH@@@C@@@@@@@@@@" "COOOOL@AOO@@@@@@@@@@" "AOOOON@COO@@@@@@@@@@" "AOOOOOOOOOOH@@@@@@@@" "@COOOOOOOOON@@@@@@@@" "@@AOOOOOOOOOH@@@@@@@" "@@@OOOOOOHON@@@@@@@@" "@@@@OOON@@D@@@@@@@@@" "@@@@COKL@@@@@@@@@@@@" "@@@@@OH@@@@@@@@@@@@@" "@@@@@O@@@@F@@@@@@@@@" "@@@@@N@@@@GL@@@@@@@@" "@@@@@N@@@@GN@@@@@@@@" "@@@@@L@@@@OOH@@@@@@@" "@@@@@@@@@COOO@@@@@@@" "@@@@@@@@@COOO@@@@@@@" "@@@@@@@@@GOOO@@@@@@@" "@@@@@@@@COOOO@@@@@@@" "@@@@@@@@GOOOO@@@@@@@" "@@@@@@@@GOOOO@@@@@@@" "@@@@@@@@OOOOO@@@@@@@" "@@@@@@@@OOOOO@@@@@@@" "@@@@@@@@OOOOO@@@@@@@" "@@@@@@@@OOOOO@@@@@@@" "@@@@@@@AOOOON@@@@@@@" "@@@@@@@COOOON@@@@@@@" "@@@@@@@COOOOH@@@@@@@" "@@@@@@@COOOO@CH@@@@@" "@@@@@@@COOOO@GH@@@@@" "@@@@@@@COOOO@OH@@@@@" "@@@@@@@COOOOAOH@@@@@" "@@@@@@@COOOOOOL@@@@@" "@@@@@@@COOOOOOL@@@@@" "@@@@@@@AOOOOOOL@@@@@" "@@@@@@@AOOOOOOL@@@@@" "@@@@@@@AOOOOOOL@@@@@" "@@@@@@@@OOOOOON@@@@@" "@@@@@@@@OOOOOON@@@@@" "@@@@@@@@OOOOOON@@@@@" "@@@@@@@@OOOOOOL@@@@@" "@@@@@@@@OOOOOO@@@@@@" "@@@@@@@@OOOOON@@@@@@" "@@@@@@@@OOOOON@@@@@@" "@@@@@@@AOOOOOL@@@@@@" "@@@@@@@COOOOOH@@@@@@" "@@@@@@@COOOOOH@@@@@@" "@@@@@@@GOOOOOH@@@@@@" "@@@@@@@GOOOOO@@@@@@@" "@@@@@@@@@@CON@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 35489 NIL } {$IREGION IREGION.DEMOFN (NAME "Wisconsin") (256 192 57 53) {(READBITMAP)(57 53 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@GH@@@@@@@@@@" "@@@AO@@@@@@@@@@@" "@@COO@@@@@@@@@@@" "@@COOO@@@@@@@@@@" "@@COOOH@@@@@@@@@" "@@COOOL@@@@@@@@@" "@@COOOOH@@@@@@@@" "@@COOOOOL@@@@@@@" "@@GOOOOON@@@@@@@" "@@OOOOOOON@@@@@@" "@AOOOOOOOO@@@@@@" "@AOOOOOOOOL@@@@@" "@AOOOOOOOOL@@@@@" "@@OOOOOOOOL@@@@@" "@@OOOOOOOOL@@@@@" "@AOOOOOOOON@@@@@" "@AOOOOOOOON@@@@@" "@AOOOOOOOOO@@@@@" "@AOOOOOOOOL@@@@@" "@AOOOOOOOOL@@@@@" "@AOOOOOOOOLL@@@@" "@@OOOOOOOOHL@@@@" "@@COOOOOOOOH@@@@" "@@@OOOOOOOOH@@@@" "@@@GOOOOOOO@@@@@" "@@@COOOOOOO@@@@@" "@@@COOOOOOO@@@@@" "@@@AOOOOOON@@@@@" "@@@@COOOOON@@@@@" "@@@@COOOOON@@@@@" "@@@@COOOOON@@@@@" "@@@@COOOOON@@@@@" "@@@@COOOOOL@@@@@" "@@@@COOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@AOOOOOL@@@@@" "@@@@@GOOOOL@@@@@" "@@@@@COOOOL@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 57326 NIL } {$IREGION IREGION.DEMOFN (NAME "Louisiana") (250 63 47 51) {(READBITMAP)(47 51 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOOH@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOOO@@@@@@" "@OOOON@@@@@@" "@GOOOL@@@@@@" "@COOOL@@@@@@" "@AOOOH@@@@@@" "@AOOOH@@@@@@" "@AOOOH@@@@@@" "@AOOOH@@@@@@" "@AOOO@@@@@@@" "@AOOO@@@@@@@" "@AOOO@@@@@@@" "@AOOOOOOL@@@" "@AOOOOOOL@@@" "@COOOOOOL@@@" "@COOOOOOL@@@" "@COOOOOOL@@@" "@COOOOOLF@@@" "@COOOOOH@@@@" "@COOOOOL@@@@" "@COOOOOL@@@@" "@GOOOOOH@@@@" "@GOOLOOO@@@@" "@@AOHGOOH@@@" "@@@GHGOOH@@@" "@@@@@@ON@@@@" "@@@@@@OO@@@@" "@@@@@@GK@@@@" "@@@@@@GA@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 57715 NIL } {$IREGION IREGION.DEMOFN (NAME "Arkansas") (246 96 46 52) {(READBITMAP)(46 52 "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@OOOOOOOO@@@" "@OOOOOOON@@@" "@OOOOOOON@@@" "@OOOOOOOL@@@" "@OOOOOOON@@@" "@OOOOOOOOL@@" "@OOOOOOOOH@@" "@GOOOOOOOH@@" "@GOOOOOOOH@@" "@GOOOOOON@@@" "@GOOOOOON@@@" "@GOOOOOON@@@" "@GOOOOOON@@@" "@GOOOOOOL@@@" "@GOOOOOOL@@@" "@GOOOOOOH@@@" "@GOOOOOO@@@@" "@GOOOOOO@@@@" "@GOOOOOO@@@@" "@GOOOOOO@@@@" "@GOOOOOL@@@@" "@GOOOOOH@@@@" "@GOOOOOH@@@@" "@GOOOOOH@@@@" "@OOOOOOH@@@@" "@OOOOOO@@@@@" "@OOOOOO@@@@@" "@AOOOOO@@@@@" "@@OOOOO@@@@@" "@@OOOOO@@@@@" "@@OOOOO@@@@@" "@@OOOOO@@@@@" "@@OOOOO@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@" "@@@@@@@@@@@@")} 54342 NIL } {$IREGION IREGION.DEMOFN (NAME "Missouri") (238 131 60 55) {(READBITMAP)(60 55 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@" "@OOOOOOOH@@@@@@@" "@OOOOOOOL@@@@@@@" "@OOOOOOOH@@@@@@@" "@GOOOOOOH@@@@@@@" "@COOOOOOH@@@@@@@" "@COOOOOOL@@@@@@@" "@@OOOOOOL@@@@@@@" "@@GOOOOOL@@@@@@@" "@@OOOOOON@@@@@@@" "@@OOOOOOO@@@@@@@" "@@GOOOOOOH@@@@@@" "@@GOOOOOOL@@@@@@" "@@COOOOOON@@@@@@" "@@AOOOOOOO@@@@@@" "@@AOOOOOOO@@@@@@" "@@AOOOOOOOH@@@@@" "@@AOOOOOOOL@@@@@" "@@AOOOOOOON@@@@@" "@@AOOOOOOON@@@@@" "@@AOOOOOOON@@@@@" "@@AOOOOOOOL@@@@@" "@@AOOOOOOOL@@@@@" "@@AOOOOOOOL@@@@@" "@@AOOOOOOON@@@@@" "@@AOOOOOOON@@@@@" "@@AOOOOOOOO@@@@@" "@@AOOOOOOOOL@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOOO@@@@" "@@AOOOOOOOOO@@@@" "@@AOOOOOOOOO@@@@" "@@AOOOOOOOOO@@@@" "@@AOOOOOOOOO@@@@" "@@AOOOOOOOOOH@@@" "@@AOOOOOOOOOL@@@" "@@AOOOOOOOOON@@@" "@@AOOOOOOOOON@@@" "@@AOOOOOOOOOL@@@" "@@AOOOOOOOOOH@@@" "@@@@@@@@@@@N@@@@" "@@@@@@@@@@@G@@@@" "@@@@@@@@@@@N@@@@" "@@@@@@@@@@@N@@@@" "@@@@@@@@@@AN@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 23596 NIL } {$IREGION IREGION.DEMOFN (NAME "Iowa") (229 173 65 41) {(READBITMAP)(65 41 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@COOOOOOOOO@@@@@@@@@" "@COOOOOOOOO@@@@@@@@@" "@COOOOOOOOOH@@@@@@@@" "@AOOOOOOOOOH@@@@@@@@" "@AOOOOOOOOOH@@@@@@@@" "@COOOOOOOOOH@@@@@@@@" "@COOOOOOOOOH@@@@@@@@" "@COOOOOOOOOL@@@@@@@@" "@COOOOOOOOOO@@@@@@@@" "@AOOOOOOOOOOH@@@@@@@" "@AOOOOOOOOOOL@@@@@@@" "@@OOOOOOOOOOL@@@@@@@" "@@OOOOOOOOOON@@@@@@@" "@@OOOOOOOOOOO@@@@@@@" "@@GOOOOOOOOOO@@@@@@@" "@@GOOOOOOOOOO@@@@@@@" "@@COOOOOOOOOO@@@@@@@" "@@COOOOOOOOON@@@@@@@" "@@COOOOOOOOON@@@@@@@" "@@AOOOOOOOOO@@@@@@@@" "@@AOOOOOOOOL@@@@@@@@" "@@AOOOOOOOOL@@@@@@@@" "@@AOOOOOOOOH@@@@@@@@" "@@AOOOOOOOOL@@@@@@@@" "@@@OOOOOOOOL@@@@@@@@" "@@@OOOOOOOOL@@@@@@@@" "@@AOOOOOOOOH@@@@@@@@" "@@@OOOOOOOC@@@@@@@@@" "@@@@@@@@@@B@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 22243 NIL } {$IREGION IREGION.DEMOFN (NAME "Minnesota") (224 205 68 67) {(READBITMAP)(68 67 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@AOOON@@@@@@@@@@@@@@" "@AOOOOH@@@@@@@@@@@@@" "@AOOOOO@@@@@@@@@@@@@" "@AOOOOONC@@@@@@@@@@@" "@AOOOOOOO@@@@@@@@@@@" "@AOOOOOOOO@@@@@@@@@@" "@AOOOOOOOOK@@@@@@@@@" "@AOOOOOOOOOHA@@@@@@@" "@@OOOOOOOOONGOL@@@@@" "@@OOOOOOOOOOOOO@@@@@" "@@OOOOOOOOOOOOH@@@@@" "@@OOOOOOOOOOOL@@@@@@" "@@GOOOOOOOOOO@@@@@@@" "@@GOOOOOOOOON@@@@@@@" "@@GOOOOOOOOOL@@@@@@@" "@@GOOOOOOOOOH@@@@@@@" "@@GOOOOOOOOO@@@@@@@@" "@@GOOOOOOOON@@@@@@@@" "@@GOOOOOOOOH@@@@@@@@" "@@COOOOOOOO@@@@@@@@@" "@@COOOOOOON@@@@@@@@@" "@@COOOOOOOH@@@@@@@@@" "@@COOOOOOOH@@@@@@@@@" "@@COOOOOOOH@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@" "@@AOOOOOOO@@@@@@@@@@" "@@AOOOOOOL@@@@@@@@@@" "@@AOOOOOOL@@@@@@@@@@" "@@COOOOOOL@@@@@@@@@@" "@@GOOOOOOH@@@@@@@@@@" "@@COOOOOON@@@@@@@@@@" "@@AOOOOOON@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOOL@@@@@@@@@@" "@@@OOOOOON@@@@@@@@@@" "@@@OOOOOON@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@" "@@@OOOOOOOO@@@@@@@@@" "@@@OOOOOOOOH@@@@@@@@" "@@@OOOOOOOOH@@@@@@@@" "@@@OOOOOOOOL@@@@@@@@" "@@@OOOOOOOON@@@@@@@@" "@@@OOOOOOOOOH@@@@@@@" "@@@OOOOOOOOOH@@@@@@@" "@@@OOOOOOOOOH@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 24413 NIL } {$IREGION IREGION.DEMOFN (NAME "Texas") (160 33 106 113) {(READBITMAP)(106 113 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOOH@@@@@@@@@@@@@@@" "@@@@@@@OOOOON@@@@@@@@@@@@@@@" "@@@@@@@OOOOOOL@@@@@@@@@@@@@@" "@@@@@@@OOOOOON@@@@@@@@@@@@@@" "@@@@@@@OOOOOOOL@@@@@@@@@@@@@" "@@@@@@@OOOOOOOOL@@@@@@@@@@@@" "@@@@@@@OOOOOOOOOH@@@@@@@@@@@" "@@@@@@@OOOOOOOOOOA@AIH@@@@@@" "@@@@@@@OOOOOOOOOOONGON@@@@@@" "@@@@@@@OOOOOOOOOOOOOOOH@@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "@@@@@@@OOOOOOOOOOOOOOOOH@@@@" "COOOOOOOOOOOOOOOOOOOOOOH@@@@" "AOOOOOOOOOOOOOOOOOOOOOOL@@@@" "@OOOOOOOOOOOOOOOOOOOOOON@@@@" "@OOOOOOOOOOOOOOOOOOOOOOO@@@@" "@GOOOOOOOOOOOOOOOOOOOOOO@@@@" "@COOOOOOOOOOOOOOOOOOOOOO@@@@" "@AOOOOOOOOOOOOOOOOOOOOOO@@@@" "@@OOOOOOOOOOOOOOOOOOOOOO@@@@" "@@GOOOOOOOOOOOOOOOOOOOOO@@@@" "@@COOOOOOOOOOOOOOOOOOOOO@@@@" "@@AOOOOOOOOOOOOOOOOOOOOO@@@@" "@@@GOOOOOOOOOOOOOOOOOOOO@@@@" "@@@GOOOOOOOOOOOOOOOOOOON@@@@" "@@@COOOOOOOOOOOOOOOOOOON@@@@" "@@@COOOOOOOOOOOOOOOOOOON@@@@" "@@@AOOOOOOOOOOOOOOOOOOON@@@@" "@@@AOOOOOOOOOOOOOOOOOOON@@@@" "@@@@OOOOOOOOOOOOOOOOOOON@@@@" "@@@@OOOOOOOOOOOOOOOOOOOL@@@@" "@@@@OOOOOOOOOOOOOOOOOOOL@@@@" "@@@@OOONAIOOOOOOOOOOOOOL@@@@" "@@@@GOOL@@OOOOOOOOOOONOL@@@@" "@@@@GOOH@@GOOOOOOOOOONF@@@@@" "@@@@AOOH@@COOOOOOOOOOLD@@@@@" "@@@@@OO@@@COOOOOOOOOOL@@@@@@" "@@@@@CO@@@AOOOOOOOOOOL@@@@@@" "@@@@@AN@@@@OOOOOOOOOOH@@@@@@" "@@@@@@N@@@@GOOOOOOOOOH@@@@@@" "@@@@@@@@@@@GOOOOOOOOO@@@@@@@" "@@@@@@@@@@@COOOOOOOON@@@@@@@" "@@@@@@@@@@@COOOOOOOOL@@@@@@@" "@@@@@@@@@@@AOOOOOOLO@@@@@@@@" "@@@@@@@@@@@AOOOOOOL@@@@@@@@@" "@@@@@@@@@@@AOOOOOOF@@@@@@@@@" "@@@@@@@@@@@@OOOOOOH@@@@@@@@@" "@@@@@@@@@@@@OOOOOOH@@@@@@@@@" "@@@@@@@@@@@@GOOOOO@@@@@@@@@@" "@@@@@@@@@@@@COOOOH@@@@@@@@@@" "@@@@@@@@@@@@COOOOL@@@@@@@@@@" "@@@@@@@@@@@@AOOOOH@@@@@@@@@@" "@@@@@@@@@@@@AOOOOH@@@@@@@@@@" "@@@@@@@@@@@@@OOOOH@@@@@@@@@@" "@@@@@@@@@@@@@GOOOH@@@@@@@@@@" "@@@@@@@@@@@@@COOK@@@@@@@@@@@" "@@@@@@@@@@@@@COOM@@@@@@@@@@@" "@@@@@@@@@@@@@COON@@@@@@@@@@@" "@@@@@@@@@@@@@COOO@@@@@@@@@@@" "@@@@@@@@@@@@@COOO@@@@@@@@@@@" "@@@@@@@@@@@@@AOON@@@@@@@@@@@" "@@@@@@@@@@@@@AOON@@@@@@@@@@@" "@@@@@@@@@@@@@@OOO@@@@@@@@@@@" "@@@@@@@@@@@@@@OOO@@@@@@@@@@@" "@@@@@@@@@@@@@@OOO@@@@@@@@@@@" "@@@@@@@@@@@@@@GOO@@@@@@@@@@@" "@@@@@@@@@@@@@@AOO@@@@@@@@@@@" "@@@@@@@@@@@@@@@OOH@@@@@@@@@@" "@@@@@@@@@@@@@@@COH@@@@@@@@@@" "@@@@@@@@@@@@@@@@CH@@@@@@@@@@" "@@@@@@@@@@@@@@@@A@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 38605 NIL } {$IREGION IREGION.DEMOFN (NAME "Oklahoma") (182 105 81 48) {(READBITMAP)(81 48 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@COOOOOOOOOOOOOOL@@@@@@@" "@COOOOOOOOOOOOOOL@@@@@@@" "@COOOOOOOOOOOOOOL@@@@@@@" "@COOOOOOOOOOOOOOL@@@@@@@" "@@@@@@@OOOOOOOOOL@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOON@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@OOOOOOOOOO@@@@@@@" "@@@@@@@GOOOOOOOOO@@@@@@@" "@@@@@@@@OOOOOOOOO@@@@@@@" "@@@@@@@@COOOOOOOO@@@@@@@" "@@@@@@@@@OOOOOOOO@@@@@@@" "@@@@@@@@@@GOOOOOO@@@@@@@" "@@@@@@@@@@AOOOOOO@@@@@@@" "@@@@@@@@@@@CKOIIN@@@@@@@" "@@@@@@@@@@@@@F@@F@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@")} 45278 NIL } {$IREGION IREGION.DEMOFN (NAME "Kansas") (188 138 71 44) {(READBITMAP)(71 44 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@AOOOOOOOOOOOO@@@@@@" "@AOOOOOOOOOOOOL@@@@@" "@AOOOOOOOOOOOOH@@@@@" "@AOOOOOOOOOOOOH@@@@@" "@AOOOOOOOOOOOOL@@@@@" "@AOOOOOOOOOOOOL@@@@@" "@AOOOOOOOOOOOON@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@AOOOOOOOOOOOOO@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 63785 NIL } {$IREGION IREGION.DEMOFN (NAME "Nebraska") (174 169 80 45) {(READBITMAP)(80 45 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@COOOOOOOOON@@@@@@@@" "@COOOOOOOOOO@C@@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOO@@@@@" "@COOOOOOOOOOOOOH@@@@" "@COOOOOOOOOOOOOH@@@@" "@COOOOOOOOOOOOOL@@@@" "@COOOOOOOOOOOOOL@@@@" "@COOOOOOOOOOOOOL@@@@" "@AOOOOOOOOOOOOON@@@@" "@AOOOOOOOOOOOOON@@@@" "@AOOOOOOOOOOOOOO@@@@" "@AOOOOOOOOOOOOOO@@@@" "@AOOOOOOOOOOOOOO@@@@" "@AOOOOOOOOOOOOOO@@@@" "@AOOOOOOOOOOOOOOH@@@" "@AOOOOOOOOOOOOOOH@@@" "@AOOOOOOOOOOOOOOH@@@" "@AOOOOOOOOOOOOOOH@@@" "@@@@@GOOOOOOOOOOL@@@" "@@@@@GOOOOOOOOOOL@@@" "@@@@@GOOOOOOOOOOH@@@" "@@@@@GOOOOOOOOOOL@@@" "@@@@@GOOOOOOOOOOL@@@" "@@@@@GOOOOOOOOOON@@@" "@@@@@GOOOOOOOOOON@@@" "@@@@@GOOOOOOOOOON@@@" "@@@@@GOOOOOOOOOOO@@@" "@@@@@GOOOOOOOOOOOH@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 17409 NIL } {$IREGION IREGION.DEMOFN (NAME "South Dakota") (175 195 71 44) {(READBITMAP)(71 44 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOO@@@@@" "@COOOOOOOOOOOOO@@@@@" "@COOOOOOOOOOOOO@@@@@" "@COOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@GOOOOOOOOOOOON@@@@@" "@GOOOOOOOOOOOON@@@@@" "@GOOOOOOOOOOOON@@@@@" "@GOOOOOOOOOOOON@@@@@" "@GOOOOOOOOOOOOO@@@@@" "@@@@@@@@@@@COOO@@@@@" "@@@@@@@@@@@AOIN@@@@@" "@@@@@@@@@@@@@@N@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 57427 NIL } {$IREGION IREGION.DEMOFN (NAME "North Dakota") (175 220 72 52) {(READBITMAP)(72 52 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOON@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 40967 NIL } {$IREGION IREGION.DEMOFN (NAME "New Mexico") (136 79 63 75) {(READBITMAP)(63 75 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOOOOOOON@@@" "@@OOOOGOOOOON@@@" "@@OOOO@@@@@@@@@@" "@@OOOOH@@@@@@@@@" "@@OH@@@@@@@@@@@@" "@@OH@@@@@@@@@@@@" "@@OH@@@@@@@@@@@@" "@@OH@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 46505 NIL } {$IREGION IREGION.DEMOFN (NAME "Colorado") (142 139 62 51) {(READBITMAP)(62 51 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "COOOOOOOOOOOO@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 62023 NIL } {$IREGION IREGION.DEMOFN (NAME "Arizona") (98 79 59 75) {(READBITMAP)(59 75 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@HGOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@AOOOOOOOOOH@@@@" "@@OOOOOOOOOH@@@@" "@@OOOOOOOOOH@@@@" "@@OOOOOOOOOH@@@@" "@AOOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@GOOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "@OOOOOOOOOOH@@@@" "AOOOOOOOOOOH@@@@" "@COOOOOOOOOH@@@@" "@@GOOOOOOOOH@@@@" "@@@OOOOOOOOH@@@@" "@@@COOOOOOOH@@@@" "@@@@GOOOOOOH@@@@" "@@@@AOOOOOOH@@@@" "@@@@@GOOOOOH@@@@" "@@@@@@OOOOOH@@@@" "@@@@@@AOOOOH@@@@" "@@@@@@@OOOOH@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 42623 NIL } {$IREGION IREGION.DEMOFN (NAME "Utah") (96 131 61 74) {(READBITMAP)(61 74 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@AOOOOO@@@@@@@@" "@@AOOOOO@@@@@@@@" "@@AONOOO@@@@@@@@" "@@AOLGOO@@@@@@@@" "@@AOLGOO@@@@@@@@" "@@AOLGOO@@@@@@@@" "@@AOLCOO@@@@@@@@" "@@AON@OO@@@@@@@@" "@@AON@GO@@@@@@@@" "@@AOOLCO@@@@@@@@" "@@AOOLOOOOON@@@@" "@@AOOLGOOOON@@@@" "@@AOONOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 17392 NIL } {$IREGION IREGION.DEMOFN (NAME "Wyoming") (118 173 71 63) {(READBITMAP)(71 63 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOH@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@AOOOOOOOOOOOOL@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 26681 NIL } {$IREGION IREGION.DEMOFN (NAME "Montana") (89 213 112 57) {(READBITMAP)(112 57 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "AOOOOOOOOOOOOOOOOOOOOOL@@@@@" "@OOOOOOOOOOOOOOOOOOOOON@@@@@" "@GOOOOOOOOOOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOOOOOOOOON@@@@@" "@@OOOOOOOOOOOOOOOOOOOON@@@@@" "@@GOOOOOOOOOOOOOOOOOOON@@@@@" "@@COOOOOOOOOOOOOOOOOOON@@@@@" "@@AOOOOOOOOOOOOOOOOOOON@@@@@" "@@@OOOOOOOOOOOOOOOOOOON@@@@@" "@@@OOOOOOOOOOOOOOOOOOON@@@@@" "@@@COOOOOOOOOOOOOOOOOON@@@@@" "@@@@OOOOOOOOOOOOOOOOOON@@@@@" "@@@@OOOOOOOOOOOOOOOOOON@@@@@" "@@@@OOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AOOOOOOOOOOOOOOOOOON@@@@@" "@@@AKOOOOOOOOOOOOOOOOON@@@@@" "@@@@@OOOOOOOOOOOOOOOOON@@@@@" "@@@@@OOOOOOOOOOOOOOOOON@@@@@" "@@@@@OOOOOOOOOOOOOOOOON@@@@@" "@@@@@GOOOOOOOOOOOOOOOON@@@@@" "@@@@@COOOOOOOOOOOOOOOON@@@@@" "@@@@@AOOOOOOOOOOOOOOOON@@@@@" "@@@@@AOOON@@@@@@@@@@@@@@@@@@" "@@@@@COOON@@@@@@@@@@@@@@@@@@" "@@@@@@GOOL@@@@@@@@@@@@@@@@@@" "@@@@@@GOO@@@@@@@@@@@@@@@@@@@" "@@@@@@GL@@@@@@@@@@@@@@@@@@@@" "@@@@@@B@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@")} 21401 NIL } {$IREGION IREGION.DEMOFN (NAME "Nevada") (59 122 62 78) {(READBITMAP)(62 78 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@OOOOOOOOOON@@@@" "@GOOOOOOOOON@@@@" "@COOOOOOOOON@@@@" "@AOOOOOOOOON@@@@" "@@OOOOOOOOON@@@@" "@@COOOOOOOON@@@@" "@@AOOOOOOOON@@@@" "@@@OOOOOOOON@@@@" "@@@GOOOOOOON@@@@" "@@@COOOOOOON@@@@" "@@@AOOOOOOON@@@@" "@@@AOOOOOOON@@@@" "@@@@GOOOOOON@@@@" "@@@@COOOOOON@@@@" "@@@@AOOOOOON@@@@" "@@@@@OOOOOON@@@@" "@@@@@GOOOOON@@@@" "@@@@@COOOOON@@@@" "@@@@@AOOOOON@@@@" "@@@@@@OOOOON@@@@" "@@@@@@GOOOON@@@@" "@@@@@@COOOON@@@@" "@@@@@@AOOOON@@@@" "@@@@@@@OOOON@@@@" "@@@@@@@GOOON@@@@" "@@@@@@@COOON@@@@" "@@@@@@@AOOON@@@@" "@@@@@@@@OOON@@@@" "@@@@@@@@GONN@@@@" "@@@@@@@@COL@@@@@" "@@@@@@@@AOL@@@@@" "@@@@@@@@@ON@@@@@" "@@@@@@@@@GL@@@@@" "@@@@@@@@@GN@@@@@" "@@@@@@@@@CN@@@@@" "@@@@@@@@@AN@@@@@" "@@@@@@@@@@N@@@@@" "@@@@@@@@@@B@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 35762 NIL } {$IREGION IREGION.DEMOFN (NAME "Idaho") (76 184 62 86) {(READBITMAP)(62 86 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GN@@@@@@@@@@@@" "@@GO@@@@@@@@@@@@" "@@GOH@@@@@@@@@@@" "@@GOL@@@@@@@@@@@" "@@GOL@@@@@@@@@@@" "@@GOL@@@@@@@@@@@" "@@GOL@@@@@@@@@@@" "@@GON@@@@@@@@@@@" "@@GOOH@@@@@@@@@@" "@@GOOL@@@@@@@@@@" "@@GOON@@@@@@@@@@" "@@GOOO@@@@@@@@@@" "@@GOOO@@@@@@@@@@" "@@GOOOH@@@@@@@@@" "@@GOOON@@@@@@@@@" "@@GOOOO@@@@@@@@@" "@@GOOOO@@@@@@@@@" "@@GOOON@@@@@@@@@" "@@COOON@@@@@@@@@" "@@COOON@@@@@@@@@" "@@COOON@@@@@@@@@" "@@AOOON@@@@@@@@@" "@@@OOON@@@@@@@@@" "@@@GOON@@@@@@@@@" "@@@GOONB@@@@@@@@" "@@@GOOOO@@@@@@@@" "@@@OOOOO@@@@@@@@" "@@@OOOOOH@@@@@@@" "@@@OOOOOL@@@@@@@" "@@AOOOOON@@@@@@@" "@@AOOOOON@@@@@@@" "@@COOOOOL@@@@@@@" "@@GOOOOON@@@@@@@" "@@GOOOOOOH@@@@@@" "@@OOOOOOOH@@C@@@" "@@OOOOOOOLAOO@@@" "@@OOOOOOONOOO@@@" "@@COOOOOOOOOO@@@" "@@COOOOOOOOOO@@@" "@@COOOOOOOOOO@@@" "@@COOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@GOOOOOOOOOO@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@")} 30635 NIL } {$IREGION IREGION.DEMOFN (NAME "California") (21 91 94 111) {(READBITMAP)(94 111 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@GOOOOOOH@@@@@@@@@@@@@" "@@@GOOOOOOH@@@@@@@@@@@@@" "@@@GOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@GOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@@@@@" "@@AOOOOOOOH@@@@@@@@@@@@@" "@@@OOOOOOOH@@@@@@@@@@@@@" "@@@GOOOOOOH@@@@@@@@@@@@@" "@@@COOOOOOH@@@@@@@@@@@@@" "@@@COOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@AOOOOOOH@@@@@@@@@@@@@" "@@@@OOOOOOL@@@@@@@@@@@@@" "@@@@OOOOOON@@@@@@@@@@@@@" "@@@@GOOOOOO@@@@@@@@@@@@@" "@@@@COOOOOOH@@@@@@@@@@@@" "@@@@AOOOOOOL@@@@@@@@@@@@" "@@@@@OOOOOOO@@@@@@@@@@@@" "@@@@@OOOOOOOH@@@@@@@@@@@" "@@@@@GOOOOOOL@@@@@@@@@@@" "@@@@@GOOOOOON@@@@@@@@@@@" "@@@@@BOOOOOOO@@@@@@@@@@@" "@@@@@@GOOOOOO@@@@@@@@@@@" "@@@@@@COOOOOOH@@@@@@@@@@" "@@@@@@COOOOOON@@@@@@@@@@" "@@@@@@AOOOOOOO@@@@@@@@@@" "@@@@@@AOOOOOOOH@@@@@@@@@" "@@@@@@GOOOOOOOL@@@@@@@@@" "@@@@@@GOOOOOOON@@@@@@@@@" "@@@@@@GOOOOOOOO@@@@@@@@@" "@@@@@@COOOOOOOOH@@@@@@@@" "@@@@@@@GOOOOOOOL@@@@@@@@" "@@@@@@@GOOOOOOON@@@@@@@@" "@@@@@@@COOOOOOOO@@@@@@@@" "@@@@@@@COOOOOOOOH@@@@@@@" "@@@@@@@OOOOOOOOOL@@@@@@@" "@@@@@@@GOOOOOOOON@@@@@@@" "@@@@@@@GOOOOOOOOO@@@@@@@" "@@@@@@@GOOOOOOOOOH@@@@@@" "@@@@@@@COOOOOOOOOL@@@@@@" "@@@@@@@AOOOOOOOOON@@@@@@" "@@@@@@@@OOOOOOOOOO@@@@@@" "@@@@@@@@OOOOOOOOOOH@@@@@" "@@@@@@@@GOOOOOOOOOL@@@@@" "@@@@@@@@GOOOOOOOOOL@@@@@" "@@@@@@@@COOOOOOOOON@@@@@" "@@@@@@@@@OOOOOOOOOO@@@@@" "@@@@@@@@@OOOOOOOOOOH@@@@" "@@@@@@@@@OOOOOOOOOOL@@@@" "@@@@@@@@@GOOOOOOOOOO@@@@" "@@@@@@@@@COOOOOOOOOOH@@@" "@@@@@@@@@COOOOOOOOOOH@@@" "@@@@@@@@@COOOOOOOOOOH@@@" "@@@@@@@@@COOOOOOOOOOL@@@" "@@@@@@@@@COOOOOOOOOOL@@@" "@@@@@@@@@COOOOOOOOOON@@@" "@@@@@@@@@@@COOOOOOOOO@@@" "@@@@@@@@@@@AOOOOOOOOO@@@" "@@@@@@@@@@@@OOOOOOOOO@@@" "@@@@@@@@@@@@OOOOOOOON@@@" "@@@@@@@@@@@@@GOOOOOOL@@@" "@@@@@@@@@@@@@COOOOOOL@@@" "@@@@@@@@@@@@@COOOOOOL@@@" "@@@@@@@@@@@@@@GOOOOOL@@@" "@@@@@@@@@@@@@@COOOOOH@@@" "@@@@@@@@@@@@@@AOOOOOH@@@" "@@@@@@@@@@@@@@@OOOOO@@@@" "@@@@@@@@@@@@@@@GOOOO@@@@" "@@@@@@@@@@@@@@@GOOOO@@@@" "@@@@@@@@@@@@@@@COOOO@@@@" "@@@@@@@@@@@@@@@COOOOH@@@" "@@@@@@@@@@@@@@@AOOOOL@@@" "@@@@@@@@@@@@@@@AOOOOH@@@" "@@@@@@@@@@@@@@@AOOH@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@")} 20396 NIL } {$IREGION IREGION.DEMOFN (NAME "Oregon") (28 188 70 52) {(READBITMAP)(70 52 "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@AOH@@@@@@@@@@@@@@@@" "@AOL@@@@@@@@@@@@@@@@" "@AOL@@@@@AOOOOL@@@@@" "@AOL@@@@@OOOOON@@@@@" "@AOL@@@BGOOOOOO@@@@@" "@AON@OOOOOOOOOO@@@@@" "@COOOOOOOOOOOOO@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOON@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOL@@@@@" "@COOOOOOOOOOOOH@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOOO@@@@@@" "@COOOOOOOOOOON@@@@@@" "@COOOOOOOOOOON@@@@@@" "@COOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOON@@@@@@" "@GOOOOOOOOOOOOH@@@@@" "@GOOOOOOOOOOOOH@@@@@" "@GOOOOOOOOOOOOH@@@@@" "@GOOOOOOOOOOOO@@@@@@" "@GOOOOOOOOOOOO@@@@@@" "@GOOOOOOOOOOOO@@@@@@" "@OOOOOOOOOOOOO@@@@@@" "@OOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "COOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "AOOOOOOOOOOOOO@@@@@@" "@OOOOOOOOOOOOO@@@@@@" "@OOOOOOOOOOOOO@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@")} 13978 NIL } {$IREGION IREGION.DEMOFN (NAME "Washington") (21 223 82 45) {(READBITMAP)(82 45 "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@COOOOOOOOON@@@@@@@@" "@@@@@@OOOOOOOOON@@@@@@@@" "@@@@@@OOOOOOOOON@@@@@@@@" "@@@@@@OOOOOOOOON@@@@@@@@" "@@@@@@OOOOOOOOON@@@@@@@@" "@@@@@@OOOOOOOOON@@@@@@@@" "@@H@@@GOOOOOOOON@@@@@@@@" "@@O@@@GOOOOOOOON@@@@@@@@" "@@OON@COOOOOOOON@@@@@@@@" "@@GOOLCOOOOOOOON@@@@@@@@" "@@GOOHGOOOOOOOON@@@@@@@@" "@@COO@GOOOOOOOON@@@@@@@@" "@@AOO@GOOOOOOOON@@@@@@@@" "@@AON@GOOOOOOOON@@@@@@@@" "@@AOL@GOOOOOOOON@@@@@@@@" "@@AOOHGOOOOOOOON@@@@@@@@" "@@@OO@OOOOOOOOON@@@@@@@@" "@@@ONGOOOOOOOOON@@@@@@@@" "@@@OOOOOOOOOOOON@@@@@@@@" "@@@OOOOOOOOOOOON@@@@@@@@" "@@@OOOOOOOOOOOON@@@@@@@@" "@@@GOOOOOOOOOOON@@@@@@@@" "@@@GOOOOOOOOOOON@@@@@@@@" "@@@GOOOOOOOOOOON@@@@@@@@" "@@@GOOOOOOOOOOON@@@@@@@@" "@@@GOOOOOOOOOOON@@@@@@@@" "@@@@@OOOOOOOOOOO@@@@@@@@" "@@@@@GOOOOOOOOOO@@@@@@@@" "@@@@@COOOOOL@@@@@@@@@@@@" "@@@@@COOOOL@@@@@@@@@@@@@" "@@@@@COOOK@@@@@@@@@@@@@@" "@@@@@CN@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@")} 64926 NIL })) (RPAQ \AIR.DEMO.BM (READBITMAP)) (502 291 "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@@@@@@@@AN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@LJ@@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@AH@@@@@@@@@@DKL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@LMH@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@G@B@@@@@@@@GJCOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@MLH@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@NCN@@@@@@@KH@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@N@GLH@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@ALO@@@@@@GN@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@MHCCH@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@@@OH@@@@@IL@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@OOOAH@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@KH@@@@H@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@KOLCD@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@DHAH@@H@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@HGOCL@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@FFOLA@@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@H@@NN@@@@@@@@@HA@@@@@@@@@@@@@@@@@@@@@AH@@@@@@@@@@@A@@@@@@@@@AH@CN@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@D@@AN@@@@@@@@@H@H@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@H@@@@@@GOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@D@@CL@@@@@@@@@H@D@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@G@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@GD@@@@@@@@@H@B@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@CH@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@ED@@@@@@@@@H@B@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@@L@@@@@@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@HL@@@@@@@@@H@B@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@A@@@@@L@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@ALL@@@@@@@@@H@B@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@B@@@@AD@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@CK@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@CL@@@@@@@@@H@AH@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@D@@@@BD@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@BMN@@@@@@@@@@@@@@@@@" "@@@@@@@@H@GH@@@@@@@@@H@@D@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@H@@@@OH@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@D@AH@@@@@@@@@@@@@@@@" "@@@@@@@@H@L@@@@@@@@@@H@@B@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@A@@@@AF@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@L@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@A@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@F@@@@NB@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@@H@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@D@@@@@@@@HGN@A@AO@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@@H@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@L@@@@@@@AAHD@N@@@H@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@F@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@D@@@@@@@GN@HG@@@@H@COI@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@AH@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@D@@@@@@@D@@OH@@@@D@D@AD@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@@H@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@D@@@@@@@D@@@L@@@@COH@AON@@@@@@@@@@@@@@@@@@@@@@@@@D@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@@H@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@F@@@@@@@D@@@D@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@H@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@A@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@@D@@@CH@@@@@@@@@CL@@@@@@@@@@@@@@@@@@@@@@@A@@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@GOH@@@@@@@@@@D@@@A@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@@D@@@@GL@@@@@@@@@KOOH@@@@@@@@@@@@@@@@@@@@A@@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@B@D@@@@@@@@@@D@@@A@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@@D@@@@@B@@@@@@N@CN@@D@@@@@@@@@@@@@@@@@@@@A@@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@B@B@@@@@AOOOOL@@@A@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOON@@@@@@@H@@@@@AN@@@COAGOO@@COH@@@@@@@@@@@@@@@@@@A@@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@B@B@@@@AN@@@@B@@@A@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@C@@@@@@@AH@HD@@H@COOM@G@@@@@@@@@@@@@@@@@@A@@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@B@B@@@BG@@@@@A@@@A@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@B@@@@@@@@N@OL@AL@@@F@HA@@@@@@@@@@@@@@@@@@B@@@@D@@@@@@@@@@@@@@@@" "@@@@@@@@B@B@OOMH@@@@@@H@@AB@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@L@@@@@@B@@@@@@@@BA@@@ACH@@BC@A@@@@@@@@@@@@@@@@@@N@@@@B@@@@@@@@@@@@@@@@" "@@@@@@@@B@AO@@@@@@@@@@H@@AMH@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@H@@@@@@F@@@@@@@@BB@@@A@D@@AN@@L@@@@@@@@@@@@@@@@@H@@@@AH@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@@H@@@@H@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@D@@@@@@A@@@@@@@@BB@@@C@C@@@@@@D@@@@@@@@@@@@@@@@@H@@@@A@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@A@@@@@H@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@B@@@@@@A@@@@@@@@BD@@@F@@N@@@@@G@@@@@@@@@@@@@@@@AH@@@@@H@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@A@@@@@D@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@A@@@@@@B@@@@@@@@AIH@@H@@A@@@L@A@@@@@@@@@@@@@@@AN@@@@@@H@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@A@@@@@B@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@A@@@@@@B@@@@@@@@AJH@@H@@A@@AJ@@H@@@@@@@@@@@@@@BL@@@@@@N@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@B@@@@@A@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@A@@@@@@B@@@@@@@@@K@@G@@@A@@@F@@H@@@@@@@@@@@@@GOL@@@@@@B@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@B@@@@@A@@@@OOOOOOOOOOOOOH@@@@@@@@@@@@A@@@@@@B@@@@@@@@CK@@H@@@A@@@C@@D@@@@@@@@OOOOOHBD@@@@@@B@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@D@@@@@B@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@B@@@@@@@@BN@A@@@@A@@@BH@D@@@@@@@C@@@H@@BD@@@@@@B@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@@@AL@@AH@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@B@@@@@@@@CB@A@@@@A@@@BL@N@@@@@@@D@@@H@@DD@@@@@@B@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@@H@@@@@@D@@GH@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@A@@@@@@@@GB@B@@@@A@@@BC@H@@@@@@@L@@@H@@DD@@@@@AL@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@A@@@@@@@DAOLH@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@AL@@@@@@@@D@B@@@@A@@@B@OH@@@@@@A@@@@H@@DD@@@@@F@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@A@@@@@@@BN@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@G@@@@@@@@D@B@@@@A@@@D@@@@@@@@@F@@@@H@@LD@@@@GL@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@@@@@@A@@@@@@@A@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@H@@@@@@@H@B@@@@A@@@H@@@@@@@@AN@@@@H@A@D@@@GM@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@AL@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@D@@@@@@@H@D@@@@C@@@H@@@@@@@@NL@@@@H@B@D@@@H@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@D@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@D@@@@@@@H@H@@@@B@@A@@@@@@@AO@D@@@@H@B@B@@@H@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@D@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@B@@@@@@A@@H@@@@LG@A@@@@@@@N@@H@@@@H@D@B@@C@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@D@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@AL@@@@@A@@H@@@A@HHA@@@@@GO@@@H@@@@H@D@B@@D@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@D@@@@@A@@H@@@AA@HA@@@@CH@@@A@@@@@H@D@B@CL@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@D@@@@@A@@H@@@AB@HA@@@@D@@@@A@@@@@H@H@BAL@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@D@@@@@A@@H@@@AL@HA@@@AH@@@@A@@@@@H@H@BA@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@COOOOOOOOOL@@@@@B@@H@@@@@@DA@@@B@@@@@B@@@@@LA@@BC@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@B@@@@@@@@@D@@@@@B@@H@@@@@@DA@@@B@CL@@D@@@@@DA@@BB@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@B@@@@@@@@@F@@@@@B@@D@@@@@@DB@@@BCLCOOH@@@@@DA@@BD@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@B@@@@@@@@@B@@@@@B@@D@@@@@@DD@@@CN@@@@@@@@@@DA@@BD@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@B@@@@@B@@D@@@@@@FH@@@@B@@@@@@@@@@DA@@AH@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@AOOOOOOOOOOH@@A@@@@@@@@@B@@@@@B@@B@@@@@@C@@@@@A@@@@@@@@@@DB@@@H@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@D@LB@@@@@@@@@B@@@@@B@@B@@@@@@B@@@@AIH@@@@@@@@@DB@@A@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@D@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@COBB@@@@@@@@@B@@@@@B@@B@@@@@@B@@@CNGH@@@@@@@@@DB@@A@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@AN@@@@@@@@@AH@@@@B@@B@@@@@@D@A@D@C@@@@@@@@@@GOOOO@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@B@@@@@@@@@@D@@@@B@@B@@@@@AL@NOL@B@@@@@@@@@@D@@@A@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@@COOOON@@B@@@@@BNA@@@@D@@@@@@@@@@H@@@B@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@A@@@@@@@@@@A@@@@B@@B@@@@@CBC@@@AH@@@@@@@@@@H@@@B@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@@H@@@@@@@@@A@@@@B@@D@@@@@GND@@@F@@@@@@@@@@@H@@@C@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@@H@@@@@@@@@@H@@@B@@H@@@@@L@H@@@L@@@@@@@@@@@H@@@@H@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@@@@@@@H@@@@@@@@@@H@@@@@@@@@@@A@@@@@@@@@@@@@@H@@@@@@@@@@D@@@A@@H@@@@@LC@@@CD@@@@@@@@@@A@@@@@I@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@@@@@@@AH@@@@@@@@@@@@@D@@@@@@@@@@D@@@A@A@@@@@@KL@@ALGOOOOOOOL@@AOOON@DL@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@@@@@H@@@@@@@@@@@@H@@@@@@@@@@@@@D@@@@@@@@@@D@@@@HA@@@@@A@@@@FH@@@@@@@@B@@A@@@I@DD@@@@@@@@@@@@@@@@@@@@" "@@@@@@@AH@@@@@@B@@@@@@@@@@B@@@@@H@@@@@@@@@@@@H@@@@@@@@@@@@@B@@@@@@@@@@D@@@@HGOOOH@B@@@AHH@@@@@@@@A@@A@@@I@GL@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@A@@@H@@@@@@@@@@@@H@@@@@@@@@@@@@B@@@@@@@@@@H@@@@LH@@@OOO@@@B@H@@@@@@@@@H@A@@@HH@L@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@B@@@@@@@@@@B@BH@@H@@@@@@@@@@@@H@@@@@@@@@@@@@B@@@@@@@@@@H@@@@K@@@@H@@L@AL@H@@@@@@@@@H@A@@@HDG@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@B@@@@@@@@@@B@BH@@H@@@@@@@@@@@@H@@@@@@@@@@@@@C@@@@@@@@@G@@@@@H@@@@H@@CLN@@H@@@@@@@@@D@A@@@KOD@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@B@@@@@@@@@@B@BH@@H@@@@@@@@@@@@H@@@@@@@@@@@@@A@@@@@@@@AH@@@@@H@@@@H@@BC@@@H@@@@@@@@@B@A@@AF@H@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@BD@@H@@@@@@@@@@@@H@@@@@@@@@@@@@A@@@@@@@@A@@@@@@H@@@@H@@@@@@@H@@@@@@@@@CHA@OOH@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@AC@@H@@@@@@@@@@@@H@@@@@@@@@@@@@A@@@@@@@@B@@@@@@H@@@@H@@@@@@@H@@@@@@@@@DDCG@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@ALH@H@@@@@@@@@@@@H@@@@@@@@@@@@@A@@@@@@@@A@@@@@@H@@@@H@@@@@@@H@@@@@@@@@HCJHAO@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@@BL@OOOOOOOOOOOOOOOON@@@@@@@@@@@H@@@@@@@A@@@@@@H@@@@H@@@@@@@H@@@@@@@@A@@JCNF@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@B@@@@@@@@@@B@@C@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@H@@@@@@@A@@@@@@H@@@@H@@@@@@@H@@@@@@@@@H@LLAH@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@@BH@@@@A@@@@@@@@@@@@B@@@@@@@@@@A@@@@@@@@B@@@@@@H@@@@H@@@@@@@H@@@@@@@@A@@HGN@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@B@@@@@@@@@@B@@A@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@H@@@@@@FF@@@@@@H@@@@H@@@@@@@H@@@@@@@@A@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@OOOOOOOJH@@@@@@H@@@@H@@@@@@@H@@@@@@@@A@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@D@@@@@@AH@@@@@@H@@@@H@@@@@@@H@@@@@@@@@H@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@D@@@@@@@H@@@@@@H@@@@H@@@@@@@H@@@@@@@@@D@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@A@@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@D@@@@@@A@@@@@@@H@@@@H@@@@@@AH@@@@@@@@@D@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@H@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@B@@@@@@A@@@@@@@H@@@@H@@@@@@AH@@@@@@@@@B@H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@D@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@A@@@@@@A@@@@@@@H@@@@H@@@@@@BH@@@@@@@@@LA@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@B@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@COOOOOOOOOOOO@@@@@@@H@@@@@@H@@@@H@@@@@@BH@@@@@@@@AHA@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@B@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@L@@@@@@H@@@@@@H@@@@H@@@@@@BH@@@@@@@@O@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@B@@@@@@H@@@@@@H@@@@H@@@@@@BOOOOOOOOOD@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@D@@@@@@D@@@@@@H@@@@H@@@@@@D@A@@@@@@AL@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@D@@@@@@B@@@@@@H@@@@H@@@@@@H@AAO@@@@AH@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@B@@@@@@A@@@@@@H@@@@H@@@@@@H@AB@H@@@AL@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@B@@@@@@@H@@@@@H@@@@H@@@@@G@@AD@L@@AAFAL@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@A@@@@@@@D@@@@@H@@@@H@@@@AH@@AH@KN@CAEA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@B@@@@@H@@@@H@@@@A@@@@@A@B@CADI@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@A@@@@@@B@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@B@@@@@H@@@@OH@@@F@@@@@B@A@CABF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@H@@@@@A@@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@A@@@@@H@@@@HH@@@O@@@@@F@@LCABD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@H@@@@@@H@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@L@@@@H@@@@HG@@@L@@@@AH@@FEAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@D@@@@@@D@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@D@@@@H@@@O@@HD@H@@@@B@@@DEA@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@B@@@@@@B@@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@D@@@@H@@@H@@GO@H@@@@B@@@LMAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@A@@@@@@AH@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@D@@@@H@@A@@@@AI@@@@AD@@@HII@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@H@@@@@@D@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@H@@@A@@@B@@@@@N@@@@CH@@@DDHOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@H@@@@@@B@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@H@@@B@@@F@@@@@D@@@@D@@@@DDHAH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@D@@@@@@A@@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@H@@@D@@@H@@@@@D@@@@D@@@@CDHA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@D@@@@@@@H@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@D@@@D@@LH@@@@@H@@@@H@@@@OLLC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@BH@@@@@@D@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@D@@@D@@K@@@@@@D@@@@H@@@@HFEO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@AL@@@@@@D@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@CH@@GNNH@@@@@@B@@@A@@@@@G@CF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@B@@@@@@C@@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@L@@DAA@@@@@@@B@@@B@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@J@@@@@@@H@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@D@@H@@@@@@@@@A@@@D@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@M@@@@@@@D@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@B@@H@@@@@@@@@@H@@D@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@G@@@@@@@B@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@B@A@@@@@@@@@@@D@@D@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@D@@@@@@@A@@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@B@B@@@@@@@@@@AJ@GH@@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@D@@@@@@@@H@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@B@D@@@@@@@@@@BACH@@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@D@@@@@@@@D@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@BGH@@@@@@@@@@D@L@@@@@@@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@B@@@@@@@@B@@@@@B@@@@@@@@A@@@@@@@@@@@@B@@@@@@@@@@@@@H@@@@@@@@AH@@@@@@@@@@AH@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@AL@@@@@@@A@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@@@@@L@@@@@@@@@@C@@@@@@@@@@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@D@@@@@@@@H@@@@B@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@H@@@@@@@@@D@@@@@@@@@AO@@@@@@@@@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@B@@@@@@@@D@@@@B@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@H@@@@@@@@@D@@@@@@@@@B@@@@@@@@@@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@F@@@@@@@@B@@@@B@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@H@@@@@@@@@H@GOOOH@@@F@@@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@H@@@@@@@@A@@@@B@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@H@@@@@@@@A@@L@@@GOOOOOOOOOOOOOOOOON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@D@@@@@@@@@H@@@B@@@@@@@@A@@@@@@@@@@AOOOOOL@@@@@@@@@OOOOOOOOLGOOH@@@@@@@@@@A@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@D@@@@@@@@@D@@@B@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@BB@@@@@@@@@@@@@C@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@D@@@@@@@@@B@@@B@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@DD@@@@@@@@@@@@@D@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@B@@@@@@@@@A@@BB@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@DD@@@@@@@@@@@@AL@@@@@@@@@BK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@A@@@@@@@@@@H@EN@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@HD@@@@@@@@@@@@B@@@@@@@@@@GA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@H@@@@@@@@@D@D@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@GH@@@@@@@@@@@AL@@@@@@@@@@GIH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@H@@@@@@@@@B@B@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@@H@@@@@@@@@@@B@@@@@@@@@@@@GH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@D@@@@@@@@@A@D@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@D@@@@@@@AH@@@@@@@@@@@L@@@@@@@@@@@@EH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@D@@@@@@@@@A@B@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@A@@@@@@@@@@@A@@@@@@@@@@@@@ID@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@B@@@@@@@@@@HB@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@A@@@@@@@@@@@N@@@@@@@@@@@@@GD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@AH@@@@@@@@@DB@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@F@@@@@@@@@@A@@@@@@@@@@@@CNDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@H@@@@@@@@@BB@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@F@@@@@@@@@@B@@@@@@@@@@@@AIHD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@H@@@@@@@@@AJ@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@F@@@@@@@@@@D@@@@@@@@@@@@@D@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@D@@@@@@@@@@F@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@F@@@@@@@@@@H@AOOO@@@@@@@DHC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@B@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@L@@@@@@@@@@H@F@@@L@@@@@@CLD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@B@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@@OOOOOOOOOOOOOL@@@B@@@@@@AK@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@B@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@AH@@@H@@@A@@@AH@@@COL@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@C@@@@H@@@A@@@A@@@@@@C@@@CCN@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@D@@@@@@@@@B@@@@@@B@@@@H@@@A@@@AH@@@@@@H@@AOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@B@@@@@@@@@@@H@@@@@@@@A@@@@@@@@@@A@@@@@F@@@@@@@@@B@@@@@@B@@@@H@@@A@@@@D@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@AON@@@@@@@@@D@@@@@@@@A@@@@@@@@@@A@@@@@AL@@@@@@@@B@@@@@@B@@@@H@@@A@@@@F@@@@@@D@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@A@@@@@@@@@D@@@@@@@@A@@@@@@@@@@A@@@@@@C@@@@@@@@B@@@@@@N@@@@H@@@A@@@@C@@@@@@B@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@H@@@@@@@@D@@@@@@@@A@@@@@@@@@@A@@@@@@AL@@@@@@@B@@@@@AH@@@@H@@@AH@@@A@@@@@@A@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@H@@@@@@@@H@@@@@@@@A@@@@@@@@@@A@@@@@@@CN@@@@@@B@@@@@AH@@@@H@@@@H@@@@H@@@@@@HA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@GL@@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@@@@CH@@@@@B@@@@@A@@@@A@@@@@H@@@@D@@@@@@DA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@B@@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@GA@AIHD@@@@@A@@@@A@@@@@H@@@@F@@@@@@CO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@B@@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@NNFFFD@@@@@C@@@@A@@@@@H@@@@C@@@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@AL@@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@AH@AL@@@@@C@@@@A@@@@@H@@@@A@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@B@@@@@C@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@GH@@@@B@@@@A@@@@@D@@@@AH@@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@A@@@@@B@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@A@@@@@D@@@@@D@@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@H@@@@D@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@A@@@@@D@@@@@B@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@D@@@@D@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@A@@@@@D@@@@@B@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@D@@@@D@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@A@@@@@D@@@@@B@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@B@@@@D@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@A@@@@@D@@@@@A@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@B@@@@B@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@GOOOON@@@@B@@@@@F@@@@@@H@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@A@@@@A@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@B@@@@@@D@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@A@@@@C@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@B@@@@@@D@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@A@@COL@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@B@@@@@@D@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@AOOL@D@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@B@@@@@@B@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@A@@@@@@A@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@G@@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@A@@@@B@@@@@A@@@@@@A@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@A@@@@@@A@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@A@@@@@@AA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@@@@@A@@@@H@@@@@A@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@B@@@@@@@J@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@A@@@@OOOOOOO@@@@@@@@@@@@@@@@D@@@@B@@@@B@@@@@C@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@@@@A@@@@D@@@@@@@@@@@@@@@@@@@@@@D@@@@D@@@@D@@@@@B@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@A@GOON@@@@@@@@@@@@@@@@@@@@@@B@@@@H@@@@D@@@@@B@@@@@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@@A@D@@C@@@@@@@@@@@@@@@@@@@@@@A@@@@H@@@@B@@@@@B@@@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@@A@D@@A@@@@@@@@@@@@@@@@@@@@@@@H@@A@@@@@B@@@@@B@@@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@A@D@@AH@@@@@@@@@@@@@@@@@@@@@@H@@A@@@@@B@@@@@B@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOOOL@@@L@@@@@@@@@@@@@@@@@@@@@@H@@A@@@@@B@@@@@B@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@H@@A@@@@@B@@@@@B@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@@@@H@@B@@@@@B@@@@@B@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@H@@B@@@@@B@@@@@A@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@@@H@@COOOH@B@OOOOO@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@@@H@@@@@@H@B@H@@@AL@@@@BD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@@@@@@@@@@@@@@@@@@@H@@@@@@H@B@H@@@@H@@@@EL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@A@@@@@@@H@B@D@@@@OOON@DD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@A@@@@@@@H@B@D@@@@@@@ANDD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@@@@@@@@@@@@A@@@@@@@HCB@E@@@@@@@@ADD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@@@@@@@@@@@@@@@@@A@@@@@@NDLOJNON@@@@@@@HD@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@@A@@@@@ACM@@G@@AH@@@@@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@A@@@@@@HN@@@@@@F@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@C@@@@@@OG@@@@@@A@@O@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@B@@@@@AOJ@@@@@@@HCHH@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@ANF@@@@@@@@@@@@@B@@@L@@BA@@@@@@@HD@D@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@BAI@@@@@@@@@@@A@COHAB@@AF@@@@@@@KL@B@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@D@@H@@@@@@@@@@AIL@FAB@@AN@@@@@@@D@@A@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@D@@D@@@@@@@@@@CJ@@ANOL@FL@@@@@@@@@@A@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@H@@D@@@@@@@@@@BL@@@@@D@CO@@@@@@@@@@@H@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@H@@B@@@@@@@@@@C@@@@@@NABKH@@@@@@@@@@H@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FAH@@A@@@@@@@@@@F@@@@@@FBJGD@@@@@@@@@@D@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AA@@@@H@@@@@@@@@D@@@@@@ALDBL@@@@@@@@@@C@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@H@@@@@@@@@H@@@@@@@@@AH@@@@@@@@@@@H@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@A@@@@@@@@@@A@@@@@@@@@@@@H@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@H@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@C@L@@@@@@@@@@@@@@@@@@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@CO@@@@@@@@@@@@@@@@@@@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@@@IB@@@@@@@@@@@@@@@@@@@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@H@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@GL@@@@@@@@@@@@@@@@@@@@@@@@A@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@@CH@@@@@@@@@@@@@@@@@@@@@@@@AH@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@AN@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@AJ@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@L@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@DL@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@BL@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@AL@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@D@@FB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@B@@EA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@CL@IA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@AL@IA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@D@EA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@B@BA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@D@@@@@@@@@@@@@@@@@@@@@@@@@@@B@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@D@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CLD@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BL@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@D@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") (DEFINEQ (AIREGIONS.CIRCLES.DEMO [LAMBDA NIL (* edited: "24-Jun-85 08:57") (LET [W (REG (GETBOXREGION 300 300)) (POS1 (QUOTE (153 . 222))) (POS2 (QUOTE (238 . 76))) (POS3 (QUOTE (74 . 73))) (POS4 (QUOTE (100 . 153))) (POS5 (QUOTE (200 . 159))) (POS6 (QUOTE (148 . 71))) (POS7 (QUOTE (152 . 131] (SETQ W (CREATEW REG "Intersecting Circles")) (DRAWCIRCLE 100 100 90 2 NIL W) (DRAWCIRCLE 200 100 90 2 NIL W) (DRAWCIRCLE 150 190 90 2 NIL W) (CURSOR WAITINGCURSOR) (CREATEIR W 33284 NIL NIL (QUOTE (62 98 186 186)) (LIST POS1 POS4 POS5 POS7)) (CREATEIR W 18458 NIL NIL (QUOTE (112 9 185 188)) (LIST POS6 POS2 POS5 POS7)) (CREATEIR W 13793 NIL NIL (QUOTE (12 10 184 186)) (LIST POS6 POS3 POS4 POS7)) (INTERSECTING.IREGIONS? W T) (CURSOR T]) (IREGION.DEMOFN [LAMBDA (WINDOW IREGION BUTTON) (* edited: "23-Jun-85 17:38") (BITBLT NIL 0 0 WINDOW 0 0 300 (IPLUS (ITIMES (FONTPROP (DSPFONT NIL WINDOW) (QUOTE HEIGHT)) 2) (FONTPROP (DSPFONT NIL WINDOW) (QUOTE DESCENT))) (QUOTE TEXTURE) NIL 0) (DSPXPOSITION 0 WINDOW) (DSPYPOSITION (IPLUS (FONTPROP (DSPFONT NIL WINDOW) (QUOTE HEIGHT)) (FONTPROP (DSPFONT NIL WINDOW) (QUOTE DESCENT))) WINDOW) (PRINTOUT WINDOW "State: " (IREGIONPROP IREGION (QUOTE NAME)) T) (PRINTOUT WINDOW "Population: " (ITIMES 80 (STRINGHASHBITS (IREGIONPROP IREGION (QUOTE NAME]) (SETUP.AIREGION.DEMO [LAMBDA NIL (* edited: "23-Jun-85 18:23") (SETQ \AIREGION.DEMOW (CREATEW (QUOTE (100 100 502 291)) "AIRegion Demo")) (BITBLT \AIR.DEMO.BM 0 0 \AIREGION.DEMOW) (WINDOWPROP \AIREGION.DEMOW (QUOTE IREGIONSLIST) \ALL.AIR.IREGIONS) (WINDOWPROP \AIREGION.DEMOW (QUOTE BUTTONEVENTFN) (QUOTE IN.CURSOR.REGION]) ) (SETUP.AIREGION.DEMO) (AIREGIONS.CIRCLES.DEMO) (PUTPROPS AIREGIONS-DEMO COPYRIGHT ("XEROX Corporation" 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL (94937 97176 (AIREGIONS.CIRCLES.DEMO 94947 . 95934) (IREGION.DEMOFN 95936 . 96729) ( SETUP.AIREGION.DEMO 96731 . 97174))))) STOP \ No newline at end of file diff --git a/lispusers/AIREGIONS.TEDIT b/lispusers/AIREGIONS.TEDIT new file mode 100644 index 00000000..6caa433c --- /dev/null +++ b/lispusers/AIREGIONS.TEDIT @@ -0,0 +1,70 @@ +enˇvĹos AIREGIONS 2 4 1 AIREGIONS (Active Irregular Regions) 1 4 By: Greg Wexler (Wexler.pasa@Xerox) and By: Jim Wogulis (Wogulis@ICS.UCI.EDU) New Owner: James Turner (Turner.Lexington@Xerox.com) Uses: FILLREGION, AIREGIONS-DEMO INTRODUCTION The purpose of this package is to provide menu-like operations on irregularly shaped regions within a window and make available general functions that allow users to create their own applications using irregularly shaped active regions. An added feature of AIRegions is that multiple IREGIONs may be activated by selecting the intersecting area of those IREGIONs. (Throughout this document an irregularly shaped region will be referred to as an IREGION). DESCRIPTION Virtually all of the features of menu selection have been implemented in this package: ease of menu creation, item-selected shading, quick response to selection, and execution of an associated function. Yet, this package adds one additional feature without any degradation to the quality and efficiency of menu implementation: the selection of any irregularly shaped region from any point within that region, and without any unsightly cosmetic change. In describing the package by means of an example, picture a map of the world, or better yet, of a particular country broken up into its individual states and/or provinces. Suffice it to say that these regions are not square but irregular in shape and that they are bordered by solid lines, as they are on a common map. Unlike the menu package or ACTIVEREGIONS package, AIRegions allows you to select any of these pre-set states/provinces just as if your are making a menu selection of an item. One of the nice aspects of this package lies in the fact that the package does NOT make any costmetic changes to the irregularly shaped region, like providing some small box within the region to button in. Simply button your mouse within the solidly bordered region, anywhere in the region, and it will shade it to your particular shade and execute your defined function. Functionality provided: The functions in this package allow the user to work with familiar concepts: creating and implementing windows and menus. The examples provided within this documentation should be sufficient for the user to begin setting up irregularly shaped regions. (CREATEIR window shade buttoneventfn helpstring region poslist) [Function] window: the window which will contain the irregular region. shade: can be either a number between 0 and 65535 for a 4 by 4 shading or a 16 by 16 bitmap (if shade is NIL then the default is black, 65535). buttoneventfn: the function called when the region is selected. The arguments that are passed to the function are: the window containing the IREGION, the IREGION record itself, and the button which selected the IREGION. helpstring: the string that is placed in the PROMPTWINDOW when the mouse is held over the item for a few seconds. region: if specified, will be the region relative to window in which the IREGION can be found. (If region is NIL, the user will be prompted to sweep out a region within window.) poslist: If specified, will be either a position or list of positions relative to window that are the starting points for the FILLREGION routine (i.e. a point within the desired IREGION). (if poslist is NIL, the user will be prompted for a position until he/she selects outside of region.) Description of use: This is the first function that is called when actually setting up an irregularly shaped region to become sensitive to button activity. If the region argument is not set, then the cursor changes its shape and prompts for a region to completely surround the IREGION within the desired active window.(Note: That it is best to surround the desired IREGION as close as possible since this will save on execution time and memory useage.) A thin box will appear temporarily where the IREGION was scanned. If poslist is NIL, then the cursor changes into a TARGET symbol. The user should left-button mouse within desired active IREGION. Note: the IREGION must be surrounded by a border that FILLREGION can use to define the active area. Any gaps in the IREGION will cause the next routine to fill the region and anything outside with the shade provided. Mistakes can be corrected by using the REMOVE.IREGION function described below and PAINTing in the gap to retry. After left-buttoning within the desired active IREGION, the cursor continues to remain in its TARGET state. If the IREGION is split up into many different parts, those parts may be selected with the left-button also making them all active concurrently. However, when one is finished activating that one IREGION, then she/he should left-button outside of region. This function must be called for each desired IREGION. Examples: (CREATEIR window 21930 'myfunction "This is the helpstring") (CREATEIR (WHICHW) 1234 'MY.SELECTED.FN "This is the helpstring" '(0 0 20 30) '((12 . 15)(2 . 29)) (SURROUNDIR window shade buttoneventfn helpstring poslist inside.pos) [Function] window: the window which will contain the irregular region. shade: can be either a number between 0 and 65535 for a 4 by 4 shading or a 16 by 16 bitmap (if shade is NIL then the default is black, 65535). buttoneventfn: the function called when the region is selected. The arguments that are passed to the function are: the window containing the IREGION, the IREGION record itself, and the button which selected the IREGION. helpstring: the string that is placed in the PROMPTWINDOW when the mouse is held over the item for a few seconds. poslist: If specified, a list of positions relative to window that are the edge points for the FILLREGION routine. If NIL, the user will be prompted to define the outer border of the region desired to be active. Holding the SHIFT key will define the last point used in defining the edge. If this field is non-nil, Inside.pos must be specified. Inside.pos: If specified, this would be the inside position in which the Fillregion routine would begin filling from. If poslist is non-nil, then this field must be specified. Description of use: Like the CREATEIR function, this function creates IREGIONS. However, the functionality of this routine is quite different. There are times when you do not care what is within a particular region. Say, for example, you have a map of some country and you wish to surround a particular region of the country with an IREGION as you wish to denote an area rich in some mineral deposit or some other characteristic. Such a characteristic is oblivious of the borders of the country's states or provinces, streams, rivers,etc., yet you would like to make active a very general area. Upon calling this function, you are prompted to button around the area of interest. And so, in viewing the crosshairs cursor, you begin buttoning about specifying the border of the area you wish to make active, independant of what is inside it. To stop being prompted for the next edge, simply hold the SHIFT key on the keyboard, (either one will do), as you make your last button selection. At this point, the lisp DRAWCURVE function will take effect and draw the closed region you've defined. Note that the first and last points do not have to touch as the DRAWCURVE routine will connect them for you. You will also be prompted to button within the region you've marked. It is here that the Fillregion routine will begin filling your region from. When complete, this function adds the IREGION to the window and returns the iregion added. Examples: (SURROUNDIR window 21930 'myfunction "This is the helpstring") (SURROUNDIR (WHICHW) 1234 'MY.SELECTED.FN "This is the helpstring" '((5 . 5)(6 . 50)(50 . 50)(50 . 7)) '(10 . 10))) (ADD.IREGION window iregion) [Function] window: the window to which the iregion is to be added. iregion: the IREGION to be added to window. Description: This function will add iregion to window which will then allow mouse selection of that IREGION. (REMOVE.IREGION window iregion) [Function] window: the window in which the iregion exists. iregion: the IREGION you wish to remove from window. Description: This function removes the region from a list of active irregular regions which is stored as a window property of the window. The list of irregular active regions can be found by evaluating: (ALL.IREGIONS window)). (INTERSECTING.IREGIONS? window flg) [Function] window: a window. flg: either T or NIL Description: This function sets up window to allow selection of intersecting iregions. If two or more iregions overlap and this function had been called with flg = T, then when the overlapping region is selected, all of those iregions will be high-lighted and each IREGIONs BUTTONEVENTFN will be called. If flg is set to NIL, then the last IREGION created in that intersection of iregions will be selected. (Please be aware that intersecting iregions might generate effects that you do not wish to have. That is, if you leave the iregion "ON" (the exact same thing you see when you hold the mouse button down on the iregion, done by inverting that iregion) and create another iregion intersecting with the first, then the mask of the second would have a partial image of the first. At this point, buttoning in an area where both regions interesect might show everything but the intersection of those regions. Sometimes, it all depends on the order that they are created and what iregion's mask is left on or off. Shades that are "negatives" or "equals" of one another might make matters more complex than necessary when they are intersected. It is recommend that you play with this function in order to understand how it actually works so that when you work it into your application you'll have a better idea of the functionality and end-results). If this becomes a problem, an EDIT.MASK function has been provided so that you may edit the mask of the iregion by hand. Currently, there are no programmatic methods for doing this. (ALL.IREGIONS window) (Function) window: a window containing IREGIONS. Description: This function returns a list of all the IREGIONS attached to window. (DOSELECTED.IREGION window iregion button) (Function) window: the window associated with iregion. iregion: the iregion to be activated button: the button which selected iregion. Description: Applied iregions BUTTONEVENTFN to window, iregion and button. This provides a programmatic way of activating a given IREGION. This does not invert the iregion. (EDIT.MASK iregion) (Function) iregion: the IREGION whose mask you want to edit. Description: This function is provided for buttoning in places where the MASK is not set. More explicitly, TARGETing a region (while creating the regions) specifies the places where the FILLREGION routine is to create a mask. For example, if a US state contains many rivers one pixel wide, the FILLREGION routine will fill around the river, but not the river itself. This means that when the mouse is positioned on the river, the region will not shade because the mask does not have that bit turned on. However, if the mask is edited and the rivers filled in, buttoning on those rivers will activate the IREGION. (INVERT.IREGION window iregion) (Function) window: the window in which the iregion exists. iregion: the IREGION targeted for shading. Description: This will highlight the iregion with that iregions shade. Calling it a second time will low-light it. (IREGIONP iregion) (Function) iregion: the IREGION to be tested. Description: This function returns NIL if iregion is not an IREGION datatype and returns iregion if it is an IREGION. (IREGIONPROP iregion prop newvalue) (Function) iregion: the region of which you are setting/requesting the property. prop: the property in which you are interested. newvalue: the new value to be assigned to prop. Description: As with WINDOWPROP, if newvalue is not specified, it will return the current value of the iregion's property. If newvalue is specified, then the property will be reassigned with that value. If a prop name is not one of the fields of an IREGION record, it will be stored in property-list format on the USERDATA field of the iregion record. IREGION fields: BUTTONEVENTFN - function called when iregion is selected. USERDATA - property list format for user properties (similar to WINDOWPROP). REGION - region relative to the window that surrounds the iregion. MASK - a bitmap the same size of REGION that is blackened where the iregion is active. SHADE - the shade number or bitmap used to shade the region. HELPSTRING - the string that is printed in the PROMPTWINDOW when a region is held. Examples: (IREGIONPROP iregion 'SHADE) -- returns shade of iregion (IREGIONPROP iregion 'SHADE 21930) - assigns new shade to iregion. (SHOW.ALL.IREGIONS window shade delay) (Function) window: the window in which the IREGIONs exist. shade: the shade with which the iregions will be shown. delay: the time (in milliseconds) between which each IREGION is displayed . (if delay is NIL, then a default of 500 is used.) Description: This function will shade and unshade in shade (black is used if shade is NIL), each IREGION that has been created in the particular window. This is especially useful when the user has lost track of the number of IREGIONS within a window. (WHICH.IREGIONS window posorx y) (Function) window: the window in which the IREGIONs lie. (if window is NIL, default is window to which mouse points). posorx, y: the location within the window where the IREGIONs can be found. These points must be local to the window's coordinates...not the screen. (if posorx is a position, then it will be used, otherwise if x or y are not numbers then the current mouse position is used.) Description: Will return either NIL or the list of IREGIONs found in window and specified by posorx, y. Examples: (WHICH.IREGIONS) (WHICH.IREGIONS MY.WINDOW 50 23) (WHICH.IREGIONS MY.WINDOW '(50 . 23)) Saving IRegions IREGIONS can be saved on a file by setting a variable to be the value returned by ALL.IREGIONS. This variable can be saved by using the file package command, UGLYVARS. Example: (SETQ IRS (ALL.IREGIONS (WHICHW))) (SETQ SAVEIRSCOMS '((UGLYVARS IRS))) (MAKEFILE 'SAVEIRS) The file SAVEIRS can be loaded and IRS will be set. You can then add IRS to a window by doing: (WINDOWPROP (WHICHW) 'IREGIONSLIST IRS) (WINDOWPROP (WHICHW) 'BUTTONEVENTFN 'IN.CURSOR.REGION) Caution: Some properties on the USERDATA field of an IREGION might not be saved correctly such as a window which can not be saved on a file. Window images can be saved on a file by creating a bitmap the same size as the window, BITBLT from the window to the bitmap, and then saving the bitmap with the file package command VARS. Example use of the AIRegions package: 1. Open a window...about 1/4 of a screen. 2. Use the paint function provided when you right-button in the window and paint a picture. qw˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙€Ŕ@ŕa€Ŕ@A€Ŕ @Ŕ€Ŕ@@€Ŕ@8.€ŔŔ@Ŕ€Ŕ +<@€Ŕ@€Ŕ@€Ŕ@€Ŕ˙˙˙˙˙˙˙˙˙˙˙€Ŕŕ€Ŕ €Ŕ €Ŕ A€Ŕ A€Ŕ A€Ŕ !€Ŕ@0™€Ŕ pĺ€Ŕ#€Ŕ4€Ŕ€Ŕ  €Ŕ €Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€€Ŕ€€Ŕ€€Ŕ€€Ŕ€€Ŕ€€Ŕ€€Ŕ€€Ŕ@€Ŕ@€Ŕ €€Ŕ€€Ŕ€Ŕ€Ŕ€ €Ŕ€€Ŕ€€Ŕ=€€Ŕ_@€Ŕŕ €Ŕ €€ŔP@€Ŕh €Ŕ8€Ŕ `€Ŕ €Ŕ ˆ€Ŕƒ€Ŕ‚€˙˙€ŔD@€Ŕx €Ŕ€Ŕ€Ŕ€Ŕ q€Ŕ ‘€Ŕ€† €Ŕ€@/Č€Ŕ@ (€Ŕ@8€Ŕ  €Ŕ €Ŕ€Ŕ €Ŕ€ŔĐ€Ŕ0€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ€Ŕ˙€Ŕ€€Ŕ@€Ŕ@€Ŕ>>€Ŕ€Ŕ€Ŕŕ€Ŕ€Ŕ@€Ŕ„  €ŔP €Ŕ( €Ŕ €Ŕ€Ŕ€€Ŕ€€Ŕŕ€Ŕżŕ €ŔŔ@€Ŕ@¸€Ŕ ‡€Ŕ ŕ€Ŕ €Ŕ €€ŔŔÁ€Ŕ`1€ŔX€€ŔFŔ€ŔA €Ŕ@ €˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙€ 3. With your mouse in this painted window, type in: (CREATEIR (WHICHW) 21930) 4. The cursor changes shape and prompts for creating a region similar to the prompt for creating a window. In this case, span a region that contains California. 5. When you are done, and the mouse button is released, the region spanned will remain temporarily on the screen. The cursor changes into a target and now prompts for a left-button within the region. Select somewhere in California. When done, left-button the mouse outside and away from the temporarily blocked off region. (If you want to continue selecting areas of the same irregular region, in this example, the upper left corner of California, then button that area within the squared off region. As you can see, your irregular region does not necessarily have to be connected). 6. To test it out, simply button anywhere in California and it will fill to a nice shade of grey, as we have just set it up to do: qw˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙€Ŕ@ŕa€Ŕ@A€Ŕ @Ŕ€Ŕ@@€Ŕ@8.€ŔŔ@Ŕ€Ŕ +<@€Ŕ@€Ŕ@€Ŕ@€Ŕ˙˙˙˙˙˙˙˙˙˙˙€ŔUőUP€ŔżŞŞ°€ŔŞŞŞ°€ŔuUUĐA€ŔuUWPA€ŔŞŞŞ°A€ŔŞŞş°!€ŔUuUP™€ŔUuuPĺ€ŔŞŤş°€ŔŞžŞ°€ŔU]UP€Ŕ UuUP €Ŕ +ŞŞŞ°€Ŕ +ŞşŞ°€Ŕ UUUP€Ŕ U]UP€ŔŞŞŞ°€ŔŞŞŞ°€ŔU]UP€ŔU]UP€ŔŞŽŞ°€ŔŞŽŞ°€ŔŐUUP€ŔŐUUP€ŔŞŽŞ°€ŔŞŽŞ¸€ŔŐWUX€ŔŐWUX€ŔjŞŞ¨€ŔjŤŞŹ€Ŕ5UŐV€ŔUŐU€Ŕ +ŞŞŞŔ€ŔŞŞŞ €ŔUŐUP€ŔUŐUX€ŔżŞŞŹ€Ŕßꪪ€ŔőuUV€ŔuUU€€ŔZşŞŞŔ€ŔjşŞŞ €Ŕ=UUUP€Ŕ5]UuX€Ŕ*ŽŞşŹ€Ŕ*ŞŞŞŞ€ŔW×UU€ŔU×UU€˙˙€ŔŞîŞŞŔ€ŔŞúŞŞ €ŔUUUUP€ŔUUUUX€ŔŞŞŞŞŹ€ŔŞŞŞŞŞ q€ŔUUUUW ‘€ŔUUUŐU€† €ŔŞŞŤęŞŔ/Č€ŔjŞŤúŞ  (€ŔUUUőUP8€Ŕ5UUýUX €Ŕ*ŞŤţި€ŔŞŤęŞŹ€Ŕ UUőUV€ŔUUuUU€ŔŞŞşŞŞĐ€ŔŞŞşŞŞ°€ŔUU]UUP€ŔUU]UUP€ŔŞŞŽŞŞ°€ŔŞŞŽŞŞ¨€ŔUUUUUX€ŔUUUUUT€Ŕ˙ŞŞŞŞŽ€ŔŞŞŞŞŤ€ŔUUUUV€ŔUUUUT€Ŕ>>ŞŞŞ¨€ŔŞŞŞ¨€ŔUUUX€ŔőUUX€ŔŞŞ¸€Ŕ +Şę°€Ŕ…Uľ`€ŔUU`€ŔŞŞ €ŔŞş €ŔUUP€ŔŐUX€ŔŞŞ¸€ŔŞżŕ€Ŕ˙ŕ €ŔŔ@€Ŕ@¸€Ŕ ‡€Ŕ ŕ€Ŕ €Ŕ €€ŔŔÁ€Ŕ`1€ŔX€€ŔFŔ€ŔA €Ŕ@ €˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙€ 7. To create more active irregularly shaped regions, follow steps 3 through 5 above. If you want to set the selection of one of the regions to activate the execution of some function that calls RINGBELLS, and have the region shade to black upon selection, type in the following in the top level typescript window keeping the mouse within the painted window. (CREATEIR (WHICHW) 65535 'IR.TESTFN) (DEFINEQ (IR.TESTFN (LAMBDA (WINDOW IREGION BUTTON) (If (EQ (QUOTE LEFT) BUTTON) then (RINGBELLS 2))))) Span the cursor out over another state/region and repeat steps 3-5 above. When you button in this IREGION, the IREGION will temporarily shade black, and call the RINGBELLS function. Note that like menu selection, the function is called only when you release the button within the region. If the mouse button is held down and you move over the created IREGIONs, they will shade and unshade as you enter and exit them. Note: if you wish to create your own shades but don't know what shades correspond to which numbers, call the function (EDITSHADE) and begin selecting points that you want shaded. When you are done, the function will return the appropriate shade number. You can also use 16x16 bitmaps for the shade of an IREGION (try (EDITBM (BITMAPCREATE 16 16))) DEMO PACKAGE: To run the demo package, load AIRegions-Demo. Intersecting Iregions 1. Create a window and paint in the following: ݒ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙řŔŔŔŔŔŔŔ˙ř˙˙Ŕ˙˙˙ŕ?˙˙üŔüţ˙€˙ŔŔ˙?ŔŕřŔđđ~~Ŕ€~đŔŔ~€ŔđŔđŕ>|ŔŔđxŔ<ŕ€ŔŔŔŔxđŔđŢxŔŔřŔ€řŔü€ŔŽŔŔ8ŕŔp€pŔŕŔ8ŔŔ8ŕŔ€ppŔ`0Ŕŕ8ŔŔ€Ŕ€ŔŔŔŔ8ŕŔp€pŔ` €0ŔŕŔ8ŔŔ8ŕŔ€0` Ŕ€ppŔ`0Ŕŕ8ŔŔŔŔŔŔ€Ŕ € €Ŕ€ŔŔŔŔŔŔ8ŕŔ0`Ŕ0`Ŕ0`Ŕp€pŔ` €0Ŕ` €0Ŕ` €0Ŕ` €0Ŕ` €0ŔŕŔ8ŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŔŕŔ8Ŕ` €0Ŕ` €0Ŕ` €0Ŕ` €0Ŕ` €0Ŕp€pŔ0`Ŕ0`Ŕ0`Ŕ8ŕŔŔŔŔŔ€ŔŔ € €ŔŔ€ŔŔŔŔŔŕ8Ŕ`0Ŕ€ppŔ€0` ŔŔ8ŕŔŕŔ8Ŕ` €0Ŕp€pŔ8ŕŔŔŔ€ŔŔŔ€Ŕŕ8Ŕ`0Ŕ€ppŔŔ8ŕŔŕŔ8Ŕp€pŔ8ŕŔŽŔŔü€Ŕ€řŔŔřŔđŢxŔxđŔŔŔŔ<ŕ€ŔŔđxŔđŕ>|Ŕ~€ŔđŔ€~đŔŔđđ~~Ŕ˙?ŔŕřŔüţ˙€˙ŔŔ˙˙˙ŕ?˙˙üŔ˙ř˙˙ŔŔŔŔŔŔŔŔŔŔŔŔŔŔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř 2. Now call CREATEIR passing in this window and a shade of 4747 and surround the left circle and select inside that circle and also in the intersecting area for the area fill. Repeat this for the right circle but use a different shade (say 42405). 3. Now, with your mouse in the window, call the function (INTERSECTING.IREGIONS? (WHICHW) T). When you button in the intersection of the two circles, you should get: ݒ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙řŔŔŔŔŔŔŔ˙ř˙˙Ŕ˙˙˙ŕ?˙˙üŔţ"/ţ˙ŐU˙ŔŔ˙ˆˆˆżŔꪪŻřŔűťťťťđUUUU~Ŕ‘~úŞŞŞŞŻŔŔ~"""""?€ŐUUUUWđŔřˆˆˆˆˆ‹ŕ>ŞŞŞŞŞŞüŔűťťťťťťđ}UUUUUU^Ŕ<ęŞŞŞŞŞŞŻ€Ŕ""""""">ŐUUUUUUWŔŔxˆˆˆˆˆˆˆŞŞŞŞŞŞŞŞđŔűťťťťťťťťßUUUUUUUUxŔŃúŞŞŞŞŞŞŞŞźŔ˘""""""""ýUUUUUUUU_Ŕˆˆˆˆˆˆˆˆ‰ţŞŞŞŞŞŞŞŞŻ€ŔťťťťťťťťťďUUUUUUUUUŔŔ9żŞŞŞŞŞŞŞŞŞŕŔr""""""""/wŐUUUUUUUUpŔ興ˆˆˆˆˆˆž#ęŞŞŞŞŞŞŞŞ¸ŔűťťťťťťťťžîőUUUUUUUU\Ŕ‘{ťúŞŞŞŞŞŞŞŞŽŔ"""""""""wwuUUUUUUUUVŔˆˆˆˆˆˆˆˆˆâ":ŞŞŞŞŞŞŞŞŻŔťťťťťťťťťîîýUUUUUUUUW€ŔťťžŞŞŞŞŞŞŞŞŤŔŔ""""""""#wwwUUUUUUUUUŔŔ8ˆˆˆˆˆˆˆˆ""'ŞŞŞŞŞŞŞŞŞŕŔ{ťťťťťťťťžîîďŐUUUUUUUUpŔqťťťŞŞŞŞŞŞŞŞŞ°Ŕâ""""""""?wwwŐUUUUUUUUxŔȈˆˆˆˆˆˆˆş"""ęŞŞŞŞŞŞŞŞźŔťťťťťťťťťžîîîőUUUUUUUU\Ŕ‘{ťťťúŞŞŞŞŞŞŞŞŽŔ"""""""""wwwwuUUUUUUUUVŔˆˆˆˆˆˆˆˆˆâ""":ŞŞŞŞŞŞŞŞŻŔťťťťťťťťťîîîîýUUUUUUUUWŔűťťťşŞŞŞŞŞŞŞŞŤŔ""""""""#÷www}UUUUUUUUW€Ŕ ˆˆˆˆˆˆˆˆ‰˘""".ŞŞŞŞŞŞŞŞŤ€ŔťťťťťťťťťîîîîďUUUUUUUUUŔŔťťťťžŞŞŞŞŞŞŞŞŞŔŔ""""""""#wwwwwUUUUUUUUUŔŔ8ˆˆˆˆˆˆˆˆ""""'ŞŞŞŞŞŞŞŞŞŕŔ;ťťťťťťťťžîîîîďUUUUUUUUU`Ŕ1ťťťťťŞŞŞŞŞŞŞŞŞŕŔ2""""""""'wwwwwUUUUUUUUU`ŔxˆˆˆˆˆˆˆˆŽ""""#ŞŞŞŞŞŞŞŞŞđŔ{ťťťťťťťťžîîîîďŐUUUUUUUUpŔqťťťťťŞŞŞŞŞŞŞŞŞ°Ŕb""""""""/wwwwwŐUUUUUUUUpŔhˆˆˆˆˆˆˆˆŽ""""#ŞŞŞŞŞŞŞŞŞ°Ŕ{ťťťťťťťťžîîîîďŐUUUUUUUUpŔńťťťťťęŞŞŞŞŞŞŞŞ¸Ŕâ""""""""?wwwwwŐUUUUUUUUXŔȈˆˆˆˆˆˆˆš"""""ęŞŞŞŞŞŞŞŞ¸ŔűťťťťťťťťžîîîîîŐUUUUUUUUXŔŃťťťťťęŞŞŞŞŞŞŞŞ¸Ŕâ""""""""?wwwwwŐUUUUUUUUXŔȈˆˆˆˆˆˆˆš"""""ęŞŞŞŞŞŞŞŞ¸ŔűťťťťťťťťžîîîîîŐUUUUUUUUXŔŃťťťťťęŞŞŞŞŞŞŞŞ¸Ŕâ""""""""?wwwwwŐUUUUUUUUXŔȈˆˆˆˆˆˆˆš"""""ęŞŞŞŞŞŞŞŞ¸ŔűťťťťťťťťžîîîîîŐUUUUUUUUXŔŃťťťťťęŞŞŞŞŞŞŞŞ¸Ŕâ""""""""?wwwwwŐUUUUUUUUXŔȈˆˆˆˆˆˆˆš"""""ęŞŞŞŞŞŞŞŞ¸ŔűťťťťťťťťžîîîîďŐUUUUUUUUxŔqťťťťťŞŞŞŞŞŞŞŞŞ°Ŕb""""""""/wwwwwŐUUUUUUUUpŔhˆˆˆˆˆˆˆˆŽ""""#ŞŞŞŞŞŞŞŞŞ°Ŕ{ťťťťťťťťžîîîîďŐUUUUUUUUpŔqťťťťťŞŞŞŞŞŞŞŞŞ°Ŕr""""""""/wwwwwŐUUUUUUUUpŔ8ˆˆˆˆˆˆˆˆŽ""""#ŞŞŞŞŞŞŞŞŞŕŔ;ťťťťťťťťžîîîîďUUUUUUUUU`Ŕ1ťťťťťŞŞŞŞŞŞŞŞŞŕŔ:""""""""'wwwwwUUUUUUUUUŕŔˆˆˆˆˆˆˆˆ‹""""&ŞŞŞŞŞŞŞŞŞŔŔťťťťťťťťťîîîîďUUUUUUUUUŔŔťťťťžŞŞŞŞŞŞŞŞŤŔŔ""""""""#÷www}UUUUUUUUU€Ŕˆˆˆˆˆˆˆˆ‰â""">ŞŞŞŞŞŞŞŞŤ€ŔťťťťťťťťťîîîîýUUUUUUUUWŔűťťťşŞŞŞŞŞŞŞŞŤŔ"""""""""÷www}UUUUUUUUWŔˆˆˆˆˆˆˆˆˆâ""":ŞŞŞŞŞŞŞŞŽŔťťťťťťťťťţîîîőUUUUUUUU^Ŕ‘;ťťťęŞŞŞŞŞŞŞŞŹŔâ""""""""?wwwőUUUUUUUU\Ŕ興ˆˆˆˆˆˆž""#ęŞŞŞŞŞŞŞŞ¸Ŕ{ťťťťťťťťžîîďŐUUUUUUUUpŔqťťťŞŞŞŞŞŞŞŞŞđŔ:""""""""'wwwUUUUUUUUUŕŔˆˆˆˆˆˆˆˆ‹""&ŞŞŞŞŞŞŞŞŞŔŔťťťťťťťťťîîďUUUUUUUUUŔŔűťžŞŞŞŞŞŞŞŞŤ€Ŕ"""""""""÷w}UUUUUUUUWŔˆˆˆˆˆˆˆˆˆâ":ŞŞŞŞŞŞŞŞŽŔťťťťťťťťťţîőUUUUUUUU^ŔŃ;ťęŞŞŞŞŞŞŞŞźŔâ""""""""?wŐUUUUUUUUxŔxˆˆˆˆˆˆˆˆŽ#ŞŞŞŞŞŞŞŞŞđŔ;ťťťťťťťťżďUUUUUUUUUŕŔžŞŞŞŞŞŞŞŞŤŔŔ""""""""#ýUUUUUUUUW€ŔˆˆˆˆˆˆˆˆˆúŞŞŞŞŞŞŞŞŻŔűťťťťťťťťýUUUUUUUU\ŔńŢŞŞŞŞŞŞŞŞřŔz"""""""'UUUUUUUUđŔˆˆˆˆˆˆˆžęŞŞŞŞŞŞŤŔŔťťťťťťťźőUUUUUUW€ŔŃđzŞŞŞŞŞŞžŔň"""""#ŕ?UUUUUU|Ŕ~ˆˆˆˆˆŸ€ęŞŞŞŞŤđŔťťťťťţőUUUU_ŔŔńđ~ŞŞŞŞţŔ˙"""?ŔőUUWřŔüˆţ˙ŞŤ˙ŔŔ˙˙˙ŕ?˙˙üŔ˙ř˙˙ŔŔŔŔŔŔŔŔŔŔŔŔŔŔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř 4. When the mouse is released inside of the intersecting region, both IREGIONs BUTTONEVENTFN will be called. Comments and suggestions are welcome. (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# 11) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))),Č, Č- ČT, Č,Ú,66ě- ČT, Č, Č, Č3ČČT2ČČ-T- ČT3ČČT, Č, Č,HHÚ,,,Č, ě,,,ŠŠ8,Č ,ŠŠ8HČČ PAGEHEADING RUNNINGHEADCLASSICCLASSICCLASSICMODERN +TERMINAL + +TIMESROMAN €MODERN +€GACHA ?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +TERMINAL + HELVETICA +MODERN +MODERN +MODERN MODERNMODERN + +  HRULE.GETFNMODERN + HRULE.GETFNMODERN + HRULE.GETFNMODERN + + HRULE.GETFNMODERN  HRULE.GETFNMODERN +%  ' 6"    Č   Ĺ  f    ţ  + 4   +7  +[ +  +Ń  + i  +/ ( @   +K h R    ’ a % ;  A +l + 8   +7  +[ +  +Ń  + i  +0  +  + o 0   –  C +y +    1  $  b        %   Í   +      ş 3˝ M      ?     %   $  Ą    *  \           3  +       (   /  >  +  !   [ â   %  M :  D  = /   @ +F +   +)  +2  +K )  *  Š    ++ 3  +  t  :      +$ +( +  ¨   # +% + +_  +( +7 +… ź  &  *  \ | BMOBJ.GETFN3MODERN + 4  +Ą J ƒ | BMOBJ.GETFN3MODERN +i  % + +5 + + + + ¤  ]  <    /   BMOBJ.GETFN3MODERN +ř Ś   BMOBJ.GETFN3?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) +  l   & uŕzş \ No newline at end of file diff --git a/lispusers/AISBLT b/lispusers/AISBLT new file mode 100644 index 00000000..1c7f79f0 --- /dev/null +++ b/lispusers/AISBLT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) (FILECREATED "11-Nov-88 14:17:22" {ERINYES}LYRIC>AISBLT.\;1 35120 |previous| |date:| "23-Sep-88 20:28:25" {PHYLUM}MEDLEY>AISBLT.\;1) ; Copyright (c) 1988 by Xerox Corporation. All rights reserved. (PRETTYCOMPRINT AISBLTCOMS) (RPAQQ AISBLTCOMS ((* |;;| "") (* |;;| "The AISBLT module") (* |;;| "") (* |;;| "The exported interface is via the following functions") (FNS AISBLT.BITMAP AISFILEHEADER WRITEAIS) (* |;;| "Internal functions") (FNS AISBLT1TO1.BITMAP AISBLT8TO1FSA.BITMAP AISBLT8TO8.BITMAP AISBLTNTO1FSA.BITMAP AISBLTNTO1TRUNCATE.BITMAP SETUPPILOTBBT) (* |;;| "Useful constants") (COMS (* \; "AIS file identifying word") (VARIABLES AIS-PASSWORD)) (COMS (* \; "Attribute part header types") (VARIABLES AIS-RASTER-TYPE AIS-PLACEMENT-TYPE AIS-PHOTOMETRY-TYPE AIS-COMMENT-TYPE)) (COMS (* \; "Raster coding types") (VARIABLES AIS-RASTER-CODING-UCA AIS-RASTER-CODING-CA)) (COMS (* \; "Photometry sense ") (VARIABLES AIS-PHOTOMETRY-SENSE-LARGER-DARKER AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER)) (COMS (* \; "Photometry signal ") (VARIABLES AIS-PHOTOMETRY-SIGNAL-BLACK-AND-WHITE AIS-PHOTOMETRY-SIGNAL-RED-SEPARATION AIS-PHOTOMETRY-SIGNAL-BLUE-SEPARATION AIS-PHOTOMETRY-SIGNAL-GREEN-SEPARATION AIS-PHOTOMETRY-SIGNAL-CYAN-SEPARATION AIS-PHOTOMETRY-SIGNAL-MAGENTA-SEPARATION AIS-PHOTOMETRY-SIGNAL-YELLOW-SEPARATION AIS-PHOTOMETRY-SIGNAL-X-CIE AIS-PHOTOMETRY-SIGNAL-Y-CIE AIS-PHOTOMETRY-SIGNAL-IN-COMMENT AIS-PHOTOMETRY-SIGNAL-UNSPECIFIED)) (COMS (* \; "Photometry spot type") (VARIABLES AIS-PHOTOMETRY-SPOT-TYPE-RECTANGULAR AIS-PHOTOMETRY-SPOT-TYPE-CIRCULAR AIS-PHOTOMETRY-SPOT-TYPE-IN-COMMENTS AIS-PHOTOMETRY-SPOT-TYPE-UNSPECIFIED)) (COMS (* \; "Photometry scale") (VARIABLES AIS-PHOTOMETRY-SCALE-RELECTANCE-TRANSMITTANCE AIS-PHOTOMETRY-SCALE-OPTICAL-DENSITY AIS-PHOTOMETRY-SCALE-IN-COMMENT AIS-PHOTOMETRY-SCALE-UNSPECIFIED)) (COMS (* \; "Photometry") (VARIABLES AIS-PHOTOMETRY-UNSPECIFIED)) (COMS (* \; "Header information when writing AIS format") (VARIABLES AIS-DEFAULT-HEADER-LENGTH)))) (* |;;| "") (* |;;| "The AISBLT module") (* |;;| "") (* |;;| "The exported interface is via the following functions") (DEFINEQ (AISBLT.BITMAP (LAMBDA (FILE SOURCE-LEFT SOURCE-BOTTOM DESTINATION DESTINATION-LEFT DESTINATION-BOTTOM WIDTH HEIGHT HOW FILTER) (* \; "Edited 23-Sep-88 19:48 by Briggs") (* \; "Edited 2-May-88 16:51 by Briggs") (* \; "Edited 2-May-88 16:06 by Briggs") (* |;;;| "Puts an AIS image from a file onto the destination, which may be a bitmap, or a window/imagestream. ") (* |;;;| "The arguments are the same as BITBLTs for the most part.") (* |;;| "HOW specifies how the number of bits per pixel is condensed if reduction is necessary: TRUNCATE is truncate; FSA is Floyd-Steinberg algorithm; MODULATE is modulated with a random function") (RESETLST (PROG (AIS-HEADER RASTER-PART PHOTOMETRY-PART PHOTOMETRY-SENSE CLIP-BOTTOM CLIP-HEIGHT CLIP-LEFT CLIP-RIGHT CLIP-TOP CLIP-WIDTH DESTINATION-BASE DESTINATION-BITS-PER-PIXEL DESTINATION-RASTER-WIDTH DESTINATION-WIDTH S-TO-D-X S-TO-D-Y SCAN-DIRECTION SOURCE-BITS-PER-PIXEL SOURCE-HEIGHT SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH SOURCE-WIDTH STREAM) (* |;;| "check and default some of the parameters") (OR (TYPEP DESTINATION (QUOTE BITMAP)) (\\ILLEGAL.ARG DESTINATION)) (OR SOURCE-LEFT (SETQ SOURCE-LEFT 0)) (OR SOURCE-BOTTOM (SETQ SOURCE-BOTTOM 0)) (OR DESTINATION-LEFT (SETQ DESTINATION-LEFT 0)) (OR DESTINATION-BOTTOM (SETQ DESTINATION-BOTTOM 0)) (OR HOW (SETQ HOW (QUOTE FSA))) (* |;;| "find the file, and get the AIS image parameters") (COND ((STREAMP FILE) (SETQ STREAM FILE)) ((SETQ STREAM (FINDFILE FILE T AISDIRECTORIES)) (RESETSAVE NIL (LIST (QUOTE CLOSEF) (SETQ STREAM (OPENSTREAM STREAM (QUOTE INPUT) NIL (QUOTE ((SEQUENTIAL T)))))))) (T (ERROR "Can't find file" FILE))) (* |;;| "interesting point here -- INSUREAISFILE should probably also check for Photometry information and indicate whether the sense of the samples is increasing values implies increasing lightness or the other way around. Currently, for the 1 bpp case we invert the bitmap so that it displays correctly on the screen.") (SETQ AIS-HEADER (AISFILEHEADER STREAM)) (SETQ RASTER-PART (CADR (ASSOC :RASTER AIS-HEADER))) (* |;;| "dispose of some of the cases we can't handle") (COND ((NOT (EQ (LISTGET RASTER-PART :CODING-TYPE) AIS-RASTER-CODING-UCA)) (ERROR "Can't AISBLT AIS files of raster coding type" (LISTGET RASTER-PART :CODING-TYPE)))) (* |;;| "extract the information we need from the raster attribute") (SETQ SOURCE-BITS-PER-PIXEL (LISTGET RASTER-PART :BITS-PER-SAMPLE)) (SETQ SOURCE-WIDTH (LISTGET RASTER-PART :SCAN-LENGTH)) (SETQ SOURCE-HEIGHT (LISTGET RASTER-PART :SCAN-COUNT)) (SETQ SOURCE-RASTER-WIDTH (LISTGET RASTER-PART :WORDS-PER-SCAN-LINE)) (SETQ SCAN-DIRECTION (LISTGET RASTER-PART :SCAN-DIRECTION)) (* |;;| "Dispose of another case we don't want to handle right now") (COND ((NOT (EQ SCAN-DIRECTION 3)) (ERROR "Scan direction is not top-left to bottom-right(3) - " SCAN-DIRECTION))) (* |;;| "extract the information we need from the photometry part") (SETQ PHOTOMETRY-PART (CADR (ASSOC :PHOTOMETRY AIS-HEADER))) (* |;;| "the photometry sense will indicate whether we need to invert the bitmap to get it into Lisp's 0->white 1-> black sense (larger darker).") (SETQ PHOTOMETRY-SENSE (OR (LISTGET PHOTOMETRY-PART :SENSE) (COND ((EQ SOURCE-BITS-PER-PIXEL 0) (* |;;| "this is a gross kludge by Cedar to avoid specifying the photometry information") (SETQ SOURCE-BITS-PER-PIXEL 1) AIS-PHOTOMETRY-SENSE-LARGER-DARKER) (T AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER)))) (* |;;| "calculate some additional destination information") (SETQ DESTINATION-WIDTH (|fetch| (BITMAP BITMAPWIDTH) |of| DESTINATION)) (SETQ DESTINATION-RASTER-WIDTH (|fetch| (BITMAP BITMAPRASTERWIDTH) |of| DESTINATION)) (SETQ DESTINATION-BITS-PER-PIXEL (|fetch| (BITMAP BITMAPBITSPERPIXEL) |of| DESTINATION)) (SETQ DESTINATION-BASE (|fetch| (BITMAP BITMAPBASE) |of| DESTINATION)) (* |;;| "clipping region is initially all of the destination. Clipping coordinates are *inclusive* left and bottom, exclusive right and top -- origin 0.") (SETQ CLIP-LEFT 0) (SETQ CLIP-BOTTOM 0) (SETQ CLIP-RIGHT DESTINATION-WIDTH) (SETQ CLIP-TOP (|fetch| (BITMAP BITMAPHEIGHT) |of| DESTINATION)) (* |;;| "reduce the region if required by specified destination left, bottom, width, or height") (SETQ CLIP-LEFT (IMAX CLIP-LEFT DESTINATION-LEFT)) (SETQ CLIP-BOTTOM (IMAX CLIP-BOTTOM DESTINATION-BOTTOM)) (COND (WIDTH (SETQ CLIP-RIGHT (IMIN (IPLUS DESTINATION-LEFT WIDTH) CLIP-RIGHT)))) (COND (HEIGHT (SETQ CLIP-TOP (IMIN (IPLUS DESTINATION-BOTTOM HEIGHT) CLIP-TOP)))) (* |;;| "") (SETQ S-TO-D-X (IDIFFERENCE DESTINATION-LEFT SOURCE-LEFT)) (SETQ S-TO-D-Y (IDIFFERENCE DESTINATION-BOTTOM SOURCE-BOTTOM)) (* |;;| "reduce the region if required by source size. We know source origin is (0,0)") (SETQ CLIP-LEFT (IMAX S-TO-D-X CLIP-LEFT)) (* \; "was 0") (SETQ CLIP-BOTTOM (IMAX S-TO-D-Y CLIP-BOTTOM)) (* \; "was 0") (SETQ CLIP-RIGHT (IMIN (IPLUS S-TO-D-X SOURCE-WIDTH) CLIP-RIGHT)) (SETQ CLIP-TOP (IMIN (IPLUS S-TO-D-Y SOURCE-HEIGHT) CLIP-TOP)) (* |;;| "calculate width and height of clipped region") (SETQ CLIP-WIDTH (IDIFFERENCE CLIP-RIGHT CLIP-LEFT)) (SETQ CLIP-HEIGHT (IDIFFERENCE CLIP-TOP CLIP-BOTTOM)) (COND ((OR (ILEQ CLIP-WIDTH 0) (ILEQ CLIP-HEIGHT 0)) (* \; "nothing to do") (RETURN))) (* |;;| "\"align\" the source file and destination base so that we need only pass in pixel offsets, width, and height") (SETQ DESTINATION-BASE (\\ADDBASE DESTINATION-BASE (ITIMES DESTINATION-RASTER-WIDTH (|\\SFInvert| DESTINATION CLIP-TOP)))) (\\SETFILEPTR STREAM (IPLUS (\\GETFILEPTR STREAM) (ITIMES SOURCE-RASTER-WIDTH BYTESPERWORD (- SOURCE-HEIGHT (- CLIP-TOP S-TO-D-Y))))) (SETQ SOURCE-PIXEL-OFFSET (- CLIP-LEFT S-TO-D-X)) (* |;;| "") (SELECTQ SOURCE-BITS-PER-PIXEL (8 (SELECTQ DESTINATION-BITS-PER-PIXEL (8 (AISBLT8TO8.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT)) (1 (SELECTQ HOW ((FSA :FSA) (AISBLT8TO1FSA.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT PHOTOMETRY-SENSE)) ((TRUNCATE :TRUNCATE) (AISBLTNTO1TRUNCATE.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT SOURCE-BITS-PER-PIXEL PHOTOMETRY-SENSE)) NIL)) NIL)) (4 (SELECTQ DESTINATION-BITS-PER-PIXEL (1 (SELECTQ HOW ((FSA :FSA) (AISBLTNTO1FSA.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT SOURCE-BITS-PER-PIXEL PHOTOMETRY-SENSE)) ((TRUNCATE :TRUNCATE) (AISBLTNTO1TRUNCATE.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT SOURCE-BITS-PER-PIXEL PHOTOMETRY-SENSE)) NIL)) NIL)) (1 (SELECTQ DESTINATION-BITS-PER-PIXEL (1 (AISBLT1TO1.BITMAP STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE CLIP-LEFT DESTINATION-RASTER-WIDTH DESTINATION-WIDTH CLIP-WIDTH CLIP-HEIGHT PHOTOMETRY-SENSE)) NIL)) NIL)))) ) (AISFILEHEADER (LAMBDA (STREAM) (* \; "Edited 21-Sep-88 19:05 by Briggs") (* |;;| "make sure a file is an ais file and put fileptr at beginning of data.") (* |;;| "returns a property list format description of the file format") (LET (HEADERLENGTH ATTRIBUTE-PART-HEADER ATTRIBUTE-FILE-POINTER SCRATCH CODING-TYPE) (\\SETFILEPTR STREAM 0) (|if| (NEQ (\\WIN STREAM) AIS-PASSWORD) |then| (* \; "not an AIS file") NIL |else| (SETQ HEADERLENGTH (ITIMES (\\WIN STREAM) BYTESPERWORD)) (* \; "length in bytes ") (PROG1 (|while| (AND (< (\\GETFILEPTR STREAM) HEADERLENGTH) (NOT (EQ 0 (SETQ ATTRIBUTE-PART-HEADER (\\WIN STREAM))))) |collect| (SETQ ATTRIBUTE-FILE-POINTER (\\GETFILEPTR STREAM)) (PROG1 (SELECTC (LRSH ATTRIBUTE-PART-HEADER 10) (AIS-RASTER-TYPE (* |;;| "The raster part of an AIS file is mandatory") (SETQ SCRATCH (LIST :SCAN-COUNT (\\WIN STREAM) :SCAN-LENGTH (\\WIN STREAM) :SCAN-DIRECTION (\\WIN STREAM) :SAMPLES-PER-PIXEL (\\WIN STREAM) :CODING-TYPE (SETQ CODING-TYPE (\\WIN STREAM)))) (* |;;| "UnCompressedArray is the only known coding type") (SELECTC CODING-TYPE (AIS-RASTER-CODING-UCA (LISTPUT SCRATCH :BITS-PER-SAMPLE (\\WIN STREAM)) (LISTPUT SCRATCH :WORDS-PER-SCAN-LINE (\\WIN STREAM)) (LISTPUT SCRATCH :SCAN-LINES-PER-BLOCK (SIGNED (\\WIN STREAM) BITSPERWORD)) (LISTPUT SCRATCH :PADDING-PER-BLOCK (SIGNED (\\WIN STREAM) BITSPERWORD))) NIL) (LIST :RASTER SCRATCH)) (AIS-PLACEMENT-TYPE (LIST :PLACEMENT (LIST :LEFT (\\WIN STREAM) :BOTTOM (\\WIN STREAM) :WIDTH (\\WIN STREAM) :HEIGHT (\\WIN STREAM)))) (AIS-PHOTOMETRY-TYPE (* |;;| "Ignoring the optional photometry histogram data") (LIST :PHOTOMETRY (LIST :SIGNAL (\\WIN STREAM) :SENSE (\\WIN STREAM) :SCALE (\\WIN STREAM) :SCALE-A (CONS (SIGNED (\\WIN STREAM) BITSPERWORD) (SIGNED (\\WIN STREAM) BITSPERWORD)) :SCALE-B (CONS (SIGNED (\\WIN STREAM) BITSPERWORD) (SIGNED (\\WIN STREAM) BITSPERWORD)) :SCALE-C (CONS (SIGNED (\\WIN STREAM) BITSPERWORD) (SIGNED (\\WIN STREAM) BITSPERWORD)) :SPOT-TYPE (SIGNED (\\WIN STREAM) BITSPERWORD) :SPOT-WIDTH (SIGNED (\\WIN STREAM) BITSPERWORD) :SPOT-LENGTH (SIGNED (\\WIN STREAM) BITSPERWORD) :SAMPLE-MIN (\\WIN STREAM) :SAMPLE-MAX (\\WIN STREAM)))) (AIS-COMMENT-TYPE (* |;;| "(SETQ SCRATCH (ALLOCSTRING (\\BIN STREAM))) (LIST :COMMENT (AIN SCRATCH 0 (NCHARS SCRATCH)))") NIL) NIL) (\\SETFILEPTR STREAM (PLUS ATTRIBUTE-FILE-POINTER (ITIMES (SUB1 (LOGAND ATTRIBUTE-PART-HEADER 1023)) BYTESPERWORD))))) (\\SETFILEPTR STREAM HEADERLENGTH))))) ) (WRITEAIS (LAMBDA (BITMAP FILE REGION) (* \; "Edited 21-Sep-88 18:34 by Briggs") (* |;;;| "writes a bitmap on to a file in AIS format.") (* |;;| "simple checks on the arguments before we proceed") (OR (TYPEP BITMAP (QUOTE BITMAP)) (\\ILLEGAL.ARG BITMAP)) (OR (AND REGION (REGIONP REGION)) (AND REGION (\\ILLEGAL.ARG REGION))) (PROG (STREAM TEMP-BITMAP BITSPERPIXEL RASTERWIDTH WIDTH HEIGHT) (SETQ BITSPERPIXEL (|fetch| (BITMAP BITMAPBITSPERPIXEL) |of| BITMAP)) (COND ((REGIONP REGION) (* |;;| "Get copy of selected REGION of BITMAP into temporary bitmap to avoid having to deal with odd boundary problems when writing contents of BITMAP to STREAM *") (SETQ TEMP-BITMAP (BITMAPCREATE (|fetch| (REGION WIDTH) |of| REGION) (|fetch| (REGION HEIGHT) |of| REGION) BITSPERPIXEL)) (BITBLT BITMAP (|fetch| (REGION LEFT) |of| REGION) (|fetch| (REGION BOTTOM) |of| REGION) TEMP-BITMAP) (SETQ BITMAP TEMP-BITMAP))) (SETQ RASTERWIDTH (|fetch| (BITMAP BITMAPRASTERWIDTH) |of| BITMAP)) (SETQ HEIGHT (|fetch| (BITMAP BITMAPHEIGHT) |of| BITMAP)) (SETQ WIDTH (|fetch| (BITMAP BITMAPWIDTH) |of| BITMAP)) (SETQ STREAM (OPENSTREAM FILE (QUOTE OUTPUT))) (\\WOUT STREAM AIS-PASSWORD) (* \; "write AIS password") (\\WOUT STREAM (FOLDLO AIS-DEFAULT-HEADER-LENGTH BYTESPERWORD)) (* |;;| "Generate raster part") (\\WOUT STREAM (LOGOR (LLSH AIS-RASTER-TYPE 10) 10)) (* \; "set type and length of raster part header") (\\WOUT STREAM HEIGHT) (* \; "Scan count") (\\WOUT STREAM WIDTH) (* \; "ScanLength") (\\WOUT STREAM 3) (* \; "Scan Dir") (\\WOUT STREAM 1) (* \; "samples per pixel.") (\\WOUT STREAM 1) (* \; "coding type: UnCompressedArray") (\\WOUT STREAM BITSPERPIXEL) (* \; "bits per sample") (\\WOUT STREAM RASTERWIDTH) (* \; "words per sample line.") (\\WOUT STREAM (UNSIGNED -1 16)) (* \; "Sample lines per block: no blocks is 16 bit -1") (\\WOUT STREAM (UNSIGNED -1 16)) (* \; "padding words per block: no blocks is 16 bit -1") (* |;;| "Generate photometry part") (\\WOUT STREAM (LOGOR (LLSH AIS-PHOTOMETRY-TYPE 10) 16)) (\\WOUT STREAM AIS-PHOTOMETRY-SIGNAL-BLACK-AND-WHITE) (\\WOUT STREAM AIS-PHOTOMETRY-SENSE-LARGER-DARKER) (\\WOUT STREAM AIS-PHOTOMETRY-SCALE-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-SPOT-TYPE-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM AIS-PHOTOMETRY-UNSPECIFIED) (\\WOUT STREAM 0) (* \; "sample min") (\\WOUT STREAM 1) (* \; "sample max") (\\WOUT STREAM 0) (* \; "no histogram") (* |;;| "position to start of data") (\\SETFILEPTR STREAM AIS-DEFAULT-HEADER-LENGTH) (\\BOUTS STREAM (|fetch| (BITMAP BITMAPBASE) |of| BITMAP) 0 (ITIMES HEIGHT RASTERWIDTH BYTESPERWORD)) (RETURN (CLOSEF STREAM)))) ) ) (* |;;| "Internal functions") (DEFINEQ (AISBLT1TO1.BITMAP (LAMBDA (STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE DESTINATION-PIXEL-OFFSET DESTINATION-RASTER-WIDTH DESTINATION-WIDTH WIDTH HEIGHT PHOTOMETRY-SENSE) (* \; "Edited 22-Sep-88 10:58 by Briggs") (* |;;;| "Internal function called by AISBLT.BITMAP to move 1 bpp source file to 1 bpp bitmap") (LET ((SOURCE-BYTES-PER-LINE (ITIMES SOURCE-RASTER-WIDTH 2)) (DESTINATION-BYTE-OFFSET) (WIDTH-BYTES) (PILOT-BBT (|create| PILOTBBT)) (SCRATCH-BITMAP) (SCRATCH-BITMAP-BASE)) (* |;;| "look for some special cases that we can handle much faster") (COND ((AND (EQ SOURCE-RASTER-WIDTH DESTINATION-RASTER-WIDTH) (EQ SOURCE-PIXEL-OFFSET 0) (EQ DESTINATION-PIXEL-OFFSET 0) (EQ WIDTH DESTINATION-WIDTH)) (* |;;| "source and destination have same raster width") (* |;;| "and the full scan line is being being moved to the full destination scan line") (\\BINS STREAM DESTINATION-BASE 0 (ITIMES HEIGHT SOURCE-BYTES-PER-LINE))) ((AND (EQ (IMOD SOURCE-PIXEL-OFFSET BITSPERBYTE) 0) (EQ (IMOD DESTINATION-PIXEL-OFFSET BITSPERBYTE) 0) (OR (EQ (IMOD WIDTH BITSPERBYTE) 0) (EQ WIDTH DESTINATION-WIDTH))) (* |;;| "Pixel offsets give byte alignment, and the width is an integral number of bytes, or is the destination width (we can run into the slack bits in the last word with no problem)") (SETQ DESTINATION-BYTE-OFFSET (FOLDHI DESTINATION-PIXEL-OFFSET BITSPERBYTE)) (SETQ WIDTH-BYTES (FOLDHI WIDTH BITSPERBYTE)) (|for| ROW |from| 1 |to| HEIGHT |as| FILE-POINTER |from| (IPLUS (FOLDHI SOURCE-PIXEL-OFFSET BITSPERBYTE) (\\GETFILEPTR STREAM)) |by| SOURCE-BYTES-PER-LINE |bind| (LINE-BASE _ DESTINATION-BASE) |do| (\\SETFILEPTR STREAM FILE-POINTER) (\\BINS STREAM LINE-BASE DESTINATION-BYTE-OFFSET WIDTH-BYTES) (COND ((NOT (EQ ROW HEIGHT)) (SETQ LINE-BASE (\\ADDBASE LINE-BASE DESTINATION-RASTER-WIDTH)))))) (T (* |;;| "We have to do bit level realignment -- use a temporary bitmap and let Pilot bitblt deal with it") (SETQ SCRATCH-BITMAP (BITMAPCREATE WIDTH 1 1)) (SETQ SCRATCH-BITMAP-BASE (|fetch| (BITMAP BITMAPBASE) |of| SCRATCH-BITMAP)) (SETUPPILOTBBT PILOT-BBT (|fetch| (BITMAP BITMAPBASE) |of| SCRATCH-BITMAP) 0 (UNFOLD (FOLDHI WIDTH BITSPERWORD) BITSPERWORD) DESTINATION-BASE DESTINATION-PIXEL-OFFSET (UNFOLD DESTINATION-RASTER-WIDTH BITSPERWORD) WIDTH 1 0 T T (QUOTE INPUT) (QUOTE REPLACE)) (SETQ WIDTH-BYTES (FOLDHI WIDTH BITSPERBYTE)) (|for| ROW |from| 1 |to| HEIGHT |as| FILE-POINTER |from| (IPLUS (FOLDHI SOURCE-PIXEL-OFFSET BITSPERBYTE) (\\GETFILEPTR STREAM)) |by| SOURCE-BYTES-PER-LINE |bind| (LINE-BASE _ DESTINATION-BASE) |do| (\\SETFILEPTR STREAM FILE-POINTER) (\\BINS STREAM SCRATCH-BITMAP-BASE 0 WIDTH-BYTES) (\\PILOTBITBLT PILOT-BBT NIL) (COND ((NOT (EQ ROW HEIGHT)) (|freplace| (PILOTBBT PBTDEST) |of| PILOT-BBT |with| (SETQ LINE-BASE (\\ADDBASE LINE-BASE DESTINATION-RASTER-WIDTH)))))))) (|if| (EQ PHOTOMETRY-SENSE AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER) |then| (SETUPPILOTBBT PILOT-BBT DESTINATION-BASE DESTINATION-PIXEL-OFFSET (UNFOLD DESTINATION-RASTER-WIDTH BITSPERWORD) DESTINATION-BASE DESTINATION-PIXEL-OFFSET (UNFOLD DESTINATION-RASTER-WIDTH BITSPERWORD) WIDTH HEIGHT 0 NIL NIL (QUOTE INVERT) (QUOTE REPLACE)) (\\PILOTBITBLT PILOT-BBT NIL)))) ) (AISBLT8TO1FSA.BITMAP (LAMBDA (STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE DESTINATION-PIXEL-OFFSET DESTINATION-RASTER-WIDTH DESTINATION-WIDTH WIDTH HEIGHT PHOTOMETRY-SENSE) (* \; "Edited 23-Sep-88 20:01 by Briggs") (* \; "Edited 2-May-88 17:00 by Briggs") (* |;;;| "Internal function called by AISBLT.BITMAP to move 8 bpp source file to 1 bpp bitmap using Floyd-Steinberg algorithm") (* |;;| "") (* |;;| "Use of the Error Table") (* |;;| "") (* |;;| "See Newman & Sproull, Principles of Interactive Computer Graphics, pg. 226 for a description of the Floyd-Steinberg algorithm.") (* |;;| "") (* |;;| "The error for the current pixel being processed (0<= n < WIDTH) is maintained in ERROR-CURRENT-PIXEL. The error for the pixel directly below the current pixel is stored in ERROR-TABLE[n], while ERROR-TABLE[n+1] represents the error for the pixel to the right. Once ERROR-CURRENT-PIXEL has been used in the calculation it is loaded from ERROR-TABLE[n+1], which frees this cell in the error table to hold the error for the pixel below and to the right of the current pixel.") (* |;;| " ") (LET ((SOURCE-BYTES-PER-LINE (UNFOLD SOURCE-RASTER-WIDTH BYTESPERWORD)) (INTERMEDIATE-WORD-BUFFER (\\ALLOCBLOCK (FOLDHI WIDTH WORDSPERCELL))) (INTERMEDIATE-WORD-BASE) (ERROR-CURRENT-PIXEL) (ERROR-TABLE (\\ALLOCBLOCK (ADD1 WIDTH))) (ERROR-BASE) (16-TO-1-PILOTBBT (|create| PILOTBBT)) (PIXEL) (ERROR) (QUARTER-ERROR) (THREE-EIGHTHS-ERROR)) (* |;;| "Setup for turning words to final destination bits. Note that we conditionally invert the bits -- if the AIS file had bits in the sense 0=black, 255=white, because Lisp bitmaps are 0=white, 1=black when displayed.") (SETUPPILOTBBT 16-TO-1-PILOTBBT INTERMEDIATE-WORD-BUFFER 15 16 DESTINATION-BASE DESTINATION-PIXEL-OFFSET 1 1 WIDTH 0 T T (COND ((EQ PHOTOMETRY-SENSE AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER) (QUOTE INVERT)) (T (QUOTE INPUT))) (QUOTE REPLACE)) (* |;;| "clear the error table initially") (|for| COLUMN |from| 0 |to| (TIMES 2 WIDTH) |by| 2 |do| (\\PUTBASEPTR ERROR-TABLE COLUMN 0)) (* |;;| "") (|for| ROW |from| 1 |to| HEIGHT |as| FILE-POINTER |from| (IPLUS SOURCE-PIXEL-OFFSET (\\GETFILEPTR STREAM)) |by| SOURCE-BYTES-PER-LINE |do| (* |;;| "position the file at the beginning of the new scan line") (\\SETFILEPTR STREAM FILE-POINTER) (* |;;| "reset the roving pointer in the error table for this row, and load the current pixel error, clearing the table entry since it will be accumulated into.") (SETQ ERROR-BASE ERROR-TABLE) (SETQ ERROR-CURRENT-PIXEL (\\GETBASEPTR ERROR-BASE 0)) (\\PUTBASEPTR ERROR-BASE 0 0) (* |;;| "reset the roving pointer to the intermediate result buffer") (SETQ INTERMEDIATE-WORD-BASE INTERMEDIATE-WORD-BUFFER) (|for| COLUMN |from| 1 |to| WIDTH |do| (* |;;| "take pixel value as read in plus error accumulated to this pixel -- see note re: error calculations above") (SETQ PIXEL (IPLUS ERROR-CURRENT-PIXEL (\\BIN STREAM))) (* |;;| "threshold") (COND ((IGREATERP PIXEL 127) (\\PUTBASE INTERMEDIATE-WORD-BASE 0 1) (SETQ ERROR (IDIFFERENCE PIXEL 255))) (T (\\PUTBASE INTERMEDIATE-WORD-BASE 0 0) (SETQ ERROR (IDIFFERENCE PIXEL 0)))) (* |;;| "distribute the error (3/8ths to each of pixels to right, and down, 1/4 to pixel diagonally down)") (* |;;| "we can use fast logical shifts only if we bias the number to make it positive (we use a bias of 32768 here)") (* |;;| "calculate 3/8ths error as half of (error - error/4) -- this way we will incur less error due to rounding in the error calculation.") (SETQ QUARTER-ERROR (IDIFFERENCE (LRSH (IPLUS 32768 ERROR) 2) (LRSH 32768 2))) (SETQ THREE-EIGHTHS-ERROR (IDIFFERENCE (LRSH (IPLUS 32768 (IDIFFERENCE ERROR QUARTER-ERROR)) 1) (LRSH 32768 1))) (* |;;| "pre-load the current pixel error so that the next entry in the error table can be used to store the error for the next line down") (SETQ ERROR-CURRENT-PIXEL (\\GETBASEPTR ERROR-BASE 2)) (* |;;| "3/8ths of the error to the right (the next \"current\")") (SETQ ERROR-CURRENT-PIXEL (IPLUS ERROR-CURRENT-PIXEL THREE-EIGHTHS-ERROR)) (* |;;| "3/8ths of the error down") (\\PUTBASEPTR ERROR-BASE 0 (IPLUS (\\GETBASEPTR ERROR-BASE 0) THREE-EIGHTHS-ERROR)) (* |;;| "1/4 of the error down to the right") (\\PUTBASEPTR ERROR-BASE 2 QUARTER-ERROR) (* |;;| "advance the roving pointer for error table") (SETQ ERROR-BASE (\\ADDBASE ERROR-BASE 2)) (* |;;| "advance pointer to intermediate result scan line buffer") (SETQ INTERMEDIATE-WORD-BASE (\\ADDBASE INTERMEDIATE-WORD-BASE 1))) (* |;;| " Pack the bits from the intermediate scan line buffer into the destination bitmap at the appropriate line and advance the destination scan line pointer.") (|freplace| (PILOTBBT PBTDEST) |of| 16-TO-1-PILOTBBT |with| DESTINATION-BASE) (\\PILOTBITBLT 16-TO-1-PILOTBBT NIL) (SETQ DESTINATION-BASE (\\ADDBASE DESTINATION-BASE DESTINATION-RASTER-WIDTH)))) T) ) (AISBLT8TO8.BITMAP (LAMBDA (STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE DESTINATION-PIXEL-OFFSET DESTINATION-RASTER-WIDTH DESTINATION-WIDTH WIDTH HEIGHT) (* \; "Edited 28-Apr-88 11:02 by Briggs") (* |;;;| "Internal function called by AISBLT.BITMAP to move 8 bpp source file to 8 bpp bitmap") (* |;;| "look for some special cases that we can handle much faster") (LET ((SOURCE-BYTES-PER-LINE (ITIMES SOURCE-RASTER-WIDTH 2))) (COND ((AND (EQ SOURCE-RASTER-WIDTH DESTINATION-RASTER-WIDTH) (EQ SOURCE-PIXEL-OFFSET 0) (EQ DESTINATION-PIXEL-OFFSET 0) (EQ WIDTH DESTINATION-WIDTH)) (* |;;| "source and destination have same raster width") (* |;;| "and the full scan line is being moved to the full destination scan line") (\\BINS STREAM DESTINATION-BASE 0 (ITIMES HEIGHT SOURCE-BYTES-PER-LINE))) (T (|for| ROW |from| 1 |to| HEIGHT |as| FILE-POINTER |from| (IPLUS SOURCE-PIXEL-OFFSET (\\GETFILEPTR STREAM)) |by| SOURCE-BYTES-PER-LINE |do| (\\SETFILEPTR STREAM FILE-POINTER) (\\BINS STREAM DESTINATION-BASE DESTINATION-PIXEL-OFFSET WIDTH) (COND ((NOT (EQ ROW HEIGHT)) (SETQ DESTINATION-BASE (\\ADDBASE DESTINATION-BASE DESTINATION-RASTER-WIDTH))))))))) ) (AISBLTNTO1FSA.BITMAP (LAMBDA (STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE DESTINATION-PIXEL-OFFSET DESTINATION-RASTER-WIDTH DESTINATION-WIDTH WIDTH HEIGHT SOURCE-BITS-PER-PIXEL PHOTOMETRY-SENSE) (* \; "Edited 23-Sep-88 20:11 by Briggs") (* \; "Edited 2-May-88 15:40 by Briggs") (* |;;;| "Internal function called by AISBLT.BITMAP to move N bpp source file to 1 bpp bitmap using Floyd-Steinberg algorithm. For N=8, use the special case version AISBLT8TO1FSA.BITMAP.") (* |;;| "") (* |;;| "Use of the Error Table") (* |;;| "") (* |;;| "See Newman & Sproull, Principles of Interactive Computer Graphics, pg. 226 for a description of the Floyd-Steinberg algorithm.") (* |;;| "") (* |;;| "The error for the current pixel being processed (0<= n < WIDTH) is maintained in ERROR-CURRENT-PIXEL. The error for the pixel directly below the current pixel is stored in ERROR-TABLE[n], while ERROR-TABLE[n+1] represents the error for the pixel to the right. Once ERROR-CURRENT-PIXEL has been used in the calculation it is loaded from ERROR-TABLE[n+1], which frees this cell in the error table to hold the error for the pixel below and to the right of the current pixel.") (* |;;| " ") (LET* ((SOURCE-BYTES-PER-LINE (ITIMES SOURCE-RASTER-WIDTH 2)) (SOURCE-LINE-BYTE-BUFFER-BASE (\\ALLOCBLOCK (FOLDHI SOURCE-RASTER-WIDTH WORDSPERCELL))) (INTERMEDIATE-WORD-BUFFER (\\ALLOCBLOCK (FOLDHI WIDTH WORDSPERCELL))) (INTERMEDIATE-WORD-BASE) (ERROR-CURRENT-PIXEL) (ERROR-TABLE (\\ALLOCBLOCK (ADD1 WIDTH))) (ERROR-BASE) (ERROR-FRACTIONAL-POINT 7) (N-TO-16-PILOTBBT (|create| PILOTBBT)) (16-TO-1-PILOTBBT (|create| PILOTBBT)) (PIXEL) (BLACK 0) (WHITE (SUB1 (EXPT 2 SOURCE-BITS-PER-PIXEL))) (THRESHOLD (LRSH (IPLUS BLACK WHITE) 1)) (ERROR) (QUARTER-ERROR) (THREE-EIGHTHS-ERROR)) (* |;;| "do the setup for expanding source pixels to words.") (SETUPPILOTBBT N-TO-16-PILOTBBT SOURCE-LINE-BYTE-BUFFER-BASE (ITIMES SOURCE-PIXEL-OFFSET SOURCE-BITS-PER-PIXEL) SOURCE-BITS-PER-PIXEL INTERMEDIATE-WORD-BUFFER (IDIFFERENCE 16 SOURCE-BITS-PER-PIXEL) 16 SOURCE-BITS-PER-PIXEL WIDTH 0 T T (QUOTE INPUT) (QUOTE REPLACE)) (* |;;| "Setup for turning words to final destination bits. Note that we conditionally invert the bits -- if the AIS file had bits in the sense 0=black, larger=lighter, because Lisp bitmaps are 0=white, 1=black when displayed.") (SETUPPILOTBBT 16-TO-1-PILOTBBT INTERMEDIATE-WORD-BUFFER 15 16 DESTINATION-BASE DESTINATION-PIXEL-OFFSET 1 1 WIDTH 0 T T (COND ((EQ PHOTOMETRY-SENSE AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER) (QUOTE INVERT)) (T (QUOTE INPUT))) (QUOTE REPLACE)) (* |;;| "clear the error table initially") (|for| COLUMN |from| 0 |to| (TIMES 2 WIDTH) |by| 2 |do| (\\PUTBASEPTR ERROR-TABLE COLUMN 0)) (* |;;| "") (|for| ROW |from| 1 |to| HEIGHT |do| (* |;;| "We read a full scan line, and extract the bits we need as we expand to 16 bits per pixel") (\\BINS STREAM SOURCE-LINE-BYTE-BUFFER-BASE 0 SOURCE-BYTES-PER-LINE) (* |;;| "expand the pixels to words to make them easier to deal with") (\\PILOTBITBLT N-TO-16-PILOTBBT NIL) (* |;;| "reset the roving pointer in the error table for this row, and load the current pixel error, resetting the table entry to 0 because it will be accumulated to as error for the next line") (SETQ ERROR-BASE ERROR-TABLE) (SETQ ERROR-CURRENT-PIXEL (\\GETBASEPTR ERROR-BASE 0)) (\\PUTBASEPTR ERROR-BASE 0 0) (* |;;| "reset the roving pointer to the intermediate result buffer") (SETQ INTERMEDIATE-WORD-BASE INTERMEDIATE-WORD-BUFFER) (|for| COLUMN |from| 1 |to| WIDTH |do| (* |;;| "take pixel value as read in plus error accumulated to this pixel") (SETQ PIXEL (IPLUS ERROR-CURRENT-PIXEL (\\GETBASE INTERMEDIATE-WORD-BASE 0))) (* |;;| "threshold") (COND ((IGREATERP PIXEL THRESHOLD) (\\PUTBASE INTERMEDIATE-WORD-BASE 0 1) (SETQ ERROR (IDIFFERENCE PIXEL WHITE))) (T (\\PUTBASE INTERMEDIATE-WORD-BASE 0 0) (SETQ ERROR (IDIFFERENCE PIXEL BLACK)))) (* |;;| "distribute the error (3/8ths to each of pixels to right, and down, 1/4 to pixel diagonally down)") (* |;;| "we can use fast logical shifts only if we bias the number to make it positive") (SETQ QUARTER-ERROR (IDIFFERENCE (LRSH (IPLUS 32768 ERROR) 2) (LRSH 32768 2))) (SETQ THREE-EIGHTHS-ERROR (IDIFFERENCE (LRSH (IPLUS 32768 (IDIFFERENCE ERROR QUARTER-ERROR)) 1) (LRSH 32768 1))) (* |;;| "pre-load the current pixel error so that the next entry in the error table can be used to store the error for the next line down") (SETQ ERROR-CURRENT-PIXEL (\\GETBASEPTR ERROR-BASE 2)) (* |;;| "3/8ths of the error to the right (the next \"current\")") (SETQ ERROR-CURRENT-PIXEL (IPLUS ERROR-CURRENT-PIXEL THREE-EIGHTHS-ERROR)) (* |;;| "3/8ths of the error down") (\\PUTBASEPTR ERROR-BASE 0 (IPLUS (\\GETBASEPTR ERROR-BASE 0) THREE-EIGHTHS-ERROR)) (* |;;| "1/4 of the error down to the right") (\\PUTBASEPTR ERROR-BASE 2 QUARTER-ERROR) (* |;;| "advance the roving pointer for error table") (SETQ ERROR-BASE (\\ADDBASE ERROR-BASE 2)) (* |;;| "advance pointer to intermediate result scan line buffer") (SETQ INTERMEDIATE-WORD-BASE (\\ADDBASE INTERMEDIATE-WORD-BASE 1))) (* |;;| " Pack the bits from the intermediate scan line buffer into the destination bitmap at the appropriate line and advance the destination scan line pointer.") (|freplace| (PILOTBBT PBTDEST) |of| 16-TO-1-PILOTBBT |with| DESTINATION-BASE) (\\PILOTBITBLT 16-TO-1-PILOTBBT NIL) (SETQ DESTINATION-BASE (\\ADDBASE DESTINATION-BASE DESTINATION-RASTER-WIDTH)))) T) ) (AISBLTNTO1TRUNCATE.BITMAP (LAMBDA (STREAM SOURCE-PIXEL-OFFSET SOURCE-RASTER-WIDTH DESTINATION-BASE DESTINATION-PIXEL-OFFSET DESTINATION-RASTER-WIDTH DESTINATION-WIDTH WIDTH HEIGHT SOURCE-BITS-PER-PIXEL PHOTOMETRY-SENSE) (* \; "Edited 22-Sep-88 10:23 by Briggs") (* \; "Edited 2-May-88 15:40 by Briggs") (* |;;;| "Internal function called by AISBLT.BITMAP to move N bpp source file to 1 bpp bitmap using truncation.") (LET* ((SOURCE-BYTES-PER-LINE (ITIMES SOURCE-RASTER-WIDTH 2)) (SOURCE-LINE-BYTE-BUFFER-BASE (\\ALLOCBLOCK (FOLDHI SOURCE-RASTER-WIDTH WORDSPERCELL))) (HIGH-N-TO-1-PILOTBBT (|create| PILOTBBT)) (16-TO-1-PILOTBBT (|create| PILOTBBT))) (* |;;| "Setup for turning source pixels to destination pixels. Note that we conditionally invert the bits -- if the AIS file had bits in the sense 0=black, larger=lighter, because Lisp bitmaps are 0=white, 1=black when displayed.") (SETUPPILOTBBT HIGH-N-TO-1-PILOTBBT SOURCE-LINE-BYTE-BUFFER-BASE (ITIMES SOURCE-PIXEL-OFFSET SOURCE-BITS-PER-PIXEL) SOURCE-BITS-PER-PIXEL DESTINATION-BASE DESTINATION-PIXEL-OFFSET 1 1 WIDTH 0 T T (COND ((EQ PHOTOMETRY-SENSE AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER) (QUOTE INVERT)) (T (QUOTE INPUT))) (QUOTE REPLACE)) (|for| ROW |from| 1 |to| HEIGHT |do| (* |;;| "We read a full scan line, and extract the bits we need.") (\\BINS STREAM SOURCE-LINE-BYTE-BUFFER-BASE 0 SOURCE-BYTES-PER-LINE) (* |;;| "Pack the bits from the source scan line buffer into the destination bitmap at the appropriate line and advance the destination scan line pointer.") (|freplace| (PILOTBBT PBTDEST) |of| HIGH-N-TO-1-PILOTBBT |with| DESTINATION-BASE) (\\PILOTBITBLT HIGH-N-TO-1-PILOTBBT NIL) (SETQ DESTINATION-BASE (\\ADDBASE DESTINATION-BASE DESTINATION-RASTER-WIDTH)))) T) ) (SETUPPILOTBBT (LAMBDA (PILOT-BBT SOURCE-BASE SOURCE-BIT SOURCE-BPL DESTINATION-BASE DESTINATION-BIT DESTINATION-BPL WIDTH HEIGHT FLAGS DISJOINT DISJOINT-ITEMS SOURCE OPERATION) (* \; "Edited 28-Apr-88 18:21 by Briggs") (|freplace| (PILOTBBT PBTDEST) |of| PILOT-BBT |with| DESTINATION-BASE) (|freplace| (PILOTBBT PBTDESTBIT) |of| PILOT-BBT |with| DESTINATION-BIT) (|freplace| (PILOTBBT PBTDESTBPL) |of| PILOT-BBT |with| DESTINATION-BPL) (|freplace| (PILOTBBT PBTSOURCE) |of| PILOT-BBT |with| SOURCE-BASE) (|freplace| (PILOTBBT PBTSOURCEBIT) |of| PILOT-BBT |with| SOURCE-BIT) (|freplace| (PILOTBBT PBTSOURCEBPL) |of| PILOT-BBT |with| SOURCE-BPL) (|freplace| (PILOTBBT PBTWIDTH) |of| PILOT-BBT |with| WIDTH) (|freplace| (PILOTBBT PBTHEIGHT) |of| PILOT-BBT |with| HEIGHT) (|freplace| (PILOTBBT PBTFLAGS) |of| PILOT-BBT |with| FLAGS) (|freplace| (PILOTBBT PBTDISJOINT) |of| PILOT-BBT |with| DISJOINT) (|freplace| (PILOTBBT PBTDISJOINTITEMS) |of| PILOT-BBT |with| DISJOINT-ITEMS) (|freplace| (PILOTBBT PBTUSEGRAY) |of| PILOT-BBT |with| NIL) (\\SETPBTFUNCTION PILOT-BBT SOURCE OPERATION)) ) ) (* |;;| "Useful constants") (* \; "AIS file identifying word") (CL:DEFCONSTANT AIS-PASSWORD 33962) (* \; "Attribute part header types") (CL:DEFCONSTANT AIS-RASTER-TYPE 1) (CL:DEFCONSTANT AIS-PLACEMENT-TYPE 2) (CL:DEFCONSTANT AIS-PHOTOMETRY-TYPE 3) (CL:DEFCONSTANT AIS-COMMENT-TYPE 4) (* \; "Raster coding types") (CL:DEFCONSTANT AIS-RASTER-CODING-UCA 1) (CL:DEFCONSTANT AIS-RASTER-CODING-CA 2) (* \; "Photometry sense ") (CL:DEFCONSTANT AIS-PHOTOMETRY-SENSE-LARGER-DARKER 1) (CL:DEFCONSTANT AIS-PHOTOMETRY-SENSE-LARGER-LIGHTER 0) (* \; "Photometry signal ") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-BLACK-AND-WHITE 0 "Photometry signal is black and white") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-RED-SEPARATION 1 "Photometry signal is red separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-BLUE-SEPARATION 2 "Photometry signal is blue separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-GREEN-SEPARATION 3 "Photometry signal is green separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-CYAN-SEPARATION 4 "Photometry signal is cyan separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-MAGENTA-SEPARATION 5 "Photometry signal is magenta separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-YELLOW-SEPARATION 6 "Photometry signal is yellow separation") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-X-CIE 7 "Photometry signal is x signal (CIE)") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-Y-CIE 8 "Photometry signal is y signal (CIE)") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-IN-COMMENT (UNSIGNED -2 16) "Photometry signal specified in comment part") (CL:DEFCONSTANT AIS-PHOTOMETRY-SIGNAL-UNSPECIFIED (UNSIGNED -1 16) "Photometry signal unspecified") (* \; "Photometry spot type") (CL:DEFCONSTANT AIS-PHOTOMETRY-SPOT-TYPE-RECTANGULAR 1 "Photometry spot type is rectangular") (CL:DEFCONSTANT AIS-PHOTOMETRY-SPOT-TYPE-CIRCULAR 2 "Photometry spot type is circular") (CL:DEFCONSTANT AIS-PHOTOMETRY-SPOT-TYPE-IN-COMMENTS (UNSIGNED -2 16) "Photometry spot type is specified in comments") (CL:DEFCONSTANT AIS-PHOTOMETRY-SPOT-TYPE-UNSPECIFIED (UNSIGNED -1 16) "Photometry spot type is unspecified") (* \; "Photometry scale") (CL:DEFCONSTANT AIS-PHOTOMETRY-SCALE-RELECTANCE-TRANSMITTANCE 1 "Photometry scale is reflectance or transmittance x 1000") (CL:DEFCONSTANT AIS-PHOTOMETRY-SCALE-OPTICAL-DENSITY 2 "Photometry scale is optical density x 1000") (CL:DEFCONSTANT AIS-PHOTOMETRY-SCALE-IN-COMMENT (UNSIGNED -2 16) "Photometry scale is specified in comments") (CL:DEFCONSTANT AIS-PHOTOMETRY-SCALE-UNSPECIFIED (UNSIGNED -1 16) "Photometry scale is unspecified") (* \; "Photometry") (CL:DEFCONSTANT AIS-PHOTOMETRY-UNSPECIFIED (UNSIGNED -1 16) "Photometry general unspecified value") (* \; "Header information when writing AIS format") (CL:DEFCONSTANT AIS-DEFAULT-HEADER-LENGTH (CL:* 1024 BYTESPERWORD) "Length in bytes of the header to write in AIS files") (PUTPROPS AISBLT COPYRIGHT ("Xerox Corporation" 1988)) (DECLARE\: DONTCOPY (FILEMAP (NIL (2241 14630 (AISBLT.BITMAP 2251 . 9292) (AISFILEHEADER 9294 . 11739) (WRITEAIS 11741 . 14628)) (14669 32114 (AISBLT1TO1.BITMAP 14679 . 17862) (AISBLT8TO1FSA.BITMAP 17864 . 22694) ( AISBLT8TO8.BITMAP 22696 . 23865) (AISBLTNTO1FSA.BITMAP 23867 . 29280) (AISBLTNTO1TRUNCATE.BITMAP 29282 . 31022) (SETUPPILOTBBT 31024 . 32112))))) STOP \ No newline at end of file diff --git a/lispusers/AISBLT.TEDIT b/lispusers/AISBLT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..9a5b937aa6b7ce1c15e9bed7985515f7a48dbc24 GIT binary patch literal 7463 zcmeHKUys{Z70FjhGp$bpp%vg2otnIW@N+mqWO=8ut zE!&ytEaCwkDod)^&bC$E zIW}BnUr`PeWlvG^XZ*tR@l}^G)1N$J$B93mr>rTzcVh2X&v_C(-_p_xJ zr#p=48Jxpe7-fZO<^=)EVAxA0UI?As%T@_^X3;8~LW?-GHMLI`q+2^o=^46ax(x1X z_CW1v!uQ!KoMe6!riJn;JHHb0)u=8P{$v4zT*MMikskPZ&eloU=Eq)(cu4@fhUvpgDR4Je3--1nC=@W+h$G`jDKHOQh@1ks+y@d8m}61QLzZSh z*Rst3GvE)X3Za`|G%Gzb$mKAF4;j1k0Vvcm_EM@Q%nWq1PZrut7Cz;`+5!+G*iHR} zPqHZS@tnqd;?I1E0Xh@}FJKp5;(O--r>^Ylw$^hkTi2ZJClB+3r%JAR5v>A12ykYB zkM4_R6$_ULj~9p(A(8um|BMF!s=%PY{f;PRkt|X0bgeo#p1cE6$ml$ImtAB>?*=bAZBC5VY9{A`?HRAqb;7jY|)6>4LLf zw2W7HWG9IiV+f^f7SDIs{{A7tEb3K{RTPcfTln(@dSMEA#MVq(1q$+XZ!$r1OhTv_ ziDHaV6P#j_YBqCRjMQOeeDn}SF$0nNDVjQ2`oJ21L3zk~jxCS@k6m)K84Y}7fhO|; zdw?f$R9r6d5_wsMJRxFQ2eN?cIUxlIR1`bH!<0bXi2_zmhIN+6C$)?KlUzCl^ zZ!C3{uB|$ljoVKi@GChLbIL}I7!qE9F_ns00oy=y?#P7~tk4^<8>CU)xYBics@dsT zW7Ewos3D@u_#7$9MP;mof15r@vEmRyDDoj7=P$iE&vhD_dE%bFwNlY@lwi2JHc+Io ztY1zpET(HF(0Emsk9+F&lU{!QRDt4i zafJgGsQR)s_7DlyHxcsqN|B@EupRmHjMJU0joTg`3yWA#`DVw4Knvvq4w0{CMm{BI zm6M{9W=u0&D5kQs{%v4I&9xtwy<9{X$sB9*|Mb$) zPfXQd&3w(Z;IX5bj#j1gRJ<8gc!<(bSu^(hgf>Yop9%%y@c4Cyy;mHLELV)zsxhL< z*QAOMM3$Si$}Sd3XQ-QHGF^G|9n%@AXPcuPMa4X!!JpxsLEQgDv5Wn<;0 zSW~stW4*^d{uuvSxEiW9USUs2_UCM`#hSZpmmTiyv%B~9@zfNOg;rZNEbD>8nxBu= zKI@@PG+XPpSnpJ|^Al%GrhB$Na-m2!AL@>N45(Ox0dq71Z&M>U;)>^yZMh(5eR)d$ z?(MRHI@FEFY-r)?YBKAgX47DlEUv9T(5$f(ADiGH6_psNAHi<*f8B0=`(fZaVfV4v-mWnJye6@sFIV7Yh54n8|%hr7E{eG8KR zLx~~vuB7iu`mRgAt}bo0#8`f>@qS~!@k!&8tuGtj0A=guEqrW!xg}0t^|4O}Zza*r zCBBRATQ_df(<}eljTemhajmB2v_NhHKw4D>p9hh4sXEuQ#S!F@e^z{l- zIfd`Ct~VO={W=#miOhX31i#AnR|-^30w0z|h;Updhzu4wh+|mi_(7fU&pP2pb;64} z;hL5I)H!}uCrs*uKhy~y)d}4?;U{&%Z|a1f)(L;C6Rriv%N*;jDN;y;zt%Y_WdO(4 W=XH+1*9laLa_@X#HvaO(zy1s4MIu4~ literal 0 HcmV?d00001 diff --git a/lispusers/ANALYZER b/lispusers/ANALYZER new file mode 100644 index 00000000..f423dbf5 --- /dev/null +++ b/lispusers/ANALYZER @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED " 9-Mar-89 15:24:58" {ERINYES}MEDLEY>ANALYZER.;9 86708 changes to%: (FNS Analyzer.ReadWordList) previous date%: "13-Jan-89 15:50:22" {ERINYES}MEDLEY>ANALYZER.;8) (* " Copyright (c) 1985, 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT ANALYZERCOMS) (RPAQQ ANALYZERCOMS [(COMS (* ;;; "THE ANALYZER CLASS") (RECORDS Morphalyzer) (* ;; "renamed record to avoid a conflict.") (MACROS Analyzer.Open Analyzer.Close Analyzer.Corrections Analyzer.Proofread Analyzer.Analyze Analyzer.Lookup Analyzer.FindWord Analyzer.AddEntry Dict.DisplayEntry) (* ;; "MACROS that call apply the methods of the analyzer class.") (FNS AnalyzerFromName Analyzer.CountWords Analyzer.DefaultCorrections Analyzer.DefaultNextWord Analyzer.Name Analyzer.DefaultAddEntry Analyzer.DefaultAnalyze Analyzer.DefaultProofread) (* ;;  "Functions implementing the default case for various methods of the analyzer class.") (FNS Analyzer.DefaultLoadWordList Analyzer.DefaultStoreWordList Analyzer.ReadWordList Analyzer.WriteWordList CREATEWORDLISTRDTBL) (INITVARS WORDLISTRDTBL) (FNS Analyzer.Prop Analyzer.PushProp) (MACROS Analyzer.AlphaCharP \Analyzer.TestCorruption Analyzer.Capitalization Analyzer.UCaseP) (* ;; "Service MACROS.") (FNS STREAM.FETCHSTRING) (MACROS Stream.Init Stream.NextChar) (FNS Analyzer.CorruptWord) (GLOBALVARS WORDLISTRDTBL)) [COMS (* ;;; "TEDIT interface to analyzer.") (FNS Analyzer.Establish AnalyzerForStream Analyzer.QuitFn Analyzer.BeforeLogout) (FNS TEdit.ProofreadMenu PROOFREADER.WHENSELECTEDFN WITH-TEDIT TEdit.Correct TEdit.CountWords TEdit.AddEntry TEdit.Proofread TEdit.SetAnalyzer TEdit.LoadWordList TEdit.StoreWordList Analyzer.TEditMenuItems) (INITVARS Analyzer.List Proofreader.AutoCorrect (Proofreader.AutoDelete T) (Proofreader.MenuEdge 'LEFT) Analyzer.TimeProofreader Proofreader.UserFns) (GLOBALVARS Analyzer.List Proofreader.AutoCorrect Proofreader.AutoDelete Proofreader.MenuEdge Analyzer.TimeProofreader Proofreader.UserFns) (P (Analyzer.TEditMenuItems) (COND ((NOT (FASSOC 'Analyzer.BeforeLogout BEFORELOGOUTFORMS)) (push BEFORELOGOUTFORMS '(Analyzer.BeforeLogout] (COMS (* ;;; "THE Dict CLASS") (RECORDS Dict) (MACROS Dict.Open Dict.Close Dict.GetEntry Dict.PutEntry Dict.PrintEntry Dict.MapEntries) (* ;;; "utility functions") (FNS DictFromName Dict.Establish Dict.Prop Dict.Name) (INITVARS Dict.DictionaryList) (GLOBALVARS Dict.DictionaryList) (* ;;; "a simple dictionary.") (FNS SimpleDict.New SimpleDict.PutEntry SimpleDict.Lookup SimpleDict.MapEntries SimpleDict.PrintEntries SimpleDict.Test) (RECORDS SimpleDict.Node)) (COMS (* ;;; "the INVERTEDDICT class") (RECORDS INVERTEDDICT) (FNS InvertedDictFromName InvertedDict.Establish InvertedDict.Prop InvertedDict.Name InvertedDict.Open) (INITVARS InvertedDict.List) (GLOBALVARS InvertedDict.List)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA InvertedDict.Prop Dict.Prop Analyzer.Prop]) (* ;;; "THE ANALYZER CLASS") (DECLARE%: EVAL@COMPILE (DATATYPE Morphalyzer (analyzerName grammar index analyzerProps openFn closeFn proofreadFn analyzeFn lookupFn correctionsFn generateFn conjugateFn findWordFn addEntryFn) openFn _ (FUNCTION NILL) closeFn _ (FUNCTION NILL) proofreadFn _ (FUNCTION Analyzer.DefaultProofread) analyzeFn _ (FUNCTION Analyzer.DefaultAnalyze) lookupFn _ (FUNCTION NILL) correctionsFn _ (FUNCTION Analyzer.DefaultCorrections) generateFn _ (FUNCTION NILL) conjugateFn _ (FUNCTION NILL) findWordFn _ (FUNCTION NILL) addEntryFn _ (FUNCTION Analyzer.DefaultAddEntry)) ) (/DECLAREDATATYPE 'Morphalyzer '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((Morphalyzer 0 POINTER) (Morphalyzer 2 POINTER) (Morphalyzer 4 POINTER) (Morphalyzer 6 POINTER) (Morphalyzer 8 POINTER) (Morphalyzer 10 POINTER) (Morphalyzer 12 POINTER) (Morphalyzer 14 POINTER) (Morphalyzer 16 POINTER) (Morphalyzer 18 POINTER) (Morphalyzer 20 POINTER) (Morphalyzer 22 POINTER) (Morphalyzer 24 POINTER) (Morphalyzer 26 POINTER)) '28) (* ;; "renamed record to avoid a conflict.") (DECLARE%: EVAL@COMPILE (PUTPROPS Analyzer.Open MACRO ((analyzer) (APPLY* (fetch (Morphalyzer openFn) of analyzer) analyzer))) (PUTPROPS Analyzer.Close MACRO ((analyzer) (APPLY* (fetch (Morphalyzer closeFn) of analyzer) analyzer))) (PUTPROPS Analyzer.Corrections MACRO ((analyzer stream start length) (* * returns a list of possible corrections for the string starting at "start"  that is "length" characters long.) (APPLY* (fetch (Morphalyzer correctionsFn) of analyzer) analyzer stream start length))) (PUTPROPS Analyzer.Proofread MACRO ((analyzer stream start length prFn) (* * The user interface to Analyzer.Analyze.) (APPLY* (fetch (Morphalyzer proofreadFn) of analyzer) analyzer stream start length prFn))) (PUTPROPS Analyzer.Analyze MACRO ((analyzer stream start length analFn allowWildCards) (* * break up the stream into legal lexical items.  calls analFn (analyzer stream start len entries) on each item, where "entries"  is the analysis of that item. If "entries" is NIL, then the item could not be  analyzed.) (APPLY* (fetch (Morphalyzer analyzeFn) of analyzer) analyzer stream start length analFn allowWildCards))) (PUTPROPS Analyzer.Lookup MACRO ((analyzer stream start length) (* * Look up the substring of stream between start and length in dict.  "stream" can be a stream, a string, or a list of characters.) (APPLY* (fetch (Morphalyzer lookupFn) of analyzer) analyzer stream start length))) (PUTPROPS Analyzer.FindWord MACRO ((analyzer word stream start length) (APPLY* (fetch (Morphalyzer findWordFn) of analyzer ) analyzer word stream start length))) (PUTPROPS Analyzer.AddEntry MACRO ((analyzer lemma entry dontRecord) (* * add lemma to the dictionary with entry "entry" %.  If dontRecord is non-NIL, don't worry about keeping track of this word for the  word list.) (APPLY* (fetch (Morphalyzer addEntryFn) of analyzer ) analyzer lemma entry dontRecord))) (PUTPROPS Dict.DisplayEntry MACRO ((dict entry newwindowflg) (APPLY* (OR [COND ((type? Dict dict) (Dict.Prop dict 'DISPLAYENTRYFN)) ((type? INVERTEDDICT dict) (InvertedDict.Prop dict 'DISPLAYENTRYFN] 'NILL) dict entry newwindowflg))) ) (* ;; "MACROS that call apply the methods of the analyzer class.") (DEFINEQ (AnalyzerFromName [LAMBDA (dictName remoteName) (* ; "Edited 6-Oct-88 09:56 by jtm:") (* * find the analyzer corresponding to the dictionary.) (PROG (analyzer COLONPOS) [COND ((NULL dictName) (SETQ analyzer (CAR Analyzer.List))) [(for i in Analyzer.List do (COND ([AND (EQ dictName (fetch (Morphalyzer analyzerName) of i)) (EQ remoteName (Analyzer.Prop i 'RemoteDict] (SETQ analyzer i) (RETURN T] ((SETQ COLONPOS (STRPOS ":" dictName)) (SETQ analyzer (AnalyzerFromName (SUBATOM dictName 1 (SUB1 COLONPOS)) (SUBATOM dictName (IPLUS COLONPOS 2) -1] (RETURN analyzer]) (Analyzer.CountWords [LAMBDA (analyzer stream start length) (* jtm%: "13-Nov-86 13:32") (LET [(n 0) (FN (Analyzer.Prop analyzer 'CountWords] (COND (FN (APPLY* FN analyzer stream start length)) (T [Analyzer.Analyze analyzer stream start length (FUNCTION (LAMBDA (analyzer stream start length entries) (add n 1) NIL] n]) (Analyzer.DefaultCorrections [LAMBDA (analyzer stream start length) (* jtm%: " 7-Apr-87 08:23") (* * returns a list of possible spelling corrections for the given word.) (PROG [form word wordList caps periods (userDict (Analyzer.Prop analyzer 'UserDict] [COND [(STREAMP stream) (SETFILEPTR stream start) (SETQ word (for i from 1 to length collect (BIN stream] ((STRINGP stream) (SETQ word (for i from 1 to (NCHARS stream) collect (NTHCHARCODE stream i] (SETQ caps (Analyzer.Capitalization word)) (SETQ periods (FMEMB (CHARCODE %.) word)) (* * first try transpositions) (for tail temp on word while (CDR tail) do (SETQ temp (CAR tail)) (RPLACA tail (CADR tail)) (RPLACA (CDR tail) temp) (COND ((AND (EQ caps 'FIRST) (EQ tail word)) (* don't transpose the first letters  of a capitalized word.) NIL) (T (\Analyzer.TestCorruption analyzer word wordList userDict))) (RPLACA (CDR tail) (CAR tail)) (RPLACA tail temp)) (* * next try deletions) (COND ((CDR word) (\Analyzer.TestCorruption analyzer (CDR word) wordList userDict))) (for tail temp on word while (CDR tail) do (SETQ temp (CDR tail)) (RPLACD tail (CDDR tail)) (\Analyzer.TestCorruption analyzer word wordList userDict) (RPLACD tail temp)) (* * prepend a character.) (SETQ word (CONS (CHARCODE A) word)) (SELECTQ caps (FIRST (* don't prepend a character before  a capitalized word.) NIL) (ALL (* prepend a capital letter.) (for c from (CHARCODE A) to (CHARCODE Z) do (RPLACA word c) (\Analyzer.TestCorruption analyzer word wordList userDict))) (for c from (CHARCODE a) to (CHARCODE z) do (RPLACA word c) (\Analyzer.TestCorruption analyzer word wordList userDict))) (SETQ word (CDR word)) (* * insert characters.) (for tail on word do (RPLACD tail (CONS (CHARCODE A) (CDR tail))) [COND ((EQ caps 'ALL) (for c from (CHARCODE A) to (CHARCODE Z) do (RPLACA (CDR tail) c) (\Analyzer.TestCorruption analyzer word wordList userDict))) (T (for c from (CHARCODE a) to (CHARCODE z) do (RPLACA (CDR tail) c) (\Analyzer.TestCorruption analyzer word wordList userDict] (COND (periods (RPLACA (CDR tail) (CHARCODE %.)) (\Analyzer.TestCorruption analyzer word wordList userDict))) (RPLACD tail (CDDR tail))) (* * replace characters) (for tail temp on word do (SETQ temp (CAR tail)) [COND ((OR (EQ caps 'ALL) (AND (EQ caps 'FIRST) (EQ tail word))) (for c from (CHARCODE A) to (CHARCODE Z) do (COND ((NEQ temp c) (RPLACA tail c) (\Analyzer.TestCorruption analyzer word wordList userDict] [COND ((OR (EQ caps NIL) (NOT (ALPHACHARP (CHCON1 temp))) (AND (EQ caps 'FIRST) (NEQ tail word))) (for c from (CHARCODE a) to (CHARCODE z) do (COND ((NEQ temp c) (RPLACA tail c) (\Analyzer.TestCorruption analyzer word wordList userDict] (COND (periods (RPLACA tail (CHARCODE %.)) (\Analyzer.TestCorruption analyzer word wordList userDict))) (RPLACA tail temp)) (SETQ wordList (SORT wordList)) [for i on wordList do (while (STREQUAL (CAR i) (CADR i)) do (RPLACD i (CDDR i] (RETURN wordList]) (Analyzer.DefaultNextWord [LAMBDA (analyzer stream startPtr searchLength NWFn) (* jtm%: "29-Oct-85 15:23") (* * Scans the stream looking for a word, i.e.  a sequence of alphabetic charqacters. If the file ptr is already in the middle  of such a sequence, it backs up to the beginning of that sequence.  The function applies NWFn to (stream start stop) for each such word.) (SETFILEPTR stream (OR startPtr (SETQ startPtr 0))) (bind char end endPtr word length start value quote (filePtr _ (GETFILEPTR stream)) (EOFPtr _ (GETEOFPTR stream)) first (SETQ endPtr (COND (searchLength (IPLUS startPtr searchLength) ) (T EOFPtr))) (OR (ILEQ endPtr EOFPtr) (SETQ endPtr EOFPtr)) do (SETQ char (AND (ILESSP (GETFILEPTR stream) endPtr) (BIN stream))) (COND [(AND char (AND (NUMBERP char) (ILESSP char 128) (Analyzer.AlphaCharP char))) (OR start (SETQ start (SUB1 (GETFILEPTR stream] (start (SETQ end (GETFILEPTR stream)) (SETQ length (IDIFFERENCE end start)) (AND char (add length -1)) (* back up to the last legal char.) [COND (NWFn (SETQ value (APPLY* NWFn analyzer stream start length] (COND ((OR (NULL NWFn) (EQ value T)) (RETURN (CONS start length))) (value (RETURN value))) (SETFILEPTR stream end) (SETQ start NIL))) (OR char (RETURN]) (Analyzer.Name [LAMBDA (analyzer) (* jtm%: "13-Oct-87 10:44") (COND [(Analyzer.Prop analyzer 'RemoteDict) (MKATOM (CONCAT (fetch (Morphalyzer analyzerName) of analyzer) ": " (Analyzer.Prop analyzer 'RemoteDict] (T (fetch (Morphalyzer analyzerName) of analyzer]) (Analyzer.DefaultAddEntry [LAMBDA (analyzer lemma entry dontRecord errorStream) (* jtm%: " 7-Apr-87 07:57") (LET [(userDict (Analyzer.Prop analyzer 'UserDict] (COND ((NULL userDict) (SETQ userDict (SimpleDict.New)) (Analyzer.Prop analyzer 'UserDict userDict))) (Dict.PutEntry userDict lemma entry) (COND ((NOT dontRecord) (Analyzer.PushProp analyzer 'WordList lemma))) lemma]) (Analyzer.DefaultAnalyze [LAMBDA (analyzer stream startPtr searchLength NWFn allowWildCards) (* ; "Edited 23-Nov-88 08:17 by jtm:") (* * Scans the stream looking for a word, i.e.  a sequence of alphabetic charqacters. If the file ptr is already in the middle  of such a sequence, it backs up to the beginning of that sequence.  The function applies NWFn to (stream start stop) for each such word.) [COND ((STRINGP stream) (SETQ stream (OPENSTRINGSTREAM stream] (SETFILEPTR stream (OR startPtr (SETQ startPtr 0))) (bind char end endPtr length start lookup number initialQuote seprs (userDict _ (Analyzer.Prop analyzer 'UserDict)) [optSeprCodes _ (OR (Analyzer.Prop analyzer 'OPT-SEPR-CODES) '(39 46 45 47] (addAlphaCharCodes _ (Analyzer.Prop analyzer 'ADD-ALPHA-CHAR-CODES)) (word _ (ALLOCSTRING 100 32)) (i _ startPtr) first (DECLARE (LOCALVARS . T)) [SETQ endPtr (COND (searchLength (IMIN (GETEOFPTR stream) (IPLUS startPtr searchLength))) (T (GETEOFPTR stream] do (SETQ char (AND (add i 1) (ILEQ i endPtr) (BIN stream))) (COND ((AND start (NUMBERP char) (ILESSP char 128)) (RPLCHARCODE word (IDIFFERENCE i start) char))) [COND [[AND char (OR (AND (NUMBERP char) (ILESSP char 128) (Analyzer.AlphaCharP char)) (FMEMB char addAlphaCharCodes) (AND allowWildCards (EQ char (CONSTANT (CHARCODE *] (COND ((NULL start) [COND (number (SETQ start (IDIFFERENCE i 2)) (* we have a number followed by some characters.  (e.g. 7th, 21st, etc.) Take in the last digit of the number.) (RPLCHARCODE word 1 number) (SETQ number NIL)) (T (SETQ start (SUB1 i] (RPLCHARCODE word (IDIFFERENCE i start) char] [(AND char (NUMBERP char) (IGEQ char 48) (ILEQ char 57)) (* a number) (COND ((NULL start) (SETQ number char) (SETQ initialQuote NIL)) (T (RPLCHARCODE word (IDIFFERENCE i start) char] ((AND start char (FMEMB char optSeprCodes)) (* optSeprCodes may or may not be a  part of the word.) (push seprs i)) [start (* AND char (add length -1)) (* back up to the last legal char.) (* * find the longest string of characters seperated by seprs that the analyzer  accepts.) (COND ((NULL seprs) (SETQ seprs i)) (T (push seprs i))) [for stop inside seprs do (SETQ length (SUB1 (IDIFFERENCE stop start))) (COND ([SETQ lookup (OR (Analyzer.Lookup analyzer word 0 length) (AND userDict (SimpleDict.Lookup userDict word length] (RETURN)) ((AND initialQuote (EQP length 1) (EQ (NTHCHARCODE word 1) (CHARCODE s))) (SETQ lookup 'possessive) (RETURN] (* * apply NWFn and return its value if non-NIL.) (COND ((AND (NULL NWFn) (NEQ lookup 'possessive)) (RETURN (CONS start length))) ((AND (NEQ lookup 'possessive) (SETQ lookup (APPLY* NWFn analyzer stream start length lookup))) (RETURN lookup)) (T (COND ((NEQ i (IPLUS start length 1)) (* we regressed.) (SETQ i (IPLUS start length)) (* don't add 1 so that we will see the quote and initialQuote will get set  ("time's")) (SETFILEPTR stream i) (* set char to T to prevent the  RETURN at the end of the loop.) (SETQ char T))) (SETQ start NIL) (SETQ seprs NIL) (SETQ initialQuote NIL] (T (SETQ number NIL) (SETQ initialQuote (EQ char (CHARCODE %'] (OR char (RETURN]) (Analyzer.DefaultProofread [LAMBDA (analyzer stream begin length) (* jtm%: "16-Dec-87 13:07") (PROG (start.length correction startTime stopTime char (n 0)) (TEDIT.PROMPTPRINT stream "Proofreading . . . " T) (* * initialize and back up to the beginning of a word.) (SETQ startTime (CLOCK 0)) (Stream.Init stream begin length) [COND ((NEQ length 0) (while (AND (NUMBERP (SETQ char (BIN stream))) (ALPHACHARP char)) do (COND ((EQUAL begin 0) (RETURN)) (T (add begin -1) (add length 1) (SETFILEPTR stream begin] (* * look for the next spelling error.) [while [SETQ start.length (Analyzer.Analyze analyzer stream begin length (FUNCTION (LAMBDA (analyzer stream start length entries) (add n 1) (COND ((NULL entries) (CONS start length] do (* * start.length is a CONS pair of locations delimiting an unrecognizable  word. Set the selection to it and display it.) [COND ((AND Proofreader.UserFns (for fn (word _ (STREAM.FETCHSTRING stream (CAR start.length) (CDR start.length))) inside Proofreader.UserFns thereis (APPLY* fn word))) (SETQ correction '*SKIP*)) (T (TEDIT.SETSEL stream (ADD1 (CAR start.length)) (CDR start.length) 'RIGHT T) (TEDIT.SHOWSEL stream NIL) (TEDIT.NORMALIZECARET stream) (TEDIT.SHOWSEL stream T) (COND ([NOT (AND Proofreader.AutoCorrect (SETQ correction (TEdit.Correct stream analyzer T] (RETURN] (COND [(FMEMB correction '(*SKIP* *INSERT*)) [add length (IDIFFERENCE begin (IPLUS (CAR start.length) (CDR start.length] (SETQ begin (IPLUS (CAR start.length) (CDR start.length] ((STRINGP correction) (add length (IDIFFERENCE begin (CAR start.length))) (* move start point.) (add length (IDIFFERENCE (NCHARS correction) (CDR start.length))) (* adjust for correction.) (SETQ begin (CAR start.length))) (T (SHOULDNT] (SETQ stopTime (CLOCK 0)) (COND (Analyzer.TimeProofreader (TEDIT.PROMPTPRINT stream (CONCAT "Elapsed Time: " (QUOTIENT (DIFFERENCE stopTime startTime) 1000.0) " seconds."))) (start.length (TEDIT.PROMPTPRINT stream "Error found.")) (T (* (ADD1 (GETEOFPTR stream))) (TEDIT.SETSEL stream (IPLUS begin length 1) 0 'RIGHT) (TEDIT.SHOWSEL stream NIL) (TEDIT.NORMALIZECARET stream) (TEDIT.SHOWSEL stream T) (TEDIT.PROMPTPRINT stream (COND ((EQUAL n 0) "No Errors.") (T (CONCAT n " words proofread."))) T]) ) (* ;; "Functions implementing the default case for various methods of the analyzer class.") (DEFINEQ (Analyzer.DefaultLoadWordList [LAMBDA (analyzer file) (* jtm%: "17-Sep-86 09:39") (* * adds a word list to the given analyzer.) (PROG (wordList) (SETQ wordList (Analyzer.ReadWordList file)) (for i in wordList do (Analyzer.AddEntry analyzer i T T)) (Analyzer.PushProp analyzer 'WordListFile file]) (Analyzer.DefaultStoreWordList [LAMBDA (analyzer file) (* jtm%: "23-Sep-86 09:08") (* * adds the current word list to the remote file.) (PROG (wordList) (SETQ wordList (Analyzer.Prop analyzer 'WordList)) [COND ((DIRECTORY file) (SETQ wordList (APPEND wordList (Analyzer.ReadWordList file] (Analyzer.WriteWordList wordList file) (Analyzer.PushProp analyzer 'WordListFile file) (Analyzer.Prop analyzer 'WordList NIL]) (Analyzer.ReadWordList [LAMBDA (file) (* ; "Edited 9-Mar-89 15:22 by jtm:") (PROG (firstWord word words stream) (SETQ stream (OPENSTREAM file 'INPUT)) (SETFILEPTR stream 0) (SETQ firstWord (READ stream)) (SETFILEPTR stream 0) (COND [(LISTP firstWord) (* old style format.) (RETURN (CDR (READFILE stream] (T (* new style format) [COND ((NULL WORDLISTRDTBL) (SETQ WORDLISTRDTBL (CREATEWORDLISTRDTBL] [while (SKIPSEPRCODES stream WORDLISTRDTBL) do (SETQ word (RSTRING stream WORDLISTRDTBL)) (COND ((EQ 0 (NCHARS word)) (BIN stream)) (T (push words word] (CLOSEF stream) (RETURN words]) (Analyzer.WriteWordList [LAMBDA (wordList file) (* jtm%: "17-Sep-86 10:11") (PROG (stream) (SETQ stream (OPENSTREAM file 'OUTPUT)) (SETFILEPTR stream 0) (for word in wordList do (printout stream word T)) (CLOSEF stream]) (CREATEWORDLISTRDTBL [LAMBDA NIL (* jtm%: "17-Sep-86 10:55") (LET (RDTBL) (SETQ RDTBL (COPYREADTABLE 'ORIG)) (for SEPR in (GETSEPR RDTBL) do (SETSYNTAX (CHARACTER SEPR) 'OTHER RDTBL)) (for BREAK in (GETBRK RDTBL) do (SETSYNTAX (CHARACTER BREAK) 'OTHER RDTBL)) (SETSYNTAX (CHARACTER (CHARCODE CR)) 'SEPR RDTBL) RDTBL]) ) (RPAQ? WORDLISTRDTBL NIL) (DEFINEQ (Analyzer.Prop [LAMBDA a (* jtm%: "13-Oct-87 11:54") (LET (p (analyzer (ARG a 1)) (prop (ARG a 2))) (SETQ p (FASSOC prop (fetch (Morphalyzer analyzerProps) of analyzer))) (COND ((ILEQ a 2) (CDR p)) [p (PROG1 (CDR p) (RPLACD p (ARG a 3)))] (T (CDAR (push (fetch (Morphalyzer analyzerProps) of analyzer) (CONS prop (ARG a 3]) (Analyzer.PushProp [LAMBDA (analyzer prop value) (* jtm%: "13-Oct-87 10:59") (* * pushes value onto a list of values stored at prop.) (LET [(prop.values (FASSOC prop (fetch (Morphalyzer analyzerProps) of analyzer] (COND [(NULL prop.values) (push (fetch (Morphalyzer analyzerProps) of analyzer) (CONS prop (LIST value] ((NOT (for i in (CDR prop.values) thereis (EQUAL i value))) (push (CDR prop.values) value))) value]) ) (DECLARE%: EVAL@COMPILE (PUTPROPS Analyzer.AlphaCharP MACRO [(CHAR) (OR (EQ (LRSH CHAR 8) 241) ([LAMBDA (UCHAR) (DECLARE (LOCALVARS UCHAR)) (OR (EQ (LRSH UCHAR 8) 241) (AND (IGEQ UCHAR (CHARCODE A)) (ILEQ UCHAR (CHARCODE Z] (LOGAND CHAR 95]) (PUTPROPS \Analyzer.TestCorruption MACRO [(analyzer word wordList userDict) (COND ((OR (Analyzer.Lookup analyzer word) (AND userDict (SimpleDict.Lookup userDict word))) (push wordList (CONCATCODES word]) (PUTPROPS Analyzer.Capitalization MACRO [(word) (* * returns NIL, ALL or FIRST) (COND ((AND (CAR word) (Analyzer.UCaseP (CAR word))) (COND ((AND (CADR word) (Analyzer.UCaseP (CADR word))) 'ALL) (T 'FIRST]) (PUTPROPS Analyzer.UCaseP MACRO [(UCHAR) (OR (AND (IGEQ UCHAR (CHARCODE 361,041)) (ILEQ UCHAR (CHARCODE 361,160))) (AND (IGEQ UCHAR (CHARCODE A)) (ILEQ UCHAR (CHARCODE Z]) ) (* ;; "Service MACROS.") (DEFINEQ (STREAM.FETCHSTRING [LAMBDA (stream start length buffer restorePtr) (* jtm%: " 3-Apr-87 11:28") (LET (pos) [COND (restorePtr (SETQ pos (GETFILEPTR stream] [COND ((OR (NULL buffer) (IGREATERP length (NCHARS buffer))) (SETQ buffer (ALLOCSTRING length] (SETFILEPTR stream start) (for i from 1 to length do (RPLCHARCODE buffer i (BIN stream))) (COND (restorePtr (SETFILEPTR stream pos))) (SUBSTRING buffer 1 length]) ) (DECLARE%: EVAL@COMPILE (PUTPROPS Stream.Init MACRO [(stream start length) (COND [(STRINGP stream) (OR start (SETQ start 0)) (OR length (SETQ length (NCHARS stream] ((NOT (LISTP stream)) (COND ((NULL start) (SETQ start 0))) [COND ((NULL length) (SETQ length (IDIFFERENCE (GETEOFPTR stream) start] (SETFILEPTR stream start]) (PUTPROPS Stream.NextChar MACRO [(stream length index) (COND ((LISTP stream) (pop stream)) ((OR (NULL stream) (ILEQ length 0)) NIL) ((STRINGP stream) (add length -1) (add index 1) (NTHCHARCODE stream index)) (T (add length -1) (BIN stream]) ) (DEFINEQ (Analyzer.CorruptWord [LAMBDA (analyzer stream start length) (* jtm%: " 5-Feb-87 11:23") (* * returns a list of possible spelling corrections for the given word.) (PROG (form word wordList caps) (SETQ word (for i from 1 to length collect (BIN stream))) (SETQ caps (Analyzer.Capitalization word)) (* * first try transpositions) (for tail temp on word while (CDR tail) do (SETQ temp (CAR tail)) (RPLACA tail (CADR tail)) (RPLACA (CDR tail) temp) (COND ((AND (EQ caps 'FIRST) (EQ tail word)) (* don't transpose the first letters  of a capitalized word.) NIL) (T (\Analyzer.TestCorruption analyzer word wordList))) (RPLACA (CDR tail) (CAR tail)) (RPLACA tail temp)) (* * next try deletions) (COND ((CDR word) (\Analyzer.TestCorruption analyzer (CDR word) wordList))) (for tail temp on word while (CDR tail) do (SETQ temp (CDR tail)) (RPLACD tail (CDDR tail)) (\Analyzer.TestCorruption analyzer word wordList) (RPLACD tail temp)) (* * prepend a character.) (SETQ word (CONS 'A word)) (SELECTQ caps (FIRST (* don't prepend a character before  a capitalized word.) NIL) (ALL (* prepend a capital letter.) (for c from (CHARCODE A) to (CHARCODE Z) do (RPLACA word c) (\Analyzer.TestCorruption analyzer word wordList))) (for c from (CHARCODE a) to (CHARCODE z) do (RPLACA word c) (\Analyzer.TestCorruption analyzer word wordList))) (SETQ word (CDR word)) (* * insert characters.) (for tail on word do (RPLACD tail (CONS 'A (CDR tail))) [COND ((EQ caps 'ALL) (for c from (CHARCODE A) to (CHARCODE Z) do (RPLACA (CDR tail) c) (\Analyzer.TestCorruption analyzer word wordList))) (T (for c from (CHARCODE a) to (CHARCODE z) do (RPLACA (CDR tail) c) (\Analyzer.TestCorruption analyzer word wordList] (RPLACD tail (CDDR tail))) (* * replace characters) (for tail temp on word do (SETQ temp (CAR tail)) [COND ((OR (EQ caps 'ALL) (AND (EQ caps 'FIRST) (EQ tail word))) (for c from (CHARCODE A) to (CHARCODE Z) do (RPLACA tail c) (COND ((EQ temp c)) (T (\Analyzer.TestCorruption analyzer word wordList] [COND ((OR (EQ caps NIL) (NOT (ALPHACHARP temp)) (AND (EQ caps 'FIRST) (NEQ tail word))) (for c from (CHARCODE a) to (CHARCODE z) do (RPLACA tail c) (COND ((EQ temp (CHARACTER c))) (T (\Analyzer.TestCorruption analyzer word wordList] (RPLACA tail temp)) (SETQ wordList (SORT wordList)) [for i on wordList do (while (STREQUAL (CAR i) (CADR i)) do (RPLACD i (CDR i] (RETURN wordList]) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS WORDLISTRDTBL) ) (* ;;; "TEDIT interface to analyzer.") (DEFINEQ (Analyzer.Establish [LAMBDA (analyzer) (* jtm%: "13-Oct-87 10:44") (AND analyzer (OR (AND (BOUNDP 'Analyzer.List) (bind (analyzerName _ (fetch (Morphalyzer analyzerName) of analyzer)) for tail on Analyzer.List when (EQUAL analyzerName (fetch (Morphalyzer analyzerName) of (CAR tail))) do (RPLACA tail analyzer) (RETURN T))) (push Analyzer.List analyzer]) (AnalyzerForStream [LAMBDA (stream) (* jtm%: " 2-Oct-85 14:00") (* * comment) (COND ((STREAMPROP stream 'analyzer)) (T (TEdit.SetAnalyzer stream]) (Analyzer.QuitFn [LAMBDA (window stream textObj) (* jtm%: "14-Jan-86 15:58") (* * ask the user if he wants to save the word list.) (PROG ((analyzer (AnalyzerForStream stream))) (COND ((AND analyzer (Analyzer.Prop analyzer 'WordList) (STREQUAL "yes" (TEDIT.GETINPUT stream "Do you want to save the word list? " "yes" ))) (TEdit.StoreWordList stream]) (Analyzer.BeforeLogout [LAMBDA NIL (* jtm%: "13-Oct-87 10:45") (for analyzer file in Analyzer.List do (COND ([AND (Analyzer.Prop analyzer 'WordList) (EQ 'Y (ASKUSER 10 'N (CONCAT "Do you want to save the word list for " (fetch (Morphalyzer analyzerName) of analyzer) "? "] (COND ([NULL (SETQ file (PROMPTFORWORD "Store word list on file:" (CAR (Analyzer.Prop analyzer 'WordListFile] (printout T "Aborted.")) (T (RESETLST (printout T (CONCAT "Storing word list on " file "...")) (Analyzer.DefaultStoreWordList analyzer file) (printout T "Deleting old version...") (RESETSAVE (TTYDISPLAYSTREAM (OPENTEXTSTREAM))) (* to swallow up the output of  DIRECTORY) (DIRECTORY file '(DELVER))) (printout T "done."]) ) (DEFINEQ (TEdit.ProofreadMenu [LAMBDA (stream) (* ; "Edited 11-Jul-88 11:02 by jop") (* ;;; "TEDIT interface to the current analyzer.") (PROG (menuWindow menu analyzer W) (* ;; "COND ((WINDOWPROP W (QUOTE DEFWINDOW)) (* so they don't interfere.) (CLOSEW (WINDOWPROP W (QUOTE DEFWINDOW))))") [SETQ W (CAR (fetch \WINDOW of (TEXTOBJ stream] (SETQ menuWindow (WINDOWPROP W 'Proofreader.Menu)) (COND ((NULL menuWindow) (SETQ menu (create MENU ITEMS _ '(("Proofread" Proofread "looks for the next spelling error starting from the caret." ) ("Correct" Correct "generates a list of possible corrections for the current selection." ) ("Insert" Insert "inserts the selected word into the analyzer's word list." ) ("CountWords" Countwords "counts the words in the current selection.")) CENTERFLG _ T MENUOUTLINESIZE _ 2 WHENSELECTEDFN _ (FUNCTION PROOFREADER.WHENSELECTEDFN))) (SETQ menuWindow (MENUWINDOW menu T)) (* ;; "WINDOWPROP menuWindow (QUOTE RESHAPEFN) (QUOTE DON'T)") (* ;; "(addmenu |menu| |menuWindow|)") (WINDOWPROP W 'Proofreader.Menu menuWindow) (CLOSEW menuWindow))) (COND ((NOT (OPENWP menuWindow)) (ATTACHWINDOW menuWindow W Proofreader.MenuEdge 'TOP 'LOCALCLOSE) (* ;; "(CAR (WINDOWPROP W (QUOTE PROMPTWINDOW)))") (* ;;  "if you attach the menuWindow to W, then it gets attached to the top-most TEdit menu.") (OPENW menuWindow))) [COND ((SETQ analyzer (AnalyzerForStream stream)) (Analyzer.Proofread analyzer stream (SUB1 (TEDIT.GETPOINT stream] (RETURN menuWindow]) (PROOFREADER.WHENSELECTEDFN [LAMBDA (ITEM MENU BUTTON) (* ; "Edited 11-Jul-88 10:58 by jop") (LET [(W (MAINWINDOW (WFROMMENU MENU] (SELECTQ (CADR ITEM) (Proofread (WITH-TEDIT W (FUNCTION TEdit.Proofread))) (Correct (WITH-TEDIT W (FUNCTION TEdit.Correct))) (Insert (WITH-TEDIT W (FUNCTION TEdit.AddEntry))) (Countwords (WITH-TEDIT W (FUNCTION TEdit.CountWords))) NIL]) (WITH-TEDIT [LAMBDA (TEXTOBJ FUNCTION) (* jtm%: "30-Mar-87 14:07") (LET (EDITOP) [COND ((WINDOWP TEXTOBJ) (SETQ TEXTOBJ (TEXTOBJ TEXTOBJ] (COND ((SETQ EDITOP (fetch EDITOPACTIVE of TEXTOBJ)) (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (COND ((EQ EDITOP T) "Edit operation") (T EDITOP)) " in progress; please wait."))) (T (RESETLST [RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ) '(AND (\TEDIT.MARKINACTIVE OLDVALUE] (replace EDITOPACTIVE of TEXTOBJ with FUNCTION) (APPLY* FUNCTION TEXTOBJ))]) (TEdit.Correct [LAMBDA (stream analyzer autoCorrect) (* jtm%: "30-Mar-87 14:09") (PROG (selection correction start length items menuWindow) [COND ((WINDOWP stream) (SETQ menuWindow (WINDOWPROP stream 'Proofreader.Menu)) (SETQ stream (TEXTSTREAM stream))) ((type? TEXTOBJ stream) (SETQ stream (TEXTSTREAM stream))) (T (SETQ menuWindow (WINDOWPROP (CAR (fetch \WINDOW of (TEXTOBJ stream))) 'Proofreader.Menu] (COND ([AND (NULL analyzer) (NULL (SETQ analyzer (AnalyzerForStream stream] (TEDIT.PROMPTPRINT stream "No analyzer selected." T) (RETURN))) (SETQ selection (TEDIT.GETSEL stream)) (SETQ start (fetch (SELECTION CH#) of selection)) (SETQ length (IDIFFERENCE (fetch (SELECTION CHLIM) of selection) start)) (TEDIT.PROMPTPRINT stream (CONCAT "Looking for corrections for %"" (STREAM.FETCHSTRING stream (SUB1 start) length) "%" . . . ") T) (SETQ items (Analyzer.Corrections analyzer stream (SUB1 start) length)) [AND autoCorrect (SETQ items (APPEND items '(*INSERT* *SKIP*] (COND (items [SELECTQ (SETQ correction (MENU (create MENU ITEMS _ items CENTERFLG _ T MENUOFFSET _ (create POSITION XCOORD _ 6 YCOORD _ 6) TITLE _ "corrections"))) (*INSERT* (TEdit.AddEntry stream analyzer)) (*SKIP* NIL) (COND (correction (TEDIT.DELETE stream) (TEDIT.INSERT stream correction] (TEDIT.PROMPTPRINT stream "" T)) (T (TEDIT.PROMPTPRINT stream (CONCAT "No corrections for the word %"" (STREAM.FETCHSTRING stream (SUB1 start) length) "%".") T))) (RETURN correction]) (TEdit.CountWords [LAMBDA (stream) (* jtm%: "30-Mar-87 14:11") (LET (selection n) [COND ((OR (WINDOWP stream) (type? TEXTOBJ stream)) (SETQ stream (TEXTSTREAM stream] (SETQ selection (TEDIT.GETSEL stream)) (TEDIT.PROMPTPRINT stream "Counting words in selection . . . " T) [SETQ n (Analyzer.CountWords (AnalyzerForStream stream) stream (SUB1 (fetch (SELECTION CH#) of selection)) (IDIFFERENCE (fetch (SELECTION CHLIM) of selection) (fetch (SELECTION CH#) of selection] [COND ((STRINGP n) (TEDIT.PROMPTPRINT stream n T)) (T (TEDIT.PROMPTPRINT stream (CONCAT n " words counted."] n]) (TEdit.AddEntry [LAMBDA (stream analyzer) (* jtm%: "30-Mar-87 14:11") (PROG (word) [COND ((OR (WINDOWP stream) (type? TEXTOBJ stream)) (SETQ stream (TEXTSTREAM stream] [COND ((NULL analyzer) (SETQ analyzer (AnalyzerForStream stream] (SETQ word (TEDIT.SEL.AS.STRING stream)) (COND [analyzer (COND ((Analyzer.AddEntry analyzer word T NIL stream) (TEDIT.PROMPTPRINT stream (CONCAT "%"" word "%"" " inserted into local word list.") T)) (T (TEDIT.PROMPTPRINT stream "Insert not implemented for this analyzer." T] (T (TEDIT.PROMPTPRINT stream "No analyzer selected." T]) (TEdit.Proofread [LAMBDA (W) (* jtm%: "16-Dec-87 13:06") (LET (sel string (stream (TEXTSTREAM W))) (SETQ sel (TEDIT.GETSEL stream)) (SETQ string (STREAM.FETCHSTRING stream (SUB1 (fetch (SELECTION CH#) of sel)) (fetch (SELECTION DCH) of sel))) (COND ((STRPOS " " string) (* just analyze the selection.) (Analyzer.Proofread (AnalyzerForStream stream) stream (SUB1 (fetch (SELECTION CH#) of sel)) (fetch (SELECTION DCH) of sel))) (T (Analyzer.Proofread (AnalyzerForStream stream) stream (SUB1 (TEDIT.GETPOINT stream]) (TEdit.SetAnalyzer [LAMBDA (stream analyzer) (* jtm%: "28-Aug-86 09:15") (* * sets the analyzer property for the window) (PROG (quitFn menuItems) [COND ((NULL analyzer) [SETQ menuItems (for i in Analyzer.List collect (LIST (Analyzer.Name i) (LIST 'QUOTE i) (if (Analyzer.Prop i 'RemoteDict) then "Calls the remote dictionary server"] [COND ((NULL menuItems)) ((EQ 1 (LENGTH menuItems)) (SETQ analyzer (CAR Analyzer.List))) (T (SETQ analyzer (MENU (create MENU ITEMS _ menuItems TITLE _ "analyzers" CENTERFLG _ T] (COND ((NULL analyzer) (SETQ analyzer (STREAMPROP stream 'analyzer)) (TEDIT.PROMPTPRINT stream (CONCAT "Proofreader is " (AND analyzer (Analyzer.Name analyzer)) ".") T) (RETURN] (TEDIT.PROMPTPRINT stream (CONCAT "Setting proofreader to " (Analyzer.Name analyzer) "...") T) (Analyzer.Open analyzer) (STREAMPROP stream 'analyzer analyzer) (SETQ quitFn (TEXTPROP stream 'QUITFN)) [COND ((OR (EQ quitFn 'Analyzer.QuitFn) (FMEMB 'Analyzer.QuitFn quitFn)) NIL) ((NULL quitFn) (TEXTPROP stream 'QUITFN 'Analyzer.QuitFn)) (T (TEXTPROP stream 'QUITFN (CONS 'Analyzer.QuitFn quitFn] (* push the function onto the list.) (TEDIT.PROMPTPRINT stream "done.")) analyzer]) (TEdit.LoadWordList [LAMBDA (stream) (* jtm%: " 9-Oct-85 10:39") (* * reads a word list from a remote file and adds it to the given analyzer.) (PROG (file (analyzer (AnalyzerForStream stream))) (COND ((NULL analyzer) (TEDIT.PROMPTPRINT stream "Please select a proofreader." T)) ((NULL (SETQ file (TEDIT.GETINPUT stream "Fetch word list on file: "))) (TEDIT.PROMPTPRINT stream "Aborted." T)) (T (TEDIT.PROMPTPRINT stream (CONCAT "Reading " file "...") T) (Analyzer.DefaultLoadWordList analyzer file) (TEDIT.PROMPTPRINT stream "done."]) (TEdit.StoreWordList [LAMBDA (stream) (* jtm%: "28-Jan-87 08:59") (* * stores the word list for the given analyzer on a remote file.) (PROG (file (analyzer (AnalyzerForStream stream))) (COND ((NULL analyzer) (TEDIT.PROMPTPRINT stream "Please select a proofreader." T)) ((NULL (Analyzer.Prop analyzer 'WordList)) (TEDIT.PROMPTPRINT stream "No words to be stored." T)) ([NULL (SETQ file (TEDIT.GETINPUT stream "Store word list on file: " (CAR (Analyzer.Prop analyzer 'WordListFile] (TEDIT.PROMPTPRINT stream "Aborted." T)) (T (RESETLST (RESETSAVE (TTYDISPLAYSTREAM (OPENTEXTSTREAM))) (* to swallow up the output of  DIRECTORY) (TEDIT.PROMPTPRINT stream (CONCAT "Storing word list on " file "...") T) (Analyzer.DefaultStoreWordList analyzer file) [COND (Proofreader.AutoDelete (TEDIT.PROMPTPRINT stream "Deleting old version..." T) (DIRECTORY file '(DELVER] (TEDIT.PROMPTPRINT stream "done."))]) (Analyzer.TEditMenuItems [LAMBDA NIL (* jtm%: "23-Oct-87 08:58") (AND (BOUNDP 'TEDIT.DEFAULT.MENU) (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU '(Proofread (FUNCTION TEdit.ProofreadMenu) "Looks for the next spelling error after the caret." (SUBITEMS (Proofread (FUNCTION TEdit.ProofreadMenu) "Looks for the next spelling error after the caret." (SUBITEMS (SetProofreader (FUNCTION TEdit.SetAnalyzer) "Gives a menu of possible proofreaders to use." ) (LoadWordList (FUNCTION TEdit.LoadWordList) "Loads a file of words into the proofreader.") (StoreWordList (FUNCTION TEdit.StoreWordList) "Stores the words added to the proofreader by the user on a remote file." ) (AutoCorrect [FUNCTION (LAMBDA (stream) (SETQ Proofreader.AutoCorrect T) (TEDIT.PROMPTPRINT stream "AutoCorrection is ON." T] "The proofreader automatically generates a menu of corrections for the user." ) (ManualCorrect [FUNCTION (LAMBDA (stream) (SETQ Proofreader.AutoCorrect) (TEDIT.PROMPTPRINT stream "AutoCorrection is OFF." T] "The user must ask for a menu of corrections from the proofreader if he wants one." ))) (Correct (FUNCTION TEdit.Correct) "generates a list of possible corrections for the current selection." ) (Insert (FUNCTION TEdit.AddEntry) "inserts the selected word into the analyzer's word list.") (CountWords (FUNCTION TEdit.CountWords) "Counts the number of words in the currect selection."]) ) (RPAQ? Analyzer.List NIL) (RPAQ? Proofreader.AutoCorrect NIL) (RPAQ? Proofreader.AutoDelete T) (RPAQ? Proofreader.MenuEdge 'LEFT) (RPAQ? Analyzer.TimeProofreader NIL) (RPAQ? Proofreader.UserFns NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS Analyzer.List Proofreader.AutoCorrect Proofreader.AutoDelete Proofreader.MenuEdge Analyzer.TimeProofreader Proofreader.UserFns) ) (Analyzer.TEditMenuItems) [COND ((NOT (FASSOC 'Analyzer.BeforeLogout BEFORELOGOUTFORMS)) (push BEFORELOGOUTFORMS '(Analyzer.BeforeLogout] (* ;;; "THE Dict CLASS") (DECLARE%: EVAL@COMPILE (DATATYPE Dict (dictName contents analyzer dictProps subDictionaries openFn closeFn getEntryFn putEntryFn mapFn printEntryFn) openFn _ (FUNCTION NILL) closeFn _ (FUNCTION NILL) getEntryFn _ (FUNCTION NILL) putEntryFn _ (FUNCTION NILL) mapFn _ (FUNCTION NILL) printEntryFn _ (FUNCTION NILL)) ) (/DECLAREDATATYPE 'Dict '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((Dict 0 POINTER) (Dict 2 POINTER) (Dict 4 POINTER) (Dict 6 POINTER) (Dict 8 POINTER) (Dict 10 POINTER) (Dict 12 POINTER) (Dict 14 POINTER) (Dict 16 POINTER) (Dict 18 POINTER) (Dict 20 POINTER)) '22) (DECLARE%: EVAL@COMPILE (PUTPROPS Dict.Open MACRO ((dict) (APPLY* (fetch (Dict openFn) of dict) dict))) (PUTPROPS Dict.Close MACRO ((dict) (APPLY* (fetch (Dict closeFn) of dict) dict))) (PUTPROPS Dict.GetEntry MACRO ((dict uniqueID prop) (APPLY* (fetch (Dict getEntryFn) of dict) dict uniqueID prop))) (PUTPROPS Dict.PutEntry MACRO ((dict uniqueID entry prop) (APPLY* (fetch putEntryFn of dict) dict uniqueID entry prop))) (PUTPROPS Dict.PrintEntry MACRO ((dict entry stream) (APPLY* [COND ((type? Dict dict) (fetch (Dict printEntryFn) of dict)) ((type? INVERTEDDICT dict) (InvertedDict.Prop dict 'PRINTENTRYFN] dict entry stream))) (PUTPROPS Dict.MapEntries MACRO ((dict MpFn prop topOnly) (* MpFn (dict uniqueId entry prop)) (APPLY* (fetch (Dict mapFn) of dict) dict MpFn prop topOnly))) ) (* ;;; "utility functions") (DEFINEQ (DictFromName [LAMBDA (dictName remoteName) (* ; "Edited 6-Oct-88 09:42 by jtm:") (PROG (dict COLONPOS) [COND ((NULL dictName) (SETQ dict (CAR Dict.DictionaryList))) [(for i in Dict.DictionaryList do (COND ([AND (EQ dictName (fetch (Dict dictName) of i)) (EQ remoteName (Dict.Prop i 'RemoteDict] (SETQ dict i) (RETURN T] [(for i in InvertedDict.List do (COND ([AND (EQ dictName (fetch (INVERTEDDICT INVERTEDDICTNAME ) of i)) (EQ remoteName (InvertedDict.Prop i 'RemoteDict)) (SETQ dict (InvertedDict.Prop i 'DICTIONARY] (RETURN T] ((SETQ COLONPOS (STRPOS ":" dictName)) (SETQ dict (DictFromName (SUBATOM dictName 1 (SUB1 COLONPOS)) (SUBATOM dictName (IPLUS COLONPOS 2) -1] (RETURN dict]) (Dict.Establish [LAMBDA (dict) (* jtm%: "13-Oct-87 10:45") (OR (AND (BOUNDP 'Dict.DictionaryList) (bind (dictName _ (fetch (Dict dictName) of dict)) for tail on Dict.DictionaryList when (EQUAL dictName (fetch (Dict dictName) of (CAR tail))) do (RPLACA tail dict) (RETURN T))) (push Dict.DictionaryList dict]) (Dict.Prop [LAMBDA a (* jtm%: "13-Oct-87 11:54") (LET (p (dict (ARG a 1)) (prop (ARG a 2))) (SETQ p (FASSOC prop (fetch (Dict dictProps) of dict))) (COND ((ILEQ a 2) (CDR p)) [p (PROG1 (CDR p) (RPLACD p (ARG a 3)))] (T (CDAR (push (fetch (Dict dictProps) of dict) (CONS prop (ARG a 3]) (Dict.Name [LAMBDA (dict) (* jtm%: "13-Oct-87 10:45") (COND [(Dict.Prop dict 'RemoteDict) (MKATOM (CONCAT (fetch (Dict dictName) of dict) ": " (Dict.Prop dict 'RemoteDict] (T (fetch (Dict dictName) of dict]) ) (RPAQ? Dict.DictionaryList NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS Dict.DictionaryList) ) (* ;;; "a simple dictionary.") (DEFINEQ (SimpleDict.New [LAMBDA (name) (* jtm%: "13-Oct-87 10:40") (create Dict dictName _ name getEntryFn _ (FUNCTION SimpleDict.Lookup) putEntryFn _ (FUNCTION SimpleDict.PutEntry) mapFn _ (FUNCTION SimpleDict.MapEntries) contents _ (create SimpleDict.Node]) (SimpleDict.PutEntry [LAMBDA (dict entry value) (* jtm%: " 5-Feb-87 11:29") (* * adds the value to dict under entry.) (LET (subNode (node (fetch (Dict contents) of dict))) [COND ((LITATOM entry) (SETQ entry (MKSTRING entry] (COND ((STRINGP entry) (for i char from 1 to (NCHARS entry) do (SETQ char (NTHCHAR entry i)) (COND ([NOT (SETQ subNode (FASSOC char (fetch (SimpleDict.Node subnodes) of node] (SETQ subNode (create SimpleDict.Node char _ char)) (push (fetch (SimpleDict.Node subnodes) of node) subNode))) (SETQ node subNode)) (replace (SimpleDict.Node value) of node with value)) ((LISTP entry) (for char in entry do (COND ([NOT (SETQ subNode (FASSOC char (fetch ( SimpleDict.Node subnodes) of node] (SETQ subNode (create SimpleDict.Node char _ char)) (push (fetch (SimpleDict.Node subnodes) of node) subNode))) (SETQ node subNode)) (replace (SimpleDict.Node value) of node with value))) value]) (SimpleDict.Lookup [LAMBDA (dict entry length) (* jtm%: " 7-Apr-87 08:28") (* * looks up entry in the dictionary) (PROG ((node (fetch (Dict contents) of dict))) (COND [(OR (STRINGP entry) (LITATOM entry)) [for i from 1 to (OR length (NCHARS entry)) do (COND ([NOT (SETQ node (FASSOC (NTHCHAR entry i) (fetch (SimpleDict.Node subnodes) of node] (RETURN] (AND node (RETURN (fetch (SimpleDict.Node value) of node] ((LISTP entry) [for i in entry do (COND [(AND (NUMBERP i) (IGREATERP i 9)) (* a character code.) (COND ([NOT (SETQ node (FASSOC (CHARACTER i) (fetch ( SimpleDict.Node subnodes) of node] (RETURN] ([NOT (SETQ node (FASSOC i (fetch ( SimpleDict.Node subnodes) of node] (RETURN] (AND node (RETURN (fetch (SimpleDict.Node value) of node]) (SimpleDict.MapEntries [LAMBDA (dict fn node path) (* jtm%: "11-Apr-86 15:45") (* * maps all of the entries in the dictionary in arbitrary order.) [COND ((NULL node) (SETQ node (fetch (Dict contents) of dict] [COND ((fetch (SimpleDict.Node value) of node) (APPLY* fn dict path (fetch (SimpleDict.Node value) of node] (for i in (fetch (SimpleDict.Node subnodes) of node) do (SimpleDict.MapEntries dict fn i (APPEND path (LIST (fetch (SimpleDict.Node char) of i]) (SimpleDict.PrintEntries [LAMBDA (dict stream noValues) (* jtm%: "31-Mar-87 07:37") [Dict.MapEntries dict (FUNCTION (LAMBDA (dict entry value) (COND (noValues (printout stream (CONCATLIST entry) T)) (T (printout stream (CONCATLIST entry) %, value T] dict]) (SimpleDict.Test [LAMBDA NIL (* jtm%: "11-Apr-86 15:49") (* * tests the SimpleDict implementation.) (LET [(dict (SimpleDict.New 'test] (for i in '(asdf asd asdfg asde bfdas) do (Dict.PutEntry dict i i)) [Dict.MapEntries dict (FUNCTION (LAMBDA (dict entry value) (printout T entry %, value T] dict]) ) (DECLARE%: EVAL@COMPILE (RECORD SimpleDict.Node (char value . subnodes)) ) (* ;;; "the INVERTEDDICT class") (DECLARE%: EVAL@COMPILE (TYPERECORD INVERTEDDICT (INVERTEDDICTNAME HEADERINDEX KEYINDEX INDEXFILE FILEDIR FILENAME FILEEXT FILEARRAY INVERTEDDICTPROPS)) ) (DEFINEQ (InvertedDictFromName [LAMBDA (dictName remoteName) (* ; "Edited 6-Oct-88 09:57 by jtm:") (PROG (dict COLONPOS) [COND ((NULL dictName) (SETQ dict (CAR InvertedDict.List))) [(for i in InvertedDict.List do (COND ([AND (EQ dictName (fetch (INVERTEDDICT INVERTEDDICTNAME ) of i)) (EQ remoteName (InvertedDict.Prop i 'RemoteDict] (SETQ dict i) (RETURN T] ((SETQ COLONPOS (STRPOS ":" dictName)) (SETQ dict (InvertedDictFromName (SUBATOM dictName 1 (SUB1 COLONPOS)) (SUBATOM dictName (IPLUS COLONPOS 2) -1] (RETURN dict]) (InvertedDict.Establish [LAMBDA (dict) (* jtm%: "13-Oct-87 10:32") (OR (bind (name _ (fetch (INVERTEDDICT INVERTEDDICTNAME) of dict)) for tail on InvertedDict.List when (EQUAL name (fetch (INVERTEDDICT INVERTEDDICTNAME) of (CAR tail))) do (RPLACA tail dict) (RETURN T)) (push InvertedDict.List dict]) (InvertedDict.Prop [LAMBDA a (* jtm%: "13-Oct-87 11:54") (LET (p (dict (ARG a 1)) (prop (ARG a 2))) (SETQ p (FASSOC prop (fetch (INVERTEDDICT INVERTEDDICTPROPS) of dict))) (COND ((ILEQ a 2) (CDR p)) [p (PROG1 (CDR p) (RPLACD p (ARG a 3)))] (T (CDAR (push (fetch (INVERTEDDICT INVERTEDDICTPROPS) of dict) (CONS prop (ARG a 3]) (InvertedDict.Name [LAMBDA (dict) (* jtm%: "13-Oct-87 10:33") (COND [(InvertedDict.Prop dict 'RemoteDict) (MKATOM (CONCAT (fetch (INVERTEDDICT INVERTEDDICTNAME) of dict) ": " (InvertedDict.Prop dict 'RemoteDict] (T (fetch (INVERTEDDICT INVERTEDDICTNAME) of dict]) (InvertedDict.Open [LAMBDA (invertedDict) (* jtm%: " 7-Apr-87 09:01") (LET [(OPENFN (InvertedDict.Prop invertedDict 'OPENFN] (AND OPENFN (APPLY* OPENFN invertedDict]) ) (RPAQ? InvertedDict.List NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS InvertedDict.List) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA InvertedDict.Prop Dict.Prop Analyzer.Prop) ) (PUTPROPS ANALYZER COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (10141 33876 (AnalyzerFromName 10151 . 11522) (Analyzer.CountWords 11524 . 12266) ( Analyzer.DefaultCorrections 12268 . 19753) (Analyzer.DefaultNextWord 19755 . 21975) (Analyzer.Name 21977 . 22384) (Analyzer.DefaultAddEntry 22386 . 22896) (Analyzer.DefaultAnalyze 22898 . 28734) ( Analyzer.DefaultProofread 28736 . 33874)) (33977 36948 (Analyzer.DefaultLoadWordList 33987 . 34397) ( Analyzer.DefaultStoreWordList 34399 . 34975) (Analyzer.ReadWordList 34977 . 36038) ( Analyzer.WriteWordList 36040 . 36361) (CREATEWORDLISTRDTBL 36363 . 36946)) (36980 38146 (Analyzer.Prop 36990 . 37522) (Analyzer.PushProp 37524 . 38144)) (40472 41057 (STREAM.FETCHSTRING 40482 . 41055)) ( 42763 48941 (Analyzer.CorruptWord 42773 . 48939)) (49054 52044 (Analyzer.Establish 49064 . 49864) ( AnalyzerForStream 49866 . 50101) (Analyzer.QuitFn 50103 . 50618) (Analyzer.BeforeLogout 50620 . 52042) ) (52045 69400 (TEdit.ProofreadMenu 52055 . 54471) (PROOFREADER.WHENSELECTEDFN 54473 . 54976) ( WITH-TEDIT 54978 . 55882) (TEdit.Correct 55884 . 58740) (TEdit.CountWords 58742 . 59650) ( TEdit.AddEntry 59652 . 60583) (TEdit.Proofread 60585 . 61433) (TEdit.SetAnalyzer 61435 . 63680) ( TEdit.LoadWordList 63682 . 64427) (TEdit.StoreWordList 64429 . 65858) (Analyzer.TEditMenuItems 65860 . 69398)) (72647 76175 (DictFromName 72657 . 74663) (Dict.Establish 74665 . 75318) (Dict.Prop 75320 . 75814) (Dict.Name 75816 . 76173)) (76323 82812 (SimpleDict.New 76333 . 76705) (SimpleDict.PutEntry 76707 . 78907) (SimpleDict.Lookup 78909 . 81109) (SimpleDict.MapEntries 81111 . 81815) ( SimpleDict.PrintEntries 81817 . 82348) (SimpleDict.Test 82350 . 82810)) (83131 86330 ( InvertedDictFromName 83141 . 84639) (InvertedDict.Establish 84641 . 85146) (InvertedDict.Prop 85148 . 85682) (InvertedDict.Name 85684 . 86097) (InvertedDict.Open 86099 . 86328))))) STOP \ No newline at end of file diff --git a/lispusers/ANALYZER.TEDIT b/lispusers/ANALYZER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b30e528bdefc8b6497b59154c61e0b5b2b9ecf01 GIT binary patch literal 2279 zcmeHHO>f#j5M9W3Qy*HjQjeqbP+LL>T!)aJ>c9f47@MxwX_A|hED0)t2$RpBkUvzZ z_eweTCv|pB0F@?HqN=B^usu67Z|3>U8rl1L{=J{9xW4P{?Ne^phT#}S(J*@nQGrqi#-7c6TBYzry+?9j=rDZT*@Sqx11PgpaoJhFC!)bi@B|etWN#HDz zM{sZjLyWfu{eF8O<0Cl$Gm+@vK~Uq=tx|5~0oV|ZWV_Ro3B+*NjgtiWZHPy#lAPLI zoOBLPbhXo|YS`%DYzY0H#4=tyl!M#^2NxZDfdh%f&tY1>*vWER>BmU6f}=Hx#D0;lTS6*yS=ltTf+j;5k7xQ@KVPv8PBxzK;RrLTuTA z4ab3Xdm1a~uFya|LQL5#fwNwMQlXHRw-7m=u}=D{qtfT)>GD4ywjyqqZE)~V*-uu> zLB%FY|5r;LwENH2qt&u3{co~B7Kp8^%q>~MM|N%=?aXaPNAJ7kQ~(h#@G+mAyDv@q zbL58HWXfdm5xELDpG77QtcHpq2fcn_y{f*O(f3GJr#{9sd*(h*mdR_fRPo#}WEJu< zO~{fzI^T>lUy;T1AB;R3m!I)r#Tg%FPkhgRQ%?yuSy>zyilZD#cReR{(+1X0jd5rh zJu7%=`Ek4&oyDZp29G?NuTxR;GgAyE>_?^2DP(oae+yJEp}DJrskkf0Llh?Jjkw1s00PP#_}ndbsIGWt$8{gRh^I@cxj<@M5UyCN#-3{yZ-hQ`8ukI literal 0 HcmV?d00001 diff --git a/lispusers/AUTOSAMEDIR b/lispusers/AUTOSAMEDIR new file mode 100644 index 00000000..4c092ed6 --- /dev/null +++ b/lispusers/AUTOSAMEDIR @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "17-Sep-87 19:37:29" {PHYLUM}LYRIC>AUTOSAMEDIR.;2 1551 changes to%: (VARS AUTOSAMEDIRCOMS) (FNS AUTOSAMEDIR) previous date%: "15-Dec-85 13:02:11" {PHYLUM}LYRIC>AUTOSAMEDIR.;1) (* " Copyright (c) 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT AUTOSAMEDIRCOMS) (RPAQQ AUTOSAMEDIRCOMS ((* ; "extension to SAMEDIR") (FILES (SYSLOAD FROM LISPUSERS) SAMEDIR) (INITVARS (AUTOSAMEDIRFLG)) (FNS AUTOSAMEDIR) (P (EDITV MAKEFILEFORMS F CHECKSAMEDIR (IF (NEQ (QUOTE AUTOSAMEDIR) (%## 0 2 1)) ((MBD (OR (AUTOSAMEDIR FILE) &))) NIL)) (UNMARKASCHANGED (QUOTE MAKEFILEFORMS) T))) ) (* ; "extension to SAMEDIR") (FILESLOAD (SYSLOAD FROM LISPUSERS) SAMEDIR) (RPAQ? AUTOSAMEDIRFLG ) (DEFINEQ (AUTOSAMEDIR (LAMBDA (FILE) (* ; "Edited 17-Sep-87 19:33 by Rao") (LET (LOADEDFILE DIR) (* ;; "Ramana Rao - ensure that the getprop uses a symbol in the IL package.") (AND AUTOSAMEDIRFLG (SETQ LOADEDFILE (CDAR (GETPROP (CL:INTERN (CL:SYMBOL-NAME FILE) "IL") (QUOTE FILEDATES)))) (NEQ (DIRECTORYNAME T T) (SETQ DIR (PACKFILENAME (QUOTE HOST) (FILENAMEFIELD LOADEDFILE (QUOTE HOST)) (QUOTE DIRECTORY) (FILENAMEFIELD LOADEDFILE (QUOTE DIRECTORY))))) (/CNDIR DIR)))) ) ) (EDITV MAKEFILEFORMS F CHECKSAMEDIR (IF (NEQ (QUOTE AUTOSAMEDIR) (%## 0 2 1)) ((MBD (OR (AUTOSAMEDIR FILE) &))) NIL)) (UNMARKASCHANGED (QUOTE MAKEFILEFORMS) T) (PUTPROPS AUTOSAMEDIR COPYRIGHT ("Xerox Corporation" 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (828 1308 (AUTOSAMEDIR 838 . 1306))))) STOP \ No newline at end of file diff --git a/lispusers/AUTOSAMEDIR.TEDIT b/lispusers/AUTOSAMEDIR.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b1e14c9f2173927b362736b586bade50943db7a3 GIT binary patch literal 3432 zcmeHI&2HO95T<0uN$ave+XU!wkX|If6(mQo9p7kaDKAWs3V#y2H(FXtgej6BDckBJ zvLP(Rn@Ml zc2u=0#3KrimWMD5^6^ZBAs8@>Cn8k4`>%jarX;dsf1>KCKM$hm%%AVTP=j`7zui&2 zOk{_!O3^ZU)==f9Yg>J<=W@$b-C2-9;*T%=sQ}#i5r~^yL|G6=kjIeEMClDiaGv_< z^42^fwVy+90Tsx)F`z(E9DQ$cgP@!+of{0U14QaC@_6p&!PpPOC1lrBRGDWIq+*=M zm?6kBxClZ4emY&uMU=y}pFx}k(;$+LbAKYpEr_yQ_!EdPaC;SBV*Pg@PXa%Trwh>n zXz&~s$cEGtpuXlZ2a+^SM4B%t1QknZTTRuB5hLc0CZLTkqxd=$NHsw@1h_*QA)AOR z5n`MPT+awL1;R>aaVmimsq-X^mqJh)ElI)vZP^WF24{&i%(ETf(YOT-EfF`(9q9S< z^EAMm#2~_V*CCPg=(4C|9M2O!TEYcpBGR%&lEfI3aQj(?+#!(*q@6bC+K?M(Ftqy2HoI(9nJOb727oSK1WXf`;8HKG|RPVX5X9J@gGpEo36%q}x~4zndKM4RKD zAza)wkuQ6wAv+bqkdn@R7hdhb?!f`RnuTTKm}z~au^?)7aL*{cXPT%W5&9l$dj6fZ!poQVM_!+r`9L$*G<|C6f8_i8cU#(Q z%B%Q^vZd_MuJ%#+l3w)JZu{8w4AvSjS2t^ans^nVn3cLhk^Wgn;!0vKNUP%*KMY|_rDUv literal 0 HcmV?d00001 diff --git a/lispusers/AUXMENU b/lispusers/AUXMENU new file mode 100644 index 00000000..c9ad1950 --- /dev/null +++ b/lispusers/AUXMENU @@ -0,0 +1 @@ +(FILECREATED "15-Apr-86 12:18:47" {DANTE}LISP>AUXMENU.;19 6842 changes to: (VARS AUXMENUCOMS DefaultMiddleButtonBackgroundMenuCommands) (FNS BackgroundButtonFN CreateMiddleButtonBackgroundMenu Auxmenu.Other.Directory) previous date: "14-Apr-86 11:40:55" {DANTE}LISP>AUXMENU.;18) (PRETTYCOMPRINT AUXMENUCOMS) (RPAQQ AUXMENUCOMS [(* * This file sets up the Middle button background menu. It could very easily set up a Left button background menu also. The variable DefaultMiddleButtonBackgroundMenuCommands contains a set of default commands for the middle button background menu. The variable MiddleButtonBackgroundMenuCommands is the actual list of commands that is used to create the menu. The menu is contained in the global variable MiddleButtonBackgroundMenu. The function CreateMiddleButtonBackgroundMenu accepts a list of commands and returns a menu.) (VARS DefaultMiddleButtonBackgroundMenuCommands) (GLOBALVARS MiddleButtonBackgroundMenuCommands MiddleButtonBackgroundMenu) (FNS BackgroundButtonFN CreateMiddleButtonBackgroundMenu Auxmenu.Other.Directory) (INITVARS (MiddleButtonBackgroundMenuCommands DefaultMiddleButtonBackgroundMenuCommands) (MiddleButtonBackgroundMenu NIL)) (P (SETQ BACKGROUNDBUTTONEVENTFN (QUOTE BackgroundButtonFN]) (* * This file sets up the Middle button background menu. It could very easily set up a Left button background menu also. The variable DefaultMiddleButtonBackgroundMenuCommands contains a set of default commands for the middle button background menu. The variable MiddleButtonBackgroundMenuCommands is the actual list of commands that is used to create the menu. The menu is contained in the global variable MiddleButtonBackgroundMenu. The function CreateMiddleButtonBackgroundMenu accepts a list of commands and returns a menu.) (RPAQQ DefaultMiddleButtonBackgroundMenuCommands ((Greet (GREET) " Do a (GREET)") (Login (LOGIN) " Do a (LOGIN)") (Logout (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) [PROMPTPRINT (CONCAT " Logging out at " (MKSTRING (DATE] (TERPRI PROMPTWINDOW) (LOGOUT)) " Do a (LOGOUT) " (SUBITEMS (Fast (LOGOUT T) " Do (LOGOUT T) ") (Safe (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) [PROMPTPRINT (CONCAT " Logging out at " (MKSTRING (DATE] (TERPRI PROMPTWINDOW) (LOGOUT (QUOTE ?))) " Do (LOGOUT '?) "))) (Reclaim (RPT 5 (QUOTE (RECLAIM))) " Perform a garbage collection. ") (Cleanup (CLEANUP) " Do a (CLEANUP)") (Connect (DIRECTORYNAME T) " Show the current connected directory. " (SUBITEMS ({DSK} (/CNDIR (QUOTE {DSK})) " Connect to the local DSK.") (Default (/CNDIR LOGINHOST/DIR) " Connect to LOGINHOST/DIR. ") (Other (Auxmenu.Other.Directory) " Prompt for the directory to connect to. "))) (Closeall (CLOSEALL) " Close all open files.") (Open% Files (OPENP) " List Open Files") (VMem% Size (VMEMSIZE) " Find the current size of the Virtual Memory.") (Free% Pages (DISKFREEPAGES) " List the number of free pages on the local file volume.") (Disk% Partition (DISKPARTITION) " Display the name of the current partition.") (Volume% Display (DSKDISPLAY (QUOTE ON)) " Open the local disk descriptor window. ") (Default% Printers DEFAULTPRINTINGHOST " List the default printers. ") (File% Changes (FILEPKGCHANGES) " List the changes made to the loaded files. ") (Loaded% Files FILELST " List the loaded files. ") (Lafite%(ON%) (LAFITE (QUOTE ON)) " Turn Lafite On "))) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS MiddleButtonBackgroundMenuCommands MiddleButtonBackgroundMenu) ) (DEFINEQ (BackgroundButtonFN [LAMBDA NIL (* Marshall "14-Apr-86 11:40") (* * This function actually calls the middle-button background menu. It is the value of the variable  BACKGROUNDBUTTONEVENTFN) (RESETLST (RESETSAVE (TTYDISPLAYSTREAM PROMPTWINDOW)) (PROG (Result) [COND ((OR (NOT (BOUNDP (QUOTE MiddleButtonBackgroundMenu))) (NULL MiddleButtonBackgroundMenu)) (* If the menu is NIL, reset it) (SETQ MiddleButtonBackgroundMenu (CreateMiddleButtonBackgroundMenu MiddleButtonBackgroundMenuCommands] (COND ((AND (MOUSESTATE MIDDLE) (SETQ Result (MENU MiddleButtonBackgroundMenu))) (* If there is a result, print it to the PROMPTWINDOW) (TERPRI PROMPTWINDOW) (PRIN1 (CONCAT " " Result) PROMPTWINDOW) (TERPRI PROMPTWINDOW]) (CreateMiddleButtonBackgroundMenu [LAMBDA (CommandList) (* edited: "28-Mar-85 15:34") (* * Create the middle-button background menu.) (create MENU ITEMS _ CommandList MENUCOLUMNS _ 1 CENTERFLG _ T WHENSELECTEDFN _(QUOTE DEFAULTWHENSELECTEDFN]) (Auxmenu.Other.Directory [LAMBDA NIL (* edited: "28-Mar-85 15:42") (* * This function destructively modifies the MiddleButtonBackgroundMenuCommands variable to include the new  directories typed in after "Other" is selected in the "Connect" submenu so that the user can connect to that  directory via the menu later.) (PROG ((Directory (PROMPTFORWORD " Enter the name of the directory to connect to: " NIL NIL PROMPTWINDOW))) [RPLACD (CDDR (CADDDR (ASSOC (QUOTE Connect) MiddleButtonBackgroundMenuCommands))) (CONS (LIST (MKATOM Directory) (LIST (QUOTE /CNDIR) Directory) (CONCAT " Connect to " (MKSTRING Directory))) (COPY (CDDDR (CADDDR (ASSOC (QUOTE Connect) MiddleButtonBackgroundMenuCommands] (* Destructuve modification) (SETQ MiddleButtonBackgroundMenu (CreateMiddleButtonBackgroundMenu MiddleButtonBackgroundMenuCommands)) (* reset menu variables) (RETURN (/CNDIR Directory)) (* connect to the directory) ]) ) (RPAQ? MiddleButtonBackgroundMenuCommands DefaultMiddleButtonBackgroundMenuCommands) (RPAQ? MiddleButtonBackgroundMenu NIL) (SETQ BACKGROUNDBUTTONEVENTFN (QUOTE BackgroundButtonFN)) (PUTPROPS AUXMENU COPYRIGHT (NONE)) (DECLARE: DONTCOPY (FILEMAP (NIL (3785 6592 (BackgroundButtonFN 3795 . 4886) (CreateMiddleButtonBackgroundMenu 4888 . 5235) (Auxmenu.Other.Directory 5237 . 6590))))) STOP \ No newline at end of file diff --git a/lispusers/AUXMENU.TEDIT b/lispusers/AUXMENU.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..88155fd2b3456cf293bdb241e14353656f7e280d GIT binary patch literal 5285 zcmeHK+iv656{S5+nq(@Vmpt@w11UNbFr(P6$Kx~)2`y1FVTx2K%C#Hxfg+D=VklDK z#U2Of59Gbi{f~Y@KC5e=L)x^)nn{47Pa|L~a-V%!`?ike-1OY@PmSu$Sfo{FztcJB zboM$OV|G3^of$tuaD4k0qCs#SN92f`Wss7tzI&^n24U z0RZvoxi=Y&&u#BT95ijOdS!OBCp>&yNRT|L}n0n-2!3{rB z5S9fc@oV-VD333%$_-X3gm@Ddu!vI%(p$39QsfE1P;pyiRmt*YR+N;BVkO|3LkSfr zPQ#>%fG*6I%PdW92^mB!7mF$l%Q#C56)6|rS8*;V%_zt(E1*T(GNZX*!$p%9TwS3 zl&_?0K|CB3mtt9vjxusPieM>dk>yMD7L^P0c#ewIhxfJj#6sjE4F!#ZvUaDn-{9+&6uh(pCyRwWS+ z8v}xK$Fh55B*~pQ)(q1br*RnvN&EvEGryG)o0SZ(CfEq9R~AGfQr4*mMNtI#EiAD+ zSU*fWE3HJ%oxbnyD$kay@+MBB?B+SP4Jq=5iUJeMRp$MZE6g(^J>=|CR)RI#_7pE_ zENPa$NMr0y-DcvZki}!yv9n9e)(gcB(rXQh8AZ3zyhIu2BpEqK_(T%b&wOh=w+ z`rRG}V3KI7MVaI)_U_JDr=JK6@#=w68%EzY4QDpl1jG|z62!{~=HiVAE9OProA~sS z^uNwr-^82Qw+(CD?aHuOAp*3w4K7R|MDh@aRgM)a!CKi$q_l`ZH{9?VTAW^z-nZSU zY1lU0xvVslN^OU{>uPBp^@lNgt8-N$eY+FWnJ~^Q#RxsD;ffo-?lx44n1=`~8kQMG z?h*frpo?m*mlxL)LHiQ9Qp9z^ zQ(FVNV-C)~Sx=G!cj8X{F9()adv&3a-}_WEu3XAR#|mLq?=w!ppwGb(uhA`eMRJ5k z(oqWr9+5j+!{Y7gbmxN7>&1UP6g}80wRexFPYhvV#$T)agnUP!d+c-o4ngA z3c@Ox2r;E+V{<&U{%)e(L+lkz*hoglZCEYmAT)$o@R9V#H$o(?V_X1(>8Ye83GZ<( z=#f6Krl&*f@3TM^Eg%45XcJD5f`rkDlb8OAg}g-x5~n$ zZ^}_mJK#1(8%ME0u4bZ!cF%etmQgMQ=P)rm-|{WjL8Z>J1iujo*j5QH5`e05`BMVT zP)AXHq$m}`E4fTRbM4vKgu97tT+lP=tRcsVq*UBZaCf_s#oz(0@410FG-kFx@hr!; zoDq-eqn+(A5l~-VP3#K4-s*L|&r2U#wmCT+^-l~(Hs!Gbbu|7w(QONnbe-GB_Y&c0 zVtPC>WQ!8l3JqP`axG`*l5Tj$vDNR=)aPnBBewd2_PV6+(k>nD?bEBT_VK1mo5r7K z*sgmzWv(;^)Hfa9^vpq*fX}N>rZW!O_bia=E?Lf*HMNdylicBurlxK7{RtrW@_pig zar?eGP^XM^Z<&!NA@|JmY|E(~_?~rY;!2PPGY1-XXXg3DaHeQGdFE(l z8y-z<@Z;Uv-%M+C;^PO^z?zL2nCUf?1%yD=Oa1Ps}1A29EKri>(w!V4pOGDW;sC;!u z2QLrlaCcX^@51sIwH5jw+W4W3q<`2(YF6`qxQ*Seq}-3RkF`C1+WJZRExvZ1>}c9H zUblYQk_wOg(OC$Cr}*00hQWqUqbD72KiQzAX}b2K_T$zOps>I9>#?JE#T~E$@W~G+ z)XL^5lTb}=+S3-ZDeVV;ceGEm&$W*gi)){$GZg1%$)J6&_v_8J5A?VK>hn8ohyUlG z{h<+P-)MV!eK8MR+&+7xj||*exNpFf>hTCqxX;FxW7u?r9@n62C)={bAMx9-@K1J_ zLw>>%Rd=PbjkBjG-pn?8Bhw!`TdiE$E~SUYkp2FD4SDn=b~S_B8h^hF!hIj=>>I=P zVc%%T$;$dX-j@AY4y5M3>u$8X~w12J({`FqLcwOVIu-2N! LXWwb&5C8cu)wE7( literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUND-DurerCats.BITMAP b/lispusers/BACKGROUND-DurerCats.BITMAP new file mode 100644 index 00000000..26cbb85a --- /dev/null +++ b/lispusers/BACKGROUND-DurerCats.BITMAP @@ -0,0 +1 @@ +{(READBITMAP)(981 642 "AABBIDEAAEIJJDHCBBDHHBEAEBJ@JHDJFDIBBJBBDBBECDABH@BDHBDJBICBBEBIDB@@BEEDMDHHDDF@BAABE@D@BDHJCIEE@EEJMFBEBJEDJNLDIAEDEBJEDJJJIEBJEAEDDIAKJIEBJEBCEJME@EEDNBHIB@A@EBDDB@CAA@HIEIEEB@@BADJEBBFDJBIB@IB@@JDAFEBBABBBJBDICBI@JHBJEDEB@HIBBF@IBJLMDDEADJBDD@@@" "FGEEBEDJFBBB@IEDDLIEFMDFBEAEIEI@HMBLLBMEAEDIDIDJEEDJEEIDIBDEDJEBEDKKIBDIAABEIJHNLJJJJEIGEEEEDNEAGJJMJINJIFJMEJKKFJJKJMFJIEMMDJKEJNJJKFNJMEJKDJKLJMJJODECIEEEEGDMBJJJIKHJLMBDDDIBDNNIEBEBIEABDIDMEBIEEBIDIDIEDEEJAIJEHHDMDMDEBCAEKEDIIAEDHBBBCBIEBEEGC@@@" "HHBDDIADHHJHKCBJIABDI@JHHJDDBBBGB@EAADABFDIBBBKDHIBIEDCAFDIDBHJDICDDEDJBFGEJBAEAABDDDJBHJHJJKIJFHBJJKGELFHEEEDODHJJDEBIEBJJJJEDJEABJHIGIEEE@KAMGFJJJ@KBLNJJHJHJBIAABDDEDBBMGCBBIEAAFDIBHJADICDFAEDJDHIFJBBDICBDADDE@BGBBBAABHHJHDIBDDJJFFHJHHIDDIAB@HH@@" "EEDIIBFBEGDEHDDABDEABGBECDJIDIDHDJJDJEJDHJBEEEDACBEBDILEAABIDEDIBDBIBBHJHHDAEJDJDDIII@IBIEIBEBBICDIEELOIIEJIEMJMCEDKEEFJMEEEEJKEEFIEFEJMMDJMDLOIMEDIFDJBEBDMDJDHDLLIABIBMDA@HJHJBDJABDIEADJDDEALIBEBFDAEEEBBHIBMBIBJI@IDIDJIFEBGBDEABDAA@MAGEBCBDLIEE@@@" "ABIBBDHHI@BHBIBNDJJFDHDHDADJEDIJI@HJDHBIEDLJDDAFDDHDJBABDFIBEDABEADJLMCBEFIDDABIJMDBBEBEB@BDMEDDDEBJDEABEJEDIBEBDHJDJJIEBFJKBEDJJIBHIBEBDIEBMBDEABJEAAAEEIB@BEBEBBAEJLJDAADKEBFEIJIDEBDAEBDKABDBBI@IACDAABIIEDJ@IBHHDJLIEBIDA@I@ICBJICJDJ@J@DHHIBBDJD@@@" "JDDIDMECBEICEBE@IHHHMBIBJJA@HIBABGBIIBJEAAADIIJHJICEDMJLIHDDHIFMDJIIA@HEBHJKJJDDA@IEDJMDIGJJJLKBJLMBIJNFJJIEGMJMMCEKEEFJMIEDMJKEEFMFEMJMOEDJJKCJLJEIJJFIJJJODIEJIEDHDAABJNJHJE@HDDLJIEKDHIA@LIJMIEFDJHJLLIDDDEBJDLJGBDBDHHDBJJDJEHHHLHEBEFDMBFEEIDIABH@@" "BIABEABDDJBDDDHEBCBEBECDIDJEECDJDHDDBDIBJFKABBBBIBD@IBBABBIICBH@IBJBDJC@ICA@ADIIDEBDIH@IBHDJMCDHIABDJE@IEMGDJBEBADJDEBHGBFHKBG@JEABIDBEBBIGEMDHEBIBDDHIFEJI@JDH@LIBEADLID@DFDHFBIBBJDH@JFDLJBDBBDHABDJBBBDFKBJDIBAA@IBIFEEBIDIFEBEBFBE@IAABBIABDEBDDJ@@@" "DBEDHJDJIHHIIICADHEIDJDABABIBHBDIBIIDJDDBHHFEEDJDDJKBDLJEDJBHDBMBD@LJDLKBDFEKABBJJDIBCEEEBJIIDICBFHKBHKJJLJJMLIDJEEAEEEJLHG@IJMEEDEEBIDIMJJIJJNHJFHKBFDIDLJJEEEFBDIBJJBDFMCABFIIBIHABEJA@JBIEBIIBFJIABIEEC@HJAABIDLJDIB@JDJDBDABIDM@IDFDLLHHLJIBHIEBA@@@" "AEJBBDIDJCCBBBDFAEDBBDIBDJDBDEDIBBBBE@IJLEC@IAADIED@DIADIAABBIE@FIKABIBDEBHJDBDH@HIBDHDJ@BJKKCBDDHEDDG@EGKNIBAJIDHHFJKBEEGHOEEBFJK@HIDJLBDKNOE@GAAE@IABFFNJJ@BI@IBDHH@IBABHJEABDJDFLK@EDJBDDDIDDI@AEDIDDDHFEAJLHEBBBBDIEABABIBDIBBAEDCABBBFFBIDIBBBMD@@@" "JDADMIBAADDDHIBHJIADLIBFIBIDIABDFLMDHDJBAIDEBFEABHIGABDIBEFDMBDEHB@JDDIABEEABLIEECBDIBI@OMBNDDEBIFIBIEFJOOKBJNJJICBIDJEEJLGAJMEBIDJFDJJKJJFOOJKEDJDKDJEAACJEOHDJDIBFEEDIJDEEBDDIABHB@MABEICEBDIBDGDHJDECBEADLBBI@IEIKABDDIDJDKBDIIDDJHJDHIAADDBDMIDABH@@" "BIDI@BDJDJJIEBDEBBEBAEFHCDBICFHIHA@IBIHHJBBJDHJFDEBHEFIBEE@J@DIHBMFEABDJLJBJEBJJIDDMJEBE@BMCBIDIBHDIBJAENKFDEAAAEDDJKDJKFJHJKFJIFJIAEDDDEACFKMDBJDI@JDIDJFEJ@EBEBMIADJJJEBJBIJIBDECEJ@LI@BHEEBDKE@JEACBHIBJBBHHLJDHD@LHKFDJAF@KEDBEBBEABEDJJIBIB@DIDJ@@@" "DBJBEDMDI@IBIDJIDMBDJB@EDAFBD@EJBJEBDJAEEDJDIEDHIADBI@BJI@EDJIBCJA@HFDJBADHBHHIDBBI@@LHIGMFMDJIBJEKBDMJIGJMIJEFNEBKEEBJFIEGEDKBJEEFJECKEBLMJODJMIBFMBJDJIEKEODHIH@DJBADHHJ@IDBBIC@HDBNBDJIE@DJJ@DJADDHIEDIBIEEDBIBEBJBM@ABCDAE@BBIBEIDJIDJDHDIEIEBBJA@@@" "IE@JHI@ABKBDBBIBA@HIIDJIBK@HMEHADDJDI@KBAADIBBABBJBJBJL@BFJADJED@JEBIBDLLIBLEBBADIDEEAAFMBIBJIBDDH@DIJBBOEJBDJAADIDBJEDMEC@FEEIEBJADIDDBIBBMGJBBLI@@IABDJJDJEKDDEEADIDBBEAJDIIIBDJEBHAEBIDBKB@AJJBJBJBDBBDIDDBFHDIBIAD@MEHHFJDJIDLHHDBDJBABFJD@DHJHEDH@@" "BDEDEBKJE@DIEDDEFKEDBEBDDHEC@DEDIIDIBEDDMFABDLJEFEDHJBAMJHIBIBHJKBIEBDIAABEBIBNJIBAJDJFIIFJEABJIIEJIEEEENMJMEDLJEBEFIDKFJNGCJKFIDKEBEBIIEEJMKMEEEDJMDLJJDEBKDLKBIBLBDJKJDJEBDDDIBEDJFJHJDJDHJMLBBHIECEBIIBDCEIAEBDIDLIEA@FE@IABEBAEFKEAAEDI@EBNJEAEAB@@@" "DIIBIEDDJFIBDIIJ@HBADIDIECBDEIBIBBABDIACB@JDIADHHHIBIDJBDEBFDDC@HDFBEBDJJLHDBD@JDDJ@IBICBHJKFDHBBJBJIDJKMKMBDIADJEBHKEEAEEMMEDEEFHJEBIDDIBENMNJIDJJBJB@ICFJHJFDJDHBIABHABA@IJJIBEBCA@HFAACBEABBIDJDHHHIDDIBHBFDDIBDBBDJDMABFEDIDIDB@HBLLIBDKBIAEDJDLI@@@" "BBBIBDIADHBDIBB@JBHKBDABHHDIDBHBIDJDIBFHDJDIBJACBEBEDIDIABDHIIDEBIHLJDIDBABIHIEABMEEBJDJMEEFHKCEEAF@JIAEKDFIJKFCDHJGDJJNJJJJJKJJIGBHIFCFJLKAFMDDJHCDEEFFHKEEEJIBJEEEJDEDHLJDBADIBIHLJEADLHIBDDIDIEBEBFDBJDIBI@KBDIBIDJ@JADI@HJDABFHJBHBBDIB@IDDIBDJBB@@@" "IDHDDIBFIBLIBDHJDLJHDIJIBEBBIDEEBAAAJDHBIBIBHDJDDIFHBBABFDIBDEABDBBA@IBADJDJCBDFH@IBDDIGBAAEBHDDHLHI@BEGGJLBA@@LEFJJIEEBIEEEDJEEDJJKEAH@DBAJOGEB@DHIHIA@JEDDBGDIABDH@KABFBIBIDBDHDBBABDEABDICBDBB@KDIABI@JDJDJ@IBLDDBEEADJBEBDJLI@JIIBHIBDIJDKBDIA@IDH@@" "BACAIBDHBEAEDICBIAABIBBDEBDJDIIBDJFF@IBEBDDICABIAA@CIDJDHIBDI@JDIEDJEBDMBDI@HDIHCEBDIAELHJFJDJIACCECENJKEEGEFMECJINEKFBLFIGDKAJCFMCLJNEEKEGEEFJKMFEFFDDJIBKBHIMDDIBEF@LI@HDIBEIBEBIEDIBHDIBDHIBIDN@DDDJDFDIABEBDHCCBIBDLIBIBEABBDJDDDJFDIEDEB@IBDLFDB@@@" "DJDJBBIELHDJABDDDKDEBDHIHHIDIBBDIBHHIBDLEEIBDFDBJFEDDIDIEBDJDEBMBDIDJDI@HKBJJIBBLDHIBJBBEDIDIBBFDLBDB@EFKDJJIBJMBD@JEIMBHFHK@JELMBHABEJJDJJIFKE@BABAICBBDIDIEBBBJDHIAJBDJJJFHHDIBIDIBEJEABIBEDIDIAECBJACABDMEAIBDHHJDIBBDIDHHLHIBEAFIAABDBI@IMDJBBIBI@@@" "A@MADLB@ABI@JLJJI@BHDICBBEBIBIDIDDBECDIAHHBDI@JJDHJIACABBDI@IJD@DIBIDIBECHEAABEDAACBDEGJIAFIDHLHIBIBLMIEEIEEBDJJDKEEJFBMEIGDMEJCBMEFIBJIBEEDMEDMIJDJDHIHIDKDDJOEABFDDAEBDDE@NEBDIDJDI@ABLHDIBBDFDDJHIBJHDIB@HLDIFEBAADIDJDJEBBFDI@J@DJJIJHDJD@BAIDEHD@@@" "FK@JEADJJEBJBADIBFICEBDDJHDBDDIBAIDHDABDCBJIBE@HIBHBJHFDIABEBAAEEBIBABDJDBHFFDIAJJHDIBLDBEBBAEABDDBEABEGEDKJDJJJJDIBEHLHJEEEBHIHMBDIBJJJIBNIEGEBDEBAABDEDBBEBAAJDI@JJLDICC@JABIBDBDJEEDDBEBDDIC@JJ@JDHHEBDJJFABDA@IDLBDIABA@JIABEFDKBDIDBBJEBJIDEBHFK@@@" "@DEA@DEDIDDBLJBDHHJDHJIBDBJLIBBDJBEBIJFIDDHBIDMCBFBJDK@KDJDJDJFDHDDDMDI@JIBHHIFFBDBIBJIAFHJLMBJDIJLHJJJJFIEEIEEDEKCEBCCCIDJIDNFFBEFFMAEEDMEDKBJJJHIJLIBJEIJHKDDJJDJABCCDHHJDJHDIEIAA@ICBIBIBIFHFIBJCBFEIDJ@IADKBLJEBBIBBDIJJABDJHIBHHIBBIJAADIEA@DEA@@@@" "EABDFJHIBAEDADHICEABC@BDIDIABDHIDHHEFA@BIABLDB@DDHLDI@E@A@M@IDHIBIAI@ABM@JDBEB@HIAFDDMBF@BEABHIEBAAEBDELMDJNBDJIKBDDMDHLFIEDKAHIEIABFLJIBCJIEIMABEDDBEDHJDEB@CBEIACDDHHBEBABHEJD@DLDJDHIDHEHD@E@DIAHIA@BAAJDDJ@DCE@HIDHIBDDIDIB@FBDEFDHIDAEDBDHJKABDE@@@" "IFDIHHKBDJHJJICBDBFDHEEIBEBDHIEBAKBJ@JEEBFEAJEEIAEAIBEBEFE@EBAEBDJJBEFD@EABMBDMBDE@IJHDHNJMDHEB@DJJADJIEBIDLHKECBMEEBEFJIBHJDJKEBEEEJFEFHIIDJEDJIDBJI@BE@IEJKHI@JLHEABEIBEJDE@ACEBBJIBEDBE@ECEBEBDLEDDMEBLECBEEBHBJFLBEDHIBEBDME@ICBABFDJJHJIBFHHLICDH@@" "J@IBBE@DIBB@IBDDIDHIEDDBDHDJEFHDJ@DHJHJDDIBD@LDBJHDDDJDI@JEIDJADIAADI@IEIFD@DIBEAJEBAFJB@HJBE@HJIBDJIBCFMJICCBJDE@IBEDIABIGDJDDIEBDHEABJFFDJMKFBDJIBDJHHEBBHHBBKDBEBLEBDI@ACDMDHDIDDDIDBIDMBHDIBIAA@JJAAHABDIABHJHI@BI@KEBI@IBAAEDHIDIABDHBBDI@EBBDHBH@@" "AEBDIBFIBDLMBDJJBIBEBIIDIBIAB@BJDJICBCAAIDDIEAADJBIAK@JBEABBADJABDDIBEBDB@IJIBHHF@HIFHIEEBLIAFKBDDIEJLNLKABJLFMJJKFDLJJNFFHKCCJJIICFJJMKAJJDFIKIJMDIABFKDDIJEEDHKDHHC@HJDJLHBABEBDIABDBIDBBDEBBHFLDJBIDDEDIADLDFBFDJIBJ@BDDJDIDLJEBDJBJIBEIIBDKBDIBED@@@" "DJDJDDHJDIAADIA@JDDHDDBEBDDDHIDIADFHEDDFBBJBDDJI@MCB@FIFJDDHMABMDIIBEADIDJB@JDEDHJBDIEBDDDIDEA@DIJDIDACIDJDKA@JABDHKCEB@HIBDHHBEFFHIBDBHDFIBIDNDADIBLI@DEADIAABEDIBBHIEABHBBIDIDEBDLIEJDEHIABKDK@BFEHDJIABBJBCAAE@KADDIDHIAABEBAA@IABHDDIDDDIBHIABIBI@@@" "I@IABJB@JDJJBJDEDIIBIADHIAAICCBDFA@BHBJHHLIDIEBBE@DFJHD@DJJC@DD@ABBHHFABABLKDIDIEEDIE@DIIBJBJDEAB@JKMJNDKBJINKLLDIEDLIDKBJEBJFIDIIEDIAINKLJJFICJMNJHBDEABJBJDLI@EDIEEDIDIFIJDBDC@HJBD@AA@FBJI@A@JKA@EBBEDIDIHHJJ@J@DCABFFDLDDHIDDJDLIEABJBJIBHBBJDDHDH@@" "BEBDDEDMDIDDI@IIABBDBJABBFFBDDEBHJJDBDIEEABEBHDLJKA@BBIEIA@HFIIBKDIEBHJDJJA@BJIBI@EEJKIBBEDLHIHJHJIGDAEIDHDBMFIAIBABCFBDDJJJIABCFBDBDLDKEJA@IDMDAGDJHJHLHIIEBBDNJME@DJDJJ@DBJIBHJEDIFJDLK@HDDMDJB@DFJII@JEBDEEDIBABJHJEAABCCBBDBJABBDDLHDIADIEIEAABEB@@@" "DIDHJHIAABBHJEBBDIDIJDNEBHIDJJHHEBDMDMBAADDHJBIA@DFEEDJDBFEC@JBFDAB@DEBIBCNEDEBDBEHJJDCDHNJABBCBEEBFNKNKKKJJJJJJBDJHLIDIADEADDIDIHJIBBJJJJJNNNKNKKBEEBFBBDBKHIFABJHMBABEAECNBDJEA@BDACBBHFECBABIEECA@DDJBHIADDBEIEIBE@HJJIDHJECIBLIDIBBEBHJBDDDHJHIDI@@@" "IBBCEBBJFDICABEEBBAJEA@JFEDJDIECBIA@A@HJDAIBIDJDFI@JDE@IDHHDE@IHIEDJIHHBDNJLIJLIJDCBHIDACD@JIDHDIBDKHJDHDDDHGE@DHMBCCEAEFK@FKEDEFFBEHI@EG@IAA@IBHNIBDI@IDJHAFDADHJFABLIJLIJKIB@HLJIEDHLHEA@HIDHEABHDKABIDJDLABHHD@DDJFEDIBIECBHDEBLBBEEBDFDICBJBEFBBDH@@" "BDHL@DLDHIBDDIABDLJA@FEDIBE@IBBDDBDEFEADJJBEBE@JIBJHIHJJIEBJIEDCBBABBCBHMEEKFIIB@IDMEBIFDIEDBECABDIFMFOOKOKGNJGIC@DHDBFE@HG@HECBA@I@FDOBKOFONOOKEKDIBDFEBAEDICDJEEIDHBDLKFMEEHJFBBDBBFAEDJJEDJJHLHJJDJHEBEBBJIDECEABAABBDHEBDIEC@DBIIBDDIABDHIAI@AHIB@@@" "JIEAFIAIBDEBJDFDIADJFHJBDHHJJDHIADI@@IGADIDLDHEDDDBEBBIABBDHJDIDDLJEEDDK@KBBMCFDMFKHHMBHKDDIDHDFDIBGJMOJJNLJOEHBDEIBIDHJEBHJEBHIDJDMAB@MGJIKJJOMJOBDICA@IDIAFHJEHHNKEICFEJBFHFIAEEBIIADIBHIBBDDJBEBAAAE@IAIDIDGDH@DIDDHIBJHHIBBHKBIDDICABJEABDLDKDEDJH@@" "DJDJHJJBFIJJEAHJJJIBICDIBCEAAEEBFIBFJB@EABEAIBIBIIDIEEBFDLICAABJIAEDBIAHEDDMFDEEAABEC@JBEAJBIEJHIBEFOMEKGMBDOJGLJJBEBGFDJEEEBICGBEBBJIOBOIBEOFMEOKEBDHJMDJBLEBBHFEBDDEEACEIAE@LDJAEDDJJDDFDIICBEEDIDLJDJDLEBDE@BBKBDKBEEDDEFBDIFDJDJJJHLEBJLKBBJHJIBI@@@" "IAAABIADHJ@DHFBIABBDDDAEDLBFFHJFHBDHHHJJFDHJCEFDJBJJBDJHIABDEFE@JE@ILAFBJKE@HIFHJEEIDEAEKFAECBBEDEJKNCGNJODJKDOGJHJLDHHIDJBBIDHHIAJHJOGIFJIGJKOFCNJMAEBBFEDCFMDEADMEBHKDHHEFJJCDALHEBHECEABDDHJIBBJJBICEFBHICBJHHHIB@KBHKCBAIEDAAABBDDJC@I@BHIDDJDDDDH@@" "BJFFEBFEE@KIBIEBFDLJJJKBEADHHE@HEDIBACBDHMEDLB@IAEAADIBBDJJJJ@JGBJGBAK@HHLJEBKEMDKJBBJFKD@LDDDHIAJGNMNNIDHIHNIDMDCBAIGCBIDMIDJFGDLBFAEIDKHLHIDKKMKOBLDHIAAAHAFKBJBBNIEMFJEBIHHHFLBGBJGBHBJJJIBBDIDDEDDHBAIEEHIBFDBDIE@HE@HIDEBFJJJIICBEDJDNHEECBECCBJ@@@" "DDHHHDHI@EHBEDJDHIADIBDDHJIECBEBIABLJLFIE@IAADKFFDFFIBDFIBDDHMDHDDHDJDEKCIBLE@BCEFIEDHHDIEBIIEEFFEOEKDKGEGBCABEIOLDJBHDEFIBDKEA@JBIAOLMBDFBGEGFIFMGMCCEEDLJEDI@HIEDKEFB@EAJDNFMABI@IA@IEHIABDKABDKCACCFIDDDHEDKAJIJDDJEBFEDJHIABDIDDHIBIEB@M@DHI@HHIA@@@" "IIEECKBDELBLLE@KEBJIBDIEEACADDLEBEDABA@DDKBFJBD@HIHHBEEHJDIIC@IBJIBIIAD@EBMJLGDLMEBDEECEBDHJBDI@HKJMFKFJI@EDKDKBJJIEEBMIABEBDDMJEEDJJJFIFIE@DJKFKEJNHHDIBBHIBEFEEABEEIIGAJMJE@ADDLJDJJDHFDLIBHMEB@HLHHABBKBFIA@DBDAEBEAIADFDEEDIBDJJEFHEAIJAMABFNEEDLH@@" "BBBBD@DJJAEAAHJHBFEBDIBDJFDFBJALIBADDHFIIDDHHLIEEJBEFJDE@JBBDEBDHJEBBJIJJE@EAHEABNJIIBDDHJEAEIBEBOGJKDMBJEDJDIDFOMBHDE@BJDJIBJ@EA@JEOKADIBIEBJEIFJOGJEBDMDEBHIABDLJKJDE@LE@EBJLJJBEBHIBEABBBHEABKEBBMEDIHHIADLK@IADBDILBJCACBIBDIBECB@JHLDEDBJI@ABBBB@@@" "MEDHIFJHIEBDJBIBLHHHKBEI@HJHJBLABDJKABHJBAABCABDHAEI@DIAEHMDJJJKCBJDJBBBAJEFJBHJEEDFBDJJKDJFDBHJEGECDKJMDJIAABI@IDICEDEEBMEEJEEAEFDIDHDJDDDJIEJNIFEGEBHJACBIFJJIBCAEEBHJBKEBLBBBBIBJFFJJJIEHMDDI@DMD@IBDFBDDBBHJDFJIBDAJBHJHHDMBFHHHIJDJBIBEDHJKDHIEEH@@" "@IBKBHIBDJDJIEDEAEFBHDLBECABDJBJDIE@FHFIDMFEDEDICJDBEIBJDCAEDHDHDDDIIEEDKDJDEEBIDBKIDJBH@A@HJJEHLOGOMEGEKMJFJJBEGJJDDIIBEABDEBDLIABJOEBBJKBMNMGEEOOGIHMBJHHD@@JBIDNJADJEEABIFIEEDLIAA@I@IEDFABJDMBABNDIEAECEIDK@K@EDIBJBIBDFEBAI@JCEDEAEDJIBIBDHJFJDH@@@" "KBE@EBBDI@JIBBBJEA@MBIADIDFDIDHIAB@JHEHDIA@IBJCBDDIDJBEBIDJ@IBIBJIIBBDDIBJIEHDFEBMEFKEOCNNEEEEDCAMDHKKLMFCEHABLLIAAIEBBHJFECBHJBEDLDDIIJD@MFCEINNHIELFAEEEECKNGMFKEEJECA@MDJJDIABBDLJJDJDHBIDJEBBIDIABFBJDHDDI@M@JHBDDHIDICADIDDJEHDEBJBBDJHDIBBE@EBFH@@" "HDHFJDLIJJIBDLHHJFEBEFJIBBHIBBEDFJMBBHBIBJEBDDHDIAFJIDLDEBEGBDJEDJBEDIIBFIBBBIHHDABIFJHLIIMBJFIDDKKKEFGANNLBJDACGFDBHDJEDHJHIEBI@JACGFDABJAKKLGCEFNNIADKBJELLIHJKDJDA@HLJBBDKBDLIEBBIEBIBGEBEAAIDJKDDI@IABEBJDJ@JBEJKAEBBDHJBDJKEBECBHHIIBDJJLIIBK@I@H@@" "BIC@DIBDBBBDIAEBHHLHJ@DDDICBEDHIIBAEDIEBJDJFIIFIIEAABEAIIDHHDIAJBIEDIBDHIBEEEBBBIJDFJEGACFJMMIFJIOEFJIHKJKIEDJJJIHIJBIDIEE@EEDIDJBLHLJJJIEDNJNHLJKEGLJKDMMJKFDGEBKABLJBBEEEBDHIBDIEDJBLDI@HIDLLEBDDEDLKDLKBIBJEDIEDBDLHIEBFDIAA@BHIHHJEDDIBBBABDI@FDJ@@@" "EBDEEBHJHLMEDJDECEABHJIIMDDDJEKBDDJBACBDHIDHBB@DBBDDDHJBBBEBIJF@JBDIBMBKDIDDDIDLJBJHIDHFHAABBDIFKFNMEGGEGGBJA@HEOEBDLBIBHDGA@JDJAIBEGM@HDBJGGEGGEEKKFKDIBBDD@K@IDHJJBIIDIAADIFJEJDIBBHCBLJEBBBBHIAABBA@BB@IDHIBFDBBIABFMBIAAELLJHJDEFEABIEEIHJHJEEABE@@@" "JDIBHDK@KA@DIBIJDDJBEBDB@IIIDH@EBIADJHDICBBBMDMIDLJJIEBHLLIED@HKDLIBJ@I@CFIJJEAAADIEBJEHJNFLJIBMHMINJJEEMFM@JGCKJIEAAMBECIHLNEBELDEDJNNGBHEKEMEBJKLMHMJDJIKCJHMBJEDIDDDEBJLKF@DHBJDIIFHHAEDIIHJEDJJIIDMIEJBBFDI@JIDDJE@@IDLLHBABEBBIABLJDI@DFHFI@JDIBH@@" "DIBDBJHE@DKIBDD@JIDLHFIHJBBDIBJHIBFEABIBDEDJ@EBBIADHDHLKAABBAEEDBABHIEDJLHBAEBFJFEBBJDJEA@HADJJCFKGOMDJIBEBGDHDBMKBFJ@DHLDGAAHI@BKBFMJA@IGBEBDJIEOOFKFBJID@HDEBIBJBECBKBEDB@IJIEDHJDBAEEDBBDDFIHI@IDDJBE@BIEABDJDECBDHJJDIBBBHLK@IIDJHAABDNI@E@JJABDI@@@" "IBDIDIBJFJDBDIAE@JAABHBEDIEABFHEDDHHDECDJHJIDHHHBDIBIBA@DDIDJDDIDJEEBDIBABLLHHHDHHIDDIEDJEBJIAADIJJJJKNBIBLHAFJKKDDHIDJEAC@FDEBIDHIAFNJKD@IJDJCNJJJJLIDDDJJEBIEDIADHHI@HHIIJDBDIBEEBIDIABIDIA@DBDJDIB@HHIDJHJIFEA@HIAE@KBDEDIEB@JDDBHEDDIBABKBJDIDIBDH@@" "BDIBEBDHHIIDJBF@E@LJEEEAABDJDHAIAAEBIHDBBF@BABEADMBDJDLJIEBEDJIBADJADIBHJBAABEBIFEDJIDHIDJDIBDDJGFKNEEBIFEABK@HIEICEDIHHJHG@JHHLIEFDMDHHFJDECDJEECNKGBIABDIBIDHIDJIECDJEBDDBBHJDIDBIDBDJIEBEDJIIBIBEIDEBDB@CBBA@LJEDDDL@IBIBDDEEEBIHE@CBBIDLHHIBEBDIB@@@" "JIBDHDICBDBI@LHJIEA@LBDJJDIBIEFBJKBEBBJJM@NIDEBFAADI@IBIBHEDIDDHKBHNEBICDNJJEDEB@IBABBCBA@IBDIEBIKDMMFMB@LEFHECDMKDAABBJIBHJDJJBDDAFMIFE@KEAHBEKEMIFLJEDIBDHDBFBBDBDHBEAEBJKIFDJECHJFHIADIE@JDJDHDIDDCBEADKHEJJJBEBFJJCEDJDIBJIBAHDEDJHIHDJABFDI@IBDJH@@" "DDEAEIBDDIDDEAB@B@DEAHJBDIEDBBHJ@@DJEDI@@E@BA@DHFDCBEBIBDC@IBAABHDEA@EBDI@DDHIDDMBDNDLLEFEBDIBHHEEKHBIEEEEDCCADAA@IFEEDIBDJIBDIEECDHDDADFFAEEEEDJ@NME@HJDIBECEAIICIBEIADHIA@DIBE@DEA@JDDBDHFABDJEBFAC@I@DB@E@@DIEBI@@BHJBAEDIBBHLEA@B@BDEAADIABDMDEAA@@@" "AADJDBDIABE@IDDEDJHLDC@LICBAEDA@JJJEBADFJJDHJDJBHIHDHDDEADFBDJFDJK@JFJDKBEAAEFEI@DI@IAAHHJDIJDBBJMEGMGFJDHINDFBJEKBHJBIBDIEDIBDJBHJFMBJCACLHIBKGEOEEJJBABLIBHHLDDHDI@DMCEDDEBFIBKBHFJICBIBCADEAA@I@LHJBIBHIBJKADBEBJJHDAEDBFDIHFAAHJIEAADHEBDDIBABIDD@@@" "JJI@IDIBJDHIBA@HB@AAIDEABDDJIBDJ@A@HDJCABDIB@AIDEBBIAJJHDA@LIDHIA@EDHDIBDJFFBDHBEIBEBJJCBHIBBADLIJJHBLEDIBBAAHJEEDEBEDBDIBHJDIBAEBEAEEBHLDBBDIEAJ@JJLIIDBBDHJFBJJEBDMB@IBCCBIBDI@IE@DDHIDIHDA@JJLDJBEADL@BDIBDFBI@HD@BIBDJIABDEADLD@B@HDBDHIBJDIDHDJJH@@" "BBBEDIBF@JEBDKEBHIBDBBJDHIADBDI@JFEEIBHDDIBDIBDJHDIBJ@IBJJEABABBDJIADIBEBDHHICCDJBDIE@IDECBEDJIABJKOMAJIBFMDFBDHEIBDIEHIBEBEBDHMDIBDM@IBCAEKBDJLEONJJDDJIEBFEADHEDIBBIFFDHHIBEBDIDDJIBBDBDEBJJDHBJDI@JIBDIBDIA@JDMECBHDIBADDHIBJBABDHJEFIBEBHCBDIEBBB@@@" "HIEAABDHJHHHID@DEBDIDJ@HBBEADIBE@HIDBDBIADDIBEA@BIDD@JDDH@HDDJDHJBBDABDJDIBBDFDJHHIB@FBEBDDIBDBJEMJHFNEBDH@BHHIBIBHIEDEEDIEDIEEAEDHJDJDHHJ@@IBECK@JMMBJABDIABEBC@BDHHJICABBDIBIBDABBBHIBIA@H@IABHAADJ@DEBDIADDJABADHHEBDIDEBB@HBIDIBEA@ADHHHJHIBDDEDHH@@" "EBBDJHMEEECBBBJI@DIAABMCLLJJEBD@BCBADIDBFCEBBHJIDJAAEBJJAFJIEDIEDIFIJDIEABEDIDIECCBDJHLIEAABDII@IJEGMHIEABJMECDDJLEDEBIBBEEEBBDJEAEAJIAFEEJJDEDHMOEBLHDLIBDDEDIHJIBFFEDIDIEBDEDIBLKDIEDIEDJKDBJJEDDBIDJHJBEFCBADIDBFB@ABEBJIINEJDDDI@DJJBBFEEEEHJIBBE@@@" "@DHIAB@@@@DDLH@BDHHDBD@HAA@@HE@JDDDJABADHH@DHB@BA@JD@D@@J@@B@ACAAB@BAABFJEDEBBJHDDDIBEAB@BEDIBBEEBJLIGFJJMFKJDBKAIIAEDDHLHHHIHIAEDDLLFJABNKEJJKGDIJJEEBBDIEB@BDEBDIAA@JJBEAEBKBDDB@BDDFD@B@@BH@A@ABHDB@B@I@@HIDBDBIAABHE@H@DD@HABA@HIB@@IIA@@@@BDDHI@@@@" "DIEBDEEEIDIAAKBDIBAADJJBJJJIBHE@@IEBLDJAEBFIBHEEBE@HIAEE@EDLNLDDBDJHDFEHBIBHEEKBIBIJDHJDIFMABEEBILECGMMKEKDFMJHHEDBEBBJBACBFDBBJBEBAE@HJMKAFMFMMOFEALJEEBDEKDIBHIBLJDJFME@JDJ@MCA@JIBAAAKIIE@EEDDHHEBEE@JDKBEDBIAJEDH@E@JDJJJJBJIDDBDIBFLDDIDMEEABEDI@@@" "IDBHI@@@AABJD@DJBHJDA@@I@@@BHB@BE@@DAA@J@DHBHBJ@DHJABJ@@BHAA@AAADIBBI@LBDBDJDDDDIDB@IE@IC@@DDHHDBIBJNJHJM@CHKEFBIIEBDHIEFHMHKEDHIBEDLJCEFHN@EJHJKJJDJA@HIA@@FDHEDHBADIAAABIBABAHDJBDIDDD@DD@J@@BJDBHI@BJ@J@I@BHDDA@@EB@B@J@@@DH@DABHJBI@ABJDD@@@DHJADH@@" "BCDCBJMBJDD@IFA@HB@IDEDDDJEDBDMDHEDJHDE@EABDAD@EBB@JD@JJLBDDEDBJABDEBEADMDI@IIBIBBDJB@EDDFJIIBBHMOFJKNGKFNLKGNHLJBDDIABDHE@E@IBDDIABBIHKOFIKKFOCNJKGMHJBDLJKAAE@BBIBBDJDLHDIEIDEBEABDBJAEAABAJJHABHBBE@ADABDE@EA@JIE@IEIBAEBIAAEADHB@HDCDHAABJEJJFAFB@@@" "DHEHDD@DAA@JB@LBBHJ@A@AHI@HA@H@BBHA@AA@BHDDMB@DHDHIAAD@@@HIA@@H@JDIHDLFE@EBIBBDJDHI@DKBII@ABBEDJALEEOEJDKAADDENIAHIIBCDICJJJNDIFBDLHLDKMAADDFIBMGMEALBIEBBD@DLJFI@DHIBIBBDJE@ECAI@LIBH@H@DDHH@@ADDDHI@I@BEIA@J@DD@D@JB@@HD@HDHL@D@BHJBAHBBHDDA@AA@M@I@@@" "IBHBIAJHLBE@DMADDB@JJEBAJEEJECJHDEDFJDEDEJJ@DJMCABBDDAEBIBBDFJBEBIBCAAJHJHDBEFI@IBBJIDDBBJFDI@B@KGKOJJNOFOGKKOEKEEDBDLABEGEGEBDAIBAEEFMGNNOGKGKJJONOFHB@DICBJBAADJJBDHDKEBA@JHJLDFBDJEBBKABBDJEDAABBDFEJI@BJMAEABKAEA@JNEBMEBLBEBJHBAADEI@EBAHJLDJ@JDH@@" "EEBIBD@CAE@JI@D@IDJ@@JDJ@HH@HD@BI@A@@I@A@@@JI@@DEDMAAD@DBHHI@ADDDDDHDJDE@JIDJDBEEDJDJAADI@HIBEDJIJEONOKJNJIBJJKDAIADJAFHKNJKNHKDBIDDLAFJJJDJKJNOKOMBLJIEBDHHDIDDBIBIEEBABIDJHEABI@IAAAAD@DHHJA@ADDEIEA@@DJH@@D@DH@D@DJ@A@H@HHBIBH@BIDHA@DJHEDF@ABDJEE@@@" "BBDJDJJHD@B@BEBKBA@FJ@I@EBBJBIEDBBJEBBBJEBEEDEEHHB@JDADHHBABED@HKEMCEEKJKABIDKDIBAAA@LKABEEBDIABBFMKEDFDIEBEEEDOEFEA@JIGEGOOEGDJHDECEGIEEEBEDICAEFMKBBDDIBEEBDFIHDDDBDIFIDJDFJNMEFEMFHHAEBDB@HIDABHB@HMEAEEBEBJBBEBJBAEDJBJBE@DHBK@DBFJEB@B@A@JJIBIBB@@@" "DHIABHHBIBHEE@H@@DDH@JBBHHH@JB@ADD@HDHDE@DH@A@@CCDJ@ADAABHIDHAEBHBHNJJDEDDDBEBABDJJDEA@BFJIDIBDDKLKNHIHIFJNIJJIJIHJFKAGJKMGENJODFKBHLJLJJLKJKDHLHKNINIABDIDJKB@DEABJIBDBEBAAAEABJKHJ@JED@IDHJDDAD@BIFF@@D@@I@EA@I@HAAD@BBH@HHJBBH@IA@@@HEE@JDJ@HJDDHI@@@" "IBJDICCDJDBH@DJJJIAEE@HDBBAE@HJJ@JJBIBI@EAEJJDJHDEBJJADDDABABJ@EBMCABDIDIJILHKDIABBIDJFM@DBBBDIIBKEEJBCBHIAFBJFMCOA@HDNGGKONOGCI@HDGNEKBJCDDHJFBBMEFJDLIBBBA@EKBIDJBDDIFHILJLIDIBDFEJE@BJDBDAAADBJJEA@JIBJMDE@DJDJBJHBJHHEDBBA@HEEDDJJJI@@JABIFFDIBJDH@@" "FDDIBDDA@I@AEA@B@@J@@DDJHHJ@BB@@JH@HDD@E@E@@@IABI@D@@D@I@HDJD@E@DBDDHIEABEBEJJABFDHBA@H@EADHLIBDEMJOEDHEBDDIMDHJDHLKGIKJJFMKBJNLOFIHIBHIELIABE@IEGJMMABDIHIDE@@HDB@ICBDBJMBEBDEDHIABA@E@ABI@HDHA@@A@DJDDH@@E@E@AA@H@JH@BB@BHHJIA@@BH@B@DED@DHDAABDIAC@@@" "DJIJBIEFJBDJ@FIEEF@JJHI@BB@EDHIE@AEAABJHBHEEE@DDBBIDJIE@EBHHBJHDILIBEBHDIBMLD@JHHIBLJEEDJJAKABEAIJEEJEBLDIJOEIBMIJKANKFJNKJNKJKFKLFJLMJDMGJLIAJEBMEBLLEBDFLBJIEEBIJDHHJHAAMJDI@JEBDILI@JJ@HJE@EDJIDJBAA@EEE@J@JJDDED@EDHIE@BB@DHJJHCEEDK@BIBBKEDJBLJI@@@" "J@D@HB@@BMA@DHB@@@D@@A@DHHJHAAB@BJ@IDH@@HA@@@BHHHDBA@@@E@@BBL@BIDABDHFAABEAAIEBABBDAE@HA@@J@DDHDCDJJHHNKIBAFOJDJAEBKIEMJIEEEDJMMDNJEDBIBOKDBDNKHHJJIFA@IA@BH@D@HEDABBDBEDLDEBDDC@IBDADJ@AJB@@E@@@DBA@HHJ@@@D@H@@IDHBJ@BDD@JHHI@D@@A@@@B@I@DEJ@@B@HA@BH@@" "EBIEBHMED@DBIBLIDJIBMBFIBB@BJB@MD@JBAEECBJFJKDBABMDJEEE@EEDJACDBKLDIBHJFEADEEADJDHID@EBJEE@JIIJJJKMKMEKOBEDOMDIOKLIFOOGMFJOJKEOGOKDINOLIEOIEBGNMENMNJJJLLJHEEBJE@ADHIBIDEEADECBHJDIANJAFDBIEE@EEEBIEJDBAFJKBJFEEDBBHAEHBBJ@BBDKBEJDJIDIJDJA@AEEHJEDJE@@@" "@EB@DB@@AEADAD@BA@BD@DHJHHJH@EE@AEAED@@DD@H@@ADJD@A@H@@BH@A@JDAEDBIBEE@HHBEJ@FAABCBEEBHHH@E@BB@@JFIFJABJHJAMKIBNDIBKKJOFEEBEECGJNNJDICJDNMLBHJJDBKDKBH@BB@E@@HHJEEBFBDDC@BMB@HHEEBDJAEDABHD@@J@@@HD@ABID@@@HAA@@AEDED@EE@@JHHJHI@AB@DB@ADADED@@BA@BE@@@@" "M@DEAEEED@DAE@IHJBHHJHB@BA@BJH@BJ@D@@IJIAKEBJJA@IEBDBIBDBIBJ@@JBIEBDJBEEBDHACABDHDLHIDEBBI@DIDJGEMFIMBNOI@JKGBIMKNMMOENKMKMNMNKMGMMKNMLJGFJHDOKJELKEMGBIDI@DJBEADHII@IBDFD@IBEEBBIBEDJBH@BJDJABDJABEDHDBJJEFLDJLH@A@BJ@@JJ@DB@B@JHHJBHLHEDA@AEEEDEA@EH@@" "@EBHD@@@BE@HBABB@DBAHBHJHBED@BID@E@JJB@BD@@D@@JEB@D@HBDHHBD@DI@LABDIDHIBDIADHDDIBKABBA@HHBEABADHJIMGLEEJBEABEFCOLKKGENKFBEBEBCFKMGFNIONCEBDEBBMEAOELJHIDBDEB@HHDBBDFJDIA@IDDIBDHIDIBDAHDI@AB@HIB@HA@BEBH@A@@AB@BBJHE@ADJ@AEB@JHJ@LBA@BBDB@HEB@@@A@JE@@@@" "K@DAAFJJHHEBLJEDJIDJBHB@AE@ADHBADHE@@IEDJJJHJJ@HEEAEBHJABHIBIBKBJHIDIEBDICFEBIABDHEDLKECFHHBDLIGOENMBHIBLIBEJHMDOGENKBOADJEBIDGJFKMGGIEHJMBDIJDHJEKMGODIIB@HKFEFIIE@IBDDJECFDIBEDIDHJJFJDJDHJDBHJEDEE@HBJHJJJIEDH@E@IDB@ID@ED@B@JBIDJIEBIJE@HJJKDDA@FH@@" "DEBJD@@@BBHBADLIBBA@IBEEB@EDAAEDABHJJD@EDD@B@@JBH@D@DB@JDBJDID@L@CBABDEABD@HJDDDIBJAA@BD@JBDIABJJKJKHEDDABDJBECCMEIEBLLJIIBDLJIIJEDMENFEBBIBDAAE@NJNJJJDDIBBHAB@DDBJDIAABHHABDEABDBF@AHADIBJABHBA@A@@JBH@B@AAE@ABJHJDAEDDAE@BEEBDHDBBDIIDB@JB@@@ABJEA@@@" "BHD@IJEEDDBDMAABDLJEDDH@DE@ADB@ADDB@@AE@AAJHEE@HBJIE@HJ@HHAABACAEDDJDIHJEEEBDHIIBDHJJFHJJ@HIBBKGKMFMFHAJDLIEMJHDICBNECBIBBEBBDJFECJFDI@JMMDIIBL@KEKENOFJBDHHBJHKBJHIBDLHIBEEEBHLIBIAEDFDBDD@HHBHHEDJJ@HEE@JLD@ED@@BAAD@BAD@EA@@IAEBIIBDDEIBAAEEBLHA@J@@@" "DBJJB@H@@IDJ@JJHIA@HAABJHHEDAEEDAADJJJHEDD@@H@BED@B@EB@EAADDIDFL@AADIBBA@DHDICBBDIKBDHB@DJEBDMFKEJJKHBH@JADJBGFKFDM@JDDJEJJJMBIABHEICFKGBBIDBH@J@NJJMFKEIBEBI@B@IBFLIBBFDI@I@DBBDIDD@AKADIADDE@BE@B@AEB@@H@AAE@JJJIDDAEEDAE@HJJDD@HDDHJJHBIDH@@HBBJJA@@@" "JHD@HJBJIDA@KBJEBDBBJDD@AA@AD@@ADDA@@@A@AAEEBJD@BDHJHDDHBBAABABAAKEABEDJFJBIBDDHIB@DIEDJIA@DIBMFKEEEEDCEDJIADHLH@EBE@JIBHBBB@JDJHEBE@@IHIDDJIEFAEEEEFKEJDI@DDJIEDI@BDHIABDJBKBIEBDEFLDBDBDDBB@IA@JHIB@ABJEEDD@D@@@DAAD@@AD@DD@AABJBABEBJFHDADJJBHHA@JH@@" "@A@JB@D@BADE@D@HHHMDEAAEBBEDAEEDAADEEEBBJB@@D@HJHIB@E@IEDDJDDJEDB@@BDIABHDIBDJIBFEJIBBJIBDEADIOGJJJODAD@EIBFIGIBJHHIE@JDELOIMABHEDHHJJDODKBDM@ADAGJJJOGLIDEABDJJBDJMCBDJIBDI@JDDIB@@BAEBIABIAEDHE@BDHJHHA@@BBJBEEEADDAEEDAEBBEDDEAEHHHHA@EADB@A@BBHD@@@@" "JJE@HJIEEDBHEBMECE@A@BJ@DDHAD@@ADBBH@@DD@DIE@JA@BBDE@ED@@IAAI@CADKCDIBFDBIBDIDBM@HABDH@DDJHDACJOJJJIJJEBJBDIBHJEECEB@E@IBEBEBDHE@BEFEEBHJDIBBJEBJLJJJOJNDA@JIA@@IBD@HEJADIBDJACBDIFFIDF@DLDDH@AE@EABB@DBHEDI@AA@@@JBAD@@AD@IA@BJ@D@EFEEJE@JAEEDJHHEBJH@@" "@@@EA@@@@@HBHDABD@DJED@EAAADAEEDADHBJJHHJIB@A@JBHHHHE@AEEDDDBAEDA@DBDDHJLDDIBAB@ECFDJKEII@A@JOCFEFJOD@HDDLIFMBIBJFDHLHEFIJOJLKE@IHICBJDJEKDIIA@HAGJKECFGJHD@DLMFJICFE@BDBDIAAJHIABA@DAEDBAAAEED@E@HHHJBHD@BDJHHJJJ@IDAEEDADDDE@AEBI@ABDA@J@H@@@@DE@@@@@@" "JLM@BBEEEEBHAAJHJJIA@@JHDDB@J@@@JABH@@AA@B@JJE@DBBAJHED@@AAAEFAIDEADJEBEAJIBDJFJJDHIJ@BBBEECBAOGJIEAMDJIAAJJJDJMBIOAACEBEBJJEBEFDDGLJEJIBJJLDDJIELEDJOGLBFEEBBB@BLHIBJKBIBDJLEBEBIDEADLCEDDD@@AE@JLBBA@EBJHB@DD@@@JDBH@@BHBAA@JH@DDJJHJLD@JEEEEBB@EIJH@@" "@A@EDHH@@@DABB@B@@DDBE@BIADE@EEE@DHBEEBBEDE@@HBIDHJ@A@@JJHDDB@OBA@BA@HDHDDDDI@HB@JBD@JHIDH@DDMDBIFJOHA@BDJAEEK@HDDHBJDFDJMOMJICABJ@IA@HFMEDBIB@D@OJKDJAEIA@@IDHJHABBHB@HDIAAA@I@HDB@DBGHBAA@JJH@D@BHIDJ@H@EAEBBEEB@I@EEE@EADDJ@EBAA@@B@BBDA@@@@HIE@D@@@@" "EDE@ABABJJJJDEEDJJJIDHED@B@HE@@@BJBHH@DDH@HEEBDBAB@IDEE@@BHIDE@DJEEDECACEAEIBEEDE@IAFBCBEEFIAAJOFJEEMDEDIAFEEHBJJIEEDLHIKJGBNLHIIEEDJJJ@MECDDIEAEMEBKGJLDDKEEBFBCDDHEAEEBDMDEFDFEAEEBI@EADHJ@@EEADHBDBABEE@H@IA@@HJBJ@@@E@HB@AE@IDJJJIEEABJJJJDBD@EAE@@@" "H@HED@JD@@@@HH@J@@HB@A@@JHIB@EDJH@HBBE@HBIA@@DHDD@JBA@@DJHADEJJI@JD@HDDDDD@BDI@BHEBI@HDDH@@BDEEBIDJK@@HABEFIKBDBDKKEAABJKEOMFJJDDEFNIBABFLKEBD@H@FJIDJEEAB@@@IA@HDJE@J@DIB@AAAAA@HABHDJJMAD@JI@@DBBHAA@I@@DDJ@HEBB@H@JIE@BDHJH@D@B@H@BH@HH@@@ABHAE@H@H@@" "EEBHAB@@IFJJABJ@JJBHJJBI@BBDE@A@BJBHHHAA@BBDMAAHIE@DJEEA@AFADE@BB@IEFIABHJMDIBEDBIDBEBJJCEEDBJJNFJEDMEBJDJEJJLIEABEFDJICLJOJINDJICEBDEDIJJMBIBJEEIEBKCJJJAEEFBJJEBADJAEBDIEJHJDDKEDHBB@EADCD@DEEBI@EDHLDEIBB@DD@HHJBJ@D@EABB@DJBJHJBJHBJDBJKDH@BD@JEE@@@" "H@DBDDEEB@@@J@AE@@HB@@DBBHH@HEDBH@HBBBDBBHHI@DBBJ@DIA@@DBJADAJBHHKBA@DBJEHABEDHAHBA@LDDID@@ADHMDMEIEHADECAEEAABDDDHAAIBMCJJJNEJDLD@IAABDDEEDFEAD@MDMEIEHID@@ADIAAHDB@L@IEBD@MBJA@DBFHHJBLADBJA@@DDI@BJBA@DHHJBABBB@H@JAE@H@HJBA@@B@H@ED@BH@@BEEAABA@@H@@" "EJJHHHH@DEDJ@ED@JJBHJJIDDB@JA@@DAEADHDIDDABDEIDH@IADDBJ@D@LAGA@BADBJEADDHBJEBBEBBFJI@JIDAEEFJEJJEDBEBJEHHDJHJJHIIMADBBDJEEGEEBIBBADELLHJJHJI@HMBJEBAEBJMBKEEDADJHDJKBBEBBEBJ@IADEBJADB@DGDAHA@BJAADDH@IDMABDAADI@IDEDA@@DBHBAADJJHJBJHAE@BIEA@@HHHJJM@@@" "@@DDABAE@LA@DH@J@@HA@@B@HDE@BEDHJ@B@BH@@HJ@HHBBAB@BAAD@JHJADDDBDJBD@HDAADH@HDHHDHH@BI@BAB@@AAHBJJEEIDADFBIEEBABGBBBADLIEKEGEFMDIIDBBBGBDBEEDJCADADMEBJJ@LD@@BDB@DJ@@HI@HI@H@IDDA@HABBIBAAADBHJHADDB@BDBB@HHBHH@@J@B@BHIEB@EA@HB@@D@H@BH@I@DAHEDBDAA@@@@@" "JIA@JHJ@E@JDIAK@JJABDDHIBHHBD@AB@EDJHAEAA@MEBJMFDIHJD@J@A@J@MIDI@HIEBIFJIJEEECEACEJHCFIBDJJDDCJMMIEEJJAAECEJDNDJDHHJAAFEBJOJJECDDBHHIBICIBMFEDDBJMEDMMJNAABJIBDKF@JMFDEFEEEBLJKDJEDHHDIDMHBHD@BHABHLICEJJEEHDDED@JIE@BD@AB@HJDHIABDBJHFLDIBHE@BHJHDDJH@@" "BBFE@E@K@E@H@B@E@@BE@HJB@AADHJH@JHA@BJ@B@EA@DDA@IBBHHJ@DJBAEJB@DBBBBDB@EJ@IADDAFD@@AH@BEA@@IAHBJBGBKH@NLJDB@I@IEEBB@JD@LDJJJIAHABHBBEEDHDHBABIKH@NJGBBJ@LDH@DEB@@L@@ACDAADDHBM@BABBBBA@BBMDBBI@BHHJBDHDAA@DE@B@BJ@D@JH@JHIDD@BBHHEB@@E@B@@HE@FHE@ECBB@@@" "DHHHA@E@FHB@JDE@EBD@BA@HBBB@A@BJ@ADDH@JDE@DEAIDEDE@AA@JI@JJBHIBADDHHIEEBHJBD@IF@JJIJBJDHBJJADBIEDHEEBJ@A@IEEBJJKFDHJ@IEAJIGDJLEDHBHICFJJJEEDHD@BJEE@IEDJADBJJ@IBJBLJJHCDHABBHJEEDHHIADBDHJBJHDJHDD@EAEADLEA@EABH@IAD@BJ@D@BBB@HDB@ABE@EABHB@K@E@D@HHI@@@" "HBEBFE@E@BDE@HHE@DIEDDBADDDEBDH@JJAABJ@@HAA@DBBJA@BJDB@@B@@MDBDJ@IACBH@IJ@DHME@J@@B@H@IDH@@JADJJEBJJL@JJKBJNEEEFHIB@JBDDEBOJEAABBHBDHKEEECJJFJJHAJJJEBJIDBH@@IDH@HB@@BHEEHI@BLH@JFDDHBIBAEH@B@@BABJ@DBJBA@DD@H@BJDDBJH@IBEAAADBAAEDI@E@HHEAB@E@ECBEB@H@@" "ADJDHHFHEDHHBBA@E@B@@HDJ@HHIDIAB@@DD@@EEAFJJJHLHJEF@IDJJDEBJ@JIDEBBDDACEHJIC@HEBEE@IBJBABKE@JIEDJFKEHIFOEMGEKLKHB@@EAEIK@MGEHFLMDE@@B@NINMGEMGKDHMFKBIEDJHEFJDBBJDHEEBE@HFDJHMFDAABBEADJHBJEABJIDHCEBHIHJJJKDEE@@AA@@BDDIDHHHBI@H@B@E@DBB@HIE@K@HIBID@@@" "JAAABBHBH@A@D@DBH@HJJBI@JAA@@@BDBJI@EE@@B@@@@BABHH@JB@@@HHDEE@D@HDDI@JDCJ@KDFEADD@EBD@HD@@@E@BJEEIDEEBAMKFMKJMMBEBJHDGFFEBJJECCGA@JJEBEMJNMKFMLBEEADMEBJ@E@@@A@HABE@AADECAFHBNABHDIA@HA@EEA@HH@@BBH@HJDB@@@@B@@EE@DJJAB@@@DDBHDJBJHH@JA@A@D@@J@JBDDDBH@@" "@JDJDDDHBIBBHJHHAEB@@HBB@DBBBJH@D@BBH@EEDIDIDHJ@AAEDLIEDBBML@EAEAAABI@IEHJAE@HJBIE@DHJBIEBJHEDDJJEJMLDDEELKGCMCLHD@A@IHMHJGBHMHLHD@A@INENGFIMEAAAMJMBJIAE@JJEDJBHI@EDJBHHEDBHMDHDJDDDEDE@AMJBAEDIIEDD@BHIDIDIEE@@JB@A@@JJBBA@BB@H@BED@HJHJBDJ@IAABIBH@@@" "E@IABIABHBDHA@AAD@DEEA@DDIDDD@ADIEDDAE@@ABABAB@EDD@AAB@AHHIAE@B@BDB@BEEGJ@JNEBDHB@EAE@@B@D@B@AMDEKJJI@HMJJMBBIOAA@IBEGMOA@JHDGMOEBDHDDGLJBEJJMHHDJJNMAEL@B@A@B@@EDE@B@IBECJHBOEEB@BAB@B@EDDHHL@BDD@AAE@BDBDBD@@EDAAEDID@AAADIA@DEEA@ADD@D@IB@JDDJDDHE@@@" "HEBDDBDDBH@ABEDB@JHH@BBHI@@HHJDAB@@HJ@ADJBJ@DEE@A@JJD@EDFCBD@FHJDADKDJJMLICMDJIBHE@D@EFDEBMDIJEGJCEFHBAEINKGGFELBABDHBJEFFJKCEBJ@IBDBAMCGGFKLMDB@KEFBOEBLIEJEACE@A@E@JDJIENDIMJJIFIDABHK@ABFCAE@ABJHD@EEA@BJBID@BHH@BDABHHH@DHJB@@HJHBAEBD@@JAABAABE@H@@" "BHFIADIADBJJD@@DI@BAEDDB@AABA@HH@EEB@DJA@H@JJH@EDEADIE@A@HHIE@B@HHADAGOKIBFJJ@DDJHBHJH@HHD@ABAIMDJLMBHJFK@DJHHKADB@IBKHKHHJHHNHNJDHBADFHHJI@FKBHJEIJIELLBD@A@HH@JHJ@JIA@BJKBDNOODAD@HHB@EDHHHD@EDIDEAE@@JJH@HDBI@BEE@@HHDBDD@BAAEDB@DI@@ABJJADDIDDK@J@@@" "LJHDFIBD@H@@@JHIDE@E@@HHBBB@BBAADH@@BI@HBBE@@CE@A@DAD@EDDCAB@DHIBBDADKEEJDEMDJIA@CDA@EEEAAEDDJJCAKJIDB@HHEJEBIDLIDEBDBEDEBBBEAEBABEADIIDJEBM@HHBADJNLFBJIAEDDEEE@DAF@DDJIEMABMEFIDABBDHI@BDFAAE@ADA@D@EF@@EBB@HDJ@@@IDDBB@BBB@HH@E@EADHJH@@@HABDKA@JIH@@" "A@EAHBHHIADIE@ABA@BHABAADDDEDDDBAAEED@BBEDHBID@EDBIDAE@A@JDDBIBB@HHJAFJKOAGBJBBJEDABBH@@DJJA@IHOFBEGI@IEBH@HDBAAB@HDJLHA@DJI@D@IJI@HBDDBA@H@JEDHDOEBCGHLHDBJI@@@JBDAEBJBBJGDGNJKDBHHHBBDJAABHD@EDADJAE@ADJ@IEBB@AEEDDBAAAEAAADDBD@J@DBD@EDIDDHHJ@LE@D@@@" "DJHJCDBABBAB@ABHJEDABDJBA@I@@HIDHB@@@JD@HABDBAB@@DBAD@EEEEABLBHDEAAAEFDBHNLHDLD@H@DDDEEEA@@JEACFIMJKBBBAEEEE@HJEDIBI@BJJEAGDEBJJ@DJDIEBHHEEEEDBBBFJMLKFDEBH@DEEEAAA@@HAAI@IKHJACEDDDEA@JAJDEEEE@ADBA@@BDBABD@HABH@@B@IDHH@DHDBBIBDAEBHJD@BDBBDBAFBHJI@@@" "E@EADBHJHDD@DJDE@@ABD@@DDA@BIB@@ADJEB@HJBH@HHJDHJHHJAE@@@BADADBHHBBJ@LIEECBAAJJJBIA@I@@@BBI@HALEBBEMDD@@@@@@EA@HBB@@DH@@HDMI@H@@I@@BB@HDE@@@@@@AAEMBBEAL@HDJB@@@DHDDJBJJLDBFEEDIHBJB@HJADADB@@@EDBHHJHIBHHH@JBHHBEBID@@BDJ@DAA@@ABD@@EABI@AA@JHJADE@E@@@" "@DJD@HB@BHHBI@A@BEBDHJJHHBBHB@BJJ@@HDJA@HABAAA@A@AA@J@ADJHJADA@AADHAEI@@@DDJBF@@HBDA@DIEDDBABKAFLLJBHHEEBEBJHBBBHDBKIBIEEKEFMEDJDNJA@JBB@JJEBEE@HJBIIKDFJDBAAEDI@DAB@H@CBBIA@@@DMD@IDD@DADBHJID@BHDD@D@DDDBD@HDBI@H@BJJ@B@JB@HJJHIBEB@D@DJ@HJ@B@HABI@@@@" "JI@@E@HJHAAD@ADADHD@A@@AADDBHED@@EDA@@BBABDBBDDJDHJD@JBAAJ@H@JBJBBABADBJBIA@EAEEBH@JAA@@@HHJ@@JJIIEMI@H@DHD@ADDHAAD@@@BAGFBCGDB@@@ADD@IAD@A@I@@HDMMDLJJH@BHHH@@DDBH@JEEDE@DDJBJADBDBBBJBH@HBLDBBHABHIBIABBABDBB@@DAE@@AE@JAADD@@D@A@IDAD@ADD@JHHE@@DJH@@" "D@DHHEB@@JB@JBAB@A@EDBIBB@I@@H@HJHABEEDDDD@HDAA@AB@HJ@DDE@JBI@D@HHBDKAD@DBJBHFH@@@J@BBAEEA@@EEAEBBJCDABJIA@JJ@HABD@IDJDDDHMHIAABIDHABD@HBJHDDJJDAFBJBEDEE@@DEEDBB@BH@@@K@JBJA@ADFIB@HHA@DJBHEAA@BHHBD@DDA@HAAAAEEBD@JHH@H@DHBBDJAE@D@BDBBHBBH@BE@HI@A@@@" "ABIAE@@BE@DE@DDDJJ@HADBDDE@EEBIA@ADD@@A@I@IBHJDAD@JA@HHHJE@H@FIEADDKHJAE@J@DBIEBEE@EDDD@@BBI@@LJDJEMHJ@@@BB@@IABDAEBI@HJIB@BDJHHDJEDABDDH@BB@@@BHMMBIBIH@DJB@@AAAE@EEBEDJA@BHEDBHNIADEDK@@HEBHHHHDBHADABHJDHDHD@@AAD@DDJEE@EAABAD@HBJIAA@EA@EB@@EDDJD@@@" "DDDB@EEDHBHHBIAA@@EADAD@HHB@@D@BEBAAEEDBBAB@A@@J@J@DBAAAA@BAE@B@B@IEG@D@B@JHHDLDH@A@@HIEBHDBBEJDIFLBI@EBJHDIBBBD@D@DJJB@DDJIA@BBJI@A@ABBBDI@JJE@DJAKDIBMBBA@JEDHH@D@@IAI@HJHB@A@GEDHB@B@EDB@DDDDBA@BHBH@D@BDBBAEEDDBEB@A@@B@HHADADE@@DDDJ@HJ@IEE@BAAA@@@" "E@IDI@@@ADBBD@DDEDHFAD@EABDJJHED@@JD@@ADHD@BHBJ@E@EADJDDLEDJ@EDEDICHJDKJDJ@ABIA@ABBBIB@@DBHHDIDJEEAEJBHD@BHBDHDABHECJI@JKIHLNJHDJNE@JDA@IB@J@A@JBMDEEBIDI@HJA@@BDJBBD@DDJD@BIBNIBHNDIEAE@BIEAIABIDE@E@BJ@J@A@ID@@ABH@AE@JJIBDE@ADC@IEAA@ABBAD@@@DIDHE@@@" "HED@BJEED@HHABIA@ABHH@JHB@H@@BH@JJ@IEEEEBIEDAD@JHDHDA@A@I@A@JHBH@@DJLIE@IADJIBFJJDDDBDJJ@HAA@AMDKDLJHJAAE@BHIBHDDAHJEJEAFFBCCDEBMBHLAA@JDHJ@EDDBHJIIFIEL@DD@HBJIBAAABJKBDJIDDHEDIJI@@@J@JHD@DHD@DA@I@JHADAEDJEEEEDHBJH@J@@@HB@JH@HJD@DDJD@HHAEEBJ@AE@H@@" "DHAAH@H@AE@BHD@DED@EBI@ADJAEE@AE@@E@@@AEDBH@JAE@AAEADEDADEDEDBHBIAAHCDBEBDA@BDE@@A@IHA@@EABBBJIAEAAEJ@JDHBHBBDBI@DEDJDHD@IHLHA@IBIEA@DJABB@J@IBHBMDDEDDJJBBDE@@D@LHD@@EAB@DABEBAF@LDDJ@JAEAEADAEADEDD@EDBH@JAED@@@E@@ED@EEDBID@DJE@AEA@A@J@ED@@H@LD@I@@@" "I@LBBJBID@BHAAEA@AC@HBBJ@@D@@EB@BJHEEEBAIHAE@J@BJD@DA@ABI@A@@HBHBBBBLIDHHIDEEBJOJDE@BLBJHDBLH@JDJFJKDJ@HBJEMHJH@DIJJHKBINDBACLJFHJJLI@@JHMMBJ@HBIFJKBIBH@IJA@JJAJ@EABOJJEEADHHIDIJBBB@J@H@D@DJD@DA@ABJ@BHED@LLBEEE@JJ@BE@@A@@BJB@HFD@DEDD@J@ADJBJBAHDH@@" "BAAED@HBAEDBJD@DDJDGBHD@JJIEE@EED@BH@HDJFBJ@B@ED@HJIDBJDJBHEEADBHDMDBBAACAAABDALLI@CJAD@BAD@AEDIDIEEIAFBHEKBB@EEABEFKDLB@IEDHBAIFKEBDEE@BBFM@JCDDMEDIDIED@ADB@ADBN@DIILABDDDFDDBBAEI@JADEE@JBIBJADJHHAE@B@BJCBI@H@J@AEE@EEDJJHA@JGABIA@ABJAEDB@HAEDDB@@@" "HJD@ABBHJ@@H@@JEI@BHDBJJ@@B@@BH@@JHBKEA@IHAEDJHAEA@DAD@@HDBH@BADAIH@I@JBDJFJDIDIIBBDDJ@JHJAJJ@MCBJHIDDADBJBDHI@@DDJINIIEEDEAEEDLKLJIA@@DHIBBJADAADHJJFEHBJLBHJHBIABBDLIDIBKBIBBHDH@LLADB@@JA@H@ADA@DED@JIED@LHDEFJ@JH@@J@@B@@BJJA@J@DMBH@@H@BHJBD@ABHH@@" "B@JJDDHB@JJAEE@HBDHEAD@@JJHJJDBJI@BIFHEEBGD@A@BJ@BEHJADJNI@BIDJABCBIDGDEBHHDIBCBFDDIIHE@B@D@@EJLJJKGIADAD@HIBBJJAAJKMKBH@A@D@@JFMNJLDBJJBDHHADADDOFJJIJM@@A@B@E@LLIACBFBDI@HJEAGADJFBDBIDJ@DKJIDBHMB@BJ@D@AGBEE@KDJ@DJJABJHJJH@ADE@IB@HEEDBJHB@IABJHB@@@" "DJ@@IABHJ@@J@@EBHIEHDAEB@@B@@ID@BBHBHA@@DJAEDBH@JHHA@JA@HBBHBA@DDLDBC@@HDJAAE@HHLHJBFBHBHDIEDHMBEEDJKJAD@JBBDH@@DD@FJLDBIBEBDJAAJK@AA@@@IBBBHADBNJIEEBEHIEDI@J@JCBBHIHHHEDDBI@H@FBAAIA@DB@JB@HDBHD@HJH@JAEDBI@@D@J@JB@ADH@B@@BEDA@MDHJE@@BH@BHJDDH@BI@@@" "A@FJADDBAEB@EE@DBB@BID@DJIDEEBAEDDBDJJBIADL@ADBJ@BBJE@DDMDDBHJDIIJHHHEEAJABEBEBBKBHJHIBDBIE@MEHEDJEGH@JAEHJIABJJKIBIOJJLBEEEBAJJOLJDNJJJDDJHMDBH@OEBIE@MEHEDJABDHJHJFJBEBEBDBLEE@HHJLLIBHJAAEIA@EBJB@BJAD@AIDDJBJIBAAEDBEEADJI@ADJ@BBA@EE@BEDBAADBK@D@@@" "DDH@JAADD@DJH@EADHJHBAEA@B@H@HJ@@IDK@@DBDABJJAD@JED@HBKHJ@IDAA@KB@AAEA@J@EDJNJDDFHEEEDDJMBJICHEDJHJMAC@J@EBDDD@@FJDBEBIJHIEDHJLJEBABK@@AAABE@BHFDEJHJIE@NDJJEJIAEEE@KAABKJIE@BHDEDD@BFHDDADHBHNJ@HAEBHADBJJDABA@@FIDH@BHH@HB@DEDB@JHIDE@@JI@AADDBH@IA@@@" "AABJ@JD@JJH@BJHBBE@BHJ@DEEEBJB@DJ@ABJJHHIDD@@JAE@HABBDBKLE@ABFOJLJJJ@FB@JHAELM@IAKHHHAAJIEEBDELIECIGJFJ@INGIA@JJIMAGODBJABBBDBJAGODELJJHDDOCLHBKBODNEDIMABEEDJLD@HHNLDHEIMD@JHBC@BJJIJOKBD@EANJABBD@HEDBH@AADHHJJJD@BI@BBJEEEA@BHJ@EBB@JJ@@JJHABHBJDD@@@" "DDD@J@HI@@AED@ADI@EDB@EA@@@D@HJI@EDD@@ABBAAEB@D@EEDDHIFLDHBJDHJMA@@@JHEE@BJEIBMBDNGEADFJFMDDHHIBJDBKDHHJCFKDDE@@CJJCCIELJEEEBIMDNFBJN@@EAAFKFBHHIFJABJDHHIAEKBKADEGCIBEJDMBJ@EE@JH@@DEJHIBJ@IAKDHIAEE@A@BEDDBBD@@AAE@DJHHA@@@DE@BAE@DID@AED@@DHHBHAAA@@@" "A@IE@JABBJJ@AEBADDHADJHDBJJHJB@BBHAJJJJHHJJ@DJIE@@AABBJCIED@JGEBJEEE@BH@JJ@IBEHDA@HJJIHI@@IAAAKFDKMFIKA@HOEIA@EEBLEGFBAJADEADBLBCGEAJEE@DDMGHHDFLKENICFLDDDH@DHLJJHHDA@MBDHBJH@J@EEEBJEGBHAEDNBJBDD@@EDJI@BJHHJJJJL@JB@BBHJJJA@JID@IADBED@BJJBDBHEDHD@@@" "JIB@E@JHD@@JJHDJEAEDA@BAD@@A@HJHDBI@@@@BIBDEA@B@EEDDDIDHD@AEADHH@H@@EHBJ@@JBLIBHJFEGMFEDBJ@DBBLIMKJEE@BEANGJDBH@EI@BKDDLJA@DBIIAFJ@DM@@JABOCLEB@EEBNMLIJBA@BJAECEOECBHJDIJBH@BJ@M@@@H@HIDED@A@IDIAAEE@B@DEABDJ@@@@DJA@JHHD@@ADB@DAEDEBI@JJH@A@JHE@BDJH@@" "@BDI@E@BIED@@AA@HD@ADEDDAEEBBE@BHHBJJJJHBDJHBDHJH@BJHBJBIED@LJBBJAEE@BHAFJHDAADA@HHDHIBID@EADEIFLEJMHJDHB@JHIDBIAJEEF@IG@DEA@GDHCEEBLDJADHJHB@IBHMJMAKDMADE@ADJDHI@HHDADDA@JKD@J@EEDBJBBIHAEDJBJ@JJ@@JHIB@JIB@JJJJJ@HJ@EBBEEDAAEAD@A@HDD@@AEDJ@E@DIB@@@@" "JHJBE@JHB@AEEBDBJIFJA@@HD@@DE@EDAAE@@@@BHJEADAB@BDH@AC@D@@AEADHD@J@@BHBJ@@AIDBIBEBBIEDEBCNHD@HJOIKICE@JBHK@JBADBB@HBHIBLDJHJIAJDHJ@HBBADBBHFHJBHEFDNLOJHHA@KNBEAEDJBEBDJADL@@BJ@J@@BHA@IDED@@A@FD@@IB@BDADEBHJ@@@@EDDAE@EA@@A@H@DBKDJJABEED@B@JHEBBHJH@@" "@B@HHB@BDED@@DED@B@ADEEAAEE@HE@ABBJJJJBHBEBD@JHJHIEEBBI@IEDAKI@HJ@BJHAD@JBJBAEBD@DHB@ADDDAKIEBLMNKDNHB@HA@E@HJ@HEEEDBBDJIDJIDJIBBAEEE@HBHHE@D@HB@KIFKMIJEDNLAAAD@B@I@ABEDBBJBHAD@JJ@BHHDNLAEDHDJBEEDHJHJHABEB@JBJJJJBD@E@HEEDDEEAD@B@AEA@@AEAB@B@HHB@@@@" "DHJBADJHHH@JJHHAEDEDA@@BD@@EA@EDDEJ@@@DBHHMAEAE@BB@@DGBEB@ACBDEB@ID@BJ@MDD@IB@H@I@BHED@HIFDFHBIGMEOEIFJBJE@BB@IBHAEAEBKEOKEFOMFJEDED@JDHBB@EBJBKDMGMEODJ@KACDHHAE@J@DH@HBDHAAEHBJ@ADHBEABFD@BEBGA@@BB@EDEDEHHJA@@@BMAAE@DE@@AB@@DAEAED@HJJH@HHJIDBBHI@@@" "AC@HJA@BAAE@@AADB@HADBJH@IE@BE@A@J@IEDI@BBDJ@DBBHDEE@JD@@JDFIA@DJB@JH@IA@JMDDJBJBBHBHAEABA@HEDLOJJ@EJIDMHJBHHJBDBJ@B@FLNJDJIBKIK@B@BJABBHHJBHMIDJM@BJOIIE@HDBDED@J@JBBJBIAEJHDDH@JHBBI@DDKABH@ABHEEA@JBA@BIBB@DIEDHBHD@EB@EDH@JJAD@HBADD@@EDDB@DBHHFD@@@" "DDEB@DEDJD@EEDB@HEAD@D@@IB@BE@EDEEBB@ABEDEI@EADDA@H@BE@JE@JIBDBH@HI@BEBJE@AAAAD@HD@HAD@B@DAABIJMDEOKIEBJB@DBB@HA@@BHENAIDIEDIDLCM@J@@D@HBBA@BBJEDNOMAEJLJDDA@B@AD@HA@HADDDD@EBJEB@DHH@JABDJHEBHEB@@HDAADE@DMAEBD@BBEEAE@EB@BDH@A@ADE@HBAEE@ABIEA@BEAA@@@" "IAJ@HHHA@HJ@@ADDJHBABHHIB@ID@E@@J@DHED@@@HBBHD@IFEBJHJE@@EAFD@HBJBBDHHCFHCDDDBABBHEBJAEDJHJJDFHJKJ@G@JM@HJHHHEBLEDDBK@JBAB@BDBBHFJAAEAJE@HHJHHEJHG@BNJHKABJHJIEDBJE@JBDBAAAF@KF@HIBBBJ@HACDE@@EBHJJECDHA@JB@H@@AE@I@BH@E@ADHBDHHJDB@JIAD@@BHHD@HHHBLDH@@" "BB@EAAADEA@JJH@I@BDHDAAB@EBAE@BE@E@@HABEEBDDAAE@AJD@BE@JE@OHHMBH@HHIBBNIEDAAADJDHDJD@D@@@A@@HKKEJEKOEE@CBIEBADMBI@I@BI@HJHE@JHHDJ@DHDJEIDBEDJF@EEGNMBMFNHH@D@@@A@ABI@IBIDDDAEDKJBDHHH@JEHHOHEBHEB@ABL@EDDAABEEBD@H@E@EB@EDBE@BDDA@IB@DH@JJHDEADDDE@BB@@@" "@HJHBBBA@BE@@ABBEDAEABB@DH@DBEDDBHEEBJDH@DHIED@BJEAEDJB@HEHBA@DEEBBBFH@BJEDBJADAEIFHJIDIDJABAELNDJEE@OGLEFJHJA@DBIBGFBEBIBHJDJEBCGBDJA@DBHJKEAOGHEEBICIMDBDBIDIDJHKDMDADBJAEBJ@@KBBBEEA@DB@M@HBBIEDEBJ@AEDHI@@IBJEE@JAAEBA@@I@BBDEDAEBBD@@EB@DBBB@JHH@@@" "BA@BHDDDEDHBJJDHH@J@DDDDIBJHHH@MDA@@D@ABEAA@@AED@JL@AMDJBICEBI@H@EEMJBJDDJAD@JAB@BEA@BABA@JDJACAEIJKJIDABJ@B@DDHDBELLE@FJD@ABK@EAIMBA@IA@B@BJDADJNJLMDFDBIBHDBDB@DEB@BDBHADBIABJBMME@@HDJEFDJBIEL@AJHAED@@DDEBD@A@@DAEH@HHJJDIAAA@BH@HIBJJ@IEAAA@J@DB@@@" "DBE@BHHI@AAD@@HBBI@JI@HH@@@ABBI@ADBE@ID@HDDBJH@ABHCEDH@@DGD@DBEEEHLBFH@IAEDADIDBJHKFBHD@DB@A@HLJJBEGAGJJH@DHEAABIJJEABILAIEDLALJDEBJLJDDE@I@@JJODGEBBJIHHD@BA@A@JCFHJJADIDAEDDH@KBAHMEEBA@AGA@@@IEF@JD@@JJAA@HADHEBAD@DJBD@@@@HHDJHDJB@H@ADD@DHHJ@EBA@@@" "IDHBHAA@EDB@JIADHBB@BIAABJJJIOBBD@HHEBHJBIAD@BIFDAEHGIEJILJDHLI@BEADKBJBEFIBAB@H@KLIDBHJHDIDECIEHIJJJKEEGDIA@DHJJBEDBEKIEG@GEDNMBAEBBJHI@DDIGEEFJJJLHMDNEADI@JHJADINH@HBDBDKEBBJFIDEB@DIHIBILJMDO@MDACDJ@ADDJBHJE@HHABBGLJJJJDDDJ@BB@IDDJHBAE@DD@J@IDH@@" "AABDABJBH@DIEBD@BHDJHBBBD@@BJ@DDIABBHHA@HBB@JHA@ABBEDBHBFI@IBJJELHDADEDHIIBDJHJBIEEGJHE@AABJHDJECBFKKNLLHA@DEACB@HIADKDBJNECJJAFIDDHHBFDEA@D@IIKNNKBFEBI@JJDD@E@JOEEDJBHJIBDLHIEADA@IMBJJDHDKB@JAEBBD@D@JHBB@HD@HJBDDIA@BJ@@ABBB@JI@J@ABEDI@@JBJDABDD@@@" "BDHIDD@DEBJB@@HIHBI@A@DDABMEDJHH@B@HBBJBDHDJHABDJDDJMHBMIBEDDHEJABHJBJKKFAFMHB@LBOKODA@DJEE@EKDJDIDGBJIKBJC@JJLDIBFDCDMEEEJMEEEIFACBDIAJJHFBJFLJJGADIBIFM@EEBI@DAGNOJAHB@MKDCFNJJBHJDBM@IAEBDMJ@MJIABIBD@JI@IBBJB@HB@@HJIEEJDAA@D@DJ@LHH@BBJEA@AADHIB@@@" "DIB@AADI@DA@DBABBHBBJJI@HEC@A@AAEDBAHH@EIDID@JDA@@ICDADJDDHAAEJDJHA@JJDFIC@ICLJ@HJNILJBA@JNGKEMEEDMNHLFBDEDGMGEAKDIALMDJIJMJLJIEILDIFLEGEOAEABCAHKMIEEEMFOCJHDBBILKJHHBINDHFDKABJHD@JIBMDD@IABIDAFDH@DABHADIDM@@HLBAEDD@D@FE@HDJJJB@JBDBA@DA@DIDD@BDI@@@" "IDDJDDA@EADEHLJ@HJID@@BEBLHCDBIB@ADJABJHDABAEBIFJIBEIBKBJJEFFKEEMKNKEAADFDEBJABIAEOOI@DDEAJMFKEECJDKKHHHIHEMJHHJ@ABBGCEDKFJKFIEFGBBD@BHHJMM@LHHHNNIBNEEFKEJLEAA@DOOMDDJDBJEACADDEFKNMMEFKCEBJJFJDMBDJKDJEDBDA@JJDBID@BDJAF@IJEB@@ADJHHBIHMADE@DAABIADH@@" "BAI@IADBHDA@AA@EB@BABJDA@JBDADB@ID@@JE@BHDEDADB@@BDKBELED@H@HDFBABADDDBJHI@DDJJBBN@BJE@JJOFKEFLJLIIOFEEEDBKIEEB@JJEELN@KDHE@IFHCIMEBJHBEEDNJAEEECGLLIJIKEFKGJJHEBJ@CJBBJIA@DHJJAAADBDBCA@H@HAEAMBFIB@@BADAEA@J@EBH@ADHBADABBHDABJDB@BE@DD@DA@JADDHDLB@@@" "HJBEBDA@B@JEDDJJDEDJD@HJGIDHDA@EB@EE@DE@AJHHJBHJDHJFHJABJICBOIMMBDJIAAD@JBBIABBLLEONHHAAAKMEGIKECGEFDH@@IEKAH@EG@IHAEIKOOOEGOONLMD@LHGE@@LFMDH@@ICEGFEFLOEENLDD@HKOMAIJBDDJBBHADDDJIBEMLOJFDJJDBHKBHIBHJBHHJL@EA@EE@BE@DA@IDOBHHABIEABJIAEBHB@DABEBBHH@@" "B@H@HIDDHE@@A@@@JHAAAECBID@AADE@@HH@DI@EF@B@@MB@IB@L@EDDDBDDBGBDDA@BDDAE@HEBDDDABKEENBDDGEDJHE@JJLJBJBJKJGBCEELDEBBDKFEJJJJJJJMCFIBBEAAMEFBGBNJJBJBIJJHE@JIEGAABCMEFJDAAABE@HEDAAB@DAABGBAABAAAE@AHBDHBEH@B@CE@DI@@HH@EADD@ADJFEDDD@JH@@D@@E@IADHH@HB@@@" "LKBJBBAABHKEDEJJ@DJDDADMDIEBDA@EBAAEABDIADHJIJ@EBDJIBJEACHIALHJJADEDIADBFBHDHHJJEEJJHHICMJIKGONEMIJKAD@IAMGEJBAM@EDKEIICEOJOMFDLMFIE@ELBBMGELDHADFJLMMCOOFLJMNDHHJJMEBJHHI@JCBADDIEADBJHILDHNDEBJDJIBE@BLJHIDDIBDEDDBE@DABEDIEIDAABI@BJMAEFHJDDBBBJFIH@@" "ADD@IEDD@B@AA@A@EADIBJI@AB@D@HA@DJB@DDIBDAA@CDJH@J@JDM@DDEJFIBADJABBBDADHHBIEE@@DKDINBBJOEBDHABMCEEJLIBBFKLIGDJADHA@JBNLKDMIFIKJBHD@IDBIGDINKBBDIJMEFEJD@IBEGJJBCLIFI@@EEDJ@HIDABBBDBIDBDKBMAA@EIBHBH@JIF@DDABDIA@BBI@D@HA@BD@DJJDIDE@D@DD@B@AAEDHAAD@@@" "HIBKD@AABHJDDENJIFBBMIBJJDJIEBJA@@HJAEBDJJJEDE@BJ@KDIJBHJJAMDDJB@JHHHABBBEEB@@EJIFGGJMOOMMDMKOMBMKCCCFDDMKEABA@J@EDGGEMKKMJMNNMMGGAE@BHDBDEFMIACFFFFMJEONMIEMOOMJOGCDJM@@BEEBBBD@HHJHBBIAELBJHJBLIFHBJ@EAEBJJIBEDBHH@DBJEDJIBJJDMJBCDJKMAABHJDD@AFJDHH@@" "CBI@AJDDDB@IACEDB@HMJBD@@J@BH@@DBJB@F@DI@@@HAJAB@JBABDHA@@KAA@@HJ@BBADDID@@DMBH@BMHMDCFEEBIAFA@FADNFHEHIEGJBDDBAIHADHKBIFJOJKDJFHID@LLBAABBOEDHM@KCIDC@DCDDJEECFAEHMJ@@JEI@@ADIADBB@BHH@DDFH@D@IBDBBHBDBL@H@@DI@C@BBJA@@@J@BH@ABBMHHBAEFDDHBAAABL@DJF@@@" "DDDFJ@JAAHEBFHHMDJEJADIEB@JHADJID@@DHJIEDJEBJ@FDJ@FJFJBJEBJEDEEE@JDEFAABBLJI@DAJMKGEOEMJOEDMHJOLKK@IBKABJKDJJEDCBEDAGHJEKGJOFMBHODAEBFAEBJIFJJDFJDHFNIOJHMIEGJMMGMGFMJLA@DJIJBDDCEABHEEEAEBJEBJBKBK@BIC@BJEBIEDJHI@@ADJID@JHBEDIDBMBIEHHKBE@LDBHBKAAA@@@" "ABI@AB@JBDHEMBECAEKDJAD@HE@BJA@@@JJHJ@@@A@HD@JHI@JMDIJL@HEEDA@A@E@HH@JDDHA@BEACGFFIGFOJE@@J@EEBKLFEEHDJEEGIKDF@KDLAGAE@IJJOJJLHEDGDAIFHCAFLOEEBI@MECANJEE@BH@EBOKGDKCGFDEB@D@IABH@HHE@D@DAEE@HAJLIEJHDHJHA@HD@@@BHJJH@@DBJ@E@HADBIFMDFEBEM@IBBHBD@DJD@@@" "HHBDJDJ@EIBNEM@JKFJIACAFBHBHBDBJI@@A@EBJJAA@J@DBBAJ@JDABADHADEDJHEBCJ@IIBJBDIDEI@IFMOMEJNO@JK@NEEHJKCKLEEKEE@LI@AMDAEJJFOGJOGKBJMDAEL@DIHEEFMEANNFJHMECHFJHGKJMEOMKDHDMADIBBJDLHBNBE@JIEAD@IDBDABHBLBBA@BHDDBJJE@D@@DJJAB@J@JCDFDDJKFJHEMCJDM@BIBIB@HH@@" "CADIAA@DHEECBHBCFIBBDDF@HADADHH@BBEBBHD@@JBEBIAEFIEEMADDJCBLA@A@BHHDEDJBD@DIBACCEBEOMKOMA@EEFGHJJBDEDBAJMCJKEAJED@AMKJ@MEFOKEEHBNML@AEBLEFJNEJLBAEABBJHOCEE@DEONMOMBEFFDBDI@ABBIEA@HJ@D@DAJFBIADEMEDKEDDJEBBH@A@JBEBB@@HIDAD@HCAABBDKFB@JFEE@I@DDDIDF@@@" "DFEBJBBIBHAFHMEEMBDHIA@JBJAFIBBJHDHDDBAEE@HHDBDD@CJODJBI@LDAEDJFHBECHA@HJJIBJJENJEGOONBJJNMBMMCFEDIKADJEFGMMGGBH@MDCFMODIEJMDIGMKFAEH@JGGEMOCEBIDFLIECFEMJEKJJJCOOOEBKMBJJDJJHHD@NEB@KBIEDAAHDJBIGJN@AABA@HHEEDBAA@I@JJBDKDBJBHDDHIBEMEEHKD@JDJBBJECA@@@" "A@HDDDDDD@JHBH@ABDIBBDE@H@J@BHH@@JAAJHJ@@DBBIDHIDLEHO@HBEC@J@A@HEDHDBDDK@@BD@DKI@LMDIEOCGIKMJBLIHHBKFIBMHOKOJ@DJI@AFKBHEBJGBJE@JFKD@DJI@BONOHMJDKFJ@HLIJBMNLOFGMDIEIHDNI@AB@@FIABA@IE@HD@BHFEB@HGHMAIDHIDJBA@@BHJLDBH@@HJ@BH@HEABBDIBD@@J@JHAAAAAA@HD@@@" "JEBI@JEAAECJJIEELIBDHHJEEE@EDBBJE@DB@B@JEADDBAEBAJNEAEBDJLEBJJEEIEBADDIHFJJIEANNOKKOOOFDMKGFOOEFCANFIBDJGFJIFMKEJEBKGMGMFMOMKEOEOFJEBMFMKDJKGBIBDKCLFCEGOKGFMICGOONNOKKLEDJJK@LIADBEDMEBJJEAJIBEDECJLBEDBAADEBHB@BA@EBJBAE@EEEBHHIBDIMEDJJNEDDEBHDJEBH@@" "BHDDDHHDD@FB@B@@IBDIEBI@@@DIBHH@@DIDJHJ@HB@HHJ@HJMHHJBHJEBHDDHIBBFHJ@IBBHI@BBOIMMFNKDAMMIBLNMBNHLJAKEDKDHKMOEABB@HEDFOMBHBMJ@JEOKAE@HBBDEGMNHIFIEFLBIHKJEKIJDMMLAFKKEMLOJB@DHJBDHBHKBBDHIA@JEBHJBHHMJHHBHHHB@HBHJIDI@@@HJDI@@@DJEDIBDH@B@BC@AA@HIAA@J@@@" "LBIBIBE@JJKDJHJMJJIBHDJFJDMBDJBJEA@A@J@JADECE@NCMKFKBLBHIJFJIBDDLKCDMBLJEBEDLKGGKEEOMEFJKMGMJNIBBINKHADMCGKMNEMEEBDAGOCGJDJIBOFGODABEEEMCMNOFEID@NKLJBDKJMOENJKEEOMEFOGFIIEBEBIJEIFFIIABDJKBLHJAJFKFMNCHEFEADBHBHD@DEBJBIBEIBKBI@JDJJMJHJIFJJHEBDJDJAH@@" "AEBHBDHI@DFJDA@ABDDDCIA@@I@IE@H@HDDJE@E@B@HD@EANANHHDADEFA@BDJIIAFDA@DADJDIECMMINGGNJKHEKFKCDAGFICEGEGGAFOFKAKABDHIGFNONHMOMHKOKKGDHIBDFLFKGKDGGEGEFDKGDAFFKFM@NJKOGCLMMNEDIBIDA@DACDDLJIB@DCEADA@HKLCLE@A@HB@E@EBIA@H@HEDHDH@DDNAAABD@DABKA@DHIB@JED@@@" "KBEADIBBEAEAAFEDLHJINNJJJBEE@EAEBIA@HDHBLIBIEJODKEEBIJAJHJEDJ@DBJGHJBIDIHIB@FKEGDKMCMFBKBIFFAJNIBEMF@@JKEFMLN@FDJJDHGOJEEDMIEEBOO@IBJIC@CIMKEFJH@CEMBDKJLCCDJFJCENENIGEFK@BDHLIDJBHOBJA@BIEBHJLBLJEEFIGJMDJDIJ@I@HDDJEDE@EEBBJJKKLJHIIECDDEDEBBDIDEBFH@@" "HDHBBBEEHDKDBIDAAEHJKAJ@@HH@BHB@DBDEAABDABDBB@JIBNBJBAFFEDHJABIFBNAADBBBEDIGNMJLGGGNAENIFBMGNBIFFIDEJOLJJOGKNONKJAKFNMEJIEGEDJMEKKFLBNKOKNOGJJIOJMADKCDJCOEJCDKMDCOGGAJMKODIEBBBADDCJCDJDBHIECCDBBJCJDJHBBABDABDDEABA@B@J@@HH@BLFJHMDDADJAFI@MEBBB@I@H@@" "BJBLLLH@BICAEFIDFDCGLEDMCEBIDEDEADIAFDDIDE@HMODJEJHDOOKMBAE@JDK@LEBFADMEJKBDEBOOMJJGOJMBHMDJKFNIHEMKEKEFMFMFIJIMCOBIMKIEFIMLKEDNMLJGNELJLKEKEKEFMFMM@LKKFJIEHJEJOOBJMOOJEABFJMEIDCBEAHFIBHEDBENOOI@JMBIGMHHEADIACDDIDEAEADJEFEIEAOFACADKEDFDJ@@IIIJBJ@@@" "DHMAAABJJBJJJEJBMIFMFII@D@DBA@@HDADJ@IABA@CCJDI@KNKKJEDLIJ@CBI@EAGDHHB@JBKENOOIKCGEOJGJEE@IGMMMGBKJCKFHMNJNMNNJBJ@MNGOFJMEOMEJKGOCMHBJBKKMKJKMHKFNBNJGEMMODHEEBOBOMGFFLOOKMFJBHB@HIGDE@DJF@BLIIEBNNKNHDIBNF@DBDDHBIDA@H@DBA@A@DLKEKDMJBMBJJJBJJDDDEHI@@@" "IC@DFDDDHFCI@JDLJDEJLKDJJJIDJIEBHJ@@MBBDDEDFDIBEAKMEDHBKD@JDDBJJJFABCBJEMJMIJ@GDDMOKEHBIDEGJKCFHDJLIFIJKIKEMEBMLMOJJNJJIAE@EDDJJKJJOMIMJEEMFLNJLKDIJI@KFFJOEADJ@MFOMIAG@BLMJMMBJFBDCBJJJAABHAFJ@IEENLEBDICAEAABBEH@BHJEDJIDJJJIFIJMABIIBHDNC@IAACA@FDH@@" "EDEHHIAABHMBFMKAJINEADJ@@@BA@B@DA@IB@DDHHHCJIDHJOJIEACDNAEDIABDHHNJHHDDHAGIOGEJKOBCFKGMGMJJAJNGCIGEGKEGCGGOJJMNKKJIMFJDBD@OHABABKELJNNKMJJOOGFGEFOEGDNGCJLBJMOEOFKFBGNJMGGLOD@IA@HJKHHIBDDIEDCIFDEDJOJHIDJN@HHIA@BDHDA@B@DB@@@BIDECLJLFMKBEHJDDDHHMAE@@@" "JBJCBDJJDEKDIADNEKEJDKHIEBDJEDJJJEJDMHJEAEMEEBEECMBJFDBKJIBBJLICCEDEBIACE@OEJKEL@DLEJKCNNEDJICNLEMJKDIENJHMEGNAMEEBBIEIHIEBEDHLMDJBEEELCOEEHJKMDIFJMMAKNDJIECKNFJMAI@AMFJMGHEFDDJEAEFFDIJJBDJNJACBJENEEBEEEMDEBHMIBMBJJIEBIBEDHNIBMFMCIDDIFMABJIBFBJBH@@" "DI@HFI@BINDIBECHKBNDJLBB@DII@ID@@J@I@AABBHEDHHJJOCIA@IDNEBDDBABDDGA@EBDDEOJLEKMKOMBHLJDMDJAFBMMAMIEDIJJJECKGMANKMJMNGKFBBAEDBBCFOCMJMNKLEOFNEBJJLIEDMLEMJCDBIEIBIHJEONMNMAJOMAABE@DGAABDBAABECIDHDDNGJJHHIE@JBDD@DHBH@ADHDLI@BBAJICJFHNEBDICLJ@DK@HDI@@@" "IBEE@BEDBDIFLJDBBKAB@IDEEABBIB@EE@JBJJDHEOEICGEEBIBEEBDKHHHIDDLJJNHDHBHIGJMKKKGGFHOCCNIJNEBKHBJJBNIMFECMOEBHBNEJJEFHIBLHHDJI@HIJDHKEBJMCJ@JEGMNECELKJBJJ@NJECJLKNFGHKGGFNNMJODHJ@I@KJJIIADHHHNIBEEBDJEEGFDMGM@IBJJBHEE@BDJBDEEADHBDFJBABIKDIBAEB@EEBDH@@" "BDI@FDHIEIBJMDJHKFDDMEDH@JDOBHIH@J@HHHIBJHJBDHHHGCED@DIMBIAB@IADIEBEBDBJMJJFOJLNMOKLLEBCMLDEBHJHIJJJMJNJEBFEEIJEHHIEBEKAAAMLDDFMBEDHHMBLMECBEBKJMJJJLHJHJEAAMNBEAINOMKIJOKBJMJJABEBEDIDDHBDDJELI@AEFG@HHIBBHJJDHHHHBH@LHJGIBH@IEEIACFHJIEJJDMDHIC@DIB@@@" "LIBE@JJCBBDMKKLJJJMA@KABJ@IMDFBCJ@JBBBBDMNIEIBCCFJHKEBBJJCFJEBDABGDHDMDINMDMFCOAKEOKKMEONKAMDBMGKKIMIEKDJDIJBB@HBAD@EJ@BBFJKBB@BM@ADB@HBBBLIBIFMDMLNNOEJAELFKOMENNOMFLGNCEIEKLIEI@IGBDABEBKFBJJBEFHJKFFBDMDKMIBBBBBHBNBCAELHBJDFHDEJJJINNMIBBFBJHEBDIH@@" "ABDHEDHNHNIJDDIJCEHFKEFD@JBKAMDH@J@EEDJNI@JDBDLDGEJL@DLIJH@@IDJMDMEBI@EBMMBJOLLEEEBKOGKNMDGCAEOIBNBOFIGNDJB@DDJBHJAEJMFHDIOLI@KEJMDBHJBIA@BBICODKGJCJDOMDFGAEKNOGNJEEEAIOJJEMJE@DJEEIEJIDH@@JLII@AJMGAAIBABHDKJIEE@BH@IELFJBHACEFK@MFBLIABLKHKHIE@IBD@@@" "JFIBIACDC@BIJIMDMJOH@JJIE@JOFNHBE@LHBAEIBNABHIAAEAEJJIAMBBJJBBDBCGLDDDHEODJMOGJJKBOGFOGKNJHMHBJNMCEJLGN@J@HHHH@HB@D@GJ@BHBBB@J@BO@A@B@H@HHHHBHCOAJMFEKJJ@MHJKNOGKGGJFJJOGMJIGM@IAAAOFBABBBJJBELDJJMDEDDDHJDCJDMDB@IHEB@KKGJHEDJJH@OJMIELJLJ@FAFDDJDKBH@@" "BHBEBEDIDDHL@JIBCELGODID@AGNKIEBHEEBLJJBEHJ@BBDKGKNN@BGMODAEEHHHMMMABIEKMGFJLMMEEEFEONOGM@OKKDGJIOOOKOEM@JBAAADBHJIDHMMDBHMHJAEMHIDJHJADDDBBHEMGNOOOLJOAFNOHEOGKOMCEEEEMIJKGENMDJDEMMHHHMEDAGMOB@CKNOFIBB@BHMBBJIJEE@JEDNKOD@ADIGOAMFBDJHAHIADIEBEB@J@@@" "JEDHFJJJ@IBKOKOLKKKKHICIDJMKNEHDBHLEAFLHKGDDIDIBKFKMDLFCNAD@DBKFCOFIDDEFJFNKICNJJEOKAMMONBLEDAEEFBOFMDJDM@HJDBADA@BAEBCJHB@B@JNBEDB@DADBABHHEIBIEKGJCEEDAEAJCOMMLFOMBJKNDNKKBKEAADKGNCFJA@ADCNCAIENKFJDIDIAGFHIKDEAHJA@MCNMJIDNDHNNNNIONONJDHBJJK@IEBH@@" "DHEBHEA@IBDJIGJGEEFEGBEBEBKGMDNMGKEJEIABCM@IBEBEGIJMA@MNJJADIDH@OFLBAAKEBMMOFNMEEMFFOBKGGLIJMBGJHKJEBIAI@BB@@DDABEDD@EDMEDJIEEIE@AAEBDAA@@BB@DLDJEBNHJOBEJLIOGFJGKCEMEEKKGMMJEFLDBAKGH@IDIDBJKMHDEJLOEBEBDHENBDDMBMFOEKIEOFJEBEBGECEEGBODJIBDHDE@JE@I@@@" "IBHEBJLIBDIGFJMJCJJJHMJHHEGKJIEJLDNDKBDDFOFBDHDHNJCOJACEO@KAKABMCMMDBNFNMGKDMKKJJHNMEOOMNAOEJEGMEDDHEEF@EDHDJHHDE@@JKNI@@A@D@@DKNJH@EA@HJI@IE@CEE@IAEEOEBMGLCMOOMEKHJJNNMIFOEKKCJAEMNEJDFLFHGMFDBONBKHI@IBCGKAABFICIAJMDJNOE@HJMHJJJNBMJKGDIBDIJJE@JDH@@" "DECDEDACDIBFICJOGDMEGBMB@KNKDEGEAAEA@DI@IJ@LMBICMBJMHFGKFE@D@BD@GGJIOAGIGM@CCNDAGMHIDBEGMBJCCBOADJIBHB@DH@BH@BBH@BJIDIB@JJGBJHBDIDJJ@@JB@@J@@I@B@JDJIDGJFFBJEOEBADHMODACNF@EODODGLJOG@AB@A@ECFOC@MJJENDJEIHBLHDI@DEDDEGEAFKNHBEJGEEIGGJNDKBDIFDAEAFEA@@@" "BNNOMMMDABEEFOEJECMJJNKNOOEGIMILJENJJIBEGBMA@EBDODKKDIGONHFKJLIJKOFCFNMGOBFNNIIJKJFJIEKFNFMNLFLNILB@BHJI@JHAJHHBJDEFIBDKB@HHBFIBDKEABJ@HJL@JHDJHJ@BALKIKAKMKCKFMDJKBNJLLKKKBGOEKKFCGNJLIJNK@KOODIFNIGIBE@DEJGEBDJJKMBILMLOEGOKNKJJMNEBMGKEEBDAEMMOKKJ@@@" "DIDHJKEKBE@GKFJBKEKEJKGEEJMJJMEI@IN@DJDHBK@DJNDIMIBDIDEGKBHGGIBBGMMNMJJJNMIEHJBAFLIABEBMLJIAEFI@BADBHB@BB@BD@BEEBJIEBEA@DKBFI@DEBEDJJEEB@AB@BB@B@JADB@DKEDDJIMJEBDDIKDBBHMDMKJJJMKMMOBBDOG@JFOEADIBDMLICJI@FJ@IBI@CLHDMEJJMJMEGFJMFMFJBKFO@EBFMFJHIDI@@@" "EFIDHJKFLHEEDKOMGGJKEFJNIGKGEKDFEAFIAAABFBEBDJIBKBCIKEONNDAFOJIDEGGEGEEOMKGGGIDJKIFJHIDKOJOMOINJDJ@DADEDDJHIEEJJDEE@DIFJKFMKFJKDI@EEABJMEDHJIAEADA@BIBKLOMOJONIDHJKDNJIDOGGFMOMEGEGGEADJOKDACKOMFLNBFJDJIBEBCBDDDDKDECAFMGFODKJKEFJOGEONIEE@IKFJHIDKE@@@" "HIBICBDIGA@GCOEFLIOEKOCECEFL@@IGHELBJDDDJK@HJOKENDFGJKFOKIFGMDJEOMOMJKEFGFHOMBIADLK@BBKOGEJK@DI@H@BHJ@HHIDBDIEBDID@FIEJIJD@ABLJMDK@ADIBEDIBADHHHBHJ@@HDI@FJMGGNJB@FIIDDJEOHKGCEFJMOMOMBIEOCDNOKFJOCACMFOJHHFJIAABJAM@ODH@AKEFEFGNMGLIKEGNG@DGDIBFDJDHH@@" "CCEBDHMBMFJJOFJKMOEGFNEOFOKLMFFIGAEIBJIECBEAONJHLHJKENMGEEEOKIAGGEKCGJOMJHKMJIJNIEFKJMMFNJMNOKJEAADB@IBCBBHIBBHIBIGIJIDJEBHJEBIDJLODJDHJBDHJBFBDHBADDEBNOKMJKKEMJNKEDKJLJMNHJMOJOFFMGGDDNOMEEGEKMFJHIHJKOLEBFEDJJDMDGDKCEINOKGMCKGEGMNJKGJJKEJEHIBEFF@@@" "DDDHJB@EG@BEJMMFHBJJMJKEMKGIJMEBLEFBLBE@FJHJKEOEKACEOEGNKBOEGFDJKNFNNEHFMGJKNFIIBOOMEKOMJKICJDDHBB@HIBELJHBBDDBAEBHDDBA@HHB@HHDBAA@JEDBAABB@JIMBDHHBB@IABNDNJMONMEOOJDLKCNJOEK@MCKKCNJICGEGJFKOEGMFDFMGMFJHJK@EBAJCEAJEEJLOFMMFJMJJJ@KEMJMB@GE@BBHIAA@@@" "JIBAADMIFMMOOKNOELKJJDKOKNODFFGEKINKKDHFJEEGONJIFBJKHIEKOOKOOHJGGEMKOMGKMOOONMKGEOICCOKGMFOOOEABHDEBBJJB@ADD@IEFJFEIADJEBBEBBEBIDDMCBKEDHAAD@BBJJBEA@JDEGOOKEOFONFDOMGFMKOOOMNOEONMMGGBHOONOONMDHNJJCDJKOOEEBK@IFNKLNMGCCAGKNONIBJNIMGKNOOMMKDMIDDBDJH@@" "ABEBJABGMFKOMGIIJJDEKJFOGCMHNLNHNJJBNKGMGKENKKKDLJD@ODGODGGEMEMNNNIOJKMECDBJEADHGODDCGNJAEOKE@J@AADDI@@HDJAAEFJHHI@@B@@HDHMHI@H@B@@DHHJKEDDBI@H@DIADD@BHEFOMDBKOFAAGO@IDEBJAFEENJOLKKKMMEMGGAGOAGHABIIFNNKMFOEOFKJBJKHKIKHMNGGKBNMABJLLOEONKEOBDBJEBD@@@" "JDJFBOELBIBMCKDFOLJJDKKMONOE@EJOKMOOONJJJOOOOGOKGGKOMMNLKIBKOOKOKJKFFFKKDKMFNOMOMKKKOOKHOMGJJGMFJJKMEDJJI@DDBABEEDAADOMEAA@DDEEOIDDAEEBDBAA@DJJIEENJJKEOBJOEOHNOONNNMOMOKKENIFNKCCFJNONOONJDNIKMMONOGFOOGOOOJJJKOOOMNOJM@EGKOMNNIBJIOKAFNEJDJAMGJCBIBH@@" "DIDHNJFCD@EJKOJHJI@@IDDJBEM@EMABFMFJMEEDFKFKFOEDNKDDKFMKDFKOKNNCNKJNMMEEGNGMLJAACODBEOFOEJNMFHBIEAD@BA@@BBIAIFDJ@@JBCIBJNBEBCJJDNBBH@BICDLDJB@@DB@ADEDJ@KEKJMGKGMBAGNDDBIMOCOEEEMKJNKNCKNONKAFMKFIAFKIEGKFKFKAEEEJKEKBDEM@EMBBIADH@DJHJONJM@AFCBKHIDI@@@" "JBIGIDHHEBJEDGHGEDDJEAEAE@GONHDHIKDIBJJKKOHJMFKMEBKKOMKDJHCDJKOOOOGKEDKOMEIBAADDIFADIFKLOOMJHEMBNAAEDJDJHDBBBHJHJI@DHBDBJDHIBJAB@I@DJHJHJBBA@JIBIEDDCJEM@JMOOINKDIDCDIADDBDMEONIEFOGOOONJIF@JIFMONNJEENKEJHONNJJJDIFLHI@KOO@EDEDEBIAEG@OAEBJE@HIDODJBH@@" "ADC@EABE@DBJAEBJOIAA@B@D@DHJIAACCDABD@BNECGEBDHBJKNOOBDI@@JKGMMEJJJDJKFJJLFDJJIIBDJEBIEIAFOOBJBE@JB@B@AACIDEEB@B@BBJEDHHBH@@J@HIEBJB@B@BEEADNDD@B@BBHEBBJGOKDDMDJEBIBDLJJICAJJKFJIBJJMEMOFJH@DIBGOKNJJ@IBEGFECJ@ABDAFFDDDJHI@A@B@DDDOJJEDBJA@EBDE@FAD@@@" "DILFHJDIDIEHICLBJJBDJHMAEAEEDJJDDIDEADE@JKEGDIEDFCEOFNIBKGKMJGNJEJ@KJEEEEAHIHBBBDIBIEDIBEOOFOELHD@DJHJJNNBI@@@JHIEFKKEEBDBJJABEEFNKEDHJH@@DJCKJJHJI@A@IMGKGOMBDIEDJDIBBB@LHLEEEEBNHBMBKOBMNOFJDKKGMFCAEDIGEFJHEADEADIABJIEEDEDEHJIBBJJANDHMDIDIBHKALI@@@" "JBA@B@IBAB@CBOJMEBME@B@D@D@@J@@IADADD@HE@EBEKKABMENNMEEFLJEJMIEMKDMJEDHDHJCDCEFMAJDD@ADHJECE@BBBIBIBE@BI@J@BIE@BB@@DBJDDJ@@@BIABJA@@BB@EDJ@BHDJ@EBDJDJBB@EFEBHID@AABLEKEFAFBHI@IEBMIFMMDMJMBIKEEEKKMEJDFNMBE@E@HAADADDH@BH@A@A@B@EEJEEJOJF@BDBDHB@DBBH@@" "EDJEDEBDJJJNONMBJMBIE@IAEAEEAEEBHBJ@HIBHEBEBEFNMFKKOFKIMAMKBJEKADI@ADEGKOMNOMOMJOEKKKFIEAJMNEDLHBEED@EEBE@JDB@BIDEEEFMMJ@MEEHBMMKEEEADJ@BABHEBEE@AEEB@IIECMJLEDKFNNMGJMOMOKMONOEAD@DIDFMBJFMLELNKGNNKEKKEBEBE@JDHHBJ@JEEDEEDEDDHEDJEJJEKOKJJJIBEAEBIE@@@" "DE@HADHIFMOMJMMOMJMDHBBD@D@@D@DBAH@JAEDJHDJDHIKFFBJMABJKOBHM@JDJKBKNKOOGCGDHKFOGJMEEEOEJLEK@JAAEI@@@JH@D@J@HHJDJ@H@IEJJKL@@@ANJJMDH@HBIBHHHBHA@@JH@@DMDDBHFMAJMGMEEEJOGKFHIGFGGONKNJFJIBHEHJGNJJDEJJCCFLHIBI@JIEDBH@LBA@A@@A@ABB@IEJMOMMJMOMKDHID@HEA@@@" "IIEBJAABMKGOOOOFKF@AIDHJJHJJIEADJBE@J@B@BI@ICBFHMOJMFMED@LB@KEKGEONIEIHLLEAOEMMNOKOOOFJGKOFO@MDHBEEE@CBHJ@JAA@IEEAEBBEKOCMEENGNMBBEDEEDHDDBHBHJF@EEEB@IEHGKGNOBKGOONOKMMMGLEAIHLMDKOMGFMFHBAHAEEKEJOMHKBFDHDJ@B@BHEBBIDEDJJHJJHIDL@CFKGOOOOFMJDDBJEDLH@@" "JBADHJD@KNLABEOLDIMDBBA@@I@@B@BABHHE@IDIDBEBDEKOOGEGMBJAEAMOFMFNOFKOKFOKCKO@KJKEMOOOEMKJNNEBM@KBHH@@BHBA@J@DFEFH@I@EMKFFO@@@GKCFMM@DH@KECA@BHDB@J@@@HJFHEJECKJNMMGOOMMFJNHGNNFOKFONKGKKEKGMLEDBJEOEGGONMABEBADIDHE@HJDB@B@@DH@DBBAELIAOMBDAKNHABHIDBBH@@" "HJJAEDMOOGKOMMMCEFHADIBBJBBEHLDJDAE@EBICALJDI@@IJHKLAEEJMNJENKEEEOGEEEIBNOHNJEJLMDJMOGFOEEEEJJJMABEBHBDJB@JHHIEBOBDHBDOLHMEEHIOIB@IBGJEDHHJHBBIB@JEBDEJJJMEEEGKGGMJIEIJMBKHOKJDMEEGGMEEFKMBKMJMEDANHJLH@DIBILFDJE@EDABIAHMBBBJBDID@KEFEMMONOGOMIEDBJHH@@" "KBDJ@KEDJLBJBBJDD@EDADDD@HDHBAI@IB@EBEBDFA@IDDEEGBHBMEGOOKNOMNMFKDMOJMFMMFGKNOECEKLIBMMMGBKFKEDBKDHDBMI@LJDEBCJODNMKMIDKK@@@FNIDMNMKIGJNBEABIHDMJA@IFJAEFKFJGEMMJDINMFEGKNOCEMKEJOMIFKEKMOKNOOOEEJ@JGEEAADHDCABEBE@BDHDLB@I@HAAADAE@AABJBBJAJIEFHBIBFH@@" "HDIIMFJKEKOEDJEBIM@ADA@IEDICDJBCBDKJLJDJHJJBIIIBIMGMKONKOFKKCE@MEKJJOGKGKMIFEFOLJJKOMOFKLDDEENOMMCBAD@BECBIIFMFKOJMBBBKDLEEEAIFJBBEJONKEKDLJFEB@ADBFEMOKMEAAANKGMONJJIOKECDMNOFOGJJNMEHEFFNKGNKONMOELJDLLJBJHJIBIJNIBFBBIFDIEDHDAD@ELJEBIEGNMFJKELLI@H@@" "BJFBBMGDKEBNI@HMB@JJEDJJBABDADHLEEJNADIEEDEEBBBDEGOOOOOOMNMFOOOKEGEOMOEOOKGKNMFKMMMCKKOGBOJJMFAFKELJCFIBJNOGMOMJJEAEDH@ABH@@JD@@IEDEBJMOMOGKJJDKFBIMFKDCEJJOJGGNNNEMMNKEKNOFOOMGMOMGEFOOOKEKMOOOOOOOEABBBEEAEEDIDCJMEAHIDABDBBJIEBJHBEHHDKJEFIGEJBCBJ@@@" "E@IEFIDIDJE@BJB@DJ@@HB@@HJEABIBA@@EEJABHAAHDIEBIANHBGFOGOECOLGMFKMOEKOJMEENNOJKMFCCOFFFMJHJFBDLJH@IELMNEBA@IAABC@JJ@AAEBDEEEABEDD@BJHFBDDDHDBECMIMDH@JIIBCBHJMKCCGNFCENJOKKMEEJONMGMNKEOAONEGOGKGB@KLDJEDI@LD@JDBME@@DBDJDEBHH@B@H@BI@BBJ@EBIDIDKEDHE@@@" "JEFHHDJJI@JDHADJEACEEDJJBE@BEBEDENNKDJICFFBJDBDBEEGMMONOMNKOGOOONKNOFNAGMKGKJKOKOMOFNKNKBKMDNOADBEFIGBDLDDEBJJDDE@AEDB@DI@@@DI@BAED@EAABJJEAAAIBGDKEBADGKIENJFKNKKGMONONJNOFMODCKGKNKOOOOGNKMOKOMMOEEBABABJCCFDJIFKKMAEBEB@EBBJIEEFDEBID@IBHDJJI@HKEBH@@" "DJHCBJIABEHIBFA@HJD@@A@@E@EDHDHBJKJMIEED@IDHJLIEDKMGGKMMGGFMNJJMKOIFOMBJKDOGNFMGDNEGOFMNLEACEJJBHHMDHJIBHHHE@@@I@ED@ADJIBEEEBDJID@AE@DH@@E@HHJDJHIEHHJBJMFDEAKMKGOECIGEKCOGIFJJEOKDONMJJKMKGGEMNOGENIEDIJHIDHAEEDMJNJJ@I@IE@E@@D@@ABHHDCBDHMBDDJJF@JI@@@" "JDEDDIBFDLBBDHJEC@IEEDEDHE@ABIBIAMGJJHIBGDIBIABDABBJOOGFMNGNCOOKFKBEMNDGOAECDIOMMGOFMKOGCNNLKLHHBAHABDDDAABHEEEBJHBJJA@BI@@@DJ@DBJJ@JJEEE@JDDAAABD@LB@HINIKKNGGNMKGOEMOLIFEDGOACMMBFKFOONCOCMKGGOJJBDABDDJDIGBDHJJOELDJDJD@E@IEAEEDHFEBHIBBAICBDIAEABH@@" "BJJIABEHJADHIB@JDFB@@A@AC@EFFJDBGKLEMCBDHJBBBBDIDEDIGNLMMMMLOEMDOOLKKMAFKDGNODNJKG@NKLNMFAFKFCEEDJBDEA@MBDDE@@@D@BH@@DEFOEEEGKEA@@@J@A@@@EAABEHDEABBIEEFCFKDCEKINKHGFJKIGKOAFKDENNIOOIEMGIMMMMIKODIEADIBBBBBHIBFEMANOBABKCE@FD@D@@BCABHBDHIDBHMBDDJJJ@@@" "MDDBJDHBDJABDDI@JHHEDJEDDFH@HBIEOMEKJDDIGHHDIDIBADIBEOKOAJKMCGKIKOECFLBEOAEGLAMEHEOFCKMOINKBLNH@B@HI@DE@DIA@DIBAEDEEDJHEB@HHBE@JIEEAEDBDI@DDI@EA@DHHB@@KIJFKLOMNNCGM@MELAOEDGMBAKFEGNLNOFENJLGNOMBDIDBDIDI@HODIABNMEOMDJ@H@KAAEBIE@HJHDIABDBIB@IBJAAEH@@" "BAIJECBJIBLEBIBFJEBHA@HAA@BEBLBCECEEEBIJHEBMBABIBABDKOGMEGOJEOKBONHBOODGODCNKEFOJKJLKMEJFIFLEGMJMEBBCA@EA@DEABDD@A@@A@BNMJBBMKJ@D@@D@AABDEA@DE@DFBBEEJMOEAKDKBMENIJNJOKEFKNAGOAGOJ@KOJFOMBOOEEOGNIBDBDJDBEJE@JLJEEEFEFBAJEB@DD@HD@JEBKBDJEAJDJJFEBLLB@@@" "DJBDHDDHBDADDDDH@HDBDBDHDDHLJADKFJENLEBABID@IBJDDJDIANOKHNOJKOODNMJKML@KNAFNLBMKDGOFCNMGIJKCODBCK@@DDBBHDBI@DD@IEDJJJBH@CAMLF@@JBJJIEDHAA@DJA@JBAA@@FNBAGNFJLOEKNCGOAFMJAKKDCNHAMNJMKIGONJOKHNOKLDIBIABJDHADJDBEAKMBKFIDBIHIA@IBABA@H@IAAADAB@IA@IBBI@@@" "EEEIBJIBJIBIIAADJBHHIEABIIBA@JACEGKEIDDJEBBJ@DABIAABJEOEBONLCEJAKODCENEGODCHMLOCIAHNKFKOCEFMDBMMDEDHIDDBID@EAAEB@B@@@DBKDCGFAFJA@@@B@BEDDE@ADJAADHIEAEMJAEKEFGNKFKHLDNGIMHNAGOECMFAGNLBMFAKOJEGMBJDDDJDA@BJBEBIADMFOEFDBHDBDLJDEDHHJBIDDDLJDJJDJJDMEE@@@" "DHJBDECEBBEBBBDI@HABJ@DDBBDJEBNFJLGOBIIIBDHDJJND@DJLAOOMEONMGOMJGGMGMMIGFHKONEFMJGOMBNEELLKKNIBBIHAEBAHHBAE@DD@@JHJEDHHEGBEBGE@HIEBHJH@AA@EDB@HLBED@LJBDKNNIIMECJEOOBMKECONHKGDMMOEOGBMOOEKOMEOOLAJI@ACJJI@IBDLLJGOAJKCJEBIBBAA@BJD@HDIBBBEBBEFEABBHI@@@" "KBHIAHEDDJJEDJIBFKBD@EAADHIBJD@MEKMENBBBDIFIAA@IJJDBJGOKAGGLGGK@ONHGONBNOKFOLLOKDKOGCMMOJKGOJBDJBBD@EDADHD@FJIEB@B@HAAEEDEBEAEEDD@HB@BEDJK@A@IDAE@ABBBIBBOOFJOMMNGGNIFOIIOKFOKJCOO@KOHFOGAOGDFOOBJABJLHDDDKDIBBBCMENMEHABJDHIDDE@ABFKBDJIEBJIAE@LDHJFH@@" "DECDJCDIEDIBEDFDHHDIEDDDACBDDJJJKECDHLIDJDHJFFEBBEJHHMEJINNIGMKEKOBKKMIMOHAOOFOGMEMNMOCGODGKEDIBHHHJ@ABAE@JH@D@DJHJBDEBFE@E@ECBEABBHJI@A@@JHEDBD@BHHHJDIEFOAGOFGMKMMEOGKGOL@OMLMNNJGNMFMODKKLJMEHHJMBBECCBHIBIDIHIFEFJJJIABFDAAAEDI@HICAEBDIEDIFBIFEA@@@" "JJDIADABHIBDHI@JEBIBD@HHJDBIBDIJJJNOEABEAABI@HJDIGOOBKOKBOKNFKJ@FDLCGKGGOOONMEMODCKGCNNNHJOBDABDEEA@JJDJ@E@ADIEA@B@HI@MFHDHI@KEHDHHB@DEDID@E@BIBJHDEEABDABGJHKKKNGFNAGMMEKOOOOGFOFAIC@BNKCNOJFONJGOODIBHHDJDDEBDEGKJJJLIBDJABHHHABDJEBHDHIBDHJDADDIBJH@@" "BEICFIBDCBDIEBEBIEDDHIAE@IDBJICEDEAJJLFHFEEBEBDIJEJJMOKGENNNOOOOOMKOMNKOOMKJOOONMKONOGMOGEFOIDDA@@BJ@A@HJ@BJ@J@DBHJBBAJHBIJLJ@JLBBBHJA@BHBJ@BHHD@BJ@@DAADOKEGGMOGKONMKOOOJNMOONKMONMOOOOOKKKMGFOMJJMBLIBEBEEC@KAJJLEAEFDJJADHEDDHIAEDJEBEDIBFABDKFDMB@@@" "EBJHHBDJHEEBDHMDEBABBBD@EBDLDBEJIJNGMGMJHIBDIDIBEGEMKEGNEEOMJJMDEGEEGKNONKOONOKMOGNOJMJFNKMJJAEDEDH@EBEE@JH@I@EADB@HDBFEDJ@BIECBA@HBADE@DH@JHEEBE@@IEAEDBJMNKKBMJOKOGMNOKOONKOKNOEEGEAEJJMOMECOEFMMGEBDIDIBDHJMOEOCJLJMBAAIBE@ABBBDBEAEHIBEE@JIB@HJJE@@@" "DMABBLIABHDDJE@BJDJHHHIEBDIAIDKNBEAJGJNMEBDIBADDONJBEGNNIGEKGGKKOEOGNOKOOOKFMIFOMGKNOKOOEOGODBHBHA@JHEB@E@AJBDHBADJA@DLIAAEDDDII@DBIDB@IBBL@E@BE@JHD@J@JAGOGMGONOKNOEOKDMKFOOONOKOGMGNNOGFMGDKKOEBBKOIADBDIBEEKJOBLEBCNIDLDIBEDHHHJIBJ@EBIA@JDDIJBDEI@@@" "EBFEIABFEEIEDHJM@IBEBBB@HIDJBIFIEOGFHDDBJDIBDJIIKHIFJOIMONOGNNNNMOJMEMEMDNNOOGMKKEGMEGNFOJOHDHBHBDE@AJDDHBB@HIBDD@@DBKACFDEACFDFJA@@AABDHHBB@IABL@EAB@J@I@OJOKCOEEOEFNMOGOKKIEMEMEJOMKKKKOGKOMLOJKDHNLLJIBDIBJAA@KGGMDKDJBIDHHBBBEBDHEJHIEDMECBDDMCBE@@@" "JDHHBFDIBBBDIEB@EBDIDIDEBJIAEBEFJHEEBIJK@IJDIBBCFKDDKJMKBMMNMMKKONOKOKOOOMONOMGGEBGJJOKMKOOEABHBDI@BD@JIADDJBB@DIBIADBNLEMHMMAKJADDJDI@BBBIADDJHAB@DIB@JDEGONMNOJJOBEGGEOKOMOOONONOKONNMMKMMJFMJNIAFKFBBDIBLHFJLJEE@JKEBEDDJJEADIDIBE@BEDIBBBDICB@HIBH@@" "DJEBLHIBDIDIBIDJIDIBAB@JDIBFELNCOON@EB@JMBBIBDMFODBIBGKGEGKMGGGFOMMOMFDOOGJMJKDKKEOOCOFOOMOMDDEDJBDDIBDBJ@I@HDEADDBDAOKKJJBBJNNOLABAADEA@HDHBJABDIABBIEAAEOMOOKGNGOMFNIFJMJOGOICEOMMOKGGGENOEGFOBDJAGKEIBDJBEJHBE@COONCIMCBDIBHBDBDIDJIDJDIDIBDHIJEBI@@@" "KDJFABBDJFEBDBEBBABDJDI@IBDHIEEOMMLJLDKAJDHBDI@LJIEEDKFLIENBNMMDMKCBKHJMNJEOLIGFDJGDFNMJKKNJAJHB@HHIBEAD@EBEBHHDA@H@JKEEEEEEEEEFJH@HDA@HJEBE@ADEBDHHHB@JLBKNNJMKKAGBICGDIOMBKMJHNJFFMIEMKJCMDIKFIEEDJIHDIB@IBLFIAJIMMOMEDHIBDHDIBIBDBBEBABECBIBBDCBIFH@@" "DAA@JIDMA@HHII@EEJDI@IBEBDIBDNKBDOIBBI@EIAEDIBFMNB@BBCIBBGJICOBICFHKOMAGMIAJIBEMIAFMHOGKOGMLJ@HHJAAB@HDDJH@H@EAADBAEANFOENECMGKCLEDBADDE@@H@JIA@HBDDBHHHBIMOGNOGHMKDDMMBDJLDMODEONHKFDJGNDJOBBDNBB@BCMKBDIEDDM@DJBDOIBFKIBDIBEBDHDIBME@DLHHHDEIDJHDDA@@@" "JJDEFBA@JEBCBBE@@DIDBBDIDIBDIMFOKMBDIBJIDJIAFDHJ@HJHHEDHHOOBDJJBOMEBJJDGODEGJEGKBJOOGLOONOKOBJCB@JDDEBIA@BEBE@BBADJ@EKMDJLHIJIENM@BIDBB@EBEB@DDJEAABHBFBJGNOKOOIOGOJJFOEBOEAGOABJJEEOJBJIBGOHHIE@HJHHBHICDDJIDJJDIBENOKELIBDIDIBBADI@@EBBFBEBHDBCEABJH@@" "DHII@LLFDJDLDHHFJIJIDDIBABDIBNMJNJLJDDBBMBBE@IEGEC@JEIICEEFDKODHJIAGOMAENBINDLOGLJMJMMECEOGMMJHEEDIBHIBDEDHBHJHDJ@@ECLEODKEFIGMANE@@BI@JHJ@IEABDHJDIEE@JMMOGMFEEMJMJIOGIICLJCMDEOODDJHIGNICEEFDLMBHFEGEDHEBBEJBAABIJKJMKJDIBDBDIADJLJK@HIAIBICAIHDLHI@@@" "ECBBEAAHIBI@IFEHIB@BJIBDJDKBEJJOMOA@IJLLJLLJJBINHDE@HCJDEGMAFKBBFNF@J@DCKHEKIAENKEOGIFMNKJJKEGMH@KJDEBDIHAADB@AAAEDHDKKDKN@CNIFNI@IEDDD@BADD@LIBEABNH@MOEFJJNKMKDOGMFKMDDNM@NNA@BHCCKBBFKDEOEABN@HEA@KLJBJIIJIIJLHDGMOJJMBFIBIBDJJ@BDHMCDHDJDHLDEBBFE@@@" "HHDHJJDBDJBEB@HBBEEB@BDIBI@DOGMEKGDEBABAMEAA@MCDA@HIBHMA@OFDKNLDDI@KOJIEOCBOFJKENONNKMGEEGONJHKFKFDIBMADAJJAHJBDD@AAANEKHEGE@NMCLDD@AABBHLBJLADEJDICFKFHJKOOEEGENKKOKMFJKGJFGMDJONHDIAAKNICGHDEHJDHHDAFEHDDEELBDBEAGFMEOGI@DJDIB@BEEBB@HBEBBIBABJHI@HH@@" "BEAED@JHIEDJIEEFLH@DIDICDDMBBMEOENI@EDIEDJJFE@HMBEBBDCFDFHJIFOHHKJEBNDBOJDEOHIFNJJIENJIMJOFLOBJJNMINGBNKJ@@JB@HA@IDBBEGFGNECOCGEBBADHD@HBBH@BNKJGCLMKJJJGIKGJMLJKMDJJKKDHOMABOJACJEBNHHOKDJHKACFABBEBEHHECBJIEDIE@DKMGMEJBEIAFDIDI@@IKEEDJIEDHJHAEDEB@@@" "FHEBIEICJIBDFDA@ABMJBEBHBIGEDMOMODJFJEDDICHHJJKJDIDMADMAHKOJHJJJMFHEMJHJOJMMGGKOOONKEEGJKNOMJMFMKOGKNOELEGGEEMBLEFIDEJHDKMJMNI@JMADKEAJEMEGGEAMGKNOGNMKEJMOKNJOEEFKOOONOGEMJOJHJMM@KEJJJHJONHLEIDEIDIBNJJHHNDIAEBKBIGMOMIEGDJ@JEBBMJD@DACABDJNDMDJE@K@@@" "HEJDDJBDDJDI@IEEDDB@HHDBHJNMFKEGEOM@IEBIJIEF@JDDIBB@DAGFBDEEGJE@CLKOKDBKNKBKIGGGEEDJOJMGDKMOEBEIFHLFEJOGNMMJJBDAEAF@JECKGGGGGFNEBHCDEDABBJMMKOGJMCAHKDMBEGMNIGEJOJIEEGGGDNJFKNJAFONIN@EBOEEABCGDA@BBDIABHCEDJLJEDHEOMGEFKEKJHJA@HHBAAEEDHDIBIABBIABM@H@@" "GBDIAAEBIBIBEBBDEIHIBAIDJ@HMOKGMOJKEBJMEBCIAEAEMJDIFHDEMEKOJJJNOOKFIFIJOMOMOONJNNOOKMGOMJOCJEDHBJKCDJMILKGKGOMJJJFMOMOOEMOOOMMGOMOMKBJJMOOFOFILMJIFFJJ@IEBNGJMOOENOOKKJKOOMOMOJLKDKFOOKJJJONMEMA@KDIBMMDEDDNBEEJJEFJOMOFOMHHBIDLBDHLMABBEBDJDJEDDDIBG@@@" "HIABDFDIBDDDDDLI@BBBDJBEACDJFJNGEGJBDIJJDEBDIFJBAADHBICBIFJMOGMMJFMGMGEJCBOGEFJMJIDDIDOKENOGKEBJDDDMBBFADHEEBJEJMMKEKMOOONOKOOOMNMFMMJMBJEE@IDCBBEIAABJEFOGKMFOIDIADJMJKEGGJFBMGEOEKBMMOGMJKDJFDJ@IDDBBKDIBEABJLIBBOEGCJKBIFDEBBIBBB@DIIAAAABDICABDDHH@@" "FEFJMHIBDIAIIIABEDIDIDHHEDALMONKOOJMKFAEINIKBIEDJEABDKDGEMOJKMKKFOOOGNOKNOMOMIJKOOMKOOMNKMGFNHEHJKCHDNIOGGNNMEOGOOGOMKOOOOOOOOONMOOGOOGMEKKOGGLKI@NFJHM@KKGENKMOONMOONJLMOMOKNOKOGOOKFNMNJOMMGAFIBDEBIEDJFLKLMDCFMJOONKOMILAE@HIDIDIEBDDLLLDIBDHMJKEC@@@" "HI@D@ECFIBJBBBDJIABABABBJABAEJIMEGKFEMNJBAD@FKFI@HDDM@EEKGOOOGFJIHEDLMMGEJK@@BJJJEEFKKKAJOJOMGMCAFMNDMB@HMAEEKBIBIEECCD@ADOID@AFFEEDJDJFMEDEHHBEICMKDFEOEOJOJLFNNKEEBJJJ@@FJMGEMIIE@LJKGGOOOFME@EIA@HDKFK@ADBBKMMCFOEELJMDBDBJBDBDBDDJIBBBBJDKFE@A@DHH@@" "EDEEEDD@BE@IDHJDBFDLDLDDHJFKOGNOJJFIFGMMDKEEAEEBECAE@EAKJJMKOOOOFGNKKKJOOGNOMMEEEBIEGFFNAGCEOMKNNOKEMOEEE@DJJDJDLJEEDDKOOMEEOONIAEEBIIBIBJI@EEEGMMFOKKNMOMFGDCKCGEDJEEEEMOKOGOJNNNKOCGOOONMJJNLE@EDFEBEEDEEFIEMOCDKBJOKOGNKBHIAAIAICBABHIDHEB@AAEEEAE@@@" "JBJDI@IEEJEBAEIAFHJAEAIIA@HDJOGMOOMNKMBIIEHJJKCDHHE@OJOGMOKOOOOOOMEOFOGKCMEEGGJJIEFHH@I@NMFOMGOCEIOOOMNNJJIEMKEKKGKJJJDIJJJJJLIBJJNOFNMFMMDJJKKMOOOLMFGOEOKEKHDH@HKEDJJOGEEENFOGKGMEOOOOOONOMOGJOHE@HIFFJJHMDLJENKMOOMOGJI@HDDLLEDBHKDDMDBEBMEDHDIBJBH@@" "DMDJBMJJDABDJHBF@EDJDJBBFGGKEJMOOOKMOGMFKOBEEDGECBIGJOOOGIGFJKEEEGOIMJMEGGJJHJECFDICCONOBNKMKOKFJOGONKOMOOOOKNOOMONOMEKGGOMOOGFMEOKOMOOKNOOOOMONKOOGJKFONMNKJGKONFDICFEBHJJOGEEJMLOOEEEFJKGDOGOOJODJFEGAEEBGNKEOGMNOOOMJMFOGCBBBIBIE@CB@JIBDABJMJBIEI@@@" "I@JDL@BHIDDIBBHHMB@HJEDHHNMFIDJAGCFJNMGMDHDJBAHHDEBMGMMKMGMOMNOOOMEGBKEKHHDJMA@D@IBLMAA@DEFGNKGMGJMGKNJKECGMGGOEGMKMKOONMFMKEKOONMNMOEGOGEOFEFJKNOEJOEOFKOCEA@DDEIJDHA@DEJI@HNMFJGEEOOOKMOMOENMMOEJEA@HLBBI@IEOEKJKFGDBIDKEKHHIEBHHBEHHJBDIADHJ@AIBHDH@@" "BKEIAMEEBIJDIEEEAEEBHHACE@JDJKEOJNOOMKMOINIEEFCNJHMKOGKOKMOMGFMMBAEJOFJDEBIABJEAFEECFNNNJOEMEFNJMEIEGKONKOOKOOMOMGGOGKOMKOJONMONOGOGEOMOONOONKONOEDMEJKKEEMGJKKKKFEECDEBJDDJEABKGJMDBEMKGEOMNONOGNMHJKNCEEDKLOMNMOOKJOMFJIBHEFD@HJEEDEEEDIBLJEEELDMFJ@@@" "FDJFL@JBJBAABBBBEBJECBMDDJJKABOJKKONKOGOFIEBIAHMEEKOMMCGNKCBHIK@LJJD@IEIBEBJDDJFKBBHIIEIEFKGNKKKCIFMGOEKFOOGKOKNOOOOONJKONOKONJKOOOOOKNONOGOKFMGOEKDNFNNKOFKEDMDLHJBFKBIABJEBDMDHABJIHFLHJFFKOFEMONMEEHLDJEDKGOGNKONNJOJDFJJIAEJFEBJEBBBBDDBBJBHAKBIC@@@" "HKEHAEADDLJJIEDHJDDLNOKGKEGFMEEGKFNMOFOFMJBMBGEIMONOOFNOENNOGFJOKGEKOFJJIDEBIA@LFHHEFBJBIFJMEOENNGMNMNKLEMJMFHFIJJJBJJNOOKONOOKJJJBJJLK@KEJMMANKMKMOCKMGMEJKDJBJCE@HKAHDDJEADJJKGNMGFOJKGGKKMGKKGOKOMLMGBEJBMKGKGMKKFOEEEKGEFOFOKIIABHIEDJJIIADED@MFHH@@" "MDJBJJDJIABDJBIEDIIA@DFMEDJIBJJDBEKKMMNOJEMBMIDGKKKKFMKMNMOJDMGEDJJDDIEIDIJDBDOKOEE@@JDIBEGKONKEAIABEEDKKEEBIGINEGEMBMMOOOOOOOMMJEMGECLODJEEFNIEEBDDLEFKONOEBDIBH@EEGNOIBABLIDMDIABJIEGEIBOMKMNMKFNNNOADMJEMBOKMMNNMBABJJDJIEEKA@DDLIEDJBIBDDJIBJJBIEH@@" "BKDMBDMAEFJIBEBIBBBJKIIBDIAAEBDIFJFJJBIEOJDMBEIKGGNLI@EGAJIDI@HHBBDIMBDBAB@IDIEGOOMGMMIBEGEEJHJJJFNMJOKFFEGGGHFINJHBEBJLOGOOGIJJEB@JKLK@OGGECCFOJMKKBJJHJMEGEBDMMOEOOOEDIDHBDBABELIBB@HHDIDJLGE@DIKOGFLMBEIBOMDJBJKBKDIBEDDDIBDLNJJBBDJEBDJKEDEIBEIFJ@@@" "MDK@FI@JB@DJHLECEEDI@BBDJCFKBEAB@DHEDJBEAEKBEKJFKMEKNOIDFAEABBBBIEAB@DIDJDKBIBIEOKIECAFMBFIOGOMFKIEFEEDMKMLMDEMJKNKMNMNMJOJOJMKMKMNKNJMMAEIMNMIEECEDNKEOOGLKBEKDFEDNOMDJDJFIBIDI@BDEDJBBBDEDCADOKNMENKBNMBFMDEBBIE@I@BDEBFKFBIBB@DIEEFEAHJI@BBHDK@FIEH@@" "JKDKIJKEDKIBEAJDBECBFMEIIDI@DJFDMACHEEDJDJDIEEEIMEEFKEGIHJDJDLHIBDLDJMDIEEDEBLKGLOFBNOKBLMGDLKCMJFI@HEEBDBBACGFKFIDAA@IKGNOKOFLHDDADKFKGFDBBABEE@HDKBMNFIIGEIJFOKJCGIOFIJEAEEDIEJIAIBDHIIBIBHLOEFKEEELMEEDIBIBIEE@NDEICBI@DIDLMEKBFEBABLEBDNIEFJLNIFJH@@" "EDKDFED@IDBMIFBJJJDDI@JBBEFFJDHIBJOEDHEAAEKECKIBBJMKDMJOEBIAI@KBDJAEB@IBHIBJDAEEKOHMA@DJAGEMOJLBDIEFKJJMKMMNNJNOEGKENONNOKONOKKOKMFOEGKJKKMMNMJJNKEDIBAJOMMGDBI@DEHONMEDABJDHJDHBEDBIBFHDLDJEGJMIFMJJBDNNEFMDDE@IEGJJDHIBKCEBBBHDIABJJJCDMJADHAECAFIE@@@" "JIDJHHIGBAE@B@MDJDJIJFIDIK@HIBEBHBJIACDJGBDBEFBEMBIDOBGJEEBDBE@EA@JDLJBIBDIDIDHJ@ME@JKJIFLNKIKINKFJMEEEKBJJMJOHJNJDJA@IKOGJOGNLHDBIBKJHOJMJJJFMEEEJKFKLNLNKIKDJNJHEEHBHIDIDIBDJBIIBHDE@EBABEEBOBGIDJEMBCEBABGBIFDDJJ@JEBDHHFLIDKBLJIBIEHB@EDBGDHHJIDJH@@" "JKEICEBHEGBEMM@IDIEJDIBIBFMEBDIDFLODFLABHMIMKIEDFLKC@MKGDADIDHFIDI@JAADBDIBABEEEGCLJEFKFJJIKGDCABIDHBHHDEAAJB@EE@HI@JEJFNOGGKKBMBHDHHEE@BBLDEA@HJ@IDJDFAGFLJJKFKEBINGEEEBDBDIBADDBHDIDK@IDIDAGFMHFFIKAEDNMLMHJDAKAGIKADIBEEKBDJDIBMDIDHEMMBGE@JEFDMFJH@@" "IDJFDIEEDHDJ@BKBJJHEBDIBEIBHJIBCEAJA@ADJGKGCGFIAMKNNOAFD@JBBIFHBABEADJADICFLJDEDHDKDKENJJOGEHKDFFDIKEKEKLMFEEFJIEEBEFJNMKNJKNMKJKEBEEDJKEECEINMFMFLICCAFHMGGJJKMFIFI@IEABIKFDIDBIDEBDB@KDJBBHACDGKKNMLDKGFGFOBID@DBLEFBDJHJDMBDIBE@JJJFJ@BI@IEEDICBIDH@@" "EEBHKBJICEEIJHIEEABHIBBDIFDBHBDHMGDNONKEJFMDBIFFJMABIKKOEADHBAEDJDDDIAECBD@A@IBIBIHA@EADIBEKG@JHHIBDJHIDACEJNMMGOJMIBHMGOEOMGOEHJDMJOOEMKJMFDADHJIBDHHJHGFMBDIDE@D@LJDJDHD@ABFEDDIAABIEDB@IDEGNNLJDEJKCDJAEKBMFKOKIGEHIB@JACDIBBDHJDEEDHJLMEFDJJFHJEE@@@" "JKMEDJDJL@JBECFBJJEGDLJICDIECFIGFNOMIELJJHJKEBHHINBDBEGDHDAKELDIAAHIBMBHDIEDJBDBFBBJFLJACEEELBIEBBIAEBJGNNJOIEBJDEBBOONMDOGGIEKOOJBEABJEDOJKKOBJEDDJBEDJAMEEFDBIKBJBCBABBIEDI@JEJDHLDDIAMFLA@IGEBABCLHHJEFJHJJIMDMOKKGDKFEDIFDJIIGEBJJCFEBBHAJIBIEENJH@@" "EEBDIDKEAGAE@DIDJDJHBABBFABHDHBOMENJFJCEEEBHDEEEGNNJLJBEBIB@DAAAFDCBD@DCACBIADIE@HHDHADJDBEKBEBBDIFMEOEK@EE@BJLIJHEMD@MGGMHMOGEHAEM@JLIJJ@EE@FMGMEKDIBBEBFMBABID@I@HHEDIDDJFDFA@ABFACDDDA@BDJEBBIJKKOEEEA@JEEEFBKBKMEOJ@I@JDCBBDB@JIBIDI@EDGDEFIDIBEE@@@" "JJMIEEHLE@JDFJJEEAEEDJDJHJECJBDJOOOLH@H@@@IFIIDAEEJIEDLJHBDMBJDJ@IDDJJIDJDDBBAEDJEKMCOMECHMELJLLKBIBK@HDKH@OFKKOEONBKFNMJMGEJMKKFJCOMGNNKGH@NI@HFJDJFIIJIMEHNEEONENMBIEDBBAABIDJJIADHBIBJEIB@JIIEDJMEDADLKDH@@@H@IOOOJIBBNEBHJIBIEEDEEBJKABHEAHMEDMJJH@@" "EEBFDJBIJEHIHIDIDEDIA@IBBHJDADIMMOKAGOKOOOEIBBKOEJABHIA@JIAJDHI@JJAA@EBBDJJLJJBIBI@@MI@EDKEOAEABDDDIDOEGEFEIDJFDEDEMDIMFOKEFOKELIEMAEACBIDMCEGEGIDIAABDEDGMFIE@DMH@DJDJBJIJJIBBE@DDBJHDHIBLDJHDDHJDBMGNJBDMGOONOODFOMMLIDABHJBDHDDIEADIDHLHMBLJBICBEE@@@" "DIE@JJMBDJBJBDJJKJMBJEBEEBIBDEBCOOEOJJOEMGKGEEGGKAFJEEDE@DDJIEBMAADBA@DIADIABEDBHBDM@BEBI@EJNDJHIIEFKJIDJHJBAEHIJIJBKCEEKBGBFMEFFJBLJLHMDBBHJIDJNKEDLHJICJM@DJEB@EIB@JAEBDDIDDI@DBADDEJEDJIA@EAEEBKDFOGEEGFOEMGJJOMGONBEABDJEEBEBJEJNJJIBBJBIBEJJHEDI@@@" "JJMEAE@EBDHIEBHIDE@JDJFJBFFMMLFMGJKJOOJOGMGOOGNJEFMJJBA@IAIDEDJ@DDADJJJBDIBDDHEHBDI@EDHDBBKCECFNFJ@IBDJA@B@HH@BJ@J@HHDFEFDHICECA@HHBHBJ@@HHB@DBIBDHBKCKFEFFJBA@IE@DIB@M@IABDIBBJJIDAA@BIEADLDHDBBJMKEBKOGOOEOGJOOJNJOEKAMMKCBBKBIBHEADHJEDHIBE@EDEEJJH@@" "AEBJKDKHIAEDHMCBKCEDIHHDDIMKGCMCNONJKOOOMONMGOOEJIBEJLJEBDBIDJDIBIDEBB@LJDHIABHADJBEBEBIDFJKLLIAIAEBDIDLEEBECJHIG@JGGEEMEJJJMEMEGGBHGDHJNEBEEAIDIBEDDLDIINJKADJEBEBBID@JDDHIBIHBBEADJDIBIDJABEBIJMBDJMGOOEKOMOOONJKOKNENGFMLIA@HLIEFFJFEHIEDDHNIFJJED@@@" "NIED@A@EDEABB@LMDLDIJBKKKEEBIGJMGLHHJKMKGGIBMEOLABDJBA@HDIDDIBIBDDEHDHKAEABBFDEFJIEFMJEBJHIGBADDBDABJEBAKBEJDDIFIGGLHEFAOEEEGLCE@IOGDKDIABMBFLBEBJDABAADBGDHJJEBMKEDJKEACBBDEDFHI@MAABDJDIADI@HDBBIBDAOMEJDOGFMNJHHIOEJODJEEFNNJBLIAIEIHBBDEAE@D@AEDKH@@" "AFIAFOFIEJFEDJAAFBID@JNNNMEEBFFKDABJKOKNMMGOKKGCLDIADJEBIB@KBDDDII@BIBHJHFDLHKJIABDHJDHDIECIFJ@KEEOFMJJJDDJEIKA@F@HAEDKOFKEFKGNIED@HC@DFLMBIABJJMKGMEFHBKDNEDI@IBHIBDDJNHIIC@JHJDJ@DLIAABFHBDJEBIDDIANGFNOOEMKNONJJDAFKCBEEEKKKJHADJCDDBIECBMDKGKDDKD@@@" "JIFJI@ACDEHJIDJFIIBIEIAEEDIAEEIBHJEAONOKGGJKGFNNKJBDEDHHJDJHDIBIBBEDBEBABHIAEDEDDDIEAAAAB@IGHIJDLH@A@B@@IA@HB@FEHJCFJMFEMFMKEMCEJKFBHMC@B@HDDH@B@D@@IIBLHODHBDDDDEDIAAEAEDDHJDBEBAEBBDJDI@JIBHHIEABBNKKKGFJOGFOKOLEBHJDMEDDIEEDDMDJDLKBIDJHMAFD@DJKDJH@@" "EFIEJEFDIBBDCADHJBEBDBFJDIBEBDBJK@HDMKMNMEDJJMKIBDJIHKJEAA@JIBHBDHJIDHJNDEBJAABE@AB@DDBFJJCBEDHIABJNKLOGBJJGMOLKGFLIAAEJJB@BBJMDDDIKGFIOMOBJJGGINKJJDDHIEBFBJKBAA@BD@EBDDBJEACJHIDJHIB@JDJHDDEBNHLJIBDNMJJIEEKMNMI@HFJJABEBDIBKBABEBBHIDFABBDICEBMDKE@@@" "BMBJDJHIBIDIDBIFEDHHIDIDMDDJDID@HBBKOOOMIOKKEBEFDI@DBD@JDJEBDDBDIBAJJB@@IBDDJEDHGNIFJMDIABJMIAJJJEEEDIDHMBA@JIADLLADFDBAEDMIEDBACADAIIDDJHDBEHIDIEEEBJJLDMJJDDIEJKDKO@IEBIABDH@BBJLBDIBAABEBIBHABA@DICEBEFNOLMOOONJB@HADIBIAEIDIDHHIECDJADIDJDHJIBJEJ@@@" "EBMEIABKEBIEBNEAJEEEBIBADIA@JBACBEDBMJKOGGFONMBHJJEAEBI@I@JIBIDMBEFJ@IBNJDIIBJEBHACDJHIJFEGKGFAADIBHIBABBDJE@BEAABKKHIOGJG@GBOGLHNNJDDEB@EBIBBDBDHJDIDDCGFOECBLHJIFD@JEBJDLIBKJDHBKEBEIDJDJHDHDJEDEBJHJEKOKGGGNJMJAEBFDBBHDDIDBDJEEEBLECJEDJEFJDDMEJE@@@" "DMBDFFEDBECDI@JFDIBBEBDJIBFEAEDDDHBMKKOFMMMJMDDE@EEGBEBEBE@BHBB@DH@IFBD@@IBBDDHEEDDEBABHHHIBDIDGADJCBHKFMK@JKDLFNHDDEDBIFLJIKDJAEAA@KKAIFJHFMKFHJFBIDGADIBDHHHJDBEAAEE@IABBDH@ABCDH@I@BB@J@EBEBEBGEE@EAAEJMMMKGNNMJ@IAAEDECBDJIBEBBDICBHDIFEBAECCABEI@@@" "EBMIIHJEFJDBEFJHJKDLJDIBBLHJFDJIEBLBONMEEGKGJOKNOJIJDJDIDJEGBJHIABJD@NIEEDDJJIBH@@IDEFEEJEJIJFIMOKBNIEBKGDKCDIIMIEEBJAFEDIEDIECDBJEEDMLLIFFIGFJEDKJFOMLKBLJMBMECEADH@@JDJJIAEEDKHABJDDHJJGEBIDIBIBLJOKNOJOFOEEEKOJAJEDJICBHIJBDIBIIFJHJKEBABKEBHLLMJE@@@" "BJJBBBIJEDIDH@JEEDAADIBDLABHHI@@@DAOMAKIBOFNGMEJJEFJM@IBB@@@DDCBEDHJJ@BBDJI@HJJEKGLIJHH@@HHJBICCKEEABKOONOHDMFDKFJJJ@OEEGFHKGEEGHBJJKFICEI@OKOONJDEEFNFDJBHHH@@HJLIOFMBJHHDJIBB@BJHIEBFAA@@@BBDHEJKEBJMEOCKGJDNLEOLA@@@DHHJDAIBDIDDAEEBH@IDIEBLJBBBJJ@@@" "EEBIDJBHIADEBNEBJAJFABDJAJDEFBJKKOOMKONOENJMMBJEDJ@@@BBDHLJKHIDEJCAAEEDDIABGCEHIDHABABCKEECBMFDDFLDJEBDDDIGKKKJDIEDDOKGGNMBEKOGFOIAEDIBNNNODIAABEBIAKAACEJFEEFNBDBD@IDHMFGBDDIAEEDDFBMADHNJIHIBB@@@BIEBJEMJKMGKONMOONNJJCEABLBIBDCBLBJECJEADDHJBIDJEE@@@" "EBLDIEECBEBJJ@MDDNDHJDHHJ@HJMMENOOOIDJINKMEABEEKEFOONMDIBA@EEBID@HJF@AAJDJDHDBBJABJJJMNLHBHDBEIAMKIMLMICABHFDFFIBHEA@BEAEBEBEDEB@DE@JDKCAC@JDFDMIMLNMLDMBA@J@IKMJJJJDBJBA@IBIBLD@CBHHADJEE@DBDIEKOOKEFMEBDEENKLJIDOOOKMEMJHHBHHIBHICIAEHBJJEBFEEDIAJE@@@" "EFJJBHDHDJIEDMBEK@JEBICCDMKJOGOMOKGJIJOKOONOOONNMIFJIBEEDJEBHDBAEEDHJDBAA@IBIED@JJIGEJEBEDBJLJEFHFOJCBBDFDEHJHIKFLHDJOGGJJHJJOGGJI@IKFLHJHMACABBFBOK@KEBIJJAEBEBMGDJJHAEDJDHDDBABHIEEDBA@JEBIEEBDJKDMKKOOOKOONOJLJOFOMOOGJNMIFFDJEBHFMBEIEDJI@I@JBJKE@@@" "DJI@MBIBIBDIA@JJDEHIDDDDAABOLNJKEGOGMNJOFEONJCEJKBHMEDI@AHHEBIHJBJAB@HLJFEBEFJIMBDDJBADHHAD@AEJEBIC@HLIA@I@BHABGEACA@EKNBGGGBCNM@DFDEGBD@J@DHDDIHHFDJEBMD@AD@HIDBBIABELJKEBECBIHHBDBJBHLJE@HL@DIEEHJFJMFBKOMCGJKMOGOEFJKIOJDDAAAADHMABJHDDIBDJDJEHDJI@@@" "IEBGAEBEBICEFEDJJJBJAIJJJDJMNIKBOOFLCEOOMOIEOONONOGIKKFKJABJMBCDHBJDJEAJHIDJHEBBDIIEEEACBJAEJ@BNDBDDJABJJBKDJFDLFLDFMJKDMNMKMIFJMKAAKAICBIFJBJJDBIABACJ@BMDBJFDEEEDLIBBE@JIDHJLEBIBJ@IFBEJJDBNKFNLOGKOKOOMDOMOOMFAKGOJFLKMJIBJJLLBJBJJIECEFDJEBEDGBEDH@@" "JJJHEBJHDBDM@HIIFAE@JBABDKEOJOFOKEMKJJKABDBJ@@AHAJJFEDJDAJIA@DHACDDIA@J@BDIECEDHIBBJJMEDDHJJAFMDHHJIBJDDAD@A@HIAMGIAFOGKKEGEFNOGKDDOELDHHD@ADAABJDJHHIEKDBJHIAEEJJJBDHIEFEDIB@BHDDIAFD@I@DDJLABIECBJL@L@@BJABDFJJNMMFOKGJOMFIBDBBHEDCDLHHEIBA@JJE@JJJH@@" "EEEFJEBKEEKJKEBBHL@EBIDJKNOIEEDIGOGLOOMMEEEEOOOGOGEILJHIDADGEABJDEABDBHJDBBADBEEJMHEGJIBIC@IFEAEEB@BHBIADAEKEBBDBFKJIBKFOJHJOKFJDJNKBABBEFMDADDJ@J@BEEDECDHFDJDJOE@MJMEBADBBABHJABDEABJDEGADADHJILMGGOGOOMEEEEMOOIOGODIEEDOKNJIDJE@AHJBEFJNMEFJEBKEEE@@@" "HMJAEJEDHJJEDADKCCKJMFKGNKIGAFKFMENIABKGNOOCDJJMFNOFKMGFKFABJFFHIHFDIDADMLLLKMIEABBJHABDBHEDEJDBJBJHADBDAB@@@DHJHIJEDDNEKEGEFMCIAEBLHJHI@@@BDABAD@JJBJABMAE@JABD@JJBDEDMNIIIMIDADIC@LHKCBJDCFKGENKGKKEJJIFGOKOFJDDKMEKFKDGDNKOFKEJNNFFIDAEBJHIEBMDBMHH@@" "KEEDJBJIEEEKBNBHDFNOGKMKEIGMGMFKKODBJMEDKJBNMKGJMDHKBKKMNHJDHHHBJJHIBAFI@AACDBEDJEEEKFLIDBIAJFIFDDABJIDIJEEBJIE@EBEBOJCGBJHJJGFBOJEBE@EDJJEEBLIDJJDAACDKBLDJADIKFMEEBIEBAFDD@DKDBDHJJJ@HHIBHKMNNJFHIEJOFMKJBNIEEJJAGNNKEOEODMFMNOGKKA@JCJFMEEDJJBIEEFH@@" "DJJEBJABJIDDE@IBIEEADJBBEFDEHJLJMGOMKBJMD@HAB@HE@ECDE@DBEJBKEBBIAAEBDJ@DJJJLKKJJNKEGDMABDMFFDJD@IADHBBIB@H@F@B@E@BHE@ADHFHJHK@ID@E@J@E@B@C@@HBDJB@IDDHABICCEIBDEIGEFKJJNNIJJJI@BIBEDDDJBEFJBMBA@EAFE@E@HBD@HAEJJFMOOEJIJHMACEBBBIDEEDJDHEAADJJDBJEBJI@@@" "EEEEEDMFHBKJLMKMJKFNMELMDHMDBIADKMECFKEBIGCNNOGJNJFBJKBMFDLBJEFFDJADJ@MKMKEKONNMIBMDIAFFIJMKIDHJJFABHMBLJEJHJLJHEDBLEDEBMK@FMJEAEAJAE@JIJHJMBIJEHJDCBJHIDNMJLKCDDIEJDMKKONMFMNMHBIDBICCEBJAICEJFJJCBKJOGKKNGDJEFKFEENIDDJAEHIEIMEKKFJMNMIJNJ@KEIEEEEE@@@" "IJJJJA@IFNHECEFJKNMKKFKJOKIKOFJIJGNNMOONOJOEIJMGMOMMDHD@HIAEDDI@JBJAAEBFAEEEBAHJBDABKEA@EA@DJBEB@HJDB@DAI@AE@ADEDADAIA@DKEOMFI@DDLADAEAD@ED@DLA@BABHHBEBBI@DE@DEFJDABBHLBEEEDCBEDDBJBHDIAEDDHHA@IEMOMOEJLMGJOKOOMKKOBLJKGNLNOJNKFNMKNJKEFE@KKDHDBJJJLH@@" "EEJEENOJIJKJNJMDEEKFFMFKDMFFJMEGGOMKKFKJIEDEGFJMAAFJKBIECBJJ@JBEDLDJFAEMNJFJDJFJNKJIDBDEKNEAADHDIA@IEEBJBBJBEJA@@JHJBBBJBJJJJBJBBBHJH@DBMBBJBBJEEDHDDI@IDDECNMABADJNKJKBIBKBKMMDCBIAIEBBHBJJFEDJFJKDDEJKGEAEDJNKFNMOOGEEJKCEIFKEKCFMEAEJKJNJLJOKMEBME@@@" "KONOOGMOOGOOOOKOMJDHH@@DCBHHJIBLJNKOEDJEFJKJHIBJMEAADDJIDDEAEEDJAAIBHJJJIEIEMMJGDIDJKHKLEDJJDEBJJBEBDJDIDEDIBADEEDBHHLE@MDGAEHEAHHJAEEADBDIEADIBIBEBBJJEABJIEANHNJIDIGBMMMDMDJJJHJDLDBIEEDEAADJIADDEEJJDHJNJKEBIEGNKJIJDJHHJFA@@@HIBMONOOOOOGOMOGOKONH@@" "DJKEEMGJIMEMOGOOKEKGGOOKLLECEEEKGOOEFKKJJKMGGFMEBBJJJIBBBJHFJHEDNJBJEEFMFJFKBDDLEBIAFKFAJGDDJHHI@JHDJDJBJJADIFA@@ADAC@LE@IHLHEAHFDAD@@DCDIDBJJBIBI@JHDHHJIAGBLCFKDDJEAIABFKBKEKEEBJBKIE@JK@JJBBDJJJJBEEKGGENJJNNKEGOOFMEEFEAINOOOGFMFOOOGMMELJOEMEFJI@@@" "GGLKJJJEGCGKNOONOOOMNJKFKENOONKBMFENMEEGONJJJNEHEDHIEBHLJEEIDBLI@DJDIEEJIEIDIEIAHIBJAD@LDNAABECBGBCIAADMADJAB@DEED@JDEA@KBBBFHDEABHAEEA@BDBIDEIDDDNBGBFEBDDCIAHADBJDHLDMDIDMDJMEDIBI@DIJADMEBIHJEDHIE@MCJJJKOOEEEKMCEJFKOOKMFKFJKMOOOKOOKNOFGEBJJNIOG@@@" "@JADDBEJJOLOAOCMNODBAEGEDNIFIAMOJMKEEJJH@AEEEANFLICBJFEADHJBIMABEIDICFIEFDBABHBJBBEAOKEAA@JLEBDDHDLFFFI@DIEJDNI@@AEBMBDE@EEE@EABEJED@@DKIBMDI@DKCCAI@IABEAJHDDEFOLEBBBJ@JDBACEDKFDIDMBDELJBHIDECBJFDIKCLEEED@@JJMEFMJOMLDKDKIEGEDBAGKMNGLGIOJJMBAADBH@@@" "GEOKKOOKMFKEFBNKEEOONNOGKMKMOOKOOOFOGFMOONJJIFAABBDE@HJJIEAEJBDDJBIDLIJDHIFNJKMJJOOO@DJJDEBADHIABIA@HIEEIBHDI@BDJD@D@DHHJHHHJHHI@A@ABIB@DI@JDMEDHHDDJDDHIDBEABJI@GOOJJMNJKKDHIBLIIDJBIABBMDEDJJHHEABBDDCDJJKOOMKGGKGOONOOMNMNOGKKOOMEFKJCEFKENOONNOMG@@@" "HJHGFJBDBIEJMJ@HJIJJMENNOGOGBIE@@JMJNKKEEEOKDIDJHNJJGBIEBDJEADIJHJBBABACEOMKEBBAEJHHMIDEBJDJICBJEBJJEBJDCECABEEA@JIAFICB@KBFHBFDKDDJHDEEBDFEFABJEBJJEBJFDJIBJEADMHHJMDBBEFMOMFDBDBBBHJLIDEBIBEDJGBJKHJIDIFOMEEFNKJMJH@EDJGGOGKKMEJJLJHHBMJMDJABBKG@JHH@@" "EEMNKOOKMOGGOOOGKOOOOOMOOOOOOOKOOOJKEEDIDKEFIFEFK@BDHEC@JIDIFEBECDMMNOOMKACBAFMFJEBKBBIHDDIHBDDHJDIBJMDIDDDJDLHDE@BFHBDDK@E@FIAB@KB@EA@IIBIAADIEJJDIBHIAB@LIA@LJBFJEBKEKDBFDFMOOKMMIFEBECDIDJHFE@IB@FKECDKEFIDIEEFJOOONOOOOOOOMOOOOONOGOOOGGMNOONKMME@@@" "JJBKNHJEKBNMJDMNGCEEEBKEDIA@BJEFDMENKFKBIDDIBHHHHEDIEJDGBJJJHJE@DIKBBH@BBNLFNMAADIDHDDBBHIBBLJIADIBEAAEBKABDIAAA@EDHAEAA@FHK@DDED@IE@DDDDIBDFJEDDEBDIDDJIJBDHJBAA@IDIDDEKKAKJB@@JBFLI@EBHJJJJGABMDIE@HHHJDIADJFKFKMEICEBJ@DDIEFJEEEFGCMIBMKJFMBHKNJBJH@@" "DIJJIGCFLMIBEKABJNJJJODJKFNOOGKEKJKEFKDDJIKEFEGKBJEEB@IHEAABKEDOKFMMOGOOOKKMDHJDIBABIIDHABEDABBKABEBFFIE@DMABJBDDHAABDBDBIBDJABABDD@IABBJDEI@EDKCBEBDFJBDAEBD@IDLJDBDIBHIENNOOOOGMMKFOIEFJDDE@LHBEEBJFOECEFLJIAFKEFJNMFOGOKKFJIGJJJKJJDFMBDMIKFGDJJLI@@@" "KFFEOMNMKGGOOFOMEAOMOEOONOKMFLNNNONOIDJJJB@JHJ@@D@HLEOGGLFNMEDODFMKEJNIECGOEKEEABDJMBEACBDJBJDHHFFDDHHJBFIBFDADJIEDFEABIEDEAEDJDECAEDJIDACBDKBBHHIACC@HIBJBIBFDEBEJIBDEEFMGOFEDKJMFMKAGIEEKKAOGGMAHHA@@BHJHBBJJIDOKOKKKIKENOKOOMGMOLEEOKGOOGFMKMOMCCFH@@" "DIKGJKGOONOFMEKCNNJKBOBJKJFELKIJIDDIBIEE@MOEOEOOKOGKOJNMKKJJOKIKGJNKEAFMFM@D@A@FHIB@IAFDDJDLEECBHHIIEBIDIBDIBDE@BHA@LDDBJBHJBJAAAHD@J@EABDIBDIDJEDLHHJFEEAIBIACDDHBDHK@D@A@EKEKDEFKJOFLNOJJNNMKJONOGNOOMGMGMHEEDJDIADJLNIMCBNJJGJFJKKNFMEKGKOOOFJOFLI@@@" "KFFNOOMKJKNMKONNAAEDM@JD@@HHA@B@JJKDJGJMFJJOJMKDNMNOGGKKDD@ADDFEHAADBNMLMJJIEFFICBDKBJ@IAABA@DDFEEBBIEFIBDIDDIHJDEJE@HID@MBEHADHHEBMABHLIADIBDKEDJBEECAA@DBDDDHBJFIBFDKCEDJJMIMKJADD@MCAAD@AAFNOGGKMKIFMJOJJKEJOBIFJJHB@D@HH@ABHEIEDDCKONMKNJNMOOKKCFH@@" "DIMMJJONONMOOECMNJJEBOGMOOKGOOMOJMEAEHEBIEFKBJFMEGKONMGMOKONOKMOGONKOKOKMABJJHIDDBIHDDMFDDDJGBJHJBDIEA@BDIBEIBB@I@@HIABAE@E@EDBDDHH@DHBBDMBDIB@DEDIBBHJJGBIAACEIA@LJAADHJJJDENONONKOOGMNOKONOMOEKONOEEKBJFKEDJE@MDEEJOMOOOFOOMOGJEBJKMNEGOMKOKOJJMMLI@@@" "KGCKGOIMOEKEJMNKEGEOOELKFKFMJJKDKDEGDBJIEE@JMGLKGMFNEKEAEFIGMFKJOEENIEJNHDDA@BDBIDBBIIA@JII@HDIBIFIJ@JGEIEDJBDHIBEECBJHJ@JHJHBHJJFEEBDHIBBIEDMGBHBLKDJDI@HDLJHDDLJBADJAB@DAA@KJMDKMEGJNKEODKEDEFMCKEOFIOEJHEEDJJAGEAFIFJJMKFKFIMGOMGEFKMJMFMGMLOOFNGFH@@" "JNOGOOOBJNMOGOONONOFMNKJEFIBEEDKJIB@AEEDHBFIBHCD@AIDJDLKFMGMGKOGMONKFKGKBJJJEDIHIAEDDDJEDBBEEABEBEBAFHHDBHAIDJABHHHDD@DHIEBEDHI@AA@HHJDBIDL@JA@HKDBEBEBDEEBBAEBIAAEDDHLIEBJJJFOFKFKOMOGNOEOEKFIIBIDL@AF@JDKB@IEED@BDJNIEEBDKEBNKMKGKOKOOOGMKJJGOOOGKJH@@" "JHKFMAIMNKGONMMOOOMMKKNOOEGONKEDFJMOOFJKKNMOMGNKOOFOOOKNLHJGNOFLKEEDIGNLDHIDIEBCBFHIIBDLAEDJBFDJDHEEACEIDBJBE@JDKBBIAEABBBEBBBDEDDJBFIBHEBBJADMFDEE@IBICBBIEDAIBDLHKBFBEDIDHIAKODIEEFIKGKOBHIKNOOOKGONKOEOMKNNJKGOMJKAEFKOOEGOKNNMMOOOMMKOOFKMLLEKFHJH@@" "KFJEFKGKKOOOOOKOOOOOOFMJJKOJJNKOMOKNJMOOEDKIGMENFMONJNOEMEKLMHHJEOFKGLAAABJAB@DHE@CBBHIAJDE@LHI@EBIBDDBBADIDHEAA@DHBJHJDIE@EDIBHJJ@I@DDE@IDIDBBAABDJE@DHIHEABLDHJBF@E@I@BDBJDDDAOFKGMBHHMINMEMGKJKOMKCMEODNIEGOMJKNOMONKJJONJJMKGOOOOONOOOOONNOFKEBKFH@@" "JJKEKEMEGMKFEOONONOOKOOOOGOGONNJKKGEOOMMOKOGMKOKMOMNOMNOOOFCFCEAO@MEOAFEFDIFDMIFJEDEDKBDDI@EBEBFLFBDIIMDJEBABHDJFIADDBHIBDJIBDHJAADDKBI@JDBEBIELLIBCAKBEBE@DIABFIEAEBKDMICDICECDGMEHGLEFCFCGOOKMOKMOMNONMOGNOMMOOMGFNJKKOOGOGOOONOOKOKOOMCFMOEEMFMFJJH@@" "EEFOEGEEDBODJJJMNEJIGMMGONMOOMIEDDJOBJMCBDJJEEABJ@JJECAHIBJJONOOEO@JBJIA@IBHI@BHHLIHI@DIABDHI@DIAHEBBBAADHDJDDI@HJBAADABDI@DIBDADDBBHHDIABI@IDDBBBE@LDI@DHIBDDI@DHLIHHJ@DHJDHDDJJBHGMGOKOJJJDHLFEBJHBJDEEBJIBFEJJGJIAEDMOOMKOOEMODJMCMJJJIGJAEEGEGKEE@@@" "BOMDMDJOKOMOOOOONOOOOGGNJOOJNONJJJE@MEADEEDEEBOEEOKGJLNGBLIGMFKDJ@KADBBFEBDEBEEBBABBBJIBDDICBEIDDBLIEDJFIBJBKABEE@LJLEJDIBEBDIBMAJIHEEBDFJBJDKBIEDIJAADMBFDIABDJJBBDBBEEBEABECBBADFHBIFKEODIJGCIJOFOMEGJEEAEEADEEHEBJJKOKJOOJKOGGOOOKOOOOOMONOJIEIEOJ@@@" "OJBIBEE@EEKMDJEEAJIJMOOMKMMGKJJJLIBGBIFKMEKNMOJONBNNMOMMMCJJJDJEEJHDEDLHJHIBDLDEEDEDJDIDEABDDJBBJJABAADHJDHDDHDH@E@JA@BIBFHKBDJ@DBHE@@I@IA@IBHIDDBDBJJBBIABDEADIBIEAEEAAIBDHJHIIEA@JMEBIBJJNEMMOMKKJCOJOMKNMENKDJGBDIJJJNOEMNMOOMJLJLEEBIENME@EEBDJBOH@@" "EEECDIDMJEBKKFOOOKGEJHHCGKONNOKKEDMHNONJKNNMMAFIAMEKKECKKMFOFIDI@DKBJBABDCBJIAEDDIDIDICAHJDIAADLHHJDLJKCHIBMACBBFHI@IEDBE@JHEBAEDHDHKBBFDEJDHNFJIIBHHIIDDDIBHLFDIDIDIAEDDJJFABDBBJFI@DIDKGKENNNEFNMELDKDEMKKNJKOKHMIEFNOKKONOF@HJMGFOOOKFNJEBMIDIFEEE@@@" "NJNDEDEBBIEBDIFJJEMOGOGMKGKEJJMDMEBCA@ADLAAB@JIENADEDINEFJIJDJIBEB@DHLJDIDFBBDHIBFIBABDDBBICFDIABKAAABDDEBDAGDEDHCBIBBADHE@E@IDBBDJF@IEAGDABEAABDDDFJDDICFDJBAABDBDKBDHIBBCADIBIHI@BEBDJIBLJKECLIEADCMDJHBDDAID@DFBEEIEJJMFOFMOGOGMMBJKDIBEDJBEAEACJKH@@" "EEDJLIHHEBAEADNOEKBOOEMFNMGOEEBKOIENNONOKNNMOGBJENOKIGENIABBKEEDIDJJBADIBA@LLJCBE@BDJDIAEDBD@MBJE@FFDHJIIEBJ@BDADHDCDHJIABEBDDJHIFA@IDAB@BJEDLJHICC@EBJEHABAEDDIBIB@EBFBIIHDBDIDBBJIDIEEFJBDDKMGDNOKMBJGGMKKNOKOKKMDONJEEGOEKKEMGOJFMGKIDEDBE@HLIJIEE@@@" "JKIEBBCDJDKBFAIMNJOMOOKIABJBOJEDIFFIEEEHFKEJHNOKOKMGGNJABJDNJEBABBBEDMABDJEABDHDLJLIDIBBHBDIE@HDHE@HIEEBBHDEBJHJABIDAB@DFDMICA@BDADJDBHJJEA@JBEEDHHE@I@HEDIB@JBDIDIJII@IBDEBIBDEIEBBBDBEBKIBJDBKOGENONOKHJMFK@MEEDKCDIEBOJBJDDNOOMOJKMLLCBFIBIFBBEDNJH@@" "EEEEEEDADIDE@JBGKOOOKKGONMEM@JKCFMIEFJIGIEEGKMKGMGKNMEDJEDI@DIDJDLLJI@DDIDJJHIBJABABACDMBHIBDJKABJFEBDIDIBI@DHC@IDB@IFIBHJ@BHJDKDHBADHF@I@DJDIDIBECBJDFJIBDHJEIFDBDBDBJDHJJIDIA@DJIIIBIDI@DIEBIEEKNOEOFMNOEEDODJKEDMKFFJHEMEKOOFNOOONOBBHEADIDAEEEEEE@@@" "EJJIBLIEABADJBJHDMNNOENEEKKBOENNMKFKMKGJONKNOGOOGIEKJKIBMEBNKJIDIAAEBEBKBIHICBE@JDJEFDA@DCBDIB@JDHHIDIBBDJBJIBHEABDIB@BHEAEDE@J@BDIBDE@JDJJBIBBDIDHHIBHBDIBFA@DACEBIBHEBFDHLJFJEBEDDDIDJNKJEEJDNJNMDOGOOGKNKOJOFMNKFMKKMGJFNMECMGKKMI@JJBIDBDEDIJDJJM@@@" "KEEJDBJJFEEBHJDKCCEMOOEGMFJOEFIEAFAFKFJEKBMEJMGFNNKDEGCEBDF@IBFABJEBHLHHFJEBDFHEDIDJHIDJHHHIBEJDIEBDADEEA@J@BDB@BDHBDEDB@JHJHBAEAB@IB@BAB@BHDEEADABEDIBMBDHHHJIDHJIDIE@KABEBK@HIHJEBJDCBDHCABEFGEAFKKKGEJMEJFMBKFKDCDEDKEGJKEOEGOMMFFFIBHJEECBJJABMEFH@@" "GFKBIEC@IDDECBIDDDIBJHBJKLE@JIFDOMOMKFOMFMCDJJMMEKHIMDLBEDHKBFIEDDHEEACBHADDJHIIABA@CBIAEBBEDHBIB@DIDIJDEEBJLIDLIAC@HHAHJBBBBHL@HHFDDIIDIJJEEABLIDI@BDJ@IEBBEDDJF@DBDDLHJIAD@JFDEE@IAEDKBFHIEBAIELHNMEMJJIFEKEOKFMOMOICDJHEANJJ@JJDIAADJFEAADHFEDJFKG@@@" "JJJEEBDFJAIJDMBJKEBIEBNJJOEGKGMOJKEKFMJKOGLKEEGEMDGBJKBLKKJHEHJJBJBJBDDEBNIIACFBDHJKDFBDBIEABCJDJJIBEBBJIBDBABIADFDECDJBEEEEEBBIFEACADDJDBABDJJBEBDJJIBNBDEDJABCAFJHIBCFDDLKJEAABBJBJBJHM@JNNIJFJJGAEMGEEFIOGNJMKFMFJOMOFOEGJJKJEDJEFJJEIBLLBKABEEBJJH@@" "EEDMBDII@JBDKCEADIEBBE@BEAOMFNAEEDJ@KCNNENKDJJIEBBHECBJAEDABKCEADIEBIIKBEABDJDIDICDDI@HIHBBFDLDI@ABDJDIDDHIDJDBDA@JJDAAE@DEA@EDDABJHDABABIDHIADIBIBD@DIAICBB@LHHDIAFDIDIBIBDEBFLLJEDIDEFFJDAEDBJFE@JBEDJJIFKMCKNFHBIEEDCKEOLEB@EBBEDIDEFFIBBHDLIBEIEE@@@" "EEMEEECBGAEEDMAFABBDJHEHIEEEEEMDJKEONMEEJOOKMOFELMBHLDDJJJJIBDJJIBDDJJ@DJDMBBIBICDAABECBCDLHMABJEJDJBIBEAEBEDIDJJE@HHJD@DIHLI@ABHHHEBJIDIEBEDEBDJBIBMBJDEHIIFBFEBDDAFDJDJBEIBI@BJIABDJJIBDJJJJIAAHJEIMCGMNOOJMEEKOMFJIEMEEEEDHM@JIBBDCDEIEEDGBFEEEEME@@@" "JJIEDEDDHFAEEBFHNDIADCDBBJDIDOGKEFKEBBIIEAAF@@HHA@BBABIEEDIBEEBDBJII@IJIDJ@HJBDBDBJDDMDDHAAB@ED@JABDJBFHDHJDABE@BJEBC@IBIBBBDJDHFBEBJ@EBDABHI@KBBIBDBHAE@BDD@IAEIABJABABBHHBIDJLHDLJJABEEBDIEEDJDBB@D@HH@CDDEDLJBEFKEFOGIDIBJBAFADDICHKBEEDC@IAEAEDJJH@@" "MGFJEJBIBHNJJJICAIDEADAEFDIBI@HJJMDJMMBCAFFHKKECFEEDJDJJIEBDJJIAEDDBEFAEEEECEDJLII@II@AABJEDIDBJHJDIDLIBIBHIBDHFHDJIDBBDBEEEBABBADJI@K@IBDHJDJDIIDIBHJJADIEBJDD@DLHDLIJIEFEEEEDCEBAAEDDJJIBEDJJIBIEECFEFNHKCDFBEMJIEJJHHDJDICEDADEADLFDJJJKHJDJBMBKGEH@@" "BJIFJDLJDE@JJIDDJBBJJBJDHIBJBJCBE@HI@BDHNHIEHDBD@JJAHIBICEDICEBEBAJJHIFBHHBFDIDABBEBBEBJDIBACADBCBEDIABDJEADDIBHEA@BADHJHJEBHJHIDB@DE@JDIADEBIBDDIEBFBADFDBDIBJEBBEBBDADICB@HJCDHJJLBEBEFDIEFDJDHLBJHABA@MDHKHIB@DHHEBFBJBJDHIBJBJJBBIADJJHEABIIBKDJJ@@@" "OENJEEBDIJEEDECJEEDH@LBIBJDHLDLDHKCDFJIE@BBHBKDIE@DJEFDJDIBJFHDJEFDHCBIEFEFIABIDEDIEDJFBIBDJDFEEDDHJBJJIADC@JDIB@DJDJAB@JDHIBHBDBIBI@BDIBHFADDJJJBHIAEECABIBDJCBIEDIEADJDDKECEDJF@ICEBI@KBJDIBICEBI@EDIFJ@JB@EDJKAFFHIAIAHIBJDJAH@IEEBNEAEEBLIBEEBKMGH@@" "DJEDJIEAB@JJJJHA@DBBIADDHHICAAABBDDHHHBBNLJEDHBJIFKEJHIBIFHHICIDJHICHIBJHJIFJMBIHEBAA@HHBDIDJHHDIBE@HBJJDIDE@IBDLA@I@JEB@IBDHBEBHDHDAIBDHEADIBJJ@HEBDI@HJIDIB@HHDDBE@LJEJKDJHJJDHNDHJIDNDHHKDJDHJMFKDJJ@IEBIKJB@HHIABBDDDFDHHIADDJBA@D@JJJJHBDEDJIEBI@@@" "KGJMEBJKEGEEEEGDJMLMBJIEECKDDJJHMABCECDM@ABJIBJ@BIDBDEBLJJECFDBBBEJDBBJEEDF@BBJBBHFLFFECDIBAABBIBHIEEEEDIBJJEDIBAJEDIBHDJBEBBI@JDIEBLBDIEBJJDIEEEEDHJDJBDDBDIFECCAK@JBBJB@CAEEBJBABMBBBACFEBJIJEABADJ@BJDJJD@EIFEFBDEHJJIAFNEEDJJEIMJIGEEEEGEFJJEEJOFH@@" "DJEBJEDHA@IFKHHKE@BAFIBI@H@ABBHE@JEDHDIAEJMDBDHKEDIDJJJKEEJDAKDHLLEADDHJJKIFLIEEEBHA@HHDIEDJJEDJDCBBJHIABI@HJEBDJ@HIBDEBHIBDHJEABDHHBIBEBHHDJDDHJJBFABIEBJIEDI@HHD@JEEEDIKDNJJHIADEAIHIFLABMEFJJJIDIEFHIBAEJMDDI@IEBHE@JBD@@HDJDKDB@EFHHNKDHD@IEBJEBI@@@" "KENMDJKGNOGEOGOFJOMNIFMEEGONMMGIGEICFKFNJEBINKEDDIJKIEE@IB@JNDIKABHFIJKJJHDICBIBDEBKEBKJBBABEDK@IDEDIEBEFBEBHHLHIEBBDI@DAFECDA@DIBBEDHIHHJEBCEBEDIEADHFIEBDBBBNJEFJEABDJFDI@JJNJLK@JDFLICJHBDHEEDNJLIAEFKLJEBKKFKFDMGDOEMKOOEEEKDKMOJKGOGMGGKOFJIEKMFH@@" "EJIBIEEMEIIKJEJJOBIEFIJJMJ@BIFHFJMFNIJIICJMKDNKKKGGGGKJOFMOECKB@JIBIBE@EDEBEDJFDIDDHBDHADLKDHI@EBJHIBHJLIDJIEBACBDHLIBEAB@HHBDEBDIHIBFDBEDJIDIJHJDHJJE@DHIFIID@IB@IADICBIEBEAE@EBDJDJHBFNEGMKGJNOGGGFNNKIFMJNDLJLKKEJK@KDJ@BMJJLKEDJGJJMBNLLMEMEDJDJM@@@" "JEFMJEEBJFFFEKBI@JBJIFEEBEMIBICIEBIABEFEDECFGDJFJJLNNOGJKKEJOFOOEFFBEDJJEJIJIDHICAEBLIBJEADEEBEAEBCCEBEAFBIBBDJDEACABE@FDJEBIC@EBDFDEABIBBDJCDEBEFFBEDEBEEADEBJDIJEDFDHIDJLJMBJIEBCCEGOKGJMFNJOGKKIJJKBIGCFEAECEBDDJEDNDJDMMBEECDJJBHDJFMCCCBJEEBMKEBH@@" "MJIBEEFDHIIEJDMEBJMABHHHMHBBJBDBDMBJJHIJJJE@HKEIELJIEBJKJJOGKFJJOMMOJKEEJEFAFIEBDFIEBEEDHJIHJDJKBDLDDIJJIJBDLIHJHBDEDHJHIDHIDHJHIEAB@JHLIIBBLJJLIAAIBFJIBHLJHIEEBEDKABEDKDCEBMEFJOMMOJJKFOGJJNJJEDJIMDMFHHEBJJLHJJJEIBABBJB@MHHHJDEJJEEIBMDLHICEEBDJMH@@" "JEDLJIDMCBBJEJJJFE@FJCEBJCDJDLIDI@JEBGBDEDJEENJFBAIFHMEDBIBJGEEEDJJJFEOOEJAJIFJJJHDDHJDIBIBC@IDDDMBJKBEBFDMAABAABMBLBB@JBIJLJBHBBAJEJDDBDDEICBEBFJJEIAADHFBDJDIBHIA@JJJKDJLBMGOMCBJJIEEEGBJDJAEEHKDLBCBKMEBIEABGBEBHDIDIIBIFBJEFBK@ECBJJMBJBFEIDJIIEBH@@" "EJKAJFIADFJMBAJHHJEHDLBEEDEBIBJIFKDHHHEAHIFJEIE@MJFHFJJJMFJDJMBJIEIDIMABJIGGGLMLMGKKGMKBEDIDEBIBI@HHLEJDII@JJDJJD@DADIE@IB@BDHEDIDA@ABJIBJHDLIBMAHHHDJDJEADIEBFMOFNOEIMIOGGDJJDELIDMDJJEJIBKEJJJK@KBMHEDMBKDHLE@HHIFKDJJDJEAEEBAI@MBHHJLBEJKADDKBLFJM@@@" "JEHJEIDMEIEBJJEBJHJCIBLJEBJDJIAC@DAEBJJJCCAHKFDEBEIFJJJIAEEMEBNJFJBIF@NNKFJIEKFCKJEJEKNMJEEBJJBDBEEEBJBIFBKBDMBEBEJJIB@JJDMIBJHBDJJMBEBEIBFJCDJBJEEEBABBJJEEBMKNMBMBNNCFMDJKFKKHCDJBKBKJEEMEDDJJJKDMBEACFHLFFBJJJEDA@FDDJIBJEBIJDNBHJJEBJJEDMEIDMBHMBH@@" "EJGDJFJBJBEIEEJEABEDBIBIJJHKDNFDEIFEDHJEDDFEEIAJLJDIDEEBNEEEBLAEIDIBIEAADIECE@ILDEBCJB@KEKJNJJMMNNJJMINFMMDDI@M@HLA@BEE@AE@ED@EEB@DAHHEHDIAEMKCLMJJKKMMJJKJNMFHBBNBEAALHEFEDIDDEDJDIDMDAJEEECJEEADIBIJLDMECAAEBHIECDMACCIFHJJLJDJAEBDEBMEDMBBJBKBIGBM@@@" "JKJIDHHHIEEBHJDLEDJBMBJBEBEHIDHJJBHJABDJIIHICJFAEDJEBJBMBJJJEAJJBAFEBDJDKBHLJKBABHIDAFNHBDEAEEJBJIKMGGEJJDKJJJ@FEADFHH@EDHJHIE@@HKADEC@BJJNIBJMGGENLJJBMEDEAB@KKDADHJDBFJIHJFIBIBECDBBJLEBJJJEJBJEBIEDCBNDHLLJIBDBHJBJHIDHMBEBBJEJBIEAIBHJEEDHHHIDJNJH@@" "KJNOEGEKEBKNCBJAEEDJIFDLHIBCBGBHHJCDJLIDBBBJGDIFDJIMDJMBDEBJJJEEDN@JDIEBDECABDDJICBIFIABLJJDKEEEEFEBJJJDMEEEEEMIDEBHEBE@IBHJDHEBE@JEADMMEEEEEIBJJJECEEEEFIBJIJDDKDJFDJIABDFEABEDIBHCIEEBJJJEABEJIELJICDIGBJBBADIJIFBHHJGBFBDHIICDJIEEDBJFCNJEFMGEGKJNH@@" "ECJJOJJDIEFJLMFMBIEBE@IAEGEDDMECCHLAB@JJMEEJMEE@IAFJEEBLJKMFIEKEE@JHIBIEJJDJIJIDFDFBHFDEABDJHDIBA@IEEDJIBJJIBJJFKJDE@HHFBJBBJC@HHEABNKBJJDJJJDJIEEDHDBDI@JIBDEAC@JCACADJLJIBJMDJDHJHEEFMDKENJIJEEBKDDHEEEJMEEJJHBDAHNFEEIAEGEDDHEBEDJEKEIJKEDIBJOJJNE@@@" "JEBJIEGEFJNLCBI@JJEFJEDEBHDIECJDHCBJIEIE@JJDGMBEFDIBJJJAEEBMFJDJJEECBJFDDIBHJECA@JHJBHJJDDIBBIBDJEJIECADIEBBEBEIDDKJJEBHMAEDEHJEBJNIADMBEBBEDIDFEDJMBIBDJBDIABJHJBHJHDFEBHJDIACBJFEEBJIBKEJEEDBJJJDICEBEOABJHEDMDJJF@IBNEDI@JEAEBKEBJHDJFAKJKEGEDJJEBH@@" "DMEEFBHJIEMKNMEEEFJDDIELEBIBHHMBEDDIBDBDEADJODDI@IFJJIEMCEMJIEJJHLHHFA@IIFECAJDFJICDMCADIIBDMBDIEDEBBDFABDDLJDJBEEDEEKEE@JEBHEEFMEAEEBBIBIIABDCABBEAEDIBEIBDLIDFEIFDJKABLFECDLHDC@HIHJJMDJMMFEMDJJKDHDIAGJIDEABABDIAEBEHHJDJEAMDIABKEEEEKNMMDJHJCEEEI@@@" "KCEDHMEJKBJHEEJJKLMKKFDAEEFEBELJHIEBDIDJHJEHNKJDEBLDEJJCFCFMNJEEEAEBHJEBBHLHNDJHEBDA@DDBBB@I@DKCAAHDMBHJEEIAHIHHHHABBBDJOBHJGJIBBBD@HHHLHLDMEBHJEI@LDFFI@DHBBBAA@DABE@JICHIHJBEBHJEDEEEBKMKFCFBJMAAJEABNKHMBHJIDIBEDHJIMBECEEDACFNMINJJME@JJFJMEHIEFFH@@" "DDIEEABE@EDKIEEEFKEDJIJLJBIEDIGDCBBLIJBJJIHCODEBJEBJIAENELECCEJMBLIECDJMEEAE@JJEBHJJEJIDLHGBJIHDFJBIDDKBIDBDCDCEBEFLMDIE@IJLHEDIEIKEBEFAFABADJFIADJBKA@LJJG@IIDJMBJHJEBJHEDEEEJIFEDIJEJMFFEAMCMDDJJEBJEAGN@LJJJBLIJBFAGDIEDJBIJLJIEFKEEEDNIE@EBDEEDIA@@@" "BKBJIFDHEBI@FEBBIDJIDNMIJMFJEDOJLDJAD@LJABEDNIHIDJMJFNK@JAJNNJBBDABBDBIBLJDHJDDJDCADJABIADHFEBBI@AEBIE@DBIDIDBH@DH@AHEBHEBEBE@JE@L@@I@@JADIDJA@EDJED@DJBEC@IDDJDBIDFABIABHIBIJDJABBDABBBKKJLBHFKKBMJIDHLKIEBDBIHADBIAJOIEBKEJLMKIDJIDJBEC@DJE@ICDJJFJ@@@" "EDEDJIEJIDDM@JMMDIDFKA@GEBMEJJOIBIDJKEAEFLICNJBBJIFMIABNIJDHIEELJJIDJJDJA@MCBII@JLFADJDBDAE@HEEBEJHDJDJJEBEBJDJJIAEJBHDDHEEE@IA@JBMDDJJIBJEBEBJIBI@JMBEE@HEDABABIDCAJHDLJFEHDBIBJIDJJIMEDHIBLKJDDMKDJJBBKNDIKEDEFJIDJDOJJMEJEG@DFKADIEMJHEIADJMDJIEAE@@@" "JKJJDJJBCBIBEFBHIIAI@FKHJFBJLMNNHJJIDDDJHABEMAEEBKKBBMEABACGBBJCDDJIBDIDJMADDBBMBC@IABIE@J@ECBDDJ@BIBIFHJJHD@I@@BB@EEBIABJ@BJDDJEE@BB@@DHA@JJHKDJDJ@BIABFE@BHEDJDDHFBEJBAADEJIDIBDJIAFBJBGFDBDEEJBFNJEEDEMBD@JIAADJJHKKMIJJCBHNK@DLDLHJCEBDJFBBJIBJNJH@@" "BJEEIEADLEBLJ@IBBBNBNHDBDHMECJENKFKFOJJJBJDKJEBJE@DLMBJEEDLHNLJMEAAEDIBIJ@JJMFN@EDEBDDJDIDJJDDIIDMECDDHEEDGAJDEKDDK@J@@DDHMHIA@@BHFIAFMABLGAEE@IAFEEIDLIABJIDIBIABEAE@CKEJJHBLJDIEDDEEJIKHIIEEBJEII@EBJEBNIBJBJJOKFKFKMBNEEHIBA@KJCJBBDHBIJEAIDEDMEBJ@@@" "EDJDFJFIABDKEJJIDMAJ@JIDIE@JLDKMDLJKJMJMMKKGLJDDJKIA@DDEDIAEEBEBIFDHBDEBDJEA@I@JJBJDII@ECBHHIABBA@HDEIEHEA@D@I@@BH@B@JEBAB@BDBEBHB@@J@@DHA@DE@MDMA@HDBBDDHHJFE@DLIBJBJHDHDEBIBEAB@ICDJEBEEDDIEAA@DDNJIABIOFNMMJMJNJIIENIAJHEDIDJHBLEIDJJMFIBDDKBKABIE@@@" "EEEC@DHJEDJDHEEBE@JAE@JIB@EBBJEOAAEEBJEKGDDOCDIEEDBFEEIJEBJJMJJJJ@ICIELDI@HJEDMBDJEDJBDJDDECBJDIDKBJJBDBJFFMEBBJHBJDI@HHFEEEC@HHDIBJ@JJBEEKCBJABBJJFIDIBJFEAABIBBIEBIBEIEBHHDIAMDNDHBJJJMJJJEBLMECBAEEDIFGIAGFMBJEEDDGMBJBE@BDJHEDBHEBEE@IBIEBHI@FEEE@@@" "JJJDEAE@JCDJEE@DHJAFDIBDIFJEDHIGFDDHIIBDJCKODOFJHELIBHBEEEABJDEAEEBDBBBIDJJEJIBDIDHIADIDIBHDF@IDADDHDHIDJHH@@DD@BH@IBBBBHHE@HJBBBDH@J@AA@@@HJIDHI@IADADHCA@JDIDIDDHIDIBDJMBJIDJBBABEEDEABJDEEEB@JDIM@JKGIGNNBIBDLHIACGDHIEBKDIBDICDBHI@EEBIFBHEDEABJJH@@" "EADJJF@NDLIBJJKKBDM@JCDIB@IDECEOHJIBJBMKEDBOEJMKOKCFMEFJMDJEMKBFJ@JJHLLJMDIDIBDIBABBJBBIBJEI@KBEFAABIBJIEEDIEAABHABBHDHHJJHJJHHI@JBD@JDDEDIEEDJJDJDDCEBFHDMBJDJBBJBDBDIBDIDIEJIIHJJHBKBFMMBIEJKEEKFFONMJMGJAEFMJBJDJHOMFEADHBDIFBHEIBFNJJJDIICHCBJIDE@@@" "JEEA@IE@IABDJJD@MABDIDBBDJDEJD@GM@DIIDCDJEENJEBNJOEMBJIEBIEMBFFIDKABKAAAAABEBDIBJJDJBEDBDHHBE@EB@JFDBE@BJBAB@DDDABDHBHBB@EBE@BB@J@IBDAAA@BDBBJ@EBACBHBE@EB@HIBAEBBIBJJDIBEBDDDDDFJDFIDKCBEMDJEDJJEMGJKJEBKMEBIFADLI@EO@ABMABIBBADIBDEHABJIBDDHEDHDEEBH@@" "DJIFMDEFDJHIEDIE@FHIBEDLIAAH@IFOJKBDBAFKDICNADEAEEFJMEFJMJKKMIHBIHNE@DLJJFDIDIBD@ACEDLIIBBBJJFHHEBHKEBJM@LJDIJIADDABH@HHJHHHJHHH@JDAADDJLIBIHEJJEFHJE@HKBJJBBDLIIEFD@ABDIDICBJII@ECHLJ@LMNNJMJKEEJKEEDEADCNDIFKDBABFJOKDH@LDDIIEBDHK@EDIEDHJICEAEKDJI@@@" "BJEABBHHIDKCDIBJEHEBDHIABFBCKB@GNHDIDJFLIFGNJAIFHJIEBDJJJJOFBGEIBB@JFIAEDHKEEBEAEDHDEBBDHMDHDHBBJEBHFDB@EA@ID@BJA@JEAE@K@BEB@FHEDEBHDBJ@ADHDE@BAC@JEBJB@I@IEHIBBEA@IEDEBEEFHIEDDKBHBBDMGBCGJJJJIBEDJHKDLBKOCDIKBIDI@KO@BFNBCBDDHIBE@MBJDIFFIDHHJBDEBJ@@@" "MEDJHMCEDIDHKEE@JEBDIBBDDHMDDEEGKBIBEADIEACMEFBHCADDDI@JKEDMMJKGEMEDHJK@IBDJHEBJABBI@EEAE@ABICDM@HEBNJIKIDKBAED@DE@@D@E@EDHIE@E@A@@EA@AEDBFIDNLJKJE@HEIFDJD@EDEE@DJBDBJE@JIBDHFJHIEEMGFJMMIEFJHDIAADF@JCEENDEDIDEBDJFOEEAAEHIABBDIBEBHEEFHIDIEFEHJIEEH@@" "BJIEE@DBIEBEDHEEEDLIBDLIIB@IADDEGDJDHDKBJDGFH@JCDDAIBBGFJJKKEEJMGBJKEBJKEDKAEHJ@JDHBEJHJ@FLFBDEDEEDDDIBDBBDDJ@AEBHDIIE@E@EBE@E@EDLI@JED@BIABBABDIAAEEAEABCAK@BHJMB@IBHBHMDFIEFJJEFJJGEJMEFNJJKGBBDLAAFBH@KGABJFI@IBIGEAADDHBDLIIBDIIEEE@IEBEDJA@EEDJJ@@@" "EECDJJIDBHEKACHIBIABFIAJBEEBJIBKOM@IBJDDHJOOEMHLBJJBDLHKEFDJIOEAJNJJBLKFJI@GBCAE@IEDHECDJH@HDI@I@@IIGBDJMEI@@JJ@DAABB@DHBHE@J@I@BBDDA@BJH@DMEJIBGDLH@DHDI@H@JIFE@IEDHEDFBG@DJKFIJBJKJLEGLJICEFHIIBBJJAHMMGOJHIABJDHEONJDJJEEBBLDKBDDJDHNDFM@JADJJIFEE@@@" "JBHIDDJJJBJDMDEBEBDDHBDAEDDLBBDFOFEBD@KACAONBBC@MAADJAEBJHJJJEDJAAEEMBDEEFKHEDDHJEB@IBDABDIEJBFJGJBBNEAE@DBCB@@I@DDFHJABDBHJABDBHKAA@DH@BFBA@EDECJBBOBKBBMDIBDABDHBEBHIAE@NKEEABEMEDDBIEBJJHJJEDBIDDEHFBBCOLFDFHABECGKABBAIAEDAB@IABEBEAEIBJBJJIADHJBH@@" "EMFJIIBBDJJI@JJDJDJIEDIEDIIEDLJKNOJDHMDFDGOFIDHM@DFIEDJFJJJJEIJDJFA@BDKOFMFGNKKB@HHIBFIDDIBDADH@HBHJEHJJKBIDDIEBBIA@A@JHIDBADHJHD@DDJBEDIADJFJJHMBHJ@H@IDABDIADKBDHHHBFNKOCEKGNIB@DCBIBLMBJJJKBIEDKA@EHIDKGOACAEHIBOKNJIIEDLIEDIEDJIBIBJHDJJIBBDLJKEM@@@" "DBIEBEDLIEBBODJJIAABBIBDIBBHIA@FOMHIEABHICJNBEGAFIHJJKEEEE@JHFMADHJEDID@HIEJJJDMKEBBHHFBJBDIDEBKEDE@MFIEDHDAAB@DDBBCDBBBBAEDBBBBAFBBAA@BDDA@IEDKEHEAEFJEADIBBJC@HJBEFMIBJJMDHHADIEBHIDEK@JHEEEEFJJHLKDGEBCJNDHJDEDHMOK@DDHJBDIBDJBDDDJJIGJBEDIIEBEDJA@@@" "IEEDFJIBEDJI@CEDDJJDLDDIBDJJDJBGOKFBHJEBDNOMDJHF@JGEEDLIEDEDGIBFAEBJIDKOCBJEEEKKDIDMEK@DDHIBBHDHAABJN@CEBBHJB@E@HHDDIEDHLJEBIHIEDIA@HHE@BBHJBEF@CJJDD@I@JBDHIA@FMEIDIFNMEEBJFGNIDJJEDCBDOAEAEDIIEEGBHC@JIEOKIBEBHJCFOOBBIBJIBDIAAIBJIAEF@DJIEBDJKAEEDH@@" "JJJIHJDDHBDJEDIBJFBIA@IBDIABIBDNMGJLBADEIGJNADEHMDHDDJABBJIEHDMHJJJDJCD@DDIBJJDFJKEBJEJIABBHDDICFCDBLMDEDJA@EBHEE@HJ@@BAA@HHDDB@@BHHEE@JE@DBIEAEIJAFCFDIA@JBDDJMBJEFJKABJJDIA@AFBIBJJHMI@MDJJBDBIA@IEHMADCJODMADBAJOEKIBDJDDIBDHDDJCBJDIEBIB@IABHLJJJH@@" "JEIDFJIIGMIEJJJDIAEDJKBEEBFDBDJCONNAHNE@CNMNJIJBAABIJEEEMHKJFKBBI@BIBLIMIABEFECHEDIECGEBMDJEIACDHLAGEBMJI@JJHDBH@EBABJHJDEEEABHJJDBE@@JA@JJHDJMJEGDAHIFDDMBIEJEGFEDIE@NECEBDDMLIJDJ@DJBFKBNHMMEEBLJDDBBLJKMKN@ECHLCKONBIBACBEEBFJIEDDIBJJMDMODLJKADMBH@@" "DJFIHJFDHBBJEBEJBFBAA@DI@DIBDI@JNMKKGEMEEOKKBB@HJFEBDHIBBCBBHHEEBJLDDAJBBKDJDMDEEABADJBEKCDJBJDACAEBMDCEBED@AADAE@DDD@B@JJJJJHB@AAA@EDADD@AEBEFAEJEDFDABJBIFFMBBIDBDEEAEIBIFJBBLAAAJJEE@HJBFBBDHIBECBHHBBFNOMEEMGFNMKJHDIBDI@DI@DDBCBBMBEBJB@ICBHLKBI@@@" "AIIDKDIEEEEELJJ@LHHJJEAJFIBDMBECKJOFNOEKCNMNEDKEDIBECCBDIDEIEBFHI@AAIFBIDDBDKABJBFHIBJLJBDKEFJMCDJ@CNBHHDH@JJBHJ@E@IAE@J@@E@@BHEDDHE@BHJBJH@I@HJCN@BIFEJKEFIBBIJJDHKBBJDFIBAADJCDLD@DHKBEDMADIBFFEBDIEFIECMKNFMGKKGJNNEBEIBDKBLEBJHHIHBJIMEEEEDIFIDLL@@@" "FFFA@EEBBDJJADIECECDBHF@IBDI@DHEGOJOMOONGEKLIADJIBJHDDEEFJJFKDMBJDJJEAEBIIIADJEHLHDCDAA@DIDDIFJMIEDGKIBEIBI@@EA@E@BBH@B@IA@DDHB@@JB@E@DE@@DJDMBDNOAEDMJKDIADI@DDAFA@IHMBIDDLLJEDEBJIBJEIFKBJKEEAA@JJDJIDDINMGCOOMOJOOE@I@DIBDHC@JAFEFEDIDBJIBBEE@DCCC@@@" "IEINJIBLHK@JJIBIDBDADCHLJDIFFIBINIEMONOOOOMMBJIEBJJEJJJJIEEIDICEDIIAAFDEBBBFIBJKABIHAEDDIBIABIECGJIOEJEJBDJEDHBDHDHHBJDIBFJKBDIBJ@HI@IB@IEBIBBMBMGLJOFEDJDDJDIAED@LJDFJJDKBBBEACDDDLIEFDIDMEDJJJJMBJJEDJJEMOOOOKOMMDKLJDKCDIBIHNADABADJDJJHFHIJDJKLMDH@@" "FJFADKEABDGDEBNBIDIJEDBAHIBHHBDCENMOKOOMOGCJEEDJEAEDBEECFJIECBDJKBBBJ@ILDHHICEEDDJBBJJIACDBBDJBIDBJKOFJDIA@DAABIBIBBH@AADHE@IDD@@JBDJDJDDA@DDIBKGNJJADJBIBBAFDDJJJBBIAEEFDHHIALHBJBBFJIBFEDJKFEEBAEDEBIEEBNGGMOONOMKMFAB@HJDHLBAEBLIDJCJEAGABDEFIDCBK@@@" "HEHJIDJDEBHJJE@JKBBAIBJJCBEEBJIMKNKKONOKNNOLJDKDJJBIDHJDIEFJLLKADEFNBKBAIJKFDBBJJAEDJIBDDADNI@MBIE@OKOKKKDJHJBD@DDDHBEDBAE@EDBAEB@IAA@ABBHJIFNNONOHEDJEHDKIDAABDJIEDBJJBACFJLLBFJCKEADFIIJKEDIBHIDJBJIFIBIOKKNOKONNKNMLJJEEBFBJJDLBBFJHEBJHJEABIDJHM@H@@" "JJEEBKBJHJE@JJEEDDJLBJDDLDKBEDBKKKLOOMOGOOOMDJHKDEEEEBICBDMECAIEBIA@LHDJB@HAIMDDDNDIDBDIIDI@BE@ECBEOJJMEBKEC@EAFIAABDHADJDEABID@IBDDDKDE@FEFJEEJJOMBFE@EB@DIDLIBADICIAAELL@HBBI@IHDDJEDLFEEIBFDJEEEEAFHJIEOOOOGMOOINNNJAEBFIAIABJAJIAEEBJHEBHJJFJEEBJH@@" "EBJKFDEABEJEEFJJIEEBJDIIAEDDLIEOEGGOGGGOMOOEBIEDBHJBJLJEFIJJLFCDEBFEACBIEGBNBBJII@IBBLIBBEBEJJFJDDJOCEBJNHJLMNJ@ADDDIBJI@IHLHDJJDIAAD@BKMIJHKJJEFGJIABKBJMBEBBDIJBDHDLJJBCJGEDJFDECBEAFCAJJLKEBIJJBHJAEDJEGOMOOGGGOGEGMDIIAEDDLIBJEEDJJKEEBMBDEACFJJE@@@" "JEED@JHJEBDJJIEEBIADIBBBJHJIABGONKMKNOOOOONJDEAEIBJJEEDJHKFECHJIJDHJJLEBDHE@MEABBEBIEBJEDHDJBDHHIBANIBLIABICCAEMJBIBJHABEDBAEBD@JJDJBMMDFFDJDDIJDKLBDHHIBBI@IEBJEDJEBBDEEHE@IBEAJJHIBLJHNECFHJIEEBJJDMDEABKOOOOOKNMNKOOBDDJHJJBBDIDDJEEDJJIBEBHJHAEEBH@@" "IBJIFEGBHMIFJFJJEBFADEDJBE@JJHMKLOJCKOJGJMMHIJEBBEEDHJKEEJHJDCEBDIBDBBJEEBHEBJFDJJFBDI@DICIDHIBKBHJMFEABFDFDHFJBEMBE@BDDIAEDDIAB@EBEMBBK@ICACBDECEJHJFJDHIDNDI@DIBCBJICBJE@JEEBJBABDIBEFABHJMEFJHIEEBBEBLHMMJOBONNBOINMHJJHEBBIEADCBEBJKBKDMHJGECDJJDH@@" "FEEBHJHFCBBIDIDJJJIKALEDLIGBDKKOIGMOOOFOKOKEBBIEEBJIEDLJJJOEJLEDICEIJMEDIECJLHHIDDHMADEABDBICBE@FBAM@NFDHI@JBH@HDBDJJHIJJJHJJJLHJJIBA@H@JBHDHICCHELBC@EBFDJABDEADEHIADHHIJNEDIEEJLMFDIEAJMGJJJIIEDJJEEDJBEFONOKGOOMODONNIBGDIIEALFLJJJIDIDJBFC@JHJEEC@@@" "HJJJEEBJLDJEEFKEAEFDFA@IABHDI@OGOONEGKENDCOHIECEEEFEEEIEEJHJEAJMFDBFBBDIBBDECBKBIICAFCJDDJJBDDHJHLJNEDHJEBJ@EEEEIEEDDBKEBHB@JEFJAAEEDMEEE@BJEBHIECJIHJHIABBJIABNCDFDLJFJFEABBDIBBCBACEJLEBHJMEDMEECEEEFEDHONACMFOECOOOGHDI@JDDHDCACEDEFKEEBIAJJEEBJJHH@@" "EEEDIBEDAKDJIEDJGBII@JEBEEBJJGONLOMMOGMEOOOEBEDBJJIBBBFJJEGENFAI@IIADJIEEDKEDDHEBBDEAD@BJBDLJICBBAEJJJEAJDHDH@@@BHHAAB@MMBMJEMHBDD@HJ@@@@I@IBLEBJJMDBBFDJIIBBJ@ADEABBE@IAEFIEEDJIDDLHDLCCMGEBJKBBBDJJJAEBEGOOMEOGMMOIKOOBJJEEBEBHDLJGBIEDJIFLAEBDIEEE@@@" "JJJJJDJJJDEEFJCEHEDBMDJEEBEEBKJOOFJALOFKCMKJDJBLHEDLMMMDDHHI@HKFGBBJJIBJJJHJJMCDEEBJDABL@LIAIBDHHJIL@EDJ@IBIBJDJHBBJDDKBBEBEBBFIABJB@JIBJDJDHBIE@ALJHHIBDLDIHAJDABJEEAFEJJHJJJJDJJJBGCFHHDHHIAEMMIIE@IJBIBNMNFKGILBKGOJNJEEBEEBIEJAE@MFBKEEABJJIBJJJJH@@" "EBJEDIDIEBLJIEDJEEBJABDLHDJBDNONNOMGMNONOKGLEHMACEAABBJJICCBOEELHEEEABEDIBBJICDAJIEEAFDAEABDBDJBBBOOONIAEBHBD@I@BHH@JH@DIBEBDI@@JH@HJ@DHAB@JEDDKOOOJBBBIBABDEDACDEEDJLAFDJJBDIEBDEEE@IMEGJFFDJJJBDDEFDEHMAOFOKOKMOEOKKOKIBBI@IIBDBJEEBIEDJIJEDIDIEBJE@@@" "JKDHIEAFBMAEFIELIAEDJDIABIDLJEOKOADENMKKCFOELC@JHJNJDIBADDLJJJKACBBBJEEEJDMEBDJJDBBHJHIFBJDJIAEDHDNMMGJFADCDHJBJHABM@AJIDDJIADJL@EJD@JJBHIFADCBOEMKI@IEDDJIBJCDHJHJBABJIBEEIBMEEBJBBFDFJJJIIADBDIBKJHJHFAMGKFFNMKMADGNOMBIIDJDDIBIEDDIMDKEDEJCDEDHIFJH@@" "DDEEBJFHMBNJJJJIBEEADIDJEFAAEONOGNJOMOFNMNNNADEBBDADIJDNAKEEFJJNDLLMFHJJEI@IDJIEAFIGBBB@HAAEBFBIBJMNBOLHDHHBA@H@BJH@EBBBABHJDBBBE@@JJ@@HDB@HI@IOJCMJJDJCBEDD@HBBBGDKDEDJIDHDMBJHKEIIICJJKEEFLCIBLIDABBEADCKKMKKGMOJKOGKOMDDCEBIDIDEEBDJJJJKJEHKBJEEAA@@@" "JKEBJBIEBEAEFEEBDJHJIBEBJ@JFCGOKMJEJOOMOBNKMDJJJMJKEFEE@JDIBMEEHJAABHKEEDBKEBIB@JHJ@DLHJBJJHDHDJDHOKIKIBIABHJFBJJ@BJHDHHJDEABHHI@JJ@BJJCBHJDDJDNLNOHIBI@I@JJJBHII@BHJHBDJEFJAEEFHJDDBHMEEJDIBHEECEFJMJJJIENKJGMOOJMBMNOOFCBHBJEBDJHJIBEECEDEBEDJBJEFJH@@" "EDJHDLFHEJJJHHJJKBBBBDHJDMBHNOOOKOKGNMNNGCMOJEDHBEDKEHDEDJBIBEEEAJJEE@KEAEDBEBDKBEAJIABBJBBBIBI@JBOFBADJBJDA@HH@@JHBBIEEBJHJJEEDJB@JH@@HHDABJBIDBCGJBHDJDJBBBJBDDJLEBFIBEBAEDEFHEEBJLEEEBDJBIEA@MFIEB@IEBOMNGCKMKOFONOOOKHJEIBHIBBBBFJJHHJJJM@KAI@JIE@@@" "JJJBICACJEEBKEEB@FMLLIBDIAFEAOKGENNLOKKMMOCODJJKHJKDDEELIJMBJJJJFBEJJKFFJJBJJEA@DJDBBDEDDLLLJEBMIDNGDKJDHHIJJEBKF@BHJAABDAGDABDDBHJ@CFJEBJLHHIBNIGCIDMJEBIIIIAEABBABI@DEBJJBJKCFJJMBCBJJJJEJLIMEAAFJHNJJIGNGMMNNOIKKMGFOLECDDIBDIIMK@BEEFJEEBNDFDJBJJH@@" "JEDMBLFDEJJMEEEDKIBAABDIBEEJOOONKEEGNOGKCGMMIEEDGEDKJJJCBDBEDBDJIHJEADIEEDLEEEFFI@IDLJHBIAAAHJE@BAONEEEBBEB@@HD@@EDB@DJDIDEADIBI@BAE@@A@H@BEBBEEECOLB@EBHLDDDJ@JIIDHDKCEEEAIEEDIDEBHLJIBAEBABFBJJNIEGAEEDMMOFFOGKOEEFKOOOJMEBDIBDDBDNIEEEEJJMACAJEIEBH@@" "DIEBJBIBJEBBJIDKDBDJJDIBDJOKCFOMOMDEFINJLJIOBDIAHKKDABEDMJLJBNIHDCEBFBFMAAABJA@HJFBIAHBHJJJDBI@EDJME@IHEDHDJJEBJJH@HJIABBEJMBBDDJHH@JJJEBJI@IE@LHEEJIE@DJABJJHJ@LDJCBHHDBJDDDEKBCBEFA@LKJBIJMIEBDAFNHLDIBGLJIJKLKEAEOMOKFFOJIBDIBJIBAFIDJJBEBJDJBJEDI@@@" "KBJJBIBJEEEMBEEEAEABDIBDIENNOOMOGGKJHMEMJEMOLKEECDFIDLHMAEADM@BGCDBDHHJHFJJE@JEBHHIBJBHC@IDMHDJJIAKJJMCDEJI@@HH@@AEA@BBDHHE@HIBB@DED@@@HH@DJMAFEJJNLDJJI@MIDHF@JBJDHHJEBHEBJK@JHHIBAFGB@EIDEDEHIIDKAFEEFIOMMBMMEHJNOGGMOOKKMDIBDIBDEDEEEBEMEEBJDJBJJFH@@" "DFIDLFDHJEDBJKDJFJFDIBDIBOOOOOOHONNMFKJMECKEEHJIDKJBJAEBJDJI@EEHLJMEEGDDIBDJFBMEBEBEBHKDEBA@CABDBDOEHKLBHACEEBJEJB@BBHJICCBFFDJHJB@BBMBJEEFD@JANHMGIBABDF@DBEAFHJEBEBEEJCBIBDIAGEEEJIHME@DJIBJEDBJBNIDJHMEFNEEJNKEKKOHOOOOOOJDIBDICBKBIFJJAEBHICAIDKA@@@" "EADKAHIBJMBJJEIDI@HIBDIBEGMNOOMKOMEKMJKJIODOLBIBKBEFIDJLEJEDJJDFK@BEBHJIJDIE@J@@DHDHHB@A@DJEDFDIEAMDBIADEDD@@DHH@HEDEABBDDEAABBDEAE@H@HI@@AAEADDJAELEDICAEBI@D@B@HI@I@@BHEDIBLJHJEB@FKABJIEBMAJIDKEBFJDJAOIGLJNJMNMEONMOOKMOEBDIBDHHDIDMBJJEJJDHLFIDE@@@" "JFJHFEBIDDMBIJJJJKEBDIBDIOKONMKNMAEFJGNFJJOOMEJBDEB@JKEBJBJCEDIAENLLMEDJABJCEEEFIEBKEDMBFIBIBHIBDEFIEBJAHAABEABBIBHA@BDLIABDDIIB@D@JDJBDEBDD@LBJEDKEABDHJDJDKBEIEFJEDKEEEFBJDBIEEIIKMDDIEFBJBJEFJHBEABBMEOOJJKCOBKEDEKNMKONOLIBDIBEFJJJJLJEIADJEC@JKBH@@" "DIBBHJDDJIBEBBJEA@IDIBDIGOOOOOOGOLHMNLMIDMNKKBDMADNJI@JHIDKLBABJMECCBDAADIDMDBI@BBD@@I@DHBJDDBJDIANJDEHJCBFEHD@HB@@JBHAABFHKBDD@JBH@B@HA@MCBFBHMABKLDIBJAABJ@I@DH@ABB@DJAEIDIDDABFFEEJJDBANIDHJHDJKIDEIBFNKMIDMIKMHIOOGOOOOOODIBDIDHDEBJBEBDJIABHJBDI@@@" "EJEIBDJI@JDJJIBJFFJABDIEKMKMGOMEMJCBMKOFMCGFLEEBGAEEBEOEDABADLIEAHLDIIJFKDIBAIBJLLJKEBEDJM@IIDHIBJMDIAEBHDIDE@BBHIE@EBJJEABDEBJJE@EDHJB@EADI@JEDDIEJJDHIDLHEJIEBEFJIIJJDLBDIFKBLLIAHLEDIIDBDAEGMBEEDGBEEAKGFEKGNMJFBMMEOOENMNMDIBDBKCBJDJJIBHDJIBDMBM@@@" "JBHDDIABEDIADEDHIHHJDMJJGOFOOFOKKDHDKDNHJIOGMJLLHEEBJKJMEJDNKABBFEBJBB@HDABDLBJ@AAADDHHI@@FBEEBJDANHJEHDEBDA@AEDBB@E@HBHHDEA@HJ@HE@BBAED@DABEA@MBHKLABJEEBC@@DHHIADDD@BJAIBDA@HBBBJECBBDFKIBMEJNJJEE@IIJMOGLJHKIFI@IFNOKGOKGOBJMIBHHLHIEADDIEBDDIA@JBH@@" "NLJJIBJDHIDEAIBBDBC@KKEOOMCOOOOENICJOOMEGGNMJECCEEFIAGEJHEI@DFDJIJEDLIEEIJHIAE@KJNJAABBDJIAEB@D@JIMAHIJIDIABJJBHHHI@CEEEDJJJIEEEF@DHHHJBJJDDIDJLHLELJHA@BEDDJIBBDDBKJNHEDDHJLMEDIIEBLJICA@DM@JMGDDKEEFFEBMKOGEEOOJNDKMGOOONEOOMFNHFBABBDLEADHIBJDJJIKH@@" "@AAHBFDICBCDJBEDIDHEEGOONJOMOONKMBEDKOJ@KJIKJJDDEBKBJJJGCJEFJHIED@JAAFIDBBEBDBKDB@BJFDHIABDDHJHIHEJKBC@BIBFD@@KMABBBELBJAAEDDBJAMBBBDENH@ACBDJ@FBFJM@LHJHIABDDHICBJ@BAFJABEBBADKDDBHAEDHJKEBNGBJJJFJEAABJNLJNHBONIEBENKOOMOJKOOOEE@IDIEBBIFBFDICB@LD@@@@" "NJJBLIEBDJLAEDJIBEKJGOOOGOCONMOKNDIEJOMECGNOLDKMIFJEENIDLE@JICBEBM@JDICAEIBDIIDIHMDBHICBDDIACDIJFIOBDMJJBDHEEBCJBDHHKIEBDFBCABEDNHHIBBNBEE@IBBJMIBGLKBLIFDDIABFDHJAEHLIDLIBDMDFDIBHEJEBFDJHEAIDKMEBKDMNIAOKOFEEOJMDICNOMKONGOGOOOBNMBDJIEDAJIBEDIJBJKH@@" "JDAEADHDJBAEBEJJDHBGMOONOONOMOMOKIBDEFFJEMLKIADFFAFJJMEFKIEEBDDJEBEDKBDE@BHIBBJJEBEDBFDDIBBFDABA@BJDIAH@HIEH@DJLLIABFL@DJHMHJI@AKBDDIIJI@@MDHH@LDIBJ@DBDACBBDIACBAEBEBJJBDHJ@EABFIEBEBIABEEDNKEEJJKDCCADDNIMMBKCEABDNOMOMOKOOKOOMOB@IBJMBEDBBI@IDEDABH@@" "DMJJFIBJDLJJJJE@IEOOGKNMOOIOKOKIFBDIFKONJKIOBFIHHNIECJJIEDIEDJIDJDJB@DIIGDEBEEEABDHIE@IBBIDHIDDLJILIBEDJBJBBM@CKIFFJKIFI@BBB@DKDNJKCDNN@EJBBJBIEBDILJIIADHIDJBDHEDHIBDEEEBEAGDLI@BBIBIDJIEDIEDJJNEDKHHLKBGLNJKONKDIBCDNONOLOOMKNOGOMDHEBJJJIIBJDKBJMI@@@" "MBBE@BEDIBIDEIJEBKENOOMOOKGMOLGNMLKJLFBNHONKDIBEE@FJGCEGJJEDI@JBIA@IFIBEHIJDHKBDDICBDJBDJDABBAJB@KKFEIIDI@HH@BINFIMEGM@JDIEDIBHEOEELKCLJ@@HHDIDLMCFNHBBLBBDABIBBIBFDIABFHIBLHMBDKDHDDJBHDIEBJOEFGBK@EEBDIFKOHKJCAJNIMKOAOMOFOOMOOKMFJEBLMADJDIEB@EBBEH@@" "JMDJEEDAEEBBLBBIGJOMOGKOKGOKOMOJKJILJJOMOCHOIJEIDJMEFDEEGMDEEFIEEFGDABKKBBAAC@MIIBDDMBDI@IDEEF@HMANEKOJABEEABDGHIJBKGJEDIBEBDIEBOFJBLHOABDEEBDBONMCLEHHCEEADHDIBEIABDLMHFDDBBFNJDAGCEEDKEEAEOEEACEEJIDMBLOHNGMOJJILJNJOMONOOFONOGMOJODJBAJBEEDAEEBIEJH@@" "DJIJJDIJJDDIAHIBAGKKNNOGGOGGGKEDO@CIBE@ONOJKBBEBIBBJEKMIEDIIA@JDI@HADDDDIDJFDKBBBDIA@DIBEBAHB@MB@OIEGIDJDJIDDJNOOEEDFGJBBDHIBBBOCAEEGOKJIADJIBIDOEDOHBEHB@LBEBDI@DDIBBBFICBIDIAAAD@HDIBHDDLIEDMNMBJBDJEBBFJOKOHEBDN@GIEFOGGGOGGKKNNODBDHLDIABJLIBJLJI@@@" "KEBDJKBBEEEEFCBDKNOOKONOOOMMONOOJOEEEBMKOCHJLLJIBJMFKJJONMBDJJAABOOJJIBJKABHIDLIDIBJDIBDIDJEDJBGOKB@EGI@I@BAALKBOFKMHNLMDJJJIEIKHMNKGJFILDB@DHDOE@BFOOBBIEBIDIBDIBJDIDIIDHJDFJJDJJOOJDDBJIBEKOJJNKEJJDJIIJHNGNMJEEEGJOOKOMMOOOKONOOKNIBFCEEEEBBFJIBEFH@@" "DJEEBDDIMDIBIDDIGEOOOOKOGFOONMNNOHDKCMDEJOBEIAEBEEFLCGGBEM@I@DLEDIJGHKEJHJDKBAABEBH@IJDIDIABA@HJKFEGINNEBELJBINELJOOGOB@BBHJB@BGOGOJIMCLJBIMBECKLOECFJHHDBDDIDIBLH@JEBDDBFIBHJMFHOBLIEAI@DHEMBGGFAKEEBEDDMBGJMAENFI@OKKMKOOKGGNOOOOMGDIADJDIELIABEEBI@@@" "KBJIDIABBEBEEBIFNOOMKFOFOOKOGOGOFNIEMHKAGODMLJJDHIJAG@HOKJGJKIBJOOBNG@BECBI@DOEE@ECBB@IBABFHLDJCDHJ@FMKIDHAAEMHDKMKFMELMIEBEDMIMEKFMNI@MMDD@IDNMK@BHIFBIAHKBDBDHBBFE@EEGI@DJFEB@GCJGOJJDNJOBNOHHGDBLHIBJIMIGODFHMMDKKGOGOGNOOKGKFMOOKKDJEEBEBBDDIDJJFH@@" "DEDJEBFJLJJLJEFKMOOKOOEEJOGNOCONMIBCINDLOFIABIDICBEOBOKDFNHFDBIMG@EANEFJDDBJK@JBFLDBLJBDJDHBAA@JIEAFHKOFABNF@MJIDAFMJOEADFECADEGJMKDADJMHCCJDCGNHKDEDJHDDB@IBIBBIJAAKBBHFJJAABKECLE@GELJAC@KKAFOJGMBFDIDJDDKGIICLNBDMKONGKOGJMEGONOOMNKEBIJJIJKBEBIEA@@@" "MJCAHDIEADJCIDKOOOKGKMKKOJMMNOFKOFEGCIIMNMBKLBABDMB@OJFKMMEHIDGKLJMFAM@IBIDE@GHNHAADA@DIBIBLJBECBJFHEDFMDE@HKLHBAJABEFJJIA@DDJJKEBDBLB@INHHEAEKAE@KBJFEBBIJDJDI@DADD@KHO@EADJDHELCEJINOADHMEMNKBOHBEIBDBANJEKMLLNGECGNKGKMMJONNMNOFOOONIDNBIDEDI@LFBMH@@" "BEDJBIBEFKELFKFNOMOOFGNJIEGKGNONJDJEEEBBNJLBNLJEBJLKDMLLKFBCBJJGKBA@NHGEEDIDJKEFBJFAJJIBDBB@HHHJLOIMGAGOJDEDAOMEJADEKFGCNJGBKNGCFMADBMEOLAEABOODGELOIJHHHHBBABDJJLCBJCEFJIDIEEG@KHDBFOBJJFBCFIIMIFIJJEBIKJAJKJBEEEBIBKOKOFOEDJKOCGOMOKKFKAMFKEBDJBIEB@@@" "MBKEDKEJDEEEIMOONOOOMJKOOEMOOMMKOMDKKMLKKKIEEABJEBCDKKGCJNHLJAGODDJEABHBBEDIENNODHHJADJDI@DEABBCAGCJMJONMKJIKBJFIDEBJEAEJDHIBMDEBJEADKBJFLJNMKOJMJNGDFBBDEA@DIBIDBHHIGKKMDIEBB@JDEBIAGODBIHKJNGFNIFBEBJDEEDNNNIMNNIEONMMOOMMGONJMOOOKOOMLMEEABMFIEFJEH@@" "DEBJI@JACEBJFKOMONKFGGOOLKGGNOKOJBOEAIIDEFNINJDBKELJNEDJGMEAAFIKBIBLJJBLLHABKKMNECBDJAABBE@HJDDJDNJLKDBKKEGFELHEJCHGEFFMLIBDIMKCEG@NBM@IMCGEFNJAFIJKIBIABHHEBBDDBIBFECMNNJD@IIJBJIJDJFLKDDEEOBIECJIMFJABKLKKEADLLEGJBONOKOGFIOOOGCFKOMONKBJEFDBHDJJEA@@@" "IEEBJJHJLDEDIOFONOJMMMGNKGNNKMOMFMMKGKCENANEFJJLDJBJMJCBHNBJFEOELJJACEFBBEJKOEKMKDDI@LDEDHJKAAACIDIJG@DDECDMMBACLKJNJM@OMEEEEOHEJKJNINDBEMIFEAA@GBLIDNDDDFJHIEAAHDIAFMNMGNJMBBCEFDBJIMGMCBJCHJFBMJJBIAJJKECLCMFFOFMMKEOMNKKOFKOEMMJOKOKGLIEAAJHJJJEEDH@@" "JJJJDDKBBIBAGGOOMNOOOONONOMENKOKJJKEABJODKDJOBEABJMDOENMGIIDIGJMAIDJJJHHIDAEMODKFIBDEAIHCBA@DDFBDAB@JJJMHLIBBHJFJFECKFGCJHB@JNGCFNECBKBHJBDIHMJJJHBDABCAA@DBF@LLEABDKFIGMMDADHHJJJIDLEJODIDLOEKMGIEJJDEBGJIFIGJJDEFJJNONKMEOKOKOOOOKMOOOGDBDJBFIABJJJH@@" "MDJJIEDDIEDNNOOOOKJMENKMONJOMONMDJNOOMONMHOMMLJFEI@IJJEENNDIJNOKOBADIGECJEBOKFKBMJHIBJCGDDJFI@HKHMDJDHANOKLMDI@HHIJGHDNEMCMNEMCI@OBLHHHDIEINOKL@IBIEHNHHDKBIAGFBJDHJMJFKFOJEBNEGDIDBGNOKJLICKMEBJLHDMCBIMMOHMKOMOOKJIEKOMOJKOMNKMEJNOOOOKKIEDIAEDJJIEH@@" "AEBJJIAEJAAAOOKOONOIKEFOJOOOOGOKKKKKIKKILCADGKEMKFMBKEJJLIBJBOMGJLJIFEJLBHEONJHGCFBBHIBLEADHJEBCAABBIBDMMNMNJBEEEB@KGIFKJDBABNKDOFHBEEEBBKMKMMIBDJBDDFBEBHIDEAJDHJBCFG@JKOM@JAJMCDJIJOEOJBJDIJJMFJEKFMMFOADFALNNLNNNNNOOGOOOJOKEFLOKOONOOLDDBMDDJJJED@@@" "NBMFIBEBAFFEFOGOIKOFFKEKGLJKMNKODEFGGEKOODGOKDJBFLAEEFFMKNLIDJAKKEBBHKDADEIMILJHEHDJBAENHJAEA@DFJJDHBDKJKEJJNHHA@DJDJBEDFMEEKAEBBIBI@D@HKJJMFJNIB@IBJKA@DEDBHKMDBBI@M@JILMLMADAFHJBEFNLBIDIKNMKCEEDAKBBIFOOAGONMGGCEAGNKMNJIOFMFKCGNLOOGKECCDBEBDKEJCH@@" "AJBIBEBDLHHJOOOOGOMOKDNJOOAEKENGAJENKGFKDNKNOMMLIIMECMKJN@IDIOOGDHEFE@MJIDCKKKKFKFMDMFCEB@F@DBIBIFIBDJDOFGEOMBADEA@KDLOEGBJJGEGIIFHDEADBEOMGCGIBIBDKDJDJA@C@BEFCEIEKFKFNNNNADJMHECE@IGGOLIDHCJNMNEELLIMMOKNKIFKGFKMBLGCMFMDGOJKIFOMOOGOOOJHHIIBEBDJBL@@@" "NEMCEJDIABEENNJNMFKEFKEOMDOKEOKNFEJJNIOJOIEMNKKJJCKLKGGEKKBIBLEMMEJ@JGBBCAEGNEFIOGMKABINDJHJMDDEBIFDIAABIDNJEDJA@DBFOA@KDM@EIFHDGKBA@DBIEBKIDJDDDICDJEAAEJHJICLJDFMOGLKECOEDFBBGBHBMEMMAJDJFNMGGFINNBJNNKMMDOJOLKJJMCCNOMFOIEOMFKEFKEKJKKMEBDDIBMFEMCH@@" "DJAFEBIBIDICOOOMJMOEDJOGKMHOOCNNJJEEMGMC@GKGNNJAAGOOBONMGFEBEMIG@JDJ@INIDJJNMKEOKNJIOOGNI@J@@AACDD@IDDFHBI@HJA@JJIDIBDCFIJEBLKFABDIDJJHDBHHDJ@KAADHAAFDD@@BHDKOGOLJKNOMFMKJJIDKLHBIBHGDMMBECGEKOJGOODDBKKOFO@FEOEMEBJKKNGOHMNOGJIEGMJMOOONDIDJDJECDBI@@@" "IENMJMFMGEDOKOOOOKJOOFHOGEGBNNKMFJJOJEINOLJONIMNKNKJMMKMN@JEDJKLKJMBNFIFEBIMKBEMGFOOKEEFJK@JJJDGEIEFJIHKBBMDHDE@@BAFNJDCNNJKKNABKKDB@@EA@IEJBFHLJKEDMGABJJHFJKEEFOOKGEMBFMLJECDKCJEJNINJIEBHCMNMMJNKNKMLKOJIOKLMBOJJKENKKJGEGGHKGOJNOOOONOIEGEKEJMKMDH@@" "KEEJCBIEICKOOMGOJFFIJHKKNINOOKNLDJEEDKJIOKMOMOKKCKOKIAGKEMADIGOJHEFMA@EDJICEBEJJJMBIFKNMNHE@@@JJ@BDADBB@DB@ABJHBIDJKKDIFEDHIECDIFNJIDJ@JJD@BA@BBADAB@BJH@@E@KMKNKDJEJJJMBEFDJIE@DEKE@JOODIDEMFODDNONNFNOMOMNOLJNIEEBIAKNOOKLKNNHJLKCBOOEOONNDMDJFBMEFH@@" "DJIADEJIFLDOGOMMOMIGOGNOIBE@NOGMFDHKIGGOOEEOFIFOFNIELFKDOAFIBMIHGJMEDNJIEFIONKDDICDNIDDJNJHBME@CGDIFBMDIANJDD@EDAEBDLJBDNMEEKIBBIIBEDAE@AABKLDIEJCDIGF@EEJ@JKJIADKIFDIAFKOLKEDJKIEEJO@LMJDKDGIFKAMDKKGKDKGMEGOOGDNHICEOGKHEBDOKOGODMOMMOOGIAKDJMADDJI@@@" "KEFJIEEBIGKNOJNKEKGEDIFJNBOOMKNNDJBJFNKIONOMIFIAEOKMJHFIAEBBDKGKLJMBKAEDM@BKJIBIBHBAEAKMMNCD@@DK@JB@J@ABD@@IAE@ABHEKO@HIDJHJIDHHGNM@JD@EDDH@ABD@BHBBHFI@@AFCMMNLEDB@JDJDJNJ@EIEDFJEJINOFIBBEDDK@JMNOMDDKDMOKOLNKKBJBICKNMOOJCJKDIEGFMFKJOKNODJEEDJKEFH@@" "JJDIBJBJBIGMOOKNKDHJIGOOIEGBKOGHMBECIMGOMOMGDKLJKMNOEAENJDDHIBHJKEEGDDMAAEELNCIBDELLHJEDJLLADJABE@DJDJJECEEBJ@EDDDHBAEABEMBEMBDEDB@IAAE@BJEEFEBJIBI@EBDBIDAIJIEBHIIMABDNCIMEDDEIAGEEFJHJDHIABKMDEGKMNJINIGEOMOOELNEBEHOGNJGEDOOODJHIFKNOOMODJBJBJDIBJH@@" "IEEBE@IDMDNOOGEMFIGEEEFJEBFMNBMOFFHJEJOLJOOJIEAEDJMJKOKKEJMCBGOGJJNHMKFFFDKMBKDEACEACFJOEMMDA@DC@DIBIB@HH@BD@E@AAACJO@BHIFECDHJ@GJNDDD@E@AB@@HHBDJDI@FA@DAEMMGJKFDEFDEAFJENICCCFMHKJJOGOBFEJMFNONJMJIEDEDJOOJIOJMBHKCGMJCMKBEBKEEEGDKEMGGOKIEIDHEBEEDH@@" "JJJFJEBABBMOMOOEMGLJJKOMLDMCEKKDLJJEKGOGANMDJBFECEKKFJNFOGJDDMHNNKLCB@JHHIACLJBHJFOLJMOJMJK@JBAGEEJDBDFJBJHIDHEDDDDEJIDEBLHIJEADJMAAAAE@IDHJJBKABABMEGDBBHFJMJOMJIOKBHJBINDDHHJHBFANKKHMIABOGKCJKFNMFECBBIEKLGGOFMBJIIFNMFEIAMONJJIOEMGOMOMJBDBEBKBJJH@@" "EDDHHJEFIEKOKOJNIMKBJNOGJOBFJFINEFAJBOOOOOMA@LHLLJEFEGKOOJGKAFGEJMJHEEEBEDENJKIEAENJ@IEL@@MOADDB@G@JJJHABBDJABHAA@IBBBAHEJBBM@LBBBDHDD@JDBIBBD@JJJHG@BAADGMH@AMDHBKMDEDNJKMAEBEEE@JMJMGCDFOBOONOECEBIIHIHDEOOOOOJBLCECLKBKBGJOGKJJFMLKJONONMDKEBHHIAE@@@" "JKECCDJ@DEGOGOGKNKFENKHMDJMNMIGMNDDDKNOOOODJEAEABIDHJDJHJDJNNLHCECLJJMJDIBKICFDJJGMFFGNJJIJJL@IFIFENAMDJHHI@JDBJ@EBDLLDBEDMIEBAAIIBE@BJABHDHHJIELCMCDKDHAJJLJJKOCCEOBJICFDNJDIBMJJINEF@IKKJIBHJIBHIDJDEDEBIGOOOKNIAACMODMKMJIEHNKMCFKNOGOGOEA@BIFFEFJH@@" "EDJLDAIFIKOOOJNOMDJMEFKKMGBOKFONMFIEFONKJNJBHDHDIBAEDIIGOIDKHKGFJMMBE@LIJHIBMEJNJJKDMLKL@JAGEDBAAGALKDABBJBEDJH@E@HIBJIDHMBEHIDJJDHHE@@JIEBBJBDAFILGDDBAEGDBHANIMIFJJKJMEJDHJLIHEBEMJKGFHNIDOODLIEDBDI@I@JBKJNKOKEDKEKOKFOJGENNKEEJIEOKJOOONLKDLAAJIE@@@" "JKEBIJBABEGNJOMKJEECOMGFHFJKNMLMFNBMBNOOOHHJBKBJJJJJEOGLBFONONJOOKJDMKIBABCOCK@KGEOJGOEME@DDNHHFJDIEAMDGGIDKKHBJHGMGEDBIBNOKJDJAEGEO@JJ@NNIDOGAELEDIBK@HKIA@EEMGOBOMGFHFNGNBDBDNMIBNOOJKOKOKBAOGMBJJJJJFJBHHOOOKJEJCKEIMKNJK@KGEONEEBNMOJKOEBDBBLJEFJH@@" "EDBJJBIDDMOMOJKFLJDEEEFKNJJFIOKNMDHLGMOOJEBMMNMMKDJHKIJBJHHMOGMJIGJICFJDJEEMNOJONJMDOMJH@DHIMMDJ@IBJCDBLCDABOBHFAADEDMLFHKJNHKAMIEADDC@JGJDAFAJAFBJDHBIEMLHI@@JMOIEJKOJOKMMEBIBKFDJODJMOGMHHJJBLNHJIFMMKMMJEBOOMOAHIEKNOLKBJKNKEEEABIKFJOMOMIADJBJJAE@@@" "JKJEEDBEJKOKOOOEKDIEGNOMEFJMNMBOFMBJJOMGNHHJGECGFONENFDLIBGKFOFEBEFBJEDIDHKGMK@JE@KHMJGJJIABBMEBJB@DEBMBFIDGNHAEBBMCHJJHBLGAJ@JJHNEJBED@KOADKBEJEA@BBJEEJBDDJJOBMHNHEBHFMOFHIDIEBJCEBECGKFOBDIICCMCOKGFEGBHHKOEOJJJEKGJEKMJKEEOKOEDIFMGOONONJMBAEEBNJH@@" "A@BJHIEBAGGGGFNMDABJJKNGHIEBHKONKGEFGMONLBE@HEDHIJJOKHIBBBMDHJMBDHMMCO@JABAMEFABJEDECEDL@BDDIKNFADEDHDCDIB@IIEBFDELGIMGEFKONKEGELOAMACBEDLHBDIFA@IEADCCNLIAB@AIEFEAEBJDCEELBDBHGNEMHIBEJHIEJBBDHNOJJLHIE@HEBAKOMOCEGFKONHJEDHOCNJJJDAEKKGGGGDBEDHJJ@D@@@" "JFLBEBDLJNOONMOJCFIEEOMNKGCMGGEFOD@MCOOOODJKFJBJJEAADEDHLKMBBIBIACBKGFI@JDKJJKDEE@ABLJKIBDIABFMNNJHKBIEIFIEBBHDHHIECBDMMHNJKHMMIBFEDHHI@JBEDKDMDJFHJKKMKBDDIBDNJIJD@EEAFJJNIBHDKGFJFDDJDJBENIHIEADDEBJJBKFJIGOOONEHAGKEGGENGFKMOMEDKFBOMKOOKJIIBEBAKBH@@" "DIAEHIBAEEOFKKNMLDBBMCCFJJOFHJJMJOCFGMNMOCMFIEMAEDJFBIBEACJDHJJDDHIFNJBEBICEEFI@@BJHBJNLDJBDDIJLBJBLDJKFJB@EFA@BAADFHMOKFJOJKFOMHKADDB@DCE@BBKFJIAJBJAJLIABBIAKJJ@JJ@@DKEEFDJEBBKKDHIABJHIBNDEBDJCBIEDEMDKENGMKMOCFGJMJJHKGJJKFFEJBAAMKNNKGMEDBDHMDDI@@@" "IDDBBJEFCONONOMJBMDMBNNMLOFIOGEKGFDMCKEONDBEGJMNHEDHIDIDJKFIBJDIEBBDEDJIDBKOJKDIED@CEEAEEIDIADGNMEGFMJMEEEFHHJAEBBIIEDKGNMJMKOFIEDLJBEDBHHKEEEEJMKGEEKOADDIDMEDEEF@AEDIFJONJADJIEABBEDIBJDKFJIDIDHIE@KMJOEBACOMFNEICGFMGGLKGIMKKJEIEJBMOKOKONCEBJBAADH@@" "JBILJED@LOGNKMCDIKAAFJIGCHONJNNGKNKFGGOJMADHHBIEGMIEDABA@CMBE@IBHEDIEGDFKFCKEG@B@AGLJJNMNNKBN@MM@BHMEEIGBKECF@B@@DBB@MFMMDEAEMKEHBBA@@B@CFEFJGDMEEHJ@EMHCJFKKMKJJIOD@B@GEFNCFKAGEDIE@JDHEBEN@DBDAEDMOEDJ@HIDEJOOGCFKNOCKJKOHNGDJKDDFLIFENKOGIHAEBILJBH@@" "IEBA@JEECNOMMENMKGOGEEONNKMEGMIKGFIFJOEGOJBEBIDEMFKMKKLJKONLHEBFCBABHIIMNMOFLNIDID@BBEAOEMOGLKONKMBMFJJNOGDIJJLJBHLJKJDOFLJIKGIBNJIHJBIJJLIGGKJJKEJENKONIOGMMGLEBB@ADIDKIKGMKMLLHJDBFCBE@IKONJINNMNKEMADJEBBOOEGJKDKGFLMOEENKKOMEGGOFMKMEMOKNEEBHDBEDH@@" "JJEJECDJEKOGKOEHBM@DHKBMINKKNJBBOOBJCOOONHLIEBBKBIDKFOCGFKGIBJDHHHFDBCFKKGKOKCBABAGILJOJOKJICMMN@HEFNOKEDDJBN@CDDAAJJJKANKHNKLFJJJLDAAF@CJBIAEFOKKE@HCMMNDJNOJOJILODBDBFFONOFNKFBAC@HHIBJDOFKGFGKFIDJFJBEDIHKOOONBJGOJBBKNNKLMJFHI@EJ@MGNOGNMBIFEBMBJH@@" "IE@BIDJ@OONONJKEEFEKCFOKJONOGNMIJODFJNKOKIBBBDLHJKADIBLLDJMBEHIEBBHKDLMOOOGGFODJHD@BCMJKLOKONKGMBEBMABLIBK@IDJJHHJNDDL@EFLBAKE@AIACJHHJJIDHFJDIJDEJEBEOFKONOINJMNB@A@JIGKGGGOOMIIFHJBEDHMBEJIAIJDIDFJHIIBBBDNONKJKAGJLMKOGKOJNOKFFMCEEFJKOKOOHBIDJ@EDH@@" "BDFIBBDJ@OKJKMDKBHJJHMEOMMEJMMJKGNIECOOGFJIDHIAEEDMBBDACMJILHCBDEDDHAACFIDNNNKIEBHEBHACDIJJKGMOJDHENLICBL@DJM@@AA@AKODJIEFHKEDJIGNL@DD@@EJI@AJFDIKM@IBOMOFJJLIFD@JE@JEDNKKKIDKFDD@IAEABF@ILJMNDABBEIEEDDHIDJKGGONEDKOFJMMJMEMOMEHJJHJFIENJNOHBIBBDKAB@@@" "IJIBDIIDKONOOOKFMCEEEJOEGGOGGOO@FMJKIKOOOLEACBDABIBDMADEDABAEDDI@AIBFDEMOOKOOOGBL@LDCDDIBFIBEFJIAABAAFLMIECMFECJBBJD@MBBBMOMJBBEHABJBBNECENEDMIKDDBDDDJKEBDKBDIAFAAHAJGGOONOOMMACBDL@DIAEDBDAEADEIBDJDABFDEAOOONLNJMK@GOOGGOGEGJMEEFEKFOOOKONIDLIBDJLH@@" "BJDDIDBAGOGMFHJEJDEEIEMONLJMLJFMCGLKENNOFI@DDDIDIDHI@FAKIDMJHJIDBJBDHIIGKENNJNMEIAGAFIIBHH@DI@DFDBDNKMGEE@H@I@DDDDBIKJHDLOBGII@JNLJAAAA@DH@HEEGENKIBACA@DI@@HJDLKDGDDMEKJKKMFODLHIBBJADJHJMIDNLC@DHIDIDIAA@DKGKKMFIOFEKBIMJIKOMMDMEABMBHKEOGODBADIABJ@@@" "EABIJADJJNOMFODGBIJMJMCNMEFOEMMIFMNFKKONOEBIJIBEBAEBDHJCBE@BBDJAEDHIBBBJOMEMOKOODBNDAJBJ@BBIBDJH@HIEDBIMJJAEDBJJHIDBBLEAALMILDEAJBADHJJJAEDBJMLJAEDHH@JIBDJB@BJBLACJAGONOMMEOJJBBDHIEDBIBB@EBFBHIBEDBEBDJLJEGKONNKCMKDMMMGKEEKNEJMJLJGAGKEOKJJIDBLJDE@@@" "DLIB@JIAGONKMABJFBKCABOMKKMMKBCOBKGENJOKNLBB@JJHDJDDIB@JBHKDLIAFBAABHDHIBJJONNNMJHEAGHMECLD@@A@BEAFJHHJJNHJ@IDBBBJKLJK@DDMBEIA@FJINJJBBADHBHKJJHHJKDEB@D@@AANEEHODE@JMKKKOJJJDHI@JDDBCDDIIFHJBHBDIABI@JJHBBAKNOJKMGFJGNBFMMNNMOJDFFJCBJDENKOODDJHBDII@@@" "AADDIDBFONOMJNME@HDNNGKEFNKOFMEJEGNGKONOMEDDKDDDJEIIJDJCLEDEABD@LJKDEAECEGEACMMONBJDAEBJBJHEDOG@HCLDOJIEHJAEHAIEEEFCFLE@BNECJ@EAKFCEEEDL@MDBHMDJOIAN@HGGIE@JJBJEDABJCOMMNDEGEFEDEAFJIHABDEAEANBIBLLMBIAAFIAEEOKONOCOEBMEKGNKKEFOCKI@HEEKJMOKOKBADIADD@@@" "FEBIBIDHOMNJOOEFBCKBJLDJOIOEMBAEBBOMOLMMOL@IHIAA@HBB@A@IAAA@DDJJA@@BJF@H@IHJLKKMMD@HJHH@EL@HAJEBADKC@KLIGEJIBJB@@IMHEINGDLHIIGCLM@MLH@BBJDJMGDINHFFIDBEBL@HAM@@HJHHAEMNNIJHLH@HCBJ@@DBJIA@DDDDHD@BB@HDDDHLHAOMMIOMOJBEDBEMGLOJIAJJFNBCEGOJKMOHIDJDJEC@@@" "HJDJEBECMGNKONKHDDJONCKCJOKGKME@EEOCMIKONIABBBEEEBHIDJECDJFEBIAEEGNHDHBBIBEBAEFOGHIA@BABAIEADGGDDALDKMIBINOKD@KNJGOBJNJLEMBEMAJKJJGOBKNHAFOKLJDMNIALAAGGADEDLBDB@DDHOGKEDBEBDJB@I@KOEEDDJECBIFEBIDHJEEEBBBDDKONLMNGME@EENOFOJNFNCOJIA@NKONKOENEBEBIBHH@@" "EDIDHDJEGOONJMOJIIFILHFFCONLOH@BEKFNKOGMMJBDHJIBBECDIBHGEBHJHDJ@HMKNIBDHBDNDJ@IMMGBBEEFDEB@D@ME@HIEJEIJEEMMH@N@MMGCMLHNONJEBKOKHIMNGEMHCH@MMMEBLMBMDHHEEHA@BEACEEBBGEMLHBICIB@IBDKNMHHBI@JHJEG@JDIFEBBDJHIBBMMOGNKKFMB@@OIKONCC@ILKDLJOMJKOOOEBI@IDIE@@@" "BIBKBJIEONKEOJOMBCAOKEHNNOKKOGEDMEOJOLKOODDIEDJHHJDBBDCFLHEDBIDKCKFMBDIEDIBI@JBKONHEBMLHJHE@JIFEA@HEIBHJJMOMI@KMDJOCKONLFNHKKAKONNGJIENHDMOMJJHJDM@HDECDJHE@JHIMJE@KONJBHDJDIEDIBEKFNFIDJAE@IKFABBABHHJIEDIAGONIOJOMEIEGGNNOKKHMFOLFBEOJOMFKOMDJJFJDJ@@@" "DJEFFFDCOOOEDFKJMBOEMABKDMFEEODADKGCNIEFNHJE@IBEBDIDHIFIECAEDJA@FJMOHME@IJDNEBDELMBJMBKIDDHE@E@HDAEDDHBCAECJBE@JMOBMFEEOOFECGOMECEJGMJHEBBNEDFB@IAEDA@HE@E@IADNJEJJEIMABECIBLHEEHOMJK@DBIEDFEDKDHIDIBEBDHEBHKKEDKNGFIDAGMECEIFJDEMGJEJNKAEGOONACCCEBI@@@" "KEDLHHILNJKKMMJEJNJOOMFNJKMNOMJJIMMEGNKMOEIAEBJJDIBIEBEOFDEBKADEDOJNMBJOCDJIIDJLIMEMJDMGAADHDHEAAFJEJKENJJLEHKEEGBGKMOEFJMEEJKEGMNOBGEEFHMAJJKMFJMBKDDE@I@IDDGEIBMMELIJIDLJIFGJJEKJOIEADFJEACGMBEDJDIBJJEDDMGMNKOEEMLJJMOKMNJKKEOOJKJMBMMNNJKILHHIIEFH@@" "DBIBEEBCMOOOKJEKGIENKHIEGMFKMCDIBKGGNLJNKDBBBFEDIDEBBEKEMBIE@EBIGIGMKMMJJOEEBBBACBE@@I@LEEABIBHBDEEJJHKDJMCHAD@@DFKEGMBHDFJKA@JEOEFKA@@AD@NEJIFHJJMEAB@JDJDEEAHDH@EBFDBBBEEGJJMMNMODODJE@EDJEMFMBBEADIECBBBAFKJIKOGFJDIFENKEOEDHNKMDOFMBNOOOMNBEEBDJA@@@" "ADJJJBDMOOFKBKMBOEBMOBFJLJNFMJOFEENOOJCMNADDHHKBIBJDHH@KCECBFJDKJEEGNALOKMLIDHHJDDHJMBIGJJJDBDBDIIBFOCJKEBDCBAEBKEGEMNOFMNMKMKGKMMGEFJEDBFABEFJNGKBDLIBABABJJODJEJHIABHHIDIMNOILCOEEBNIBKBFEFFH@HIBJDJFHHIADCMNBOOKMECGJMKCJIJKBGMJEGJENJFKGOMIBBJJID@@@" "GEBDEDJKKNMOOOFMEDEKOLIKKCMOJAKLIGAJFLJOEJ@IEBDDBDHIECGNNJHDHIBAFMFMOKKKJJKFHBB@IBA@@DACGJMBHILMJBDHDDCEEMKLDDH@BKKFJHKMJKJNJMNHJKFNJ@@IAANMMEFAA@IBBMILHJEJOFDA@@DBDHBB@KFJJNNNOMKEKDBDHI@JKKOFEDHIBAABEDHBMGJIKBLGDINLBOMNFNLIONMAEEKGOOMKNNJIEABEG@@@" "HHHIHJDEOKGOKNMKJIIGGIGFEMKDFJGIBHFGOMDLJ@IBJEJMDJCB@DMCAAFIEBDKEDMGOBKOGMDMIDHBBDJBEABFOOMMKGCEA@IBIIDJHJFK@IBGJKKMEJEAGEOMGDEBMENNJOBDHFKBHJIDLJDHDEFGFMMOOKBDEBBIBB@IDMIEOGNJGOEIEFIBEDKDDFEI@BFBIEJMBJDHBIIEOOC@JDOBKAFMMCGDOGDLJNMKNOOFOMABHLHHHH@@" "KCDJE@IOONMOFKKJJJBEOFDKFCGOJ@JBEFLNNHAJMEBE@JAABIDDMBKNEJICBDIEEEJMNMOEMIEKCEFLIC@DLDEAKGKGFMMEMGDEFBCACLHHEJHHEGFJNMCLNJHJKINEKJKGE@HJM@HINDFBCEAGEMEMKGFOFLEAAI@FDIKEFFMDMMGMKMJMEEDIBFDJMCNJEIADJDDBHEBEEJL@KKIKEBBHBOOFCFICGMBBJJNNKGMKOOLHEBIFFH@@" "FDEIBKECOGKEEMOGE@IEFJJNMEOMEEEDJIIGMJJE@@DJEIDDDBAAJOFJJLFHDJBBJBEFMIJMMFDEHJIEEJOEJJHBFNMKOOCOKIIIEJLJDEKBIEEEAEEDIJEAMAOLELEBLIEEDEEEDJFMABIJMDLLNONGONMKKB@JJMGJMEDJHMACEMJLMKEBBJBBI@KAJJKGJLDBAAADMBI@@EBJMODLJIEEEEOMEKJJKEDHEGGMMEFOGNEFJDMAC@@@" "HJHBDDBONOEOGCBJMDEFOLIMJKGKN@@AEFDNFL@LIEA@JBJIIHJEJBMKIJMBIADM@LJKKMOKELIJONJKKMEBGFBDIMKFJINMKGFMOKKEID@EFMJBJJJKKJJJJE@EBJJJNNJJJJBMKE@ADMFNOMKGFMKLJKFMLIBCGBEENNJKOJLIMFOMNNJIHEIDDJEJLNMJBMBHLLJJBHDEDIHAKCICED@@CNOFJMLIOKEAEJJFGGMGKOJAAB@JHH@@" "EEBLJIDGMOKJLNMFJIIMFMBBMFNFMDJJBIIGMJJBB@DBDJABBAEHDLJGFDKEBJADJAKECEEEOEBBMCMFKDMFNMHIBCBKNOCEFEMOOGEEFJJJEMKDADMDBGKFJJEBJKFOBAEIDAFMMBJJKEEGGOMMCEFGKNJFBDHMKKEIFKENEJBEGMEEFEFLBIDBJEFICGBII@MDBBDBIBA@BBBJMODLJBJIEKCKEJBEKELLJKEKIJNOMOADJIJEE@@@" "EBFADJEOOMGGEJJMGBBBOJDMGEEMGA@AFFDFNH@HHJIDI@LBMGGGMKLIJICBD@JK@JBGGMIJJNDLIFEKFMJBDKBBEEOGEMNMIKMMOOOKMMDNOMDMEAABONOMONJKOMOKOJDDEEIEOKIEMNOOOMMNLMKMMGGMEBBFIBBMKFMCDIICJJLMOGBBHFJHABFDJLINMOGGEJAHDIDJHHH@KKACCD@DGEMEGEIBOJBBGEJJMGGEOOMBIDCBE@@@" "IDHJIBDKMONNNKJBLLIMOMAFNMKBHNDJJMIGMJHJB@AADIAEFNKFMJKGFJJEAEBFJEEDMJCBNJIBMJIFMIDJOLME@BJNNCCJOGEGNNOOGGIJJJKD@BFMAEBGEEEEEGBEDEKB@AFJJJLOGGOKKOEGGJNFCKJJ@EEIOJIDMKDJMJDJKJFBMIEEBKBEDEBJKGFJMKFKKEDDIDD@BBHJMODMJJICHJFMKKDEOMLIIJBNKKKOMNIBDJHIDH@@" "FEEEBDIGKOGMEMEEKEBCFHEJMBMNKNIAFKBFMDA@DLJDECDEJMOOKMFMOAGHJJFKAABKKFLNKGEMEEGGGEABJKAEGD@A@LNEIBJMMKMGFLOOCGNJJDIEOFMHJJHJJHMKGMDIBJKOFGOIKGENMMJJDMCIHD@AGEDFJJDEGGGEEEMGFKIKFNJDDFKBJHODGMKENOOMJMAFEABII@DAEKBFKDDKNKMJEJM@KFBEFMEEMEOGNODIBEEEC@@@" "@LIBEJCONINJKGJOFKEDMLIEOMJIBMJEEFEOJJJEAA@IIDBOEOEFOGKOFNMBBBINDEEEFMJIFHIBLIDMEENJJJOGEJEDKA@HDJDKGGGMMKEKMLMM@IEBCEDBEDBAEBAEFBEDHEMIMNMFMMOGGFIBI@HDFIEBMGGJJJKMEEIDIJDHKDJMKEEEACLJBBEKKGNOGKEGMGJADLHDDEBJJOMCEEBMJDJMOMDIMIEFKGJOFJKLKONBMBDIH@@@" "MABIB@JKEOOMMNKJMDBGKIBKECOFHKDBNINEJH@HDDEJDBMMKKFOMNOOMLKOLJGDIABJKNEDKGBMEKEKMK@JJMEJOFHA@DEEA@JEFJGKGEMFKGGAEBBMHGEDHJMJHIEG@MJBEDGGFKEMGFOBKEBHDEEA@D@KGJMEJJHFMNMFMEJGFIECNJJDDIGBIONIMOOKMOKFNMMJABMAA@H@JMCLKJAFHKGNEFJDNOBAEJNKMMOOMFJHBDJDEH@@" "BJHEDKBOOGMJKGNNIELLOJDDJGNDBBHMJO@OEBJAAFKACKJKGFJNKCCIGEOFKELI@BDIFEFAGDIEDIEBCFKBKGIEEMKJFKH@JOHJBDJFJJFIGNNEBJMBGENACEJMFDCMGBEJJECKODKBJKBIBBHOJH@NKBNMMEDOFJFKFBEDIEDIGDCECDIB@DIMFKGMGDNFFKJKGFJNNDFKDDBJEGHGJMHJBACOBIABOIIMDKKOFJMOGOJFIE@JJ@@@" "LDJJADEONMGFJMEMNJAIFLHJJKMJHDANEIEKLH@JJJCONOIGMMKMMKNMLMFOMCEJEDIGMNJJ@KEEEEJONKDDMEEJKGEEMNGJMFKHEBDHJKIMIEFOEEEGJNLDNKONKIAKJOEEEGKEDMLNJHIBE@NKEJOCMMEGFJMEEIAFKOJMEEEFHBJKMODIEBMFEOKEIMKNMMNMMODOKONBJJH@INMDMCLA@JMNJJHIKDLBKMMEJKGEKOMADBJIAH@@" "ABDHJHJOOOJLJJKEEMFOOJDIEOJEBHJAGB@BJBJ@BGNKKFKGGNJKGGBMFOGFKKF@HBEDKFJ@GJJMDMFJJLKBICEEJMGGGEMFKMGFJLIEDMFICGMIFBJMGEHIMFOKELHMGEJJCDMOFDKEIEDIJKGENKEMGGGEJMEFDJFIJJKEIEJJO@BKFIEB@HCFNKGGKEJGGFJKOGFKFNKOB@BJBJ@BGDBHJEBOMDIBOOKEMEFJJIJOOOJHJHIBD@@@" "KDICBAEMKEGKMEJJIBEMGEABMFIEDA@NMLEGLH@JEFEOFMJJJMKFDMKEMKJFJKFK@KMONNOJHJDIBIDJJKNKGFIKEKDMFKEEEGFMGKF@ACEFJJCKLNMBNMECKMOMNNEEKJEKINNBJKEFD@CFOEKGEEEFKEIFMFLKGFKNJJIDJDIBHJOKKOMNHFKFJKBNMMFMICFMJJJMKGMCEBH@IOEAMKHDAEDKEJDEGEMBDJJMENOEFMMDBFDIFH@@" "JAJDDJBOOOEEGEEOGGHKFJDGBMOE@JEEI@HIJBI@JMOBJGMGOKIKOJJMGGFNOMMDKGKJOKE@EENNJNJKMEONMEFJKEGJMNOMKEEJIEMIDHIIGFOGKEEGHMHFNOHOKK@MHOEEFOGKGDLHIDMMDJMEFMOKMJOEFJKEEKOMENJKJKKME@EFOJNOFIEMOKKGGEJJONLNOOEOBJGMJHDJBLHHDMEBHEGMJGABKFHOGGMEGEEGOOJBIABLBH@@" "DNDJIDJMOEGGMJNJEEGEMNIFMKFJOD@BNMKCDHJFKBJOOFMJJNMGBMIFNNNADKNK@EGDMEIEAKAEE@JJBNJFIFICFJIEKEMEFKFKGGGBBBBDAEDOHABHGI@KKNGCNNHDO@JD@OIEDABBBBGGGFKFKEEMFMDJKFDKDKBKJBJHEEDFLEDMEIGE@FKNIDCKKKDMJGEKJJMKGOJJFKBHIFFMKJ@AGJKFMKDKMMGEEBKJMOGEGMJIDJICI@@@" "I@IDB@EKMOJMCEMEMCDJGEBIKFMEJHDMLHEEMAEJNKKIEEMGKEJJJMBEKKHOOLLBMCGIGGFHD@DDJGEEOEOOOMNMEJNHKEGOEFJJLHLNLHDHJJMEGDMGJOIJOMJMOJLOJOEIGEEJJHI@IKIHIJJKEGOEFHKJMEKMOOOMGMEGBIA@A@KGGDOFEJAIOOHNNMBEJJJMFOEMEDNNKJMDEME@IMI@JMEKFLJEGBIFEMEMFEJOMNM@BADHDH@@" "BFBADJJOKMFKOOHJKNIEMODOEMOJOJMBIMFKFCMFGBEOKGKJMMEMKDMLNJOEBONKHFFJOEJAAEIBIDDEBOOFACEOOGKONOOLJMJKEKKDICIA@GEKMKBIFIBGGGGGGGBDKDJFMNMG@DDNDIFNMFJMJIOOKONOGOMFDCGOJEAADJDMDDBMGJKC@NKOJEGJKIMIFMMEMJNOFOMBGCENCFKELJEJOJOMMGIGMMDKNJHOONKENOJJIDBCB@@@" "DHMDA@AOGCOMCJLKEEJBOMIBGOGJA@COL@@AMDEMMKG@KCFMIELEIMICKGHNOLLCEBODFOFJB@DELKMBMKLMNNJ@DJFIKJMGFKFMEEFKMEGDBIMEGLMFNJHMNNMKKMHJKKEIOEELJAGEENKEEEKFKGEJNLKBI@BKKMINMJENIMA@BBKGKAGJEFAIOKHOFNDMLMAMDMKFFHGFMMMAEL@@AON@DBOGOBDMOJBMEFIJNEONGGL@DAEHI@@@" "IE@JJDKNOONKNMJDKNBKJKBMOJGDJEDMIEENNGMFFIEMIFNKGMFJKDELFMGIEKOFHGE@OJI@DMEBADBEBOKKKJOOKJMEEDKNKJJDJJKFKFLMDBCCKKIE@MAFMOBGMKDEHEDNNNFBAEIKFKFJJIBJNKNIEEEJNOOJNNNOJEBADBEEI@DJOHEG@KGNMDOEKAMAFJKEOFKKDMMDKCEOCKMEDMIEBIGBOMJFJNJCNIBMKNKOOKNIBJHEDH@@" "DBE@@IAKOGEOKKEEFEMEGJMCEGO@@HAKLHBKOJJMEKFJMKJJLJNMEFMCMGEFOFNCFNOIGOGGJ@DEFKKHOEOGFKJJNMJKGCNNONMEBKFMLEKM@EDNMGGEOI@MKNECNMHDOMGGEKIE@ENMAMKFJEEKOKKNGFJMKJJNKGGMGHNNKEA@BOGGODOKKFCKGKEGENEKEEKJIJJNMJKFMEJJONJ@INL@H@GOEFEJOEEMCEEFNOMGGNLDH@EBA@@@" "ALJENBEGKNKJFFMEEMBJMGGNMNJJJADKIBEBLGDKDIEEIBKNIDJFEJHLCDNKFKFJMMKJNFJMEMJH@EBKEGJFLJEEKKGMJNMMEBHIJLONKJNMDHAIKMLBAGEJJLHIJJMGDBAMNLL@IEKJNKOIJLHJEEMKJMOFNMEBIKBOEFJE@@JMMEJKCJNMMJKFKFKIFAHJMCBIDKNJDMEDIFIGAJEBDNIDBJJKMKOGEJJEMEEKCBNKNOEBCMBIL@@@" "DAHJJHKOFKGMMMJKMCECKJOCKEOAHDAJLENEKBNMGEFOEMMDNMODMEFKGGIJNNMCCGG@OOEJJJKKOMMJJMONKGJKKEEEFKMOKOOCCKKOMFJNKIDCJKNMFLIEGMBEOEDIKEKNJNADNKJKEONNNFGONOMNKEEEFNJOFKOMJJMMONNJJJMGOHGGFFEKKJLOGFKEEIGMKIEMMGKEGEKJFMCMAJLA@LGMFNGJNNEFENJMMMOFKGNHJJHLA@@@" "KJEEEMGNNNGKJJKNJLKFNGNJFOIFJIDKJ@AEBELKDIJBMCFKEBBKEJJEEDNGFIGEINMMNJOEEKEFDCEGMCJJJMGEFEBKDJKDMEEGGEGFNHNIFCAEGOMBHMAEMLGAMMDEHJEOOEDFCDKHKKGEGGEEEIFJIFJECEGEJJJNEOEFACEFMEGJKMMKLMGDKGCIEEBJMFJBEFKFEJBLIFIMBED@BNIDJKDOKBKOCKFIJKNJJNOCKKOEMEEBNH@@" "MGLOJEEKOMMGGKJNKCBMIMMOMNOAONHJHDDCCJKEFJKOEOEFEEGBLKFMFKENMFMACOCHGOJOEFJOKNMECFNOJIEGEMMMCGMOJFMJNOOMIKKFMLD@IJLIGJCGGJJJOGFBODIJLHAAMKFNLMOOKJMKBOMOFEMMMGEDJOKKFEEKNOJKEGJOO@NGNDEKEKMFKEKFIJGEECEGMGNJKEFJNFAA@JHKOLGKMOMMLMJFFKJNOGEMONMEBOIOEH@@" "KEACEIOONMGNJMGEJDMBGKKGGEHOMEEMDHIDNAFFIDJEDIBJGBOJJJEEEJJECMKKJMOBOGGKOOOJNKJJFKKKEGMEEBJFNJMECJJKMKMOGEBAOI@JBOI@EDJMEDOIEEJIE@DOJBHDOLBEGGMNMNJJNEEJKKBJEEEOEFNNKBJNKJOOONOGGJGMJNNMNEBJMEEBJJOJGBJDIEBIDKCDCIDHIEMEEOHMGGFNOBEIBMGEJKOEKOOLMFDEFH@@" "JBLJJFKFMOKMOKMMCJJOKGNLNOC@JOHJIAFOAEEDKEEKENGGMGCGFLJKJKGKOFKIHFOLNJJJDKEOKLIELJKGEEEMGEEMIOKOFONNJKGNJJOMKOEAEFOCKMAFFMHMKCDENNGKEDEGNMOJJKOFJKKOKGNOLMMEGEMEEGFJIMDINOMFIBJJKIOK@LNKGNOFJNJIKGFGEOGCMFMEFIEEDGKDDJHOJHFGKIKOFOJJNEMNOMNOMKFKBJIJBH@@" "FNAEJHOOOOGGKBKEEEMBFOJKMMFEEEEIDJMNNIJKDDJKFAJCCBFHNICDBJMFJMCEBNMBEFJMJJOBOGOGGOJOEGGENOOGGKJOENEKONMEEEADGFLNBMKDKHENIEOMDKM@NIFMJCIKGADEEEEKONMCMGJNOGGOKMGGEGJOOGGOGJGJJMJKEBEKJEFEJKEJJAFDKHKBFFBLCFJIAFJLKKMJIDMEEECEMNJOKBEMEEFJFOGGOOOHJMDCK@@@" "IAMDJIOOGKFMFOFJNOJOMOEJMJJMDEECADGMADIBMJEEJMEJLNEFJJMBJOKEKJMLMDKLOEJFKEKEJMJLMEOMFJMOEKKLIFAADIFJBIONMDNKOMJKMNNIGMALGEEEGALEODKKMNJMONKIEKOLJBKDIDDCDINNMGMJKEOMEIJMJMFMFKBMGINIEIMJNMFOJJEJJKECIJMEJMEBMJDIDEOADFEEAEJJMJMGMOJOKJKGKEKFOGOLJIELDH@@" "FJBBJCKEOEMOJIMOKKGJCMJGKGEABHBLCJKGFICJBHEKCEKCKBGDNFJGKEFKEMEIJNOHKJIDMCBEFKEKFKJKKOKEODFID@JDACDHMGMMKEAOEKONKEGIOGKM@MOMHENOGLOEFKONMGLEFMMOEHIFDABHADKAGMFONNJNKFMFKEBFEIDJNHOKJLMEMFKEFOBKCIGBFNFMFFM@JBNDKGFJNAJ@JDEGFOBMNBOFNOMLJOMMGMFNBJBBK@@@" "EEMDMEOONOGMGOGFNJFFOOANNMNODEKADDCMJNLILJLJNFIDHKJCEDIJBMFJMFMOILMBNOEKEFMHMMFNMOKONJNJJBHJAE@BJDEKEMA@@@CEOGEGMNFKFJIJEGJOEBLJKFKCMOEGGMF@@@DEMFMABJ@EDBHJBJKJKONOMKKEMHMKEFMGKJEILOMKEJKEJBLIEFBNHIDKCJIJILIKJMNAADFMAGKMKKLGOKCBKKGGOEOGKOOMEIEME@@@" "JIBAACOMJMKJJEOOKKMMGEDDKGMEMDEJAEEGBJADCDCDJLMIJJBJFKFMMEIMLMGDJIGHKAFJBIFMCFJKGENJ@@@@BHB@D@EDIJMFIDJBIDJIEMONKKMJOOKFJLMIJKFOOJMNNKOMMDJIDJBIDKEJLIE@A@B@J@@@@BKMGFJKFEKDJBKDFHODJIGEIMLMEMKFKBJBJLMIJIFAFADBJGEEDBMAEMEOFIAEGEMNNOOMBJNMJMONDDBDJH@@" "KFJJFGKMNOGEIOKMOOKENOAKNMEKGNKDDDBLMFDIFMDKECEDMKCBNDDKCJECMMHOINOBOGNMNFMJMJJNOK@@JJJJHBHJME@KGEGA@A@DBABJJIBEEFJKNJNMECJNEEKJKNJKEEBDJJJDBA@D@DGEGFHEEJHJ@JJJJH@FOKJJMJMKCMKOGJGKLOHMMNEBNFIACJFFMIEFEFIEKDICEIJAAAFKOFMEKNLGKMFOOMNOLMGGKMNOCBJKFH@@" "IEEDIGGEKMJGFIFKECGKGNCFJKKGEMFAAMEFJFKDMJADMJJIHIJKBFFJLFMLJKGFFHODJODIBMIFBKOKJDEB@@@@B@BA@JIDJJ@DEDBHHDEL@BJI@HEDKOIKNH@@KNLONIE@HDJJ@AMA@HJAEA@BJIDJHDB@B@@@@BEABNONJCDMJDIGJIGHKCGFJIMKAJKCBFJLHLJJMIDBMIFKBKEELDCEMGFNJKFCOFOFEFKDKGBMNMGGDIEEDH@@" "JJEEDNNOOGGJKGKDJJNNOMJMFLNHGJNJEDBMIEAOBFKFICFNNOCBFJMEILKGFNJMEFNAOJKFMHKEGMOFHHHDJJJBHJHJBHBEL@DH@ADAAEEAED@BBBHAEEGBEOOOMBGEED@JBB@AEDEEDDAD@@I@AMB@JBHJHJBJJI@HHKGMOEFHMKFJOLCKEEJKKGFILMEJKBFGKKKFDKFKBGLEDMJAEBKJO@KIKEJMOKKJJIFOFJOGGOKKIEEBJH@@" "EFIDIGOKMFJOMFFEEBKMKKABMKEJLGL@KMCJEIKHNDIEKEBHHIEIEBBGBKDLJJMGFLOLIKMEECJFHKFHEBA@@@@H@@B@EBHIBHHAED@EFJDD@AEDDDBJAHHDJNJKJI@HLBJAAAED@AABKE@AED@HJDHJE@B@@@H@@@DBE@KFHKBNEEENLIOIKGEJJIIFJGBBEDMDHHJEFMDICHNLMBNENHAOAJMFMJDFNMNJEECCEOJKENOODIDKE@@@" "JKEGEOOGGMOEKLHH@ELOONJJKJND@KIEE@EFJKACIKDJDKFFMEICCGKDMFOJGFJMKEOAGEGJJNEKKOME@@DAEBJBKJHDJDA@EEEJ@AEJHFHH@B@@HHH@JBBIFMGEKDJBBH@HHH@B@@HK@JMD@BMEE@DABI@JNJBJEDA@@EEONNMCJJOEGDGMFMJKGBOKEIFOFFDMEKCFIBIFLNDFJKE@EEDNHACJNJJKOOIM@@HINMGMOGGOMGEFJH@@" "JNJHHMNNOKEOECBBECGJMGEEOGIIEBNBOLKNDLIMCEEGGDJLJEEJJABKEIBEEGGGBMNLMFLIEIFJMJD@DJI@@D@JJEBI@IBE@A@@JMDMFHABJHIEAAAB@JKGMKONMOFJHBDDDEDHJJD@KEIEJH@D@EBDHDJEBJHA@@DJI@ABMJKDMDIKEIKMJGGGEEBDMFJDBJMEBIJIGGEEFELIICNIOJCJEDLOGMEGEJOFEBBFEGMFOKKMHHJKJH@@" "BEIGCKMONOOOJMHHHJHMONJGDNNBHGHMMAEHJIE@KBFIBMKFLNJIKKEBMGMNGFIMKLMIKMOGGGEOOEAEA@BBJHMGE@@BBBEAGEDJBJKB@AED@@B@BBBDEGONGGJOGCOOEABBB@B@@AED@BFJJBIEGDEBBB@@EGEHJJB@DEDEGOMGGGGMNLMINMLKGCMOEJEFNLJKIKFMJDKBFHEDJHMDEMHO@JCKIGBKOMHJHHHMJOOOKOMNNGDMB@@@" "MKFJJOOMOOKNOHBKEEGKKMMIMMKEDMMBKDOOCFIMLKJOEBMDEELKAEIKEICCJIGCEIKDGCFLIEKOJJD@DEDD@ABH@BJHDD@D@EAAEK@MEB@@EBHIDDDKONKEMDOIEMFKONIAADHJE@@BEEHFMDDE@A@AA@JJ@@JD@AAEA@ABJONMDIKFGAFLMFGDJNFDMFLMDFIMEAEJEGJNIMLKFGOIFJEMIEFMMLMMNNOEEFJ@OKNOOMOOJJKFMH@@" "EBLJMONOMNOEICBFJIMGOCKGEKDGMCIGNJEMEEFBIIFDJLMKNFELMICBJJLJKOJNOJOINNMJOEFM@BIEA@@HIBECFD@BHHJ@JJDDBDE@@DJH@@BB@HMNAGJJBKMNJBJODCMHHBB@@@JI@@EABAABJHBHHJ@ACFEBDHH@DEDJ@EKEGJMKKLOJOKJONJIJJJFDMIMCCNMIJICDLJCEEEMBKODNEOAFMGFNGOELJKBFDMGKMOKOMJIJE@@@" "KMMEKOKKOMNOFFNLIFKNOOENNNK@HGFMN@KIIFHLJMAFLENJBDLMIJLMELIEKBKCJHODMIFNDKONEDB@BEEABDBD@HJHAA@E@@IEMJHBBH@@@IDHOONEKOFHHDJI@HKGNMCOOHIDH@@@JB@JMMDH@E@DD@JHHABABDEEB@BAECONICKDMIGHJNFJFMDIMEIJLMIIBBKMAKDEJIHKDLNHCMKG@HFKKKMGOKNKDIKKCGKMONNONMEMNH@@" "FKKODONOOKEL@MECFIFIJGOHINNEBLMKEJAFAJFIEBNKMOEGFKEHEIIJJBMIEMLNNNMIKFKJKFJHHBHJH@@BDINJJB@BJ@@@FJBJBHCDH@JHJBEGNHAMBKGMJKONJMOFJEL@KOEBBHJH@IF@JBJBK@@@BJ@BBJKLIB@@@JHJ@HJKFJNKFLMKKKIMMDMJBJLLM@MFKGEGMNKJEDKBLCDBMFMIJECKLHOOBLKDKFEEHAMFOOKOIGNNK@@@" "EEB@KOGKMOOJNANHAFEFOMEKGNI@DGOOJDELNMJJFDICNDOJJBJFMJJIJLHFMGGEGHOEGMJOFOME@HA@AEEEAD@@@HED@BIEA@H@HBH@BI@A@HKNMGNJFJML@@OH@AMJKBKOEKNHHD@DJ@@J@H@HDEDJ@AE@H@@ADEEED@D@HEEOKGJMOEGHOEGGEK@IJLJJMKBJBJOICNDICBJMKIMABOOOA@DKOFMEOKECD@KLCJOOMNOGNHBEE@@@" "BDDJBOOOGOKEJKAIDKJEEOOEIIOEAJMKFHIGAICDMEDKFKHECCCDHMFMCGFMFMHFMBMHMDKJMJM@EBJJJ@@@DIDJJ@HADD@@DBBKA@BE@@BJBFNIKMEAMGGAFOHOKDGGELEENLKKBBJ@@EB@DFJBA@@AAD@HBJIDI@@@BJJJE@EJMJNIEHMJEK@MKEKGFEKEHIFFFE@NKFIEEIFDLGDHKFMJLEGLLMGOMEBNIDLFJMFOOGOOJBIAB@@@" "DHJ@IFOGMOEOFDOBAEFMGKFMGFM@BGOGEECJNEJCBFEJIFMOJEFFEDLJMDDBEOCKKLOAKKEOOBHE@D@@@GFMBDA@@EAD@H@EADJD@EDHAAD@EOMFEGNJKMFNI@OHDKKENJKOECEOM@ADD@IE@ABIDE@@HADE@@DABEKG@@@A@E@JGOMFNLGINNNGMBAAEJIIECCEBOMKDJMCBFBMCJNEEGGOB@EKGEKFOEKEDBGICGMGMOGKDHBHI@@@" "IABJBONOGNGEMKEFJCLJOGOJKEKEKNMMFBJJBNIJJEFEMBJIKIIDJMGEIKFKFBNFGJMEGMFFJDE@EADJI@@JM@DEDHB@J@H@JAEEA@@ADBBMKEOMLJOEEGEABEHMBDEGEEGJIMOMFMJBAD@@DEEDBH@HBHB@IEA@EJH@DJIDE@EABKCEOEEJOCCJCFKFLMGEJIDLNLJJEMCEBJLKJBJJCEMKNMFMFJOOGJINBKEFMMGCOGKOJBJDDH@@" "BFD@EOOOOMEJNNKKDIAEDKNIGFJCAEOOIEOMEDMECFDLIMFOACCCBJEFKFEBJOJKKDO@OEKMAA@DHDA@@BD@JHI@ABEE@E@J@D@HBBJJADJKGOOOOEOJKNOEDMOMIEGKNJOMGOOOOFJIDBJJB@HA@BHE@EEBD@DHJHAB@@DA@I@DDENMGHGIFNJOJJECFKEBJFFFDGKELIICFEEIEEOMDOOMDFBKGDKNIEDDIFNKKJMEOOOOM@ACB@@@" "DHIDIJONEKJKMANFJBGEJOKGDEFGDONAFBIIBIDJJJNKEBJDMDMFCFJEEKBEECGEFMJIMNKDGFEEEADDIDIM@A@B@@H@DH@@JKEBDD@@D@ONOEKFIODFKEFJIM@ELJKEFKAGLKFMGKOHA@@AABEFJH@@I@@H@B@D@ELIDIADEEECGAFKMLJMKEGFEEBFMEBKFCEIEIBJEFKJJJIDJDLJCDCOIGCEAGFOJMGBBKCLENJNMCOJLIDHI@@@" "IBBAEGMOOEEDJGKLHBLCGGNHGKLDAKOOAEKEECFIEEAFJMJMIIIIDJCKMJKAIGMKEHOAKLN@LA@HHDBIB@FJEDADBJBIAB@IED@D@IEBHKGEJKNMOJNMKNOABJMJJDGKNMKJOMKNJMGFHJEDHA@AEDHBDDJBJADAEBK@BDJA@HHDAHCINLGHMFMODLFJMNNBIDLLLMJMJKDEEDKFEEFMDGONLAANO@KOGFAJ@INOBIEEGOMOEDBBDH@@" "BEDJAGONMNIODMNIBLADHOKJLOHIDGFJD@AHIEDFJIFDFDKCFJJBKKGCFKBIBIMEJNMKGKEEABEBBHH@@KMDH@JAD@HBD@DCJIE@HB@DABNMENLONKKBKFJJDOJOIBJKFJFNKOIKMEKJDA@B@HEDJNA@AB@HADBH@IENH@@HJBEBDEEFOFMKJMELJDJFKFGFNJBJKFFICACDJKAEDHL@ABKGADHOIJNOHIDAJDKMIGLKMKOODBIEB@@@" "A@A@JNOMGFKJKGKNHADIGOGDCMBB@OMMHECMDABIEEIIBJMJHLJMHJJJEEKBMKIMGHO@MEF@DD@DDABEEFJMEE@D@JBH@EABEF@EBHE@JOOJKEOKEOJECFOMKMOMNMOKFEBOMFOMFJOOJHE@JE@CEBDE@@JBHA@EEEJKEEBDAA@AA@CEEHGHOELNMJFMEBJJHMJIHJMJJDLMEDJDAENE@MMOHBBENAGGODID@KNOFJNKGEOKJHD@D@@@" "LEBEAIMOLMCFNMGAANAJAFNJJKDHAOGMDHDJEEICFJMBMEFCDHDHBMACJGDLIEFMLMNICOHI@ADI@JHH@EA@@@BIB@HBJH@BL@JH@BHA@MMGNODOOJKMFMDNDKJNICIEKENJOOIGKOEMHD@J@@JHAJ@@JJ@HBDJ@@@DE@@HJHDID@DHONDKMIMKEDIIGBNDEJ@I@IFCEEJEJKFDMEBI@IEOGL@IFJJKKDBLCLDGEKKFEIOMLLEBEAH@@" "@HDIDKOHKBFNKOMLCDDFJOOHCLJ@NELJAECLH@EFIEIDAJDMJGFMLKEICFIJNJLKGIMAOJB@ADADB@BAEBKDJJHBDBBH@AEECD@ABHBJEKJKENMOKKMEEKMMKMOMNMMNMEENNOMKMFJNMBJ@JD@AFEED@@JBAB@JJIFJEDB@BADAD@BBOLELOFIJKJLKFDMFIMKGBMIBLADMDKE@@INEDBIMCHBIN@OOJKAAFAMONKKBFHONIDI@H@@@" "EBKDAGGONNKMOJMADMMA@JOEGOJFJOKMOHNKEJIIKGBIKCGKDLBJIEAEJMBLDMFNNMKEGODIBBJEDIDD@FDE@@BH@DHAEB@@D@IBDBH@KOJNOMHOGFJKGFMFEOOOMCEKGFJKGGHMOKJONH@JABDHA@@BED@I@@J@@EAC@AADIEBJBDIGOEFMKKKEIAJEJMDEDJJAIFOFFLJGFLLJMFKHOMNOJKBOOEGJHDEMIDEJOMNKKOOGDAFJE@@@" "DD@AEOOMKMNKEOMJA@JFKGMDE@HMFKENBEGMKENDJJDBHLJDICDLLFJJKCDHJEEEGHOANJABDDDHIB@HJDKMEB@@JIAD@@JJIEB@@HBDJOMIHKEJJINMEOLOOGHOGOIOMEKLJJMFHLMOJIB@H@BEDJJH@ADDJH@BEENIBHHBDHIAABDBKLGHOEEEBHIFFJJKAIIFDIBIHJABJICMFMOEBCMFKEHHEAEOFKBHDBMOMFKMNMOOMD@AA@@@" "JIDJ@GGCNNIOOFJ@HEF@DOGIGOBLDENMDIMDBGEOBMHHJEEJLJCBDMDMEFEGCFGFLILBMHD@AAAE@DIB@JB@@DJB@@BABJ@@J@@BJ@@AKOGGGNIGGNNJKMEMAOGGLEMENJKKOGDKOGGGNL@@BJ@@BH@BJDB@@BBI@@BBHBDI@EDDD@A@MJALIKGCFGECEEIEIBFBIJMEBHHMJGMGBAELIEKMAAJGODOGI@CE@HBKGOLKKNGG@BIDJH@@" "BBA@ENONOMFKLMEDAALECGMDEEDJIOCJACKIDHJJGEEBDJJBIBJFKCADMJNDBEEEKIKCKBHJDDD@EAB@K@DJJA@DJBDDD@EEABED@AECGJMNKOEMMKOEGELGONHKOOAMGEGNMMMGNKMJOFED@AEBDEE@AAABBI@DBJI@FHBDE@AAABHJFNFLNMEEBACJMIDFFKBJDJBJIBEEGBJHIDNNDBNGLJIEEAEOFEALDAEEINKEOKOKM@DBB@@@" "LHJJHKNENMICKJMAJD@JNFOJGMHHBJNNJBJL@BDFKGDHLJJJFECIFFNIIEBKCJJJJINBO@A@HACE@D@J@DID@DBH@DHIA@H@DDHADJ@FOGKJOJIFKENJMNJMKOOONMJKMJKMFKDJOJNOGK@BID@IA@@HDDHI@@JA@ADI@BHA@EFD@HD@GJCLJJJJNFJEDLKKCDNECBJJIHIGFKAB@AJJBKKJJ@HMOBOKCJHABLEJNNDMKMCNHJJHIH@@" "ACD@AOOGMOBEMOBD@@I@EKODJKAAAOAJ@IAJIDIEDDKACAEBIBIBHJHFFKKBDCCKGJLKNHJBBNHBE@J@EA@ADHHABJA@DEA@J@BJA@JKNMOGOGENNNMBCDLKGEJMGFIIFBEKKKMGGOGMKNJHDBJ@BHDEA@DBJD@HID@DE@BHEB@KJBBHKNIJOFNFABFNKC@JHJDJDJEDFDFIAEDIDJLDHBLGLDDFJIGNM@DH@ABGMMBGMOGOL@AFD@@@" "DDAEECNOOFLMKMMAMEBGJKNMGLJBCJGEB@E@BAB@BJDOFDJDKEEEECFEDMFEILMDMINDNADDD@CMHEAE@DBHAABJD@DEA@BG@JH@DB@GECEOLOIKKEOKOOEEFOOOKEEGONOMFNLOIOMFEG@BA@@JHGB@DEA@ABJDD@JA@EDE@MN@AAADCICLMIEILMCEIECFEEEEFIBICGIBJ@BDB@E@BEGBNBBIOEKNJOBEELEMNMIKGOKNEEDAA@@@" "BJJ@@MKMFOKCEKBBD@@IEJMNBKDDFOAJEJKJHHDDHHJEKKDJJBJIAHLJFKIIDEJJKDMCLH@JIEDBADD@EJMADB@@ABI@BAD@J@BI@@BMMDB@ENMGFNILKDLCDKJNIFAIFILKKGEKM@BAEMJ@@DJ@BHADB@DJD@@BADEJM@AADBAEDJH@INEIFJJMADLNKBIHLDJJBJIFNMBHHIA@HJNJMBLGKAAFJCMJMDH@ABBFMFFOKENMH@BJJ@@@" "DH@IEGNJMONMOODEOBJFMEOLKLI@INGEG@E@BBJIAB@JEFM@EKELJJMCEFMBILIDNINDOAA@B@ADJ@IA@DJJADJDJD@DDD@E@JH@EDJOGEJMLKIOMMKKOOJMOOOOOMJOONNMMOLNIMJMGGJIE@@JHE@AAA@ABIBIDBJI@DDHBID@B@DDGICLKIDILJEKEFEJJIMFM@EKEBHBDDJJB@E@GEGCLHDINIOMEKBJGMAGOMKOMJKOEDH@I@@@" "IBJB@KMEKEEKDBHHJD@IEMGFBCFAKMEJF@KNHD@@B@JA@MBNJDJEEDJFJGDLNADKGKMCLBBBHDDE@D@BCA@@J@@I@@I@HIFJB@BE@ACKNOEJMNIFNMCLKENJKEHMFJKMFINEKKDKMJMGKNND@EB@BBKDHHDH@DH@BH@DFB@A@EAA@JBBANENOFIDCIIGBKBIEEBIBKJEHDBHB@@A@KNHCBMENLCFBCGEMDHABHHJAFMEFMENHBBJDH@@" "ED@DEGNKDOMBMMABNIBFOEOLGN@OENCFHKMBB@JEDJ@DEGDEKJFHDJGACNKJEFGEOHKFJDDJBHJHDHJDDDBJ@HJ@BIBAB@A@DJH@@H@ONFOGJMOONMNJJOJOOGGGGOJOJJKMKOOMJOGKCOH@H@@JI@D@BDBDJ@BHHBJAAABHI@JHJBIABKFHOMGCEBNKNDGBI@KBNMAGEA@BIEBHBBENHKFCMGHCOAOMGKBDKJDEMJEOIFKOEA@AE@@@" "HBJHJNJMOEEOJIBGD@DEJKFJH@IHMIFLB@ODHE@HA@JHHJHKNLIFMDKBJMFDJFHFGCNALHJ@HA@JAA@JI@H@DA@EDB@D@EGFA@ABJBEGEMKNLOIBKMONGOMJOFMKGJMOOCOMNJDOIKNMMGEBBJD@DCGE@A@BAE@DA@@HDJHDDBHD@HBHILCNGC@KBICEJJFIEKDIKNHJHHJHD@HE@IGHBAKDMHLH@JKFJMA@AGBDJOMEGMJKJHJJ@H@@" "BH@AAKOKDJKJJJDEMBHOFNONGOCEEJKK@KJJBHBBJE@BBMA@@KEJCCFEDKBNBIEANIKGJADJBME@EDB@BBABHJBHA@HHJHDILEBD@DHGOOOGMMCOOJOGEMJONOBGKOJMMGGJOONEMOGOOO@I@ABEALI@JHHHD@JBHJDBB@BAE@EEJBIDBOFLKLEDJCJFIECFFBMFH@DEJB@EBJB@JBJNHFNJMEFGOCOKKGHJEMABJJNJIFONLD@@J@@@" "IEBJFGFJOKGGKHHKB@EBKCFMBH@HIOFHEAG@HADHBHBHL@DAEEEEJBAHMGECMBKKECFDLBBADB@DH@DJLJNDA@D@JEAA@BIBB@D@EEAGD@DNJNJIFMNNGGMJONECOJMOGCKMKDJKJKI@AGDEE@A@BBDJ@DDEBHA@DACJIJI@@I@BADBBAICFEFNJENEGEHLBBMEEEDA@AHJ@J@ID@HGDE@KGLHH@JEKFFJE@BFHHNOGFOJKGCBJEDH@@" "F@D@HOOMJJKNMGAKDFJEFJONEGJIALENHBMDBJ@BHADBADHJ@EFMCEFDHNIL@MH@OFOGIDDD@HJIBIH@AD@@JAAE@@BBA@CEDDAE@BBEOOFKDKKNKKMMMOGENMEEKMGGMMMNNKNNIFKGOMBB@EDAAEF@DBB@@EDDBH@AD@@LJDJHHAAADOGKGH@MHALKHICEFEKE@BHIDBAD@J@BJAEJ@KMALDJOECOJKEBKAFLGEKNJJMOOHHA@C@@@" "KDHJGKFKCGMKKLBJAEBEECGJJL@BCKGH@DG@H@EDED@HDAA@E@AJLIHIBEJILHBJJIJDL@JJIBADDBBJJILD@BD@EE@DJBHBHHD@EDDCMDMNMNKAFMGKGBMNKNJKNKMJGFOEKDFKMKMIENAAE@A@HJ@JBI@EE@AB@AALJJJBAADBDJJHAIBLJJJ@ILJMBDHLIJL@E@DDA@HAEAE@@HGA@@OFNB@AJJOFEEBEDBJANNMOFFKFOBHIFH@@" "NKI@EGONMGBBGEEKDBDOKKOOEKBHENKECANEADHA@AJBIDBBHEDEIBGFFOJJJEFDOCGEGE@@B@D@HHHAMFHIDDHI@@BH@DAAA@HI@AAGKCKFLNNNKLMMLMKENOOOKMFMIMMINKKKIKFNFODD@DHHDDDA@@J@@DHIADHKEL@HHHA@B@@EGEGFGICEBJJOKCGBDMAE@JBADJBL@D@IDECLFEFKM@JFMGONNOIBAFMEGBBGEKOOE@DNKH@@" "MNEEOOKGJJONKLKDABKDICFOBLDACDNLFFN@BAADED@D@AEDA@@KFDDLIBDFEBICMFNCM@EEDJIEBABJBAA@@HABBEDAEABFJEB@EDD@BMBNIGEKDJKKJKBOEJBBMGJFJNNJIFMGDKJEJ@AAE@BEBKBDEDAEBBD@H@DDBBJDBEDJIEE@ENCKENDJECABDIIACFH@DAED@A@AEADDB@CKCAKIFDAAJGKFDIFJDAFINKOJJOFOOMECMH@@" "OMMJFOFMDKEDNCEHJMFIEJKNJKACGOEJMFMFDDBA@@HHJJ@@JBE@MEKCCGJMBMCHGBMFJB@@@@BH@J@@HLBBA@J@D@@H@D@ID@@JHA@INJEMDNOFKOJLGJMEKOOONMEJOAJONKGKIEMBKLHD@JH@ADHA@@H@A@BHDBBAHH@BH@J@@@@BBKEJG@NEJEJOFFFMEHEBBH@BJHHH@DBAACEKEJMGOFDFJKNJMDKEJHMFCIEFIEKGKBMMOH@@" "OGOMMOFOGFONADJACAMFECONILEEADKDBEJ@HHHDEEAA@@DI@DHDOODEFOBJMJMCONNEMDNNKBDAB@EECCDDJA@JHJJBJIEBEDD@BDEBEFMFMGKMMOEKJOJJEAEDEBJOJNMGMMNOEKEKEBEAB@AAEBEDJJBJHJHDBIAFFEE@BDABFKKIEMCKONEJMJJGKEAGOI@I@DI@@DDEEA@HHHBMBAFIDEEALKONECELFDBIDCOKGGKGMMOOGH@@" "NOOGONJMJNMHDJMBMNKDJMGGBJJKKONHHIGFAABJH@BBDJIBBHAAHJOBMBOMCJJDMCMADBAADDHJDDH@DN@H@DD@A@@D@@@@L@HJDI@@JMKMDOGOGFKNOMGFJNJKJKGEOKNKGGOGIENMJH@DIBHHAH@@@A@@D@AA@@HCI@@IABHIADDBADENEIBJNEOJEJGJHLD@JBDJIBB@@JJDDCGDHHKONNJJJGGEJIFKMJEJI@MKJMJKOOGOKH@@" "KMEOEMFOEEKFEAJDJIOCEIONIJBBKLMEBBNHEDD@BJDDI@BHDBFBBEJLOGJDEGMIOOJJI@JDABCD@IBBIEIADIAEDBHJJJJJCBA@JBBJCKEJMNEAOMJKICLMOJOJOMINDNJMOLECMJMFNBJBBHDBFBJJJJHJAEDDIDDMDJBDHAFBDABHDJJOOLMOEABOGIJMBBCBA@J@DIABJ@AAE@KJBEEINJBBLKOLMFGLJIBLECFMEGKEMGMENH@@" "OOOJOOMLKMFIHGDIKOEFJKGNKDDHAKKD@EMDHAAED@HHBDHBHHIEDKGMDCANNKNMMLN@JD@IEDDIEDDDBIBB@@D@ADA@@@@@JLDB@HD@HGJKKGOBMGENLDKB@NJKHBFIAKMGEJGOFNJO@HA@HBAAJH@@@@DAD@A@@BBDJAAAEDIAEDHABHCIMMKNKKLFAEOFIEDHHJ@IB@HHAEDD@IEM@AFNL@IAFKOFJKEGNLIG@LKENIMOOJOOOH@@" "OOKEKFKKFKDOAEMGEDOMANMKBJIEGFNJDJKIAJD@ABABIABHEBB@@DHHJJIEIBAKJIHJ@@JB@@IB@M@HHBHHDJIED@BEEEEEBI@HIE@JBKFDBLNEOMFMAMDMEKONMEIELEKEOMCIJACFJBHEDHHDJEEEEEB@AEDJI@HJ@HHEHBDH@BBH@BHLJNLBDMDJJHHI@@BBE@JDDJDBD@ABLDNJIBKKGEDJJFMKLEOIEGEMDGIFKFNKFMFOOH@@" "KMGOGONEMOFKFKJ@MONOKIONODB@CMKHLONNB@IEBDJDDDDE@HEEBIEB@CEFBDJEHJB@EE@HJIBBIDECEHB@I@B@ADJH@@@@EBEBB@E@HBNIDKFIMGIFKECBNNHKKJFEFKDOELKFIDKJ@HE@BBEBE@@@@@JID@B@DHB@MFEADJBDJHHEE@BBHMBIBCEF@BEDJEE@HEAAAABIBEDHBCKOIHNMN@BAGKOLNOKOMHBNKFKGMMCOOGOENH@@" "OKOEEGOOJJENMEDNJMEICGKMBM@JOGGEEKLLHJB@FI@IIAA@EDJ@DBBHEE@@HI@IBJHJH@BB@BDDBB@HFKBI@BHJJABBJEBI@HHEDJHEADOFK@EAKOGGFONEIKEFLMCOKGGGNLE@FKGIDE@JIE@HHDJEBJBDBJHJ@DJFK@HBBAAB@BB@@JHJJDHDHH@EE@JBA@BIE@DDDLHDK@BBHIINMEGGGJHEJENOFDMEJKIEEKMBJOOOEEGNOH@@" "JOENGNNMEEFOIGMBHKNOMNGNDJF@CJNJMGEKA@HJHBMBBJDE@@HIADHDH@JJBBBBL@B@AEDHJHIIDHJBIDBBBDE@@DDH@HDBEBA@A@BHBA@MLONCLMLLKAEOFD@ACGMDFIIMINCOIMHDB@J@D@DBEBA@H@IA@@EABBBADJBHIDLHJHIED@B@AJBBBBJH@I@IDDHH@EABJBEJ@JHHDFMGEJKJN@CBICOCMOKNHJEODOKEEEKKOCMGJH@@" "OOOMMMKKONMMKMGNJOKKKNONKLIGGGKEEJNBMEB@JD@ED@I@DIEBDAAABJ@@HHDJ@JHJD@AB@BBBAB@HBNH@DI@BJHIEBA@@@DJEDEDAEDBKKOKEKKNMJOODJIJLJIGOJMKNNMFONNJAEDAEAEBI@@@DBEDHJJ@DI@@KJ@HBDBBB@BD@ABHJHBI@HH@BJDDDABEDI@DHAE@ABHBEEJCJMEFOGGDINKOKNNNOJKOENMMKONNMMMOOOH@@" "KOOKCKNONJKKCJLE@KFOKNMJJMFFKKFLHGKIB@DJ@IEDIJBBIBDDIDJD@@JJBBI@I@A@IEDDEDHHDDBBMEJJHDED@AFBDJBJIA@HA@AF@BDEOMFGFMKJKIBM@BGB@EJDNJNMKGCEOMAB@CD@D@HDDJJBIBCD@AEA@JJMEJBAA@HIEAAEDHD@DHDJBBJH@ABIDIABDJBBLIEDHBI@BDNO@IKFNKCEJJMKNOKFHEAJNFNJKOKNNFOONH@@" "OOJNONKFKOMJKEKNNFMKMMOOEL@LEGGBAKEBDIB@JB@ABDHFDDIA@A@HJJ@@HHBJBEFD@@A@JADJIAEBKF@@ABH@JJHHI@H@BDEADDJ@FHI@EKMEOKFOLGKJEGMOEBNOAOKFOMENM@DHK@BIADEAB@@HDHHJJH@JD@@CFJEDDJIDBHD@@ACEBBJ@HH@BJHHD@DDIAC@IBD@BBHBDIBEFLBGGEAHAMGOMMNMKCKNMFJMONKFKOKJOOH@@" "GOGMNONKNNKEOEDJDMOOGGEMKKJAGMLLEEJLEBDJADIDIBBHIABBBIEE@@EBBBH@HH@JJJJBHJAIBD@BBEMBJHBD@AEBBJAE@A@BIA@JHBBECOJCJNKKEMFDKJBBNICEMFNKJNBONEBB@JHDDJ@D@EDBJBED@AB@JJEMBB@ABDLBHJBJJJH@HH@JBBE@@EEDJBBDDHJBDIDIDBIBEAJMEAIMODBNNMMGGGOMIBIEGMFKKNKOKMOGO@@@" "ONNOMOMOGKEJNBKOGCJKMOGKJN@JCGEBHOEDHDI@JABADHHBJDDDHB@@BDHDHDAEEAEE@@@DE@DBDIEDHIBD@BHHJJDED@B@ONBEBJJ@BHHHEGDIJKLJFBHIDEMMADHJCBINJLIGE@HHJ@BJJEBCOHB@AEABJHHJ@ABDHIEDIBA@EA@@@EEDEEDA@I@IB@@B@IAABJ@HIDBDBHDI@IEGHJEGFBHCJNOGMNJNGGNJCJMFOGMOMOKKOH@@" "NMOMKJKFMNNKHJNKFFONMOKOEMA@NMKNCNJLJKBEEEDIEEEDJIBIADJJDIA@BIB@@B@@BJJI@DIDIBEEEAE@IDEB@BHHAEDFJILHEAAE@BB@HOEBNOMMMOEBAKBFLBEGMMMOKJEGHHBB@EDDE@ILJKAED@HJ@BEADHEDEEEBDIDI@DJJJ@@B@@BDJ@DDIBJIDDJDJIEEEDIEEEBFJIJKNCNMKHDEMGNOMKOKCFKJHNKKMKFJNMOMKH@@" "MOOOOOOMGKENOEMOEOMEKMOOEJJEGGFDJJHI@@FHI@EBIADIEBHBBA@@JBBEDDDJJDEBD@@BEABI@EAF@B@ABA@DJHABJ@@HJFAADDB@KDHEAEDELGKGKJ@DGDEAGA@BNOFOAMAEDE@IFHBAADDCBHH@BJD@JI@DBD@B@CDE@DJDEB@@ABEABJIAAEBBBH@DBB@JEDIDDJE@DHK@@DHJJICGGEBJMGOMNMEOMGMMGKMFOEOOOOOOMH@@" "CMONKKOGNJNKIGKKGBKOMOKNJGE@FMDIGOBBBJHEBEHIBJEBJJDHHJEB@DDHAAA@HHHD@JME@DDBGKD@EDDJEDE@@BJFHIEAHHJBAADJ@A@HBOMAKMNLFDEELI@DIMEACAKMNLEOJ@HD@BIDDBBHHLEDHKBJ@@EAEBIAE@AFOBAA@EEJHA@HHHDDD@IA@BEBHHIBJJEBJDHMBE@JJBBGODIEK@EGBKNOMONJGFNODNKJKOGNNKOMN@@@" "OGOGOGNOOOKNOFNOKGOEGJOKMNJBMOEFJJIDLABIDHEBDBHJEEABBHHDDHHADDDEEEBIE@@DEAADHDIDH@H@HA@AED@HBBBBBELHJD@@IDEADGBBJBMCKHHJABJJDBHHNNEJBJBGADEADH@ABHIMBBBBB@HAED@D@H@H@IDI@IDDEA@@EDJEEEAAAD@HIA@HJBDEEBHJABE@IDJDAIDJJKEGMJBKMNOJOEGOFOKKGKNOOOKOGOGOGH@@" "JKJOOOMOMKFKKMKOGOJOMGMGHGJMCFJMEOFOADDDABHIKDB@HBDDDAE@IEADAAABH@DB@EDI@BDABJBEBIAEADBJ@ADBHHDFINJCBHIEBA@DAMLIMMJFNAOLKNHKNIOLCKBMMLIMLA@DBEDHJFBKLKA@HJAD@BJADEDDJEBBJDAB@DIE@BA@@JDDDADEDHEDAAAB@HBAFLHJDAAADGKGMEJKFEJO@OEOEOJOOGNMNNKFMOMOOOJNJH@@" "EGGONNKNKFMNOFEMNMEFFNKOGJOAGOGJOBJJLAIADDEB@AHJJHI@HJ@BB@B@JDDDAE@HBHABEDIBD@HHDBB@D@DAED@HBBHHBEHHDAB@@JA@JGACGECIGGAEJAEDBMDGGDNEGFDGBHDBH@BDA@HMB@HJB@HAEDA@A@BBA@HHABDIEBD@J@HEDAAABHB@BB@BHHDHJJHL@BEAADDLAJJJGJOGODGJOGNKKCEEKMMCGKMKFKNKKOOGE@@@" "MMHMEMOMOOJONMMCMMHMLMDOMCJLKGJKEDOKKDBDBI@EFJAB@ABEA@IDHEDEAAAAB@EBDADE@ADEKEBAA@DFHIAD@AEBHHAADJBBIBDIE@JI@EFBNNNFLJJNEE@EECJJIKCKKJCE@DJHEDIBDJBBIDD@HJED@ADDHKA@DDBEFMAD@EADABE@BDDDDEAE@IDHDEBD@BDBKE@DJABAFNOIEFJOFIJNEOIEIMHMMNEMKOJOOMOMMEHMMH@@" "JKGJOOOGJNMNMJBOKICBGKKFJDOKFNONJACGNODHHBBHHABDJJ@@DCB@BH@HDEDDDJHDJJAJBJBJD@@JDE@HABDAED@DABJBA@HJDBIB@BB@DOMBHKBIJ@@HMDEAEHH@BLJFHJEOI@BB@BDJABHHDBBJDA@AEDABD@HEABH@ABJBJBLBJI@JIAAEA@H@J@BFA@@BJIBD@HJB@HIGKOFDBKOKKFOIBKFNOBFDNOJBMKMKJOGOOJOFJH@@" "EJMEBBINOMOMKEMGFODKKGGONKKMIOKEDJENKMMEBMDCEBEE@@IDIDDJHBIAA@AA@@EA@@J@D@HHJJE@M@EEB@AD@AE@J@@HHE@HADDDIDHJIGDCNJMGDEGGEE@EEGGEAGEJKNAGDJHIDIAAD@HE@HH@BHED@AD@BEE@EHEBJHHHA@BH@DE@@DD@DDDJ@JIADIDH@EEBEFAEJEEMNKMBIEFOLMNNKOOGFNIGKGEMFMOMOKLJBEEJM@@@" "JDKBEMGGOOOGFEBNMJJFNNMGKEFIGGNNIBJMDJCJL@BLIDHDEBBABA@HBHBBBKDDBI@DBJ@JIEFA@@HE@E@@DED@JD@E@EEBBHEADAAABAA@BKEEIMJOHH@LIDEADIH@HOJMLMEFJ@DDBDDDADE@JBEE@E@ABHAEA@@E@E@H@DCEDJHBJA@DJAAFJBB@J@HDBDBBEA@IDIJ@AJNBIEJJDKKOGDKEFOEKKKBJMKJECGGOOOGEMBFIBH@@" "EBMNNENOOGMMONNMCEDIKKAOFEEODFKMKNEKAEDGKNICBAAIHDIBIBDJHBDDEDIADBBID@ED@@ELJJA@E@EI@HAB@AE@BH@AGG@F@JJIDJBBHGDAOAEODAGIFI@DKDODAGMDGLAG@JBBIDJJHC@GGD@@J@ED@BD@HDM@E@DBJIM@@AE@ADJBADDIEAAB@JIBDJDI@LLDBFDKNOAEDFMCNMNKAGMECGLFNLIEFEKKOMMOGOKMCKMJE@@@" "DIBAEKEMEOOOJKEONJKBOFJNMJFMKMOKJCEFJDA@EEFDEFJBEADDBDA@BHJHHBJD@D@BABHICBDA@@JEDE@BBBHDID@ED@JMDDDHK@@BB@HDBJMCJOGJ@JDCIBEBDNABHBOGJNEJJA@HBB@@FHIAAEJHAE@ADI@JBB@EAEBH@DABFDHJDB@A@ABJ@HJHJ@DABAADEBBKEACEE@DABKEFBNOMNMKBMKJKGJFJKOMFJOOOMEMFMDBDI@@@" "KFMNJDOKONKKONMNKEMGJOGMNLIKEBKODJNHHFJE@JMME@@I@DABDIJDHBAECE@I@HJHJDADDDIJDJ@@A@BHDHA@BAE@AEEBJIAEDDMDHJAADGJEEKOOI@IJFL@AKBLHDOONMEBOADDBHIEIAEDDJJEED@EDB@D@I@J@D@@BIBLIAADABHJHHDHEFEDB@IBLIBDA@DH@EEMJHEBK@HKJIGNJEFLIKMOGJOEMFKMKONNKONOIBKMKFH@@" "DIA@EKJNKKOGKEKEDJJEOAHOMABEEDNMNCNCLM@@DIBKHEJBJIDDJD@IADH@D@B@EA@B@KFBJJBDI@JIDDHA@BBBHD@DHAIEDJBAJA@BC@DD@MDCKFOEBBBEIAEDDMBBBEGKFNAEHAA@FB@DBLBBIEDL@I@A@JBB@D@IADJHDIBBJJCFHB@DE@B@A@@IDDHABIADJJBM@NJDI@@EINCNCMKIEEBDEOHLGMBJIEFMFOGNNKJNM@DDI@@@" "ADJJJEEIEGOOGONNKEKJ@FOKKNDKEAICJDMDIBJIADEFGL@D@BAB@JJABAADJDDE@FBHE@HMJHHIBE@BAIADBHDDBHJAADBAAEDJDJEHDBHIEGHIFKMOEEEKDDEAAFMEEGMNKDHOEDHJA@MBIBIEDDBADDBHJAA@JADDLB@EBDHHJMHHE@JC@EAABIDDBDBJHBDB@A@AOCEADDJJDIEIBNDLEFICNNOK@BNMFKKOOGOOEDMEBJJID@@@" "GEEDJMGOONMOONJKNOEEDIDGNKIBBNNJDIFAJG@BEAJEJKJIFIBDJ@@DDDBADHHHE@DE@GEAEFADD@DHF@BADBA@HA@JBHMJBBJ@IBHBIDA@@JBCKGKAGBKDAM@ELAFJGDFOFNBBH@DADJ@JDHBJBBMHJBHD@HDBADB@C@I@AADCEDEG@EA@E@HHIDBAAA@@BIBDKDJNJMBLEB@GBLCDIBKKJBDNKOADIEEGKNJKOOMKOOOEJIEEG@@@" "HDIEKAEDJIKGOMOOEFOBABOOKNCDMIA@NANJLME@HJ@HAFMJ@BHI@JJI@JHJBABBLMJHBDJJBLJA@JIBHIHJ@HDEBJB@KEBEMDHIDDBHB@JBBGLEDMFJ@GGIFJMJKDOG@BKEIEAOBBBHB@JAADHIEMBEFHBBJEA@HBHLHJDJHDBIJBJIB@JMIJBDBBHJHDJJHDHJ@BMKD@HBHHEEIJKLCHDDMIFCNOOJDBGKEGOMOOFLJIEDFMDI@H@@" "BIJJFKBKGGNLECNOOMJLNDENNJHJCFKMBJN@JK@BBAEBDIAGMDABB@@BE@E@HJHHIBEFLICDHA@JB@DDBBB@E@IH@@DIDJJBBJBBBIFEDD@DHNIABKH@E@KJMEBEEJNHE@@NJDDKHI@AAECDJBBBJBBJIDI@@@LHE@BBBAA@BBHD@IFDIKEBDHHJHHE@EB@@BBDAEODDIBEDBB@FJHCJJENKFBHJKKMACIJMOOKNEAKOGFJFKBJLJ@@@" "IBAJIDIBHJACJNMNOOGIKHNMMNCEDM@HFAEJMFADHN@DMBEEFIJEDMEE@E@IJ@EABDJ@AJLI@JE@DE@HHH@DHBJ@MBHAAAEMEBMDLB@H@HJHBGDEENMDHEGOBJEBJGOE@IEKMEAGB@JHH@HBAIEJEEMDDD@JEHBJ@I@@HHHEA@EBHDIJL@BIBDE@BLHE@EEEIEBLKEEBEI@CHIDCEJMDC@HEIEFCMMKHNLOGOKMKJNDBHJDIDJLBDH@@" "BDJ@JIFDCENNMIKKKJOGNKOOOJHNABEFEMMGKLEAAADI@JHBEF@HI@A@E@BB@JJBME@JECABE@@E@HEABDJIADIB@DABBBBFJE@AADJ@JA@@HNMBKE@AAAEHLHHHIHMDDD@EFJEKHH@DBHBIDD@EBKBBBBDA@BDIDDJIBDE@HE@@EBDFEBHEEJBJHBB@E@D@DHHCEB@JHDIDDDEANOEMMCEBDCHJOOONKOGJNNNLMKKMFACDJHBIB@@@" "DI@MAB@ILMBIJKOFNOOMGNLNJNAJJGBDOKENKBHBJDABFBBHJMKBBEBE@DLHI@@D@HE@HEDDHEE@EA@BDI@@BA@DJHJDDFE@LHABBADC@JEEAJJEBMEDBDKFCEEEFCFIBAEEJEBJLEEBHFADBBD@IHECAABHJI@DB@@DIB@DE@EE@IAE@HE@HA@@DHII@EBEBBFMJHJBCBDABJ@JFKMFOIBGBJLCJKIKOEOOKKGNJLJEILHBDEHDI@@@" "IBD@JHJBB@HFABBEKKFGMEOEOMBO@EDNBFOKFLAB@IDDHLHAEBMDHHD@DIAABDJIEBJJBJAAB@@IDBDDJDBJDDBJ@A@@HHDEBBJDHJADE@@@EGEEEJ@ADAFML@@@AMKDAD@BMEEGE@@@EADBHIBJBEA@HH@D@BJAABJABIABADH@BDDBJBJJEDJIBDDDI@A@HIEJED@IHIADHBDAKFOKBCIE@GJEOMGMEOCFNMBBDC@HBBBHJHABDH@@" "BDIJBC@JHJBHJDHJFDMJKOEKBKENBGBHMMAFMAFDIBJIEABE@EBKKBIEAIDBDA@BHD@@H@JI@JMBADIJ@ID@HID@EDFIA@IJIDBIB@JI@BEE@EFIKEEBIJBKBIEDJFJBLJEEFLKE@EEB@DJHBDJADJLHDDKAE@ADHHADHBLIDBEJHDJH@H@A@J@DABADLEDJFNJE@EBDEDJJDICDEKDEMHJGBCMFJFMGNJMICBHIBHJBHJHFBBLIB@@@" "FJBBHHE@A@HBBIDHHIBDJJNBGNNMDEIFJBEL@JDIBJAB@JDHKDDHEFB@DB@EADEDA@JJBEBBB@ADJAD@JDADBEAE@A@BBEBABADBDKDBEBH@ABIGGD@CFFMFMF@CEKEKCF@AGGDJD@@JEBAFIBADBDBEBB@D@EDEBADABHADBID@BBBEBBJHDAEADE@BA@BCE@IAFHIBHBDBJDIBHAMBBKDMAEKKOBCJJIBDHHIDJB@HD@E@HJBBK@@@" "HAEDCE@EBEBHHBAEBBHIABEDMKKJAGFIEDDBE@IBD@DEEDIA@IJBJIJI@HJHDA@ADEA@HHDDDBJ@@BBI@HD@LHD@EDEHDHDDDDADJHAEJNEMFOOMNMEFMLAEBJJJJEDAMKEEKMOOKEMCJMD@JIDAAAA@I@MAE@A@IHA@HDJB@@BJAAA@HHDEAD@DA@JHHDJLJJBLHDDIEEA@ABDHEBAAEDKGDBNNMIEBDDHJBEDB@HJEBE@EFAED@H@@" "BJAAD@A@E@DBA@J@@HBBDHIABGJDJFHOJ@IDHJBIABIBJADBJBAADBNBEE@AABEDA@DE@BHIJD@IEDHBIBHIAC@J@@JJIBHI@JJADBJJEIDBKNJKENHGEGDJOF@CGJIGEG@KMFJKNJADMBJJADBJHDHJDJJH@BHFDDHJDJ@IEDHABLHJ@EA@DAEBDD@EEBCJADDBBJADBJDJDDJBHIDHBOHKBIBOBDDHIBB@H@BHDBA@E@D@ADDBJ@@@" "MHJDADJBHAADFE@DJA@H@BBBHIKMHKGJLE@@B@DBBDBE@JADAEDFAEALHABJJD@@HEA@BHAB@IE@@AADCDA@DDB@EAA@B@A@BDIOGNJKJFIHFIMNKEBIBMAEEKEFMEDEJDJEFKMLK@LKBNJKOGLIB@D@B@DDE@BAA@DAFADD@@EDHBD@J@DE@H@ABJJD@ILEDCAEDADBHEBABBA@B@@EAJOFHMNLHJBB@@HDBI@ECADD@JBIDABHMH@@" "KGFIDA@DABH@HHJI@JEBIDDDAEEGGMMAJHBJHDIDDIDJEABADJA@J@DCEDD@@IEEA@BDHBJDEBABEDB@H@JA@JDHLBDDHDJEEIB@HEMNEMFEMFB@NHHBDAEFOF@CGKEDAB@HKHBCEMCEMCMM@HBDMEBI@IABAHIBHDBH@HBAEBDBEABJ@IB@DEEDH@AAEFA@BHDBIDBDEBIDIADI@JJ@JLEMOGEEDAAADJEBHDJHHH@JDA@DADKGFH@@" "NMEBADDHJEBIBB@BB@@@BA@IB@@ILCFBHBH@BHJ@HCABIFDJA@DEBEKDJJIEBB@@BBHAA@@@HDDDHADEAE@EE@HAADJJBIH@@BDEEBA@KDHHADKKKKMANJBKLIEDINJBKLENNNNID@HIFHDBEEAB@@@LJBJIDD@HEE@EDEAD@IAA@H@@DD@JB@@BBEDJJIFMBEA@DBICDJDF@HBHJ@@J@JCFALH@BDHDB@@@BB@BBDJEBHIADBEEKH@@" "E@NNMJ@A@@DCDHIDDJJJHDE@DJJBADHDI@BJHA@JAHDDEHJ@JDHHDH@A@BK@@HIEDDADBBJJBII@BD@HB@DH@DCFLKBMOFENMFILJLJDHBBAFKDDGJHGC@EOJB@BBOM@FG@JOAAFKDBB@IBIJILKEKMCGMJFIKFA@@I@B@HAB@DLJBJJBADAAEDHH@FJ@D@@I@HIBHBHMAA@LBHD@JJ@DI@IDBBJI@EA@JJJIADHIFA@@D@BMKKHE@@@" "JEEIBBNJBJHHABBAA@@@BI@E@@@DJAE@BBH@BJE@JBIBOFAE@ICBJGFNOONJOKB@@@JKDD@@HBEBHHIEDE@BJHHDJDEBDEJABIGBJB@ICMEFEDKBJFGMNOID@DEA@ADOKMOCBJFIECEENDHBBJGDJDBMABEABI@HJJ@EAEDHHJEB@H@AAFJH@@BFOJKOOKKGBJFDHEDCGJDJBHEBJ@@JB@EDBI@@@E@DJ@@@DDBBD@HJJBKJBDMEBH@@" "IADDEMIED@ABDEEDDEEED@BJBJJI@J@BHD@JH@HD@HDEBMNMGBDDIJMIHJEOJJMFJM@JJHJJBHHDBAB@A@BHDKGI@JHLJH@JEB@E@LJBDEEANIDEEIJKEEGNI@HHDKOEEFJLMEADKLEEABBIHE@BEBH@JIHJHDOFI@J@D@BDBA@HJBJHJJHEJKEJJOMBHLMJLIABGEKMJEA@HA@H@JHA@J@BHDJJJBJ@AEEEAAEEABD@AEDMMAADDH@@" "FDKI@BDJBMBDI@@AA@@@ABD@D@@@B@JDBIA@AEBHMABJLJBKENJKFEBDBJIDOEBMMBNJMC@@HACADJHJDEDAEJHDE@BB@EE@HDK@EA@HJH@B@BIIBEEDJJJMBE@EBEJJJIEEBDLJ@B@@JHHDE@FI@HEE@BB@EA@JMDAEABHJIDFD@H@FEJKJEMJEGIDJJABECFJKMFJBIJJDEHJED@DDJABHB@@@A@ABD@@@DD@@DIBEJBIB@DNIC@@@" "HIBFDHI@MJNIBEEDDDIEJDHJHJJEDJ@HHBBED@JA@BDAAIDDICFJHHIADHJIBJIBBIIECBNKJGEDABA@I@AKODEA@EDHE@@BAA@BHDECABJEEEBBEKEOOEGHDHB@I@OEGOMFMBBEEEBJDFEA@J@DDB@@E@IE@DEAGNL@DHDBDAEGBNKJFEDLJBDJJDJHIDDHHJKFDIADLDAB@DBHAEBB@HHBIEBJHJHIBMDIAAEEBDKJMHDHICBDHH@@" "EBDHIBBEBAANE@@AAAB@@AA@A@@HA@BABHDHBJ@DEEADDBJJBDDIABBIAEABINBDHBBDDEAJELNCNDJBBEKB@BHDE@A@HEEDJDEDBI@DDD@H@@DDGDBIBJIAAAEDDDDJJDJAGAA@@@HAAA@DJAEABIEE@HD@EA@J@BFMBBBICNCIMBLEAABB@IBCLJDEDDJBDDIABBJJAADEEA@BJ@I@JDB@D@H@D@DD@@BDDD@@ECLDBEBBDHIBE@@@" "JHICBEECNJGEMJMDDDDEEDBEDAEADEDJDBABH@JIH@FAAEE@HIEBJDHBBBJDBDMBBHLIEHFEJAANAK@LHJDDJDBA@EDCBHBA@I@ADBBBLHJAEE@HH@IFOOGJDB@BABOGOKDH@HHEEDBHIJBBAD@DHDB@JFAE@DBABIABHIHFLCLDBMC@MDIHJBEIBABJBB@IBJEDHHEEDDC@@LJH@JDBABIEADEDAEBAEEAAAAEJMMGBKNEEBFDHJH@@" "EEBDNH@DEDLIFF@AAA@H@@HH@J@B@HAA@@DDAE@BBJHJEADECB@E@IEEDHBIEE@FHJIBDBHJ@JN@NJOICDIA@JHJJHADBBHDBBBDBHDMAE@J@@BAAEBMEBL@JDGABHAJEEJEDDB@@BHEDEI@JABBBA@JBAD@JJHJHDDIFDOJKHCJHBHJABDJHK@EEDJ@IEEDHE@BFEADEBHJJB@EDAA@@DD@HB@BH@HH@@HDDD@CCDIIEA@@KIBEE@@@" "MHJIEEEAAEABAEMJDBEBJEABI@IDE@JDJBI@J@EHH@B@HJBHDDJHDE@@AAD@@HE@A@DJIDJAECMO@EBGJBBBE@B@@BJADHBIDHDHLBIBD@EADDDLB@FJOEAE@HHHHEDEGJK@BAIAADE@ABDJAHI@IDJ@IDBJ@@B@EBBBBOBE@GMNEDBIDJI@D@E@H@ADD@@EA@JIA@JBHHB@@HM@BHDJBIBHEADHDJDEBJEBABMMDBDEDDEEEDJHMH@@" "JB@B@@BJD@DONHCFID@@@HB@BE@@@B@A@DBB@JJCBIDJB@HAAA@BHHEEJBABJA@EBDH@BA@D@EG@I@DHDHHHHBDEED@JABHBAAIA@HBEEDHB@@ABMEAEJHD@EABDE@A@JMDEEJD@@B@IEEB@HDDLDB@JDBHAEEAB@HHHI@I@DHGE@A@DB@@IBE@DBJDBBME@HJ@DDD@HBBIDJFBJHBBA@D@B@@@EB@B@H@@ADKF@KOI@ABJ@@B@BBH@@" "IDIDIEEEAEA@DADEJ@IDJBDB@@BDED@DD@HDICEDDBA@HJBJDBDHAE@@ADJD@JEDEABJHDBIECMFBBIBJBBBBDHD@@J@JDBHDJBBEBHJHABH@HHIBBGOMCAE@BEB@EDFEOOBBDHHH@JD@JHJEBBBI@JABHBH@A@IBBBBBJDJBCENEDJA@JJDEAEBHABID@@ED@IBABJBHHDBAAEFDI@HAA@AEAB@@BABBIDHBMADA@DEDEEEDIDIDH@@" "FMBMB@@JJ@DEJJ@HBEBA@HADBE@HH@@A@D@HBJJBIDMEB@DHADADJ@EBDA@IFH@A@DD@BIDB@DJIDIDD@HHHHHBHJE@JAADBH@HHHDBBBJ@@H@BBLMEEEDD@BE@EB@AAEEEEIJB@@H@BJBBA@HHH@JADDBHEBHJ@HHHHHAADIDJI@BADJ@AA@D@@KDHDABE@BIDAD@I@BEEIDJBJJ@HA@D@@@HHEBAD@HDBEB@HBJMA@BJH@BEJEK@@@" "IBEBLJJI@EE@@BECNH@HB@D@HHE@B@E@@@@A@@ABJA@@EEEAGAJK@E@DIDB@@EEDEA@BHBADECNNJBAAE@BABBHA@HB@DDADADJBJHHID@BAAA@HAJMMFKAEDHE@IEDFKEMJL@HDDDB@ADHHJJBIDADAA@B@HD@JBDB@EDDBBKKNEADB@J@DEAEE@@BADI@E@FJLGDEEE@@DBJD@@D@@@@E@B@E@HHA@B@H@KNEB@@EE@DJJIJEBDH@@" "BEJEI@@BBHLEBJLBAFJBHHIDBB@AD@HADHEDBEDD@JBJH@@B@DDDDHEADADJI@@A@DEDADD@HFKK@HJD@ADDD@@JEADJI@J@JA@H@AEBAEDB@@BBJAEFMED@AE@ED@AEEKEDBJB@@BAEDBED@@HDBHBHDJIDEBH@AAAD@ABHHFNK@HAADAEA@D@@DJIDADE@IAAA@B@@@JJBHAAEBAE@ID@HAD@BBADHHJBKDBAJJEAHJB@@DMBMB@@@" "FHDHBAAEDAA@D@CDJIDHB@@@HHJJAE@BABHA@HA@J@D@BJJDEA@JIA@FADA@BMBDFHH@J@IEA@NEMJ@HEB@IAEB@HBA@BEAE@JBAEB@ED@@DBBHHIFOIEFOED@B@AEGKEDOKDHHJBA@@AE@BEDBBHEDEB@DB@HBEDDHBE@HBMMCHDEDHBH@HKABEJ@DADC@DDJHDEABJJ@A@BHD@HD@JDB@EDBJHHH@@B@IDJIF@A@DDAEDDB@I@K@@@" "HJBBHJNEJJBBIEDA@BIADBHJ@B@@D@@@D@ADABJE@JIDH@@HHFIADBE@DBJED@DHHAAE@JB@BEHIEFJA@DJ@D@DJBDJJHHD@E@EB@DJH@JHADHBKNIEFMMADABEBDADEMKEDKNJ@ID@JH@JI@BE@E@A@HJJIBBI@A@BI@DBKEDHMB@BBHEDD@HI@AEBJA@EBADDK@HH@@IDJHEBJDAD@A@@@A@@B@BHJADDJ@DAEDJBBJMCJHJBBHH@@" "GHFHKFA@EHDDO@@JNHBJADA@I@EDI@ADH@BABAA@B@BAEEJABHBD@DHDHH@@@I@CEBB@E@HDHJOJKE@BBH@E@I@@HH@@BBHJHBHEEA@AE@AD@AEEBJOOABNODDHIAGKJDGOJJEED@AD@ED@DEE@J@JHJB@@@HH@DHE@@JB@EFJOJHI@HE@BBEF@DH@@@HI@I@AB@JDBMEDB@B@DDBDB@@ID@DIE@DHDADBJ@KJH@GIA@M@DCFHK@O@@@" "HFHBDAEEBBIA@ME@ABDHD@HB@B@AD@D@@DHDDDDEDKDJ@@@JHEDIEJBHAADJIB@H@DDE@EBIBAHKNJJDDADHEBBIBAEEDHA@ADBH@DEB@BHADBDJMFJMEEFJBIBDJBKEEEJKEJIBAD@J@BEA@@JAD@D@IEEDBDJBE@IDAABJKNHLBDJE@EAA@@HBDJIDD@JBMDIE@JH@@BIFIEAAAA@I@@A@AD@B@B@HA@IBD@EEHDDJBEEDAB@K@H@@" "GKFLKJMDDHFDE@@EDLIAMEADADEDAAA@IABI@IA@ADB@IEE@BHEB@@HABBA@BHEBJHHHE@@B@KELAE@HJIAA@@HADD@@ABJJJAD@II@DJDA@@MAEEKNJBJIOMAEDEOLJJBKNMEDEH@DABI@DLHADBJJJD@@AAD@H@DDDJHHEDAMFHB@@E@HHJJE@J@DBBD@H@BE@J@EEDHBAD@DDHDJDDHDDDAEADADEELDIIE@@EAC@IAEJNIKFO@@@" "MEICDEBKKEIJHEE@@A@BJHB@JA@ADB@A@@@BE@EEDBHJB@@BHBH@FIEBDHJAEAAD@EBJHBBHJ@JKG@BA@BBBBJBJ@IFJDD@@@JAEJBDI@JJBJJOEJEGDIFOKDD@AAFOKDIGEBMGJJJBJHDIBBMDBH@@AABKDHBJBJBBB@DB@GFJHBHJB@JJE@ADDEDBHIBEDK@@J@J@@BBHJAEE@EB@@@D@BAD@DBHB@JJ@D@@EE@JLMFNJEAFDMEH@@" "ENONKCEDLJDEBHEBJHBHEBHJ@DEDA@JDABJHHBH@@HB@DEED@HBJHB@DAB@B@BDAE@D@ADDB@JKNMEDJBHDDD@H@I@@@IABJJ@D@@HABB@@D@NJJBLJBADJOIAEDDOJIDBBIJBJKHA@@BBD@H@A@BJJDDH@@DH@HAAA@JBIEEKNJHBAAD@A@EDAB@B@BDA@B@JJ@HAEEA@B@H@@J@HJJDABHDAEA@BHJE@J@JJE@JEABIIEFFKOKM@@@" "OMFKMNIKCEKFHAADABDC@GB@BH@ADB@@D@@B@D@JIBHJHH@AEAD@BHJID@DDDHAD@E@ID@HHBLDFKJ@@DBI@JJ@HBBEDBBD@@JHIFBDDJEEAEMEEIKFHDKKNHD@A@KNNI@KFLMEEMDEEBIABCDHJH@ABBAEBB@HBJHDJA@@BNKAAJ@HHADHE@AD@IAA@ADJHJ@ADED@@HJHJDJHA@B@@A@@BAD@@J@BG@FABDADD@KFMFFLKMNKEOH@@" "GKMJKKOFLJLHEBBIBLHEE@MDHAEDA@@HHJJHE@E@BDB@BBEDABAEHB@BADHHIBHAE@EB@EAAEKHGEBKDHH@B@@BAHDHADDAEB@ABHHHJ@H@D@BNBBBMOABMIAAEDDDMJDGMJBBCJ@A@@HBHHHJD@BEDAAD@I@LB@@B@@HIFJEG@NMDDE@BE@ED@JDHHIDB@B@MDBDAEBB@BAB@E@E@JJHHH@DAED@IEHEE@IJDJBE@IJIKGNNJMNO@@@" "NEGOOFKOKMGGKEFBDCBJDEAABJ@ADBJAA@@BHBHDHIEDDHHADED@BHJHDAABBHCD@E@DJHBBCOGHNEMAEBBHDIEBBHBHBHD@EDJFEEA@JBI@HE@MLIKJDMGFBD@ABCGEIBNLIMHE@HDJBHDEECBIE@A@J@J@JBEDI@JBEDEMCHOGNBB@JI@E@AF@JBDDA@JHJ@AEAD@HIAEDHI@J@J@@DDBJAD@BJDDEABJFABCEFOGENONKGOOECH@@" "EKECFMNJGFMLMIALHHL@I@BFH@EDA@@DBDIDADBABB@AAB@JA@@JHE@@IDB@HBHBEDFI@EDDFINOJJJJ@DD@IB@DH@HBHA@E@A@HH@DJ@HBBBHECEBBFIGLHEAEDE@IODKBBEFE@JBB@HBI@@HHD@E@D@J@H@I@BDHAA@BJJJOKLKAAE@DKAEB@J@HBADH@E@JH@DBHBDD@BBDBADADIBA@@DAE@@KB@DHAHHILDMIMKGBKMKFEFM@@@" "KEFJIJEIMKKOOGEEEBAEAEEAGDH@JABHHABADA@DADEBDHE@JBI@EDEAB@HJBHBHH@HNE@@HIGDMF@ADI@HI@@E@BIIDBJBHADEFEE@HJBHDHE@BJELK@NE@HD@A@HECHFIMBJ@E@I@JBHHEECEAD@JBJADLJ@E@@DHHDID@CEIGDHH@ECHH@HJ@JBHHBDEAE@DJBHE@IBEADA@DADBD@HJDBH@IGDEEDEDBEEEGGONNMLMBLJKEFH@@" "DBIADHIFEFNKMNKFJHD@AD@JHIBJ@DDAAD@DADBIF@HDI@HE@DBE@IBBEEB@LBHEBIBEBEEABMJF@JHFBBABBJH@HBB@D@EBJAA@J@AE@HBH@JDJ@HCNBI@EAAEDDE@DJCN@HBIBH@J@HED@BHDDBJE@A@BB@H@JJBDBBC@JHCBMJDEEBEBDJE@JAHBEEBBDHEBA@E@HDI@HCDJADA@ADDAA@BJDHJHAD@A@JKFKMNKKECDHIDDJA@@@" "NLDFICEEECENKMNA@JHJJ@MBBNH@JIA@B@JIFADAAEAABEA@JID@EBDDH@DE@HA@@BECDH@B@BMLM@ALHHJ@D@CBA@HJIA@@@JFEAEDHGBHACEH@DALAMFM@DEEEA@EKELALA@@MFD@JG@IEDECBH@@DDJHHDBF@A@BHHIL@EIMJ@B@@IFEB@@D@HEA@@IABE@ADJHDEBDDEDDADCDJHB@DDJH@KJBEHBJHJHDCMNKMFEEEFDKAAKH@@" "@BI@BDBBBJIENKEEOABADEBAHIJB@@DBHE@C@J@JJ@BBDHBB@B@JHHIAEFI@EBJBJI@E@AEDBHKG@EBBBB@DIBHDJBB@@BJJJ@HHD@AEEFABBKDJIBCGFM@BA@@@DB@EKGFBDJIFJBDCEED@A@HHBJJJ@@BBBI@JDI@BBBBE@GFHJAED@E@DJJBJE@DKEDDHHJHB@BB@IBB@BJHBHF@E@JA@@BBLHLBEADBDGMEFKMDJJBBAB@DJ@@@@" "JHBDDJNMEEJKEMOGEDHDJHEBBBGLJB@DBHBHD@E@@EDEAADDHLE@BABD@@BEDD@D@BA@MB@@DADNJHDLD@DI@DB@@DDEED@@@JABKDHHAKJ@EDI@BFLOMBLDJEEEBIAJEOIKB@DIE@BNL@HIFJDBH@@AEEAA@@BA@DI@AAI@JKIDA@@BEHDB@A@AAEB@@ABDB@EAHIADDEAE@@E@A@J@JA@BBIOBBBE@JI@IEGGMMFJMEEKJIAB@JH@@" "BBHHJIABJJDJJFMEONJEAE@EDBHE@DJI@A@A@JHEDH@HDB@IABHBDJDAEE@@AAEADLJEJEDJHJBNOAAI@JIJE@HEDHJJ@ADJJ@EDHABDEB@BHA@BJIA@JK@H@@@@@@HFJHDDJJ@D@J@BEABD@IE@BJID@BJHIE@HEBLJHDLDGKJBHJIEBMBIIDEDD@@EEDABIB@JDDHBA@H@IE@JHD@D@DJI@E@JAE@EDEBKOMEKBJIBJJDDJHHJB@@@" "DHBAABDDBEKGBLOOEMDIEDBHMEEODH@@EBBJA@E@ABBBIDE@BHBDI@@J@@EEDD@BAB@HE@A@BADMFJFJE@FFHBB@AADHIDA@@JHABJ@HIDID@DBDMDDEKFMBIHHHLJEKFMAAEIBA@ADIDHHBJD@JH@DADHIDD@BB@KC@EBKBKEIDB@D@E@HBDB@AAEE@@BH@DIB@J@EADJBBD@E@DBJBE@@@IGMEEHJAEDIEMGOIJGFMBAABDDB@I@@@" "IADJDDI@H@@@IADJOCKJJEDBBJJHJ@JI@@DHJBHEDDHHD@HEEBHHDDJ@JJ@@@JJHHIBABBJGDEEFLMA@@BLIADDJDBJBCADDJ@BDD@EABABBJHHAJI@AEMNDFCBFCACMMD@DJL@HJJBDBDE@AAB@BIADFBBJABIADDIJ@@DEIKEEAGBJBDBDHHJJH@@BJHBIA@HJEE@HA@HIAE@JBHI@@DJHBHJJJBAEBJNNGJIDDH@@@HDIABIDDH@@" "JBB@BI@EAGFNDMEEDNNIBHJHIDBJMI@BBE@B@HBHAIBAAEBH@@BAAA@E@@EEE@@BBBDDGDAMMOBOMJNJJEIEJ@I@ID@LHD@I@JHHJJHJ@H@H@BBOEFEDNKFIADEADDKFKIECEGJB@@H@HBHJJHHJHDHA@IHADHDHBMDMBJKJMOJGMMLAGAABBB@@EEE@@E@DDDB@@@JEDDBDL@J@HB@EBB@DMJJADHJHJDKKIEEEICKGDE@DJ@BBBH@@" "@DDID@A@B@IIJADHJKDOKEBEFEDHBBADDHBHBBHBJBDJJ@DABE@BDDE@DJH@@BE@HJHHLAEB@EMICABH@EFKDJDDAAEAAAE@E@BA@@A@CBJAE@IDOMH@KNNDDEHMAACKNH@MOIDHEDBJF@D@@DB@E@EDDDEDDAABIFKE@@JDFDMM@BEDAHHJHHEB@@@JI@EAAB@EBDA@BJIBBJ@JB@J@IADBB@IECEBEFOIFJHIDBLLHB@D@ADIA@@@@" "FIBB@HJEDEGGENIB@FOEDJEBIJAEHLJ@HADADDA@ADH@@JIDDHEDIA@AA@BJJHHFB@BBJDAMOKGFNOECJ@EFH@I@JDDDBJ@A@EDJBJJJDD@J@DGIEHDKMKNIA@B@DDKNMNI@MDOA@BHAABJJJBIE@D@BJAAABHDH@KE@BNEGKKGFOMLABJB@BC@HJJJ@DD@DDIE@IADJH@@ID@DAADAD@HBIHMDBLJEBIEGK@BDKMGGEAEBHHBBDK@@@" "@AD@EA@H@H@HHAFLM@EKJDJEE@D@FA@JBJ@JA@JEEA@JE@@AABHABDHJDBH@@BA@HEDHDIEBJDHDIJIFMDDIAA@DA@IJD@DJCHA@D@@@I@JAE@JFKFIDKNNBBEEEBBCKNIDKFKBHEDBHDH@@A@D@NBI@ABLHDA@DDDIAEKDJLI@IBJEDI@IE@HDB@@@JABHIBD@JDD@@EBHDEEBHDBHBJBHDC@A@EEBIBNM@EIKD@HH@H@HDE@AD@@@@" "EB@JHBBBJ@JBBD@A@DHGEKDJJLKDIEE@H@I@DE@H@BI@HEBJDDBDAAA@HDBJJHDDBHABMB@EDGFOJNJHK@IBJBEADED@HJI@DEDDIBHJBE@D@ABMFMOOGKKLDH@@IANNOGOMKEJD@A@EBBHJDIAEA@DJHHAEADEBBJDHFHJKJOKGAE@BEJD@JAA@JJJA@HDDDABAABJE@HDJ@@HEA@DH@HEEDIFIJJIFMG@I@D@ABBBHBJBB@JHBE@@@" "BDI@ADDH@I@DLKKJEABHKGGEEA@MBHBDBJ@BI@BAEDBBA@D@IADHLDBABJH@@BAA@BKDBHDH@INJFJJGBE@DJE@DA@ADAB@BIDIADBC@HHBHJEDJMKEEMBN@IBEBDHCJEMEFMJIEBHJ@HHFBADDIDJ@BDAD@DA@EBI@EBGBJKBKLH@I@JAFJ@DDB@@@JJDBAAHIDDHA@DBBAEDB@DJ@BJAB@JEHDEEGGFHJDEBNNII@DH@IAD@DIB@@@" "DIBBJ@HBJBBIB@DEJF@BDJMEEJKDEAEI@@FD@BEG@ADDBEABBBIEAADJD@AEBHJJE@IHJJKBICDMEOEMEDBJNHJHJBJABDEDBBJFBDHEBBDCAKEJCFJOGE@MBDHIBEHEGGJKFBMFLFABBE@IBCBJBAEABDBJBHJHKJJAEEMGMEIFDJFJJHLHEBJHJED@ABIDDEDJBBDEBAAD@GEB@AC@@DMDEAFJMEEJIB@CBMA@BDJBBJ@HBJBDI@@@" "IDHD@EBH@HDDDFJHA@DHJFKOBF@A@BAFEDHJIDD@JJI@DHDDHLB@DDABHIB@DB@@@EBE@DEDBDEAJAAA@EEGEA@E@DABDI@@HDHMDJBHDHIDEFJLDEGALBE@DIEDI@EBALGEAAJKEADHI@JBIEHI@H@DIBDA@E@DEGEE@DDDBLEABAEA@EBE@@@BA@BDHJDAA@BAHIA@I@DJJHAADJHIECDB@D@CBGNKBHI@D@JKAAA@H@JE@A@IDH@@" "CADJJH@BJBA@JH@BNMAB@HOFMIFDEDJE@AB@BJHJH@JIIBIABBHJBIJDCBDJIDEEE@BNJCEIDJJJEJDLEBADNBC@EIDEADBEAEEABADAABBAABMEMFJNJI@EAJ@BLE@DJKJKEMEJDDBBDDADBDEEDEBADEADM@FBCIDBEAIBMBJJIDMFBKJ@EEEADJIBFABLJBHJBDDJDLJH@JHJJ@BD@EBIEACDMKGHHBDEKJ@@JHDBBJ@@JJIDF@@@" "HDA@@AFH@HJE@BDHABJDJBBMKEIMBA@IMDEED@ABAEDBBDBDDHAADB@IHDA@BBH@@BDAFMML@MFEB@II@DFI@IDE@B@HBBDHB@@JDDABD@HJDEIFJLEJIDBHB@E@B@JADJMAJKDMABHHABDAABH@B@IBB@HB@EADHDKA@DLHBECEHAMMKDAB@@@JB@DA@LHBADD@IABABBAEDBD@AEEAELHDBELMFMJBBIBJD@IB@EBHH@KD@@DA@H@@" "EAFDJJ@BJB@HBHIADD@B@HMGJOBHMDEBCAHDAJJDJHIEDHHIEBJDADJJBIJDHHJJJHHJKFK@IJMJMJKDDILBEBJHEDKBDHHDIEKDJIBDJKADIKDHABJEDADBDJHJIBADAEBJD@IFLIDFJIBDJIFMDI@HIBFIE@JJEBALIAFJMJMJLHFKFJHHJJJHHIBLJBJIDABJEDHHIEDHJIBJLA@LFBEAEHJGJOEHHB@AADDHJ@HBBJ@BJICDE@@@" "JM@ID@ED@HJBDBBDAAELJB@KCJMGAAAFHJBIBA@KBCJHICFB@E@IBAJAEDAAJB@A@BEABHMEBGGEBJJKABIDIGBE@A@DIEAABB@A@DDI@DBKGBCEDD@HABADI@B@DIDBD@HAAEFBGFJA@DIA@D@BBDDEDI@D@EBGDIDJDFJJJEGGBEEHJDEB@D@BBLDAEDBLBDHE@BCFDHJNBFHDBDJBHKDDDGEJNFHBBIMDDABBABBHHAE@ADHEJH@@" "BBEDADHAFA@IADHIDD@AEDIDNOJJLLJ@CJHBEJEDDLACBD@HEDEBDJ@MBAFD@LMD@HHDEOCIDJJJEBMDNIBABIHHLJJJBBBDDHJJKBIEGKODIMDHAAEADDJIBJEBJDJIADEDD@IELIGNOEDJFJJHIABBBBJJIHHLJDBDKIEJEBJJIDNGMA@HHAEIHACDBEHBIBEAE@HABFDAIAEBMB@JN@BIIJJOKIDIED@AADHIDDHDCD@IDAEBB@@@" "MMJKMACD@JIBBAB@AAED@EFACMKEIB@LHGBHHBHBIAMDFJMBHCBIAAEBDM@IJGJJOKE@IDOJABJHHEBJAEDJJGFBA@IDDHDIAC@JDEBFJF@KB@AADD@JAAEJDDHIABMDDBHAADD@BFHCBKBEABHFDDI@IADHDBCGBJIEDBJE@HJJDBOIDHEFOJJOBLHEIBEDDDJF@JEJKAELDJ@J@HJG@IHBDMFMNDCE@AEDD@BDBBDJHAFDENJMMH@@" "JJEDBFDAEBCEDJDKED@ADJLHEKENBLIABMDKADBIBJ@JHIBJCLDJFFDHI@EB@MFKDJDIBCEGLEOGJJIEJJA@DK@HJEB@JBIBBDEABJDMEHJDDJJBA@E@NF@@IIBDLH@CCHE@DBBJIABHMEIBJDEABBDJBHBEBHHFI@DBJMDJJOGMAOEFBDIBIFKEHBE@DHICCBIANBJDHJHBJDJADFIEJDDIJCMFM@IJID@AEFIBIEFBEDACBAEBJH@@" "KEJKJHJJBDLEADI@D@BJ@NIBJFGMNBBDDAE@GAEFDEKEEFHADBIBHHMCBJHDI@HJKEKBBLOBKMGOELCBFEKCOFJE@HHJ@HJHDE@JDJKJJEBIA@@DDADD@HEJBBEBBBM@HAADAA@@DDJEBJNJIBHEA@JHHBHHHEBKGNFMCBFAMGOENJGIJBFMFJHHDI@JJFEHHJDJAD@KEEFMACEDG@EDAABBCMOCBJDKHBJ@A@DIDEAIBBJHJNJMFH@@" "FJEEEGD@HIAABBBE@ID@IIGD@IMBALHI@JJE@EBAA@@DAABD@JBIECADDHCIBEBEFOLMDJJDDENMOKLEIJJFNEDHEEC@JB@JHHJBIDJBDJDJDADHIB@IJDLAEDHIEDAIBLHBDHIDABIBIBBIDJBHHJHBBHFEE@IECKBJLMANOMKMAABJIEIOKEBEBDN@IADFEDJBHABDDA@@DDBE@EBJHDHILBELHAGDLHADHEBBBDDDHHAGEEEBK@@@" "KEEEBHBECBFFEHHHEB@JBFDKMBEGOABFE@JHBJDJJEEIJJDJIEEB@DFBEBDBHIDHEMJFJJENOOEKEBCDBDKKLEABJBDDADM@EB@HCCJMAAB@IBABB@IBAA@J@JBBHBHDDBDHBBDBDHBDDEJNF@HBE@EIDAABBJDEANNIBAFBEFMGOKMBJKBMM@IDHJABEBCA@BEEDJIBJLMEBJIBJ@JHECBDGOEBENICBBHBE@HHMCCBFEB@JEEEFH@@" "NFNJMKDHDDHHHEBEHDI@HHI@BEKJFNHJHEEIFAEDDJHDDEIAAEBDKIHJHHIBBBBBKKMMLBJCIENFMMNKDKDMBHJE@HIADA@E@EECFNE@JLDMDDD@HBBDJJEAFDMICDEBJIBB@HAAAEIAJHECKFEE@E@DADDHHEBHJEIFIFKMMKCMDNBJAMMNNJBBBBDHHJHLNIBEDDDMAA@JIAEDCDME@JHKKBNMB@DHHHDI@MBE@HHIA@IFMJKKCH@@" "KMEECDKCAABEC@DHABBBBBDOMHAEMJEJBIBJ@LHAJIAEADDDB@DI@BEDCABEDDHDJJJKJIDKNJGAMKODIDMBMB@HBBBD@JD@BDDDM@HEEAEAA@HJBDHI@DHFAIBDLC@I@DHIBBHHDDEDEE@HEIAAB@ABHABBB@HBEJEIDIGNMLGBKNIDJNJJJI@IAEBDFAEB@DI@BAAADEDDJL@IHBJDJBMBMMD@MOIBBBBBD@I@FEBDDFFIFEEENH@@" "NJHADIFLNNDIDEIABDHDHIA@JECJKEKELBEIBACJBBBJEAAADOIBFIA@HFDH@JBI@AEODBJBKHHFIFJOJCKJJDKBLDDIABHMDIABJEEJJFDJDAA@HHBBEABHDBEBA@JDEBB@HHDDABICBJMEBJDDIEHJDDIAAJFIBJNNBOJKDK@HNJBJAGMD@DJBH@IC@HDDKBDOIDDDEBJBBBNDBDMBAMFMFJNEBHDDHI@IBDDMADICKIKDID@JKH@@" "AOGOEA@CAAABBJBJEABJBBJKDHDE@OJJ@HJFDJDBHIDHJJJJA@BDHBJEBHIEDHJBJMFEMMMENCEACKOEEDMEKI@DA@IBFDA@ABDGDIBAEHJDIBBBB@HHHFDDKDJIFIAC@HHHBBBBDIBHMDBDIGABD@DACBDHDA@DNMEIEEGNNDEFCMEMMMCEJJBHIEDHJEBJ@IB@DBJJJHIDHJABICBHHBJOHEA@IFJJBBJDEBJBJBDDDF@DEGOGL@@@" "JEJJKOGLFNMEDHH@HBD@DK@BKKIBIEFKGEFIJHIEEBEBDDB@MEDIEDEBJEDHEEEFKFHJKBDALMBLHEJNOJBBFLEBJCBE@JJDJJMKEBDJNEDIDDDDHEAAA@IA@EEE@DDHDDDE@IAAADIECJIBEFMJJIBJHEBFBJEAKBBBOKJM@IJEILABFJHKFKEEE@IEBJEAEDIEEHBAABEBEEDHJLKEGFKEDJDNNJ@FI@AB@H@HIEEKKAOGNJJMBH@@" "GMEADDJCMIEDICBJBDIDHHDI@JGDBJMJH@IBIBCBIE@HIIEE@JJKABJDDJABHHIEFHBDNDIBKBMABJOHBNMDIADJ@DDHE@@IJJJDDEIEMBAFA@HHA@BJBEBDBJJJJABEBBJ@D@HHDCDBEMDMAABJJLH@E@IA@BIDDIEKJ@OJJDEJFJDICIB@KEDHHJDBIABJDFJJHEEDLHHEDJFBDJDH@JMJJAGBHDI@HIDIBBJFDIEDMNBIADEEO@@@" "HBKFBIDLBFJKFDDHLIBABBIAGDHJDAFJJJFJNDLJBBEBJBDHJIA@FDJJIHLHJGFIAMNIDMBEDMANIEMDKEJJBIA@JJIBDIECECECBHBIFDJHJEABJEDIDJDIDJEBIDIBIDIEBJDEBHJICDJ@JFEFEFEDIBDJJHDDJBJMFIEMDKLEIEBEIDKMLDKGBHIHLJJIC@DDJHIBBJEBBBIICJKBJJKDABHIGDDJBDBDIHIACFJKBAIDJCFJ@H@@" "GOMIMDAADIED@JJAABHB@HJNHJE@JJJLHEHHKAAADHIDIDIBADFE@IBBDBAA@MJBEKBJI@DHIFKFNEEIDIGEFBEFDECDJBHF@DHDDJIBLIBE@HB@@@ABAAABEDJIEBDDDBD@@@B@HEBDIJDJIA@I@C@JBIFEACEBCEGDIDMECKFKDHI@DJJFMBBMHDDBABBDHECADBDIDIDHIDDDFHHM@IJJJHEBHKJHHB@JDDBJHAEDIDDAELMOO@@@" "MDBGFKNJBDBBNHDNBDBDEEAACDHI@@KKFJFEFJJJEGBADAEDNJIAEDEDJHJJIBDDIFMJODKCBINMKMNBKBHEELI@ILDADJEJJIBJIADFIBDJJBDFJJJIBDJDHJEBHIBIBDJJJKABBJIBDKADDJJDJJMBIDAALHDIME@JFJCMNMKLJFFIGJMKDIABDJJHJIEAEDDJKIEDADBGEBJJKECBKFNH@DHIFDDEEABABCI@KJBABBKNKGBAEH@@" "EKMHIE@MLKDH@BI@HIDID@JDDICBEBIFMFJIII@BI@DJABJA@IDJDIDE@KABBIBKBEEEKIHMLFCJNKIMDEGJKIBEEEIDAEMFBBJBBDDIBFED@HJH@@ADDJAEBDMIBEDBIAD@@@JHHAECBDIABBBJBCEMDADMEEBDNJOEAELNKJNCAMHLNMEEBFJDJBDFHEADIBIDHDBJDBI@DJ@DLLJKEKDJEBFDIABHADIDHHDJ@@IFIMHEDHMNM@@@" "OECGFNOFCHIBMLDICBAB@J@IABDMHELK@IFBFNEMFFIEBFDJECC@IBA@EHFDMBHBMOKEGGCJOKOEEOGFKI@BOFEBJHBENMBHJJHHDIIFDHLIIB@BJJDBIDJDDI@DIABIDJABJJ@BDLIHICDLI@HJJHJEKMB@JJECGJ@DNKGGMEGNOJNGGEFOMJ@JEIC@M@DBDHFFEBICBEDKCEMCKBCDHFIM@MIBDDHBHBDBFDIAMJDHNCGKKGFEGH@@" "NKNLIAEALBBEBAJBHDJEEDJBJDIBEKEJOJIDMDJBIIEDFHIDIDDEBHJJJBHI@DGOJOFNJLNOMNODKEBMFNMEBHHOECDEEEDBDDBCIDBEEEAFB@HH@@EDBIDJIFECDJIDJAE@@@HHBCDEEEBADNBAABAEEEAFEGHHJEEKKEJEFIGKMOKIJKKGJOOA@DHJBJJHJEAADIDHKAEDLJBIEIDJOJMFMBDIBJBIEEBI@JBLBEBBALEDDIKNKH@@" "MNEKGNFNABJHIDADBIDH@AAL@IBJJ@JEJMFIBKHJFBBHHEDABAIBECB@HJBDJJLNOJKIOKIMGEMMHOMFMKEFJECDJHIOBJAEAADLBAHMDJJHHJCEBDHHDDI@BM@EJ@DIA@HIBEFBHHJJIEHLBAIDDEDBJGLHJIFEBKEFMKEOHMMMGELNOLNJOKIJJIBBHHBFEBDLBDAE@HJBCBHNJDKEJMBHBJJDHALD@@IDJADADHJJDCKCOFMCMH@@" "KFJJMEMEONDBFIEADJABIDDAEBIEHMDIGEIEEJKFJIMCEBKJILBDJDDKBEEJDHIAJOLFBBGCENOKCEJIFJMEDLFKDGFBDDJHDJEAEFCBEDABB@H@DIJEIBBFMBGBEKBBDMBLI@@HBBDAEBFCEDEBI@JIABCGAFKAIEEJKDJMFFOKMFGBBCAOJLDHIBMEBFIABIBALJNJEFELJKFJMEDMGDIEHMDJEDAADJDBIDEDKBACOMEMEJJKFH@@" "EMEEBBBEBAIFHBBFEDJDBBJJ@DBBCBEBJOFIEELJJKADJEHDBAHIDIADEHIEIBFEGJJIEMMNFMJNDOEGMKBJMIJLKJMOJIBBI@DJHHHMHIJDHJBDIBA@BDLI@LHIHDIIB@DBDIBBHIBLHMHHHJI@DJBDJOMJNIJLMJJFMOEGICJMKCMMMDJJOECBDMDHMADDIDHLBA@MBIDFJJIMEDKGJJEBFBBA@BJJBABIECBB@KDLBEBBBEEEM@@@" "KGOJMONLMNBIEMDHHIDHHHDIFJHLLDHDCMMJJKGEE@NKDJGKDJEBIBFIABJJBDHIDEIBEGBLMMGEJMIABEMEKGGOEEBEDDIEBJJBBBBBEB@IBADIBDIEDIBBEBGBEBBDIEDIBDIDBDHBEBBBBBBJJEDIAEBEEGOGFMEMBDDMJMGEMIJGEBDMADHIBBJJDDKBDJEBIFOBIFKHEEGFJJMMNA@IAIHJKDI@HHIDHHIEMDJCMIKOMJOOFH@@" "NMNOKDEGKEOFJ@IBBBAEBFIB@ICACEJIJKEFFLNJJKADIEJDIBJFFLHJFDIEDIBDIJDEJHGIJKKGEKJJOMBJLMKDJJIEIBD@DBDMDLMMJJKBDDABDIBAADIEBMEEJEDIDDBDIBDAABFJJMMIIEIBA@ABDMDJJIFMIJJEOJJNMGFNJLO@JMABLIBDIEDICBHIKCBJDIBMDIDFJJKIKCEFJLJMFDFDHBDKBEDBBBDHBKGMFOEAFOKMKH@@" "IGOIFOEHFMDMDJBFLME@E@DIEDDDLJEDAGNHKKFJEDEEBJEKBDDHLAEAHIBJIBDIBEJEEEJOFODJJGEE@CLMKKBMDIBBEDIJIDIBEADBE@DE@IBDIBHJFADDDBJJAAADCBHJDIBDHEA@EBADEBDIDJLIEBBDIEJFNMIN@EEGBJIGKGJMEEBMBDIBDJJDHLEDAHIABFMBJEEAEBKFNHKODAEBIIAAEDI@E@EEIKBBIEIEK@MGKDOODH@@" "GMMGMHNGEDMJIDLHA@BDHFIDDJJJAEJJJKDNEEEMBJJJEEFDDHJBJNDNEEDEFHIJIMEMGKGOMEIJJNJJMHKGEDKDIBDLICBEEBDLJJIJJE@HIBDMBDCA@JBIIMEELLJBHDFABEIBDHHEBJLJJIIBEEBFDIIBDIFIEGFHMJJKJJLMEOOFOEMELJLHKEAEECICJJBHIACEEBJJJEMEECIFJJJMDBJJIADK@IB@D@IIDJMIEGCHMOEMO@@@" "EFOMJGEJNKJMDIABJJLIBHJAAABEJMBHHEOEGJOJMBJJJBHIECHIA@I@JJJJMCBEBCDBHDMAFKFEEEEBJEBLJI@IBDIBDHEDBIAADEFEDJKJBDM@DIDDJDHJBBJJBBHIBIADI@EIBBNJIECEADDDJAE@IBDIBDHDJIJEBJEEEECFKDEI@JAFBEBFEJJJJHDHDDHNEDHJBJJJEJOJOEGM@HJEJMBDDDBHJDIJJJDDIEJNKJMGBMOKE@@@" "JIMKDMJMEECKJJDDIBABDJ@JFFDJEBMGJJMNEMMOEMFJHJEEADEBJEJEDIDJIDDJEFIDEAEOIFIJJKENEJICABGBDIBDKBLIJJFNJJJJKEDEDJ@DIBJJDIEAIJHJLLEDIBJJDI@BIEAEFJJJJKKBJLIJFIBDIBGBDFDJMCMFJJLKDOMDEADKEBIADJIDIEBMBJEADEEBHJKEMGMMMCMJJOEJEBICCBHBIBDBDIABJNNEEEJMIFMLJH@@" "JOGOKJEEFJNFBDJIDDJDIAEBHHIKJE@IDIODOKKFKBJMBJJJDBJEED@HIBAEFEE@HIBIBFKBBDJIBJBAJEDFLDHDIBDI@ECBEDIABJMEDJJHBIEIBD@@IB@DBEEEBA@BDH@ABDMDJ@JJIEEJJDDIEBFE@DIBDI@IAKAEBLBBJDJIBBFKBDJDHHEECEDBDHHAEEBJABJJJEJJFKFNOIGLIDHEBNLHHJEDDIBIADJIBCCJKEEBNOOGJH@@" "EIMMEKOMMIALHI@CBIDIBLDDEBBFBIGNJBEOKFNODMFJEDEEIDHJJBJBBDNMIDHEBBHBDHBMEEGFMEEJJHJHJIFJEDIFJMDDHIBEFEBJKJEEEBDBDIDJJDJMEBBBEEJIBJIDIBABEEEBNJJECEBDHIAEJKDIEBKDJHJHJJMEEKGEEEJ@IB@JBE@IDMKIBBBJBJHIDMEAEBKEIGKKFOMBBKODJCBBEAAAJDIDJF@DHILDMMONMEMLM@@@" "JGGKOFJKBNOCJDJHDJBDJAHIBEEGMBBIEDKJFLMFKBIEJJJFCBKDHMEDHIACFKBJEJCDJEBJHJHIEBJFJBEGEBA@HBK@BBEBCBFJ@JMEBIJJHDIDIBABBIBABLMIJDBDJBDBDIDI@JJLJEEJHBKBFBEBB@FJ@HDBEGEBBKBJEDHJHJJEBIFBMBJFKFDDHIEEHIFJFCBJJMDJFKEIKBNIEDJBEOEEBDHLBIBBI@JIBNGKJFJKGNOGBH@@" "HIINKMOMOEDNGJHJIAIABJCCDJDDBDMEFMFOMMJKFIEEEEEDLEDIEBBAJJDLILEDLFLAABFBEEEEEFEIELHHIDJEBI@EDLHIDDHHOBBJMBFBBIBBBDJHLJDJEE@EEBIBIHJIBBBDJBCBEJJBGHHIADHIIE@DJEBIDHHIMDMCEEEEEBCBDDAKAIEALIIBJLBBEDIEAIEEEEEDKFJMMOKEKEEIBAABIFFBJDDLDJHJOCIEGMOMNKLLHH@@" "EECENEBBJMKKLEC@JDBDDDHDBHJIEBAE@IENGJEELFJJJJJIABIBJDJJ@HJABBJAAEADDDHNJJJJMDJEFCCCBEDHDJFJBABDIIGE@FLEAEHMDDDIEE@EB@IDJJJJJIDHBE@EEDIAAEHMDEAK@EGDLIBDBBKBI@IEBFFFCEBIEJJJJKHIAADEDDBJBDBHHBJIBJDJDDJJJJJKAMEBOCMDHEDBEDJHJA@IAABABHFEANNMJJBECMFEE@@@" "DBLOKKOOKJMFKJDE@IDJIAFIECABJDNJOJJONKJKIIEBKFEEFJBMDIDEEFHJDHHJDHJAJME@IICACKDJMDLDDHICIA@DHJEIBBH@BIBJJJC@IIID@@EHIEJBEDEAEBBMDHM@@ADLLHFBJJJDJ@@JBDMBHI@DDNDHIAAIEJIFNDFDLHEEJLBHIBHHIBHKEEADIEJBKEECFJEDLNJNKOJJOJKIBJDFEDKDDJIDHEABNKEJNOONNOIJA@@@" "JMGEGFIJNKGMOFJHECAABE@EBDLEDMAEEGEMMNFJNBJOFIJHHDJBIBIDI@EDIEEDIBDJBABEBFDNHDEJJEBIABBDBDJICDJBEEBKMEEEFHHGBBBADLHBDHADICEFDID@IB@IIDBBBG@HKEEEENJEEBBIFDJIBABBDDJEBJMA@KICBEBDBBIBDIEEDIE@DIDJDJBI@HJLKGJJCJKCMMMGEEDEIEAIBE@EBDDFE@JKGMOFKJLKGEGEJH@@" "EALENOOGIMMGMMEBIDBDDJFHHIBJK@ODJHOGGKIEMEEEMGEECEELJMBKBEDIBDIABDMADJHJDKIAECJIBHJBFDHKDJDJDMDLJIEDCBJJIEBHDHIDAAIEBCDBBDJIBBAFBEDLDADHI@JEDJJJFAEDJIIEIBIBIFHICBBHJDJNEDDNIBHJIDEIBDDIBDIEBFJEJIMEFEEGEMEEEMDNOGGHJIGHFJJDHHKBIABADJEEMOEMLOGOKMALE@@@" "NNJKGLJIFKGJKBEEBBLJIDHBKBICDEDIMGDJMOGJJJJJJJJHLJJBIBIDDIBBDIBFHIDDIBIDIDBJEDEKFBIDHIBFIDIDK@AAEBBIDEEEBBDKABDADJBHHHBLMAEDEIJ@HHJBIDABDFIBBEEEADJBEDD@FIDIDKBDHIDJCFMAEBJADIDJDIADHKBDIBBDIADJDJBJIHJJJJJJJJOGMJIGELIEAFDJFJ@IDJIJBEEBFJOFKDJIOFJKKH@@" "IEEDKGMFIJJGGEJJLIA@JIEEDJDDJIOCCEOEOLMEOEDKOBJKBEEEEDJIEBHLIJDHJEBIBECEBADACEBH@IBEBBDMJIBIDKNJKDJJKJIEEDJDJDHJ@HHBEJJABEEEBDBJMB@HHBHIBIBIEEDJNJJIFJKNIDJDJMIBBEBDH@JEFDADBEFEBDJEBHIBLIHJEDJIEEEEBFJJGNIEGMEIOMGMFFGLJIABIEEDJHDDIJJMGGBJLKEOFIEEDH@@" "BHJIBDEDFBEHHDABABDE@BBJEAKEABHDDJEKKOOKFJKFLOEDEJBEDKEFJECABBMBEDEBDJDBDJEFDJIBKBDHDNIKDBEDIDAADIEEFEBJJEDK@ICDECCDH@HJIJBBLJHH@IFFEAFDHFIEBJJECEEDIDDADIEBAFLKI@IBFJDJICEBIBABIBEAEBEJBDFEBKEFIEBBMAEGIKFJKFOONNMBIA@JDEFLEBJB@EABDBDA@HMBCAEABDJHJ@@@" "EBDBDIHJIDJBBIBDJEAJEDM@IFDIFEFJJEFKGMEEMMDMIJKJJBLJIDJIDJDFED@JHA@EIDIEADHHIEJDHJIBI@DBIEDABJNFKEDJIJJJJIEEEEDBIDDABKCDFAEDCAFFJDAADJAEEEEDJJJJLJIEFKCJJDAEDJA@DJDJHIBMDHHIDEDIDM@D@JHAECABIDJIDJIJBJNJLMIEMMEEOFKEBJKECDICDHEIEBLEBIBDJBBIDJHLIBABE@@@" "JDHLJJCADA@IDJFI@JJ@HA@EBHIDHJIBDHMNNOOKGEGGGCJAAMBJKBDJI@I@IBK@EBGDBIBBFABBEB@IBDCFBEAEBDAODI@HFJBJFKEEEFJJI@BHJAAFDHDBHJEBHJA@ICDDBHJ@DJJKEEEFKBJBK@HDIGLABEDEBCFABDHBEBBDCBBDJAGBE@FJDHDHDJIBFJJELDBNGGGEGFOOKKMHIBDJHIDHJE@D@HBJHDKBIDHDADFBJIHIBH@@" "DIAA@@HFBJJBA@HEE@@EAFJJMEEAEDBDHKB@IEBDEHHJLMENFBJEDMKFCGBNJDHGBDHIEBDLHLDLJHJJEAD@HJJJIBJ@AJMBMEEDIFJJJIBJBFLE@JE@IBIDEIJLMADJDHEBHEAKBBJDJJJKDIEEEJEJL@BJDJJJHHADEBJHJIIAHIIBEDHIBG@IBKJGFCFMIEBJCCMEIJHHMABEDHBFHIBAEDEEEJJKDE@@EE@HDBBJJC@H@DDDI@@@" "ABBJFIBHH@@JJIC@@EE@B@@@@@@B@EDIE@DJDDMILEBBAAB@HJDHIBDID@FAHIBHDIBBDDIAB@IADEDDIBEEEDBJBDAMD@BMBIBKFKDEEEEEE@A@EDHEBDJEHBEB@MBIBE@IE@D@EEEEEEAFKFJDJEJ@AELABBJAEEEBDIAEADDHBDDIABBDI@JDHLC@ADIBDHIBHHBDDBBEALMIABI@EDIE@B@@@@@@B@EE@@FDJJH@@HJDKBJBD@@@" "EDD@HBFBJFJ@BBDDJH@FDEEKDJIDI@EBHFIEAE@BAEDLJJEEEIABJHJBHJHLCBEBJBDLIIBDDKJJIJBIBFIBAABHJIGBIEI@LJDDIEEKFJLJDDJFJACJDI@HCDHIF@HDIBNDBKBIABIJKFMEDIABIHDMDJGDJHJDDBDKBDJBLJJNIABDLIIBBJEBFAHJHJBHJJDDMEEBJIIEDB@EDEDK@JE@DIDJIFMEAC@@JIABB@BKBJCB@HAAE@@@" "JBIBAE@D@H@JHLJI@DI@E@@@A@BABJHHBHD@B@BHI@AADHHDDBFE@B@JAAEADDHD@HIADBDJI@@IBDHBDHDDJFFBIBHDBDBGCEKGGFJFIACDIIDHDJDAEBEEDEBEAEEBEDABI@IDLIFDDKBKGGFMFGBABA@JDJCCBIA@IB@IBDH@DJIBADDHHA@IADEDDBHB@ECBAA@HIDD@DHJ@B@A@J@HJJDB@D@@@E@DI@DJIHJH@HA@EDBDJBH@@" "ADBDB@DJMAE@EAABEABDHDJEDEDJDBBADE@JDJDCBEFDIBJIADHHEDJDJDBDAABJJBBDIDIDJEEBEABDICBI@HHIBIBMDIDHDDDHHIDIBJLIFBIBIBJJHFJDIHE@LIBK@JJJDJDJCDIJJDIDHHIAA@IDIEJDJDHHHDJFDIBDEBEEBIDIDIBBBJJDDABABIBIE@HIDDJJDICEBFABIBHEADBBABIEAEBI@IBDEBDDE@EDEJI@BABAD@@@" "JIDIDJHI@IBEIDFE@DDIBI@H@I@HIDIBI@E@I@IDDI@IBE@JJIBEHI@I@IDIBJI@DHDIBIBI@HBDHJHIBDDDIBEBEBE@IBIBJIBEBDIBEEBJHHBEBDDEBHDJEBHJEBI@JEAABEB@HJJEEBDIBEBDJJDJDHEBEBEBDIAABDHJHIB@HDJDJDI@I@DJJDIDHDHDHMBDJJHEBDHDIADHDHE@DJDIDHHDH@HDJDIA@ECADMBDHDHJIDIDJH@@" "BBEBEBEBEBIBBBIBEBIBEBEBEBEBBEBEBEBEBEBBIBEBEBEBBBEBBBEBEBBBEBBEABIBIBEBEBIBEBBBEBIBBEBEBEBEBEBEBBIBEBBEBBEBEBEBEBIBEBIABEBEBDDJEBDJEBEBEBEBBEBBEBDJBEBEBEBEBEBEBBDJEBBBEBDJEBEBDJDJDEBBEBBBEBEBBBEBBBEBEBEBDJBEBEBEBEBEBBEBEBEBEBDJEBDJBBDJEBEBEBEBB@@@")} \ No newline at end of file diff --git a/lispusers/BACKGROUND-RHINE.PRESS b/lispusers/BACKGROUND-RHINE.PRESS new file mode 100644 index 0000000000000000000000000000000000000000..26eb5732cab21c3e6f74626e15007c4f6fb8ad4d GIT binary patch literal 105472 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�BtiB7WpSPKh`Y9aQ6h zxBjnAW*+6!$Q*IjX$oG_= zOdMV?S(re>LksH2FuwZGStpoD`a7Gwv6*xxLzaCp|F!ZMYXpu*u5!!Vn56&~)FP`WUsS19wc zTVSq&AjZq2Gw9@q3%rdg?0@4t^duIikUdbQ%l+E?*h%9Z5Au&qk++3TgqmHcdoQet zWgS|joqUvMrZ3gs4Rp{qFgO#4MKg<>MEUzQcBTG;XUT0<^V~3`nsho;vkrMG-k6yK zT}6_4o)cc+hOv0w_U9ScK_MGFPt2HNL`@*?9U7CGTYzXkhDi<3L6z)GrH3-s z?D!gQptHEp2DyQsMf`9f(1!FNKUKOSP!4%|bj#`N{^Dx7@T@_-%n+niE;BE!b8CNg z13XaEMF%N_aI`l54i&h_ zPdwcRQ%ug9{Oi{tfUGjbR~6@H*9nm_fT8@LV;Qn*jLHqs_*C8dJ}@2;a*vV8Ef2fY zpy-wl9dhyPS!>D-i94;E@;Xd3NcyM@(svGRt~M%`)aKR5_3--rfb{1lE>j!D0GP+b z(sx$ND0r0p{rLxtjiY^r_n%mZXYApPy`=#1k>p6|xBjD|KG62!mRO zo0;O#pwS6Q(nB6yl6X#m-;nOJLfI$ z56P{5gV5Miv7ACd+cRoHrxKaW-$>E{2dO*WD;JzLN{Hj!(eZ06LUJEs0XL_z69znX zBP5-61H$cErBf2n8g4QodE21!olLE2D8O)zuWjY^d}s5B5sF+aRt9ed-h|7Iop%nok}QA> z)VEWFh9JU7i;)x-C$5d*A5wj$&AV_v8)I94FG$CwoyMUQs_E zz8ebI4DzU|b~B>bN~y9p3?DLEV=#OUnn)WA)<;`h{$rtbVO>rydAugbCRyWgP-2_c zZ2S|hB#%~GZb^xpU#=L#VLz_>?q+!jFXE(rb?X)YaL;D@L9sCR@L!>JD6 zF+od6h;1F*uN<9-4#q{Nc+u#`1A9Jc*J&NROunQ6A`pu$#qWNXezj2V>k#rV5GTsy zlAJ3kSnq-w87y5)f@K*sQhh>=?MEp1AA}?rRQ?UBJ8gQOINbIfmaomW8WLu=+tNO! z+*3%R+^BB=%vvaem~&Q5EXDPII<5P_an2NbGpEz(-K@drqR9*(Sxf5@#q>i3!E3W- zovyfvcYqq#&BO#&i@V1&D>g%nP%Ax)PvP{ndjTD?6Hm2-s>Rg*%m%W-N;`l$^Jc3D z`hd{f+@Wyq!r?n|8wV92@c=9;k{HX_l;P{gDPfR}TAx*0hghCKL!{B_Sk}9i?tXvW zKi+#UeJ82Ve$wJ*B6$ml(ak|G^8?2GDi9C(s?9#op~;y1jGKF=-<#<)7AnVE=8$S|IfyE#NMLg^N1W zIEPPlAbWQ#`G2Z~<9D-W+b4CauTpGYf5mJu#-Sf%GmsqR4dJab`_ona4_$w( z)+v}wf(}D#EwZBbYJbYON^{%wVAkeg%q!sJOM}5c3F$7lL(mEYG6{7Um`nI0IQ$^N zN*XO%ZpDXA6k#)8s^KP_MYn`{WvVC5*1Ovej{A4Z42xPmgkRt2Zx#AtE2@gbsNb(s zdW=bDpLOZ<6ze5y_7%H*vw;r^V@d9|35rzUlb+UlY0J)h; zA!%?buHa7QER=hD{OU|Q$RjeYi6{PYuvf#842`s=d$;2aFqA@am@2fUfT=ej>0;6l z!nEvZo`L5vd`J!>&l5w0UX^9jPkc*o-G0#M_!tlZCQU%L%{gQtX2I#SnBw%BH7UpP z-_)wGe8A&n6Qxve**_}ow9p_ZtpDLQ=CYed$I*+Rw+1mXiEX1M+?YRK&h1tC<)$O-Om^EfM5zV>HxrBv# z3t}h=_mG9l1q*soJLU;KO(h!T@hm>N3Fuu8+_{$ zGV{yRnA2>4HC5p?7{W>QgTDImTqgE4AHMDbU zvwDRoZ?QtDH&3x#+{CP|;*^kNO@jC7&YM!+A$TUC==<^XG>B*!{<3~#0hA3jsnse! zd50=pmP8+gXPcA{PI?Y2Sdc{o+^Op0l*Py%z*NcJVePI-ZI!ew@m-u~b0GGE-OiZ1e zRT?;b7~aKRbQ(9z%h{A>a*Z=ev zEBs$d{EdHvG&6lmor^h5@$<8Y<>M8&J-8%<+JIh-kQAyP3YiGUB(IvpYe5quaL^IP zAW_I)oFAN5Z)y#^i0MI*TOqXjy-5%m-4xPKIdmSSYN2QQNGK)KFjhjZ&14e9qS2#W zXR`b(Z~pAbd>Uj-TG}?uEVGG(*Bm#eb!#q1Voi$}4X%$2;oIAT<~gU~-*Rr(>pMjm zb2kZxfq0!4QWz-c;!ofmgfJ_HchxV1>f7xH|BDdB;f7Pq3M+ zr7*owc6pF20j!t^`1!e-G}y#D0NGyg-`+$=>O!}0CofYxNqanYYU)(;ehGS`HYKS` znv$$c;qZ5|%)4sAbZbN3sB=m*i#}*kf?Yf`SEXYkxb6bvTNqNT5xgZ9Pr&l z-17(c{qHD34eV_HzQPq(hZCt`7gJyhxFUEOBjyVMS5dL{MEPR!StRk8kJ@9+33=ix zzWT_ZINzYj8W#s&@Ww`5Vt%MdO?9>2?A-a;LV$_V!uCIBunSAD{bOE!(xlr>x2 zv;)+
Lm3QlX|~kIs7fy=C?gDH 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%0D{)lLRY_`;gRy>fLsx?V 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 PJ34n)eTI}@{3QPd?A0hY literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUND-STEINHEIM.PRESS b/lispusers/BACKGROUND-STEINHEIM.PRESS new file mode 100644 index 0000000000000000000000000000000000000000..971e457edde008aba6c13edc2e0b4ca815774d66 GIT binary patch literal 105472 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 literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUND-TIFFANY.PRESS b/lispusers/BACKGROUND-TIFFANY.PRESS new file mode 100644 index 0000000000000000000000000000000000000000..4fd0e761801c2360b4e22b832aa14e956e83959b GIT binary patch literal 105472 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

qA)n8s8?L|}$? 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

qgBq@>gPdAc${iT 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 literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUND-parc.PRESS b/lispusers/BACKGROUND-parc.PRESS new file mode 100644 index 0000000000000000000000000000000000000000..7fa19fceceeb860eafbd6a06bb3d399d74982e32 GIT binary patch literal 105472 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 literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUND-twodollar.PRESS b/lispusers/BACKGROUND-twodollar.PRESS new file mode 100644 index 0000000000000000000000000000000000000000..1b898051947318ba067eeffb5ad52d6e9f68114f GIT binary patch literal 105472 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 literal 0 HcmV?d00001 diff --git a/lispusers/BACKGROUNDIMAGES b/lispusers/BACKGROUNDIMAGES new file mode 100644 index 00000000..dfa133bf --- /dev/null +++ b/lispusers/BACKGROUNDIMAGES @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §PACKAGE "INTERLISP" §READTABLE "INTERLISP" §BASE 10) (FILECREATED " 2-Mar-87 16:07:23" {ERIS}LYRIC>BACKGROUNDIMAGES.;6 17437 changes to%: (FNS BACKGROUND.SETUP) (VARS BACKGROUNDIMAGESCOMS) previous date%: "11-Feb-87 21:26:26" {ERIS}LYRIC>BACKGROUNDIMAGES.;5) (* " Copyright (c) 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT BACKGROUNDIMAGESCOMS) (RPAQQ BACKGROUNDIMAGESCOMS [ (* ;;; "Enables you to load interesting backgrounds. Simplest entry is just to call (BACKGROUND.SETUP).") (FNS BACKGROUND.SETUP BACKGROUND.FILES BACKGROUND.FILE BACKGROUND.FETCH BACKGROUND.SHORTNAME BACKGROUND.MODE BACKGROUND.SHADE) (FNS BACKGROUND.CENTER BACKGROUND.REFLECT BACKGROUND.TILE BACKGROUND.LESS) (INITVARS (BACKGROUNDS NIL) (BACKGROUND.MODE 'CENTER) (BACKGROUND.SHADE 34850)) (GLOBALVARS BACKGROUNDS BackgroundMenuCommands LISPUSERSDIRECTORIES BACKGROUND.MODE BACKGROUND.SHADE) [ADDVARS (GAINSPACEFORMS ((LISTP BACKGROUNDS) "Delete saved background bitmaps" (SETQ BACKGROUNDS NIL] (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA]) (* ;;; "Enables you to load interesting backgrounds. Simplest entry is just to call (BACKGROUND.SETUP).") (DEFINEQ (BACKGROUND.SETUP [LAMBDA (NAMES) (* ; "Edited 2-Mar-87 15:57 by Stansbury") (* ;;; "Background decoration. Puts stuff on the background menu that will let you stick up fun backgrounds on the screen.") (LET [(IMAGES (if (LISTP NAMES) then NAMES else (BACKGROUND.FILES NAMES] (if (LISTP IMAGES) then (FILESLOAD (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) BACKGROUNDMENU) (BkgMenu.remove.item 'Background) [BkgMenu.add.item `(Background '(CHANGEBACKGROUND BACKGROUND.SHADE) "Change background" (SUBITEMS [Change '(CHANGEBACKGROUND BACKGROUND.SHADE) "Change background" ,(CONS 'SUBITEMS (for IMAGE in IMAGES collect (LET ((NAME (if (LISTP IMAGE) then (CAR IMAGE) else IMAGE)) (FILENAME (if (LISTP IMAGE) then (CDR IMAGE) else NIL))) (LIST NAME `'(BACKGROUND.FETCH (QUOTE %, NAME) (QUOTE %, FILENAME) BACKGROUND.MODE) (CONCAT "Change background to " NAME] [Mode '(PROMPTPRINT (BACKGROUND.MODE)) "Change mode of applying background images" (SUBITEMS [Center '(BACKGROUND.MODE 'CENTER] [Tile '(BACKGROUND.MODE 'TILE] (Reflect '(BACKGROUND.MODE 'REFLECT] (Shade '(BACKGROUND.SHADE (EDITSHADE BACKGROUND.SHADE)) "Change the default background shade"] (BkgMenu.fixup) T else NIL]) (BACKGROUND.FILES [LAMBDA (WHICH) (* ; "Edited 11-Feb-87 20:29 by Stansbury") (* ;;; "Returns a list of names of press files which contain background-sized images") (for filename in [SELECTQ WHICH (T (* ;; "Find all images on all lispusersdirectories") (for DIR in LISPUSERSDIRECTORIES bind IMAGES first (SETQ IMAGES NIL) do (for image in (APPEND (FILDIR (PACK* DIR "background-*.bitmap")) (FILDIR (PACK* DIR "background-*.press"))) do (pushnew IMAGES image)) finally (RETURN (SORT IMAGES)))) (PROGN (* ;; "Find just the clump of images on the first lispusersdirectory that has any images on it. (Useful because usually images will be on just one lispusersdirectory.)") (for DIR in LISPUSERSDIRECTORIES do (LET [(images (APPEND (FILDIR (PACK* DIR "background-*.bitmap")) (FILDIR (PACK* DIR "background-*.press"] (if (LISTP images) then (RETURN images] collect (CONS (BACKGROUND.SHORTNAME filename ) filename]) (BACKGROUND.FILE [LAMBDA (NAME) (* ; "Edited 11-Feb-87 20:29 by Stansbury") (* ;;; "Finds the file containing a press encoding of the named background.") (for DIR in LISPUSERSDIRECTORIES do (LET ((BITMAP.FILENAME (PACKFILENAME 'DIRECTORY DIR 'NAME (CONCAT "background-" NAME) 'EXTENSION "bitmap")) (PRESS.FILENAME (PACKFILENAME 'DIRECTORY DIR 'NAME (CONCAT "background-" NAME) 'EXTENSION "press"))) (if (INFILEP BITMAP.FILENAME) then (RETURN BITMAP.FILENAME) elseif (INFILEP PRESS.FILENAME) then (RETURN PRESS.FILENAME]) (BACKGROUND.FETCH [LAMBDA (NAME FILENAME MODE) (* ; "Edited 11-Feb-87 20:30 by Stansbury") (* ;;; "Puts up the specified background. If it is cached, just grabs it off the cache; else reads the press file off the server, translates it into a bitmap, slams it up, and caches it.") (LET ((BITMAP (LISTGET BACKGROUNDS NAME))) [if (NOT (BITMAPP BITMAP)) then (* ;; "Find background: either off a Lisp bitmap file, or off an old Press file") (CLRPROMPT) (PRINTOUT PROMPTWINDOW "Fetching background " NAME " ... ") (if (NULL FILENAME) then (SETQ FILENAME (BACKGROUND.FILE NAME))) (if (OR (NULL FILENAME) (NOT (INFILEP FILENAME))) then (PROMPTPRINT "Background " FILENAME " not available.") else (if (PRESSFILEP FILENAME) then (FILESLOAD (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) BITMAPFNS) (SETQ BITMAP (READPRESS FILENAME)) else (LET [(STREAM (OPENSTREAM FILENAME 'INPUT] (SETQ BITMAP (HREAD STREAM)) (CLOSEF STREAM))) (PRINTOUT PROMPTWINDOW "done." T) (* ;; "Cache it (before modifying it)") (if (LISTP BACKGROUNDS) then (LISTPUT BACKGROUNDS NAME BITMAP) else (SETQ BACKGROUNDS (LIST NAME BITMAP] (* ;; "Adjust bitmap and apply to background of screen") (PRINTOUT PROMPTWINDOW "Adjusting background ... ") (SETQ BITMAP (SELECTQ MODE (TILE (BACKGROUND.TILE BITMAP)) (REFLECT (BACKGROUND.REFLECT BITMAP)) ((NIL CENTER) (BACKGROUND.CENTER BITMAP)) (\ILLEGAL.ARG MODE))) (CHANGEBACKGROUND BITMAP) (PRINTOUT PROMPTWINDOW "done." T) BITMAP]) (BACKGROUND.SHORTNAME [LAMBDA (IMAGE) (* ; "Edited 11-Feb-87 20:30 by Stansbury") (* ;;; "Parses the IMAGE file name to find the short name of a background. IMAGE file names are of the form {server}SHORTNAME-background.press") (MKATOM (L-CASE (LET [(LONGNAME (FILENAMEFIELD IMAGE 'NAME] (SUBSTRING LONGNAME (LET ((start (STRPOS "-" LONGNAME))) (if (FIXP start) then (ADD1 start) else start)) NIL)) T]) (BACKGROUND.MODE [LAMBDA (NEWVAL) (* ; "Edited 11-Feb-87 20:42 by Stansbury") (* ;;; "Finds the value of or resets the background image applying mode.") (if (NULL NEWVAL) then BACKGROUND.MODE else (SELECTQ NEWVAL ((CENTER TILE REFLECT) (PROG1 BACKGROUND.MODE (SETQ BACKGROUND.MODE NEWVAL))) (\ILLEGAL.ARG NEWVAL]) (BACKGROUND.SHADE [LAMBDA (NEW-SHADE) (* ; "Edited 11-Feb-87 21:26 by Stansbury") (* ;;; "returns the old value of the default background shade. Also, if new-shade is a texture, makes it be the new default background shade.") (if (NULL NEW-SHADE) then BACKGROUND.SHADE elseif (TEXTUREP NEW-SHADE) then (PROG1 BACKGROUND.SHADE (SETQ BACKGROUND.SHADE NEW-SHADE)) else (\ILLEGAL.ARG NEW-SHADE]) ) (DEFINEQ (BACKGROUND.CENTER [LAMBDA (BITMAP) (* ; "Edited 11-Feb-87 21:12 by Stansbury") (* ;;; "Returns a new bitmap the size of the screen which has the argument bitmap centered in it and a gray border. This will center the bitmap on the screen, regardless of the screen size.") (LET ((NEWBITMAP (BITMAPCREATE SCREENWIDTH SCREENHEIGHT 1)) (X (QUOTIENT (DIFFERENCE SCREENWIDTH (BITMAPWIDTH BITMAP)) 2)) (Y (QUOTIENT (DIFFERENCE SCREENHEIGHT (BITMAPHEIGHT BITMAP)) 2))) (BLTSHADE BACKGROUND.SHADE NEWBITMAP) (BITBLT BITMAP 1 1 NEWBITMAP X Y) NEWBITMAP]) (BACKGROUND.REFLECT [LAMBDA (BITMAP) (* ; "Edited 11-Feb-87 20:56 by Stansbury") (* ;;; "Centers BITMAP on a screen-sized bitmap and tiles the remaining space with reflections of BITMAP") (LET* ((WIDTH (BITMAPWIDTH BITMAP)) (HEIGHT (BITMAPHEIGHT BITMAP)) (MAXWIDTH (TIMES 3 WIDTH)) (MAXHEIGHT (TIMES 2 HEIGHT)) (TOO.SMALL (OR (GREATERP SCREENWIDTH MAXWIDTH) (GREATERP SCREENHEIGHT MAXHEIGHT))) (NEWBITMAP (BITMAPCREATE (if TOO.SMALL then MAXWIDTH else SCREENWIDTH) (if TOO.SMALL then MAXHEIGHT else SCREENHEIGHT) 1)) (X (IQUOTIENT (DIFFERENCE (BITMAPWIDTH NEWBITMAP) WIDTH) 2)) (Y (if (GREATERP HEIGHT (BITMAPHEIGHT NEWBITMAP)) then (IQUOTIENT (DIFFERENCE (BITMAPHEIGHT NEWBITMAP) HEIGHT) 2) else 0))) (* ;; "Stick original bitmap in middle") (BITBLT BITMAP NIL NIL NEWBITMAP X Y) (if (OR (GREATERP SCREENWIDTH WIDTH) (GREATERP SCREENHEIGHT HEIGHT)) then (* ;; "Build reflections") (LET ((HORIZ (BITMAPCREATE WIDTH HEIGHT 1)) (VERT (BITMAPCREATE WIDTH HEIGHT 1)) (HORIZ.VERT (BITMAPCREATE WIDTH HEIGHT 1))) (for I from 0 to (SUB1 WIDTH) do (BITBLT BITMAP I 0 HORIZ (DIFFERENCE (SUB1 WIDTH) I) 0 1 HEIGHT)) (for I from 0 to (SUB1 HEIGHT) do (BITBLT BITMAP 0 I VERT 0 (DIFFERENCE (SUB1 HEIGHT) I) WIDTH 1)) (for I from 0 to (SUB1 HEIGHT) do (BITBLT HORIZ 0 I HORIZ.VERT 0 (DIFFERENCE (SUB1 HEIGHT) I) WIDTH 1)) (* ;; "Upper left hand corner") (BITBLT HORIZ.VERT NIL NIL NEWBITMAP (DIFFERENCE X WIDTH) (PLUS Y HEIGHT)) (* ;; "Above, center") (BITBLT VERT NIL NIL NEWBITMAP X (PLUS Y HEIGHT)) (* ;; "Upper right hand corner") (BITBLT HORIZ.VERT NIL NIL NEWBITMAP (PLUS X WIDTH) (PLUS Y HEIGHT)) (* ;; "left") (BITBLT HORIZ NIL NIL NEWBITMAP (DIFFERENCE X WIDTH) Y) (* ;; "Right") (BITBLT HORIZ NIL NIL NEWBITMAP (PLUS X WIDTH) Y) (* ;;  "If resulting reflected bitmap is still too small, recurse till it gets as big as the screen.") (if TOO.SMALL then (BACKGROUND.REFLECT NEWBITMAP) else NEWBITMAP)) else NEWBITMAP]) (BACKGROUND.TILE [LAMBDA (BITMAP) (* hts%: " 1-Apr-86 18:13") (bind (NEWBITMAP _ (BITMAPCREATE SCREENWIDTH SCREENHEIGHT 1)) for LEFT from (BACKGROUND.LESS SCREENWIDTH (BITMAPWIDTH BITMAP)) by (BITMAPWIDTH BITMAP) to SCREENWIDTH do (for BOTTOM from (if (GREATERP (BITMAPHEIGHT BITMAP) SCREENHEIGHT) then (BACKGROUND.LESS SCREENHEIGHT (BITMAPHEIGHT BITMAP)) else 0) by (BITMAPHEIGHT BITMAP) to SCREENHEIGHT do (BITBLT BITMAP NIL NIL NEWBITMAP LEFT BOTTOM)) finally (RETURN NEWBITMAP]) (BACKGROUND.LESS [LAMBDA (BOXSIZE IMAGESIZE) (* ; "Edited 11-Feb-87 20:56 by Stansbury") (* ;;; "Tells where you have to start drawing to end up with a centered, tiled image") (bind START first (SETQ START (ADD1 (QUOTIENT (DIFFERENCE BOXSIZE IMAGESIZE) 2))) until (LEQ START 1) do (add START (MINUS IMAGESIZE)) finally (RETURN START]) ) (RPAQ? BACKGROUNDS NIL) (RPAQ? BACKGROUND.MODE 'CENTER) (RPAQ? BACKGROUND.SHADE 34850) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS BACKGROUNDS BackgroundMenuCommands LISPUSERSDIRECTORIES BACKGROUND.MODE BACKGROUND.SHADE) ) (ADDTOVAR GAINSPACEFORMS ((LISTP BACKGROUNDS) "Delete saved background bitmaps" (SETQ BACKGROUNDS NIL))) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (PUTPROPS BACKGROUNDIMAGES COPYRIGHT ("Xerox Corporation" 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1897 10963 (BACKGROUND.SETUP 1907 . 4149) (BACKGROUND.FILES 4151 . 5706) ( BACKGROUND.FILE 5708 . 6973) (BACKGROUND.FETCH 6975 . 9284) (BACKGROUND.SHORTNAME 9286 . 10006) ( BACKGROUND.MODE 10008 . 10460) (BACKGROUND.SHADE 10462 . 10961)) (10964 16807 (BACKGROUND.CENTER 10974 . 11668) (BACKGROUND.REFLECT 11670 . 15603) (BACKGROUND.TILE 15605 . 16340) (BACKGROUND.LESS 16342 . 16805))))) STOP \ No newline at end of file diff --git a/lispusers/BACKGROUNDMENU b/lispusers/BACKGROUNDMENU new file mode 100644 index 00000000..d4379814 --- /dev/null +++ b/lispusers/BACKGROUNDMENU @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED "31-Jan-87 18:09:00" {ERIS}LYRIC>BACKGROUNDMENU.;1 7367 previous date%: "31-Jan-86 11:36:13" {ERIS}KOTO>LISPUSERS>BACKGROUNDMENU.;1) (* " Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT BACKGROUNDMENUCOMS) (RPAQQ BACKGROUNDMENUCOMS ((INITVARS BackgroundMenuFixupMode BackgroundMenuSuperItem BackgroundMenuTopLevelItems) (FNS BkgMenu.add.item BkgMenu.fixup BkgMenu.move.item BkgMenu.remove.item BkgMenu.rename.item BkgMenu.reorder.items BkgMenu.subitems \BkgMenu.locate \BkgMenu.locater \BkgMenu.remove.item \BkgMenu.scan.item.list \BkgMenu.unremove.item))) (RPAQ? BackgroundMenuFixupMode NIL) (RPAQ? BackgroundMenuSuperItem NIL) (RPAQ? BackgroundMenuTopLevelItems NIL) (DEFINEQ (BkgMenu.add.item [LAMBDA (item superitem atend) (* mdd "31-Jan-86 11:32") (if (NULL superitem) then (if atend then (NCONC1 BackgroundMenuCommands item) else (SETQ BackgroundMenuCommands (CONS item BackgroundMenuCommands))) (SETQ BackgroundMenu NIL) T elseif (SETQ superitem (CDDAR (\BkgMenu.locate superitem))) then [if (NULL (CDR superitem)) then (RPLACD superitem (LIST (LIST 'SUBITEMS item))) else (if atend then (NCONC1 (CADR superitem) item) else (RPLACD (CADR superitem) (CONS item (CDADR superitem] (SETQ BackgroundMenu NIL) T]) (BkgMenu.fixup [LAMBDA NIL (* mdd "23-Sep-85 19:09") (bind stack (stacking _ (NEQ BackgroundMenuFixupMode 'bottom)) (result _ T) for x in (BkgMenu.subitems) do [if (for i in BackgroundMenuTopLevelItems thereis (EQUAL (MKSTRING i) (MKSTRING x))) then (if (AND stacking (NEQ BackgroundMenuFixupMode 'top)) then (for i in stack do (OR (BkgMenu.move.item i BackgroundMenuSuperItem) (SETQ result NIL))) (SETQ stacking NIL)) else (if stacking then (SETQ stack (CONS x stack)) else (OR (BkgMenu.move.item x BackgroundMenuSuperItem T) (SETQ stacking NIL] finally [if stacking then (for i in stack do (OR (BkgMenu.move.item i BackgroundMenuSuperItem) (SETQ result NIL] (RETURN result]) (BkgMenu.move.item [LAMBDA (item superitem atend) (* mdd "31-Jan-86 11:32") (if (SETQ item (\BkgMenu.locate item)) then (\BkgMenu.remove.item item) (if (BkgMenu.add.item (CAR item) superitem atend) then T else (\BkgMenu.unremove.item item) NIL]) (BkgMenu.remove.item [LAMBDA (item) (* mdd "23-Sep-85 17:13") (if (SETQ item (\BkgMenu.locate item)) then (\BkgMenu.remove.item item) (SETQ BackgroundMenu NIL) T]) (BkgMenu.rename.item [LAMBDA (item new.name) (* mdd "23-Sep-85 16:58") (if (SETQ item (\BkgMenu.locate item)) then (RPLACA (CAR item) new.name) (SETQ BackgroundMenu NIL) T]) (BkgMenu.reorder.items [LAMBDA (itemlist superitem atend) (* mdd "23-Sep-85 20:26") (NOT (for i in (if atend then itemlist else (REVERSE itemlist)) do (OR (BkgMenu.move.item i superitem atend) (SETQ $$VAL T]) (BkgMenu.subitems [LAMBDA (item) (* mdd "23-Sep-85 18:33") (if item then (if (SETQ item (\BkgMenu.locate item)) then (MAPCAR (CDR (CADDDR (CAR item))) (FUNCTION CAR)) else 'NotAnItem) else (MAPCAR BackgroundMenuCommands (FUNCTION CAR]) (\BkgMenu.locate [LAMBDA (item menu) (* mdd "23-Sep-85 20:58") (if [AND (LISTP item) (CDR item) (NOT (SETQ menu (CADDDR (CAR (\BkgMenu.locate (CDR item) menu] then NIL else (\BkgMenu.locater (MKSTRING (if (LISTP item) then (CAR item) else item)) (OR (CDR menu) BackgroundMenuCommands) menu]) (\BkgMenu.locater [LAMBDA (name items preitems) (* mdd "23-Sep-85 20:44") (bind (queue _ (CONS NIL NIL)) until (OR (SETQ $$VAL (\BkgMenu.scan.item.list name items preitems queue)) (NULL (CAR queue))) do (SETQ preitems (CAAR queue)) (SETQ items (CDR preitems)) (RPLACA queue (CDAR queue)) (if (NULL (CAR queue)) then (RPLACD queue NIL]) (\BkgMenu.remove.item [LAMBDA (item) (* mdd "23-Sep-85 17:12") (if (CDR item) then (RPLACD (CDR item) (CDDDR item)) else (SETQ BackgroundMenuCommands (CDR BackgroundMenuCommands]) (\BkgMenu.scan.item.list [LAMBDA (name items preitems queue) (* mdd "23-Sep-85 15:39") (for i in old items do (if (EQUAL (MKSTRING (CAR i)) name) then (RETURN (CONS i preitems)) else (if (CDDDR i) then (TCONC queue (CADDDR i))) (SETQ preitems items]) (\BkgMenu.unremove.item [LAMBDA (item) (* mdd "23-Sep-85 17:17") (if (CDR item) then (RPLACD (CDR item) (CONS (CAR item) (CDDR item))) else (SETQ BackgroundMenuCommands (CONS (CAR item) BackgroundMenuCommands]) ) (PUTPROPS BACKGROUNDMENU COPYRIGHT ("Xerox Corporation" 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1008 7271 (BkgMenu.add.item 1018 . 1910) (BkgMenu.fixup 1912 . 3131) (BkgMenu.move.item 3133 . 3557) (BkgMenu.remove.item 3559 . 3834) (BkgMenu.rename.item 3836 . 4128) ( BkgMenu.reorder.items 4130 . 4505) (BkgMenu.subitems 4507 . 4907) (\BkgMenu.locate 4909 . 5520) ( \BkgMenu.locater 5522 . 6089) (\BkgMenu.remove.item 6091 . 6378) (\BkgMenu.scan.item.list 6380 . 6877) (\BkgMenu.unremove.item 6879 . 7269))))) STOP \ No newline at end of file diff --git a/lispusers/BICLOCK b/lispusers/BICLOCK new file mode 100644 index 00000000..1e5937a8 --- /dev/null +++ b/lispusers/BICLOCK @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Sep-88 01:29:15" {ERINYES}MEDLEY>BICLOCK.;5 38172 changes to%: (FNS BICLOCK BICLOCKPROCESS) (VARS BICLOCKCOMS) previous date%: "14-Dec-87 17:32:47" {ERINYES}MEDLEY>BICLOCK.;2) (* " Copyright (c) 1984, 1985, 1986, 1987, 1988 by Bernt Nilsson @ University of Linkoeping. All rights reserved. ") (PRETTYCOMPRINT BICLOCKCOMS) (RPAQQ BICLOCKCOMS [(FNS BICLOCK BICLOCKBEFN BICLOCKCFN BICLOCKFINDFONT BICLOCKNRFN BICLOCKPROCESS BICLOCKRPFN BICLOCKRSFN BICLOCKSETALARM BICLOCKSETALARM1 BICLOCKSETALARM2 IDLE.BICLOCK) (RECORDS BICLOCKPARMS UPTIMEREC) [INITVARS (BICLOCKWINDOW) (BICLOCKDEFAULTPROPS '(SECONDS T COLOR SHADOW MARKS NIL DIGITS 1 CHIME NIL ALARM NIL SIZE 152 HORIZONTAL LEFT-OF-LOGO VERTICAL TOP CREATE T)) (BICLOCKUSERPROPS) (BICLOCKINITIALPROPS) (BICLOCKIDLEPROPS '(HORIZONTAL CENTER VERTICAL CENTER] [P (CL:PROCLAIM '(CL:SPECIAL BICLOCKWINDOW BICLOCKDEFAULTPROPS BICLOCKUSERPROPS BICLOCKINITIALPROPS BICLOCKIDLEPROPS] [DECLARE%: DONTEVAL@LOAD DOCOPY (VARS (BICLOCKWINDOW (BICLOCK BICLOCKINITIALPROPS] (ADDVARS (IDLE.FUNCTIONS (Biclock 'IDLE.BICLOCK)) (IDLE.SUSPEND.PROCESS.NAMES BICLOCKPROCESS)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA BICLOCK]) (DEFINEQ (BICLOCK [LAMBDA PROPS (* ; "Edited 12-Sep-88 01:25 by masinter") (LET ((PLIST (APPEND (if [AND (EQ PROPS 1) (OR (NULL (ARG PROPS 1)) (LISTP (ARG PROPS 1] then (ARG PROPS 1) else (for I from 1 to PROPS collect (ARG PROPS I))) BICLOCKUSERPROPS BICLOCKDEFAULTPROPS))) (if [OR (ODDP (LENGTH PLIST)) (find P in PLIST by (CDDR P) suchthat (NOT (LITATOM P] then (ERROR "ARG NOT PROPLIST IN BICLOCK" PLIST)) (if (LISTGET PLIST 'CREATE) then (LET ((W (OR (LISTGET PLIST 'WINDOW) (CREATEW (OR (for P in PLIST by (CDDR P) as V in (CDR PLIST) by (CDDR V) do (SELECTQ P (SIZE (RETURN (if V then (CREATEREGION (SELECTQ (LISTGET PLIST 'HORIZONTAL) (LEFT 0) (CENTER (QUOTIENT (DIFFERENCE SCREENWIDTH V) 2)) (LEFT-OF-LOGO (- SCREENWIDTH V (if LOGOW then (WINDOWPROP LOGOW 'WIDTH) else 0))) (RIGHT (DIFFERENCE (DIFFERENCE SCREENWIDTH V) 1)) (OR (NUMBERP (LISTGET PLIST 'HORIZONTAL)) 0)) (SELECTQ (LISTGET PLIST 'VERTICAL) (BOTTOM 0) (CENTER (QUOTIENT (DIFFERENCE SCREENHEIGHT V) 2)) (BELOW-LOGO (- SCREENHEIGHT V (if LOGOW then (WINDOWPROP LOGOW 'HEIGHT) else 0))) (TOP (DIFFERENCE (DIFFERENCE SCREENHEIGHT V) 1)) (OR (NUMBERP (LISTGET PLIST 'VERTICAL)) 0)) V V)))) (REGION (RETURN V)) NIL)) (GETREGION 20 20 NIL 'BICLOCKNRFN)) NIL 0))) [PARMS (create BICLOCKPARMS SECONDSMODE _ (LISTGET PLIST 'SECONDS) COLORMODE _ (LISTGET PLIST 'COLOR) MARKMODE _ [SELECTQ (LISTGET PLIST 'MARKS) (HOUR 5) ((HOUR&MINUTE MINUTE) 1) (|3/6/9/12| 15) (NUMBERP (LISTGET PLIST 'MARKS] DIGMODE _ [SELECTQ (LISTGET PLIST 'DIGITS) (HOUR 1) (|3/6/9/12| 3) (NUMBERP (LISTGET PLIST 'DIGITS] CHIMEMODE _ [SELECTQ (LISTGET PLIST 'CHIME) (HOUR 60) (QUORTER 15) (NUMBERP (LISTGET PLIST 'CHIME] ROMANDIGS _ (for P in PLIST by (CDDR P) as V in (CDR PLIST) by (CDDR V) do (SELECTQ P (ROMAN (RETURN V)) (ARABIC (RETURN (NOT V))) NIL)) ADJUSTEVENT _ (CREATE.EVENT) ALARMTIME _ (if (LISTGET PLIST 'ALARMTIME) then (IDATE (LISTGET PLIST 'ALARMTIME] P) (if (NOT (LISTGET PLIST 'IDLE)) then (DEL.PROCESS 'BICLOCKPROCESS) (AND BICLOCKWINDOW (CLOSEW BICLOCKWINDOW))) (SETQ P (ADD.PROCESS (LIST (FUNCTION BICLOCKPROCESS) (KWOTE W) (KWOTE PARMS)) 'RESTARTABLE 'HARDRESET)) (WINDOWPROP W 'PROCESS P) (WINDOWPROP W 'NEWREGIONFN (FUNCTION BICLOCKNRFN)) (WINDOWPROP W 'RESHAPEFN (FUNCTION BICLOCKRSFN)) (WINDOWPROP W 'REPAINTFN (FUNCTION BICLOCKRPFN)) (WINDOWPROP W 'CLOSEFN (FUNCTION BICLOCKCFN)) (WINDOWPROP W 'AFTERMOVEFN (FUNCTION BICLOCKRPFN)) (WINDOWPROP W 'PARMS PARMS) (WINDOWPROP W 'WINDOWENTRYFN (FUNCTION BICLOCKBEFN)) (WINDOWPROP W 'BUTTONEVENTFN (FUNCTION BICLOCKBEFN)) W]) (BICLOCKBEFN [LAMBDA (W) (* lmm "19-Nov-86 07:41") (LET [(PROC (WINDOWPROP W 'PROCESS] [if (PROCESS.FINISHEDP PROC) then (PRINTOUT PROMPTWINDOW T "RESTARING BICLOCK PROCESS") (WINDOWPROP W 'PROCESS (SETQ PROC (ADD.PROCESS [LIST (FUNCTION BICLOCKPROCESS) (KWOTE W) (KWOTE (WINDOWPROP W 'PARMS] 'RESTARTABLE 'HARDRESET] (if (.COPYKEYDOWNP.) then (SUSPEND.PROCESS PROC) (INVERTW W) (UNTILMOUSESTATE (NOT (OR LEFT MIDDLE))) (BKSYSBUF (DATE)) (INVERTW W) (WAKE.PROCESS PROC) else (with BICLOCKPARMS (WINDOWPROP W 'PARMS) (if (MOUSESTATE LEFT) then (if ALARMTIME then (PROMPTPRINT (DATE) " ALARM AT " (GDATE ALARMTIME)) else (PROMPTPRINT (DATE) " NO ALARM SET")) elseif (MOUSESTATE MIDDLE) then (LET [(SEL (MENU (create MENU ITEMS _ `(("Seconds On" 'SON) ("Seconds Off" 'SOFF) ("White" 'WHITE "White with border" (SUBITEMS ("Shadow" 'SHADOW "White with shadow")) ) ("Black" 'BLACK) ["Markers" 'MINSEC "Use Submenu to Change number of Markers" (SUBITEMS ("No markers" 'NOMARKER) ("3/6/9/12 Markers" '3HOURMARKS) ("Only hours" 'HOURMARKS) ("Hours and minutes" 'MINHOURMARKS] ["Digits" 'HOUR "Use Submenu to Change number of Digits" (SUBITEMS ("No Digits" 'NODIG) ("3/6/9/12 Hours" '3HOUR) ("All Hours" 'HOUR) ("Arabic digits" 'ARABIC) ("Roman digits" 'ROMAN] ["Chime" 'CHIME "Use Submenu to Change Chime interval" (SUBITEMS ("No chime" 'NOCHIME) ("Hours" 'CHIME) ("Hours and quarters" 'CHIME15MIN] ("Set Alarm" 'ALARM) ("Alarm Off" 'AOFF] (SELECTQ SEL (SON (SETQ SECONDSMODE T)) (SOFF (SETQ SECONDSMODE NIL)) ((WHITE BLACK SHADOW) (SETQ COLORMODE SEL)) (NOMARKER (SETQ MARKMODE NIL)) (3HOURMARKS (SETQ MARKMODE 15)) (HOURMARKS (SETQ MARKMODE 5)) (MINHOURMARKS (SETQ MARKMODE 1)) (NODIG (SETQ DIGMODE NIL)) (3HOUR (SETQ DIGMODE 3)) (HOUR (SETQ DIGMODE 1)) (ARABIC (SETQ ROMANDIGS NIL)) (ROMAN (SETQ ROMANDIGS T)) (NOCHIME (SETQ CHIMEMODE NIL)) (CHIME (SETQ CHIMEMODE 60)) (CHIME15MIN (SETQ CHIMEMODE 15)) (ALARM (BICLOCKSETALARM W)) (AOFF (SETQ ALARMTIME NIL)) NIL) (if (MEMB SEL '(NOMARKER 3HOURMARKS HOURMARKS MINHOURMARKS NODIG 3HOUR HOUR ARABIC ROMAN)) then (RESTART.PROCESS (WINDOWPROP W 'PROCESS)) else (WAKE.PROCESS (WINDOWPROP W 'PROCESS]) (BICLOCKCFN [LAMBDA (W) (DEL.PROCESS (WINDOWPROP W 'PROCESS]) (BICLOCKFINDFONT [LAMBDA (SIZE MODERNCLASSIC) (* ; "Edited 26-Nov-86 14:46 by Pavel") (LET [(ALLFONTS (FONTSAVAILABLE '* '* 'MRR 0 'DISPLAY] [SORT ALLFONTS (FUNCTION (LAMBDA (F1 F2) (OR [AND MODERNCLASSIC (MEMB (CAR F1) '(MODERN CLASSIC)) (NOT (MEMB (CAR F2) '(MODERN CLASSIC] (GREATERP (CADR F1) (CADR F2)) (AND (EQP (CADR F1) (CADR F2)) (for FAM in '(MODERN CLASSIC GACHA HELVETICA HELVETICAD TERMINAL) do (if (EQ FAM (CAR F1)) then (RETURN T) elseif (EQ FAM (CAR F2)) then (RETURN NIL] (find FONT in ALLFONTS suchthat (LEQ (CADR FONT) SIZE]) (BICLOCKNRFN [LAMBDA (FP MP) (* BN "17-Sep-84 10:40") (COND [MP (with POSITION MP (PROG [(DX (IDIFFERENCE XCOORD (fetch (POSITION XCOORD) of FP))) (DY (IDIFFERENCE YCOORD (fetch (POSITION YCOORD) of FP] [COND [(IGREATERP (IABS DX) (IABS DY)) (SETQ YCOORD (IPLUS (fetch (POSITION YCOORD) of FP) (ITIMES DX (COND ((MINUSP (ITIMES DX DY)) -1) (T 1] (T (SETQ XCOORD (IPLUS (fetch (POSITION XCOORD) of FP) (ITIMES DY (COND ((MINUSP (ITIMES DX DY)) -1) (T 1] (RETURN MP] (T FP]) (BICLOCKPROCESS [LAMBDA (W PARMS) (* ; "Edited 12-Sep-88 01:26 by masinter") (CENTERPRINTINREGION "Wait" NIL W) (with BICLOCKPARMS PARMS (PROG [(WIDTH (WINDOWPROP W 'WIDTH)) (HEIGHT (WINDOWPROP W 'HEIGHT] (while T bind S (BM _ (BITMAPCREATE WIDTH HEIGHT)) (BG _ (BITMAPCREATE WIDTH HEIGHT)) (BM1 _ (BITMAPCREATE WIDTH HEIGHT)) (SHADOW _ (BITMAPCREATE WIDTH HEIGHT)) (XC _ (IQUOTIENT WIDTH 2)) (YC _ (IQUOTIENT HEIGHT 2)) (SX _ (ARRAY 60 'FIXP 0 0)) (SY _ (ARRAY 60 'FIXP 0 0)) MX MY HX HY MP HP R MARKUR MARKLR MARK1LR DOTR SECR MINR HOURR CIRCW MARKW MARK1W SECW MINW HOURW DIGW DIGFONT NOW SECS (SLOWMODE _ T) (SMODE _ T) (MEAN _ 50) (LIMIT _ 1000) CL0 REF NOSEC INVERTFLG LASTCHIME (CHIMECOUNT _ 0) first (* ; "First set up some relations") (BLOCK) (WINDOWPROP W 'ICONIMAGE BM) (WINDOWPROP W 'ICONMASK BG) (SETQ R (- (IMIN XC YC) 4)) (SETQ MARKUR (CL:* R 1.0)) (SETQ MARKLR (CL:* R 0.9)) (SETQ MARK1LR (CL:* R 0.98)) (SETQ DOTR (CL:* R 0.05)) (SETQ SECR (CL:* R 1.0)) (SETQ MINR (CL:* R 0.9)) (BLOCK) (SETQ HOURR (CL:* R 0.6)) (SETQ CIRCW (CL:* R 0.03)) (SETQ MARKW (CL:* R (SELECTQ COLORMODE (SHADOW 0.05) 0.0375))) (SETQ MARK1W (CL:* R 0.009)) (SETQ SECW (IMAX 1 (CL:* R 0.01))) (SETQ MINW (IMAX 2 (CL:* R 0.037))) (SETQ HOURW (IMAX 3 (CL:* R 0.07))) (SETQ DIGW (CL:* R (if (NUMBERP MARKMODE) then 0.75 else 0.9))) (SETQ S (DSPCREATE BM)) (DSPXOFFSET XC S) (DSPYOFFSET YC S) (* ;; "Generate signature") (if (SETQ DIGFONT (BICLOCKFINDFONT (TIMES R 0.15))) then (DSPFONT DIGFONT S) (CENTERPRINTINREGION "BN" (CREATEREGION (MINUS XC) (MINUS (QUOTIENT (TIMES YC 4) 5)) WIDTH (QUOTIENT (TIMES YC 4) 5)) S)) (SETQ DIGFONT (BICLOCKFINDFONT (CL:* R (if (NUMBERP MARKMODE) then 0.2 else 0.25)) ROMANDIGS)) (DSPFONT DIGFONT S) (DSPOPERATION 'PAINT S) (* ; "Generate background Hour Marks") (for H from 1 to 12 as V from 60 by -30 bind SYM do (BLOCK) (SETQ HX (COS V)) (SETQ HY (SIN V)) (if (AND (NUMBERP MARKMODE) (ZEROP (IMOD (CL:* H 5) MARKMODE))) then (DRAWLINE (CL:* HX MARKUR) (CL:* HY MARKUR) (CL:* HX MARKLR) (CL:* HY MARKLR) MARKW 'REPLACE S)) (if (AND DIGFONT (NUMBERP DIGMODE) (ZEROP (IMOD H DIGMODE))) then (SETQ SYM (if ROMANDIGS then (CAR (NTH '(˙ďÁ˙ ˙ďÂ˙ ˙ďĂ˙ ˙ďÄ˙ ˙ďĹ˙ ˙ďĆ˙ ˙ďÇ˙ ˙ďČ˙ ˙ďÉ˙ ˙ďĘ˙ ˙ďĘÁ˙ ˙ďĘÂ˙) H)) else H)) (MOVETO (- (CL:* HX DIGW) (QUOTIENT (STRINGWIDTH SYM S) 2)) (- (CL:* HY DIGW) (if ROMANDIGS then (- (QUOTIENT (FONTPROP S 'HEIGHT) 2) (FONTPROP S 'DESCENT)) else (QUOTIENT (FONTPROP S 'ASCENT) 2))) S) (PRIN1 SYM S))) (* ;  "Generate background Second Marks") (for I from 0 to 59 as V from 90 by -6 do (BLOCK) (SETA SX I (FIX (CL:* (SETQ MX (COS V)) SECR))) (SETA SY I (FIX (CL:* (SETQ MY (SIN V)) SECR))) (if (AND (NUMBERP MARKMODE) (ZEROP (IMOD I MARKMODE))) then (DRAWLINE (CL:* MX SECR) (CL:* MY SECR) (CL:* MX MARK1LR) (CL:* MY MARK1LR) MARK1W 'REPLACE S))) (BLOCK) (FILLCIRCLE 0 0 DOTR BLACKSHADE S) (* ;  "Let this be the Background to be used in the loop") (BITBLT BM NIL NIL BG) (* ;  "Determine a reference point for millisecond clock, that is half a second ahead...") (while (= (DAYTIME) T1) bind (T1 _ (DAYTIME)) do (BLOCK) finally (SETQ REF (IPLUS (CLOCK 0) 500))) do (BITBLT BG NIL NIL BM) (* ;  "Compute number of seconds since midnight") (SETQ NOW (DAYTIME)) (SETQ SECS (with UPTIMEREC (\UNPACKDATE (if ADJUSTALARM then ALARMTIME else NOW)) (IPLUS (CL:* HOUR 3600) (CL:* MINUTE 60) SECOND))) (if SLOWMODE then (BLOCK)) (* ; "Draw Hour Arm") (COND ((EQP HP (IQUOTIENT SECS 120)) (DRAWLINE 0 0 HX HY HOURW 'REPLACE S)) (T (DRAWLINE 0 0 (SETQ HX (FIX (CL:* (SIN (SETQ HP (IQUOTIENT SECS 120))) HOURR))) (SETQ HY (FIX (CL:* (COS HP) HOURR))) HOURW 'REPLACE S))) (if SLOWMODE then (BLOCK)) (* ; "Draw Minute Arm") (COND ((EQP MP (IQUOTIENT SECS 10)) (DRAWLINE 0 0 MX MY MINW 'REPLACE S)) (T (DRAWLINE 0 0 (SETQ MX (FIX (CL:* (SIN (SETQ MP (IQUOTIENT SECS 10))) MINR))) (SETQ MY (FIX (CL:* (COS MP) MINR))) MINW 'REPLACE S))) (if SLOWMODE then (BLOCK)) (* ; "Draw Seconds Arm") (COND ((NOT NOSEC) (DRAWLINE 0 0 (ELT SX (IMOD SECS 60)) (ELT SY (IMOD SECS 60)) SECW 'REPLACE S))) (* ; "Now, Generate The Shadow") (if SLOWMODE then (BLOCK)) [SELECTQ COLORMODE (SHADOW (BITBLT BM NIL NIL SHADOW) [for DX from 0 to 1 do (for DY from -2 to 0 do (if SLOWMODE then (BLOCK)) (BITBLT SHADOW NIL NIL SHADOW DX DY NIL NIL 'INPUT 'PAINT) when (OR (NEQ DX 0) (NEQ DY 0]) (PROGN (BITBLT BM NIL NIL SHADOW) (for DX from -1 to 1 do (for DY from -1 to 1 do (if SLOWMODE then (BLOCK)) (BITBLT SHADOW NIL NIL SHADOW DX DY NIL NIL 'INPUT 'PAINT) when (OR (NEQ DX 0) (NEQ DY 0] (if SLOWMODE then (BLOCK)) (* ; "Find the Real background") (TOTOPW W) (BITBLT (WINDOWPROP W 'IMAGECOVERED) NIL NIL BM1) (BITBLT SHADOW NIL NIL BM1 NIL NIL NIL NIL 'INPUT (SELECTQ COLORMODE ((WHITE SHADOW) 'PAINT) (BLACK 'ERASE) NIL)) (if SLOWMODE then (BLOCK)) (BITBLT BM NIL NIL BM1 NIL NIL NIL NIL 'INPUT (SELECTQ COLORMODE ((WHITE SHADOW) 'ERASE) (BLACK 'PAINT) NIL)) (* ; "Now, at last, Output it") (BITBLT BM1 NIL NIL W NIL NIL NIL NIL (if INVERTFLG then 'INVERT else 'INPUT) 'REPLACE) [if SLOWMODE then (if [AND CHIMEMODE (OR (NULL LASTCHIME) (NOT (= (IQUOTIENT LASTCHIME (CL:* CHIMEMODE 60)) (IQUOTIENT SECS (CL:* CHIMEMODE 60] then (if LASTCHIME then (SETQ CHIMECOUNT (if (= (IMOD (IQUOTIENT SECS 60) 60) 0) then (IPLUS (IMOD (- (IQUOTIENT SECS (CL:* 60 60)) 1) 12) 1) else 1))) (SETQ LASTCHIME SECS)) (if (> CHIMECOUNT 0) then (add CHIMECOUNT -1) (BEEPON 440) (BLOCK 25) (BEEPON 220) (BLOCK 25) (BEEPOFF)) (for N from 1 to (COND (SMODE 10) (T 1)) bind (DEL _ (COND ((OR SMODE (AND ALARMTIME (<= ALARMTIME NOW)) (> CHIMECOUNT 0)) 1000) (T 60000))) until (OR ADJUSTALARM (AND ALARMTIME (<= ALARMTIME NOW) )) repeatwhile (AND NOSEC (> MEAN LIMIT)) do (BLOCK (- DEL (IMOD (- (CLOCK 0) REF) DEL))) (SETQ CL0 (CLOCK 0)) (BLOCK) (SETQ MEAN (IQUOTIENT (IPLUS (CL:* MEAN 8) (CL:* (IMAX (IMIN (- (CLOCK 0) CL0) 500) 0) 2)) 10] (SETQ SLOWMODE (NOT ADJUSTALARM)) (SETQ SMODE SECONDSMODE) (SETQ NOSEC (AND (OR (NOT SMODE) (> MEAN LIMIT)) (NOT ADJUSTALARM))) (SETQ INVERTFLG (if (AND ALARMTIME (ILEQ ALARMTIME NOW)) then (BEEPON (if INVERTFLG then 440 else 880)) (BLOCK 50) (BEEPOFF) (NOT INVERTFLG) elseif ADJUSTALARM then (AWAIT.EVENT ADJUSTEVENT) NIL)) (SETQ LIMIT (IMIN (if (> LIMIT (/ (CL:* MEAN 10) 9)) then (- LIMIT 1) else (+ LIMIT 1)) 50]) (BICLOCKRPFN [LAMBDA (W) (WAKE.PROCESS (WINDOWPROP W 'PROCESS]) (BICLOCKRSFN [LAMBDA (W) (* lmm "24-Oct-86 15:17") (RESTART.PROCESS (WINDOWPROP W 'PROCESS]) (BICLOCKSETALARM [LAMBDA (W) (* lmm "24-Oct-86 15:21") (LET [(M (OR (WINDOWPROP W 'ADJUSTMENUW) (MENUWINDOW (create MENU ITEMS _ `(("
") ("") ("") ,@[for I1 in '(24 12 3 1 -1 -3 -12 -24) as I2 in '(30 15 5 1 -1 -5 -15 -30) join (for QQQ in '(T NIL NIL) as SCALE in (CONSTANT (LIST (TIMES 60 60) 60 1)) as HELP in '("Will Increment/Decrement Hours by that Amount" "Will Increment/Decrement Minutes by that Amount" "Will Increment/Decrement Seconds by that Amount") collect (LET ((I (if QQQ then I1 else I2))) (LIST I (LIST (FUNCTION BICLOCKSETALARM1) (KWOTE W) (KWOTE (TIMES I SCALE))) HELP] ("OK!" (BICLOCKSETALARM2 ,(KWOTE W)) "Will Exit Adjust Mode") ("_0" (BICLOCKSETALARM1 ,(KWOTE W) 3600 T) "Will Reset Alarm Time to Hr:00:00") ("_0" (BICLOCKSETALARM1 ,(KWOTE W) 60 T) "Will Reset Alarm Time to Hr:Min:00")) TITLE _ "Adjust Alarm" CENTERFLG _ T MENUCOLUMNS _ 3] (WINDOWPROP W 'ADJUSTMENUW M) (ATTACHWINDOW M W 'BOTTOM 'JUSTIFY) (with BICLOCKPARMS (WINDOWPROP W 'PARMS) (SETQ ALARMTIME (OR ALARMTIME (PLUS (DAYTIME) 60))) (SETQ ADJUSTALARM T) (NOTIFY.EVENT ADJUSTEVENT) (PROMPTPRINT (GDATE ALARMTIME]) (BICLOCKSETALARM1 [LAMBDA (W DSEC MODULOFLG) (* lmm "24-Oct-86 15:21") (with BICLOCKPARMS (WINDOWPROP W 'PARMS) [LET [(OLDTIME (OR ALARMTIME (PLUS (DAYTIME) 60] (SETQ ALARMTIME (if MODULOFLG then (DIFFERENCE OLDTIME (IMOD (with UPTIMEREC (\UNPACKDATE ALARMTIME) (IPLUS (ITIMES HOUR 3600) (ITIMES MINUTE 60) SECOND)) DSEC)) else (IPLUS OLDTIME DSEC] (NOTIFY.EVENT ADJUSTEVENT) (PROMPTPRINT (GDATE ALARMTIME]) (BICLOCKSETALARM2 [LAMBDA (W) (* lmm "24-Oct-86 15:17") (with BICLOCKPARMS (WINDOWPROP W 'PARMS) (SETQ ADJUSTALARM NIL) (NOTIFY.EVENT ADJUSTEVENT) (DETACHWINDOW (WINDOWPROP W 'ADJUSTMENUW)) (CLOSEW (WINDOWPROP W 'ADJUSTMENUW]) (IDLE.BICLOCK [LAMBDA (W) (* BKN "17-Jun-86 14:22") (RESETLST (LET ((BW (BICLOCK BICLOCKIDLEPROPS))) (RESETSAVE NIL (LIST (FUNCTION CLOSEW) BW)) (while T do (BLOCK 5000) (if (NEQ (\GETBASEPTR BW 2) W) then (TOTOPW W)) (MOVEW BW [RAND 0 (DIFFERENCE SCREENWIDTH (WINDOWPROP BW 'WIDTH] (RAND 0 (DIFFERENCE SCREENHEIGHT (WINDOWPROP BW 'HEIGHT]) ) (DECLARE%: EVAL@COMPILE (DATATYPE BICLOCKPARMS (SECONDSMODE COLORMODE MARKMODE DIGMODE CHIMEMODE ROMANDIGS ALARMTIME ADJUSTALARM ADJUSTEVENT)) (RECORD UPTIMEREC (YEAR MONTH DAY HOUR MINUTE SECOND QQQ)) ) (/DECLAREDATATYPE 'BICLOCKPARMS '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((BICLOCKPARMS 0 POINTER) (BICLOCKPARMS 2 POINTER) (BICLOCKPARMS 4 POINTER) (BICLOCKPARMS 6 POINTER) (BICLOCKPARMS 8 POINTER) (BICLOCKPARMS 10 POINTER) (BICLOCKPARMS 12 POINTER) (BICLOCKPARMS 14 POINTER) (BICLOCKPARMS 16 POINTER)) '18) (RPAQ? BICLOCKWINDOW ) (RPAQ? BICLOCKDEFAULTPROPS '(SECONDS T COLOR SHADOW MARKS NIL DIGITS 1 CHIME NIL ALARM NIL SIZE 152 HORIZONTAL LEFT-OF-LOGO VERTICAL TOP CREATE T)) (RPAQ? BICLOCKUSERPROPS ) (RPAQ? BICLOCKINITIALPROPS ) (RPAQ? BICLOCKIDLEPROPS '(HORIZONTAL CENTER VERTICAL CENTER)) (CL:PROCLAIM '(CL:SPECIAL BICLOCKWINDOW BICLOCKDEFAULTPROPS BICLOCKUSERPROPS BICLOCKINITIALPROPS BICLOCKIDLEPROPS)) (DECLARE%: DONTEVAL@LOAD DOCOPY (RPAQ BICLOCKWINDOW (BICLOCK BICLOCKINITIALPROPS)) ) (ADDTOVAR IDLE.FUNCTIONS (Biclock 'IDLE.BICLOCK)) (ADDTOVAR IDLE.SUSPEND.PROCESS.NAMES BICLOCKPROCESS) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA BICLOCK) ) (PUTPROPS BICLOCK COPYRIGHT ("Bernt Nilsson @ University of Linkoeping" 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1744 36493 (BICLOCK 1754 . 7779) (BICLOCKBEFN 7781 . 13339) (BICLOCKCFN 13341 . 13412) (BICLOCKFINDFONT 13414 . 14853) (BICLOCKNRFN 14855 . 16271) (BICLOCKPROCESS 16273 . 32113) ( BICLOCKRPFN 32115 . 32188) (BICLOCKRSFN 32190 . 32347) (BICLOCKSETALARM 32349 . 34451) ( BICLOCKSETALARM1 34453 . 35474) (BICLOCKSETALARM2 35476 . 35811) (IDLE.BICLOCK 35813 . 36491))))) STOP \ No newline at end of file diff --git a/lispusers/BICLOCK.TEDIT b/lispusers/BICLOCK.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..45e8802a2742be73e96e54edbeb1405356ee38ff GIT binary patch literal 12352 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 literal 0 HcmV?d00001 diff --git a/lispusers/BIGGER-FONT b/lispusers/BIGGER-FONT new file mode 100644 index 00000000..8403b9f0 --- /dev/null +++ b/lispusers/BIGGER-FONT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "26-Jan-89 11:18:56" {QV}LISP>BIGGER-FONT.;5 2459 changes to%: (VARS BIGGER-FONTCOMS) previous date%: "25-Jan-89 12:04:51" {QV}LISP>BIGGER-FONT.;4) (* " Copyright (c) 1989 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT BIGGER-FONTCOMS) (RPAQQ BIGGER-FONTCOMS ((ALISTS (FONTDEFS BIGGER)) (DECLARE%: DONTEVAL@LOAD DOCOPY (APPENDVARS (FONTVARS (ARBUTTONFONT BIGFONT) (ARBOLDFONT BOLDFONT) (ARFONT TEXTFONT) (*WHO-LINE-NAME-FONT* BOLDFONT T) (*WHO-LINE-VALUE-FONT* DEFAULTFONT T) (FB.ICONFONT LITTLEFONT) (FB.BROWSERFONT DEFAULTFONT) (FB.PROMPTFONT DEFAULTFONT) (FB.MENUFONT MENUFONT) (LAFITEEDITORFONT TEXTFONT) (LAFITEENDOFMESSAGEFONT COMMENTFONT) (LAFITEMSGICONFONT LITTLEFONT) (LAFITEBROWSERFONT DEFAULTFONT) (LAFITEFIXEDWIDTHFONT NIL) (LAFITETITLEFONT BIGFONT) (LAFITEMENUFONT MENUFONT) (LAFITE.FOLDER.MENU.FONT MENUFONT) (LAFITEDISPLAYFONT TEXTFONT T) ((NLSETQ (SEDIT:RESET))) ((NLSETQ (FILEWATCHPROP (QUOTE FONT) TINYFONT))))) (P (IF (>= SCREENWIDTH 1400) THEN (FONTSET (QUOTE BIGGER) T)))))) (ADDTOVAR FONTDEFS (BIGGER (FONTPROFILE (DEFAULTFONT 1 (TERMINAL 12) (GACHA 8) (TERMINAL 8)) (ITALICFONT 1 (HELVETICA 12 MIR) (GACHA 8 MIR) (MODERN 8 MIR)) (BOLDFONT 2 (HELVETICA 12 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR)) (LITTLEFONT 3 (HELVETICA 10) (HELVETICA 6 MIR) (MODERN 8 MIR)) (TINYFONT 6 (GACHA 10) (GACHA 6) (TERMINAL 6)) (BIGFONT 4 (HELVETICA 14 BRR) NIL (MODERN 10 BRR)) (MENUFONT 5 (HELVETICA 12)) (COMMENTFONT 6 (HELVETICA 12) (HELVETICA 8) (MODERN 8)) (TEXTFONT 7 (TIMESROMAN 12) NIL (CLASSIC 10))))) (DECLARE%: DONTEVAL@LOAD DOCOPY (APPENDTOVAR FONTVARS (ARBUTTONFONT BIGFONT) (ARBOLDFONT BOLDFONT) (ARFONT TEXTFONT) (*WHO-LINE-NAME-FONT* BOLDFONT T) (*WHO-LINE-VALUE-FONT* DEFAULTFONT T) (FB.ICONFONT LITTLEFONT) (FB.BROWSERFONT DEFAULTFONT) (FB.PROMPTFONT DEFAULTFONT) (FB.MENUFONT MENUFONT) (LAFITEEDITORFONT TEXTFONT) (LAFITEENDOFMESSAGEFONT COMMENTFONT) (LAFITEMSGICONFONT LITTLEFONT) (LAFITEBROWSERFONT DEFAULTFONT) (LAFITEFIXEDWIDTHFONT NIL) (LAFITETITLEFONT BIGFONT) (LAFITEMENUFONT MENUFONT) (LAFITE.FOLDER.MENU.FONT MENUFONT) (LAFITEDISPLAYFONT TEXTFONT T) ((NLSETQ (SEDIT:RESET))) ((NLSETQ (FILEWATCHPROP (QUOTE FONT) TINYFONT))) ) (IF (>= SCREENWIDTH 1400) THEN (FONTSET (QUOTE BIGGER) T)) ) (PUTPROPS BIGGER-FONT COPYRIGHT ("Xerox Corporation" 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/BITMAP-GALLERY b/lispusers/BITMAP-GALLERY new file mode 100644 index 00000000..75c34eae --- /dev/null +++ b/lispusers/BITMAP-GALLERY @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "XCL-USER" READTABLE "XCL" BASE 10) (il:filecreated "17-Aug-89 14:12:04" il:|{FS8:PARC:XEROX}LISP>USERS>BITMAP-GALLERY.;12| 122749 il:|changes| il:|to:| (il:vars il:bitmap-gallerycoms) (il:fns il:rbg) il:|previous| il:|date:| "23-Mar-88 17:08:02" il:|{FS8:PARC:XEROX}LISP>USERS>BITMAP-GALLERY.;11|) ; Copyright (c) 1987, 1988, 1989 by Gregg Foster. All rights reserved. (il:prettycomprint il:bitmap-gallerycoms) (il:rpaqq il:bitmap-gallerycoms ((il:* il:|;;;| "New file") (il:declare\: il:dontcopy (il:props (il:bitmap-gallery il:makefile-environment) (il:bitmap-gallery il:filetype)) (il:coms (il:* il:|;;| "(il:|MakePseudoRandomBitmap) from Granite is useful for generating bitmaps") (il:files (il:from il:|{FS8:}Lisp>USERS>|) il:granite) (il:fns il:rbg il:fabricize) (il:* il:|;;| " Stu's old Rooms bitmaps") (il:bitmaps il:room.bm il:line1.bm il:line2.bm il:line3.bm il:line4.bm il:line5.bm il:square1.bm il:square2.bm il:square3.bm il:square4.bm il:square5.bm il:square6.bm il:square7.bm il:square8.bm il:square9.bm il:shirt1.bm il:curly il:curly1 il:woven il:woven1 il:woven2 il:woven3) (il:* il:|;;| "Stan's Wallpapers and room backgrounds") (il:bitmaps il:wallpaper il:lightwallpaper il:darkwallpaper il:*stamp-bitmap* il:*phone-bitmap*) (il:* il:|;;| " Andreas' Avants") (il:bitmaps il:avantbackground0 il:avantbackground1 il:avantbackground2 il:avantbackground3 il:avantbackground4 il:avantbackground5 il:avantbackground6 il:avantbackground7 il:avantbackground8 il:avantbackground9 il:avantbackground10 il:avantbackground11) (il:* il:|;;| "Other bitmaps") (il:bitmaps *eye-bm* *fract-bm* *mandala-bm* *static1-bm* *static2-bm*) (il:* il:|;;| "Some new ones") (il:* il:|;;| "*random-bm* is rather large, pieces of it might be useful") (il:bitmaps *tessel-bm* *random-bm*) (il:bitmaps *granite-light-bm* *granite-medium-bm* *granite-dark-bm* *tweed-bm* *chambray-bm* *canvas-bm* *corduroy-bm* *seersucker-bm* *burlap-bm*) (il:vars il:defaultscreenshade il:grayshade il:grayshade1 il:grayshade2 il:grayshade3 il:grayshade4 (il:plainshade 23130) (il:wave-texture 26880) (il:wave2-texture 27010) (il:mesh-texture 51219) (il:di-texture 33810) (il:dark-di-texture 31725)))))) (il:* il:|;;;| "New file") (il:declare\: il:dontcopy (il:putprops il:bitmap-gallery il:makefile-environment (:package "XCL-USER" :readtable "XCL" :base 10)) (il:putprops il:bitmap-gallery il:filetype :compile-file) (il:* il:|;;| "(il:|MakePseudoRandomBitmap) from Granite is useful for generating bitmaps") (il:filesload (il:from il:|{FS8:}Lisp>USERS>|) il:granite) (il:defineq (il:rbg (il:lambda (il:|bgList|) (il:* il:\; "Edited 17-Aug-89 14:04 by gsf") (let* ((il:|bgs| (or il:|bgList| (quote (il:plainshade il:grayshade il:di-texture il:dark-di-texture *tessel-bm* *random-bm* *granite-light-bm* *granite-medium-bm* *granite-dark-bm* il:lightwallpaper il:wallpaper il:darkwallpaper il:avantbackground0 il:avantbackground1 il:avantbackground2 il:avantbackground5 il:avantbackground7 il:avantbackground8 il:line4.bm il:line5.bm il:square4.bm il:square6.bm il:square8.bm il:square9.bm il:shirt1.bm il:woven2 il:woven3 *mandala-bm* *tweed-bm* *burlap-bm* *canvas-bm*)))) (il:|bg| (il:eval (car (il:nth il:|bgs| (il:rand 1 (il:length il:|bgs|))))))) (il:changebackground il:|bg|))) ) (il:fabricize (il:lambda (il:|bm| il:|weave|) (il:* il:\; "Edited 22-Mar-88 17:37 by gsf") (let* ((il:|bm| (il:bitmapcopy il:|bm|)) (il:|width| (il:bitmapwidth il:|bm|)) (il:|height| (il:bitmapheight il:|bm|))) (case il:|weave| (1 (il:bltshade 2570 il:|bm| 0 0 il:|width| il:|height| (quote il:erase))) (2 (il:bltshade 204 il:|bm| 0 0 il:|width| il:|height| (quote il:erase))) (t (il:bltshade (il:rand 64000) il:|bm| 0 0 il:|width| il:|height| (quote il:erase)))) il:|bm|)) ) ) (il:* il:|;;| " Stu's old Rooms bitmaps") (il:rpaqq il:room.bm #*(50 35)L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@@@@@@@@@@@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOOL@@@) (il:rpaqq il:line1.bm #*(22 16)JJJJJH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@EEEEED@@) (il:rpaqq il:line2.bm #*(28 54)@@@@@@@@OOOOOOO@OOOOOOO@@@@@@@@@@@@@@@@@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@EEEEEEE@JJJJJJJ@) (il:rpaqq il:line3.bm #*(26 68)OOOOOOL@BA@@@H@@@@A@@@H@B@@A@@@@DB@@A@@@@@B@@A@@D@@B@@@@HD@@B@@@@@@@@@@@OOOOOOL@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@EEEEEED@JJJJJJH@MEEEEED@JJJJJJH@OOOOOOL@OOOOOOL@OOOOOOL@OOOOOOL@OOOOOOL@OOOOOOL@EMEEEED@OOOOOOL@EEEEEED@OOOOOOL@EMEEEED@OOOOOOL@EEEEEED@OOOOOOL@EMEEEED@OOOOOOL@EEEEEED@OOOOOOL@EMEEEED@OOOOOOL@OOOOOOL@) (il:rpaqq il:line4.bm #*(20 24)OOOOO@@@OOOOO@@@JJJJJ@@@EEEEE@@@JJJJJ@@@EEEEE@@@OOOOO@@@OOOOO@@@JJJJJ@@@EEEEE@@@JJJJJ@@@EEEEE@@@OOOOO@@@OOOOO@@@JJJJJ@@@EEEEE@@@JJJJJ@@@EEEEE@@@OOOOO@@@OOOOO@@@JJJJJ@@@EEEEE@@@JJJJJ@@@EEEEE@@@) (il:rpaqq il:line5.bm #*(12 12)GEM@NKJ@MGE@JNK@EMG@KJN@GEM@NKJ@MGE@JNK@EMG@KJN@) (il:rpaqq il:square1.bm #*(50 50)@@@@@@@@@@@@L@@@@@@@@@@@@@@@L@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEED@@@GOOOOOOOOOOOL@@@GOOOOOOOOOOOL@@@) (il:rpaqq il:square2.bm #*(50 50)@@@@@@@@@@@@D@@@H@@@@@@@@@@@L@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@EEEEEEEEEEEEL@@@GOOOOOOOOOOOL@@@GOOOOOOOOOOOL@@@) (il:rpaqq il:square3.bm #*(50 50)@@@@@@@@@@@@D@@@H@@@@@@@@@@@L@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@BJJJJJJJJJJJL@@@AEEEEEEEEEEEL@@@COOOOOOOOOOOL@@@GOOOOOOOOOOOL@@@) (il:rpaqq il:square4.bm #*(72 76)EEEEEEEEEEEEEEEEEE@@JJJJJJJJJJJJJJJJJJ@@EEEEEEEEEEEEEEEEEE@@JJJJJJJJJJJJJJJJJJ@@EEEEEEEEEEEEEEEEEE@@JJJJJJJJJJJJJJJJJJ@@EEEEEEEEEEEEEEEEEE@@JOOOOOOOOOOOOOOOOJ@@EOOOOOOOOOOOOOOOOM@@JOOOOOOOOOOOOOOOLJ@@EOOOOOOOOOOOOOOOLM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJOOOOOOOOOOJJHJ@@EOEEOOOOOOOOOOMEHM@@JOJJOOOOOOOOOLJJHJ@@EOEEOOOOOOOOOHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJKOOOOJJHJJHJ@@EOEEOEEOOOOEEHMEHM@@JOJJOJKOOOIJJHJJHJ@@EOEEOEEOOOAEEHMEHM@@JOJJOJKNJKAJJHJJHJ@@EOEEOEEOEEAEEHMEHM@@JOJJOJKNJKAJJHJJHJ@@EOEEOEEOEEAEEHMEHM@@JOJJOJKNJKAJJHJJHJ@@EOEEOEEOEEAEEHMEHM@@JOJJOJKNJKAJJHJJHJ@@EOEEOEEOEEAEEHMEHM@@JOJJOJKOOOAJJHJJHJ@@EOEEOEEL@@IEEHMEHM@@JOJJOJKH@@EJJHJJHJ@@EOEEOEEH@@AEEHMEHM@@JOJJOJKOOOOJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOJJJJJJJJHJJHJ@@EOEEOEEEEEEEEHMEHM@@JOJJOOOOOOOOOHJJHJ@@EOEEO@@@@@@@@DMEHM@@JOJJN@@@@@@@@BJJHJ@@EOEEL@@@@@@@@@MEHM@@JOJJOOOOOOOOOOJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOJJJJJJJJJJJJJJHJ@@EOEEEEEEEEEEEEEEHM@@JOOOOOOOOOOOOOOOHJ@@EN@@@@@@@@@@@@@@DM@@JL@@@@@@@@@@@@@@BJ@@EH@@@@@@@@@@@@@@@M@@JOOOOOOOOOOOOOOOOJ@@EEEEEEEEEEEEEEEEEE@@JJJJJJJJJJJJJJJJJJ@@EEEEEEEEEEEEEEEEEE@@JJJJJJJJJJJJJJJJJJ@@) (il:rpaqq il:square5.bm #*(122 122)OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@CL@H@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJ@@@@@@@@@@@@@@@@JJJJJJOL@HAEEEEE@@@@@@@@@@@@@@@AMEEEEEOL@HBJJJJJ@@@@@@@@@@@@@@@CJJJJJJOL@HAEEEEE@@@@@@@@@@@@@@@CMEEEEEOL@HBJJJJJ@OOOOOOOOOOOOOOOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEE@@@@@@@AEEEGMEEEEEOL@HBJJJJJ@JJJH@@@@@@CJJJOJJJJJJOL@HAEEEEE@MEE@@@@@@@GEEEGMEEEEEOL@HBJJJJJ@JJJHOOOOOOOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJJJJJOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJJJJJOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJH@@BJOJJJOJJJJJJOL@HAEEEEE@MEE@MD@@AEGEEEGMEEEEEOL@HBJJJJJ@JJJHJHOONJOJJJOJJJJJJOL@HAEEEEE@MEE@MDMEGEGEEEGMEEEEEOL@HBJJJJJ@JJJHJHJKNJOJJJOJJJJJJOL@HAEEEEE@MEE@MDLAGEGEEEGMEEEEEOL@HBJJJJJ@JJJHJHJNNJOJJJOJJJJJJOL@HAEEEEE@MEE@MDLOGEGEEEGMEEEEEOL@HBJJJJJ@JJJHJHJNNJOJJJOJJJJJJOL@HAEEEEE@MEE@MDMEGEGEEEGMEEEEEOL@HBJJJJJ@JJJHJHJJNJOJJJOJJJJJJOL@HAEEEEE@MEE@MDOOOEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJOONJOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJJJJJOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJJJJJOJJJOJJJJJJOL@HAEEEEE@MEE@MEEEEEGEEEGMEEEEEOL@HBJJJJJ@JJJHJJJJJJOJJJOJJJJJJOL@HAEEEEE@MEEAOOOOOOOEEEGMEEEEEOL@HBJJJJJ@JJJKOOOOOOOJJJOJJJJJJOL@HAEEEEE@MEEEOOOOOOOEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@MEEEEEEEEEEEEEGMEEEEEOL@HBJJJJJ@JJJJJJJJJJJJJJOJJJJJJOL@HAEEEEE@OOOOOOOOOOOOOOOMEEEEEOL@HBJJJJJ@OOOOOOOOOOOOOOOJJJJJJOL@HAEEEEEAOOOOOOOOOOOOOOOMEEEEEOL@HBJJJJJCOOOOOOOOOOOOOOOJJJJJJOL@HAEEEEEGOOOOOOOOOOOOOOOMEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJJOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HBJJJJJJJJJJJJJJJJJJJJJJJJJJKOL@HAEEEEEEEEEEEEEEEEEEEEEEEEEEEOL@HCOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@HGOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@HOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@IOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@KOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@) (il:rpaqq il:square6.bm #*(66 66)JJJJJJJJJJJJJJJJH@@@EEEEEEEEEEEEEEEED@@@H@@@@@@@@@@@@@@@H@@@D@@@@@@@@@@@@@@AD@@@H@@@@@@@@@@@@@@CH@@@D@@@@@@@@@@@@@@GD@@@HCOOOOOOOOOOOOOOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HBJJJJJJJJJJJJJOH@@@DCEEEEEEEEEEEEEOD@@@HCOOOOOOOOOOOOOOH@@@DGOOOOOOOOOOOOOOD@@@HOOOOOOOOOOOOOOOH@@@EOOOOOOOOOOOOOOOD@@@JJJJJJJJJJJJJJJJH@@@EEEEEEEEEEEEEEEED@@@) (il:rpaqq il:square7.bm #*(26 26)@@@@@@@@H@@@@@D@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@BJJJJJL@AEEEEED@COOOOOL@GOOOOOL@) (il:rpaqq il:square8.bm #*(24 24)HJJJJJ@@EEEAEE@@@@@@@@@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@@@@@@@@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@HJJJJJ@@EEEAEE@@) (il:rpaqq il:square9.bm #*(16 18)JJJJGEGEOOOOGEGEJJJJGEGEJJJJGEGEJJJJGEGEOOOOGEGEJJJJGEGEJJJJGEGEJJJJGEGE) (il:rpaqq il:shirt1.bm #*(21 8)ADBHE@@@@JADBH@@ADBHE@@@@JADBH@@ADBHE@@@@JADBH@@ADBHE@@@@JADBH@@) (il:rpaqq il:curly #*(80 80)L@DL@@@@@AL@DL@@@@@BH@DF@@@@@AH@DF@@@@@CH@DCH@@@@AH@DC@@@@@A@@D@OON@@A@@DAOON@@A@@D@@@CH@A@@D@@@CH@A@@D@@@CL@A@@D@@@CL@A@@D@@@NF@A@@D@@@NF@A@@D@@AHB@A@@D@@AHB@A@@L@@C@C@A@@L@@C@C@A@@H@@B@A@A@@H@@B@A@A@AH@@F@A@AHAH@@F@A@A@C@@@D@A@@HC@@@D@A@A@N@@@D@A@@LN@@@D@A@@OH@@@D@A@@GH@@@D@A@@CH@@@D@A@@CH@@@D@A@@@OON@D@A@@@OON@D@A@@@@@CHD@C@@@@@CHD@C@@@@@@LD@C@@@@@@LD@C@@@@@@FD@GH@@@@@FD@GH@@@@@BD@DH@@@@@BD@DH@@@@@CL@DL@@@@@CL@DL@@@@@AH@DF@@@@@AH@DF@@@@@AH@DCH@@@@AH@DCHON@@C@@D@OON@@C@@D@O@CH@N@@D@@@B@@N@@D@@@COOH@@D@@@COOH@@D@@@N@@@@@D@@@N@@@@@D@@AH@@@@@D@@AH@@@@@D@@C@@@@@@L@@C@@@@@@L@@B@@@@@@H@@B@@@@@@H@@F@@@@@AH@@F@@@@@AH@@D@@@@@C@@@D@@@@@C@@@D@@@@@N@@@D@@@@@N@@@D@@COOH@@@D@@COOH@@@D@@N@CH@@@D@@N@CH@@@D@AH@@OON@D@AH@@OON@D@C@@@@@CHD@C@@@@@CHD@C@@@@@@LD@C@@@@@@LD@GH@@@@@FD@GH@@@@@FD@DH@@@@@BD@DH@@@@@BL@DL@@@@@CL@DL@@@@@CH@DF@@@@@AH@DF@@@@@AH@DCH@@@@AH@DCH@@@@A@@D@OON@@A@@D@OON@@A@@D@@@CH@A@@D@@@CH@A@@D@@@CL@A@@D@@@CL@A@@D@@@NF@A@@D@@@NF@A@@D@@AHB@A@@D@@AHB@A@@L@@C@C@A@@L@@C@C@A@@H@@B@A@A@@H@@B@A@AHAH@@F@A@AHAH@@F@A@AHC@@@D@A@@HC@@@D@A@@LN@@@D@A@@NN@@@D@A@@GL@@@D@A@@GH@@@D@A@@CH@@@D@A@@CH@@@D@A@@@OON@D@A@@@OON@D@A@@@@@CHD@C@@@@@CHD@C@@@@@@LD@C@@@@@@LD@C@@@@@@FD@GH@@@@@FD@GH@@@@@BD@DH@@@@@BD@DH@@@@@CL@DL@@@@@CL@DL@@@@@AH@DF@@@@@AH@DF@@@@@AH@DCH@@@@AH@DCHON@@C@@D@OON@@C@@D@O@CH@N@@D@@@CH@N@@D@@@COOH@@D@@@COOH@@D@@@N@@@@@D@@@N@@@@@D@@AH@@@@@D@@AH@@@@@D@@C@@@@@@L@@C@@@@@@D@@B@@@@@@H@@B@@@@@@L@@F@@@@@AH@@F@@@@@@H@@D@@@@@C@@@D@@@@@AH@@D@@@@@N@@@D@@@@@G@@@D@@COOH@@@D@@COOL@@@D@@N@CH@@@D@@N@B@@@@D@AH@@OON@D@AH@CH@@@D@C@@@@@CHD@C@@@OON@D@C@@@@@@LD@C@@@@@CHD@GH@@@@@FD@GH@@@@@LD@DH@@@@@BD@DH@@@@@F) (il:rpaqq il:curly1 #*(80 80)L@GL@@@@@AL@GL@@@@@CH@GN@@@@@AH@GN@@@@@CH@GOH@@@@AH@GO@@@@@A@@GOOON@@A@@GOOON@@A@@GOOOOH@A@@GOOOOH@A@@GOOOOL@A@@GOOOOL@A@@GOOONF@A@@GOOONF@A@@GOOOHB@A@@GOOOHB@A@@OOOO@C@A@@OOOO@C@A@@OOON@A@A@@OOON@A@A@AOOON@A@AHAOOON@A@A@COOOL@A@@HCOOOL@A@A@OOOOL@A@@LOOOOL@A@@OOOOOL@A@@GOOOOL@A@@COOOOL@A@@COOOOL@A@@@OOOOL@A@@@OOOOL@A@@@@@COL@C@@@@@COL@C@@@@@@OL@C@@@@@@OL@C@@@@@@GL@GH@@@@@GL@GH@@@@@CL@GH@@@@@CL@GH@@@@@CL@GL@@@@@CL@GL@@@@@AH@GN@@@@@AH@GN@@@@@AH@GOH@@@@AH@GOHON@@C@@GOOON@@C@@GOOOOH@N@@GOOON@@N@@GOOOOOOH@@GOOOOOOH@@GOOON@@@@@GOOON@@@@@GOOOH@@@@@GOOOH@@@@@GOOO@@@@@@OOOO@@@@@@OOON@@@@@@OOON@@@@@@OOON@@@@@AOOON@@@@@AOOOL@@@@@COOOL@@@@@COOOL@@@@@OOOOL@@@@@OOOOL@@COOOOOOL@@COOOOOOL@@N@COOOOL@@N@COOOOL@AH@@OOOOL@AH@@OOOOL@C@@@@@COL@C@@@@@COL@C@@@@@@OL@C@@@@@@OL@GH@@@@@GL@GH@@@@@GL@GH@@@@@CL@GH@@@@@CL@GL@@@@@CL@GL@@@@@CH@GN@@@@@AH@GN@@@@@AH@GOH@@@@AH@GOH@@@@A@@GOOON@@A@@GOOON@@A@@GOOOOH@A@@GOOOOH@A@@GOOOOL@A@@GOOOOL@A@@GOOONF@A@@GOOONF@A@@GOOOHB@A@@GOOOHB@A@@OOOO@C@A@@OOOO@C@A@@OOON@A@A@@OOON@A@AHAOOON@A@AHAOOON@A@AHCOOOL@A@@HCOOOL@A@@LOOOOL@A@@NOOOOL@A@@GOOOOL@A@@GOOOOL@A@@COOOOL@A@@COOOOL@A@@@OOOOL@A@@@OOOOL@A@@@@@COL@C@@@@@COL@C@@@@@@OL@C@@@@@@OL@C@@@@@@GL@GH@@@@@GL@GH@@@@@CL@GH@@@@@CL@GH@@@@@CL@GL@@@@@CL@GL@@@@@AH@GN@@@@@AH@GN@@@@@AH@GOH@@@@AH@GOHON@@C@@GOOON@@C@@GOOOOH@N@@GOOOOH@N@@GOOOOOOH@@GOOOOOOH@@GOOON@@@@@GOOON@@@@@GOOOH@@@@@GOOOH@@@@@GOOO@@@@@@OOOO@@@@@@GOON@@@@@@OOON@@@@@@OOON@@@@@AOOON@@@@@@OOOL@@@@@COOOL@@@@@AOOOL@@@@@OOOOL@@@@@GOOOL@@COOOOOOL@@COOOOOOL@@N@COOOOL@@N@COOOOL@AH@@OOOOL@AH@COOOOL@C@@@@@COL@C@@@OOOOL@C@@@@@@OL@C@@@@@COL@GH@@@@@GL@GH@@@@@OL@GH@@@@@CL@GH@@@@@G) (il:rpaqq il:woven #*(22 22)B@@@AH@@A@@@BD@@HH@@DD@@DD@@HH@@BB@AA@@@AA@BB@@@@HHDD@@@@DDHH@@@@BCA@@@@@ABB@@@@@@LD@@@@@@HL@@@@@AAB@@@@@BCA@@@@@DDHH@@@@HHDD@@@AA@BB@@@BB@AA@@@DD@@HH@@HH@@DD@@I@@@B@@@F@@@A@@@) (il:rpaqq il:woven1 #*(22 22)COOOOH@@AOOOND@@HOOOLD@@LGOOHL@@NCOOAL@@OAONCL@@OHOLGL@@OLGHOL@@ONCAOL@@OOBCOL@@OOLGOL@@OOHOOL@@OOACOL@@ONCAOL@@OLGHOL@@OHOLGL@@OAONCL@@NCOOAL@@LGOOHL@@HOOOLD@@IOOON@@@GOOOO@@@) (il:rpaqq il:woven2 #*(22 22)BJJJKH@@AEEEFD@@HJJJLD@@LEEEHH@@FBJKAD@@KAEFBH@@EHJLED@@JLEHJH@@EFCAED@@JKBBJH@@EELEED@@JJHNJH@@EEACED@@JJCAJH@@EDFHMD@@JHMDFH@@EAJJCD@@JCEEAH@@DFJJHL@@HMEEDD@@IJJJJ@@@GEEEE@@@) (il:rpaqq il:woven3 #*(22 22)BA@DAH@@AB@HBD@@HLA@DD@@DDB@HH@@BBDAA@@@AAHBC@@@@HHDDH@@@DDHHD@@HBCAH@@@DABBD@@@B@LDB@@@A@HLA@@@@IAB@H@@@FCA@D@@HDDHH@@@DHHDD@@@CA@FB@@@BB@IA@@@DDA@HH@@HHB@LD@@I@DAB@@@F@HBA@@@) (il:* il:|;;| "Stan's Wallpapers and room backgrounds") (il:rpaqq il:wallpaper #*(16 16)BDJDIBDIDIABBDJDIBDIDIABBDJDIBDIDIABBDHIDIBDIBEBBDHIDIBDIBEBBDHI) (il:rpaqq il:lightwallpaper #*(16 16)HIDHDDIABBBBAADDHHHHDDAABBBBAADDHHHHDDAABBBBDDAAHHHHAADDBBBBDDIA) (il:rpaqq il:darkwallpaper #*(16 16)MKEKFMKFKFNMMKEKFMKFKFNMMKEKFMKFKFNMMKGFKFMKFMJMMKGFKFMKFMJMMKGF) (il:rpaqq il:*stamp-bitmap* #*(26 30)@@@@@@@@GCCCCCH@DLLLLLH@EOKKD@H@BKJDMM@@BFEOIE@@DIOEELH@EKANMDH@BFGAMM@@BJLJHA@@DFLAEIH@EHJNEJH@CFLAEG@@CAH@OG@@GIJDGBH@DM@@ELH@BCI@NI@@CBH@KE@@DEIHIDH@DJD@GHH@BJGMLO@@B@HCDI@@FMJCE@H@DBCMBHH@CDHNAI@@BIBBIE@@DBD@@HH@DLLLLLH@GCCCCCH@@@@@@@@@) (il:rpaqq il:*phone-bitmap* #*(16 16)IEBBB@HIAMBDKNHJCOB@AOHDHMMABAN@@HODJBCIA@GLDDGLAACMHDEHBA@BHDDH) (il:* il:|;;| " Andreas' Avants") (il:rpaqq il:avantbackground0 #*(48 42)@@@A@@BJJJJ@@@@@HEEEE@@@@@@@HJJJH@@@@@@@EEED@@@@@@@BJJJ@@@@@@@EEEE@B@@@@@BJJJH@A@@@@@EEED@@A@@@@JJJJI@@@H@@@EEED@H@@H@@AJJH@@H@@D@@JED@@@D@@DAEEJ@@@@D@@BJJJ@@@@@@@@EEEED@@@@@@JJJJJB@@@@AEEEEE@B@@@@JJJJJH@A@@@EEEEE@@@A@@JJJJJHD@@@HEEEEE@@D@@@JJJJJH@@B@@AEEEE@@@@B@@JJJJH@@@@A@@EEE@@@@@@A@EJJH@@@@@@@JJED@@@@@@@AEEJ@@@@@@@@JJJ@@H@@@@EEEEE@@H@@@@JJJJH@@D@@EEEEED@@@D@@JJJJJA@@@B@EEEEE@A@@@BJJJJJ@@@H@AEEEED@@@@H@JJJJH@@@@@@EEEED@H@@@@@JJJH@@D@@@@BEED@@@D@@@AEJH@D@@B@@@JJD@@B@@B@AEEEH@@B@@A@BJJJ@@@A@@AEEEE@) (il:rpaqq il:avantbackground1 #*(32 42)CBJJJJIHFEEEEEDLLJJJJJJFIEEEEEECLJJJJJJIFEEEEEECCBJJJJJFFEEEEEDLLJJJBJIHIEEDIEDMBJJILJJGAEECFEECLJJFCBJIFEDLAIECCBJF@LJFFEECAIECLJJIKBJFIEECFEDMLJJFLJIHFEDMIEC@CBIKBJIHFEDMIEC@LJJFLJF@IEECFDLALJJFCBF@FEDLFEC@CBIHLJIHFEDMIEC@LJJGBJIHFEEBEEC@CBJHJJF@AIEEEDL@@LJJJIH@AIEEEDL@CBJJJJF@FEEEEEC@LJJJJJIHIEEEEEDMLJJJJJJFFEEEEEDLCBJJJJIHAIEEEEC@) (il:rpaqq il:avantbackground2 #*(48 42)HLIHLIKFCBJIMIDLFDNCAIEDHLJFLJDIHLJI@FECIEADLFECHCBIBHJJFCBIMAIDEBEECFEDKHLJJGBJFLJIFLFEDMIDMIECLFCBIHLIHLJFICAIDLFDLFECBIHLJFCBFCBIEDMIECAICAIDJJGBJIKBIHLJAEBEEDNEDLFEDJHJJILJJFLJNEEEECFEDMIDKBJJJFCBIHLIAIEEECAIDLFC@LJJJIHLJFCF@FEDEDLFECAL@CBIBJFLJIHHAAICIECFEDHDCHLFLJFCBIHNFLFLFECAICAKLFCHCBIKBFCAICA@AIDNDLFDBIH@@LJDIHLJEDL@AIEADMIEJJF@CBJJJGBJEEC@FEEEEBEEJJIHLJJJJHJJEEDMIAEEEEDEJBJGBDJJJJIBDIEBDNEEEECIILJHIKBBJJFLCFEECFDIEDLFFCBJFLILJJFCLFEDMICFEECAHLJIKBFCBJIHAIECFDLAIEDLCBJFLIHHLJJFAIDMICALFEEC) (il:rpaqq il:avantbackground3 #*(64 64)JH@@JJJN@@CJJJJJE@@@EEEF@@CEEEEEJH@@JJJKH@NJJJJJE@AAEEEEOOMEEEEEJHBJJJJJOOJJJJJJE@EEEEEEEEEEEEEEJ@BJJJJJJJJJJJJJE@EEEEEEEEEEEGOEJHJJJJJJJJJJJOOJE@EEEEEEEEEEEEEEJ@@@JJHJJJJ@JJJJE@@@EDAEEED@AOOEJ@@@JJBBJJH@@OOJEDDAE@@EEED@@EEEJJJJJHHHJJH@@JJJEEEED@@AEED@BKOOJJJJJBBBJJJ@AEOOEEEE@@@EEEE@EEEEJJJJHHHJJJJHJJJJEEED@@AEEEEDJJKOJJJJBBBJJJJKEEEOEEE@@@EEEEEEEEDEJJJHHHJJJJJJJJHBEED@@AEEEEMGNJHAJJJBBBJJJKNOOD@BEE@@@EEEEGGEED@EJHHHHJJJJOAJJHBJE@@@AEEEEJCOODEEJBBBBJJJKEKKNJJJD@@@EE@@F@CEEEEEJHHHJH@@LAFJJJJJD@@AE@@A@@EEEEEEJBBBJ@@BD@JJJJJJ@@@EE@BDHIMEEEEEHHHJJ@FIAKBJJJJJ@@AED@L@@FEEEEE@BB@JJAH@@LBJJJJB@@AEDA@@HHAEEEE@HHJJJ@HAA@BJJJJH@AEEDA@B@LAEEEE@BJJJJB@DALBJJJJJAEEEDDAL@HAEEEEEJJJJJ@CHC@BJJJJJEEEEEHF@N@AEEEEEJJJJKALAH@BJJJJJEEEEG@@A@@EEEEEEJJJJN@@B@@BJJJJJEEEELH@L@@EEEEEEJJJKHD@H@BJJJJJJEEEG@DE@AEEEEEEEJJJN@@N@JJJJJJJJEEEL@AMEEEEGOEEEJJJH@CJJJJJKONJJEEEH@GEEEEEEEEEEJJKH@NJJJJJJJJJJEEGHCMEEEEEEGOMEJJKHGJJJOOJJJKNJEECOOEEEOOMEEEEEJJBONJJKL@OJJJJJEE@@EEEG@@CEEEGEJH@@BJJN@@AJJJJJED@@AEEF@@AEEEEEJH@@BJJL@@AJJJJJE@@@AEED@@AEEEEE) (il:rpaqq il:avantbackground4 #*(64 64)KKOOOOOOKKKKKKKKNNNNNJNNNNNNNNNNKOOOMGOKKKKKKKKKNNNNJNNNNNNNNNNNKOOOEEGKKKKKKKKKNNNNJJNNL@@@BNNNKOOMEEGKH@@@CKKKNNNJJJNNL@@@BNNNKKOEEEOKH@@@CKKKNNNJJJNNL@@@BNNNKOMEEGKKH@@@CKKKNNJJJNNNLBJHBNNNKOEEEOKKHEE@CKKKNNJJJNNNLBJHBNNNOMEEGKKKHEE@CKKKNJJJNNNNLBJHBNNNOEEEOKKKHEE@CKKKNJJJNNNNLBJHBNNNMEEGKKKKHEE@CKKKNJJNNNNNL@@@BNNNMEEOKKKKL@@@CKKKJJJNNNNNNNNNNNNNMEGKKKKOOOOOKKKKJJNNNNNNNNNNNNNNMEOKKKKOOOOOKKKKNNNNNN@@@@NNNNNNOOKKKK@@@@OOKKKKNNNNNN@@@@NNNNNNOOKKKKAED@OOKKKKNNNNNN@JJ@NNNNNNOKKKKOAED@OOKKKKNNNNNN@JJ@NNNNNNOKKKKOAED@OOKKKKNNNNNN@JJ@NNNNNNKKKKOOAED@OOKKKKNNNNNN@JJ@NNNNNNKKKKOO@@@@OKKKKKNNNNNN@@@@NNNNNNKKKKKO@@@@OKKKKKNNNNNN@@@@NNNNNNKKKKOO@@@@KKKKKKNNNNNNNNNNNNNNNNKKKKKOOOOOKKKKKK@BNNNNNNNNNNNL@@DCKKKKOOOKKKKHAEHBNNNNNNNNNNNLBJDCKKKKKOOKKKKHAEHBNNNNNNNNNNNLBJDCKKKKKOKKKKKHAEHBNNNNNNNNNNNLBJDCKKKKKKKKKKKHAEHBNNNNNNNNNNNLBJ@CKKKKKKKKKKKH@@@BNNNNNNNNNNNL@@@CKKKKKKKKJKKH@@@BNNNNNNHF@NNL@@@CKKKKKKKBKKKH@@@BNNNNNNNFNNNL@@@CKKKKKKK@KKKH@@NNNNNNNNNNNNNNNNKKKKKKKKKKKKKKKKNNNNNNNNNNNNNNNNKKKKKKKKKKKKKKKKNNNNNNNNNNNNNNNN) (il:rpaqq il:avantbackground5 #*(96 94)@@@@@@@@@@BNNNH@BHJJJJH@@@@@@@@@@@AKKK@@@@EEEED@@@@@@@@@@@@NNN@@@@BJJJH@@@@@@@@@@@@CKH@AEDEEEED@@@@@@@JJJJJ@D@@BJHBJJJH@@@@AEEEEEEEE@@@@@@EEEED@@@@BJJJJJJJJH@@@@@BJJJH@@@AEEEEEEEEEE@AEEDEEEED@@@BJJJJJJJJJJ@BJJJJJJJH@@@EEEEEEEEEEED@@@@EEEED@@@JJJJJJJJJJJJ@@@@BJJJH@@EEEEEEEEEEEEEEEEEEEEED@@BJJJJJJJJJJJJJJJJJJJJH@@EEEEEEEEEEEEE@@@@EEEED@@BJJJJJJJJJJJJ@@@@BJJJH@@EEEEEEEEEEEEEEEEEEEEED@@BJJJJJJJJJJJJJJJJJJJJH@@EEEEEEEEEEEEED@@@EEEED@@BJJJJJJJJJJJJH@@@BJJJH@@EEEEEEEEEEEEEEEEEEEEED@@BJJJJJJJJJJJJJJJJJJJJH@@EEEEEEDEEEEEED@@@EEEED@@BJJJJJ@@JJJJJH@@@BJJJH@@EEEEED@@AEEEEEEEEEEEE@@@BJJJJ@@@BJJJJJJJJBJJJH@@EEEEE@@@@EEEED@@@EEEE@@@BJJJH@@@@JJJJH@@@BJJJH@@EEEED@@@AEEEEEEE@@@AE@@@BJJJH@@@@JJJJHJJ@@@@@@@@EEEED@@@AEEEED@@@@@@@@@@BJJJH@@@BJJJJH@@@@@@@@@@AEEED@@@EEEEED@@@@@@@@@@@@@@@@@@JJJJJH@@@@@@@@@@@@@@@@@AEEEEED@@@@@@@@@@@@@@@@@BJJJJJH@@@@@@@@@@@@@@@@@EEEEEED@@@@@@@@@@@@@@@@@JJJJJJH@@@@@@@@@@@@@@@@AEEEEEE@@@@@@@@@@@@@@@@@BJJJJJJH@@@BJ@@@@@@@@@@AEEEEEEE@@@@EEEE@@@@@@@@@JJJJJJJ@@@@BJJJH@@@JJJJEEEEEEED@@@@EEEED@@AEEEDJJJJJJJH@@@@BJJJH@@@@@@AEEEEEEED@@@@EEEED@@@@@@@JJJJJJJH@@@@BJJJH@@JJJJAEEEEEEE@@@@@EEEED@AEEEDJJJJJJJJ@@@@@BJJJH@@@@@@EEEEEEED@CK@@EEEE@@@@@@@JJJJJJJH@NNL@JJJJH@JJJJAEEEEEEE@CKKJ@EEEE@@EEEDBJJJJJJJ@BNNN@JJJJH@@@@@AEEEEEED@CKKK@EEEE@@@@@@BJJJJJJH@FNNN@JJJJH@JJJ@EEEEEEE@@CKKK@EEEE@@EED@JJJJJJJ@@FNNN@BJJJH@@@@@EEEEEED@@CKKK@@@AE@@@@@@JJJJJJH@@FNNN@@@@@@@@@@@EEEEED@@@CKKK@@@@@@@@@@@JJJJJH@@@BNNN@@@@@@@@@@@EEEEED@@@CKKJ@@@@@@@@@@@JJJJJH@@@@NNL@@@@@@@@@@@EEEEE@@@@@CK@@@@@@@@@@@@JJJJJ@@@@@@@@@@@@@@@@@@@EEEED@@@@@@AEED@@@@@@@@@JJJJH@@@@@@BJJJ@@@@@@@@@EEEED@@@@@@@@@@@@@@@@@@@JJJJH@@@@@@@@@@@@@@@@@@@EEEE@@@@@@AEEE@@@@@@@@@@JJJJ@@@@@@BJJJ@@@@@@@@@@EEEE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AKH@@@@@@@@@@AEEE@@@@@@@FNN@@@@@@@@@@BJJJ@BJJJ@@KKKH@@@@@@@@@@@@@@EEEE@ANNNH@@@@@@@@@@@@@@BJJJHBKKKH@@@@@@@@AEEE@@EEEE@CNNNL@@@@@@@@BJJJ@@BJJJHFKKKH@@@@@@@@@@@@@@EEEE@CNNNL@@@@@@@@@@@@@@BJJJHFKKKHAEEED@@AEEE@@@EEEE@CNNNLBJJJH@@BJJJ@@@BJJJHFKKKHAEEED@@@@@@@@@EEEE@CNNNHBJJJH@@@@@@@@@BJJJHBKKKHAEEED@@CKI@@@@EEEE@AFNN@BJJJH@@NNN@@@@BJJJH@AKH@AEEED@AKKK@@@@EEEE@@@@@@BJJJH@@NNN@@@@BJJJH@@@@@AEEED@CKKKH@@@EEEE@@@@@@BJJJH@BNNNH@@BJJJJH@@@@@AEEED@CKKKH@@@EEEE@@@@@@BJJJH@BNNNH@@@BJJJH@@@@@AEEED@CKKKH@EEEEEE@@@@@@BJJJH@BNNNH@JJJJJJH@@@@@AEEED@CKKKH@@@EEEE@@) (il:rpaqq il:avantbackground6 #*(96 84)KKKKKKKKKKKKKKKKKKKKKKKKNNNNNNN@FNNNNNNNNNNNNNNNKKK@@KH@@@CKKKKKKKKKOKKJ@@@@@HH@@@@@@@@NNNNNNNH@@@@@@@@@@@@@@@AEEMMEEE@@@@BBBBB@@@@@@@BJJJJJJJH@@@@@@@@@@@@@@@EEEEEEEE@@@@HHJHH@@@@@@@JJJJJJJJH@@@@AED@@@@@@@@MEEEOFJJJ@@@BBJJB@@@@@@AJJJJNKEEE@@@@EED@@@@@@@EEEEEEEEEE@@@HJJJH@@@@@@JJJJJJJJJJ@@@@EEE@@@@@@@JJJJJJJJJJ@@@BJJJB@@@@@AEEEEEEEEEE@@@@EEE@@@@@@EEEEEEEEEEE@@@HJJJHH@@@@BJJJJJJJJJJ@@@@EEE@@@@@@BJJJJJJJJJJ@@@BJJJB@@@@@EEEEEEEEEEE@@@@EED@@@@@@EEEEEEEEEEE@@@HJJHHH@@@@BJJJJJJJJJJ@@@@AE@@@@@@@@JJJJJJJJJH@@@BBBBB@@@@@@EEEEEEEEE@@@@@@@@@@@@@@@EEEEDEEEE@@@@@HHHH@@@@@@BJJJHBJJJ@@@@@@@@@@@@@@@@JJJ@@BJH@@@@BBBB@@@@@@@@EED@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@KKKJ@@@@@@@@@@@@@@@@@@@FNNNN@@@@@@@@@@@@@@@@@@CKKKKKH@@@@@@@@@@@@@@@@@FNNNNNN@@@@@@@@@@@@@@@@@KKKKKKKH@@@@@@@@@@@@@@@@NNNNNNNL@@@@@@@@@@@@@@@CKKK@CKKH@@@@@@@@@@@@@@@FNNN@@NNN@@@@@@@@@@@@@@@CKIO@@CKK@@@@@@@@@@@@@@@FNAO@@BNN@@@@@@@@@@@@@@@KKBOH@AKK@@@@@@@@@@@@@@@NNGOH@@NN@@@HHH@@@@@@@@AKKCOH@@CJ@@@@@@@@B@@@@@@NLCOH@@FN@BBBBBB@@@@@@@AKHCO@@@CJ@@@@@@@HHHHHH@BNH@N@H@FN@HHHHHH@@@@@@@CK@AM@@@CJ@@@@@@@BBBBBBNNN@BJJBBFN@BBBBBB@@@@@CKKKKME@@@KK@@@@@@@HHHHHNNNNNNJHHNNNNHHHHHH@@@@AKKKKKKKKKKKKK@@@@@@BBBBFNNNNNNNNNNNNNJBBBBB@@@@CKKKKKKKKKKKKKJ@@@@@HHHHNNNNNNNNNNNNNNNHHHHHD@@@CKKKKKKKKKKKKKJ@@@AEJBBBNNNNNNNNNN@@NNNBBBBJD@@@KKJ@CKKKKIOLCKKH@AEEJHHHNNKOHNNNNOOOBNNLHJJJE@@AKKOONCKKKOOOKKKH@EEEJJB@NOOOOFNNNOOOHNNNJJJJED@AKKOOOCKKKOOOMKKHEEEEJHHHNOOOOJNNOOOOLNNLJJJJED@AKKOOOKKKKOOOMKKHEEEEJJBBNOOOOJNNOOOOLNNNJJJJ@@@@KKOOOKKKKOOOMKKH@EEAHHHHFOOOOJNNOOOOLNNLHHHH@@@@CKOOOKKKKOOONCKH@@@@BBB@@COOONBFNOOOHBBFBBBB@@@@@AOOO@@@@OOOL@@@@@@@LGOL@AOOOHHHHGOOHHHHHHHHKKKKKKOON@@KKKON@@@@@CHAOOOOOOOOKNOOOOO@@BBBCOOONNNNNNNNNNNNNNNNFL@@NNNNOOOOOOOOOOOOOOOOOOOOOOOOKKKKKKKKKKKKKKKKKKKKKKKKOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOKKKKKKKKKKKKKKKKKKKKKKKKOOOOOOOOOOOOOOOOOOOOOOOONNNNNOOKNNNNOONNNOONNNNOOOOONNNNOOONOOOOOONOOOONKKKKKKKKKKKKKKKKKKKKKKKKNNNNNNNNNNNNNNONLNNNNNNNKKKKKKKKKKKKKKKKKKKKKKKKNNNLNNNNNNNNNNNNNNNNNNNN) (il:rpaqq il:avantbackground7 #*(64 42)JJJJJJJJJJJJJJJJEEEOMEEEEEEEEEEEJJJ@JJJJJJJJJJJJEEE@MEEEEEEEEEEEJJJ@JJJJJJJJJJJJEEE@MEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEGOEEEEEGOJJJJJJJHBJJJJJHBEEEEEEEDCEEEEEDCJJJJJJJHBJJJJJHBEEEEEEEDCEEEEEDCJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEOMEEEEJJJJJJJJJJ@JJJJJEEEEEEEEEE@MEEEEJJJJJJJJJJ@JJJJJEEEEEEEEEE@MEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEGOEEEEEEEEEEEEEJHBJJJJJJJJJJJJJEDCEEEEEEEEEEEEEJHBJJJJJJJJJJJJJEDCEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEEJJJJJJJJJJJJJJJJEEEEEEEEEEEEEEEE) (il:rpaqq il:avantbackground8 #*(50 60)OOOOOOOOOLOO@@@@OOOOOOOIO@OLL@@@OOOOOOOKMAOCL@@@OOOOOOOO@ALOL@@@OCOOOOOLBCCOL@@@LOOOOOOB@@OOL@@@COOOOON@DCOOL@@@OOOOOOLD@GOO@@@@OOMOOOH@HOOLL@@@OO@OOOHH@OOCL@@@OLAOOO@AAOLOL@@@O@AOOOA@AOCOL@@@L@COON@@CLOOL@@@@@COON@@CCOOL@@@@@GOOL@@DOOO@@@@@@OOOL@@COOL@@@@@COOOH@@OOO@@@@@@LOOOH@@OOL@@@@@CAOOO@@AOO@@@@@@LAOMO@@AOL@@@@@@@COON@@CO@@@L@@@@CKKN@@CL@@C@@@@@GOOL@@A@@@L@@@@@OGGL@@@@@C@@@@@COOOH@@@@@L@@@@@LNNN@@@@@C@@@@@@AOOH@@@@@@@@L@@@AMN@@@@@@@@C@@@@COH@@@@@@@@L@@@@CNC@@@@@@@C@@@@@GHA@@@@@@@L@@@@@F@@@@@@@@C@@@@@@@@@@@@@@@L@@@@@@N@@@@@@@@@@@L@@@GL@@@@@@@@@CL@@@GOH@@@@@@@@OH@@@COO@@@@@@@COH@@@CMON@@@@@@OOH@@@AOMN@@@@@COO@@@@ANOO@@@@@OL@L@@@HONOH@@@CO@@L@@@LOGOH@@@ONAAL@@@LGOGL@@@OLFAL@@@NGKON@@@OLHAL@@@NCOKN@@@GIHCL@@@NCOOO@D@GI@CL@@@FAOOOH@@CI@CL@@@FAOOOHBBCI@GL@@@N@OOOL@@AH@GH@@@L@OOONAAAL@GH@@@L@GOON@@@L@OD@@@HAOOOO@HHN@NL@@@@GOOOOH@@GAOL@@@AOOOOON@DGMO@@@@GOOOOOOH@CN@@@@@OOOOOOON@CL@D@@@OLOOOOOOHALAL@@@OCOOOOOONALGL@@@LOOOOOOOOHIOL@@@COOOOOOOONOOL@@@) (il:rpaqq il:avantbackground9 #*(30 30)@@@@@F@@@F@@AL@@AN@@GL@@GN@AOH@@OL@CO@@DOH@GO@ALOH@ON@GLO@AOLAOLN@COHGOLL@GOAOOLH@OOGOOL@AOOOOOL@OOOOOOLGOOOOOOLOOOOOOOLGOOOOOOL@OOOOOOLHAOOOOOLL@OOGOOLN@GOAOOLN@COHGOLO@AOLAOLOH@ON@GLOH@GN@ALOL@CO@@DGN@AOH@@AN@@OH@@@G@@CL@@@A@@@N@@@@@@@C@@) (il:rpaqq il:avantbackground10 #*(60 50)@EEEEEEEEEEEEEE@OJJJOOOOJJJJJJJ@HGOO@@@@MEEEEEE@H@@@@@@@GJJJJJJ@F@@@@@@@AMEEEEE@KH@@@@@@@JJJJJJ@EF@@@@@@@EEEEEE@JK@@@@@@@BJJJJJ@EEH@@@@@@AEEEEE@JJH@@@@@@AJJJJJ@EED@@@@@@@MEEEE@JJN@@@@@@@FJJJJ@EEE@@@@@@@EEEEE@JJK@@@@@@@BJJJJ@EEEH@@@@@@CEEEE@JJJL@@@@@@AJJJJ@EEEF@@@@@@AEEEE@ONJKH@@@@@@JJJJ@@COEL@@AOL@EEEN@@@@NJ@CN@COCKO@@@@@ANAL@@@@ON@@@@@@@BN@@@@@@@@@@@@@GO@@@@@@@@@@@@COJL@@@@@@@@@@@OMEG@@@@@@@@@@@@JJJL@@@@@@@@@@@@EEG@@@@@@@@@@OO@JJL@@@@@@@@COJJ@EE@@@@@@@@@EEEE@JN@@@@@@@@@JJJJ@EH@@@@@@@@@MEEE@J@@@@@@@@@AJJJJ@D@@@@@@@@@AEEEE@L@@@@@@@@@BJJJJ@GL@@@@@@@@CEEEE@JKN@@@@@@@BJJJJ@EEEL@@@@@@GEEEE@JJJL@@@@@@FJJJJ@EEEH@@@@@@EEEEE@JJK@@@@@@@JJJJJ@EEF@@@@@@@MEEEE@JJL@@@@@@CJJJJJ@EEH@@@@@AMEEEEE@JK@@@@@ANJJJJJJ@EF@@@@OOEEEEEEE@JL@AOOJJJJJJJJJ@EHCOEEEEEEEEEEE@O@FJJJJJJJJJJJJ@HAMEEEEEEEEEEEE@HBJJJJJJJJJJJJJ@) (il:rpaqq il:avantbackground11 #*(60 44)HGOIOOOOOOONNAO@L@GMOOOOOONOOMO@N@AOOOOOOOO@GLA@OK@GON@@OOOO@OO@OL@@@@@@AONAOOO@ONB@@@@@@GOOKOO@OOLB@@@@@COHMNH@HGL@H@@@@AOON@O@OON@GNAOH@GOOOO@OMOH@BJ@@@AONCO@OLGLFMED@@@GOOO@OOCN@@@@@@@AOOO@@GOJ@@@@LN@@COH@@AOK@@@GOH@@@@@@A@GOL@GL@@@@@@@@AH@GHGN@@G@@@@@@@@@@MH@@@HD@@@@@@@@OL@@MOCL@@@@@OOOO@@C@@@@@@@C@OOOL@@@@@@@@@OO@OOO@@@@G@@@AOOO@OOL@@@@D@@@GOOO@AOH@@@@@@@@OOOO@ON@AN@@@A@AOOH@@CL@G@FFNF@CO@OO@OH@D@H@@@@COOIO@O@@@A@@@@@GOK@A@N@@@BAO@@@GOLGO@L@@@D@@@CHNCO@I@KN@@D@CGN@NOAOO@GOO@HF@@@AOOL@G@GOOO@@N@@AOOOOO@ONOOAHAOLCOAHCN@ONON@GN@@CONCOM@OIOL@@@@@GOOOOC@OCOH@@CL@GOAAAO@OOO@CJL@@OOOOOO@OOL@@@@@AOOOOOO@OO@GOOL@COONNGO@OL@@F@@AOON@OOO@O@@@@@@OOLOOOOM@N@@@@OOOOMOOOOO@HGOOOOOOOOOOHKN@IOOOOOOOOOOHGO@@) (il:* il:|;;| "Other bitmaps") (il:rpaqq *eye-bm* #*(54 30)@IJN@@AA@@@@@D@@BBJIDKH@@HDBD@@@HIBOKNOLDA@BE@@@@LHJMKOO@@AA@@@@ABEFDDIEGM@@@D@@HAEKBJNMMDHAE@@@KFH@@KONCJA@@@@@@IEEECOJMFHAE@@@DF@BGOOOONEDH@@@@KEACOOOOEBBED@@A@HGNOOOMOOKJH@@@J@JMOOOOONJN@@@JABCBOEOEOOOJH@@ADAGDKONKOONN@@@@DJMAGONHGOOJH@@BHJNDKONAGOON@@@BBCI@GOJHKNIA@@@D@KLACEMAEOMDH@@IDDA@IJH@K@@@@@@B@ADBDODEGNIB@@@H@H@A@@EBD@@@@@@EBA@DBI@IEJB@@@@@@@@B@BEBE@@@H@@@DDD@D@@@H@DD@@@B@B@A@D@HBI@BD@@@DA@JA@@A@@@@@@@DA@@@@A@@DHEA@@@BHBB@@DAD@A@@@@@@C@@HL@H@@@@J@@@I@@@@@@@@D@@@@@@) (il:rpaqq *fract-bm* #*(128 128)DADADAA@AA@D@AA@HHH@B@HH@HHBHBHBHBJ@J@HJBB@HHJBA@DEAA@DDEA@E@EDA@ADDEADEDDEAAE@BL@JHHJBBJBHJBBH@HBH@JHHBJBBBHJHA@AEADDDEDAAE@ADADE@@A@DDDDDEAE@NO@JHJBBBBB@H@@JBHJ@HHJHBH@HJ@H@MA@A@EA@ADAEAA@EAAD@@AA@EDAADE@BJMD@JBHHBJ@HH@@BHBHHBJB@BHBHHH@@A@@@AAADAD@DEDAADEADE@D@E@DAA@@ONOO@@HHB@J@B@JBHJBBJJBH@B@HBJH@MMAM@AEDA@D@ADEEDDDDEDE@@@AAD@@BOJMOD@@BHH@@@JBJBBJ@@J@J@HBBJB@@GA@G@@DEDDA@E@E@@ED@ADAAA@DEDD@NNNOGG@BBJB@HHHBH@BHH@HBBBBHJH@@LLMAAC@@AEADDDDA@AAA@@@DDDDAE@@BJJJMEED@@JHBBBB@@@H@@H@B@@J@HH@@@@A@@@@@AA@E@@D@A@@DA@@EAAADEA@OOONOOOO@HJBHHHJ@@HBJ@JBHH@BBB@@MMMMAMMO@@DDD@AADE@EEAAAEA@E@EDBOOOJMOOODBJ@J@HJHHHJJHHHJHHHBBB@GGGA@GGG@DDDAAAEAAAEE@EEEAAADDDNOONNOGOOGBBBHHHJJJ@J@JBHJJB@JB@LMMLMAAMMC@DE@DEEADE@A@EAEDDA@EBJOOJJMEOOEDJ@HBBJHJ@HH@JH@J@JHJ@@GG@A@@GG@@EAE@E@AE@ADA@@DEADEDONONONOOGOGOBJBHJB@@HB@B@JJJJJHHMLMLMMAMAMAMAAEEEEE@D@@DAAEDDAEBOJOJOJMOEOEODJHBBJHHB@JBBBJHHBB@G@G@GA@G@G@G@DDAAEDDDEDADEAA@DDNNNNNNNOGGGGGGBB@HHJBHBHBHBB@BHHLLLLLLMAAAAAACAAD@DDADA@E@DDDEEBJJJJJJJMEEEEEEDJJBBB@J@JB@BBH@J@@@@@@@A@@@@@@@@E@ADD@DEDE@E@EADOOOOOOONOOOOOOOOBHJ@J@JBJ@BBHJ@HOMMMMMMMAMMMMMMOA@EADD@E@A@DE@@BOOOOOOOJMOOOOOOOD@@JB@H@BBBJB@B@GGGGGGGA@GGGGGGG@D@DEDDDDDEEDD@NOOOOOONNOGOOOOOOG@BBJJBBHHJJ@H@LMMMMMMLMAAMMMMMMC@A@EEAAEAADAABJOOOOOOJJMEOOOOOOEDHHBHHJ@@@BHJ@@GGGGGG@A@@GGGGGG@@EAD@@@E@@DDDONOOOOONONOOGOOOOOGOBBB@@JH@HBJHMLMMMMMLMMAMAMMMMMAOAEDA@A@ADDABOJOOOOOJOJMOEOOOOOEODHBBH@@BJHJ@G@GGGGG@GA@G@GGGGG@G@EAED@DEAADNNNOOOONNNNOGGGOOOOGGGBHHJB@H@BHLLLMMMMLLLMAAAAMMMMAAAAD@A@ADEAFJJJOOOOJJJJMEEEOOOOEEEFHJBH@HHB@@@@GGGG@@@A@@@@GGGG@@@ADAA@EDDEOOONOOONOOONOOOOGOOOGOOOJBBJ@HHJMMMLMMMLMMMMAMMMAMMMAMMMEAA@AE@FOOOJOOOJOOOJMOOOEOOOEOOOF@JHBJ@@GGG@GGG@GGGA@GGG@GGG@GGGA@EDE@ENOONNOONNOONNOGOOGGOOGGOOGJ@JBHBLMMLLMMLLMMLMAAMMAAMMAAMMCDADE@FJOOJJOOJJOOJJMEOOEEOOEEOOEF@JHHH@GG@@GG@@GG@A@@GG@@GG@@GG@AAADAONONONONONONONOOGOGOGOGOGOGOHBHBMLMLMLMLMLMLMMAMAMAMAMAMAMAMDA@FOJOJOJOJOJOJOJMOEOEOEOEOEOEOF@@HG@G@G@G@G@G@GA@G@G@G@G@G@G@OA@ANNNNNNNNNNNNNNNOGGGGGGGGGGGGGGHBLLLLLLLLLLLLLLMAAAAAAAAAAAAAAADBJJJJJJJJJJJJJJJMEEEEEEEEEEEEEED@@@@@@@@@@@@@@@AEEEEDEEEEEEEEEEEDADADAA@AA@D@AA@JJJJJJJJJJJJJJJJHBJ@J@HJBB@HHJBAEEEEEEEEEEEEEEED@ADDEADEDDEAAE@BKCCCCCCCCCCCCCCDHBH@JHHBJBBBHJHAGGGGGGGGGGGGGGG@DE@@A@DDDDDEAE@NHO@O@O@O@O@O@OA@HJ@HHJHBH@HJ@H@MEMEMEMEMEMEMEMD@AD@@AA@EDAADE@BJKOCOCOCOCOCOCODABHHBJB@BHBHHH@@AGGGGGGGGGGGGGOHBEADE@D@E@DAA@@ONH@OO@@OO@@OO@AAABBJJBH@B@HBJH@MMEEMMEEMMEEMMED@JDDEDE@@@AAD@@BOJKCOOCCOOCCOOCDADJ@@J@J@HBBJB@@GAGGGGGGGGGGGGGJ@JD@ADAAA@DEDD@NNNHOOO@OOO@OOOA@EDHH@HBBBBHJH@@LLMEMMMEMMMEMMMF@JHA@@@DDDDAE@@BJJJKOOOCOOOCOOOEAA@@@H@B@@J@HH@@@@AGGGGGGGGGGGGJBBJDA@@EAAADEA@OOONH@@@OOOO@@@ADAA@J@JBHH@BBB@@OMMMEEEEMMMMEEEFHJBHEAAAEA@E@EDBOOOJKCCCOOOOCCCAD@A@JHHHJHHHBBB@OGGAGGGGGGGGGGGBHHJBE@EEEAAADDDNOONNHO@OOOOO@O@EAED@@JBHJJB@JB@LMMLMEMEMMMMMEMDHBBH@A@EAEDDA@EBJOOJJKOCOOOOOCOAEDA@AH@JH@J@JHJ@@GG@AGGGGGGGGGGBBB@@JDA@@DEADEDONONONH@OOOOOO@@EAD@@@@B@JJJJJHHMLMLMMEEMMMMMMEDHHBHHJ@DAAEDDAEBOJOJOJKCOOOOOOC@A@EEAAJBBBJHHBB@O@G@GAGGGGGGGGG@BBJJBBDADEAA@DDNNNNNNNHOOOOOOO@D@DEDDDHBHBB@BHHLLLLLLMEMMMMMMMD@@JB@H@@E@DDDEEBJJJJJJJKOOOOOOOA@EADD@EJB@BBH@J@@@@@@@AGGGGGGGGBHJ@J@JBDE@E@EADOOOOOOONH@@@@@@@E@ADD@DEJ@BBHJ@HMMMMMMMMEEEEEEEDJJBBB@J@@A@DE@@BOOOOOOOJKCCCCCCAAD@DDADABBBJB@B@GGGGGGGAGGGGGGGBB@HHJBHBDDEEDD@NOOOOOONNHO@O@O@DDAAEDDDEHHJJ@H@LMMMMMMLMEMEMEMDJHBBJHHB@EAADAABJOOOOOOJJKOCOCOAAEEEEE@D@@@@BHJ@@GGGGGG@AGGGGGGBJBHJB@@HBE@@DDDONOOOOONONH@OO@@EAE@E@AE@AH@HBJHMLMMMMMLMMEEMMEDJ@HBBJHJ@H@ADDABOJOOOOOJOJKCOOC@DE@DEEADE@@BJHJ@G@GGGGG@GAGGGGGBBBHHHJJJ@JDEAADNNNOOOONNNNHOOO@DDDAAAEAAAE@H@BHLLLMMMMLLLMEMMMDBJ@J@HJHHHJADEAFJJJOOOOJJJJKOOO@@DDD@AADE@E@HHBH@@@GGGG@@@AGGGG@HJBHHHJ@@HBEDDEOOONOOONOOONH@@@@AA@E@@D@A@@@HHJOMMLMMMLMMMMEEED@@JHBBBB@@@HAE@FOOOJOOOJOOOJKCC@@AEADDDDA@AABJ@@GGG@GGG@GGGAGGG@BBJB@HHHBH@BE@ENOONNOONNOONNHO@@DEDDA@E@E@@EBHBLMMLLMMLLMMLMEMD@@BHH@@@JBJBBE@FJOOJJOOJJOOJJKO@AEDA@D@ADEEDDHH@@GG@@GG@@GG@AGG@@HHB@J@B@JBHJDAONONONONONONONH@@AAADAD@DEDAADHBMLMLMLMLMLMLMMED@JBHHBJ@HH@@BH@FOJOJOJOJOJOJOJK@A@EA@ADAEAA@EA@HG@G@G@G@G@G@GAG@JHJBBBBB@H@@JBANNNNNNNNNNNNNNNHAEADDDEDAAE@ADA@LLLLLLLLLLLLLLMD@JHHJBBJBHJBBH@BJJJJJJJJJJJJJJJHDEAA@DDEA@E@EDA@@@@@@@@@@@@@@@A@HH@B@HH@HHBHBHB) (il:rpaqq *mandala-bm* #*(42 42)KGKB@DAAKMH@MKJH@D@DKKD@FMFDDDDEEFL@KFJ@AE@@MMH@EKE@EEDAFKD@FLM@FNJAGFL@KDN@KOJ@NKL@NKF@IOB@MLL@IGKAOEOAKO@@GIMANDOAGBL@LFFJLDJJLMD@B@A@EEGA@@@@I@@AIOC@@AH@D@AAHHCA@@@@@@FFJNFNL@D@@AOGBGIOOH@@AFGHBNIBLE@@HCFALDFAMH@@@MLL@NBFGF@@@CHGEEGDCH@@OOOOOKOOOOL@@CHGEEGDCH@@@MLL@NBFGF@@HCFALDFAMH@@AFGHBNIBLE@@@AOGBGIOOH@@@@FFJNFNL@D@D@AAHHCA@@@@I@@AIOC@@AH@B@A@EEGA@@@@LFFJLDJJLMD@GIMANDOAGBL@IGKAOEOAKO@@NKF@IOB@MLL@ODN@KOJ@NKL@FLM@FNJAGFL@EKE@EEDAFKD@KFJ@AE@@MMH@FMFDDDDEEFL@MKJH@D@DKKD@KGKB@DAAKMH@FIMDB@@EGBL@) (il:rpaqq *static1-bm* #*(79 27)CIBJGIGNBOMGJEEFJAHHECHGML@CIOKHIICLFLBLGHAHGN@GALFOLOLHIHMFOFOIMMOAOJHHBEBNIOJNJMNNHJNCLMILD@HCLDCFCADCAMLGKEELKOO@AGMFC@AHCBG@JCMMDBDLLFAFCBJNFMANHNMNKONHFAIDCGLBMCLBMDMID@DABNI@CMAKJNGJF@MFKOACK@IJBHJIEE@K@HLIDAKFHLHN@CLLJCNIMHOFKLOLODJDEE@GDNBLGHHIDFFH@DOBOHI@IEJGCHGFKCDANDELJCKOBBKAKIHIEIABBE@BAEN@DLILKJGFHMKEJGKLGIENI@LFKMHIBDOJJBLBJ@BCBHGBKBGFGFFDJHCLABMHEIAJJMHHMCEHKMLBGGBNKKLJIBGEIIB@IFCLKLLCGNFJNMHO@MM@LALBBKAHOEBJABGJBDC@FNCN@DJONCJKNMI@GGOACAL@EKLALNJHABDDM@GCHNONNEAMIDJONMNMIOONCJLBHGCAABHDO@FOAIDAEKMFGOHLJNLNKKFNHLFECHNF) (il:rpaqq *static2-bm* #*(79 60)JB@ICCCBGJAGE@DEBK@LOLONDMG@HIAHFHELDA@HOLEOA@KLF@IKJDF@GHGDNL@O@AKIIONH@BFOBOOHND@G@AKLIOOOOOJAH@@DN@DC@AKNAOOOOOONGOOLNBF@AAKOEOOOOOONGOOLNFGEIIKOOOOOOOONGOOHNLGOGMKOOOOOOOONF@OJNIGN@OKOOOOOOOONFOGHNKONHEKOOOOOOOOJFHKHNJOFH@KOOOOOOOOHFKEJNJOBH@COOOOOOOMIFKEJNJO@HDGOOOOOOOLANKIJNJNALFGOOOOMOOHNNKLJFJNINGGOOOOLOCJIJKNJJJNMOGOOOOOLGEKHBKOJLJFOOOOOOOOLBFB@FKONIJBOOOOOOOOL@ONHGKONKJ@OOOOOOOOLEJLLGOONJJAOOOOOOOOLO@ENGOONJBAOOOOOOOOMJDANGOONJCAOOOOOONOM@NCNGOONJAAOOOOOONKMEOCNGOONOGLKOEOOONJEGOKNGOON@CGJJOJOMBJIGOONGOONEFOMGMNJJIOKMOONGOONOCODBKOENINKGJOLOOONGNJJKOMEOGAGENJJFKODFL@@@JJM@DHBKOENOJJNFD@@@@BFHANKOM@JBHGLN@@@@ACN@K@@JJJOHKONJ@@@@AK@@O@@@@@BH@@@H@@@@AKGJM@@@@@@@@@F@@@@@CKFGL@@@@@@AO@B@@@@@BJFAD@@@@@@@OH@@@@@BBCN@@@@@@@D@GL@@@@@CFOF@@@@@@@B@CN@@@@@GLKB@@@@@@BA@@@@@@@@EII@@@@@@@AHH@LF@@@@LA@@@@@B@@DOAOED@@@@HM@@@@@A@LBGE@JB@@BAJO@@@@@@HFAEHHEF@@CACN@@@@@@ECINEKB@@@GKFN@@@@@@BINK@CIL@@MNDF@@@@@@EEAIICL@@CHNLB@@@@@BJJLCGDAH@FBBH@@@@@@BEH@L@D@B@LO@H@@@@A@AB@BKOLCLAIIIH@@@@@DBHDNNL@ALCCAM@@@@@@AKEFHDFALHNDIO@@@@@D@OOFLOH@MBMJIJ@J@@ABACBFOBLMIDLNAGEJE@BA@F@CJEKICDFAIAMHD@BNLAGGGMJCFFLG@L@FDMLCEEHEKHNNKB@NLHALAADINFBA@DMOHBJFC@CJCHMEIDEOIJAGGNJHMBIHDNOOMLNJCHLBBJEJOFJCDMMKDMNMINJGED) (il:* il:|;;| "Some new ones") (il:* il:|;;| "*random-bm* is rather large, pieces of it might be useful") (il:rpaqq *tessel-bm* #*(64 64)DDDDOLDDDDGGOLDOHHHHOMHHHHHOOKHOBBBBBJNBBBBGOGGBAAAAAAOIAAACOOOOLDDDDDGOOLDDEMMMNHHHHHIOOMNHHKKKNNBBBBBBCKOOBBGGIKIAAAAAAACOIAAOOGGNDDDDDDDGFDDONNOLOHHHHHHHOHHKCOOKOGOBBBBBGNBBACOCOOKOAAAACMKADDDGMOGONDDDDGEFLHHHKNOOMOMOOHJMOFBBBBOOKOKGOGBBGKGIAAAOGOGOOOMAEFOLDDDDONMOMMODHHIOHHKOLLHHOKNLBBBONBGOKOJBBGONIAAAMACAGOCAACKMDDDDGDDDDDEDDDGOKLHHILHHHHKOLHKOOOJBCKJBBBCOKNBOMOGAAGMAAAAAGKAEONNLDEODDDDDDFOGOMMKHHNOHHHHHINMCCKFNBCNOBBBBBCJAAGMMMAAOOAAAAAADDEOOODDEMOLDDDDHHHOONNHHKOHHHHHBBBBNOOJBBBOJBBBKKAAAKKGAAAOEAAAOENDDGFNLDDDOMGNHKMNHHMMKHHHOJOMBBCOBBCKGNBBBBBBAAACKAAGOIMAAAAAMDDEFLDEOGONDEDOKOHHILHHNOOMNOOOFONBBOJBBNOJOOOKMOGAAOOAAAOEKOOGONNLDEOEDDDOGONOOMMIHHJJOLHHHHIKBKKCGNBCONBBBBBBAAGGOKIAAKOAAAAADDDMOGFDDGOLDDDDHHHKNNMLHHINHHHHKFBBCOKKNBBOOBBBMKAAACGGKIACOOGMDOFDDDNOGMDDEMOOHJKOOHINOKLHHKHHNBNONONCOFKJBBBBMIAAAOMIGMGGMAAAONDDDDGGLNNOOOMGOMIHHHHOOIMOOOJOOKONBBBBOBCNOOGOOGOMMAAACOAAOOKOLOOOOLDDGOLDDDDEHOOOONHHHKOHHHHHBBBNNONBBBONBBBBAAAAMKKOAACIAAAADDDDGGGODDDGNDDDINHHHNOOOHHOMNHHCNBBBCOONJBBCOJBAEMAAAAOMCIAACCA) (il:rpaqq *random-bm* #*(200 200)A@NMFOONDILDIFAMODBLFIDOAOBMBBLEEBNFMHB@@FIIIONMK@@@BEJELBGICOEJDCNHNLJFG@AJFMMOKM@BK@NLDEHK@MIJN@NJLB@@DIL@JGGEABLC@EANCFLAOLCFGMKGJCOHKB@ILFACIKGJDJDGBE@@DD@@MJKOBEGHNGIDDKDN@FFMOIBIAIJDBKHFHMAAM@GO@LACMK@@LJ@CCGNEJODK@IHGEHFDGG@AOMG@D@DNCOJCKLLICIJBKLDICH@@M@N@@GODGEKKD@LMJNAO@KNFHBGABFCLFNBDOC@CCELAMANDLA@@FDHDAJ@ICEGKLLGGJMBDN@MG@EDGIC@INOEOKLOCDFALLKMMME@@IAIIELAFHBFIENLIOEABOEAHGHJOGDEBOAJMEDBJOHFLO@OAKO@@DGNFFAN@NJG@CNODKMJJECNAKCLGHMNMJFOFNIDLBAIGBDHHCN@@JACHHFLLDNOLAGNMOBODBLHFELIJDEMDNINHBIC@MJGNAAHMIE@@MIDHAIGBCG@FDJNGJAKAKGFIOHDOCDLFD@GCIAHCDLDEFGOBJB@@LLJEJGNBDLHFJM@ALDMAMMCAAEIECMNAOOJCALKDFONKJACIJF@@D@JFDDEECKBKMECNKHNDLAKMBNH@BFO@ICALGIMHEBCAHIDAIN@@ICJOONKJ@OIFLA@LDM@MGMDHFFBEMBNLKKCA@IAODJGO@LJJNB@@CNKNBCAHIDACD@NLLCNFAMBIOLCO@@@H@ABAOEJDOKFOM@KBDI@@IFA@JGO@LJKEIDDDJJHJMGNOEODNGLMOCDEHEMEDGNHKKBIIEL@@BKJKNOEM@KCFCGMAE@LLOEOKNNLEDOAOL@AFAOKFAAN@MK@DKJ@@CNODD@MKBIIOIKD@EAKKM@DDCEHLKHEBGCFIHNBGNNIABMCHGH@@NJMKAN@MK@DLBOLMHNLJKOKOF@JJ@LJIKDOEBHENCOLMFAICJN@@BJICNIABMCHCCFMCMICJHHOLGGMDEFOMBLOGGFEECIDNKHGNKM@@NEBJOLMFAICFNLKCMNHDGEGMF@CCLBKKAIG@LIMDDD@INJDFAA@@ADHKIDNKHGNGJLFELCMDENHGJFJMKD@AEDAIODBCKIGDMKAKJH@@EJH@D@IKLBGI@EE@FD@MLHFMHOODCJBOJHHNANJANKODLOJNOD@@C@AHMGDKMDK@KNJBCKABEOGK@LNMNDE@FGIMOFN@@OKCL@GJMK@@JLGDCL@@CENK@AINF@MF@DDKMGNCIBJMEKFDK@MKJIELDMHJI@@@HLDGNAOCHNKMCEFMI@NKCJGOKA@MLADONOJIENAAJK@ICIIEBK@@OCLLDMCLBFJLGOKNIGIKL@ADMNJIOLNIMMIKMBJIOOJKHFNDHI@@CMKCKANGE@EHFGGFFNDJFNNMBHC@LMFOLDAMFNOHJOMGEGIJHB@@KOMBJ@HKAMENKOA@EG@@HL@AFCIBKH@BAGJMENLNDBLO@FMFNG@@ENLLAENFHIKMHHENHGOBBAKNJCAHBCMMEMC@KAI@GLGEMLNKKH@@KB@JKHDMLGFFOEGDNCCMMDCDHHGOLEN@FDFJICJELFAGJJLHDM@@@CM@ANAAABJIDAIAHJNGCGHJECLKHNKGB@@CDFG@IONCOBGEMN@@DKHHOFHBF@HKAOH@@@HKKEENJGCEHHHFCHHNJNOFOBAMKOFDBD@@CBCMGHBLNLKEAINBCOAAMFMMEBFLOAA@OCBEF@DDHODJEKDMJH@@DEGKOMLON@NDDALLHNCGHLM@JEDLCIJJA@LI@IMJEJF@GHM@HD@@MNANHHNMOJIKJNDCCDIEFGEJIAFHFEIKNKAADELCADBOOCMLMM@@ELIAJBEAGGENFIJLDDECEFCCE@@LOGMJIILJGMGHNGDFGKKBOC@@DLCED@KLAKAKFHFD@IOGIDONMLICCEKDCOHAFIDK@FCM@EBHMK@@MOIJGDEBBEGCJIFBLLMBBLAEGGDNLBLBEL@JOMKKDBAMHKGCIM@@GJCHFAOIJLBKAHDCBLJDNM@A@IJK@H@OC@IAKMGKLDKFO@GAEH@@JNB@BGJIMGLKMMFGKOILNOAIFJCNCNENNBFIDHLGHICHFGDFEC@@GMKDDM@ACLOIEGAIJLELBNBALHIDMKJGIHHGHBDONAKAKHJOLK@@EAN@ICH@MCFNKGKFAGDIEOBICGEHMLNDEAKOHIAHCCFMOALCGG@@BIIJNIJAKCNMIGIHD@JKMNFJKLMCMNLLFDJBCLKKKH@OJJIGFM@@OG@GH@EONGLI@@FDJAAGAKFNNN@GGDGOHBIJGCH@EOCFABDFDI@@GAJOCNEHCGNKNAAKGAHODJC@AGLKIFNILOJCBFBG@FKHBJHBHA@@OAMBJGEKKLACNHKANCGELJDILAJE@CHJ@FI@OMAGJHLCLECLFN@@LECNCLF@EHBJDBFHDOEGKJBENJBNN@LEDECDBGIBIO@MINMIOH@@N@EOAADG@CLEBMMLILLBCKEDJGMJLO@EILOAHNFAFDCBNDBNGC@@DBACKLKGJLINFILDJOOECENHEIADMFCDL@JAK@@MKKDOLBMLBJ@@FOIGJAFDFMFDJHEJIEMNNCFCFNMJCFAHCJCJKD@NNIHHJLNJNC@@CMAEHMKKDKDBBMLCJMEKDIJCKJFFGBBILGIFMAFF@MOMGDNGGA@@@NCJHNNILFBLLDOKGEEBDALIHCGIHHHLHJNNAJFKNJDFCACOND@@OELCBF@MMEGDGLHJMMJEEJAJOJHAO@DCNOOGLGCI@LKIFAIA@I@@FBFHFKNJFJCABHCIOBIAFGLLCJDMNFNACKHFEHHNMCO@OJNNJI@@FF@OC@NIAINAIECK@AM@AEHMJOMCFIHFGHMAMKCJFBBKGMB@CC@@BEDDEFKOEFNBAFDIFDJBJGAINKOJEIIELNICMNFCGOEMBCKGAO@@HJHFFGJOOKNJECBKIHH@JDDOJ@IFCBLAAFFO@OMJIAHLEMBIFB@@@BHEMNHBGFLJF@IGBMAKAHBHMGFBJHGNBCGKHDOJECOHGOJGFK@@FL@MEEOMMCOIJG@ODCJGKEOHEAOOEAALFNFOJIFOMKGNOBOOGK@@INKIMDDGOHLACBGENJNGKNFJKIL@LODIBJLLFKNANJAFHHAHOC@@INNCBCNGBIGD@OMGM@LKHFEDMJCJKFNAC@NGAMGBBFDNM@JAGJ@@BNAFJAFHKJ@O@DLBAAJ@LHFCHLGOMOFJEMGHDMEMOELNOAEIO@@@HC@OF@CAIJAEJIGEFNLDGAJFAGACKKAJOGLNJ@K@EA@ANB@DHG@@AAHCEHNHFAAONKMNIICLLEFNKLCOHHDGEFAFCJHHGOLBOBCIMF@@OCAJABAJLDCG@MEKGNMKBA@@CILDBOACEDFOMODKJGICNFFAAJ@@FLK@ONAM@JOGLMEBFCOMBMGIIEGHOJBHBIJCKKCGGGEHIFNNHE@@ODJCGIGCOGLM@@JEDDNLMJNENDNALHHNJDAOH@DOJKOAJCKIHE@@KCDHGE@ENNJDDJIAGJILJIGBMLHLD@DDMDGDCGACOGDDJMHKEM@@HBKCKOB@AEDGMCE@@OGE@HG@AMHNGAFCKGFJKJGAL@HBH@LFMM@@ODDDCINCG@OGCOGLM@KHIFCBBLB@LHHIEMO@LHLE@IEOJHEFML@@EBH@HBDIEG@ABGIGAGBCMJJDDF@CLAC@DBKND@@@BFNFH@HGMM@@DHKA@DLEC@FJLJDIJNEGJGMJ@BOLIFGFEJDLGAAOHHNECOEOIA@@JH@BFNEOGNLIMOBJEGNANOJAONA@NLDEFIHANFDGAJILNDMBNG@@FMMOKKKEBBIAAEBHJGLI@INOBAOJDKJBEIIDBAIJDJB@HNM@FN@@KMKGJDLJDODNH@CGGLBC@OBHODMC@ANF@MLGMFBBBHHFBHEKEG@@HIBIAFNILOLGIEMLHJLONDBEJFBAFMC@JJOECB@DOKOALFHH@J@@KMG@DFGHF@EDLOAFMGDBFOFIDBKJB@@ODAAFCAFFFIOF@DGHOM@@NBGACHBOLBC@CNFGFCABHBBFGDCANCJHMOLLBAIFECIFIDCKGE@@IEDGILMGFGFNJ@EFGNAIE@LHFCI@NMKFJNNNKCMOLOMGHAFIDG@@ENFECJIJDCFFMKIDMOJAGDCLBAAKCHFDFICGFDMFAHHOABC@CH@@AKFLOAMHMFGDOAOBIGFECABDDKOHNOAJHBKAOC@KJCMGIAKLAL@@GCJ@HKFEHFMAJFMMLAKF@NHHICAOCINOLEMBH@B@GHGLFKOHF@@@BKAK@I@COOKCFGMKBBEJGANDHOMLKAIJLMLIEFE@JFAFHLDIGG@@LJGFDIN@MAFFMOIBIJLCBBKIIHBIHGMONB@AFEKHOFOEOCEHAN@@OIFJFKLFKGE@AOMGAMG@OKOMKKECM@HK@KLDMEKAJIJNDLNLNL@@FNONIOLLBBANFHBGACGHDNN@L@OEMOMOJNINONNGKMOGKKNO@G@@NMKKMBHHNIFMFKEDFJGAINCEBGMBMDGJCBCMMMDNF@KMJL@IKN@@LIDKMLG@JNAAHIHJH@LEGCJDIGGGMHALI@@OAKMGNMOBNHNBCE@@NKHFHJBONBGNA@CLCH@@DEIKLKHMDMIKALDHHCDJOOJAKF@HHK@@ACHNMOGDD@NHGCLIBAAOHHMNHFLDIKJDGIIHMIMMAILDJEMGEI@@BJCNGKAH@@MFII@DFFDGAKIKACDBFEDBHHGOBJCEBFKHLAOLMO@@LEG@AMH@NMGC@GMIOIIJDJKCNCIFNJGGKMEOIJFIALDME@JNMG@@INACNHJ@ODAKNIFHDNBBBIJKCDC@FMJJMGJAAIODODLCMLELOK@@NDI@LGHEOCMDHDNBEB@DOKLJ@OIHIFJJKBAKJN@LDLJJNGGO@M@@LBCNLLGDFA@@IJACBIFFFI@LJJBNK@KFOGMNBDKCMAE@HOJMMH@@JLODDIBECLDAHGLDBIIFEBENNCCGELFHJAABHDLDDHEAKAHIAM@@GDBMAEHGCGAAEE@JBCMOLNFFJFNLMNAN@NIOFNACLMHNMFNGKJ@@CABD@DIDMMLBJAHNLDMF@HAHEKBLONNIA@@EHNMNLCMIBBH@OO@@KIKLMJFKBGMHJCFBDK@KJBBA@DNMJCOLMKKKABIAFGMNHLGLNE@@GJFMCOHEBOCCAMHJFDB@GHIBIGEOGCIDNKHFOKDKGALCMD@MA@@@JODKCMNMEGKOKINMAJE@JNBMLAHBKDD@IKLBEHFBKNFDDJHNCE@@KNLFEOBACEAGJNEK@MKHONMKHBFNIHMGDKMDJOAL@LCKNI@E@O@@A@EE@FDHFEKKHGKEMCGAKIJECJNDGDCL@@CENIF@E@F@JHICEN@@JKNJBONKHDODLHHDEDJGKMNJGMEBHMGIOCHNKGFHCKA@OOLCJE@@ODCINDACHHCHGGLEKMDNFHKGACGL@NIECLBFJOGHLHEGDOBNGL@@MKDFMHBJCOM@LADGAJJDONODFJFDKIOANGE@EHOAGDJNOBK@KN@@ICNCNCLGKIHNBANDLADJIMMJH@NAHBOHHKAMDIOLMFAGDIOD@G@@BJGGFMIIKMIHJNHJOEBBOLDLCHAMI@AMNFHIJC@FAMHGOEBBHK@@HKLI@BNNA@IAEMMHJFJ@BAGIBADJFJBLDMLGEGGOMBFCHNEBDA@@H@HENOL@EBBLBNJKAMKIAHHDFFF@BFCHMLDJK@BCMADJ@JHEC@@@NGEKDHJDKH@K@OMHDJNNJCMIOIJON@MBEEJDHDMHGO@@DMMKAO@@KHACAMGKFAJ@LGAAHBACGHGHDNDF@IAADLC@JBOEEHCOAALLOH@@DMLD@FCFNJDDEDBOKBMDFCHBEBCMFLBGMOKJOBFC@B@NLON@MM@@EAKLBONIEFGLOKBJBCIA@OCCBIAMLKCCDHJ@HLBDONCGAFGNOI@@DDBBLMMALLGKBDNIABFNJA@DBIKFJDKBICIKFHKKHLDELLFAK@@@KJHDCABKIAAMCJACCEGIKNKHJCKHCBONGCKAAN@MLNDHIKAMBM@@NFOJLLG@DFJLLOEAHLFMJII@BGKAHNGDD@BGFMHIMDLNBBCKAH@@KFJFD@KJHIJ@IA@@GELNKAHKCCFMK@FCLGFFAOJMFFNNHDJAEH@@CJLFBLHFGMKM@OAMD@JLFA@LKBHOKDBAMKGENGBAMDGLMHNGJB@@KAHDCBMEKFJILGFMKGBIOEIILKCFCLDKDJFLMAMJCDJLA@AHFD@@JGMFGKONOLFCBMBINCNEJEFONKKHGHICH@MGFGDLBLEFLDBMEC@@IFIIIJMMMMB@@N@CDMKKOFMLDG@EKLHONAIANNOKAFHAGACONE@@NOLGFAGLDFJDGOHFLOKFOEFCFFEIGIIHCCJJLHDAEKN@MLFKGF@@MKLMHDBAGIMIB@LMKOBEBCIOALAELMKKKJLHNJJOJFO@OMNJCK@@IDIFDJEEAFAFNNN@COJN@INCNAKJ@HL@ELNKICM@FHNAGCEJEH@@KHCGKG@GD@DC@AGLM@DOOJAKIMFLOGNG@FLHBJCLIIDMGKNJCE@@CHHFFNGC@C@DILAJN@JI@DNECLMCCEIGJJGELEGKKJILMAGKFM@@JFJOADOGEFJBENJC@OAD@KFJGGNNLBOBIOFDANANCGJOMKNEMG@@EAHMJILKOGKEDJGLCFGHO@ENKEAK@H@AFGDMNDIA@FIELODCE@@@NFKIOJOGINENHEI@LKICFFAJEBCLIDBMKHM@LBCAKCKJ@CHIIF@@DI@DFIE@BDCFCFNKOO@HKIDNOC@OFNBNNKMLJLOC@NFJGMEJAL@@BCAKCKJ@CHIJCKJEFBKCOAEAJIOFALFF@OKBOGFLH@MBAHILIC@@LONADFJGHNBCOHCGOEM@BJMEJFFCNINKNIBHKABHCCNIMIJAJK@@DBGCDMBAKLLHNOJIABDEEMDLFIFEAOC@NKGCNAIEELAHHIGLNC@@ABHCCNIMHDCCDEGKCDHGHLGANNBGIDEFKOFMOJAFDIFGJBKHJN@@AIEELAHHONODEBFIKDFHJABEMHHIHFFGJOMAGFECBKHFH@KAKH@@JAFDIFGL@J@FCJG@DEMIKNJJID@@LMMNHBCLAKF@IGCGIKBDJK@@FECBKHFIED@BANOLO@FMJINMKHFLGFEEOMMKAEJG@ODMJGJBIH@@KF@IGCGOODODKG@FDHIFK@GHCHINLIMDDGOOELCBGENIFGHOKO@@EJG@ODMLLGFKCLHFNFK@F@DCJCINODBCNGBOJG@OMGMHKOOJIA@@LCBGEOCMOABNEKBKJGEMB@LDEGBNANJAFHHNFGICA@@JHINEBG@@G@OMGLJFOB@E@FBB@DMOKKOHN@HCBBF@CAJ@IGGLDOKMAMMDNG@@GHDLBAMBNOICJ@LFKJEOK@ILGEAAMOEHNHGAE@AKGJ@GFJOLC@@@GNACEGH@@MBD@CJAN@@@ODJ@@LOC@EABAJONBFJBDEJGGOIGNA@@@EFENHGLNONBFHFKLOMEMJEEJKFLHGENIEBJGHFMBMC@OOMCOI@@GCJAGGLOAKHAGHGDJIKGAHEIOMODKMGMHKNCLONAHJDAFHBGGC@@HAHHBFKHGBBEBELOHOG@HADLKKKCFLB@JMOAAFGLG@BIO@EJAO@@NO@NEDNNLFBJADAGLDFHMJDEOHHBKGEGM@CKLLFEH@ACDENHIJ@@FGM@MGNCBLB@MLH@NODIHAD@DBODCMNHCDEHHIAMJADOEJKLLO@@MCKA@A@HAODHNGEAFBENDCGCJJBGAEKFJHHLAFCMNBBJLFOJLA@@KHMILNJO@FIJFIBBC@MLAMML@NHHEEBGOD@ECLJCLECOELDCOK@@BABOG@CFCEMNKCA@ADGBJLBFNF@@@JEDNKOLBNNGOCILGNJFLC@@KNA@IKIFFAOCAHDLCA@KBEJHLFFMNIAGNFDCIMDLAHAOIJEMGN@@@NIFJCALDGNBCKGHDNLAIGBBANFDGE@A@INICNEMMNJIMFF@@J@@FKALHHEIIALFNBDGJKDHDIGMDBAIJMLNJKDLBLC@BOJJAAHHAF@@GJICGEA@FFIBJMBMCIMCH@ACGMFBCGG@CBHDJFDCHAMEDNAOAO@@NHJKLOEA@HHJFAHJ@DMACLNKECB@DOKOALNIHCKKMDOGDDKHCD@@CEFCFLLO@ACNOLGCJJ@IGG@AFAEKFJIAF@LEHF@IDM@GFJKIDI@@ADJIBNKFMIIJDEHC@CJI@IKHLAEBGOBGFHDCKA@@KBOFKMCOCI@@JN@AOKMOFFEAEBFAAACEFJCCNHJEDNNGGHIFHEGFMNINFLEHB@@@CFKJGCKKCAGJJC@FEHNMLHHGDJIEGNH@OABG@JNGGFIOCDFNHH@@NCANBKHHCE@LCIFHHBEECGECNOD@A@BAGIAOLAGC@FN@DGNDJD@@HEFLFDBODBIOOCK@G@OBKLMMNJLDNJHIOCC@GHGEODAAIAOEL@@@OFGMEBKJDLEKIBCLLDHJCFMFDEFC@CNCEKGGFFCLHG@DOFHILF@@@MONJ@LHMGJBNKDIMAHNNGEHAA@NBINOEANHHBJGFIABDMIEAL@@HAOIINFONLGHCJJJ@GO@EFC@DIEOLAIJMBELGGMMC@GICBNBKK@@LFHBGACDMKJDCOFOOACIJFIANDJEDGMOEAAOEAKKNLOGGECIJA@@CG@EDGICBOOCALDMCIDAIODOMMGLG@HKMJJDANBA@DCLFOEOK@@@AHGHJOEOEFECM@KMCLJJNDDDJIKNBOMOBODNLHFELIBB@MBKIN@@NAKCLCONOA@BFLJIKKBAI@LDNH@GGDGJAK@HHFIOHDFCFGGD@D@@HFELI@HHMCEMACJHDMMJBDCANFHKAHALDMGDDCAAEIOLJHMDOI@@FIOHDBCFG@O@FHDFLGDLGMFGKIAAH@NKHNDLAKOJNHDNFIJDCE@@CAAEIODJHINGLNCIC@FOOBHAABH@J@LDLHIJHDHLFBE@FGOGIM@@KOJNHBFFINEDO@IKEOEBFMNIEGGOHELLCEGFNAHOLCBJKHE@BG@@DHLFCALFGKLGIMDAHGDJFFNLJNLHGDDJKHCFKOOKODBLIBJ@CH@@BIOLCF@KHGNBBLGBKEOKG@A@IOCMBEAEABCNLICBNLJFEGJGHN@@NMKOEFHI@LOGIJKFJICHHJCBNKFIHG@E@HOLMADHCFLABNBAKL@@OJBNMGHEBKF@ADEJJHKMHDEKBNE@IDMHOCKNLDJDDKDNANIMHD@@DGHCFLABOMOCFCLBMHIDMJ@MB@AJFKCMIDDACHKCEHFDNKHHOJ@@KJDDHDNAKKKDOFGAJC@KIOFAIOOCHECMNLLBNFMCBNAOJOGLHK@@OOCEHFDNJHNLOGGHGHFKADKHGF@MNMELCNCLCFHBFO@IHDFICK@@NECJOAOJOBFK@@OKJDGD@KKL@KMCBA@FDAMIKJMLBOEBNJGOCK@@@NJFL@IHCFKBLAAC@CCGNBKMEKNNLJBCKMBNCAKAH@MGKMML@G@@MFKBLEBNJO@HIFOJLGENI@@CAGHCNENF@JCLCENFLNCJKFIA@K@@IHD@BMGKM@HOKAJHIALICICHNCNE@DMI@OLJKJEEG@IJJDHLDO@@CEELOCJKFMAKIILOO@NHOALB@@CBJLNIGDMGFGLFIMDADJJOAJ@@@AJO@IJJDOGK@GOCLKILBFGEDBDBLMFFNNOC@KNCJLGEBBMGGJ@@DGEIMDADJINECHAKJHBOHHKALDBJFG@EGEGND@GFAJBFJ@CDMF@@IBJBLGEBBOGKIAMEOI@AMNFHHJL@IENHGNOCJHK@CGAMKIJNOJ@@FDIIJBFJ@BJHGLBKLNJBLDMLFIDGGKLNCH@DIAAILDDJNNODFC@@HKACGAMKIMM@ICH@ABDDFAANG@AH@DIHJA@IHHCLAIHB@ONMOL@@AAHDDDJNN@ECDKMDBFB@BHBEOLBMOE@@@DMLBGN@EKKBMDN@DN@@H@J@IHBACGB@JIDCG@IONBLN@FGAHNBCOAAMKLIEIBBCIK@JE@@@GOHKCKBMDFCHM@KDGFOBAMHHGG@DCLLHNCGABCLAEMABFJJCBJ@@LHGFBBCIA@OCLFMMLDHODIGG@KOJHDCCDIEFIFKKJGCEGCKLBL@@CMBEMABFNJA@DGGEEJEJF@CLN@LFOJLDDEC@LE@FLIHLFIJII@@@FIH@OCEGIKNKIC@DLCADBMJFCAKFJFD@IOGNCILMC@GEMHKAHK@@E@KFIHLFMJII@BGMOHNGDD@AMGCJLFBLLMBBLAKNNMD@KHFA@L@@IMA@@GELNKAHKCCDHK@FCLGE@BKAHDCBLJDNM@HAKEKGBOOEIN@@) (il:rpaqq *granite-light-bm* #*(100 100)JJJNJJJJJJJNJJJJNJJNJJJJN@@@JJJJJJKJJJKJJKKJJJKJKJJJJ@@@JJNJNJJJJJJNNJNJNJJJJNNJJ@@@JJJJJJJJJJJJJKKJJJJJJJJJJ@@@JJNJNNNJJJJJJJJJJJJJJJJJN@@@JJJJKJJJJKJJKJJJKJJJKJJJJ@@@JJJNNNJJNJNJNJJJJJJJJJNJN@@@JJKJKKJJKJKJJJJJJJJJJKJJK@@@JJNJNJJJJJJJJJNNJNJNJJNJN@@@JJJJJJJJJJJJJJJJJKKKKJJKJ@@@NJNNJNJJNNNJNJNJNJNNNJJJJ@@@JJKKJKJJKJKJJJJJJKJJJKKJK@@@JJJJJJJJJJJJJJJJJJNJJJJJJ@@@JKJJJJJJJKJKKKJJJKKJJJJJK@@@NJJJJNJNJJJJJNJJJJJJNJJJJ@@@JKKJJKJJJJJJJJJJJKJKJJKJK@@@JJJNJJNNNJJJJNJJJJJJJJJJJ@@@JJKJKJJJJJJJJKJJKJJJJJJJJ@@@JJJJJJJJJJJJJJJJJJJNJJJJJ@@@JJJKJJJJJJJJJJJJKJJJJJJJJ@@@NNJNNJJJNJNJJJNJNJJJJNNNJ@@@JKJJJJKJJJJJJJJJJJJJJJJJJ@@@JJNJJNNJNJJJNNJJJNJNJNJJN@@@JJJJKKKJJJJJJJKJKJJJJKKJJ@@@JJNNJJJJJJJJJJJJJNJJJJNJN@@@KJJJJJKKKKKJJJJKKJJJJKKJJ@@@JJNJNJNJJJJNNNJJJJJJJJNNJ@@@JKJJJKKKKKJJJJJJJKJJJJJKJ@@@JJJJJJJJJJJJJJNJJJJJJJJJJ@@@JJJKJJKJJJKJJKJJJJKJKJJJK@@@NJJJJJNJJJJJJJJJJNJJNNNJJ@@@KJKJJKJKKKJJJJJJJJJJJJJKJ@@@NJJJJJJJJJJNJJJNJJJJJNJJJ@@@JJJJKJJJJJJJJJJJJKJKJKJJJ@@@JJJNJJJJNJNJJJJNJJJJJJJJJ@@@KJKJKKJJKJJJJJKKJKJJJJJJJ@@@JJJNJJJJJJNJJJJJJJJNJNJJN@@@JJJJJJJKKJJJKKJJJJJKKJKJJ@@@JJJJNJJJNJNJJJJJJJJJNJNJJ@@@JJJJJJJJKKJJJKJKJJKJKJJJJ@@@JJJNJJJJJJJNNJNJJJNJJJJNJ@@@JJJJKJJJJJJKJJKJJJJKJJJJK@@@JJJJNNJJNJJJJJJJNJNJNJJJJ@@@JJJKKJKKJKJJKJJKJJKJKJKJJ@@@JJJNNNJJJJNJJJNJNNJJJJJJJ@@@KJJJJJJJJJJKJJJJJJKKJJKJJ@@@NJJNJNJJJJJJJJJJJJJNJJJNJ@@@JJJKJKJJJKJJKJJKJJJKJJJKJ@@@JNNJJJNJNNJJNNJNJJJJJJJJN@@@KJJJJJJJJJKKJKJJJKJJJJJJJ@@@JNJNJJJNNJNNNNNJJJJJJNJJJ@@@JKJJJJJJJJKKJJKJJKKJKJJKJ@@@JJNJJJJJJNJJNJNJJJJJJJJJJ@@@JJJJKKJJJJKJJJJJKKJJJKJJJ@@@JNNJJJNJNJJNJJNJJJJNJNJJJ@@@JJJJJJKJJJJKJJJJJJJJKKJJJ@@@NJJNJNJJJJJNJJJNJJJJJNJJJ@@@JJJJJJJJKKJJJJJJJJKKJJJJJ@@@JNJJNJNNJNNJNJJJJNJJJNJNJ@@@JJKKJJJKJKJJJKJKJJJKJKJJK@@@JJNJNJNJJJJNJJJJJJJJJJJJJ@@@JJJKJJKJKJKJJKJJJJJJKKKJJ@@@NNJJNJJJJNJJJJJJNJJJJNJJN@@@KJJKKJJKJJJJKKJJJKJJJJKKK@@@JJJNJJNNJJJJNJJJJJNNJJJJJ@@@JJKJJJJJJJJJJJJJJKJJKJKJK@@@JJJJJJNNNJJJJJJNNNJJNJJNJ@@@JJKKKJJJJKKJJKJJJJKKJJJJJ@@@JNNJJNJJNJNJJJJNJJJNJJJNN@@@JJKJJJJKJJKJJJJJJJJJKKJJJ@@@JNJNJJJNNJNNJJJNJNJJNJJJJ@@@JJJKJKKKJKKKKJKJKJKJJJJKK@@@JJJJJNJJJNJNJJJJJJJJJJJJJ@@@JJJJJJJJJJJJJJJJJJJJJKJJJ@@@JJJNNJJJNJNJNJJJJJJJNJJJJ@@@JJKJJKJJKJKJJKKKJKJJJJJJK@@@JNJNJJJJJJJJJNJNJJJJJJJNJ@@@KJJJJJJJJJJJJJJJKJKJJJJJJ@@@JJJJJJJJJJJJNNNJJJJJJJNNN@@@JJJJJJJJJJKJJJJKJJJKKKJJJ@@@JJNNJJJJJJNJJJNJNJJJNJJNJ@@@JJJJKJKJJJJJJKJJJJJJKJKKJ@@@JNJNJJJJJJJJJJJJJJJJNNNJJ@@@KJKJKJJKJJJJKJJJJJJJJJJJJ@@@JJNJJJNJJJJJJJJJJNNJJJJJN@@@JKJJKKJKJKJJJJKJJKJJKJJJJ@@@JNJJJNJNJNNJJJNJJJJJJJJJN@@@JJJJJJJJJJJKJJJJKJJKJJJJJ@@@NJNNJNNNJJJJJNJJJNJJJJJJN@@@JJJJJKJKKKJJJKJKKJJKJJJJJ@@@JNJJJJNJNNNNNJJJNJNJNJNJJ@@@JJKJJJKJJKJKJJKJKJJJJJJJJ@@@NJJJJNJJJNJJJNJJJJNJJJJNJ@@@JJJJJJJJJKJKKKJJJJJKJKJJJ@@@JJJJJJJJJJJJJJJJJJJJJJJJN@@@JJJJJKJJJJKKKJJJJKJKKJJJJ@@@NJJJNJNNJJJJNNJJJJNNJJNJJ@@@JKKKJKJJKJKJJKJKKKJJJJJJK@@@NJJJJJJJNJJJJJJJJNNJJJJJJ@@@JJJJJJJJJJKJJJJJJKJJJJJJK@@@) (il:rpaqq *granite-medium-bm* #*(100 100)JJJNNJNNJNNJNJJJJNJNJNJJJ@@@KKKJJJJJKKJJKKKKKJJJJJJJK@@@NJJNJJJNNJJJJJJJJJNJNJNJJ@@@KJKJKJJKKJJKJJJKKKKJKJJKJ@@@JJNNNNJNNJNNNJNJJNJJJJJNJ@@@JJJKKJJJJJJJJJKJJJKJJJKJJ@@@JJJJNNJNJJJNJNJJNJNJNNNJJ@@@JJKKJKJKKJKKKJJKJKJKJJKKK@@@NJNJJJNNNJNJJJNJJJJJJNNJN@@@KJJJJJJKKJJJKKKJKKJKKJJJJ@@@NJJNNJJNNJJJNNNNNJJJJJNJN@@@JJKJJJKJKJJJKJKKJJJJKJJJJ@@@JNJNJJNJNJJJJNNJJNJJJJJJJ@@@JJKKJJKJJJJKJKJJJKKKJJJKJ@@@JJJJNJJNJJJNJNJJNJJJNNNJN@@@JKJKKKJJKKKJKJJKKJJJKJKJJ@@@JJJJNJJJNNJNJJJJNNJJJNNJJ@@@JKJJKJKJJJJJKJJJJJJKKKKJJ@@@NJNJJJNJJNJJJJJJNNJNJNJJN@@@KKJJKJJJJKKJKKJJJKJKJJKJK@@@JJJJJJJNJJJJJJJJJJNJJJNNJ@@@KJKJJJJJJKJKJKJKKJKJJJJJK@@@JJJNJJJJJJNJJNJNJNJJJNJJJ@@@KJKJKKJJKJKJJJJJJKJJJJKJJ@@@JJJNNNJJJNNJNNJJJNNNNJJJN@@@JJKJJKJKJJJKJJKKJJJJJJJJJ@@@JJNJNNNNJNJNJJJJJJJJJJNJJ@@@JJKJJKJJKKKJJJKJJJJJKJKJK@@@JJNJNJJJJJJJJJNNNJNJJJJJJ@@@JJKKKJJJKJJKJJJJJJJKJJJKJ@@@JJNJNNJNNJJJJNJNJJJNNJJJN@@@KJJJKKKJJKJKKJJJJJJKJJKKK@@@JJNNNJNNNJNNNJNJNJJJJJNJN@@@JJKJJJJKJJKKKJKJJJJKJKJKK@@@NNJNNJNNJJJJNJNJJJJNNNJNN@@@JKKKKJKJJJJKJKJJJJJJJKJKK@@@JJJJNNJNJJJJJNJJJNJJNJNJJ@@@JJJKJJJJJJJJJKKJJKJJJJKKJ@@@JJNJJJJJNJNNNJNNJJJJJNNJN@@@KJJKJJKKKJJJKKKKJKJKJJJJJ@@@JNNJJNJNNJJJNJNNJJJJJNNJJ@@@JJJJKKJJJJJJJJJJJJJKJJKJJ@@@NNNJJJJJJNJJNJJJJNNJJJNJN@@@KJJKJKKJKKJJKJJJKJJJKJJJK@@@JNJJNJJNJNNJJJNNNNNNNJJJJ@@@JJKJJJJJKJJJKJJJJJJJKJJKJ@@@NJJJNNJJJNNNJJJJJJJJNJJNJ@@@JKJJJJJJKKJJKKKKJJJKJKJJJ@@@JNJJJNJJJJJNNJJJJNNJNJJJN@@@JKKJJJKJKKKJJKJJJJJJJKJJJ@@@JJJNNNJNJJJJJNNJNJJNNJJJJ@@@JJJJKKJJKJJJKJJJKKJJKJJJK@@@JNNJJJJNJNJJJNJNNNJJNJNNJ@@@KJJJJJJKKJJKJJKJJJJJJJJKJ@@@NNNJJJJNJNNJJJJJNJJJJNJNJ@@@KJJJKJJJKKJJJKJJKJKKJJJJJ@@@JJNNJNJJJJJJNJJNJJJJJNJJJ@@@JKJJKJJJJJKJJKKJJJKJKJKKK@@@JNJJJJNJJJNJNJNNJJJJJJNNJ@@@JKJKJJJJJJJKJJJJJJKJKJKJJ@@@JNJJJJJJJNJNNJNJJJNJJNJJJ@@@KJKJKJJJKJKJJKJJJJJKKKJJJ@@@JJJJNNNNJJJJJJJNNNNJJJJJN@@@KJKJKKJJKJJJJKJJKKJJJJJJJ@@@NNNJJJJJJNJJJJNJNNNNNJJNN@@@JKJKJKKJJJKKJJJJJJKJKJJKJ@@@JJJJJJJJJNJJNJJNJJNJJJJJJ@@@KKJJJJJJKJJJJKJJKJJJJJKKJ@@@NNNJNJJJJNJNNNJJJJJJJJNNJ@@@KKJJJKJJJJKJJKJJJJJKKJJKJ@@@JJNNNJJJJJJJJNJJNJNJJJJNJ@@@JJKJJJJKKJJJKJJJJKKKJKKKJ@@@JNJJJNJNJNJNJNNNNNJJJNJNJ@@@KJKJKJJJKJJJJJJJJJKJJKJKJ@@@NJJJNJJJNJNNNJJJJNJJNNJJJ@@@KKJJJJKKKJJJJJJKKJJJJJJJJ@@@JNNJJJJJNJNJJNNJNNNJNJNJJ@@@JJJKKJJKJJJJJJJJKKKJKJJJK@@@JJJJJJJJJJJJJJNNJJNJJJNJJ@@@KKKJJJJJJKKKJJKKJKJJJJKJJ@@@NJJNJNJJJJNJJJJJNNJNJJJNN@@@JJJJKKJKKJJJKKJJJJKJJKJJJ@@@JJJJNNJJJJNNNJJNJJJJJJJJJ@@@KJKJKJJKKJJKJJJJJJJKKKJJJ@@@JJNJJJJJJJNNJJJNNNJJJJNJJ@@@JKJJKKJKKJKJJJJKJJKJJJJJJ@@@JJJJJNJJJJNJJNJJJJJJJJNJJ@@@JJJJJJKJKJJJJKJKJKJJJKJJK@@@JJNNJJNJNJJNNNNJNNJJJJJJN@@@JKJKJJJJJJJJJJKJKJKJJJJJK@@@JJJNJNJJJNJJNNJJNJJJNJJJJ@@@JKJJKJJJJJKJJKKJJJJJJJJJK@@@JNJJNNJNNNJNJJJJJJJJJJJJN@@@JKJJJJJKJJKJKKJJKKKJJJJJK@@@JNJJNNJJJNJNNNJJJNJNJJNJN@@@JKJJKKJJKJKJKJJJJJJKKJKJJ@@@JJJNJJJNJJJNJNNJNNJJNJJJJ@@@JKKJKJKJJJJKJJJJJKJJJJJJK@@@NJJNJJJJJJNJNJNJJJJJJJJJJ@@@KJJKKJJJJKJJJJJJJJKJKJJJK@@@) (il:rpaqq *granite-dark-bm* #*(100 100)NNJNNJJJJNNNNNNNJNJNJNJNJ@@@KJJJKKJJJKJJKKKKJKJKJJJKJ@@@NNNNNNJJNJJJNJJJNNJJJNNNJ@@@JKKJJJKKJKKJKJKKKJKJJKKJK@@@JJJNJNNJJJJJNJJNJNJJJJJJN@@@KJJJJKJKKJKJKKKKJKKKKJKKK@@@JNJNJJJNJNNNJJJNNJJJJNNJN@@@KJKKKKKKKJKKJKJJKJKKKJKJJ@@@JNJNJJJJNJJNJJJJJNJJNNJNN@@@KKKJKJKKJJJJKKJJJJKJKJJKJ@@@JJNJJJJJJNNJNJNNNNNJJJNJN@@@JJKKJJKJJJJJKKKJJJKKJKKKJ@@@JJNNNNJNJJJJJJJJJNNJNNJJJ@@@KKKJJKJKJJJKJJKKJKJKKKJJK@@@NJJNNJJNNNJNJNJNNNJNNJNNN@@@KJJJJKJKKKKJKJKKJJKKJJJJJ@@@JNJNNNNJNNJJNJNNJNNNJJNNN@@@JJKJKKKKKJJKJKJKJKJKKKJJJ@@@NNNNNJJJNJJJNJJJJJNNJNNNN@@@KJJJJKKKJKJJJJJKKKKKKJKJK@@@NNJJJJNNJNJJNNNJJJJJJNJJJ@@@JKJKJKKKKJJKKKKKKKKKJKKKJ@@@JNNJJNJNNJJJJNJNNNJNJNNNJ@@@KKJJJJJJJJKKKJJKJJKKKKJJK@@@JNJNJNNJJNJJJJNJJJJJJNJNJ@@@KKJKKJJJKJKKJJKKKJJJKJJKK@@@NNNJJJNJNJNJNJJJJNJJNJJJJ@@@JJKJJJKJJKKKJKJKKJJJJKKJJ@@@NJNNJNJNNNJNJJNNJNJJNNJNN@@@KJJJKJJJKKJJJKKKJJKKJKKJK@@@NJJJNNJNJJNJJNNJJJJJNNJNJ@@@KKJKKJKKJJKKJKJJJKJKJKJJK@@@JNNJJJJJNNNJNNJJJNNNNJNNN@@@JKJJKKKKKKJKKJJKKJJKKKKJK@@@JNJJNJJNNJNNNNNNJNNNNJJJJ@@@KKJJJKKKKJJJJJKJJJKJKJJJJ@@@JNNJNNJNNNNNNNJJJNJJJNJJJ@@@JJJKKKJKJKJJJJKKKJKJJJJJK@@@NJJJNJJNNJNJNNNJJNNJNJNJN@@@JJJJJJJJJKKJKKJJJKKJJKJKK@@@JJNJNNNJNNNNNNJJJJJJJJJJJ@@@KKJKJKKJJKJKKKJJJJJKKJJKK@@@NNNNJNJJNNJJNNJNJNNJNNJNJ@@@KJKKJKJJKJJJJKKJJJKJKJJJK@@@NJJJNJNNNNJJNJJJJNNNNNJJN@@@KKKJJJKJJJJKKKJJKKKJJKKJJ@@@JJJNNJJJNNJNNJNJNNNJNJJNN@@@JKKKKKKJJKJJJKJJJKKJJJKKK@@@JJJNNNJJNJJNNNNJJNJNJJNJN@@@KJJJJKJKKKJKJKKKJJJJKJJKJ@@@JJNNNNNJNJJJJNNNNJNNJJJNJ@@@JKJKJJKKKKJKKJKKJKJJKKJJJ@@@JNNNJJJNNNNNNNNJNJJNJNNJN@@@KJKJJJJKKJJKJKJJJJKKJKJKJ@@@NJNJNJNNJJJJJJNNJJNJJNNNJ@@@KKKJJJKKKJJJJKJKJKJKKKKKK@@@JJNNNJJNJNJJJNJJNNJNJNNNJ@@@JJJKKKKJKJJJJJJJJJKKJKKJJ@@@NNNJNNJJNNJJNNNNJNJJNNNNJ@@@KKKJKKJJJKKKKJKKKKKJJJJKJ@@@JNNNJNJJJNJNNJNNNNNJJNNJN@@@JJJJKKKJKJKKKKKKKKJJKKJJK@@@NJNJJJNJNNNJJJNNJJJJNNJNN@@@JKKKKKKKJKKJKJJKJKKKJKJJJ@@@JJJJNJNJJNNNJJNNNNNJJJJJN@@@JJKJKKJJJKJKJKKJKKJJKJKJK@@@NJNNJJJJJJJJNNNJJNJJNNNNJ@@@JJKKJJKJKKJJJJKJKKKJKJKKK@@@JNJJJJNNJJJNJNJJJNJNJJNNJ@@@KKJJKKJKJKKJKKJKJKJJKJJJK@@@NNJNJJJNJJNJNJNNNNJNJJJNN@@@JJKJJKJKJKJJJKKJJJJJJKJKK@@@NJNNNNJNNJJNJNNJNNNJJNNNN@@@JKJKKKKKJJKJKJKJKJKKKJJJK@@@JNJJNJNJJNNNNNJJNNNJNNNJN@@@JKKJKKKJKKKKJJKKJJJJKKKJJ@@@NJJNJJNNNNNNJNNJJNNJJNNNN@@@KJKKJJJJJKKKJKKJJJKKKKJKK@@@NNJJNJNJJJJNNJNJNJJJJJJJN@@@KKKKKKKJKJJKJKKJKJKJJJKKK@@@JJJNNJJNNNNNJNNNNNNNNNNJJ@@@JJJJKJKJJJKKJKKKKJKJKJKKJ@@@NNJJJNJNJNJNJJJJNJJNJJJJJ@@@JKJJJKJJKKKJKJKKJJJJKKJJJ@@@NNJJJNNNJNJJNNNJNNNNJNJJN@@@KJKKJJKKKJKKJKJKKJKJKJKKJ@@@NJNJNNJNJJNJJJJNNJJJNJNJJ@@@KKKKKJKJJKKJJKKJKJKKJKKJK@@@NJNNJNJJNJNNNJNJJJJNJJJNN@@@KKKJJJKKJJJJKKJKKKJJKJJJK@@@JNNNNJJJNNNJNNNJJNJNNJJNN@@@JJJKJKKKJJKJJKJJJKJKJKKKJ@@@NNJNNJNNNNNNNJJJNJJJNJJJJ@@@JJKKKJKJKJJJJKKKJKJJJJJKK@@@JJJJJNJNNNNNJNJNJJNJNNJJN@@@KJKKJKKJKKKJJJJJJJKKKKKJK@@@JNNJNJJJJNNJJNJNJJJJNNJNJ@@@KJKKKJJJKKKKKKKKJKJJKJKKJ@@@NJJNJNJNJNJNNNJJJNJNNNJNN@@@KJJKJKKJKKKJJKKKKJKKKJJKK@@@) (il:rpaqq *tweed-bm* #*(200 200)@@HH@HHH@HH@H@@HH@@H@H@H@H@H@@H@@@H@HH@@@@HHHHHHH@@@BDBDDBF@BFDBDBF@FDBFF@@BFDDFBD@BB@FDDD@B@D@BF@FBDB@@DAD@BGGEABDC@EAFCFDAGDCFGECGBCG@CB@ADFACACGBDBDGBE@@DD@@DBBFBDF@FF@DDBDF@FFDF@B@@@BDBB@F@D@@D@FF@D@BDB@@HH@@@@H@HH@H@HH@@H@@@@@@HH@@@@@H@HH@HHHH@HH@HH@H@H@@D@F@@FFDFDBBD@DDBF@F@BFF@BF@BFBDFFBDFB@BBDD@D@FDD@@@FD@DAB@ACEGCDDGGBEBDF@EG@EDGAC@AFGEGCDGCDFADDCEEEE@@@@@@DD@F@BF@DFD@FD@BFD@@F@BFFDDBF@BDDDBBF@FDF@F@BF@@@@H@@@H@HH@@@HH@HHHH@@H@H@H@HHHHH@H@HH@H@@H@@@HH@H@@B@B@@FDDDFFD@FFDFBFDBD@FDD@BDDDDF@F@B@B@DBFF@@@D@D@@EAD@AAGBCG@FDBFGBACACGFAG@DGCDDFD@GCAA@CDDDEFGGBBB@@DDBDBFFBDD@FBD@@DDD@DDB@@D@DBDF@FFBB@DBDFFFBB@B@BF@@@@H@@@@@@H@HH@@HHHH@H@HH@HH@@@H@H@@H@HHH@@@@HH@@HH@@@BBFFFBB@F@FD@@DDD@DFDD@FFBDDBFDBBB@@@@FDBFF@DBBFB@@CFCFBCA@ADACD@FDDCFFAEBAGDCG@@@@@ABAGEBDGCFGE@CBDA@@@F@@BFF@DBBD@DDDBB@BDFFFDFDFFDDFBDD@DDDDFF@BBB@@DD@@@HHHHH@H@H@@@@H@@@HHH@HHHHH@@H@HH@@@@HH@@@H@HH@@HH@@BFFDD@DBB@@F@BD@D@BBD@DDBD@DB@DBFBF@@FBFFF@@BDB@F@@@FBECAF@EC@DDBGDE@FDBCGCGF@BB@DBACDGEB@EFCGDEFAACBF@@BB@BF@@BDB@BBFDBD@BB@@FDFFDDDFFDBDFFFFDDB@DFB@FFBD@@H@@HHHH@@H@@HHH@HHH@@@@H@@@@H@HH@H@@HHH@@@@HHH@@@@@@@D@B@DFB@FFFBDFDDBDDDF@FBFBDBD@@DD@@FDBBB@FDDB@BB@@@EB@@D@ACDBGA@EE@FD@ED@FE@GGDCBBGB@@FAFBAFCGDDGBFGD@@B@@@DFDBDDB@BFBBBB@BDFFB@DFDFDD@FF@DFFF@@FBBD@FBDB@@HH@@@H@@@@HH@@HH@@H@@@@HH@H@H@HH@H@@H@HHHH@H@HHHH@@@@DDFF@FB@FBDBDFD@@FBBBFFB@@DD@DFFFB@DF@@BB@@B@@DBB@@GCDDDECDBFBDGGCFAGACD@ADEFBAGDFAEEACEBBAGGBC@FFD@A@@BDBBB@FFD@D@FFFFFFDBFFFDB@B@DDFFDD@DFFF@BFDFDF@B@B@@HHH@H@HH@H@HHH@@@@@@HH@@@@H@HH@@@@HH@HHH@@HH@@H@H@@@DFDD@DFF@@BD@@DF@FFBB@BFBB@@BBDDDDB@B@@@FDFDDDFBB@@@CB@BC@DEDGFFGEGDFCCEEDCD@@GGDEF@FDFBACBEDFAGBBD@DE@@@BD@@F@@@BB@D@@@@BFFBF@BDBDB@FBFB@@BDFF@@FFBFBFDDF@@@HHHH@H@@@HH@HH@@@HHH@@HH@@@HHH@@HHHHHH@H@@HHH@@@@@@BBBDF@BDFDBD@@FBBF@@DFDDDBFDF@@@FBBDF@DD@FDBDBDDB@@@DEGCGEDGF@FDDADD@FCG@DE@BEDDCABBA@DA@AEBEBF@G@E@@D@@DF@F@@FDFB@BBFDBBD@DFFDB@@F@FD@BFB@@DDDB@DBFFBDDDD@@@HH@H@@@@@@H@HHH@@@@@@@@@@@HH@HHHHHH@H@HH@@@@HH@H@@@DDBDD@BD@B@BF@FD@@FF@DFFDD@BBDBDBF@@F@DB@FBD@DB@DB@@EGABGDEBBEGCBAFBDDEBBDAEGGDFDBDBED@BGECCDBAE@CGCAE@@FBB@F@F@BDBB@@DBBDBDFD@@@@BB@@@FB@@@BDFBDDBFF@F@D@@@HH@@@@HHH@HHHH@@HHHHHH@H@H@H@H@HH@@H@HH@HH@H@@@@@@@@FDBDDD@@BDF@DF@@BDDDBFB@D@@DDBBF@@@F@BDFF@B@B@BFDB@@EAF@AC@@ECFFCGCFAGDAEGBACGE@EDFDEACG@AA@CCFEGADCGG@@B@@BF@B@BBFD@F@@D@BBDFFBBDDBDFDDFDBBBDBBB@@FBB@FFD@@H@@@H@@HH@HH@@@@H@@@@H@HHH@@@@@HH@HH@@H@@H@@@@@@@H@@F@BFBFD@BFFBF@@BF@@FDBB@@FDB@FF@DFBBBFBF@FB@BB@B@@@@GAEBBGECCDACF@CAFCGEDBDADABE@C@B@FA@GEAGB@DCDECDFF@@DDBFBDF@D@BBDBF@DFDFBBBDFBBFF@DDDDBDBF@B@F@D@FD@F@@@H@@H@@@@@@H@@HHHHHH@@H@@H@HHHH@@HHH@HH@@@@@@H@@H@@@@DB@BBDBFBD@FF@DDBFFDBDF@D@@DDFBDD@B@B@@DBBDFDBDDBB@@FGAGBAFDFEFDB@EBAEEFFCFCFFEBCFA@CBCBCD@FFA@@BDFBFC@@BD@D@DBBDBDBBDDBBDDBD@BBBBFFFBB@DF@FD@FF@DFDFDFFF@@@@H@HHHHHH@@HH@HH@@@@@@HHH@@HHHHHHHHH@H@HHH@@@@@HH@@@FDDBBF@DDDFDFD@BDDBDDB@BFB@@F@DBFFFFDFB@@DB@F@@@@@@@FBF@FCFBFBCAB@CAGBAAFGDDCBDEFFFACC@FE@@FECG@GBFFBA@@FF@FB@F@@@F@@DBB@@D@@D@DBFDBF@@FF@D@DBBBFBBBFDB@BB@@@@@@@@HH@@H@@@@H@@H@H@@HHHHH@HH@HHH@HH@@@H@H@@H@@H@@@B@FFFBFFBFBDBBB@@@@BDDFB@@FBBD@@FFF@FDB@@@DDDB@FB@@@B@EEF@BGFDBF@AGBEACA@B@EGFBB@GFBCGC@DGBECG@GGBGFC@@FD@DDDFDDBF@BF@FDBBFBDF@D@FFD@@DFFFFB@FFDBFFFBFFFB@@HHHHH@@@HHH@@@@@HHH@HH@HHHH@HH@H@HHH@HH@HH@@HH@HH@@@@FFBBBFFB@FD@FDFD@DB@FDDDBBBBFF@B@FF@DFBBFDFD@B@FB@@BFAFBAF@CB@G@DDBAAB@D@FC@DGGEGFBEEG@DEEEGEDFGAEAG@@@@B@FF@B@@B@DB@FDFFDDF@BF@F@BBB@BFFDFB@B@D@@@FB@D@F@@@@H@@HHH@@@HHHHHHH@HH@@HHH@HHH@@@@@@@HHH@HH@H@@HH@@@FB@B@B@BDDBF@DDBFFDBB@@@B@DDBF@BDDFFDFDBBF@BFFF@@B@@FDC@GFAE@BGGDEEBFCGEBEGAAEG@GBB@BABCCCCGGGE@AFFF@E@@FDBBF@FBFFDD@@BDDDFDDBFDFDF@D@@FBD@F@@DFBBF@BBB@@D@@H@@H@@@@HHH@@HH@@HHHHH@@HHHH@@@@H@@@@@@@H@@@HHHH@H@@@BBBBFB@@DDFDBD@@FFD@@F@@D@FF@FBBFFBBBF@D@@B@@DFDD@@GDDDCAFCG@GGCGGDE@C@AFCBBDB@D@@AEEG@D@DE@AEGB@EFED@@DB@@@BD@DF@@BF@F@FBBDBBDDF@BD@B@DBBFD@@@BFFF@@@FDD@@@HH@@@H@@@@HHH@HHH@@H@HH@@HHH@@@@H@H@@@HHHH@@H@HH@@@B@@BFFDFFFD@DFBBDFF@FFB@FF@@FDDDF@@@FFDF@B@DFDDBFF@@FEEGCCCEBBAAAEB@BGDA@AFGBAGBDCBBEAADBAABDBB@@FE@FF@@BDBFBDDBDFDF@@BFFDBB@FB@FDDB@@FF@DDFDFBBB@@FB@DBDF@@HH@H@@HHHHH@H@HHHHHHH@@@H@@@@H@@HHH@@@@@HHH@H@HH@H@@BDF@DFF@F@DDDF@FDFDBFFF@DBBBB@@FD@@FB@FFF@FF@DF@FD@@FBGAC@BGDBC@CFFGFCAB@BBFGDCAFCB@EGDDBAAFECAFADCCGE@@@DDF@DDFFFFFB@DFFF@@D@D@FB@@FDBFBFFFBBDFDFDF@@F@DF@@@H@@@HHH@@@@HHH@HHH@@@@H@@@H@H@@@H@@@@H@@HHH@@@@@H@@@BFDF@D@DFFDF@FB@FFDB@BDDBF@FF@B@BB@FB@BBBDF@@BD@D@@GCB@@CFE@FEABFEEDACF@F@@ACAGCAFGDEEB@@B@G@GDFCG@F@@@BB@B@@@BFFBBFFDBBBDBF@FD@FDDB@@BDDD@DFD@BF@F@DD@FF@@HH@@@HH@H@@@HHH@HHH@@@HHHH@HH@HHH@@@@@HHH@H@H@@H@H@@F@FBFBDFBFD@@FDF@DF@FBFDBBDBD@@B@BDDDDB@B@BFDDFDFD@@FFGFAGDDBBAFF@BGACG@DFF@D@GEEGEGBFAFGFFGCEGGCCFG@G@@FDBBDB@@F@FDFBDDFBF@@FBDBFDBDDFBBBBDDDDFF@BDBD@@BF@@HH@HHH@@HH@@HHHHH@H@@@H@H@@@HH@HH@@H@HH@HHH@HHH@@@@@FB@F@BBFFBFF@@BDB@@@DD@BDB@DDD@B@DD@@BDBFFB@BF@@@B@@AC@FEGGDD@F@GCDABAAG@@EF@FDDACBDGAA@EAEEAADDBEEGEA@@BBBFFB@@@@DF@@@DFFDF@B@B@BDBFDDB@@FFBBBDBFB@D@FDDF@@H@@@@HH@HH@@@@HHHHHH@HH@H@H@HH@@HH@HHH@H@H@H@@HHH@@@@F@BF@B@FD@BF@F@DFBBB@BBBDB@FDBBDFB@@@FDFDDBDDDDFB@@FDA@DG@EGCED@DFBEB@DGCDB@GA@AFBBCBACBF@DDDBBFGGG@E@@DBBFDDFDF@@@@B@BB@FFF@@DBBBFB@BFFFDFBDBBD@D@@FBDD@@@HHH@@H@@@H@@H@H@@HH@@@@HH@@@@H@HH@@@H@H@@H@@H@HH@H@@FDBD@D@FBF@@DD@BBBDFDFFFBFFDDF@F@F@FFF@BDD@FDFFFBB@@CABD@DADEEDBBA@FDDEF@@A@ECBDGFFAA@@E@FEFDCEABB@@GG@@B@BDDBFBBFD@BBFBDB@BBBB@@DFDBBFDDBBB@B@@FFDF@DFDFD@@@H@H@HH@@H@@@HHH@@@@@HH@H@@H@@H@HHH@HH@H@@H@H@@H@@@@BFDBBDFDDFBFB@FD@BD@BFBDD@@BBDD@@BDBD@FBBFFDDB@FBD@@CFDFEGBACEAGBFEC@EC@GFEC@BFFA@EGDCEDBGAD@DCCFA@E@G@@@@DD@FD@FDBB@FBDDBF@B@BDBBFDFDBD@@BDF@F@D@F@B@@BDF@@HHHH@HHHH@H@HHH@@@H@HHHH@H@@HH@HH@HHH@@H@H@@HHH@H@@@FDB@FD@B@@B@FFDDBDDFF@BF@BFD@F@DBDBFBFF@D@DFDFBFFD@@ECDFE@BBCGE@DADGABBDGFGDFBFDCAGAFGE@E@GAGDBFGBC@CF@@@BFBFBDFB@@FB@FDD@DB@DDB@@F@@BF@@B@DD@FDDF@FD@FD@F@@@H@@@HHHHHHHHHHHH@@@HH@H@H@HH@@HH@HHH@@@@HH@H@@@HH@@@BD@@BFF@@@@DDD@BFB@B@F@B@DBFBBDDDDFDFFFDBFB@FDBD@@@@@@EFGD@EBBDBFBCAECAA@@DFFF@BFC@EDDBC@BCEADB@B@EC@@@FFDBD@BDB@@B@FD@DBFFBBD@F@BFF@DBDDBD@DD@FF@@DDDB@F@@HH@@@H@H@@H@H@@@H@@@@H@H@H@@@H@@@H@@H@H@@H@H@@HHHH@@DDDD@FBFFBDDDDBFBBDDFB@BDBBDFDBFDFBBFBFB@B@FDFF@DD@@EACDBGFAEFGDGCBBBCAA@GCCBAAEDCCCD@B@@DBDGFCGAFGFGA@@DDBBDDD@DDFBBDF@@BFFB@@DB@BFBDBB@B@BF@BB@DDDDDF@B@@@HHH@@@@HH@@H@H@@@@@HHHHHH@HH@@HH@@H@@H@HHH@HHH@H@H@@FFFBDDF@DFBDDFD@@DFDB@@@BFB@@FFDD@BFFD@@DDDFBBBB@@@@CFBFD@CB@AB@AA@@GEDFCA@CCCFEC@FCDGFFAGBEFFFF@DBAE@@@BBDFBD@FFDBD@F@DD@BDF@@DBB@FBDB@DBFDFFB@DDFDD@FFBB@@H@H@@@H@H@HHH@@HH@@HH@HHHH@@@H@H@H@HH@HH@@HH@@@H@@@@BFDFFBFFFDFBBDB@FBFDBDFFFBB@F@@B@@DFFFDDBDDFDDBDDB@@AFAAABEEEEB@@F@CDECCGFEDDG@ECD@GFAAAFFGCAF@AGACGFE@@FFDFF@FDDFBDFF@FDFBFFDFBFFD@F@@@BBBBD@D@DBF@DDFBFF@@HHHHH@@@@HHH@@HHHH@@@@HH@H@@HHHHHHHHHHHHH@H@HHHH@H@@@D@FDBDD@F@FFFF@BFBF@@FBF@BB@@D@DDFB@BD@F@F@FBDBD@@@C@CGCG@GD@DC@AGDE@DGGBACAEFDGGFG@FD@BBCDAADEGCFBCE@@B@@FFFFB@B@D@D@BF@B@@DFDBDDBBD@FBBFDDDFBBB@DD@FBFD@@H@HH@@H@@@H@@HH@@H@@@H@H@@HHH@H@HH@@@H@H@@HHHHH@H@@@D@@DB@DBFFBDDBFDBFF@F@DFBD@B@@@@FFDDFD@@@F@DDFDBD@@@FFCAGBGGAFEF@EA@DCACFFABEBCDADBEC@E@DBCACCCB@C@AAF@@D@@DF@D@BDBFBFFBFF@@B@DFFB@FFFBFFBDDBDFB@FFBFDDB@D@@@@@H@HH@@HHH@HH@@@H@H@@@HHH@@H@@@HH@H@@HH@H@@HHHH@@@DFF@DFBF@FBBF@BFFDD@BBDDBFFBF@FBF@B@B@B@BBF@D@B@BB@@DBGCDEBACDD@FGBAABDEEEDDFAFEAGC@FCGCFAAEEDA@@AGDFC@@@B@BBF@D@DBBDDFBBD@F@DF@FFBF@DDFBFFDFB@FD@FFBBB@BF@@@H@@H@HHHHH@@@@HH@@HH@@@HHHHH@@@HHH@@@@@@HH@H@H@HH@@B@FD@FFD@B@FBBF@DDD@BFBB@D@@DDDF@BBD@BF@@FBF@BBDBB@@FECBC@FAED@BAFGDG@FEBAFEC@FDGFEEGEECAEBG@GDEBGBBA@@@BF@@FBFFFDFDBF@FD@@FB@F@B@@FD@DDDFFFDDBBFDF@FF@FBF@@@H@@H@HHH@@H@HH@H@H@@@@@H@HHH@@@H@@HH@@HH@HHHHHHH@@@DBBFDFBDF@BFDBBBBFDDB@DDDFBF@FB@F@@FFF@B@@@B@@FDBF@@G@GEGDBFGB@E@FBB@DEGCCG@F@@CBBF@CAB@AGGDDGCEAEEDFG@@F@DDB@DBFF@BB@DFBBDFB@@DFD@@DFD@F@F@D@@BFB@FFBFDB@@@@H@@@@H@@H@@@@H@H@@@H@H@@HH@@@@@@HHH@@H@@@H@@HH@H@@@@DFDF@FDFFFBF@FBDFDDDBDDBBFD@FDF@DBBF@FDBDB@FFDBF@@@GCBAGGDGAC@AG@GDBACGA@EAGEGDCEGE@CFCDGFA@BDAF@BGGC@@@@@@BFB@FBBDBDDF@FF@@@DDBBBBFDB@BDF@@FFDF@B@F@DB@F@@HH@H@@HHH@@H@@@@H@@HHH@@HHH@H@@@H@@HHH@@H@@@@@HHHH@@FFD@DFFBBDB@DD@@FFD@@@D@DBFDBDF@BDD@@@@DB@DFDBBDDF@@ECCA@A@@AGD@FGEAFBEFDCGCBBBGAECFB@@DAFCEFBBBDFGBDA@@B@D@DFBF@F@BF@BBB@DD@DDD@F@@DDBFFD@DBDBBDDBFDDDBFB@@@@@H@@@@@@HHH@@@@@@@HH@@H@@@@H@@HHHH@HH@H@HH@HH@H@@@BF@@@B@FF@FB@@DDB@@BBDB@DFFDF@@FFFDB@DDD@@@F@BDDFF@@@FAFBCADDGFBCCG@DFDAAGBBAFFDGE@A@AFACFEEEFBAEFF@@B@@FB@D@@D@@@DFFBDFBBD@D@FDDB@@BDDFBBDDBDB@BFBB@@@@@F@@@HH@@@@@@@H@HH@H@HH@H@@@@H@@@@@@@@H@H@@@H@H@@H@H@H@@F@BBDFD@@@@BF@@B@DD@BDFBDBB@DFBF@DF@@BBBDDFFDDB@BD@@CEFCFDDG@ACFGDGCBB@AGG@AFAECFBAAF@DE@F@ADE@GFBCADA@@@DB@BFBFD@@BDD@B@BB@@@B@D@DBFFBFF@DBB@@@BBFFBDBFB@@@HH@@HHHH@@@@@@@@@@@@@H@@HHH@@HH@@HH@H@@@HHHH@H@H@@@@BFBBFBBBB@FBBB@FD@FDD@@FDB@DFF@@F@BF@BFFFF@FBDFF@@@@FCAFBC@@CE@DCAF@@BEECGECFGD@A@BAGAAGDAGC@FF@DGFDBD@@@DFDFDBFDB@FFBB@F@FBBDDDFBDDFB@@FBB@F@FDFD@@@@FDD@@@H@@H@@HH@H@HH@@HH@HH@@H@@@@@@@H@@H@@@@@HH@@@H@HHH@@@@DFFB@D@DFBBFBD@D@@FFFD@@@@FB@FFD@F@@BBFF@@BDD@D@D@@@AGAAFFGFDG@CBBB@GG@EFC@DAEGDAABEBEDGGEEC@GACBFBCC@@DF@BF@BDDBBDBFFFF@B@BF@@FDBDDFDFD@@FD@BBFDFFFDB@B@@@@@@@@@H@@HH@@H@H@H@@HH@HHH@H@@HHHHH@@H@@@@@H@H@HH@@@@@F@BFDFDFDBD@BDBDBBFDDDB@BFBFDFBFDFD@FDD@BB@DBB@F@@FACCDCGFGA@BFDBACCBAA@DDF@@GGDGBAC@@@FAG@DFCFGGD@D@@@FDD@@@@DBDD@BB@DDDBBDB@FF@B@@@DDDFDDB@@D@FDB@DDF@@@@HHH@@@@@@H@@H@@H@@H@H@@HH@@H@HHHH@H@HHHHH@H@HH@@@@@B@@D@FDB@@FFDFB@B@FFFB@@@B@@B@DDD@@B@D@DFBD@FFFF@D@@CGBF@BFFAFEDG@ACEGEBFEFAEGGG@EDDCEGFFA@GDCBBC@E@BG@@D@DFB@DFFBDF@DD@@FDBFFFDBFD@FDDBB@BFBFFBFDBD@BB@B@@@@HHH@@@HH@H@@H@@H@HH@@@@HH@H@@@@@@@HHH@@HHH@@@H@HH@@FDBFDF@@@DFF@BBFB@B@@BBBFBF@@F@D@@FDD@D@BFD@BFB@BD@@GBBFEG@EBCF@ADEBB@CE@DECBFE@ADE@GCCFDDBDDCDFAFAE@D@@DF@BFD@BFDFBFBDBD@@DDB@DB@@BFBBD@DD@B@BBD@FDFB@@FB@@HH@@H@H@HHH@H@@@H@@HHH@@HHH@H@@HHHH@H@H@@H@HHH@HHH@@FFBD@FDFB@FDFFF@F@FB@DB@FF@DFDDDBFBDBF@BFF@@@DF@BB@@FECBGAGBGBFC@@GCBDGD@CCD@CECBA@FDAEACBEDBGEBFBGGCC@@@FBFD@@@BFBBD@@B@BBFFBBDDBFFDBBBBDBFB@B@@@DFBDDD@F@@H@H@H@@HHH@HH@HHH@@HH@@@@@H@H@H@@H@H@@H@HH@HH@H@@H@@@@D@BDFBD@@FB@B@@@D@B@B@FBFD@DD@@FDBBBDDF@@BBD@DDF@@CEEDGCBCFEACAADGG@F@GADB@@CBBDFAGDEGFGDFAEDADBBGAB@@@@BF@@BBDFFB@FFBDB@DBFFDDBDBDDFFFFFB@BFBBDFDBBDFFB@@@@@HH@@@HHH@@H@HHH@HHHH@H@@H@@@@@@@H@@@@@H@@H@@@H@@@@BBBDFDBBFFB@@DDF@@@DFF@@BD@@DF@FFFBB@B@BF@DB@BFFB@@FDAABBFB@BB@GDBCDFBBDDEDFADGGCDFC@@DAAAADDDBFFGDFC@@@B@BF@DB@DD@@B@@@BDDF@@FF@@@@D@@B@@@@@BD@@@B@FFDFD@@@@H@@@HHH@@@@HH@@@@@@H@@HH@HH@@@@@HH@@H@@HH@H@H@@H@@@@B@@@B@BFB@B@DBF@@FFBDF@FF@@FBBF@@DBD@D@BBB@B@BD@@@GG@CCCBEDFC@E@CDGFGBAE@@GG@DCDD@FCGABCDAEEABFBBCBB@@D@FFBBB@@@FBDFDDDD@FD@FF@BFB@DBBD@DF@FBBBFBDFBBDBD@@@H@@H@@@HH@@@@@@@H@H@@@HH@H@HHH@@@@@H@@@HHHH@HHHH@@@F@@@FBDF@BFB@B@DDB@DBDBFB@BFBFD@@FFFB@DDB@FDD@B@@B@@E@CFA@DFEBAA@BGEG@FGDD@AEGCBDFBDDEBBDACFFED@C@FA@D@@@D@@@FDDFB@@BBBD@B@FBDFD@BB@@DBBDBDFD@@@BDBFBFFD@F@@) (il:rpaqq *chambray-bm* #*(200 200)@@LLDLLLDHLDHD@LLD@LDHDL@L@L@@LDD@LDLH@@@DHHHLLLH@@@@A@A@@AAAAA@@A@@@@@@A@A@@AAAAA@@A@@@@A@A@AA@@@@@@@@@D@D@@DDD@@D@@D@D@DD@DD@DDD@D@@D@@@@@DD@@@@D@D@DD@D@@@@@@IJKKBACHJCI@@K@J@BBIKIBIAIJ@BKHBHIAAI@CK@HACIK@@LH@@@DLDHLDH@HHDDHDDDD@@LLD@D@DL@LH@HLLH@HH@HLDH@H@@A@@@@AA@AAAA@@@A@@AA@A@@@@AA@@A@@@@@AA@AAA@AAA@@@A@@DD@D@@@@@DD@DDDD@D@DD@DD@DDD@@@@DDDD@DD@DD@DD@DDDD@@IAIIAHABHBBIAJHIKAABKAAHCHJKC@ABKAJIA@BJKHBHK@KAKK@@DDLDD@L@LHD@@LLDHLHHD@L@H@LDHLLLHDLDLHDL@@HD@DHH@L@@@AA@@@@@@@A@AA@AA@A@@@@@A@A@@AA@@A@@@AA@A@A@AA@AAA@@D@D@@@D@@D@DD@DD@@@@@DD@D@DD@DDDD@D@@@@@DDDDDDD@@@@@HHJAJCJB@HHBJI@AH@IAIICAAAIACIJAKKJCAHK@BKJKJACIJB@@D@HDDDDD@H@HLD@LHHLDL@HL@LH@@DL@H@@LDHLHD@@@HHD@HL@@AA@AA@A@@AA@@A@@@A@AAA@@@@@AA@@@AAAA@AAA@@AA@@@@@@@@@D@D@@@@@D@@D@DDD@DD@D@@DD@D@@@@@@@@DD@DD@DDD@@@D@@@IBA@JCK@HJKAI@@@JJHJICJKAK@JCHIKC@AHAIA@CJHKKBIIAH@@@HHHLLDL@H@D@DL@D@LLLDLHLLLDDL@LL@@D@LHD@@L@LH@DHH@@A@A@@@AA@AAAAA@@AAAAA@@@AA@@A@A@AA@A@@@A@@AA@AA@A@@@D@D@@D@D@@DD@DDD@DD@@D@DD@@@@D@@@DDD@@DD@DDDD@@@@D@@BJICJIABICHCCBICIICJHHKHCCI@ABKIBHKCCBAACI@JKHCJKI@@LD@HLLLD@H@DLLH@LLHDDDDLD@@@L@HH@HD@LHLDDD@HLHDD@@@@A@@AA@@A@A@A@@@A@AA@A@@A@@@AA@@AA@AAA@@AAAA@AAAA@@@@D@@@D@@@D@D@@DD@DD@DD@DD@DDD@@@D@@@D@D@@D@DDDD@DDD@@C@AHIC@KI@K@KJJBCKABAKCK@HJIJ@A@BCIIKBJ@@KKCH@CJIK@@HLDD@L@@@DLH@@HLD@LD@DDHLDL@H@HLDHDDH@LHHHDLDLHHH@@@@@@A@AAA@@AAAA@AA@@AA@AAAA@A@A@A@A@AA@AA@A@AAAAA@A@@D@DDDD@D@D@DDD@D@D@@D@@DDD@@DDD@DD@@D@@@DD@@@DDD@@@@CIKCKAJCA@AHBCCBBJ@JBJJIBHC@HIBKH@AIBJKHJKICACIJHB@@HLL@H@HH@LDLHL@@DD@@HL@@D@H@HH@@@DHLDLLLD@LL@DLDLD@@A@@@AA@@@AAA@@A@@AA@@AA@@AA@@AAAAAA@AAA@A@AAA@@AA@@@@@@@@@DDDDDDDDDDD@@DDD@D@@DDDDD@DDD@@@@DDD@D@@D@DD@@@CI@AJAAABJI@AIAHJJCCCHJACHKHJKCB@@C@BC@IKJCKBCAIJ@@DHHHLDH@D@HH@LH@@@HHHDDLHD@DHHHD@HHLHLLDL@@LHLDD@D@@A@AAA@@@@@AAAA@@AAAAA@AAA@@@AAA@AA@A@@@@@A@@AA@A@@@@DDD@DDDDD@DDD@DD@D@D@DD@@DDD@@@@@@D@@@D@D@D@D@D@@D@@IJAJHHJIKJIKJJ@CC@IABCAJIABHBAIKJKAA@AHCA@BKKCIHII@@DLH@H@D@DDDLDHHLDDD@DD@@D@@LLDLHHHLHDLDHLDDDDHH@L@@@@@AA@@A@AAAA@@@@@AAAA@A@A@AAAAA@AA@A@A@A@@AA@A@@AA@@DD@@DDD@@DD@@@D@DDD@@D@DDDDDD@D@DD@@DD@@D@@D@@D@@D@@CJCHBAKIJHBKAH@CBHJ@JI@A@IJK@H@KC@IAKICKH@KBK@CAAH@@HL@@@DHHLDLHLLDDHLHLLL@HDH@L@LDLL@DHDHLDHH@HDDDDD@@@AAA@@A@AA@AAAAAA@@A@@@@A@@A@AA@AA@@A@@@A@AAAA@@A@A@@D@D@@@@@D@DD@D@D@DD@DD@@@DD@DDDDD@@D@@@@@@DDD@D@DD@@BIIJJIJAKCJIICIH@@JKIJBJKHICIJHHB@JBCHKKKH@KJJICBI@@LD@DH@DLLDLH@@DDH@@D@HDLLL@DDDDLH@HHD@H@DL@D@@DDDH@@AA@AA@A@AA@A@AAAAA@A@@A@AA@AA@@A@A@A@@@A@@A@@@@@@A@@D@D@@DD@@D@@D@@@D@DDD@D@D@@D@@@@@D@@DD@D@@D@DD@DDD@@HACJCHB@AHBJ@BBH@KACKJBAJJBJJ@HA@AC@BCIBIK@IIJIIKH@@L@DL@@DD@@LD@LLLHLL@@HDDHDLHLL@DHLL@HLD@DD@@LD@LD@@@@@AAA@AA@@A@@A@@@AAAAA@@AAA@A@A@@@@AA@@AAA@A@@A@@@@@DD@D@@DDDDDD@@D@@DDDD@D@DDD@@D@@@@@@@D@DD@@@@DD@D@@@CIAAHIKK@K@BBIHCJIAK@IJCKJBBCBBIHCIBIABB@IKIC@JCCA@@@L@HHLLHLD@LLDLHDDD@D@LHH@DHHHHLHHLL@HDHLHDD@@@LLD@@AA@A@@@AAAA@A@@@AA@AA@A@A@@AA@@A@AAA@AAA@@AA@AAA@A@@D@D@D@D@D@@@@@@@D@@@DDDD@@DDDDD@@@@DD@@DD@D@D@DD@@@@BB@KC@JIAIJAIACK@AI@AAHIJKICBIHBCHIAIKCJBBBKCIB@CC@@@DDDDDHLDDL@@DDHDDH@HD@HLHLHDHHDLLH@LLD@DLDL@@HD@L@@@@@@@A@AAA@@AA@AA@@@@@@A@@A@A@@AA@@A@AA@AA@@AA@A@@@@@@@DDD@@DDD@D@@D@D@@@@@@DDD@@@DD@@D@@DD@D@D@DD@DD@@@BH@IAAKIICKIJC@K@CJCKAKHAAKKAAAHBJBKJIBKIKCJKBKKCK@@HLHHLDDDLHL@@@DDLHLDHLDHHHL@LLDH@HLLDHL@LH@DHH@HL@@@A@@A@A@A@AA@@AAAA@@A@@A@A@A@A@@AA@@AAAA@@@@@A@@AA@@@@D@D@@D@@@@D@DD@@@@@D@D@@DDDDDD@DDD@DDDDDDDDD@D@D@@@HC@KB@CAIJAAJICABJH@CAJBACACKKAJKCHJJ@K@AA@AJB@@HC@@@@H@DHLHD@@LLHLLHH@LLDDLHL@LHHDDDD@D@HHHDLL@L@@HLD@@AAA@A@A@@@AA@AAAA@AA@A@@AA@@@AAAA@@AAA@A@AAA@@@AA@@@DD@@DD@D@@DDDDD@D@DD@DD@@DD@D@@@@@@@@@@DDDD@@DDD@D@@K@JCCICCKCHI@@JA@@JHIJJAJ@JAHHHJJ@AKH@@KJKKAJCKIHA@@H@DHDD@DLLHDDHH@DHHLHHD@LLHLD@DDLDDD@D@@LDDDHLHHDL@@@@AAAA@@AA@AAAA@@AAA@@A@AA@@AA@AAA@@A@AA@@@@@@@@AA@@DDDD@@D@D@DD@DDDD@@@@D@@@D@@D@@@DDD@D@DD@@DD@@DDDD@@ABH@HB@IAC@ABCICACBCIJJ@@B@CHAC@@BKJ@@@@BBJBH@HCII@@DHH@@DLD@@DHLHDHHLDDHDLH@@LLHDDDDHDLD@@LHHLD@LDLH@@@@@@@@@AAA@@AAA@@AA@A@A@AA@A@@@@A@A@A@@@AA@A@@@A@@A@@DDDD@@@D@@@@@D@@@DD@@@DD@@D@D@@@D@@D@@@@D@@@@DD@DD@@KIKCJ@HJ@K@JH@CCCHBC@KBHK@IC@AJB@IHCIBBBBHHBBHAKAC@@HH@H@DLHLLLDHDLLHHLLLD@DHD@@DL@@HHLD@@@DLHL@LDHH@H@@AAA@@@A@@@A@@AA@AA@@@A@A@@A@@@@A@AA@AA@@@AA@@@A@AA@@D@D@@@@DD@@@@DDDD@@@@@@DDD@@D@@@DDDD@@@DD@@D@D@@DD@@IA@CIHICBCBJJ@ABCJAIA@HHBCI@JIKBJJJJKCIKHKICHABI@C@@DLDD@HHHD@DDLHHDLLH@DD@L@@@H@HDDDH@DDDLD@HHL@@@@@H@@AA@@AAA@A@A@AAA@AA@AAA@@@AA@@AA@@@AAAA@A@AAAAAA@A@@@D@@@@@DD@DD@@DDDD@@D@D@@@@@D@@DDDDD@@@@@D@DDD@D@D@@@BKAK@I@CKKKCBCIKBBAJCAJ@HKIHKAIJHIHIABA@JBABHH@ICC@@LHDDDHL@L@DDLLH@HHL@@@HHHH@HHDLLL@@@DDHHLDLDL@DH@L@@AA@@@A@@AAA@AAAAAAA@AAAAAAAAA@@A@A@@AAAA@A@@@@@@@@@@DDDD@DDD@@@DD@@D@@D@DDD@D@DDDDDD@D@DDDDD@DDD@@DD@D@@JIKKIBHHJIBIBKA@BJCAIJCABCIBI@CJCBCIII@JB@KIJH@IKJ@@LHDHLLD@HL@@HHHHH@LDD@HDHDDDLH@LH@@L@HLDLLL@LHL@@D@@@A@@@@@A@@A@A@A@A@@@@AAA@A@A@AAAA@@@@A@@AA@AA@@@@A@@@@@DDDDDD@D@D@D@@@@D@@DD@DDD@@@DD@@@D@DD@@DD@DDDD@@@BJCJCKAH@@IBII@@BB@CAKIKAC@BBA@BHHCKBJCABBKHHAKHIK@@LDD@@LH@LLD@@DLHLHHHDHH@L@HDLHDDHLDLHHDH@LDLD@HLLD@@A@AA@@@@A@AA@A@@@@@@@A@AA@A@@A@@AA@AAAA@A@@AA@A@AA@@DD@@DD@DD@DD@DD@D@@DD@D@@D@@@D@@@@@@@D@DDD@@DDDD@D@@HBCJHHC@BA@@IJACBIBBBI@HJJBJK@KBKCIJB@KCIAA@HKJIIH@@HLLDDH@D@LD@HDLD@HHDD@DLL@@DDLDHH@@@HDLDDHD@H@HH@L@@A@@AAA@AAAAAAA@@@AAA@@@@@@@@A@A@@@AA@@AA@A@@A@@AA@@@@@@D@D@DDDD@@@@DDDDD@@@@D@@DDDD@@@@D@DDDD@D@@@@@DD@@KIKHIJBKBCIHJCBB@K@KJBBA@@JIJCKHIKKKABIABCIJHHCHJA@@DHDL@LHD@L@@@LHHDD@@DHH@HDDLD@HDLHHDLHDHD@L@LD@L@@@@@A@AAA@AAAAAAA@AA@A@@@@A@A@@A@@@AA@@A@@@A@@@@@@@AA@@@DDDDD@@@D@D@DD@@D@@DDD@@@DD@@DDD@DD@D@D@D@@D@@D@D@@A@AA@B@HBAKKHCKAICCAKIJACJJ@C@CH@@CAJIB@A@B@JHICAJ@@HHLH@LLHHDLDLHHDDDHDHLLHDLD@HLDHL@HLHDDH@H@@LLL@HD@@A@AA@@AA@@A@AA@AAA@@@@AAAAA@@@AAA@@@@AA@@@AA@A@@A@@@D@DDD@@@@DD@D@DD@@@DDDDDD@DD@@D@DDD@D@D@DD@DD@@@@D@@ICJCJCHCKIHJBAJ@HA@JIIIJH@JAHBKHHKAI@IKHIBAC@IK@@C@@@HDDDLHHHLHHHLHHLD@@LLDL@H@LH@@LLDHHH@@D@LHDLD@@HH@@@A@A@@@@A@AAAAA@@@@@@AAA@A@@@@@@@A@AAAAAA@@A@@A@@A@@@@@DDDD@D@@D@D@@@D@@@@@DDDD@@D@@DDD@@@@@D@D@@@@D@@@@JCAK@HJ@KH@K@KIH@JJJJCIIKIJKJ@IBAAJ@H@IHCK@@@IIKAK@@HH@@@LDHD@H@LD@@H@@@DHDHDLDD@H@@DL@@H@LDDH@L@@LLLH@@@A@@@@A@@@@@A@@AA@A@@A@@A@AA@@@AAAA@A@@A@@@@@A@@AA@@D@@D@DD@DDDDD@@@@@@@@D@@@@@DD@@@D@@@@D@DDD@D@DDDD@@@@@BBHIIAHHCKB@JIABBJJA@@BIKBJ@KBICIKBHKKHH@AHHBAK@@@HHHD@@@HH@@L@H@@@DDHHLHHH@HH@@LLD@H@@L@LLLDHHH@L@L@@@@A@@@A@@@@@@AAA@@@A@AA@@AAA@@A@@@@A@A@AA@@@@@AAA@@@@D@DD@@@@@@@@@@@DDDD@@@@@@DD@@D@DDDD@D@DDDDD@D@@D@@@CJHBBHHBCIKI@KAI@@JHBA@HKBHKK@BAIKCAJCBAI@CHIHJCJB@@H@HD@@LDHDHHLDDLHD@HLDHHLH@D@LDHDHDLL@LH@DHL@@@HDD@@@AA@AAA@A@@A@A@A@A@A@A@A@AA@A@AA@@AA@A@@@@A@@@@AAA@@@D@@@@DDDD@@@D@@DD@@DDDDDD@D@D@DD@@@DDD@@D@@D@@DDD@@JKHCBACH@BJ@CKHBHKKBKABCBBAICIIHCCJJHH@AAKJ@IHBKCB@@LHLLHD@@DHLH@@LLHL@D@@HL@L@DLLHHHHLHLHHLHDL@LLLH@H@@A@A@@@AAA@A@@@@@AA@@@A@A@AA@@@@@A@@AAAA@@@@AAAA@A@@@@@@D@D@DD@D@@@DDD@DDD@@@@DDDDDDD@DD@@@@D@@DDD@D@@D@@CHHBBJCC@C@@IHAJJ@JI@@JACHICCAICJJCAHACKKJIHIACKBI@@HDHL@DLDDDH@DLH@@L@D@HDHDDLLL@L@HLDD@L@L@DHLLHLDLD@@AA@A@A@AAAAA@@A@A@A@A@A@AAAA@@@A@A@A@@AA@@AA@A@AA@@@DD@@D@DD@DDD@D@@D@@@DD@@D@@D@D@D@@D@D@@@@@@@@@@@@D@@@I@@BIA@B@CBCBJKKK@HKI@JKC@KBJBJJKIHJHKC@JBJCIAJAH@@@@@H@HH@@HHH@HHDD@H@L@D@HHLD@LDD@LH@LDDLH@L@@HHLH@@@@A@A@@@A@@@AA@AAAAA@@@AA@@@A@A@A@A@@AA@@AA@AAA@A@A@@D@D@DD@@@DD@DD@@@@DDDDDDD@DD@D@@D@D@D@@DDD@@@@DDD@@@ABHCCJIIH@CC@ACKC@HCHHCAJJBCI@ABKKBIKJAB@IBCJBKHJJ@@@HDDL@HHLLLDD@DHHDDHH@@DLHHHHDDDHLL@DDD@@HHDH@H@HH@@@A@@A@A@@@@@A@A@@AAAA@@@A@@@@AA@@@A@AA@@AAAAAA@@@A@@DD@@@@D@DD@@@DDDD@DD@@DD@@DDDDDDDDD@@D@D@DDD@D@@@@@@KB@ICCCKK@K@KC@B@HIBK@CHCHIJHII@@CKKAHCBCAJIBCHKKK@@DHD@LDLLLDDH@LHDLDH@D@D@H@HLLD@@LD@LHD@LLDLHHLLHH@@@@A@AAAAAAA@@AA@A@AAA@@@@AA@@A@@A@@@@@AAAA@@@@A@A@A@@D@DDDD@DD@@D@D@@@DDD@@D@D@@@@@D@@@@@@DDDDD@D@DDDDD@@CH@HBAIBJKICJ@HBKJAKK@IHCAAAIKAHJHCAA@AKCJ@CBJKHC@@@DL@@DDH@@L@D@@H@L@@@LDH@@LL@@D@@@HLL@DH@DDHDDLHDL@@@@A@A@@A@@A@@@@@A@AAAA@AA@A@@@AA@AA@@A@@A@AA@AAAAAA@@D@@@DDDD@@@@D@DD@@@D@@D@DDDD@DDD@@D@DDD@@@D@D@@DD@@@HAHHBBKHCBBABAHKHKC@HA@HKKKCBHB@JIKAABCHC@BIK@AJAK@@LL@LDDLLLD@H@D@DLDDHLHDDLHH@HDDDL@@HLLDDH@@@DDLHHH@@@AA@AA@A@@@@A@@@@A@A@A@@@@A@AA@@A@A@@AAA@A@AA@A@@A@@D@@@@@@@@DD@DDD@D@DDD@D@@@@D@D@D@@@D@D@DD@@@DDD@D@@@KHIIHJJK@BIJBIBBC@IHAIIH@JHHAABCK@@ACHJCHACKAH@CKK@@@@@LD@@D@DLLH@@@@DD@HL@DLD@@@HDDLHLL@LLDL@HLDLHDL@@@A@A@AAA@@AAAA@@@AA@A@A@@@@@A@AAA@@@AAA@@A@AAA@AAA@@@@D@D@@@DDDD@@@D@DDD@@D@@@DDDDD@@@@D@@DDDDD@@DDD@@@@@BKAHHHAIIAHBJB@CJK@H@ICI@BAIJIHJJK@HBHC@BKJJAAHHAB@@DHH@DD@@DDH@HL@L@HL@H@@@DLD@@DD@@@HDHDD@H@LDDL@L@L@@@@@A@AAA@@@@@A@@@@AAA@@AAA@@@AAAA@@A@AAAA@AA@@A@A@@@@DD@DDDD@@@DDDD@@@@@DD@@D@D@D@@@D@DD@D@@DD@DD@@@D@@@A@JIBJKBIIIJ@AHC@CJI@IKHHAABCKBCBH@CKA@@KBKBKICKCI@@HL@@LHLLDDD@D@D@@@@DDH@@LHHDDLLDDHHDHDDDLLHLDLDH@@@@A@A@AAAAAAA@@A@@A@@A@@@A@@AAA@@@AA@A@@@AA@AAA@@@@@@@D@@D@@@@@D@D@@D@@@DD@DD@DDD@@@@@D@@DD@D@@DD@DDDD@D@@HABHB@BK@BIKKCK@C@KBKHIIJJH@JJHIKCC@CHCAK@AAIAKAH@@@LDDLD@HHDLDHH@@LLDHH@DLDDDD@@@L@DHDDDD@LHD@DLDHHLD@@@AA@@@@@AA@@@A@AAA@@@AA@AA@@@A@AAA@@@@@A@AA@@AAAA@@@@@D@@DDDDDD@@@@@@DD@DD@@D@DDD@@@D@DDDDDD@@D@@@D@@@@@HBHBCAC@IKJ@CKBKKACIJBIAJ@JA@CIKAAAKAAKKJHKCCACIJA@@@D@DDDH@@LL@@LDL@HD@HLDLLLDLD@HHLHHD@L@@@D@LDLDLH@@@A@A@@AAAA@AAA@AAA@@@@@@@@AA@@AAA@A@@@@@A@A@@@A@AA@@@D@@@D@DDD@@@DD@@@@@@@@DDD@@DDDD@@@@@@D@D@DD@DDDD@D@@HBAHI@HHICAIACJH@IIJB@CAJBHKAHAH@IC@@CAAAIKHJHI@KI@@DHLHD@@DD@L@DHDDLDDLDLDDHH@@H@LHHLDL@HLHLHDLDHHD@D@@AAAAAA@@@A@A@@AAA@@AA@@AA@@@@@@@@@A@@@@@@@A@@AAAAA@@@D@D@@DD@DDDD@@@DDD@DDD@DDDD@DDD@DDDD@@DD@@@@@D@@D@@@HHBCAHBCKHCII@AHC@JBBJHJJHHC@@JKHCBKKKKK@BHIBJ@CH@@@HLL@D@HHDL@@LD@HDLHD@@@HL@L@D@D@@@LLH@@LLHDDDHDHL@@@AAAA@@A@@AAA@A@@AA@@@A@@A@A@A@A@@A@AA@@A@@A@@@AA@@@D@@DDD@D@@D@@DD@@@@D@DD@@DD@@DD@D@@DDD@DD@DD@D@D@D@@@CHCBHABKIKCBCHBIHI@IJ@IB@AJBKCII@@ACHKCAHB@JKHHKJ@@HHDDHDL@HHHDLDD@H@@HHLD@HLL@HD@LLLL@LDL@@L@LHLDLHH@@AAAA@@@@@@@@AAA@A@@AA@A@A@@A@AA@A@A@A@@@@A@A@@@AAA@@DD@@D@D@D@D@@@D@@DDD@@@D@@D@@@@DD@D@@@DD@DD@D@DD@@@@@JJBH@IHCBKBHAAC@CCCJBKIAKJJHJBCKIBJCAKAH@ICKIIH@C@@LDH@LD@LHL@HHDLHLDDLH@@@@DH@LDLD@H@L@DLDLL@HHDH@@H@@A@@@@AAAA@@AAA@@AA@AAAA@@A@A@@AA@A@@A@AAA@A@@@@@@A@@@DDDD@@@DD@@@@DDD@D@D@D@@@@@@DD@DDDDDDDD@DD@D@@D@@@@@AJK@IJJ@KCK@CKCHKIHBBCA@B@BHIBBJJKC@KJCJHCABBICCJ@@DDDHLD@DHHLD@H@HHH@LHHH@LD@HDD@DDDDLD@DD@H@DH@@DLD@@A@@@@AA@@AAAAAAAAA@AA@@@@@@@AA@@A@AA@@A@AAAAAA@@A@@@DD@@@@D@@@@@DD@@DD@@DDDDD@DDD@DD@@@D@@@@DDD@DDDDD@@@HKACCAIKIII@ICH@AB@@BAAJC@AH@@IHJA@IHHCHAIHB@KJIKH@@@@HDDDHLL@D@DHLD@D@@@H@DLL@LLD@@@DLL@DL@DHH@LDL@DL@@@@@@A@@AAA@@@A@AA@AA@@@@@@AA@@@AAAAAA@AAA@@AAA@@A@@@DD@@@@@DDD@@D@@DDDD@@D@@DD@D@DD@D@D@@@D@DD@@D@@@@@@@HHCBBBCIA@KCHBIIH@HK@ICC@KKJH@CC@IABIBKKJCCACCKHBH@@@L@DL@@DLH@@DDDDDHDHD@@LL@LDLHLDDD@@LD@DLHHLDHHHH@@@@A@@AAAAAA@AAA@@@AA@@A@@AAA@@@@@AAA@AA@AA@AAA@AA@A@@D@@D@@DDD@@@@@DDD@DDDD@@DD@@DD@DDD@@D@@DDDD@@@D@@D@@IIA@@CAHJKAHKCC@HK@BCHCA@BKAH@CBHJ@JI@HAKAKCBKKAIJ@@) (il:rpaqq *canvas-bm* #*(200 200)A@@A@AA@@A@@A@AAA@@@@A@AAA@A@@@AA@@@A@@@@@AAAA@AA@@@BDBDDBF@BFDBDBF@FDBFF@@BFDDFBD@BB@FDDD@B@D@BF@FBDB@@DHL@HDDD@@L@@D@L@DL@LL@DDLHDH@LHH@@HLD@@HHDHDHDD@D@@@@@@ABCCBAC@BCA@@C@B@BBACABAAAB@BC@B@AAAA@CC@@ACAC@@@@@AAA@A@A@A@A@AA@@@AA@AAAA@@@@@AA@AA@@AAA@@A@@AA@@@D@F@@FFDFDBBD@DDBF@F@BFF@BF@BFBDFFBDFB@BBDD@D@FDD@@@DDHD@H@H@DDHLLDDHL@DL@LD@DDDH@@HLLDLHLL@DD@LLHLLLD@@AAAAA@AB@BBAAB@ACAABCAA@C@BCC@ABCABAA@BBC@B@C@CACC@@@A@@@A@@@@A@A@A@AA@@AA@AAA@A@A@A@@A@@A@@@AAA@@@@A@@@B@B@@FDDDFFD@FFDFBFDBD@FDD@BDDDDF@F@B@B@DBFF@@@D@D@@LHDH@HD@@D@DDHLDH@H@HDDHLHDL@DLDD@D@H@H@DLDDDDL@H@@@@@BABCBB@@@BBA@A@@AAAACAAAAACABACCBCA@C@BCBCBACABB@@@@@@@@AAAA@AAAA@A@@@@AAA@@@@@@A@AAA@AAA@A@AA@A@AA@@@@BBFFFBB@F@FD@@DDD@DFDD@FFBDDBFDBBB@@@@FDBFF@DBBFB@@@LHL@@@HHD@@D@LLL@LD@L@HLL@L@@@H@@@@LDHDLHDLL@H@DH@@ABA@BCC@@BCAA@@@BB@BACBCAC@BC@ACC@A@AAA@CB@CCBAAA@@@@A@A@AAA@AA@AAAAA@@@AAAA@@@A@AAA@@A@AAA@AA@@AA@@A@@@BFFDD@DBB@@F@BD@D@BBD@DDBD@DB@DBFBF@@FBFFF@@BDB@F@@@LHLH@L@LH@DL@LLLHLLHHLHLD@HH@LHHHDLD@HDL@LLLD@H@HL@@BBACBAABAC@CCBACAACB@@C@CCA@ABCAB@CCCBAACA@BC@CBCA@@@A@@A@A@AAA@@@AAA@@@AAAA@@AA@@AAAAA@@AA@@@@A@@@@AA@@@D@B@DFB@FFFBDFDDBDDDF@FBFBDBD@@DD@@FDBBB@FDDB@BB@@@DHH@D@HHL@DH@DD@DD@LLHDLHLLD@H@LHHHL@LH@LHLDLLHLLD@@C@A@AC@CA@C@CBBBCCABACCC@@BAB@A@BCAACBB@@CCC@@CBAC@@@@A@A@@@AA@A@AA@@@A@@@@AAA@AA@@AAA@@A@AA@AA@@A@@A@@@@DDFF@FB@FBDBDFD@@FBBBFFB@@DD@DFFFB@DF@@BB@@B@@DBB@@L@LLDL@L@DHLDLHLHDHHL@@DLLHHLLLHLLHHL@HHLLHHHDLDHH@@CACCCABCA@A@BCCBBB@BBBBAB@C@@ABC@@AABBC@BCACACAB@B@@AAA@@@@AAAA@AAA@AA@@@@@A@AA@A@@@AA@AA@@@@@@A@@A@@A@@DFDD@DFF@@BD@@DF@FFBB@BFBB@@BBDDDDB@B@@@FDFDDDFBB@@@H@@HHHDLLDDDLDDDL@@LLD@DHHDLLDL@DDDHH@HDLD@DHHLHDL@@@CA@ABAAABBA@AAA@BBCCC@BAC@C@BCCB@@C@BC@ACBCCBCAAB@@@A@@A@@@@@@AAA@@@@@AAAA@@AAA@@@@A@@@@@A@A@AAAA@@@@@@BBBDF@BDFDBD@@FBBF@@DFDDDBFDF@@@FBBDF@DD@FDBDBDDB@@@DDDHLLLLL@LDD@LLHL@DHLL@HDDL@HHH@@LH@HLHDHD@DHL@HD@@ABAB@@BACBACBB@CC@AABCABAAB@BAACBCAA@A@CA@BCCCA@AA@@A@AA@@AAAAA@@A@@@@AAA@AAA@@@AAA@AA@@AAA@@A@@AAA@AA@@DDBDD@BD@B@BF@FD@@FF@DFFDD@BBDBDBF@@F@DB@FBD@DB@DB@@LLHHDDD@@DD@HHD@LLL@@L@DDDDLL@L@DL@HLLHHD@@LHHD@HL@@CBC@BACAB@BCA@@CB@B@BA@A@ABC@@@CC@AACACC@@CBC@CAA@@@@@@@@A@AAA@AAA@AAAA@@AAA@@A@A@A@@@@A@@@A@AA@@A@@AA@@FDBDDD@@BDF@DF@@BDDDBFB@D@@DDBBF@@@F@BDFF@B@B@BFDB@@D@L@H@H@L@DLHDHD@DDHDL@H@DDHLLLDD@HLHH@H@@DLL@L@DD@@BAABBABACCBAACA@@@BCABBBC@ACAB@@B@BBC@CCC@@CBBACBA@@AA@A@@AA@A@A@@@@@AAAAA@@@@@AA@AA@@A@AA@@AAA@A@@@@A@@F@BFBFD@BFFBF@@BF@@FDBB@@FDB@FF@DFBBBFBF@FB@BB@B@@@@L@L@HDDHHL@@LHH@L@DDLHDHL@HD@@HH@DH@LL@DHHL@LD@LDL@@@ACBC@B@A@BB@BB@@CACCBBABBBBB@@A@AC@BCABAC@AABAAC@@@@@AAAA@A@A@A@AA@A@@@AAA@@AA@@A@AA@AA@@@A@@A@@@@@AA@@DB@BBDBFBD@FF@DDBFFDBDF@D@@DDFBDD@B@B@@DBBDFDBDDBB@@DLHDH@DDDLDDHHDHHDLLL@D@DLLH@D@H@H@HHD@LLHHHHLLHL@@@CAAA@ACC@C@BBA@CBAAC@ABCCBBBCBBA@CABAABB@ACAC@BCCA@@@@A@@@@A@@@@@@AAAAA@@A@A@AAA@@@@@@@@A@@A@@@@AAAA@@@@FDDBBF@DDDFDFD@BDDBDDB@BFB@@F@DBFFFFDFB@@DB@F@@@@@@@D@DHDHLHDH@@@H@HL@H@DDLL@HDLLDL@@HHDDHHLL@L@LHLLHH@@BB@CC@BAAABAAACC@AA@AA@ABCACBA@BC@AAACCBBBBCCAB@CC@@@A@@A@AAA@@@A@@A@@@@@AAA@AA@AAAA@@AAA@@AAAAA@AAAAA@@@B@FFFBFFBFBDBBB@@@@BDDFB@@FBBD@@FFF@FDB@@@DDDB@FB@@@@HDLLH@DDLHD@HD@L@H@H@HLDD@HHDL@@DHHDLHD@LHDLHDDH@@B@@AAACAACCABC@C@CBCCAC@AACCAAA@BBBCBABCACCBCBCCCC@@A@AAA@@AA@@AA@AA@@@AA@@@AA@@@A@A@@@@@A@A@@A@@@A@AA@@@FFBBBFFB@FD@FDFD@DB@FDDDBBBBFF@B@FF@DFBBFDFD@B@FB@@@L@DH@DHHH@L@DL@@@H@LHD@HLDLLLDHDLDHDLDLLDLLL@DHL@@@@C@CB@CAABAABACABB@@CABBACACCCABCC@BB@C@AA@ABB@@@C@@AA@AA@@@@AAA@AA@AAA@@A@@A@AA@@@AA@A@A@@@AA@@A@AAA@@@FB@B@B@BDDBF@DDBFFDBB@@@B@DDBF@BDDFFDFDBBF@BFFF@@B@@DLH@LL@L@HLDLLD@D@LL@LDHHDDHLH@H@HH@HH@DDDDHHDLLHD@@C@BCCACCCC@A@@BA@@B@ABBAB@BA@@@BB@AC@@@CBCCABCCA@A@@AA@@AA@A@@@@@@AAA@A@@AA@A@@@@@@@A@A@AAAAAA@@@A@AAA@@@BBBBFB@@DDFDBD@@FFD@@F@@D@FF@FBBFFBBBF@D@@B@@DFDD@@LDDD@HL@D@LD@LDLL@HHHD@@@L@@LHHHDLL@LHLD@HDLHHDDLL@@AB@@@B@AAC@ABCACACBCABB@@B@C@AC@@BCB@@@@BBBB@@@CAA@@@@AA@@@AA@@@@@@A@@AA@AA@@@A@A@A@A@@@AAAA@@@AAAAAAA@@B@@BFFDFFFD@DFBBDFF@FFB@FF@@FDDDF@@@FFDF@B@DFDDBFF@@DLLLHHHD@@H@@D@HHDLH@HLL@@LHDHH@DHHD@@HHDH@@HLL@DL@@CACCB@@B@C@B@@CCC@BC@CB@C@AC@ABB@A@CABBBB@@BB@ACAC@@@A@AA@@A@A@AAAA@@@@A@@@A@@@A@AA@@@AAA@@@AAAA@@@@@@@@BDF@DFF@F@DDDF@FDFDBFFF@DBBBB@@FD@@FB@FFF@FF@DF@FD@@L@D@@H@LL@@@@LDDD@@@H@@DDD@@L@HHLLLL@@HDD@HDHD@HDD@@AA@CA@ACBCBBB@ABCBAAA@@@BCA@BACBBBBBCCAC@CAC@ABA@C@@A@@AA@A@@A@@AAA@AA@AA@A@@AAAA@@@@AAA@@A@A@@AA@A@A@@@@BFDF@D@DFFDF@FB@FFDB@BDDBF@FF@B@BB@FB@BBBDF@@BD@D@@D@H@HHDDHDL@HDLLL@HD@LHHH@@L@HLLLDL@H@@@DHDLDHLHD@@@BCAC@A@CCCCCBCACBBABCAB@@CA@CAAB@A@AABA@BBAB@@@ACC@@@@A@@A@@AA@@AAA@A@@A@@AAA@@A@AAA@@@A@AA@A@AAAAA@A@@@F@FBFBDFBFD@@FDF@DF@FBFDBBDBD@@B@BDDDDB@B@BFDDFDFD@@DLLLHLLL@@@LDH@D@@DHDLL@L@LDLLLLHLHLLLLDHLLDHHLL@D@@BACCAB@@BABABCA@BBCAABCABCABA@CBCBCAAA@BB@CAB@@ACB@@@A@AA@A@@@AA@A@@@@@AAA@@AAAAA@A@A@@AAAAA@AA@@@@@AA@@FB@F@BBFFBFF@@BDB@@@DD@BDB@DDD@B@DD@@BDBFFB@BF@@@B@@@@HLLLDDD@LHD@LH@@@LHHLLHDLDHHHDDHHHLHLL@HLDHDLDDH@@BBCBCCA@@@ABAA@@BB@CACACAC@BBA@B@@CCBBCABBC@@AC@AC@@@AA@AA@@@AAA@AAAAAA@@@AA@AA@@@AAAAAAA@@AA@@AA@@@AA@@@F@BF@B@FD@BF@F@DFBBB@BBBDB@FDBBDFB@@@FDFDDBDDDDFB@@LDH@LDHDL@LDHDL@D@@DLHLH@LHHHDHHH@@HHL@LDLHHLDDL@L@@@BCB@@C@BA@@ABACBABBBA@@BBBBC@CBCCABB@CCAAA@@CBAA@@@@@A@@A@AA@@A@A@@@AA@A@A@@AAAA@@@@AA@@@@@@@AAAA@AAA@@FDBD@D@FBF@@DD@BBBDFDFFFBFFDDF@F@F@FFF@BDD@FDFFFBB@@@@@D@DHDLLL@H@HLLDLD@H@HDH@LLLLH@@@DHLLLL@LH@@H@LL@@CAC@ABBCBCA@BCBB@C@CBBBA@@BABCC@ACCCABAABCAB@@C@BA@@A@@AAA@A@AAAAA@@@@@@A@A@AAAAAAA@@A@@AA@AAA@AA@@AA@@@BFDBBDFDDFBFB@FD@BD@BFBDD@@BBDD@@BDBD@FBBFFDDB@FBD@@HLLDDL@@@D@DHLDH@LHHLLLHH@DLHHLDDHLDHL@L@L@HLH@D@L@@A@AA@B@@BACC@CCAACCACABACBB@C@C@@@CABAB@A@B@B@ACAB@@@A@@@A@A@@A@@@@@A@@AAA@@AAA@@AAAAA@@AA@@AAA@AA@A@A@@FDB@FD@B@@B@FFDDBDDFF@BF@BFD@F@DBDBFBFF@D@DFDFBFFD@@LHDDLH@H@LL@L@DD@HHDLLLDDHDDHHL@LDD@DHL@DDHLL@H@HL@@ACBCBC@CCA@BBAB@@A@BAAAB@@BA@BC@@CAA@AC@ABAC@AC@@C@@@@AA@AAAAAA@@@@@AA@@A@@@A@AAA@AA@@@A@A@@AA@AAA@@@A@@@BD@@BFF@@@@DDD@BFB@B@F@B@DBFBBDDDDFDFFFDBFB@FDBD@@@H@HDLLL@D@@L@LHH@LHH@HHDDDD@@D@HLLDHH@@@L@DH@HHD@@@@BCAC@@B@C@@C@CA@@BBBBCAACABCB@ABAAB@@@A@CC@@@AACAC@@A@AAAAAA@A@@@AAA@@AAA@A@@@@@@AAA@@A@@@AAA@AAAA@@A@@@DDDD@FBFFBDDDDBFBBDDFB@BDBBDFDBFDFBBFBFB@B@FDFF@DD@@D@HL@LLHDDDLLH@H@@H@@L@@@H@LLH@@DHH@HL@DLL@D@DDLLH@@@@BB@AAA@@CCB@BAABBBBA@@BACBB@CBACACB@CC@@@A@@BAC@@@A@@@AA@AAAAAA@AAAAAAA@A@@AA@A@A@AAAAA@@A@@@@AAAA@A@@FFFBDDF@DFBDDFD@@DFDB@@@BFB@@FFDD@BFFD@@DDDFBBBB@@@@HDHDD@HHHHH@H@@@DDLLH@HH@@DLH@D@LDDD@LHLDDLLHDH@DH@@CB@BB@@BCACA@CAA@@B@BA@@CB@CC@BAACCABCBAA@C@A@BCBB@@AA@@A@AAA@@A@A@AAA@AAAAA@AA@A@@A@@@@AAA@A@@@A@A@@@@@BFDFFBFFFDFBBDB@FBFDBDFFFBB@F@@B@@DFFFDDBDDFDDBDDB@@HDHHHHLLLL@@@L@@DLHHLDLLDD@DHLHLL@H@LLLH@DH@D@@LLD@@BC@CBAC@@BB@CC@B@CCBCABCBBAACAA@CCBB@@@AACB@A@BCCB@@AA@A@@@AAAAA@@@AAA@A@AAAA@AA@AAAA@@@@@@A@@A@AA@@AA@@@D@FDBDD@F@FFFF@BFBF@@FBF@BB@@D@DDFB@BD@F@F@FBDBD@@@HH@DHD@DD@D@@@DLL@DLLH@HHLDLLDLD@DLH@H@LHHDLDHLH@D@@C@@BBBCC@C@@A@ABB@BA@@BAC@ACCAACBBCA@ACCCBA@AACCBA@@@@@AA@AAA@@@A@@A@AA@@A@@AA@@@@A@AA@@A@A@AA@AAA@AAA@@D@@DB@DBFFBDDBFDBFF@F@DFBD@B@@@@FFDDFD@@@F@DDFDBD@@@LDHHLHLDHLDLHDH@LHH@DD@HD@@LHD@LHHL@L@@@H@HH@@HHHD@@@A@@BAA@B@CBCBBCCC@@CA@BCC@CBBBBBCA@B@CC@BBBCAABA@@@@AAAAA@@A@A@AA@A@@AAAAAA@AA@A@@@@AA@AA@@@@A@A@A@AA@@DFF@DFBF@FBBF@BFFDD@BBDDBFFBF@FBF@B@B@B@BBF@D@B@BB@@D@D@DL@@HLLHLLHH@@DDDLDLDHDD@L@@LHD@L@HDDL@HHHDLL@@@AB@CCBAA@@CC@ACCC@@C@@CABBBCA@ABCCBACBAB@ABCBBC@BB@@AAAA@A@@A@A@A@@AA@@@@A@AA@@A@@@A@AAAA@AA@A@@@@AAA@@@B@FD@FFD@B@FBBF@DDD@BFBB@D@@DDDF@BBD@BF@@FBF@BBDBB@@DD@@HHDHDD@@@LLLL@DLHHLLHHDLDDDDLLLH@DHD@LDLHDH@HH@@CB@ACCCCC@C@CC@B@@ABC@C@C@AB@AA@@CCCA@CBCABABC@CCC@@A@A@A@A@@A@AA@@@@@A@@@@A@AA@A@@A@A@A@A@AAAA@AAA@AA@@DBBFDFBDF@BFDBBBBFDDB@DDDFBF@FB@F@@FFF@B@@@B@@FDBF@@D@LLDLHDL@@D@D@@@DLLHHLHL@H@@@D@@@H@HDDLDLHL@LLDLD@@C@@@BAABBCACB@@BCBACC@A@CAAAACA@B@CAA@ACCB@CBBC@C@@@A@AAAA@@@A@@@A@A@@@@A@@@@@AA@AA@A@A@@@@@@A@AAAAA@A@@@DFDF@FDFFFBF@FBDFDDDBDDBBFD@FDF@DBBF@FDBDB@FFDBF@@@D@H@DDLL@HH@DHDDHHHD@HDHLLLDHLDLHHL@LLL@HHD@DH@DD@@@@A@@BBC@CBBABA@C@CC@@A@@CCCCB@B@BACAABC@C@BAC@ABAC@@@A@@A@@@@@@@A@AA@@@@A@@AA@@@AAAAA@AA@@@A@@AA@A@@A@@@FFD@DFFBBDB@DD@@FFD@@@D@DBFDBDF@BDD@@@@DB@DFDBBDDF@@L@H@@@@H@LDHLDD@D@DLD@D@HH@D@DHDHHHL@D@LL@@HLDLHL@@@C@AA@BBC@BABBABBC@A@AAA@@B@@AABCC@@AC@BC@ACCA@@CCC@@@A@AA@A@AAA@AAA@A@A@@@@@@@@@@@A@@AA@@@@AAAA@A@@@@A@@BF@@@B@FF@FB@@DDB@@BBDB@DFFDF@@FFFDB@DDD@@@F@BDDFF@@@LHDH@@LDDL@@HDHDLL@HD@@@LDDDD@@@HLH@LDLLLHHLDD@@H@@BCA@@@AAAA@BBB@CBC@@@ACA@BAABA@BBC@@B@C@BCBBAA@@AB@@A@AAAAA@@@A@@A@AAAAA@@AAAA@@AAA@A@@@@@@A@AAA@@AAAA@@F@BBDFD@@@@BF@@B@DD@BDFBDBB@DFBF@DF@@BBBDDFFDDB@BD@@@DD@DLLL@@@LLLD@HH@HDD@@D@DHDHH@D@LDHD@HDL@DDHHHDH@@A@BABBCBAAAB@A@C@CBA@AC@@AABCCBCB@@CCA@@CBCBCACCCA@@@@@AAAAA@@AAA@@AAAAA@@AA@@@A@@@AA@A@@AA@A@A@@@A@@@@@BFBBFBBBB@FBBB@FD@FDD@@FDB@DFF@@F@BF@BFFFF@FBDFF@@@@L@@L@HHH@D@L@HDHH@DD@DD@LLD@@@@@DH@LL@D@@DL@DDLDHD@@@AB@B@BC@BACCCC@C@CBC@AABB@@BB@ACCC@C@CAC@AAAACA@@@@A@AAA@A@@@AAA@A@@@@@A@A@@A@A@A@AAAAA@@A@@A@@A@@A@@@@@DFFB@D@DFBBFBD@D@@FFFD@@@@FB@FFD@F@@BBFF@@BDD@D@D@@H@LHHLDLLLDH@HHH@DL@DD@@DHDLL@HHL@DLDDLL@@DH@@L@HH@@@B@BCAC@ACB@CCBCCACABBAAB@BA@CACAAACAACCB@CCCACABA@@AA@A@AAA@AAAA@@AAA@AAA@AAAA@A@@AA@@@A@@A@@A@@AAAA@@@@@F@BFDFDFDBD@BDBDBBFDDDB@BFBFDFBFDFD@FDD@BB@DBB@F@@L@H@L@LLL@@@DLHHHH@@H@LDLH@DDDDH@H@HHDHLHDD@DDDD@D@@@BA@A@@@ACAAACB@@AABB@CABB@CA@A@@AC@@CAAAAC@B@A@CA@@@AA@@@A@A@A@@@@@@A@@AA@AAAAA@@@A@@@@AAA@@@@@@A@@AA@@B@@D@FDB@@FFDFB@B@FFFB@@@B@@B@DDD@@B@D@DFBD@FFFF@D@@HLHLH@DDHLDDL@HHDLD@DLLHDDDLHDLL@DDDL@HLL@@HHHD@@D@@@@@BCA@BCC@CAA@A@C@BBBB@BB@@C@@BC@CBCCCCC@B@ABB@C@@@@AA@A@@A@A@@@@A@AAAAA@A@AAAA@AAAA@A@@AA@@@@@AA@A@@@@FDBFDF@@@DFF@BBFB@B@@BBBFBF@@F@D@@FDD@D@BFD@BFB@BD@@LH@LLDHD@HD@@DDHHHHLHDDH@LD@HDLHL@HLLDHDDHDL@LHLHD@@@C@CB@ABCACCBC@BA@A@AB@AB@ABBCCAA@@AC@CCA@B@BC@@CB@@A@@@@@@AAAA@A@AA@A@AAA@AAAAA@AAA@@@@@@AA@@AA@AA@@A@@FFBD@FDFB@FDFFF@F@FB@DB@FF@DFDDDBFBDBF@BFF@@@DF@BB@@LD@HL@LHL@DH@@LHHDDD@HHL@HL@@@@DD@LHHHLL@LD@LHDL@H@@@BBB@@A@CBCB@AAC@CCCBBCAACBB@BBCCABBCACA@@ACCAA@@C@@A@A@@A@@@A@@A@A@@AA@A@@AAA@A@A@@@@A@AA@@@@A@A@AA@A@@@@D@BDFBD@@FB@B@@@D@B@B@FBFD@DD@@FDBBBDDF@@BBD@DDF@@@DDLL@HHDL@HHHLLL@LHL@L@@@@@HLLHDDLDDDLDHLD@DHHL@H@@@ABC@ABB@CCC@CCC@CA@BBCA@B@B@ABBBBCC@CBCB@CABBACCB@@@AAAA@A@@A@AA@AA@@@A@@AA@@@@@A@AAAA@@@A@A@@@@@A@A@@@@BBBDFDBBFFB@@DDF@@@DFF@@BD@@DF@FFFBB@B@BF@DB@BFFB@@DDHHH@DH@@HHDL@HLLH@LDLLDHDDDHLL@H@DH@@HLDDHLLLDD@@@@CACCAACAAA@AC@@AB@@BAABC@A@@@A@BA@A@@C@AA@B@CBAC@@@AA@@@@@@@@AA@AA@@@@@@@@AA@@AAA@@@@A@@A@@AAA@A@@@@@@@@@B@@@B@BFB@B@DBF@@FFBDF@FF@@FBBF@@DBD@D@BBB@B@BD@@@DLHH@H@LDD@HL@HDDDL@@LHHDD@D@LLHL@D@@@L@DL@@DHH@@H@@@@CBBBCAA@CC@BAA@@@C@ACC@CCB@@CC@AABABCCBCCACCC@B@@@AA@AAA@@@@A@@AAAA@A@@@A@@@@@A@@@@AA@@A@@@A@@@A@AA@@@F@@@FBDF@BFB@B@DDB@DBDBFB@BFBFD@@FFFB@DDB@FDD@B@@B@@D@HDHHLDLHHH@@DLLHLDDD@@LD@HLD@LLL@@L@HLLLD@HHD@@L@@AAA@@CA@BCA@CCC@@C@BC@CA@BCA@@CB@B@BA@@ACACCBCCAAB@@) (il:rpaqq *corduroy-bm* #*(200 200)@@JHBJJJ@HH@HB@HJ@BHBH@J@JBHBBH@@BJBHHB@@BHHHJJHJ@@@@DHDL@DH@LDHD@LHLLHDD@@HDLLLHL@@H@LLDDHH@LHHL@LHL@@@D@D@@DDD@@D@@D@D@DD@DD@DDD@D@@D@@@@@DD@@@@D@D@DD@D@@DD@@DBBFBDF@FF@DDBDF@FFDF@B@@@BDBB@F@D@@D@FF@D@BDB@@HJ@BBBJ@JJ@J@HHB@HB@BB@@JHB@@@@JBJJBJHHHBHJBJH@HBH@@L@L@@DLDDDHHD@LLHL@L@HLDH@D@@D@LDL@DL@@@@DL@L@LDL@@@DD@D@@@@@DD@DDDD@D@DD@DD@DDD@@@@DDDD@DD@DD@DD@DDDD@@@@@@DD@F@BF@DFD@FD@BFD@@F@BFFDDBF@BDDDBBF@FDF@F@BF@@@BJBB@J@JJB@BJJ@JHJJ@BJ@JBHBHHJHJBJBJH@HB@HBB@HHBJ@@H@@HHDLLDLLL@DLLL@LD@LHDDLHHDDLDLHLH@H@@LHDL@@HLHD@@D@D@@@D@@D@DD@DD@@@@@DD@D@DD@DDDD@D@@@@@DDDDDDD@@@@@DDBDBFFBDD@FBD@@DDD@DDB@@D@DBDF@FFBB@DBDFFFBB@B@BF@@@@JB@@@@BJBJH@BJJHJ@H@JHBJH@BBJ@HB@HBHHH@BB@HH@@HJ@@H@HLLLHH@LHDL@@LDL@LDLDHDD@DL@LLHH@@@H@LDHDL@LHHL@@@@D@D@@@@@D@@D@DDD@DD@D@@DD@D@@@@@@@@DD@DD@DDD@@@D@@@@F@@BFF@DBBD@DDDBB@BDFFFDFDFFDDFBDD@DDDDFF@BBB@@DD@@BJJJJJ@H@JBBBBH@@@HHJ@JJJJH@@J@JH@@B@JJB@@J@HJ@@JJ@@@LLDD@LH@HHLHHD@D@HHL@DD@DHLHHD@D@DHHL@DLLH@@L@HDH@@D@D@@D@D@@DD@DDD@DD@@D@DD@@@@D@@@DDD@@DD@DDDD@@@@D@@BB@BF@@BDB@BBFDBD@BB@@FDFFDDDFFDBDFFFFDDB@DFB@FFBD@@J@BJJHHB@HBBJHJBHJH@B@BHB@BBHBJJ@HB@HHH@@@@HJJ@B@@@@@DHHHDLHHDLDHLDDL@LDDLHDHDHLHD@@DD@HLD@@HHDDLH@HHH@@D@@@D@@@D@D@@DD@DD@DD@DD@DDD@@@D@@@D@D@@D@DDDD@DDD@@B@@@DFDBDDB@BFBBBB@BDFFB@DFDFDD@FF@DFFF@@FBBD@FBDB@@JHB@BH@@B@JJ@@HJB@HB@@@JHBJBHBJH@JB@J@HJJH@H@HHJH@@@HLDDL@L@HLHL@DDLH@LH@HDLH@@LL@DLLLHHDL@@HH@H@HHD@H@@D@DDDD@D@D@DDD@D@D@@D@@DDD@@DDD@DD@@D@@@DD@@@DDD@@@@BDBBB@FFD@D@FFFFFFDBFFFDB@B@DDFFDD@DFFF@BFDFDF@B@B@@JJHBJ@HJ@H@JJJ@@@B@@HH@@BBHBJH@B@BJH@JHJ@BHJ@BHBJB@@DLLL@DLDHHHLHHDLHDL@@@HLH@@H@@LLDL@@H@H@DLDDLLLHHH@@@@@@@@DDDDDDDDDDD@@DDD@D@@DDDDD@DDD@@@@DDD@D@@D@DD@@@BD@@F@@@BB@D@@@@BFFBF@BDBDB@FBFB@@BDFF@@FFBFBFDDF@@@JHHJBHBB@HJ@JH@@@HJJ@@JJBB@HHHBBHHJJJJBJB@HJJB@B@@@@@@LDH@LLLHD@HL@@L@@LDLLD@DLL@@@L@@DD@DDHLDHDHDLHH@@DDD@DDDDD@DDD@DD@D@D@DD@@DDD@@@@@@D@@@D@D@D@D@D@@D@@DF@F@@FDFB@BBFDBBD@DFFDB@@F@FD@BFB@@DDDB@DBFFBDDDD@@@HH@JB@@BB@JBHJH@@@B@BBB@@@HJBHJHHHJBHBHJB@BBJJBJB@@DL@DD@HL@H@HDHDD@HLDHDLLLLH@@DHD@LH@DHDH@D@L@D@HLH@@DD@@DDD@@DD@@@D@DDD@@D@DDDDDD@D@DD@@DD@@D@@D@@D@@D@@FBB@F@F@BDBB@@DBBDBDFD@@@@BB@@@FB@@@BDFBDDBFF@F@D@@@JJB@BBJHHBHJHHBBJJHHJJ@HBJBJBJ@JJBBH@HHBHHBHBB@B@B@@DLHDDL@@@LLHDD@HHLDL@L@@LHHDLHHDHHHDH@DLL@H@HHHLLH@@D@D@@@@@D@DD@D@D@DD@DD@@@DD@DDDDD@@D@@@@@@DDD@D@DD@@B@@BF@B@BBFD@F@@D@BBDFFBBDDBDFDDFDBBBDBBB@@FBB@FFD@@JB@BH@@JJBHH@@B@J@@B@JBJJJ@BB@BJHBHJBBH@@JBB@B@B@H@@D@HL@LDH@DLHL@@HD@HLDH@@@DLHHDLHLLH@@D@D@DHH@HH@H@@@D@D@@DD@@D@@D@@@D@DDD@D@D@@D@@@@@D@@DD@D@@D@DD@DDD@@DDBFBDF@D@BBDBF@DFDFBBBDFBBFF@DDDDBDBF@B@F@D@FD@F@@@J@@J@@@B@BH@BHHHHHHBBJ@@JBHJHJ@@HHJ@HJB@B@BBJ@BJBB@@D@@@HLHDHLHLDHLDHLLD@DLHDH@DLD@DL@H@H@@LHHDLL@LL@H@@DD@D@@DDDDDD@@D@@DDDD@D@DDD@@D@@@@@@@D@DD@@@@DD@D@@@BD@D@DBBDBDBBDDBBDDBD@BBBBFFFBB@DF@FD@FF@DFDFDFFF@@@@JBJHJJHHBBHH@JJB@@B@@HHHBBHHHHHHJJJ@JBJJJ@BB@BJJ@@@LDL@@D@LLDDDDLHHLLHDDH@HLHH@L@D@LLLDLD@H@LHHD@H@@H@@D@D@D@D@D@@@@@@@D@@@DDDD@@DDDDD@@@@DD@@DD@D@D@DD@@@@FF@FB@F@@@F@@DBB@@D@@D@DBFDBF@@FF@D@DBBBFBBBFDB@BB@@B@@@@BJJ@BJB@B@HB@JBJB@HJJJJ@HH@HJHBHJBBBJ@HBBJB@J@@HHHDDDHLLHLHD@@HHHH@HDDLH@HD@@L@@DDL@LLHH@HLDL@HD@@@@@@DDD@@DDD@D@@D@D@@@@@@DDD@@@DD@@D@@DD@D@D@DD@DD@@@FD@DDDFDDBF@BF@FDBBFBDF@D@FFD@@DFFFFB@FFDBFFFBFFFB@@HJJHH@@BJHH@BBB@JJJBJJBJJHH@HJ@HBJHHBJJ@JJ@BHH@HJB@@HLL@@@LD@HDD@LLDL@LHHDDDLH@HHDL@@@LD@LD@@DDLL@H@DH@@@D@D@@D@@@@D@DD@@@@@D@D@@DDDDDD@DDD@DDDDDDDDD@D@D@@@@B@FF@B@@B@DB@FDFFDDF@BF@F@BBB@BFFDFB@B@D@@@FB@D@F@@@@HB@HJHB@@JJJHJHHBHH@BJJHBJHH@B@B@BBJHHBJHBJBBHHB@@L@@H@@@HLD@D@LDHDLLH@@@@@HLD@L@@DDDLLLDHHDH@LDD@@H@@DD@@DD@D@@DDDDD@D@DD@DD@@DD@D@@@@@@@@@@DDDD@@DDD@D@@FDBBF@FBFFDD@@BDDDFDDBFDFDF@D@@FBD@F@@DFBBF@BBB@@D@@JB@HB@@@JJJ@@JH@BJHHJHBBHHHH@@@@H@B@BB@BJB@@JHHJ@H@@H@H@HL@@@DDDL@D@@LDD@HD@@LHLD@D@HDDHHHD@L@H@H@LDLL@@DDDD@@D@D@DD@DDDD@@@@D@@@D@@D@@@DDD@D@DD@@DD@@DDDD@@DB@@@BD@DF@@BF@F@FBBDBBDDF@BD@B@DBBFD@@@BFFF@@@FDD@@@HJ@@@H@B@BJHJ@HJJ@BJBHJ@BJHHBBB@J@HB@@JHHJ@BJ@JH@@@HH@@DLDLDLLHLL@HDDL@LLH@LL@@LLDDDHH@LDDD@HHLLDL@LD@@DDDD@@@D@@@@@D@@@DD@@@DD@@D@D@@@D@@D@@@@D@@@@DD@DD@@BDBFBDDBDFDF@@BFFDBB@FB@FDDB@@FF@DDFDFBBB@@FB@DBDF@@HHBH@BJHHJHBH@HHHJHJJ@B@JBB@BHB@JJJ@BB@@JJJ@HBHH@J@@HLD@DDDHD@DDLL@DLDD@DLDHD@HH@@@LD@@D@@DDDHLD@DDHLL@@D@D@@@@DD@@@@DDDD@@@@@@DDD@@D@@@DDDD@@@DD@@D@D@@DD@@@DDF@DDFFFFFB@DFFF@@D@D@FB@@FDBFBFFFBBDFDFDF@@F@DF@@@JB@BJHJ@BBBHJH@HJJ@B@BHB@@JBHB@BHBBB@HB@HHJ@BB@BH@@@HDLL@LHLDDDL@L@HDDD@@@DDHLHLL@HH@H@L@@HH@LDH@HL@L@@D@@@@@DD@DD@@DDDD@@D@D@@@@@D@@DDDDD@@@@@D@DDD@D@D@@@BB@B@@@BFFBBFFDBBBDBF@FD@FDDB@@BDDD@DFD@BF@F@DD@FF@@HJBB@HJ@H@BBHJHBHJHBBBJHHHBHHBHJJB@@B@JHJBJ@JB@H@J@@LHDHDHLDHDD@@LLD@LD@LHLLHHD@L@HH@HLDLDH@HHHLDLLLLL@@DDDD@DDD@@@DD@@D@@D@DDD@D@DDDDDD@D@DDDDD@DDD@@DD@D@@FDBBDB@@F@FDFBDDFBF@@FBDBFDBDDFBBBBDDDDFF@BDBD@@BF@@HH@JHHB@JJ@@HHHJH@H@BBJ@HBBBHH@HH@@J@JHBJHJBJHJBB@@@LHHDHH@LL@DL@@@L@H@@DDHHLHHLDLHH@LDHH@DHLLH@HD@HHH@@@@@DDDDDD@D@D@D@@@@D@@DD@DDD@@@DD@@@D@DD@@DD@DDDD@@@BBBFFB@@@@DF@@@DFFDF@B@B@BDBFDDB@@FFBBBDBFB@D@FDDF@@H@B@@HH@JHBB@BHHJHHJ@JJBJBHBJJBBJH@JHJBH@H@H@@JJHB@@HL@@LHH@LD@HLHDHDL@@@HHH@D@@DLHHLDH@@HLDLDL@LLDLLH@@DD@@DD@DD@DD@DD@D@@DD@D@@D@@@D@@@@@@@D@DDD@@DDDD@D@@DBBFDDFDF@@@@B@BB@FFF@@DBBBFB@BFFFDFBDBBD@D@@FBDD@@@JHJ@@HB@BH@@HBH@BHHB@B@JJBBB@HBHJ@@BH@H@@H@@J@HH@H@@DD@L@DHD@D@@DD@H@@LLLLDDHDLLLL@L@LHLDL@@LLHLLDLDHH@@@@@D@D@DDDD@@@@DDDDD@@@@D@@DDDD@@@@D@DDDD@D@@@@@DD@@B@BDDBFBBFD@BBFBDB@BBBB@@DFDBBFDDBBB@B@@FFDF@DFDFD@@BJBHBJH@BJBB@HHJB@B@BHHBHB@JBBH@JJHBJJ@JB@HBH@@H@@@@HLDH@LLLDDHLHHLL@HD@HL@LL@H@HDD@HHL@DHD@HLDDDHHL@D@@@DDDDD@@@D@D@DD@@D@@DDD@@@DD@@DDD@DD@D@D@D@@D@@D@D@@@@DD@FD@FDBB@FBDDBF@B@BDBBFDFDBD@@BDF@F@D@F@B@@BDF@@JJJJBJJJH@J@HHH@@@JBJHJJBH@BHHBHJBHJJBBHBJ@@JJHBJ@@@LD@HLD@@HH@HDDLDHLDLDHHD@@DL@LHD@L@DHLDHLHDDDL@LDL@@D@DDD@@@@DD@D@DD@@@DDDDDD@DD@@D@DDD@D@D@DD@DD@@@@D@@@BFBFBDFB@@FB@FDD@DB@DDB@@F@@BF@@B@DD@FDDF@FD@FD@F@@BJBBBHHHJHHHJJHJJ@BBJH@HBH@HH@@HJBHHJB@B@HHBJ@BBHJ@@HHLH@@LL@@H@DLLHHDH@@@DH@@DHDH@LDLLDDDDLL@D@HLD@D@@@@@@DDDD@D@@D@D@@@D@@@@@DDDD@@D@@DDD@@@@@D@D@@@@D@@@@FFDBD@BDB@@B@FD@DBFFBBD@F@BFF@DBDDBD@DD@FF@@DDDB@F@@JH@B@HBJB@J@HB@@HB@BBHBH@J@B@H@@@HB@JBJ@@HBJ@@HHJH@@DLLD@D@DLHDDDD@LH@LDD@H@D@@LDL@DLLHHL@D@@@@LLLL@LL@@D@@D@DD@DDDDD@@@@@@@@D@@@@@DD@@@D@@@@D@DDD@D@DDDD@@@DDBBDDD@DDFBBDF@@BFFB@@DB@BFBDBB@B@BF@BB@DDDDDF@B@@@JJH@B@BJH@@HBJ@BB@BHJJJHJBJHBBJJBBJ@@J@HHJ@HHJ@HBH@@LDLHLLD@DDHLLLD@HLDLHHH@@DH@HLDDD@@DDLHHLDLL@@@H@H@@@D@DD@@@@@@@@@@@DDDD@@@@@@DD@@D@DDDD@D@DDDDD@D@@D@@@BBDFBD@FFDBD@F@DD@BDF@@DBB@FBDB@DBFDFFB@DDFDD@FFBB@@J@H@BBH@JBJHHBBHJBBHJ@HHHJBBBH@J@JBHH@HJB@JH@@@HB@@@HDLDDHLLLLD@@L@HL@LDHDDLLHHHDHH@H@LDDDDL@LDDLD@LD@@@@D@@@@DDDD@@@D@@DD@@DDDDDD@D@D@DD@@@DDD@@D@@D@@DDD@@FFDFF@FDDFBDFF@FDFBFFDFBFFD@F@@@BBBBD@D@DBF@DDFBFF@@HJHHH@B@BHHHB@HHJJB@BBHJ@H@@HHJJJJHHJJJJJBJ@JHJJBJ@@HDHDDHDD@D@DLLL@@LHL@HL@L@HH@HL@DLLHH@L@DHL@D@DHDH@@@@@D@D@DD@D@@@DDD@DDD@@@@DDDDDDD@DD@@@@D@@DDD@D@@D@@B@@FFFFB@B@D@D@BF@B@@DFDBDDBBD@FBBFDDDFBBB@DD@FBFD@@JBJJ@@JB@BJB@JJB@J@@@JBJBBJJHBJBHJB@@J@JBBJJHJJ@HB@@D@HLHHLHLDHDDHDL@DDHL@DLHD@H@H@@DDDLLDH@@DHDLLD@D@@@DD@@D@DD@DDD@D@@D@@@DD@@D@@D@D@D@@D@D@@@@@@@@@@@@D@@D@@DF@D@BDBFBFFBFF@@B@DFFB@FFFBFFBDDBDFB@FFBFDDB@D@@BB@JBJJ@BHHJBJJ@BBJBJ@@@JHJB@HBB@JJBJBBHH@HB@HHHHB@@LLL@DDHDHL@@LH@DLDL@@HLDHDD@LHLHLH@HH@@H@@LHLHH@HH@@D@D@DD@@@DD@DD@@@@DDDDDDD@DD@D@@D@D@D@@DDD@@@@DDD@@@@B@BBF@D@DBBDDFBBD@F@DF@FFBF@DDFBFFDFB@FD@FFBBB@BF@@@H@@H@HHJJJ@@BBHJ@BHJ@B@HHHHHBBBJJH@BB@BBJHBH@J@JH@@H@DDHDDL@H@D@HD@DDLHHLHHHD@@LLLLH@@L@HD@HD@DHH@DHH@@DD@@@@D@DD@@@DDDD@DD@@DD@@DDDDDDDDD@@D@D@DDD@D@@@@@@BF@@FBFFFDFDBF@FD@@FB@F@B@@FD@DDDFFFDDBBFDF@FF@FBF@@@JB@J@HHHBBJBHHBJBJ@B@@BJBHJJ@BBJBBJJB@JHBHHJJJJH@@@L@@DDL@LL@@LDH@HHDDL@@LDDD@L@LH@DHHLDDH@@@@HHHLD@D@@D@DDDD@DD@@D@D@@@DDD@@D@D@@@@@D@@@@@@DDDDD@D@DDDDD@@F@DDB@DBFF@BB@DFBBDFB@@DFD@@DFD@F@F@D@@BFB@FFBFDB@@@BJ@B@BH@@HB@@BJ@J@@@J@J@@HJB@@@B@JJJBBJB@@JBBJHBJ@@@@DDDLHDLLLL@DHDHLLLDLHDDHHDLHDDLHD@HDHDL@L@@LLL@LH@@D@@@DDDD@@@@D@DD@@@D@@D@DDDD@DDD@@D@DDD@@@D@D@@DD@@@@@@@BFB@FBBDBDDF@FF@@@DDBBBBFDB@BDF@@FFDF@B@F@DB@F@@JJ@J@@JJHBBJ@@@BH@BHHJ@@JHHBJB@BH@BJHHB@H@@B@@JHHJ@@DDL@LDL@@L@@LLH@LLDHH@D@D@LD@LLH@DDHHH@LH@DLDHHLLL@@D@@@@@@@@DD@DDD@D@DDD@D@@@@D@D@D@@@D@D@DD@@@DDD@D@@@B@D@DFBF@F@BF@BBB@DD@DDD@F@@DDBFFD@DBDBBDDBFDDDBFB@@B@BJB@BBB@HJJB@@@@BBJHBBJB@@@J@@JJJHBJJBJBHHBJJBHB@@HL@@HHHDD@L@@HDL@@@H@DHHLDDLLH@DLDD@HLDL@H@LHHDLDL@@@D@D@@@DDDD@@@D@DDD@@D@@@DDDDD@@@@D@@DDDDD@@DDD@@@@@FB@D@@D@@@DFFBDFBBD@D@FDDB@@BDDFBBDDBDB@BFBB@@@@@F@@BJHBB@@@BBHBJHBHBHHBH@@BBHBBBBB@BBH@JB@BH@H@@J@J@J@@LHHHLLD@@HHHD@HH@DL@@LLHD@@@DLHL@LLHH@HHLDLDDDHH@D@@@DD@DDDD@@@DDDD@@@@@DD@@D@D@D@@@D@DD@D@@DD@DD@@@D@@@@DB@BFBFD@@BDD@B@BB@@@B@D@DBFFBFF@DBB@@@BBFFBDBFB@@@JJ@@JJHJBB@@@BB@@@B@BJBBJHJ@@JJBBHHBH@BBHJHJBH@HB@@@@DHHD@HH@@DHH@@DDHLLLHHDDHHDDLH@L@@D@HLDDDHL@DDLHH@@D@@D@@@@@D@D@@D@@@DD@DD@DDD@@@@@D@@DD@D@@DD@DDDD@D@@@DFDFDBFDB@FFBB@F@FBBDDDFBDDFB@@FBB@F@FDFD@@@@FDD@@@JBBH@BJJ@H@JHBBHH@HJBBHB@@BB@BJB@JBBBBBHHB@@JBHHHB@@@LLLH@LHLDH@LHDHL@HLLDDH@@@L@HLLD@LHH@HDDH@@DLHD@L@@@@D@@DDDDDD@@@@@@DD@DD@@D@DDD@@@D@DDDDDD@@D@@@D@@@@@DF@BF@BDDBBDBFFFF@B@BF@@FDBDDFDFD@@FD@BBFDFFFDB@B@@@BB@@@BHBBJJB@H@HBH@@HJ@JHHBHB@HJHJJ@@JB@@@BHBJ@JJ@@@@HDHHLDLDDD@L@HL@LHHLDDDHHHL@LLL@LDLLHDDLH@@@L@HHL@@D@@@D@DDD@@@DD@@@@@@@@DDD@@DDDD@@@@@@D@D@DD@DDDD@D@@@FDD@@@@DBDD@BB@DDDBBDB@FF@B@@@DDDFDDB@@D@FDB@DDF@@@BHJH@BBBB@J@BH@BHB@HBHBBJH@@H@JJHJ@H@JJJJH@JBHJ@B@@@@@@DHLDHHHLDLL@H@@DLL@H@@@H@H@LDLHHHHDHLD@D@DDLDHL@@@D@D@@DD@DDDD@@@DDD@DDD@DDDD@DDD@DDDD@@DD@@@@@D@@D@@D@DFB@DFFBDF@DD@@FDBFFFDBFD@FDDBB@BFBFFBFDBD@BB@B@@@BHJHBB@JHBJBBHBBJ@JJB@@@HJBHB@@@@BBJHHBBJHJB@BJBHJ@@LLHLDDHH@LLDHHHDHH@HHH@@LHDHHD@D@HLLL@DH@DL@@L@@HL@@D@@DDD@D@@D@@DD@@@@D@DD@@DD@@DD@D@@DDD@DD@DD@D@D@D@@DF@BFD@BFDFBFBDBD@@DDB@DB@@BFBBD@DD@B@BBD@FDFB@@FB@@JJ@@H@J@JJJ@JBB@JB@JHJB@HJJBH@BHJHHBJBHBBJ@JJJBHHJ@@LL@DHDDLHHLLLDDHDHDH@DHHDD@LLLDL@L@L@DH@DL@HHDDH@H@@DD@@D@D@D@D@@@D@@DDD@@@D@@D@@@@DD@D@@@DD@DD@D@DD@@@@@FBFD@@@BFBBD@@B@BBFFBBDDBFFDBBBBDBFB@B@@@DFBDDD@F@@HBJBH@BJJJ@HHBJJHB@JH@@B@BHBJ@JB@JBHB@JBHJBJJBH@@J@@HHD@@LDHL@HLH@HHH@LH@H@HL@LD@DLH@LLHHHDDD@HHHDHLDL@@@DDDD@@@DD@@@@DDD@D@D@D@@@@@@DD@DDDDDDDD@DD@D@@D@@@@@@BF@@BBDFFB@FFBDB@DBFFDDBDBDDFFFFFB@BFBBDFDBBDFFB@@@B@HH@@@JHJ@BH@JJHBJHHJ@H@BJBB@@B@BJ@@BB@JBBJ@B@HB@@H@H@LDD@@LDHH@LDLH@@LLDHHHL@HDLHDLL@HHH@@D@LHHHLLH@@DD@@@@D@@@@@DD@@DD@@DDDDD@DDD@DD@@@D@@@@DDD@DDDDD@@@@B@BF@DB@DD@@B@@@BDDF@@FF@@@@D@@B@@@@@BD@@@B@FFDFD@@@@H@@@JJJ@@B@JH@BBB@BHB@JHBHJ@@@@@HHBBJ@@JJBH@J@@J@@H@H@HH@@@D@@HHD@D@HLL@LL@DD@HL@@L@@LHLHDH@@@HH@HD@@@DD@@@@@DDD@@D@@DDDD@@D@@DD@D@DD@D@D@@@D@DD@@D@@@@@@@D@FFBBB@@@FBDFDDDD@FD@FF@BFB@DBBD@DF@FBBBFBDFBBDBD@@BHB@H@BBJJ@@@BB@@J@JB@BHJ@HBJJH@@@B@H@@BHHHHBHJHH@@@DHH@L@DDHHLHH@@DL@@D@LHD@@HDHDD@HLDL@HLL@@DDLHH@HH@@D@@D@@DDD@@@@@DDD@DDDD@@DD@@DD@DDD@@D@@DDDD@@@D@@D@@@D@@@FDDFB@@BBBD@B@FBDFD@BB@@DBBDBDFD@@@BDBFBFFD@F@@) (il:rpaqq *seersucker-bm* #*(200 200)@@LLDLLLDHLDHD@LLD@LDHDL@L@L@@LDD@LDLH@@@DHHHLLLH@@@BEJELBGICOEJDCNHNLJFG@AJFMMOKM@BK@NLDEHK@MIJN@NJLB@@DAD@@EEEA@DA@EADADDAEDADEEAE@AE@A@@ADDAAAAE@D@DE@E@@@@@@@BBBB@B@BB@@@B@B@BB@B@B@@@B@BB@B@@@@@@BB@@@B@B@@LH@@@DLDHLDH@HHDDHDDDD@@LLD@D@DL@LH@HLLH@HH@HLDH@H@@M@N@@GODGEKKD@LMJNAO@KNFHBGABFCLFNBDOC@CCELAMANDLA@@DD@DA@@AAEEADDEE@E@DD@EE@EDEAA@ADEEEADEADDADDAEEEE@@@@@@@@@B@BB@@B@@B@@BB@@@B@BBB@@BB@B@@@BBB@B@B@B@BB@@DDLDD@L@LHD@@LLDHLHHD@L@H@LDHLLLHDLDLHDL@@HD@DHH@L@@JACHHFLLDNOLAGNMOBODBLHFELIJDEMDNINHBIC@MJGNAAHMIE@@EAD@AAE@AE@DD@DE@AAAAEDAE@DEADDDD@EAAA@ADDDEDEE@@@@@@@B@BBBB@@@BB@@@@@@@@@B@@@@@B@B@BBBB@@B@BBBBB@B@BB@@D@HDDDDD@H@HLD@LHHLDL@HL@LH@@DL@H@@LDHLHD@@@HHD@HL@@ICJOONKJ@OIFLA@LDM@MGMDHFFBEMBNLKKCA@IAODJGO@LJJNB@@ADAD@AA@ADAAD@DDDADDAE@AEDAE@@@@@A@AEE@DEADEE@A@DA@@@B@@BBB@@BB@@@@@BB@B@BBB@B@BB@@BB@@@@@@@BB@BBB@@@@@@@HHHLLDL@H@D@DL@D@LLLDLHLLLDDL@LL@@D@LHD@@L@LH@DHH@@CNODD@MKBIIOIKD@EAKKM@DDCEHLKHEBGCFIHNBGNNIABMCHGH@@D@EAAD@EA@DD@EDE@DD@AEAED@@@@D@AADEE@@EDAEDEDAAA@D@@BB@BB@@B@B@BBB@B@@BB@@B@BB@@@BB@B@BBBB@@B@@BB@BBB@@@LD@HLLLD@H@DLLH@LLHDDDDLD@@@L@HH@HD@LHLDDD@HLHDD@@@@ADHKIDNKHGNGJLFELCMDENHGJFJMKD@AEDAIODBCKIGDMKAKJH@@E@@@D@AAD@EA@EE@DD@ED@DE@EEDA@@E@@@DAD@ADAEDDE@DED@@B@@@@B@B@@B@BBBBBB@B@BBB@@B@B@@@BB@@BBB@@BBB@@BB@B@@HLDD@L@@@DLH@@HLD@LD@DDHLDL@H@HLDHDDH@LHHHDLDLHHH@@@HLDGNAOCHNKMCEFMI@NKCJGOKA@MLADONOJIENAAJK@ICIIEBK@@EADDDEAD@D@DEEADAEAAD@ADED@AEDDAEEAAE@@AEE@A@DDD@A@@B@BBB@BB@@@@BBBBBB@BBBB@B@B@@@BB@@@@BBB@BB@B@B@B@B@@HLL@H@HH@LDLHL@@DD@@HL@@D@H@HH@@@DHLDLLLD@LL@DLDLD@@ENLLAENFHIKMHHENHGOBBAKNJCAHBCMMEMC@KAI@GLGEMLNKKH@@A@@@A@DEDEDDEEEDDAAEEDAD@@EEDED@DDD@AA@EDDAE@@D@DE@@@B@@@B@@@BB@@@@@@BBBBB@B@B@B@BBBB@@B@BB@@BBBBBB@@B@@DHHHLDH@D@HH@LH@@@HHHDDLHD@DHHHD@HHLHLLDL@@LHLDD@D@@CBCMGHBLNLKEAINBCOAAMFMMEBFLOAA@OCBEF@DDHODJEKDMJH@@DEEAEEDED@DDDADD@DAE@DE@@EDDAA@@A@DA@AE@E@D@E@E@@D@@@B@B@@B@BB@BBB@BB@@@BB@B@@B@B@@BBB@@@@@B@@BBBB@@@@@@DLH@H@D@DDDLDHHLDDD@DD@@D@@LLDLHHHLHDLDHLDDDDHH@L@@@DLCED@KLAKAKFHFD@IOGIDONMLICCEKDCOHAFIDK@FCM@EBHMK@@EEA@EDE@@EEA@AD@DDE@@DAEEEDDD@D@ED@@EEAAD@AE@AEAAE@@BBB@B@B@B@BB@@@BB@B@B@@@@@BB@@@BB@@@B@BB@@BBB@B@@@@@HL@@@DHHLDLHLLDDHLHLLL@HDH@L@LDLL@DHDHLDHH@HDDDDD@@@GMKDDM@ACLOIEGAIJLELBNBALHIDMKJGIHHGHBDONAKAKHJOLK@@EAD@AA@@EADDAEADAEDAEE@AAEE@EDDDEAAE@AA@AADEEADAEE@@B@@BB@B@BBB@@B@@@@BB@BBBB@@B@B@@B@BBB@BBB@@BBB@BB@@@LD@DH@DLLDLH@@DDH@@D@HDLLL@DDDDLH@HHD@H@DL@D@@DDDH@@GAJOCNEHCGNKNAAKGAHODJC@AGLKIFNILOJCBFBG@FKHBJHBHA@@EAE@@EEAADAAD@AADAEED@DADA@E@A@@@DA@EEAE@@DADEADDD@@@@BBB@B@@@BB@BB@@B@BBBB@BBBBB@@@@@B@BB@B@B@@@B@@B@@@L@DL@@DD@@LD@LLLHLL@@HDDHDLHLL@DHLL@HLD@DD@@LD@LD@@@DBACKLKGJLINFILDJOOECENHEIADMFCDL@JAK@@MKKDOLBMLBJ@@DEAE@ADDDEDD@@E@AEEDDADADDE@ADA@A@A@AD@DDA@@@DD@DA@@B@@@@@BB@B@BB@@BB@@B@@BBBBBBBBB@@B@B@@BB@@B@B@BBB@@@@L@HHLLHLD@LLDLHDDD@D@LHH@DHHHHLHHLL@HDHLHDD@@@LLD@@OELCBF@MMEGDGLHJMMJEEJAJOJHAO@DCNOOGLGCI@LKIFAIA@I@@D@D@DAD@D@AA@@AAE@AADEDDA@DEDDDAAA@DE@@DEAE@E@DD@A@@BB@BB@B@@@B@@@BB@@@@@@@@BB@BB@@BB@@@@BBBBBBBB@B@BB@@@DDDDDHLDDL@@DDHDDH@HD@HLHLHDHHDLLH@LLD@DLDL@@HD@L@@HJHFFGJOOKNJECBKIHH@JDDOJ@IFCBLAAFFO@OMJIAHLEMBIFB@@@@@EED@@EDD@D@AE@EAAA@@@EED@@@ED@AEA@DE@EAE@EE@EDA@@B@@@@@B@@BB@BB@B@BBBB@B@@@BB@@@@BBBBB@BB@BBBBBBBBB@@HLHHLDDDLHL@@@DDLHLDHLDHHHL@LLDH@HLLDHL@LH@DHH@HL@@@INNCBCNGBIGD@OMGM@LKHFEDMJCJKFNAC@NGAMGBBFDNM@JAGJ@@@DAD@AD@A@@E@DD@AA@@D@DA@DEEEED@EEE@DEEEEEDDEAEAE@@@@B@BB@B@@B@@B@B@BB@@B@BB@B@BBB@BBB@BB@B@@@@@BB@@@B@@@@H@DHLHD@@LLHLLHH@LLDDLHL@LHHDDDD@D@HHHDLL@L@@HLD@@OCAJABAJLDCG@MEKGNMKBA@@CILDBOACEDFOMODKJGICNFFAAJ@@DDA@EDAE@@EEDEE@DAEE@EEAAEE@E@@@@A@AAAAEEEE@ADDD@E@@B@BBB@BBBB@@@@B@@@B@@BB@B@B@@@@BB@@B@@@BBBB@BBB@@@@@H@DHDD@DLLHDDHH@DHHLHHD@LLHLD@DDLDDD@D@@LDDDHLHHDL@@HBKCKOB@AEDGMCE@@OGE@HG@AMHNGAFCKGFJKJGAL@HBH@LFMM@@EDDDAADAE@EEAEEDE@A@ADA@@D@@D@@AEEE@D@DE@AEE@@EDED@@@B@@@B@@@B@@BB@B@BBB@BB@@B@B@@B@@BBB@@@@BBBB@@@B@@@@DHH@@DLD@@DHLHDHHLDDHDLH@@LLHDDDDHDLD@@LHHLD@LDLH@@@JH@BFNEOGNLIMOBJEGNANOJAONA@NLDEFIHANFDGAJILNDMBNG@@DEEEAAAE@@AAAE@@@EDA@ADE@AE@DA@@EAAD@AA@D@@@@DE@DD@@B@BBB@@B@B@B@@BBB@BB@BB@B@@B@@BB@@@B@BBBB@@BB@@B@B@@HH@H@DLHLLLDHDLLHHLLLD@DHD@@DL@@HHLD@@@DLHL@LDHH@H@@KMG@DFGHF@EDLOAFMGDBFOFIDBKJB@@ODAAFCAFFFIOF@DGHOM@@D@EAA@@ED@A@ADDEDAA@@@@DEDAADA@@EEDD@AADEAADADAAEE@@@@@B@@@BBBBBB@@BBB@@@@@@BB@@B@BBBBBBBB@B@B@B@@B@@B@@DLDD@HHHD@DDLHHDLLH@DD@L@@@H@HDDDH@DDDLD@HHL@@@@@H@@AKFLOAMHMFGDOAOBIGFECABDDKOHNOAJHBKAOC@KJCMGIAKLAL@@EA@@@ADE@DEA@DEEDAAD@D@@AAAEAADEDEE@@@@@E@EDDAE@D@@@BB@B@@@BBBBBBB@BBB@BB@B@@B@@B@@B@@@@@B@@BB@B@@@@BB@@LHDDDHL@L@DDLLH@HHL@@@HHHH@HHDLLL@@@DDHHLDLDL@DH@L@@OIFJFKLFKGE@AOMGAMG@OKOMKKECM@HK@KLDMEKAJIJNDLNLNL@@DDEDAEDD@@ADD@@EAAE@DDD@D@EEEEEE@DADEDDEAEEEAADE@E@@B@BB@B@@B@B@BB@@BBB@@BB@BB@B@@BBBBB@@@@BB@B@B@@@BB@@LHDHLLD@HL@@HHHHH@LDD@HDHDDDLH@LH@@L@HLDLLL@LHL@@D@@NKHFHJBONBGNA@CLCH@@DEIKLKHMDMIKALDHHCDJOOJAKF@HHK@@AA@DEEEDD@D@EADA@AAE@@ED@DDDAA@DEAA@EAEEAADD@EEEEA@@BBBBBB@@@@@B@@@@BB@B@B@B@B@BB@@B@@BBBBB@BBB@@@B@@B@@LDD@@LH@LLD@@DLHLHHHDHH@L@HDLHDDHLDLHHDH@LDLD@HLLD@@INACNHJ@ODAKNIFHDNBBBIJKCDC@FMJJMGJAAIODODLCMLELOK@@DDA@DE@EEAED@DD@E@@DEAD@@EA@AD@@A@AA@D@DDD@@DEEE@E@@@BBB@@B@B@@@@B@BB@BBB@@@BBBBB@BBBB@BB@BB@@@@@BB@@@@@HLLDDH@D@LD@HDLD@HHDD@DLL@@DDLDHH@@@HDLDDHD@H@HH@L@@GDBMAEHGCGAAEE@JBCMOLNFFJFNLMNAN@NIOFNACLMHNMFNGKJ@@AA@D@DADEED@@A@DDDED@@A@EA@DEDDAA@@E@DEDDAEA@@@@EE@@B@B@@BBBBB@@BBBB@B@BBBB@@@B@BBB@@BBB@B@@BB@B@@B@B@@@DHDL@LHD@L@@@LHHDD@@DHH@HDDLD@HDLHHDLHDHD@L@LD@L@@@@JODKCMNMEGKOKINMAJE@JNBMLAHBKDD@IKLBEHFBKNFDDJHNCE@@ADDDEE@AAEAE@DEA@EA@EDEA@@DDA@EEDAED@EAD@DAADA@E@E@@@@@@@B@@B@BB@BB@@BB@B@B@BBB@B@B@@@B@B@B@@@B@B@@B@B@@HHLH@LLHHDLDLHHDDDHDHLLHDLD@HLDHL@HLHDDH@H@@LLL@HD@@ODCINDACHHCHGGLEKMDNFHKGACGL@NIECLBFJOGHLHEGDOBNGL@@EADDE@@@AEE@DADEA@@DEDEDD@DDAAEADEE@E@EAED@DE@A@AD@@@BBBBB@BB@@BB@B@@@@B@@@B@@B@@BB@@B@@@@B@@B@B@@B@@B@@@HDDDLHHHLHHHLHHLD@@LLDL@H@LH@@LLDHHH@@D@LHDLD@@HH@@HKLI@BNNA@IAEMMHJFJ@BAGIBADJFJBLDMLGEGGOMBFCHNEBDA@@@@@EDED@E@@D@D@AAEAAA@@DDDD@@DA@EDD@A@@AEAD@@@@EA@@@BB@B@@B@B@@B@B@@@BBBBB@@B@BBB@@B@@B@@@@@BB@@@@@B@B@@HH@@@LDHD@H@LD@@H@@@DHDHDLDD@H@@DL@@H@LDDH@L@@LLLH@@DMLD@FCFNJDDEDBOKBMDFCHBEBCMFLBGMOKJOBFC@B@NLON@MM@@EAAD@EDAEDEDEA@@@AAA@EAA@AAEDAAAD@@@@D@DEDAEADEDEA@@@@BB@@@@@@BBB@B@@BBBB@@@B@BBB@BB@B@BB@BB@@@@@@B@B@@@HHHD@@@HH@@L@H@@@DDHHLHHH@HH@@LLD@H@@L@LLLDHHH@L@L@@NFOJLLG@DFJLLOEAHLFMJII@BGKAHNGDD@BGFMHIMDLNBBCKAH@@AD@DD@A@@A@@AA@@EEDDAA@AAADEA@DADEDDAE@EDDDD@D@AE@@@BB@BB@@BB@B@@B@@@@B@B@@@BB@BB@B@@BB@BBB@@@B@@@BBBB@@H@HD@@LDHDHHLDDLHD@HLDHHLH@D@LDHDHDLL@LH@DHL@@@HDD@@JGMFGKONOLFCBMBINCNEJEFONKKHGHICH@MGFGDLBLEFLDBMEC@@ADAAA@EEEE@@@D@ADEAAEDEDDE@EAD@EDAAADDEAAD@AEAAEDE@@BB@BB@B@@BB@BB@B@BBBB@BBBB@@B@@@BBBB@@@@@BB@@@BBBB@@LHLLHD@@DHLH@@LLHL@D@@HL@L@DLLHHHHLHLHHLHDL@LLLH@H@@IDIFDJEEAFAFNNN@COJN@INCNAKJ@HL@ELNKICM@FHNAGCEJEH@@A@AEAE@ED@DA@AEDE@DEE@AAAEDDEEDE@DD@@@ADAADEEAD@AE@@B@@BBBBB@B@@@@@BB@B@@@B@B@@BB@@BBBB@@@BBBB@@@@BBB@@@HDHL@DLDDDH@DLH@@L@D@HDHDDLLL@L@HLDD@L@L@DHLLHLDLD@@EAHMJILKOGKEDJGLCFGHO@ENKEAK@H@AFGDMNDIA@FIELODCE@@@DDAAE@EEADED@EA@DAAADDA@E@ADAD@EA@E@D@AAAAA@@A@AAD@@@@@@B@@@B@BBBBBBBB@@B@@BBB@BBBBBBB@@B@BB@BBBB@@B@@@@@@@H@HH@@HHH@HHDD@H@L@D@HHLD@LDD@LH@LDDLH@L@@HHLH@@@LONADFJGHNBCOHCGOEM@BJMEJFFCNINKNIBHKABHCCNIMIJAJK@@D@EADE@AADD@DE@AA@DEEEDDDADEAEA@DAEADAAEEDA@@AEDDA@@@B@BBB@@@@BB@@BBB@@B@@B@BBBB@@@BBBB@BB@B@@BBBBB@BB@@@HDDL@HHLLLDD@DHHDDHH@@DLHHHHDDDHLL@DDD@@HHDH@H@HH@@JAFDIFGL@J@FCJG@DEMIKNJJID@@LMMNHBCLAKF@IGCGIKBDJK@@DEA@A@DAED@@ADEDE@DE@ADEA@DDEDEEEEEAAE@E@EDE@E@@A@@@BB@@BBBBB@B@BB@B@@@BB@B@B@@B@@@@@BBB@@BBB@B@BB@BBB@@DHD@LDLLLDDH@LHDLDH@D@D@H@HLLD@@LD@LHD@LLDLHHLLHH@@@LCBGEOCMOABNEKBKJGEMB@LDEGBNANJAFHHNFGICA@@JHINEBG@@E@EEED@DE@@E@D@@@DEEAAE@D@@A@@D@AA@@AEEDDEAEAEEDDE@@B@@@B@@BBB@BB@@BBB@BB@@@B@@@@B@@B@B@@@@BBB@BBBB@B@@@DL@@DDH@@L@D@@H@L@@@LDH@@LL@@D@@@HLL@DH@DDHDDLHDL@@@@EFENHGLNONBFHFKLOMEMJEEJKFLHGENIEBJGHFMBMC@OOMCOI@@EA@AEEDEAA@AE@ED@AAEA@EAEEEDAEEE@ADADEDA@@DAD@@EEA@@@@@@BBB@BBB@B@@B@BB@@@@@BBBBB@B@B@B@@BB@B@B@B@@B@B@@LL@LDDLLLD@H@D@DLDDHLHDDLHH@HDDDL@@HLLDDH@@@DDLHHH@@FGM@MGNCBLB@MLH@NODIHAD@DBODCMNHCDEHHIAMJADOEJKLLO@@EAAA@A@@AED@DEEAD@EDDAEA@@@EAEAD@@@DADAED@@@DDE@DA@@B@@@@BBB@B@BB@BBB@@@@@@@@B@@@@BBB@@@B@BB@@BB@@@BBB@@@@@LD@@D@DLLH@@@@DD@HL@DLD@@@HDDLHLL@LLDL@HLDLHDL@@@KNA@IKIFFAOCAHDLCA@KBEJHLFFMNIAGNFDCIMDLAHAOIJEMGN@@@DAD@AADDED@AAE@DDDAAE@@ADDDEE@A@ADAADEEED@AEDD@@@@@BB@@@@@@@@@BBB@BBB@@@@B@@B@@B@@BBB@@B@B@BBBB@@@@@B@@DHH@DD@@DDH@HL@L@HL@H@@@DLD@@DD@@@HDHDD@H@LDDL@L@L@@NHJKLOEA@HHJFAHJ@DMACLNKECB@DOKOALNIHCKKMDOGDDKHCD@@AEDADDDE@AADEDEA@@@AEE@ADAEAD@AAD@DE@D@ADE@ED@AADA@@@@B@BBBB@@@B@@@B@BB@@@B@@@@BBBBBB@@BB@@@BBBBB@BBB@@@HL@@LHLLDDD@D@D@@@@DDH@@LHHDDLLDDHHDHDDDLLHLDLDH@@@@CFKJGCKKCAGJJC@FEHNMLHHGDJIEGNH@OABG@JNGGFIOCDFNHH@@DAAD@A@@AE@DAAD@@@EEAEEADED@A@@AEAAEDAEA@DD@DEDD@D@@@@B@B@BB@B@BBBB@B@BBB@@@BB@@BB@@BBB@B@B@B@@@@@B@@@@@LDDLD@HHDLDHH@@LLDHH@DLDDDD@@@L@DHDDDD@LHD@DLDHHLD@@@MONJ@LHMGJBNKDIMAHNNGEHAA@NBINOEANHHBJGFIABDMIEAL@@@AEAADDEDDE@A@@@@EE@EDA@DAEEDAA@E@EDEEEEA@EAA@D@AA@@@B@BB@B@@BB@BBBBB@B@BB@@B@B@@B@B@@@B@@BBB@BBB@B@B@@@@D@DDDH@@LL@@LDL@HD@HLDLLLDLD@HHLHHD@L@@@D@LDLDLH@@@AHGHJOEOEFECM@KMCLJJNDDDJIKNBOMOBODNLHFELIBB@MBKIN@@DAAADAEDEA@@DD@AAA@AA@DDD@@EEDE@AA@@@DAE@DDADEED@D@@@B@@@@@@@B@@@BB@@@@BB@B@BB@B@@@@@@B@@B@@@@B@B@@@B@@@DHLHD@@DD@L@DHDDLDDLDLDDHH@@H@LHHLDL@HLHLHDLDHHD@D@@CAAEIODJHINGLNCIC@FOOBHAABH@J@LDLHIJHDHLFBE@FGOGIM@@AE@D@@DDADEDE@AAEEE@DEDAEEEE@EDDAEEDDA@EDA@@A@E@@E@@@@@BB@@BBB@B@@@@@B@BBBB@BB@@B@@BB@BBBBBBB@B@@BB@B@@@@HLL@D@HHDL@@LD@HDLHD@@@HL@L@D@D@@@LLH@@LLHDDDHDHL@@NMKOEFHI@LOGIJKFJICHHJCBNKFIHG@E@HOLMADHCFLABNBAKL@@E@@DEE@E@AD@ADE@@@AE@DEA@DE@ADE@EAADDD@DDADDADAE@D@@@B@BB@@BB@BBBB@B@@@@@B@@B@@BBBB@@@@@B@BB@@B@BB@@BB@@HHDDHDL@HHHDLDD@H@@HHLD@HLL@HD@LLLL@LDL@@L@LHLDLHH@@OOCEHFDNJHNLOGGHGHFKADKHGF@MNMELCNCLCFHBFO@IHDFICK@@DEA@EAE@E@DA@@EA@DED@AAD@AEA@A@DDAEAA@ED@EE@D@EEAA@@@BBB@@@@BBBB@@@B@BBBBBB@@BBB@BBBB@BBB@B@@@@BB@@@@B@@LDH@LD@LHL@HHDLHLDDLH@@@@DH@LDLD@H@L@DLDLL@HHDH@@H@@IHD@BMGKM@HOKAJHIALICICHNCNE@DMI@OLJKJEEG@IJJDHLDO@@AEEDEA@ADEAAAADEE@D@EAD@@@A@@DDAEDEEDEDDAEDAD@@EA@@@@@BB@@BB@BBB@BBB@B@@BBB@@B@B@@BBBBBB@BBBB@B@BB@BBB@@DDDHLD@DHHLD@H@HHH@LHHH@LD@HDD@DDDDLD@DD@H@DH@@DLD@@IBJBLGEBBOGKIAMEOI@AMNFHHJL@IENHGNOCJHK@CGAMKIJNOJ@@DDAA@@D@@@@@ED@ADD@@DDEDDADEEADDA@@DAAAADDD@DDEDDA@@@B@BB@@B@@@@@B@@@B@@B@@BB@@@@@@@B@@@@@B@@@@B@BB@B@@@@@HDDDHLL@D@DHLD@D@@@H@DLL@LLD@@@DLL@DL@DHH@LDL@DL@@H@J@IHBACGB@JIDCG@IONBLN@FGAHNBCOAAMKLIEIBBCIK@JE@@@EE@AAA@EDDA@E@ADEDE@AE@@EE@DADD@DAEA@ADAEEA@D@@A@@@@@@BBBBB@@@BB@B@@@@@B@@BB@BBB@@BB@@@B@BBBBBB@BBB@B@@@@L@DL@@DLH@@DDDDDHDHD@@LL@LDLHLDDD@@LD@DLHHLDHHHH@@@FIH@OCEGIKNKIC@DLCADBMJFCAKFJFD@IOGNCILMC@GEMHKAHK@@E@ADA@DDE@AA@@EEE@DEDD@AEEA@DD@DDE@@DAADDED@A@DA@D@@@@@@@B@@BB@@BBB@@B@BB@B@@BB@@@BB@B@B@@@@B@BBBBB@@B@@) (il:rpaqq *burlap-bm* #*(200 200)@@HH@HHH@HH@H@@HH@@H@H@H@H@H@@H@@@H@HH@@@@HHHHHHH@@@@A@A@@AAAAA@@A@@@@@@A@A@@AAAAA@@A@@@@A@A@AA@@@@@@@@@DHL@JFFD@BLB@D@NBFL@NLBFFLJFJBNHJB@HLF@BHJFJDJDFBD@@@@@@IHII@AAHHAI@@I@H@@@III@IAIH@@IH@HIAAI@AI@HAAII@@HH@@@@H@HH@H@HH@@H@@@@@@HH@@@@@H@HH@HHHH@HH@HH@H@H@@A@@@@AA@AAAA@@@A@@AA@A@@@@AA@@A@@@@@AA@AAA@AAA@@@A@@FDHD@J@HBDFJLLFFJLBDN@LF@DDFHB@HNNDNJLNBDF@LLJLLLD@@IAIIAHA@H@@IAHHIIAA@IAAHAHHIA@A@IAHIA@@HIH@HI@IAII@@@@H@@@H@HH@@@HH@HHHH@@H@H@H@HHHHH@H@HH@H@@H@@@HH@H@@@AA@@@@@@@A@AA@AA@A@@@@@A@A@@AA@@A@@@AA@A@A@AA@AAA@@LHDH@HFBBF@FDJNFJ@J@JFFHNHDNBDLFD@FBH@HBDLDDFFNBJB@@HHHAHAH@@HH@HI@AH@IAIIAAAAIAAIHAIIHAAHI@@IHIHAAIH@@@@@H@@@@@@H@HH@@HHHH@H@HH@HH@@@H@H@@H@HHH@@@@HH@@HH@@AA@AA@A@@AA@@A@@@A@AAA@@@@@AA@@@AAAA@AAA@@AA@@@@@@@@BNJNBB@HHD@BD@NLLBNF@LBHNLBN@@@H@@B@NDJDNJFNL@JBDH@@I@A@HAI@HHIAI@@@HHHHIAHIAI@HAHIIA@AHAIA@AHHII@IIAH@@@HHHHH@H@H@@@@H@@@HHH@HHHHH@@H@HH@@@@HH@@@H@HH@@HH@@A@A@@@AA@AAAAA@@AAAAA@@@AA@@A@A@AA@A@@@A@@AA@AA@A@@@NJLJ@N@LJ@DLBNLLHNLJJNJNF@JJ@LJHJDNDBHDNBNLLF@HBJN@@@HIAHIA@IAHAA@IAIIAHHHIHAAI@A@II@HIAA@AAAI@HIHAHII@@H@@HHHH@@H@@HHH@HHH@@@@H@@@@H@HH@H@@HHH@@@@HHH@@@@@@A@@AA@@A@A@A@@@A@AA@A@@A@@@AA@@AA@AAA@@AAAA@AAAA@@@@DJH@D@HJLBFH@DD@FD@LLHFLHNNDBJBNJHHN@NJ@NJNDLNJNND@@A@AHIA@II@I@IHH@AIA@AIAI@HHIH@A@@AIII@H@@IIAH@AHII@@HH@@@H@@@@HH@@HH@@H@@@@HH@H@H@HH@H@@H@HHHH@H@HHHH@@@@@@A@AAA@@AAAA@AA@@AA@AAAA@A@A@A@A@AA@AA@A@AAAAA@A@@NBLLDLBLBFJLFNJNHFHJL@@DLNJHNLNHLLHJLBJHNNJJHFNDHH@@AIIAIAHAA@AH@AA@@H@H@HHI@HA@HI@IH@AI@HIHHIIAAAIHH@@@HHH@H@HH@H@HHH@@@@@@HH@@@@H@HH@@@@HH@HHH@@HH@@H@H@@@A@@@AA@@@AAA@@A@@AA@@AA@@AA@@AAAAAA@AAA@A@AAA@@AA@@@JB@JJHDLLFFFNDFDNBBLLDBDHHFNLDN@FDFJHBJDLF@FJJLHDL@@@AI@AHAAA@HI@AIAHHHAAAHHAAHIHHIA@@@A@@A@IIHAI@AAIH@@@HHHH@H@@@HH@HH@@@HHH@@HH@@@HHH@@HHHHHH@H@@HHH@@@@@@A@AAA@@@@@AAAA@@AAAAA@AAA@@@AAA@AA@A@@@@@A@@AA@A@@@@DDFJNLLNN@NDD@LLHNBFHLL@JDDLBHJJ@@LH@HLJDJF@FHL@HD@@IHAHHHHIIHIIHH@AA@IA@AAHIA@H@AIIHIAA@AHAA@@IIAIHII@@@HH@H@@@@@@H@HHH@@@@@@@@@@@HH@HHHHHH@H@HH@@@@HH@H@@@@@AA@@A@AAAA@@@@@AAAA@A@A@AAAAA@AA@A@A@A@@AA@A@@AA@@LNHJFDDBBDFBJHFBLLLBBL@DFFDNLBLBDL@JNLJJDB@LHJFBHL@@AHAH@AIIHH@IAH@A@HH@HI@A@IHI@H@IA@IAIIAIH@I@I@AAAH@@HH@@@@HHH@HHHH@@HHHHHH@H@H@H@H@HH@@H@HH@HH@H@@@@@@@@AAA@@A@AA@AAAAAA@@A@@@@A@@A@AA@AA@@A@@@A@AAAA@@A@A@@D@N@HBH@LBFNJFJF@FDHDNBHBFDHLLNDD@JNHH@HBBFLN@LBFF@@@IIHHIHAIAHIIAIH@@HIIH@HIHIAIHHH@@H@AHIIIH@IHHIA@I@@H@@@H@@HH@HH@@@@H@@@@H@HHH@@@@@HH@HH@@H@@H@@@@@@@H@@AA@AA@A@AA@A@AAAAA@A@@A@AA@AA@@A@A@A@@@A@@A@@@@@@A@@N@LBJFDJJL@BNHJ@NBFDLJDHL@JD@BHJ@FH@NL@FJHLBLDBLFN@@HAAHAH@@AH@H@@@H@IAAIH@AHH@HH@HA@AA@@AI@II@IIHIIIH@@H@@H@@@@@@H@@HHHHHH@@H@@H@HHHH@@HHH@HH@@@@@@H@@H@@@@@@AAA@AA@@A@@A@@@AAAAA@@AAA@A@A@@@@AA@@AAA@A@@A@@@@@FNHFJ@FDFLFDJHDJHDLNNBFBFNLJBF@HBJBJJD@NNHHHJLNJNB@@AIAAHIII@I@@@IHAHIAI@IHAIH@@A@@IHAI@IA@@@IIIA@HAAA@@@H@HHHHHH@@HH@HH@@@@@@HHH@@HHHHHHHHH@H@HHH@@@@@HH@@@AA@A@@@AAAA@A@@@AA@AA@A@A@@AA@@A@AAA@AAA@@AA@AAA@A@@FBFHFJNJFJB@BHBHNBH@FFLLBJDLNFN@BJHFDHHNLBN@NJNNJH@@@@@IA@HIAIHAIAAI@AI@AAHIHIIA@IH@AHIAIIAH@@@IAI@@AA@@@@@@@@HH@@H@@@@H@@H@H@@HHHHH@HH@HHH@HH@@@H@H@@H@@H@@@@@@@A@AAA@@AA@AA@@@@@@A@@A@A@@AA@@A@AA@AA@@AA@A@@@@@BHDLNHBFFLJF@HFBL@J@HBHLFFBJHFNBBFJHDNJDBNHFNJFFJ@@@H@IAAIIIAIIHA@I@AHAIAIHAAIIAAAH@H@IHI@IIIAHI@IIAI@@HHHHH@@@HHH@@@@@HHH@HH@HHHH@HH@H@HHH@HH@HH@@HH@HH@@@A@@A@A@A@AA@@AAAA@@A@@A@A@A@A@@AA@@AAAA@@@@@A@@AA@@@BN@FJ@FHJJ@N@DLB@@J@LHFBHLFNLNFJDLFHDLDLNDLNN@DHN@@@HA@I@@AAIHAAHIAA@HH@AAH@AAAAIIAHIAHHH@I@AA@AH@@@HA@@@@H@@HHH@@@HHHHHHH@HH@@HHH@HHH@@@@@@@HHH@HH@H@@HH@@@AAA@A@A@@@AA@AAAA@AA@A@@AA@@@AAAA@@AAA@A@AAA@@@AA@@@FLJ@NN@L@JNFLLDBFBNLBLFHHDFHNJBHBHJBJJBFFFDHHFNNHD@@I@HAAIAAIAHI@@HA@@HHIHHAH@HAHHHHH@AIH@@IHIIAHAIIHA@@H@@H@@@@HHH@@HH@@HHHHH@@HHHH@@@@H@@@@@@@H@@@HHHH@H@@@@AAAA@@AA@AAAA@@AAA@@A@AA@@AA@AAA@@A@AA@@@@@@@@AA@@NDDDBHNBF@NFBNFLL@JHHFBBBLB@LHHHDLN@LHLD@HDNJHDFLL@@A@H@H@@IAA@A@AIAAA@AIHH@@@@AHAA@@@IH@@@@@@H@H@HAII@@@HH@@@H@@@@HHH@HHH@@H@HH@@HHH@@@@H@H@@@HHHH@@H@HH@@@@@@@@@AAA@@AAA@@AA@A@A@AA@A@@@@A@A@A@@@AA@A@@@A@@A@@FLLNJJJDBBH@@DBHJFLH@HNNB@NJDJJBDHHDB@HJDJB@HNL@FN@@IIIAH@HH@I@HH@AAAH@A@I@HI@IA@AH@@IHAI@@@@HH@@HAIAA@@HH@H@@HHHHH@H@HHHHHHH@@@H@@@@H@@HHH@@@@@HHH@H@HH@H@@AAA@@@A@@@A@@AA@AA@@@A@A@@A@@@@A@AA@AA@@@AA@@@A@AA@@NBF@BHBNLBB@BNFFFB@BHBBFFDB@NBJHLNLLB@HFDBHFHDBJFD@@IA@AIHIA@A@HH@A@AHAIA@HH@AI@HII@HHHHIAIIHIIAHA@I@A@@@H@@@HHH@@@@HHH@HHH@@@@H@@@H@H@@@H@@@@H@@HHH@@@@@H@@AA@@AAA@A@A@AAA@AA@AAA@@@AA@@AA@@@AAAA@A@AAAAAA@A@@@FBJ@HJFDHFL@JFLLL@JF@NHHHB@NBHNNLDLBH@B@FHFLFJNHF@@@@IAI@I@AIIIA@AII@@AHAAH@HIIHIAIHHIHIA@A@H@A@HH@IAA@@HH@@@HH@H@@@HHH@HHH@@@HHHH@HH@HHH@@@@@HHH@H@H@@H@H@@AA@@@A@@AAA@AAAAAAA@AAAAAAAAA@@A@A@@AAAA@A@@@@@@@@@@FNNNHNLLBB@NFHBF@BFHDNN@L@NDLNLNJNHNNNNFJLNFJJNN@F@@HIIII@HHHI@I@IA@@HAAIHAA@AI@I@AHA@AIII@H@@IIHH@IIH@@HH@HHH@@HH@@HHHHH@H@@@H@H@@@HH@HH@@H@HH@HHH@HHH@@@@@@A@@@@@A@@A@A@A@A@@@@AAA@A@A@AAAA@@@@A@@AA@AA@@@@A@@@BHNLNFDD@NHFBLHB@@NHHLNHFLDHJJDFHHHLHLL@HLDJDLFDH@@@HAHAIAH@@I@II@@@@@AAIIIAA@@@A@@HHAI@HAA@@IHHAIHII@@H@@@@HH@HH@@@@HHHHHH@HH@H@H@HH@@HH@HHH@H@H@H@@HHH@@@A@AA@@@@A@AA@A@@@@@@@A@AA@A@@A@@AA@AAAA@A@@AA@A@AA@@NDH@LFHDNBLDHDNBDB@DNJLJ@NHHHFJJJB@JJN@LDLJJNFFN@L@@H@AHHHA@@A@@IHAA@I@@@I@HHH@HI@I@IAIH@@IAIAA@HIHIIH@@HHH@@H@@@H@@H@H@@HH@@@@HH@@@@H@HH@@@H@H@@H@@H@HH@H@@A@@AAA@AAAAAAA@@@AAA@@@@@@@@A@A@@@AA@@AA@A@@A@@AA@@@B@BD@DHDLLLBJ@HNLDLF@H@HDJBLNNNH@@@DHNLNLBLHBBH@NN@@IIIHIH@I@AIHHA@@@I@IH@@A@@HIHAIHIIIIA@IA@AIHHHAHHA@@@H@H@HH@@H@@@HHH@@@@@HH@H@@H@@H@HHH@HH@H@@H@H@@H@@@@@A@AAA@AAAAAAA@AA@A@@@@A@A@@A@@@AA@@A@@@A@@@@@@@AA@@JNLFDNB@BD@FJNDJ@LJHNNLJHBFNHHLFDJLDJN@L@LBJNH@D@N@@A@AA@@@H@AIIHAIAIAAAIIHAAHH@A@AH@@AAHI@@A@@@HHIAAH@@HHHH@HHHH@H@HHH@@@H@HHHH@H@@HH@HH@HHH@@H@H@@HHH@H@@@A@AA@@AA@@A@AA@AAA@@@@AAAAA@@@AAA@@@@AA@@@AA@A@@A@@@LJDFLHBJBNL@L@DF@JJDNNNDFJFDJHN@NFD@DHN@FDJNNBJ@JN@@IAHAHAHAIIHH@AH@HA@HIIIHH@HAH@IHHIAI@IIHI@AA@II@@A@@@H@@@HHHHHHHHHHHH@@@HH@H@H@HH@@HH@HHH@@@@HH@H@@@HH@@@A@A@@@@A@AAAAA@@@@@@AAA@A@@@@@@@A@AAAAAA@@A@@A@@A@@H@HDNNL@DBBLBNJJ@LJH@HHDFFF@BFBHLLDJJ@BBL@DJ@JHDB@@@HAAI@HH@IH@I@IIH@HHHHAIIIIHIH@I@AAH@H@IHAI@@@IIIAI@@HH@@@H@H@@H@H@@@H@@@@H@H@H@@@H@@@H@@H@H@@H@H@@HHHH@@@A@@@@A@@@@@A@@AA@A@@A@@A@AA@@@AAAA@A@@A@@@@@A@@AA@@D@JLBNNHDFFLNJBJBBH@@NBBBH@LLJBBDHJ@HLBDNNBF@FFNNH@@@@@@HIIAHHAI@@HIA@@HHA@@@II@H@I@IAII@HIIHH@AHH@AI@@@HHH@@@@HH@@H@H@@@@@HHHHHH@HH@@HH@@H@@H@HHH@HHH@H@H@@@@A@@@A@@@@@@AAA@@@A@AA@@AAA@@A@@@@A@A@AA@@@@@AAA@@@JFJFD@JJHHJ@H@@@FDLNJ@HJBBFLJ@FBLFFF@NJLFFNNHDJ@DH@@AHH@@HH@AIII@IAI@@HH@A@HI@HII@@AIIAAHA@AI@AHIHHAH@@@H@H@@@H@H@HHH@@HH@@HH@HHHH@@@H@H@H@HH@HH@@HH@@@H@@@@@AA@AAA@A@@A@A@A@A@A@A@A@AA@A@AA@@AA@A@@@@A@@@@AAA@@HFHHHJLLLLB@@N@BDLJJNFLLDF@DJLHNN@H@NNNJ@FH@F@BNND@@HIHA@AAH@@H@AIH@HII@IA@A@@AIAIIHAAHHHH@AAIH@IH@IA@@@HHHHH@@@@HHH@@HHHH@@@@HH@H@@HHHHHHHHHHHHH@H@HHHH@H@@A@A@@@AAA@A@@@@@AA@@@A@A@AA@@@@@A@@AAAA@@@@AAAA@A@@@JHBFJF@FD@DB@@FLL@DNNJ@JHLFLNFNF@FLHBJBLHHDLFJNJBD@@AHH@@HAA@A@@IHAHH@HI@@HAAHIAAAIAHHAAHAAIIHIHIAAI@I@@H@HH@@H@@@H@@HH@@H@@@H@H@@HHH@H@HH@@@H@H@@HHHHH@H@@@AA@A@A@AAAAA@@A@A@A@A@A@AAAA@@@A@A@A@@AA@@AA@A@AA@@@NFJHNJNFHNDNHDH@LJHBFF@JDBBLHDBLJHL@LBB@JBJJ@BHHHF@@@I@@@IA@@@A@A@HIII@HII@HIA@I@H@HHIIHHHIA@H@HAIAHAH@@@@@H@HH@@HHH@HH@@@H@H@@@HHH@@H@@@HH@H@@HH@H@@HHHH@@@@A@A@@@A@@@AA@AAAAA@@@AA@@@A@A@A@A@@AA@@AA@AAA@A@A@@DBFBDLB@JLLHNNJH@BDDDLDLFHFD@NB@NJFBN@HDDL@HHHFLNB@@A@HAAHIIH@AA@AAIA@HAHHAAHH@AI@A@II@IIHA@@I@AH@IHHH@@@H@@H@HHHHH@@@@HH@@HH@@@HHHHH@@@HHH@@@@@@HH@H@H@HH@@@A@@A@A@@@@@A@A@@AAAA@@@A@@@@AA@@@A@AA@@AAAAAA@@@A@@FDBBJHFHDD@B@NNLN@FLJHNLJHFLFFDDNLLJ@DJF@NDLJFJBHH@@I@@IAAAII@I@IA@@@HI@I@AHAHIHHII@@AIIAHA@AAHI@AHIII@@@H@@H@HHH@@H@HH@H@H@@@@@H@HHH@@@H@@HH@@HH@HHHHHHH@@@@A@AAAAAAA@@AA@A@AAA@@@@AA@@A@@A@@@@@AAAA@@@@A@A@A@@F@NLFLJFNB@D@FBB@DLNJJNHN@HBBBF@B@J@HFFLDNJL@LLDNF@@AH@H@AI@HIIAH@H@IHAII@IHAAAAIIAHHHAAA@AIAH@A@HIHA@@@@H@@@@H@@H@@@@H@H@@@H@H@@HH@@@@@@HHH@@H@@@H@@HH@H@@@@A@A@@A@@A@@@@@A@AAAA@AA@A@@@AA@AA@@A@@A@AA@AAAAAA@@FBJ@FFLN@JH@FHFDJHJF@HDHNLNDJLFLHJNBLNN@HJD@FHBFFB@@HAHH@@IHA@@A@AHIHIA@HA@HIIIA@H@@HIIAA@AHA@@II@AHAI@@HH@H@@HHH@@H@@@@H@@HHH@@HHH@H@@@H@@HHH@@H@@@@@HHHH@@@AA@AA@A@@@@A@@@@A@A@A@@@@A@AA@@A@A@@AAA@A@AA@A@@A@@LBJ@@@@H@NDHNFD@FBDNDBFBJJBF@DJFJHHL@FBLNBBJLFNJL@@@IHIIHHHI@@IH@I@@A@IHAIIH@HHHAA@AI@@AAHHAHAAIAH@AII@@@@@H@@@@@@HHH@@@@@@@HH@@H@@@@H@@HHHH@HH@H@HH@HH@H@@@A@A@AAA@@AAAA@@@AA@A@A@@@@@A@AAA@@@AAA@@A@AAA@AAA@@@@NHFJB@LDFNBBJFHDNL@HFBB@NFDFD@@@HNHBNDLLNJHLFF@@J@@@IAHHHAIIAH@H@@AHI@H@IAI@@AIHIHHHI@H@HA@@IHHAAHHA@@@@HH@@@@@@@H@HH@H@HH@H@@@@H@@@@@@@@H@H@@@H@H@@H@H@H@@@@@A@AAA@@@@@A@@@@AAA@@AAA@@@AAAA@@A@AAAA@AA@@A@A@@@BDFBFLLN@@BNNLFBJJ@HFF@@F@DJFJH@F@LDHF@HDL@FFJJHDH@@A@HI@HI@IIIH@AHA@AHI@IIHHAA@AI@A@H@AIA@@I@I@IIAIAI@@HH@@HHHH@@@@@@@@@@@@@H@@HHH@@HH@@HH@H@@@HHHH@H@H@@@@A@A@AAAAAAA@@A@@A@@A@@@A@@AAA@@@AA@A@@@AA@AAA@@@@@@@NB@NBJHHBD@LBHFHHBDDBFDBNND@@@B@FH@NL@FB@FN@DFNDJD@@HA@H@@@I@@IIIAI@A@I@IHIIHHH@HHHIIAA@AHAAI@AAIAIAH@@@H@@H@@HH@H@HH@@HH@HH@@H@@@@@@@H@@H@@@@@HH@@@H@HHH@@@@AA@@@@@AA@@@A@AAA@@@AA@AA@@@A@AAA@@@@@A@AA@@AAAA@@@H@NHHNFNNLFHBJJJ@FN@DFB@DHDNL@HJLBDLFFLLB@FHBBNBJJ@@H@H@AAA@IIH@AI@IIAAIH@IAH@HA@AIIAAAIAAIIHHIAAAAIHA@@@@@@@@H@@HH@@H@H@H@@HH@HHH@H@@HHHHH@@H@@@@@H@H@HH@@@A@A@@AAAA@AAA@AAA@@@@@@@@AA@@AAA@A@@@@@A@A@@@A@AA@@@N@JBLBNNN@@BFLJHJJB@H@LDNH@FFDFJ@J@HHFHNHDFBFFFD@D@@H@AHI@HHIAAIAAHH@IIH@@AAH@HIAHAH@IA@@AAAAIIHHHI@II@@@HHH@@@@@@H@@H@@H@@H@H@@HH@@H@HHHH@H@HHHHH@H@HH@@@@@AAAAAA@@@A@A@@AAA@@AA@@AA@@@@@@@@@A@@@@@@@A@@AAAAA@@JNJNHBFFHNDDN@HJDNDBFLNHDFFNHDLLBDFFN@HNLBBJJHD@BF@@@HH@AAH@AIHAII@AHA@H@@HHHHHHA@@HIHA@IIIII@@HI@H@AH@@@HHH@@@HH@H@@H@@H@HH@@@@HH@H@@@@@@@HHH@@HHH@@@H@HH@@@AAAA@@A@@AAA@A@@AA@@@A@@A@A@A@A@@A@AA@@A@@A@@@AA@@@NJBNLFHDBJF@@DDJJHJLHDDJBND@HDLHNBJNLDJDDJDN@NHLHD@@@AHA@HA@IIIA@AH@IHI@IH@I@@AH@IAII@@AAHIAAH@@HIHHIH@@HH@@H@H@HHH@H@@@H@@HHH@@HHH@H@@HHHH@H@H@@H@HHH@HHH@@AAAA@@@@@@@@AAA@A@@AA@A@A@@A@AA@A@A@A@@@@A@A@@@AAA@@NDBJN@NJNBFJ@@NJJDFD@JJL@JLBB@@FD@LHJJLLBNDBNJFNBJ@@@HH@H@IHA@I@HAAA@AAAH@IIAIHHHH@AII@HAAIAH@IAIIIH@A@@H@H@H@@HHH@HH@HHH@@HH@@@@@H@H@H@@H@H@@H@HH@HH@H@@H@@A@@@@AAAA@@AAA@@AA@AAAA@@A@A@@AA@A@@A@AAA@A@@@@@@A@@BDDLNBJJFL@JHHLNN@NHN@LB@@BBJLNHFDLFFFLFHLD@DJJN@J@@@AHI@IHH@IAI@AIAHIIH@@AA@@@@HI@@HHIA@IHAHHAA@@IAAH@@@@@HH@@@HHH@@H@HHH@HHHH@H@@H@@@@@@@H@@@@@H@@H@@@H@@@A@@@@AA@@AAAAAAAAA@AA@@@@@@@AA@@A@AA@@A@AAAAAA@@A@@@FDHHJBFJ@BJHFLBJLNJBLDLLFHDFFJLNBH@DH@@HLDDJNNNDFB@@HIAAAAIIIII@IAH@A@@@@AAHA@AH@@IHHA@IHHAHAIH@@IHIIH@@@@H@@@HHH@@@@HH@@@@@@H@@HH@HH@@@@@HH@@H@@HH@H@H@@H@@@@@@A@@AAA@@@A@AA@AA@@@@@@AA@@@AAAAAA@AAA@@AAA@@A@@@FNHJBJBLDFBHL@JDFFNB@LHHFF@DBLLHNBF@BBL@DL@BFJJBBJ@@HHA@@@AIA@IAH@IIH@HI@IAA@IIHH@AA@IA@I@IIHAAAAAIH@H@@@H@@H@@@HH@@@@@@@H@H@@@HH@H@HHH@@@@@H@@@HHHH@HHHH@@@@A@@AAAAAA@AAA@@@AA@@A@@AAA@@@@@AAA@AA@AA@AAA@AA@A@@D@JFHHLFLJHH@BFLNHNFDD@@LFBJLFBLLLBBL@JNNLD@JHF@@L@@IIA@@AAHHIAHIAA@HI@@AHAA@@IAH@A@HH@HI@HAIAIA@IIAIH@@) (il:rpaqq il:defaultscreenshade 8840) (il:rpaqq il:grayshade 43605) (il:rpaqq il:grayshade1 1) (il:rpaqq il:grayshade2 1025) (il:rpaqq il:grayshade3 64510) (il:rpaqq il:grayshade4 65534) (il:rpaqq il:plainshade 23130) (il:rpaqq il:wave-texture 26880) (il:rpaqq il:wave2-texture 27010) (il:rpaqq il:mesh-texture 51219) (il:rpaqq il:di-texture 33810) (il:rpaqq il:dark-di-texture 31725) ) (il:putprops il:bitmap-gallery il:copyright ("Gregg Foster" 1987 1988 1989)) (il:declare\: il:dontcopy (il:filemap (nil (2641 3837 (il:rbg 2654 . 3358) (il:fabricize 3360 . 3835))))) il:stop \ No newline at end of file diff --git a/lispusers/BITMAP-GALLERY.TEDIT b/lispusers/BITMAP-GALLERY.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..aa14181ed8b085855ade87b6c3dc10f51792e103 GIT binary patch literal 84639 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%0A}t>=@@48N3T5ma^;1%1C7SrLi#0g^O_!Sg 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%0AuF>8?Mfv*o|PgHtp9}V4NJ( zx1KB4hJl}2H-H>l4|3BvcCbKEHp~E9xp9p#dgC87=F|@Tgdx8MjlFF{;%#ND&&tqe zHe+Q2lxqr6v??27x|Jbp-Eepu!cLWqIkLe};)Xsuh1vQs_M3x>w}R65c_a8Wj8}&* z!nL6Sj9$->Qz4Na9M15CI9;a$_M=FKuJM`3z3zOsnW3SrmlNv^4HjPPlZ4iZ0Wj0E UQz5QD;k>@8LrU+LLQh}*Pwg#3E&u=k literal 0 HcmV?d00001 diff --git a/lispusers/BITMAPFNS b/lispusers/BITMAPFNS new file mode 100644 index 00000000..2a759b90 --- /dev/null +++ b/lispusers/BITMAPFNS @@ -0,0 +1 @@ +(FILECREATED " 3-Jun-86 14:13:59" {ERIS}LIBRARY>BITMAPFNS.;6 6278 changes to: (MACROS RPCHK) (FNS READPRESS) previous date: " 2-Jun-86 22:35:15" {ERIS}LIBRARY>BITMAPFNS.;5) (* Copyright (c) 1983, 1984, 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT BITMAPFNSCOMS) (RPAQQ BITMAPFNSCOMS ((FNS READBINARYBITMAP WRITEBINARYBITMAP WRITEBM WRITEBMLST READBMLST READBM READPRESS WINDOWBM) (DECLARE: DONTCOPY (MACROS RPCHK)))) (DEFINEQ (READBINARYBITMAP [LAMBDA (WIDTH HEIGHT FILE) (* lmm " 4-JAN-83 00:19") (* reads a bitmap from the output file.) (PROG ((BM (BITMAPCREATE WIDTH HEIGHT))) (\BINS (GETSTREAM FILE (QUOTE INPUT)) (fetch BITMAPBASE of BM) 0 (ITIMES (fetch BITMAPRASTERWIDTH of BM) (fetch BITMAPHEIGHT of BM) 2)) (RETURN BM]) (WRITEBINARYBITMAP [LAMBDA (BITMAP FILE) (* JWogulis "26-Dec-84 15:06") (\BOUTS FILE [ffetch BITMAPBASE of (SETQ BITMAP (\DTEST BITMAP (QUOTE BITMAP] 0 (ITIMES (ffetch BITMAPHEIGHT of BITMAP) (ffetch BITMAPRASTERWIDTH of BITMAP) BYTESPERWORD]) (WRITEBM [LAMBDA (FILE BITMAP) (* lmm " 6-Jun-85 16:46") [BOUT16 FILE (ffetch BITMAPWIDTH of (SETQ BITMAP (\DTEST BITMAP (QUOTE BITMAP] (BOUT16 FILE (ffetch BITMAPHEIGHT of BITMAP)) (WRITEBINARYBITMAP BITMAP FILE]) (WRITEBMLST [LAMBDA (FILE LST) (* JWogulis "26-Dec-84 15:06") (PROG [(F (OPENSTREAM FILE (QUOTE OUTPUT) (QUOTE NEW] (for I in LST do (WRITEBM F I)) (CLOSEF F]) (READBMLST [LAMBDA (FILE) (* JWogulis "26-Dec-84 15:08") (bind (F _(OPENSTREAM FILE (QUOTE INPUT) (QUOTE OLD))) until (EOFP F) collect (READBM F) finally (CLOSEF F]) (READBM [LAMBDA (FILE) (* lmm " 6-Jun-85 16:46") (READBINARYBITMAP (BIN16 FILE) (BIN16 FILE) FILE]) (READPRESS [LAMBDA (FILENAME) (* lmm " 2-Jun-86 22:34") (RESETLST (PROG (WW HT MICAWIDTH MICAHEIGHT BITMAP TOTCOUNT (OFD (GETSTREAM (OPENFILE FILENAME (QUOTE INPUT) (QUOTE OLD)) (QUOTE INPUT))) X WIDTH) (RESETSAVE NIL (LIST (QUOTE CLOSEF) OFD)) (RPCHK 256) (* Edotcode) (SETQ WW (IQUOTIENT (BIN16 OFD) 16)) (* Width) (SETQ HT (BIN16 OFD)) (* Height) (until (SELECTC (SETQ X (BIN16 OFD)) ((IPLUS 512 3) (* Edotmode and 3) (RPCHK 2) (* Edotsize) (SETQ MICAWIDTH (BIN16 OFD)) (SETQ MICAHEIGHT (BIN16 OFD)) NIL) (1 (* Edotwindow) (BIN16 OFD) (SETQ WIDTH (BIN16 OFD)) (RPCHK 0) (RPCHK HT) NIL) (3 T) (GO ERROR))) [\BINS OFD (fetch BITMAPBASE of (SETQ BITMAP (BITMAPCREATE (ITIMES WW 16) HT))) 0 (ITIMES 2 (SETQ TOTCOUNT (ITIMES HT WW] (RPCHK 0) (* Entity list terminator) [COND (NIL (* more checks, not necessary) (PROGN (RPCHK (IPLUS 65280 238)) (* Nop, setx) (RPCHK 0) (RPCHK (IPLUS 65280 239)) (* Nop, sety) (RPCHK 0) (RPCHK (IPLUS 65280 252)) (* Nop, show dots) (RPCHK 0] (RETURN BITMAP) ERROR (ERROR "Sorry, unrecognized PRESS file format. READPRESS isn't very general."]) (WINDOWBM [LAMBDA (BITMAP POSITION) (* JWogulis "26-Dec-84 15:37") (IF (AND POSITION (NOT (POSITIONP POSITION))) THEN (ERROR "NOT A POSITION" POSITION)) [IF (NOT POSITION) THEN (SETQ POSITION (GETBOXPOSITION (IPLUS 8 (BITMAPWIDTH BITMAP)) (IPLUS 8 (BITMAPHEIGHT BITMAP] (PROG ((WIND (CREATEW (LIST (CAR POSITION) (CDR POSITION) (IPLUS 8 (BITMAPWIDTH BITMAP)) (IPLUS 8 (BITMAPHEIGHT BITMAP))) NIL 4))) (BITBLT BITMAP 0 0 WIND) (RETURN WIND]) ) (DECLARE: DONTCOPY (DECLARE: EVAL@COMPILE [PUTPROPS RPCHK MACRO ((N) (OR (EQ (BIN16 OFD) N) (GO ERROR] ) ) (PUTPROPS BITMAPFNS COPYRIGHT ("Xerox Corporation" 1983 1984 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (564 5993 (READBINARYBITMAP 574 . 1075) (WRITEBINARYBITMAP 1077 . 1437) (WRITEBM 1439 . 1752) (WRITEBMLST 1754 . 2028) (READBMLST 2030 . 2305) (READBM 2307 . 2492) (READPRESS 2494 . 5342) ( WINDOWBM 5344 . 5991))))) STOP \ No newline at end of file diff --git a/lispusers/BITMAPFNS.TEDIT b/lispusers/BITMAPFNS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..386d1dc646468cc8c3e54b35765685618aaff90f GIT binary patch literal 4240 zcmeHJ+iu%N5TzVDsq3of6)4aa7^FZ;0ghlRitO~Mv_x5pP^3yyaonH}v_xAAP^3Uo zbsV5SkYDJB6zF?_d{$?6xm0AyPM%s62w_XRvvWCfW@f1{{`0rLlWhBl`F&&1wY_Si zT5VRV`_<|~gc}qcUHu4P1!;N({UGCU9;TqHRefOm^ejx17xlK&uT`u5gl8~LM)PSH z=MV*14&j*R;TVz_nh&Ny`rz=Os=KDqIbycqp2}!&!a9BrdL}#W`OsySS=)ZzoyVh` zC-JYL&4;p{5M#d(@cg*F877)Gc@(xC8`^C|8MpJzOWX)uFJo=;$u zU>0$n)xl2k5b{ZYFoV$qvQZF6JPs*DJ_$itVNz)_kH?tDdW_4W!!6M?b5VHAf7IDl+5OT@KNDGlT3Hik&FERIJY>9TMCI!$U53H^L zdCpVxKTE?AmOZ{$?;Ui^<&4KcdR0Rp$h)WjRtV`Qa3Vp}5!gfueMBS|BF+*L*&QN< z-2(rv$OS7HLol1A$t>mA8j$gqWla|;TApkmlF*h?gqLye&q zi6Cv`W&PlF3Fff6dFc*3KInh6I+d4>e9u4B_zdz?*;o;$k5unBa1U>uuZ zGYfDvFkO%RVuBUsbmes&i#g2hI-nb_am3ni|33cJ!1E2)XZA7Keg}<6ynqrmLQQv$rd2VJAjtW)Sa9n-bJd1|^AvkM2l%bu9dP?`^I)F{u) zX9L6bumpIu91ktS15*zmJfVJJ$7 zDvw*xeAI&0-kx+{L(6qFCjB~CrjNxymG|{qS3gnD_eH}Y{2vY7e^<0xP28}s#HSCvEU?mOwC z5<=M#x(NQ3NBJd{&5hf2d!&SZ#d9si9lE57%TL>RPOb$(Y8 z6-iW^^gdT7G*jzCij$>~l+AL0SV>fX50pS~M3Gif5gCwQp-U>n!Lr}yN}~Lhxs}LISP>BLACKBOX.;7 17547 changes to: (FNS InitializeGuessArray BlackBoxChoices InitializeBallArray NewGame AskQuestion BlackBoxWindowFn OnEdge ProbeBallArray FillBox DrawBlackBox RedisplayBox) (VARS BLACKBOXCOMS HintTime) previous date: " 3-Jan-86 19:12:57" {PHYLUM}LISP>BLACKBOX.;5) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT BLACKBOXCOMS) (RPAQQ BLACKBOXCOMS ((VARS BlackBoxSquare HintTime) (FNS AskQuestion BlackBox BlackBoxChoices BlackBoxTitle FillBox InitializeBallArray InitializeGuessArray LeftAhead LeftTurn MakeBlackBoxWindow MoveAhead MoveBall DrawBlackBox BallAhead BallDownOrUp BBBoxNumber BlackBoxWindowFn MakeBallArray NewGame OnEdge ProbeBallArray RedisplayBox RightAhead RightTurn SetSquareArray ShowBalls SquareArray))) (RPAQQ BlackBoxSquare 40) (RPAQQ HintTime 5000) (DEFINEQ (AskQuestion [LAMBDA (window xBox yBox) (* edited: "10-Jan-86 07:15") (LET* ((boxSize (WINDOWPROP window (QUOTE BoxSize))) (guessArray (WINDOWPROP window (QUOTE GuessArray))) (answer (ProbeBallArray (WINDOWPROP window (QUOTE BallArray)) xBox yBox boxSize))) (AND answer (SetSquareArray guessArray xBox boxSize yBox (if (LISTP answer) then (* use a number) (LET [(g (WINDOWPROP window (QUOTE LastGuessNumber) (PLUS (WINDOWPROP window (QUOTE LastGuessNumber)) 1] (SetSquareArray guessArray (CAR answer) (CDR answer) boxSize g) g) else answer))) answer]) (BlackBox [LAMBDA (numRows numBalls) (* edited: " 3-Jan-86 16:19") (* * This is a game in which one guesses where balls are hidden) (if (NOT (NUMBERP numRows)) then (SETQ numRows 8)) (if (NOT (NUMBERP numBalls)) then (SETQ numBalls 4)) (if (GREATERP numRows 16) then (PRINTOUT T "Too big. Using " numRows " rows.") (SETQ numRows 16)) (if (GREATERP numBalls numRows) then (PRINTOUT T "You chose too many balls. I will use " numRows T) (SETQ numBalls numRows)) (LET* ((boxSize (PLUS 2 numRows)) (boxWidth (TIMES BlackBoxSquare boxSize)) (boxWindow (MakeBlackBoxWindow boxSize boxWidth numBalls))) (MOVEW boxWindow 0 0]) (BlackBoxChoices [LAMBDA (window) (* edited: "10-Jan-86 08:25") (LET [(ballArray (WINDOWPROP window (QUOTE BallArray))) (guessArray (WINDOWPROP window (QUOTE GuessArray] (SELECTQ [MENU (create MENU ITEMS _(QUOTE (ShowCorrect ShowAll NewGame ("New Game Using Balls Shown" (QUOTE NewGameFrom) "Use the balls shown to initialize game") ChangeNumberOfBalls ChangeNumberOfRows] (ShowAll (ShowBalls window ballArray guessArray T) (DISMISS HintTime) (REDISPLAYW window)) (ShowCorrect (ShowBalls window ballArray guessArray NIL) (DISMISS HintTime) (REDISPLAYW window)) (NewGame (NewGame window)) (NewGameFrom (NewGame window NIL (BallsDisplayed window))) (ChangeNumberOfBalls (LET ((numRows (DIFFERENCE (WINDOWPROP window (QUOTE BoxSize)) 2)) (numBalls (RNUMBER "How many hidden balls"))) (WINDOWPROP window (QUOTE NumBalls) (COND ((GREATERP 1 numBalls) (PRINTOUT T .FONT (HELVETICA 18) "You need to hide some balls." T) (WINDOWPROP window (QUOTE NumBalls))) ((GREATERP numBalls numRows) (PRINTOUT T .FONT (HELVETICA 18) "You are asking for too many balls. Using " numRows T) numRows) (T numBalls))) (WINDOWPROP window (QUOTE TITLE) (CONCAT "Black Box with " numBalls " balls"))) (NewGame window)) [ChangeNumberOfRows (LET ((numRows (RNUMBER "How many rows?"))) (CLOSEF window) (BlackBox numRows (WINDOWPROP window (QUOTE NumBalls] NIL]) (BlackBoxTitle [LAMBDA (numBalls) (* edited: "30-Dec-85 17:51") (CONCAT "Black Box with " numBalls " balls -- Click Here For Help"]) (FillBox [LAMBDA (window x y symbol) (* edited: "10-Jan-86 07:59") (LET ((xPos (TIMES x BlackBoxSquare)) (yPos (TIMES y BlackBoxSquare))) (SELECTQ symbol (Black (DSPFILL (CREATEREGION xPos yPos BlackBoxSquare BlackBoxSquare) BLACKSHADE NIL window)) (Ball (FILLCIRCLE (PLUS xPos (TIMES .5 BlackBoxSquare)) (PLUS yPos (TIMES .5 BlackBoxSquare)) (TIMES .45 BlackBoxSquare) BLACKSHADE window)) (NIL (DSPFILL (CREATEREGION (PLUS xPos 2) (PLUS yPos 2) (DIFFERENCE BlackBoxSquare 2) (DIFFERENCE BlackBoxSquare 2)) WHITESHADE (QUOTE REPLACE) window)) (PROGN (MOVETO (PLUS xPos (TIMES .25 BlackBoxSquare)) (PLUS yPos (TIMES .25 BlackBoxSquare)) window) (PRIN1 symbol window]) (InitializeBallArray [LAMBDA (array numBalls boxSize ballPositions) (* edited: "10-Jan-86 08:27") (for I from 0 to (SUB1 (ARRAYSIZE array)) do (SETA array I NIL)) (for position in ballPositions do (SetSquareArray array (CAR position) (CDR position) boxSize (QUOTE Ball))) (for i from (LENGTH ballPositions) to (SUB1 numBalls) do (PROG (randX randY) doAgain (SETQ randX (RAND 1 (DIFFERENCE boxSize 2))) (SETQ randY (RAND 1 (DIFFERENCE boxSize 2))) (if (SquareArray array randX randY boxSize) then (GO doAgain) else (SetSquareArray array randX randY boxSize (QUOTE Ball]) (InitializeGuessArray [LAMBDA (guessArray boxSize) (* edited: "10-Jan-86 08:06") (LET ((maxIndex (SUB1 boxSize))) (for i from 0 to maxIndex do (for j from 0 to maxIndex do (SetSquareArray guessArray i j boxSize (if [OR (AND (EQ i 0) (OR (EQ j 0) (EQ j maxIndex))) (AND (EQ i maxIndex) (OR (EQ j 0) (EQ j maxIndex] then (QUOTE Black]) (LeftAhead [LAMBDA (array x y boxSize direction) (* edited: "29-Dec-85 18:17") (EQ (QUOTE Ball) (SquareArray array (SELECTQ direction ((L U) (SUB1 x)) ((D R) (ADD1 x)) x) (SELECTQ direction ((L D) (SUB1 y)) ((R U) (ADD1 y)) y) boxSize]) (LeftTurn [LAMBDA (direction) (* edited: "29-Dec-85 18:08") (SELECTQ direction (U (QUOTE L)) (R (QUOTE U)) (D (QUOTE R)) (L (QUOTE D)) (ERROR "Bad Direction" direction]) (MakeBlackBoxWindow [LAMBDA (boxSize boxWidth numBalls) (* edited: " 3-Jan-86 18:51") (* * Draw the window, and install a buttonFunction that will make the right moves for the game) (LET ((window (CREATEW (CREATEREGION 0 0 (WIDTHIFWINDOW boxWidth 4) (HEIGHTIFWINDOW boxWidth T 4)) (BlackBoxTitle numBalls) 4))) (DSPFONT (FONTCREATE (QUOTE (HELVETICA 18 BOLD))) window) (WINDOWPROP window (QUOTE BoxWidth) boxWidth) (WINDOWPROP window (QUOTE BoxSize) boxSize) (WINDOWPROP window (QUOTE NumBalls) numBalls) (WINDOWPROP window (QUOTE REPAINTFN) (QUOTE DrawBlackBox)) (WINDOWPROP window (QUOTE BUTTONEVENTFN) (QUOTE BlackBoxWindowFn)) (NewGame window boxSize) window]) (MoveAhead [LAMBDA (array x y boxSize direction) (* edited: "29-Dec-85 18:03") (MoveBall array (SELECTQ direction (L (SUB1 x)) (R (ADD1 x)) x) (SELECTQ direction (D (SUB1 y)) (U (ADD1 y)) y) boxSize direction]) (MoveBall [LAMBDA (array xPos yPos boxSize direction) (* edited: "29-Dec-85 18:22") (LET ((edge (OnEdge xPos yPos boxSize))) (if edge then (* Coming Out) (CONS xPos yPos) elseif (BallAhead array xPos yPos boxSize direction) then (QUOTE H) elseif (LeftAhead array xPos yPos boxSize direction) then (if (RightAhead array xPos yPos boxSize direction) then (QUOTE R) else (MoveAhead array xPos yPos boxSize (RightTurn direction))) elseif (RightAhead array xPos yPos boxSize direction) then (MoveAhead array xPos yPos boxSize (LeftTurn direction)) else (MoveAhead array xPos yPos boxSize direction]) (DrawBlackBox [LAMBDA (window) (* edited: "10-Jan-86 07:40") (LET* [(boxSize (WINDOWPROP window (QUOTE BoxSize))) (boxWidth (WINDOWPROP window (QUOTE BoxWidth))) (lastLinePos (DIFFERENCE boxWidth BlackBoxSquare)) (guessArray (WINDOWPROP window (QUOTE GuessArray] (for bottom from BlackBoxSquare by BlackBoxSquare to boxWidth do (DRAWLINE 0 bottom boxWidth bottom (if (OR (EQ bottom BlackBoxSquare) (EQ bottom lastLinePos)) then 4 else 2) NIL window) (DRAWLINE bottom 0 bottom boxWidth (if (OR (EQ bottom BlackBoxSquare) (EQ bottom lastLinePos)) then 4 else 2) NIL window)) (for xPos from 0 to (SUB1 boxSize) do (for yPos from 0 to (SUB1 boxSize) do (FillBox window xPos yPos (SquareArray guessArray xPos yPos boxSize]) (BallAhead [LAMBDA (array x y boxSize direction) (* edited: "29-Dec-85 17:29") (EQ (QUOTE Ball) (SquareArray array (SELECTQ direction (L (SUB1 x)) (R (ADD1 x)) x) (SELECTQ direction (D (SUB1 y)) (U (ADD1 y)) y) boxSize]) (BallDownOrUp [LAMBDA (window xBox yBox) (* edited: "29-Dec-85 14:33") (LET* [(array (WINDOWPROP window (QUOTE GuessArray))) (boxSize (WINDOWPROP window (QUOTE BoxSize] (SetSquareArray array xBox yBox boxSize (if (SquareArray array xBox yBox boxSize) then NIL else (QUOTE Ball]) (BBBoxNumber [LAMBDA (window place) (* dgb: "25-Dec-85 16:54") (IQUOTIENT place BlackBoxSquare]) (BlackBoxWindowFn [LAMBDA (window) (* edited: "10-Jan-86 07:49") (LET [(buttons (DECODEBUTTONS)) (xBox (BBBoxNumber window (LASTMOUSEX window))) (yBox (BBBoxNumber window (LASTMOUSEY window))) (lastRow (SUB1 (WINDOWPROP window (QUOTE BoxSize] (if (EQ yBox (WINDOWPROP window (QUOTE BoxSize))) then (AND buttons (BlackBoxChoices window)) elseif buttons elseif (OR (EQ xBox 0) (EQ yBox 0) (EQ xBox lastRow) (EQ yBox lastRow)) then [LET ((answer (AskQuestion window xBox yBox))) (RedisplayBox window xBox yBox) (AND (LISTP answer) (RedisplayBox window (CAR answer) (CDR answer] else (BallDownOrUp window xBox yBox) (RedisplayBox window xBox yBox]) (MakeBallArray [LAMBDA (numBalls) (* edited: "29-Dec-85 14:15") (ARRAY (TIMES numBalls numBalls) NIL NIL 0]) (NewGame [LAMBDA (window boxSize ballPositions) (* edited: "10-Jan-86 08:27") [OR boxSize (SETQ boxSize (WINDOWPROP window (QUOTE BoxSize] (LET [(ballArray (OR (WINDOWPROP window (QUOTE BallArray)) (LET ((V (MakeBallArray boxSize))) (WINDOWPROP window (QUOTE BallArray) V) V))) (guessArray (OR (WINDOWPROP window (QUOTE GuessArray)) (LET ((V (MakeBallArray boxSize))) (WINDOWPROP window (QUOTE GuessArray) V) V] (InitializeGuessArray guessArray boxSize ballPositions) (InitializeBallArray ballArray (WINDOWPROP window (QUOTE NumBalls)) boxSize ballPositions) (WINDOWPROP window (QUOTE LastGuessNumber) 1) (REDISPLAYW window]) (OnEdge [LAMBDA (x y boxSize) (* edited: "10-Jan-86 06:01") (if (EQ y 0) then (QUOTE U) elseif (EQ x 0) then (QUOTE R) elseif (EQ y (SUB1 boxSize)) then (QUOTE D) elseif (EQ x (SUB1 boxSize)) then (QUOTE L) else NIL]) (ProbeBallArray [LAMBDA (array xPos yPos boxSize) (* edited: "10-Jan-86 07:06") (* * Returns NIL if at corner, H, R, or for a detour a dotted pair of final postion for x and y) (LET* [(lastIndex (SUB1 boxSize)) [atCorner (OR (AND (EQ xBox 0) (OR (EQ yBox 0) (EQ yBox lastIndex))) (AND (EQ xBox lastIndex) (OR (EQ yBox 0) (EQ yBox lastIndex] (direction (AND (NOT atCorner) (OnEdge xPos yPos boxSize] (AND direction (if (BallAhead array xPos yPos boxSize direction) then (QUOTE H) elseif (OR (LeftAhead array xPos yPos boxSize direction) (RightAhead array xPos yPos boxSize direction)) then (QUOTE R) else (MoveAhead array xPos yPos boxSize direction]) (RedisplayBox [LAMBDA (window xBox yBox) (* edited: "10-Jan-86 07:48") (FillBox window xBox yBox (SquareArray (WINDOWPROP window (QUOTE GuessArray)) xBox yBox (WINDOWPROP window (QUOTE BoxSize]) (RightAhead [LAMBDA (array x y boxSize direction) (* edited: "29-Dec-85 17:35") (EQ (QUOTE Ball) (SquareArray array (SELECTQ direction ((D L) (SUB1 x)) ((U R) (ADD1 x)) x) (SELECTQ direction ((R D) (SUB1 y)) ((L U) (ADD1 y)) y) boxSize]) (RightTurn [LAMBDA (direction) (* edited: "29-Dec-85 18:07") (SELECTQ direction (U (QUOTE R)) (R (QUOTE D)) (D (QUOTE L)) (L (QUOTE U)) (ERROR "Bad Direction" direction]) (SetSquareArray [LAMBDA (array x y rowSize newValue) (* edited: "29-Dec-85 13:27") (SETA array (PLUS x (TIMES rowSize y)) newValue]) (ShowBalls [LAMBDA (window ballArray gameArray showAll) (* edited: "29-Dec-85 17:00") (LET [(boxSize (WINDOWPROP window (QUOTE BoxSize] (for xPos from 0 to (SUB1 boxSize) do (for yPos from 0 to (SUB1 boxSize) do (if (AND (EQ (QUOTE Ball) (SquareArray ballArray xPos yPos boxSize)) (OR showAll (SquareArray gameArray xPos yPos boxSize))) then (DSPFILL (CREATEREGION (PLUS (TIMES xPos BlackBoxSquare) 2) (PLUS (TIMES yPos BlackBoxSquare) 2) (DIFFERENCE BlackBoxSquare 2) (DIFFERENCE BlackBoxSquare 2)) BLACKSHADE (QUOTE INVERT) window]) (SquareArray [LAMBDA (array x y rowSize) (* edited: "29-Dec-85 13:26") (ELT array (PLUS x (TIMES rowSize y]) ) (PUTPROPS BLACKBOX COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (966 17463 (AskQuestion 976 . 1847) (BlackBox 1849 . 2672) (BlackBoxChoices 2674 . 4665) (BlackBoxTitle 4667 . 4858) (FillBox 4860 . 5816) (InitializeBallArray 5818 . 6634) ( InitializeGuessArray 6636 . 7212) (LeftAhead 7214 . 7615) (LeftTurn 7617 . 7903) (MakeBlackBoxWindow 7905 . 8852) (MoveAhead 8854 . 9164) (MoveBall 9166 . 10000) (DrawBlackBox 10002 . 11120) (BallAhead 11122 . 11469) (BallDownOrUp 11471 . 11868) (BBBoxNumber 11870 . 12020) (BlackBoxWindowFn 12022 . 12947) (MakeBallArray 12949 . 13125) (NewGame 13127 . 14008) (OnEdge 14010 . 14382) (ProbeBallArray 14384 . 15301) (RedisplayBox 15303 . 15579) (RightAhead 15581 . 15983) (RightTurn 15985 . 16272) ( SetSquareArray 16274 . 16459) (ShowBalls 16461 . 17294) (SquareArray 17296 . 17461))))) STOP \ No newline at end of file diff --git a/lispusers/BLACKBOX.TEDIT b/lispusers/BLACKBOX.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..77c8d2c7eecc1e58a4bccc649e1abf852cc69d82 GIT binary patch literal 27768 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.ALFA>BLOCKS.HKB;2 4571 changes to: (VARS *functions1* *predicates1* *variables1* *temp-foo* *temp-pred*) previous date: " 3-Nov-86 11:06:40" {DSK}H>BLOCKS.HKB;9) (PRETTYCOMPRINT BLOCKSCOMS) (RPAQQ BLOCKSCOMS (*functions1* *predicates1* *variables1* *temp-foo* *temp-pred*)) (RPAQQ *functions1* (HRPRINT LISTMEMB MEMBER fail true noteq)) (RPAQQ *predicates1* (color-of showworld SPLIT putdown pickup please ART PREP GoOnNp PARTIC OPTPARTIC VP VERB NP1 NP NOM BLOCK on clear puton)) (RPAQQ *variables1* (:d :c :color :bl :a4 :a3 :a2 :a1 :e :q :s :m :string :e4 :e3 :e2 :e1 :rest1 :block2 :q4 :q3 :q2 :q1 :block1 :rest :block :oper :vf :b :a :w2 :w1 :x1 :y1 :u :r :v :z :i :h :j :l :w :y :x :k :p)) (RPAQQ *temp-foo* [[LAMBDA (y) (PRINTOUT T y T] [LAMBDA (x y) (PROG ((temp x)) loop (COND ((NULL temp) (RETURN T)) (T (COND ([OR (MEMBER (CAR temp) y) (EQ (CAR temp (QUOTE one] (SETQ temp (CDR temp)) (GO loop)) (T (RETURN NIL] [LAMBDA (x y) (MEMBER x y] [LAMBDA NIL NIL] [LAMBDA NIL T] (LAMBDA (x y) (NOT (EQ x y]) (RPAQQ *temp-pred* [(((color-of :block :color) < (BLOCK :block :color :a :b :c :d))) (((showworld) < (on :x :y) (HRPRINT (on :x :y)) (fail))) (((SPLIT (:a . :b) :a :b))) (((putdown :x) < (puton :x table))) (((pickup :x) < (puton :x hand))) (((please :string) < (VP :string))) (((ART the)) ((ART a)) ((ART an))) (((PREP on on))) (((GoOnNp (:x . :y) :v :rest) < (PREP :x :x1) (NP :y :v :rest))) (((PARTIC down)) ((PARTIC up)) ((PARTIC to))) (((OPTPARTIC NIL :x)) ((OPTPARTIC (:x . :y) :z) < (PARTIC :x))) (((VP (:x :y . :z)) < (VERB :x :vf :oper) (PARTIC :y) (MEMBER :y :vf) (NP :z :block NIL) (:oper :block)) ((VP (:x . :y)) < (VERB :x :vf :oper) (MEMBER one :vf) (NP :y :block :rest) (OPTPARTIC :rest :vf) (:oper :block)) ((VP (:x . :y)) < (VERB :x :vf :oper) (MEMBER two :vf) (NP :y :block1 :rest) (BLOCK :block1 :q1 :q2 :q3 :q4 stackable) (GoOnNp :rest :block2 :rest1) (BLOCK :block2 :e1 :e2 :e3 supportive :e4) (:oper :block1 :block2))) (((VERB pickup (one) pickup)) ((VERB pick (up one) pickup)) ((VERB put (two) puton)) ((VERB stack (two) puton)) ((VERB put (down one) putdown))) (((NP1 (:x :y . :z) :w :u :r) < (PREP :y :y1) (NOM :x :x1) (NP :z :v :r) (:y1 :w :v) (BLOCK . :w1) (LISTMEMB (:x1 . :u) :w1) (SPLIT :w1 :w :w2)) ((NP1 (:x . :y) :v :u :r) < (NOM :x :x1) (NP1 :y :v (:x1 . :u) :r)) ((NP1 (:x . :y) :w :u :y) < (NOM :x :x1) (BLOCK . :w1) (LISTMEMB (:x1 . :u) :w1) (SPLIT :w1 :w :w2))) (((NP (:x . :y) :v :r) < (ART :x) (NP1 :y :v NIL :r)) ((NP :x :v :r) < (NP1 :x :v NIL :r))) (((NOM red red)) ((NOM block cube)) ((NOM cube cube)) ((NOM cube1 cube1)) ((NOM cube2 cube2)) ((NOM cube3 cube3)) ((NOM big large)) ((NOM small small)) ((NOM blue blue)) ((NOM white white)) ((NOM green green)) ((NOM pyramid1 pyramid)) ((NOM pyramid pyramid)) ((NOM sphere sphere))) (((BLOCK pyramid1 white pyramid 3 NIL stackable)) ((BLOCK cube2 blue cube 5 supportive stackable)) ((BLOCK cube3 green cube 1 supportive stackable)) ((BLOCK cube1 red cube 10 supportive stackable)) ((BLOCK sphere black sphere 3 NIL stackable)) ((BLOCK table NIL NIL NIL supportive NIL)) ((BLOCK hand NIL NIL NIL supportive NIL))) (((on cube3 hand)) ((on sphere table)) ((on cube1 table)) ((on cube2 table)) ((on pyramid1 table))) (((clear table)) ((clear :x) < (on :y :x) (puton :y table)) ((clear :x))) (((puton :x :y) < (noteq :x table) (clear :x) (noteq :y pyramid) (noteq :y sphere) (clear :y) (on :x :w) (delete (on :x :w)) (assert (on :x :y]) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/BMENCODE b/lispusers/BMENCODE new file mode 100644 index 00000000..f985a6a2 --- /dev/null +++ b/lispusers/BMENCODE @@ -0,0 +1 @@ +(FILECREATED "14-Jan-87 17:50:00" {MCS:MCS:STANFORD}BMENCODE.;13 previous date: "19-Dec-86 14:46:44" {MCS:MCS:STANFORD}BMENCODE.;11) (* Copyright (c) 1986, 1987 by Stanford University. All rights reserved.) (PRETTYCOMPRINT BMENCODECOMS) (RPAQQ BMENCODECOMS ((* User function) (FNS BITMAP.ENCODE) (* Internal functions) (FNS FILE.TO.BITMAP BITMAP.TO.FILE) (ADDVARS (BMC.MAKEFILE.OPTIONS NEW)) (INITVARS (BMC.EXTENSION 'BMC) (BMC.BYTESPERLINE 64)) (GLOBALVARS BMC.MAKEFILE.OPTIONS BMC.EXTENSION BMC.BYTESPERLINE))) (* User function) (DEFINEQ (BITMAP.ENCODE [LAMBDA (FILES) (* cdl "19-Dec-86 14:43") (LET [FILENAME (FILENAMES (bind NAME for FILE inside FILES collect (PROG1 (SETQ NAME (NAMEFIELD FILE T)) (SETATOMVAL NAME (FILE.TO.BITMAP FILE] (DECLARE (SPECVARS FILENAME)) [SETATOMVAL [FILECOMS (NAMEFIELD (SETQ FILENAME (PACKFILENAME 'EXTENSION BMC.EXTENSION 'BODY (CAR FILENAMES] (BQUOTE ((BITMAPS ,@ FILENAMES) (P (for FILE in (QUOTE , FILENAMES) do (PRIN1 "Restoring file ") (PRIN1 (BITMAP.TO.FILE (EVALV FILE) FILE)) (TERPRI] (RESETVAR FONTCHANGEFLG NIL (MAKEFILE FILENAME BMC.MAKEFILE.OPTIONS]) ) (* Internal functions) (DEFINEQ (FILE.TO.BITMAP [LAMBDA (FILE) (* cdl "19-Dec-86 13:37") (DECLARE (SPECVARS FILE)) (LET (STREAM) (DECLARE (SPECVARS STREAM)) (RESETLST [RESETSAVE NIL (BQUOTE (CLOSEF? , (SETQ STREAM (OPENSTREAM FILE 'INPUT] (LET (BITMAP (LENGTH (GETFILEINFO STREAM 'LENGTH)) (BYTESPERLINE (QUOTIENT BMC.BYTESPERLINE 2))) (with BITMAP (SETQ BITMAP (BITMAPCREATE (TIMES BYTESPERLINE BITSPERBYTE) (QUOTIENT (PLUS (TIMES 2 BYTESPERWORD) BYTESPERLINE LENGTH) BYTESPERLINE))) (\PUTBASE BITMAPBASE 0 LENGTH) (\PUTBASE BITMAPBASE 1 (RSH LENGTH BITSPERWORD)) (\BINS STREAM BITMAPBASE (TIMES 2 BYTESPERWORD) LENGTH)) BITMAP]) (BITMAP.TO.FILE [LAMBDA (BITMAP FILE) (* cdl "19-Dec-86 13:40") (DECLARE (SPECVARS BITMAP FILE)) (LET (STREAM) (DECLARE (SPECVARS STREAM)) (RESETLST [RESETSAVE NIL (BQUOTE (CLOSEF? , (SETQ STREAM (OPENSTREAM FILE 'OUTPUT] [with BITMAP (\DTEST BITMAP 'BITMAP) (\BOUTS STREAM BITMAPBASE (TIMES 2 BYTESPERWORD) (PLUS (\GETBASE BITMAPBASE 0) (LSH (\GETBASE BITMAPBASE 1) BITSPERWORD] (FULLNAME STREAM]) ) (ADDTOVAR BMC.MAKEFILE.OPTIONS NEW) (RPAQ? BMC.EXTENSION 'BMC) (RPAQ? BMC.BYTESPERLINE 64) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS BMC.MAKEFILE.OPTIONS BMC.EXTENSION BMC.BYTESPERLINE) ) (PUTPROPS BMENCODE COPYRIGHT ("Stanford University" 1986 1987)) STOP \ No newline at end of file diff --git a/lispusers/BOYERMOORE b/lispusers/BOYERMOORE new file mode 100644 index 00000000..c6eb98ae --- /dev/null +++ b/lispusers/BOYERMOORE @@ -0,0 +1 @@ +(FILECREATED "30-Sep-86 14:09:43" {ERIS}LISPCORE>BOYERMOORE.;1 842932 changes to: (VARS BASISCOMS CODE-S-ZCOMS) (FNS BM-UPCASE BM-PRIN1 BM-NTH BM-COUNT CREATE-EVENT BM-NEGATE BM-PPR BM-REDUCE BM-SUBST MAKE-LIB) (FUNCTIONS BM-MATCH) previous date: " 6-Jul-86 10:30:08" {ERIS}KOTO>BOYERMOORE.;5) (* " Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT BOYERMOORECOMS) (RPAQQ BOYERMOORECOMS ((* * The Boyer Moore Theorem Prover -- By Boyer and Moore -- Translated from Zetalisp to Interlisp-D by Kelly Roach. *) (COMS (* My personal hacks to BOYERMOORE. *) (INITVARS (DEBUGFLG T)) (FNS UNDEFN UNPROVE-LEMMA)) (COMS * BASISCOMS) (COMS * CODE-1-ACOMS) (COMS * CODE-B-DCOMS) (COMS * CODE-E-MCOMS) (COMS * CODE-N-RCOMS) (COMS * CODE-S-ZCOMS) (COMS * EVENTSCOMS) (COMS * GENFACTCOMS) (COMS * IOCOMS) (COMS * PPRCOMS) (FILES COMPILEBANG) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA TOGGLE REFLECT PROVE-LEMMA ENABLE DISABLE DEFN DCL ADD-SHELL ADD-AXIOM) (NLAML) (LAMA))))) (* * The Boyer Moore Theorem Prover -- By Boyer and Moore -- Translated from Zetalisp to Interlisp-D by Kelly Roach. *) (* My personal hacks to BOYERMOORE. *) (RPAQ? DEBUGFLG T) (DEFINEQ (UNDEFN [LAMBDA (NAME) (* kbr: " 6-Jul-86 09:46") (* A personal hack. Take back a  BOYERMOORE defined function.  *) (PROG (*1*NAME) (SETQ PROVED-THMS (for THM in PROVED-THMS when (NOT (AND (EQ (CAR THM) (QUOTE DEFN)) (EQ (CADR THM) NAME))) collect THM)) (SETQ *1*NAME (PACK* "*1*" NAME)) (SETQ LIB-ATOMS-WITH-PROPS (DREMOVE NAME LIB-ATOMS-WITH-PROPS)) (SETQ LIB-ATOMS-WITH-PROPS (DREMOVE *1*NAME LIB-ATOMS-WITH-PROPS)) (SETQ LIB-ATOMS-WITH-DEFS (DREMOVE NAME LIB-ATOMS-WITH-DEFS)) (SETQ CHRONOLOGY (DREMOVE NAME CHRONOLOGY)) (for PROP in LIB-PROPS do (REMPROP NAME PROP)) (for PROP in LIB-PROPS do (REMPROP *1*NAME PROP)) (REMPROP *1*NAME (QUOTE EXPR)) (PUTD *1*NAME NIL]) (UNPROVE-LEMMA [LAMBDA (NAME) (* kbr: " 6-Jul-86 09:47") (* A personal hack. Take back a  BOYERMOORE lemma *) (PROG (TERM) (SETQ TERM (CADDDR (GETPROP NAME (QUOTE EVENT)))) (for X in (UNPRETTYIFY TERM) do (SETQ CONCL (CDR X)) (COND ((GETPROP (TOP-FNNAME CONCL) (QUOTE LEMMAS)) (PUTPROP (TOP-FNNAME CONCL) (QUOTE LEMMAS) (for RULE in (GETPROP (TOP-FNNAME CONCL) (QUOTE LEMMAS)) when (NOT (EQ (fetch (REWRITE-RULE NAME) of OLD-RULE) NAME)) collect RULE))))) (SETQ PROVED-THMS (for THM in PROVED-THMS when (NOT (EQ TERM THM)) collect THM)) (SETQ LIB-ATOMS-WITH-PROPS (DREMOVE NAME LIB-ATOMS-WITH-PROPS)) (SETQ CHRONOLOGY (DREMOVE NAME CHRONOLOGY)) (SETQ PROCESS-HIST (DREMOVE NAME PROCESS-HIST)) (for PROP in LIB-PROPS do (REMPROP NAME PROP]) ) (RPAQQ BASISCOMS ((* BASIS *) (FUNCTIONS GET1 *1*IF ADD-SUB-FACT-BODY ACCESS ARGN BINDINGS CHANGE DISABLEDP FARGN FARGS FCONS-TERM FCONS-TERM* FFN-SYMB FN-SYMB FQUOTEP LOGBIT LOGDIFF BM-MATCH MATCH! NVARIABLEP PQUOTE PRIND QUOTEP TYO1 TYPE-PRESCRIPTION VALUEP VARIABLEP) (VARS (THEOREM-PROVER-FILES (QUOTE (BASIS GENFACT EVENTS CODE-1-A CODE-B-D CODE-E-M CODE-N-R CODE-S-Z IO BM-PPR))) (ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON T) (PROVE-FILE NIL) (ADD-TERM-TO-POT-LST-TEMP (LIST NIL)) (ALL-LEMMAS-USED NIL) (ALMOST-SUBSUMES-CONSTANT (CONS NIL NIL)) (ANCESTORS NIL) (ARITY-ALIST NIL) (BOOK-SYNTAX-FLG NIL) BOOT-STRAP-INSTRS (BOOT-STRAP-MACRO-FNS (QUOTE (GREATERP LEQ GEQ))) (BROKEN-LEMMAS NIL) (CLAUSE-ALIST NIL) (COMMUTED-EQUALITY-FLG NIL) (CULPRIT-FUNCTION NIL) (CURRENT-ATM 0) (CURRENT-LIT 0) (DO-NOT-USE-INDUCTION-FLG NIL) (DOTCONS (LIST NIL NIL)) (ELIM-VARIABLE-NAMES (QUOTE (X Z V W D C X1 Z1 V1 W1 D1 C1 X2 Z2 V2 W2 D2 C2))) (ELIM-VARIABLE-NAMES1 NIL) (EXECUTE-PROCESSES (QUOTE (SIMPLIFY-CLAUSE SETTLED-DOWN-CLAUSE FERTILIZE-CLAUSE ELIMINATE-DESTRUCTORS-CLAUSE GENERALIZE-CLAUSE ELIMINATE-IRRELEVANCE-CLAUSE STORE-SENT))) (EXPAND-LST NIL) (FAILED-THMS NIL) (FAILURE-MSG "************** F A I L E D **************") (FALSE (QUOTE (QUOTE *1*FALSE))) (FNS-TO-BE-IGNORED-BY-REWRITE NIL) (FORCEIN 38) (GEN-VARIABLE-NAMES (QUOTE (Y A U B E G H P Q R S))) (GENERALIZE-LEMMA-NAMES NIL) (GENERALIZING-SKOS NIL) (HEURISTIC-TYPE-ALIST NIL) (HINT NIL) (HINT-VARIABLE-ALIST (QUOTE ((DISABLE TEMPORARILY-DISABLED-LEMMAS NIL NIL) (EXPAND HINTED-EXPANSIONS T NIL) (HANDS-OFF FNS-TO-BE-IGNORED-BY-REWRITE NIL NIL) (NO-BUILT-IN-ARITH NO-BUILT-IN-ARITH-FLG NIL NIL)))) (HINTED-EXPANSIONS NIL) (INDUCTION-HYP-TERMS NIL) (IN-ADD-AXIOM-FLG NIL) (IN-BOOT-STRAP-FLG NIL) (IN-REDO-UNDONE-EVENTS-FLG NIL) (IN-PROVE-LEMMA-FLG NIL) (IO-FN (QUOTE IO1)) (IOTHMTIME 0) (IPOSITION-ALIST NIL) (LAST-PRINEVAL-CHAR (QUOTE %.)) (LAST-PROCESS NIL) (LEFTMARGINCHAR NIL) (LEMMA-DISPLAY-FLG NIL) (LEMMA-TYPES (QUOTE (REWRITE ELIM GENERALIZE META))) (LITATOM-FORM-COUNT-ALIST NIL) (LITS-THAT-MAY-BE-ASSUMED-FALSE NIL) (LITS-TO-BE-IGNORED-BY-LINEAR NIL) (META-NAMES (QUOTE (APPLY MEANING MEANING-LST ARITY FORMP FORM-LSTP))) (MUST-BE-FALSE NIL) (MUST-BE-TRUE NIL) (NILCONS (CONS NIL NIL)) (NO-BUILT-IN-ARITH-FLG NIL) (OBVIOUS-RESTRICTIONS NIL) (ORIGEVENT NIL) (PPR-MACRO-LST (QUOTE ((NOT . CONVERT-NOT) (CONS . CONVERT-CONS) (CAR . CONVERT-CAR-CDR) (CDR . CONVERT-CAR-CDR) (QUOTE . CONVERT-QUOTE)))) (PPRFIRSTCOL 35) (PPRMAXLNS 10000) (PRINEVAL-FNS (QUOTE (IEQP AND EQUAL OR NOT EQ EQLENGTH !CLAUSE !CLAUSE-SET !PPR LENGTH LENGTH-TO-ATOM !PPR-LIST !LIST PLURALP QUOTE QUOTE PQUOTE CAR CDR FN-SYMB FFN-SYMB ARGN FARGN ARGS FARGS QUOTEP FQUOTEP))) (PROVED-THMS NIL) (R-ALIST NIL) (STACK NIL) (TAB-SIZE 8.0) (TEMPORARILY-DISABLED-LEMMAS NIL) (TERMS-TO-BE-IGNORED-BY-REWRITE NIL) (TRANSLATE-TO-LISP-TIME 0) (TRUE (QUOTE (QUOTE *1*TRUE))) (TRUE-CLAUSE (LIST TRUE)) (TRUE-TYPE-ALIST NIL) (TTY-FILE NIL) (TYPE-ALIST NIL) (UN-PRODUCTIVE-PROCESSES (QUOTE (SETTLED-DOWN-CLAUSE STORE-SENT POP SUBSUMED-ABOVE SUBSUMED-BY-PARENT SUBSUMED-BELOW FINISHED))) (UNDONE-BATCH-COMMANDS NIL) (UNDONE-EVENTS-STACK NIL) (USE-NO-LEMMAS-FLG NIL) (WELL-ORDERING-RELATIONS (QUOTE (LESSP LEX2 LEX3))) (ZERO (QUOTE (QUOTE 0)))) (CONSTANTS (EVENT-SEPARATOR-STRING (CHARACTER (CHARCODE CR))) (*1*F (QUOTE *1*FALSE)) (*1*SHELL-QUOTE-MARK (QUOTE *1*QUOTE)) (*1*T (QUOTE *1*TRUE)) (PARAGRAPH-INDENT 5) (STRING-WEIRD (QUOTE *1*)) (STRING-WEIRD2 (QUOTE *2*)) (STRING-WEIRD3 (QUOTE *3*)) (TREE-INDENT 2) (TREE-LINES 2) (TYPE-SET-BOOLEAN 3) (TYPE-SET-CONS 16) (TYPE-SET-FALSE 1) (TYPE-SET-LITATOMS 8) (TYPE-SET-NEGATIVES 32) (TYPE-SET-NUMBERS 4) (TYPE-SET-TRUE 2) (TYPE-SET-UNKNOWN -1)) (INITVARS (LIB-FILE NIL) (LIB-VARS NIL) (LIB-ATOMS-WITH-PROPS NIL) (LIB-ATOMS-WITH-DEFS NIL) (LIB-PROPS NIL) (*ALIST* NIL) (*ARGLIST* NIL) (*CONTROLLER-COMPLEXITIES* NIL) (*FILE* NIL) (*FNNAME* NIL) (*INDENT* 0) (*TYPE-ALIST* NIL) (*1*BTM-OBJECTS NIL) (ABBREVIATIONS-USED NIL) (ADD-EQUATIONS-TO-DO NIL) (ALIST NIL) (ALISTS NIL) (ALL-FNS-FLG NIL) (ALMOST-SUBSUMES-LITERAL NIL) (ANS NIL) (ARGS NIL) (CHRONOLOGY NIL) (CL2 NIL) (COMMONSUBTERMS NIL) (CURRENT-CL NIL) (CURRENT-SIMPLIFY-CL NIL) (CURRENT-TYPE-NO NIL) (DECISIONS NIL) (DEFINITELY-FALSE NIL) (DEFN-FLG NIL) (DESCENDANTS NIL) (DISABLED-LEMMAS NIL) (DLHDFMLA NIL) (ELAPSEDTHMTIME NIL) (ENDLIST NIL) (EVENT-LST NIL) (FAILURE-ACTION NIL) (FALSE-TYPE-ALIST NIL) (FILE NIL) (FLATSIZE NIL) (FMLA NIL) (FNS NIL) (FNSTACK NIL) (FORM NIL) (GEN-VARIABLE-NAMES1 NIL) (GENERALIZE-LEMMAS NIL) (GENRLTLIST NIL) (HIGHER-PROPS NIL) (HINTS NIL) (HIST-ENTRY NIL) (ID-IFF NIL) (INDENT NIL) (INDUCTION-CONCL-TERMS NIL) (INST-HYP NIL) (LAST-CLAUSE NIL) (LAST-EXIT NIL) (LAST-HYP NIL) (LAST-PRIN5-WORD NIL) (LAST-PRINT-CLAUSES NIL) (LINEARIZE-ASSUMPTIONS-STACK NIL) (LEMMA-STACK NIL) (LEMMAS-USED-BY-LINEAR NIL) (LINEAR-ASSUMPTIONS NIL) (MAIN-EVENT-NAME NIL) (MARG2 NIL) (MASTER-ROOT-NAME NIL) (MATCH-TEMP NIL) (MATCH-X NIL) (MINREM NIL) (NAME NIL) (NAMES NIL) (NEXT-MEMO-KEY NIL) (NEXT-MEMO-VAL NIL) (NEXTIND NIL) (NEXTNODE NIL) (NONCONSTRUCTIVE-AXIOM-NAMES NIL) (NUMBER-OF-VARIABLES NIL) (OBJECTIVE NIL) (ORIG-LEMMA-STACK NIL) (ORIG-LINEARIZE-ASSUMPTIONS-STACK NIL) (ORIGTHM NIL) (PARENT NIL) (PARENT-HIST NIL) (POS NIL) (PPR-MACRO-MEMO NIL) (PPRFILE NIL) (PROCESS NIL) (PROCESS-CLAUSES NIL) (PROCESS-HIST NIL) (PROP NIL) (PROPLIST NIL) (PROVE-TERMINATION-LEMMAS-USED NIL) (RECOGNIZER-ALIST NIL) (RECORD-DECLARATIONS NIL) (RECORD-TEMP NIL) (RELIEVE-HYPS-NOT-OK-ANS NIL) (REMAINDER NIL) (SCRIBE-FLG NIL) (SETQ-LST NIL) (SHELL-ALIST NIL) (SHELL-POCKETS NIL) (SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES NIL) (SIMPLIFY-CLAUSE-MAXIMALLY-HIST NIL) (SIMPLIFY-CLAUSE-POT-LST NIL) (SINGLETON-TYPE-SETS NIL) (SPACELEFT NIL) (STARTLIST NIL) (T2 NIL) (TEMP-TEMP NIL) (TEMP1 NIL) (TEST-LST NIL) (THM NIL) (TYPE-SET-TERM1 NIL) (UNDONE-EVENTS NIL) (UNIFY-SUBST NIL) (UNIVERSE NIL) (VAL NIL) (VAR-ALIST NIL)) (RECORDS CANDIDATE GENERALIZE-LEMMA JUSTIFICATION LINEAR-LEMMA LINEAR-POT MEASURE-RULE POLY REWRITE-RULE TESTS-AND-ALISTS TESTS-AND-CASE TESTS-AND-CASES TYPE-PRESCRIPTION-NAME-AND-PAIR TYPE-RESTRICTION) (FNS BM-UPCASE COMPILE-IF-APPROPRIATE-AND-POSSIBLE COPYLIST EXTEND-FILE-NAME FIND-CHAR-IN-FILE FIND-STRING-IN-FILE GET-TOTAL-STATS GET-FROM-FILE GET-PLIST-FROM-FILE GET-STATS-FILE BM-PRIN1 PRINT-SYSTEM PRINT-DATE-LINE RANDOM-INITIALIZATION RANDOM-NUMBER READ-FILE REMQ STORE-DEFINITION SWAP-OUT R-LOOP TIME-IT TIME-IN-60THS XSEARCH *1*CAR *1*CDR ADD-TO-SET ARGN-MACRO BINDINGS-MACRO CELL CREATE-LEMMA-STACK CREATE-LINEARIZE-ASSUMPTIONS-STACK CREATE-STACK1 FARGN-MACRO FN-SYMB-MACRO HLOAD IPOSITION ITERPRI ITERPRIN ITERPRISPACES IPRIN1 IPRINC IPRINT ISPACES KILL-DEFINITION LINEL MAKE-LIB MATCH-MACRO MATCH!-MACRO MATCH1-MACRO MATCH2-MACRO NOTE-LIB BM-NTH PREPARE-FOR-THE-NIGHT SPELL-NUMBER SUB-PAIR UNIONQ) (P (SETQ LEMMA-STACK (CREATE-LEMMA-STACK 10)) (SETQ LINEARIZE-ASSUMPTIONS-STACK (CREATE-LINEARIZE-ASSUMPTIONS-STACK 10))))) (* BASIS *) (DEFMACRO GET1 (ATM PROP) #M (BQUOTE (GET11 (\, ATM) (\, PROP))) #Q (BQUOTE (GETPROP (\, ATM) (\, PROP)))) (DEFMACRO *1*IF (X Y Z) (BQUOTE (COND ((EQ (\, X) *1*F) (\, Z)) (T (\, Y))))) (DEFMACRO ADD-SUB-FACT-BODY X (GENERATE-ADD-SUB-FACT1 X)) (DEFMACRO ACCESS X (ACCESS-MACRO (CAR X) (CADR X) (CADDR X))) (DEFMACRO ARGN TAIL (ARGN-MACRO TAIL)) (DEFMACRO BINDINGS TAIL (BINDINGS-MACRO TAIL)) (DEFMACRO CHANGE X (CHANGE-MACRO (CAR X) (CADR X) (CADDR X) (CADDDR X))) (DEFMACRO DISABLEDP (NAME) (BQUOTE (OR (MEMB (SETQ TEMP-TEMP (\, NAME)) TEMPORARILY-DISABLED-LEMMAS) (CDDR (ASSOC TEMP-TEMP DISABLED-LEMMAS))))) (DEFMACRO FARGN TAIL (FARGN-MACRO TAIL)) (DEFMACRO FARGS (X) (BQUOTE (CDR (\, X)))) (DEFMACRO FCONS-TERM TAIL (CONS (QUOTE CONS) TAIL)) (DEFMACRO FCONS-TERM* TAIL (CONS (QUOTE LIST) TAIL)) (DEFMACRO FFN-SYMB (X) (BQUOTE (CAR (\, X)))) (DEFMACRO FN-SYMB TAIL (FN-SYMB-MACRO TAIL)) (DEFMACRO FQUOTEP (X) (BQUOTE (EQ (CAR (\, X)) (QUOTE QUOTE)))) (DEFMACRO LOGBIT (N) (BQUOTE (LSH 1 (\, N)))) (DEFMACRO LOGDIFF (X Y) (BQUOTE (BOOLE 4 (\, X) (\, Y)))) (DEFMACRO BM-MATCH X (* Matchs FORM against PATTERN where X =  (FORM PATTERN) FORM is evaluated and the free variables in PATTERN are bound to  parts of FORM. (BM-MATCH (QUOTE (EQUAL 34 56))  (EQUAL XX YY)) returns T and causes XX and YY to be bound to 34 and 56 *) (MATCH-MACRO (CAR X) (CADR X))) (DEFMACRO MATCH! X (MATCH!-MACRO (CAR X) (CADR X))) (DEFMACRO NVARIABLEP (X) (BQUOTE (LISTP (\, X)))) (DEFMACRO PQUOTE (X) (BQUOTE (QUOTE (\, X)))) (DEFMACRO PRIND (X FILE) (BQUOTE (LET ((TEMP (\, X))) (PRIN1 TEMP (\, FILE)) (SETQ POS (IPLUS POS (NCHARS TEMP)))))) (DEFMACRO QUOTEP (X) (BQUOTE (AND (LISTP (SETQ TEMP-TEMP (\, X))) (EQ (CAR TEMP-TEMP) (QUOTE QUOTE))))) (DEFMACRO TYO1 (X FILE) (BQUOTE (PROGN (TYO (\, X) (\, FILE)) (SETQ POS (ADD1 POS))))) (DEFMACRO TYPE-PRESCRIPTION (X) (BQUOTE (CDAR (GETPROP (\, X) (QUOTE TYPE-PRESCRIPTION-LST))))) (DEFMACRO VALUEP (X) (BQUOTE (QUOTEP (\, X)))) (DEFMACRO VARIABLEP (X) (BQUOTE (NLISTP (\, X)))) (RPAQQ THEOREM-PROVER-FILES (BASIS GENFACT EVENTS CODE-1-A CODE-B-D CODE-E-M CODE-N-R CODE-S-Z IO BM-PPR)) (RPAQQ ALPHABETIC-CASE-AFFECTS-STRING-COMPARISON T) (RPAQQ PROVE-FILE NIL) (RPAQ ADD-TERM-TO-POT-LST-TEMP (LIST NIL)) (RPAQQ ALL-LEMMAS-USED NIL) (RPAQ ALMOST-SUBSUMES-CONSTANT (CONS NIL NIL)) (RPAQQ ANCESTORS NIL) (RPAQQ ARITY-ALIST NIL) (RPAQQ BOOK-SYNTAX-FLG NIL) (RPAQQ BOOT-STRAP-INSTRS ((ADD-SHELL0 FALSE NIL FALSEP NIL) (ADD-SHELL0 TRUE NIL TRUEP NIL) (DEFN0 NOT (P) (IF P (FALSE) (TRUE)) NIL T) (DEFN0 AND (P Q) (IF P (IF Q (TRUE) (FALSE)) (FALSE)) NIL T) (DEFN0 OR (P Q) (IF P (TRUE) (IF Q (TRUE) (FALSE))) NIL T) (DEFN0 IMPLIES (P Q) (IF P (IF Q (TRUE) (FALSE)) (TRUE)) NIL T) (ADD-SHELL0 ADD1 ZERO NUMBERP ((SUB1 (ONE-OF NUMBERP) ZERO))) (DEFN0 LESSP (X Y) (IF (OR (EQUAL Y 0) (NOT (NUMBERP Y))) (FALSE) (IF (OR (EQUAL X 0) (NOT (NUMBERP X))) (TRUE) (LESSP (SUB1 X) (SUB1 Y)))) NIL T) (PUT1 LESSP 0 LEVEL-NO) (DEFN0 GREATERP (X Y) (LESSP Y X) NIL NIL) (DEFN0 LEQ (X Y) (NOT (LESSP Y X)) NIL NIL) (DEFN0 GEQ (X Y) (NOT (LESSP X Y)) NIL NIL) (DEFN0 LEX2 (L1 L2) (OR (LESSP (CAR L1) (CAR L2)) (AND (EQUAL (CAR L1) (CAR L2)) (LESSP (CADR L1) (CADR L2)))) NIL NIL) (DEFN0 LEX3 (L1 L2) (OR (LESSP (CAR L1) (CAR L2)) (AND (EQUAL (CAR L1) (CAR L2)) (LEX2 (CDR L1) (CDR L2)))) NIL NIL) (DEFN0 ZEROP (X) (IF (EQUAL X 0) T (IF (NUMBERP X) F T)) NIL T) (DEFN0 FIX (X) (IF (NUMBERP X) X 0) NIL T) (DEFN0 PLUS (X Y) (IF (ZEROP X) (FIX Y) (ADD1 (PLUS (SUB1 X) Y))) NIL T) (ADD-AXIOM1 COUNT-NUMBERP (REWRITE) (IMPLIES (NUMBERP I) (EQUAL (COUNT I) I))) (ADD-AXIOM1 COUNT-NOT-LESSP (REWRITE) (NOT (LESSP (COUNT I) I))) (ADD-SHELL0 PACK NIL LITATOM ((UNPACK (NONE-OF) ZERO))) (ADD-SHELL0 CONS NIL LISTP ((CAR (NONE-OF) ZERO) (CDR (NONE-OF) ZERO))) (DEFN0 NLISTP (X) (NOT (LISTP X)) NIL T) (ADD-SHELL0 MINUS NIL NEGATIVEP ((NEGATIVE-GUTS (ONE-OF NUMBERP) ZERO))) (DEFN0 DIFFERENCE (I J) (IF (ZEROP I) 0 (IF (ZEROP J) I (DIFFERENCE (SUB1 I) (SUB1 J)))) NIL T) (DEFN0 TIMES (I J) (IF (ZEROP I) 0 (PLUS J (TIMES (SUB1 I) J))) NIL T) (DEFN0 QUOTIENT (I J) (IF (ZEROP J) 0 (IF (LESSP I J) 0 (ADD1 (QUOTIENT (DIFFERENCE I J) J)))) NIL T) (DEFN0 REMAINDER (I J) (IF (ZEROP J) (FIX I) (IF (LESSP I J) (FIX I) (REMAINDER (DIFFERENCE I J) J))) NIL T) (DEFN0 LEGAL-CHAR-CODES NIL (QUOTE (45 48 49 50 51 52 53 54 55 56 57 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90)) NIL NIL) (DEFN0 ILLEGAL-FIRST-CHAR-CODES NIL (QUOTE (45 48 49 50 51 52 53 54 55 56 57)) NIL NIL) (DEFN0 LENGTH (LST) (IF (LISTP LST) (ADD1 (LENGTH (CDR LST))) 0) NIL NIL) (DEFN0 MEMBER (X LST) (IF (NLISTP LST) F (IF (EQUAL X (CAR LST)) T (MEMBER X (CDR LST)))) NIL NIL) (DEFN0 SUBSETP (X Y) (IF (NLISTP X) T (IF (MEMBER (CAR X) Y) (SUBSETP (CDR X) Y) F)) NIL NIL) (DEFN0 LAST (L) (IF (LISTP L) (IF (LISTP (CDR L)) (LAST (CDR L)) L) L) NIL NIL) (DEFN0 LEGAL-CHAR-CODE-SEQ (LST) (AND (LISTP LST) (SUBSETP LST (LEGAL-CHAR-CODES)) (NOT (MEMBER (CAR LST) (ILLEGAL-FIRST-CHAR-CODES))) (EQUAL (CDR (LAST LST)) 0)) NIL NIL) (DEFN0 SYMBOLP (X) (AND (LITATOM X) (LEGAL-CHAR-CODE-SEQ (UNPACK X))) NIL NIL) (DEFN0 LOOKUP (X ALIST) (IF (NLISTP ALIST) NIL (IF (AND (LISTP (CAR ALIST)) (EQUAL X (CAAR ALIST))) (CDAR ALIST) (LOOKUP X (CDR ALIST)))) NIL NIL) (DCL0 ARITY (X)) (DCL0 FORMP (X)) (DEFN0 FORM-LSTP (X) (IF (NLISTP X) (EQUAL X NIL) (AND (FORMP (CAR X)) (FORM-LSTP (CDR X)))) NIL NIL) (DCL0 APPLY (X LST)) (DCL0 MEANING (X ALIST)) (DEFN0 MEANING-LST (X ALIST) (IF (NLISTP X) NIL (CONS (MEANING (CAR X) ALIST) (MEANING-LST (CDR X) ALIST))) NIL NIL) (SETUP-META-NAMES) (DEFN0 SPLIT (X) X NIL NIL) (DEFN0 CHECK (X) X NIL NIL))) (RPAQQ BOOT-STRAP-MACRO-FNS (GREATERP LEQ GEQ)) (RPAQQ BROKEN-LEMMAS NIL) (RPAQQ CLAUSE-ALIST NIL) (RPAQQ COMMUTED-EQUALITY-FLG NIL) (RPAQQ CULPRIT-FUNCTION NIL) (RPAQQ CURRENT-ATM 0) (RPAQQ CURRENT-LIT 0) (RPAQQ DO-NOT-USE-INDUCTION-FLG NIL) (RPAQ DOTCONS (LIST NIL NIL)) (RPAQQ ELIM-VARIABLE-NAMES (X Z V W D C X1 Z1 V1 W1 D1 C1 X2 Z2 V2 W2 D2 C2)) (RPAQQ ELIM-VARIABLE-NAMES1 NIL) (RPAQQ EXECUTE-PROCESSES (SIMPLIFY-CLAUSE SETTLED-DOWN-CLAUSE FERTILIZE-CLAUSE ELIMINATE-DESTRUCTORS-CLAUSE GENERALIZE-CLAUSE ELIMINATE-IRRELEVANCE-CLAUSE STORE-SENT)) (RPAQQ EXPAND-LST NIL) (RPAQQ FAILED-THMS NIL) (RPAQ FAILURE-MSG "************** F A I L E D **************") (RPAQQ FALSE (QUOTE *1*FALSE)) (RPAQQ FNS-TO-BE-IGNORED-BY-REWRITE NIL) (RPAQQ FORCEIN 38) (RPAQQ GEN-VARIABLE-NAMES (Y A U B E G H P Q R S)) (RPAQQ GENERALIZE-LEMMA-NAMES NIL) (RPAQQ GENERALIZING-SKOS NIL) (RPAQQ HEURISTIC-TYPE-ALIST NIL) (RPAQQ HINT NIL) (RPAQQ HINT-VARIABLE-ALIST ((DISABLE TEMPORARILY-DISABLED-LEMMAS NIL NIL) (EXPAND HINTED-EXPANSIONS T NIL) (HANDS-OFF FNS-TO-BE-IGNORED-BY-REWRITE NIL NIL) (NO-BUILT-IN-ARITH NO-BUILT-IN-ARITH-FLG NIL NIL))) (RPAQQ HINTED-EXPANSIONS NIL) (RPAQQ INDUCTION-HYP-TERMS NIL) (RPAQQ IN-ADD-AXIOM-FLG NIL) (RPAQQ IN-BOOT-STRAP-FLG NIL) (RPAQQ IN-REDO-UNDONE-EVENTS-FLG NIL) (RPAQQ IN-PROVE-LEMMA-FLG NIL) (RPAQQ IO-FN IO1) (RPAQQ IOTHMTIME 0) (RPAQQ IPOSITION-ALIST NIL) (RPAQQ LAST-PRINEVAL-CHAR %.) (RPAQQ LAST-PROCESS NIL) (RPAQQ LEFTMARGINCHAR NIL) (RPAQQ LEMMA-DISPLAY-FLG NIL) (RPAQQ LEMMA-TYPES (REWRITE ELIM GENERALIZE META)) (RPAQQ LITATOM-FORM-COUNT-ALIST NIL) (RPAQQ LITS-THAT-MAY-BE-ASSUMED-FALSE NIL) (RPAQQ LITS-TO-BE-IGNORED-BY-LINEAR NIL) (RPAQQ META-NAMES (APPLY MEANING MEANING-LST ARITY FORMP FORM-LSTP)) (RPAQQ MUST-BE-FALSE NIL) (RPAQQ MUST-BE-TRUE NIL) (RPAQ NILCONS (CONS NIL NIL)) (RPAQQ NO-BUILT-IN-ARITH-FLG NIL) (RPAQQ OBVIOUS-RESTRICTIONS NIL) (RPAQQ ORIGEVENT NIL) (RPAQQ PPR-MACRO-LST ((NOT . CONVERT-NOT) (CONS . CONVERT-CONS) (CAR . CONVERT-CAR-CDR) (CDR . CONVERT-CAR-CDR) (QUOTE . CONVERT-QUOTE))) (RPAQQ PPRFIRSTCOL 35) (RPAQQ PPRMAXLNS 10000) (RPAQQ PRINEVAL-FNS (IEQP AND EQUAL OR NOT EQ EQLENGTH !CLAUSE !CLAUSE-SET !PPR LENGTH LENGTH-TO-ATOM !PPR-LIST !LIST PLURALP QUOTE QUOTE PQUOTE CAR CDR FN-SYMB FFN-SYMB ARGN FARGN ARGS FARGS QUOTEP FQUOTEP)) (RPAQQ PROVED-THMS NIL) (RPAQQ R-ALIST NIL) (RPAQQ STACK NIL) (RPAQQ TAB-SIZE 8.0) (RPAQQ TEMPORARILY-DISABLED-LEMMAS NIL) (RPAQQ TERMS-TO-BE-IGNORED-BY-REWRITE NIL) (RPAQQ TRANSLATE-TO-LISP-TIME 0) (RPAQQ TRUE (QUOTE *1*TRUE)) (RPAQ TRUE-CLAUSE (LIST TRUE)) (RPAQQ TRUE-TYPE-ALIST NIL) (RPAQQ TTY-FILE NIL) (RPAQQ TYPE-ALIST NIL) (RPAQQ UN-PRODUCTIVE-PROCESSES (SETTLED-DOWN-CLAUSE STORE-SENT POP SUBSUMED-ABOVE SUBSUMED-BY-PARENT SUBSUMED-BELOW FINISHED)) (RPAQQ UNDONE-BATCH-COMMANDS NIL) (RPAQQ UNDONE-EVENTS-STACK NIL) (RPAQQ USE-NO-LEMMAS-FLG NIL) (RPAQQ WELL-ORDERING-RELATIONS (LESSP LEX2 LEX3)) (RPAQQ ZERO (QUOTE 0)) (DECLARE: EVAL@COMPILE (RPAQ EVENT-SEPARATOR-STRING (CHARACTER (CHARCODE CR))) (RPAQQ *1*F *1*FALSE) (RPAQQ *1*SHELL-QUOTE-MARK *1*QUOTE) (RPAQQ *1*T *1*TRUE) (RPAQQ PARAGRAPH-INDENT 5) (RPAQQ STRING-WEIRD *1*) (RPAQQ STRING-WEIRD2 *2*) (RPAQQ STRING-WEIRD3 *3*) (RPAQQ TREE-INDENT 2) (RPAQQ TREE-LINES 2) (RPAQQ TYPE-SET-BOOLEAN 3) (RPAQQ TYPE-SET-CONS 16) (RPAQQ TYPE-SET-FALSE 1) (RPAQQ TYPE-SET-LITATOMS 8) (RPAQQ TYPE-SET-NEGATIVES 32) (RPAQQ TYPE-SET-NUMBERS 4) (RPAQQ TYPE-SET-TRUE 2) (RPAQQ TYPE-SET-UNKNOWN -1) (CONSTANTS (EVENT-SEPARATOR-STRING (CHARACTER (CHARCODE CR))) (*1*F (QUOTE *1*FALSE)) (*1*SHELL-QUOTE-MARK (QUOTE *1*QUOTE)) (*1*T (QUOTE *1*TRUE)) (PARAGRAPH-INDENT 5) (STRING-WEIRD (QUOTE *1*)) (STRING-WEIRD2 (QUOTE *2*)) (STRING-WEIRD3 (QUOTE *3*)) (TREE-INDENT 2) (TREE-LINES 2) (TYPE-SET-BOOLEAN 3) (TYPE-SET-CONS 16) (TYPE-SET-FALSE 1) (TYPE-SET-LITATOMS 8) (TYPE-SET-NEGATIVES 32) (TYPE-SET-NUMBERS 4) (TYPE-SET-TRUE 2) (TYPE-SET-UNKNOWN -1)) ) (RPAQ? LIB-FILE NIL) (RPAQ? LIB-VARS NIL) (RPAQ? LIB-ATOMS-WITH-PROPS NIL) (RPAQ? LIB-ATOMS-WITH-DEFS NIL) (RPAQ? LIB-PROPS NIL) (RPAQ? *ALIST* NIL) (RPAQ? *ARGLIST* NIL) (RPAQ? *CONTROLLER-COMPLEXITIES* NIL) (RPAQ? *FILE* NIL) (RPAQ? *FNNAME* NIL) (RPAQ? *INDENT* 0) (RPAQ? *TYPE-ALIST* NIL) (RPAQ? *1*BTM-OBJECTS NIL) (RPAQ? ABBREVIATIONS-USED NIL) (RPAQ? ADD-EQUATIONS-TO-DO NIL) (RPAQ? ALIST NIL) (RPAQ? ALISTS NIL) (RPAQ? ALL-FNS-FLG NIL) (RPAQ? ALMOST-SUBSUMES-LITERAL NIL) (RPAQ? ANS NIL) (RPAQ? ARGS NIL) (RPAQ? CHRONOLOGY NIL) (RPAQ? CL2 NIL) (RPAQ? COMMONSUBTERMS NIL) (RPAQ? CURRENT-CL NIL) (RPAQ? CURRENT-SIMPLIFY-CL NIL) (RPAQ? CURRENT-TYPE-NO NIL) (RPAQ? DECISIONS NIL) (RPAQ? DEFINITELY-FALSE NIL) (RPAQ? DEFN-FLG NIL) (RPAQ? DESCENDANTS NIL) (RPAQ? DISABLED-LEMMAS NIL) (RPAQ? DLHDFMLA NIL) (RPAQ? ELAPSEDTHMTIME NIL) (RPAQ? ENDLIST NIL) (RPAQ? EVENT-LST NIL) (RPAQ? FAILURE-ACTION NIL) (RPAQ? FALSE-TYPE-ALIST NIL) (RPAQ? FILE NIL) (RPAQ? FLATSIZE NIL) (RPAQ? FMLA NIL) (RPAQ? FNS NIL) (RPAQ? FNSTACK NIL) (RPAQ? FORM NIL) (RPAQ? GEN-VARIABLE-NAMES1 NIL) (RPAQ? GENERALIZE-LEMMAS NIL) (RPAQ? GENRLTLIST NIL) (RPAQ? HIGHER-PROPS NIL) (RPAQ? HINTS NIL) (RPAQ? HIST-ENTRY NIL) (RPAQ? ID-IFF NIL) (RPAQ? INDENT NIL) (RPAQ? INDUCTION-CONCL-TERMS NIL) (RPAQ? INST-HYP NIL) (RPAQ? LAST-CLAUSE NIL) (RPAQ? LAST-EXIT NIL) (RPAQ? LAST-HYP NIL) (RPAQ? LAST-PRIN5-WORD NIL) (RPAQ? LAST-PRINT-CLAUSES NIL) (RPAQ? LINEARIZE-ASSUMPTIONS-STACK NIL) (RPAQ? LEMMA-STACK NIL) (RPAQ? LEMMAS-USED-BY-LINEAR NIL) (RPAQ? LINEAR-ASSUMPTIONS NIL) (RPAQ? MAIN-EVENT-NAME NIL) (RPAQ? MARG2 NIL) (RPAQ? MASTER-ROOT-NAME NIL) (RPAQ? MATCH-TEMP NIL) (RPAQ? MATCH-X NIL) (RPAQ? MINREM NIL) (RPAQ? NAME NIL) (RPAQ? NAMES NIL) (RPAQ? NEXT-MEMO-KEY NIL) (RPAQ? NEXT-MEMO-VAL NIL) (RPAQ? NEXTIND NIL) (RPAQ? NEXTNODE NIL) (RPAQ? NONCONSTRUCTIVE-AXIOM-NAMES NIL) (RPAQ? NUMBER-OF-VARIABLES NIL) (RPAQ? OBJECTIVE NIL) (RPAQ? ORIG-LEMMA-STACK NIL) (RPAQ? ORIG-LINEARIZE-ASSUMPTIONS-STACK NIL) (RPAQ? ORIGTHM NIL) (RPAQ? PARENT NIL) (RPAQ? PARENT-HIST NIL) (RPAQ? POS NIL) (RPAQ? PPR-MACRO-MEMO NIL) (RPAQ? PPRFILE NIL) (RPAQ? PROCESS NIL) (RPAQ? PROCESS-CLAUSES NIL) (RPAQ? PROCESS-HIST NIL) (RPAQ? PROP NIL) (RPAQ? PROPLIST NIL) (RPAQ? PROVE-TERMINATION-LEMMAS-USED NIL) (RPAQ? RECOGNIZER-ALIST NIL) (RPAQ? RECORD-DECLARATIONS NIL) (RPAQ? RECORD-TEMP NIL) (RPAQ? RELIEVE-HYPS-NOT-OK-ANS NIL) (RPAQ? REMAINDER NIL) (RPAQ? SCRIBE-FLG NIL) (RPAQ? SETQ-LST NIL) (RPAQ? SHELL-ALIST NIL) (RPAQ? SHELL-POCKETS NIL) (RPAQ? SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES NIL) (RPAQ? SIMPLIFY-CLAUSE-MAXIMALLY-HIST NIL) (RPAQ? SIMPLIFY-CLAUSE-POT-LST NIL) (RPAQ? SINGLETON-TYPE-SETS NIL) (RPAQ? SPACELEFT NIL) (RPAQ? STARTLIST NIL) (RPAQ? T2 NIL) (RPAQ? TEMP-TEMP NIL) (RPAQ? TEMP1 NIL) (RPAQ? TEST-LST NIL) (RPAQ? THM NIL) (RPAQ? TYPE-SET-TERM1 NIL) (RPAQ? UNDONE-EVENTS NIL) (RPAQ? UNIFY-SUBST NIL) (RPAQ? UNIVERSE NIL) (RPAQ? VAL NIL) (RPAQ? VAR-ALIST NIL) [DECLARE: EVAL@COMPILE (DATATYPE CANDIDATE (SCORE CONTROLLERS CHANGED-VARS UNCHANGEABLE-VARS TESTS-AND-ALISTS-LST JUSTIFICATION INDUCTION-TERM OTHER-TERMS)) (DATATYPE GENERALIZE-LEMMA (NAME TERM)) (DATATYPE JUSTIFICATION (SUBSET MEASURE-TERM RELATION LEMMAS)) (DATATYPE LINEAR-LEMMA (NAME HYPS CONCL MAX-TERM)) (DATATYPE LINEAR-POT (VAR POSITIVES NEGATIVES)) (DATATYPE MEASURE-RULE (CONDITION-LIST THE-LESSER STRENGTH-SIGN THE-GREATER INDUCTION-LEMMA-NAME MEASURE)) (DATATYPE POLY (CONSTANT ALIST ASSUMPTIONS LITERALS LEMMAS)) (DATATYPE REWRITE-RULE (NAME HYPS CONCL LOOP-STOPPER)) (DATATYPE TESTS-AND-ALISTS (TESTS ALISTS)) (DATATYPE TESTS-AND-CASE (TESTS CASE)) (DATATYPE TESTS-AND-CASES (TESTS CASES)) (DATATYPE TYPE-PRESCRIPTION-NAME-AND-PAIR (NAME PAIR)) (DATATYPE TYPE-RESTRICTION (TERM TYPE-SET DEFAULT)) ] (/DECLAREDATATYPE (QUOTE CANDIDATE) (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER)) (QUOTE ((CANDIDATE 0 POINTER) (CANDIDATE 2 POINTER) (CANDIDATE 4 POINTER) (CANDIDATE 6 POINTER) (CANDIDATE 8 POINTER) (CANDIDATE 10 POINTER) (CANDIDATE 12 POINTER) (CANDIDATE 14 POINTER))) (QUOTE 16)) (/DECLAREDATATYPE (QUOTE GENERALIZE-LEMMA) (QUOTE (POINTER POINTER)) (QUOTE ((GENERALIZE-LEMMA 0 POINTER) (GENERALIZE-LEMMA 2 POINTER))) (QUOTE 4)) (/DECLAREDATATYPE (QUOTE JUSTIFICATION) (QUOTE (POINTER POINTER POINTER POINTER)) (QUOTE ((JUSTIFICATION 0 POINTER) (JUSTIFICATION 2 POINTER) (JUSTIFICATION 4 POINTER) (JUSTIFICATION 6 POINTER))) (QUOTE 8)) (/DECLAREDATATYPE (QUOTE LINEAR-LEMMA) (QUOTE (POINTER POINTER POINTER POINTER)) (QUOTE ((LINEAR-LEMMA 0 POINTER) (LINEAR-LEMMA 2 POINTER) (LINEAR-LEMMA 4 POINTER) (LINEAR-LEMMA 6 POINTER))) (QUOTE 8)) (/DECLAREDATATYPE (QUOTE LINEAR-POT) (QUOTE (POINTER POINTER POINTER)) (QUOTE ((LINEAR-POT 0 POINTER) (LINEAR-POT 2 POINTER) (LINEAR-POT 4 POINTER))) (QUOTE 6)) (/DECLAREDATATYPE (QUOTE MEASURE-RULE) (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER)) (QUOTE ((MEASURE-RULE 0 POINTER) (MEASURE-RULE 2 POINTER) (MEASURE-RULE 4 POINTER) (MEASURE-RULE 6 POINTER) (MEASURE-RULE 8 POINTER) (MEASURE-RULE 10 POINTER))) (QUOTE 12)) (/DECLAREDATATYPE (QUOTE POLY) (QUOTE (POINTER POINTER POINTER POINTER POINTER)) (QUOTE ((POLY 0 POINTER) (POLY 2 POINTER) (POLY 4 POINTER) (POLY 6 POINTER) (POLY 8 POINTER))) (QUOTE 10)) (/DECLAREDATATYPE (QUOTE REWRITE-RULE) (QUOTE (POINTER POINTER POINTER POINTER)) (QUOTE ((REWRITE-RULE 0 POINTER) (REWRITE-RULE 2 POINTER) (REWRITE-RULE 4 POINTER) (REWRITE-RULE 6 POINTER))) (QUOTE 8)) (/DECLAREDATATYPE (QUOTE TESTS-AND-ALISTS) (QUOTE (POINTER POINTER)) (QUOTE ((TESTS-AND-ALISTS 0 POINTER) (TESTS-AND-ALISTS 2 POINTER))) (QUOTE 4)) (/DECLAREDATATYPE (QUOTE TESTS-AND-CASE) (QUOTE (POINTER POINTER)) (QUOTE ((TESTS-AND-CASE 0 POINTER) (TESTS-AND-CASE 2 POINTER))) (QUOTE 4)) (/DECLAREDATATYPE (QUOTE TESTS-AND-CASES) (QUOTE (POINTER POINTER)) (QUOTE ((TESTS-AND-CASES 0 POINTER) (TESTS-AND-CASES 2 POINTER))) (QUOTE 4)) (/DECLAREDATATYPE (QUOTE TYPE-PRESCRIPTION-NAME-AND-PAIR) (QUOTE (POINTER POINTER)) (QUOTE ((TYPE-PRESCRIPTION-NAME-AND-PAIR 0 POINTER) (TYPE-PRESCRIPTION-NAME-AND-PAIR 2 POINTER))) (QUOTE 4)) (/DECLAREDATATYPE (QUOTE TYPE-RESTRICTION) (QUOTE (POINTER POINTER POINTER)) (QUOTE ((TYPE-RESTRICTION 0 POINTER) (TYPE-RESTRICTION 2 POINTER) (TYPE-RESTRICTION 4 POINTER))) (QUOTE 6)) (DEFINEQ (BM-UPCASE [LAMBDA (N) (* kbr: "19-Oct-85 16:31") (COND ((AND (IGEQ N (CHARCODE a)) (ILEQ N (CHARCODE z))) (IDIFFERENCE N 32)) (T N]) (COMPILE-IF-APPROPRIATE-AND-POSSIBLE [LAMBDA (FNS) (* kbr: " 6-Jul-86 09:53") (* If a function foo is defined in our theory, a function *1*foo is defined in  Lisp. Sometimes during the course of a proof, *1*foo may be executed to compute  the value of foo on certain values. There is a speed benefit to compiling  *1*foo. In Maclisp, the compiler is not in the same Lisp with the  theorem-prover in Zetalisp, the compiler is resident.  The *.LISP files produced by MAKE-LIB may be compiled after loading the  compilation of BASIS into the compiler. Hence it is possible to obtain the  speed of compiled functions in the Maclisp version of the theorem-prover, at  the expense of making a library, running a separate compilation, and using  NOTE-LIB to load the *.LIB file and the compilation of the .LISP file.  *) (for FN in FNS do (COND ((NOT (CCODEP (GETD FN))) (COMPILE! FN]) (COPYLIST [LAMBDA (L) (* kbr: " 6-Jul-86 09:54") (* Top level copy of list L *) (for X in L collect X]) (EXTEND-FILE-NAME [LAMBDA (FILE EXTENSION) (* kbr: "19-Oct-85 16:31") (PACKFILENAME (APPEND (LIST (QUOTE EXTENSION) EXTENSION) (UNPACKFILENAME FILE]) (FIND-CHAR-IN-FILE [LAMBDA (CHAR FILE) (* kbr: "25-Oct-85 14:33") (* Assumes that FILE is a stream for a file.  Searches for the next occurrence of CHAR past current position, if any.  If one is found, the file pointer is left just after the occurrence and the  file pointer is returned. Otherwise NIL is returned.  *) (while T bind CH do (SETQ CH (TYI FILE -1)) (COND ((IEQP CH -1) (RETURN NIL)) ((IEQP CH CHAR) (RETURN (FILEPOS FILE]) (FIND-STRING-IN-FILE [LAMBDA (STRING FILE) (* kbr: "25-Oct-85 14:34") (LET ((STRING-LEN-1 (SUB1 (NCHARS STRING)))) (COND ((EQUAL STRING-LEN-1 -1) (GETFILEPTR FILE)) (T (bind (POS _ (CHCON STRING)) (CHARS _ (CHCON STRING)) (FIRST-CHAR _ (CAR CHARS)) (OTHER-CHARS _ (CDR CHARS)) (*1*+FILE-LEN-STR-LEN _ (IPLUS (GETEOFPTR FILE) (MINUS STRING-LEN-1))) while (SETQ POS (FIND-CHAR-IN-FILE FIRST-CHAR FILE)) do (COND ((AND (NOT (IGREATERP POS *1*+FILE-LEN-STR-LEN)) (for CHAR in OTHER-CHARS always (IEQP CHAR (TYI FILE)))) (RETURN (SUB1 POS))) (T (SETFILEPTR FILE POS]) (GET-TOTAL-STATS [LAMBDA (DIR) (* kbr: "25-Oct-85 14:39") (PROG (TP-TIME IO-TIME STATS) (for ROOT in (QUOTE (PROVEALL RSA WILSON GAUSS FORTRAN CONTROLLER PR TMI UNSOLV ZTAK)) do (SETQ STATS (SUM-STATS-ALIST (GET-STATS-FILE (PACKFILENAME (LIST (QUOTE DIRECTORY) DIR (QUOTE NAME) ROOT (QUOTE EXTENSION) (QUOTE PROOFS)))))) (SETQ TP-TIME (IPLUS (CAR STATS) TP-TIME)) (SETQ IO-TIME (IPLUS (CADR STATS) IO-TIME))) (RETURN (LIST TP-TIME IO-TIME]) (GET-FROM-FILE [LAMBDA (ATM PROP) (* kbr: "25-Oct-85 14:39") (for TAIL on (GET-PLIST-FROM-FILE ATM) by (QUOTE CDDR) when (EQ PROP (CAR TAIL)) do (RETURN (CADR TAIL]) (GET-PLIST-FROM-FILE [LAMBDA (ATM) (* kbr: " 6-Jul-86 09:57") (LET ((LOC (GETPROP ATM (QUOTE LIB-LOC)))) (COND ((NULL LOC) NIL) ((NOT (BOUNDP (QUOTE LIB-FILE))) NIL) (T (SETFILEPTR LIB-FILE LOC) (CADR (CADDR (READ LIB-FILE]) (GET-STATS-FILE [LAMBDA (FILE) (* kbr: "25-Oct-85 14:41") (* Returns a list of triplets  (event cpu io), where cpu is the  number of elapsed seconds minus io  seconds. *) (LET ((EVENT-CHAR (NTHCHARCODE EVENT-SEPARATOR-STRING 1)) (EOF-CONS (CONS NIL NIL)) TEMP TP-TIME IO-TIME) (SETQ FILE (OPENSTREAM FILE (QUOTE INPUT))) (SETFILEPTR FILE 0) (while (AND (FIND-CHAR-IN-FILE EVENT-CHAR FILE) (NEQ EOF-CONS (SETQ TEMP (READ FILE EOF-CONS))) (FIND-CHAR-IN-FILE #/ FILE) (NUMBERP (SETQ TP-TIME (READ FILE EOF-CONS))) (NUMBERP (SETQ IO-TIME (READ FILE EOF-CONS)))) collect (CONS TEMP (LIST TP-TIME IO-TIME]) (BM-PRIN1 [LAMBDA (DATA FILE) (* kbr: "19-Oct-85 16:31") (PATOM DATA FILE]) (PRINT-SYSTEM [LAMBDA (FILE) (* kbr: "24-Oct-85 16:32") (PRIN1 (QUOTE SYSTEM) FILE) (TERPRI FILE) (PRIN1 "0.0 0.0" FILE) (for FL in THEOREM-PROVER-FILES do (PRINT (CDR (CAR (GETPROP FL (QUOTE FILEDATES)))))) (PRIN1 MAKESYSNAME FILE) (PRIN1 " " FILE) (PRIN1 MAKESYSDATE FILE) (TERPRI FILE]) (PRINT-DATE-LINE [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (PRIN1 (GDATE) PROVE-FILE]) (RANDOM-INITIALIZATION [LAMBDA (EVENT) (* kbr: "19-Oct-85 16:31") (RANDSET (QUOTE (14106 39422 64835 57733 34919 5315 12110 15116 10133 10816 60097 23088 5624 21340 53921 15106 4684 41739 64042 23754 16272 2980 45652 52345 2362 36658 65286 43318 47346 39405 37667 44583 35376 23651 7908 33877 32302 22146 63687 45438 51385 11636 43707 59964 45045 48385 64260 37257 4475 14893 14979 48212 48490 22654 29015]) (RANDOM-NUMBER [LAMBDA (N) (* kbr: "24-Oct-85 17:15") (RAND 0 (SUB1 N]) (READ-FILE [LAMBDA (FILE-NAME) (* kbr: "25-Oct-85 14:42") (LET ((FILE (OPENSTREAM FILE-NAME (QUOTE INPUT))) (MY-CONS (CONS NIL NIL))) (bind TEMP while (NEQ MY-CONS (SETQ TEMP (READ FILE MY-CONS))) collect TEMP]) (REMQ [LAMBDA (I L) (* kbr: "19-Oct-85 16:31") (for X in L unless (EQ X I) collect X]) (STORE-DEFINITION [LAMBDA (ATM EXPR) (* kbr: " 6-Jul-86 10:05") (PUTD ATM EXPR) (COMPILE! ATM]) (SWAP-OUT [LAMBDA (NAME) (* kbr: " 3-Nov-85 17:04") (APPLY (FUNCTION NOTE-LIB) (MAKE-LIB NAME]) (R-LOOP [LAMBDA NIL (* kbr: "20-Oct-85 17:25") (while T do (TERPRI NIL) (PRIN2 (QUOTE *) NIL) (BM-PPR (R (PROG1 (READ NIL) (TERPRI NIL))) NIL]) (TIME-IT [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (LET ((START-TIME (TIME-IN-60THS))) (LIST (EVAL FORM) (QUOTIENT (DIFFERENCE (TIME-IN-60THS) START-TIME) 60.0]) (TIME-IN-60THS [LAMBDA NIL (* kbr: " 6-Jul-86 10:10") (IQUOTIENT (ITIMES 60 (CLOCK 2)) 1000]) (XSEARCH [LAMBDA (STRINGS FILE-SPECS) (* kbr: "25-Oct-85 14:28") (COND ((NLISTP STRINGS) (SETQ STRINGS (LIST STRINGS)))) (COND ((NLISTP FILE-SPECS) (SETQ FILE-SPECS (LIST FILE-SPECS)))) (for L in (for FILE-SPEC in FILE-SPECS join (LIST (LIST FILE-SPEC))) bind NAME FILE when (AND (CAR L) (PROGN (TERPRI T) (SETQ NAME (CAR L)) (PRIN1 NAME T) (SETQ FILE (OPENSTREAM NAME (QUOTE INPUT))) (PROG1 (for STRING in STRINGS thereis (PROGN (SETFILEPTR FILE 0) (FIND-STRING-IN-FILE STRING FILE ))) (CLOSE? FILE)))) collect (PROGN (PRIN1 "Yes." T) NAME]) (*1*CAR [LAMBDA (X1) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP X1) 0) ((EQ (CAR X1) (QUOTE *1*QUOTE)) 0) (T (CAR X1]) (*1*CDR [LAMBDA (X1) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP X1) 0) ((EQ (CAR X1) (QUOTE *1*QUOTE)) 0) (T (CDR X1]) (ADD-TO-SET [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (COND ((MEMBER X Y) Y) (T (CONS X Y]) (ARGN-MACRO [LAMBDA (TAIL) (* kbr: "19-Oct-85 16:31") (COND ((FIXP (CADR TAIL)) (SUB-PAIR (QUOTE (TERM CELL N)) (LIST (CAR TAIL) (CELL (CADR TAIL) (QUOTE TEMP-TEMP)) (CADR TAIL)) (QUOTE (COND ((NEQ (CAR (SETQ TEMP-TEMP TERM)) (QUOTE QUOTE)) (CAR CELL)) (T (ARGN0 TEMP-TEMP N)))))) (T (CONS (QUOTE ARGN0) TAIL]) (BINDINGS-MACRO [LAMBDA (TAIL) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP TAIL) NIL) (T (BQUOTE (CONS (CONS (\, (CAR TAIL)) (\, (CADR TAIL))) (\, (BINDINGS-MACRO (CDDR TAIL]) (CELL [LAMBDA (N FIELD) (* kbr: "19-Oct-85 16:31") (COND ((IEQP N 0) FIELD) (T (LIST (QUOTE CDR) (CELL (SUB1 N) FIELD]) (CREATE-LEMMA-STACK [LAMBDA (N) (* kbr: "19-Oct-85 21:55") (SETQ ORIG-LEMMA-STACK (SETQ LEMMA-STACK NIL)) NIL]) (CREATE-LINEARIZE-ASSUMPTIONS-STACK [LAMBDA (N) (* kbr: "19-Oct-85 22:00") (SETQ ORIG-LINEARIZE-ASSUMPTIONS-STACK (SETQ LINEARIZE-ASSUMPTIONS-STACK NIL)) NIL]) (CREATE-STACK1 [LAMBDA (N) (* kbr: "19-Oct-85 16:31") (LET (STK) (SETQ STK (for I from 1 to (ITIMES 2 N) collect NIL)) (for TAIL on STK by (QUOTE CDDR) until (NULL (CDDR TAIL)) do (RPLACA (CDDDR TAIL) TAIL)) STK]) (FARGN-MACRO [LAMBDA (TAIL) (* kbr: "20-Oct-85 13:40") (* (BM-NTH (CADR TAIL)  (CAR TAIL)) *) (COND ((FIXP (CADR TAIL)) (LIST (QUOTE CAR) (CELL (CADR TAIL) (CAR TAIL)))) (T (LIST (QUOTE BM-NTH) (CADR TAIL) (CAR TAIL]) (FN-SYMB-MACRO [LAMBDA (TAIL) (* kbr: "19-Oct-85 16:31") (SUBST (CAR TAIL) (QUOTE TERM) (QUOTE (COND ((NEQ (QUOTE QUOTE) (CAR (SETQ TEMP-TEMP TERM))) (CAR TEMP-TEMP)) (T (FN-SYMB0 (CADR TEMP-TEMP]) (HLOAD [LAMBDA (FILE) (* kbr: " 6-Jul-86 10:16") (* Horrible LOAD. *) (PROG (STREAM EXPR) (SETQ STREAM (OPENSTREAM FILE (QUOTE INPUT))) (until (EQ (SETQ EXPR (HREAD STREAM)) (QUOTE STOP)) do (EVAL EXPR)) (RETURN (CLOSEF STREAM]) (IPOSITION [LAMBDA (FILE N FLG) (* kbr: "19-Oct-85 16:31") (LET (PAIR) (COND ((NULL (SETQ PAIR (ASSOC FILE IPOSITION-ALIST))) (SETQ IPOSITION-ALIST (CONS (SETQ PAIR (CONS FILE 0)) IPOSITION-ALIST)))) (COND ((NULL N) (CDR PAIR)) (FLG (PROG1 (CDR PAIR) (RPLACD PAIR (IPLUS N (CDR PAIR))))) (T (PROG1 (CDR PAIR) (RPLACD PAIR N]) (ITERPRI [LAMBDA (FILE) (* kbr: "19-Oct-85 16:31") (IPOSITION FILE 0 NIL) (TERPRI FILE]) (ITERPRIN [LAMBDA (N FILE) (* kbr: "19-Oct-85 16:31") (for I from 1 to N do (ITERPRI FILE]) (ITERPRISPACES [LAMBDA (N FILE) (* kbr: "19-Oct-85 16:31") (ITERPRI FILE) (TABULATE N FILE]) (IPRIN1 [LAMBDA (X FILE) (* kbr: "19-Oct-85 16:31") (IPOSITION FILE (NCHARS X) T) (PRIN2 X FILE]) (IPRINC [LAMBDA (X FILE) (* kbr: "19-Oct-85 16:31") (IPOSITION FILE (NCHARS X) T) (PRIN1 X FILE]) (IPRINT [LAMBDA (X FILE) (* kbr: "19-Oct-85 16:31") (IPOSITION FILE (NCHARS X) NIL) (PRINT X FILE]) (ISPACES [LAMBDA (N FILE) (* kbr: "19-Oct-85 16:31") (COND ((ILEQ N 0) NIL) (T (IPOSITION FILE N T) (for I from 1 to N do (PRIN1 " " FILE]) (KILL-DEFINITION [LAMBDA (FN) (* kbr: "17-Nov-85 15:37") (PUTD FN NIL]) (LINEL [LAMBDA (FILE N) (* kbr: "19-Oct-85 16:31") (LINELENGTH N FILE]) (MAKE-LIB [LAMBDA (FILE) (* kbr: "30-Sep-86 14:05") (PROG (TEMP PROP-FILE FN-FILE FILE-PLIST REVERSED-LIB-PROPS) (SETQ REVERSED-LIB-PROPS (REVERSE LIB-PROPS)) (SETQ PROP-FILE (OPENSTREAM (EXTEND-FILE-NAME FILE (QUOTE LIB)) (QUOTE OUTPUT))) (PRINT (LIST (QUOTE INIT-LIB) (KWOTE LIB-PROPS) (KWOTE LIB-VARS)) PROP-FILE) (for VAR in LIB-VARS do (PRINT (LIST (QUOTE SETQ) VAR (KWOTE (GETTOPVAL VAR))) PROP-FILE)) (PRINT (LIST (QUOTE SETQ) (QUOTE LIB-ATOMS-WITH-PROPS) (KWOTE LIB-ATOMS-WITH-PROPS)) PROP-FILE) (PRINT (LIST (QUOTE SETQ) (QUOTE LIB-ATOMS-WITH-DEFS) (KWOTE LIB-ATOMS-WITH-DEFS)) PROP-FILE) (for ATM in LIB-ATOMS-WITH-PROPS do (HPRINT (LIST (QUOTE PUT1-LST) (KWOTE ATM) (KWOTE (for PROP in REVERSED-LIB-PROPS join (COND ((SETQ TEMP (MEMB PROP (GETPROPLIST ATM))) (LIST PROP (CADR TEMP))))))) PROP-FILE)) (for ATM in (REVERSE LIB-ATOMS-WITH-DEFS) do (HPRINT (LIST (QUOTE PUT1-LST) (KWOTE ATM) (KWOTE (LIST (QUOTE SEXPR) (LIST (QUOTE LAMBDA) (CADR (SETQ TEMP (GETPROP ATM (QUOTE SEXPR)))) (CADDR TEMP))))) PROP-FILE)) (PRINT (QUOTE STOP) PROP-FILE) (SETQ PROP-FILE (CLOSEF PROP-FILE)) (SETQ FILECOMS (FILECOMS FILE)) (SET FILECOMS (LIST (CONS (QUOTE FNS) (REVERSE LIB-ATOMS-WITH-DEFS)))) (SETQ FN-FILE (BCOMPL (MAKEFILE FILE (QUOTE NEW)))) (RETURN (LIST PROP-FILE FN-FILE]) (MATCH-MACRO [LAMBDA (TERM PAT) (* kbr: "19-Oct-85 16:31") (COND ((LISTP TERM) (LIST (QUOTE PROGN) (LIST (QUOTE SETQ) (QUOTE MATCH-TEMP) TERM) (MATCH1-MACRO (QUOTE MATCH-TEMP) PAT))) (T (MATCH1-MACRO TERM PAT]) (MATCH!-MACRO [LAMBDA (TERM PAT) (* kbr: "24-Oct-85 16:37") (LIST (QUOTE OR) (MATCH-MACRO TERM PAT) (QUOTE (ERROR "MATCH! failed!"]) (MATCH1-MACRO [LAMBDA (TERM PAT) (* kbr: "19-Oct-85 16:31") (LET (TEST-LST SETQ-LST) (MATCH2-MACRO TERM PAT) (LIST (QUOTE COND) (CONS (COND ((NULL TEST-LST) T) ((NULL (CDR TEST-LST)) (CAR TEST-LST)) (T (CONS (QUOTE AND) TEST-LST))) (NCONC1 SETQ-LST T]) (MATCH2-MACRO [LAMBDA (TERM PAT) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP PAT) (COND ((EQ PAT (QUOTE &)) NIL) ((OR (EQ PAT T) (EQ PAT NIL)) (PRIN1 "***** Attempt to smash T or NIL ignored *****" T) (TERPRI T) (SPACES 6 T) (PRIN2 (CONS (QUOTE BM-MATCH) MATCH-X) T) (ITERPRI T)) ((LITATOM PAT) (SETQ SETQ-LST (NCONC1 SETQ-LST (LIST (QUOTE SETQ) PAT TERM)))) (T (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE EQUAL) PAT TERM)))))) ((EQ (QUOTE CONS) (CAR PAT)) (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE LISTP) TERM))) (MATCH2-MACRO (LIST (QUOTE CAR) TERM) (CADR PAT)) (MATCH2-MACRO (LIST (QUOTE CDR) TERM) (CADDR PAT))) ((EQ (QUOTE QUOTE) (CAR PAT)) (COND ((LITATOM (CADR PAT)) (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE EQ) (LIST (QUOTE QUOTE) (CADR PAT)) TERM)))) (T (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE EQUAL) (LIST (QUOTE QUOTE) (CADR PAT)) TERM)))))) (T (COND ((NEQ (CAR PAT) (QUOTE LIST)) (SETQ PAT (CONS (QUOTE LIST) (CONS (LIST (QUOTE QUOTE) (CAR PAT)) (CDR PAT)))))) (for SUBPAT in (CDR PAT) do (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE LISTP) TERM))) (MATCH2-MACRO (LIST (QUOTE CAR) TERM) SUBPAT) (SETQ TERM (LIST (QUOTE CDR) TERM))) (SETQ TEST-LST (NCONC1 TEST-LST (LIST (QUOTE EQ) TERM NIL]) (NOTE-LIB [LAMBDA (FILE) (* kbr: " 8-Nov-85 15:47") (PROG (FILE1 FILE2) (SETQ FILE1 (EXTEND-FILE-NAME FILE (QUOTE LIB))) (SETQ FILE2 (EXTEND-FILE-NAME FILE (QUOTE DCOM))) (COND ((BOUNDP (QUOTE LIB-FILE)) (KILL-LIB))) (RETURN (LIST (SETQ LIB-FILE (HLOAD FILE1)) (LOAD FILE2]) (BM-NTH [LAMBDA (N LIST) (* kbr: "19-Oct-85 18:37") (CAR (NTH LIST N]) (PREPARE-FOR-THE-NIGHT [LAMBDA NIL (* kbr: "19-Oct-85 16:31") NIL]) (SPELL-NUMBER [LAMBDA (N) (* kbr: "26-Oct-85 16:31") (SELECTQ N (0 (QUOTE ZERO)) (1 (QUOTE ONE)) (2 (QUOTE TWO)) (3 (QUOTE THREE)) (4 (QUOTE FOUR)) (5 (QUOTE FIVE)) (6 (QUOTE SIX)) (7 (QUOTE SEVEN)) (8 (QUOTE EIGHT)) (9 (QUOTE NINE)) (10 (QUOTE TEN)) N]) (SUB-PAIR [LAMBDA (L1 L2 X) (* kbr: " 6-Jul-86 10:21") (* * Substitution function. This is like  (SUBLIS (PAIRLIST L1 L2) X) *) (COND ((for Z in L2 as Y in L1 when (EQUAL Y X) thereis (PROGN (SETQ TEMP-TEMP Z) T)) TEMP-TEMP) ((NLISTP X) X) (T (CONS (SUB-PAIR L1 L2 (CAR X)) (SUB-PAIR L1 L2 (CDR X]) (UNIONQ [LAMBDA (LIST1 LIST2) (* kbr: "17-Nov-85 15:41") (PROG (ANSWER) (SETQ ANSWER LIST2) (for ELEMENT in LIST1 when (NOT (MEMB ELEMENT ANSWER)) do (push ANSWER ELEMENT)) (RETURN ANSWER]) ) (SETQ LEMMA-STACK (CREATE-LEMMA-STACK 10)) (SETQ LINEARIZE-ASSUMPTIONS-STACK (CREATE-LINEARIZE-ASSUMPTIONS-STACK 10)) (RPAQQ CODE-1-ACOMS ((* CODE-1-A *) (FNS *1*ADD1 *1*AND *1*CONS *1*COUNT *1*DIFFERENCE *1*EQUAL *1*FALSE *1*FALSEP *1*FIX *1*IMPLIES *1*LESSP *1*LISTP *1*LITATOM *1*MINUS *1*NEGATIVE-GUTS *1*NEGATIVEP *1*NLISTP *1*NOT *1*NUMBERP *1*OR *1*PACK *1*PLUS *1*QUOTIENT *1*REMAINDER *1*SUB1 *1*TIMES *1*TRUE *1*TRUEP *1*UNPACK *1*ZERO *1*ZEROP ABBREVIATIONP ABBREVIATIONP1 ACCEPTABLE-TYPE-PRESCRIPTION-LEMMAP ACCESS-ERROR ADD-AXIOM1 ADD-DCELL ADD-ELIM-LEMMA ADD-EQUATION ADD-EQUATIONS ADD-EQUATIONS-TO-POT-LST ADD-FACT ADD-GENERALIZE-LEMMA ADD-LEMMA ADD-LEMMA0 ADD-LESSP-ASSUMPTION-TO-POLY ADD-LINEAR-TERM ADD-LINEAR-VARIABLE ADD-LINEAR-VARIABLE1 ADD-LITERAL ADD-META-LEMMA ADD-NOT-EQUAL-0-ASSUMPTION-TO-POLY ADD-NOT-LESSP-ASSUMPTION-TO-POLY ADD-NUMBERP-ASSUMPTION-TO-POLY ADD-PROCESS-HIST ADD-REWRITE-LEMMA ADD-SHELL-ROUTINES ADD-SHELL0 ADD-SUB-FACT ADD-TERM-TO-POT-LST ADD-TERMS-TO-POT-LST ADD-TO-SET-EQ ADD-TYPE-SET-LEMMAS ALL-ARGLISTS ALL-FNNAMES ALL-FNNAMES-LST ALL-FNNAMES1 ALL-FNNAMES1-EVG ALL-INSERTIONS ALL-PATHS ALL-PERMUTATIONS ALL-PICKS ALL-SUBSEQUENCES ALL-VARS ALL-VARS-BAG ALL-VARS-BAG1 ALL-VARS-LST ALL-VARS1 ALMOST-SUBSUMES ALMOST-SUBSUMES-LOOP ALMOST-VALUEP ALMOST-VALUEP1 APPLY-HINTS APPLY-INDUCT-HINT APPLY-USE-HINT ARG1-IN-ARG2-UNIFY-SUBST ARGN0 ARITY ASSOC-OF-APPEND ASSUME-TRUE-FALSE ATTEMPT-TO-REWRITE-RECOGNIZER))) (* CODE-1-A *) (DEFINEQ (*1*ADD1 [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSEQP 0 X)) (ADD1 X)) (T 1]) (*1*AND [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (*1*IF X (*1*IF Y *1*T *1*F) *1*F]) (*1*CONS [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (CONS X Y]) (*1*COUNT [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP X) (COND ((EQ X *1*T) 0) ((EQ X *1*F) 0) ((LITATOM X) (ADD1 (*1*COUNT (DTACK-0-ON-END (CHCON X))))) ((LESSP X 0) (ADD1 (MINUS X))) (T X))) ((EQ *1*SHELL-QUOTE-MARK (CAR X)) (COND ((MEMB (CADR X) *1*BTM-OBJECTS) 0) (T (ADD1 (for ARG in (CDDR X) sum (*1*COUNT ARG)))))) (T (ADD1 (PLUS (*1*COUNT (CAR X)) (*1*COUNT (CDR X]) (*1*DIFFERENCE [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (COND ((GREATERP (SETQ I (*1*FIX I)) (SETQ J (*1*FIX J))) (DIFFERENCE I J)) (T 0]) (*1*EQUAL [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL X Y) *1*T) (T *1*F]) (*1*FALSE [LAMBDA NIL (* kbr: "19-Oct-85 16:31") *1*F]) (*1*FALSEP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((EQ X *1*F) *1*T) (T *1*F]) (*1*FIX [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSEQP 0 X)) X) (T 0]) (*1*IMPLIES [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (*1*IF X (*1*IF Y *1*T *1*F) *1*T]) (*1*LESSP [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (COND ((LESSP (*1*FIX X) (*1*FIX Y)) *1*T) (T *1*F]) (*1*LISTP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (LISTP X) (NEQ (CAR X) *1*SHELL-QUOTE-MARK)) *1*T) (T *1*F]) (*1*LITATOM [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((OR (AND (LITATOM X) (NEQ X *1*T) (NEQ X *1*F)) (AND (LISTP X) (EQ (CAR X) *1*SHELL-QUOTE-MARK) (EQ (CADR X) (QUOTE PACK)))) *1*T) (T *1*F]) (*1*MINUS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSP 0 X)) (MINUS X)) (T (LIST *1*SHELL-QUOTE-MARK (QUOTE MINUS) 0]) (*1*NEGATIVE-GUTS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSP X 0)) (MINUS X)) (T 0]) (*1*NEGATIVEP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((OR (AND (FIXP X) (LESSP X 0)) (AND (LISTP X) (EQ (CAR X) *1*SHELL-QUOTE-MARK) (EQ (CADR X) (QUOTE MINUS)))) *1*T) (T *1*F]) (*1*NLISTP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (LISTP X) (NEQ (CAR X) *1*SHELL-QUOTE-MARK)) *1*F) (T *1*T]) (*1*NOT [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (*1*IF X *1*F *1*T]) (*1*NUMBERP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSEQP 0 X)) *1*T) (T *1*F]) (*1*OR [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (*1*IF X *1*T (*1*IF Y *1*T *1*F]) (*1*PACK [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (LEGAL-CHAR-CODE-SEQ X) (EQUAL 0 (CDR (LAST X)))) (TP-IMPLODE (for TAIL on X until (NLISTP TAIL) collect (CHARACTER (CAR TAIL))))) (T (LIST *1*SHELL-QUOTE-MARK (QUOTE PACK) X]) (*1*PLUS [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (PLUS (*1*FIX X) (*1*FIX Y]) (*1*QUOTIENT [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL 0 (SETQ J (*1*FIX J))) 0) (T (QUOTIENT (*1*FIX I) J]) (*1*REMAINDER [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL 0 (SETQ J (*1*FIX J))) (*1*FIX I)) (T (REMAINDER (*1*FIX I) J]) (*1*SUB1 [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (FIXP X) (LESSP 0 X)) (SUB1 X)) (T 0]) (*1*TIMES [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (TIMES (*1*FIX I) (*1*FIX J]) (*1*TRUE [LAMBDA NIL (* kbr: "19-Oct-85 16:31") *1*T]) (*1*TRUEP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((EQ X *1*T) *1*T) (T *1*F]) (*1*UNPACK [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((AND (LITATOM X) (NEQ X *1*T) (NEQ X *1*F)) (LET ((TEMP (CHCON X))) (RPLACD (LAST TEMP) 0) TEMP)) ((AND (LISTP X) (EQ *1*SHELL-QUOTE-MARK (CAR X)) (EQ (CADR X) (QUOTE PACK))) (CADDR X)) (T 0]) (*1*ZERO [LAMBDA NIL (* kbr: "19-Oct-85 16:31") 0]) (*1*ZEROP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((FIXP X) (COND ((LESSP X 1) *1*T) (T *1*F))) (T *1*T]) (ABBREVIATIONP [LAMBDA (VARS TERM) (* kbr: "19-Oct-85 16:31") (* Suppose VARS is the bag of vars in a term LHS.  Then we say LHS=TERM is an abbreviation if the bag of vars occurring in TERM is  a subbag of VARS and TERM contains no IF, AND, OR, NOT, or IMPLIES.  The property of VARS that we actually check is that the number of occurrences  of vars in TERM is no greater than the length of VARS.  *) (LET ((ANS VARS)) (ABBREVIATIONP1 TERM]) (ABBREVIATIONP1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (COND ((NLISTP ANS) NIL) (T (SETQ ANS (CDR ANS)) T))) ((FQUOTEP TERM) T) ((MEMB (FFN-SYMB TERM) (QUOTE (IF AND OR NOT IMPLIES))) NIL) (T (for X in (FARGS TERM) always (ABBREVIATIONP1 X]) (ACCEPTABLE-TYPE-PRESCRIPTION-LEMMAP [LAMBDA (HYPS CONCL) (* kbr: "20-Oct-85 19:47") (* If (IMPLIES HYPS CONCL) is a type prescription lemma for some function  symbol, compute the function symbol and return the function symbol consed onto  the type prescription described by the lemma.  Otherwise return NIL. *) (PROG (TERM RECOG CLAUSES VARS NEGFLG CONST ARG VAR) (* Set TERM to the IF form of  (IMPLIES HYP CONCL) . *) (SETQ TERM (EXPAND-NON-REC-FNS (FCONS-TERM* (QUOTE IF) (CONJOIN HYPS T) (FCONS-TERM* (QUOTE IF) CONCL TRUE FALSE) TRUE))) (* Acceptable type prescription lemmas  must contain exactly one function  symbol other than IF, EQUAL,  recognizers and singleton  constructors. *) (COND ((NOT (IEQP 1 (for FN in (ALL-FNNAMES TERM) count (AND (NOT (ASSOC FN RECOGNIZER-ALIST)) (NOT (  SINGLETON-CONSTRUCTOR-TO-RECOGNIZER FN)))))) (RETURN NIL))) (* Consider a clause in the clausification of a type prescription lemma.  You should be able to divide the literals into two sets.  The first set should consist entirely of recognizers applied to some term  (fn v1 ... vn) or of negations of recognizers applied to such a term.  The second set should consist entirely of equations between that term and some  of the variables vi. Actually, some literals are of the form  (EQUAL term (TRUE)) but these are equivalent to  (TRUEP term) . *) (SETQ CLAUSES (CLAUSIFY TERM)) (* We now map over CLAUSES and replace all atoms of the form  (EQUAL & (singleton)) by (singletonp &) just to reduce the number of cases.  *) (SETQ CLAUSES (for CL in CLAUSES collect (for LIT in CL collect (PROGN (SETQ NEGFLG (BM-MATCH LIT (NOT LIT))) (SETQ LIT (COND ((OR (AND (BM-MATCH LIT (EQUAL TERM CONST)) (NVARIABLEP CONST) (SETQ TEMP-TEMP (  SINGLETON-CONSTRUCTOR-TO-RECOGNIZER (FN-SYMB CONST)))) (AND (BM-MATCH LIT (EQUAL CONST TERM)) (NVARIABLEP CONST) (SETQ TEMP-TEMP (  SINGLETON-CONSTRUCTOR-TO-RECOGNIZER (FN-SYMB CONST))))) (FCONS-TERM* TEMP-TEMP TERM)) (T LIT))) (COND (NEGFLG (FCONS-TERM* (QUOTE NOT) LIT)) (T LIT)))))) (* We now try to find the function that this supposed type prescription is  about. We look at the first literal of the first clause and it had better be a  recognizer applied to something, a NOT recognizer applied to something, or the  equality of a non variable something and another term.  If we can find such a something, we set it to TERM.  Otherwise, we say this is not a type prescription lemma.  *) (COND ((NOT (AND (LISTP CLAUSES) (LISTP (CAR CLAUSES)) (OR (AND (BM-MATCH (CAAR CLAUSES) (NOT (LIST RECOG TERM))) (ASSOC RECOG RECOGNIZER-ALIST)) (AND (BM-MATCH (CAAR CLAUSES) (LIST RECOG TERM)) (ASSOC RECOG RECOGNIZER-ALIST)) (AND (BM-MATCH (CAAR CLAUSES) (EQUAL TERM &)) (NVARIABLEP TERM)) (AND (BM-MATCH (CAAR CLAUSES) (EQUAL & TERM)) (NVARIABLEP TERM))))) (RETURN NIL))) (* TERM must be a function application  to distinct variables.  *) (COND ((NOT (AND (NVARIABLEP TERM) (for ARG in (SARGS TERM) always (VARIABLEP ARG)) (NO-DUPLICATESP (SARGS TERM)))) (RETURN NIL))) (* Every literal of every clause must be a recognizer applied to TERM, the  negation of a recognizer applied to TERM, or the equality between TERM and one  of the vars in its arglist. As a side-effect of this check, we collect in VARS  all of the variables equated to TERM. *) (COND ((NOT (for CL in CLAUSES always (for LIT in CL always (OR (AND (BM-MATCH LIT (LIST RECOG ARG)) (ASSOC RECOG RECOGNIZER-ALIST) (EQUAL ARG TERM)) (AND (BM-MATCH LIT (NOT (LIST RECOG ARG))) (ASSOC RECOG RECOGNIZER-ALIST) (EQUAL ARG TERM)) (AND (BM-MATCH LIT (EQUAL ARG VAR)) (EQUAL ARG TERM) (MEMB VAR (SARGS TERM)) (SETQ VARS (ADD-TO-SET VAR VARS))) (AND (BM-MATCH LIT (EQUAL VAR ARG)) (EQUAL ARG TERM) (MEMB VAR (SARGS TERM)) (SETQ VARS (ADD-TO-SET VAR VARS))))))) (RETURN NIL))) (* Every clause must contain the same set of equations of TERM with vars.  Since VARS contains all of the vars ever equated with TERM in any clause, all  that remains is to make sure that every clause contains an equation with each  var in VARS. *) (COND ((NOT (for VAR in VARS always (for CL in CLAUSES always (OR (MEMBER (FCONS-TERM* (QUOTE EQUAL) TERM VAR) CL) (MEMBER (FCONS-TERM* (QUOTE EQUAL) VAR TERM) CL))))) (RETURN NIL))) (* So we believe that (IMPLIES HYP CONCL) is a type prescription lemma.  Return the function symbol of TERM, consed onto the type prescription.  The type prescription is itself a cons of the type bits and flags indicating  which args are in VARS. The type bits are obtained by anding together the  disjunction of recognizers in each clause.  *) (RETURN (CONS (FN-SYMB TERM) (CONS (for CL in CLAUSES bind (LOOP-ANS _ -1) do (SETQ LOOP-ANS (LOGAND LOOP-ANS (for LIT in CL bind (LOOP-ANS _ 0) when (NEQ (FN-SYMB LIT) (QUOTE EQUAL)) do (SETQ LOOP-ANS (LOGOR LOOP-ANS (COND ((BM-MATCH LIT (NOT LIT)) (LOGNOT (CDR (SASSOC (FN-SYMB LIT) RECOGNIZER-ALIST)))) (T (CDR (SASSOC (FN-SYMB LIT) RECOGNIZER-ALIST)))))) finally (RETURN LOOP-ANS)))) finally (RETURN LOOP-ANS)) (for V in (SARGS TERM) collect (COND ((MEMB V VARS) T) (T NIL]) (ACCESS-ERROR [LAMBDA (REC) (* kbr: "19-Oct-85 16:31") (ERROR1 (PQUOTE (PROGN ATTEMPT TO USE A RECORD OF THE WRONG TYPE (!PPR REC NIL))) (BINDINGS (QUOTE REC) REC) (QUOTE HARD]) (ADD-AXIOM1 [LAMBDA (NAME TYPES TERM) (* kbr: "19-Oct-85 16:31") (* Note that this function is not really a subroutine of ADD-AXIOM which must  check that the term is a legal axiom of the types requested and then set up for  an event. This function is used by ADD-SHELL0 and the boot strapping to add  axioms without creating events. If the system were static those calls of  ADD-AXIOM1 could be replaced by ADD-LEMMA0 since we know the lemmas we add are  always acceptable. However, we still run the acceptability checks just in case  we someday change the criteria for acceptance but forget to change the built in  additions of axioms. *) (CHK-ACCEPTABLE-LEMMA NAME TYPES TERM) (ADD-LEMMA0 NAME TYPES TERM]) (ADD-DCELL [LAMBDA (NAME *1*NAME EXPR) (* kbr: "19-Oct-85 16:31") (ADD-FACT NAME (QUOTE LISP-CODE) *1*NAME) (ADD-FACT *1*NAME (QUOTE DCELL) EXPR]) (ADD-ELIM-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "20-Oct-85 15:45") TYPE (LET (HYPS CONCL REWRITE-RULE DESTS) (SETQ TEMP-TEMP (UNPRETTYIFY TERM)) (SETQ HYPS (CAR (CAR TEMP-TEMP))) (SETQ CONCL (CDR (CAR TEMP-TEMP))) (SETQ DESTS (DESTRUCTORS (LIST (ARGN CONCL 1)))) (SETQ REWRITE-RULE (CREATE-REWRITE-RULE NAME HYPS CONCL NIL)) (for X in DESTS do (ADD-FACT (FN-SYMB X) (QUOTE ELIMINATE-DESTRUCTORS-SEQ) REWRITE-RULE) (ADD-FACT (FN-SYMB X) (QUOTE ELIMINATE-DESTRUCTORS-DESTS) (CONS X (REMOVE X DESTS)))) NIL]) (ADD-EQUATION [LAMBDA (EQUATION POT-LST) (* kbr: "22-Oct-85 14:08") (* This function returns an EQ POT-LST  in the event that EQUATION caused  nothing to change. *) (LET (ADD-EQUATION-ANS TO-DO-NEXT NEW-POT-- NEW-POT-+) (COND ((OR (NULL POT-LST) (NOT (TERM-ORDER (fetch (LINEAR-POT VAR) of (CAR POT-LST)) (FIRST-VAR EQUATION)))) (SETQ ADD-EQUATIONS-TO-DO (COND ((SETQ TEMP-TEMP (CANCEL-POSITIVE EQUATION)) (LIST TEMP-TEMP)) (T NIL))) (CONS (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (create LINEAR-POT VAR _ (FIRST-VAR EQUATION) POSITIVES _ (LIST EQUATION))) (T (create LINEAR-POT VAR _ (FIRST-VAR EQUATION) NEGATIVES _ (LIST EQUATION)))) POT-LST)) ((EQUAL (fetch (LINEAR-POT VAR) of (CAR POT-LST)) (FIRST-VAR EQUATION)) (COND ((POLY-MEMBER EQUATION (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST))) (T (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST))))) (SETQ ADD-EQUATIONS-TO-DO NIL) POT-LST) (T (SETQ ADD-EQUATIONS-TO-DO (for EQUATION1 in (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST))) (T (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST)))) bind TEMP unless (OR (TO-BE-IGNOREDP EQUATION1) (NULL (SETQ TEMP (CANCEL EQUATION EQUATION1)))) collect TEMP)) (COND ((SETQ TEMP-TEMP (CANCEL-POSITIVE EQUATION)) (SETQ ADD-EQUATIONS-TO-DO (CONS TEMP-TEMP ADD-EQUATIONS-TO-DO)))) (CONS (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (create LINEAR-POT VAR _ (fetch (LINEAR-POT VAR) of (CAR POT-LST)) POSITIVES _ (CONS EQUATION (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST))) NEGATIVES _ (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST)))) (T (create LINEAR-POT VAR _ (fetch (LINEAR-POT VAR) of (CAR POT-LST)) POSITIVES _ (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST)) NEGATIVES _ (CONS EQUATION (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST)))))) (CDR POT-LST))))) (T (SETQ ADD-EQUATION-ANS (ADD-EQUATION EQUATION (CDR POT-LST))) (SETQ TO-DO-NEXT NIL) (SETQ NEW-POT-+ (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST))) (SETQ NEW-POT-- (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST))) (for EQUATION in ADD-EQUATIONS-TO-DO do (COND ((EQUAL (fetch (LINEAR-POT VAR) of (CAR POT-LST)) (FIRST-VAR EQUATION)) (for EQUATION1 in (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (COND ((POLY-MEMBER EQUATION NEW-POT-+) NIL) (T (COND ((SETQ TEMP-TEMP (CANCEL-POSITIVE EQUATION)) (SETQ TO-DO-NEXT (CONS TEMP-TEMP TO-DO-NEXT) ))) (SETQ NEW-POT-+ (CONS EQUATION NEW-POT-+)) NEW-POT--))) (T (COND ((POLY-MEMBER EQUATION NEW-POT--) NIL) (T (SETQ NEW-POT-- (CONS EQUATION NEW-POT--)) NEW-POT-+)))) bind TEMP unless (OR (TO-BE-IGNOREDP EQUATION1) (NULL (SETQ TEMP (CANCEL EQUATION EQUATION1)))) do (SETQ TO-DO-NEXT (CONS TEMP TO-DO-NEXT)))) (T (SETQ TO-DO-NEXT (CONS EQUATION TO-DO-NEXT))))) (SETQ ADD-EQUATIONS-TO-DO TO-DO-NEXT) (COND ((AND (EQ ADD-EQUATION-ANS (CDR POT-LST)) (EQ (fetch (LINEAR-POT POSITIVES) of (CAR POT-LST)) NEW-POT-+) (EQ (fetch (LINEAR-POT NEGATIVES) of (CAR POT-LST)) NEW-POT--)) (* This is where we make sure we  return an EQ POT-LST if nothing  happened. *) POT-LST) (T (CONS (create LINEAR-POT VAR _ (fetch (LINEAR-POT VAR) of (CAR POT-LST)) POSITIVES _ NEW-POT-+ NEGATIVES _ NEW-POT--) ADD-EQUATION-ANS]) (ADD-EQUATIONS [LAMBDA (EQUATIONS POT-LST) (* kbr: "19-Oct-85 16:31") (LET (NEW-EQUATIONS ADD-EQUATIONS-TO-DO) (SETQ EQUATIONS (for EQUATION in EQUATIONS when (COND ((IMPOSSIBLE-POLYP EQUATION) (SETQ LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS) of EQUATION)) (SETQ LEMMAS-USED-BY-LINEAR (UNIONQ (fetch (POLY LEMMAS) of EQUATION) (fetch (POLY LITERALS) of EQUATION))) (RETFROM (QUOTE ADD-EQUATIONS) (QUOTE CONTRADICTION))) ((TRUE-POLYP EQUATION) NIL) (T T)) collect EQUATION)) (while EQUATIONS do (for EQUATION in EQUATIONS do (SETQ POT-LST (ADD-EQUATION EQUATION POT-LST)) (SETQ NEW-EQUATIONS (NCONC ADD-EQUATIONS-TO-DO NEW-EQUATIONS)) ) (SETQ EQUATIONS NEW-EQUATIONS) (SETQ NEW-EQUATIONS NIL)) POT-LST]) (ADD-EQUATIONS-TO-POT-LST [LAMBDA (POLY-LST POT-LST ALL-NEW-FLG) (* kbr: "24-Oct-85 14:24") (PROG (NEW-POT-LST NEW-VARS LST) (SETQ NEW-POT-LST (ADD-EQUATIONS POLY-LST POT-LST)) (COND ((EQ NEW-POT-LST (QUOTE CONTRADICTION)) (RETURN (QUOTE CONTRADICTION)))) TOP (SETQ NEW-VARS (for X in NEW-POT-LST when (AND (NOT (VARIABLEP (fetch (LINEAR-POT VAR) of X))) (OR ALL-NEW-FLG (NOT (for POT in POT-LST thereis (EQUAL (fetch (LINEAR-POT VAR) of POT) (fetch (LINEAR-POT VAR) of X)))))) collect (fetch (LINEAR-POT VAR) of X))) (SETQ ALL-NEW-FLG NIL) (COND ((NULL NEW-VARS) (RETURN NEW-POT-LST))) (SETQ POT-LST NEW-POT-LST) (for VAR in NEW-VARS do (for LEMMA in (GETPROP (FN-SYMB VAR) (QUOTE LINEAR-LEMMAS)) unless (DISABLEDP (fetch (LINEAR-LEMMA NAME) of LEMMA)) do (* We will rewrite the conclusion of the linear lemma and rewrite the hyps to  relieve them. This will generate both a list of lemmas used and some linear  assumptions. They will be collected in the frames pushed here and will be  popped and smashed into the polys we add to the pot should we succeed.  *) (PUSH-LEMMA-FRAME) (PRINT-TO-DISPLAY (QUOTE LINEAR) NIL NIL) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME) (COND ((AND (ONE-WAY-UNIFY (fetch (LINEAR-LEMMA MAX-TERM) of LEMMA) VAR) (LET ((SIMPLIFY-CLAUSE-POT-LST NEW-POT-LST)) (RELIEVE-HYPS (fetch (LINEAR-LEMMA HYPS) of LEMMA) (fetch (LINEAR-LEMMA NAME) of LEMMA))) (SETQ LST (LET ((SIMPLIFY-CLAUSE-POT-LST NEW-POT-LST)) (LINEARIZE (REWRITE-LINEAR-CONCL (fetch (LINEAR-LEMMA CONCL) of LEMMA)) T))) (NULL (CDR LST)) (for POLY in (CAR LST) never (for PAIR1 in (fetch (POLY ALIST) of POLY) thereis (for POT in POT-LST always (AND (NOT (EQUAL (CAR PAIR1) (fetch (LINEAR-POT VAR) of POT))) (GREATEREQP (FORM-COUNT (CAR PAIR1)) (FORM-COUNT (fetch (LINEAR-POT VAR) of POT))) (WORSE-THAN-OR-EQUAL (CAR PAIR1) (fetch (LINEAR-POT VAR) of POT))))))) (for POLY in (CAR LST) bind (LEMMAS _ (ADD-TO-SET (fetch (LINEAR-LEMMA NAME) of LEMMA) (POP-LEMMA-FRAME))) AND (HYPS _ (POP-LINEARIZE-ASSUMPTIONS-FRAME)) do (replace (POLY LEMMAS) of POLY with LEMMAS) (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL HYPS (fetch (POLY ASSUMPTIONS) of POLY)))) (SETQ NEW-POT-LST (ADD-EQUATIONS (CAR LST) NEW-POT-LST)) (COND ((EQ NEW-POT-LST (QUOTE CONTRADICTION)) (RETFROM (QUOTE ADD-EQUATIONS-TO-POT-LST) (QUOTE CONTRADICTION))))) (T (POP-LEMMA-FRAME) (POP-LINEARIZE-ASSUMPTIONS-FRAME))))) (GO TOP]) (ADD-FACT [LAMBDA (ATM PROP VAL) (* kbr: "19-Oct-85 16:31") (COND (ATM (GUARANTEE-CITIZENSHIP ATM))) (ADD-SUB-FACT ATM PROP VAL NIL NIL]) (ADD-GENERALIZE-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "19-Oct-85 16:31") TYPE (ADD-FACT NIL (QUOTE GENERALIZE-LEMMAS) (create GENERALIZE-LEMMA NAME _ NAME TERM _ TERM]) (ADD-LEMMA [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (IPRINT (QUOTE (ADD-LEMMA IS UNDEFINED. USE EITHER ADD-AXIOM OR PROVE-LEMMA.)) T]) (ADD-LEMMA0 [LAMBDA (NAME TYPES TERM) (* kbr: "17-Nov-85 15:45") (GUARANTEE-CITIZENSHIP NAME) (SETQ TYPES (SCRUNCH TYPES)) (SETQ TERM (TRANSLATE TERM)) (for TYPE in TYPES do (APPLY* (PACK (LIST (QUOTE ADD-) (COND ((LISTP TYPE) (CAR TYPE)) (T TYPE)) (QUOTE -LEMMA))) NAME TYPE TERM]) (ADD-LESSP-ASSUMPTION-TO-POLY [LAMBDA (X Y POLY) (* kbr: "19-Oct-85 16:31") (* We add the assumption  (LESSP X Y) to POLY.  See the comment in  ADD-NUMBERP-ASSUMPTION-TO-POLY.  *) (PROG (TEMP TERM) (SETQ TEMP (TYPE-SET (SETQ TERM (FCONS-TERM* (QUOTE LESSP) X Y)))) (COND ((IEQP TEMP TYPE-SET-TRUE) NIL) ((IEQP TEMP TYPE-SET-FALSE) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((AND HEURISTIC-TYPE-ALIST (IEQP (LET ((TYPE-ALIST HEURISTIC-TYPE-ALIST)) (TYPE-SET TERM)) TYPE-SET-FALSE)) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((SETQ TEMP-TEMP (for LIT in LITS-THAT-MAY-BE-ASSUMED-FALSE when (COMPLEMENTARYP TERM LIT) do (RETURN LIT))) (replace (POLY LEMMAS) of POLY with (ADD-TO-SET-EQ TEMP-TEMP (fetch (POLY LEMMAS) of POLY)))) (T (replace (POLY ASSUMPTIONS) of POLY with (ADD-TO-SET TERM (fetch (POLY ASSUMPTIONS) of POLY))))) (RETURN POLY]) (ADD-LINEAR-TERM [LAMBDA (TERM PARITY POLY) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (ADD-LINEAR-VARIABLE TERM PARITY POLY)) ((FQUOTEP TERM) (COND ((AND (FIXP (CADR TERM)) (GREATERP (CADR TERM) -1)) (COND ((EQ PARITY (QUOTE POSITIVE)) (replace (POLY CONSTANT) of POLY with (PLUS (fetch (POLY CONSTANT) of POLY) (CADR TERM)))) (T (replace (POLY CONSTANT) of POLY with (DIFFERENCE (fetch (POLY CONSTANT) of POLY) (CADR TERM)))))))) (T (SELECTQ (FFN-SYMB TERM) (ADD1 (replace (POLY CONSTANT) of POLY with (COND ((EQ PARITY (QUOTE POSITIVE)) (ADD1 (fetch (POLY CONSTANT) of POLY))) (T (SUB1 (fetch (POLY CONSTANT) of POLY))))) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)) (ZERO NIL) (SUB1 (COND ((EQ PARITY (QUOTE POSITIVE)) (replace (POLY CONSTANT) of POLY with (SUB1 (fetch (POLY CONSTANT) of POLY))) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)) (T (ADD-NOT-LESSP-ASSUMPTION-TO-POLY (FARGN TERM 1) (QUOTE (QUOTE 1)) POLY) (replace (POLY CONSTANT) of POLY with (ADD1 (fetch (POLY CONSTANT) of POLY))) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)))) (PLUS (ADD-LINEAR-TERM (FARGN TERM 2) PARITY POLY) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)) (DIFFERENCE (COND ((EQ PARITY (QUOTE POSITIVE)) (ADD-LINEAR-TERM (FARGN TERM 2) (QUOTE NEGATIVE) POLY) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)) (T (ADD-NOT-LESSP-ASSUMPTION-TO-POLY (FARGN TERM 1) (FARGN TERM 2) POLY) (ADD-LINEAR-TERM (FARGN TERM 2) (QUOTE POSITIVE) POLY) (ADD-LINEAR-TERM (FARGN TERM 1) PARITY POLY)))) (ADD-LINEAR-VARIABLE TERM PARITY POLY)))) POLY]) (ADD-LINEAR-VARIABLE [LAMBDA (VAR PARITY POLY) (* kbr: "19-Oct-85 16:31") (LET (N TERM) (COND ((AND (BM-MATCH VAR (TIMES N TERM)) (QUOTEP N) (FIXP (CADR N)) (GREATERP (CADR N) -1)) (COND ((LOGSUBSETP TYPE-SET-NUMBERS (TYPE-SET TERM)) (replace (POLY ALIST) of POLY with (ADD-LINEAR-VARIABLE1 (CADR N) TERM PARITY (fetch (POLY ALIST) of POLY)))))) ((LOGSUBSETP TYPE-SET-NUMBERS (TYPE-SET VAR)) (replace (POLY ALIST) of POLY with (ADD-LINEAR-VARIABLE1 1 VAR PARITY (fetch (POLY ALIST) of POLY))))) POLY]) (ADD-LINEAR-VARIABLE1 [LAMBDA (N VAR PARITY ALIST) (* kbr: "20-Oct-85 15:47") (COND ((NLISTP ALIST) (CONS (CONS VAR (COND ((EQ PARITY (QUOTE POSITIVE)) N) (T (MINUS N)))) NIL)) ((TERM-ORDER VAR (CAAR ALIST)) (COND ((EQUAL VAR (CAAR ALIST)) (COND ((EQ PARITY (QUOTE POSITIVE)) (RPLACD (CAR ALIST) (PLUS N (CDR (CAR ALIST))))) (T (RPLACD (CAR ALIST) (DIFFERENCE (CDR (CAR ALIST)) N)))) ALIST) (T (RPLACD ALIST (ADD-LINEAR-VARIABLE1 N VAR PARITY (CDR ALIST)))))) (T (CONS (CONS VAR (COND ((EQ PARITY (QUOTE POSITIVE)) N) (T (MINUS N)))) ALIST]) (ADD-LITERAL [LAMBDA (LIT CL AT-END-FLG) (* kbr: "19-Oct-85 16:31") (* We assume that LIT has been subjected to NEGATE-LIT or PEGATE-LIT before  passed to ADD-LITERAL, and that CL is the result of previous such ADD-LITERALS.  Thus, we make the trivial checks that LIT is neither T nor F, but do not use a  full blown FALSE-NONFALSEP. *) (COND ((EQUAL LIT FALSE) CL) ((EQUAL LIT TRUE) TRUE-CLAUSE) ((EQUAL CL TRUE-CLAUSE) TRUE-CLAUSE) ((for LIT2 in CL thereis (COMPLEMENTARYP LIT LIT2)) TRUE-CLAUSE) ((MEMBER LIT CL) CL) (AT-END-FLG (APPEND CL (LIST LIT))) (T (CONS LIT CL]) (ADD-META-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "19-Oct-85 16:31") (LET (FN) (BM-MATCH TERM (IMPLIES & (AND (EQUAL & (MEANING (LIST FN &) &)) &))) (for X in (CDR TYPE) do (ADD-FACT X (QUOTE LEMMAS) (create REWRITE-RULE NAME _ NAME CONCL _ (GETPROP FN (QUOTE LISP-CODE]) (ADD-NOT-EQUAL-0-ASSUMPTION-TO-POLY [LAMBDA (TERM POLY) (* kbr: "19-Oct-85 16:31") (* We add the assumption  (NOT (EQUAL TERM 0)) to POLY.  See the comment in  ADD-NUMBERP-ASSUMPTION-TO-POLY.  *) (LET (X Y TEMP EQUALITY) (COND ((BM-MATCH TERM (DIFFERENCE X Y)) (ADD-LESSP-ASSUMPTION-TO-POLY Y X POLY)) ((EQUAL TERM ZERO) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE)) POLY) ((OR (BM-MATCH TERM (ADD1 &)) (AND (QUOTEP TERM) (NOT (EQUAL (CADR TERM) 0)))) POLY) (T (SETQ EQUALITY (FCONS-TERM* (QUOTE EQUAL) TERM ZERO)) (SETQ TEMP (TYPE-SET EQUALITY)) (COND ((IEQP TEMP TYPE-SET-TRUE) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((IEQP TEMP TYPE-SET-FALSE) NIL) ((AND HEURISTIC-TYPE-ALIST (IEQP (LET ((TYPE-ALIST HEURISTIC-TYPE-ALIST)) (TYPE-SET EQUALITY)) TYPE-SET-TRUE)) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((SETQ TEMP-TEMP (MEMBER EQUALITY LITS-THAT-MAY-BE-ASSUMED-FALSE)) (replace (POLY LEMMAS) of POLY with (ADD-TO-SET-EQ (CAR TEMP-TEMP) (fetch (POLY LEMMAS) of POLY)))) (T (replace (POLY ASSUMPTIONS) of POLY with (ADD-TO-SET (FCONS-TERM* (QUOTE NOT) EQUALITY) (fetch (POLY ASSUMPTIONS) of POLY))))) POLY]) (ADD-NOT-LESSP-ASSUMPTION-TO-POLY [LAMBDA (X Y POLY) (* kbr: "19-Oct-85 16:31") (* We add the assumption  (NOT (LESSP X Y)) to POLY.  See the comment in  ADD-NUMBERP-ASSUMPTION-TO-POLY.  *) (PROG (TEMP TERM) (COND ((EQUAL Y (QUOTE (QUOTE 1))) (COND ((IEQP (TYPE-SET X) TYPE-SET-NUMBERS) (RETURN (ADD-NOT-EQUAL-0-ASSUMPTION-TO-POLY X POLY))) ((SETQ TEMP-TEMP (for LIT in LITS-THAT-MAY-BE-ASSUMED-FALSE bind (TERM _ (FCONS-TERM* (QUOTE NUMBERP) X)) when (COMPLEMENTARYP TERM LIT) do (RETURN LIT))) (replace (POLY LEMMAS) of POLY with (ADD-TO-SET-EQ TEMP-TEMP (fetch (POLY LEMMAS) of POLY))) (RETURN (ADD-NOT-EQUAL-0-ASSUMPTION-TO-POLY X POLY)))))) (SETQ TEMP (TYPE-SET (SETQ TERM (FCONS-TERM* (QUOTE LESSP) X Y)))) (COND ((IEQP TEMP TYPE-SET-FALSE) NIL) ((IEQP TEMP TYPE-SET-TRUE) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((AND HEURISTIC-TYPE-ALIST (IEQP (LET ((TYPE-ALIST HEURISTIC-TYPE-ALIST)) (TYPE-SET TERM)) TYPE-SET-TRUE)) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((SETQ TEMP-TEMP (MEMBER TERM LITS-THAT-MAY-BE-ASSUMED-FALSE)) (replace (POLY LEMMAS) of POLY with (ADD-TO-SET-EQ (CAR TEMP-TEMP) (fetch (POLY LEMMAS) of POLY)))) (T (replace (POLY ASSUMPTIONS) of POLY with (ADD-TO-SET (FCONS-TERM* (QUOTE NOT) TERM) (fetch (POLY ASSUMPTIONS) of POLY))))) (RETURN POLY]) (ADD-NUMBERP-ASSUMPTION-TO-POLY [LAMBDA (TERM POLY) (* kbr: "19-Oct-85 16:31") (* We add the assumption (NUMBERP TERM) to the assumptions field of POLY but we  first check to see if the assumption is obviously true or false.  We assume TYPE-ALIST is correctly set. If the HEURISTIC-TYPE-ALIST is set and  says the assumption is false, we add the false assumption --  this is sound, even though HEURISTIC-TYPE-ALIST may be irrelevant, because we  can always add a false assumption to a poly which will prevent the poly from  being used. We assume that LITS-THAT-MAY-BE-ASSUMED-FALSE is NIL unless we are  under the ADD-TERMS-TO-POT-LST in SIMPLIFY-CLAUSE0.  If the complement of the assumption we wish to add is in  LITS-THAT-MAY-BE-ASSUMED-FALSE then the assumption is true but we record the  literal that makes it true in the LEMMAS field of POLY.  We assume that if (NUMBERP TERM) is in LITS-THAT-MAY-BE-ASSUMED-FALSE then it  was false under the HEURISTIC-TYPE-ALIST and we do not bother to check.  *) (LET (TEMP) (SETQ TEMP (TYPE-SET TERM)) (COND ((IEQP TEMP TYPE-SET-NUMBERS) NIL) ((NOT (LOGSUBSETP TYPE-SET-NUMBERS TEMP)) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) ((AND HEURISTIC-TYPE-ALIST (NOT (LOGSUBSETP TYPE-SET-NUMBERS (LET ((TYPE-ALIST HEURISTIC-TYPE-ALIST )) (TYPE-SET TERM))))) (* On heuristic grounds, we here  decide not to use this poly.  *) (replace (POLY ASSUMPTIONS) of POLY with (LIST FALSE))) (T (SETQ TEMP (FCONS-TERM* (QUOTE NUMBERP) TERM)) (COND ((SETQ TEMP-TEMP (for LIT in LITS-THAT-MAY-BE-ASSUMED-FALSE when (COMPLEMENTARYP LIT TEMP) do (RETURN LIT))) (replace (POLY LEMMAS) of POLY with (ADD-TO-SET-EQ TEMP-TEMP (fetch (POLY LEMMAS) of POLY)))) (T (replace (POLY ASSUMPTIONS) of POLY with (ADD-TO-SET TEMP (fetch (POLY ASSUMPTIONS ) of POLY))))))) POLY]) (ADD-PROCESS-HIST [LAMBDA (PROCESS PARENT PARENT-HIST DESCENDANTS HIST-ENTRY)(* kbr: "19-Oct-85 16:31") (IO PROCESS PARENT PARENT-HIST DESCENDANTS HIST-ENTRY) (CONS (CONS PROCESS (CONS PARENT HIST-ENTRY)) PARENT-HIST]) (ADD-REWRITE-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "19-Oct-85 16:31") TYPE (for X in (UNPRETTYIFY TERM) bind (LEMMA ALL-VARS-HYPS ALL-VARS-CONCL MAX-TERMS LST TEMP HYPS CONCL) do (SETQ HYPS (CAR X)) (SETQ CONCL (CDR X)) (COND ((SETQ TEMP (ACCEPTABLE-TYPE-PRESCRIPTION-LEMMAP HYPS CONCL)) (ADD-FACT (CAR TEMP) (QUOTE TYPE-PRESCRIPTION-LST) (CONS NAME (CDR TEMP)))) ((AND (NOT NO-BUILT-IN-ARITH-FLG) (OR (BM-MATCH CONCL (NOT (LESSP & &))) (BM-MATCH CONCL (LESSP & &)))) (SETQ LST (EXTERNAL-LINEARIZE CONCL T)) (SETQ ALL-VARS-HYPS (ALL-VARS-LST HYPS)) (SETQ ALL-VARS-CONCL (ALL-VARS CONCL)) (SETQ MAX-TERMS (for PAIR in (fetch (POLY ALIST) of (CAR (CAR LST))) when (AND (NVARIABLEP (CAR PAIR)) (SUBSETP ALL-VARS-CONCL (UNIONQ (ALL-VARS (CAR PAIR)) ALL-VARS-HYPS)) (for PAIR2 in (fetch (POLY ALIST) of (CAR (CAR LST))) when (NEQ PAIR2 PAIR) never (AND (LESSP (FORM-COUNT (CAR PAIR)) (FORM-COUNT (CAR PAIR2))) (SUBBAGP (ALL-VARS-BAG (CAR PAIR)) (ALL-VARS-BAG (CAR PAIR2)))))) collect (CAR PAIR))) (for TERM in MAX-TERMS do (SETQ LEMMA (create LINEAR-LEMMA NAME _ NAME HYPS _ (PREPROCESS-HYPS HYPS) CONCL _ CONCL MAX-TERM _ TERM)) (ADD-FACT (FN-SYMB TERM) (QUOTE LINEAR-LEMMAS) LEMMA))) (T (for REWRITE-RULE in (MAKE-REWRITE-RULES NAME HYPS CONCL) do (ADD-FACT (TOP-FNNAME CONCL) (QUOTE LEMMAS) REWRITE-RULE]) (ADD-SHELL-ROUTINES [LAMBDA (SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (* kbr: "20-Oct-85 19:45") (PROG NIL (COND (IN-BOOT-STRAP-FLG (for NAME in (CONS SHELL-NAME (CONS RECOGNIZER (APPEND (for X in DESTRUCTOR-TUPLES collect (CAR X)) (COND (BTM-FN-SYMB (LIST BTM-FN-SYMB )) (T NIL))))) do (ADD-FACT NAME (QUOTE LISP-CODE) (PACK (LIST STRING-WEIRD NAME)))) (RETURN NIL))) (ADD-DCELL SHELL-NAME (PACK (LIST STRING-WEIRD SHELL-NAME)) (LIST (QUOTE LAMBDA) (for X in DESTRUCTOR-TUPLES collect (CAR X)) (CONS (QUOTE LIST) (CONS (QUOTE *1*SHELL-QUOTE-MARK) (CONS (LIST (QUOTE QUOTE) SHELL-NAME) (for TUPLE in DESTRUCTOR-TUPLES bind TEMP collect (PROGN (SETQ TEMP (CONS (QUOTE OR) (for R in (CDR (CADR TUPLE)) collect (LIST (QUOTE EQ) (QUOTE *1*T) (LIST (PACK (LIST STRING-WEIRD R)) (CAR TUPLE)))))) (LIST (QUOTE COND) (LIST (COND ((EQ (CAR (CADR TUPLE)) (QUOTE ONE-OF)) TEMP) (T (LIST (QUOTE NOT) TEMP))) (CAR TUPLE)) (LIST T (LIST (PACK (LIST STRING-WEIRD (CADDR TUPLE) )))))))))))) [AND BTM-FN-SYMB (ADD-DCELL BTM-FN-SYMB (PACK (LIST STRING-WEIRD BTM-FN-SYMB)) (SUB-PAIR (QUOTE (*1*SHELL-QUOTE-MARK BTM)) (LIST *1*SHELL-QUOTE-MARK BTM-FN-SYMB) (QUOTE (LAMBDA NIL (QUOTE (*1*SHELL-QUOTE-MARK BTM] [ADD-DCELL RECOGNIZER (PACK (LIST STRING-WEIRD RECOGNIZER)) (COND [BTM-FN-SYMB (SUB-PAIR (QUOTE (SHELL-NAME BTM)) (LIST SHELL-NAME BTM-FN-SYMB) (QUOTE (LAMBDA (X) (COND ((AND (LISTP X) (EQ (CAR X) *1*SHELL-QUOTE-MARK) (OR (EQ (CADR X) (QUOTE SHELL-NAME)) (EQ (CADR X) (QUOTE BTM)))) *1*T) (T *1*F] (T (SUB-PAIR (QUOTE (SHELL-NAME)) (LIST SHELL-NAME) (QUOTE (LAMBDA (X) (COND ((AND (LISTP X) (EQ (CAR X) *1*SHELL-QUOTE-MARK) (EQ (CADR X) (QUOTE SHELL-NAME))) *1*T) (T *1*F] [for TUPLE in DESTRUCTOR-TUPLES as I from 2 do (ADD-DCELL (CAR TUPLE) (PACK (LIST STRING-WEIRD (CAR TUPLE))) (SUB-PAIR (QUOTE (R CELL DV BTM)) (LIST (PACK (LIST STRING-WEIRD RECOGNIZER)) (CELL I (QUOTE X)) (PACK (LIST STRING-WEIRD (CADDR TUPLE))) BTM-FN-SYMB) (COND [BTM-FN-SYMB (QUOTE (LAMBDA (X) (COND ((AND (EQ (R X) *1*T) (NEQ (CADR X) (QUOTE BTM))) (CAR CELL)) (T (DV] (T (QUOTE (LAMBDA (X) (COND ((EQ (R X) *1*T) (CAR CELL)) (T (DV] (RETURN NIL]) (ADD-SHELL0 [LAMBDA (SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (* kbr: "26-Nov-85 15:28") (LET (DEST-EXPRS-X SHELL-EXPR CURRENT-TYPE-NO DESTRUCTOR-ALIST RENAMED-SHELL-EXPR DESTRUCTOR-NAMES DV TERM NEW-TYPE-NO NAMES DEST-NAME ARG-NAME) (SETQ NEW-TYPE-NO (NEXT-AVAILABLE-TYPE-NO)) (SETQ DESTRUCTOR-NAMES (for TUPLE in DESTRUCTOR-TUPLES collect (CAR TUPLE))) (ADD-SHELL-ROUTINES SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (SETQ DESTRUCTOR-ALIST (for X in DESTRUCTOR-TUPLES collect (CONS (CAR X) (MAKE-TYPE-RESTRICTION (CADR X) (CADDR X) RECOGNIZER NEW-TYPE-NO)))) (ADD-TYPE-SET-LEMMAS SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-ALIST) (COND (DESTRUCTOR-NAMES (SETQ SHELL-EXPR (CONS-TERM SHELL-NAME DESTRUCTOR-NAMES)) (for PAIR in DESTRUCTOR-ALIST do (SETQ DEST-NAME (CAR PAIR)) (SETQ ARG-NAME DEST-NAME) (SETQ TERM (fetch (TYPE-RESTRICTION TERM) of (CDR PAIR))) (SETQ DV (fetch (TYPE-RESTRICTION DEFAULT) of (CDR PAIR))) (ADD-AXIOM1 (PACK (LIST DEST-NAME "-" SHELL-NAME)) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE EQUAL) (FCONS-TERM* DEST-NAME SHELL-EXPR) (COND ((EQUAL TERM TRUE) ARG-NAME) (T (FCONS-TERM* (QUOTE IF) (SUBST-VAR ARG-NAME (QUOTE X) TERM) ARG-NAME DV))))) (ADD-AXIOM1 (PACK (LIST DEST-NAME (QUOTE -N) RECOGNIZER)) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE IMPLIES) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* RECOGNIZER (QUOTE X))) (FCONS-TERM* (QUOTE EQUAL) (FCONS-TERM* DEST-NAME (QUOTE X)) DV))) (AND (NOT (EQUAL TERM TRUE)) (ADD-AXIOM1 (PACK (LIST DEST-NAME (QUOTE -TYPE-RESTRICTION))) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE IMPLIES) (BM-NEGATE (SUBST-VAR DEST-NAME (QUOTE X) TERM)) (FCONS-TERM* (QUOTE EQUAL) SHELL-EXPR (SUBST-VAR DV DEST-NAME SHELL-EXPR))))) (ADD-AXIOM1 (PACK (LIST DEST-NAME (QUOTE -LESSP))) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE IMPLIES) (COND (BTM-FN-SYMB (FCONS-TERM* (QUOTE AND) (FCONS-TERM* RECOGNIZER (QUOTE X)) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE EQUAL) (QUOTE X) (CONS-TERM BTM-FN-SYMB NIL))))) (T (FCONS-TERM* RECOGNIZER (QUOTE X)))) (FCONS-TERM* (QUOTE LESSP) (FCONS-TERM* (QUOTE COUNT) (FCONS-TERM* DEST-NAME (QUOTE X))) (FCONS-TERM* (QUOTE COUNT) (QUOTE X))))) (ADD-AXIOM1 (PACK (LIST DEST-NAME (QUOTE -LESSEQP))) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE LESSP) (FCONS-TERM* (QUOTE COUNT) (QUOTE X)) (FCONS-TERM* (QUOTE COUNT) (FCONS-TERM* DEST-NAME (QUOTE X))))))) (SETQ RENAMED-SHELL-EXPR (CONS-TERM SHELL-NAME (for DEST in DESTRUCTOR-NAMES collect (PACK (LIST DEST "-"))))) (ADD-AXIOM1 (PACK (LIST SHELL-NAME "-EQUAL")) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE EQUAL) (FCONS-TERM* (QUOTE EQUAL) SHELL-EXPR RENAMED-SHELL-EXPR) (CONJOIN (for ARG1 in (FARGS SHELL-EXPR) as ARG2 in (FARGS RENAMED-SHELL-EXPR) as PAIR in DESTRUCTOR-ALIST collect (PROGN (SETQ TERM (fetch (TYPE-RESTRICTION TERM) of (CDR PAIR))) (SETQ DV (fetch (TYPE-RESTRICTION DEFAULT) of (CDR PAIR))) (COND ((EQUAL TERM TRUE) (FCONS-TERM* (QUOTE EQUAL) ARG1 ARG2)) (T (FCONS-TERM* (QUOTE IF) (SUBST-VAR ARG1 (QUOTE X) TERM) (FCONS-TERM* (QUOTE IF) (SUBST-VAR ARG2 (QUOTE X) TERM) (FCONS-TERM* (QUOTE EQUAL) ARG1 ARG2) (FCONS-TERM* (QUOTE EQUAL) ARG1 DV)) (FCONS-TERM* (QUOTE IF) (SUBST-VAR ARG2 (QUOTE X) TERM) (FCONS-TERM* (QUOTE EQUAL) DV ARG2) TRUE)))))) NIL))) (SETQ DEST-EXPRS-X (for DEST-NAME in DESTRUCTOR-NAMES collect (FCONS-TERM* DEST-NAME (QUOTE X)))) (ADD-AXIOM1 (PACK (CONS SHELL-NAME (for DEST-NAME in DESTRUCTOR-NAMES join (LIST "-" DEST-NAME)))) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE EQUAL) (CONS-TERM SHELL-NAME DEST-EXPRS-X) (FCONS-TERM* (QUOTE IF) (COND (BTM-FN-SYMB (FCONS-TERM* (QUOTE AND) (FCONS-TERM* RECOGNIZER (QUOTE X)) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE EQUAL) (QUOTE X) (CONS-TERM BTM-FN-SYMB NIL)))) ) (T (FCONS-TERM* RECOGNIZER (QUOTE X)))) (QUOTE X) (CONS-TERM SHELL-NAME (for X in DESTRUCTOR-ALIST collect (fetch (TYPE-RESTRICTION DEFAULT) of (CDR X))))))) (ADD-AXIOM1 (PACK (NCONC1 (CDR (for DEST-NAME in DESTRUCTOR-NAMES join (LIST "-" DEST-NAME))) "-ELIM")) (QUOTE (ELIM)) (FCONS-TERM* (QUOTE IMPLIES) (COND (BTM-FN-SYMB (FCONS-TERM* (QUOTE AND) (FCONS-TERM* RECOGNIZER (QUOTE X)) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE EQUAL) (QUOTE X) (CONS-TERM BTM-FN-SYMB NIL))))) (T (FCONS-TERM* RECOGNIZER (QUOTE X)))) (FCONS-TERM* (QUOTE EQUAL) (CONS-TERM SHELL-NAME DEST-EXPRS-X) (QUOTE X)))) (ADD-AXIOM1 (PACK (LIST (QUOTE COUNT-) SHELL-NAME)) (QUOTE (REWRITE)) (FCONS-TERM* (QUOTE EQUAL) (FCONS-TERM* (QUOTE COUNT) SHELL-EXPR) (FCONS-TERM* (QUOTE ADD1) (PLUSJOIN (for X in (FARGS SHELL-EXPR) as PAIR in DESTRUCTOR-ALIST collect (PROGN (SETQ TERM (fetch (TYPE-RESTRICTION TERM) of (CDR PAIR))) (SETQ DV (fetch (TYPE-RESTRICTION DEFAULT) of (CDR PAIR))) (COND ((EQUAL TERM TRUE) (FCONS-TERM* (QUOTE COUNT) X)) (T (FCONS-TERM* (QUOTE IF) (SUBST-VAR X (QUOTE X) TERM) (FCONS-TERM* (QUOTE COUNT) X) ZERO))))))))))) SHELL-NAME]) (ADD-SUB-FACT [LAMBDA (ATM PROP VAL TUPLE INIT) (* kbr: "19-Oct-85 16:31") (* Here is the spec for ADD-SUB-FACT. It takes 5 args ATM PROP VAL TUPLE and  INIT but only a few of these make sense in combination.  To store a new fact you call ADD-SUB-FACT using ATM PROP and VAL.  If PROP is a variable declared below we either CONS VAL to the front of PROPs  top level value or set PROP to VAL depending on whether PROP is ADDITIVE or  SINGLE. SET is used in both cases. If PROP is DCELL it means PUTD1 ATM to VAL.  Otherwise, PROP had better be an additive or single property declared below and  if so the appropriate ADDITIVE or SINGLE PUT1 is done.  If you want to delete a previously added fact you call ADD-SUB-FACT with all  args but TUPLE NIL. TUPLE should be the undo tuple produced by the adding of  the fact in question. Before you begin to add or sub facts you must first  initialize the library file. You do that by calling ADD-SUB-FACT with INIT T  and all other args NIL. The initialization sets LIB-PROPS to the list of  properties declared below in the reverse order of declaration --  making the first property declared the one of highest priority.  Because the list of declarations is used to generated LIB-PROPS you must  include in it all of the properties used by the event level abstraction itself,  even those these properties aren't technically yours.  These properties are IDATE SATELLITES MAIN-EVENT EVENT and LOCAL-UNDO-TUPLES.  They should all be declared with type HIDDEN rather than ADDITIVE or SINGLE.  The code will cause an error if you leave out any built-in prop or use HIDDEN  on any nonbuilt-in one -- the whole purpose of your knowing about these  properties and the token HIDDEN is just to allow you to specify where in the  list of priorities they should be kept. The other thing that initialization  does is set all variables declared below to NIL.  The HIDDEN variable CHRONOLOGY should be declared explicitly.  We force you to do that so you'll always remember we've claimed that variable  name. No property or variable name may contain lower case letters or be NIL.  If this convention is violated the code produced for ADD-SUB-FACT is garbage  because we generate the code with SUBST's that hit lower case names and we  sometimes generate SELECTQs with NIL first elements of clauses.  For ADDITIVE data you must supply a form, which may involve VAL as a free var,  for computing from VAL some datum to be stored in the undo tuple.  This datum must be sufficient for distinguishing that VAL from all others in  that ADDITIVE pot. In particular, to find the VAL in question the undoing  mechanism scans the pot and evaluates the form again for each entry, with VAL  bound to the entry, and removes from the pot the first entry for which that  form computes an EQUAL datum. The form in question must not contain any free  variables other than VAL and must not cause any side-effects.  *) (ADD-SUB-FACT-BODY (TYPE-PRESCRIPTION-LST ADDITIVE PROPERTY (CAR VAL)) (LEMMAS ADDITIVE PROPERTY (fetch (REWRITE-RULE NAME) of VAL)) (LINEAR-LEMMAS ADDITIVE PROPERTY (fetch (LINEAR-LEMMA NAME) of VAL)) (QUICK-BLOCK-INFO SINGLE PROPERTY) (SDEFN SINGLE PROPERTY) (LISP-CODE SINGLE PROPERTY) (TYPE-RESTRICTIONS SINGLE PROPERTY) (INDUCTION-MACHINE SINGLE PROPERTY) (LEVEL-NO SINGLE PROPERTY) (JUSTIFICATIONS SINGLE PROPERTY) (IDATE HIDDEN PROPERTY) (ELIMINATE-DESTRUCTORS-SEQ SINGLE PROPERTY) (ELIMINATE-DESTRUCTORS-DESTS SINGLE PROPERTY) (CONTROLLER-POCKETS SINGLE PROPERTY) (SATELLITES HIDDEN PROPERTY) (MAIN-EVENT HIDDEN PROPERTY) (IMMEDIATE-DEPENDENTS0 ADDITIVE PROPERTY VAL) (EVENT HIDDEN PROPERTY) (LOCAL-UNDO-TUPLES HIDDEN PROPERTY) (NONCONSTRUCTIVE-AXIOM-NAMES ADDITIVE VARIABLE VAL) (*1*BTM-OBJECTS ADDITIVE VARIABLE VAL) (RECOGNIZER-ALIST ADDITIVE VARIABLE VAL) (SHELL-ALIST ADDITIVE VARIABLE VAL) (SINGLETON-TYPE-SETS ADDITIVE VARIABLE VAL) (GENERALIZE-LEMMAS ADDITIVE VARIABLE (fetch (GENERALIZE-LEMMA NAME) of VAL)) (SHELL-POCKETS ADDITIVE VARIABLE VAL) (DISABLED-LEMMAS ADDITIVE VARIABLE VAL) (CHRONOLOGY HIDDEN VARIABLE]) (ADD-TERM-TO-POT-LST [LAMBDA (TERM POT-LST FLG ALL-NEW-FLG) (* kbr: "19-Oct-85 16:31") (PROG NIL (COND ((EQ CURRENT-LIT CURRENT-ATM) (COND ((AND (EQ FLG NIL) (EQUAL TERM CURRENT-LIT)) (RETURN POT-LST)))) (T (COND ((AND FLG (EQUAL TERM CURRENT-ATM)) (RETURN POT-LST))))) (RPLACA ADD-TERM-TO-POT-LST-TEMP TERM) (RETURN (ADD-TERMS-TO-POT-LST ADD-TERM-TO-POT-LST-TEMP POT-LST FLG ALL-NEW-FLG]) (ADD-TERMS-TO-POT-LST [LAMBDA (TERM-LST POT-LST FLG ALL-NEW-FLG) (* kbr: "20-Oct-85 17:30") (* Only called with POT-LST EQ to SIMPLIFY-CLAUSE-POT-LST.  Either returns (QUOTE CONTRADICTION,) in which case there is a proof of F from  TYPE-ALIST, the assumption of the members of TERM-LST true or false according  as FLG is T or NIL, LINEAR-ASSUMPTIONS, and a subset S of the polys in POT-LST  such that if ITIMES IEQP (LIST (QUOTE MARK)) is a MEMB of the LEMMAS of a  member of S then ITIMES is in LEMMAS-USED-BY-LINEAR, or returns a new pot lst  such that for each poly p in the new pot lst there is a proof of p from  TYPE-ALIST, the assumption of the members of TERM-LST true or false according  as FLG is T or NIL, and a subset S of the polys in the input POT-LST such that  if ITIMES IEQP (LIST (QUOTE MARK)) is a MEMB of the lemmas of a member of S,  then ITIMES is in the LEMMAS field of p.  In no case is the lemma stack or linearize assumptions stack visibly affected  by this call. Not necessary for soundness, but true, are the facts that the  lemmas (ignoring typeset lemmas, of course) that are used in the proofs are  included in the LEMMAS fields. Furthermore, the LITERALS fields contain the  literals that were passed in TERM-LST to ADD-TERMS-TO-POT-LST and used to  construct, with LINEARIZE, the original polynomials.  If ALL-NEW-FLG is T then every addend in the pot list is treated as new for the  consideration of lemmas to be added. Otherwise, we add lemmas for the addends  that are introduced by this call. *) (PROG (POLY-LST SPLIT-LST LST BASIC-POT-LST UNIFY-SUBST POT-LST1 POT-LST2) (COND (NO-BUILT-IN-ARITH-FLG (RETURN NIL))) (for TERM in TERM-LST do (SETQ LST (LINEARIZE TERM FLG)) (COND ((NULL LST)) ((NULL (CDR LST)) (SETQ POLY-LST (APPEND (CAR LST) POLY-LST))) ((NULL (CDDR LST)) (SETQ SPLIT-LST (CONS LST SPLIT-LST))) (T (ERROR1 (PQUOTE (PROGN LINEARIZE RETURNED A LIST WITH MORE THAN 2 ELEMENTS !)) NIL (QUOTE HARD))))) (SETQ BASIC-POT-LST (ADD-EQUATIONS-TO-POT-LST POLY-LST POT-LST ALL-NEW-FLG)) (for PAIR in SPLIT-LST bind (MARK _ (LIST (QUOTE MARK))) while (NEQ BASIC-POT-LST (QUOTE CONTRADICTION)) do (* We will add both branches separately and hope at least one gives a  contradiction. Suppose the first branch does not but the second does.  Then we will use the first branch's pot list in the future.  But we must add to the assumptions and lemmas of the first branch those of the  second. To recognize the polys in the first branch's pot lst that descend from  the polys in the first branch we will mark them by putting a unique CONS in the  lemmas field. *) (for POLY in (CAR PAIR) do (replace (POLY LEMMAS) of POLY with (LIST MARK))) (SETQ POT-LST1 (ADD-EQUATIONS-TO-POT-LST (CAR PAIR) BASIC-POT-LST ALL-NEW-FLG)) (COND ((EQ POT-LST1 (QUOTE CONTRADICTION)) (for POLY in (CADR PAIR) do (replace (POLY LEMMAS) of POLY with (REMQ MARK LEMMAS-USED-BY-LINEAR)) (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS) of POLY)))) (SETQ BASIC-POT-LST (ADD-EQUATIONS-TO-POT-LST (CADR PAIR) BASIC-POT-LST ALL-NEW-FLG))) (T (SETQ POT-LST2 (ADD-EQUATIONS-TO-POT-LST (CADR PAIR) BASIC-POT-LST ALL-NEW-FLG)) (COND ((EQ POT-LST2 (QUOTE CONTRADICTION)) (for POT in POT-LST1 do (for POLY in (fetch (LINEAR-POT POSITIVES) of POT) when (MEMB MARK (fetch (POLY LEMMAS) of POLY)) do (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS ) of POLY))) (replace (POLY LEMMAS) of POLY with (UNIONQ LEMMAS-USED-BY-LINEAR (REMQ MARK (fetch (POLY LEMMAS) of POLY))))) (for POLY in (fetch (LINEAR-POT NEGATIVES) of POT) when (MEMB MARK (fetch (POLY LEMMAS) of POLY)) do (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS ) of POLY))) (replace (POLY LEMMAS) of POLY with (UNIONQ LEMMAS-USED-BY-LINEAR (REMQ MARK (fetch (POLY LEMMAS) of POLY)))))) (SETQ BASIC-POT-LST POT-LST1)))))) (RETURN BASIC-POT-LST]) (ADD-TO-SET-EQ [LAMBDA (X LST) (* kbr: "19-Oct-85 16:31") (COND ((MEMB X LST) LST) (T (CONS X LST]) (ADD-TYPE-SET-LEMMAS [LAMBDA (SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-ALIST) (* kbr: "19-Oct-85 16:31") (LET (CURRENT-TYPE-NO) (SETQ CURRENT-TYPE-NO (NEXT-AVAILABLE-TYPE-NO)) (ADD-FACT NIL (QUOTE SHELL-ALIST) (CONS SHELL-NAME CURRENT-TYPE-NO)) (ADD-FACT NIL (QUOTE SHELL-POCKETS) (CONS SHELL-NAME (for X in DESTRUCTOR-ALIST collect (CAR X)))) (ADD-FACT SHELL-NAME (QUOTE TYPE-PRESCRIPTION-LST) (CONS SHELL-NAME (CONS (LOGBIT CURRENT-TYPE-NO) (for X in DESTRUCTOR-ALIST collect NIL)))) (AND DESTRUCTOR-ALIST (ADD-FACT SHELL-NAME (QUOTE TYPE-RESTRICTIONS) (for X in DESTRUCTOR-ALIST collect (CDR X)))) (COND ((AND (NULL DESTRUCTOR-ALIST) (NULL BTM-FN-SYMB)) (ADD-FACT NIL (QUOTE SINGLETON-TYPE-SETS) (LOGBIT CURRENT-TYPE-NO)))) (AND BTM-FN-SYMB (ADD-FACT NIL (QUOTE *1*BTM-OBJECTS) BTM-FN-SYMB)) (AND BTM-FN-SYMB (ADD-FACT BTM-FN-SYMB (QUOTE TYPE-PRESCRIPTION-LST) (CONS SHELL-NAME (CONS (LOGBIT CURRENT-TYPE-NO) NIL)))) (ADD-FACT NIL (QUOTE RECOGNIZER-ALIST) (CONS RECOGNIZER (LOGBIT CURRENT-TYPE-NO))) (ADD-FACT RECOGNIZER (QUOTE TYPE-PRESCRIPTION-LST) (CONS SHELL-NAME (CONS TYPE-SET-BOOLEAN (QUOTE (NIL))))) (for PAIR in DESTRUCTOR-ALIST do (ADD-FACT (CAR PAIR) (QUOTE TYPE-PRESCRIPTION-LST) (CONS SHELL-NAME (CONS (fetch (TYPE-RESTRICTION TYPE-SET) of (CDR PAIR)) (QUOTE (NIL)))))) NIL]) (ALL-ARGLISTS [LAMBDA (FNNAME TERM) (* kbr: "19-Oct-85 16:31") (* Returns the set of arglists of all  subterms of TERM with function symbol  FNNAME. *) (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) (COND ((OR (ASSOC FNNAME SHELL-ALIST) (MEMB FNNAME *1*BTM-OBJECTS)) (ERROR1 (PQUOTE (PROGN ALL-ARGLISTS DOES NOT KNOW HOW TO GO INTO QUOTED CONSTANTS FOR BOTTOM OBJECTS AND SHELL CONSTRUCTORS %.)) NIL (QUOTE HARD))) (T NIL))) ((EQ (FFN-SYMB TERM) FNNAME) (ADD-TO-SET (FARGS TERM) (for ARG in (FARGS TERM) bind LOOP-ANS do (SETQ LOOP-ANS (UNION-EQUAL (ALL-ARGLISTS FNNAME ARG) LOOP-ANS)) finally (RETURN LOOP-ANS)))) (T (for ARG in (FARGS TERM) bind LOOP-ANS do (SETQ LOOP-ANS (UNION-EQUAL (ALL-ARGLISTS FNNAME ARG) LOOP-ANS)) finally (RETURN LOOP-ANS]) (ALL-FNNAMES [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (ANS) (ALL-FNNAMES1 TERM) ANS]) (ALL-FNNAMES-LST [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (LET (ANS) (for X in LST do (ALL-FNNAMES1 X)) ANS]) (ALL-FNNAMES1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) (ALL-FNNAMES1-EVG (CADR TERM))) (T (COND ((AND (NEQ (QUOTE IF) (FFN-SYMB TERM)) (NEQ (QUOTE EQUAL) (FFN-SYMB TERM))) (SETQ ANS (ADD-TO-SET (FFN-SYMB TERM) ANS)))) (for ARG in (FARGS TERM) do (ALL-FNNAMES1 ARG]) (ALL-FNNAMES1-EVG [LAMBDA (EVG) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP EVG) (SETQ ANS (UNIONQ ANS (COND ((EQ EVG *1*T) (QUOTE (TRUE))) ((EQ EVG *1*F) (QUOTE (FALSE))) ((FIXP EVG) (COND ((LESSP EVG 0) (QUOTE (MINUS ADD1 ZERO))) ((EQUAL EVG 0) (QUOTE (ZERO))) (T (QUOTE (ADD1 ZERO))))) (T (QUOTE (PACK CONS ADD1 ZERO))))))) ((EQ (CAR EVG) *1*SHELL-QUOTE-MARK) (SETQ ANS (ADD-TO-SET (CADR EVG) ANS)) (for X in (CDDR EVG) do (ALL-FNNAMES1-EVG X))) (T (SETQ ANS (ADD-TO-SET (QUOTE CONS) ANS)) (ALL-FNNAMES1-EVG (CAR EVG)) (ALL-FNNAMES1-EVG (CDR EVG]) (ALL-INSERTIONS [LAMBDA (X FINAL-SEG INIT-SEG) (* kbr: "19-Oct-85 16:31") (* Inserts X into FINAL-SEG in all  possible ways IDIFFERENCE assuming  INIT-SEG is NIL at the top most call.  *) (COND ((NULL FINAL-SEG) (LIST (APPEND INIT-SEG (LIST X)))) (T (CONS (APPEND INIT-SEG (LIST X) FINAL-SEG) (ALL-INSERTIONS X (CDR FINAL-SEG) (NCONC1 INIT-SEG (CAR FINAL-SEG]) (ALL-PATHS [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (* This function is used only by OPTIMIZE-COMMON-SUBTERMS.  It is assumed that FORM is as described in the documentation of  OPTIMIZE-COMMON-SUBTERMS. In particular, *2*IF and QUOTE are the only symbols  used as function symbols in FORM that are not spread LAMBDAs.  A real-path through FORM is defined to be a list of all of the subterms of FORM  that are MEMBers of COMMONSUBTERMS and that are evaluated in the evaluation of  FORM under some assignment of values to the variables in FORM.  The terms are listed in reverse order of evaluation completion, with FORM  coming first. ALL-PATHS returns a list L of pairs.  Each pair consists of a flag doted with a list of subterms of FORM that are  members of COMMONSUBTERMS. For each real-path P through FORM, there exists a  member (FLG) of L such that L1 is PATH-EQ to P and  (a) if FLG is NIL, then any evaluation of FORM whose real-path is P returns NIL  and (b) if FLG is T, then any such evaluation returns something other than NIL.  If FLG is ?, nothing is asserted. Not every member of L need correspond to  real-path. For example, even if FOO always returns T,  (ALL-PATHS (*2*IF (FOO X) (G X) (H X))) will return a list of length two.  In the documentation of OPTIMIZE-COMMON-SUBTERMS, we define the concepts FIRST,  SECOND, and ISOLATED on a path. From the foregoing specification of the output  of ALL-PATHS, we may conclude that if a MEMBer of COMMONSUBTERMS is SECOND on  every path in (ALL-PATHS FORM) on which it occurs, then it is SECOND on any  real-path through FORM on which it occurs.  Furthermore, we may conclude that if a MEMBer of COMMON-SUBTERMS is ever FIRST  on any real-path through FORM, then it is FIRST on some path in  (ALL-PATHS FORM)%. These two observations are the key to the soundness of  OPTIMIZE-COMMON-SUBTERMS. (A) If a term is ever FIRST on any path of ALL-PATHS,  then the appropriate *2*variable is set when it is executed  (if it has not already been set.) (B) If a term is SECOND on each path of  (ALL-PATHS FORM), then we assume that the appropriate *2*variable has been set  and we use it. If a term is FIRST on each path of ALL-PATHS on which it occurs,  then it is first on each real-path. Thus there is no loss of efficiency in  simply SETting the appropriate *2*variable.  *) (LET (TEMP) (COND ((OR (EQ FORM NIL) (EQUAL FORM (QUOTE (QUOTE NIL)))) (LIST (CONS NIL NIL))) ((OR (EQ FORM T) (AND (LISTP FORM) (EQ (CAR FORM) (QUOTE QUOTE))) (FIXP FORM)) (LIST (CONS T NIL))) ((NLISTP FORM) (LIST (CONS (QUOTE ?) NIL))) ((NEQ (FFN-SYMB FORM) (QUOTE *2*IF)) (for PICK in (ALL-PICKS (for ARG in (REVERSE (FARGS FORM)) collect (CDR-ALL (ALL-PATHS ARG)))) bind LOOP-ANS do (SETQ LOOP-ANS (PATH-ADD-TO-SET (CONS (QUOTE ?) (COND ((MEMB FORM COMMONSUBTERMS) (CONS FORM (APPLY (FUNCTION APPEND) PICK))) (T (APPLY (FUNCTION APPEND) PICK)))) LOOP-ANS)) finally (RETURN LOOP-ANS))) (T (PATH-UNION (for PICK in (ALL-PICKS (LIST (ALL-PATHS (CADDR FORM)) (for X in (SETQ TEMP (ALL-PATHS (CADR FORM)) ) unless (EQ (CAR X) NIL) collect (CDR X)))) bind LOOP-ANS do (SETQ LOOP-ANS (PATH-ADD-TO-SET (CONS (CAR (CAR PICK)) (COND ((MEMB FORM COMMONSUBTERMS) (CONS FORM (APPEND (CDR (CAR PICK)) (CADR PICK)))) (T (APPEND (CDR (CAR PICK)) (CADR PICK))))) LOOP-ANS)) finally (RETURN LOOP-ANS)) (for PICK in (ALL-PICKS (LIST (ALL-PATHS (CADDDR FORM)) (for X in TEMP unless (EQ T (CAR X)) collect (CDR X)))) bind LOOP-ANS do (SETQ LOOP-ANS (PATH-ADD-TO-SET (CONS (CAR (CAR PICK)) (COND ((MEMB FORM COMMONSUBTERMS) (CONS FORM (APPEND (CDR (CAR PICK)) (CADR PICK)))) (T (APPEND (CDR (CAR PICK)) (CADR PICK))))) LOOP-ANS)) finally (RETURN LOOP-ANS]) (ALL-PERMUTATIONS [LAMBDA (L) (* kbr: "19-Oct-85 19:58") (* Returns the list of all  permutations of list L.  *) (COND ((NULL L) (LIST NIL)) (T (for PERM in (ALL-PERMUTATIONS (CDR L)) join (ALL-INSERTIONS (CAR L) PERM NIL]) (ALL-PICKS [LAMBDA (POCKET-LIST) (* kbr: "19-Oct-85 20:03") (* POCKET-LIST is a list of pockets  and this fn returns all of the  possible ways you can pick one thing  from each pocket. *) (COND ((NULL POCKET-LIST) (LIST NIL)) (T (for PICK in (ALL-PICKS (CDR POCKET-LIST)) join (for CHOICE in (CAR POCKET-LIST) collect (CONS CHOICE PICK]) (ALL-SUBSEQUENCES [LAMBDA (L MAX) (* kbr: "19-Oct-85 16:31") (* Returns all subsets of L which have  length less than or equal to MAX,  preserving the order of the elements  in L. *) (LET (TEMP) (COND ((NULL L) (LIST NIL)) (T (SETQ TEMP (ALL-SUBSEQUENCES (CDR L) MAX)) (APPEND TEMP (for X in TEMP unless (EQLENGTH X MAX) collect (CONS (CAR L) X]) (ALL-VARS [LAMBDA (TERM) (* kbr: " 6-Jul-86 09:29") (* Free variables in TERM.  Collects vars in TERM in reverse print  order of first occurrences.  This ordering is exploited in  LOOP-STOPPER. *) (LET (ANS) (ALL-VARS1 TERM) ANS]) (ALL-VARS-BAG [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (ANS) (ALL-VARS-BAG1 TERM) ANS]) (ALL-VARS-BAG1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (SETQ ANS (CONS TERM ANS))) ((FQUOTEP TERM) NIL) (T (for ARG in (FARGS TERM) do (ALL-VARS-BAG1 ARG]) (ALL-VARS-LST [LAMBDA (LST) (* kbr: " 6-Jul-86 09:31") (* Free variables occuring in a LST of  terms. *) (for TERM in LST bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (ALL-VARS TERM) LOOP-ANS)) finally (RETURN LOOP-ANS]) (ALL-VARS1 [LAMBDA (TERM) (* kbr: " 6-Jul-86 09:31") (* Called by ALL-VARS.  Add free variables in TERM to the  growing answer ANS bound by ALL-VARS.  *) (COND ((VARIABLEP TERM) (SETQ ANS (ADD-TO-SET TERM ANS))) ((FQUOTEP TERM) NIL) (T (for ARG in (FARGS TERM) do (ALL-VARS1 ARG]) (ALMOST-SUBSUMES [LAMBDA (CL1 CL2) (* kbr: "19-Oct-85 16:31") (COND ((NULL CL1) (SETQ ALMOST-SUBSUMES-LITERAL ALMOST-SUBSUMES-CONSTANT) T) ((MEMBER (CAR CL1) CL2) (ALMOST-SUBSUMES (CDR CL1) CL2)) ((MEMB-NEGATIVE (CAR CL1) CL2) (COND ((SUBSETP (CDR CL1) CL2) (SETQ ALMOST-SUBSUMES-LITERAL (CAR CL1)) T) (T NIL))) (T NIL]) (ALMOST-SUBSUMES-LOOP [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (LET (HITFLG ANS DEADLST) (SETQ HITFLG T) (while HITFLG do (SETQ HITFLG NIL) (SETQ ANS NIL) (SETQ DEADLST NIL) (for CL1 in LST do (COND ((for CL2 in LST when (AND (NEQ CL1 CL2) (NOT (MEMB CL2 DEADLST))) thereis (COND ((ALMOST-SUBSUMES CL2 CL1) (SETQ DEADLST (CONS CL1 DEADLST)) (COND ((EQ ALMOST-SUBSUMES-LITERAL ALMOST-SUBSUMES-CONSTANT) T) (T (SETQ HITFLG T) (SETQ ANS (CONS (REMOVE-NEGATIVE ALMOST-SUBSUMES-LITERAL CL1) ANS)) T))) (T NIL)))) (T (SETQ ANS (CONS CL1 ANS))))) (SETQ LST ANS)) ANS]) (ALMOST-VALUEP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (AND (NVARIABLEP TERM) (ALMOST-VALUEP1 TERM]) (ALMOST-VALUEP1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) T) ((FQUOTEP TERM) T) ((SHELLP TERM) (for ARG in (FARGS TERM) always (ALMOST-VALUEP1 ARG))) (T NIL]) (APPLY-HINTS [LAMBDA (HINTS TERM) (* kbr: "19-Oct-85 16:31") (SETQ TERM (APPLY-USE-HINT (CDR (ASSOC (QUOTE USE) HINTS)) (APPLY-INDUCT-HINT (CADR (ASSOC (QUOTE INDUCT) HINTS)) TERM))) (for X in HINT-VARIABLE-ALIST when (ASSOC (CAR X) HINTS) do (SET (CADR X) (COND ((CADDR X) (for Y in (CDR (ASSOC (CAR X) HINTS)) collect (TRANSLATE Y))) (T (CDR (ASSOC (CAR X) HINTS)))))) TERM]) (APPLY-INDUCT-HINT [LAMBDA (HINT TERM) (* kbr: "19-Oct-85 16:31") (PROG (FORMALS) (COND ((NULL HINT) (RETURN TERM))) (SETQ HINT (TRANSLATE HINT)) (SETQ FORMALS (CADR (GETPROP (FFN-SYMB HINT) (QUOTE SDEFN)))) (RETURN (CONJOIN (for CL in (IND-FORMULA (for TA in (GETPROP (FN-SYMB HINT) (QUOTE INDUCTION-MACHINE)) collect (create TESTS-AND-ALISTS TESTS _ (SUB-PAIR-VAR-LST FORMALS (FARGS HINT) (fetch (TESTS-AND-CASES TESTS) of TA)) ALISTS _ (for ARGLIST in (fetch (TESTS-AND-CASES CASES) of TA) collect (for ARG in ARGLIST as ACTUAL in (FARGS HINT) collect (CONS ACTUAL (SUB-PAIR-VAR FORMALS (FARGS HINT) ARG)))))) (LIST HINT) (LIST (LIST (TRANSLATE TERM)))) collect (DISJOIN CL NIL)) NIL]) (APPLY-USE-HINT [LAMBDA (HINT TERM) (* kbr: "20-Oct-85 19:41") (COND ((NULL HINT) TERM) (T (DUMB-IMPLICATE-LITS (CONJOIN (for PAIR in HINT bind EVENT collect (PROGN (SETQ EVENT (GETPROP (CAR PAIR) (QUOTE EVENT))) (SUBLIS-VAR (for X in (CDR PAIR) collect (CONS (TRANSLATE (CAR X)) (TRANSLATE (CADR X)))) (TRANSLATE (SELECTQ (CAR EVENT) (DEFN (LIST (QUOTE EQUAL) (CONS (CADR EVENT) (CADDR EVENT)) (CADDDR EVENT))) (REFLECT (SETQ TEMP-TEMP (GETPROP (CADR EVENT) (QUOTE SDEFN))) (LIST (QUOTE EQUAL) (CONS (CADR EVENT) (CADR TEMP-TEMP)) (CADDR TEMP-TEMP))) (CADDDR EVENT)))))) NIL) TERM]) (ARG1-IN-ARG2-UNIFY-SUBST [LAMBDA (ARG1 ARG2) (* kbr: "19-Oct-85 16:31") (COND ((OR (VARIABLEP ARG2) (FQUOTEP ARG2)) NIL) ((ONE-WAY-UNIFY ARG2 ARG1) T) (T (for ARG in (FARGS ARG2) thereis (ARG1-IN-ARG2-UNIFY-SUBST ARG1 ARG]) (ARGN0 [LAMBDA (TERM N) (* kbr: "19-Oct-85 16:31") (COND ((NEQ (CAR TERM) (QUOTE QUOTE)) (BM-NTH N TERM)) ((LITATOM (CADR TERM)) (LIST (QUOTE QUOTE) (DTACK-0-ON-END (CHCON (CADR TERM))))) ((FIXP (CADR TERM)) (COND ((LESSP (CADR TERM) 0) (LIST (QUOTE QUOTE) (MINUS (CADR TERM)))) (T (LIST (QUOTE QUOTE) (SUB1 (CADR TERM)))))) ((EQ (CAR (CADR TERM)) *1*SHELL-QUOTE-MARK) (LIST (QUOTE QUOTE) (BM-NTH N (CDR (CADR TERM))))) (T (COND ((IEQP N 1) (LIST (QUOTE QUOTE) (CAR (CADR TERM)))) (T (LIST (QUOTE QUOTE) (CDR (CADR TERM]) (ARITY [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (COND ((SETQ TEMP-TEMP (TYPE-PRESCRIPTION FNNAME)) (LENGTH (CDR TEMP-TEMP))) ((SETQ TEMP-TEMP (ASSOC FNNAME ARITY-ALIST)) (CDR TEMP-TEMP)) (T NIL]) (ASSOC-OF-APPEND [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (REDO-UNDONE-EVENTS (QUOTE ((DEFN APPEND (X Y) (IF (LISTP X) (CONS (CAR X) (APPEND (CDR X) Y)) Y)) (PROVE-LEMMA ASSOC-OF-APPEND (REWRITE) (EQUAL (APPEND (APPEND A B) C) (APPEND A (APPEND B C)))))) T (QUOTE Q) NIL NIL NIL]) (ASSUME-TRUE-FALSE [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (NOT-FLG TYPE-ARG1 TYPE-ARG2 TRUE-SEG FALSE-SEG PAIR ARG1 ARG2 INTERSECTION SWAPPED-TERM SWAP-FLG LOCAL-MUST-BE-TRUE LOCAL-MUST-BE-FALSE) (COND ((BM-MATCH TERM (NOT TERM)) (SETQ NOT-FLG T))) (COND ((AND (NVARIABLEP TERM) (NOT (FQUOTEP TERM)) (SETQ PAIR (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST))) (SETQ TYPE-ARG1 (TYPE-SET (FARGN TERM 1))) (COND ((IEQP 0 (LOGAND TYPE-ARG1 (CDR PAIR))) (SETQ LOCAL-MUST-BE-FALSE T)) ((LOGSUBSETP TYPE-ARG1 (CDR PAIR)) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (LIST (CONS (FARGN TERM 1) (CDR PAIR)))) (SETQ FALSE-SEG (LIST (CONS (FARGN TERM 1) (LOGAND (LOGNOT (CDR PAIR)) TYPE-ARG1))))))) ((BM-MATCH TERM (EQUAL ARG1 ARG2)) (COND ((EQUAL ARG1 ARG2) (SETQ LOCAL-MUST-BE-TRUE T)) ((AND (SETQ TEMP-TEMP (CDR (SASSOC TERM TYPE-ALIST))) (IEQP TEMP-TEMP TYPE-SET-TRUE)) (SETQ LOCAL-MUST-BE-TRUE T)) ((AND TEMP-TEMP (IEQP TEMP-TEMP TYPE-SET-FALSE)) (SETQ LOCAL-MUST-BE-FALSE T)) ((AND (SETQ TEMP-TEMP (CDR (SASSOC (SETQ SWAPPED-TERM (FCONS-TERM* (QUOTE EQUAL) ARG2 ARG1)) TYPE-ALIST))) (EQUAL TEMP-TEMP TYPE-SET-TRUE)) (SETQ LOCAL-MUST-BE-TRUE T)) ((AND TEMP-TEMP (IEQP TEMP-TEMP TYPE-SET-FALSE)) (SETQ LOCAL-MUST-BE-FALSE T)) (T (SETQ SWAP-FLG (TERM-ORDER ARG1 ARG2)) (SETQ TYPE-ARG1 (TYPE-SET ARG1)) (SETQ TYPE-ARG2 (TYPE-SET ARG2)) (SETQ INTERSECTION (LOGAND TYPE-ARG1 TYPE-ARG2)) (COND ((IEQP 0 INTERSECTION) (SETQ LOCAL-MUST-BE-FALSE T)) ((AND (IEQP TYPE-ARG1 TYPE-ARG2) (MEMBER TYPE-ARG1 SINGLETON-TYPE-SETS)) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (COND (SWAP-FLG (LIST (CONS SWAPPED-TERM TYPE-SET-TRUE))) (T (LIST (CONS TERM TYPE-SET-TRUE))))) (OR (IEQP TYPE-ARG1 INTERSECTION) (NOT SWAP-FLG) (SETQ TRUE-SEG (CONS (CONS ARG1 INTERSECTION) TRUE-SEG))) (OR (IEQP TYPE-ARG2 INTERSECTION) SWAP-FLG (SETQ TRUE-SEG (CONS (CONS ARG2 INTERSECTION) TRUE-SEG))) (SETQ FALSE-SEG (LIST (CONS TERM TYPE-SET-FALSE) (CONS SWAPPED-TERM TYPE-SET-FALSE))) (OR (NOT (MEMBER TYPE-ARG2 SINGLETON-TYPE-SETS)) (SETQ FALSE-SEG (CONS (CONS ARG1 (LOGAND (LOGNOT TYPE-ARG2) TYPE-ARG1)) FALSE-SEG))) (OR (NOT (MEMBER TYPE-ARG1 SINGLETON-TYPE-SETS)) (SETQ FALSE-SEG (CONS (CONS ARG2 (LOGAND (LOGNOT TYPE-ARG1) TYPE-ARG2)) FALSE-SEG)))))))) (T (SETQ TYPE-ARG1 (TYPE-SET TERM)) (COND ((IEQP TYPE-ARG1 TYPE-SET-FALSE) (SETQ LOCAL-MUST-BE-FALSE T)) ((IEQP 0 (LOGAND TYPE-ARG1 TYPE-SET-FALSE)) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (LIST (CONS TERM (LOGAND TYPE-ARG1 (LOGNOT TYPE-SET-FALSE))))) (SETQ FALSE-SEG (LIST (CONS TERM TYPE-SET-FALSE))))))) (COND (NOT-FLG (swap LOCAL-MUST-BE-TRUE LOCAL-MUST-BE-FALSE) (swap TRUE-SEG FALSE-SEG))) (SETQ TRUE-TYPE-ALIST (NCONC TRUE-SEG TYPE-ALIST)) (SETQ FALSE-TYPE-ALIST (NCONC FALSE-SEG TYPE-ALIST)) (SETQ MUST-BE-TRUE LOCAL-MUST-BE-TRUE) (SETQ MUST-BE-FALSE LOCAL-MUST-BE-FALSE) NIL]) (ATTEMPT-TO-REWRITE-RECOGNIZER [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (BM-MATCH TERM (NOT TERM)) (AND (NVARIABLEP TERM) (ASSOC (FN-SYMB TERM) RECOGNIZER-ALIST) (VARIABLEP (ARGN TERM 1]) ) (RPAQQ CODE-B-DCOMS ((* CODE-B-D *) (FNS BATCH-PROVEALL BOOLEAN BOOT-STRAP0 BREAK-LEMMA BTM-OBJECT BTM-OBJECT-OF-TYPE-SET BTM-OBJECTP BUILD-SUM CANCEL CANCEL-POSITIVE CANCEL1 CAR-CDRP CDR-ALL CHK-ACCEPTABLE-DEFN CHK-ACCEPTABLE-DCL CHK-ACCEPTABLE-ELIM-LEMMA CHK-ACCEPTABLE-GENERALIZE-LEMMA CHK-ACCEPTABLE-HINTS CHK-ACCEPTABLE-LEMMA CHK-ACCEPTABLE-META-LEMMA CHK-ACCEPTABLE-REFLECT CHK-ACCEPTABLE-REWRITE-LEMMA CHK-ACCEPTABLE-SHELL CHK-ACCEPTABLE-TOGGLE CHK-ARGLIST CHK-MEANING CHK-NEW-*1*NAME CHK-NEW-NAME CLAUSIFY CLAUSIFY-INPUT CLAUSIFY-INPUT1 CLEAN-UP-BRANCHES CNF-DNF COMMON-SWEEP COMMUTE-EQUALITIES COMPARE-STATS COMPLEMENTARY-MULTIPLEP COMPLEMENTARYP COMPLEXITY COMPRESS-POLY COMPRESS-POLY1 COMPUTE-VETOES COMSUBT1 COMSUBTERMS CONJOIN CONJOIN-CLAUSE-SETS CONJOIN2 CONS-PLUS CONS-TERM CONSJOIN CONTAINS-REWRITEABLE-CALLP CONVERT-CAR-CDR CONVERT-CONS CONVERT-NOT CONVERT-QUOTE CONVERT-TYPE-NO-TO-RECOGNIZER-TERM BM-COUNT COUNT-IFS CREATE-REWRITE-RULE DCL0 DECODE-IDATE DEFN-ASSUME-TRUE-FALSE DEFN-LOGIOR DEFN-SETUP DEFN-TYPE-SET DEFN-TYPE-SET2 DEFN-WRAPUP DEFN0 DELETE1 DELETE-TAUTOLOGIES DELETE-TOGGLES DEPEND DEPENDENT-EVENTS DEPENDENTS-OF DEPENDENTS-OF1 DESTRUCTORS DESTRUCTORS1 DETACH DETACHED-ERROR DETACHEDP DISJOIN DISJOIN-CLAUSES DISJOIN2 DTACK-0-ON-END DUMB-CONVERT-TYPE-SET-TO-TYPE-RESTRICTION-TERM DUMB-IMPLICATE-LITS DUMB-NEGATE-LIT DUMB-OCCUR DUMB-OCCUR-LST DUMP DUMP-ADD-AXIOM DUMP-ADD-SHELL DUMP-BEGIN-GROUP DUMP-DCL DUMP-DEFN DUMP-END-GROUP DUMP-HINTS DUMP-LEMMA-TYPES DUMP-OTHER DUMP-PROVE-LEMMA DUMP-TOGGLE))) (* CODE-B-D *) (DEFINEQ (BATCH-PROVEALL [LAMBDA (FILE) (* kbr: "19-Oct-85 16:31") (* FILE should contain a sequence of  forms such as (PROVEALL ...)  (PROVEALL ...)%. Each is executed.  *) (RESTART-BATCH (READ-FILE FILE]) (BOOLEAN [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LOGSUBSETP (TYPE-SET TERM) TYPE-SET-BOOLEAN]) (BOOT-STRAP0 [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (ADD-SUB-FACT NIL NIL NIL NIL T) (ADD-SUB-FACT NIL NIL NIL NIL T) (MAKUNBOUND (QUOTE LIB-FILE]) (BREAK-LEMMA [LAMBDA (NAME WHEN) (* kbr: "26-Oct-85 14:57") (OR WHEN (SETQ WHEN T)) (APPLY (FUNCTION TRACE) (LIST (LIST (QUOTE RELIEVE-HYPS) (QUOTE BREAK) (QUOTE (AND (SETQ TEMP-TEMP (ASSOC (CADR LEMMA) BROKEN-LEMMAS)) (EVAL (CDR TEMP-TEMP)) (PROGN (BM-PPR (LIST (LIST (QUOTE LEMMA) (CADR LEMMA)) (LIST (QUOTE TERM) TERM) (LIST (QUOTE UNIFY-SUBST) UNIFY-SUBST)) T) T)))))) (SETQ BROKEN-LEMMAS (ADD-TO-SET (CONS NAME WHEN) BROKEN-LEMMAS]) (BTM-OBJECT [LAMBDA (CONST) (* kbr: "19-Oct-85 16:31") (* If the shell for which CONST is the constructor has a bottom object return  the term that is that bottom object. Else, return NIL.  *) (LET (TYPE-SET ANS) (SETQ TYPE-SET (LSH 1 (CDR (ASSOC CONST SHELL-ALIST)))) (COND ((for FN in *1*BTM-OBJECTS thereis (IEQP (TYPE-SET (SETQ ANS (CONS-TERM FN NIL))) TYPE-SET)) ANS) (T NIL]) (BTM-OBJECT-OF-TYPE-SET [LAMBDA (TYPE-SET) (* kbr: "19-Oct-85 16:31") (* Returns the btm object fn symb with  the specified type set, or NIL if no  such btm object exists.  *) (COND ((NULL (CDR *1*BTM-OBJECTS)) (COND ((IEQP TYPE-SET TYPE-SET-NUMBERS) (QUOTE ZERO)) (T NIL))) (T (for X in *1*BTM-OBJECTS when (IEQP TYPE-SET (CAR (TYPE-PRESCRIPTION X))) do (RETURN X]) (BTM-OBJECTP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) (COND ((NLISTP (CADR TERM)) (EQUAL 0 (CADR TERM))) (T (AND (EQ *1*SHELL-QUOTE-MARK (CAR (CADR TERM))) (MEMB (CADR (CADR TERM)) *1*BTM-OBJECTS))))) (T (MEMB (FFN-SYMB TERM) *1*BTM-OBJECTS]) (BUILD-SUM [LAMBDA (WINNING-PAIR ALIST) (* kbr: "20-Oct-85 15:48") (COND ((NLISTP ALIST) ZERO) ((EQUAL WINNING-PAIR (CAR ALIST)) (BUILD-SUM WINNING-PAIR (CDR ALIST))) (T (CONS-PLUS (COND ((EQUAL 1 (ABS (CDR (CAR ALIST)))) (CAR (CAR ALIST))) (T (FCONS-TERM* (QUOTE TIMES) (LIST (QUOTE QUOTE) (ABS (CDR (CAR ALIST)))) (CAR (CAR ALIST))))) (BUILD-SUM WINNING-PAIR (CDR ALIST]) (CANCEL [LAMBDA (EQ1 EQ2) (* kbr: "19-Oct-85 16:31") (LET (CO1 CO2 POLY) (SETQ CO1 (ABS (FIRST-COEFFICIENT EQ1))) (SETQ CO2 (ABS (FIRST-COEFFICIENT EQ2))) (* See ADD-TERMS-TO-POT-LST for an  explanation of why we UNIONQ rather  than UNION-EQUAL the LITERALS and  LEMMAS. *) (SETQ POLY (create POLY CONSTANT _ (PLUS (TIMES CO2 (fetch (POLY CONSTANT) of EQ1)) (TIMES CO1 (fetch (POLY CONSTANT) of EQ2))) ALIST _ (CANCEL1 CO2 (CDR (fetch (POLY ALIST) of EQ1)) CO1 (CDR (fetch (POLY ALIST) of EQ2))) ASSUMPTIONS _ (UNION-EQUAL (fetch (POLY ASSUMPTIONS) of EQ1) (fetch (POLY ASSUMPTIONS) of EQ2)) LITERALS _ (UNIONQ (fetch (POLY LITERALS) of EQ1) (fetch (POLY LITERALS) of EQ2)) LEMMAS _ (UNIONQ (fetch (POLY LEMMAS) of EQ1) (fetch (POLY LEMMAS) of EQ2)))) (COND ((IMPOSSIBLE-POLYP POLY) (SETQ LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS) of POLY)) (SETQ LEMMAS-USED-BY-LINEAR (UNIONQ (fetch (POLY LEMMAS) of POLY) (fetch (POLY LITERALS) of POLY))) (RETFROM (QUOTE ADD-EQUATIONS) (QUOTE CONTRADICTION))) ((TRUE-POLYP POLY) NIL) (T POLY]) (CANCEL-POSITIVE [LAMBDA (EQUATION) (* kbr: "19-Oct-85 16:31") (COND ((GREATERP (FIRST-COEFFICIENT EQUATION) 0) (SETQ EQUATION (create POLY CONSTANT _ (fetch (POLY CONSTANT) of EQUATION) ALIST _ (CDR (fetch (POLY ALIST) of EQUATION)) ASSUMPTIONS _ (fetch (POLY ASSUMPTIONS) of EQUATION) LITERALS _ (fetch (POLY LITERALS) of EQUATION) LEMMAS _ (fetch (POLY LEMMAS) of EQUATION))) (COND ((IMPOSSIBLE-POLYP EQUATION) (SETQ LINEAR-ASSUMPTIONS (fetch (POLY ASSUMPTIONS) of EQUATION)) (SETQ LEMMAS-USED-BY-LINEAR (UNIONQ (fetch (POLY LEMMAS) of EQUATION) (fetch (POLY LITERALS) of EQUATION))) (RETFROM (QUOTE ADD-EQUATIONS) (QUOTE CONTRADICTION))) ((TRUE-POLYP EQUATION) NIL) (T EQUATION))) (T NIL]) (CANCEL1 [LAMBDA (CO1 AL1 CO2 AL2) (* kbr: "20-Oct-85 15:50") (LET (TEMP) (COND ((NULL AL1) (for PAIR in AL2 collect (CONS (CAR PAIR) (TIMES (CDR PAIR) CO2)))) ((NULL AL2) (for PAIR in AL1 collect (CONS (CAR PAIR) (TIMES (CDR PAIR) CO1)))) ((NOT (TERM-ORDER (CAAR AL1) (CAR (CAR AL2)))) (CONS (CONS (CAR (CAR AL1)) (TIMES (CDR (CAR AL1)) CO1)) (CANCEL1 CO1 (CDR AL1) CO2 AL2))) ((EQUAL (CAR (CAR AL1)) (CAR (CAR AL2))) (SETQ TEMP (PLUS (TIMES CO1 (CDR (CAR AL1))) (TIMES CO2 (CDR (CAR AL2))))) (COND ((EQUAL TEMP 0) (CANCEL1 CO1 (CDR AL1) CO2 (CDR AL2))) (T (CONS (CONS (CAR (CAR AL1)) TEMP) (CANCEL1 CO1 (CDR AL1) CO2 (CDR AL2)))))) (T (CONS (CONS (CAR (CAR AL2)) (TIMES (CDR (CAR AL2)) CO2)) (CANCEL1 CO1 AL1 CO2 (CDR AL2]) (CAR-CDRP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET ((FLAT (NCHARS X))) (AND (EQ (NTHCHAR X 1) (QUOTE C)) (EQ (NTHCHAR X FLAT) (QUOTE R)) (IGREATERP FLAT 2) (for I from 2 by 1 to (SUB1 FLAT) always (MEMB (NTHCHAR X I) (QUOTE (A D)))) (CDR (DREVERSE (CDR (UNPACK X]) (CDR-ALL [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (for X1 in X collect (CDR X1]) (CHK-ACCEPTABLE-DEFN [LAMBDA (NAME ARGS BODY RELATION-MEASURE-LST) (* kbr: "26-Oct-85 15:30") (LET ((ARITY-ALIST (CONS (CONS NAME (LENGTH-TO-ATOM ARGS)) ARITY-ALIST))) (CHK-NEW-NAME NAME NIL) (CHK-NEW-*1*NAME NAME) (CHK-ARGLIST NAME ARGS) (COND ((IGREATERP (LENGTH ARGS) 32) (ERROR1 (PQUOTE (PROGN TOO MANY ARGS ! BECAUSE OF OUR USE OF 32-BIT WORDS TO ENCODE SETS OF RECURSION CONTROLLERS WE CANNOT ACCEPT FUNCTIONS , SUCH AS (!PPR NAME NIL) , WITH MORE THAN 32 ARGUMENTS %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT)))) (SETQ BODY (TRANSLATE BODY)) (COND ((NOT IN-BOOT-STRAP-FLG) (CHK-MEANING NAME (ALL-FNNAMES BODY)))) (FREE-VAR-CHK NAME ARGS BODY) (for X in RELATION-MEASURE-LST do (COND ((NOT (AND (LISTP X) (MEMB (CAR X) WELL-ORDERING-RELATIONS) (LISTP (CDR X)) (NULL (CDDR X)) (SUBSETP (ALL-VARS (TRANSLATE (CADR X))) ARGS))) (ERROR1 (PQUOTE (PROGN EACH MEMBER OF THE FOURTH ARGUMENT TO DEFN MUST BE OF THE FORM (!PPR (QUOTE (REL TERM)) NIL) , WHERE REL IS THE NAME OF A WELL-FOUNDED RELATION AND TERM IS A TERM ALL OF WHOSE VARIABLES ARE AMONG THE FORMALS OF THE FUNCTION BEING DEFINED %.)) NIL (QUOTE SOFT))))) NIL]) (CHK-ACCEPTABLE-DCL [LAMBDA (NAME ARGS) (* kbr: "19-Oct-85 16:31") (CHK-ARGLIST NAME ARGS) (CHK-NEW-NAME NAME NIL) (COND ((IGREATERP (LENGTH ARGS) 32) (ERROR1 (PQUOTE (PROGN TOO MANY ARGS ! BECAUSE OF OUR USE OF 32-BIT WORDS TO ENCODE SETS OF RECURSION CONTROLLERS WE CANNOT ACCEPT FUNCTIONS , SUCH AS (!PPR NAME NIL) , WITH MORE THAN 32 ARGUMENTS %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT]) (CHK-ACCEPTABLE-ELIM-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "20-Oct-85 15:51") TYPE (LET (LST ALLVARS LHS RHS DESTS) (SETQ LST (UNPRETTYIFY TERM)) (COND ((NOT (AND LST (NULL (CDR LST)) (BM-MATCH (CDR (CAR LST)) (EQUAL LHS RHS)) (VARIABLEP RHS) (NVARIABLEP LHS) (for ARG in (SARGS LHS) thereis (NVARIABLEP ARG)))) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE ELIM LEMMA BECAUSE ITS CONCLUSION IS NOT AN EQUALITY OF THE FORM IQUOTIENT (EQUAL TERM VAR/) WHERE TERM CONTAINS SOME NON-VARIABLE ARGUMENTS AND VAR IS A VARIABLE %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT)))) (SETQ ALLVARS (ALL-VARS TERM)) (COND ((NOT (SETQ DESTS (DESTRUCTORS (LIST LHS)))) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE ELIM LEMMA BECAUSE THE LEFT HAND SIDE OF THE CONCLUSION DOES NOT CONTAIN ANY TERMS OF THE FORM IQUOTIENT (FN VAR1 VAR2 ... VARN/) WHERE FN IS A RECURSIVE FUNCTION AND THE VARI ARE ALL DISTINCT VARIABLES %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) ((NOT (NO-DUPLICATESP (for X in DESTS collect (FN-SYMB X)))) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE ELIM LEMMA BECAUSE THE LEFT HAND SIDE OF THE CONCLUSION CONTAINS TWO OR MORE DESTRUCTOR TERMS WITH THE SAME FUNCTION SYMBOL %.)) NIL (QUOTE SOFT))) ((NOT (for X in DESTS always (SUBSETP ALLVARS (SARGS X)))) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS NOT AN ACCEPTABLE ELIM LEMMA BECAUSE SOME OF THE DESTRUCTOR NESTS DO NOT MENTION ALL OF THE VARIABLES IN THE LEMMA %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) ((OCCUR RHS (SUB-PAIR-EXPR DESTS (for X in DESTS collect (TRUE X)) LHS)) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE ELIM LEMMA BECAUSE THE RIGHT-HAND SIDE OF THE CONCLUSION , (!PPR RHS NIL) , OCCURS IN THE LEFT-HAND SIDE IN PLACES OTHER THAN THE DESTRUCTOR (PLURAL? DESTS TERMS TERM) (!PPR-LIST DESTS) %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE RHS) RHS (QUOTE DESTS) DESTS) (QUOTE SOFT))) (T (for X in DESTS when (GETPROP (CAR X) (QUOTE ELIMINATE-DESTRUCTORS-DESTS)) do (ERROR1 (PQUOTE (PROGN WE DO NOT KNOW HOW TO HANDLE MULTIPLE ELIMINATION LEMMAS FOR THE SAME FUNCTION SYMBOL, E.G., (!PPR (CAR X) NIL) %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))))) NIL]) (CHK-ACCEPTABLE-GENERALIZE-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "19-Oct-85 16:31") NAME TYPE TERM T]) (CHK-ACCEPTABLE-HINTS [LAMBDA (HINTS) (* kbr: "26-Oct-85 17:49") (LET (EVENT) (for X in HINTS do (COND ((NLISTP X) (ERROR1 (PQUOTE (PROGN EACH ELEMENT OF THE HINTS ARGUMENT TO PROVE-LEMMA MUST BE A PAIR BUT (!PPR X NIL) IS NOT %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) (T (SELECTQ (CAR X) (USE (for PAIR in (CDR X) do (OR (AND (LISTP PAIR) (LITATOM (CAR PAIR)) (SETQ EVENT (GETPROP (CAR PAIR) (QUOTE EVENT))) (MEMB (CAR EVENT) (QUOTE (ADD-AXIOM PROVE-LEMMA DEFN REFLECT))) (NULL (CDR (LAST PAIR))) (for X in (CDR PAIR) always (AND (VARIABLEP (TRANSLATE (CAR X))) (PROGN (TRANSLATE (CADR X)) T)))) (ERROR1 (PQUOTE (PROGN THE USE HINT MUST HAVE THE FORM (!PPR H NIL) WHERE EACH EVENTI IS THE NAME OF AN ADD-AXIOM , PROVE-LEMMA , DEFN , OR REFLECT EVENT , EACH VI IS A VARIABLE NAME , AND EACH TI IS A TERM %. THE ENTRY (!PPR PAIR NIL) IS THUS UNACCEPTABLE %.)) (BINDINGS (QUOTE H) (QUOTE (USE (EVENT1 (V1 T1) ... (VN TN)) ... (EVENTK (VK TK) ... (VM TM)))) (QUOTE PAIR) PAIR) (QUOTE SOFT))))) (EXPAND (for X in (CDR X) bind Y do (SETQ Y (TRANSLATE X)) (OR (AND (NVARIABLEP Y) (NOT (FQUOTEP Y)) (GETPROP (FFN-SYMB Y) (QUOTE SDEFN))) (ERROR1 (PQUOTE (PROGN EVERY ELEMENT OF AN EXPAND HINT MUST BE AN APPLICATION OF A DEFINED FUNCTION TO SOME ARGUMENTS AND (!PPR Y NIL) IS NOT %.)) (BINDINGS (QUOTE Y) Y) (QUOTE SOFT))))) (DISABLE (for X in (CDR X) do (OR (LITATOM X) (ERROR1 (PQUOTE (PROGN EVERY ELEMENT OF A DISABLE HINT MUST BE A LITERAL NLISTP AND (!PPR X NIL) IS NOT %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))))) (INDUCT (OR (NULL (CADR X)) (AND (SETQ HINT (TRANSLATE (CADR X))) (NVARIABLEP HINT) (NOT (FQUOTEP HINT)) (GETPROP (FFN-SYMB HINT) (QUOTE INDUCTION-MACHINE)) (GETPROP (FFN-SYMB HINT) (QUOTE SDEFN)) (for X in (FARGS HINT) always (VARIABLEP X)) (NO-DUPLICATESP (FARGS HINT))) (ERROR1 (PQUOTE (PROGN THE INDUCT HINT MUST HAVE EITHER THE FORM (!PPR G NIL) OR THE FORM (!PPR H NIL) WHERE FN IS A RECURSIVELY DEFINED FUNCTION AND THE VI ARE DISTINCT VARIABLES %. THUS, (!PPR X NIL) IS AN INAPPROPRIATE INDUCT HINT %.)) (BINDINGS (QUOTE G) (QUOTE (INDUCT NIL)) (QUOTE H) (QUOTE (INDUCT (FN V1 ... VN))) (QUOTE X) X) (QUOTE SOFT)))) (COND ((ASSOC (CAR X) HINT-VARIABLE-ALIST) (COND ((CADDR (ASSOC (CAR X) HINT-VARIABLE-ALIST)) (for Y in (CDR X) do (TRANSLATE Y))))) (T (ERROR1 (PQUOTE (PROGN EACH ENTRY IN THE HINTS ARGUMENT OF PROVE-LEMMA MUST BE A LIST BEGINNING WITH ONE OF THE ATOMS USE , EXPAND , DISABLE , INDUCT , OR TIME. THE PROPOSED HINT (!PPR X NIL) IS THUS INAPPROPRIATE %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT]) (CHK-ACCEPTABLE-LEMMA [LAMBDA (NAME TYPES TERM) (* kbr: "26-Nov-85 15:39") (CHK-NEW-NAME NAME NIL) (SETQ TERM (TRANSLATE TERM)) (COND (IN-ADD-AXIOM-FLG (CHK-MEANING NAME (ALL-FNNAMES TERM)))) (for TYPE in TYPES do (COND ((MEMB (COND ((LISTP TYPE) (CAR TYPE)) (T TYPE)) LEMMA-TYPES) (APPLY* (PACK (LIST "CHK-ACCEPTABLE-" (COND ((LISTP TYPE) (CAR TYPE)) (T TYPE)) "-LEMMA")) NAME TYPE TERM)) (T (ERROR1 (PQUOTE (PROGN (!PPR TYPE NIL) IS NOT AMONG THE LEGAL TYPES, VIZ. , (!LIST LEMMA-TYPES) %.)) (BINDINGS (QUOTE TYPE) TYPE (QUOTE LEMMA-TYPES) LEMMA-TYPES) (QUOTE SOFT]) (CHK-ACCEPTABLE-META-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "19-Oct-85 16:31") (LET (FN1 V1 A1 V2 A2 FN2 V3 V4) (COND ((AND (NOT IN-ADD-AXIOM-FLG) NONCONSTRUCTIVE-AXIOM-NAMES) (ERROR1 (PQUOTE (PROGN META LEMMAS MUST BE PROVED IN A CONSTRUCTIVE HISTORY %. THE CURRENT HISTORY CONTAINS THE NONCONSTRUCTIVE (PLURAL? LST AXIOMS AXIOM) (!LIST LST) %. IF THIS METALEMMA IS PROVED USING UNSOUND AXIOMS YOU MAY GETPROP WIPED OUT BY THE APPLICATION OF THE METAFUNCTION %.)) (BINDINGS (QUOTE LST) NONCONSTRUCTIVE-AXIOM-NAMES) (QUOTE WARNING))) ((NOT (AND (BM-MATCH TERM (IMPLIES (FORMP V1) (AND (EQUAL (MEANING V2 A1) (MEANING (LIST FN1 V3) A2)) (FORMP (LIST FN2 V4))))) (VARIABLEP V1) (VARIABLEP A1) (EQ V1 V2) (EQ V1 V3) (EQ V1 V4) (EQ A1 A2) (NEQ V1 A1) (GETPROP FN1 (QUOTE LISP-CODE)) (EQ FN1 FN2))) (ERROR1 (PQUOTE (PROGN META LEMMAS HAVE TO HAVE THE FORM (!PPR X NIL) WHERE V AND A ARE DISTINCT VARIABLES AND FN IS AN EXPLICIT VALUE PRESERVING FUNCTION %. (!PPR NAME NIL) DOES NOT HAVE THIS FORM %.)) (BINDINGS (QUOTE X) (QUOTE (IMPLIES (FORMP V) (AND (EQUAL (MEANING V A) (MEANING (FN V) A)) (FORMP (FN V))))) (QUOTE NAME) NAME) (QUOTE SOFT))) ((NOT (AND (BM-MATCH TYPE (CONS (QUOTE META) FNS)) (for FN in FNS always (AND (LITATOM FN) (GETPROP FN (QUOTE TYPE-PRESCRIPTION-LST)))))) (ERROR1 (PQUOTE (PROGN META LEMMAS MUST BE STORED UNDER ONE OR MORE FUNCTIONS NAMED BY THE USER IN A LEMMA TYPE OF THE FORM (!PPR X NIL) WHERE THE FNI ARE FUNCTION NAMES %. (!PPR TYPE NIL) IS NOT OF THIS FORM %.)) (BINDINGS (QUOTE X) (QUOTE (META FN1 FN2 ... FNN)) (QUOTE TYPE) TYPE) (QUOTE SOFT)))) T]) (CHK-ACCEPTABLE-REFLECT [LAMBDA (NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST)(* kbr: "26-Oct-85 17:50") (LET (FN ARGS BODY) (CHK-NEW-NAME NAME NIL) (CHK-NEW-*1*NAME NAME) (COND ((OR (NOT (BM-MATCH (FORMULA-OF SATISFACTION-LEMMA-NAME) (EQUAL (CONS FN ARGS) BODY))) (MEMB FN *1*BTM-OBJECTS) (ASSOC FN SHELL-ALIST)) (ERROR1 (PQUOTE (PROGN THE SECOND ARGUMENT OF REFLECT MUST BE THE NAME OF A LEMMA OF THE FORM (!PPR (QUOTE (EQUAL (FN ARG1 ... ARGN) BODY)) NIL) WHERE FN IS NOT A SHELL CONSTRUCTOR OR BOTTOM OBJECT FUNCTION SYMBOL %. (!PPR LEMMA NIL) IS NOT OF THIS FORM %.)) (BINDINGS (QUOTE LEMMA) SATISFACTION-LEMMA-NAME) (QUOTE SOFT)))) (CHK-ARGLIST NAME ARGS) (SETQ BODY (TRANSLATE BODY)) (COND ((NOT IN-BOOT-STRAP-FLG) (CHK-MEANING NAME (ALL-FNNAMES BODY)))) (FREE-VAR-CHK NAME ARGS BODY) (for X in RELATION-MEASURE-LST do (COND ((NOT (AND (LISTP X) (MEMB (CAR X) WELL-ORDERING-RELATIONS) (LISTP (CDR X)) (NULL (CDDR X)) (SUBSETP (ALL-VARS (TRANSLATE (CADR X))) ARGS))) (ERROR1 (PQUOTE (PROGN EACH MEMBER OF THE THIRD ARGUMENT TO REFLECT MUST BE OF THE FORM (!PPR (QUOTE (REL TERM)) NIL) , WHERE REL IS THE NAME OF A WELL-FOUNDED RELATION AND TERM IS A TERM ALL OF WHOSE VARIABLES ARE AMONG THE FORMALS OF THE FUNCTION BEING DEFINED %.)) NIL (QUOTE SOFT))))) NIL]) (CHK-ACCEPTABLE-REWRITE-LEMMA [LAMBDA (NAME TYPE TERM) (* kbr: "20-Oct-85 15:53") TYPE (for X in (UNPRETTYIFY TERM) bind (TOP-FNNAME-VAR REWRITE-RULE LHS ALL-VARS-HYPS ALL-VARS-CONCL MAX-TERMS LST HYPS CONCL) do (SETQ HYPS (CAR X)) (SETQ CONCL (CDR X)) (SETQ TOP-FNNAME-VAR (TOP-FNNAME CONCL)) (COND ((ACCEPTABLE-TYPE-PRESCRIPTION-LEMMAP HYPS CONCL) T) ((NULL TOP-FNNAME-VAR) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE REWRITE LEMMA BECAUSE IT REWRITES A VARIABLE %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) ((EQ TOP-FNNAME-VAR (QUOTE IF)) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE REWRITE LEMMA BECAUSE IT REWRITES AN IF-EXPRESSION %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) ((FQUOTEP CONCL) NIL) ((AND (NOT NO-BUILT-IN-ARITH-FLG) (OR (BM-MATCH CONCL (NOT (LESSP & &))) (BM-MATCH CONCL (LESSP & &)))) (SETQ LST (EXTERNAL-LINEARIZE CONCL T)) (COND ((OR (NOT (AND LST (NULL (CDR LST)))) (NOT (AND (CAR LST) (NULL (CDR (CAR LST)))))) (ERROR1 (PQUOTE (PROGN LINEARIZE RETURNED A LIST OF MORE THAN ONE THING , EVEN THOUGH CALLED ON A LESSP NLISTP !)) NIL (QUOTE HARD)))) (SETQ ALL-VARS-HYPS (ALL-VARS-LST HYPS)) (SETQ ALL-VARS-CONCL (ALL-VARS CONCL)) (SETQ MAX-TERMS (for PAIR in (fetch (POLY ALIST) of (CAR (CAR LST))) when (AND (NVARIABLEP (CAR PAIR)) (SUBSETP ALL-VARS-CONCL (UNIONQ (ALL-VARS (CAR PAIR)) ALL-VARS-HYPS)) (for PAIR2 in (fetch (POLY ALIST) of (CAR (CAR LST))) when (NEQ PAIR2 PAIR) never (AND (LESSP (FORM-COUNT (CAR PAIR)) (FORM-COUNT (CAR PAIR2))) (SUBBAGP (ALL-VARS-BAG (CAR PAIR)) (ALL-VARS-BAG (CAR PAIR2)))))) collect (CAR PAIR))) (COND ((NULL MAX-TERMS) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN UNACCEPTABLE REWRITE LEMMA BECAUSE THE NLISTP OF ITS CONCLUSION IS A LESSP AND IT CANNOT BE HANDLED BY OUR LINEAR ARITHMETIC PACKAGE. TO BE ACCEPTABLE, AT LEAST ONE NONVARIABLE ADDEND OF THE CONCLUSION MUST SATISFY TWO PROPERTIES. FIRST, IT MUST CONTAIN ALL THE VARIABLES OF THE LEMMA THAT ARE NOT IN THE HYPOTHESES. SECOND, IT MUST NOT BE THE CASE THAT UNDER EVERY SUBSTITUTION, THE TERM IS SMALLER THAN ANOTHER ADDEND OF THE CONCLUSION. %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT)))) (for X in MAX-TERMS when (NON-RECURSIVE-DEFNP (FFN-SYMB X)) do (ERROR1 (PQUOTE (PROGN NOTE THAT THE LINEAR LEMMA (!PPR NAME NIL) IS BEING STORED UNDER THE TERM (!PPR X NIL) , WHICH IS UNUSUAL BECAUSE (!PPR FN NIL) IS A NONRECURSIVE FUNCTION SYMBOL %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE X) X (QUOTE FN) (FFN-SYMB X)) (QUOTE WARNING))) (for X in MAX-TERMS when (NOT (SUBSETP ALL-VARS-HYPS (ALL-VARS X))) do (ERROR1 (PQUOTE (PROGN WHEN THE LINEAR LEMMA (!PPR NAME NIL) IS STORED UNDER (!PPR X NIL) IT CONTAINS THE FREE (PLURAL? VARS VARIABLES VARIABLE) (!LIST VARS) WHICH WILL BE CHOSEN BY INSTANTIATING THE (PLURAL? LST HYPOTHESES HYPOTHESIS) (!PPR-LIST LST) %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE X) X (QUOTE VARS) (SET-DIFF ALL-VARS-HYPS (ALL-VARS X)) (QUOTE LST) (for HYP in HYPS bind (VARS _ (SET-DIFF ALL-VARS-HYPS (ALL-VARS X))) when (INTERSECTP VARS (ALL-VARS HYP)) collect (PROGN (SETQ VARS (SET-DIFF VARS (ALL-VARS HYP))) HYP))) (QUOTE WARNING))) T) (T (SETQ REWRITE-RULE (CREATE-REWRITE-RULE NAME HYPS CONCL NIL)) (SETQ ALL-VARS-HYPS (ALL-VARS-LST HYPS)) (SETQ ALL-VARS-CONCL (ALL-VARS (COND ((BM-MATCH CONCL (EQUAL LHS &)) LHS) (T CONCL)))) (COND ((NON-RECURSIVE-DEFNP (TOP-FNNAME CONCL)) (ERROR1 (PQUOTE (PROGN NOTE THAT THE REWRITE RULE (!PPR NAME NIL) WILL BE STORED SO AS TO APPLY ONLY TO TERMS WITH THE NONRECURSIVE FUNCTION SYMBOL (!PPR FN NIL) %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE FN) (TOP-FNNAME CONCL)) (QUOTE WARNING)))) (COND ((NOT (SUBSETP ALL-VARS-HYPS ALL-VARS-CONCL)) (ERROR1 (PQUOTE (PROGN NOTE THAT (!PPR NAME NIL) CONTAINS THE FREE (PLURAL? VARS VARIABLES VARIABLE) (!LIST VARS) WHICH WILL BE CHOSEN BY INSTANTIATING THE (PLURAL? LST HYPOTHESES HYPOTHESIS) (!PPR-LIST LST) %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE VARS) (SET-DIFF ALL-VARS-HYPS ALL-VARS-CONCL) (QUOTE LST) (for HYP in HYPS bind (VARS _ (SET-DIFF ALL-VARS-HYPS ALL-VARS-CONCL)) when (INTERSECTP VARS (ALL-VARS HYP)) collect (PROGN (SETQ VARS (SET-DIFF VARS (ALL-VARS HYP))) HYP))) (QUOTE WARNING))) ((AND (ATTEMPT-TO-REWRITE-RECOGNIZER CONCL) HYPS) (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) WILL SLOW DOWN THE THEOREM-PROVER BECAUSE IT WILL CAUSE BACKWARD CHAINING ON EVERY INSTANCE OF A PRIMITIVE TYPE EXPRESSION %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE WARNING)))) (for OLD-RULE in (GETPROP (TOP-FNNAME CONCL) (QUOTE LEMMAS)) unless (OR (DISABLEDP (fetch (REWRITE-RULE NAME) of OLD-RULE)) (META-LEMMAP OLD-RULE)) do (COND ((SUBSUMES-REWRITE-RULE OLD-RULE REWRITE-RULE) (ERROR1 (PQUOTE (PROGN THE PREVIOUSLY ADDED LEMMA , (!PPR OLDNAME NIL) , COULD BE APPLIED WHENEVER THE NEWLY PROPOSED (!PPR NAME NIL) COULD !)) (BINDINGS (QUOTE NAME) NAME (QUOTE OLDNAME) (fetch (REWRITE-RULE NAME) of OLD-RULE)) (QUOTE WARNING))) ((SUBSUMES-REWRITE-RULE REWRITE-RULE OLD-RULE) (ERROR1 (PQUOTE (PROGN THE NEWLY PROPOSED LEMMA , (!PPR NAME NIL) , COULD BE APPLIED WHENEVER THE PREVIOUSLY ADDED LEMMA (!PPR OLDNAME NIL) COULD %. // //)) (BINDINGS (QUOTE NAME) NAME (QUOTE OLDNAME) (fetch (REWRITE-RULE NAME) of OLD-RULE)) (QUOTE WARNING]) (CHK-ACCEPTABLE-SHELL [LAMBDA (SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (* kbr: "26-Nov-85 15:43") (LET (DESTRUCTOR-NAMES NAMES AXIOM-NAMES AC DV TR L FLG) (* Check that there is a type no  available. *) (NEXT-AVAILABLE-TYPE-NO) (for TUPLE in DESTRUCTOR-TUPLES unless (BM-MATCH TUPLE (LIST & & &)) do (ERROR1 (PQUOTE (PROGN THE DESTRUCTOR-TUPLES ARGUMENT TO ADD-SHELL MUST BE A LIST OF TRIPLES OF THE FORM (!PPR (QUOTE (NAME (FLG RECOGNIZER ...) DEFAULT-FN-SYMB)) NIL) WHERE NAME IS THE NAME OF THE ACCESSOR , FLG IS EITHER ONE-OF OR NONE-OF , AND DEFAULT-FN-SYMB IS THE FUNCTION SYMBOL FOR THE DEFAULT VALUE %.)) (BINDINGS) (QUOTE SOFT))) (SETQ DESTRUCTOR-NAMES (for TUPLE in DESTRUCTOR-TUPLES collect (CAR TUPLE))) (SETQ NAMES (CONS SHELL-NAME (CONS RECOGNIZER DESTRUCTOR-NAMES))) (COND (BTM-FN-SYMB (SETQ NAMES (CONS BTM-FN-SYMB NAMES)))) (for NAME in NAMES do (CHK-NEW-NAME NAME NIL) (CHK-NEW-*1*NAME NAME) (COND ((EQ (CAR (LAST (UNPACK NAME))) (QUOTE -)) (ERROR1 (PQUOTE (PROGN HYPHEN , AS IN (!PPR NAME NIL) , IS NOT ALLOWED AS THE LAST CHARACTER IN A SHELL NAME !)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))))) (COND ((NOT (NO-DUPLICATESP NAMES)) (ERROR1 (PQUOTE (PROGN MULTIPLE USE OF THE SAME NAME !)) (BINDINGS) (QUOTE SOFT)))) (for TUPLE in DESTRUCTOR-TUPLES do (BM-MATCH TUPLE (LIST AC TR DV)) (COND ((AND (NEQ DV (QUOTE TRUE)) (NEQ DV (QUOTE FALSE)) (NOT (MEMB DV *1*BTM-OBJECTS)) (OR (NULL BTM-FN-SYMB) (NEQ DV BTM-FN-SYMB))) (ERROR1 (PQUOTE (PROGN THE DEFAULT OBJECT FOR A TYPE-RESTRICTED SHELL COMPONENT MUST BE A BOTTOM OBJECT FUNCTION SYMBOL OR ELSE MUST BE TRUE OR FALSE ! (!PPR DV NIL) IS NOT SUCH AN OBJECT %.)) (BINDINGS (QUOTE DV) DV) (QUOTE SOFT)))) (COND ((NOT (AND (BM-MATCH TR (CONS FLG L)) (OR (EQ FLG (QUOTE ONE-OF)) (EQ FLG (QUOTE NONE-OF))) (for X in L always (ASSOC X (CONS (CONS RECOGNIZER 0) RECOGNIZER-ALIST))))) (ERROR1 (PQUOTE (PROGN THE TYPE RESTRICTION TERM FOR A SHELL COMPONENT MUST BE A LIST OF THE FORM (!PPR (QUOTE (ONE-OF ...)) NIL) OR (!PPR (QUOTE (NONE-OF ...)) NIL) WHERE ... IS A LIST OF RECOGNIZER NAMES %.)) NIL (QUOTE SOFT)))) (COND ((NOT (OR (AND (EQ DV BTM-FN-SYMB) (OR (AND (EQ FLG (QUOTE ONE-OF)) (MEMB RECOGNIZER L)) (AND (EQ FLG (QUOTE NONE-OF)) (NOT (MEMB RECOGNIZER L))))) (AND (NEQ DV BTM-FN-SYMB) (EQUAL (EQUAL FLG (QUOTE ONE-OF)) (LOGSUBSETP (CAR (TYPE-PRESCRIPTION DV)) (for X in L bind (LOOP-ANS _ 0) when (NEQ X RECOGNIZER) do (SETQ LOOP-ANS (LOGOR LOOP-ANS (CDR (ASSOC X RECOGNIZER-ALIST )))) finally (RETURN LOOP-ANS))))))) (ERROR1 (PQUOTE (PROGN THE DEFAULT VALUE (!PPR DV NIL) DOES NOT SATISFY THE TYPE RESTRICTION (!PPR TR NIL) SPECIFIED FOR THE (!PPR AC NIL) COMPONENT %.)) (BINDINGS (QUOTE TR) TR (QUOTE DV) DV (QUOTE AC) AC) (QUOTE SOFT))))) (COND (DESTRUCTOR-NAMES (for TUPLE in DESTRUCTOR-TUPLES do (BM-MATCH TUPLE (LIST AC TR DV)) (SETQ AXIOM-NAMES (CONS (PACK (LIST AC "-" SHELL-NAME)) AXIOM-NAMES)) (SETQ AXIOM-NAMES (CONS (PACK (LIST AC "-N" RECOGNIZER)) AXIOM-NAMES)) (AND (NOT (EQUAL TR (QUOTE (NONE-OF)))) (SETQ AXIOM-NAMES (CONS (PACK (LIST AC "-TYPE-RESTRICTION")) AXIOM-NAMES))) (SETQ AXIOM-NAMES (CONS (PACK (LIST AC "-LESSP")) AXIOM-NAMES)) (SETQ AXIOM-NAMES (CONS (PACK (LIST AC "-LESSEQP")) AXIOM-NAMES))) (SETQ AXIOM-NAMES (CONS (PACK (LIST SHELL-NAME "-EQUAL")) AXIOM-NAMES)) (SETQ AXIOM-NAMES (CONS (PACK (CONS SHELL-NAME (for AC in DESTRUCTOR-NAMES join (LIST "-" AC)))) AXIOM-NAMES)) (SETQ AXIOM-NAMES (CONS (PACK (NCONC1 (CDR (for AC in DESTRUCTOR-NAMES join (LIST "-" AC))) "-ELIM")) AXIOM-NAMES)) (SETQ AXIOM-NAMES (CONS (PACK (LIST "COUNT-" SHELL-NAME)) AXIOM-NAMES)))) (COND ((NOT (NO-DUPLICATESP (APPEND NAMES AXIOM-NAMES))) (ERROR1 (PQUOTE (PROGN THE ADDITION OF A SHELL INTRODUCES MANY NEW AXIOM NAMES %. THE NEW NAMES ARE CREATED FROM THE SHELL NAME , RECOGNIZER , BOTTOM OBJECT , AND DESTRUCTOR NAMES SUPPLIED IN THE ADD-SHELL COMMAND %. THE NAMES SUPPLIED IN THIS INSTANCE OF THE ADD-SHELL COMMAND DO NOT LEAD TO DISTINCT AXIOM NAMES %. THE AXIOM NAMES GENERATED ARE : (!LIST AXIOM-NAMES ) %.)) (BINDINGS (QUOTE AXIOM-NAMES) AXIOM-NAMES) (QUOTE SOFT)))) (for X in AXIOM-NAMES do (CHK-NEW-NAME X NIL)) T]) (CHK-ACCEPTABLE-TOGGLE [LAMBDA (NAME OLDNAME FLG) (* kbr: "19-Oct-85 16:31") (CHK-NEW-NAME NAME NIL) (MAIN-EVENT-OF OLDNAME) (OR (EQ FLG T) (EQ FLG NIL) (ERROR1 (PQUOTE (PROGN THE THIRD ARGUMENT OF TOGGLE MUST BE T OR NIL AND (!PPR FLG NIL) IS NOT %.)) (BINDINGS (QUOTE FLG) FLG) (QUOTE SOFT]) (CHK-ARGLIST [LAMBDA (NAME ARGS) (* kbr: "19-Oct-85 16:31") (COND ((OR (NOT (NO-DUPLICATESP ARGS)) (for ARG in ARGS thereis (OR (ILLEGAL-NAME ARG) (MEMB ARG (QUOTE (T F NIL))))) (CDR (LAST ARGS))) (* T and F are merely confusing, not  illegal. *) (ERROR1 (PQUOTE (PROGN THE ARGUMENT LIST TO (!PPR NAME NIL) , I.E., (!PPR ARGS NIL) , IS NOT A LIST OF DISTINCT VARIABLES NAMES %.)) (BINDINGS (QUOTE ARGS) ARGS (QUOTE NAME) NAME) (QUOTE SOFT]) (CHK-MEANING [LAMBDA (NAME LST) (* kbr: "19-Oct-85 16:31") (LET (FNS) (SETQ FNS (INTERSECTION LST META-NAMES)) (COND (FNS (ERROR1 (PQUOTE (PROGN USE OF THE (PLURAL? FNS FUNCTIONS FUNCTION) (!LIST FNS) IN AN AXIOM OR DEFINITION MAY RENDER THE THEORY INCONSISTENT %.)) (BINDINGS (QUOTE FNS) FNS) (QUOTE WARNING)))) NIL]) (CHK-NEW-*1*NAME [LAMBDA (NAME) (* kbr: "22-Oct-85 15:57") (COND ((OR (NOT (LITATOM (PACK (LIST STRING-WEIRD NAME)))) (AND (NOT IN-BOOT-STRAP-FLG) (OR (GETD (PACK (LIST STRING-WEIRD NAME))) (HAS-LIB-PROPS (PACK (LIST STRING-WEIRD NAME)))))) (ERROR1 (PQUOTE (PROGN THE NLISTP (!PPR FN NIL) , WHICH IS DERIVED FROM (!PPR NAME NIL) AND USED FOR INTERNAL PURPOSES , IS NOT A LITERAL ATOM, HAS A LISP FUNCTION DEFINITION OR LIB-PROP PROPERTIES %. YOU SHOULD CHANGE THE NAME OF YOUR FUNCTION TO AVOID CLASHES OF THIS SORT %.)) (BINDINGS (QUOTE NAME) NAME (QUOTE FN) (PACK (LIST STRING-WEIRD NAME))) (QUOTE SOFT]) (CHK-NEW-NAME [LAMBDA (NAME QUIET-FLG) (* kbr: "24-Oct-85 18:11") (* Checks that NAME has the correct syntax for use as a symbol in the theory  (and hence as an event name)%. Further checks that the name has no properties  and is not one of the symbols about which there are syntactic conventions  (e.g., LIST, CADR, NIL, QUOTE)%. Thus there are no axioms about NAME.  *) (COND ((ILLEGAL-NAME NAME) (COND (QUIET-FLG NIL) (T (ERROR1 (PQUOTE (PROGN (!PPR NAME NIL) IS AN ILLEGAL OBJECT TO USE FOR A NAME !)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))))) ((PROPERTYLESS-SYMBOLP NAME) (COND (QUIET-FLG NIL) (T (ERROR1 (PQUOTE (PROGN THE NAME (!PPR NAME NIL) IS A RESERVED SYMBOL AND CANNOT BE USED AS A USER NAME %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))))) ((HAS-LIB-PROPS NAME) (COND (QUIET-FLG NIL) (T (ERROR1 (PQUOTE (PROGN NAME CURRENTLY IN USE : (!PPR NAME NIL) %.)) (BINDINGS (QUOTE NAME) NAME) (COND (IN-BOOT-STRAP-FLG (QUOTE WARNING)) (T (QUOTE SOFT))))))) (T T]) (CLAUSIFY [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL TERM TRUE) NIL) ((EQUAL TERM FALSE) (LIST NIL)) ((FNNAMEP-IF TERM) (CLEAN-UP-BRANCHES (STRIP-BRANCHES TERM))) (T (LIST (LIST TERM]) (CLAUSIFY-INPUT [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* In addition to clausifying TERM, we  expand ANDs in the hyps and ORs in the  concl, adding entries to  ABBREVIATIONS-USED. *) (for TERM1 in (CLAUSIFY-INPUT1 TERM FALSE) collect (CLAUSIFY-INPUT1 (DUMB-NEGATE-LIT TERM1) TRUE]) (CLAUSIFY-INPUT1 [LAMBDA (TERM BOOL) (* kbr: "19-Oct-85 16:31") (* If BOOL is TRUE, returns a list of terms whose disjunction is equivalent to  TERM. IF BOOL is FALSE, returns a list of terms whose disjunction is equivalent  to the negation of TERM. Opens up some nonrec fns and applies some  unconditional rewrite rules -- according to BOOL --  and side-effects ABBREVIATIONS-USED. *) (LET (C1 C2 C3) (COND ((EQUAL TERM (BM-NEGATE BOOL)) NIL) ((BM-MATCH TERM (COND ((C1 C2 C3)))) (COND ((EQUAL BOOL TRUE) (COND ((EQUAL C3 TRUE) (DISJOIN-CLAUSES (CLAUSIFY-INPUT1 C1 FALSE) (CLAUSIFY-INPUT1 C2 TRUE))) ((EQUAL C2 TRUE) (DISJOIN-CLAUSES (CLAUSIFY-INPUT1 C1 TRUE) (CLAUSIFY-INPUT1 C3 TRUE))) (T (LIST TERM)))) (T (COND ((EQUAL C3 FALSE) (DISJOIN-CLAUSES (CLAUSIFY-INPUT1 C1 FALSE) (CLAUSIFY-INPUT1 C2 FALSE))) ((EQUAL C2 FALSE) (DISJOIN-CLAUSES (CLAUSIFY-INPUT1 C1 TRUE) (CLAUSIFY-INPUT1 C3 FALSE))) (T (LIST (DUMB-NEGATE-LIT TERM))))))) ((SETQ C1 (EXPAND-AND-ORS TERM BOOL)) (CLAUSIFY-INPUT1 C1 BOOL)) ((EQUAL BOOL FALSE) (LIST (DUMB-NEGATE-LIT TERM))) (T (LIST TERM]) (CLEAN-UP-BRANCHES [LAMBDA (LST) (* kbr: "19-Oct-85 19:59") (LET (PARTITIONS) (SETQ PARTITIONS (PARTITION-CLAUSES LST)) (SETQ TEMP-TEMP (for POCKET in PARTITIONS join (ALMOST-SUBSUMES-LOOP POCKET))) (COND ((NULL (CDR PARTITIONS)) TEMP-TEMP) (T (ALMOST-SUBSUMES-LOOP TEMP-TEMP]) (CNF-DNF [LAMBDA (TERM FLG) (* kbr: "19-Oct-85 16:31") (* If FLG is (QUOTE C), returns a list of lists, say:  ((p11 p12 ...) (p21 p22 ...) ... (pn1 pn2 ...)) such that TERM is not equal to  F iff (AND (OR p11 p12 ...) (OR p21 p22 ...) ...  (OR pn1 pn2 ...)) is not equal to F. The latter term is the TERM.  If FLG is (QUOTE D) computes the disjunctive normal form.  *) (LET (P Q NF-Q) (COND ((OR (AND (EQ FLG (QUOTE C)) (BM-MATCH TERM (AND P Q))) (AND (EQ FLG (QUOTE D)) (BM-MATCH TERM (OR P Q)))) (APPEND (CNF-DNF P FLG) (CNF-DNF Q FLG))) ((OR (AND (EQ FLG (QUOTE C)) (BM-MATCH TERM (OR P Q))) (AND (EQ FLG (QUOTE D)) (BM-MATCH TERM (AND P Q)))) (SETQ NF-Q (CNF-DNF Q FLG)) (for L1 in (CNF-DNF P FLG) bind LOOP-ANS do (SETQ LOOP-ANS (UNION-EQUAL (for L2 in NF-Q collect (UNION-EQUAL L1 L2)) LOOP-ANS)) finally (RETURN LOOP-ANS))) ((BM-MATCH TERM (NOT P)) (for L1 in (CNF-DNF P (SELECTQ FLG (D (QUOTE C)) (QUOTE D))) collect (for TERM in L1 collect (DUMB-NEGATE-LIT TERM)))) ((BM-MATCH TERM (IMPLIES P Q)) (CNF-DNF (FCONS-TERM* (QUOTE OR) (DUMB-NEGATE-LIT P) Q) FLG)) (T (LIST (LIST TERM]) (COMMON-SWEEP [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (LET (VAR DECISION) (COND ((OR (NLISTP FORM) (EQ (CAR FORM) (QUOTE QUOTE))) FORM) ((SETQ DECISION (ASSOC FORM DECISIONS)) (SETQ VAR (CDR (SASSOC FORM VAR-ALIST))) (SUBLIS (LIST (CONS (QUOTE VAR) VAR) (CONS (QUOTE FORM) (CONS (CAR FORM) (for ARG in (CDR FORM) collect (COMMON-SWEEP ARG))))) (SELECTQ (CDR DECISION) (TEST-AND-SET (QUOTE (*2*IF (NEQ VAR (QUOTE *1*X)) VAR (SETQ VAR FORM)))) (SET (QUOTE (SETQ VAR FORM))) (TEST (QUOTE (*2*IF (NEQ VAR (QUOTE *1*X)) VAR FORM))) (VAR (QUOTE VAR)) (ERROR (LIST (QUOTE COMMON-SWEEP) (CDR DECISION)))))) (T (CONS (CAR FORM) (for ARG in (CDR FORM) collect (COMMON-SWEEP ARG]) (COMMUTE-EQUALITIES [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) ((EQ (FFN-SYMB TERM) (QUOTE EQUAL)) (FCONS-TERM* (QUOTE EQUAL) (FARGN TERM 2) (FARGN TERM 1))) (T (CONS-TERM (CAR TERM) (for ARG in (FARGS TERM) collect (COMMUTE-EQUALITIES ARG]) (COMPARE-STATS [LAMBDA (ALIST-NEW ALIST-OLD TOTALS-NEW TOTALS-OLD LST) (* kbr: "24-Oct-85 16:39") (* LST is a 4 tuple of integers indicating which events are considered  interesting. The first two numbers deal with the cons counts, the second two  with the cpu times. The first and third integers are percentages by which the  appropriate measures in NEW should differ from those of OLD.  The second and fourth are the absolute value of the differences between NEW and  OLD. An event must be both relatively and absolutely interesting to be printed  out. *) (OR LST (SETQ LST (QUOTE (10 1000 10 30)))) (COND ((NOT (AND (IEQP (LENGTH ALIST-NEW) (LENGTH ALIST-OLD)) (for PAIR-NEW in ALIST-NEW as PAIR-OLD in ALIST-OLD always (EQUAL (CAR PAIR-NEW) (CAR PAIR-OLD))))) [SETQ ALIST-NEW (SORT (for PAIR-NEW in ALIST-NEW when (for PAIR-OLD in ALIST-OLD thereis (EQUAL (CADAR PAIR-NEW) (CADAR PAIR-OLD))) collect PAIR-NEW) (FUNCTION (LAMBDA (X Y) (ALPHORDER (CADAR X) (CADAR Y] [SETQ ALIST-OLD (SORT (for PAIR-OLD in ALIST-OLD when (for PAIR-NEW in ALIST-NEW thereis (EQUAL (CADAR PAIR-NEW) (CADAR PAIR-OLD))) collect PAIR-OLD) (FUNCTION (LAMBDA (X Y) (ALPHORDER (CADAR X) (CADAR Y] (SETQ TOTALS-NEW (SUM-STATS-ALIST ALIST-NEW)) (SETQ TOTALS-OLD (SUM-STATS-ALIST ALIST-OLD)) (PRINEVAL (PQUOTE (PROGN THE TWO FILES DO NOT CONTAIN THE SAME SEQUENCE OF EVENT NAMES %. THE COMPARISON WILL BE ON THE INTERSECTION OF THE TWO SEQUENCES , WHICH HAS LENGTH (!PPR N NIL) %. // //)) (BINDINGS (QUOTE N) (LENGTH ALIST-NEW)) 0 T))) (IPRINC "OLD =" T) (IPRINC "NEW =" T) (ITERPRI T) (IPRINC "CONSES CPU GC IO ELAPSED" T) (ITERPRI T) (ITERPRI T) (for X in (LIST TOTALS-NEW TOTALS-OLD) as Y in (QUOTE (NEW OLD)) do (IPRINC Y T) (for PAIR in X as Z in (QUOTE ((FIX 12) (FLOAT 9 1) (FLOAT 9 1) (FLOAT 9 1) (FIX 12))) do (PRIN2 (CADR PAIR) T) (SPACES 3 T)) (ITERPRI T)) (ITERPRI T) (IPRINC "N/O" T) (for X in TOTALS-NEW as Y in TOTALS-OLD as Z in (QUOTE ((FLOAT 12 1) (FLOAT 9 1) (FLOAT 9 1) (FLOAT 9 1) (FLOAT 12 1))) do (PRIN2 (QUOTIENT (CADR X) (CADR Y)) T) (SPACES 3 T)) (ITERPRI T) (PRINEVAL (PQUOTE (PROGN // // EVENTS WHOSE CONS COUNTS ARE MORE THAN (!PPR X NIL) PERCENT AND (!PPR N NIL) CONSES DIFFERENT, PRINTED AS IQUOTIENT (N//O NEW OLD IQUOTIENT) AND ORDERED BY N//O : //)) (BINDINGS (QUOTE X) (CAR LST) (QUOTE N) (CADR LST)) 0 T) (PPRIND [DREVERSE (SORT (for X in ALIST-NEW as Y in ALIST-OLD when (AND (OR (GREATERP (QUOTIENT (CADR X) (CADR Y)) (QUOTIENT (PLUS 100 (CAR LST)) 100)) (LESSP (QUOTIENT (CADR X) (CADR Y)) (QUOTIENT (DIFFERENCE 100 (CAR LST)) 100))) (OR (GREATERP (CADR X) (PLUS (CADR Y) (CADR LST))) (LESSP (PLUS (CADR X) (CADR LST)) (CADR Y)))) collect (LIST (QUOTIENT (CADR X) (CADR Y)) (CONS (CADR (CAR X)) (CDR X)) (CONS (CADR (CAR Y)) (CDR Y)))) (FUNCTION (LAMBDA (X Y) (LESSP (CAR X) (CAR Y] 0 0 NIL T) (ITERPRI T) (PRINEVAL (PQUOTE (PROGN // // EVENTS WHOSE CPU TIMES ARE MORE THAN (!PPR X NIL) PERCENT AND (!PPR N NIL) SECONDS DIFFERENT, PRINTED AS IQUOTIENT (N//O NEW OLD IQUOTIENT) AND ORDERED BY N//O : //)) (BINDINGS (QUOTE X) (CADDR LST) (QUOTE N) (CADDDR LST)) 0 T) (PPRIND [DREVERSE (SORT (for X in ALIST-NEW as Y in ALIST-OLD when (AND (OR (GREATERP (QUOTIENT (CADDR X) (CADDR Y)) (QUOTIENT (PLUS 100 (CADDR LST)) 100)) (LESSP (QUOTIENT (CADDR X) (CADDR Y)) (QUOTIENT (DIFFERENCE 100 (CADDR LST)) 100))) (OR (GREATERP (CADDR X) (PLUS (CADDR Y) (CADDDR LST))) (LESSP (PLUS (CADDR X) (CADDDR LST)) (CADDR Y)))) collect (LIST (QUOTIENT (CADDR X) (CADDR Y)) (CONS (CADR (CAR X)) (CDR X)) (CONS (CADR (CAR Y)) (CDR Y)))) (FUNCTION (LAMBDA (X Y) (LESSP (CAR X) (CAR Y] 0 0 NIL T) (ITERPRI T]) (COMPLEMENTARY-MULTIPLEP [LAMBDA (WINNING-PAIR POLY1 POLY2) (* kbr: "19-Oct-85 16:31") (* Return T iff multiplying POLY1 by  some negative integer produces POLY2.  WINNING-PAIR is a member of POLY1 with  coefficient IPLUS or -1.0 *) (PROG (FACTOR) (COND ((NULL (SETQ TEMP-TEMP (SASSOC (CAR WINNING-PAIR) (fetch (POLY ALIST) of POLY2)))) (RETURN NIL))) (SETQ FACTOR (COND ((EQUAL (CDR WINNING-PAIR) 1) (CDR TEMP-TEMP)) (T (MINUS (CDR TEMP-TEMP))))) (COND ((NOT (LESSP FACTOR 0)) (RETURN NIL))) (RETURN (AND (EQUAL (fetch (POLY CONSTANT) of POLY2) (TIMES FACTOR (fetch (POLY CONSTANT) of POLY1))) (IEQP (LENGTH (fetch (POLY ALIST) of POLY2)) (LENGTH (fetch (POLY ALIST) of POLY1))) (for PAIR1 in (fetch (POLY ALIST) of POLY1) as PAIR2 in (fetch (POLY ALIST) of POLY2) always (AND (EQUAL (CAR PAIR1) (CAR PAIR2)) (EQUAL (CDR PAIR2) (TIMES FACTOR (CDR PAIR1]) (COMPLEMENTARYP [LAMBDA (LIT1 LIT2) (* kbr: "20-Oct-85 13:43") (* Is LIT2 the syntactic NOT of LIT1?  *) (OR (AND (NVARIABLEP LIT1) (NOT (FQUOTEP LIT1)) (EQ (FFN-SYMB LIT1) (QUOTE NOT)) (EQUAL (FARGN LIT1 1) LIT2)) (AND (NVARIABLEP LIT2) (NOT (FQUOTEP LIT2)) (EQ (FFN-SYMB LIT2) (QUOTE NOT)) (EQUAL (FARGN LIT2 1) LIT1]) (COMPLEXITY [LAMBDA (TERM) (* kbr: "24-Oct-85 15:49") (COND ((VARIABLEP TERM) 0) ((FQUOTEP TERM) (* The level number of all function symbols in evgs is 0, so even if we  recursed into them with FN-SYMBs and ARGS we'd compute 0.0 *) 0) (T (IPLUS (GET-LEVEL-NO (FFN-SYMB TERM)) (PROG (MAX) (SETQ MAX 0) (for ARG in (FARGS TERM) do (SETQ MAX (IMAX (COMPLEXITY ARG) MAX))) (RETURN MAX]) (COMPRESS-POLY [LAMBDA (POLY) (* kbr: "19-Oct-85 16:31") (COND ((IMPOSSIBLE-POLYP POLY) (replace (POLY ALIST) of POLY with NIL)) ((TRUE-POLYP POLY) (replace (POLY ALIST) of POLY with NIL)) (T (replace (POLY ALIST) of POLY with (COMPRESS-POLY1 (fetch (POLY ALIST) of POLY))))) POLY]) (COMPRESS-POLY1 [LAMBDA (ALIST) (* kbr: "20-Oct-85 15:44") (* Return ALIST with buckets whose  CDRs are 0 removed. *) (COND ((NLISTP ALIST) NIL) ((EQUAL (CDR (CAR ALIST)) 0) (COMPRESS-POLY1 (CDR ALIST))) (T (RPLACD ALIST (COMPRESS-POLY1 (CDR ALIST]) (COMPUTE-VETOES [LAMBDA (CANDLST) (* kbr: "19-Oct-85 16:31") (* This function weeds out behind the notion competing with it for  instantiation of its variables. What we actually do is throw out any candidate  whose changing induction variables -- that is the induction variables as  computed by INDUCT-VARS intersected with the changed vars of candidate --  intersect the changed or unchanged variables of another candidate.  The reason we do not care about the first candidates unchanging vars is as  follows. The reason you want a candidate clean is so that the terms riding on  that cand will reoccur in both the hypothesis and conclusion of an induction.  There are two ways to assure (or at least make likely) this, change the  variables in the terms as specified or leave them constant.  Thus, if the first cands changing vars are clean but its unchanging vars  intersect another cand it means that the first cand is keeping those other  terms constant which is fine. (Note that the first cand would be clean here.  The second might be clean or dirty depending on whether its changed vars or  unchanged vars intersected the first cands vars.) The reason we check only the  induction vars and not all of the changed vars is if cand1's changed vars  include some induction vars and some accumulators and the accumulators are  claimed by another cand2 we believe that cand1 is still clean.  The motivating example was (IMPLIES (MEMBER A C)  (MEMBER A (UNION: B C))) where the induction on C is dirty because the  induction on B and C claims C, but the induction on B and C is clean because  the B does not occur in the C induction.  We do not even bother to check the C from the  (B C) induction because since it is necessarily an accumulator it is probably  being constructed and thus, if it occurs in somebody elses ind vars it is  probably being eaten so it will be ok. In formulating this heuristic we did not  consider the possibility that the accums of one candidate occur as constants in  the other. Oh well. JULY 20, 1978.0 We have added an additional heuristic, to  be applied if the above one eliminates all cands.  We consider a cand flawed if it changes anyone elses constants.  The motivating example was GREATEST-FACTOR-LESSP --  which was previously proved only by virtue of a very ugly use of the no-op fn  ID to make a certain induction flawed. *) (OR (for CAND1 in CANDLST bind CHANGING-INDVARS unless (PROGN (SETQ CHANGING-INDVARS (INTERSECTION (fetch (CANDIDATE CHANGED-VARS) of CAND1) (INDUCT-VARS CAND1))) (for CAND2 in CANDLST when (NEQ CAND1 CAND2) thereis (OR (INTERSECTP CHANGING-INDVARS (fetch (CANDIDATE CHANGED-VARS) of CAND2)) (INTERSECTP CHANGING-INDVARS (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND2))))) collect CAND1) (for CAND1 in CANDLST bind CHANGING-VARS unless (PROGN (SETQ CHANGING-VARS (fetch (CANDIDATE CHANGED-VARS) of CAND1)) (for CAND2 in CANDLST when (NEQ CAND1 CAND2) thereis (INTERSECTP CHANGING-VARS (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND2)))) collect CAND1) CANDLST]) (COMSUBT1 [LAMBDA (T1) (* kbr: "19-Oct-85 16:31") (* We add to GENRLTLIST every common subterm t of T1 and T2 such that t has  property p, and no subterm of t has property p.  Property (p ITIMES) is ITIMES is not a variable and the function symbol of  ITIMES is not a btm object, constructor, or destructor.  We return T iff T1 is a common subterm of T2, but neither T1 nor any subterm of  T1 has property p. *) (PROG (FAILED) (COND ((OR (VARIABLEP T1) (FQUOTEP T1)) (RETURN (OCCUR T1 T2)))) (* After the following FOR, FAILED is set to T iff COMSUBT1 returned NIL on at  least one of the arguments of T1. GENRLTLIST now contains all of proper  subterms of T1 that occur in T2, have property p, and have no subterms with  property p, by inductive hypothesis. *) (for ARG in (FARGS T1) when (NOT (COMSUBT1 ARG)) do (SETQ FAILED T)) (COND (FAILED (* One of T1's arguments returned NIL. So either the argument is not a subterm  of T2, in which case neither is T1, or the argument or one of its subterms has  property p, in which case one of T1's subterms also has property p.  So we return NIL and do not add T1 to GENRLTLIST.  *) (RETURN NIL)) ((NOT (OCCUR T1 T2)) (* If T1 does not occur in T2, then its not a common subterm --  regardless of what properties its args have --  and so we return NIL and do not add T1 to GENRLTLIST.  *) (RETURN NIL)) ((AND (NOT (SHELLP T1)) (NOT (AND (SETQ TEMP-TEMP (GETPROP (FFN-SYMB T1) (QUOTE ELIMINATE-DESTRUCTORS-SEQ))) (NOT (DISABLEDP (fetch (REWRITE-RULE NAME) of TEMP-TEMP)))))) (* The test above checks that T1 has property p.  We know that T1 occurs in T2. We also know that every argument of T1  recursively returned T and so no argument nor any subterm has property p.  Therefore we add T1 to GENRLTLIST. We return NIL because T1 has property p.  *) (SETQ GENRLTLIST (ADD-TO-SET T1 GENRLTLIST)) (RETURN NIL)) (T (* T1 does not have property p.  It is a subterm of T2, and no subterm  of it has property p.  *) (RETURN T]) (COMSUBTERMS [LAMBDA (T1 T2) (* kbr: "19-Oct-85 16:31") (* We add to GENRLTLIST every common subterm t of T1 and T2 such that t has  property p, and no subterm of t has property p.  Property (p ITIMES) is ITIMES is not a variable and the function symbol of  ITIMES is not a btm object, constructor, or destructor.  *) (COND ((GREATERP (COUNT T1) (COUNT T2)) (swap T1 T2))) (COMSUBT1 T1]) (CONJOIN [LAMBDA (LST IF-FLG) (* kbr: "19-Oct-85 16:31") (COND ((NULL LST) TRUE) (T (CONJOIN2 (CAR LST) (CONJOIN (CDR LST) IF-FLG) IF-FLG]) (CONJOIN-CLAUSE-SETS [LAMBDA (LST1 LST2) (* kbr: "19-Oct-85 16:31") (LET (ANS) (for CL in LST1 when (AND (NOT (EQUAL CL TRUE-CLAUSE)) (NOT (MEMBER CL ANS))) do (SETQ ANS (CONS CL ANS))) (for CL in LST2 when (AND (NOT (EQUAL CL TRUE-CLAUSE)) (NOT (MEMBER CL ANS))) do (SETQ ANS (CONS CL ANS))) ANS]) (CONJOIN2 [LAMBDA (P Q IF-FLG) (* kbr: "19-Oct-85 16:31") (COND ((FALSE-NONFALSEP P) (COND (DEFINITELY-FALSE FALSE) ((FALSE-NONFALSEP Q) (COND (DEFINITELY-FALSE FALSE) (T TRUE))) ((NOT (BOOLEAN Q)) (FCONS-TERM* (QUOTE IF) Q TRUE FALSE)) (T Q))) ((FALSE-NONFALSEP Q) (COND (DEFINITELY-FALSE FALSE) ((BOOLEAN P) P) (T (FCONS-TERM* (QUOTE IF) P TRUE FALSE)))) (IF-FLG (FCONS-TERM* (QUOTE IF) P (COND ((BOOLEAN Q) Q) (T (FCONS-TERM* (QUOTE IF) Q TRUE FALSE))) FALSE)) (T (FCONS-TERM* (QUOTE AND) P Q]) (CONS-PLUS [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL X ZERO) Y) ((EQUAL Y ZERO) X) (T (FCONS-TERM* (QUOTE PLUS) X Y]) (CONS-TERM [LAMBDA (FN ARGS) (* kbr: "19-Oct-85 16:31") (* After great deliberation, we have decided to guarantee throughout the  theorem-prover that every explicit value term should be represented as an evg.  Unless the function symbol of a term being constructed is known not to be a  constructor or bottom object, the term should be constructed using CONS-TERM  rather than with FCONS-TERM or FCONS-TERM*.  *) (COND ((AND (for ARG in ARGS always (QUOTEP ARG)) (OR (MEMB FN *1*BTM-OBJECTS) (ASSOC FN SHELL-ALIST))) (* We wish to apply the LISP-CODE for this shell constructor or btm object to  the guts of each arg and QUOTE the result.  To avoid having to cons up the list of guts, we will consider the common cases  separately. *) (COND ((NULL ARGS) (LIST (QUOTE QUOTE) (APPLY* (GETPROP FN (QUOTE LISP-CODE))))) ((NULL (CDR ARGS)) (LIST (QUOTE QUOTE) (APPLY* (GETPROP FN (QUOTE LISP-CODE)) (CADR (CAR ARGS))))) ((NULL (CDDR ARGS)) (LIST (QUOTE QUOTE) (APPLY* (GETPROP FN (QUOTE LISP-CODE)) (CADR (CAR ARGS)) (CADR (CADR ARGS))))) ((NULL (CDDDR ARGS)) (LIST (QUOTE QUOTE) (APPLY* (GETPROP FN (QUOTE LISP-CODE)) (CADR (CAR ARGS)) (CADR (CADR ARGS)) (CADR (CADDR ARGS))))) (T (LIST (QUOTE QUOTE) (APPLY (GETPROP FN (QUOTE LISP-CODE)) (for ARG in ARGS collect (CADR ARG))))))) (T (CONS FN ARGS]) (CONSJOIN [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP (CDR LST)) (CAR LST)) (T (CONS-TERM (QUOTE CONS) (LIST (CAR LST) (CONSJOIN (CDR LST]) (CONTAINS-REWRITEABLE-CALLP [LAMBDA (NAME TERM) (* kbr: "19-Oct-85 16:31") (* This function scans the nonQUOTE  part of TERM and determines whether it  contains a call of NAME not on  TERMS-TO-BE-IGNORED-BY-REWRITE.  *) (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) NIL) ((AND (EQ (FFN-SYMB TERM) NAME) (NOT (MEMBER TERM TERMS-TO-BE-IGNORED-BY-REWRITE))) T) (T (for X in (FARGS TERM) thereis (CONTAINS-REWRITEABLE-CALLP NAME X]) (CONVERT-CAR-CDR [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (ANS (GUTS X)) (while (OR (BM-MATCH GUTS (CAR &)) (BM-MATCH GUTS (CDR &))) do (SETQ ANS (CONS (NTHCHAR (CAR GUTS) 2) ANS)) (SETQ GUTS (CADR GUTS))) (COND ((IGREATERP (LENGTH ANS) 1) (LIST (PACK (CONS (QUOTE C) (DREVERSE (CONS (QUOTE R) ANS)))) GUTS)) (T X]) (CONVERT-CONS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((SETQ TEMP-TEMP (LISTABLE X)) (APPEND (QUOTE (LIST)) TEMP-TEMP)) (T X]) (CONVERT-NOT [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (U V) (COND ((BM-MATCH X (NOT (LESSP U V))) (LIST (QUOTE LEQ) V U)) (T X]) (CONVERT-QUOTE [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (SETQ PPR-MACRO-LST NIL) (COND ((EQ (CADR X) *1*T) T) ((EQ (CADR X) *1*F) (QUOTE F)) ((FIXP (CADR X)) (CADR X)) ((EQ (CADR X) NIL) NIL) ((AND (LISTP (CADR X)) (EQ (CAR (CADR X)) *1*SHELL-QUOTE-MARK)) (CONS (CADR (CADR X)) (for ARG in (CDDR (CADR X)) collect (CONVERT-QUOTE (LIST (QUOTE QUOTE) ARG))))) (T X]) (CONVERT-TYPE-NO-TO-RECOGNIZER-TERM [LAMBDA (TYPE-NO ARG) (* kbr: "19-Oct-85 16:31") (LET (TYPE-SET) (SETQ TYPE-SET (LOGBIT TYPE-NO)) (COND ((SETQ TEMP-TEMP (for PAIR in RECOGNIZER-ALIST when (IEQP TYPE-SET (CDR PAIR)) do (RETURN PAIR))) (FCONS-TERM* (CAR TEMP-TEMP) ARG)) (T (ERROR1 (PQUOTE (PROGN CONVERT-TYPE-NO-TO-RECOGNIZER-TERM CALLED WITH A NUMBER NOT ASSIGNED AS A TYPE NO !)) (BINDINGS) (QUOTE HARD]) (BM-COUNT [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP X) 0) (T (PLUS 1 (COUNT (CAR X)) (COUNT (CDR X]) (COUNT-IFS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) 0) ((FQUOTEP TERM) 0) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (ADD1 (for ARG in (FARGS TERM) sum (COUNT-IFS ARG)))) (T (for ARG in (FARGS TERM) sum (COUNT-IFS ARG]) (CREATE-REWRITE-RULE [LAMBDA (NAME HYPS CONCL LOOP-STOPPER-ARG) (* kbr: "19-Oct-85 16:31") (create REWRITE-RULE NAME _ NAME HYPS _ (PREPROCESS-HYPS HYPS) CONCL _ CONCL LOOP-STOPPER _ (OR LOOP-STOPPER-ARG (LOOP-STOPPER CONCL]) (DCL0 [LAMBDA (NAME ARGS) (* kbr: "19-Oct-85 16:31") (ADD-FACT NAME (QUOTE TYPE-PRESCRIPTION-LST) (CONS NAME (CONS TYPE-SET-UNKNOWN (for X in ARGS collect NIL)))) (ADD-FACT NAME (QUOTE LEVEL-NO) 0]) (DECODE-IDATE [LAMBDA (N) (* kbr: "19-Oct-85 16:31") (POWER-REP N 100.0]) (DEFN-ASSUME-TRUE-FALSE [LAMBDA (TERM) (* kbr: "24-Oct-85 15:34") (LET (TYPE-ARG1 TYPE-ARG2 TRUE-SEG FALSE-SEG PAIR ARG1 ARG2 INTERSECTION LOCAL-MUST-BE-TRUE LOCAL-MUST-BE-FALSE) (COND ((AND (NVARIABLEP TERM) (NOT (FQUOTEP TERM)) (SETQ PAIR (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST))) (SETQ TYPE-ARG1 (DEFN-TYPE-SET (FARGN TERM 1))) (COND ((AND (NULL (CDR TYPE-ARG1)) (IEQP 0 (LOGAND (CAR TYPE-ARG1) (CDR PAIR)))) (SETQ LOCAL-MUST-BE-FALSE T)) ((AND (NULL (CDR TYPE-ARG1)) (LOGSUBSETP (CAR TYPE-ARG1) (CDR PAIR))) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (LIST (CONS (FARGN TERM 1) (CONS (CDR PAIR) NIL)))) (SETQ FALSE-SEG (LIST (CONS (FARGN TERM 1) (CONS (LOGAND (CAR TYPE-ARG1) (LOGNOT (CDR PAIR))) (CDR TYPE-ARG1)))))))) ((BM-MATCH TERM (EQUAL ARG1 ARG2)) (SETQ TYPE-ARG1 (DEFN-TYPE-SET ARG1)) (SETQ TYPE-ARG2 (DEFN-TYPE-SET ARG2)) (SETQ INTERSECTION (LOGAND (CAR TYPE-ARG1) (CAR TYPE-ARG2))) (COND ((AND (IEQP 0 INTERSECTION) (NULL (CDR TYPE-ARG1)) (NULL (CDR TYPE-ARG2))) (SETQ LOCAL-MUST-BE-FALSE T)) ((AND (NULL (CDR TYPE-ARG1)) (NULL (CDR TYPE-ARG2)) (IEQP (CAR TYPE-ARG1) (CAR TYPE-ARG2)) (MEMBER (CAR TYPE-ARG1) SINGLETON-TYPE-SETS)) (SETQ LOCAL-MUST-BE-TRUE T)) ((AND (EQUAL TYPE-ARG1 TYPE-ARG2) (IEQP 0 (CAR TYPE-ARG1)) (IEQP (LENGTH (CDR TYPE-ARG1)) 1)) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (LIST (CONS TERM (CONS TYPE-SET-TRUE NIL)))) (COND ((NOT (IEQP (CAR TYPE-ARG1) INTERSECTION)) (SETQ TRUE-SEG (CONS (CONS ARG1 (CONS INTERSECTION (CDR TYPE-ARG1))) TRUE-SEG)))) (COND ((NOT (IEQP (CAR TYPE-ARG2) INTERSECTION)) (SETQ TRUE-SEG (CONS (CONS ARG2 (CONS INTERSECTION (CDR TYPE-ARG2))) TRUE-SEG)))) (SETQ FALSE-SEG (LIST (CONS TERM (CONS TYPE-SET-FALSE NIL)))) (COND ((AND (MEMBER (CAR TYPE-ARG2) SINGLETON-TYPE-SETS) (NULL (CDR TYPE-ARG2))) (SETQ FALSE-SEG (CONS (CONS ARG1 (CONS (LOGAND (CAR TYPE-ARG1) (LOGNOT (CAR TYPE-ARG2))) (CDR TYPE-ARG1))) FALSE-SEG)))) (COND ((AND (MEMBER (CAR TYPE-ARG1) SINGLETON-TYPE-SETS) (NULL (CDR TYPE-ARG1))) (SETQ FALSE-SEG (CONS (CONS ARG2 (CONS (LOGAND (CAR TYPE-ARG2) (LOGNOT (CAR TYPE-ARG1))) (CDR TYPE-ARG2))) FALSE-SEG)))) (COND ((AND (IEQP 0 (CAR TYPE-ARG2)) (IEQP (LENGTH (CDR TYPE-ARG2)) 1) (MEMB (CADR TYPE-ARG2) (CDR TYPE-ARG1))) (SETQ FALSE-SEG (CONS (CONS ARG1 (CONS (CAR TYPE-ARG1) (REMOVE (CADR TYPE-ARG2) (CDR TYPE-ARG1)))) FALSE-SEG)))) (COND ((AND (IEQP 0 (CAR TYPE-ARG1)) (IEQP (LENGTH (CDR TYPE-ARG1)) 1) (MEMB (CADR TYPE-ARG1) (CDR TYPE-ARG2))) (SETQ FALSE-SEG (CONS (CONS ARG2 (CONS (CAR TYPE-ARG2) (REMOVE (CADR TYPE-ARG1) (CDR TYPE-ARG2)))) FALSE-SEG))))))) (T (SETQ TYPE-ARG1 (DEFN-TYPE-SET TERM)) (COND ((AND (IEQP (CAR TYPE-ARG1) TYPE-SET-FALSE) (NULL (CDR TYPE-ARG1))) (SETQ LOCAL-MUST-BE-FALSE T)) ((AND (NULL (CDR TYPE-ARG1)) (IEQP 0 (LOGAND (CAR TYPE-ARG1) TYPE-SET-FALSE))) (SETQ LOCAL-MUST-BE-TRUE T)) (T (SETQ TRUE-SEG (LIST (CONS TERM (CONS (LOGAND (CAR TYPE-ARG1) (LOGNOT TYPE-SET-FALSE)) (CDR TYPE-ARG1))))) (SETQ FALSE-SEG (LIST (CONS TERM (CONS TYPE-SET-FALSE NIL)))))))) (SETQ TRUE-TYPE-ALIST (NCONC TRUE-SEG TYPE-ALIST)) (SETQ FALSE-TYPE-ALIST (NCONC FALSE-SEG TYPE-ALIST)) (SETQ MUST-BE-TRUE LOCAL-MUST-BE-TRUE) (SETQ MUST-BE-FALSE LOCAL-MUST-BE-FALSE) NIL]) (DEFN-LOGIOR [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (CONS (LOGOR (CAR X) (CAR Y)) (UNIONQ (CDR X) (CDR Y]) (DEFN-SETUP [LAMBDA (EVENT) (* kbr: "19-Oct-85 16:31") (SETQ ORIGEVENT EVENT) (SETQ LAST-PROCESS (QUOTE SETUP)) (COND ((NOT (MEMBER ORIGEVENT FAILED-THMS)) (SETQ FAILED-THMS (CONS ORIGEVENT FAILED-THMS)))) (SETQ EXPAND-LST HINTED-EXPANSIONS) (SETQ TERMS-TO-BE-IGNORED-BY-REWRITE NIL) (SETQ INDUCTION-HYP-TERMS NIL) (SETQ INDUCTION-CONCL-TERMS NIL) (SETQ STACK NIL) (SETQ FNSTACK NIL) (SETQ TYPE-ALIST NIL) (SETQ LITS-THAT-MAY-BE-ASSUMED-FALSE NIL) (SETQ CURRENT-LIT 0) (SETQ CURRENT-ATM 0) (SETQ ANCESTORS NIL) (INIT-LEMMA-STACK) (INIT-LINEARIZE-ASSUMPTIONS-STACK) (SETQ LAST-PRINEVAL-CHAR NIL) (RANDOM-INITIALIZATION ORIGEVENT) EVENT]) (DEFN-TYPE-SET [LAMBDA (TERM) (* kbr: "24-Oct-85 15:44") (COND ((SETQ TEMP-TEMP (SASSOC TERM TYPE-ALIST)) (CDR TEMP-TEMP)) ((VARIABLEP TERM) (ERROR1 (PQUOTE (PROGN DEFN-TYPE-SET HAS FOUND AN UNBOUND VARIABLE IN THE TERM (!PPR TERM NIL) %.)) (BINDINGS (QUOTE TERM) TERM) (QUOTE HARD))) ((EQ (FN-SYMB TERM) (QUOTE IF)) (DEFN-ASSUME-TRUE-FALSE (FARGN TERM 1)) (COND (MUST-BE-TRUE (DEFN-TYPE-SET (FARGN TERM 2))) (MUST-BE-FALSE (DEFN-TYPE-SET (FARGN TERM 3))) (T (DEFN-LOGIOR (DEFN-TYPE-SET2 (FARGN TERM 2) TRUE-TYPE-ALIST) (DEFN-TYPE-SET2 (FARGN TERM 3) FALSE-TYPE-ALIST))))) ((SETQ TEMP-TEMP (TYPE-PRESCRIPTION (FN-SYMB TERM))) (DEFN-LOGIOR (CONS (CAR TEMP-TEMP) NIL) (COND ((CDR TEMP-TEMP) (for ARG in (SARGS TERM) as FLG in (CDR TEMP-TEMP) bind ANS first (SETQ ANS (CONS 0 NIL)) when FLG do (SETQ ANS (DEFN-LOGIOR (DEFN-TYPE-SET ARG) ANS)) finally (RETURN ANS))) (T (CONS 0 NIL))))) (T (CONS TYPE-SET-UNKNOWN NIL]) (DEFN-TYPE-SET2 [LAMBDA (TERM TYPE-ALIST) (* kbr: "19-Oct-85 16:31") (LET (FALSE-TYPE-ALIST) (DEFN-TYPE-SET TERM]) (DEFN-WRAPUP [LAMBDA (WON-FLG) (* kbr: "19-Oct-85 16:31") (SETQ WON-FLG (COND (WON-FLG (QUOTE DEFN-OK)) (T NIL))) (COND ((NEQ LEMMA-STACK ORIG-LEMMA-STACK) (ITERPRI T) (ERROR1 (PQUOTE (PROGN DEFN-WRAPUP FOUND A NON-TRIVIAL LEMMA-STACK !)) (BINDINGS) (QUOTE WARNING)))) (COND ((NEQ LINEARIZE-ASSUMPTIONS-STACK ORIG-LINEARIZE-ASSUMPTIONS-STACK) (ITERPRI T) (ERROR1 (PQUOTE (PROGN DEFN-WRAPUP FOUND A NON-TRIVIAL LINEARIZE-ASSUMPTIONS-STACK !)) (BINDINGS) (QUOTE WARNING)))) (COND (WON-FLG (SETQ FAILED-THMS (REMOVE ORIGEVENT FAILED-THMS)) (SETQ PROVED-THMS (CONS ORIGEVENT PROVED-THMS)))) (IO (QUOTE FINISHED) NIL NIL NIL (LIST WON-FLG]) (DEFN0 [LAMBDA (NAME ARGS BODY RELATION-MEASURE-LST FLG) (* kbr: " 4-Jul-86 18:16") (LET (TRANSLATED-BODY CONTROL-VARS (ARITY-ALIST (CONS (CONS NAME (LENGTH ARGS)) ARITY-ALIST)) (META-NAMES (CONS NAME META-NAMES))) (* The list of comments on this function do not necessarily describe the code  below. They have been left around in reverse chronology order to remind us of  the various combinations of preprocessing we have tried.  If we ever get blown out of the water while normalizing IFs in a large defn,  read the following comment before abandoning normalization.  18 August 1982.0 Here we go again! At the time of this writing the  preprocessing of defns is as follows, we compute the induction and type info on  the translated body and store under sdefn the translated body.  This seems to slow down the system a lot and we are going to change it so that  we store under sdefn the result of expanding boot strap nonrec fns and  normalizing IFs. As nearly as we can tell from the comments below, we have not  previously tried this. According to the record, we have tried expanding all  nonrec fns, and we have tried expanding boot strap fns and doing a little  normalization. The data that suggests this will speed things up is as follows.  Consider the first call of SIMPLIFY-CLAUSE in the proof of  PRIME-LIST-TIMES-LIST. The first three literals are trivial but the fourth call  of SIMPLIFY-CLAUSE1 is on (NOT (PRIME1 C  (SUB1 C)))%. With SDEFNs not expanded and normalized --  i.e., under the processing as it was immediately before the current change --  there are 2478 calls of REWRITE and 273 calls of RELIEVE-HYPS for this literal.  With all defns preprocessed as described here those counts drop to 1218 and  174.0 On a sample of four theorems, PRIME-LIST-TIMES-LIST,  PRIME-LIST-PRIME-FACTORS, FALSIFY1-FALSIFIES, and ORDERED-SORT, the use of  normalized and expanded sdefns saves us 16\ of the conses over the use of  untouched sdefns, reducing the cons counts for those theorems from 880K to  745K. It seems unlikely that this preprocessing will blow us out of the water  on large defns. For the EV used in UNSOLV and for the 386L M with subroutine  call this new preprocessing only marginally increases the size of the sdefn.  It would be interesting to see a function that blows us out of the water.  When one is found perhaps the right thing to do is to so preprocess small defns  and leave big ones alone. 17 December 1981.0 Henceforth we will assume that the  very body the user supplies (modulo translation) is the body that the  theorem-prover uses to establish that there is one and only one function  satisfying the definition equation by determining that the given body provides  a method for computing just that function.  This prohibits our such as (f ITIMES) IEQP  (if (f ITIMES) a a) to (f ITIMES) IEQP a.  18 November 1981.0 We are sick of having to disable nonrec fns in order to get  large fns processed, e.g., the interpreter for our 386L class.  Thus, we have decided to adopt the policy of not touching the user's typein  except to TRANSLATE it. The induction and type analysis as well as the final  SDEFN are based on the translated typein.  Before settling with the preprocessing used below we tried several different  combinations and did provealls. The main issue was whether we should normalize  sdefns. Unfortunately, the incorporation of META0-LEMMAS was also being  experimented with, and so we do not have a precise breakdown of who is  responsible for what. However, below we give the total stats for three separate  provealls. The first, called 1PROVEALL, contained exactly the code below --  except that the ADD-DCELL was given the SDEFN with all the fn names replaced by  1fns instead of a fancy TRANSLATE-TO-INTERLISP call.  Here are the 1PROVEALL stats. Elapsed time IEQP 9532.957, CPU time IEQP  4513.88, GC time IEQP 1423.261, IO time IEQP 499.894, CONSes consumed IEQP  6331517.0 We then incorporated META0-LEMMAS.  Simultaneously, we tried running the RUN fns through DEFN and found that we  exploded. The expansion of nonrec fns and the normalization of IFs before the  induction analysis transformed functions of COUNT 300 to functions of COUNT  exceeding 18K. We therefore decided to expand only BOOT-STRAP fns --  and not NORMALIZE-IFS for the purposes of induction analysis.  After the induction and type analyses were done, we put down an SDEFN with some  trivial IF simplification performed -- e.g., IF X Y Y => Y and IF bool T F =>  bool -- but not a NORMALIZE-IFs version.  We then ran a proveall with CANCEL around as a META0-LEMMA.  The result was about 20\ slower than the 1PROVEALL and used 15\ more CONSes.  At first this was attributed to CANCEL. However, we then ran two simultaneous  provealls, one with META0-LEMMAS set to NIL and one with it set to  ((1CANCEL))%. The result was that the version with CANCEL available used  slightly fewer CONSes than the other one --  7303311 to 7312505 That was surprising because the implementation of  META0-LEMMAS uses no CONSes if no META0-LEMMAS are available, so the entire 15\  more CONSes had to be attributed to the difference in the defn processing.  This simultaneous run was interesting for two other reasons.  The times -- while still 20\ worse than 1PROVEALL --  were one half of one percent different, with CANCEL being the slower.  That means having CANCEL around does not cost much at all --  and the figures are significant despite the slop in the operating system's  timing due to thrashing because the two jobs really were running  simultaneously. The second interesting fact is that CANCEL can be expected to  save us a few CONSes rather than cost us.  We therefore decided to return the DEFN0 processing to its original state.  Only we did it in two steps. First, we put NORMALIZE-IFs into the pre-induction  processing and into the final SDEFN processing.  Here are the stats on the resulting proveall, which was called  PROVEALL-WITH-NORM-AND-CANCEL but not saved.  Elapsed time IEQP 14594.01, CPU time IEQP 5024.387, GC time IEQP 1519.932, IO  time IEQP 593.625, CONSes consumed IEQP 6762620.0 While an improvement, we were  still 6\ worse than 1PROVEALL on CONSes.  But the only difference between 1PROVEALL and PROVEALL-WITH-NORM-AND-CANCEL --  if you discount CANCEL which we rightly believed was paying for itself --  was that in the former induction analyses and type prescriptions were being  computed from fully expanded bodies while in the latter they were computed from  only BOOT-STRAP-expanded bodies. We did not believe that would make a  difference of over 400,000 CONSes, but had nothing else to believe.  So we went to the current state, where we do the induction and type analyses on  the fully expanded and normalized bodies --  bodies that blow us out of the water on some of the RUN fns.  Here are the stats for PROVEALL-PROOFS.79101, which was the proveall for that  version. Elapsed time IEQP 21589.84, CPU time IEQP 4870.231, GC time IEQP  1512.813, IO time IEQP 554.292, CONSes consumed= 6356282.0 Note that we are  within 25K of the number of CONSes used by 1PROVEALL.  But to TRANSLATE-TO-INTERLISP all of the defns in question costs 45K.  So -- as expected -- CANCEL actually saved us a few CONSes by shortening  proofs. It takes only 18 seconds to TRANSLATE-TO-INTERLISP the defns, so a  similar argument does not explain why the latter proveall is 360 seconds slower  than 1PROVEALL. But since the elapsed time is over twice as long, we believe it  is fair to chalk that time up to the usual slop involved in measuring cpu time  on a time sharing system. We now explain the formal justification of the  processing we do on the body before testing it for admissibility.  We do not work with the body that is typed in by the user but with an  equivalent body' produced by normalization and the expansion of nonrecursive  function calls in body. We now prove that if  (under no assumptions about NAME except that it is a function symbol of the  correct arity) (a) body is equivalent to body' and  (b) (name) IEQP body' is accepted under our principle of definition, then there  exists exactly one function satisfying the original equation  (name) IEQP body. First observe that since the definition  (name) IEQP body' is accepted by our principle of definition, there exists a  function satisfying that equation. But the accepted equation is equivalent to  the equation (name) IEQP body by the hypothesis that body is equivalent to  body'. We prove that there is only one such function by induction.  Assume that the definition (name) IEQP body has been accepted under the  principle of definition. Suppose that f is a new name and that  (f) IEQP bodyf, where bodyf results from replacing every use of name as a  function symbol in body with f. It follows that  (f) IEQP bodyf', where bodyf' results from replacing every use of name as a  function symbol in body' with f. We can now easily prove that  (f) IEQP (name) by induction according to the definition of name.  Q.E.D. One might be tempted to think that if the defn with body' is accepted  under the principle of definition then so would be the defn with body and that  the use of body' was merely to make the implementation of the defn principle  more powerful. This is not the case. For example  (R X) IEQP (IF (R X) T T) is not accepted by the definitional principle, but we  would accept the body'-version (R X) IEQP T, and by our proof, that function  uniquely satisfies the equation the user typed in.  One might be further tempted to think that if we changed normalize so that  (IF X Y Y) IEQP Y was not applied, then the two versions were inter-acceptable  under the defn principle. This is not the case either.  The function (F X) IEQP (IF (IF (X.ne.0)  (F X-1) F) (F X-1) T) is not accepted under the principle of defn.  Consider its normalized body. *) (DEFN-SETUP (LIST (QUOTE DEFN) NAME ARGS BODY RELATION-MEASURE-LST)) (SETQ TRANSLATED-BODY (TRANSLATE BODY)) (SETQ RELATION-MEASURE-LST (for TEMP in RELATION-MEASURE-LST collect (LIST (CAR TEMP) (TRANSLATE (CADR TEMP))))) (PUT-INDUCTION-INFO NAME ARGS TRANSLATED-BODY RELATION-MEASURE-LST NIL) (ADD-FACT NAME (QUOTE SDEFN) (LIST (QUOTE LAMBDA) ARGS (NORMALIZE-IFS (EXPAND-BOOT-STRAP-NON-REC-FNS TRANSLATED-BODY) NIL NIL))) (PUT-TYPE-PRESCRIPTION NAME) (PUT-LEVEL-NO NAME) (* CONTROLLER-POCKETS of NAME is a  list of bit encodings.  Each bit encoding summarizes a SUBSET  of some JUSTIFICATION for NAME to  terminate. *) (AND (GETPROP NAME (QUOTE JUSTIFICATIONS)) (ADD-FACT NAME (QUOTE CONTROLLER-POCKETS) (SCRUNCH (for TEMP in (GETPROP NAME (QUOTE JUSTIFICATIONS)) collect (PROGN (SETQ CONTROL-VARS (fetch (JUSTIFICATION SUBSET) of TEMP)) (for FORMAL in ARGS as I from 0 bind (LOOP-ANS _ 0) when (MEMB FORMAL CONTROL-VARS ) do (SETQ LOOP-ANS (LOGOR LOOP-ANS (LSH 1 I))) finally (RETURN LOOP-ANS))))))) (COND (FLG (ADD-FACT NAME (QUOTE LISP-CODE) (PACK (LIST STRING-WEIRD NAME)))) ((for FN in (ALL-FNNAMES TRANSLATED-BODY) always (OR (EQ FN NAME) (GETPROP FN (QUOTE LISP-CODE)))) (ADD-DCELL NAME (PACK (LIST STRING-WEIRD NAME)) (LIST (QUOTE LAMBDA) (SETQ TEMP-TEMP (for ARG in ARGS collect (PACK (LIST STRING-WEIRD3 ARG)))) (TRANSLATE-TO-LISP (SUB-PAIR-VAR ARGS TEMP-TEMP TRANSLATED-BODY)))))) (COND ((NOT (TOTAL-FUNCTIONP NAME)) (ERROR1 (PQUOTE (PROGN THE RECURSION IN (!PPR NAME NIL) IS UNJUSTIFIED %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE WARNING)))) NIL]) (DELETE1 [LAMBDA (X L) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP L) NIL) ((EQUAL X (CAR L)) (CDR L)) (T (CONS (CAR L) (DELETE1 X (CDR L]) (DELETE-TAUTOLOGIES [LAMBDA (CLAUSE-SET) (* kbr: "19-Oct-85 16:31") (for CL in CLAUSE-SET unless (for TAIL on CL thereis (OR (AND (FALSE-NONFALSEP (CAR TAIL)) (NOT DEFINITELY-FALSE)) (MEMBER (NEGATE-LIT (CAR TAIL)) (CDR TAIL)))) collect CL]) (DELETE-TOGGLES [LAMBDA (XXX) (* kbr: "19-Oct-85 16:31") (for X in XXX bind N collect (COND ((BM-MATCH X (TOGGLE & N (QUOTE T))) (LIST (QUOTE DISABLE) N)) ((OR (BM-MATCH X (TOGGLE & N (QUOTE NIL))) (BM-MATCH X (TOGGLE & N))) (LIST (QUOTE ENABLE) N)) (T X]) (DEPEND [LAMBDA (DEPENDENT SUPPORTERS) (* kbr: "19-Oct-85 16:31") (COND ((NOT (GETPROP DEPENDENT (QUOTE EVENT))) (ERROR1 (PQUOTE (PROGN DEPEND SHOULD NOT BE CALLED ON A NONEVENT SUCH AS (!PPR DEPENDENT NIL) %.)) (BINDINGS (QUOTE DEPENDENT) DEPENDENT) (QUOTE HARD)))) (SETQ SUPPORTERS (REMOVE (QUOTE GROUND-ZERO) (for X in SUPPORTERS bind LOOP-ANS do (SETQ LOOP-ANS (ADD-TO-SET (MAIN-EVENT-OF X) LOOP-ANS)) finally (RETURN LOOP-ANS)))) (COND ((MEMB DEPENDENT SUPPORTERS) (ERROR1 (PQUOTE (PROGN ATTEMPT TO MAKE (!PPR DEPENDENT NIL) DEPEND UPON ITSELF !)) (BINDINGS (QUOTE DEPENDENT) DEPENDENT) (QUOTE HARD)))) (for X in SUPPORTERS do (ADD-FACT X (QUOTE IMMEDIATE-DEPENDENTS0) DEPENDENT]) (DEPENDENT-EVENTS [LAMBDA (EVENT) (* kbr: "19-Oct-85 16:31") (for X in (DEPENDENTS-OF EVENT) collect (GETPROP X (QUOTE EVENT]) (DEPENDENTS-OF [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((EQ NAME (QUOTE GROUND-ZERO)) (REVERSE CHRONOLOGY)) ((NOT (GETPROP NAME (QUOTE EVENT))) (ERROR1 (PQUOTE (PROGN DEPENDENTS-OF MUST BE GIVEN AN EVENT AND (!PPR NAME NIL) IS NOT ONE %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE HARD))) (T (SORT (DEPENDENTS-OF1 NAME) (FUNCTION (LAMBDA (X Y) (EVENT1-OCCURRED-BEFORE-EVENT2 X Y CHRONOLOGY]) (DEPENDENTS-OF1 [LAMBDA (NAME) (* kbr: "19-Oct-85 19:59") (COND ((EQ NAME (QUOTE GROUND-ZERO)) (* We never expect this fn to be  called on GROUND-ZERO because its  silly, but we make it behave correctly  anyway. *) (COPYLIST CHRONOLOGY)) (T (CONS NAME (SCRUNCH (for X in (IMMEDIATE-DEPENDENTS-OF NAME) join (DEPENDENTS-OF1 X]) (DESTRUCTORS [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (* This function returns the set of subterms of CL such that every member is  the application of a function to one or more distinct variables.  *) (LET (ANS) (for LIT in CL do (DESTRUCTORS1 LIT)) ANS]) (DESTRUCTORS1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM)) NIL) (T (for ARG in (FARGS TERM) do (DESTRUCTORS1 ARG)) (COND ((AND (FARGS TERM) (for ARG in (FARGS TERM) always (VARIABLEP ARG)) (NO-DUPLICATESP (FARGS TERM))) (SETQ ANS (ADD-TO-SET TERM ANS]) (DETACH [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (ERROR1 (PQUOTE (PROGN DETACH IS NOT YET IMPLEMENTED)) NIL (QUOTE HARD]) (DETACHED-ERROR [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (CLOSE? TTY-FILE) (CLOSE? PROVE-FILE) (SETQ PROVE-FILE NIL) (SETQ TTY-FILE NIL) (CL:BREAK (QUOTE DETACHED-ERROR]) (DETACHEDP [LAMBDA NIL (* kbr: "19-Oct-85 16:31") NIL]) (DISJOIN [LAMBDA (LST IF-FLG) (* kbr: "19-Oct-85 16:31") (COND ((NULL LST) FALSE) (T (DISJOIN2 (CAR LST) (DISJOIN (CDR LST) IF-FLG) IF-FLG]) (DISJOIN-CLAUSES [LAMBDA (CL1 CL2) (* kbr: "20-Oct-85 16:25") (* The OR of clause CL1 and clause  CL2. *) (COND ((OR (EQUAL CL1 TRUE-CLAUSE) (EQUAL CL2 TRUE-CLAUSE)) TRUE-CLAUSE) ((for LIT1 in CL1 thereis (for LIT2 in CL2 thereis (COMPLEMENTARYP LIT1 LIT2))) TRUE-CLAUSE) (T (APPEND CL1 (SET-DIFF CL2 CL1]) (DISJOIN2 [LAMBDA (P Q IF-FLG) (* kbr: "19-Oct-85 16:31") (COND ((FALSE-NONFALSEP P) (COND (DEFINITELY-FALSE (COND ((FALSE-NONFALSEP Q) (COND (DEFINITELY-FALSE FALSE) (T TRUE))) ((NOT (BOOLEAN Q)) (FCONS-TERM* (QUOTE IF) Q TRUE FALSE)) (T Q))) (T TRUE))) ((FALSE-NONFALSEP Q) (COND (DEFINITELY-FALSE (COND ((BOOLEAN P) P) (T (FCONS-TERM* (QUOTE IF) P TRUE FALSE)))) (T TRUE))) (IF-FLG (FCONS-TERM* (QUOTE IF) P TRUE (COND ((BOOLEAN Q) Q) (T (FCONS-TERM* (QUOTE IF) Q TRUE FALSE))))) (T (FCONS-TERM* (QUOTE OR) P Q]) (DTACK-0-ON-END [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (RPLACD (LAST X) 0) X]) (DUMB-CONVERT-TYPE-SET-TO-TYPE-RESTRICTION-TERM [LAMBDA (TYPE-SET ARG) (* kbr: "19-Oct-85 16:31") (* WARNING: This function does not return a legal term.  In particular, it might return (AND a b c ...)%.  It should be used only for io purposes. *) (LET (LST) (COND ((IEQP TYPE-SET TYPE-SET-UNKNOWN) TRUE) ((IEQP TYPE-SET 0) FALSE) ((IEQP 0 (LSH TYPE-SET -31)) (SETQ LST (for I from 0 to 30 when (NOT (IEQP (LOGAND TYPE-SET (LOGBIT I)) 0)) collect (  CONVERT-TYPE-NO-TO-RECOGNIZER-TERM I ARG))) (COND ((NULL LST) FALSE) ((NULL (CDR LST)) (CAR LST)) (T (CONS (QUOTE OR) LST)))) (T (SETQ LST (for I from 0 to 30 when (IEQP 0 (LOGAND TYPE-SET (LOGBIT I))) collect (DUMB-NEGATE-LIT (CONVERT-TYPE-NO-TO-RECOGNIZER-TERM I ARG)))) (COND ((NULL LST) TRUE) ((NULL (CDR LST)) (CAR LST)) (T (CONS (QUOTE AND) LST]) (DUMB-IMPLICATE-LITS [LAMBDA (L1 L2) (* kbr: "19-Oct-85 16:31") (* Like DUMB-NEGATE-LIT, this function  may be called when TYPE-ALIST is not  valid. Hence this function should not  be modified to use TYPE-SET.  *) (COND ((QUOTEP L1) (COND ((EQUAL L1 FALSE) TRUE) (T L2))) (T (FCONS-TERM* (QUOTE IF) L1 L2 TRUE]) (DUMB-NEGATE-LIT [LAMBDA (TERM) (* kbr: "20-Oct-85 16:27") (* Syntactic NOT of TERM. Like DUMB-IMPLICATE-LITS, this function may be called  when TYPE-ALIST is not valid. Hence this function should not be modified to use  TYPE-SET. *) (COND ((VARIABLEP TERM) (FCONS-TERM* (QUOTE NOT) TERM)) ((FQUOTEP TERM) (COND ((EQUAL TERM FALSE) TRUE) (T FALSE))) ((EQ (FN-SYMB TERM) (QUOTE NOT)) (FARGN TERM 1)) (T (FCONS-TERM* (QUOTE NOT) TERM]) (DUMB-OCCUR [LAMBDA (X Y) (* kbr: " 4-Jul-86 17:01") (* Does X syntactically occur in Y? *) (COND ((EQUAL X Y) T) ((VARIABLEP Y) NIL) ((FQUOTEP Y) NIL) (T (for ARG in (FARGS Y) thereis (DUMB-OCCUR X ARG]) (DUMB-OCCUR-LST [LAMBDA (X LST) (* kbr: "19-Oct-85 16:31") (for TERM in LST thereis (DUMB-OCCUR X TERM]) (DUMP [LAMBDA (LST FILE INDENT WIDTH INDEX-FLG SCRIBE-FLG) (* kbr: "20-Oct-85 19:39") (LET (PAIRS) (OR INDENT (SETQ INDENT 5)) (OR WIDTH (SETQ WIDTH 68)) (SETQ FILE (OPENSTREAM FILE (QUOTE OUTPUT))) (LINEL FILE WIDTH) (SETQ PAIRS (for L in LST as I from 1 collect (PROGN (COND ((LITATOM L) (SETQ L (GETPROP L (QUOTE EVENT))))) (SELECTQ (CAR L) (DEFN (DUMP-DEFN (BM-NTH 1 L) (BM-NTH 2 L) (BM-NTH 3 L) (BM-NTH 4 L) (AND INDEX-FLG I))) (PROVE-LEMMA (DUMP-PROVE-LEMMA (BM-NTH 1 L) (BM-NTH 2 L) (BM-NTH 3 L) (BM-NTH 4 L) (AND INDEX-FLG I))) (ADD-AXIOM (DUMP-ADD-AXIOM (BM-NTH 1 L) (BM-NTH 2 L) (BM-NTH 3 L) (AND INDEX-FLG I))) (ADD-SHELL (DUMP-ADD-SHELL (BM-NTH 1 L) (BM-NTH 2 L) (BM-NTH 3 L) (BM-NTH 4 L) (AND INDEX-FLG I))) (DCL (DUMP-DCL (BM-NTH 1 L) (BM-NTH 2 L) (AND INDEX-FLG I))) (TOGGLE (DUMP-TOGGLE (BM-NTH 1 L) (BM-NTH 2 L) (BM-NTH 3 L) (AND INDEX-FLG I))) (DISABLE (DUMP-TOGGLE NIL (BM-NTH 1 L) NIL (AND INDEX-FLG I))) (ENABLE (DUMP-TOGGLE NIL (BM-NTH 1 L) T (AND INDEX-FLG I))) (DUMP-OTHER L (AND INDEX-FLG I))) (CONS (BM-NTH 1 L) I)))) NIL]) (DUMP-ADD-AXIOM [LAMBDA (NAME TYPES THM INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (IPRINC "AXIOM." FILE) (IPRINC NAME FILE) (COND (TYPES (SPACES 1 FILE) (DUMP-LEMMA-TYPES TYPES))) (IPRINT (QUOTE :) FILE) (SPACES INDENT FILE) (PPRINDENT THM INDENT 0 FILE) (ITERPRI FILE) (DUMP-END-GROUP FILE]) (DUMP-ADD-SHELL [LAMBDA (CONSTRUCTOR BTM RECOG ACCESSORS INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (PRINEVAL (PQUOTE (PROGN SHELL DEFINITION %. // ADD THE SHELL (!PPR CONSTRUCTOR NIL) OF (@ N) (PLURAL? ACCESSORS ARGUMENTS ARGUMENT) WITH // (COND (BTM BOTTOM OBJECT (!PPR BTM (PQUOTE ,) NIL) //)) RECOGNIZER (!PPR RECOG NIL) , // (PLURAL? ACCESSORS ACCESSORS ACCESSOR) (!PPR-LIST NAMES) , // (COND (FLG TYPE (PLURAL? ACCESSORS RESTRICTIONS RESTRICTION) (!PPR-LIST RESTRICTIONS) , //)) AND DEFAULT (PLURAL? ACCESSORS VALUES VALUE) (!PPR-LIST DEFAULTS NIL) %.)) (BINDINGS (QUOTE RECOG) RECOG (QUOTE BTM) BTM (QUOTE ACCESSORS) ACCESSORS (QUOTE CONSTRUCTOR) CONSTRUCTOR (QUOTE N) (LENGTH ACCESSORS) (QUOTE NAMES) (for X in ACCESSORS collect (CAR X)) (QUOTE FLG) (for X in ACCESSORS thereis (AND (NEQ (CADR X) T) (NOT (EQUAL (CADR X) TRUE)))) (QUOTE RESTRICTIONS) (for X in ACCESSORS collect (CADR X)) (QUOTE DEFAULTS) (for X in ACCESSORS collect (CADDR X))) INDENT FILE) (ITERPRI FILE) (DUMP-END-GROUP FILE]) (DUMP-BEGIN-GROUP [LAMBDA (FILE) (* kbr: "19-Oct-85 16:31") (COND (SCRIBE-FLG (PRIN1 (QUOTE @BEGIN (GROUP)) FILE) (ITERPRI FILE) (PRIN1 (QUOTE @BEGIN (VERBATIM)) FILE) (ITERPRI FILE]) (DUMP-DCL [LAMBDA (FN ARGS INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (IPRINC "UNDEFINED FUNCTION." FILE) (ITERPRI FILE) (ISPACES INDENT FILE) (IPRINT (CONS FN ARGS) FILE) (DUMP-END-GROUP FILE]) (DUMP-DEFN [LAMBDA (FN ARGS BODY HINT INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (IPRINC "DEFINITION." FILE) (ITERPRI FILE) (ISPACES INDENT FILE) (IPRINT (CONS FN ARGS) FILE) (ISPACES (IPLUS INDENT 3) FILE) (IPRINT (QUOTE IEQP) FILE) (ISPACES INDENT FILE) (PPRINDENT BODY INDENT 0 FILE) (ITERPRI FILE) (COND (HINT (ISPACES INDENT FILE) (IPRINC "HINT:" FILE) (COND ((NULL (CDR HINT)) (IPRINC "CONSIDER THE WELL-FOUNDED RELATION" FILE) (IPRINT (CAR (CAR HINT)) FILE) (ISPACES (IPLUS 7 INDENT) FILE) (IPRINC "AND THE MEASURE" FILE) (IPRINT (CADR (CAR HINT)) FILE)) (T (PPRINDENT HINT (IPLUS 7 INDENT) 0 FILE) (ITERPRI FILE))))) (DUMP-END-GROUP FILE]) (DUMP-END-GROUP [LAMBDA (FILE) (* kbr: "19-Oct-85 16:31") (COND (SCRIBE-FLG (PRIN1 (QUOTE @END (VERBATIM)) FILE) (ITERPRI FILE) (PRIN1 (QUOTE @END (GROUP)) FILE) (ITERPRI FILE) (ITERPRI FILE]) (DUMP-HINTS [LAMBDA (HINT) (* kbr: "19-Oct-85 20:06") (LET (USED DISABLED ENABLED (INDENT INDENT)) (SETQ USED (CDR (ASSOC (QUOTE USE) HINT))) (SETQ DISABLED (CDR (ASSOC (QUOTE DISABLE) HINT))) (SETQ ENABLED (for X in USED when (NOT (MEMB (CAR X) DISABLED)) collect (CAR X))) (SETQ DISABLED (for X in DISABLED when (NOT (ASSOC X USED)) collect X)) (SETQ HINT (for X in HINT join (SELECTQ (CAR X) (USE (COND ((NULL ENABLED) (LIST (CONS (QUOTE USE) USED))) (T (LIST (CONS (QUOTE USE) USED) (CONS (QUOTE ENABLE) ENABLED))))) (DISABLE (COND ((NULL DISABLED) NIL) (T (LIST (CONS (QUOTE DISABLE) DISABLED))))) (LIST X)))) (ISPACES INDENT FILE) (COND ((OR (LISTP (CDR HINT)) (AND USED (LISTP (CDR USED)))) (IPRINC "HINTS:" FILE) (SETQ INDENT (IPLUS INDENT 8))) (T (IPRINC "HINT:" FILE) (SETQ INDENT (IPLUS INDENT 7)))) (for X in HINT do (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE) (SELECTQ (CAR X) (INDUCT (IPRINC "INDUCT AS FOR" FILE) (IPRINC (CADR X) FILE) (IPRINC "." FILE) (ITERPRI FILE)) (USE (IPRINC "CONSIDER:" FILE) (ITERPRI FILE) (for PAIR in (CDR X) do (ISPACES (ADD1 INDENT) FILE) (IPRINC (CAR PAIR) FILE) (COND ((CDR PAIR) (IPRINC "WITH {" FILE) (for TL on (CDR PAIR) do (IPRINC (CAAR TL) FILE) (IPRINC "/" FILE) (IPRINC (CADR (CAR TL)) FILE) (COND ((CDR TL) (IPRINC "," FILE)))) (IPRINC "}" FILE))) (ITERPRI FILE))) (ENABLE (IPRINC "ENABLE" FILE) (PRINEVAL (PQUOTE (!LIST X)) (BINDINGS (QUOTE X) (CDR X)) (IPOSITION FILE NIL NIL) FILE) (ITERPRI FILE)) (DISABLE (IPRINC "DISABLE" FILE) (PRINEVAL (PQUOTE (!LIST X)) (BINDINGS (QUOTE X) (CDR X)) (IPOSITION FILE NIL NIL) FILE) (ITERPRI FILE)) (PROGN (PPRIND X (IPOSITION FILE NIL NIL) 0 PPR-MACRO-LST FILE) (ITERPRI FILE]) (DUMP-LEMMA-TYPES [LAMBDA (TYPES) (* kbr: "26-Oct-85 17:18") (IPRINC "(" FILE) (for TAIL on TYPES do (IPRINC (COND ((EQ (CAR TAIL) (QUOTE ELIM)) (QUOTE ELIMINATION)) (T (L-CASE (CAR TAIL)))) FILE) (COND ((NULL (CDR TAIL)) NIL) ((NULL (CDDR TAIL)) (IPRINC "AND" FILE)) (T (IPRINC "," FILE) (ISPACES 1 FILE)))) (IPRINC ")" FILE]) (DUMP-OTHER [LAMBDA (X INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (PPRIND X (IPOSITION FILE NIL NIL) 0 NIL FILE) (ITERPRI FILE) (DUMP-END-GROUP FILE]) (DUMP-PROVE-LEMMA [LAMBDA (NAME TYPES THM HINT INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (IPRINC "THEOREM." FILE) (IPRINC NAME FILE) (COND (TYPES (ISPACES 1 FILE) (DUMP-LEMMA-TYPES TYPES))) (IPRINT (QUOTE :) FILE) (ISPACES INDENT FILE) (PPRINDENT THM INDENT 0 FILE) (ITERPRI FILE) (COND (HINT (DUMP-HINTS HINT))) (DUMP-END-GROUP FILE]) (DUMP-TOGGLE [LAMBDA (NAME OLDNAME FLG INDEX) (* kbr: "19-Oct-85 16:31") (DUMP-BEGIN-GROUP FILE) (COND (INDEX (IPRINC INDEX FILE) (IPRINC "." FILE) (ISPACES (IDIFFERENCE INDENT (IPOSITION FILE NIL NIL)) FILE)) (T (ISPACES INDENT FILE))) (COND (FLG (IPRINC "DISABLE" FILE)) (T (IPRINC "ENABLE" FILE))) (IPRINC OLDNAME FILE) (IPRINC "." FILE) (ITERPRI FILE) (DUMP-END-GROUP FILE]) ) (RPAQQ CODE-E-MCOMS ((* CODE-E-M *) (FNS ELIMINABLE-VAR-CANDS ELIMINABLEP ELIMINATE-DESTRUCTORS-CANDIDATEP ELIMINATE-DESTRUCTORS-CANDIDATES ELIMINATE-DESTRUCTORS-CANDIDATES1 ELIMINATE-DESTRUCTORS-CLAUSE ELIMINATE-DESTRUCTORS-CLAUSE1 ELIMINATE-DESTRUCTORS-SENT ELIMINATE-IRRELEVANCE-CLAUSE ELIMINATE-IRRELEVANCE-SENT EQUATIONAL-PAIR-FOR ERASE-EOL ERASE-EOP ERROR1 EVENT-FORM EVENT1-OCCURRED-BEFORE-EVENT2 EVENTS-SINCE EVG EVG-OCCUR-LEGAL-CHAR-CODE-SEQ EVG-OCCUR-NUMBER EVG-OCCUR-OTHER EXECUTE EXPAND-ABBREVIATIONS EXPAND-AND-ORS EXPAND-BOOT-STRAP-NON-REC-FNS EXPAND-NON-REC-FNS EXPAND-PPR-MACROS EXTEND-ALIST EXTERNAL-LINEARIZE EXTRACT-DEPENDENCIES-FROM-HINTS FALSE-NONFALSEP FAVOR-COMPLICATED-CANDIDATES FERTILIZE-CLAUSE FERTILIZE-FEASIBLE FERTILIZE-SENT FERTILIZE1 FILTER-ARGS FIND-EQUATIONAL-POLY FIRST-COEFFICIENT FIRST-VAR FITS FIXCAR-CDR FLATTEN-ANDS-IN-LIT FLESH-OUT-IND-PRIN FLUSH-CAND1-DOWN-CAND2 FN-SYMB0 FNNAMEP FNNAMEP-IF FORM-COUNT FORM-COUNT-EVG FORM-COUNT1 FORM-INDUCTION-CLAUSE FORMP-SIMPLIFIER FORMULA-OF FREE-VAR-CHK FREE-VARSP GEN-VARS GENERALIZE-CLAUSE GENERALIZE-SENT GENERALIZE1 GENERALIZE2 GENRLT1 GENRLTERMS GET-CANDS GET-LISP-SEXPR GET-LEVEL-NO GET-STACK-NAME GET-STACK-NAME1 GET-TYPES GREATEREQP GUARANTEE-CITIZENSHIP GUESS-RELATION-MEASURE-LST HAS-LIB-PROPS ILLEGAL-CALL ILLEGAL-NAME IMMEDIATE-DEPENDENTS-OF IMPLIES? IMPOSSIBLE-POLYP IND-FORMULA INDUCT INDUCT-VARS INDUCTION-MACHINE INFORM-SIMPLIFY INIT-LEMMA-STACK INIT-LIB INIT-LINEARIZE-ASSUMPTIONS-STACK INTERESTING-SUBTERMS INTERSECTP INTRODUCE-ANDS INTRODUCE-LISTS JUMPOUTP KILL-EVENT KILL-LIB KILLPROPLIST1 LEGAL-CHAR-CODE-SEQ LENGTH-TO-ATOM LESSEQP LEXORDER LINEARIZE LISTABLE LOGSUBSETP LOOKUP-HYP LOOP-STOPPER MAIN-EVENT-OF CREATE-EVENT MAKE-FLATTENED-MACHINE MAKE-NEW-NAME MAKE-REWRITE-RULES MAKE-TYPE-RESTRICTION MAX-FORM-COUNT MAXIMAL-ELEMENTS MEANING-SIMPLIFIER MEMB-NEGATIVE MENTIONSQ MENTIONSQ-LST MERGE-CAND1-INTO-CAND2 MERGE-CANDS MERGE-DESTRUCTOR-CANDIDATES MERGE-TESTS-AND-ALISTS MERGE-TESTS-AND-ALISTS-LSTS META-LEMMAP MULTIPLE-PIGEON-HOLE))) (* CODE-E-M *) (DEFINEQ (ELIMINABLE-VAR-CANDS [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") HIST (SET-DIFF (ALL-VARS-LST CL) ELIM-VARIABLE-NAMES1]) (ELIMINABLEP [LAMBDA (SET) (* kbr: "19-Oct-85 16:31") (OR (for LIT in SET always (PRIMITIVEP LIT)) (AND (IEQP (LENGTH SET) 1) (OR (AND (for ARG in (SARGS (CAR SET)) always (VARIABLEP ARG)) (NO-DUPLICATESP (SARGS (CAR SET)))) (AND (EQ (FN-SYMB (CAR SET)) (QUOTE NOT)) (for ARG in (SARGS (ARGN (CAR SET) 1)) always (VARIABLEP ARG)) (NO-DUPLICATESP (SARGS (ARGN (CAR SET) 1]) (ELIMINATE-DESTRUCTORS-CANDIDATEP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* Recognizes candidates for destructor elimination.  It is assumed the input term is NVARIABLEP and not QUOTEP.  To be a candidate the term must have an enabled destructor elim lemma.  Furthermore, the crucial argument position of the term must be occupied by a  variable or must itself be a candidate for elimination.  Finally, if occupied by a variable, that variable must occur nowhere else in  the arguments. Note that if the crucial arg is an eliminable term then the  process of eliminating it will introduce a suitable distinct var.  The answer returned is either NIL or else is the innermost term to be  eliminated -- possibly TERM itself. *) (PROG (LEMMA VAR) (SETQ LEMMA (GETPROP (FFN-SYMB TERM) (QUOTE ELIMINATE-DESTRUCTORS-SEQ))) (COND ((OR (NULL LEMMA) (DISABLEDP (fetch (REWRITE-RULE NAME) of LEMMA))) (RETURN NIL))) (* We now identify the crucial arg.  *) (SETQ VAR (for ARG in (FARGS TERM) as V in (FARGS (CAR (GETPROP (FFN-SYMB TERM) (QUOTE ELIMINATE-DESTRUCTORS-DESTS )))) when (EQ V (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2)) do (RETURN ARG))) (RETURN (COND ((VARIABLEP VAR) (* If it is a variable, we make sure  it occurs nowhere else.  *) (COND ((for ARG in (FARGS TERM) as V in (FARGS (CAR (GETPROP (FFN-SYMB TERM) (QUOTE ELIMINATE-DESTRUCTORS-DESTS)))) unless (EQ V (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2)) never (OCCUR VAR ARG)) TERM) (T NIL))) (T (ELIMINATE-DESTRUCTORS-CANDIDATEP VAR]) (ELIMINATE-DESTRUCTORS-CANDIDATES [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (* Returns a list of pockets. The CAR of each pocket is an eliminable  destructor term. The CDR of each pocket is a list of all destructor terms that  will in turn be eliminated as a result of eliminating the CAR.  *) (LET (ANS) (for LIT in CL do (ELIMINATE-DESTRUCTORS-CANDIDATES1 LIT)) (MERGE-DESTRUCTOR-CANDIDATES ANS]) (ELIMINATE-DESTRUCTORS-CANDIDATES1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* This function adds some lists to ANS.  Each list has two elements. The first is a term that can be eliminated.  The second is a term containing the first which will be eliminated in the same  round as the first is eliminated. *) (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM)) NIL) (T (for ARG in (FARGS TERM) do (ELIMINATE-DESTRUCTORS-CANDIDATES1 ARG)) (COND ((SETQ TEMP-TEMP (ELIMINATE-DESTRUCTORS-CANDIDATEP TERM)) (SETQ ANS (ADD-TO-SET (LIST TEMP-TEMP TERM) ANS]) (ELIMINATE-DESTRUCTORS-CLAUSE [LAMBDA (CL HIST) (* kbr: "20-Oct-85 19:34") (LET (ELIMINABLES NEW-CL TO-DO CANDS REWRITE-RULE HYPS LHS RHS DESTS ALIST INST-DESTS INST-RHS INST-LHS INST-HYPS) (* TO-DO is a list that controls the elimination.  The invariant maintained is that the all the clauses in PROCESS-CLAUSES and all  the clauses in TO-DO are theorems then so is the initial CL.  When a clause is removed from TO-DO either it is added to PROCESS-CLAUSES or  else an elimination is performed on it and the resulting cases are all added to  TO-DO for any additional elims required on the new variables introduced.  TO-DO is a list of pockets. Each pocket contains a clause, the list of all  variables in the clause not introduced by an elim, and some candidate  destructor pockets. The candidate destructor pockets each contain in their CAR  a term that might be eliminated and in their CDR all of the terms that could  recursively be eliminated should the CAR be eliminated.  These pockets are ordered from most desirable elim to least desirable elim.  At the moment the ordering is determined by the sum of the level numbers of the  terms in the CDRs. *) (SETQ TO-DO (LIST (LIST CL (ELIMINABLE-VAR-CANDS CL HIST) (SORT-DESTRUCTOR-CANDIDATES (ELIMINATE-DESTRUCTORS-CANDIDATES CL))))) (SETQ PROCESS-CLAUSES NIL) (SETQ PROCESS-HIST NIL) (while TO-DO do (SETQ CL (CAAR TO-DO)) (SETQ ELIMINABLES (CADAR TO-DO)) (SETQ CANDS (CADDAR TO-DO)) (SETQ TO-DO (CDR TO-DO)) (COND ((OR (NULL ELIMINABLES) (NULL CANDS)) (SETQ PROCESS-CLAUSES (CONS CL PROCESS-CLAUSES))) ((for CAND-TAIL on CANDS bind CAND thereis (PROGN (* CAND is the candidate destructor  term to be eliminated.  *) (SETQ CAND (CAR (CAR CAND-TAIL))) (SETQ REWRITE-RULE (GETPROP (FFN-SYMB CAND) (QUOTE ELIMINATE-DESTRUCTORS-SEQ))) (* We know this rule is not disabled  because  ELIMINATE-DESTRUCTORS-CANDIDATES  checks DISABLED-LEMMAS before saying a  term is a candidate.  *) (SETQ HYPS (fetch (REWRITE-RULE HYPS) of REWRITE-RULE)) (SETQ LHS (FARGN (fetch (REWRITE-RULE CONCL) of REWRITE-RULE) 1)) (SETQ RHS (FARGN (fetch (REWRITE-RULE CONCL) of REWRITE-RULE) 2)) (SETQ DESTS (GETPROP (FFN-SYMB CAND) (QUOTE ELIMINATE-DESTRUCTORS-DESTS))) (SETQ ALIST (for VAR in (FARGS (CAR DESTS)) as VAL in (FARGS CAND) collect (CONS VAR VAL))) (SETQ INST-RHS (SUBLIS-VAR ALIST RHS)) (COND ((AND (MEMB INST-RHS ELIMINABLES) (for HYP in HYPS never (MEMBER (SUBLIS-VAR ALIST HYP) CL))) (SETQ INST-DESTS (SUBLIS-VAR-LST ALIST DESTS)) (SETQ INST-HYPS (SUBLIS-VAR-LST ALIST HYPS)) (SETQ INST-LHS (SUBLIS-VAR ALIST LHS)) (SETQ TO-DO (APPEND (for HYP in INST-HYPS unless (EQUAL TRUE-CLAUSE (SETQ NEW-CL (ADD-LITERAL HYP CL NIL))) collect (LIST NEW-CL ELIMINABLES (COND (PROCESS-HIST (for POCKET in (CDR CAND-TAIL) unless (MEMBER (CAR POCKET) INST-DESTS) collect POCKET)) (T NIL)))) TO-DO)) (SETQ NEW-CL (ELIMINATE-DESTRUCTORS-CLAUSE1 CL INST-HYPS INST-LHS INST-RHS INST-DESTS)) (COND ((NOT (EQUAL TRUE-CLAUSE NEW-CL)) (SETQ TO-DO (CONS (LIST NEW-CL (UNIONQ GENERALIZING-SKOS (REMOVE INST-RHS ELIMINABLES)) (SORT-DESTRUCTOR-CANDIDATES (MERGE-DESTRUCTOR-CANDIDATES (UNION-EQUAL (COND (PROCESS-HIST (for POCKET in (CDR CAND-TAIL) when (OCCUR-LST (CAR POCKET) NEW-CL) collect POCKET )) (T NIL)) (for POCKET in (ELIMINATE-DESTRUCTORS-CANDIDATES NEW-CL) when (for VAR in (FARGS (CAR POCKET)) thereis (MEMB VAR GENERALIZING-SKOS)) collect POCKET))))) TO-DO)))) (SETQ PROCESS-HIST (CONS (LIST (fetch (REWRITE-RULE NAME) of REWRITE-RULE) INST-DESTS OBVIOUS-RESTRICTIONS GENERALIZE-LEMMA-NAMES INST-RHS (SUB-PAIR-EXPR INST-DESTS GENERALIZING-SKOS INST-LHS)) PROCESS-HIST)) T) (T NIL))))) (T (SETQ PROCESS-CLAUSES (CONS CL PROCESS-CLAUSES))))) (for PAIR in PROCESS-HIST do (SETQ ALL-LEMMAS-USED (UNION-EQUAL (CADDDR PAIR) (ADD-TO-SET (CAR PAIR) ALL-LEMMAS-USED)))) (SETQ PROCESS-CLAUSES (SCRUNCH-CLAUSE-SET PROCESS-CLAUSES)) (NOT (NULL PROCESS-HIST]) (ELIMINATE-DESTRUCTORS-CLAUSE1 [LAMBDA (CL HYPS LHS RHS DESTS) (* kbr: "19-Oct-85 16:31") (LET (GEN-CL GEN-LHS CL1) (SETQ CL1 CL) (* We preserve the order of the hyps  just for the hell of it.  *) (for HYP in (REVERSE HYPS) do (SETQ CL1 (ADD-LITERAL (NEGATE-LIT HYP) CL1 NIL))) (SETQ GEN-CL (GENERALIZE1 CL1 DESTS ELIM-VARIABLE-NAMES1)) (SETQ GEN-LHS (SUB-PAIR-EXPR DESTS GENERALIZING-SKOS LHS)) (SUBST-VAR-LST GEN-LHS RHS GEN-CL]) (ELIMINATE-DESTRUCTORS-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE ELIMINATE-DESTRUCTORS-CLAUSE) CL HIST (QUOTE SIMPLIFY-SENT) (QUOTE FERTILIZE-SENT]) (ELIMINATE-IRRELEVANCE-CLAUSE [LAMBDA (CL HIST) (* kbr: "19-Oct-85 20:00") HIST (PROG (PARTITION ELIMINABLES) (COND ((NOT (ASSOC (QUOTE BEING-PROVED) STACK)) (RETURN NIL))) [SETQ PARTITION (TRANSITIVE-CLOSURE (for LIT in CL collect (CONS (ALL-VARS LIT) (LIST LIT))) (FUNCTION (LAMBDA (X Y) (COND ((INTERSECTP (CAR X) (CAR Y)) (CONS (UNION-EQUAL (CAR X) (CAR Y)) (UNION-EQUAL (CDR X) (CDR Y)))) (T NIL] (SETQ ELIMINABLES (for PAIR in PARTITION when (ELIMINABLEP (CDR PAIR)) join (CDR PAIR))) (COND ((NULL ELIMINABLES) (RETURN NIL)) (T (SETQ PROCESS-CLAUSES (LIST (for LIT in CL unless (MEMB LIT ELIMINABLES) collect LIT))) (SETQ PROCESS-HIST NIL) (RETURN T]) (ELIMINATE-IRRELEVANCE-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE ELIMINATE-IRRELEVANCE-CLAUSE) CL HIST (QUOTE STORE-SENT) (QUOTE STORE-SENT]) (EQUATIONAL-PAIR-FOR [LAMBDA (WINNING-PAIR POLY) (* kbr: "19-Oct-85 16:31") (CONS (CAR WINNING-PAIR) (CONS-PLUS (LIST (QUOTE QUOTE) (ABS (fetch (POLY CONSTANT) of POLY))) (BUILD-SUM WINNING-PAIR (fetch (POLY ALIST) of POLY]) (ERASE-EOL [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (CURSORPOS (QUOTE L]) (ERASE-EOP [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (CURSORPOS (QUOTE E]) (ERROR1 [LAMBDA (SENTENCE ALIST HARDNESS) (* kbr: "20-Apr-86 16:18") (SETQ ALIST (CONS (CONS (QUOTE SENTENCE) SENTENCE) (CONS (CONS (QUOTE HARDNESS) HARDNESS) ALIST))) (COND ((NULL HARDNESS) (SETQ HARDNESS (QUOTE HARD)))) (PRINEVAL (PQUOTE (PROGN // (COND ((EQ HARDNESS (QUOTE WARNING)) WARNING) ((EQ HARDNESS (QUOTE HARD)) FATAL ERROR) (T ERROR)) : (@ SENTENCE) // //)) ALIST 0 PROVE-FILE) (COND ((NEQ TTY-FILE PROVE-FILE) (PRINEVAL (PQUOTE (PROGN // (COND ((EQ HARDNESS (QUOTE WARNING)) WARNING) ((EQ HARDNESS (QUOTE HARD)) FATAL ERROR) (T ERROR)) : (@ SENTENCE) // //)) ALIST 0 TTY-FILE))) (COND (DEBUGFLG (HELP))) (COND ((EQ HARDNESS (QUOTE WARNING)) NIL) ((DETACHEDP) (DETACHED-ERROR) (ERROR1 SENTENCE (CDDR ALIST) HARDNESS)) ((AND (EQ HARDNESS (QUOTE SOFT)) IN-REDO-UNDONE-EVENTS-FLG) (RETFROM (QUOTE APPLY) (QUOTE *****ERROR*****))) (T (ERROR (LIST (QUOTE ERROR1) SENTENCE ALIST]) (EVENT-FORM [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (AND (LITATOM X) (OR (GETPROP X (QUOTE EVENT)) (AND (GETPROP X (QUOTE MAIN-EVENT)) (GETPROP (GETPROP X (QUOTE MAIN-EVENT)) (QUOTE EVENT]) (EVENT1-OCCURRED-BEFORE-EVENT2 [LAMBDA (EVENT1 EVENT2 EVENT-LST) (* kbr: "19-Oct-85 16:31") (COND ((MEMB EVENT1 (CDR (MEMB EVENT2 EVENT-LST))) T) (T NIL]) (EVENTS-SINCE [LAMBDA (EVENT) (* kbr: "19-Oct-85 16:31") (COND ((MEMB EVENT CHRONOLOGY) (CONS (GETPROP EVENT (QUOTE EVENT)) (DREVERSE (for E in CHRONOLOGY until (EQ E EVENT) collect (GETPROP E (QUOTE EVENT]) (EVG [LAMBDA (Y) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP Y) (COND ((FIXP Y) (COND ((GREATEREQP Y 0) TYPE-SET-NUMBERS) (T TYPE-SET-NEGATIVES))) ((EQ Y *1*T) TYPE-SET-TRUE) ((EQ Y *1*F) TYPE-SET-FALSE) ((ILLEGAL-NAME Y) NIL) (T TYPE-SET-LITATOMS))) ((EQ (CAR Y) *1*SHELL-QUOTE-MARK) (COND ((AND (LISTP (CDR Y)) (EQ (CDR (LAST Y)) NIL) (IEQP (LENGTH (CDDR Y)) (ARITY (CADR Y))) (OR (MEMB (CADR Y) *1*BTM-OBJECTS) (AND (ASSOC (CADR Y) SHELL-ALIST) (for RESTRICTION in (GETPROP (CADR Y) (QUOTE TYPE-RESTRICTIONS)) as ARG in (CDDR Y) always (AND (SETQ TEMP-TEMP (EVG ARG)) (LOGSUBSETP TEMP-TEMP (fetch (TYPE-RESTRICTION TYPE-SET) of RESTRICTION)))))) (COND ((EQ (CADR Y) (QUOTE PACK)) (NOT (LEGAL-CHAR-CODE-SEQ (CADDR Y)))) ((EQ (CADR Y) (QUOTE MINUS)) (EQUAL (CADDR Y) 0)) (T (NOT (MEMB (CADR Y) (QUOTE (ADD1 ZERO CONS))))))) (CAR (TYPE-PRESCRIPTION (CADR Y)))) (T NIL))) ((AND (EVG (CAR Y)) (EVG (CDR Y))) TYPE-SET-CONS) (T NIL]) (EVG-OCCUR-LEGAL-CHAR-CODE-SEQ [LAMBDA (L EVG) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP EVG) (COND ((EQ EVG *1*T) NIL) ((EQ EVG *1*F) NIL) ((FIXP EVG) NIL) ((LESSP (NCHARS EVG) (LENGTH-TO-ATOM L)) NIL) (T (for TAIL on L until (NLISTP TAIL) as J from (ADD1 (IDIFFERENCE (NCHARS EVG) (LENGTH-TO-ATOM L))) always (IEQP (CAR TAIL) (NTHCHARCODE EVG J)))))) ((EQ (CAR EVG) *1*SHELL-QUOTE-MARK) (for ARG in (CDDR EVG) thereis (EVG-OCCUR-LEGAL-CHAR-CODE-SEQ L ARG))) ((EQUAL L EVG) T) (T (OR (EVG-OCCUR-LEGAL-CHAR-CODE-SEQ L (CAR EVG)) (EVG-OCCUR-LEGAL-CHAR-CODE-SEQ L (CDR EVG]) (EVG-OCCUR-NUMBER [LAMBDA (N EVG) (* kbr: "17-Nov-85 17:08") (COND ((NLISTP EVG) (COND ((EQ EVG *1*T) NIL) ((EQ EVG *1*F) NIL) ((FIXP EVG) (COND ((LESSP N 0) (EQUAL N EVG)) (T (LESSEQP N (ABS EVG))))) ((LESSP N 0) NIL) ((GREATERP N (CHARCODE Z)) NIL) ((LESSEQP N (CHARCODE -)) T) (T (for I from 1 to (NCHARS EVG) thereis (LESSEQP N (NTHCHARCODE EVG I)))))) ((EQ (CAR EVG) *1*SHELL-QUOTE-MARK) (for ARG in (CDDR EVG) thereis (EVG-OCCUR-NUMBER N ARG))) (T (OR (EVG-OCCUR-NUMBER N (CAR EVG)) (EVG-OCCUR-NUMBER N (CDR EVG]) (EVG-OCCUR-OTHER [LAMBDA (X EVG) (* kbr: "19-Oct-85 16:31") (* X must be an evg other than a FIXP  or a LEGAL-CHAR-CODE-SEQ with 0 final  CDR. *) (COND ((EQUAL X EVG) T) ((NLISTP EVG) NIL) ((EQ (CAR EVG) *1*SHELL-QUOTE-MARK) (for ARG in (CDDR EVG) thereis (EVG-OCCUR-OTHER X ARG))) (T (OR (EVG-OCCUR-OTHER X (CAR EVG)) (EVG-OCCUR-OTHER X (CDR EVG]) (EXECUTE [LAMBDA (PROCESS CL HIST NORMAL-EXIT NO-CHANGE-EXIT) (* kbr: "19-Oct-85 16:31") (LET (NEW-HIST) (COND ((APPLY* PROCESS CL HIST) (SETQ NEW-HIST (ADD-PROCESS-HIST PROCESS CL HIST PROCESS-CLAUSES PROCESS-HIST)) (for CL1 in PROCESS-CLAUSES do (APPLY* NORMAL-EXIT CL1 NEW-HIST))) (T (APPLY* NO-CHANGE-EXIT CL HIST]) (EXPAND-ABBREVIATIONS [LAMBDA (TERM ALIST) (* kbr: "19-Oct-85 16:31") (* Apply all unconditional rewrite  rules and nonrec defns that are  ABBREVIATIONPs. Adds to  ABBREVIATIONS-USED the names of the  lemmas and fns applied.  *) (LET (TEMP LEMMA RHS LHS) (COND ((VARIABLEP TERM) (COND ((SETQ TEMP (ASSOC TERM ALIST)) (CDR TEMP)) (T TERM))) ((FQUOTEP TERM) TERM) ((MEMB (FFN-SYMB TERM) FNS-TO-BE-IGNORED-BY-REWRITE) (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (EXPAND-ABBREVIATIONS ARG ALIST)))) ((AND (SETQ TEMP (NON-RECURSIVE-DEFNP (FFN-SYMB TERM))) (ABBREVIATIONP (CADR TEMP) (CADDR TEMP))) (SETQ ABBREVIATIONS-USED (ADD-TO-SET (FFN-SYMB TERM) ABBREVIATIONS-USED)) (EXPAND-ABBREVIATIONS (CADDR TEMP) (for V in (CADR TEMP) as ARG in (FARGS TERM) collect (CONS V (  EXPAND-ABBREVIATIONS ARG ALIST))))) (T (SETQ TERM (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (EXPAND-ABBREVIATIONS ARG ALIST)))) (COND ((FQUOTEP TERM) TERM) ((SETQ LEMMA (for LEMMA in (GETPROP (FFN-SYMB TERM) (QUOTE LEMMAS)) when (AND (NOT (DISABLEDP (fetch (REWRITE-RULE NAME) of LEMMA))) (NOT (META-LEMMAP LEMMA)) (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NULL (fetch (REWRITE-RULE LOOP-STOPPER) of LEMMA)) (BM-MATCH (fetch (REWRITE-RULE CONCL) of LEMMA) (EQUAL LHS RHS)) (ABBREVIATIONP (ALL-VARS-BAG LHS) RHS) (ONE-WAY-UNIFY LHS TERM)) do (RETURN LEMMA))) (SETQ ABBREVIATIONS-USED (ADD-TO-SET (fetch (REWRITE-RULE NAME) of LEMMA) ABBREVIATIONS-USED)) (EXPAND-ABBREVIATIONS RHS UNIFY-SUBST)) (T TERM]) (EXPAND-AND-ORS [LAMBDA (TERM BOOL) (* kbr: "19-Oct-85 16:31") (* Expands the top-level fn symbol of TERM provided the expansion produces an  AND -- when BOOL is FALSE -- or OR -- when BOOL is TRUE --  or returns NIL if no expansion is appropriate.  Side-effects ABBREVIATIONS-USED. *) (LET (TEMP LEMMA RHS LHS C2 C3) (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) NIL) ((AND (SETQ TEMP (NON-RECURSIVE-DEFNP (FFN-SYMB TERM))) (OR (AND (BM-MATCH (CADDR TEMP) (COND ((& C2 C3)))) (OR (EQUAL C2 BOOL) (EQUAL C3 BOOL))) (COND ((EQUAL BOOL FALSE) (BM-MATCH (CADDR TEMP) (AND & &))) (T (BM-MATCH (CADDR TEMP) (OR & &)))))) (SETQ ABBREVIATIONS-USED (ADD-TO-SET (FFN-SYMB TERM) ABBREVIATIONS-USED)) (EXPAND-ABBREVIATIONS (SUB-PAIR-VAR (CADR TEMP) (FARGS TERM) (CADDR TEMP)) NIL)) ((SETQ LEMMA (for LEMMA in (GETPROP (FFN-SYMB TERM) (QUOTE LEMMAS)) when (AND (NOT (DISABLEDP (fetch (REWRITE-RULE NAME) of LEMMA))) (NOT (META-LEMMAP LEMMA)) (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NULL (fetch (REWRITE-RULE LOOP-STOPPER) of LEMMA)) (BM-MATCH (fetch (REWRITE-RULE CONCL) of LEMMA) (EQUAL LHS RHS)) (BM-MATCH RHS (COND ((& C2 C3)))) (OR (EQUAL C2 BOOL) (EQUAL C3 BOOL)) (ONE-WAY-UNIFY LHS TERM)) do (RETURN LEMMA))) (SETQ ABBREVIATIONS-USED (ADD-TO-SET (fetch (REWRITE-RULE NAME) of LEMMA) ABBREVIATIONS-USED)) (EXPAND-ABBREVIATIONS (SUBLIS-VAR UNIFY-SUBST RHS) NIL)) (T NIL]) (EXPAND-BOOT-STRAP-NON-REC-FNS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) ((MEMB (FFN-SYMB TERM) (QUOTE (AND OR NOT IMPLIES FIX ZEROP NLISTP))) (EXPAND-BOOT-STRAP-NON-REC-FNS (SUB-PAIR-VAR (CADR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN))) (FARGS TERM) (CADDR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN)))))) (T (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (EXPAND-BOOT-STRAP-NON-REC-FNS ARG]) (EXPAND-NON-REC-FNS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) ((NON-RECURSIVE-DEFNP (FFN-SYMB TERM)) (EXPAND-NON-REC-FNS (SUB-PAIR-VAR (CADR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN))) (FARGS TERM) (CADDR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN)))))) (T (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (EXPAND-NON-REC-FNS ARG]) (EXPAND-PPR-MACROS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* As currently defined and used, this fn is a crock.  It binds PPR-MACRO-LST apparently so that the macro defns on PPR-MACRO-LST can  smash the list so that while processing the value delivered by a macro macros  are not expanded. This appears to be used by CONVERT-QUOTE so that after  (QUOTE evg) has been processed at the top level --  possibly changing into something like a number or NIL or TRUE but possibly  being unchanged -- the recursive processing of evg does not cause macro  expansion -- e.g., (QUOTE (CAR (CAR X))) is otherwise changed into  (* As *) *) (LET ((PPR-MACRO-LST PPR-MACRO-LST)) (COND ((NLISTP TERM) TERM) ((SETQ TEMP-TEMP (ASSOC (CAR TERM) PPR-MACRO-LST)) (SETQ TEMP-TEMP (APPLY* (CDR TEMP-TEMP) TERM)) (COND ((NLISTP TEMP-TEMP) TEMP-TEMP) ((EQ (CAR TEMP-TEMP) (QUOTE QUOTE)) TEMP-TEMP) (T (CONS (CAR TEMP-TEMP) (for ARG in (CDR TEMP-TEMP) collect (EXPAND-PPR-MACROS ARG)))))) (T (CONS (CAR TERM) (for ARG in (CDR TERM) collect (EXPAND-PPR-MACROS ARG]) (EXTEND-ALIST [LAMBDA (ALIST1 ALIST2) (* kbr: "19-Oct-85 16:31") (* Extend ALIST2 by adding to it every  pair from ALIST1 that does not  conflict with an existing pair in  ALIST2. *) (APPEND ALIST2 (for X in ALIST1 unless (ASSOC (CAR X) ALIST2) collect X]) (EXTERNAL-LINEARIZE [LAMBDA (TERM FLG) (* kbr: "19-Oct-85 16:31") (LET (HEURISTIC-TYPE-ALIST LITS-THAT-MAY-BE-ASSUMED-FALSE) (LINEARIZE TERM FLG]) (EXTRACT-DEPENDENCIES-FROM-HINTS [LAMBDA (HINTS) (* kbr: "19-Oct-85 16:31") (for HINT in HINTS bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (SELECTQ (CAR HINT) (USE (for X in (CDR HINT) collect (CAR X))) (INDUCT (LIST (FFN-SYMB (TRANSLATE (CADR HINT))))) (NIL)) LOOP-ANS)) finally (RETURN LOOP-ANS]) (FALSE-NONFALSEP [LAMBDA (TERM) (* kbr: "29-Jun-86 17:51") (* Returns T if TERM is definitely true or false.  As a side effect, DEFINITELY-FALSE is set to T to indicate which of definitely  true or false. *) (LET (TEMP) (COND ((VALUEP TERM) (SETQ DEFINITELY-FALSE (EQUAL TERM FALSE)) T) (T (SETQ TEMP (TYPE-SET TERM)) (COND ((IEQP TEMP TYPE-SET-FALSE) (SETQ DEFINITELY-FALSE T) T) ((IEQP 0 (LOGAND TEMP TYPE-SET-FALSE)) (SETQ DEFINITELY-FALSE NIL) T) (T NIL]) (FAVOR-COMPLICATED-CANDIDATES [LAMBDA (CANDLST) (* kbr: "19-Oct-85 16:31") (MAXIMAL-ELEMENTS CANDLST (FUNCTION (LAMBDA (CAND) (for TERM in (CONS (fetch (CANDIDATE INDUCTION-TERM) of CAND) (fetch (CANDIDATE OTHER-TERMS) of CAND)) count (NOT (PRIMITIVE-RECURSIVEP (FN-SYMB TERM]) (FERTILIZE-CLAUSE [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (PROG (LIT LHS1 RHS1 LHS2 RHS2 DONT-DELETE-LIT-FLG MASS-SUBST-FLG CROSS-FERT-FLG DIRECTION) (SETQ LIT (for LIT in CL when (AND (BM-MATCH LIT (NOT (EQUAL LHS1 RHS1))) (SETQ DIRECTION (FERTILIZE1 LIT CL LHS1 RHS1 HIST))) do (RETURN LIT))) (COND ((NULL LIT) (RETURN NIL))) (SETQ MASS-SUBST-FLG (OR (VALUEP LHS1) (VALUEP RHS1))) (SETQ DONT-DELETE-LIT-FLG (OR (VALUEP LHS1) (VALUEP RHS1) (AND (NOT (AND IN-PROVE-LEMMA-FLG (ASSOC (QUOTE INDUCT) HINTS))) (NOT (ASSOC (QUOTE BEING-PROVED) STACK))))) (SETQ CROSS-FERT-FLG (AND (ASSOC (QUOTE BEING-PROVED) STACK) (for LIT2 in CL thereis (AND (BM-MATCH LIT2 (EQUAL LHS2 RHS2)) (COND ((EQ DIRECTION (QUOTE LEFT-FOR-RIGHT )) (OCCUR RHS1 RHS2)) (T (OCCUR LHS1 LHS2))))) (for LIT2 in CL thereis (AND (BM-MATCH LIT2 (EQUAL LHS2 RHS2)) (COND ((EQ DIRECTION (QUOTE LEFT-FOR-RIGHT )) (OCCUR RHS1 LHS2)) (T (OCCUR LHS1 RHS2))))))) (SETQ PROCESS-CLAUSES (LIST (for LIT2 in CL when (OR DONT-DELETE-LIT-FLG (NEQ LIT LIT2)) collect (COND ((EQ LIT LIT2) LIT) ((OR MASS-SUBST-FLG (NOT CROSS-FERT-FLG) (BM-MATCH LIT2 (NOT (EQUAL & &)))) (COND ((EQ DIRECTION (QUOTE LEFT-FOR-RIGHT)) (BM-SUBST LHS1 RHS1 LIT2)) (T (BM-SUBST RHS1 LHS1 LIT2)))) ((BM-MATCH LIT2 (EQUAL LHS2 RHS2)) (COND ((EQ DIRECTION (QUOTE LEFT-FOR-RIGHT)) (FCONS-TERM* (QUOTE EQUAL) LHS2 (BM-SUBST LHS1 RHS1 RHS2))) (T (FCONS-TERM* (QUOTE EQUAL) (BM-SUBST RHS1 LHS1 LHS2) RHS2)))) (T LIT2))))) (SETQ PROCESS-HIST (LIST MASS-SUBST-FLG CROSS-FERT-FLG DIRECTION LHS1 RHS1 DONT-DELETE-LIT-FLG)) (RETURN T]) (FERTILIZE-FEASIBLE [LAMBDA (LIT CL TERM HIST) (* kbr: "19-Oct-85 16:31") (AND (NOT (ALMOST-VALUEP TERM)) (OR (VARIABLEP TERM) (NOT (SKO-DEST-NESTP TERM NIL))) (for LIT2 in CL when (NEQ LIT2 LIT) thereis (OCCUR TERM LIT2)) (NOT (for ENTRY in HIST bind (LHS RHS) thereis (AND (BM-MATCH ENTRY (FERTILIZE-CLAUSE & & & & LHS RHS &)) (EQUAL (FARGN (FARGN LIT 1) 1) LHS) (EQUAL (FARGN (FARGN LIT 1) 2) RHS]) (FERTILIZE-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE FERTILIZE-CLAUSE) CL HIST (QUOTE SIMPLIFY-SENT) (QUOTE GENERALIZE-SENT]) (FERTILIZE1 [LAMBDA (LIT CL LHS RHS HIST) (* kbr: "19-Oct-85 16:31") (COND ((FERTILIZE-FEASIBLE LIT CL LHS HIST) (COND ((FERTILIZE-FEASIBLE LIT CL RHS HIST) (COND ((LESSP (COMPLEXITY LHS) (COMPLEXITY RHS)) (QUOTE LEFT-FOR-RIGHT)) (T (QUOTE RIGHT-FOR-LEFT)))) (T (QUOTE RIGHT-FOR-LEFT)))) ((FERTILIZE-FEASIBLE LIT CL RHS HIST) (QUOTE LEFT-FOR-RIGHT)) (T NIL]) (FILTER-ARGS [LAMBDA (SUBSET FORMALS ARGS) (* kbr: "19-Oct-85 16:31") (for VAR in SUBSET collect (for TERM in ARGS as FORMAL in FORMALS when (EQ FORMAL VAR) do (RETURN TERM]) (FIND-EQUATIONAL-POLY [LAMBDA (HIST POT) (* kbr: "19-Oct-85 16:31") (* Look for an equation to be derived from this pot.  If one is found, add to LEMMAS-USED-BY-LINEAR and LINEAR-ASSUMPTIONS the  appropriate entries from the two polys involved.  In addition, add an extra entry to LEMMAS-USED-BY-LINEAR to store the fact that  this equation has been deduced. Finally, do not do any of this if HIST records  that the deduced equation has been previously deduced.  See the comment in PROCESS-EQUATIONAL-POLYS for details.  *) (for POLY1 in (fetch (LINEAR-POT POSITIVES) of POT) bind (WINNING-PAIR POLY2 PAIR HYP1 HYP2) when (SETQ TEMP-TEMP (TRIVIAL-POLYP POLY1)) do (SETQ WINNING-PAIR (CAR TEMP-TEMP)) (SETQ POLY1 (CDR TEMP-TEMP)) (* POLY1 is in lowest form now.  *) (COND ((SETQ POLY2 (for POLY2 in (fetch (LINEAR-POT NEGATIVES) of POT) when (COMPLEMENTARY-MULTIPLEP WINNING-PAIR POLY1 POLY2) do (RETURN POLY2))) (SETQ PAIR (EQUATIONAL-PAIR-FOR WINNING-PAIR POLY1)) (SETQ HYP1 (NUMBERP? (CAR PAIR))) (SETQ HYP2 (NUMBERP? (CDR PAIR))) (COND ((AND (NOT (EQUAL HYP1 FALSE)) (NOT (EQUAL HYP2 FALSE)) (for HIST-ENTRY in HIST never (AND (EQ (CAR HIST-ENTRY) (QUOTE SIMPLIFY-CLAUSE)) (for X in (CDDR HIST-ENTRY) thereis (AND (LISTP X) (LISTP (CAR X)) (EQ (CAR (CAR X)) (QUOTE FIND-EQUATIONAL-POLY)) (OR (EQUAL PAIR (CDR (CAR X))) (AND (EQUAL (CDR PAIR) (CAR (CDR (CAR X)))) (EQUAL (CAR PAIR) (CDR (CDR (CAR X))))))))))) (SETQ LINEAR-ASSUMPTIONS (UNION-EQUAL (UNION-EQUAL (fetch (POLY ASSUMPTIONS) of POLY1) (fetch (POLY ASSUMPTIONS) of POLY2)) LINEAR-ASSUMPTIONS)) (OR (EQUAL TRUE HYP1) (SETQ LINEAR-ASSUMPTIONS (ADD-TO-SET HYP1 LINEAR-ASSUMPTIONS))) (OR (EQUAL TRUE HYP2) (SETQ LINEAR-ASSUMPTIONS (ADD-TO-SET HYP2 LINEAR-ASSUMPTIONS))) (SETQ LEMMAS-USED-BY-LINEAR (CONS (LIST (CONS (QUOTE FIND-EQUATIONAL-POLY) PAIR)) (UNIONQ (UNIONQ (fetch (POLY LEMMAS) of POLY1) (fetch (POLY LEMMAS) of POLY2)) LEMMAS-USED-BY-LINEAR))) (RETURN PAIR]) (FIRST-COEFFICIENT [LAMBDA (EQUATION) (* kbr: "20-Oct-85 15:53") (CDR (CAR (fetch (POLY ALIST) of EQUATION]) (FIRST-VAR [LAMBDA (EQUATION) (* kbr: "19-Oct-85 16:31") (CAAR (fetch (POLY ALIST) of EQUATION]) (FITS [LAMBDA (ALIST1 ALIST2 VARS) (* kbr: "19-Oct-85 16:31") (* Return T iff the two alists agree  on every var in VARS.  *) (for VAR in VARS always (EQUAL (COND ((SETQ TEMP-TEMP (ASSOC VAR ALIST1)) (CDR TEMP-TEMP)) (T VAR)) (COND ((SETQ TEMP-TEMP (ASSOC VAR ALIST2)) (CDR TEMP-TEMP)) (T VAR]) (FIXCAR-CDR [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (TEMP) (COND ((SETQ TEMP (CAR-CDRP (CAR TERM))) (SETQ TERM (CADR TERM)) (for A-D in TEMP do (SETQ TERM (LIST (COND ((EQ A-D (QUOTE A)) (QUOTE CAR)) (T (QUOTE CDR))) TERM))))) TERM]) (FLATTEN-ANDS-IN-LIT [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (C1 C2 C3) (COND ((EQUAL TERM TRUE) NIL) ((BM-MATCH TERM (IF C1 C2 C3)) (COND ((EQUAL C2 FALSE) (APPEND (FLATTEN-ANDS-IN-LIT (DUMB-NEGATE-LIT C1)) (FLATTEN-ANDS-IN-LIT C3))) ((EQUAL C3 FALSE) (APPEND (FLATTEN-ANDS-IN-LIT C1) (FLATTEN-ANDS-IN-LIT C2))) (T (LIST TERM)))) ((BM-MATCH TERM (AND C1 C2)) (APPEND (FLATTEN-ANDS-IN-LIT C1) (FLATTEN-ANDS-IN-LIT C2))) (T (LIST TERM]) (FLESH-OUT-IND-PRIN [LAMBDA (TERM FORMALS MACHINE JUSTIFICATION MASK QUICK-BLOCK-INFO) (* kbr: "19-Oct-85 16:31") QUICK-BLOCK-INFO (* Constructs a CANDIDATE record for TERM given, for the fn symbol of TERM, the  FORMALS, the INDUCTION-MACHINE property, a JUSTIFICATION, a sound induction  principle MASK, and the QUICK-BLOCK-INFO.  *) (create CANDIDATE SCORE _ (QUOTIENT (FLOAT (for FLG in MASK count FLG)) (LENGTH FORMALS)) CONTROLLERS _ (for A in (FARGS TERM) as V in FORMALS bind LOOP-ANS when (MEMB V (fetch (JUSTIFICATION SUBSET) of JUSTIFICATION)) do (SETQ LOOP-ANS (UNIONQ (ALL-VARS A) LOOP-ANS)) finally (RETURN LOOP-ANS)) CHANGED-VARS _ (for ACTUAL in (SARGS TERM) as FLG in MASK when (EQ FLG (QUOTE CHANGEABLE)) collect ACTUAL) UNCHANGEABLE-VARS _ (for ACTUAL in (SARGS TERM) as FLG in MASK bind LOOP-ANS when (EQ FLG (QUOTE UNCHANGEABLE)) do (SETQ LOOP-ANS (UNIONQ (ALL-VARS ACTUAL) LOOP-ANS)) finally (RETURN LOOP-ANS)) TESTS-AND-ALISTS-LST _ (for X in MACHINE collect (create TESTS-AND-ALISTS TESTS _ (SUB-PAIR-VAR-LST FORMALS (SARGS TERM) (fetch (TESTS-AND-CASES TESTS) of X)) ALISTS _ (for ARGLIST in (fetch (TESTS-AND-CASES CASES) of X) collect (for ACTUAL in (SARGS TERM) as FLG in MASK as ARG in ARGLIST bind LOOP-ANS do (SETQ LOOP-ANS (UNION-EQUAL (COND ((NULL FLG) NIL) ((EQ FLG (QUOTE CHANGEABLE)) (LIST (CONS ACTUAL (SUB-PAIR-VAR FORMALS (SARGS TERM) ARG)))) (T (for VAR in (ALL-VARS ACTUAL) collect (CONS VAR VAR)))) LOOP-ANS)) finally (RETURN LOOP-ANS))))) JUSTIFICATION _ JUSTIFICATION INDUCTION-TERM _ TERM]) (FLUSH-CAND1-DOWN-CAND2 [LAMBDA (CAND1 CAND2) (* kbr: "19-Oct-85 16:56") (LET (SCORE1 CONTROLLERS1 CHANGED-VARS1 UNCHANGEABLES1 TESTS-AND-ALISTS-LST1 JUSTIFICATION1 TERM1 OTHER-TERMS1 SCORE2 CONTROLLERS2 CHANGED-VARS2 UNCHANGEABLES2 TESTS-AND-ALISTS-LST2 JUSTIFICATION2 TERM2 OTHER-TERMS2) (SETQ SCORE1 (fetch (CANDIDATE SCORE) of CAND1)) (SETQ CONTROLLERS1 (fetch (CANDIDATE CONTROLLERS) of CAND1)) (SETQ CHANGED-VARS1 (fetch (CANDIDATE CHANGED-VARS) of CAND1)) (SETQ UNCHANGEABLES1 (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND1)) (SETQ TESTS-AND-ALISTS-LST1 (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of CAND1)) (SETQ JUSTIFICATION1 (fetch (CANDIDATE JUSTIFICATION) of CAND1)) (SETQ TERM1 (fetch (CANDIDATE INDUCTION-TERM) of CAND1)) (SETQ OTHER-TERMS1 (fetch (CANDIDATE OTHER-TERMS) of CAND1)) (SETQ SCORE2 (fetch (CANDIDATE SCORE) of CAND2)) (SETQ CONTROLLERS2 (fetch (CANDIDATE CONTROLLERS) of CAND2)) (SETQ CHANGED-VARS2 (fetch (CANDIDATE CHANGED-VARS) of CAND2)) (SETQ UNCHANGEABLES2 (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND2)) (SETQ TESTS-AND-ALISTS-LST2 (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of CAND2)) (SETQ JUSTIFICATION2 (fetch (CANDIDATE JUSTIFICATION) of CAND2)) (SETQ TERM2 (fetch (CANDIDATE INDUCTION-TERM) of CAND2)) (SETQ OTHER-TERMS2 (fetch (CANDIDATE OTHER-TERMS) of CAND2)) (COND ((AND (SUBSETP CHANGED-VARS1 CHANGED-VARS2) (SUBSETP UNCHANGEABLES1 UNCHANGEABLES2) (PIGEON-HOLE TESTS-AND-ALISTS-LST1 TESTS-AND-ALISTS-LST2 [FUNCTION (LAMBDA (TA1 TA2) (AND (SUBSETP (fetch (TESTS-AND-ALISTS TESTS) of TA1) (fetch (TESTS-AND-ALISTS TESTS) of TA2)) (OR (AND (NULL (fetch (TESTS-AND-ALISTS ALISTS) of TA1)) (NULL (fetch (TESTS-AND-ALISTS ALISTS) of TA2))) (PIGEON-HOLE (fetch (TESTS-AND-ALISTS ALISTS) of TA1) (fetch (TESTS-AND-ALISTS ALISTS) of TA2) [FUNCTION (LAMBDA (ALIST1 ALIST2) (PIGEON-HOLE ALIST1 ALIST2 [FUNCTION (LAMBDA (PAIR1 PAIR2) (AND (EQ (CAR PAIR1) (CAR PAIR2)) (OCCUR (CDR PAIR1) (CDR PAIR2] T T] T T] T T)) (create CANDIDATE SCORE _ (PLUS SCORE1 SCORE2) CONTROLLERS _ (UNIONQ CONTROLLERS1 CONTROLLERS2) CHANGED-VARS _ CHANGED-VARS2 UNCHANGEABLE-VARS _ UNCHANGEABLES2 TESTS-AND-ALISTS-LST _ TESTS-AND-ALISTS-LST2 JUSTIFICATION _ JUSTIFICATION2 INDUCTION-TERM _ TERM2 OTHER-TERMS _ (ADD-TO-SET TERM1 (UNION-EQUAL OTHER-TERMS1 OTHER-TERMS2)))) (T NIL]) (FN-SYMB0 [LAMBDA (X) (* kbr: "20-Oct-85 13:49") (* What type of constant is  (QUOTE X) ? *) (COND ((LITATOM X) (COND ((EQ X *1*T) (QUOTE TRUE)) ((EQ X *1*F) (QUOTE FALSE)) (T (QUOTE PACK)))) ((FIXP X) (COND ((LESSP X 0) (QUOTE MINUS)) ((EQUAL X 0) (QUOTE ZERO)) (T (QUOTE ADD1)))) ((EQ (CAR X) *1*SHELL-QUOTE-MARK) (CADR X)) (T (QUOTE CONS]) (FNNAMEP [LAMBDA (FN TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) (COND ((OR (MEMB FN *1*BTM-OBJECTS) (ASSOC FN SHELL-ALIST)) (MEMB FN (ALL-FNNAMES TERM))) (T NIL))) ((EQ FN (FFN-SYMB TERM)) T) (T (for X in (FARGS TERM) thereis (FNNAMEP FN X]) (FNNAMEP-IF [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) NIL) ((EQ (FFN-SYMB TERM) (QUOTE IF)) T) (T (for X in (FARGS TERM) thereis (FNNAMEP-IF X]) (FORM-COUNT [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* Returns the number of open  parentheses in the unabbreviated  presentation of TERM.  Also sets NUMBER-OF-VARIABLES to the  number of variables in TERM.  *) (SETQ NUMBER-OF-VARIABLES 0) (FORM-COUNT1 TERM]) (FORM-COUNT-EVG [LAMBDA (EVG) (* kbr: "20-Oct-85 15:59") (COND ((NLISTP EVG) (COND ((EQ EVG *1*T) 1) ((EQ EVG *1*F) 1) ((FIXP EVG) (COND ((LESSP EVG 0) (PLUS 2 (MINUS EVG))) (T (ADD1 EVG)))) (T (SETQ TEMP-TEMP (ASSOC EVG LITATOM-FORM-COUNT-ALIST)) (COND (TEMP-TEMP (CDR TEMP-TEMP)) (T (SETQ LITATOM-FORM-COUNT-ALIST (CONS (CONS EVG (PLUS 2 (TIMES 2 (NCHARS EVG)) (for I NUMBER from 1 to (NCHARS EVG) sum (NTHCHARCODE EVG I)))) LITATOM-FORM-COUNT-ALIST)) (CDR (CAR LITATOM-FORM-COUNT-ALIST))))))) ((EQ (CAR EVG) *1*SHELL-QUOTE-MARK) (ADD1 (for X in (CDDR EVG) sum (FORM-COUNT-EVG X)))) (T (PLUS 1 (FORM-COUNT-EVG (CAR EVG)) (FORM-COUNT-EVG (CDR EVG]) (FORM-COUNT1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (SETQ NUMBER-OF-VARIABLES (ADD1 NUMBER-OF-VARIABLES)) 0) ((FQUOTEP TERM) (FORM-COUNT-EVG (CADR TERM))) (T (ADD1 (for T1 in (FARGS TERM) sum (FORM-COUNT1 T1]) (FORM-INDUCTION-CLAUSE [LAMBDA (TESTS HYPS CONCL TERMS) (* kbr: "19-Oct-85 16:31") TERMS (* We once implemented the idea of both induction, opening up of the recursive  fns in the conclusion, and generalizing away some recursive calls.  This function did the expansion and generalization.  If the idea is reconsidered the following theorems are worthy of consideration:  (ORDERED (SORT X)), (IMPLIES (ORDERED X)  (ORDERED (ADDTOLIST I X))), (IMPLIES (AND  (NUMBER-LISTP X) (ORDERED X) (NUMBERP I)  (NOT (LESSP (CAR X) I))) (EQUAL (ADDTOLIST I X)  (CONS I X))), and (IMPLIES (AND (NUMBER-LISTP X)  (ORDERED X)) (EQUAL (SORT X) X)) . *) (APPEND TESTS HYPS CONCL]) (FORMP-SIMPLIFIER [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (X FN TL) (MATCH! TERM (FORMP X)) (COND ((VARIABLEP X) TERM) ((SHELLP X) (COND ((NEQ (FN-SYMB X) (QUOTE CONS)) (CONS-TERM (QUOTE LITATOM) (FARGS TERM))) (T (SETQ FN (ARGN X 1)) (SETQ TL (ARGN X 2)) (COND ((AND (QUOTEP FN) (LITATOM (CADR FN))) (COND ((EQ (CADR FN) (QUOTE QUOTE)) (BM-SUBST TL (QUOTE TL) (QUOTE (IF (LISTP TL) (EQUAL (CDR TL) (QUOTE NIL)) (QUOTE *1*FALSE))))) ((AND (GETPROP (CADR FN) (QUOTE TYPE-PRESCRIPTION-LST)) (NOT (MEMB (CADR FN) META-NAMES))) (SUBLIS-VAR (LIST (CONS (QUOTE TL) TL) (CONS (QUOTE A) (LIST (QUOTE QUOTE) (ARITY (CADR FN))))) (QUOTE (IF (EQUAL A (LENGTH TL)) (FORM-LSTP TL) (QUOTE *1*FALSE))))) (T TERM))) (T TERM))))) (T TERM]) (FORMULA-OF [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (LET (TEMP) (SETQ TEMP (GETPROP NAME (QUOTE EVENT))) (SELECTQ (CAR TEMP) ((ADD-AXIOM PROVE-LEMMA) (CADDDR TEMP)) (NIL]) (FREE-VAR-CHK [LAMBDA (NAME ARGS FORM) (* kbr: "19-Oct-85 16:31") (LET (TEMP) (SETQ FORM (ALL-VARS FORM)) (SETQ TEMP (SET-DIFF FORM ARGS)) (COND (TEMP (ERROR1 (PQUOTE (PROGN ILLEGAL FREE (PLURAL? TEMP VARIABLES VARIABLE) , (!PPR-LIST TEMP) , IN THE DEFINITION OF (!PPR NAME NIL) !)) (BINDINGS (QUOTE NAME) NAME (QUOTE TEMP) TEMP) (QUOTE SOFT)))) (SETQ TEMP (SET-DIFF ARGS FORM)) (COND (TEMP (ERROR1 (PQUOTE (PROGN (!LIST TEMP) (PLURAL? TEMP ARE IS) IN THE ARGLIST BUT NOT IN THE BODY OF THE DEFINITION OF (!PPR NAME NIL) !)) (BINDINGS (QUOTE NAME) NAME (QUOTE TEMP) TEMP) (QUOTE WARNING)))) NIL]) (FREE-VARSP [LAMBDA (TERM ALIST) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (NOT (ASSOC TERM ALIST))) ((FQUOTEP TERM) NIL) (T (for ARG in (FARGS TERM) thereis (FREE-VARSP ARG ALIST]) (GEN-VARS [LAMBDA (CL N VARIABLE-NAMES) (* kbr: "19-Oct-85 16:31") (* Generates N skolem constants not  occurring in clause CL.  *) (SET-DIFF-N VARIABLE-NAMES (for LIT in CL bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (ALL-VARS LIT) LOOP-ANS)) finally (RETURN LOOP-ANS)) N]) (GENERALIZE-CLAUSE [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") HIST (* Generalize the smallest common  subterms in CL -- as defined by  COMSUBTERMS -- using the lemmas on  GENERALIZE-LEMMAS to supply typing  info. *) (PROG (COMMONSUBTERMS) (COND ((NOT (ASSOC (QUOTE BEING-PROVED) STACK)) (RETURN NIL))) (SETQ COMMONSUBTERMS (GENRLTERMS CL)) (COND ((NULL COMMONSUBTERMS) (RETURN NIL)) (T (SETQ PROCESS-CLAUSES (LIST (GENERALIZE1 CL COMMONSUBTERMS GEN-VARIABLE-NAMES1))) (SETQ PROCESS-HIST (LIST GENERALIZING-SKOS COMMONSUBTERMS OBVIOUS-RESTRICTIONS GENERALIZE-LEMMA-NAMES)) (SETQ ALL-LEMMAS-USED (UNIONQ GENERALIZE-LEMMA-NAMES ALL-LEMMAS-USED)) (RETURN T]) (GENERALIZE-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE GENERALIZE-CLAUSE) CL HIST (QUOTE SIMPLIFY-SENT) (QUOTE ELIMINATE-IRRELEVANCE-SENT]) (GENERALIZE1 [LAMBDA (CL SUBTERMLST VARIABLE-NAMES) (* kbr: "19-Oct-85 16:31") (* Replaces all occurrences of the subterms in SUBTERMLST in CL by new vars,  and qualifies each var with all the information known to GET-TYPES.  *) (SETQ GENERALIZING-SKOS (GEN-VARS CL (LENGTH SUBTERMLST) VARIABLE-NAMES)) (SETQ OBVIOUS-RESTRICTIONS NIL) (SETQ GENERALIZE-LEMMA-NAMES NIL) (GENERALIZE2 SUBTERMLST GENERALIZING-SKOS CL]) (GENERALIZE2 [LAMBDA (TERMLST VARLST CL) (* kbr: "19-Oct-85 20:00") (for LIT in (SCRUNCH (NCONC (for SUBTERM in TERMLST join (for HYP in (GET-TYPES SUBTERM CL) collect (DUMB-NEGATE-LIT HYP))) CL)) collect (SUB-PAIR-EXPR TERMLST VARLST LIT]) (GENRLT1 [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (LET (LHS RHS) (for LIT in CL when (OR (BM-MATCH LIT (EQUAL LHS RHS)) (BM-MATCH LIT (NOT (EQUAL LHS RHS)))) do (COMSUBTERMS LHS RHS)) (for TAIL on CL do (for LIT2 in (CDR TAIL) do (COMSUBTERMS (CAR TAIL) LIT2))) NIL]) (GENRLTERMS [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (LET (GENRLTLIST) (GENRLT1 CL) GENRLTLIST]) (GET-CANDS [LAMBDA (TERM) (* kbr: "19-Oct-85 20:06") (* Returns all of the induction  principles -- see  POSSIBLE-IND-PRINCIPLES --  connected to terms in TERM, which is  the conjecture to be proved.  *) (COND ((VARIABLEP TERM) NIL) ((QUOTEP TERM) NIL) (T (NCONC (POSSIBLE-IND-PRINCIPLES TERM) (for ARG in (FARGS TERM) join (GET-CANDS ARG]) (GET-LISP-SEXPR [LAMBDA (FN) (* kbr: "19-Oct-85 16:31") (LET (SEXPR) (COND ((NULL (GETPROP FN (QUOTE LISP-CODE))) (ERROR1 (PQUOTE (PROGN (!PPR FN NIL) DOES NOT HAVE A RUNNABLE LISP DEFINITION %.)) (BINDINGS (QUOTE FN) FN) (QUOTE SOFT)))) (SETQ SEXPR (GETPROP (GETPROP FN (QUOTE LISP-CODE)) (QUOTE SEXPR))) (COND ((NULL SEXPR) (ERROR1 (PQUOTE (PROGN (!PPR FN NIL) IS PART OF THE BASIC SYSTEM AND HAS A HAND-CODED LISP DEFINITION %.)) (BINDINGS (QUOTE FN) FN) (QUOTE SOFT))) (T SEXPR]) (GET-LEVEL-NO [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (OR (GETPROP FNNAME (QUOTE LEVEL-NO)) 0]) (GET-STACK-NAME [LAMBDA (STACKV) (* kbr: "26-Oct-85 13:59") (PACK (CONS (QUOTE *) (CDR (for I in (DREVERSE (GET-STACK-NAME1 STACKV)) join (CONS (QUOTE %.) (UNPACK I]) (GET-STACK-NAME1 [LAMBDA (STACKV) (* kbr: "19-Oct-85 16:31") (LET (ANS) (COND ((NULL STACKV) (LIST 1)) ((EQ (CAAR STACKV) (QUOTE TO-BE-PROVED)) (SETQ ANS (GET-STACK-NAME1 (CDR STACKV))) (RPLACA ANS (ADD1 (CAR ANS)))) (T (CONS 1 (GET-STACK-NAME1 (CDR STACKV]) (GET-TYPES [LAMBDA (TERM CL) (* kbr: "19-Oct-85 16:31") (LET (TYPE-RESTRICTION LEMMA-RESTRICTIONS TYPE PAIR INST-LEMMA) CL (SETQ TYPE (TYPE-SET TERM)) (SETQ TYPE-RESTRICTION (COND ((SETQ PAIR (for PAIR in RECOGNIZER-ALIST when (IEQP TYPE (CDR PAIR)) do (RETURN PAIR))) (FCONS-TERM* (CAR PAIR) TERM)) (T NIL))) (COND (TYPE-RESTRICTION (SETQ OBVIOUS-RESTRICTIONS (ADD-TO-SET TYPE-RESTRICTION OBVIOUS-RESTRICTIONS)))) (SETQ LEMMA-RESTRICTIONS (for LEMMA in GENERALIZE-LEMMAS unless (DISABLEDP (fetch (GENERALIZE-LEMMA NAME) of LEMMA)) when (AND (ARG1-IN-ARG2-UNIFY-SUBST TERM (fetch (GENERALIZE-LEMMA TERM) of LEMMA)) (NOT (FREE-VARSP (fetch (GENERALIZE-LEMMA TERM) of LEMMA) UNIFY-SUBST)) (NOT (FNNAMEP (FN-SYMB TERM) (SUBST-EXPR (QUOTE X) TERM (SETQ INST-LEMMA (SUBLIS-VAR UNIFY-SUBST (fetch (GENERALIZE-LEMMA TERM) of LEMMA))))))) collect (PROGN (SETQ GENERALIZE-LEMMA-NAMES (CONS (fetch (GENERALIZE-LEMMA NAME) of LEMMA) GENERALIZE-LEMMA-NAMES)) INST-LEMMA))) (COND (TYPE-RESTRICTION (CONS TYPE-RESTRICTION LEMMA-RESTRICTIONS)) (T LEMMA-RESTRICTIONS]) (GREATEREQP [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (NOT (LESSP I J]) (GUARANTEE-CITIZENSHIP [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((AND (NOT (GETPROP NAME (QUOTE EVENT))) (NOT (GETPROP NAME (QUOTE MAIN-EVENT)))) (PUT1 MAIN-EVENT-NAME (CONS NAME (GETPROP MAIN-EVENT-NAME (QUOTE SATELLITES))) (QUOTE SATELLITES)) (PUT1 NAME MAIN-EVENT-NAME (QUOTE MAIN-EVENT]) (GUESS-RELATION-MEASURE-LST [LAMBDA (FORMALS MACHINE) (* kbr: "19-Oct-85 16:31") (* We assume MACHINE is a list of TESTS-AND-CASE.  We will guess that the COUNT goes down with LESSP on formal tested and changed  in every line of the machine. *) (for VAR in FORMALS as I from 0 when (for X in MACHINE always (AND (OCCUR-LST VAR (fetch (TESTS-AND-CASE TESTS) of X)) (NEQ VAR (BM-NTH I (fetch (TESTS-AND-CASE CASE) of X))))) collect (LIST (QUOTE LESSP) (LIST (QUOTE COUNT) VAR]) (HAS-LIB-PROPS [LAMBDA (ATM) (* kbr: "19-Oct-85 16:31") (for TAIL on (GETPROPLIST ATM) by (QUOTE CDDR) thereis (AND (MEMB (CAR TAIL) LIB-PROPS) (CADR TAIL]) (ILLEGAL-CALL [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (ERROR1 (PQUOTE (PROGN SOME FUNCTION WAS CALLED WITH INAPPROPRIATE ARGUMENTS %.)) NIL (QUOTE HARD]) (ILLEGAL-NAME [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (NOT (AND (LITATOM NAME) (LITATOM NAME) (LEGAL-CHAR-CODE-SEQ (CHCON NAME]) (IMMEDIATE-DEPENDENTS-OF [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (LET (ATM) (COND ((EQ NAME (QUOTE GROUND-ZERO)) (REMOVE1 (QUOTE GROUND-ZERO) CHRONOLOGY)) ((NOT (GETPROP NAME (QUOTE EVENT))) (ERROR1 (PQUOTE (PROGN IMMEDIATE-DEPENDENTS-OF WAS CALLED ON A NONEVENT , (!PPR NAME NIL) %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE HARD))) ((SETQ ATM (TYPE-PRESCRIPTION-LEMMAP NAME)) (* NAME is a type prescription lemma hung under ATM.  In this case, we must include in the dependents of NAME all events dependent  upon ATM that occurred after NAME was introduced.  This clause in the UNDO mechanism is the source of doubt that the mechanism  correctly identifies all of the dependents of an event.  The problem starts with the fact that the use of type set lemmas is not tracked  like other lemmas. In fact, no code in the theorem prover actually notes when  or how a particular type set lemma is used.  How then can we hope to determine which proofs  (or other events) depend upon a type set lemma? We have tried several  approaches to the question. Some have turned out incorrect.  We believe the current one to be correct.  Our hand-waving proof of its correctness is this.  If a type set lemma about the function FN is used in the proof of THM, then  either (1) THM mentions FN, (2) some lemma used in the proof of THM  (other than a type set lemma) mentions FN,  (3) some lemma used in the proof of THM mentions a function whose definition  mentions FN, (3.a) some lemma used in the proof of THM uses a function whose  definition mentions a function that either  (3.b) mentions FN or (3.c) mentions a function whose definition mentions FN, or  ... But we believe that any such lemma introducing FN into the proof is in  ALL-LEMMAS-USED when the proof is done and thus has THM as one of its  IMMEDIATE-DEPENDENTS0. To put it in terms of the following code, we believe  that there is a an IMMEDIATE-DEPENDENTS0 path, from FN to THM.  Given that hypothesis, we then correctly identify a superset of the dependents  of a type set lemma by the draconian strategy of claiming as a dependent event  any event on a tree-path that took place later than the type set lemma.  Note that this computation is not trying to get all of the theorems dependent  (somehow) upon the type set lemma in question but only those immediately  dependent -- i.e., whose proofs might have actually appealed to this type set  lemma. It is assumed that any function using IMMEDIATE-DEPENDENTS-OF to explore  the logical graph of events will recurse on each of the dependent events, and  thus catch things like THMs dependent upon type set lemmas dependent upon the  type set lemma in question. *) (UNION-EQUAL (for X in (TREE-DEPENDENTS (MAIN-EVENT-OF ATM)) when (EVENT1-OCCURRED-BEFORE-EVENT2 NAME X CHRONOLOGY) collect X) (for X in (GETPROP NAME (QUOTE IMMEDIATE-DEPENDENTS0)) collect X))) (T (for X in (GETPROP NAME (QUOTE IMMEDIATE-DEPENDENTS0)) collect X]) (IMPLIES? [LAMBDA (TESTS TERM) (* kbr: "19-Oct-85 16:31") (MEMBER TERM TESTS]) (IMPOSSIBLE-POLYP [LAMBDA (POLY) (* kbr: "19-Oct-85 16:31") (AND (GREATERP (fetch (POLY CONSTANT) of POLY) 0) (for PAIR in (fetch (POLY ALIST) of POLY) always (GREATEREQP (CDR PAIR) 0]) (IND-FORMULA [LAMBDA (TESTS-AND-ALISTS-LST TERMS CL-SET) (* kbr: "19-Oct-85 20:08") (* TESTS-AND-ALISTS-LST is a such a list that the disjunction of the  conjunctions of the TESTS components of the members is T.  Furthermore, there exists a measure M, a well-founded relation R, and a  sequence of variables x1, ..., xn such that for each T&Ai in  TESTS-AND-ALISTS-LST, for each alist alst in the ALISTS component of T&Ai, the  conjunction of the TESTS component, say qi, implies that  (R (M x1 ... xn) /alst (M x1 ... xn))%. To prove thm, the conjunction of the  disjunctions of the members of CL-SET, it is sufficient, by the principle of  induction, to prove instead the conjunction of the terms qi & thm' & thm'' ...  -> thm, where the primed terms are the results of substituting the alists in  the ALISTS field of the ith member of TESTS-AND-ALISTS-LST into thm.  If thm1, thm2, ..., thmn are the disjunctions of the members of CL-SET, then it  is sufficient to prove all of the formulas qi & thm' & thm'' ...  -> thmj. This is a trivial proposition fact, to prove  (IMPLIES A (AND B C)) it is sufficient to prove  (IMPLIES A B) and (IMPLIES A C) The (FOR PICK ...) expression below returns a  list of clauses whose conjunction propositionally implies qi & thm' & thm'' ...  -> thmj, where TA is the ith member of TESTS-AND-ALISTS-LST and CL is the jth  member of CL-SET. Proof: Let THM have the form:  (AND (OR a1 ...) (OR b1 ...) ... (OR z1 ...))%.  Then qi & thm' & thm'' ... -> thmj has the form:  (IMPLIES (AND qi (AND (OR a1 ...) (OR b1 ...) ...  (OR z1 ...)) (QUOTE (AND (OR a1 ...) (OR b1 ...) ...  (OR z1 ...))) (QUOTE (QUOTE ...)) (AND (OR a1 ...)  (OR b1 ...) ... (OR z1 ...))) (QUOTE (QUOTE  (QUOTE ...'))) thmj)%. Suppose this formula is false for some values of the  free variables. Then under those values, each disjunction in the hypothesis is  true. Thus there exists a way of choosing one literal from each of the  disjunctions, all of which are true. This choice is one of the PICKs below.  But we prove that (IMPLIES (AND qi PICK) thmj) . *) (DELETE-TAUTOLOGIES (SCRUNCH-CLAUSE-SET (for CL in CL-SET join (for TA in TESTS-AND-ALISTS-LST join (for PICK in (ALL-PICKS (for CL1 in CL-SET join (for ALIST in (fetch (TESTS-AND-ALISTS ALISTS) of TA) collect (for LIT in CL1 collect (NEGATE-LIT (SUBLIS-VAR ALIST LIT)))) )) collect (FORM-INDUCTION-CLAUSE (for TEST in (fetch (TESTS-AND-ALISTS TESTS) of TA) collect (NEGATE-LIT TEST)) PICK CL TERMS]) (INDUCT [LAMBDA (CL-SET) (* kbr: "19-Oct-85 20:09") (LET (GET-CANDS-ANS MERGED-CANDS-ANS PICK-HIGH-SCORES-ANS WINNING-CAND INDUCT-ANS COMPUTE-VETOES-ANS FAVOR-COMPLICATED-CANDIDATES-ANS) (SETQ WINNING-CAND (CAR (SETQ PICK-HIGH-SCORES-ANS (PICK-HIGH-SCORES (SETQ FAVOR-COMPLICATED-CANDIDATES-ANS (FAVOR-COMPLICATED-CANDIDATES (SETQ COMPUTE-VETOES-ANS (COMPUTE-VETOES (SETQ MERGED-CANDS-ANS (TRANSITIVE-CLOSURE (SETQ GET-CANDS-ANS (REMOVE-UNCHANGING-VARS (for CL in CL-SET join (for LIT in CL join (GET-CANDS LIT))) CL-SET)) (FUNCTION MERGE-CANDS))))))))))) (COND (WINNING-CAND (SETQ INDUCT-ANS (IND-FORMULA (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of WINNING-CAND) (CONS (fetch (CANDIDATE INDUCTION-TERM) of WINNING-CAND) (fetch (CANDIDATE OTHER-TERMS) of WINNING-CAND )) CL-SET)) (INFORM-SIMPLIFY (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of WINNING-CAND) (CONS (fetch (CANDIDATE INDUCTION-TERM) of WINNING-CAND) (fetch (CANDIDATE OTHER-TERMS) of WINNING-CAND)))) (T (IO (QUOTE INDUCT) CL-SET NIL (LIST NIL) (LIST (GET-STACK-NAME (CDR STACK)) NIL 0 0 0 0 0)) (WRAPUP NIL))) (SETQ ALL-LEMMAS-USED (UNIONQ (fetch (JUSTIFICATION LEMMAS) of (fetch (CANDIDATE JUSTIFICATION) of WINNING-CAND)) ALL-LEMMAS-USED)) (IO (QUOTE INDUCT) CL-SET NIL INDUCT-ANS (LIST (GET-STACK-NAME (CDR STACK)) WINNING-CAND (LENGTH GET-CANDS-ANS) (LENGTH MERGED-CANDS-ANS) (COND ((EQ COMPUTE-VETOES-ANS MERGED-CANDS-ANS) 0) (T (LENGTH COMPUTE-VETOES-ANS))) (LENGTH PICK-HIGH-SCORES-ANS) (LENGTH FAVOR-COMPLICATED-CANDIDATES-ANS))) INDUCT-ANS]) (INDUCT-VARS [LAMBDA (CAND) (* kbr: "19-Oct-85 16:31") (* Get all skos occupying controller  slots in any of the terms associated  with this candidate.  *) (for TERM in (CONS (fetch (CANDIDATE INDUCTION-TERM) of CAND) (fetch (CANDIDATE OTHER-TERMS) of CAND)) bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (for ARG in (FARGS TERM) as I from 0 when (AND (VARIABLEP ARG) (for MASK in (GETPROP (FFN-SYMB TERM) (QUOTE CONTROLLER-POCKETS)) thereis (NOT (IEQP 0 (LOGAND 1 (LSH MASK (MINUS I))))))) collect ARG) LOOP-ANS)) finally (RETURN LOOP-ANS]) (INDUCTION-MACHINE [LAMBDA (FNNAME TERM TESTS) (* kbr: "24-Oct-85 14:57") (* See the comment for  TERMINATION-MACHINE.  *) (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM) (NEQ (FFN-SYMB TERM) (QUOTE IF))) (LIST (create TESTS-AND-CASES TESTS _ (REMOVE-REDUNDANT-TESTS TESTS NIL) CASES _ (UNION-EQUAL (PROG (LOOP-ANS) (for TEST in TESTS do (SETQ LOOP-ANS (UNION-EQUAL (ALL-ARGLISTS FNNAME TEST) LOOP-ANS))) (RETURN LOOP-ANS)) (ALL-ARGLISTS FNNAME TERM))))) (T (NCONC (INDUCTION-MACHINE FNNAME (FARGN TERM 2) (APPEND TESTS (LIST (FARGN TERM 1)))) (INDUCTION-MACHINE FNNAME (FARGN TERM 3) (APPEND TESTS (LIST (NEGATE-LIT (FARGN TERM 1]) (INFORM-SIMPLIFY [LAMBDA (TESTS-AND-ALISTS-LST TERMS) (* kbr: "19-Oct-85 20:10") (* Two of the variables effecting REWRITE are TERMS-TO-BE-IGNORED-BY-REWRITE  and EXPAND-LST. When any term on the former is encountered REWRITE returns it  without rewriting it. Terms on the latter must be calls of defined fns and when  encountered are replaced by the rewritten body.  We believe that the theorem prover will perform significantly faster on many  theorems if, after an induction, it does not waste time  (a) trying to simplify the recursive calls introduced in the induction  hypotheses and (b) trying to decide whether to expand the terms inducted for in  the induction conclusion. This suspicion is due to some testing done with the  idea of generalizing the recursive calls away at INDUCT time after expanding  the induction terms in the conclusion. Homographication speeded the  theorem-prover on many theorems but lost on several others because of the  premature generalization. See the comment in FORM-INDUCTION-CLAUSE.  To avoid the generalization at INDUCT time we are going to try using  TERMS-TO-BE-IGNORED-BY-REWRITE. The idea is this, during the initial  simplification of a clause produced by INDUCT we will have the recursive terms  on TERMS-TO-BE-IGNORED-BY-REWRITE. When the clause settles down --  hopefully it will often be proved first --  we will restore TERMS-TO-BE-IGNORED-BY-REWRITE to its pre-INDUCT value.  Note however that we have to mess with TERMS-TO-BE-IGNORED-BY-REWRITE on a  clause by clause basis, not just once in INDUCT.  So here is the plan. INDUCT will set INDUCTION-HYP-TERMS to the list of  instances of the induction terms, and will set INDUCTION-CONCL-TERMS to the  induction terms themselves. SIMPLIFY-CLAUSE will look at the history of the  clause to determine whether it has settled down since induction.  If not it will bind TERMS-TO-BE-IGNORED-BY-REWRITE to the concatenation of  INDUCTION-HYP-TERMS and its old value and will analogously bind EXPAND-LST.  A new process, called SETTLED-DOWN-SENT, will be used to mark when in the  history the clause settled down. *) (SETQ INDUCTION-CONCL-TERMS TERMS) (SETQ INDUCTION-HYP-TERMS (for TA in TESTS-AND-ALISTS-LST join (for ALIST in (fetch (TESTS-AND-ALISTS ALISTS) of TA) join (SUBLIS-VAR-LST ALIST TERMS]) (INIT-LEMMA-STACK [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (SETQ LEMMA-STACK ORIG-LEMMA-STACK) NIL]) (INIT-LIB [LAMBDA (PROPS VARS) (* kbr: "19-Oct-85 16:31") (* Initialize the variables used to  keep track of what is on the lib file.  *) (KILL-LIB) (SETQ LIB-PROPS PROPS) (SETQ LIB-VARS VARS) (for VAR in LIB-VARS do (SET VAR NIL)) (SETQ LIB-ATOMS-WITH-PROPS NIL) (SETQ LIB-ATOMS-WITH-DEFS NIL) (SETQ LIB-FILE NIL]) (INIT-LINEARIZE-ASSUMPTIONS-STACK [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (SETQ LINEARIZE-ASSUMPTIONS-STACK ORIG-LINEARIZE-ASSUMPTIONS-STACK) NIL]) (INTERESTING-SUBTERMS [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (* Returns a list of all of the subterms of FORM that are not variables or  quotes or terms whose function symbol is CAR CDR LISTP EQ NEQ NOT.  Returns the EQ subterms. This fact is used to catch and optimize common  subexpression evaluation. *) (COND ((VARIABLEP FORM) NIL) ((FQUOTEP FORM) NIL) ((MEMB (FFN-SYMB FORM) (QUOTE (CAR CDR LISTP EQ NEQ NOT))) (for ARG in (FARGS FORM) do (APPEND (INTERESTING-SUBTERMS ARG)))) (T (CONS FORM (for ARG in (FARGS FORM) do (APPEND (INTERESTING-SUBTERMS ARG]) (INTERSECTP [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (for E in X thereis (MEMBER E Y]) (INTRODUCE-ANDS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (REST1 REST2) (COND ((NLISTP X) X) ((EQ (CAR X) (QUOTE QUOTE)) X) ((BM-MATCH X (*2*IF & & (QUOTE NIL))) (SETQ REST1 (INTRODUCE-ANDS (CADR X))) (SETQ REST2 (INTRODUCE-ANDS (CADDR X))) (COND ((AND (LISTP REST1) (EQ (CAR REST1) (QUOTE AND))) (COND ((AND (LISTP REST2) (EQ (CAR REST2) (QUOTE AND))) (APPEND REST1 (CDR REST2))) (T (APPEND REST1 (CONS REST2 NIL))))) ((AND (LISTP REST2) (EQ (CAR REST2) (QUOTE AND))) (CONS (QUOTE AND) (CONS REST1 (CDR REST2)))) (T (LIST (QUOTE AND) REST1 REST2)))) (T (CONS (CAR X) (for ARG in (CDR X) collect (INTRODUCE-ANDS ARG]) (INTRODUCE-LISTS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (REST) (COND ((NLISTP X) X) ((EQ (CAR X) (QUOTE QUOTE)) (KWOTE (CADR X))) ((EQ (CAR X) (QUOTE CONS)) (SETQ REST (INTRODUCE-LISTS (CADDR X))) (COND ((NULL REST) (LIST (QUOTE LIST) (INTRODUCE-LISTS (CADR X)))) ((AND (LISTP REST) (EQ (CAR REST) (QUOTE LIST))) (CONS (QUOTE LIST) (CONS (INTRODUCE-LISTS (CADR X)) (CDR REST)))) (T (LIST (QUOTE CONS) (INTRODUCE-LISTS (CADR X)) REST)))) (T (CONS (CAR X) (for ARG in (CDR X) collect (INTRODUCE-LISTS ARG]) (JUMPOUTP [LAMBDA (OLD NEW) (* kbr: " 4-Jul-86 17:22") (* It is claimed that JUMPOUTP is a mere optimization of the book version of  the rewriter. The proof rests on two observations.  The first is that if any subterm of the rewritten function body fails to  satisfy REWRITE-FNCALLP then the entire body fails --  i.e., it does not matter if other parts are super-good.  This means that as soon as we lay our hands on a subterm that is GUARANTEED to  survive future rewriting and be returned as part of the value of the REWRITE  call in REWRITE-FNCALL we can check that it satisfies REWRITE-FNCALLP and if  not, abort then and there. The second lemma is that if the DEFN-FLG of REWRITE  is T then the value of that rewrite will survive to be part of the value  computed by the REWRITE call in REWRITE-FNCALL.  Proof of this is by inspection of the places REWRITE is called.  In particular, if REWRITE's value is that of a recursive call, the call may be  passed the same value of the DEFN-FLG, the DEFN-FLG may be turned on only by  REWRITE-FNCALL, and must be NIL in rewriting arguments to non-IFs  (which might disappear as a result of higher level rewrites), tests to IF's  even on the main path through a defn (because the tests may be eliminated by  (IF ITIMES y y)) and in rewrite calls to relieve hyps  (which do not have any relation to what is seen by the REWRITE-FNCALLP check in  REWRITE-FNCALL) the most subtle part of the proof is that if you are  simplifying an (IF test left right) that is guaranteed to participate in the  value returned to REWRITE-FNCALL, then both the values of left and right will  be -- at least, they will be when they are non-trivial values that might  possible offend REWRITE-FNCALLP. The proof of this is by inspection of  REWRITE-IF1 which either returns the newly consed up IF of the values, which is  perfect, or else returns pieces (i.e., test, or left, or right's value alone)  under conditions that guarantee that nothing is lost.  Thus, if the DEFN-FLG is on, JUMPOUTP can call REWRITE-FNCALLP and jump out of  the lowest REWRITE-FNCALL if the newly computed value offends it.  Since JUMPOUTP is only called on the branches of IFs there must still be a call  of REWRITE-FNCALLP on the final answer in REWRITE-FNCALL since tests  (which could have been eliminated by (IF ITIMES y y)) might still offend.  Finally, to avoid calling REWRITE-FNCALLP exponentially while backing out of an  IF-tree, we do not even bother to call it if the old value of the term was  itself an IF, since JUMPOUTP okay'd its branches --  but not its test -- earlier. *) (COND (NIL (NOT (EQUAL NEW (SUBLIS ALIST OLD))) (SHOWPRINT (SUBLIS ALIST OLD)) (SHOWPRINT NEW) (\GETKEY))) (COND ((AND DEFN-FLG (NVARIABLEP OLD) (NEQ (FN-SYMB OLD) (QUOTE IF)) (NOT (REWRITE-FNCALLP (CAR FNSTACK) NEW))) (POP-LEMMA-FRAME) (RETFROM (QUOTE REWRITE-FNCALL) (LET ((TYPE-ALIST *TYPE-ALIST*)) (REWRITE-SOLIDIFY (CONS-TERM *FNNAME* *ARGLIST*))))) (T NEW]) (KILL-EVENT [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((EQ NAME (QUOTE GROUND-ZERO)) (KILL-LIB)) (T (for TUPLE in (GETPROP NAME (QUOTE LOCAL-UNDO-TUPLES)) do (ADD-SUB-FACT NIL NIL NIL TUPLE NIL)) (for SATELLITE in (GETPROP NAME (QUOTE SATELLITES)) do (KILLPROPLIST1 SATELLITE)) (KILLPROPLIST1 NAME) (SETQ CHRONOLOGY (REMOVE1 NAME CHRONOLOGY)) NAME]) (KILL-LIB [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (* Erase all trace of the lib file.  *) (COND ((BOUNDP (QUOTE LIB-PROPS)) (for ATM in LIB-ATOMS-WITH-PROPS do (KILLPROPLIST1 ATM)) (for FN in LIB-ATOMS-WITH-DEFS do (KILL-DEFINITION FN)) (for VAR in LIB-VARS do (MAKUNBOUND VAR)) (MAKUNBOUND (QUOTE LIB-VARS)) (MAKUNBOUND (QUOTE LIB-ATOMS-WITH-PROPS)) (MAKUNBOUND (QUOTE LIB-ATOMS-WITH-DEFS)) (MAKUNBOUND (QUOTE LIB-PROPS)) (MAKUNBOUND (QUOTE LIB-FILE]) (KILLPROPLIST1 [LAMBDA (ATM) (* kbr: "19-Oct-85 16:31") (* Kill all properties of ATM that are  maintained by the lib file.  *) (for PROP in LIB-PROPS do (REMPROP ATM PROP)) (REMPROP ATM (QUOTE LIB-LOC]) (LEGAL-CHAR-CODE-SEQ [LAMBDA (LST) (* kbr: "17-Nov-85 15:38") (* WARNING The EVG-OCCUR functions  make delicate use of the ascii codes  permitted in litatoms in evgs.  *) (AND (LISTP LST) (for TAIL on LST bind C until (NLISTP TAIL) always (PROGN (SETQ C (CAR TAIL)) (AND (FIXP C) (OR (AND (LESSEQP (CHARCODE A) C) (LESSEQP C (CHARCODE Z))) (AND (LESSEQP (CHARCODE 0) C) (LESSEQP C (CHARCODE 9))) (EQUAL C (CHARCODE -)))))) (NOT (EQUAL (CAR LST) (CHARCODE -))) (NOT (AND (LESSEQP (CHARCODE 0) (CAR LST)) (LESSEQP (CAR LST) (CHARCODE 9]) (LENGTH-TO-ATOM [LAMBDA (L) (* kbr: "19-Oct-85 16:31") (for TAIL on L until (NLISTP TAIL) count T]) (LESSEQP [LAMBDA (I J) (* kbr: "19-Oct-85 16:31") (NOT (LESSP J I]) (LEXORDER [LAMBDA (X Y) (* kbr: "20-Oct-85 18:47") (* LEXORDER is a total ordering on  LISP objects constructed from numbers,  litatoms, and conses.  See the comment in TERM-ORDER for the  definitions of *) (COND ((NLISTP X) (COND ((NLISTP Y) (* From the VM one can conclude that  ALPHORDER is a total ordering when  restricted to ATOMs.  *) (ALPHORDER X Y)) (T T))) ((NLISTP Y) NIL) ((EQUAL (CAR X) (CAR Y)) (LEXORDER (CDR X) (CDR Y))) (T (LEXORDER (CAR X) (CAR Y]) (LINEARIZE [LAMBDA (TERM FLG) (* kbr: "22-Oct-85 15:27") (* If FLG is T linearize TERM, else linearize the negation of TERM.  We store TERM in the LITERALS field regardless of FLG.  ADD-EQUATIONS looks in the LITERALS field to see if the CURRENT-LIT is a father  of a POLY and if so does not use it in cancellation.  Similarly ADD-EQUATIONS looks in the LEMMAS field for members of the original  clause, i.e., LITS-THAT-MAY-BE-ASSUMED-FALSE.  *) (LET (LHS RHS LST CONTRA) (SETQ LST (COND ((COND (FLG (BM-MATCH TERM (LESSP LHS RHS))) (T (BM-MATCH TERM (NOT (LESSP LHS RHS))))) (LIST (LIST (COMPRESS-POLY (ADD-LINEAR-TERM (CONS-TERM (QUOTE ADD1) (LIST LHS)) (QUOTE POSITIVE) (ADD-LINEAR-TERM RHS (QUOTE NEGATIVE) (ZERO-POLY TERM))))))) ((COND (FLG (BM-MATCH TERM (EQUAL LHS RHS))) (T (BM-MATCH TERM (NOT (EQUAL LHS RHS))))) (COND ((OR (POSSIBLY-NUMERIC LHS) (POSSIBLY-NUMERIC RHS)) (LIST (LIST (COMPRESS-POLY (ADD-LINEAR-TERM LHS (QUOTE POSITIVE) (ADD-LINEAR-TERM RHS (QUOTE NEGATIVE) (ZERO-POLY TERM)))) (COMPRESS-POLY (ADD-LINEAR-TERM RHS (QUOTE POSITIVE) (ADD-LINEAR-TERM LHS (QUOTE NEGATIVE) (ZERO-POLY TERM))))))) (T NIL))) ((COND (FLG (BM-MATCH TERM (NOT (LESSP LHS RHS)))) (T (BM-MATCH TERM (LESSP LHS RHS)))) (LIST (LIST (COMPRESS-POLY (ADD-LINEAR-TERM RHS (QUOTE POSITIVE) (ADD-LINEAR-TERM LHS (QUOTE NEGATIVE) (ZERO-POLY TERM))))))) ((COND (FLG (BM-MATCH TERM (NOT (EQUAL LHS RHS)))) (T (BM-MATCH TERM (EQUAL LHS RHS)))) (COND ((OR (POSSIBLY-NUMERIC LHS) (POSSIBLY-NUMERIC RHS)) (LIST (LIST (ADD-NUMBERP-ASSUMPTION-TO-POLY LHS (ADD-NUMBERP-ASSUMPTION-TO-POLY RHS (COMPRESS-POLY (ADD-LINEAR-TERM (CONS-TERM (QUOTE ADD1) (LIST LHS)) (QUOTE POSITIVE) (ADD-LINEAR-TERM RHS (QUOTE NEGATIVE) (ZERO-POLY TERM))))))) (LIST (ADD-NUMBERP-ASSUMPTION-TO-POLY LHS (ADD-NUMBERP-ASSUMPTION-TO-POLY RHS (COMPRESS-POLY (ADD-LINEAR-TERM (CONS-TERM (QUOTE ADD1) (LIST RHS)) (QUOTE POSITIVE) (ADD-LINEAR-TERM LHS (QUOTE NEGATIVE) (ZERO-POLY TERM))))))))) (T NIL))) (T NIL))) (SETQ LST (for L in LST collect (for POLY in L unless (MEMBER FALSE (fetch (POLY ASSUMPTIONS ) of POLY)) collect POLY))) (COND ((IEQP (LENGTH LST) 2) (* If either member of LST contains a contradiction, we delete that member from  LST after moving into each member of the other member of LST the assumptions  and lemmas upon which the contradiction depends.  *) (COND ((SETQ CONTRA (for POLY in (CAR LST) when (IMPOSSIBLE-POLYP POLY) do (RETURN POLY))) (for POLY in (CADR LST) do (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL (fetch (POLY ASSUMPTIONS) of CONTRA) (fetch (POLY ASSUMPTIONS) of POLY))) (replace (POLY LEMMAS) of POLY with (UNIONQ (fetch (POLY LEMMAS) of CONTRA) (fetch (POLY LEMMAS) of POLY)))) (SETQ LST (LIST (CADR LST)))) ((SETQ CONTRA (for POLY in (CADR LST) when (IMPOSSIBLE-POLYP POLY) do (RETURN POLY))) (for POLY in (CAR LST) do (replace (POLY ASSUMPTIONS) of POLY with (UNION-EQUAL (fetch (POLY ASSUMPTIONS) of CONTRA) (fetch (POLY ASSUMPTIONS) of POLY))) (replace (POLY LEMMAS) of POLY with (UNIONQ (fetch (POLY LEMMAS) of CONTRA) (fetch (POLY LEMMAS) of POLY)))) (SETQ LST (LIST (CAR LST))))))) LST]) (LISTABLE [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (LHS RHS) (COND ((VARIABLEP X) NIL) ((FQUOTEP X) NIL) ((BM-MATCH X (LIST (QUOTE CONS) LHS RHS)) (COND ((EQUAL RHS (QUOTE (QUOTE NIL))) (LIST LHS)) ((SETQ TEMP-TEMP (LISTABLE RHS)) (CONS LHS TEMP-TEMP)) (T NIL))) (T NIL]) (LOGSUBSETP [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (IEQP (LOGAND X Y) X]) (LOOKUP-HYP [LAMBDA (HYP) (* kbr: "19-Oct-85 16:31") (* See if HYP is true by type alist or LITS-THAT-MAY-BE-ASSUMED-FALSE  considerations -- possibly extending the UNIFY-SUBST if necessary.  If successful return T and side-effect UNIFY-SUBST and the current lemma frame  appropriately. If unsuccessful, return NIL and side-effect nothing.  *) (PROG (TERM NOT-FLG TYPE NEG-HYP LIT) (COND ((BM-MATCH HYP (NOT TERM)) (SETQ NOT-FLG T)) (T (SETQ NOT-FLG NIL) (SETQ TERM HYP))) (COND ((AND (NVARIABLEP TERM) (NOT (FQUOTEP TERM)) (SETQ TEMP-TEMP (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST))) (SETQ TYPE (CDR TEMP-TEMP)) (SETQ TERM (FARGN TERM 1))) (T (SETQ TYPE (LOGNOT TYPE-SET-FALSE)))) (COND (NOT-FLG (COND ((for PAIR in TYPE-ALIST thereis (AND (IEQP 0 (LOGAND TYPE (CDR PAIR))) (ONE-WAY-UNIFY1 TERM (CAR PAIR)))) (RETURN T)))) (T (COND ((for PAIR in TYPE-ALIST thereis (AND (LOGSUBSETP (CDR PAIR) TYPE) (ONE-WAY-UNIFY1 TERM (CAR PAIR)))) (RETURN T))))) (* Having failed to find HYP on the  type alist, we now try  LITS-THAT-MAY-BE-ASSUMED-FALSE.  *) (COND (LITS-THAT-MAY-BE-ASSUMED-FALSE (SETQ NEG-HYP (DUMB-NEGATE-LIT HYP)) (COND ((SETQ LIT (for LIT in LITS-THAT-MAY-BE-ASSUMED-FALSE when (ONE-WAY-UNIFY1 NEG-HYP LIT) do (RETURN LIT))) (PUSH-LEMMA LIT) (RETURN T)) (T (RETURN NIL)))) (T (RETURN NIL]) (LOOP-STOPPER [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (LHS RHS ALL-VARS) (COND ((AND (BM-MATCH TERM (EQUAL LHS RHS)) (VARIANTP LHS RHS)) (SETQ ALL-VARS (ALL-VARS LHS)) (for PAIR in UNIFY-SUBST when (MEMB (CAR PAIR) (CDR (MEMB (CDR PAIR) ALL-VARS))) collect PAIR)) (T NIL]) (MAIN-EVENT-OF [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((GETPROP NAME (QUOTE EVENT)) NAME) ((GETPROP NAME (QUOTE MAIN-EVENT))) (T (ERROR1 (PQUOTE (PROGN MAIN-EVENT-OF HAS BEEN CALLED ON AN OBJECT , NAMELY (!PPR NAME NIL) , THAT IS NEITHER AN EVENT NOR A SATELLITE OF ANOTHER EVENT !)) (BINDINGS (QUOTE NAME) NAME) (QUOTE HARD]) (CREATE-EVENT [LAMBDA (NAME EVENT) (* kbr: "19-Oct-85 16:31") (PUT1 NAME EVENT (QUOTE EVENT)) (PUT1 NAME (IDATE) (QUOTE IDATE)) (SETQ CHRONOLOGY (CONS NAME CHRONOLOGY)) (SETQ MAIN-EVENT-NAME NAME]) (MAKE-FLATTENED-MACHINE [LAMBDA (FNNAME TERM TESTS) (* kbr: "19-Oct-85 20:01") (* This function builds a list of TESTS-AND-CASE representing the function  FNNAME with body TERM. For each call of FNNAME in body, a TESTS-AND-CASE is  returned whose TESTS are all the tests that govern the call and whose CASE is  the arglist of the call. This code is a vast change from the previous version,  which did not consider terms with or within calls of FNNAME as governors.  *) (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM)) NIL) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (NCONC (MAKE-FLATTENED-MACHINE FNNAME (FARGN TERM 1) TESTS) (MAKE-FLATTENED-MACHINE FNNAME (FARGN TERM 2) (APPEND TESTS (LIST (FARGN TERM 1)))) (MAKE-FLATTENED-MACHINE FNNAME (FARGN TERM 3) (APPEND TESTS (LIST (NEGATE-LIT (FARGN TERM 1))))))) ((EQ FNNAME (FFN-SYMB TERM)) (CONS (create TESTS-AND-CASE TESTS _ TESTS CASE _ (FARGS TERM)) (for ARG in (FARGS TERM) join (MAKE-FLATTENED-MACHINE FNNAME ARG TESTS)))) (T (for ARG in (FARGS TERM) join (MAKE-FLATTENED-MACHINE FNNAME ARG TESTS]) (MAKE-NEW-NAME [LAMBDA NIL (* kbr: "26-Oct-85 12:59") (LET (TEMP) (while (NULL (CHK-NEW-NAME (SETQ TEMP (GENSYM (QUOTE G))) T)) do NIL) TEMP]) (MAKE-REWRITE-RULES [LAMBDA (NAME HYPS CONCL) (* kbr: "19-Oct-85 16:31") (* This fn once entertained the idea of returning as many rewrite rules as  there were paths through the IF structure of HYPS.  That blew us out of the water on a thm whose hyp was  (AND (NOT (EQUAL X Y)) (NOT (LESSP X Y))) because it generated 75 paths! So the  fn now returns just one rewrite rule -- or none if CONCL is an explicit value.  The rule is LISTed so that the higher level functions still allow the  possibility of it someday returning more than one --  BUT they are all hung under the same fn symbol so this probably is not a useful  feature. *) (PROG (LHS RHS) (COND ((QUOTEP CONCL) (RETURN NIL)) ((BM-MATCH CONCL (EQUAL LHS RHS)) (SETQ CONCL (LIST (QUOTE EQUAL) LHS (NORMALIZE-IFS (EXPAND-BOOT-STRAP-NON-REC-FNS RHS) NIL NIL))))) (RETURN (LIST (CREATE-REWRITE-RULE NAME HYPS CONCL NIL]) (MAKE-TYPE-RESTRICTION [LAMBDA (TR DV RECOGNIZER TYPE-NO) (* kbr: "19-Oct-85 16:31") (LET (TYPE-SET) (SETQ TYPE-SET (for R in (CDR TR) bind (LOOP-ANS _ 0) do (SETQ LOOP-ANS (LOGOR LOOP-ANS (CDR (ASSOC R (CONS (CONS RECOGNIZER (LOGBIT TYPE-NO )) RECOGNIZER-ALIST)))) ) finally (RETURN LOOP-ANS))) (COND ((EQ (CAR TR) (QUOTE NONE-OF)) (SETQ TYPE-SET (LOGNOT TYPE-SET)))) (create TYPE-RESTRICTION TERM _ (COND ((EQ (CAR TR) (QUOTE ONE-OF)) (DISJOIN (for R in (CDR TR) collect (FCONS-TERM* R (QUOTE X))) NIL)) (T (CONJOIN (for R in (CDR TR) collect (DUMB-NEGATE-LIT (FCONS-TERM* R (QUOTE X)))) NIL))) TYPE-SET _ TYPE-SET DEFAULT _ (CONS-TERM DV NIL]) (MAX-FORM-COUNT [LAMBDA (X) (* kbr: " 4-Jul-86 18:32") (* The size of the most complicated  path in X regarded as a tree of IFs.  *) (COND ((VARIABLEP X) 0) ((FQUOTEP X) (* MAX-FORM-COUNT once used FORM-COUNT-EVG to compute the size of an evg.  But that function computed MAX-FORM-COUNT for 1000 that was bigger than for 999  and so the REWRITE package believed it was making progress and would open up  something like (LESSP X 1000)%. We have decided to try just measuring the LISP  size of the evg, as a better estimation of whether we are making progress.  *) (COUNT (CADR X))) ((EQ (FFN-SYMB X) (QUOTE IF)) (MAX (MAX-FORM-COUNT (FARGN X 2)) (MAX-FORM-COUNT (FARGN X 3)))) (T (ADD1 (for ARG in (FARGS X) sum (MAX-FORM-COUNT ARG]) (MAXIMAL-ELEMENTS [LAMBDA (LST MEASURE) (* kbr: "19-Oct-85 16:31") (LET (ANS MAX TEMP) (for X in LST do (SETQ TEMP (APPLY* MEASURE X)) (COND ((OR (NULL MAX) (GREATERP TEMP MAX)) (SETQ MAX TEMP) (SETQ ANS (LIST X))) ((EQUAL TEMP MAX) (SETQ ANS (NCONC1 ANS X))))) ANS]) (MEANING-SIMPLIFIER [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* When the theorem-prover assents to a theorem or accepts a definition, in  which theory is it working? Heretofore, the answer has been= in the theory  consisting of chapter 3 of ACL plus the user's definitions and axioms.  Because of the addition of metatheorems, the answer to that question is no  longer so simple. To answer the question, we first elaborate the notion of a  presented in the meta paper. Let us say that an event is a pair  (ev term) where ev is either DEFN, ADD-SHELL, ADD-AXIOM, PROVE-LEMMA, or DCL.  An member (ev term) if ev is DCL, then term is a function symbol and otherwise  term is a term. Given a list of events, we say that a function symbol is has  not been defined, has not been DCLed, and is not mentioned in the basic axioms.  A the concept being defined is new, and all the other function symbols are not  new for a shell invocation all the introduced symbols  (excepting possibly the default objects) are new for a DCL, the symbol is new  for a theorem or arbitrary axiom, none of the symbols used are new and the  theorems are provable from the preceding axioms  (including definitions and shell invocations)%.  We define a symbols on META-NAMES are DCLed or defined at the beginning of the  chronology as in BOOT-STRAP-INSTRS, immediately after each DCL and DEFINITION  the MEANING and ARITY axioms for the newly introduced function symbol are added  as arbitrary axioms, and there is otherwise no mention of any META-NAME except  in theorems. We vouch that our theorem-prover only calls proved in the user  chronology. We now make a like to work in a chronology with all those  metaaxioms To make the user happy, we show that corresponding to any user  chronology is a axioms and definitions only by the addition of more  definitions. Furthermore, we observe that in the real chronology, all the  theorems of the user chronology (the ones the theorem-prover proved) are  theorems in the real chronology after we replace each function symbol in  META-NAMES with another function symbol.  Thus, any theorem proved in the user chronology about concepts he has defined  or DCLed are literally theorems in the real chronology.  If he objects to having extra definitions around, then tough luck for him.  Given a initial BOOT-STRAP events that mention META-NAMES, replacing the  MEANING and ARITY axiom after each DCL or definition with the collection of  definitions called the metadefinitions in the meta paper for the i non-new  function symbols at that point in the chronology --  amended by indexing each META-NAME with i --  and altering each theorem by adding to each META-NAME the appropriate index.  Note we do not have to index user supplied axioms or definitions since they may  not contain META-NAMES. Note we are forbidding the user from using META-NAMES  in definitions even if he want to define concepts to help him prove metalemmas!  Why is a indexed theorems can be proved? The answer is that at any point i in  the user chronology (that is, after i definitions and declarations) and for  each axiom about a META-NAME in the user chronology, we can prove, in the real  chronology, at the corresponding point, the indexed version of the axiom.  The proof of this assertion is merely the observation that the metaaxioms  follow from the metadefinitions, so the indexed metaaxioms follow from the  indexed metadefinitions. The foregoing facts are independent of the use of  metalemmas. Now let us consider how metalemmas are used.  Suppose that a metalemma is proved at some constructive point i in a user  chronology and that at some point i+p we use the metalemma.  We claim that the inference can be proved at point i+p in the user chronology.  As a corollary to what has been said before, we also conclude that the  inference can be proved in the corresponding chronology is obvious since the  metatheorem at i was proved about the same symbol MEANING we will use at i+p to  lift and drop the formulas in question. *) (LET (X ALIST FN TL) (MATCH! TERM (MEANING X ALIST)) (COND ((VARIABLEP X) TERM) ((SHELLP X) (COND ((NEQ (FN-SYMB X) (QUOTE CONS)) (CONS-TERM (QUOTE LOOKUP) (FARGS TERM))) (T (SETQ FN (ARGN X 1)) (SETQ TL (ARGN X 2)) (COND ((AND (QUOTEP FN) (LITATOM (CADR FN))) (COND ((EQ (CADR FN) (QUOTE QUOTE)) (FCONS-TERM* (QUOTE CAR) TL)) ((AND (GETPROP (CADR FN) (QUOTE TYPE-PRESCRIPTION-LST)) (NOT (MEMB (CADR FN) META-NAMES))) (CONS-TERM (CADR FN) (for I from 1 to (ARITY (CADR FN)) collect (FCONS-TERM* (QUOTE MEANING) (FCONS-TERM* (QUOTE CAR) (CELL (SUB1 I) TL)) ALIST)))) (T TERM))) (T TERM))))) (T TERM]) (MEMB-NEGATIVE [LAMBDA (LIT CL) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP CL) NIL) ((COMPLEMENTARYP LIT (CAR CL)) T) (T (MEMB-NEGATIVE LIT (CDR CL]) (MENTIONSQ [LAMBDA (AT TREE) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP TREE) (EQ AT TREE)) (T (OR (MENTIONSQ AT (CAR TREE)) (MENTIONSQ AT (CDR TREE]) (MENTIONSQ-LST [LAMBDA (LST TREE) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP TREE) (MEMB TREE LST)) (T (OR (MENTIONSQ-LST LST (CAR TREE)) (MENTIONSQ-LST LST (CDR TREE]) (MERGE-CAND1-INTO-CAND2 [LAMBDA (CAND1 CAND2) (* kbr: "19-Oct-85 16:56") (* Note: The guts of this function is MERGE-TESTS-AND-ALISTS-LSTS.  The tests preceding it are heuristic only.  If MERGE-TESTS-AND-ALISTS-LSTS returns non-NIL then it returns a sound  induction indeed, it merely extends some of the substitutions in the second  candidate. *) (LET (SCORE1 CONTROLLERS1 CHANGED-VARS1 UNCHANGEABLES1 TESTS-AND-ALISTS-LST1 JUSTIFICATION1 TERM1 OTHER-TERMS1 SCORE2 CONTROLLERS2 CHANGED-VARS2 UNCHANGEABLES2 TESTS-AND-ALISTS-LST2 JUSTIFICATION2 TERM2 OTHER-TERMS2 ALISTS TESTS-AND-ALISTS-LST VARS) (SETQ SCORE1 (fetch (CANDIDATE SCORE) of CAND1)) (SETQ CONTROLLERS1 (fetch (CANDIDATE CONTROLLERS) of CAND1)) (SETQ CHANGED-VARS1 (fetch (CANDIDATE CHANGED-VARS) of CAND1)) (SETQ UNCHANGEABLES1 (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND1)) (SETQ TESTS-AND-ALISTS-LST1 (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of CAND1)) (SETQ JUSTIFICATION1 (fetch (CANDIDATE JUSTIFICATION) of CAND1)) (SETQ TERM1 (fetch (CANDIDATE INDUCTION-TERM) of CAND1)) (SETQ OTHER-TERMS1 (fetch (CANDIDATE OTHER-TERMS) of CAND1)) (SETQ SCORE2 (fetch (CANDIDATE SCORE) of CAND2)) (SETQ CONTROLLERS2 (fetch (CANDIDATE CONTROLLERS) of CAND2)) (SETQ CHANGED-VARS2 (fetch (CANDIDATE CHANGED-VARS) of CAND2)) (SETQ UNCHANGEABLES2 (fetch (CANDIDATE UNCHANGEABLE-VARS) of CAND2)) (SETQ TESTS-AND-ALISTS-LST2 (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of CAND2)) (SETQ JUSTIFICATION2 (fetch (CANDIDATE JUSTIFICATION) of CAND2)) (SETQ TERM2 (fetch (CANDIDATE INDUCTION-TERM) of CAND2)) (SETQ OTHER-TERMS2 (fetch (CANDIDATE OTHER-TERMS) of CAND2)) (* We once merged only if both cands agreed on the intersection of the  CHANGED-VARS. But the theorem that, under suitable conditions,  (EV FLG X VA FA N) IEQP (EV FLG X VA FA K) made us realize it was important  only to agree on the intersection of the controllers.  Note in fact that we mean the changing controllers --  there seems to be no need to merge two inductions if they only share unchanging  controllers. However the theorem that (GETPROP I  (SET J VAL MEM)) IEQP ... (GETPROP I MEM) ...  illustrates the situation in which the controllers, {I} and {J} do not even  overlap but the accumulators {MEM} do and we want a merge.  So we want agreement on the intersection of the changing controllers  (if that is nonempty) or on the accumulators.  For soundness it does not matter what list of vars we want to agree on because  no matter what, MERGE-TESTS-AND-ALISTS-LSTS returns either NIL or an extension  of the second candidates alists. *) (AND (SETQ VARS (OR (INTERSECTION CONTROLLERS1 (INTERSECTION CONTROLLERS2 (INTERSECTION CHANGED-VARS1 CHANGED-VARS2))) (INTERSECTION CHANGED-VARS1 CHANGED-VARS2))) (NOT (INTERSECTP UNCHANGEABLES1 CHANGED-VARS2)) (NOT (INTERSECTP UNCHANGEABLES2 CHANGED-VARS1)) (SETQ TESTS-AND-ALISTS-LST (MERGE-TESTS-AND-ALISTS-LSTS TESTS-AND-ALISTS-LST1 TESTS-AND-ALISTS-LST2 VARS)) (create CANDIDATE SCORE _ (PLUS SCORE1 SCORE2) CONTROLLERS _ (UNIONQ CONTROLLERS1 CONTROLLERS2) CHANGED-VARS _ (UNIONQ CHANGED-VARS1 CHANGED-VARS2) UNCHANGEABLE-VARS _ (UNIONQ UNCHANGEABLES1 UNCHANGEABLES2) TESTS-AND-ALISTS-LST _ TESTS-AND-ALISTS-LST JUSTIFICATION _ JUSTIFICATION2 INDUCTION-TERM _ TERM2 OTHER-TERMS _ (ADD-TO-SET TERM1 (UNION-EQUAL OTHER-TERMS1 OTHER-TERMS2]) (MERGE-CANDS [LAMBDA (CAND1 CAND2) (* kbr: "19-Oct-85 16:31") (OR (FLUSH-CAND1-DOWN-CAND2 CAND1 CAND2) (FLUSH-CAND1-DOWN-CAND2 CAND2 CAND1) (MERGE-CAND1-INTO-CAND2 CAND1 CAND2) (MERGE-CAND1-INTO-CAND2 CAND2 CAND1]) (MERGE-DESTRUCTOR-CANDIDATES [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (* The elements of LST are lists of  terms. Whenever the CARs of two  elements are EQUAL we UNIONQ together  the CDRs. *) (TRANSITIVE-CLOSURE LST (FUNCTION (LAMBDA (X Y) (COND ((EQUAL (CAR X) (CAR Y)) (CONS (CAR X) (UNION-EQUAL (CDR X) (CDR Y)))) (T NIL]) (MERGE-TESTS-AND-ALISTS [LAMBDA (TA1 TA2) (* kbr: "19-Oct-85 16:31") (AND (SETQ ALISTS (PIGEON-HOLE (fetch (TESTS-AND-ALISTS ALISTS) of TA1) (fetch (TESTS-AND-ALISTS ALISTS) of TA2) [FUNCTION (LAMBDA (ALIST1 ALIST2) (* Union the two alists if they have a non-trivial intersection, that is, they  intersect with a pair other than one like  (ITIMES), and they agree on their intersection.  *) (AND (for PAIR1 in ALIST1 thereis (AND (NEQ (CAR PAIR1) (CDR PAIR1)) (MEMBER PAIR1 ALIST2))) (for PAIR1 in ALIST1 bind PAIR2 when (SETQ PAIR2 (ASSOC (CAR PAIR1) ALIST2)) always (EQUAL PAIR2 PAIR1)) (UNION-EQUAL ALIST1 ALIST2] T NIL)) (create TESTS-AND-ALISTS TESTS _ (fetch (TESTS-AND-ALISTS TESTS) of TA2) ALISTS _ ALISTS]) (MERGE-TESTS-AND-ALISTS-LSTS [LAMBDA (TESTS-AND-ALISTS-LST1 TESTS-AND-ALISTS-LST2 VARS) (* kbr: "20-Oct-85 19:21") (* If every alist in TESTS-AND-ALISTS-LST1 fits into an alist in  TESTS-AND-ALISTS-LST2, then return the new TESTS-AND-ALISTS-LST obtained by  putting each alist in TESTS-AND-ALISTS-LST1 into every alist in  TESTS-AND-ALISTS-LST2 into which it fits.  Else return NIL. ALIST1 fits into ALIST2 iff the two agree on every var in  VARS. To merge one alist into another we extend the second alist by adding to  it every pair of the first, provided that pair does not clash with an existing  pair of the second. *) (LET (BUCKETS ALIST FLG) (SETQ BUCKETS (for TA in TESTS-AND-ALISTS-LST2 collect (for ALIST in (fetch (TESTS-AND-ALISTS ALISTS) of TA) collect (CONS ALIST NIL)))) (COND ((for TA1 in TESTS-AND-ALISTS-LST1 always (for ALIST1 in (fetch (TESTS-AND-ALISTS ALISTS) of TA1) always (PROGN (SETQ FLG NIL) (for BUCKET in BUCKETS do (for PAIR in BUCKET do (COND ((FITS ALIST1 (CAR PAIR) VARS) (RPLACD PAIR (ADD-TO-SET (EXTEND-ALIST ALIST1 (CAR PAIR)) (CDR PAIR))) (SETQ FLG T))))) FLG))) (for TA in TESTS-AND-ALISTS-LST2 as BUCKET in BUCKETS collect (create TESTS-AND-ALISTS TESTS _ (fetch (TESTS-AND-ALISTS TESTS) of TA) ALISTS _ (for X in BUCKET bind LOOP-ANS do (SETQ LOOP-ANS (UNION-EQUAL (OR (CDR X) X) LOOP-ANS)) finally (RETURN LOOP-ANS)) ))) (T NIL]) (META-LEMMAP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (NLISTP (fetch (REWRITE-RULE CONCL) of X]) (MULTIPLE-PIGEON-HOLE [LAMBDA (PIGEONS HOLES FN) (* kbr: "19-Oct-85 16:31") (LET (TEMP PAIRLST) (SETQ PAIRLST (for X in HOLES collect (CONS NIL X))) (COND ((for PIGEON in PIGEONS always (for PAIR in PAIRLST bind FLG do (SETQ TEMP (APPLY* FN PIGEON (CDR PAIR))) (COND (TEMP (RPLACD PAIR TEMP) (SETQ FLG T))) finally (RETURN FLG))) (for PAIR in PAIRLST collect (CDR PAIR))) (T (ERROR1 (PQUOTE (PROGN MULTIPLE-PIGEON-HOLE FAILED TO GETPROP EVERYTHING IN A POT.)) (BINDINGS) (QUOTE HARD]) ) (RPAQQ CODE-N-RCOMS ((* CODE-N-R *) (FNS BM-NEGATE NEGATE-LIT NEXT-AVAILABLE-TYPE-NO NO-CROWDINGP NO-DUPLICATESP NO-OP NON-RECURSIVE-DEFNP NORMALIZE-IFS NOT-EQUAL-0? NOT-IDENT NOT-LESSP? NOT-TO-BE-REWRITTENP NUMBERP? OBJ-TABLE OCCUR OCCUR-CNT OCCUR-LST ONE-WAY-UNIFY ONE-WAY-UNIFY-LIST ONE-WAY-UNIFY1 ONE-WAY-UNIFY11 ONEIFY ONEIFY-ASSUME-FALSE ONEIFY-ASSUME-TRUE ONEIFY-TEST OPTIMIZE-COMMON-SUBTERMS PARTITION PARTITION-CLAUSES PATH-ADD-TO-SET PATH-EQ PATH-POT-SUBSUMES PATH-UNION PEGATE-LIT PETITIO-PRINCIPII PICK-HIGH-SCORES PIGEON-HOLE PIGEON-HOLE-IN-ALL-POSSIBLE-WAYS PIGEON-HOLE1 PLUSJOIN POLY-MEMBER POP-CLAUSE-SET POP-LEMMA-FRAME POP-LINEARIZE-ASSUMPTIONS-FRAME POPU POSSIBLE-IND-PRINCIPLES POSSIBLY-NUMERIC POWER-EVAL POWER-REP PPC PPE PPE-LST BM-PPR PPRINDENT PPSD PPSD-LST PREPROCESS PREPROCESS-HYPS PRETTYIFY-CLAUSE PRETTYIFY-LISP PRIMITIVE-RECURSIVEP PRIMITIVEP PRINT-STACK PRINT-STATS PRINT-TO-DISPLAY PROCESS-EQUATIONAL-POLYS PROPERTYLESS-SYMBOLP PROVE PROVE-TERMINATION PROVEALL PUSH-CLAUSE-SET PUSH-LEMMA PUSH-LEMMA-FRAME PUSH-LINEARIZE-ASSUMPTION PUSH-LINEARIZE-ASSUMPTIONS-FRAME PUSHU PUT-CURSOR PUT-INDUCTION-INFO PUT-LEVEL-NO PUT-TYPE-PRESCRIPTION PUT0 PUT00 PUT1 PUT1-LST PUTD1 QUICK-BLOCK-INFO QUICK-BLOCK-INFO1 QUICK-WORSE-THAN R REDO! REDO-UNDONE-EVENTS BM-REDUCE REDUCE1 REFLECT0 RELIEVE-HYPS RELIEVE-HYPS-NOT-OK RELIEVE-HYPS1 REMOVE-*2*IFS REMOVE-NEGATIVE REMOVE-REDUNDANT-TESTS REMOVE1 REMOVE-TRIVIAL-EQUATIONS REMOVE-UNCHANGING-VARS REMPROP1 RESTART RESTART-BATCH REWRITE REWRITE-FNCALL REWRITE-FNCALLP REWRITE-IF REWRITE-IF1 REWRITE-LINEAR-CONCL REWRITE-SOLIDIFY REWRITE-TYPE-PRED REWRITE-WITH-LEMMAS REWRITE-WITH-LINEAR RPLACAI))) (* CODE-N-R *) (DEFINEQ (BM-NEGATE [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((FALSE-NONFALSEP TERM) (COND (DEFINITELY-FALSE TRUE) (T FALSE))) ((VARIABLEP TERM) (LIST (QUOTE NOT) TERM)) (T (SELECTQ (FFN-SYMB TERM) (NOT (COND ((BOOLEAN (FARGN TERM 1)) (FARGN TERM 1)) (T (FCONS-TERM* (QUOTE IF) (FARGN TERM 1) TRUE FALSE)))) (AND (DISJOIN2 (BM-NEGATE (FARGN TERM 1)) (BM-NEGATE (FARGN TERM 2)) NIL)) (OR (CONJOIN2 (BM-NEGATE (FARGN TERM 1)) (BM-NEGATE (FARGN TERM 2)) NIL)) (FCONS-TERM* (QUOTE NOT) TERM]) (NEGATE-LIT [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((FALSE-NONFALSEP TERM) (COND (DEFINITELY-FALSE TRUE) (T FALSE))) ((VARIABLEP TERM) (FCONS-TERM* (QUOTE NOT) TERM)) ((EQ (FFN-SYMB TERM) (QUOTE NOT)) (FARGN TERM 1)) (T (FCONS-TERM* (QUOTE NOT) TERM]) (NEXT-AVAILABLE-TYPE-NO [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (LET (TYPE-NO) (SETQ TYPE-NO (for I from 0 when (NOT (for PAIR in SHELL-ALIST thereis (EQUAL (CDR PAIR) I))) do (RETURN I))) (COND ((GREATERP TYPE-NO 30) (ERROR1 (PQUOTE (PROGN TOO MANY SHELLS ! BECAUSE OF OUR USE OF 32-BIT WORDS TO REPRESENT SETS OF SHELL TYPES , THE NEED TO RESERVE ONE BIT FOR INTERNAL USE , AND THE EXISTENCE OF 31 PREVIOUSLY DEFINED SHELLS , WE CANNOT ACCEPT FURTHER ADD-SHELL COMMANDS %.)) (BINDINGS) (QUOTE HARD)))) TYPE-NO]) (NO-CROWDINGP [LAMBDA (HOLES PRED PICKS) (* kbr: "19-Oct-85 16:31") (COND ((NULL HOLES) T) ((for X in (CAR HOLES) thereis (AND (for Y in PICKS never (APPLY* PRED X Y)) (NO-CROWDINGP (CDR HOLES) PRED (CONS X PICKS)))) T) (T NIL]) (NO-DUPLICATESP [LAMBDA (L) (* kbr: "19-Oct-85 16:31") (for TAIL on L never (MEMB (CAR TAIL) (CDR TAIL]) (NO-OP [LAMBDA NIL (* kbr: "19-Oct-85 16:31") NIL]) (NON-RECURSIVE-DEFNP [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (* We use the fact that this AND  returns the SDEFN! *) (AND (NOT (DISABLEDP FNNAME)) (NOT (GETPROP FNNAME (QUOTE INDUCTION-MACHINE))) (GETPROP FNNAME (QUOTE SDEFN]) (NORMALIZE-IFS [LAMBDA (TERM TRUE-TERMS FALSE-TERMS) (* kbr: "19-Oct-85 16:31") (LET (T1 T2 T3 T11 T12 T13 BAD-ARG) (COND ((VARIABLEP TERM) (COND ((MEMB TERM FALSE-TERMS) FALSE) (T TERM))) ((FQUOTEP TERM) TERM) ((BM-MATCH TERM (IF T1 T2 T3)) (SETQ T1 (NORMALIZE-IFS T1 TRUE-TERMS FALSE-TERMS)) (COND ((OR (EQUAL T1 TRUE) (MEMBER T1 TRUE-TERMS)) (NORMALIZE-IFS T2 TRUE-TERMS FALSE-TERMS)) ((OR (EQUAL T1 FALSE) (MEMBER T1 FALSE-TERMS)) (NORMALIZE-IFS T3 TRUE-TERMS FALSE-TERMS)) ((BM-MATCH T1 (IF T11 T12 T13)) (NORMALIZE-IFS (FCONS-TERM* (QUOTE IF) T11 (FCONS-TERM* (QUOTE IF) T12 T2 T3) (FCONS-TERM* (QUOTE IF) T13 T2 T3)) TRUE-TERMS FALSE-TERMS)) (T (SETQ T2 (NORMALIZE-IFS T2 (CONS T1 TRUE-TERMS) FALSE-TERMS)) (SETQ T3 (NORMALIZE-IFS T3 TRUE-TERMS (CONS T1 FALSE-TERMS))) (COND ((EQUAL T2 T3) T2) ((AND (BOOLEAN T1) (EQUAL T2 TRUE) (AND (FALSE-NONFALSEP T3) DEFINITELY-FALSE)) T1) (T (FCONS-TERM* (QUOTE IF) T1 T2 T3)))))) (T (SETQ TERM (CONS-TERM (CAR TERM) (for ARG in (FARGS TERM) collect (NORMALIZE-IFS ARG TRUE-TERMS FALSE-TERMS)))) (COND ((BM-MATCH TERM (EQUAL T1 T2)) (COND ((EQUAL T1 T2) (SETQ TERM TRUE)) ((NOT-IDENT T1 T2) (SETQ TERM FALSE))))) (COND ((FQUOTEP TERM) TERM) ((SETQ BAD-ARG (for ARG in (FARGS TERM) when (BM-MATCH ARG (COND ((T1 T2 T3)))) do (RETURN ARG))) (FCONS-TERM* (QUOTE IF) T1 (NORMALIZE-IFS (SUBST-EXPR T2 BAD-ARG TERM) (CONS T1 TRUE-TERMS) FALSE-TERMS) (NORMALIZE-IFS (SUBST-EXPR T3 BAD-ARG TERM) TRUE-TERMS (CONS T1 FALSE-TERMS)))) ((MEMBER TERM FALSE-TERMS) FALSE) ((AND (MEMBER TERM TRUE-TERMS) (BOOLEAN TERM)) TRUE) (T TERM]) (NOT-EQUAL-0? [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (PROG (X Y TEMP EQUALITY) (COND ((BM-MATCH TERM (DIFFERENCE X Y)) (RETURN (BM-NEGATE (NOT-LESSP? Y X)))) ((OR (BM-MATCH TERM (ADD1 &)) (AND (QUOTEP TERM) (NOT (EQUAL (CADR TERM) 0)))) (RETURN TRUE))) (SETQ EQUALITY (FCONS-TERM* (QUOTE EQUAL) TERM ZERO)) (SETQ TEMP (TYPE-SET EQUALITY)) (COND ((IEQP TEMP TYPE-SET-TRUE) (RETURN FALSE)) ((IEQP TEMP TYPE-SET-FALSE) (RETURN TRUE)) (T (RETURN (FCONS-TERM* (QUOTE NOT) EQUALITY]) (NOT-IDENT [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (COND ((AND (VALUEP TERM1) (VALUEP TERM2) (NOT (EQUAL TERM1 TERM2))) T) ((OR (AND (BTM-OBJECTP TERM1) (SHELL-CONSTRUCTORP TERM2)) (AND (BTM-OBJECTP TERM2) (SHELL-CONSTRUCTORP TERM1))) (* Note, we do not even bother to check that they are of the same type, since  if they weren't they'd be unequal on type considerations alone.  *) T) ((IEQP 0 (LOGAND (TYPE-SET TERM1) (TYPE-SET TERM2))) T) ((SHELL-OCCUR TERM1 TERM2) T) ((SHELL-OCCUR TERM2 TERM1) T) (T NIL]) (NOT-LESSP? [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (PROG (TEMP TERM) (COND ((AND (EQUAL Y (QUOTE (QUOTE 1))) (IEQP (TYPE-SET X) TYPE-SET-NUMBERS)) (RETURN (NOT-EQUAL-0? X)))) (SETQ TEMP (TYPE-SET (SETQ TERM (FCONS-TERM* (QUOTE LESSP) X Y)))) (RETURN (COND ((IEQP TEMP TYPE-SET-FALSE) TRUE) ((IEQP TEMP TYPE-SET-TRUE) FALSE) (T (BM-NEGATE TERM]) (NOT-TO-BE-REWRITTENP [LAMBDA (TERM ALIST) (* kbr: "19-Oct-85 16:31") (* We assume TERM is a nonvariable nonQUOTEP and that  TERMS-TO-BE-IGNORED-BY-REWRITE contains no vars or QUOTEPs.  Let term' be (SUBLIS-VAR ALIST TERM)%. If term' is a member of  TERMS-TO-BE-IGNORED-BY-REWRITE we return term' else NIL.  We would like to do the membership test without doing the substitution, but the  maintenance of QUOTE-normal form by SUBLIS-VAR complicates matters.  We first ask whether the FFN-SYMB of TERM is the FFN-SYMB of any term to be  ignored. If not, we return NIL. Else we do the substitution and member check.  The correctness of this function is obvious in the case that we do the  substitution. So suppose we return NIL without doing the substitution.  Suppose, contrary to correctness that term' is a member of the to be ignored  list. Then term' is not a QUOTEP. But in that case the FFN-SYMB of term' is  that of TERM and must have passed our initial test.  *) (COND ((AND (for X in TERMS-TO-BE-IGNORED-BY-REWRITE thereis (EQ (FFN-SYMB TERM) (FFN-SYMB X))) (MEMBER (SETQ TEMP-TEMP (SUBLIS-VAR ALIST TERM)) TERMS-TO-BE-IGNORED-BY-REWRITE)) TEMP-TEMP) (T NIL]) (NUMBERP? [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (TEMP) (SETQ TEMP (TYPE-SET TERM)) (COND ((IEQP TEMP TYPE-SET-NUMBERS) TRUE) ((NOT (LOGSUBSETP TYPE-SET-NUMBERS TEMP)) FALSE) (T (FCONS-TERM* (QUOTE NUMBERP) TERM]) (OBJ-TABLE [LAMBDA (TYPE-SET OBJECTIVE ID-IFF) (* kbr: "19-Oct-85 16:31") (SELECTQ OBJECTIVE (TRUE (COND ((IEQP TYPE-SET TYPE-SET-TRUE) TRUE) ((EQ ID-IFF (QUOTE ID)) NIL) ((LOGSUBSETP TYPE-SET-FALSE TYPE-SET) NIL) (T TRUE))) (FALSE (COND ((IEQP TYPE-SET TYPE-SET-FALSE) FALSE) (T NIL))) (? (COND ((IEQP TYPE-SET TYPE-SET-FALSE) FALSE) ((IEQP TYPE-SET TYPE-SET-TRUE) TRUE) ((EQ ID-IFF (QUOTE ID)) NIL) ((LOGSUBSETP TYPE-SET-FALSE TYPE-SET) NIL) (T TRUE))) (ERROR1 (PQUOTE (PROGN UNRECOGNIZED REWRITE OBJECTIVE , (!PPR OBJECTIVE NIL) %.)) (BINDINGS (QUOTE OBJECTIVE) OBJECTIVE) (QUOTE HARD]) (OCCUR [LAMBDA (TERM1 TERM2) (* kbr: "20-Oct-85 14:23") (* Does TERM1 occur inside TERM2? *) (COND ((VARIABLEP TERM2) (EQ TERM1 TERM2)) ((FQUOTEP TERM2) (COND ((QUOTEP TERM1) (* Consider that TERM1 is built up out  of smaller constants, one of which  could be constant TERM2.  *) (COND ((FIXP (CADR TERM1)) (EVG-OCCUR-NUMBER (CADR TERM1) (CADR TERM2))) ((AND (LEGAL-CHAR-CODE-SEQ (CADR TERM1)) (EQUAL (CDR (LAST (CADR TERM1))) 0)) (EVG-OCCUR-LEGAL-CHAR-CODE-SEQ (CADR TERM1) (CADR TERM2))) (T (EVG-OCCUR-OTHER (CADR TERM1) (CADR TERM2))))) (T NIL))) ((EQUAL TERM1 TERM2) T) (T (for ARG in (FARGS TERM2) thereis (OCCUR TERM1 ARG]) (OCCUR-CNT [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (* Return a lower bound on the number  of times TERM1 occurs in TERM2.  We do not go inside of QUOTEs in  TERM2. *) (COND ((EQUAL TERM1 TERM2) 1) ((VARIABLEP TERM2) 0) ((FQUOTEP TERM2) 0) (T (for ARG in (FARGS TERM2) sum (OCCUR-CNT TERM1 ARG]) (OCCUR-LST [LAMBDA (X LST) (* kbr: "19-Oct-85 16:31") (for Y in LST thereis (OCCUR X Y]) (ONE-WAY-UNIFY [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (SETQ UNIFY-SUBST NIL) (ONE-WAY-UNIFY1 TERM1 TERM2]) (ONE-WAY-UNIFY-LIST [LAMBDA (TERM1-LIST TERM2-LIST) (* kbr: "19-Oct-85 16:31") (* Like ONE-WAY-UNIFY except operates  on lists of terms. *) (SETQ UNIFY-SUBST NIL) (for TERM1 in TERM1-LIST as TERM2 in TERM2-LIST always (ONE-WAY-UNIFY1 TERM1 TERM2]) (ONE-WAY-UNIFY1 [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (LET (OLD-ALIST) (SETQ COMMUTED-EQUALITY-FLG NIL) (SETQ OLD-ALIST UNIFY-SUBST) (COND ((ONE-WAY-UNIFY11 TERM1 TERM2) T) (T (SETQ UNIFY-SUBST OLD-ALIST) NIL]) (ONE-WAY-UNIFY11 [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM1) (COND ((SETQ TEMP-TEMP (ASSOC TERM1 UNIFY-SUBST)) (EQUAL (CDR TEMP-TEMP) TERM2)) (T (SETQ UNIFY-SUBST (CONS (CONS TERM1 TERM2) UNIFY-SUBST))))) ((FQUOTEP TERM1) (* Since TERM1 is the only one whose variables we instantiate, and is constant,  and all terms are in the QUOTE-normal form discussed in CONS-TERM, these two  terms unify iff they are EQUAL. *) (EQUAL TERM1 TERM2)) ((VARIABLEP TERM2) NIL) ((EQ (FFN-SYMB TERM1) (FN-SYMB TERM2)) (COND ((EQ (FFN-SYMB TERM1) (QUOTE EQUAL)) (LET ((SAVED-UNIFY-SUBST UNIFY-SUBST)) (COND ((AND (ONE-WAY-UNIFY11 (FARGN TERM1 1) (FARGN TERM2 1)) (ONE-WAY-UNIFY11 (FARGN TERM1 2) (FARGN TERM2 2))) T) (T (SETQ UNIFY-SUBST SAVED-UNIFY-SUBST) (AND (ONE-WAY-UNIFY11 (FARGN TERM1 2) (FARGN TERM2 1)) (ONE-WAY-UNIFY11 (FARGN TERM1 1) (FARGN TERM2 2)) (SETQ COMMUTED-EQUALITY-FLG T)))))) (T (for ARG1 in (FARGS TERM1) as ARG2 in (SARGS TERM2) always (ONE-WAY-UNIFY11 ARG1 ARG2)) ))) (T NIL]) (ONEIFY [LAMBDA (TERM TESTS) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) (T (SELECTQ (FFN-SYMB TERM) (IF (LIST (QUOTE *2*IF) (ONEIFY-TEST (FARGN TERM 1) TESTS) (ONEIFY (FARGN TERM 2) (ONEIFY-ASSUME-TRUE (FARGN TERM 1) TESTS)) (ONEIFY (FARGN TERM 3) (ONEIFY-ASSUME-FALSE (FARGN TERM 1) TESTS)))) (CONS (LIST (QUOTE CONS) (ONEIFY (FARGN TERM 1) TESTS) (ONEIFY (FARGN TERM 2) TESTS))) (CAR (COND ((IMPLIES? TESTS (FCONS-TERM* (QUOTE LISTP) (FARGN TERM 1))) (LIST (QUOTE CAR) (ONEIFY (FARGN TERM 1) TESTS))) (T (LIST (QUOTE *1*CAR) (ONEIFY (FARGN TERM 1) TESTS))))) (CDR (COND ((IMPLIES? TESTS (FCONS-TERM* (QUOTE LISTP) (FARGN TERM 1))) (LIST (QUOTE CDR) (ONEIFY (FARGN TERM 1) TESTS))) (T (LIST (QUOTE *1*CDR) (ONEIFY (FARGN TERM 1) TESTS))))) ((LISTP EQUAL) (LIST (QUOTE *2*IF) (ONEIFY-TEST TERM TESTS) (KWOTE *1*T) (KWOTE *1*F))) (CONS (PACK (LIST STRING-WEIRD (FFN-SYMB TERM))) (for ARG in (FARGS TERM) collect (ONEIFY ARG TESTS]) (ONEIFY-ASSUME-FALSE [LAMBDA (TEST TESTS) (* kbr: "19-Oct-85 16:31") (CONS (NEGATE-LIT TEST) TESTS]) (ONEIFY-ASSUME-TRUE [LAMBDA (TEST TESTS) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP TEST) (CONS TEST TESTS)) ((FQUOTEP TEST) (CONS TEST TESTS)) ((AND (EQ (FFN-SYMB TEST) (QUOTE IF)) (EQUAL (FARGN TEST 3) FALSE)) (ONEIFY-ASSUME-TRUE (FARGN TEST 1) (ONEIFY-ASSUME-TRUE (FARGN TEST 2) TESTS))) (T (CONS TEST TESTS]) (ONEIFY-TEST [LAMBDA (TERM TESTS) (* kbr: " 6-Jul-86 09:55") (COND ((VARIABLEP TERM) (LIST (QUOTE NEQ) TERM (QUOTE *1*F))) ((FQUOTEP TERM) (NOT (EQ (CADR TERM) *1*F))) (T (SELECTQ (FFN-SYMB TERM) (IF (LIST (QUOTE *2*IF) (ONEIFY-TEST (FARGN TERM 1) TESTS) (ONEIFY-TEST (FARGN TERM 2) (ONEIFY-ASSUME-TRUE (FARGN TERM 1) TESTS)) (ONEIFY-TEST (FARGN TERM 3) (ONEIFY-ASSUME-FALSE (FARGN TERM 1) TESTS)))) (LISTP (* We have to COPY the result of this SUB-PAIR so we do not have two EQ  occurrences of the arg in the X positions.  *) (COPY (SUB-PAIR (QUOTE (X *1*SHELL-QUOTE-MARK)) (LIST (ONEIFY (FARGN TERM 1) TESTS) (KWOTE *1*SHELL-QUOTE-MARK)) (QUOTE (*2*IF (LISTP X) (NEQ (CAR X) *1*SHELL-QUOTE-MARK) NIL))))) (EQUAL (COND ((AND (QUOTEP (FARGN TERM 1)) (LITATOM (CADR (FARGN TERM 1)))) (LIST (QUOTE EQ) (ONEIFY (FARGN TERM 2) TESTS) (FARGN TERM 1))) ((AND (QUOTEP (FARGN TERM 2)) (LITATOM (CADR (FARGN TERM 2)))) (LIST (QUOTE EQ) (ONEIFY (FARGN TERM 1) TESTS) (FARGN TERM 2))) (T (LIST (QUOTE EQUAL) (ONEIFY (FARGN TERM 1) TESTS) (ONEIFY (FARGN TERM 2) TESTS))))) (LIST (QUOTE NEQ) (ONEIFY TERM TESTS) (QUOTE *1*F]) (OPTIMIZE-COMMON-SUBTERMS [LAMBDA (FORM) (* kbr: "26-Oct-85 14:01") (PROG (SUBTERMS COMMONSUBTERMS PATHS DECISIONS OCC OCC1 OCC2 VAR-ALIST PARTI DOUBLE-TERMS NEW-FORM ISOLATED-CNT FIRST-CNT SECOND-CNT) (* We are interested in evaluating certain LISP FORMs that are constructed out  of variables (i.e., SYMBOLPS (none of which begin with 2)), objects of the form  (QUOTE ITIMES) and FORMs which are proper lists beginning with SYMBOLPs which  are either *2*IF or which have LAMBDA spread definitions.  *2*IF behaves as though it had the MACRO  ((X Y Z) (COND (X Y) (T Z)))%. We assume that no function associated with any  function symbol has any effect on the LISP state.  We assume that no variable is bound to the LITATOM *1*X.  We assume that there is no structure sharing among the non-QUOTE subexpressions  of FORM. Under these hypotheses, we generate and return a LISP form which when  evaluated returns the the same value as would be returned by evaluating FORM.  We intentionally ignore the fact that in LISP, if a variable is bound to  NOBIND, the evaluation of that variable causes an error.  This does not happened in compiled code.  *) (SETQ SUBTERMS (INTERESTING-SUBTERMS FORM)) (SETQ COMMONSUBTERMS (for TERM in SUBTERMS when (for TERM2 in SUBTERMS thereis (AND (NEQ TERM2 TERM) (EQUAL TERM2 TERM))) collect TERM)) (COND ((NULL COMMONSUBTERMS) (RETURN FORM))) (SETQ PARTI (PARTITION COMMONSUBTERMS)) (SETQ COMMONSUBTERMS (for PART in PARTI unless (for PART2 in PARTI thereis (PATH-POT-SUBSUMES PART2 PART)) join (APPEND PART NIL))) (SETQ PATHS (for P in (ALL-PATHS FORM) collect (REVERSE (CDR P)))) (* For each term that occurs more than once in FORM, we calculate just how that  occurrence occurs on the paths through the FORM.  Given a path, we say the term occurs ISOLATED if no other EQUAL term occurs on  the path. We say the term appears FIRST on the path if some EQUAL term follows  it but no EQUAL term precedes it. We say the term appears SECOND on the path if  it occurs on the path but the occurrence is not ISOLATED and is not FIRST,  i.e., there is some EQUAL term that has a preceding occurrence on the path.  *) (for TERM in COMMONSUBTERMS do (SETQ ISOLATED-CNT 0) (SETQ FIRST-CNT 0) (SETQ SECOND-CNT 0) (for PATH in PATHS when (SETQ OCC (MEMB TERM PATH)) do (SETQ OCC1 (MEMBER TERM PATH)) (SETQ OCC2 (MEMBER TERM (CDR OCC))) (COND ((AND (EQ OCC OCC1) (NULL OCC2)) (SETQ ISOLATED-CNT (ADD1 ISOLATED-CNT))) ((EQ OCC OCC1) (SETQ FIRST-CNT (ADD1 FIRST-CNT))) (T (SETQ SECOND-CNT (ADD1 SECOND-CNT))))) (* For each common subterm, we now decide what to replace the term with.  There are 5 alternatives. 1.0 (SET) Replace the term with  (SETQ (v term) term) where (v term) is a LITATOM beginning with 2 and such that  for all non-EQUAL common subterms s and t of FORM,  (v t) is not (v s)%. 2.0 (VAR) Replace term with  (v term)%. 3.0 (TEST) Replace term with (*2*IF  (EQ (v term) *1*X) term (v term))%. 4.0 (TEST-AND-SET) Replace term with  (*2*if (EQ (v term) *1*x) (SETQ (v term) term)  (v term))%. 5.0 Do nothing. *) (COND ((GREATERP FIRST-CNT 0) (COND ((GREATERP SECOND-CNT 0) (SETQ DECISIONS (CONS (CONS TERM (QUOTE TEST-AND-SET )) DECISIONS))) (T (SETQ DECISIONS (CONS (CONS TERM (QUOTE SET)) DECISIONS))))) ((GREATERP SECOND-CNT 0) (COND ((GREATERP ISOLATED-CNT 0) (SETQ DECISIONS (CONS (CONS TERM (QUOTE TEST)) DECISIONS))) (T (* This is the only decision that deserves serious consideration.  All of the other decisions obviously result in correct behavior.  Here, we know that the term always occurs second.  Thus we are guaranteed that on every path to term, an equal term will have  previously been evaluated. For each such path, some EQUAL term will have a  FIRST occurrence and every term that is ever first is always SET or  TEST-AND-SET. *) (SETQ DECISIONS (CONS (CONS TERM (QUOTE VAR)) DECISIONS))))) (T NIL))) (* We now construct a list of the common subterms, omitting EQUAL duplications.  We wish to associate a unique variable *2*TEMPi, for some i, with all EQUAL  common subterms. *) (SETQ DOUBLE-TERMS (for D in DECISIONS bind LOOP-ANS do (SETQ LOOP-ANS (ADD-TO-SET (CAR D) LOOP-ANS)) finally (RETURN LOOP-ANS))) (SETQ VAR-ALIST (for D in DOUBLE-TERMS as I from 1 collect (CONS D (PACK (CONS STRING-WEIRD2 (CONS (QUOTE TEMP) (UNPACK I))))))) (* Using DOUBLE-TERMS and VAR-ALIST,  COMMON-SWEEP now carries out the  DECISIONS. *) (SETQ NEW-FORM (COMMON-SWEEP FORM)) (RETURN (LIST (QUOTE LET) (for PAIR in VAR-ALIST collect (LIST (CDR PAIR) (QUOTE (QUOTE *1*X)))) NEW-FORM]) (PARTITION [LAMBDA (L) (* kbr: "19-Oct-85 16:31") (* Returns a list of lists. Each member of L is a MEMBer of exactly one the of  list of lists. Each MEMBer of each list is a MEMBer of L.  *) (LET (POT TEMP) (for L1 in L do (SETQ TEMP (SASSOC L1 POT)) (COND ((NULL TEMP) (SETQ POT (CONS (LIST L1) POT))) (T (NCONC1 TEMP L1)))) POT]) (PARTITION-CLAUSES [LAMBDA (LST) (* kbr: "20-Oct-85 19:37") (LET (ALIST FLG POCKETS N) (SETQ LST (for CL in LST collect (CONS NIL CL))) (for PAIR in LST do (for LIT in (CDR PAIR) do (SETQ FLG (BM-MATCH LIT (NOT LIT))) (SETQ TEMP-TEMP (SASSOC LIT ALIST)) (COND ((NULL TEMP-TEMP) (SETQ TEMP-TEMP (LIST LIT FLG PAIR)) (SETQ ALIST (CONS TEMP-TEMP ALIST))) ((EQUAL (CADR TEMP-TEMP) 0) NIL) ((NEQ FLG (CADR TEMP-TEMP)) (RPLACA (CDR TEMP-TEMP) 0)) (T (RPLACD (CDR TEMP-TEMP) (CONS PAIR (CDDR TEMP-TEMP))))))) (SETQ N (LENGTH LST)) (for PAIR in ALIST when (AND (NOT (EQUAL (CADR PAIR) 0)) (NOT (IEQP (LENGTH (CDDR PAIR)) N))) do (SETQ POCKETS (CONS (for PAIR in (CDDR PAIR) unless (CAR PAIR) collect (PROGN (RPLACA PAIR T) (CDR PAIR))) POCKETS))) (COND ((SETQ TEMP-TEMP (for PAIR in LST unless (CAR PAIR) collect (CDR PAIR))) (SETQ POCKETS (CONS TEMP-TEMP POCKETS)))) POCKETS]) (PATH-ADD-TO-SET [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (COND ((for Y1 in Y thereis (PATH-EQ X Y1)) Y) (T (CONS X Y]) (PATH-EQ [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (AND (IEQP (LENGTH X) (LENGTH Y)) (for X1 in X as Y1 in Y always (EQ X1 Y1]) (PATH-POT-SUBSUMES [LAMBDA (LARGER SMALLER) (* kbr: "19-Oct-85 16:31") (for I from 1 to (SUB1 (LENGTH (CAR LARGER))) thereis (for S in SMALLER always (for L in LARGER thereis (EQ S (FARGN L I]) (PATH-UNION [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (NCONC (for X1 in X unless (for Y1 in Y thereis (PATH-EQ X1 Y1)) collect X1) Y]) (PEGATE-LIT [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((FALSE-NONFALSEP TERM) (COND (DEFINITELY-FALSE FALSE) (T TRUE))) (T TERM]) (PETITIO-PRINCIPII [LAMBDA (EVENTS ALL-FLG FAILURE-ACTION DETACH-FLG DO-NOT-PRINT-FIRST-EVENT-FLG DO-NOT-PRINT-DATE-LINE-FLG) (* kbr: "19-Oct-85 16:31") (REDO-UNDONE-EVENTS (for X in EVENTS collect (COND ((EQ (CAR X) (QUOTE PROVE-LEMMA)) (LIST (QUOTE ADD-AXIOM) (CADR X) (CADDR X) (CADDDR X))) (T X))) ALL-FLG FAILURE-ACTION DETACH-FLG DO-NOT-PRINT-FIRST-EVENT-FLG DO-NOT-PRINT-DATE-LINE-FLG]) (PICK-HIGH-SCORES [LAMBDA (CANDLST) (* kbr: "19-Oct-85 16:31") (* Returns the list of elements of  CAND-LIST tied for the highest CAR.  *) (MAXIMAL-ELEMENTS CANDLST (FUNCTION (LAMBDA (CAND) (fetch (CANDIDATE SCORE) of CAND]) (PIGEON-HOLE [LAMBDA (PIGEONS HOLES FN DO-NOT-CROWD-FLG DO-NOT-SMASH-FLG) (* kbr: "19-Oct-85 16:31") (LET (PAIRLST) (SETQ PAIRLST (for X in HOLES collect (CONS NIL X))) (COND ((PIGEON-HOLE1 PIGEONS PAIRLST FN DO-NOT-CROWD-FLG DO-NOT-SMASH-FLG) (COND (DO-NOT-SMASH-FLG HOLES) (T (for PAIR in PAIRLST collect (CDR PAIR))))) (T NIL]) (PIGEON-HOLE-IN-ALL-POSSIBLE-WAYS [LAMBDA (PIGEONS HOLES FN DO-NOT-CROWD-FLG) (* kbr: "20-Oct-85 19:25") (LET (ANS POT X) (COND ((for PIGEON in PIGEONS always (PROGN (SETQ POT (for HOLE in HOLES when (SETQ X (APPLY* FN PIGEON HOLE)) collect (CONS HOLE X))) (COND (POT (SETQ ANS (NCONC1 ANS POT))) (T NIL)))) (COND ((AND DO-NOT-CROWD-FLG (NOT (NO-CROWDINGP ANS [FUNCTION (LAMBDA (X Y) (EQ (CAR X) (CAR Y] NIL))) NIL) (T (UNION-EQUAL (for X in ANS join (for Y in X collect (CDR Y))) (for HOLE in HOLES unless (for X in ANS thereis (ASSOC HOLE X)) collect HOLE))))) (T NIL]) (PIGEON-HOLE1 [LAMBDA (PIGEONS PAIRLST FN DO-NOT-CROWD-FLG DO-NOT-SMASH-FLG) (* kbr: "19-Oct-85 16:31") (LET (TEMP OLD-FLG OLD-HOLE) (COND ((NULL PIGEONS) T) ((for PAIR in PAIRLST unless (AND DO-NOT-CROWD-FLG (CAR PAIR)) thereis (COND ((SETQ TEMP (APPLY* FN (CAR PIGEONS) (CDR PAIR))) (SETQ OLD-FLG (CAR PAIR)) (SETQ OLD-HOLE (CDR PAIR)) (OR DO-NOT-SMASH-FLG (RPLACD PAIR TEMP)) (RPLACA PAIR T) (COND ((PIGEON-HOLE1 (CDR PIGEONS) PAIRLST FN DO-NOT-CROWD-FLG DO-NOT-SMASH-FLG) T) (T (RPLACD PAIR OLD-HOLE) (RPLACA PAIR OLD-FLG) NIL))) (T NIL))) T) (T NIL]) (PLUSJOIN [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (COND ((NULL LST) (QUOTE (ZERO))) ((NULL (CDR LST)) (CAR LST)) (T (FCONS-TERM* (QUOTE PLUS) (CAR LST) (PLUSJOIN (CDR LST]) (POLY-MEMBER [LAMBDA (POLY LST) (* kbr: "19-Oct-85 16:31") (for POLY2 in LST thereis (AND (EQUAL (fetch (POLY CONSTANT) of POLY) (fetch (POLY CONSTANT) of POLY2)) (EQUAL (fetch (POLY ALIST) of POLY) (fetch (POLY ALIST) of POLY2]) (POP-CLAUSE-SET [LAMBDA NIL (* kbr: "20-Apr-86 18:42") (PROG (CL-SET TEMP) TOP (COND ((NULL STACK) (WRAPUP T)) ((EQ (CAAR STACK) (QUOTE BEING-PROVED)) (SETQ TEMP (CADR (CAR STACK))) (SETQ STACK (CDR STACK)) (IO (QUOTE POP) TEMP NIL NIL (LIST (GET-STACK-NAME STACK))) (GO TOP)) (T (SETQ CL-SET (CADR (CAR STACK))) (SETQ STACK (CDR STACK)))) (COND ((for STACK-TAIL on STACK do (COND ((for CL2 in CL-SET always (for CL1 in (CADR (CAR STACK-TAIL)) thereis (SUBSUMES CL1 CL2))) (COND ((EQ (CAR (CAR STACK-TAIL)) (QUOTE BEING-PROVED)) (IO (QUOTE SUBSUMED-BY-PARENT) CL-SET NIL NIL (LIST (GET-STACK-NAME STACK) (GET-STACK-NAME (CDR STACK-TAIL)) (CADR (CAR STACK-TAIL)))) (WRAPUP NIL)) (T (IO (QUOTE SUBSUMED-BELOW) CL-SET NIL NIL (LIST (GET-STACK-NAME STACK) (GET-STACK-NAME (CDR STACK-TAIL)) (CADR (CAR STACK-TAIL))) ) (GO TOP)))))) (GO TOP))) (SETQ STACK (CONS (LIST (QUOTE BEING-PROVED) CL-SET) STACK)) (RETURN CL-SET]) (POP-LEMMA-FRAME [LAMBDA NIL (* kbr: "19-Oct-85 22:23") (PROG1 (CAR LEMMA-STACK) (COND ((NULL LEMMA-STACK) (ERROR1 (PQUOTE (PROGN LEMMA-STACK IS TOO POOPED TO POP !)) NIL (QUOTE HARD))) (T (SETQ LEMMA-STACK (CDR LEMMA-STACK]) (POP-LINEARIZE-ASSUMPTIONS-FRAME [LAMBDA NIL (* kbr: "19-Oct-85 22:02") (PROG1 (CAR LINEARIZE-ASSUMPTIONS-STACK) (COND ((NULL LINEARIZE-ASSUMPTIONS-STACK) (ERROR1 (PQUOTE (PROGN LINEARIZE-ASSUMPTIONS-STACK IS TOO POOPED TO POP !)) NIL (QUOTE HARD))) (T (SETQ LINEARIZE-ASSUMPTIONS-STACK (CDR LINEARIZE-ASSUMPTIONS-STACK]) (POPU [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (SETQ UNDONE-EVENTS (CAR UNDONE-EVENTS-STACK)) (SETQ UNDONE-EVENTS-STACK (CDR UNDONE-EVENTS-STACK)) UNDONE-EVENTS]) (POSSIBLE-IND-PRINCIPLES [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* TERM is a non-QUOTE fn call and this fn returns all the induction principles  suggested by it. See FLESH-OUT-IND-PRIN for the form of an induction prin.  *) (LET (MACHINE FORMALS QUICK-BLOCK-INFO MASK) (SETQ FORMALS (CADR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN)))) (SETQ QUICK-BLOCK-INFO (GETPROP (FFN-SYMB TERM) (QUOTE QUICK-BLOCK-INFO))) (SETQ MACHINE (GETPROP (FFN-SYMB TERM) (QUOTE INDUCTION-MACHINE))) (COND ((DISABLEDP (FFN-SYMB TERM)) NIL) (T (for J in (GETPROP (FFN-SYMB TERM) (QUOTE JUSTIFICATIONS)) when (SETQ MASK (SOUND-IND-PRIN-MASK TERM J FORMALS QUICK-BLOCK-INFO)) collect (FLESH-OUT-IND-PRIN TERM FORMALS MACHINE J MASK QUICK-BLOCK-INFO]) (POSSIBLY-NUMERIC [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET ((TYPE-ALIST (OR HEURISTIC-TYPE-ALIST TYPE-ALIST))) (IEQP (TYPE-SET TERM) TYPE-SET-NUMBERS]) (POWER-EVAL [LAMBDA (L B) (* kbr: "25-Oct-85 18:13") (COND ((NLISTP L) 0) (T (PLUS (CAR L) (TIMES B (POWER-EVAL (CDR L) B]) (POWER-REP [LAMBDA (N B) (* kbr: "19-Oct-85 16:31") (COND ((LESSP N B) (LIST N)) (T (CONS (REMAINDER N B) (POWER-REP (QUOTIENT N B) B]) (PPC [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (BM-PPR (PRETTYIFY-CLAUSE CL) NIL) NIL]) (PPE [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (PPE-LST (LIST X]) (PPE-LST [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (for NAME in X do (ITERPRI NIL) (BM-PPR (OR (GETPROP NAME (QUOTE EVENT)) (AND (GETPROP NAME (QUOTE MAIN-EVENT)) (LIST (QUOTE *****) NAME (QUOTE IS) (QUOTE A) (QUOTE SATELLITE) (QUOTE OF) (GETPROP (GETPROP NAME (QUOTE MAIN-EVENT)) (QUOTE EVENT)))) (CONS (QUOTE *****) (CONS NAME (QUOTE (IS NEITHER AN EVENT NOR SATELLITE))))) NIL) (ITERPRI NIL]) (BM-PPR [LAMBDA (FMLA PPRFILE) (* kbr: "19-Oct-85 16:31") (LET (LEFTMARGINCHAR) (PPRIND FMLA 0 0 PPR-MACRO-LST PPRFILE) NIL]) (PPRINDENT [LAMBDA (TERM LEFTMARGIN RPARCNT FILE) (* kbr: "19-Oct-85 16:31") (COND ((IGREATERP (IPOSITION FILE NIL NIL) LEFTMARGIN) (ITERPRISPACES LEFTMARGIN FILE)) (T (TABULATE LEFTMARGIN FILE))) (PPRIND TERM LEFTMARGIN (OR RPARCNT 0) PPR-MACRO-LST FILE]) (PPSD [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (PPSD-LST (LIST X]) (PPSD-LST [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (for FNNAME in X do (BM-PPR (LIST FNNAME (OR (GETPROP FNNAME (QUOTE SDEFN)) (QUOTE UNDEFINED))) NIL) (ITERPRI NIL) (ITERPRI NIL]) (PREPROCESS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* Returns a set of clauses whose conjunction is equivalent to TERM and sets  ABBREVIATIONS-USED to the list of fn symbols and rewrite rules applied.  *) (LET (TYPE-ALIST) (SETQ ABBREVIATIONS-USED NIL) (CLAUSIFY-INPUT (EXPAND-ABBREVIATIONS TERM NIL]) (PREPROCESS-HYPS [LAMBDA (HYPS) (* kbr: "19-Oct-85 20:11") (* Expand NLISTP and NOT ZEROP hyps.  *) (for HYP in HYPS bind X join (COND ((BM-MATCH HYP (NOT (ZEROP X))) (LIST (FCONS-TERM* (QUOTE NUMBERP) X) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE EQUAL) X ZERO)))) ((BM-MATCH HYP (NLISTP X)) (LIST (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE LISTP) X)))) (T (LIST HYP]) (PRETTYIFY-CLAUSE [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (COND ((NULL CL) FALSE) ((NULL (CDR CL)) (CAR CL)) ((NULL (CDDR CL)) (LIST (QUOTE IMPLIES) (DUMB-NEGATE-LIT (CAR CL)) (CADR CL))) (T (LIST (QUOTE IMPLIES) (CONS (QUOTE AND) (for TAIL on CL unless (NULL (CDR TAIL)) collect (DUMB-NEGATE-LIT (CAR TAIL)))) (CAR (LAST CL]) (PRETTYIFY-LISP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (REMOVE-*2*IFS (INTRODUCE-ANDS (INTRODUCE-LISTS X]) (PRIMITIVE-RECURSIVEP [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (LET (FORMALS) (SETQ FORMALS (CADR (GETPROP FNNAME (QUOTE SDEFN)))) (COND ((DISABLEDP FNNAME) T) (T (for X in (GETPROP FNNAME (QUOTE INDUCTION-MACHINE)) always (for CASE in (fetch (TESTS-AND-CASES CASES) of X) always (for VAR in FORMALS as TERM in CASE always (SHELL-DESTRUCTOR-NESTP VAR TERM]) (PRIMITIVEP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (OR (VARIABLEP TERM) (FQUOTEP TERM) (AND (OR (NULL (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN))) (DISABLEDP (FFN-SYMB TERM)) (EQ (FFN-SYMB TERM) (QUOTE NOT))) (for ARG in (FARGS TERM) always (PRIMITIVEP ARG]) (PRINT-STACK [LAMBDA (Y) (* kbr: "19-Oct-85 16:31") (for X on Y by (QUOTE CADR) do (IPRINT (CAR X) T]) (PRINT-STATS [LAMBDA (ELAPSED IO FILE) (* kbr: "22-Oct-85 16:20") (ITERPRI FILE) (IPRINC "(" FILE) (ISPACES 1 FILE) (IPRINC ELAPSED FILE) (ISPACES 1 FILE) (IPRINC IO FILE) (ISPACES 1 FILE) (IPRINC ")" FILE]) (PRINT-TO-DISPLAY [LAMBDA (MSG1 MSG2 MSG3) (* kbr: "20-Oct-85 17:24") (COND ((NULL LEMMA-DISPLAY-FLG)) ((EQ LEMMA-DISPLAY-FLG (QUOTE MODEL33)) (for I from 1 to (SUB1 (STACK-DEPTH LEMMA-STACK)) do (* STACK-DEPTH starts at 1 and we want 0 leading chars at first.  In LEMMA-DISPLAY mode T we use STACK-DEPTH because lines on the screen are  numbered from 1.0 The CONSTANT below is just vertical bar, but if typed  explicitly it is brought up from emacs incorrectly.  *) (IPRINC "/" T)) (IPRINC "*" T) (IPRINC MSG1 T) (COND (MSG2 (ISPACES 1 T) (IPRINC MSG2 T))) (COND (MSG3 (IPRINC MSG3 T))) (ITERPRI T)) (T (PUT-CURSOR 1 (STACK-DEPTH LEMMA-STACK)) (ERASE-EOP) (IPRINC MSG1 T) (COND (MSG2 (ISPACES 1 T) (IPRINC MSG2 T))) (COND (MSG3 (IPRINC MSG3 T]) (PROCESS-EQUATIONAL-POLYS [LAMBDA (CL HIST POT-LST) (* kbr: "19-Oct-85 16:31") (* Deduce from POT-LST all the interesting equations in it and add them to CL  unless they have already been generated and recorded in HIST.  This function has no effect on the lemma and assumptions stacks but sets the  globals LEMMAS-USED-BY-LINEAR and LINEAR-ASSUMPTIONS if it changes CL.  When it adds an equation to CL it adds an entry to LEMMAS-USED-BY-LINEAR that  will ultimately be copied into the new hist for the clause.  The entry is of the form ((FIND-EQUATIONAL-POLYS lhs)) --  the apparently redundant level of parens is there to insure that the element  cannot be confused with a term. Thus, when it is thrown into the list  PROCESS-HIST with lemma names and literals used, we can filter out the  literals. SIMPLIFY-CLAUSE handles this filtering above us.  FIND-EQUATIONAL-POLY is the function that adds such entries to  LEMMAS-USED-BY-LINEAR and that looks for them in the HIST.  *) (SETQ LEMMAS-USED-BY-LINEAR NIL) (SETQ LINEAR-ASSUMPTIONS NIL) (for POT in POT-LST bind PAIR when (SETQ PAIR (FIND-EQUATIONAL-POLY HIST POT)) do (* When FIND-EQUATIONAL-POLY returns  nonNIL it side-effects the two global  collection sites above.  *) (SETQ CL (COND ((AND (VARIABLEP (CAR PAIR)) (NOT (OCCUR (CAR PAIR) (CDR PAIR)))) (SUBST-VAR-LST (CDR PAIR) (CAR PAIR) CL)) ((AND (VARIABLEP (CDR PAIR)) (NOT (OCCUR (CDR PAIR) (CAR PAIR)))) (SUBST-VAR-LST (CAR PAIR) (CDR PAIR) CL)) (T (CONS (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE EQUAL) (CAR PAIR) (CDR PAIR))) (SUBST-EXPR-LST (CDR PAIR) (CAR PAIR) CL)))))) CL]) (PROPERTYLESS-SYMBOLP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (OR (CAR-CDRP X) (MEMB X (QUOTE (NIL QUOTE LIST T F]) (PROVE [LAMBDA (FORM) (* kbr: " 6-Jul-86 09:44") (PROG (THM CLAUSES VARS) (SETQ THM (TRANSLATE FORM)) (SETQ CLAUSES (PREPROCESS THM)) (SETUP FORM CLAUSES ABBREVIATIONS-USED) (* Basic control loop of the Boyer  Moore theorem prover is to simplify  the clause set, induct, repeat again.  *) LOOP (SETQ VARS (for CL in CLAUSES bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (ALL-VARS-LST CL) LOOP-ANS)) finally (RETURN LOOP-ANS))) (SETQ ELIM-VARIABLE-NAMES1 (SET-DIFF ELIM-VARIABLE-NAMES VARS)) (SETQ GEN-VARIABLE-NAMES1 (SET-DIFF GEN-VARIABLE-NAMES VARS)) (* Simplification = Simplify, Settle  Down, Eliminate Destructors,  Fertilize, Generalize, Eliminate  Irrelevance *) (SIMPLIFY-LOOP CLAUSES) (* Induction *) (SETQ CLAUSES (INDUCT (POP-CLAUSE-SET))) (GO LOOP]) (PROVE-TERMINATION [LAMBDA (FORMALS RM MACHINE) (* kbr: "19-Oct-85 16:31") (SETQ PROVE-TERMINATION-LEMMAS-USED NIL) (for X in MACHINE always (COND ((AND (SIMPLIFY-CLAUSE-MAXIMALLY (NCONC1 (for H in (fetch (TESTS-AND-CASE TESTS) of X) collect (NEGATE-LIT H)) (CONS-TERM (CAR RM) (LIST (SUB-PAIR-VAR FORMALS (fetch ( TESTS-AND-CASE CASE) of X) (CADR RM)) (CADR RM))))) (NULL PROCESS-CLAUSES)) (SETQ PROVE-TERMINATION-LEMMAS-USED (UNION-EQUAL PROCESS-HIST PROVE-TERMINATION-LEMMAS-USED )) T) (T NIL]) (PROVEALL [LAMBDA (EVENT-LST DETACH-FLG FILENAME) (* kbr: "24-Oct-85 17:19") DETACH-FLG (SETQ FAILED-THMS NIL) (SETQ MASTER-ROOT-NAME (OR FILENAME (QUOTE PROVEALL))) (SETQ PROVE-FILE (AND NIL (OPENSTREAM (EXTEND-FILE-NAME MASTER-ROOT-NAME (QUOTE PROOFS)) (QUOTE OUTPUT)))) (SETQ TTY-FILE (AND NIL (OPENSTREAM (EXTEND-FILE-NAME MASTER-ROOT-NAME (QUOTE TTY)) (QUOTE OUTPUT)))) (REDO-UNDONE-EVENTS EVENT-LST T (QUOTE A) DETACH-FLG NIL NIL) (MAKE-LIB MASTER-ROOT-NAME]) (PUSH-CLAUSE-SET [LAMBDA (CL-SET) (* kbr: "19-Oct-85 16:31") (SETQ STACK (CONS (LIST (QUOTE TO-BE-PROVED) CL-SET) STACK]) (PUSH-LEMMA [LAMBDA (ELE) (* kbr: "19-Oct-85 16:31") (COND ((MEMB ELE (CAR LEMMA-STACK)) NIL) (T (RPLACA LEMMA-STACK (CONS ELE (CAR LEMMA-STACK))) NIL]) (PUSH-LEMMA-FRAME [LAMBDA NIL (* kbr: "19-Oct-85 22:23") (SETQ LEMMA-STACK (CONS NIL LEMMA-STACK)) NIL]) (PUSH-LINEARIZE-ASSUMPTION [LAMBDA (ELE) (* kbr: "19-Oct-85 16:31") (RPLACA LINEARIZE-ASSUMPTIONS-STACK (ADD-TO-SET ELE (CAR LINEARIZE-ASSUMPTIONS-STACK))) NIL]) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME [LAMBDA NIL (* kbr: "19-Oct-85 22:00") (SETQ LINEARIZE-ASSUMPTIONS-STACK (CONS NIL LINEARIZE-ASSUMPTIONS-STACK)) NIL]) (PUSHU [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (SETQ UNDONE-EVENTS-STACK (CONS UNDONE-EVENTS UNDONE-EVENTS-STACK)) (SETQ UNDONE-EVENTS NIL]) (PUT-CURSOR [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (CURSORPOS Y X]) (PUT-INDUCTION-INFO [LAMBDA (FNNAME FORMALS BODY RELATION-MEASURE-LST TAK0) (* kbr: "19-Oct-85 16:31") (* If FNNAME is recursive we store JUSTIFICATIONS, INDUCTION-MACHINE, and  QUICK-BLOCK-INFO properties. If only one JUSTIFICATION is stored and in it the  RELATION is NIL then we did not establish termination.  ALL-LEMMAS-USED is side-effected to contain lemma names used to clean up the  INDUCTION-MACHINE. If TAK0 is nonNIL, then we are considering a reflexive  definition. (tak0) IEQP body is allegedly the justifying lemma for the  definition (fnname) IEQP body', where body' results from replacing all calls of  tak0 with fnname. *) (PROG (T-MACHINE I-MACHINE) (SETQ T-MACHINE (TERMINATION-MACHINE (OR TAK0 FNNAME) BODY NIL)) (COND ((NULL T-MACHINE) (SETQ ALL-LEMMAS-USED NIL) (RETURN NIL))) (OR RELATION-MEASURE-LST (SETQ RELATION-MEASURE-LST (GUESS-RELATION-MEASURE-LST FORMALS T-MACHINE))) (ADD-FACT FNNAME (QUOTE JUSTIFICATIONS) (OR (for RM in RELATION-MEASURE-LST when (PROVE-TERMINATION FORMALS RM T-MACHINE) collect (create JUSTIFICATION SUBSET _ (ALL-VARS (CADR RM)) MEASURE-TERM _ (CADR RM) RELATION _ (CAR RM) LEMMAS _ PROVE-TERMINATION-LEMMAS-USED)) (LIST (create JUSTIFICATION SUBSET _ FORMALS)))) (SETQ ALL-LEMMAS-USED NIL) (* We set ALL-LEMMAS-USED to NIL to forget the lemmas put there by PROVE so we  can now accumulate the lemmas used by REMOVE-REDUNDANT-TESTS in  INDUCTION-MACHINE. *) (SETQ I-MACHINE (INDUCTION-MACHINE FNNAME (COND (TAK0 (SUBST-FN FNNAME TAK0 BODY)) (T BODY)) NIL)) (ADD-FACT FNNAME (QUOTE INDUCTION-MACHINE) I-MACHINE) (ADD-FACT FNNAME (QUOTE QUICK-BLOCK-INFO) (QUICK-BLOCK-INFO FORMALS I-MACHINE)) (RETURN NIL]) (PUT-LEVEL-NO [LAMBDA (FNNAME) (* kbr: "24-Oct-85 15:48") (LET (BODY MAX) (SETQ BODY (CADDR (GETPROP FNNAME (QUOTE SDEFN)))) (SETQ MAX 0) (for FN in (ALL-FNNAMES BODY) when (NEQ FN FNNAME) do (SETQ MAX (IMAX (GET-LEVEL-NO FN) MAX))) (ADD-FACT FNNAME (QUOTE LEVEL-NO) (COND ((FNNAMEP FNNAME BODY) (ADD1 MAX)) (T MAX]) (PUT-TYPE-PRESCRIPTION [LAMBDA (NAME) (* kbr: "20-Apr-86 18:34") (* THIS FUNCTION WILL BE COMPLETELY UNSOUND IF TYPE-SET IS EVER REACHABLE FROM  WITHIN IT. IN PARTICULAR, BOTH THE TYPE-ALIST AND THE TYPE-PRESCRIPTION FOR THE  FN BEING PROCESSED ARE SET TO ONLY PARTIALLY ACCURATE VALUES AS THIS FN  COMPUTES THE REAL TYPE-SET. *) (PROG (OLD-TYPE-PRESCRIPTION NEW-TYPE-PRESCRIPTION BODY FORMALS TYPE-ALIST ANS TEMP) (SETQ BODY (GETPROP NAME (QUOTE SDEFN))) (SETQ FORMALS (CADR BODY)) (SETQ BODY (CADDR BODY)) (SETQ TYPE-ALIST (for ARG in FORMALS collect (CONS ARG (CONS 0 (LIST ARG))))) (SETQ OLD-TYPE-PRESCRIPTION (CONS 0 (for ARG in FORMALS collect NIL))) (ADD-FACT NAME (QUOTE TYPE-PRESCRIPTION-LST) (CONS NAME OLD-TYPE-PRESCRIPTION)) LOOP (RPLACD (CAR (SETQ TEMP (GETPROP NAME (QUOTE TYPE-PRESCRIPTION-LST)))) OLD-TYPE-PRESCRIPTION) (* It is very unusual to be mucking about with RPLACDs on data that is part of  the event level abstraction. But by virtue of the fact that we know what the  abstraction is and how it works -- i.e., by violating the abstraction! --  we know what we're doing here. The TYPE-PRESCRIPTION-LST at this moment is a  singleton list containing just the CONS added above.  The CAR of that CONS is the name of the event that gave rise to the type  prescription and the CDR is the type prescription.  The RPLACD above smashes the type prescription in the CDR to a new that  includes all the information contained in the current guess.  The fundamental difficulty with destructively changing event level data arises  because the ADD-SUB-FACT mechanism stores certain undo information about each  added fact, and if you change the data without being aware of that, you might  make the data inconsistent with the undoing information about it.  But we know that all ADD-SUB-FACT stores in this case is the name of the lemma,  that is, the CAR of the TYPE-PRESCRIPTION-NAME-AND-PAIR, and so by smashing the  CDR we're consistently fooling it. *) (PUTPROP NAME (QUOTE TYPE-PRESCRIPTION-LST) TEMP) (* Why do we both RPLACD the structure on the property list AND do the PUTPROP?  The answer is that we are afraid that someday perhaps we will permit a SWAPOUT  to occur anytime. Note that if that happened after we did the GETPROP but  before the RPLACD happened we would lose.  *) (SETQ ANS (DEFN-TYPE-SET BODY)) (SETQ NEW-TYPE-PRESCRIPTION (CONS (CAR ANS) (for ARG in FORMALS collect (COND ((MEMB ARG (CDR ANS)) T) (T NIL))))) (COND ((EQUAL OLD-TYPE-PRESCRIPTION NEW-TYPE-PRESCRIPTION) (RETURN NIL)) ((AND (LOGSUBSETP (CAR NEW-TYPE-PRESCRIPTION) (CAR OLD-TYPE-PRESCRIPTION)) (for FLG1 in (CDR NEW-TYPE-PRESCRIPTION) as FLG2 in (CDR OLD-TYPE-PRESCRIPTION) always (OR (NOT FLG1) FLG2))) (ERROR1 (PQUOTE (PROGN AN UNEXPECTED SITUATION HAS ARISEN ! THE DEFN-TYPE-SET ITERATION STOPPED BECAUSE OF A PROPER SUBSET CHECK RATHER THAN THE EQUALITY OF THE OLD AND NEW TYPE SETS %.)) NIL (QUOTE WARNING)) (RETURN NIL))) (SETQ OLD-TYPE-PRESCRIPTION (CONS (LOGOR (CAR OLD-TYPE-PRESCRIPTION) (CAR NEW-TYPE-PRESCRIPTION)) (for FLG1 in (CDR OLD-TYPE-PRESCRIPTION) as FLG2 in (CDR NEW-TYPE-PRESCRIPTION) collect (OR FLG1 FLG2)))) (GO LOOP]) (PUT0 [LAMBDA (ATM PROP VAL HIGHER-PROPS) (* kbr: "19-Oct-85 16:31") (* This function is conceptually hidden from the user of the lib file package.  It may be called internally provided ATM is known to be in the PROP-HASH-ARRAY  already. HIGHER-PROPS is the list of properties with higher priority than this  one. If it is NIL this function assumes that it hasn't been computed by the  caller and computes it. If the computation returns NIL, then PROP is not a  member of LIB-PROPS and an error is caused.  The reason this function does not just have three args and always compute  HIGHER-PROPS -- rather than allowing the caller to do it but not believing the  caller when he says NIL -- is that the main use of PUT0 is from PUT1, who must  decide whether PROP is a member of LIB-PROPS before updating the hash array for  ATM. So this implementation allows PUT1 to pass its answer down rather than  require PUT0 to do the work again. At the moment, the only other calls of PUT0  do not bother to compute HIGHER-PROPS and just let PUT0 do it.  But even if they did, and computed NIL, and did not check it but forced PUT0 to  compute the NIL again, the time wasted is not important since we're going to  then cause an error anyway. *) (OR HIGHER-PROPS (SETQ HIGHER-PROPS (MEMB PROP LIB-PROPS)) (ERROR1 (PQUOTE (PROGN ATTEMPT TO PUT1 THE NON-LIB-PROPS PROPERTY (!PPR PROP NIL) %.)) (BINDINGS (QUOTE PROP) PROP) (QUOTE HARD))) (SETPROPLIST ATM (PUT00 (GETPROPLIST ATM) PROP VAL)) VAL]) (PUT00 [LAMBDA (TAIL PROP VAL) (* kbr: "19-Oct-85 16:31") (COND ((NULL TAIL) (LIST PROP VAL)) ((EQ PROP (CAR TAIL)) (RPLACA (CDR TAIL) VAL) TAIL) ((MEMB (CAR TAIL) HIGHER-PROPS) (COND ((CDDR TAIL) (RPLACD (CDR TAIL) (PUT00 (CDDR TAIL) PROP VAL)) TAIL) (T (NCONC TAIL (LIST PROP VAL))))) (T (CONS PROP (CONS VAL TAIL]) (PUT1 [LAMBDA (ATM VAL PROP) (* kbr: "19-Oct-85 16:31") (* Like PUTPROP except keeps the properties in the order specified by  LIB-PROPS, causing an error if PROP is not on LIB-PROPS, and insures that ATM  is a memb of LIB-ATOMS-WITH-PROPS *) (LET (HIGHER-PROPS) (COND ((NOT (BOUNDP (QUOTE LIB-PROPS))) (ERROR1 (PQUOTE (PROGN THEOREM PROVER NOT INITIALIZED %.)) NIL (QUOTE HARD))) ((NULL (SETQ HIGHER-PROPS (MEMB PROP LIB-PROPS))) (ERROR1 (PQUOTE (PROGN ATTEMPT TO USE PUT1 TO STORE THE NON-LIB-PROPS PROPERTY (!PPR PROP NIL) %.)) (BINDINGS (QUOTE PROP) PROP) (QUOTE HARD))) ((NOT (MEMB ATM LIB-ATOMS-WITH-PROPS)) (SETQ LIB-ATOMS-WITH-PROPS (CONS ATM LIB-ATOMS-WITH-PROPS)))) (PUT0 ATM PROP VAL HIGHER-PROPS]) (PUT1-LST [LAMBDA (ATM PROPS) (* kbr: "19-Oct-85 16:31") (* PROPS is a list of the form (prop1 val1 prop2 val2 ...)%.  This function is equivalent to doing (PUT1 ATM vali propi) for each i, but is  faster. *) (SETPROPLIST ATM (APPEND PROPS (GETPROPLIST ATM]) (PUTD1 [LAMBDA (ATM EXPR) (* kbr: "26-Oct-85 13:52") (* If EXPR is NIL, remove ATM from LIB-ATOMS-WITH-DEFS and erase its function  definition and EXPR property. If EXPR is non-NIL, add ATM to  LIB-ATOMS-WITH-DEFS, make the compiled version of EXPR be the definition of  ATM, and store EXPR under the EXPR prop.  *) (COND ((NULL EXPR) (SETQ LIB-ATOMS-WITH-DEFS (DREMOVE ATM LIB-ATOMS-WITH-DEFS)) (KILL-DEFINITION ATM)) (T (SETQ LIB-ATOMS-WITH-DEFS (CONS ATM LIB-ATOMS-WITH-DEFS)) (STORE-DEFINITION ATM EXPR]) (QUICK-BLOCK-INFO [LAMBDA (FORMALS TESTS-AND-CASES-LST) (* kbr: "19-Oct-85 16:31") (* Return a list of SELF-REFLEXIVE, or QUESTIONABLE, indicating how the  corresponding arg position is changed in the calls enumerated.  This is used to help quickly decide if a blocked formal can be tolerated in  induction. *) (LET (BLOCK-TYPES) (SETQ BLOCK-TYPES (for VAR in FORMALS collect (QUOTE UN-INITIALIZED))) (for TESTS-AND-CASES in TESTS-AND-CASES-LST do (for CASE in (fetch (TESTS-AND-CASES CASES) of TESTS-AND-CASES) do (for VAR in FORMALS as ARG in CASE as TAIL on BLOCK-TYPES do (SELECTQ (CAR TAIL) (QUESTIONABLE NIL) (UN-INITIALIZED (RPLACA TAIL (QUICK-BLOCK-INFO1 VAR ARG))) (OR (EQ (CAR TAIL) (QUICK-BLOCK-INFO1 VAR ARG)) (RPLACA TAIL (QUOTE QUESTIONABLE))))))) BLOCK-TYPES]) (QUICK-BLOCK-INFO1 [LAMBDA (VAR TERM) (* kbr: "19-Oct-85 16:31") (COND ((EQ VAR TERM) (QUOTE UNCHANGING)) ((OCCUR VAR TERM) (QUOTE SELF-REFLEXIVE)) (T (QUOTE QUESTIONABLE]) (QUICK-WORSE-THAN [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM2) (COND ((EQ TERM1 TERM2) NIL) (T (OCCUR TERM2 TERM1)))) ((FQUOTEP TERM2) (COND ((VARIABLEP TERM1) T) ((FQUOTEP TERM1) (GREATERP (FORM-COUNT-EVG (CADR TERM1)) (FORM-COUNT-EVG (CADR TERM2)))) (T T))) ((VARIABLEP TERM1) NIL) ((FQUOTEP TERM1) NIL) ((EQ (FFN-SYMB TERM1) (FFN-SYMB TERM2)) (COND ((EQUAL TERM1 TERM2) NIL) ((for ARG1 in (FARGS TERM1) as ARG2 in (FARGS TERM2) thereis (OR (AND (OR (VARIABLEP ARG1) (VALUEP ARG1)) (NOT (OR (VARIABLEP ARG2) (VALUEP ARG2)))) (WORSE-THAN ARG2 ARG1))) NIL) (T (for ARG1 in (FARGS TERM1) as ARG2 in (FARGS TERM2) thereis (WORSE-THAN ARG1 ARG2))))) (T NIL]) (R [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (COND ((NOT (ERRSET (SETQ FORM (TRANSLATE FORM)))) NIL) ((EQ (SETQ TEMP-TEMP (BM-REDUCE FORM R-ALIST)) (QUOTE *1*FAILED)) (QUOTE (NOT REDUCIBLE))) (T (EXPAND-PPR-MACROS TEMP-TEMP]) (REDO! [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (REDO-UNDONE-EVENTS (UNDO-NAME NAME) T (QUOTE C) NIL T T]) (REDO-UNDONE-EVENTS [LAMBDA (EVENTS ALL-FLG FAILURE-ACTION DETACH-FLG DO-NOT-PRINT-FIRST-EVENT-FLG DO-NOT-PRINT-DATE-LINE-FLG) (* kbr: " 6-Jul-86 09:48") (COND (IN-REDO-UNDONE-EVENTS-FLG (ERROR1 (PQUOTE (PROGN IT IS ILLEGAL TO ENTER A THEOREM PROVER FUNCTION WHILE YOU ARE RECURSIVELY UNDER ANOTHER THEOREM PROVER FUNCTION %.)) NIL (QUOTE HARD)))) (LET (ANS ANSLST FORM (IN-REDO-UNDONE-EVENTS-FLG T)) (PROG NIL (OR FAILURE-ACTION (SETQ FAILURE-ACTION (QUOTE Q))) (COND ((NOT (OPENP TTY-FILE)) (SETQ TTY-FILE NIL))) (COND ((NOT (OPENP PROVE-FILE)) (SETQ PROVE-FILE NIL))) (PREPARE-FOR-THE-NIGHT) (COND (DETACH-FLG (SETQ ALL-FLG T) (DETACH))) (SETQ UNDONE-EVENTS EVENTS) (COND ((NOT DO-NOT-PRINT-DATE-LINE-FLG) (PRINT-DATE-LINE))) LOOP (COND ((NULL UNDONE-EVENTS) (GO EXIT))) (SETQ FORM (CAR UNDONE-EVENTS)) (COND ((OR (NOT DO-NOT-PRINT-FIRST-EVENT-FLG) (NEQ FORM (CAR EVENTS)) (NEQ PROVE-FILE NIL)) (ITERPRIN 1 PROVE-FILE) (IPRINC EVENT-SEPARATOR-STRING PROVE-FILE) (ITERPRIN 2 PROVE-FILE) (COND (BOOK-SYNTAX-FLG (DUMP (LIST FORM) PROVE-FILE 5 (LINEL PROVE-FILE) NIL T)) (T (PPRIND FORM 0 0 PPR-MACRO-LST PROVE-FILE))) (ITERPRI PROVE-FILE) (COND ((AND (NEQ PROVE-FILE NIL) (NOT (DETACHEDP))) (IPRINC (CADR FORM) T))))) (COND ((OR (MEMB (CAR FORM) (QUOTE (DEFN REFLECT))) ALL-FLG (EQ FORM (CAR EVENTS)) (IPRINC "DO YOU WANT TO REDO THIS EVENT?" NIL)) (START-STATS) (SETQ ANS (LET (UNDONE-EVENTS) (APPLY (CAR FORM) (CDR FORM)))) (STOP-STATS) (COND ((EQ ANS (QUOTE *****ERROR*****)) (ERROR (QUOTE REDO-UNDONE-EVENTS)) (GO LOOP)) ((OR (NOT DO-NOT-PRINT-FIRST-EVENT-FLG) (NEQ FORM (CAR EVENTS)) (NEQ PROVE-FILE NIL)) (IPRINT ANS PROVE-FILE) (COND ((AND (NOT (DETACHEDP)) (NEQ PROVE-FILE NIL)) (COND ((EQ ANS NIL) (ITERPRI T) (IPRINC FAILURE-MSG T) (ITERPRI T)) (T (IPRINC "," T))))))) (SETQ ANSLST (NCONC1 ANSLST ANS)) (COND ((EQ ANS NIL) (COND ((AND (EQ FAILURE-ACTION (QUOTE A)) (EQ (CAR FORM) (QUOTE PROVE-LEMMA))) (ITERPRIN 2 PROVE-FILE) (BM-PPR (LIST (QUOTE COMMENT) (LIST (QUOTE ADD-AXIOM) (BM-NTH 1 FORM) (BM-NTH 2 FORM) (BM-NTH 3 FORM))) PROVE-FILE) (ITERPRI PROVE-FILE) (IPRINT (APPLY (QUOTE ADD-AXIOM) (LIST (BM-NTH 1 FORM) (BM-NTH 2 FORM) (BM-NTH 3 FORM))) PROVE-FILE)) ((OR (EQ FAILURE-ACTION (QUOTE Q)) (MEMB (CAR FORM) (QUOTE (ADD-AXIOM ADD-SHELL DCL)))) (GO EXIT))))))) (SETQ UNDONE-EVENTS (CDR UNDONE-EVENTS)) (SETQ EVENTS NIL) (GO LOOP) EXIT (COND ((NOT (EQUAL PROVE-FILE NIL)) (ITERPRIN 1 PROVE-FILE) (IPRINC EVENT-SEPARATOR-STRING PROVE-FILE) (PRINT-SYSTEM PROVE-FILE) (IPRINC "REDO-UNDONE-EVENTS COMPLETED. HERE IS FAILED-THMS:" PROVE-FILE) (ITERPRI PROVE-FILE) (BM-PPR FAILED-THMS PROVE-FILE) (ITERPRI PROVE-FILE) (CLOSEF PROVE-FILE) (SETQ PROVE-FILE NIL))) (COND ((NOT (EQUAL TTY-FILE NIL)) (CLOSEF TTY-FILE) (SETQ TTY-FILE NIL))) (RETURN ANSLST]) (BM-REDUCE [LAMBDA (TERM ALIST) (* kbr: "19-Oct-85 16:31") (* TERM is a term. ALIST is an alist dotting variable names to EVGs.  Reduce TERM under the assumptions that each var is equal to the corresponding  constant. Return the resulting term or *1*FAILED if TERM is not reducible.  BM-REDUCE is just serving as a name from which REDUCE1 sometimes RETFROMs.  *) (LIST (QUOTE QUOTE) (REDUCE1 TERM ALIST]) (REDUCE1 [LAMBDA (TERM ALIST) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (COND ((SETQ TEMP-TEMP (ASSOC TERM ALIST)) (CDR TEMP-TEMP)) (T (RETFROM (QUOTE BM-REDUCE) (QUOTE *1*FAILED))))) ((FQUOTEP TERM) (CADR TERM)) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (COND ((EQ (REDUCE1 (FARGN TERM 1) ALIST) *1*F) (REDUCE1 (FARGN TERM 3) ALIST)) (T (REDUCE1 (FARGN TERM 2) ALIST)))) ((SETQ TEMP-TEMP (GETPROP (FFN-SYMB TERM) (QUOTE LISP-CODE))) (* We special case the fns of arity 0,  1, 2, and 3 to avoid consing up the  arg list. *) (SELECTQ (LENGTH TERM) (1 (APPLY* TEMP-TEMP)) (2 (APPLY* TEMP-TEMP (REDUCE1 (FARGN TERM 1) ALIST))) (3 (APPLY* TEMP-TEMP (REDUCE1 (FARGN TERM 1) ALIST) (REDUCE1 (FARGN TERM 2) ALIST))) (4 (APPLY* TEMP-TEMP (REDUCE1 (FARGN TERM 1) ALIST) (REDUCE1 (FARGN TERM 2) ALIST) (REDUCE1 (FARGN TERM 3) ALIST))) (APPLY TEMP-TEMP (for ARG in (FARGS TERM) collect (REDUCE1 ARG ALIST))))) (T (RETFROM (QUOTE BM-REDUCE) (QUOTE *1*FAILED]) (REFLECT0 [LAMBDA (NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST FLG) (* kbr: "20-Oct-85 19:37") (LET (TRANSLATED-BODY CONTROL-VARS FN ARGS BODY (META-NAMES (CONS NAME META-NAMES))) (BM-MATCH (FORMULA-OF SATISFACTION-LEMMA-NAME) (EQUAL (CONS FN ARGS) BODY)) (SETQ TRANSLATED-BODY (TRANSLATE BODY)) (SETQ RELATION-MEASURE-LST (for TEMP in RELATION-MEASURE-LST collect (LIST (CAR TEMP) (TRANSLATE (CADR TEMP))))) (PUT-INDUCTION-INFO NAME ARGS TRANSLATED-BODY RELATION-MEASURE-LST FN) (ADD-FACT NAME (QUOTE SDEFN) (LIST (QUOTE LAMBDA) ARGS (SUBST-FN NAME FN TRANSLATED-BODY))) (ADD-FACT NAME (QUOTE TYPE-PRESCRIPTION-LST) (CAR (GETPROP FN (QUOTE TYPE-PRESCRIPTION-LST)))) (PUT-LEVEL-NO NAME) (AND (GETPROP NAME (QUOTE JUSTIFICATIONS)) (ADD-FACT NAME (QUOTE CONTROLLER-POCKETS) (SCRUNCH (for TEMP in (GETPROP NAME (QUOTE JUSTIFICATIONS)) collect (PROGN (SETQ CONTROL-VARS (fetch (JUSTIFICATION SUBSET) of TEMP)) (for FORMAL in ARGS as I from 0 bind (LOOP-ANS _ 0) when (MEMB FORMAL CONTROL-VARS ) do (SETQ LOOP-ANS (LOGOR LOOP-ANS (LSH 1 I))) finally (RETURN LOOP-ANS))))))) (COND (FLG (ADD-FACT NAME (QUOTE LISP-CODE) (PACK (LIST STRING-WEIRD NAME)))) ((for FN in (ALL-FNNAMES TRANSLATED-BODY) always (OR (EQ FN NAME) (GETPROP FN (QUOTE LISP-CODE)))) (ADD-DCELL NAME (PACK (LIST STRING-WEIRD NAME)) (LIST (QUOTE LAMBDA) (SETQ TEMP-TEMP (for ARG in ARGS collect (PACK (LIST STRING-WEIRD3 ARG)))) (TRANSLATE-TO-LISP (SUB-PAIR-VAR ARGS TEMP-TEMP (SUBST-FN NAME FN TRANSLATED-BODY))))) )) (COND ((NOT (TOTAL-FUNCTIONP NAME)) (ERROR1 (PQUOTE (PROGN THE RECURSION IN (!PPR NAME NIL) IS UNJUSTIFIED %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE WARNING)))) NIL]) (RELIEVE-HYPS [LAMBDA (HYPS LEMMA-NAME) (* kbr: "19-Oct-85 16:31") (PUSH-LEMMA-FRAME) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME) (COND ((RELIEVE-HYPS1 HYPS LEMMA-NAME) (for X in (POP-LEMMA-FRAME) do (PUSH-LEMMA X)) (for X in (POP-LINEARIZE-ASSUMPTIONS-FRAME) do (PUSH-LINEARIZE-ASSUMPTION X)) T) (T (POP-LEMMA-FRAME) (POP-LINEARIZE-ASSUMPTIONS-FRAME) NIL]) (RELIEVE-HYPS-NOT-OK [LAMBDA (LIT) (* kbr: "20-Oct-85 19:32") (LET (LIT-ATOM ANS-ATOM) (SETQ LIT-ATOM LIT) (BM-MATCH LIT (NOT LIT-ATOM)) (for ANS in ANCESTORS thereis (PROGN (SETQ ANS-ATOM ANS) (BM-MATCH ANS (NOT ANS-ATOM)) (COND ((EQUAL LIT ANS) (SETQ RELIEVE-HYPS-NOT-OK-ANS T) T) ((AND (GREATEREQP (FORM-COUNT LIT-ATOM) (FORM-COUNT ANS-ATOM)) (WORSE-THAN-OR-EQUAL LIT-ATOM ANS-ATOM)) (SETQ RELIEVE-HYPS-NOT-OK-ANS NIL) T) (T NIL]) (RELIEVE-HYPS1 [LAMBDA (HYPS LEMMA-NAME) (* kbr: "20-Oct-85 19:12") (COND ((for HYP in HYPS as I from 1 bind (SPLIT-FLG CHECK-FLG LHS RHS) always (PROGN (PRINT-TO-DISPLAY LEMMA-NAME I (QUOTE ?)) (OR (SETQ SPLIT-FLG (BM-MATCH HYP (SPLIT HYP))) (SETQ CHECK-FLG (BM-MATCH HYP (CHECK HYP)))) (COND ((LOOKUP-HYP HYP) T) ((FREE-VARSP HYP UNIFY-SUBST) (COND ((AND (BM-MATCH HYP (EQUAL LHS RHS)) (VARIABLEP LHS) (NOT (ASSOC LHS UNIFY-SUBST)) (NOT (FREE-VARSP RHS UNIFY-SUBST))) (SETQ UNIFY-SUBST (CONS (CONS LHS (REWRITE RHS UNIFY-SUBST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL)) UNIFY-SUBST))) ((SEARCH-GROUND-UNITS HYP) T) (T (SETQ LAST-EXIT (QUOTE FREE-VARSP)) NIL))) ((RELIEVE-HYPS-NOT-OK (SETQ INST-HYP (SUBLIS-VAR UNIFY-SUBST HYP))) (SETQ LAST-EXIT (QUOTE RELIEVE-HYPS-NOT-OK)) RELIEVE-HYPS-NOT-OK-ANS) ((FALSE-NONFALSEP INST-HYP) (SETQ LAST-EXIT (QUOTE FALSE-NONFALSEP)) (NOT DEFINITELY-FALSE)) ((MEMBER INST-HYP LITS-THAT-MAY-BE-ASSUMED-FALSE) (SETQ LAST-EXIT (QUOTE LITS-THAT-MAY-BE-ASSUMED-FALSE)) NIL) (SPLIT-FLG (PUSH-LINEARIZE-ASSUMPTION INST-HYP) T) (CHECK-FLG (SETQ LAST-EXIT (QUOTE CHECK-FLG)) NIL) ((BM-MATCH HYP (NOT HYP)) (LET ((ANCESTORS (CONS (DUMB-NEGATE-LIT INST-HYP) ANCESTORS))) (SETQ LAST-EXIT (REWRITE HYP UNIFY-SUBST TYPE-ALIST (QUOTE FALSE) (QUOTE IFF) NIL)) (EQUAL LAST-EXIT FALSE))) (T (LET ((ANCESTORS (CONS (DUMB-NEGATE-LIT INST-HYP) ANCESTORS))) (SETQ LAST-EXIT (REWRITE HYP UNIFY-SUBST TYPE-ALIST (QUOTE TRUE) (QUOTE IFF) NIL)) (* Could be NOT-IDENT FALSE but  LAST-EXIT was just rewritten with IFF.  *) (EQUAL LAST-EXIT TRUE))))) finally (SETQ LAST-HYP HYP)) (PRINT-TO-DISPLAY LEMMA-NAME NIL (QUOTE !)) T) (T NIL]) (REMOVE-*2*IFS [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (REST) (COND ((NLISTP X) X) ((EQ (CAR X) (QUOTE QUOTE)) X) ((EQ (CAR X) (QUOTE *2*IF)) (SETQ REST (REMOVE-*2*IFS (CADDDR X))) (CONS (QUOTE COND) (CONS (LIST (REMOVE-*2*IFS (CADR X)) (REMOVE-*2*IFS (CADDR X))) (COND ((AND (LISTP REST) (EQ (CAR REST) (QUOTE COND))) (CDR REST)) (T (LIST (LIST T REST))))))) (T (CONS (CAR X) (for ARG in (CDR X) collect (REMOVE-*2*IFS ARG]) (REMOVE-NEGATIVE [LAMBDA (LIT CL) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP CL) NIL) ((COMPLEMENTARYP LIT (CAR CL)) (CDR CL)) (T (CONS (CAR CL) (REMOVE-NEGATIVE LIT (CDR CL]) (REMOVE-REDUNDANT-TESTS [LAMBDA (TO-DO DONE) (* kbr: "19-Oct-85 16:31") (* When this function was conceived, we used to run the following code.  However, we have trivialized the effect because we found that it sometimes  hurt. In particular, if the tests were (LISTP X) and  (EQUAL (CAAR X) (QUOTE FOO)), the LISTP could get removed.  But then the LISTP has to be rederived when it comes up during a proof.  It is speculated that the original motivation for this function was messy base  cases, which was altered if not fixed by carrying around the base cases in the  INDUCTION-MACHINE. The following code is left in case a real removal of tests  is deemed necessary. (COND ((NULL TO-DO) DONE)  ((AND (SIMPLIFY-CLAUSE-MAXIMALLY (CONS (CAR TO-DO)  (APPEND (FOR X IN (CDR TO-DO) COLLECT (NEGATE-LIT X))  (FOR X IN DONE COLLECT (NEGATE-LIT X)))))  (NULL PROCESS-CLAUSES)) The lemmas on PROCESS-HIST will have been added to  ALL-LEMMAS-USED by SIMPLIFY-CLAUSE under SIMPLIFY-CLAUSE-MAXIMALLY and  ALL-LEMMAS-USED is correctly initialized and processed by DEFN-SETUP and the  post processing in DEFN. (REMOVE-REDUNDANT-TESTS  (CDR TO-DO) DONE)) (T (REMOVE-REDUNDANT-TESTS  (CDR TO-DO) (CONS (CAR TO-DO) DONE)))) . *) (APPEND TO-DO DONE]) (REMOVE1 [LAMBDA (X LST) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP LST) NIL) ((EQ X (CAR LST)) (CDR LST)) (T (CONS (CAR LST) (REMOVE1 X (CDR LST]) (REMOVE-TRIVIAL-EQUATIONS [LAMBDA (CL) (* kbr: "20-Oct-85 13:36") (* First cut down on variables by  eliminating any inequality involving a  variable LHS with a RHS that doesn't  contain LHS. *) (bind (LHS RHS) while (for LIT in CL thereis (AND (OR (AND (BM-MATCH LIT (NOT (EQUAL LHS RHS))) (OR (AND (VARIABLEP LHS) (NOT (OCCUR LHS RHS))) (AND (PROG2 (swap LHS RHS) T) (VARIABLEP LHS) (NOT (OCCUR LHS RHS))))) (AND (VARIABLEP LIT) (PROGN (SETQ LHS LIT) (SETQ RHS FALSE) T))) (PROGN (SETQ CL (for LIT2 in CL unless (EQ LIT LIT2) collect (SUBST-VAR RHS LHS LIT2))) T)))) (* Next any inequality between a LHS and a constant RHS is used to replace  occurences of LHS. (But we cannot get rid of the original inequality.) *) (bind (LHS RHS) while (for LIT in CL thereis (AND (BM-MATCH LIT (NOT (EQUAL LHS RHS))) (OR (AND (NOT (QUOTEP LHS)) (QUOTEP RHS)) (AND (PROG2 (swap LHS RHS) T) (NOT (QUOTEP LHS)) (QUOTEP RHS))) (for LIT2 in CL when (NEQ LIT LIT2) thereis (OCCUR LHS LIT2)) (SETQ CL (for LIT2 in CL collect (COND ((OR (EQ LIT LIT2) (NOT (OCCUR LHS LIT2))) LIT2) (T (SUBST-EXPR RHS LHS LIT2)))))))) CL]) (REMOVE-UNCHANGING-VARS [LAMBDA (CAND-LST CL-SET) (* kbr: "19-Oct-85 16:31") (LET (NOT-CHANGING-VARS) (SETQ NOT-CHANGING-VARS (for CL in CL-SET bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (for LIT in CL bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (UNCHANGING-VARS LIT) LOOP-ANS)) finally (RETURN LOOP-ANS)) LOOP-ANS)) finally (RETURN LOOP-ANS))) (OR (for CAND in CAND-LST unless (INTERSECTP (fetch (CANDIDATE CHANGED-VARS) of CAND) NOT-CHANGING-VARS) collect CAND) CAND-LST]) (REMPROP1 [LAMBDA (AT PROP) (* kbr: "19-Oct-85 16:31") AT PROP (ERROR1 (PQUOTE (PROGN IT IS NOT PERMITTED TO USE REMPROP1 ON PROPERTIES MAINTAINED BY PUT1 AND GETPROP !)) (BINDINGS) (QUOTE HARD]) (RESTART [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (REDO-UNDONE-EVENTS (OR X UNDONE-EVENTS) T (QUOTE Q) NIL NIL NIL]) (RESTART-BATCH [LAMBDA (LST) (* kbr: "19-Oct-85 16:31") (PROG NIL (SETQ UNDONE-BATCH-COMMANDS LST) TOP (COND ((NULL UNDONE-BATCH-COMMANDS) (RETURN NIL))) (EVAL (CAR UNDONE-BATCH-COMMANDS)) (SETQ UNDONE-BATCH-COMMANDS (CDR UNDONE-BATCH-COMMANDS)) (GO TOP]) (REWRITE [LAMBDA (TERM ALIST TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG) (* kbr: " 4-Jul-86 16:41") (* Returns a term that is equal (modulo ID-IFF) to the result of substituting  ALIST into TERM under the hypotheses of (a) TYPE-ALIST,  (b) the conjunction of the top frame of LINEARIZE-ASSUMPTIONS-STACK,  (c) and (d) some subset S of SIMPLIFY-CLAUSE-POT-LST such that if ITIMES IEQP  (LIST (QUOTE MARK)) is MEMB the LEMMAS field of some poly in S, then ITIMES is  a member of the top frame of the LEMMA-STACK.  *) (* DEFN-FLG = T if TERM is the body of  a definition that is being opened.  *) (COND ((VARIABLEP TERM) (REWRITE-SOLIDIFY (COND ((SETQ TEMP-TEMP (ASSOC TERM ALIST)) (CDR TEMP-TEMP)) (T TERM)))) ((FQUOTEP TERM) TERM) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (REWRITE-IF (REWRITE (FARGN TERM 1) ALIST TYPE-ALIST (QUOTE ?) (QUOTE IFF) NIL) (FARGN TERM 2) (FARGN TERM 3) TYPE-ALIST)) ((SETQ TEMP-TEMP (NOT-TO-BE-REWRITTENP TERM ALIST)) (REWRITE-SOLIDIFY TEMP-TEMP)) (T (LET (ARGS FN TEMP) (* If we are inside of a defn, rewrite the args and then simplify the resulting  term with lemmas etc. If we are not in a definition, we wish to avoid  introducing too many IFs all at once and swamping CLAUSIFY.  So rewrite the args until one of them gets an IF in it.  After the first such IF, rewrite the args but if an IF shows up do not use the  expansion -- use the result of just substituting alist into the arg.  *) (SETQ ARGS (for ARG in (FARGS TERM) collect (REWRITE ARG ALIST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL))) (COND ((AND (for ARG in ARGS always (QUOTEP ARG)) (SETQ FN (GETPROP (FFN-SYMB TERM) (QUOTE LISP-CODE))) (NEQ (QUOTE *1*FAILED) (SETQ TEMP (APPLY FN (for ARG in ARGS collect (CADR ARG)))))) (PUSH-LEMMA (FFN-SYMB TERM)) (LIST (QUOTE QUOTE) TEMP)) (T (* The use of FCONS-TERM below is  justified by the immediately preceding  computation. *) (SETQ TEMP (REWRITE-TYPE-PRED (FCONS-TERM (FFN-SYMB TERM) ARGS))) (REWRITE-WITH-LEMMAS TEMP]) (REWRITE-FNCALL [LAMBDA (*FNNAME* *ARGLIST*) (* kbr: " 4-Jul-86 16:41") (LET (VALUE SDEFN (FNSTACK FNSTACK) *CONTROLLER-COMPLEXITIES* (LEMMA-STACK LEMMA-STACK) (LINEARIZE-ASSUMPTIONS-STACK LINEARIZE-ASSUMPTIONS-STACK) (*TYPE-ALIST* TYPE-ALIST) ANSWER) (SETQ SDEFN (GETPROP *FNNAME* (QUOTE SDEFN))) (SETQ ANSWER (COND ((NULL SDEFN) (REWRITE-SOLIDIFY (CONS-TERM *FNNAME* *ARGLIST*))) ((OR (MEMB *FNNAME* FNSTACK) (DISABLEDP *FNNAME*)) (REWRITE-SOLIDIFY (CONS-TERM *FNNAME* *ARGLIST*))) (T (SETQ *CONTROLLER-COMPLEXITIES* (for MASK in (GETPROP *FNNAME* (QUOTE CONTROLLER-POCKETS)) collect (for ARG in *ARGLIST* when (PROG1 (NOT (IEQP (LOGAND MASK 1) 0)) (SETQ MASK (LSH MASK -1))) sum (OR (QUOTEP ARG) (SETQ VALUE NIL)) (MAX-FORM-COUNT ARG)))) (SETQ FNSTACK (CONS *FNNAME* FNSTACK)) (* Add the name of the current fn to the FNSTACK so that when we see recursive  calls in the body we won't be tempted to go into them.  There is an odd aspect to the use of FNSTACK by this function.  Suppose that in the rewriting of the body of fn we apply a lemma and backwards  chain to some hyp. Suppose the hyp contains a call of fn.  Then when we try to rewrite fn in the hyp we will think it is a recursive call  and quit due to the (MEMB *FNNAME* FNSTACK) above.  Once upon a time, when we did not preprocess the hyps of lemmas at all and did  not EXPAND-BOOT-STRAP-NON-REC-FNS in defns this problem burned us on  (ZEROP expr) because inside the defn of ZEROP we saw  (EQUAL expr 0) and we backward chained to something with a ZEROP hyp and shied  away from it. This occurred while trying to use LITTLE-STEP under PRIME-KEY  under QUOTIENT-DIVIDES in the proof of PRIME-LIST-TIMES-LIST --  the ZEROP we were expanding was that in the DIVIDES hyp of PRIME-KEY and the  ZEROP we shied away from was that in PRIME in LITTLE-STEP.  We implemented makeshift fix to that by not putting nonrec fns onto FNSTACK  here. But that does not prevent us from shying away from calls to recursive fns  encountered in lemmas while somehow under the body of the fn.  Worse, it turns out to be very expensive.  Suppose we eliminate ZEROP by expanding it in preprocessing.  Then PRIME-LIST-TIMES-LIST is proved whether we put nonrec fns onto the stack  or not. But if we do not, it takes 248K conses while if we do it takes 140K.  So we have gone back to putting everything on the stack and await the day that  shying away from a spurious gets us. *) (PUSH-LEMMA-FRAME) (PRINT-TO-DISPLAY *FNNAME* (QUOTE ?) NIL) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME) (* Rewrite the body of the definition  *) (SETQ VALUE (REWRITE (CADDR SDEFN) (for VAR in (CADR SDEFN) as VAL in *ARGLIST* collect (CONS VAR VAL)) TYPE-ALIST OBJECTIVE ID-IFF T)) (COND ((NULL (GETPROP *FNNAME* (QUOTE INDUCTION-MACHINE))) (* We are dealing with a nonrec fn. If we are at the top level of the clause  but the expanded body has too many IFs in it compared to the number of IFs in  the args, we do not use the expanded body.  Because we know the IFs in the args will be classified out soon and we do not  want to swamp CLAUSIFY by giving it too many at once.  Otherwise we use the expanded body. *) (COND ((AND (for X in (CDR FNSTACK) never (GETPROP X (QUOTE INDUCTION-MACHINE ))) (TOO-MANY-IFS *ARGLIST* VALUE)) (POP-LEMMA-FRAME) (POP-LINEARIZE-ASSUMPTIONS-FRAME) (REWRITE-SOLIDIFY (FCONS-TERM *FNNAME* *ARGLIST*))) (T (for X in (POP-LINEARIZE-ASSUMPTIONS-FRAME) do (PUSH-LINEARIZE-ASSUMPTION X)) (PRINT-TO-DISPLAY *FNNAME* (QUOTE !) NIL) (for X in (POP-LEMMA-FRAME) do (PUSH-LEMMA X)) (PUSH-LEMMA *FNNAME*) VALUE))) ((REWRITE-FNCALLP *FNNAME* VALUE) (for X in (POP-LINEARIZE-ASSUMPTIONS-FRAME) do (  PUSH-LINEARIZE-ASSUMPTION X)) (PRINT-TO-DISPLAY *FNNAME* (QUOTE !) NIL) (for X in (POP-LEMMA-FRAME) do (PUSH-LEMMA X)) (PUSH-LEMMA *FNNAME*) VALUE) (T (POP-LEMMA-FRAME) (POP-LINEARIZE-ASSUMPTIONS-FRAME) (REWRITE-SOLIDIFY (CONS-TERM *FNNAME* *ARGLIST*))))))) (COND (NIL (NOT (EQUAL ANSWER (CONS *FNNAME* *ARGLIST*))) (SHOWPRINT (CONS *FNNAME* *ARGLIST*)) (SHOWPRINT ANSWER) (\GETKEY))) ANSWER]) (REWRITE-FNCALLP [LAMBDA (FNNAME VALUE) (* kbr: " 4-Jul-86 18:38") (* A FNNAME call can be opened to give VALUE where FNNAME may be recursively  defined. Are all the FNNAME calls in VALUE better than the original FNNAME  call? *) (COND ((VARIABLEP VALUE) T) ((FQUOTEP VALUE) T) ((EQ (FFN-SYMB VALUE) FNNAME) (* The recursive call is OK if (1) each arg of the call already occurs in some  literal of CURRENT-CL or (2) the call itself occurs in CURRENT-SIMPLIFY-CL or  (3) the actuals of the recursive call corresponding to the SUBSET of some  JUSTIFICATION for the termination of FNNAME are overall less complex than those  of the original call or (4) the actuals of the recursive call corresponding to  the SUBSET of some JUSTIFICATION for the termination of FNNAME are constant and  some actual not corresponding to a formal in the SUBSET is symbolically simpler  now than before *) (AND (OR (for ARG in (FARGS VALUE) always (for LIT in CURRENT-CL thereis (DUMB-OCCUR ARG LIT))) (for LIT in CURRENT-SIMPLIFY-CL thereis (DUMB-OCCUR VALUE LIT)) (for N in *CONTROLLER-COMPLEXITIES* as MASK in (GETPROP FNNAME (QUOTE CONTROLLER-POCKETS )) thereis (LESSP (for ARG in (FARGS VALUE) when (PROG1 (NOT (IEQP (LOGAND MASK 1) 0)) (SETQ MASK (LSH MASK -1))) sum (MAX-FORM-COUNT ARG)) N)) (for MASK in (GETPROP FNNAME (QUOTE CONTROLLER-POCKETS)) bind TEMP thereis (PROGN (SETQ TEMP MASK) (* Is there a controller pocket such  that all the controllers are constant  and some non controller is  symbolically simpler now than before?  *) (AND (for ARG in (FARGS VALUE) when (PROG1 (NOT (IEQP (LOGAND TEMP 1) 0)) (SETQ TEMP (LSH TEMP -1))) always (QUOTEP ARG)) (for ARG1 in *ARGLIST* as ARG2 in (FARGS VALUE) thereis (AND (PROG1 (IEQP (LOGAND MASK 1) 0) (SETQ MASK (LSH MASK -1))) (LESSP (MAX-FORM-COUNT ARG2) (MAX-FORM-COUNT ARG1)))))))) (for ARG in (FARGS VALUE) always (REWRITE-FNCALLP FNNAME ARG)))) (T (for ARG in (FARGS VALUE) always (REWRITE-FNCALLP FNNAME ARG]) (REWRITE-IF [LAMBDA (TEST LEFT RIGHT TYPE-ALIST) (* kbr: "29-Jun-86 18:02") (* Rewrites the term  (IF TEST LEFT RIGHT) *) (COND ((AND (NVARIABLEP TEST) (NOT (FQUOTEP TEST)) (EQ (FFN-SYMB TEST) (QUOTE IF)) (EQUAL (FARGN TEST 2) FALSE) (FALSE-NONFALSEP (FARGN TEST 3)) (NOT DEFINITELY-FALSE)) (* Note: FALSE-NONFALSEP sets  DEFINITELY-FALSE *) (* Change (IF (IF P FALSE TRUE) LEFT  RIGHT) to (IF P RIGHT LEFT) *) (swap LEFT RIGHT) (SETQ TEST (FARGN TEST 1)))) (ASSUME-TRUE-FALSE TEST) (COND (MUST-BE-TRUE (JUMPOUTP LEFT (REWRITE LEFT ALIST TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG))) (MUST-BE-FALSE (JUMPOUTP RIGHT (REWRITE RIGHT ALIST TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG))) (T (REWRITE-IF1 TEST (JUMPOUTP LEFT (LET (FALSE-TYPE-ALIST) (REWRITE LEFT ALIST TRUE-TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG))) (JUMPOUTP RIGHT (REWRITE RIGHT ALIST FALSE-TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG]) (REWRITE-IF1 [LAMBDA (TEST LEFT RIGHT) (* kbr: "29-Jun-86 18:02") (* Called by REWRITE-IF to rewrite  (IF TEST LEFT RIGHT) *) (COND ((EQUAL LEFT RIGHT) (* Change (IF TEST P P) to P *) LEFT) ((AND (EQUAL TEST LEFT) (FALSE-NONFALSEP RIGHT) DEFINITELY-FALSE) (* Change (IF P P FALSE) to P *) TEST) ((AND (EQUAL TRUE LEFT) (FALSE-NONFALSEP RIGHT) DEFINITELY-FALSE (BOOLEAN TEST)) (* Change (IF TEST TRUE FALSE) to TEST  if TEST is a boolean *) TEST) (T (FCONS-TERM* (QUOTE IF) TEST LEFT RIGHT]) (REWRITE-LINEAR-CONCL [LAMBDA (CONCL) (* kbr: "19-Oct-85 16:31") (* We desire to rewrite the instantiated conclusion of linear lemmas before  adding them to the linear pot. However, because all of the literals of the  clause being proved are on the TYPE-ALIST as false, it is possible --  say when proving an instance of an already proved linear lemma --  to rewrite the conclusion to F! We could avoid this by either not putting the  linear-like literals on the type alist in the first place, or by not rewriting  the entire conclusion, just the args. We took the latter approach because it  was simplest. It does suffer from the possibility that the whole  (LESSP lhs rhs) of the conclusion might rewrite to something else, possibly a  better LESSP. *) (LET (LHS RHS) (COND ((BM-MATCH CONCL (LESSP LHS RHS)) (FCONS-TERM* (QUOTE LESSP) (REWRITE LHS UNIFY-SUBST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL) (REWRITE RHS UNIFY-SUBST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL))) ((BM-MATCH CONCL (NOT (LESSP LHS RHS))) (FCONS-TERM* (QUOTE NOT) (FCONS-TERM* (QUOTE LESSP) (REWRITE LHS UNIFY-SUBST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL) (REWRITE RHS UNIFY-SUBST TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL)))) (T (ERROR1 (PQUOTE (PROGN REWRITE-LINEAR-CONCL THOUGHT THAT ALL LINEAR LEMMAS HAD CONCLUSIONS WITH NLISTP LESSP !)) NIL (QUOTE HARD]) (REWRITE-SOLIDIFY [LAMBDA (TERM) (* kbr: "29-Jun-86 17:43") (* Rewrites TERM with the context  supplied by TYPE-ALIST *) (LET (LIT TEMP LHS RHS) (COND ((QUOTEP TERM) TERM) ((AND (NVARIABLEP TERM) (EQ (FFN-SYMB TERM) (QUOTE IF))) (* See the proof in JUMPOUTP.  *) TERM) ((for PAIR in TYPE-ALIST thereis (AND (IEQP (CDR PAIR) TYPE-SET-TRUE) (BM-MATCH (CAR PAIR) (EQUAL LHS RHS)) (EQUAL LHS TERM))) (* If TERM is equal to the LHS of a  true equality then TERM rewrites to  the RHS of the equality.  *) RHS) ((AND (SETQ TEMP-TEMP (SASSOC TERM TYPE-ALIST)) (SETQ TEMP (OBJ-TABLE (CDR TEMP-TEMP) OBJECTIVE ID-IFF))) (* If the TERM is in the TYPE-ALIST as  true or false then return true or  false. *) TEMP) ((SETQ LIT (for LIT in LITS-THAT-MAY-BE-ASSUMED-FALSE when (COND ((EQUAL LIT TERM) (SETQ TEMP FALSE)) ((COMPLEMENTARYP LIT TERM) (SETQ TEMP TRUE)) (T NIL)) do (RETURN LIT))) (COND ((OR (EQ ID-IFF (QUOTE IFF)) (EQ TEMP FALSE) (BOOLEAN TERM)) (PUSH-LEMMA LIT) TEMP) (T TERM))) (T TERM]) (REWRITE-TYPE-PRED [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (LHS RHS PAIR TYPE-SET) (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM)) TERM) ((BM-MATCH TERM (EQUAL LHS RHS)) (COND ((EQUAL LHS RHS) TRUE) ((NOT-IDENT LHS RHS) FALSE) ((AND (BOOLEAN LHS) (EQUAL TRUE RHS)) LHS) ((AND (BOOLEAN RHS) (EQUAL TRUE LHS)) RHS) ((BM-MATCH RHS (EQUAL & &)) (FCONS-TERM* (QUOTE IF) RHS (FCONS-TERM* (QUOTE EQUAL) LHS TRUE) (FCONS-TERM* (QUOTE IF) LHS FALSE TRUE))) ((EQUAL LHS FALSE) (FCONS-TERM* (QUOTE IF) RHS FALSE TRUE)) ((EQUAL RHS FALSE) (FCONS-TERM* (QUOTE IF) LHS FALSE TRUE)) ((BM-MATCH LHS (EQUAL & &)) (FCONS-TERM* (QUOTE IF) LHS (FCONS-TERM* (QUOTE EQUAL) RHS TRUE) (FCONS-TERM* (QUOTE IF) RHS FALSE TRUE))) ((AND (SETQ TYPE-SET (TYPE-SET LHS)) (for X in RECOGNIZER-ALIST thereis (IEQP TYPE-SET (CDR X))) (IEQP TYPE-SET (TYPE-SET RHS)) (NOT (BTM-OBJECT-OF-TYPE-SET TYPE-SET))) (* This piece of code was hacked together to test the idea that if you have an  (EQUAL lhs rhs) in which lhs and rhs have the same type --  and that type does not contain a btm object --  that you should rewrite it to T or F provided you can appropriately decide the  equalities of the components. Before attempting to add complete equality we did  not do anything like this and relied solely on elim to do it for us.  In the first attempt to add it to rewrite we just rewrote all such  (EQUAL lhs rhs) to the conjunction of the equalities of the components.  That was unsatisfactory because it caused such equalities as  (EQUAL (ADDTOLIST X L) B) to be torn up all the time.  That caused us to fail to prove thms like SORT-OF-ORDERED-NUMBER-LIST because  weak subgoals are pushed -- subgoals about  (CAR (ADDTOLIST X L)) and (CDR (ADDTOLIST X L)) instead about  (ADDTOLIST X L) itself. If this piece of code survives it should be cleaned up.  Two problems. We repeatedly cons up the constant  (EQUAL (CAR LHS) (CAR RHS)) and we (RETURN TERM) which works only because we  know this clause is the second to last one in the parent COND.  *) (for DEST in (CDR (ASSOC (CAR (for X in SHELL-ALIST when (IEQP TYPE-SET (LOGBIT (CDR X))) do (RETURN X))) SHELL-POCKETS)) do (SETQ TEMP-TEMP (REWRITE (FCONS-TERM* (QUOTE EQUAL) (FCONS-TERM* DEST (QUOTE LHS)) (FCONS-TERM* DEST (QUOTE RHS))) (LIST (CONS (QUOTE LHS) LHS) (CONS (QUOTE RHS) RHS)) TYPE-ALIST (QUOTE ?) (QUOTE ID) NIL)) (COND ((EQUAL TEMP-TEMP FALSE) (RETURN FALSE)) ((NOT (EQUAL TEMP-TEMP TRUE)) (RETURN TERM))) finally (RETURN TRUE))) (T TERM))) ((SETQ PAIR (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST)) (SETQ TYPE-SET (TYPE-SET (FARGN TERM 1))) (COND ((LOGSUBSETP TYPE-SET (CDR PAIR)) TRUE) ((IEQP 0 (LOGAND TYPE-SET (CDR PAIR))) FALSE) (T TERM))) (T TERM]) (REWRITE-WITH-LEMMAS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (REWRITTEN-TERM UNIFY-SUBST TEMP INST-HYP) (COND ((VARIABLEP TERM) (REWRITE-SOLIDIFY TERM)) ((FQUOTEP TERM) TERM) ((MEMB (FFN-SYMB TERM) FNS-TO-BE-IGNORED-BY-REWRITE) TERM) ((AND (OR (NEQ (FFN-SYMB TERM) (QUOTE LESSP)) (NOT (MEMB (QUOTE LESSP) FNSTACK))) (REWRITE-WITH-LINEAR TERM))) ((for LEMMA in (GETPROP (FFN-SYMB TERM) (QUOTE LEMMAS)) unless (DISABLEDP (fetch (REWRITE-RULE NAME) of LEMMA)) thereis (COND ((META-LEMMAP LEMMA) (* The conclusion is the name of a LISP fn to apply to the term being  rewritten. To add such lemma it must be the case that the LISP function return  a TERMP such that in the current history  (EQUAL TERM val) can be proved. *) (SETQ REWRITTEN-TERM (APPLY* (fetch (REWRITE-RULE CONCL) of LEMMA) TERM)) (COND ((EQUAL REWRITTEN-TERM TERM) NIL) (T (* Because of the FORMP part of the correctness proof for user defined  metafunctions we know REWRITTEN-TERM is a TERMP.  However, we want all terms inside the theorem prover to be in quote normal form  -- all explicit values be represented with QUOTE.  We normalize REWRITTEN-TERM by applying the empty substitution to it.  When we wrote the metapaper we were uncertain whether it was essential to the  soundness of the theorem-prover that terms be in quote normal form --  however the theorem-prover could certainly be implemented so that it was not  crucial so we left this issue out of the paper.  We attempted to verify that the soundness of the current implementation did not  depend upon terms being in quote normal form, but we got very weary,  particularly because one of us could never remember what it was that we were  trying to prove. We did learn that some parts of the theorem prover that used  functions such as OCCUR would be heuristically inaccurate if terms were not in  normal form. We never discovered any situation in which terms not being in  normal form would cause unsoundness but we did not get past the C's in an  alphabetical scan. Instead, we gave up the search and decided to require that  terms be in normal form throughout the theorem-prover.  We still have not yet completed a pass through the theorem-prover checking that  normalcy is preserved, but we believe that we were thorough in the initial  *1*-reformulation of the theorem-prover --  never constructing a term except through CONS-TERM  (unless we really knew what we were doing, such as consing up an IF term in  rewrite)%. Our confidence that we were thorough during the *1*-reformulation is  based upon the existence of a comment in CONS-TERM claiming that every term had  to be in normal form. *) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of LEMMA)) (SETQ REWRITTEN-TERM (REWRITE (SUBLIS-VAR NIL REWRITTEN-TERM) NIL TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG)) T))) ((EQ (FFN-SYMB (fetch (REWRITE-RULE CONCL) of LEMMA)) (QUOTE NOT)) (COND ((AND (OR (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NEQ OBJECTIVE (QUOTE TRUE))) (ONE-WAY-UNIFY (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 1) TERM) (RELIEVE-HYPS (fetch (REWRITE-RULE HYPS) of LEMMA) (fetch (REWRITE-RULE NAME) of LEMMA))) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of LEMMA)) (SETQ REWRITTEN-TERM FALSE) T) (T NIL))) ((EQ (FFN-SYMB (fetch (REWRITE-RULE CONCL) of LEMMA)) (QUOTE EQUAL)) (COND ((AND (OR (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NEQ OBJECTIVE (QUOTE TRUE)) (NOT (EQUAL (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2) FALSE))) (OR (NOT (MEMB (FFN-SYMB TERM) FNSTACK)) (NOT (FNNAMEP (FFN-SYMB TERM) (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2)))) (ONE-WAY-UNIFY (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 1) TERM) (PROGN (SETQ TEMP COMMUTED-EQUALITY-FLG) T) (for PAIR in (fetch (REWRITE-RULE LOOP-STOPPER) of LEMMA) never (TERM-ORDER (CDR (ASSOC (CAR PAIR) UNIFY-SUBST)) (CDR (ASSOC (CDR PAIR) UNIFY-SUBST)))) (RELIEVE-HYPS (fetch (REWRITE-RULE HYPS) of LEMMA) (fetch (REWRITE-RULE NAME) of LEMMA))) (SETQ REWRITTEN-TERM (REWRITE (COND (TEMP (COMMUTE-EQUALITIES (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2))) (T (FARGN (fetch (REWRITE-RULE CONCL) of LEMMA) 2))) UNIFY-SUBST TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG)) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of LEMMA)) T) ((AND (OR (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NEQ OBJECTIVE (QUOTE FALSE))) (EQ (FFN-SYMB TERM) (QUOTE EQUAL)) (ONE-WAY-UNIFY (fetch (REWRITE-RULE CONCL) of LEMMA) TERM) (RELIEVE-HYPS (fetch (REWRITE-RULE HYPS) of LEMMA) (fetch (REWRITE-RULE NAME) of LEMMA))) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of LEMMA)) (SETQ REWRITTEN-TERM TRUE) T) (T NIL))) ((AND (OR (NULL (fetch (REWRITE-RULE HYPS) of LEMMA)) (NEQ OBJECTIVE (QUOTE FALSE))) (OR (EQ ID-IFF (QUOTE IFF)) (BOOLEAN TERM)) (ONE-WAY-UNIFY (fetch (REWRITE-RULE CONCL) of LEMMA) TERM)) (COND ((RELIEVE-HYPS (fetch (REWRITE-RULE HYPS) of LEMMA) (fetch (REWRITE-RULE NAME) of LEMMA)) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of LEMMA)) (SETQ REWRITTEN-TERM TRUE) T) (T NIL))) (T NIL))) REWRITTEN-TERM) ((MEMBER TERM EXPAND-LST) (* If we have been told to expand this term, do it.  We used to do this inside of REWRITE-FNCALL, but there to avoid jumping out  when we hit unapproved recursive calls we just substituted the actuals into the  body and returned that. This seems neater.  *) (SETQ TEMP (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN))) (PUSH-LEMMA (FFN-SYMB TERM)) (REWRITE (CADDR TEMP) (for V in (CADR TEMP) as X in (FARGS TERM) collect (CONS V X)) TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG)) (T (SETQ TEMP (REWRITE-FNCALL (FFN-SYMB TERM) (FARGS TERM))) (COND ((EQUAL TEMP TERM) TERM) ((CONTAINS-REWRITEABLE-CALLP (FFN-SYMB TERM) TEMP) (REWRITE TEMP NIL TYPE-ALIST OBJECTIVE ID-IFF DEFN-FLG)) (T TEMP]) (REWRITE-WITH-LINEAR [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (PROG (ANS TEMP) (SETQ TEMP TERM) (BM-MATCH TEMP (NOT TEMP)) (* TEMP is the atom of TERM.  *) (COND ((AND (NOT (BM-MATCH TEMP (LESSP & &))) (NOT (BM-MATCH TEMP (EQUAL & &)))) NIL) ((EQ OBJECTIVE (QUOTE ?)) (* We tried rewriting with linear under the objective ?, and it cost us 4  million conses over a proveall, so we stopped rewriting with linear under the  objective ?. We found that too restrictive, and experimented with the idea of  only rewriting with linear under ? when ANCESTORS is nonNIL, i.e., when we are  working on a term that may appear as part of the simplification of the theorem  as opposed to a term that appears while rewriting the hypothesis of a rewrite  rule. That cost us 5 times more conses on the theorem it was designed to prove!  So we have abandoned linear under ? altogether, again.  Here, however is the most recent experimental code:  (COND ((AND (NULL ANCESTORS) (EQ (ADD-TERM-TO-POT-LST TERM  SIMPLIFY-CLAUSE-POT-LST NIL NIL) (QUOTE CONTRADICTION)))  (SETQ ANS TRUE) (GO WIN))) (COND ((AND (NULL ANCESTORS)  (EQ (ADD-TERM-TO-POT-LST TERM SIMPLIFY-CLAUSE-POT-LST T NIL)  (QUOTE CONTRADICTION))) (SETQ ANS FALSE)  (GO WIN))) *) NIL) ((EQ OBJECTIVE (QUOTE TRUE)) (COND ((EQ (ADD-TERM-TO-POT-LST TERM SIMPLIFY-CLAUSE-POT-LST NIL NIL) (QUOTE CONTRADICTION)) (SETQ ANS TRUE) (GO WIN)))) (T (COND ((EQ (ADD-TERM-TO-POT-LST TERM SIMPLIFY-CLAUSE-POT-LST T NIL) (QUOTE CONTRADICTION)) (SETQ ANS FALSE) (GO WIN))))) (RETURN NIL) WIN (for X in LEMMAS-USED-BY-LINEAR do (PUSH-LEMMA X)) (PUSH-LEMMA (QUOTE ZERO)) (for X in LINEAR-ASSUMPTIONS do (PUSH-LINEARIZE-ASSUMPTION X)) (RETURN ANS]) (RPLACAI [LAMBDA (LIST I X) (* kbr: "19-Oct-85 16:31") (COND ((IEQP I 1) (RPLACA (OR LIST (CONS NIL NIL)) X)) (T (RPLACD (OR LIST (CONS NIL NIL)) (RPLACAI (CDR LIST) (SUB1 I) X]) ) (RPAQQ CODE-S-ZCOMS ((* CODE-S-Z *) (FNS S SARGS SCONS-TERM SCRUNCH SCRUNCH-CLAUSE SCRUNCH-CLAUSE-SET SEARCH-GROUND-UNITS SEQUENTIAL-DIFFERENCE SET-DIFF SET-DIFF-N SET-EQUAL SET-SIMPLIFY-CLAUSE-POT-LST SETTLED-DOWN-CLAUSE SETTLED-DOWN-SENT SETUP SETUP-META-NAMES SHELL-CONSTRUCTORP SHELL-DESTRUCTOR-NESTP SHELL-OCCUR SHELL-OCCUR1 SHELLP SIMPLIFY-CLAUSE SIMPLIFY-CLAUSE-MAXIMALLY SIMPLIFY-CLAUSE-MAXIMALLY1 SIMPLIFY-CLAUSE0 SIMPLIFY-CLAUSE1 SIMPLIFY-LOOP SIMPLIFY-SENT SINGLETON-CONSTRUCTOR-TO-RECOGNIZER SKO-DEST-NESTP SOME-SUBTERM-WORSE-THAN-OR-EQUAL SORT-DESTRUCTOR-CANDIDATES SOUND-IND-PRIN-MASK STACK-DEPTH START-STATS STOP-STATS STORE-SENT STRIP-BRANCHES STRIP-BRANCHES1 SUB-SEQUENCEP SUBBAGP SUBLIS-EXPR SUBLIS-EXPR1 SUBLIS-VAR SUBLIS-VAR-LST SUB-PAIR-EXPR SUB-PAIR-EXPR-LST SUB-PAIR-EXPR1 SUB-PAIR-VAR SUB-PAIR-VAR-LST SUBST-EXPR SUBST-EXPR-ERROR1 SUBST-EXPR-LST SUBST-EXPR1 SUBST-FN SUBST-VAR SUBST-VAR-LST BM-SUBST SUBSUMES SUBSUMES-REWRITE-RULE SUBSUMES1 SUBSUMES11 SUM-STATS-ALIST TABULATE TERM-ORDER TERMINATION-MACHINE TP-EXPLODEN1 TP-GETCHARN1 TP-IMPLODE1 TO-BE-IGNOREDP TOO-MANY-IFS TOP-FNNAME TOTAL-FUNCTIONP TRANSITIVE-CLOSURE TRANSLATE TRANSLATE-TO-LISP TREE-DEPENDENTS TRIVIAL-POLYP TRIVIAL-POLYP1 TRUE-POLYP TYPE-ALIST-CLAUSE TYPE-PRESCRIPTION-LEMMAP TYPE-SET TYPE-SET2 UBT UNBREAK-LEMMA UNCHANGING-VARS UNCHANGING-VARS1 UNDO-BACK-THROUGH UNDO-NAME UNION-EQUAL UNPRETTYIFY VARIANTP WORSE-THAN WORSE-THAN-OR-EQUAL WRAPUP XXXJOIN ZERO-POLY))) (* CODE-S-Z *) (DEFINEQ (S [LAMBDA (VAR VAL) (* kbr: "19-Oct-85 16:31") (COND ((NOT (ERRSET (SETQ TEMP-TEMP (TRANSLATE VAR)))) NIL) ((OR (NEQ VAR TEMP-TEMP) (NOT (VARIABLEP VAR))) (QUOTE (NOT VARIABLEP))) ((NOT (ERRSET (SETQ VAL (TRANSLATE VAL)))) NIL) ((NOT (QUOTEP VAL)) (QUOTE (NOT QUOTEP))) (T (SETQ TEMP-TEMP (OR (ASSOC VAR R-ALIST) (CAR (SETQ R-ALIST (CONS (CONS VAR VAL) R-ALIST))))) (RPLACD TEMP-TEMP (CADR VAL)) VAR]) (SARGS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((NEQ (CAR TERM) (QUOTE QUOTE)) (CDR TERM)) ((LITATOM (CADR TERM)) (COND ((EQ (CADR TERM) *1*T) NIL) ((EQ (CADR TERM) *1*F) NIL) (T (LIST (LIST (QUOTE QUOTE) (DTACK-0-ON-END (CHCON (CADR TERM)))))))) ((FIXP (CADR TERM)) (COND ((LESSP (CADR TERM) 0) (LIST (LIST (QUOTE QUOTE) (MINUS (CADR TERM))))) ((EQUAL (CADR TERM) 0) NIL) (T (LIST (LIST (QUOTE QUOTE) (SUB1 (CADR TERM))))))) ((EQ (CAR (CADR TERM)) *1*SHELL-QUOTE-MARK) (for X in (CDDR (CADR TERM)) collect (LIST (QUOTE QUOTE) X))) (T (LIST (LIST (QUOTE QUOTE) (CAR (CADR TERM))) (LIST (QUOTE QUOTE) (CDR (CADR TERM]) (SCONS-TERM [LAMBDA (FN ARGS) (* kbr: "19-Oct-85 16:31") (COND ((EQ FN (QUOTE EQUAL)) (COND ((EQUAL (CAR ARGS) (CADR ARGS)) TRUE) ((AND (QUOTEP (CAR ARGS)) (QUOTEP (CADR ARGS))) FALSE) (T (CONS (QUOTE EQUAL) ARGS)))) (T (CONS-TERM FN ARGS]) (SCRUNCH [LAMBDA (L) (* kbr: " 4-Jul-86 18:10") (* Setifies list L *) (for TAIL on L unless (MEMBER (CAR TAIL) (CDR TAIL)) collect (CAR TAIL]) (SCRUNCH-CLAUSE [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (for TAIL on CL unless (OR (AND (FALSE-NONFALSEP (CAR TAIL)) DEFINITELY-FALSE) (MEMBER (CAR TAIL) (CDR TAIL))) collect (CAR TAIL]) (SCRUNCH-CLAUSE-SET [LAMBDA (CLAUSES) (* kbr: "19-Oct-85 16:31") (TRANSITIVE-CLOSURE (for CL in CLAUSES collect (SCRUNCH-CLAUSE CL)) (FUNCTION (LAMBDA (CL1 CL2) (COND ((SUBSETP CL1 CL2) CL1) ((SUBSETP CL2 CL1) CL2) (T NIL]) (SEARCH-GROUND-UNITS [LAMBDA (HYP) (* kbr: "19-Oct-85 16:31") (* Like LOOKUP-HYP except looks  through ground unit REWRITE lemmas.  *) (PROG (TERM FN REWRITE-RULE) (COND ((BM-MATCH HYP (NOT TERM)) (COND ((VARIABLEP TERM) (RETURN NIL)) ((FQUOTEP TERM) (RETURN (EQUAL TERM FALSE))) (T (SETQ FN (FFN-SYMB TERM))))) ((VARIABLEP HYP) (RETURN NIL)) ((FQUOTEP HYP) (RETURN (NOT (EQUAL HYP FALSE)))) (T (SETQ FN (FFN-SYMB HYP)))) (COND ((SETQ REWRITE-RULE (for REWRITE-RULE in (GET1 FN (QUOTE LEMMAS)) when (AND (NOT (DISABLEDP (fetch (REWRITE-RULE NAME) of REWRITE-RULE ))) (NOT (META-LEMMAP REWRITE-RULE)) (NOT (fetch (REWRITE-RULE HYPS) of REWRITE-RULE)) (NOT (FREE-VARSP (fetch (REWRITE-RULE CONCL) of REWRITE-RULE) NIL)) (ONE-WAY-UNIFY1 HYP (fetch (REWRITE-RULE CONCL) of REWRITE-RULE))) do (RETURN REWRITE-RULE))) (PUSH-LEMMA (fetch (REWRITE-RULE NAME) of REWRITE-RULE)) (RETURN T)) (T (RETURN NIL]) (SEQUENTIAL-DIFFERENCE [LAMBDA (SMALLER LARGER) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP SMALLER) LARGER) ((NLISTP LARGER) (QUOTE NOT-RELATED)) ((EQUAL (CAR SMALLER) (CAR LARGER)) (SEQUENTIAL-DIFFERENCE (CDR SMALLER) (CDR LARGER))) (T (SETQ TEMP-TEMP (SEQUENTIAL-DIFFERENCE SMALLER (CDR LARGER))) (COND ((EQ TEMP-TEMP (QUOTE NOT-RELATED)) (QUOTE NOT-RELATED)) (T (CONS (CAR LARGER) TEMP-TEMP]) (SET-DIFF [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (for ELE in X unless (MEMBER ELE Y) collect ELE]) (SET-DIFF-N [LAMBDA (BIG LITTLE N) (* kbr: "19-Oct-85 16:31") (COND ((ZEROP N) NIL) ((NLISTP BIG) (ERROR1 (PQUOTE (PROGN SET-DIFF-N CALLED WITH INAPPROPRIATE ARGUMENTS %.)) (BINDINGS) (QUOTE HARD))) ((MEMB (CAR BIG) LITTLE) (SET-DIFF-N (CDR BIG) LITTLE N)) (T (CONS (CAR BIG) (SET-DIFF-N (CDR BIG) LITTLE (SUB1 N]) (SET-EQUAL [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (AND (SUBSETP X Y) (SUBSETP Y X]) (SET-SIMPLIFY-CLAUSE-POT-LST [LAMBDA (CL HEURISTIC-TYPE-ALIST) (* kbr: "19-Oct-85 16:31") (* We use the same basic pot list for all the calls REWRITE for a given clause.  However, to keep from biting our tail, we must know which literals each poly  descends from and avoid the polys descending from the negation of our current  lit. In order to keep track of which literals are being used we set TYPE-ALIST  to NIL before setting up the pot list, and use the special hacks  LITS-THAT-MAY-BE-ASSUMED-FALSE and HEURISTIC-TYPE-ALIST.  The pot list we thus construct is immediately tested against CONTRADICTION to  see if CL is a consequence of linear. However, the failure to use everything we  know has burned us here. In particular, the type alist might contain an  equality that could be used as a rewrite rule to help us establish the  hypothesis of some needed lemma. Imagine for example that the clause contains  b=a and p (a) as hyps and we need to prove p  (b) to get some lemma. We try to handle this as follows.  After setting up SIMPLIFY-CLAUSE-POT-LST --  the pot list we will use subsequently and which has all the dependencies  carefully tracked -- we go at the pot list again with the ALL-NEW-FLG of  ADD-TERMS-TO-POT-LST set to T. This causes us to treat every addend in the pot  list as new and reconsider the adding of all the lemmas.  If this produces CONTRADICTION, we win. If not, we pretend we did not do it --  since the resulting pot list has hidden dependencies in it.  *) (LET ((LITS-THAT-MAY-BE-ASSUMED-FALSE CL) (TYPE-ALIST NIL)) (SETQ SIMPLIFY-CLAUSE-POT-LST (ADD-TERMS-TO-POT-LST CL NIL NIL NIL)) (COND ((NEQ SIMPLIFY-CLAUSE-POT-LST (QUOTE CONTRADICTION)) (SETQ TYPE-ALIST HEURISTIC-TYPE-ALIST) (COND ((EQ (ADD-TERMS-TO-POT-LST NIL SIMPLIFY-CLAUSE-POT-LST NIL T) (QUOTE CONTRADICTION)) (SETQ SIMPLIFY-CLAUSE-POT-LST (QUOTE CONTRADICTION)))))) NIL]) (SETTLED-DOWN-CLAUSE [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (COND ((ASSOC (QUOTE SETTLED-DOWN-CLAUSE) HIST) NIL) (T (SETQ PROCESS-HIST NIL) (SETQ PROCESS-CLAUSES (LIST CL)) T]) (SETTLED-DOWN-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE SETTLED-DOWN-CLAUSE) CL HIST (QUOTE SIMPLIFY-SENT) (QUOTE ELIMINATE-DESTRUCTORS-SENT]) (SETUP [LAMBDA (FORM CLAUSES LEMMAS) (* kbr: "19-Oct-85 16:31") (SETQ ORIGTHM FORM) (COND ((NOT (MEMBER ORIGTHM FAILED-THMS)) (SETQ FAILED-THMS (CONS ORIGTHM FAILED-THMS)))) (SETQ EXPAND-LST HINTED-EXPANSIONS) (SETQ TERMS-TO-BE-IGNORED-BY-REWRITE NIL) (SETQ INDUCTION-HYP-TERMS NIL) (SETQ INDUCTION-CONCL-TERMS NIL) (SETQ ALL-LEMMAS-USED LEMMAS) (SETQ STACK NIL) (SETQ FNSTACK NIL) (SETQ LAST-PRINT-CLAUSES NIL) (SETQ TYPE-ALIST NIL) (SETQ LITS-THAT-MAY-BE-ASSUMED-FALSE NIL) (SETQ CURRENT-LIT 0) (SETQ CURRENT-ATM 0) (SETQ ANCESTORS NIL) (INIT-LEMMA-STACK) (INIT-LINEARIZE-ASSUMPTIONS-STACK) (SETQ LAST-PRINEVAL-CHAR NIL) (RANDOM-INITIALIZATION ORIGTHM) (IO (QUOTE SETUP) (LIST ORIGTHM) NIL CLAUSES LEMMAS]) (SETUP-META-NAMES [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (ADD-FACT (QUOTE MEANING) (QUOTE LEMMAS) (create REWRITE-RULE NAME _ (QUOTE MEANING) CONCL _ (QUOTE MEANING-SIMPLIFIER))) (ADD-FACT (QUOTE FORMP) (QUOTE LEMMAS) (create REWRITE-RULE NAME _ (QUOTE FORMP) CONCL _ (QUOTE FORMP-SIMPLIFIER]) (SHELL-CONSTRUCTORP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) (T (ASSOC (FN-SYMB TERM) SHELL-ALIST]) (SHELL-DESTRUCTOR-NESTP [LAMBDA (VAR TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (EQ VAR TERM)) ((FQUOTEP TERM) NIL) (T (AND (for POCKET in SHELL-POCKETS thereis (MEMB (FFN-SYMB TERM) (CDR POCKET))) (SHELL-DESTRUCTOR-NESTP VAR (FARGN TERM 1]) (SHELL-OCCUR [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (* Returns T if TERM1 properly occurs in a nest of shells TERM2.  That is whether TERM1 occurs as an arg at some depth in the shell TERM2, and  that the chain of shells from the occurrence to TERM1 all the way up to the top  of TERM2 is properly typed. See the comment in SHELL-OCCUR1.  Does not bother to do anything if TERM1 is a SHELLP, because  (assuming the terms are coming from EQUAL expressions) the two shells would be  either different and we wouldn't be here, or the same, in which case they would  be rewritten. At the moment the only fn to call SHELL-OCCUR is NOT-IDENT and we  only use NOT-IDENT to decide EQUALs or else one of the two terms is FALSE.  *) (LET (TYPE-SET-TERM1) (COND ((SHELLP TERM1) NIL) ((VARIABLEP TERM2) NIL) ((FQUOTEP TERM2) NIL) ((ASSOC (FFN-SYMB TERM2) SHELL-ALIST) (SETQ TYPE-SET-TERM1 (TYPE-SET TERM1)) (for ARG in (FARGS TERM2) as TR in (GET1 (FFN-SYMB TERM2) (QUOTE TYPE-RESTRICTIONS)) thereis (AND (SETQ TEMP-TEMP (SHELL-OCCUR1 TERM1 ARG)) (LOGSUBSETP TEMP-TEMP (fetch (TYPE-RESTRICTION TYPE-SET) of TR))))) (T NIL]) (SHELL-OCCUR1 [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (* This function wants to see whether TERM1 occurs as an arg to a shell in  TERM2. However, because of type restrictions, one must not be fooled into  thinking that, for example, (ADD1 0) occurs inside of  (ADD1 (CONS (ADD1 0) NIL)) despite the fact that it occurs as an arg to a  shell. The basic idea is that TERM1 must either be TERM2 or else must  shell-occur inside the shell TERM2 -- in a spot of the right type.  Thus, one way to compute it would be to see if TERM1 shell-occurred in an arg  position of shell TERM2 and if so to then determine if the typeset of the arg  was suitable. However, that would involve either a general purpose call on  typeset or else looking ahead to see whether the arg in which TERM1 occurred  was itself a shell -- in which case its typeset is just on its  type-prescription -- or was a TERM1 occurrence itself --  in which case a full blown typeset is necessary.  Rather than do it that way we have fixed SHELL-OCCUR1 so that it returns the  typeset of TERM2 if an occurrence was found, and otherwise NIL.  *) (COND ((EQUAL TERM1 TERM2) TYPE-SET-TERM1) ((VARIABLEP TERM2) NIL) ((FQUOTEP TERM2) NIL) ((AND (ASSOC (FFN-SYMB TERM2) SHELL-ALIST) (for ARG in (FARGS TERM2) as TR in (GET1 (FFN-SYMB TERM2) (QUOTE TYPE-RESTRICTIONS)) thereis (AND (SETQ TEMP-TEMP (SHELL-OCCUR1 TERM1 ARG)) (LOGSUBSETP TEMP-TEMP (fetch (TYPE-RESTRICTION TYPE-SET) of TR))))) (CAR (TYPE-PRESCRIPTION (FFN-SYMB TERM2)))) (T NIL]) (SHELLP [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) T) (T (OR (MEMB (FFN-SYMB TERM) *1*BTM-OBJECTS) (ASSOC (FFN-SYMB TERM) SHELL-ALIST]) (SIMPLIFY-CLAUSE [LAMBDA (CURRENT-SIMPLIFY-CL HIST) (* kbr: "19-Oct-85 22:43") (* If T is returned, then the conjunction of PROCESS-CLAUSES implies  CURRENT-SIMPLIFY-CL. Equivalently, if T is returned, then under the assumption  that CURRENT-SIMPLIFY-CL is F, CURRENT-SIMPLIFY-CL is equivalent to the  conjunction of PROCESS-CLAUSES. Note that PROCESS-CLAUSES may be the facetious  answer F, i.e., false generalization may and does happen.  We know such tail biting can occur through use of linear arithmetic.  We are uncertain whether it can occur without use of linear arithmetic.  To make it happen with linear we just need two slightly different versions of  the same inequality literal. The poly arising from the second is used to  rewrite the first to false and the poly arising from the first --  which is still in the pot list -- is used to rewrite the second to false.  LITS-TO-BE-IGNORED-BY-LINEAR actually prevents this direct example from working  -- the poly arising from the first is ignored after its literal has been  rewritten to false. To overcome this minor obstacle, it is necessary to cause  the first literal to be rewritten to something that will prove to be false  eventually but isn't syntactically F. *) (LET (ANS (TERMS-TO-BE-IGNORED-BY-REWRITE TERMS-TO-BE-IGNORED-BY-REWRITE) (EXPAND-LST EXPAND-LST)) (PROG NIL (COND ((SETQ TEMP-TEMP (ASSOC (QUOTE SETTLED-DOWN-CLAUSE) HIST)) (* The clause has settled down under rewriting with the INDUCTION-HYP-TERMS  ignored and the INDUCTION-CONCL-TERMS forcibly expanded.  In general then we now want to stop treating these terms specially and continue  simplifying. However, there is a special case that will save a little time.  Suppose that the clause just settled down --  that is, the most recent HIST entry is the settled mark.  And suppose that none of the specially treated terms occurs in the clause we're  to simplify. Then we needn't simplify it again.  The first supposition is important. Imagine that the clause settled down long  ago and we have done much since then. *) (COND ((AND (EQ TEMP-TEMP (CAR HIST)) (for TERM in INDUCTION-HYP-TERMS never (DUMB-OCCUR-LST TERM CURRENT-SIMPLIFY-CL))) (* Since we know the INDUCTION-CONCL-TERMS couldn't occur in the clause --  they would have been expanded -- it suffices to check for just the hyp terms.  This test should speed up base cases and the preinduction simplification at  least. *) (RETURN NIL)))) (T (* The clause has not yet settled  down, so arrange to ignore  INDUCTION-HYP-TERMS during rewriting  and to expand without question  INDUCTION-CONCL-TERMS.  *) (SETQ TERMS-TO-BE-IGNORED-BY-REWRITE (APPEND INDUCTION-HYP-TERMS TERMS-TO-BE-IGNORED-BY-REWRITE)) (SETQ EXPAND-LST (APPEND INDUCTION-CONCL-TERMS EXPAND-LST)))) (INIT-LEMMA-STACK) (PUSH-LEMMA-FRAME) (SETQ PROCESS-CLAUSES (SIMPLIFY-CLAUSE0 CURRENT-SIMPLIFY-CL HIST)) (SETQ PROCESS-HIST (for X in (POP-LEMMA-FRAME) unless (AND (LISTP X) (NLISTP (CAR X))) collect X)) (* The lemmas ignored are really literals from LITS-THAT-MAY-BE-ASSUMED-FALSE  that get put in by REWRITE-SOLIDIFY. The identifying test for these literals is  not a simple LISTP because PROCESS-EQUATIONAL-POLYS puts in some LISTP elements  to encode its additions to the clause and we must preserve them.  *) (for X in PROCESS-HIST unless (OR (LISTP X) (MEMB X ALL-LEMMAS-USED)) do (SETQ ALL-LEMMAS-USED (CONS X ALL-LEMMAS-USED))) (RETURN (NOT (AND (IEQP (LENGTH PROCESS-CLAUSES) 1) (EQUAL (CAR PROCESS-CLAUSES) CURRENT-SIMPLIFY-CL]) (SIMPLIFY-CLAUSE-MAXIMALLY [LAMBDA (CURRENT-CL) (* kbr: "19-Oct-85 16:31") (LET (SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES SIMPLIFY-CLAUSE-MAXIMALLY-HIST) (SIMPLIFY-CLAUSE-MAXIMALLY1 CURRENT-CL) (SETQ PROCESS-HIST SIMPLIFY-CLAUSE-MAXIMALLY-HIST) (SETQ PROCESS-CLAUSES SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES) (NOT (EQUAL PROCESS-CLAUSES (LIST CURRENT-CL]) (SIMPLIFY-CLAUSE-MAXIMALLY1 [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (COND ((SIMPLIFY-CLAUSE CL NIL) (for X in PROCESS-HIST unless (OR (LISTP X) (MEMB X SIMPLIFY-CLAUSE-MAXIMALLY-HIST)) do (SETQ SIMPLIFY-CLAUSE-MAXIMALLY-HIST (CONS X SIMPLIFY-CLAUSE-MAXIMALLY-HIST))) (for CL in PROCESS-CLAUSES do (SIMPLIFY-CLAUSE-MAXIMALLY1 CL))) (T (SETQ SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES (CONS CL SIMPLIFY-CLAUSE-MAXIMALLY-CLAUSES]) (SIMPLIFY-CLAUSE0 [LAMBDA (CL HIST) (* kbr: " 6-Jul-86 09:45") (* Called by SIMPLIFY-CLAUSE.  *) (PROG (TYPE-ALIST SIMPLIFY-CLAUSE-POT-LST CLS NEG-HYPS) (SETQ CL (REMOVE-TRIVIAL-EQUATIONS CL)) (SETQ TYPE-ALIST (TYPE-ALIST-CLAUSE CL)) (COND ((EQ (QUOTE CONTRADICTION) TYPE-ALIST) (RETURN NIL))) (SET-SIMPLIFY-CLAUSE-POT-LST CL TYPE-ALIST) (COND ((EQ SIMPLIFY-CLAUSE-POT-LST (QUOTE CONTRADICTION)) (SETQ CLS NIL)) (T (SETQ CLS (LIST (PROCESS-EQUATIONAL-POLYS CL HIST SIMPLIFY-CLAUSE-POT-LST))))) (COND ((NOT (AND (IEQP (LENGTH CLS) 1) (EQUAL (CAR CLS) CL))) (PUSH-LEMMA (QUOTE ZERO)) (for X in LEMMAS-USED-BY-LINEAR do (PUSH-LEMMA X)) (SETQ LINEAR-ASSUMPTIONS (for HYP in LINEAR-ASSUMPTIONS unless (for LIT in CL thereis (COMPLEMENTARYP HYP LIT)) collect HYP)) (SETQ NEG-HYPS (for HYP in LINEAR-ASSUMPTIONS collect (DUMB-NEGATE-LIT HYP))) (SETQ CLS (for CL in CLS collect (DISJOIN-CLAUSES NEG-HYPS CL))) (for TERM in LINEAR-ASSUMPTIONS do (SETQ CLS (CONS (CONS TERM CL) CLS))) (RETURN CLS)) (T (RETURN (SIMPLIFY-CLAUSE1 CL NIL NIL 1]) (SIMPLIFY-CLAUSE1 [LAMBDA (TAIL NEW-CLAUSE LITS-TO-BE-IGNORED-BY-LINEAR I) (* kbr: " 6-Jul-86 09:46") (* Called by SIMPLIFY-CLAUSE0. Returns a list of clauses whose conjunction is  equivalent to the clause CL formed by appending TAIL to NEW-CLAUSE under the  hypothesis of the polys in SIMPLIFY-CLAUSE-POT-LST and under the hypothesis  that CL is false. *) (PROG (VAL SEGS TYPE-ALIST NEG-HYPS CURRENT-LIT CURRENT-ATM BRANCHES) (COND ((NULL TAIL) (RETURN (LIST NEW-CLAUSE))) (T (PRINT-TO-DISPLAY (QUOTE SIMPLIFY-CLAUSE) I NIL) (SETQ CURRENT-LIT (SETQ CURRENT-ATM (CAR TAIL))) (BM-MATCH CURRENT-ATM (NOT CURRENT-ATM)) (SETQ LITS-TO-BE-IGNORED-BY-LINEAR (CONS CURRENT-LIT LITS-TO-BE-IGNORED-BY-LINEAR)) (SETQ FNSTACK NIL) (SETQ TYPE-ALIST (TYPE-ALIST-CLAUSE NEW-CLAUSE)) (COND ((EQ TYPE-ALIST (QUOTE CONTRADICTION)) (RETURN NIL))) (SETQ TYPE-ALIST (TYPE-ALIST-CLAUSE (CDR TAIL))) (COND ((EQ TYPE-ALIST (QUOTE CONTRADICTION)) (RETURN NIL))) (INIT-LINEARIZE-ASSUMPTIONS-STACK) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME) (SETQ VAL (REWRITE CURRENT-ATM NIL TYPE-ALIST (QUOTE ?) (QUOTE IFF) NIL)) (COND ((NEQ CURRENT-LIT CURRENT-ATM) (SETQ VAL (NEGATE-LIT VAL)))) (SETQ LINEAR-ASSUMPTIONS (POP-LINEARIZE-ASSUMPTIONS-FRAME)) (SETQ NEG-HYPS (for HYP in LINEAR-ASSUMPTIONS collect (NEGATE-LIT HYP))) (SETQ BRANCHES (CLAUSIFY VAL)) (SETQ SEGS (CONJOIN-CLAUSE-SETS (for SEG in BRANCHES collect (DISJOIN-CLAUSES NEG-HYPS SEG)) (for HYP in LINEAR-ASSUMPTIONS bind (CL _ (ADD-LITERAL (PEGATE-LIT CURRENT-LIT) NIL NIL)) collect (ADD-LITERAL HYP CL NIL)))) (RETURN (for SEG in SEGS join (SIMPLIFY-CLAUSE1 (CDR TAIL) (APPEND NEW-CLAUSE SEG) (COND ((EQUAL BRANCHES (QUOTE (NIL))) LITS-TO-BE-IGNORED-BY-LINEAR) (T (CDR LITS-TO-BE-IGNORED-BY-LINEAR))) (ADD1 I]) (SIMPLIFY-LOOP [LAMBDA (CLAUSES) (* kbr: "20-Oct-85 15:36") (* This function just serves as a target for the RETFROM in STORE-SENT in the  event that we are working on the original input and find that we have split it  into more than one goal and want to back up and use induction on the input  term. *) (for CURRENT-CL in CLAUSES do (SIMPLIFY-SENT CURRENT-CL NIL]) (SIMPLIFY-SENT [LAMBDA (CL HIST) (* kbr: "19-Oct-85 16:31") (EXECUTE (QUOTE SIMPLIFY-CLAUSE) CL HIST (QUOTE SIMPLIFY-SENT) (QUOTE SETTLED-DOWN-SENT]) (SINGLETON-CONSTRUCTOR-TO-RECOGNIZER [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (COND ((SETQ TEMP-TEMP (ASSOC FNNAME SHELL-ALIST)) (SETQ TEMP-TEMP (LSH 1 (CDR TEMP-TEMP))) (COND ((MEMBER TEMP-TEMP SINGLETON-TYPE-SETS) (CAR (for PAIR in RECOGNIZER-ALIST when (EQUAL TEMP-TEMP (CDR PAIR)) do (RETURN PAIR)))) (T NIL))) (T NIL]) (SKO-DEST-NESTP [LAMBDA (TERM DEEPFLG) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) T) ((FQUOTEP TERM) NIL) ((AND (SETQ TEMP-TEMP (GET1 (FFN-SYMB TERM) (QUOTE ELIMINATE-DESTRUCTORS-SEQ))) (NOT (DISABLEDP (fetch (REWRITE-RULE NAME) of TEMP-TEMP)))) (COND (DEEPFLG (for X in (FARGS TERM) always (SKO-DEST-NESTP X DEEPFLG))) (T (for X in (FARGS TERM) always (VARIABLEP X))))) (T NIL]) (SOME-SUBTERM-WORSE-THAN-OR-EQUAL [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (* Returns T if some subterm of TERM1  is WORSE-THAN or EQUAL to TERM2  itself. *) (COND ((VARIABLEP TERM1) (EQ TERM1 TERM2)) ((OR (EQUAL TERM1 TERM2) (QUICK-WORSE-THAN TERM1 TERM2)) T) ((FQUOTEP TERM1) NIL) (T (for ARG in (FARGS TERM1) thereis (SOME-SUBTERM-WORSE-THAN-OR-EQUAL ARG TERM2]) (SORT-DESTRUCTOR-CANDIDATES [LAMBDA (LST) (* kbr: "22-Oct-85 15:37") (* Each element of LST is a list of NVARIABLEP nonQUOTEP terms.  We sort them into descending order according to the sum of the level numbers of  the fn symbols of the terms in the CDR of each element.  INTERLISP's SORT is apparently nonstable and frequently  (perhaps always) reverses elements of equal weight.  Zetalisp sort is stable. We found three occasions in the rsa and wilson proofs  when this difference bit us and caused a different elimination to be chosen  first. The first two times we fixed it by letting it do the new elim and just  seeing that the appropriate lemmas were available to handle the new goals.  But on the third time we decided simply to REVERSE the input list to mimic  INTERLISP's sort, just so we could get on with reproducing the old proofs on  the new machine. *) (SORT (REVERSE LST) (FUNCTION (LAMBDA (X Y) (GREATERP (for TERM in (CDR X) sum (GET-LEVEL-NO (FFN-SYMB TERM))) (for TERM in (CDR Y) sum (GET-LEVEL-NO (FFN-SYMB TERM]) (SOUND-IND-PRIN-MASK [LAMBDA (TERM JUSTIFICATION FORMALS QUICK-BLOCK-INFO) (* kbr: "19-Oct-85 16:31") (* TERM is a term we are considering doing induction for.  JUSTIFICATION is one of the justifications associated with the function symbol  of TERM. FORMALS is the formals list of the fn and QUICK-BLOCK-INFO is the  obvious. JUSTIFICATION and the machine for fn describe an induction.  We wish to determine, in the terminology of ACL, whether the induction applies  to TERM. If so we return a mask indicating how to build the substitutions for  the induction from TERM and the machine for fn.  Otherwise we return NIL. Let the changeables be those actuals of TERM that are  in the measured subset of JUSTIFICATION and that sometimes change in the  recursion. Let the unchangeables be all of the variables occurring in measured  actuals that never change in recursion. The induction applies if changeables is  a sequence of distinct variable names and has an empty intersection with  unchangeables. If the induction is applicable then the substitutions should  substitute for the changeables just as the recursion would, and hold each  unchangeable fixed -- i.e., substitute each for itself.  With such substitutions it is possible to prove the measure lemmas analogous to  those proved in JUSTIFICATION, except that the measure is obtained by  instantiating the measure term used in the justification by the measured  actuals in unchanging slots. Actual variables that are neither among the  changeables or unchangeables may be substituted for arbitrarily.  If the induction is applicable we return a mask with as many elements as there  are actuals. For each actual the mask contains either CHANGEABLE, UNCHANGEABLE,  or NIL. CHANGEABLE means the actual should be instantiated as specified in the  recursion. UNCHANGEABLE means each var in the actual should be held fixed.  NIL means that the corresponding substitution pairs in the machine for the  function should be ignored. Abstractly, this function builds the mask by first  putting either CHANGEABLE or UNCHANGEABLE in each measured slot.  It then fills in the remaining slots from the left so as to permit the actual  to be instantiated or held fixed as desired by the recursion, provided that in  so doing it does not permit substitutions for previously allocated actuals.  *) (PROG (UNCHANGEABLES SUBSET CHANGEABLES) (SETQ SUBSET (fetch (JUSTIFICATION SUBSET) of JUSTIFICATION)) (SETQ UNCHANGEABLES (for ACTUAL in (FARGS TERM) as VAR in FORMALS as Q in QUICK-BLOCK-INFO bind LOOP-ANS when (AND (MEMB VAR SUBSET) (EQ Q (QUOTE UNCHANGING))) do (SETQ LOOP-ANS (UNIONQ (ALL-VARS ACTUAL) LOOP-ANS)) finally (RETURN LOOP-ANS))) (SETQ CHANGEABLES (for ACTUAL in (FARGS TERM) as VAR in FORMALS as Q in QUICK-BLOCK-INFO when (AND (MEMB VAR SUBSET) (NEQ Q (QUOTE UNCHANGING))) collect ACTUAL)) (COND ((OR (NOT (NO-DUPLICATESP CHANGEABLES)) (for X in CHANGEABLES thereis (NVARIABLEP X)) (INTERSECTP CHANGEABLES UNCHANGEABLES)) (RETURN NIL))) (RETURN (for ACTUAL in (FARGS TERM) as Q in QUICK-BLOCK-INFO as VAR in FORMALS collect (COND ((MEMB VAR SUBSET) (COND ((EQ Q (QUOTE UNCHANGING)) (QUOTE UNCHANGEABLE)) (T (QUOTE CHANGEABLE)))) ((AND (VARIABLEP ACTUAL) (EQ Q (QUOTE UNCHANGING))) (COND ((MEMB ACTUAL CHANGEABLES) NIL) (T (SETQ UNCHANGEABLES (ADD-TO-SET ACTUAL UNCHANGEABLES)) (QUOTE UNCHANGEABLE)))) ((AND (VARIABLEP ACTUAL) (NOT (MEMB ACTUAL CHANGEABLES)) (NOT (MEMB ACTUAL UNCHANGEABLES))) (SETQ CHANGEABLES (CONS ACTUAL CHANGEABLES)) (QUOTE CHANGEABLE)) (T NIL]) (STACK-DEPTH [LAMBDA (STK) (* kbr: "19-Oct-85 21:59") (ADD1 (LENGTH STK]) (START-STATS [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (SETQ ELAPSEDTHMTIME (TIME-IN-60THS)) (SETQ IOTHMTIME 0]) (STOP-STATS [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (PRINT-STATS (QUOTIENT (FLOAT (DIFFERENCE (DIFFERENCE (TIME-IN-60THS) ELAPSEDTHMTIME) IOTHMTIME)) 60.0) (QUOTIENT (FLOAT IOTHMTIME) 60.0) PROVE-FILE]) (STORE-SENT [LAMBDA (CL HIST) (* kbr: "20-Oct-85 15:36") (LET (CL-SET) (COND ((NULL CL) (IO (QUOTE STORE-SENT) CL HIST NIL (LIST (GET-STACK-NAME STACK))) (WRAPUP NIL)) (DO-NOT-USE-INDUCTION-FLG (IO (QUOTE STORE-SENT) CL HIST NIL (LIST (GET-STACK-NAME STACK) (QUOTE QUIT))) (WRAPUP NIL)) ((AND (NOT (AND IN-PROVE-LEMMA-FLG (ASSOC (QUOTE INDUCT) HINTS))) (OR (AND (NULL STACK) (for X in HIST thereis (NOT (MEMB (CAR X) (QUOTE (SETTLED-DOWN-CLAUSE SIMPLIFY-CLAUSE SETUP))))) ) (AND STACK (NOT (ASSOC (QUOTE BEING-PROVED) STACK))))) (* Abort and push the input clause to work on if  (a) this is the first time we've ever pushed anything and we've done anything  to the input other than simplify it, or (b) we have not yet gone into the first  induction for the original conjecture but have already pushed one simplified  subgoal. *) (SETQ STACK NIL) (SETQ CL-SET (CNF-DNF THM (QUOTE C))) (* Once upon a time we backed up to the output of PREPROCESS in PROVE.  However, PREPROCESS -- and CLAUSIFY-INPUT --  applies unconditional rewrite rules and we want the ability as users to type in  exactly what the system inducts on. The theorem that PREPROCESS screwed us on  was HACK1 when it distributed TIMES and GCD.  *) (IO (QUOTE STORE-SENT) CL NIL NIL (LIST (GET-STACK-NAME STACK) CL-SET)) (PUSH-CLAUSE-SET CL-SET) (RETFROM (QUOTE SIMPLIFY-LOOP) NIL)) (T (SETQ CL-SET (LIST CL)) (IO (QUOTE STORE-SENT) CL HIST NIL (LIST (GET-STACK-NAME STACK))) (PUSH-CLAUSE-SET CL-SET]) (STRIP-BRANCHES [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (CL) (for PAIR in (COND ((BM-MATCH TERM (NOT TERM)) (STRIP-BRANCHES1 TERM T T)) (T (STRIP-BRANCHES1 TERM T NIL))) unless (EQUAL (SETQ CL (ADD-LITERAL (PEGATE-LIT (CAR PAIR)) (CDR PAIR) T)) TRUE-CLAUSE) collect CL]) (STRIP-BRANCHES1 [LAMBDA (TERM TOPFLG NEGATE-FLG) (* kbr: "19-Oct-85 16:31") (LET (ANS1 ANS2 ANS3 ANS LST NEW-CL) (COND ((VARIABLEP TERM) (LIST (CONS (COND (NEGATE-FLG (NEGATE-LIT TERM)) (T TERM)) NIL))) ((FQUOTEP TERM) (COND (TOPFLG (COND ((EQUAL TERM FALSE) (COND (NEGATE-FLG NIL) (T (LIST (CONS FALSE NIL))))) (NEGATE-FLG (LIST (CONS FALSE NIL))) (T NIL))) (NEGATE-FLG (LIST (CONS (COND ((EQUAL TERM FALSE) TRUE) (T FALSE)) NIL))) (T (LIST (CONS TERM NIL))))) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (COND ((AND TOPFLG (OR (AND (NOT NEGATE-FLG) (EQUAL (FARGN TERM 3) FALSE)) (AND NEGATE-FLG (EQUAL (FARGN TERM 3) TRUE)))) (APPEND (for PAIR in (STRIP-BRANCHES1 (FARGN TERM 1) TOPFLG NIL) unless (EQUAL (SETQ NEW-CL (ADD-LITERAL (PEGATE-LIT (CAR PAIR)) (CDR PAIR) T)) TRUE-CLAUSE) collect (CONS FALSE NEW-CL)) (STRIP-BRANCHES1 (FARGN TERM 2) TOPFLG NEGATE-FLG))) ((AND TOPFLG (OR (AND (NOT NEGATE-FLG) (EQUAL (FARGN TERM 2) FALSE)) (AND NEGATE-FLG (EQUAL (FARGN TERM 2) TRUE)))) (APPEND (for PAIR in (STRIP-BRANCHES1 (FARGN TERM 1) TOPFLG T) unless (EQUAL (SETQ NEW-CL (ADD-LITERAL (PEGATE-LIT (CAR PAIR)) (CDR PAIR) T)) TRUE-CLAUSE) collect (CONS FALSE NEW-CL)) (STRIP-BRANCHES1 (FARGN TERM 3) TOPFLG NEGATE-FLG))) (T (SETQ ANS1 (STRIP-BRANCHES1 (FARGN TERM 1) NIL NIL)) (SETQ ANS2 (STRIP-BRANCHES1 (FARGN TERM 2) TOPFLG NEGATE-FLG)) (SETQ ANS3 (STRIP-BRANCHES1 (FARGN TERM 3) TOPFLG NEGATE-FLG)) (for PAIR in ANS1 do (for PAIR2 in ANS2 unless (EQUAL (CDR (SETQ ANS (CONS (CAR PAIR2) (DISJOIN-CLAUSES (CDR PAIR) (ADD-LITERAL (NEGATE-LIT (CAR PAIR)) (CDR PAIR2) NIL))))) TRUE-CLAUSE) do (SETQ LST (CONS ANS LST))) (for PAIR3 in ANS3 unless (EQUAL (CDR (SETQ ANS (CONS (CAR PAIR3) (DISJOIN-CLAUSES (CDR PAIR) (ADD-LITERAL (PEGATE-LIT (CAR PAIR)) (CDR PAIR3) NIL))))) TRUE-CLAUSE) do (SETQ LST (CONS ANS LST)))) LST))) (T (for PICK in (ALL-PICKS (for ARG in (FARGS TERM) collect (STRIP-BRANCHES1 ARG NIL NIL))) collect (CONS (COND (NEGATE-FLG (DUMB-NEGATE-LIT (SCONS-TERM (FFN-SYMB TERM) (for PAIR in PICK collect (CAR PAIR))))) (T (SCONS-TERM (FFN-SYMB TERM) (for PAIR in PICK collect (CAR PAIR))))) (for PAIR in PICK bind ANS until (EQUAL ANS TRUE-CLAUSE) do (SETQ ANS (DISJOIN-CLAUSES (CDR PAIR) ANS)) finally (RETURN ANS]) (SUB-SEQUENCEP [LAMBDA (SMALLER LARGER) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP SMALLER) T) ((NLISTP LARGER) NIL) ((EQUAL (CAR SMALLER) (CAR LARGER)) (SUB-SEQUENCEP (CDR SMALLER) (CDR LARGER))) (T (SUB-SEQUENCEP SMALLER (CDR LARGER]) (SUBBAGP [LAMBDA (BAG1 BAG2) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP BAG1) T) ((NLISTP BAG2) NIL) ((MEMBER (CAR BAG1) BAG2) (SUBBAGP (CDR BAG1) (DELETE1 (CAR BAG1) BAG2))) (T NIL]) (SUBLIS-EXPR [LAMBDA (ALIST FORM) (* kbr: "19-Oct-85 16:31") (for PAIR in ALIST do (COND ((QUOTEP (CAR PAIR)) (SUBST-EXPR-ERROR1 (CAR PAIR))))) (SUBLIS-EXPR1 ALIST FORM]) (SUBLIS-EXPR1 [LAMBDA (ALIST FORM) (* kbr: "19-Oct-85 16:31") (COND ((SETQ TEMP-TEMP (SASSOC FORM ALIST)) (CDR TEMP-TEMP)) ((VARIABLEP FORM) FORM) ((FQUOTEP FORM) FORM) (T (CONS-TERM (FFN-SYMB FORM) (for ARG in (FARGS FORM) collect (SUBLIS-EXPR1 ALIST ARG]) (SUBLIS-VAR [LAMBDA (ALIST FORM) (* kbr: "19-Oct-85 16:31") (* In REWRITE-WITH-LEMMAS we use this function with the NIL alist to put FORM  into quote normal form. Do not optimize this function for the NIL alist.  *) (COND ((VARIABLEP FORM) (COND ((SETQ TEMP-TEMP (ASSOC FORM ALIST)) (CDR TEMP-TEMP)) (T FORM))) ((FQUOTEP FORM) FORM) (T (CONS-TERM (FFN-SYMB FORM) (for ARG in (FARGS FORM) collect (SUBLIS-VAR ALIST ARG]) (SUBLIS-VAR-LST [LAMBDA (ALIST TERMLST) (* kbr: "19-Oct-85 16:31") (for TERM in TERMLST collect (SUBLIS-VAR ALIST TERM]) (SUB-PAIR-EXPR [LAMBDA (OLDLST NEWLST TERM) (* kbr: "19-Oct-85 16:31") (for X in OLDLST do (COND ((QUOTEP X) (SUBST-EXPR-ERROR1 X)))) (SUB-PAIR-EXPR1 OLDLST NEWLST TERM]) (SUB-PAIR-EXPR-LST [LAMBDA (OLDLST NEWLST LST) (* kbr: "19-Oct-85 16:31") (for X in LST collect (SUB-PAIR-EXPR OLDLST NEWLST X]) (SUB-PAIR-EXPR1 [LAMBDA (OLDLST NEWLST TERM) (* kbr: "19-Oct-85 16:31") (COND ((for OLD1 in OLDLST as NEW1 in NEWLST thereis (COND ((EQUAL OLD1 TERM) (SETQ TEMP-TEMP NEW1) T) (T NIL))) TEMP-TEMP) ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) (T (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (SUB-PAIR-EXPR1 OLDLST NEWLST ARG]) (SUB-PAIR-VAR [LAMBDA (OLDLST NEWLST TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) (COND ((for OLD1 in OLDLST as NEW1 in NEWLST thereis (COND ((EQ OLD1 TERM) (SETQ TEMP-TEMP NEW1) T) (T NIL))) TEMP-TEMP) (T TERM))) ((FQUOTEP TERM) TERM) (T (CONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (SUB-PAIR-VAR OLDLST NEWLST ARG]) (SUB-PAIR-VAR-LST [LAMBDA (OLDLST NEWLST LST) (* kbr: "19-Oct-85 16:31") (for X in LST collect (SUB-PAIR-VAR OLDLST NEWLST X]) (SUBST-EXPR [LAMBDA (NEW OLD FORM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP OLD) (SUBST-VAR NEW OLD FORM)) ((FQUOTEP OLD) (SUBST-EXPR-ERROR1 OLD)) (T (SUBST-EXPR1 NEW OLD FORM]) (SUBST-EXPR-ERROR1 [LAMBDA (OLD) (* kbr: "19-Oct-85 16:31") (ERROR1 (PQUOTE (PROGN ATTEMPT TO BM-SUBST FOR THE EXPLICIT CONSTANT (!PPR OLD NIL) %. THE SUBSTITUTION FUNCTIONS WERE OPTIMIZED TO DISALLOW THIS %.)) (BINDINGS (QUOTE OLD) OLD) (QUOTE HARD]) (SUBST-EXPR-LST [LAMBDA (NEW OLD LST) (* kbr: "19-Oct-85 16:31") (for X in LST collect (SUBST-EXPR NEW OLD X]) (SUBST-EXPR1 [LAMBDA (NEW OLD FORM) (* kbr: "19-Oct-85 16:31") (COND ((EQUAL OLD FORM) NEW) ((VARIABLEP FORM) FORM) ((FQUOTEP FORM) FORM) (T (CONS-TERM (FFN-SYMB FORM) (for ARG in (FARGS FORM) collect (SUBST-EXPR1 NEW OLD ARG]) (SUBST-FN [LAMBDA (NEW OLD TERM) (* kbr: "19-Oct-85 16:31") (* Replaces calls of OLD with calls of  NEW. Assumes both have same arity and  that neither is a shell constructor or  bottom object. *) (COND ((VARIABLEP TERM) TERM) ((FQUOTEP TERM) TERM) ((EQ OLD (FFN-SYMB TERM)) (FCONS-TERM NEW (for ARG in (FARGS TERM) collect (SUBST-FN NEW OLD ARG)))) (T (FCONS-TERM (FFN-SYMB TERM) (for ARG in (FARGS TERM) collect (SUBST-FN NEW OLD ARG]) (SUBST-VAR [LAMBDA (NEW OLD FORM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP FORM) (COND ((EQ FORM OLD) NEW) (T FORM))) ((FQUOTEP FORM) FORM) (T (CONS-TERM (FFN-SYMB FORM) (for ARG in (FARGS FORM) collect (SUBST-VAR NEW OLD ARG]) (SUBST-VAR-LST [LAMBDA (NEW OLD TERMLST) (* kbr: "19-Oct-85 16:31") (for TERM in TERMLST collect (SUBST-VAR NEW OLD TERM]) (BM-SUBST [LAMBDA (NEW OLD FORM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP OLD) (SUBST-VAR NEW OLD FORM)) (T (SUBST-EXPR NEW OLD FORM]) (SUBSUMES [LAMBDA (CL1 CL2) (* kbr: "19-Oct-85 16:31") (LET (UNIFY-SUBST) (SUBSUMES1 CL1]) (SUBSUMES-REWRITE-RULE [LAMBDA (REWRITE-RULE1 REWRITE-RULE2) (* kbr: "19-Oct-85 16:31") (LET (UNIFY-SUBST (CL2 (fetch (REWRITE-RULE HYPS) of REWRITE-RULE2))) (AND (ONE-WAY-UNIFY1 (fetch (REWRITE-RULE CONCL) of REWRITE-RULE1) (fetch (REWRITE-RULE CONCL) of REWRITE-RULE2)) (SUBSUMES1 (fetch (REWRITE-RULE HYPS) of REWRITE-RULE1]) (SUBSUMES1 [LAMBDA (CL1) (* kbr: "19-Oct-85 16:31") (* Also called by SUBSUMES-SEQ.  *) (COND ((NULL CL1) T) (T (for LIT in CL2 thereis (SUBSUMES11 LIT CL1 UNIFY-SUBST]) (SUBSUMES11 [LAMBDA (LIT CL1 UNIFY-SUBST) (* kbr: "19-Oct-85 16:31") (AND (ONE-WAY-UNIFY1 (CAR CL1) LIT) (SUBSUMES1 (CDR CL1]) (SUM-STATS-ALIST [LAMBDA (ALIST) (* kbr: "25-Oct-85 16:21") (PROG (CPU IO) (SETQ CPU 0) (SETQ IO 0) (for X in ALIST do (SETQ CPU (IPLUS (CADR X) CPU)) (SETQ IO (IPLUS (CADDR X) IO))) (RETURN (LIST CPU IO]) (TABULATE [LAMBDA (N FILE) (* kbr: "19-Oct-85 16:31") (ISPACES (IDIFFERENCE N (IPOSITION FILE NIL NIL)) FILE]) (TERM-ORDER [LAMBDA (TERM1 TERM2) (* kbr: "26-Oct-85 17:20") (* A simple -- or complete or total -- ordering is a relation satisfying: XrX.  TERM-ORDER is a simple ordering on terms.  (TERM-ORDER TERM1 TERM2) if and only if (a) the number of occurrences of  variables in TERM1 is strictly less than the number in TERM2, or  (b) the numbers of variable occurrences are equal and the FORM-COUNT of TERM1  is strictly less than that of TERM2, or (c) the numbers of variable occurrences  are equal, the FORM-COUNTS are equal, and  (LEXORDER TERM1 TERM2)%. Let (STRICT-TERM-ORDER X Y) be the LISP function  defined as (AND (TERM-ORDER X Y) (NOT (EQUAL X Y)))%.  For a fixed, finite set of function symbols and variable symbols  STRICT-TERM-ORDER is well founded, as can be proved with the following lemma.  Lemma. Suppose that M is a function whose range is well ordered by r and such  that the inverse image of any member of the range is finite.  Suppose that L is a total order. Define (LESSP ITIMES y) IEQP  (OR (r (M ITIMES) (M y)) (AND (EQUAL (M ITIMES)  (M y)) (L ITIMES y) (NOT (EQUAL ITIMES y))))%.  ILESSP is a well-ordering. Proof. Suppose ...  ILESSP t3 ILESSP t2 ILESSP t1 is an infinite descending sequence.  ..., (M t3), (M t2), (M t1) is weakly descending but not infinitely descending  and so has a least element. WLOG assume ...  IEQP (M t3) IEQP (M t2) IEQP (M t1)%. By the finiteness of the inverse image of  (M t1), { ..., t3, t2, t1} is a finite set, which has a least element under L,  WLOG t27. But t28 L t27 and t28 /= t27 by t28 ILESSP t27, contradicting the  minimality of t27. QED If (TERM-ORDER ITIMES y) and t2 results from replacing  one occurrence of y with ITIMES in t1, then  (TERM-ORDER t2 t1)%. Cases on why ITIMES is less than y.  1.0 If the number of occurrences of variables in ITIMES is strictly smaller  than in y, then the number in t2 is strictly smaller than in t1.  2.0 If the number of occurrences of variables in ITIMES is equal to the number  in y but (FORM-COUNT ITIMES) is smaller than  (FORM-COUNT y), then the number of occurrences in t1 is equal to the number in  t2 but (FORM-COUNT t1) is less than (FORM-COUNT t2)%.  3.0 If the number of variable occurrences and parenthesis occurrences in ITIMES  and y are the same, then (LEXORDER ITIMES y)%.  (TERM-ORDER t2 t1) reduces to (LEXORDER t2 t1) because the number of variable  and parenthesis occurrences in t2 and t1 are the same.  The lexicographic scan of t1 and t2 will be all equals until ITIMES and y are  hit. *) (LET (FORM-COUNT1 FORM-COUNT2 NUMBER-OF-VARIABLES1 NUMBER-OF-VARIABLES2) (* Side effect of FORM-COUNT is to set  NUMBER-OF-VARIABLES.  *) (SETQ FORM-COUNT1 (FORM-COUNT TERM1)) (SETQ NUMBER-OF-VARIABLES1 NUMBER-OF-VARIABLES) (SETQ FORM-COUNT2 (FORM-COUNT TERM2)) (SETQ NUMBER-OF-VARIABLES2 NUMBER-OF-VARIABLES) (COND ((LESSP NUMBER-OF-VARIABLES1 NUMBER-OF-VARIABLES2) T) ((LESSP NUMBER-OF-VARIABLES2 NUMBER-OF-VARIABLES1) NIL) ((LESSP FORM-COUNT1 FORM-COUNT2) T) ((LESSP FORM-COUNT2 FORM-COUNT1) NIL) (T (LEXORDER TERM1 TERM2]) (TERMINATION-MACHINE [LAMBDA (FNNAME TERM TESTS) (* kbr: "19-Oct-85 16:31") (* This function builds a list of TESTS-AND-CASE representing the function  FNNAME with body TERM. For each call of FNNAME in body, a TESTS-AND-CASE is  returned whose TESTS are all the tests that CASE is the arglist of the call.  If a rules b, then a governs b but not vice versa.  For example, in (if (g (if a b c)) d e), a governs b but does not rule b.  The reason for taking this weaker notion of governance is that we can show  easily that the TESTS-AND-CASEs are together sufficient to imply the  TESTS-AND-CASES generated by INDUCTION-MACHINE.  *) (COND ((OR (VARIABLEP TERM) (FQUOTEP TERM)) NIL) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (NCONC (for ARGLIST in (ALL-ARGLISTS FNNAME (FARGN TERM 1)) collect (create TESTS-AND-CASE TESTS _ TESTS CASE _ ARGLIST)) (TERMINATION-MACHINE FNNAME (FARGN TERM 2) (APPEND TESTS (LIST (FARGN TERM 1)))) (TERMINATION-MACHINE FNNAME (FARGN TERM 3) (APPEND TESTS (LIST (NEGATE-LIT (FARGN TERM 1))))))) (T (for ARGLIST in (ALL-ARGLISTS FNNAME TERM) collect (create TESTS-AND-CASE TESTS _ TESTS CASE _ ARGLIST]) (TP-EXPLODEN1 [LAMBDA (SYM) (* kbr: "19-Oct-85 16:31") (for N in (OUR-EXPLODEN SYM) collect (COND ((OR (IEQP N #/-) (AND (ILEQ #/0 N) (ILEQ N #/9))) N) ((AND (ILEQ #/A N) (ILEQ N #/Z)) (IDIFFERENCE N 32.0)) (T (ERROR1 (PQUOTE (PROGN QUOTED LITERAL ATOMS MUST BE IN LOWER CASE AND (!PPR X NIL) IS NOT %.)) (BINDINGS (QUOTE X) SYM) (QUOTE SOFT]) (TP-GETCHARN1 [LAMBDA (SYM N) (* kbr: "19-Oct-85 16:31") (LET ((A (OUR-GETCHARN SYM N))) (COND ((OR (IEQP A #/-) (AND (ILEQ #/0 A) (ILEQ A #/9))) A) ((AND (ILEQ #/A A) (ILEQ A #/Z)) (IDIFFERENCE A 32.0)) (T (ERROR1 (PQUOTE (PROGN QUOTED LITERAL ATOMS MUST BE IN LOWER CASE AND (!PPR X NIL) IS NOT %.)) (BINDINGS (QUOTE X) SYM) (QUOTE HARD]) (TP-IMPLODE1 [LAMBDA (L) (* kbr: "19-Oct-85 16:31") (OUR-IMPLODE (for N in L collect (COND ((OR (IEQP (OUR-GETCHARN N 1) #/-) (AND (ILEQ #/0 (OUR-GETCHARN N 1)) (ILEQ (OUR-GETCHARN N 1) #/9))) (OUR-GETCHARN N 1)) ((AND (ILEQ #/A (OUR-GETCHARN N 1)) (ILEQ (OUR-GETCHARN N 1) #/Z)) (IPLUS (OUR-GETCHARN N 1) 32.0)) (T (ERROR1 (PQUOTE (PROGN QUOTED LITERAL ATOMS MUST BE IN LOWER CASE AND (!PPR X NIL) IS NOT %.)) (BINDINGS (QUOTE X) (OUR-IMPLODE L)) (QUOTE HARD]) (TO-BE-IGNOREDP [LAMBDA (POLY) (* kbr: "19-Oct-85 16:31") (LET (LEMMAS LITS) (SETQ LEMMAS (fetch (POLY LEMMAS) of POLY)) (SETQ LITS (fetch (POLY LITERALS) of POLY)) (for LIT in LITS-TO-BE-IGNORED-BY-LINEAR thereis (OR (MEMB LIT LEMMAS) (MEMB LIT LITS]) (TOO-MANY-IFS [LAMBDA (ARGS VAL) (* kbr: "20-Oct-85 19:31") (* Let ARGS be the list of actuals to a nonrec fn.  Let VAL be the rewritten body. We wish to determine whether the expansion of  the fn call introduces too many IFs all at once.  Our motivation comes from an example like  (M2 (ZTAK & & &) (ZTAK & & &) (ZTAK & & &)) where the careless opening up of  everybody produces a formula with several hundred IFs in it because of M2's  duplication of the IFs coming from the simplification of the ZTAKs.  My first thought was to never expand a nonrec fn --  at the top level of the clause -- if it had some IFs in its args and to wait  till CLAUSIFY has cleaned things up. That slowed a proveall down by a factor of  2 -- and by a factor of 13 in PRIME-LIST-TIMES-LIST --  because of the ridiculously slow expansion of such basic nonrec fns as AND, OR,  NOT, and NLISTP. I have been thinking about the problem and have thought of the  following ideas. None except the final one have been implemented or tested.  I thought of permitting the expansion if VAL had fewer IFs than ARGS but that  is obviously bad because it does not permit the fn to introduce any IFs of its  own, e.g., as in AND. So I have decided to just prohibit the duplication of  IF-containing-args in VAL. That is, I do not want to expand the fn if the  expansion causes the duplication of some arg containing an IF.  Of course, it could be that an IF-containing-arg does not occur in VAL only  because it has been rewritten by some rewrite rule to some other term, possibly  containing even more IFs, but I have decided to ignore that and blame that  problem on the process that permitted the introduction of those IFs.  So when I say an arg is duplicated in VAL I really mean the arg literally  OCCURs twice. Then it occurred to me that if arg1 and arg2 both contained IFs  and arg1 was duplicated in VAL but arg2 did not occur at all, then perhaps one  should permit the expansion if the number of IFs in the arg1 occurrences are  less than the number in the arg1 plus arg2.  So that is what I have implemented. This function computes  (GREATERP (FOR ARG IN ARGS SUM (* (COUNT-IFS ARG) *))  (FOR ARG IN ARGS SUM (COUNT-IFS ARG))) but does it slightly more efficiently by  observing that if no IFs occur in any arg then there is no point in doing the  OCCUR-CNTs and that once the left hand side has been pushed beyond the right  there is no point in continuing. *) (LET (RHS LHS) (SETQ RHS (for ARG in ARGS sum (COUNT-IFS ARG))) (SETQ LHS 0) (COND ((ZEROP RHS) NIL) (T (for ARG in ARGS when (NOT (ZEROP (SETQ TEMP-TEMP (COUNT-IFS ARG)))) thereis (PROGN (* The WHEN clause above just takes advantage of the fact that if X is 0 then  X*Y is 0 and Y need not be computed. *) (GREATERP (SETQ LHS (PLUS (TIMES TEMP-TEMP (OCCUR-CNT ARG VAL)) LHS)) RHS]) (TOP-FNNAME [LAMBDA (CONCL) (* kbr: "19-Oct-85 16:31") (OR (BM-MATCH CONCL (NOT CONCL)) (BM-MATCH CONCL (EQUAL CONCL &))) (COND ((VARIABLEP CONCL) NIL) (T (FN-SYMB CONCL]) (TOTAL-FUNCTIONP [LAMBDA (FNNAME) (* kbr: "19-Oct-85 16:31") (LET (TEMP) (SETQ TEMP (GET1 FNNAME (QUOTE JUSTIFICATIONS))) (NOT (AND (IEQP (LENGTH TEMP) 1) (NULL (fetch (JUSTIFICATION RELATION) of (CAR TEMP))) (NOT (DISABLEDP FNNAME]) (TRANSITIVE-CLOSURE [LAMBDA (SET PRED) (* kbr: "26-Oct-85 14:02") (* Compares all pairs x,y of distinct occurrences of from the bag SET with  (PRED ITIMES y) and if PRED returns non-NIL, ITIMES and y are removed from SET  and the result of PRED is inserted. This operation is repeated until no changes  occur. CAUTION: It must be the case that  (PRED ITIMES y) IEQP (PRED y ITIMES) . *) (LET (ALIVE NEW RESULT) (SETQ ALIVE (for X in SET collect (CONS X T))) (SETQ NEW (COPYLIST ALIVE)) (while NEW unless (AND (CDR (CAR NEW)) (for TAIL on ALIVE when (PROG NIL LOOP (COND ((NULL (CDR (CAR TAIL))) (COND ((NULL (CDR TAIL)) (RETURN NIL)) (T (RPLACA TAIL (CADR TAIL)) (RPLACD TAIL (CDDR TAIL)) (GO LOOP))))) (RETURN (COND ((EQ (CAR TAIL) (CAR NEW)) NIL) ((SETQ RESULT (APPLY* PRED (CAR (CAR TAIL)) (CAR (CAR NEW)))) (SETQ RESULT (CONS RESULT T)) (RPLACD (CAR TAIL) NIL) (RPLACA TAIL RESULT) (RPLACD (CAR NEW) NIL) (RPLACA NEW RESULT) T) (T NIL)))) do (RETURN TAIL))) do (SETQ NEW (CDR NEW))) (for PAIR in ALIVE when (CDR PAIR) collect (CAR PAIR]) (TRANSLATE [LAMBDA (X) (* kbr: "26-Oct-85 17:19") (COND ((NLISTP X) (COND ((FIXP X) (LIST (QUOTE QUOTE) X)) ((LITATOM X) (COND ((EQ X T) TRUE) ((EQ X (QUOTE F)) FALSE) ((EQ X NIL) (QUOTE (QUOTE NIL))) ((ILLEGAL-NAME X) (ERROR1 (PQUOTE (PROGN (!PPR X NIL) IS AN ILLEGAL VARIABLE NAME %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) (T X))) (T (ERROR1 (PQUOTE (PROGN UNRECOGNIZED SYNTAX: (!PPR X NIL))) (BINDINGS (QUOTE X) X) (QUOTE SOFT))))) ((NOT (LISTP X)) (ERROR1 (PQUOTE (PROGN NO HUNKS PLEASE: (!PPR X NIL))) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((CDR (LAST X)) (ERROR1 (PQUOTE (PROGN CONTRARY TO THE RULES OF WELL-FORMEDNESS , THE LAST CDR OF (!PPR X NIL) IS NON-NIL)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((NOT (LITATOM (CAR X))) (ERROR1 (PQUOTE (PROGN FUNCTION SYMBOLS MUST BE LISP LITERAL ATOMS AND (!PPR (CAR X) NIL) IS NOT !)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((NOT (LITATOM (CAR X))) (ERROR1 (PQUOTE (PROGN (!PPR (CAR X) NIL) IS NOT INTERNED IN THE RIGHT PLACES !)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((PROPERTYLESS-SYMBOLP (CAR X)) (COND ((EQ (CAR X) (QUOTE QUOTE)) (COND ((NOT (IEQP 1 (LENGTH (CDR X)))) (ERROR1 (PQUOTE (PROGN QUOTE MUST BE GIVEN EXACTLY ONE ARGUMENT %. IN (!PPR X NIL) IT IS GIVEN THE WRONG NUMBER OF ARGUMENTS %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((NOT (EVG (CADR X))) (ERROR1 (PQUOTE (PROGN THE OBJECT QUOTED IN THE EXPRESSION (!PPR X NIL) DOES NOT REPRESENT AN EXPLICIT VALUE TERM)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) (T X))) ((MEMB (CAR X) (QUOTE (NIL T F))) (ERROR1 (PQUOTE (PROGN (!PPR (CAR X) NIL) IS AN ILLEGAL FUNCTION SYMBOL %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))) ((EQ (CAR X) (QUOTE LIST)) (COND ((NULL (CDR X)) (TRANSLATE NIL)) (T (XXXJOIN (QUOTE CONS) (NCONC1 (for ARG in (CDR X) collect (TRANSLATE ARG)) (TRANSLATE NIL)))))) ((CAR-CDRP (CAR X)) (COND ((IEQP (LENGTH (CDR X)) 1) (FIXCAR-CDR (LIST (CAR X) (TRANSLATE (CADR X))))) (T (ERROR1 (PQUOTE (PROGN (!PPR (CAR X) NIL) IS A RESERVED ABBREVIATION FOR A CAR-CDR NEST AND MUST BE GIVEN EXACTLY ONE ARGUMENT %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))))) (T (ERROR1 (PQUOTE (PROGN PROPERTYLESS-SYMBOLP AND TRANSLATE DO NOT AGREE ON (!PPR (CAR X) NIL) %.)) (BINDINGS (QUOTE X) X) (QUOTE HARD))))) ((NULL (ARITY (CAR X))) (COND (IN-BOOT-STRAP-FLG (ERROR1 (PQUOTE (PROGN (!PPR (CAR X) NIL) HAS BEEN ENCOUNTERED AS AN UNDEFINED FUNCTION BY TRANSLATE %. YOU SHOULD ADD IT TO THE BINDING OF ARITY-ALIST IN BOOT-STRAP IF YOU WISH TO SUPPRESS THIS MESSAGE !)) (BINDINGS (QUOTE X) X) (QUOTE WARNING))) (T (ERROR1 (PQUOTE (PROGN THE FUNCTION (!PPR (CAR X) NIL) IS UNKNOWN %. PLEASE DELETE ALL REFERENCES TO IT , DEFINE IT OR DECLARE IT AS AN UNDEFINED FUNCTION %.)) (BINDINGS (QUOTE X) X) (QUOTE SOFT))))) ((AND (MEMB (CAR X) (QUOTE (AND OR PLUS TIMES))) (IGREATERP (LENGTH (CDR X)) 2)) (XXXJOIN (CAR X) (for ARG in (CDR X) collect (TRANSLATE ARG)))) ((NOT (IEQP (LENGTH (CDR X)) (ARITY (CAR X)))) (ERROR1 (PQUOTE (PROGN THE FUNCTION SYMBOL (!PPR (CAR X) NIL) TAKES EXACTLY (@ N) ARGUMENTS %. IN (!PPR X NIL) IT IS GIVEN THE WRONG NUMBER OF ARGUMENTS %.)) (BINDINGS (QUOTE X) X (QUOTE N) (ARITY (CAR X))) (QUOTE SOFT))) ((MEMB (CAR X) BOOT-STRAP-MACRO-FNS) (SUB-PAIR-VAR (CADR (GET1 (CAR X) (QUOTE SDEFN))) (for ARG in (CDR X) collect (TRANSLATE ARG)) (CADDR (GET1 (CAR X) (QUOTE SDEFN))))) (T (CONS-TERM (CAR X) (for ARG in (CDR X) collect (TRANSLATE ARG]) (TRANSLATE-TO-LISP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (LET (ANS TIME) (SETQ TIME (TIME-IN-60THS)) (SETQ ALL-LEMMAS-USED NIL) (SETQ ANS (PRETTYIFY-LISP (OPTIMIZE-COMMON-SUBTERMS (ONEIFY X NIL)))) (SETQ TRANSLATE-TO-LISP-TIME (PLUS (DIFFERENCE (TIME-IN-60THS) TIME) TRANSLATE-TO-LISP-TIME)) ANS]) (TREE-DEPENDENTS [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (CONS NAME (for X in (GET1 NAME (QUOTE IMMEDIATE-DEPENDENTS0)) bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (TREE-DEPENDENTS X) LOOP-ANS)) finally (RETURN LOOP-ANS]) (TRIVIAL-POLYP [LAMBDA (POLY) (* kbr: "19-Oct-85 16:31") (OR (TRIVIAL-POLYP1 POLY (QUOTE POSITIVE)) (TRIVIAL-POLYP1 POLY (QUOTE NEGATIVE]) (TRIVIAL-POLYP1 [LAMBDA (POLY PARITY) (* kbr: "19-Oct-85 16:31") (PROG (WINNING-PAIR COEF) (COND ((EQ PARITY (QUOTE POSITIVE)) (COND ((AND (LESSP (fetch (POLY CONSTANT) of POLY) 1) (IEQP 1 (for PAIR in (fetch (POLY ALIST) of POLY) count (GREATERP (CDR PAIR) 0)))) (SETQ WINNING-PAIR (for PAIR in (fetch (POLY ALIST) of POLY) when (GREATERP (CDR PAIR) 0) do (RETURN PAIR))) (SETQ COEF (CDR WINNING-PAIR))) (T (RETURN NIL)))) ((AND (GREATERP (fetch (POLY CONSTANT) of POLY) -1) (IEQP 1 (for PAIR in (fetch (POLY ALIST) of POLY) count (LESSP (CDR PAIR) 0)))) (SETQ WINNING-PAIR (for PAIR in (fetch (POLY ALIST) of POLY) when (LESSP (CDR PAIR) 0) do (RETURN PAIR))) (SETQ COEF (MINUS (CDR WINNING-PAIR)))) (T (RETURN NIL))) (COND ((AND (NOT (BM-MATCH (fetch (POLY LITERALS) of POLY) (LIST (NOT (EQUAL & &))))) (EQUAL 0 (REMAINDER (fetch (POLY CONSTANT) of POLY) COEF)) (for PAIR in (fetch (POLY ALIST) of POLY) always (EQUAL 0 (REMAINDER (CDR PAIR) COEF)))) (* We know that the polys in this pot list were formed from the current CL with  the ADD-TERMS-TO-POT-LST FLG=NIL. That is, the literals of the clause were  stored by LINEARIZE with their original parities, even though the poly was  generated from their negations. *) (RETURN (CONS (CONS (CAR WINNING-PAIR) (COND ((EQ PARITY (QUOTE POSITIVE)) 1) (T -1))) (create POLY CONSTANT _ (QUOTIENT (fetch (POLY CONSTANT) of POLY) COEF) ALIST _ (for PAIR in (fetch (POLY ALIST) of POLY) collect (CONS (CAR PAIR) (QUOTIENT (CDR PAIR) COEF))) ASSUMPTIONS _ (fetch (POLY ASSUMPTIONS) of POLY) LITERALS _ (fetch (POLY LITERALS) of POLY) LEMMAS _ (fetch (POLY LEMMAS) of POLY))))) (T (RETURN NIL]) (TRUE-POLYP [LAMBDA (POLY) (* kbr: "19-Oct-85 16:31") (AND (LESSEQP (fetch (POLY CONSTANT) of POLY) 0) (for PAIR in (fetch (POLY ALIST) of POLY) always (LESSEQP (CDR PAIR) 0]) (TYPE-ALIST-CLAUSE [LAMBDA (CL) (* kbr: "19-Oct-85 16:31") (LET ((TYPE-ALIST TYPE-ALIST)) (for LIT in CL while (NEQ TYPE-ALIST (QUOTE CONTRADICTION)) do (ASSUME-TRUE-FALSE LIT) (COND (MUST-BE-TRUE (SETQ TYPE-ALIST (QUOTE CONTRADICTION))) (MUST-BE-FALSE NIL) (T (SETQ TYPE-ALIST FALSE-TYPE-ALIST)))) TYPE-ALIST]) (TYPE-PRESCRIPTION-LEMMAP [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (LET (ATM) (COND ((for TUPLE in (GET1 NAME (QUOTE LOCAL-UNDO-TUPLES)) thereis (BM-MATCH TUPLE (CONS (QUOTE TYPE-PRESCRIPTION-LST) (CONS ATM &)))) ATM) (T NIL]) (TYPE-SET [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (PAIR TYPE-ARG1 TYPE-ARG2 ARG1 ARG2) (COND ((SETQ TEMP-TEMP (SASSOC TERM TYPE-ALIST)) (CDR TEMP-TEMP)) ((VARIABLEP TERM) TYPE-SET-UNKNOWN) ((FQUOTEP TERM) (CAR (TYPE-PRESCRIPTION (FN-SYMB0 (CADR TERM))))) ((SETQ PAIR (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST)) (SETQ TYPE-ARG1 (TYPE-SET (FARGN TERM 1))) (COND ((IEQP 0 (LOGAND TYPE-ARG1 (CDR PAIR))) TYPE-SET-FALSE) ((LOGSUBSETP TYPE-ARG1 (CDR PAIR)) TYPE-SET-TRUE) (T TYPE-SET-BOOLEAN))) ((BM-MATCH TERM (EQUAL ARG1 ARG2)) (SETQ TYPE-ARG1 (TYPE-SET ARG1)) (SETQ TYPE-ARG2 (TYPE-SET ARG2)) (COND ((IEQP 0 (LOGAND TYPE-ARG1 TYPE-ARG2)) TYPE-SET-FALSE) ((AND (IEQP TYPE-ARG1 TYPE-ARG2) (MEMBER TYPE-ARG1 SINGLETON-TYPE-SETS)) TYPE-SET-TRUE) (T TYPE-SET-BOOLEAN))) ((BM-MATCH TERM (NOT ARG1)) (SETQ TYPE-ARG1 (TYPE-SET ARG1)) (COND ((IEQP TYPE-ARG1 TYPE-SET-FALSE) TYPE-SET-TRUE) ((NOT (LOGSUBSETP TYPE-SET-FALSE TYPE-ARG1)) TYPE-SET-FALSE) (T TYPE-SET-BOOLEAN))) ((EQ (FFN-SYMB TERM) (QUOTE IF)) (ASSUME-TRUE-FALSE (FARGN TERM 1)) (COND (MUST-BE-TRUE (TYPE-SET (FARGN TERM 2))) (MUST-BE-FALSE (TYPE-SET (FARGN TERM 3))) (T (LOGOR (TYPE-SET2 (FARGN TERM 2) TRUE-TYPE-ALIST) (TYPE-SET2 (FARGN TERM 3) FALSE-TYPE-ALIST))))) ((SETQ TEMP-TEMP (TYPE-PRESCRIPTION (FFN-SYMB TERM))) (LOGOR (CAR TEMP-TEMP) (for ARG in (FARGS TERM) as FLG in (CDR TEMP-TEMP) bind (LOOP-ANS _ 0) when FLG do (SETQ LOOP-ANS (LOGOR LOOP-ANS (TYPE-SET ARG))) finally (RETURN LOOP-ANS)))) (T TYPE-SET-UNKNOWN]) (TYPE-SET2 [LAMBDA (TERM TYPE-ALIST) (* kbr: "19-Oct-85 16:31") (* This is like TYPE-SET, only it lets  you specify the local TYPE-ALIST and  protects the FALSE-TYPE-ALIST for you.  *) (LET (FALSE-TYPE-ALIST) (TYPE-SET TERM]) (UBT [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (UNDO-BACK-THROUGH NAME) NAME]) (UNBREAK-LEMMA [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((NULL NAME) (SETQ BROKEN-LEMMAS NIL)) (T (SETQ BROKEN-LEMMAS (REMOVE (ASSOC NAME BROKEN-LEMMAS) BROKEN-LEMMAS]) (UNCHANGING-VARS [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (LET (ANS) (UNCHANGING-VARS1 (EXPAND-NON-REC-FNS TERM)) ANS]) (UNCHANGING-VARS1 [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (COND ((VARIABLEP TERM) NIL) ((FQUOTEP TERM) NIL) (T (for ARG in (FARGS TERM) do (UNCHANGING-VARS1 ARG)) (COND ((OR (MEMB (FFN-SYMB TERM) *1*BTM-OBJECTS) (ASSOC (FFN-SYMB TERM) RECOGNIZER-ALIST) (for X in SHELL-POCKETS thereis (MEMB (FFN-SYMB TERM) X)) (MEMB (FFN-SYMB TERM) (QUOTE (IF EQUAL)))) NIL) ((AND (GET1 (FFN-SYMB TERM) (QUOTE SDEFN)) (NOT (DISABLEDP (FFN-SYMB TERM)))) NIL) (T (for ARG in (FARGS TERM) when (VARIABLEP ARG) do (SETQ ANS (ADD-TO-SET ARG ANS]) (UNDO-BACK-THROUGH [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (COND ((NOT (GET1 NAME (QUOTE EVENT))) (ERROR1 (PQUOTE (PROGN ATTEMPT TO UNDO A NONEVENT , (!PPR NAME NIL) %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) (T (DREVERSE (while (AND (BOUNDP (QUOTE CHRONOLOGY)) (MEMB NAME CHRONOLOGY)) do (APPEND (UNDO-NAME (CAR CHRONOLOGY]) (UNDO-NAME [LAMBDA (NAME) (* kbr: "19-Oct-85 16:31") (LET (EVENTS) (COND ((NOT (GET1 NAME (QUOTE EVENT))) (ERROR1 (PQUOTE (PROGN ATTEMPT TO UNDO A NONEVENT , (!PPR NAME NIL) %.)) (BINDINGS (QUOTE NAME) NAME) (QUOTE SOFT))) ((EQ NAME (QUOTE GROUND-ZERO)) (SETQ EVENTS (DREVERSE (for X in CHRONOLOGY collect (GET1 X (QUOTE EVENT))))) (KILL-LIB) EVENTS) (T (SETQ EVENTS (REVERSE (DEPENDENTS-OF NAME))) (DREVERSE (for X in EVENTS collect (PROG1 (GET1 X (QUOTE EVENT)) (KILL-EVENT X]) (UNION-EQUAL [LAMBDA (X Y) (* kbr: "19-Oct-85 16:31") (* When we moved to the 3600 we replaced calls of INTERLISP's UNIONQ --  which uses EQUAL -- with our own UNION-EQUAL because Zetalisp's UNIONQ uses EQ.  Some calls of INTERLISP's UNIONQ were allowed to remain UNIONs because we could  convince ourselves that only atoms were involved.  However, on questionable cases we went ahead and used UNION-EQUAL.  Thus, some calls of UNION-EQUAL could be replaced by UNION.  The main place is when dealing with lemmas used, where inside the simpblock we  permit listp names. Seeing a call of UNION-EQUAL in such a situation is not to  be taken as a claim that listp names are present we just didn't trace it out.  *) (NCONC (for Z in X unless (MEMBER Z Y) collect Z) Y]) (UNPRETTYIFY [LAMBDA (TERM) (* kbr: "19-Oct-85 16:31") (* This function returns a list of pairs  (hyps) such that the conjunction of all (IMPLIES hyps concl) is equivalent to  TERM. hyps is a list of hypotheses, implicitly conjoined.  concl does not begin with an AND or IMPLIES.  *) (LET (C1 C2 HYP CONCL) (COND ((BM-MATCH TERM (AND C1 C2)) (APPEND (UNPRETTYIFY C1) (UNPRETTYIFY C2))) ((BM-MATCH TERM (IMPLIES HYP CONCL)) (SETQ HYP (FLATTEN-ANDS-IN-LIT HYP)) (for PAIR in (UNPRETTYIFY CONCL) collect (CONS (APPEND HYP (CAR PAIR)) (CDR PAIR)))) (T (LIST (CONS NIL TERM]) (VARIANTP [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (AND (ONE-WAY-UNIFY TERM1 TERM2) (for PAIR in UNIFY-SUBST always (VARIABLEP (CDR PAIR))) (NO-DUPLICATESP (for PAIR in UNIFY-SUBST collect (CDR PAIR]) (WORSE-THAN [LAMBDA (TERM1 TERM2) (* kbr: "22-Oct-85 15:47") (* Is TERM1 syntactically worse than  TERM2? *) (COND ((QUICK-WORSE-THAN TERM1 TERM2) T) ((VARIABLEP TERM1) NIL) ((FQUOTEP TERM1) NIL) (T (for ARG in (FARGS TERM1) thereis (SOME-SUBTERM-WORSE-THAN-OR-EQUAL ARG TERM2]) (WORSE-THAN-OR-EQUAL [LAMBDA (TERM1 TERM2) (* kbr: "19-Oct-85 16:31") (OR (EQUAL TERM1 TERM2) (WORSE-THAN TERM1 TERM2]) (WRAPUP [LAMBDA (WON-FLG) (* kbr: "19-Oct-85 20:15") (COND ((NEQ LEMMA-STACK ORIG-LEMMA-STACK) (ITERPRI T) (ERROR1 (PQUOTE (PROGN WRAPUP FOUND A NON-TRIVIAL LEMMA-STACK !)) (BINDINGS) (QUOTE HARD)))) (COND ((NEQ LINEARIZE-ASSUMPTIONS-STACK ORIG-LINEARIZE-ASSUMPTIONS-STACK) (ITERPRI T) (ERROR1 (PQUOTE (PROGN WRAPUP FOUND A NON-TRIVIAL LINEARIZE-ASSUMPTIONS-STACK !)) (BINDINGS) (QUOTE HARD)))) (COND (WON-FLG (SETQ FAILED-THMS (REMOVE ORIGTHM FAILED-THMS)) (SETQ PROVED-THMS (CONS ORIGTHM PROVED-THMS)))) (IO (QUOTE FINISHED) NIL NIL NIL (LIST WON-FLG)) (RETFROM (QUOTE PROVE) (COND (WON-FLG (QUOTE PROVED)) (T NIL]) (XXXJOIN [LAMBDA (FN X) (* kbr: "19-Oct-85 16:31") (COND ((OR (NLISTP X) (NLISTP (CDR X))) (ERROR1 (PQUOTE (PROGN XXXJOIN MUST NOT BE CALLED ON A LIST WITH LESS THAN 2 ELEMENTS %.)) NIL (QUOTE HARD))) ((NLISTP (CDDR X)) (CONS-TERM FN X)) (T (CONS-TERM FN (LIST (CAR X) (XXXJOIN FN (CDR X]) (ZERO-POLY [LAMBDA (LIT) (* kbr: "19-Oct-85 16:31") (create POLY CONSTANT _ 0 LITERALS _ (LIST LIT]) ) (RPAQQ EVENTSCOMS ((* EVENTS *) (FNS BOOT-STRAP ADD-AXIOM ADD-SHELL DCL DEFN DEFN& DISABLE ENABLE PROVE-LEMMA PROVE-LEMMA& REFLECT TOGGLE) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA TOGGLE REFLECT PROVE-LEMMA ENABLE DISABLE DEFN DCL ADD-SHELL ADD-AXIOM) (NLAML) (LAMA))))) (* EVENTS *) (DEFINEQ (BOOT-STRAP [LAMBDA NIL (* kbr: "19-Oct-85 18:14") (LET ((IN-BOOT-STRAP-FLG T)) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE BOOT-STRAP))) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME (ARITY-ALIST (QUOTE ((NOT . 1) (AND . 2) (OR . 2) (IMPLIES . 2) (LESSP . 2) (PLUS . 2))))) (BOOT-STRAP0) (CREATE-EVENT (QUOTE GROUND-ZERO) (LIST (QUOTE BOOT-STRAP))) (ADD-FACT (QUOTE IF) (QUOTE LISP-CODE) (QUOTE *1*IF)) (ADD-FACT (QUOTE EQUAL) (QUOTE LISP-CODE) (QUOTE *1*EQUAL)) (ADD-FACT (QUOTE IF) (QUOTE TYPE-PRESCRIPTION-LST) (CONS (QUOTE GROUND-ZERO) (QUOTE (0 NIL T T)))) (ADD-FACT (QUOTE EQUAL) (QUOTE TYPE-PRESCRIPTION-LST) (CONS (QUOTE GROUND-ZERO) (CONS TYPE-SET-BOOLEAN (QUOTE (NIL NIL))))) (ADD-FACT (QUOTE COUNT) (QUOTE LISP-CODE) (QUOTE *1*COUNT)) (ADD-FACT (QUOTE COUNT) (QUOTE TYPE-PRESCRIPTION-LST) (CONS (QUOTE GROUND-ZERO) (CONS TYPE-SET-NUMBERS (QUOTE (NIL))))) (for INSTR in BOOT-STRAP-INSTRS do (APPLY (CAR INSTR) (CDR INSTR))) (SETQ FAILED-THMS NIL) (QUOTE GROUND-ZERO]) (ADD-AXIOM [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (NAME TYPES TERM) (LET ((IN-ADD-AXIOM-FLG T)) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE ADD-AXIOM) NAME TYPES TERM)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (CHK-ACCEPTABLE-LEMMA NAME TYPES TERM) (CREATE-EVENT NAME (LIST (QUOTE ADD-AXIOM) NAME TYPES TERM)) (ADD-FACT NIL (QUOTE NONCONSTRUCTIVE-AXIOM-NAMES) NAME) (ADD-LEMMA0 NAME TYPES TERM) (DEPEND NAME (ALL-FNNAMES (TRANSLATE TERM))) NAME] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) (ADD-SHELL [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE ADD-SHELL) SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (CHK-ACCEPTABLE-SHELL SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (CREATE-EVENT SHELL-NAME (LIST (QUOTE ADD-SHELL) SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) ) (ADD-SHELL0 SHELL-NAME BTM-FN-SYMB RECOGNIZER DESTRUCTOR-TUPLES) (DEPEND SHELL-NAME (SET-DIFF (UNIONQ (for X in DESTRUCTOR-TUPLES bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (CDR (CADR X)) LOOP-ANS)) finally (RETURN LOOP-ANS)) (for X in DESTRUCTOR-TUPLES bind LOOP-ANS do (SETQ LOOP-ANS (ADD-TO-SET (CADDR X) LOOP-ANS)) finally (RETURN LOOP-ANS))) (COND (BTM-FN-SYMB (LIST BTM-FN-SYMB RECOGNIZER)) (T (LIST RECOGNIZER))))) (* Make the shell depend on every fn  used in the type restrictions and  defaults except the BTM-FN-SYMB and  RECOGNIZER of this type.  *) SHELL-NAME] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) (DCL [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (NAME ARGS) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE DCL) NAME ARGS)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (CHK-ACCEPTABLE-DCL NAME ARGS) (CREATE-EVENT NAME (LIST (QUOTE DCL) NAME ARGS)) (DCL0 NAME ARGS) NAME] (pop $FEXPR$) (pop $FEXPR$]) (DEFN [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (NAME ARGS BODY RELATION-MEASURE-LST) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE DEFN) NAME ARGS BODY RELATION-MEASURE-LST)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (CHK-ACCEPTABLE-DEFN NAME ARGS BODY RELATION-MEASURE-LST) (CREATE-EVENT NAME (COND (RELATION-MEASURE-LST (LIST (QUOTE DEFN) NAME ARGS BODY RELATION-MEASURE-LST)) (T (LIST (QUOTE DEFN) NAME ARGS BODY)))) (DEFN0 NAME ARGS BODY RELATION-MEASURE-LST NIL) (DEPEND NAME (REMOVE NAME (UNIONQ (ALL-FNNAMES (TRANSLATE BODY)) (UNIONQ ALL-LEMMAS-USED (for TEMP in (GETPROP NAME (QUOTE JUSTIFICATIONS)) bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (COND ((NULL (fetch (JUSTIFICATION RELATION) of TEMP)) NIL) (T (UNIONQ (ALL-FNNAMES (fetch (JUSTIFICATION MEASURE-TERM) of TEMP)) (ADD-TO-SET (fetch (JUSTIFICATION RELATION) of TEMP) (fetch (JUSTIFICATION LEMMAS) of TEMP))))) LOOP-ANS)) finally (RETURN LOOP-ANS)))))) (PRINT-DEFN-MSG NAME ARGS) (DEFN-WRAPUP (TOTAL-FUNCTIONP NAME)) (COND ((TOTAL-FUNCTIONP NAME) NAME) (T NIL] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) (DEFN& [LAMBDA (NAME) (* kbr: "29-Jun-86 16:14") (PROG (FORM) (for PROP in LIB-PROPS do (REMPROP NAME PROP)) (PUTD (PACK* (QUOTE *1*) NAME) NIL) (SETQ FORM (CONS (QUOTE DEFN) (CONS NAME (GETPROP NAME (QUOTE DEFN))))) (SHOWPRINT FORM) (EVAL FORM]) (DISABLE [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (OLDNAME) (APPLY (FUNCTION TOGGLE) (LIST (MAKE-NEW-NAME) OLDNAME T] (pop $FEXPR$]) (ENABLE [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (OLDNAME) (APPLY (FUNCTION TOGGLE) (LIST (MAKE-NEW-NAME) OLDNAME NIL] (pop $FEXPR$]) (PROVE-LEMMA [NLAMBDA $FEXPR$ (* kbr: "19-Apr-86 18:10") ([LAMBDA (NAME TYPES TERM HINTS) (LET ((IN-PROVE-LEMMA-FLG T)) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE PROVE-LEMMA) NAME TYPES TERM HINTS)) T (QUOTE C) NIL T T))) (T (LET (PROVE-ANS MAIN-EVENT-NAME) (CHK-ACCEPTABLE-LEMMA NAME TYPES TERM) (CHK-ACCEPTABLE-HINTS HINTS) (NLSETQ (PROGN (* Before calling PROVE we call APPLY-HINTS.  APPLY-HINTS sets some global variables that affect the theorem-prover.  We enter an UNWIND-PROTECT here so that we can set those variables to their  standard default values no matter how we exit PROVE.  *) (SETQ PROVE-ANS (PROVE (APPLY-HINTS HINTS TERM))) (COND (PROVE-ANS (CREATE-EVENT NAME (COND (HINTS (LIST (QUOTE PROVE-LEMMA) NAME TYPES TERM HINTS)) (T (LIST (QUOTE PROVE-LEMMA) NAME TYPES TERM)))) (ADD-LEMMA0 NAME TYPES TERM) (DEPEND NAME (UNIONQ ALL-LEMMAS-USED (UNIONQ (  EXTRACT-DEPENDENCIES-FROM-HINTS HINTS) (ALL-FNNAMES (TRANSLATE TERM))))))) (COND (PROVE-ANS NAME) (T NIL))) (for X in HINT-VARIABLE-ALIST do (SET (CADR X) (CADDDR X] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) (PROVE-LEMMA& [LAMBDA (NAME) (* kbr: "29-Jun-86 16:16") (PROG (FORM) (SETQ FORM (CONS (QUOTE PROVE-LEMMA) (CONS NAME (GETPROP NAME (QUOTE PROVE-LEMMA))))) (SHOWPRINT FORM T) (EVAL FORM]) (REFLECT [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE REFLECT) NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (DEFN-SETUP (LIST (QUOTE REFLECT) NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST)) (CHK-ACCEPTABLE-REFLECT NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST) (CREATE-EVENT NAME (COND (RELATION-MEASURE-LST (LIST (QUOTE REFLECT) NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST)) (T (LIST (QUOTE REFLECT) NAME SATISFACTION-LEMMA-NAME)))) (REFLECT0 NAME SATISFACTION-LEMMA-NAME RELATION-MEASURE-LST NIL) (DEPEND NAME (REMOVE NAME (ADD-TO-SET SATISFACTION-LEMMA-NAME (UNION-EQUAL ALL-LEMMAS-USED (for TEMP in (GETPROP NAME (QUOTE JUSTIFICATIONS)) bind LOOP-ANS do (SETQ LOOP-ANS (UNIONQ (COND ((NULL (fetch (JUSTIFICATION RELATION) of TEMP)) NIL) (T (UNIONQ (ALL-FNNAMES (fetch (JUSTIFICATION MEASURE-TERM) of TEMP)) (ADD-TO-SET (fetch ( JUSTIFICATION RELATION) of TEMP) (fetch (JUSTIFICATION LEMMAS) of TEMP))))) LOOP-ANS)) finally (RETURN LOOP-ANS)))))) (PRINT-DEFN-MSG NAME (CADR (GETPROP NAME (QUOTE SDEFN)))) (DEFN-WRAPUP (TOTAL-FUNCTIONP NAME)) (COND ((TOTAL-FUNCTIONP NAME) NAME) (T NIL] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) (TOGGLE [NLAMBDA $FEXPR$ (* kbr: "19-Oct-85 16:31") ([LAMBDA (NAME OLDNAME FLG) (COND ((NOT IN-REDO-UNDONE-EVENTS-FLG) (CAR (REDO-UNDONE-EVENTS (LIST (LIST (QUOTE TOGGLE) NAME OLDNAME FLG)) T (QUOTE C) NIL T T))) (T (LET (MAIN-EVENT-NAME) (CHK-ACCEPTABLE-TOGGLE NAME OLDNAME FLG) (CREATE-EVENT NAME (LIST (QUOTE TOGGLE) NAME OLDNAME FLG)) (ADD-FACT NIL (QUOTE DISABLED-LEMMAS) (CONS OLDNAME (CONS NAME FLG))) (DEPEND NAME (LIST (MAIN-EVENT-OF OLDNAME))) NAME] (pop $FEXPR$) (pop $FEXPR$) (pop $FEXPR$]) ) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA TOGGLE REFLECT PROVE-LEMMA ENABLE DISABLE DEFN DCL ADD-SHELL ADD-AXIOM) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (RPAQQ GENFACTCOMS ((* GENFACT *) (FNS GENERATE-ADD-FACT-PART GENERATE-ADD-SUB-FACT1 GENERATE-SUB-FACT-PART GENERATE-UNDO-TUPLE-PART))) (* GENFACT *) (DEFINEQ (GENERATE-ADD-FACT-PART [LAMBDA (ALIST) (* kbr: "29-Oct-85 13:51") (LET (!SINGLE-PROPS! !ADDITIVE-PROPS! !ADDITIVE-VARS! !SINGLE-VARS!) (SETQ !SINGLE-PROPS! (for X in ALIST when (AND (EQ (CADR X) (QUOTE SINGLE)) (EQ (CADDR X) (QUOTE PROPERTY))) collect (CAR X))) (SETQ !ADDITIVE-PROPS! (for X in ALIST when (AND (EQ (CADR X) (QUOTE ADDITIVE)) (EQ (CADDR X) (QUOTE PROPERTY))) collect (CAR X))) (SETQ !ADDITIVE-VARS! (for X in ALIST when (AND (EQ (CADR X) (QUOTE ADDITIVE)) (EQ (CADDR X) (QUOTE VARIABLE))) collect (CAR X))) (SETQ !SINGLE-VARS! (for X in ALIST when (AND (EQ (CADR X) (QUOTE SINGLE)) (EQ (CADDR X) (QUOTE VARIABLE))) collect (CAR X))) (BQUOTE (PROGN (COND ((NULL VAL) (ERROR1 (PQUOTE (PROGN ATTEMPT TO DO AN ADD-FACT WITH VALUE (!PPR NIL NIL) ON (!PPR PROP NIL) AND (!PPR ATM NIL) %.)) (BINDINGS (QUOTE PROP) PROP (QUOTE ATM) ATM) (QUOTE HARD)))) (SELECTQ PROP ((\, !SINGLE-PROPS!) (COND ((GETPROP ATM PROP) (ERROR1 (PQUOTE (PROGN ATTEMPT TO SMASH EXISTING SINGLE PROPERTY FACT HUNG UNDER (!PPR PROP NIL) OF (!PPR ATM NIL) %.)) (BINDINGS (QUOTE PROP) PROP (QUOTE ATM) ATM) (QUOTE HARD)))) (PUT1 ATM VAL PROP)) ((\, !ADDITIVE-PROPS!) (PUT1 ATM (CONS VAL (GETPROP ATM PROP)) PROP)) (DCELL (COND ((GETD ATM) (ERROR1 (PQUOTE (PROGN ATTEMPT TO SMASH EXISTING LISP DEFINITION CELL OF THE FUNCTION (!PPR ATM NIL) %.)) (BINDINGS (QUOTE ATM) ATM) (QUOTE HARD))) (T (PUTD1 ATM VAL)))) ((\, !ADDITIVE-VARS!) (OR (NULL ATM) (ERROR1 (PQUOTE (PROGN ADD-SUB-FACT MUST NOT BE CALLED WITH PROP SET TO A VARIABLE NAME WHILE ATM IS NON-NIL BECAUSE IT CONFUSES THE UNDO INFORMATION %.)) NIL (QUOTE HARD))) (SET PROP (CONS VAL (EVALV PROP)))) ((\, !SINGLE-VARS!) (OR (NULL ATM) (ERROR1 (PQUOTE (PROGN ADD-SUB-FACT MUST NOT BE CALLED WITH PROP SET TO A VARIABLE NAME WHILE ATM IS NON-NIL BECAUSE IT CONFUSES THE UNDO INFORMATION %.)) NIL (QUOTE HARD))) (COND ((BOUNDP PROP) (ERROR1 (PQUOTE (PROGN ATTEMPT TO SMASH EXISTING SINGLE VARIABLE (\, (!PPR PROP NIL)) %.)) (BINDINGS (QUOTE PROP) PROP) (QUOTE HARD)))) (SET PROP VAL)) (ERROR1 (PQUOTE (PROGN ADD-SUB-FACT HAS BEEN CALLED ON A PROPERTY OR VARIABLE NAME NAMELY (\, (!PPR PROP NIL)) THAT WAS NOT DECLARED !)) (BINDINGS (QUOTE PROP) PROP) (QUOTE HARD]) (GENERATE-ADD-SUB-FACT1 [LAMBDA (ALIST) (* kbr: "24-Oct-85 16:35") (COND ((AND (for X in (QUOTE (IDATE SATELLITES MAIN-EVENT EVENT LOCAL-UNDO-TUPLES)) always (AND (SETQ TEMP-TEMP (ASSOC X ALIST)) (BM-MATCH (CDR TEMP-TEMP) (LIST (QUOTE HIDDEN) (QUOTE PROPERTY))))) (BM-MATCH (ASSOC (QUOTE CHRONOLOGY) ALIST) (LIST (QUOTE CHRONOLOGY) (QUOTE HIDDEN) (QUOTE VARIABLE))) (for X in ALIST never (AND (EQ (CADR X) (QUOTE HIDDEN)) (NOT (MEMB (CAR X) (QUOTE (IDATE SATELLITES MAIN-EVENT EVENT LOCAL-UNDO-TUPLES CHRONOLOGY))))))) (SUB-PAIR (QUOTE (!LIB-PROPS! !LIBVARS! !SUBTRACT-FACT! !UNDO-TUPLE! !ADD-FACT!)) (LIST (DREVERSE (for X in ALIST when (EQ (CADDR X) (QUOTE PROPERTY)) collect (CAR X))) (for X in ALIST when (EQ (CADDR X) (QUOTE VARIABLE)) collect (CAR X)) (GENERATE-SUB-FACT-PART ALIST) (GENERATE-UNDO-TUPLE-PART ALIST) (GENERATE-ADD-FACT-PART ALIST)) (QUOTE (COND (INIT (INIT-LIB (QUOTE !LIB-PROPS!) (QUOTE !LIBVARS!))) (TUPLE !SUBTRACT-FACT!) (T (COND ((OR (EQ MAIN-EVENT-NAME (QUOTE GROUND-ZERO)) (AND (OR (EQ MAIN-EVENT-NAME ATM) (AND ATM (EQ MAIN-EVENT-NAME (GETPROP ATM (QUOTE MAIN-EVENT ))))) (NEQ PROP (QUOTE DCELL)))) NIL) (T (PUT1 MAIN-EVENT-NAME (CONS !UNDO-TUPLE! (GETPROP MAIN-EVENT-NAME (QUOTE LOCAL-UNDO-TUPLES ))) (QUOTE LOCAL-UNDO-TUPLES)))) !ADD-FACT!))))) (T (ERROR (QUOTE (THE USER MUST DECLARE ALL THE BUILT-IN EVENT LEVEL PROPERTIES AND VARIABLES AS HIDDEN AND MUST NOT DECLARE ANY OTHER HIDDEN DATA.]) (GENERATE-SUB-FACT-PART [LAMBDA (ALIST) (* kbr: "20-Apr-86 18:39") (SUBST (CONS (QUOTE SELECTQ) (CONS (QUOTE PROP) (NCONC1 (for X in ALIST when (EQ (CADR X) (QUOTE ADDITIVE)) collect (LIST (CAR X) (CADDDR X))) NIL))) (QUOTE !VAL-NAME!) (QUOTE (LET (ATM PROP VAL-NAME VAL TEMP) (COND ((NLISTP TUPLE) (SETQ PROP TUPLE) (SET PROP NIL)) ((NLISTP (CDR TUPLE)) (SETQ PROP (CAR TUPLE)) (SETQ ATM (CDR TUPLE)) (COND ((EQ PROP (QUOTE DCELL)) (PUTD1 ATM NIL)) (T (PUTPROP ATM PROP NIL)))) (T (SETQ PROP (CAR TUPLE)) (SETQ ATM (CADR TUPLE)) (SETQ VAL-NAME (CDDR TUPLE)) (* In the following (and in the LET above) TEMP was introduced to skirt a bug in the Release 5.0 compiler. *) (SETQ TEMP (FOR VAL IN (COND ((NULL ATM) (EVALV PROP)) (T (GETPROP ATM PROP))) WHEN (EQUAL !VAL-NAME! VAL-NAME) DO (RETURN VAL))) (COND ((NULL TEMP) (ERROR1 (PQUOTE (PROGN IN UNDOING AN ADDITIVE ADD-FACT ON (!PPR ATM NIL) AND (!PPR PROP NIL) THE VALUE TO BE REMOVED WAS NOT FOUND %.)) (BINDINGS (QUOTE PROP) PROP (QUOTE ATM) ATM) (QUOTE WARNING)))) (COND ((NULL ATM) (SET PROP (REMOVE1 TEMP (EVALV PROP)))) (T (PUTPROP ATM PROP (REMOVE1 TEMP (GETPROP ATM PROP))))))) NIL]) (GENERATE-UNDO-TUPLE-PART [LAMBDA (ALIST) (* kbr: "19-Oct-85 16:31") (LET (!ADDITIVE! !---ADDITIVE-LST---! !SINGLE-VARS!) (SETQ !ADDITIVE! (QUOTE (!ADDITIVE-TYPE! (CONS PROP (CONS ATM !VAL-NAME!))))) (SETQ !---ADDITIVE-LST---! (for X in ALIST when (EQ (CADR X) (QUOTE ADDITIVE)) collect (SUB-PAIR (QUOTE (!ADDITIVE-TYPE! !VAL-NAME!)) (LIST (CAR X) (CADDDR X)) !ADDITIVE!))) (SETQ !SINGLE-VARS! (for X in ALIST when (AND (EQ (CADR X) (QUOTE SINGLE)) (EQ (CADDR X) (QUOTE VARIABLE))) collect (CAR X))) (BQUOTE (SELECTQ PROP (\,@ !---ADDITIVE-LST---!) ((\, !SINGLE-VARS!) PROP) (DCELL (CONS (QUOTE DCELL) ATM)) (CONS PROP ATM]) ) (RPAQQ IOCOMS ((* IO *) (FNS !CLAUSE-SET !CLAUSE EQUALITY-HYP-NO GET-SCHEMA-MEASURE-RELATION IO IO1 JUSTIFICATION-SENTENCE !LIST MAPRINEVAL NOTICE-CLAUSE PEVAL PEVAL-APPLY PEVALV PLURALP !PPR-LIST !PPR PRIN5* PRINEVAL PRINEVAL1 PRINT-DEFN-MSG TH-IFY UN-NOTICE-CLAUSE))) (* IO *) (DEFINEQ (!CLAUSE-SET [LAMBDA (CL-SET INDENT) (* kbr: "19-Oct-85 16:31") (LET ((*INDENT* (OR INDENT *INDENT*))) (SETQ LAST-CLAUSE CL-SET) (PPRINDENT (COND ((NULL CL-SET) TRUE) ((NULL (CDR CL-SET)) (PRETTYIFY-CLAUSE (CAR CL-SET))) (T (CONS (QUOTE AND) (for CL in CL-SET collect (PRETTYIFY-CLAUSE CL))))) (COND ((IEQP 0 *INDENT*) 0) (T (ADD1 *INDENT*))) 1 *FILE*) (SETQ LAST-PRINEVAL-CHAR NIL) NIL]) (!CLAUSE [LAMBDA (CL INDENT) (* kbr: "19-Oct-85 16:31") (LET ((*INDENT* (OR INDENT *INDENT*))) (SETQ LAST-CLAUSE CL) (PPRINDENT (PRETTYIFY-CLAUSE CL) (COND ((IEQP 0 *INDENT*) 0) (T (ADD1 *INDENT*))) 1 *FILE*) (SETQ LAST-PRINEVAL-CHAR NIL) NIL]) (EQUALITY-HYP-NO [LAMBDA (TERM CL) (* kbr: "19-Oct-85 16:31") (LET (HYPS) (SETQ HYPS (for LIT in CL count (BM-MATCH LIT (NOT (EQUAL & &))))) (COND ((IEQP HYPS 1) NIL) (T (ADD1 (for LIT in CL until (EQUAL LIT TERM) count (BM-MATCH LIT (NOT (EQUAL & &]) (GET-SCHEMA-MEASURE-RELATION [LAMBDA (CANDIDATE CL-SET) (* kbr: "19-Oct-85 16:31") (* Returns a list of three things. A schematic formula, using p applied to all  the vars in CL-SET, showing the induction in CANDIDATE a measure term,  indicating what decreases and the well-founded relation.  *) (LET (TERM MEASURE-ARGS FORMALS SCHEMA MEASURE RELATION) (SETQ TERM (fetch (CANDIDATE INDUCTION-TERM) of CANDIDATE)) (SETQ FORMALS (CADR (GETPROP (FFN-SYMB TERM) (QUOTE SDEFN)))) (SETQ MEASURE (fetch (JUSTIFICATION MEASURE-TERM) of (fetch (CANDIDATE JUSTIFICATION) of CANDIDATE))) (* We must instantiate the measure  term with the actuals.  *) (SETQ MEASURE-ARGS (ALL-VARS MEASURE)) (SETQ MEASURE (COND (MEASURE (SUB-PAIR-VAR-LST MEASURE-ARGS (FILTER-ARGS MEASURE-ARGS FORMALS (FARGS TERM)) MEASURE)) (T NIL))) (SETQ RELATION (fetch (JUSTIFICATION RELATION) of (fetch (CANDIDATE JUSTIFICATION) of CANDIDATE) )) (SETQ SCHEMA (CONS (QUOTE AND) (for CL in (IND-FORMULA (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of CANDIDATE) NIL (LIST (LIST (CONS (QUOTE P) (REVERSE (ALL-VARS-LST (REVERSE (APPLY (FUNCTION APPEND) CL-SET)))))))) collect (PRETTYIFY-CLAUSE CL)))) (LIST SCHEMA MEASURE RELATION]) (IO [LAMBDA (PROCESS PARENT PARENT-HIST DESCENDANTS HIST-ENTRY)(* kbr: "19-Oct-85 16:31") (LET (TIME) (SETQ TIME (TIME-IN-60THS)) (APPLY IO-FN NIL) (SETQ IOTHMTIME (PLUS IOTHMTIME (DIFFERENCE (TIME-IN-60THS) TIME))) NIL]) (IO1 [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (PROG (SO-NEXT-CONSIDER ACCUMS CROSS DEFNS DIR ELIM-LEMMAS GEN-LEMMAS HIGH-CNT INDENT KEEP LEMMAS LST MASS MERGED-CAND-CNT N NAME NAMES OBVIOUS RAW-CAND-CNT SKOS TERM1 TERM2 TERMS WINNING-CAND WON-FLG VETO-CNT BROTHER-NO MAX MEASURE RELATION SCHEMA FAVORED-CNT HYP-NO FLG *NOPOINT) (SETQ *NOPOINT T) (SETQ SO-NEXT-CONSIDER (PQUOTE (PROGN (COND ((EQ LAST-PROCESS (QUOTE POP)) %.)) // // // /# (COND ((NOT (EQ LAST-PROCESS (QUOTE STORE-SENT))) (? (SO NEXT CONSIDER) (SO LET US TURN OUR ATTENTION TO) (SO WE NOW RETURN TO)) : // // (!CLAUSE-SET CL-SET INDENT) (? (, // // NAMED) (, // // WHICH WE NAMED) (, // // WHICH IS FORMULA)) (!PPR (CAR HIST-ENTRY) NIL) ABOVE %.) ((AND (IEQP (LENGTH CL-SET) 1) (EQ LAST-CLAUSE (CAR CL-SET)))) (T SO NOW LET US (? (CONSIDER) (RETURN TO)) : // // (!CLAUSE-SET CL-SET NIL) (? (, // // NAMED) (, // // WHICH WE NAMED) (%. // // WE NAMED THIS) (%. // // WE GAVE THIS THE NAME)) (!PPR (CAR HIST-ENTRY) NIL) (? (ABOVE) NIL) %.))))) (COND ((EQ PROCESS (QUOTE SETUP)) (COND ((NOT (OPENP PROVE-FILE)) (SETQ PROVE-FILE NIL))) (SETQ CLAUSE-ALIST NIL) (SETQ LAST-PROCESS (QUOTE SETUP)) (SETQ LAST-PRINEVAL-CHAR (QUOTE %.)) (NOTICE-CLAUSE PARENT 0 (LIST NIL))) ((EQ PROCESS (QUOTE SETTLED-DOWN-CLAUSE)) (RETURN NIL)) ((EQ PROCESS (QUOTE INDUCT)) (COND ((AND (NOT LEFTMARGINCHAR) (EQ PARENT LAST-CLAUSE)) (SETQ TEMP-TEMP (UN-NOTICE-CLAUSE LAST-CLAUSE)) (SETQ CLAUSE-ALIST NIL) (COND ((AND (FIXP (CADR TEMP-TEMP)) (LESSP (CADR TEMP-TEMP) 16)) (NOTICE-CLAUSE LAST-CLAUSE (CADR TEMP-TEMP) (LIST NIL))) (T (NOTICE-CLAUSE (CAR TEMP-TEMP) 0 (LIST NIL))))) (T (SETQ CLAUSE-ALIST NIL) (NOTICE-CLAUSE PARENT 0 (LIST NIL)))))) (SETQ TEMP-TEMP (COND ((AND PARENT (NOT (MEMB PROCESS (QUOTE (POP SUBSUMED-ABOVE SUBSUMED-BY-PARENT SUBSUMED-BELOW))))) (UN-NOTICE-CLAUSE PARENT)) (T (QUOTE (NIL 0 (NIL)))))) (* The BROTHER-NO of a clause is the case number for it.  It is a list of numbers, to be printed in reverse order, separated by dots.  If the CAR of the BROTHER-NO is NIL it means do not print it.  *) (SETQ BROTHER-NO (OR (CADDR TEMP-TEMP) (LIST NIL))) (SETQ INDENT (CADR TEMP-TEMP)) (SETQ MAX (LENGTH DESCENDANTS)) (for CL in DESCENDANTS as I from MAX by -1 do (NOTICE-CLAUSE CL (COND ((IEQP MAX 1) INDENT) (T (IPLUS TREE-INDENT INDENT))) (COND ((IEQP MAX 1) (COND ((CAR BROTHER-NO) (CONS NIL BROTHER-NO)) (T BROTHER-NO))) ((CAR BROTHER-NO) (CONS I BROTHER-NO)) (T (CONS I (CDR BROTHER-NO)))))) (COND ((MEMB PROCESS EXECUTE-PROCESSES) (COND ((EQ LAST-PROCESS (QUOTE SETUP)) (SETQ LAST-CLAUSE PARENT)) (T (ITERPRIN TREE-LINES PROVE-FILE) (ISPACES (IDIFFERENCE INDENT TREE-INDENT) PROVE-FILE) (COND ((AND (NOT (EQUAL INDENT 0)) (CAR BROTHER-NO)) (IPRINC "CASE" PROVE-FILE) (for I in (REVERSE BROTHER-NO) do (IPRINC I PROVE-FILE) (IPRINC "." PROVE-FILE)))) (PRINEVAL (PQUOTE (!CLAUSE PARENT NIL)) (BINDINGS (QUOTE PARENT) PARENT) (IPLUS 5 INDENT) PROVE-FILE))))) (SELECTQ PROCESS (SIMPLIFY-CLAUSE (SETQ FLG NIL) (SETQ LEMMAS NIL) (SETQ DEFNS NIL) (for X in HIST-ENTRY do (COND ((LISTP X) (* A LISTP entry here means that PROCESS-EQUATIONAL-POLYS added an equality to  this clause. The form of X in this case is  ((FIND-EQUATIONAL-POLY lhs)), where lhs and rhs are the sides of the equation  added. In this case, ZERO is also a member of HIST-ENTRY and at the moment we  will just ignore this opportunity to make the IO fancier.  *) NIL) ((EQ X (QUOTE ZERO)) (SETQ FLG T)) ((GETPROP X (QUOTE TYPE-PRESCRIPTION-LST)) (SETQ DEFNS (CONS X DEFNS))) (T (SETQ LEMMAS (CONS X LEMMAS))))) (COND ((AND (EQ LAST-PROCESS (QUOTE SETUP)) (IEQP (LENGTH DESCENDANTS) 1) (NOT LEMMAS) (for X in DEFNS always (MEMB X (QUOTE (AND OR NOT IMPLIES)))) (NOT FLG)) (* pretend nothing happened in this  case. *) (RPLACA (CDR (ASSOC (CAR DESCENDANTS) CLAUSE-ALIST)) 0) (RETURN NIL)) (T (PRINEVAL (PQUOTE (PROGN (COND ((EQ LAST-PROCESS (QUOTE SETUP)) THIS (? (FORMULA) (CONJECTURE) NIL) SIMPLIFIES) (T (? (, // // WHICH (? (WE (@ FURTHER?) SIMPLIFY) ((@ FURTHER?) SIMPLIFIES))) (%. // // (COND ((EQ HIST-ENTRY NIL) (? NIL (OF COURSE ,))) (PARENT-HIST (? (BUT) NIL (HOWEVER)))) THIS (? (SIMPLIFIES (@ FURTHER?)) ((@ FURTHER?) SIMPLIFIES)))))) (COND (FLG , USING LINEAR ARITHMETIC (COND ((AND (NOT LEMMAS) (NOT DEFNS)) ,)))) (COND (LEMMAS (COND ((AND FLG (NOT DEFNS)) AND) (T ,)) (? ((? (APPEALING TO) (APPLYING) (REWRITING WITH)) THE (PLURAL? LEMMAS LEMMAS LEMMA)) (APPLYING) (REWRITING WITH)) (!LIST LEMMAS) ,)) (COND (DEFNS (COND ((OR FLG LEMMAS) AND) (T ,)) (? (OPENING UP) (EXPANDING) (UNFOLDING)) (? (THE (PLURAL? DEFNS FUNCTIONS FUNCTION )) (THE (PLURAL? DEFNS DEFINITIONS DEFINITION) OF) NIL) (!LIST DEFNS) ,)) (COND ((AND (NOT FLG) (EQ LEMMAS NIL) (EQ DEFNS NIL)) , (? (TRIVIALLY) (CLEARLY) (OBVIOUSLY)) ,)) TO)) (BINDINGS (QUOTE DEFNS) DEFNS (QUOTE LEMMAS) LEMMAS (QUOTE PARENT-HIST) PARENT-HIST (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE FURTHER?) (COND ((AND (NOT DESCENDANTS) (IGREATERP (LENGTH PARENT-HIST) 5)) (PQUOTE FINALLY)) ((EQ (CAAR PARENT-HIST) (QUOTE SIMPLIFY-CLAUSE)) (PQUOTE AGAIN)) ((ASSOC (QUOTE SIMPLIFY-CLAUSE) PARENT-HIST) (PQUOTE FURTHER)) (T NIL)) (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE FLG) FLG) INDENT PROVE-FILE)))) (FERTILIZE-CLAUSE (BM-MATCH HIST-ENTRY (LIST MASS CROSS DIR TERM1 TERM2 KEEP)) (SETQ HYP-NO (EQUALITY-HYP-NO (LIST (QUOTE NOT) (LIST (QUOTE EQUAL) TERM1 TERM2)) PARENT)) (OR (EQ DIR (QUOTE LEFT-FOR-RIGHT)) (swap TERM1 TERM2)) (PRINEVAL (PQUOTE (PROGN %. // // WE (? NIL NIL (NOW)) USE THE (COND (HYP-NO (@ N)) (T ABOVE)) EQUALITY HYPOTHESIS (COND ((OR MASS (NOT CROSS)) BY SUBSTITUTING) (T BY CROSS-FERTILIZING)) (!PPR TERM1 NIL) FOR (!PPR TERM2 NIL) (COND (KEEP AND KEEPING THE EQUALITY HYPOTHESIS) (T AND THROWING AWAY THE EQUALITY)) %.)) (BINDINGS (QUOTE KEEP) KEEP (QUOTE TERM2) TERM2 (QUOTE TERM1) TERM1 (QUOTE CROSS) CROSS (QUOTE MASS) MASS (QUOTE N) (TH-IFY HYP-NO) (QUOTE HYP-NO) HYP-NO) INDENT PROVE-FILE)) (ELIMINATE-DESTRUCTORS-CLAUSE (SETQ ELIM-LEMMAS NIL) (SETQ GEN-LEMMAS NIL) (for X in HIST-ENTRY do (SETQ ELIM-LEMMAS (ADD-TO-SET (CAR X) ELIM-LEMMAS)) (SETQ LST (CONS (LIST (QUOTE PROGN) (LIST (QUOTE !PPR) (KWOTE (CAR (CDDDDR X))) NIL) (PQUOTE BY) (LIST (QUOTE !PPR) (KWOTE (CADR (CDDDDR X))) NIL) (PQUOTE (PROGN TO ELIMINATE)) (LIST (QUOTE !LIST) (KWOTE (for D in (CADR X) collect (LIST (QUOTE !PPR) (KWOTE D) NIL))))) LST)) (COND ((CADDR X) (SETQ GEN-LEMMAS (UNION-EQUAL (for TERM in (CADDR X) bind LOOP-ANS do (SETQ LOOP-ANS (ADD-TO-SET (LIST (QUOTE PROGN) (PQUOTE (PROGN THE TYPE RESTRICTION LEMMA NOTED WHEN)) (FN-SYMB (ARGN TERM 1)) (PQUOTE (PROGN WAS INTRODUCED))) LOOP-ANS)) finally (RETURN LOOP-ANS)) GEN-LEMMAS)))) (SETQ GEN-LEMMAS (UNION-EQUAL (CADDDR X) GEN-LEMMAS))) (PRINEVAL (PQUOTE (PROGN %. // // (? (APPLYING) (APPEALING TO)) THE (PLURAL? ELIM-LEMMAS LEMMAS LEMMA) (!LIST ELIM-LEMMAS) , (? (WE NOW) NIL) REPLACE (!LIST LST) %. (COND (GEN-LEMMAS WE (? (USE) (RELY UPON) (EMPLOY)) (!LIST GEN-LEMMAS) TO (? (CONSTRAIN) (RESTRICT)) THE NEW (COND ((OR (CDR ELIM-LEMMAS) (CDR (CAR (CDR (CAR HIST-ENTRY))))) VARIABLES) (T VARIABLE)) %.)))) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE ELIM-LEMMAS) ELIM-LEMMAS (QUOTE GEN-LEMMAS) GEN-LEMMAS (QUOTE LST) LST) INDENT PROVE-FILE)) (GENERALIZE-CLAUSE (BM-MATCH HIST-ENTRY (LIST SKOS TERMS OBVIOUS LEMMAS)) (SETQ LST (for TERM in TERMS as VAR in SKOS collect (LIST (QUOTE PROGN) (LIST (QUOTE !PPR) (KWOTE TERM) NIL) (PQUOTE BY) (LIST (QUOTE !PPR) (KWOTE VAR) NIL)))) (COND (OBVIOUS (SETQ LEMMAS (UNION-EQUAL (for TERM in OBVIOUS bind LOOP-ANS do (SETQ LOOP-ANS (ADD-TO-SET (LIST (QUOTE PROGN) (PQUOTE (PROGN THE TYPE RESTRICTION LEMMA NOTED WHEN )) (FN-SYMB (ARGN TERM 1)) (PQUOTE (PROGN WAS INTRODUCED)) ) LOOP-ANS)) finally (RETURN LOOP-ANS)) LEMMAS)))) (PRINEVAL (PQUOTE (PROGN (? (, // // WHICH WE GENERALIZE BY) (%. // // WE WILL TRY TO PROVE THE ABOVE (? (FORMULA) ( CONJECTURE )) BY GENERALIZING IT ,)) REPLACING (!LIST LST) %. (COND (LEMMAS WE RESTRICT THE NEW (PLURAL? SKOS VARIABLES VARIABLE) BY (? (APPEALING TO) (RECALLING)) (!LIST LEMMAS) %.)))) (BINDINGS (QUOTE LEMMAS) LEMMAS (QUOTE SKOS) SKOS (QUOTE LST) LST) INDENT PROVE-FILE)) (ELIMINATE-IRRELEVANCE-CLAUSE (PRINEVAL (PQUOTE (? (, // // WHICH HAS (PLURAL? N (@ N) AN) IRRELEVANT (PLURAL? N TERMS TERM) IN IT %. BY ELIMINATING (PLURAL? N (PROGN THESE TERMS) (PROGN THE TERM)) WE GETPROP) (%. // // ELIMINATE (PLURAL? N NIL THE) IRRELEVANT (PLURAL? N TERMS TERM) %.))) (BINDINGS (QUOTE N) (IDIFFERENCE (LENGTH PARENT) (LENGTH (CAR DESCENDANTS)))) INDENT PROVE-FILE)) (STORE-SENT (NOTICE-CLAUSE PARENT INDENT BROTHER-NO) (COND ((AND PARENT (EQ LAST-PROCESS (QUOTE SETUP)) (CADR HIST-ENTRY)) (SETQ LAST-CLAUSE (CADR HIST-ENTRY)) (NOTICE-CLAUSE LAST-CLAUSE 0 (LIST NIL)))) (PRINEVAL (PQUOTE (COND ((EQ PARENT NIL) (? (, // // WHICH MEANS THE PROOF ATTEMPT HAS) (%. // // WHY SAY MORE ?) (%. // // NEED WE GO ON ?))) ((EQ LAST-PROCESS (QUOTE SETUP)) // /# (? (GIVE THE CONJECTURE THE NAME) (NAME THE CONJECTURE) (CALL THE CONJECTURE)) (!PPR (CAR HIST-ENTRY) NIL) %.) ((EQ (CAR (CDR HIST-ENTRY)) (QUOTE QUIT)) , // // WHICH WE WOULD NORMALLY TRY TO PROVE BY INDUCTION %. BUT SINCE THE DO-NOT-USE-INDUCTION-FLG HAS BEEN SET BY THE USER , THE PROOF ATTEMPT HAS) ((CAR (CDR HIST-ENTRY)) , // // WHICH WE WOULD (? (NORMALLY) (USUALLY)) PUSH AND WORK ON LATER BY INDUCTION %. BUT IF WE MUST USE INDUCTION TO PROVE THE INPUT CONJECTURE , WE PREFER TO INDUCT ON THE ORIGINAL FORMULATION OF THE PROBLEM %. THUS WE WILL DISREGARD ALL THAT WE HAVE PREVIOUSLY DONE , GIVE THE NAME (!PPR (CAR HIST-ENTRY ) NIL) TO THE ORIGINAL INPUT , AND WORK ON IT %.) (T (? (, // // WHICH WE WILL (@ FINALLY?) NAME (!PPR (CAR HIST-ENTRY) NIL) %.) (%. // // (@ FINALLY?) (? (GIVE THE ABOVE FORMULA THE NAME) (NAME THE ABOVE SUBGOAL) (CALL THE ABOVE CONJECTURE)) (!PPR (CAR HIST-ENTRY) NIL) %.))))) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE PARENT) PARENT (QUOTE FINALLY?) (COND ((IGREATERP (LENGTH PARENT-HIST) 5) (PQUOTE FINALLY)) (T NIL))) INDENT PROVE-FILE)) (POP (PRINEVAL (PQUOTE (PROGN (COND ((EQ LAST-PROCESS (QUOTE POP)) , WHICH (? (, IN TURN ,) (, CONSEQUENTLY ,) NIL) (? (ALSO) NIL)) (T // // // /# THAT)) FINISHES THE PROOF OF (!PPR (CAR HIST-ENTRY) NIL))) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE LAST-PROCESS) LAST-PROCESS) 0 PROVE-FILE)) (SUBSUMED-ABOVE (PRINEVAL (PQUOTE (PROGN (@ SO-NEXT-CONSIDER) (? (HA !) (HOW NICE !) NIL NIL NIL) THIS (? (CONJECTURE) (FORMULA) (GOAL) NIL) IS SUBSUMED BY THE (? ((? (LEMMA) (THEOREM) (GOAL)) WE NAMED (!PPR (CAR (CDR HIST-ENTRY)) NIL) AND PROVED ABOVE) (PREVIOUSLY PROVED (!PPR (CAR (CDR HIST-ENTRY)) NIL)) ((!PPR (CAR (CDR HIST-ENTRY)) NIL) , WHICH WAS PROVED ABOVE)) !)) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE SO-NEXT-CONSIDER) SO-NEXT-CONSIDER (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE CL-SET) PARENT (QUOTE LAST-CLAUSE) LAST-CLAUSE (QUOTE INDENT) 5) 0 PROVE-FILE)) (SUBSUMED-BY-PARENT (PRINEVAL (PQUOTE (PROGN (@ SO-NEXT-CONSIDER) (? (OH NO !) (OOPS !) NIL) THIS FORMULA IS SUBSUMED BY ITS PARENT , (!PPR (CAR (CDR HIST-ENTRY)) NIL) ! (? (THAT MEANS WE WOULD LOOP IF WE TRIED TO PROVE IT BY INDUCTION %.) NIL NIL))) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE SO-NEXT-CONSIDER) SO-NEXT-CONSIDER (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE CL-SET) PARENT (QUOTE LAST-CLAUSE) LAST-CLAUSE (QUOTE INDENT) 5) 0 PROVE-FILE)) (SUBSUMED-BELOW (PRINEVAL (PQUOTE (PROGN (@ SO-NEXT-CONSIDER) (? (AH HA !) (WHAT LUCK !) (YOU PROBABLY DID NOT NOTICE , BUT) (BUT) NIL) THIS CONJECTURE IS SUBSUMED BY (? (ANOTHER SUBGOAL AWAITING OUR ATTENTION , NAMELY) (THE SUBGOAL WE NAMED) (FORMULA)) (!PPR (CAR (CDR HIST-ENTRY)) NIL) ABOVE %.)) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE SO-NEXT-CONSIDER) SO-NEXT-CONSIDER (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE CL-SET) PARENT (QUOTE LAST-CLAUSE) LAST-CLAUSE (QUOTE INDENT) 5) 0 PROVE-FILE)) (INDUCT (BM-MATCH HIST-ENTRY (LIST NAME WINNING-CAND RAW-CAND-CNT MERGED-CAND-CNT VETO-CNT HIGH-CNT FAVORED-CNT)) (COND (WINNING-CAND (SETQ FLG NIL) (SETQ LEMMAS NIL) (SETQ DEFNS NIL) (for X in (fetch (JUSTIFICATION LEMMAS) of (fetch (CANDIDATE JUSTIFICATION) of WINNING-CAND)) do (COND ((EQ X (QUOTE ZERO)) (SETQ FLG T)) ((GETPROP X (QUOTE TYPE-PRESCRIPTION-LST)) (SETQ DEFNS (CONS X DEFNS))) (T (SETQ LEMMAS (CONS X LEMMAS))))) (BM-MATCH (GET-SCHEMA-MEASURE-RELATION WINNING-CAND PARENT) (LIST SCHEMA MEASURE RELATION)) (SETQ ACCUMS (SET-DIFF (fetch (CANDIDATE CHANGED-VARS) of WINNING-CAND) (ALL-VARS MEASURE))) (PRINEVAL (PQUOTE (PROGN (@ SO-NEXT-CONSIDER) (? (WE WILL TRY TO PROVE IT BY INDUCTION %.) (PERHAPS WE CAN PROVE IT BY INDUCTION %.) (LET US APPEAL TO THE INDUCTION PRINCIPLE %.) (WE WILL APPEAL TO INDUCTION %.)) (COND ((NOT (IEQP RAW-CAND-CNT 1)) (? (THERE ARE (@ RAW-CAND-CNT) PLAUSIBLE INDUCTIONS) ((@ RAW-CAND-CNT) INDUCTIONS ARE SUGGESTED BY TERMS IN THE CONJECTURE ) (THE RECURSIVE TERMS IN THE CONJECTURE SUGGEST (@ RAW-CAND-CNT) INDUCTIONS)) (COND ((IEQP RAW-CAND-CNT MERGED-CAND-CNT)) ((IEQP MERGED-CAND-CNT 1) %. HOWEVER , THEY MERGE INTO ONE LIKELY CANDIDATE INDUCTION %.) (T %. THEY MERGE INTO (@ MERGED-CAND-CNT) LIKELY CANDIDATE INDUCTIONS)) (COND ((NOT (IEQP MERGED-CAND-CNT 1)) (COND ((IEQP VETO-CNT 0) , (COND ((IEQP MERGED-CAND-CNT 2) BOTH) (T ALL)) OF WHICH ARE FLAWED %.) ((IEQP VETO-CNT MERGED-CAND-CNT) , (COND ((IEQP VETO-CNT 2) BOTH) (T ALL)) OF WHICH ARE UNFLAWED %.) ((IEQP VETO-CNT 1) %. HOWEVER , ONLY ONE IS UNFLAWED %.) (T , (@ VETO-CNT) OF WHICH ARE UNFLAWED %.)) (COND ((NOT (IEQP VETO-CNT 1)) (COND ((IEQP FAVORED-CNT 1) SO WE WILL CHOOSE THE ONE SUGGESTED BY THE LARGEST NUMBER OF NONPRIMITIVE RECURSIVE FUNCTIONS %.) (T (COND ((NOT (IEQP FAVORED-CNT VETO-CNT)) WE LIMIT OUR CONSIDERATION TO THE (@ FAVORED-CNT) SUGGESTED BY THE LARGEST NUMBER OF NONPRIMITIVE RECURSIVE FUNCTIONS IN THE CONJECTURE %.)) (COND ((IEQP HIGH-CNT 1) HOWEVER , ONE OF THESE IS MORE LIKELY THAN THE (COND ((IEQP FAVORED-CNT 2) OTHER) (T OTHERS)) %.) (T SINCE (COND ((IEQP HIGH-CNT FAVORED-CNT) (COND ((IEQP HIGH-CNT 2) BOTH) (T ALL))) (T (@ HIGH-CNT))) OF THESE ARE EQUALLY LIKELY , WE WILL CHOOSE ARBITRARILY %.))))))))) (T THERE IS ONLY ONE (? (PLAUSIBLE) (SUGGESTED)) INDUCTION %.)) WE WILL INDUCT ACCORDING TO THE FOLLOWING SCHEME (!PPR SCHEMA (PQUOTE %.)) (COND (MEASURE (@ JUSTIFICATION-SENTENCE) (PLURAL? TESTS-AND-ALISTS-LST EACH THE) INDUCTION STEP OF THE SCHEME %. (COND (ACCUMS NOTE , HOWEVER , THE INDUCTIVE (COND (INSTANCES? INSTANCES) (T INSTANCE)) CHOSEN FOR (!PPR-LIST ACCUMS) %.)) THE ABOVE INDUCTION SCHEME (? (PRODUCES) (GENERATES) (LEADS TO))) (T THIS SCHEME IS JUSTIFIED BY THE ASSUMPTION THAT (!PPR (FN-SYMB TERM) NIL) IS TOTAL %.)))) (BINDINGS (QUOTE ACCUMS) ACCUMS (QUOTE JUSTIFICATION-SENTENCE) (JUSTIFICATION-SENTENCE) (QUOTE RELATION) RELATION (QUOTE MEASURE) MEASURE (QUOTE LEMMAS) LEMMAS (QUOTE DEFNS) DEFNS (QUOTE FLG) FLG (QUOTE NUMBER) (LENGTH (fetch (JUSTIFICATION LEMMAS) of (fetch (CANDIDATE JUSTIFICATION ) of WINNING-CAND))) (QUOTE SCHEMA) SCHEMA (QUOTE FAVORED-CNT) FAVORED-CNT (QUOTE HIGH-CNT) HIGH-CNT (QUOTE MERGED-CAND-CNT) MERGED-CAND-CNT (QUOTE VETO-CNT) VETO-CNT (QUOTE RAW-CAND-CNT) RAW-CAND-CNT (QUOTE SO-NEXT-CONSIDER) SO-NEXT-CONSIDER (QUOTE TESTS-AND-ALISTS-LST) (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of WINNING-CAND) (QUOTE INSTANCES?) (OR (CDR ACCUMS) (NOT (IEQP 1 (for TA in (fetch (CANDIDATE TESTS-AND-ALISTS-LST) of WINNING-CAND) sum (LENGTH (fetch (TESTS-AND-ALISTS ALISTS) of TA)))))) (QUOTE TERM) (fetch (CANDIDATE INDUCTION-TERM) of WINNING-CAND) (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE CL-SET) PARENT (QUOTE LAST-CLAUSE) LAST-CLAUSE (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE INDENT) (IPLUS 5 INDENT)) INDENT PROVE-FILE)) (T (PRINEVAL (PQUOTE (PROGN (@ SO-NEXT-CONSIDER) SINCE THERE IS NOTHING TO INDUCT UPON , THE PROOF HAS)) (BINDINGS (QUOTE SO-NEXT-CONSIDER) SO-NEXT-CONSIDER (QUOTE LAST-PROCESS) LAST-PROCESS (QUOTE CL-SET) PARENT (QUOTE LAST-CLAUSE) LAST-CLAUSE (QUOTE HIST-ENTRY) HIST-ENTRY (QUOTE INDENT) 5) 0 PROVE-FILE)))) (SETUP (COND ((AND (IEQP (LENGTH DESCENDANTS) 1) (for X in HIST-ENTRY always (MEMB X (QUOTE (AND OR NOT IMPLIES))))) NIL) (T (PRINEVAL (PQUOTE (PROGN THIS (? (FORMULA) (CONJECTURE)) CAN BE (COND (HIST-ENTRY SIMPLIFIED , USING THE (PLURAL? HIST-ENTRY ABBREVIATIONS ABBREVIATION) (!LIST HIST-ENTRY) ,) (T PROPOSITIONALLY SIMPLIFIED)) TO)) (BINDINGS (QUOTE HIST-ENTRY) HIST-ENTRY) INDENT PROVE-FILE)))) (FINISHED (BM-MATCH HIST-ENTRY (LIST WON-FLG)) (PRINEVAL (PQUOTE (PROGN (COND ((EQ LAST-PROCESS (QUOTE POP)) %. (COND (WON-FLG Q.E.D.) (T // // (@ FAILURE-MSG)))) (T // // (COND ((EQ WON-FLG (QUOTE DEFN-OK))) (WON-FLG Q.E.D.) (T (@ FAILURE-MSG))))) // //)) (BINDINGS (QUOTE FAILURE-MSG) FAILURE-MSG (QUOTE WON-FLG) WON-FLG (QUOTE LAST-PROCESS) LAST-PROCESS) 0 PROVE-FILE)) (ERROR1 (PQUOTE (PROGN IO1 HAS BEEN GIVEN AN UNRECOGNIZED PROCESS NAMED (!PPR PROCESS NIL) %.)) (BINDINGS (QUOTE PROCESS) PROCESS) (QUOTE HARD))) (COND ((NOT (OR (MEMB PROCESS UN-PRODUCTIVE-PROCESSES) (AND (EQ PROCESS (QUOTE INDUCT)) (NOT (CADR HIST-ENTRY))) (AND (EQ PROCESS (QUOTE SETUP)) (IEQP (LENGTH DESCENDANTS) 1) (for X in HIST-ENTRY always (MEMB X (QUOTE (AND OR NOT IMPLIES))))))) (SETQ N (LENGTH DESCENDANTS)) (COND ((EQ LAST-PRINEVAL-CHAR (QUOTE %.)) (PRINEVAL (PQUOTE (? (WE THUS OBTAIN) (THE RESULT IS) (THIS PRODUCES) (THIS GENERATES) (WE WOULD THUS LIKE TO PROVE) (WE MUST THUS PROVE))) (BINDINGS) INDENT PROVE-FILE))) (COND ((NEQ LAST-PRINEVAL-CHAR (QUOTE :)) (PRINEVAL (PQUOTE (PROGN (COND ((EQUAL N 0) NIL) ((EQUAL N 1) (? (THE (? (NEW) NIL) (? (GOAL) (CONJECTURE) (FORMULA))) NIL NIL)) (T (? ((@ N) NEW (? (GOALS) (CONJECTURES) (FORMULAS))) (THE FOLLOWING (@ N) NEW (? (GOALS) (CONJECTURES) (FORMULAS)))))) :)) (BINDINGS (QUOTE N) N) INDENT PROVE-FILE))))) (COND ((AND (NOT (MEMB PROCESS UN-PRODUCTIVE-PROCESSES)) (NOT DESCENDANTS)) (ITERPRIN TREE-LINES PROVE-FILE) (PRINEVAL (PQUOTE (PROGN T %.)) (BINDINGS) (IPLUS 6 INDENT) PROVE-FILE))) (SETQ LAST-PROCESS (COND ((AND (EQ PROCESS (QUOTE SETUP)) (OR (NOT (IEQP (LENGTH DESCENDANTS) 1)) (NOT (for X in HIST-ENTRY always (MEMB X (QUOTE (AND OR NOT IMPLIES))))))) (QUOTE SETUP-AND-CLAUSIFY-INPUT)) (T PROCESS))) (RETURN NIL]) (JUSTIFICATION-SENTENCE [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (* This fn returns a sentence to be fed to PRINEVAL.  The BINDINGS must include FLG, LEMMAS, DEFNS, NUMBER, MEASURE, and RELATION.  FLG is T or NIL indicating that linear arithmetic was used.  LEMMAS and DEFNS are the list of lemmas and definitions used.  NUMBER is the length of LEMMAS plus that of DEFNS plus 1 or 0 according to FLG.  MEASURE is a term and RELATION is a fn name.  *) (PQUOTE (PROGN (COND (FLG LINEAR ARITHMETIC (COND ((AND LEMMAS DEFNS) ,) ((OR LEMMAS DEFNS) AND)))) (COND (LEMMAS THE (PLURAL? LEMMAS LEMMAS LEMMA) (!LIST LEMMAS) (COND ((AND FLG DEFNS) , AND) (DEFNS AND)))) (COND (DEFNS THE (PLURAL? DEFNS DEFINITIONS DEFINITION) OF (!LIST DEFNS))) (COND ((OR FLG LEMMAS DEFNS) (PLURAL? NUMBER (? (INFORM US) (ESTABLISH) (CAN BE USED TO (? (PROVE) (SHOW) (ESTABLISH)))) (? (ESTABLISHES) (INFORMS US) (CAN BE USED TO (? (PROVE) (SHOW) (ESTABLISH))))) THAT) (T (? (IT IS OBVIOUS THAT) (OBVIOUSLY) (CLEARLY)))) THE MEASURE (!PPR MEASURE NIL) DECREASES ACCORDING TO THE WELL-FOUNDED RELATION (!PPR RELATION NIL) IN]) (!LIST [LAMBDA (*LST*) (* kbr: "19-Oct-85 16:31") (MAPRINEVAL *LST* *INDENT* *FILE* NIL NIL (PQUOTE ,) (COND ((CDDR *LST*) (PQUOTE (PROGN , AND))) (T (PQUOTE AND]) (MAPRINEVAL [LAMBDA (*LST* *INDENT* *FILE* *LEFT* *RIGHT* *SEPR* *FINALSEPR*) (* kbr: "19-Oct-85 16:31") (AND *LEFT* (PRINEVAL1 *LEFT*)) (COND ((LISTP *LST*) (COND ((CDR *LST*) (for TAIL on *LST* do (PRINEVAL1 (CAR TAIL)) (COND ((NULL (CDR TAIL)) NIL) ((NULL (CDDR TAIL)) (AND *FINALSEPR* (PRINEVAL1 *FINALSEPR*))) (T (AND *FINALSEPR* (PRINEVAL1 *SEPR*)))))) (T (PRINEVAL1 (CAR *LST*)))))) (AND *RIGHT* (PRINEVAL1 *RIGHT*]) (NOTICE-CLAUSE [LAMBDA (CL COL BROTHER-NO) (* kbr: "19-Oct-85 16:31") (CAR (SETQ CLAUSE-ALIST (CONS (LIST CL (OR COL 0) BROTHER-NO) CLAUSE-ALIST]) (PEVAL [LAMBDA (FORM) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP FORM) (COND ((LITATOM FORM) (COND ((OR (EQ FORM NIL) (EQ FORM T)) FORM) (T (PEVALV FORM)))) ((NUMBERP FORM) FORM) (T (ERROR1 (PQUOTE (PROGN ILLEGAL PEVAL FORM , (!PPR TERM NIL) %.)) (BINDINGS (QUOTE TERM) FORM) (QUOTE HARD))))) ((OR (EQ (CAR FORM) (QUOTE PQUOTE)) (EQ (CAR FORM) (QUOTE QUOTE))) (CADR FORM)) ((MEMB (CAR FORM) PRINEVAL-FNS) (PEVAL-APPLY (CAR FORM) (for X in (CDR FORM) collect (PEVAL X)))) (T (ERROR1 (PQUOTE (PROGN ILLEGAL PEVAL FORM , (!PPR TERM NIL) %.)) (BINDINGS (QUOTE TERM) FORM) (QUOTE HARD]) (PEVAL-APPLY [LAMBDA (FN ARGS) (* kbr: "19-Oct-85 16:31") (SELECTQ FN (AND (COND ((NULL ARGS) T) ((MEMB NIL ARGS) NIL) (T (CAR (LAST ARGS))))) (OR (for X in ARGS thereis X)) (FN-SYMB (FN-SYMB (CAR ARGS))) (FFN-SYMB (FFN-SYMB (CAR ARGS))) (ARGN (ARGN (CAR ARGS) (CADR ARGS))) (FARGN (FARGN (CAR ARGS) (CADR ARGS))) (SARGS (SARGS (CAR ARGS))) (FARGS (FARGS (CAR ARGS))) (QUOTEP (QUOTEP (CAR ARGS))) (FQUOTEP (FQUOTEP (CAR ARGS))) (APPLY FN ARGS]) (PEVALV [LAMBDA (X) (* kbr: "19-Oct-85 18:25") (LET (TEMP) (COND ((SETQ TEMP (ASSOC X *ALIST*)) (CDR TEMP)) (T (ERROR1 (PQUOTE (PROGN (!PPR X NIL) IS AN UNBOUND NLISTP IN PRINEVAL !)) (LIST (CONS (QUOTE X) X)) (QUOTE HARD]) (PLURALP [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (NOT (OR (EQUAL X 1) (AND (LISTP X) (NLISTP (CDR X]) (!PPR-LIST [LAMBDA (*LST*) (* kbr: "19-Oct-85 16:31") (MAPRINEVAL (for X in *LST* collect (LIST (QUOTE !PPR) (KWOTE X) NIL)) *INDENT* *FILE* NIL NIL (PQUOTE ,) (COND ((CDDR *LST*) (PQUOTE (PROGN , AND))) (T (PQUOTE AND]) (!PPR [LAMBDA (X PUNCT) (* kbr: "19-Oct-85 16:31") (LET (NCHARS) (SETQ X (EXPAND-PPR-MACROS X)) (SETQ NCHARS (NCHARS X)) (COND ((IGREATERP (IPLUS 2 (MAX (IPOSITION *FILE* NIL NIL) *INDENT*) NCHARS) (LINEL *FILE*)) (COND ((AND (ILEQ (IPLUS *INDENT* NCHARS) (LINEL *FILE*)) (ILESSP NCHARS 25)) (ITERPRI *FILE*) (ISPACES *INDENT* *FILE*) (IPRINC X *FILE*) (AND PUNCT (PRINEVAL1 PUNCT))) (T (PRINEVAL1 (PQUOTE (PROGN : //))) (PPRINDENT X (IPLUS *INDENT* 6) (COND (PUNCT (NCHARS PUNCT)) (T 0)) *FILE*) (AND PUNCT (PRINEVAL1 PUNCT)) (ITERPRI *FILE*)))) (T (ISPACES (IDIFFERENCE *INDENT* (IPOSITION *FILE* NIL NIL)) *FILE*) (OR (IEQP (IPOSITION *FILE* NIL NIL) *INDENT*) (ISPACES 1 *FILE*)) (IPRINC X *FILE*) (AND PUNCT (PRINEVAL1 PUNCT)))) (OR PUNCT (SETQ LAST-PRINEVAL-CHAR (COND ((LISTP X) (QUOTE ")")) (T (QUOTE X)))))) NIL]) (PRIN5* [LAMBDA (X) (* kbr: "19-Oct-85 17:23") (LET (SPACES (*NOPOINT T)) (SETQ SPACES (COND ((IEQP 0 (IPOSITION *FILE* NIL NIL)) 0) ((EQ LAST-PRINEVAL-CHAR (QUOTE %.)) 2) ((EQ LAST-PRINEVAL-CHAR (QUOTE :)) 2) (T 1))) (COND ((MEMB X (QUOTE (// /# %. ! ? , :))) (COND ((EQ X (QUOTE //)) (ITERPRI *FILE*)) ((EQ X (QUOTE /#)) (ISPACES (IDIFFERENCE *INDENT* (IPOSITION *FILE* NIL NIL)) *FILE*) (ISPACES (IDIFFERENCE PARAGRAPH-INDENT 2) *FILE*) (SETQ LAST-PRINEVAL-CHAR (QUOTE %.))) ((OR (EQ X (QUOTE ,)) (EQ X (QUOTE :))) (COND ((AND (NOT (MEMB LAST-PRINEVAL-CHAR (QUOTE (%. , :)))) (NOT (IEQP 0 (IPOSITION *FILE* NIL NIL)))) (ISPACES (IDIFFERENCE *INDENT* (IPOSITION *FILE* NIL NIL)) *FILE*) (IPRINC X *FILE*) (SETQ LAST-PRINEVAL-CHAR X)))) ((OR (EQ X (QUOTE %.)) (EQ X (QUOTE !)) (EQ X (QUOTE ?))) (ISPACES (IDIFFERENCE *INDENT* (IPOSITION *FILE* NIL NIL)) *FILE*) (IPRINC X *FILE*) (SETQ LAST-PRINEVAL-CHAR (QUOTE %.))) (T (ERROR1 (PQUOTE (PROGN THE CODE FOR PRIN5* IS INCONSISTENT : THE MEMB SAYS ONE THING AND THE COND SAYS ANOTHER %.)) (BINDINGS) (QUOTE HARD))))) ((EQ X NIL) NIL) (T (ISPACES (IDIFFERENCE *INDENT* (IPOSITION *FILE* NIL NIL)) *FILE*) (COND ((IGREATERP (IPLUS (IPOSITION *FILE* NIL NIL) SPACES (NCHARS X) 1) (LINEL *FILE*)) (ITERPRI *FILE*) (ISPACES *INDENT* *FILE*)) (T (ISPACES SPACES *FILE*))) (COND ((NUMBERP X) (IPRINC X *FILE*)) (T (COND ((EQ LAST-PRINEVAL-CHAR (QUOTE %.)) (IPRINC (CHARACTER (U-CASECODE (NTHCHARCODE X 1))) *FILE*) (for I from 2 to (NCHARS X) do (IPRINC (NTHCHAR X I) *FILE*))) (T (IPRINC X *FILE*))))) (SETQ LAST-PRINEVAL-CHAR NIL))) NIL]) (PRINEVAL [LAMBDA (FORM *ALIST* *INDENT* *FILE*) (PRINEVAL1 FORM]) (PRINEVAL1 [LAMBDA (SUBFORM) (* kbr: "19-Oct-85 18:31") (COND ((NLISTP SUBFORM) (PRIN5* (COND ((FIXP SUBFORM) (SPELL-NUMBER SUBFORM)) (T SUBFORM)))) (T (SELECTQ (CAR SUBFORM) (@ (PRINEVAL1 (PEVAL (CADR SUBFORM)))) (? (for SUBFORM1 in (BM-NTH (ADD1 (RANDOM-NUMBER (LENGTH (CDR SUBFORM)))) SUBFORM) do (PRINEVAL1 SUBFORM1))) (COND (for SUBFORM1 in (CDR SUBFORM) thereis (COND ((PEVAL (CAR SUBFORM1)) (for SUBFORM2 in (CDR SUBFORM1) do (PRINEVAL1 SUBFORM2)) T)))) (PLURAL? (COND ((PLURALP (PEVAL (CADR SUBFORM))) (PRINEVAL1 (CADDR SUBFORM))) (T (PRINEVAL1 (CADDDR SUBFORM))))) (PROGN (for SUBFORM1 in (CDR SUBFORM) do (PRINEVAL1 SUBFORM1))) (PEVAL SUBFORM]) (PRINT-DEFN-MSG [LAMBDA (NAME ARGS) (* kbr: "19-Oct-85 16:31") (PROG (TEMPS MEASURE RELATION LEMMAS FLG CONCL TIME N DEFNS) (SETQ LAST-PRIN5-WORD (QUOTE %.)) (SETQ TIME (TIME-IN-60THS)) (COND (IN-BOOT-STRAP-FLG (SETQ IOTHMTIME (DIFFERENCE (TIME-IN-60THS) TIME)) (RETURN NIL))) (SETQ TEMPS (GETPROP NAME (QUOTE JUSTIFICATIONS))) (COND ((NOT (TOTAL-FUNCTIONP NAME)) (ERROR1 (PQUOTE (PROGN THE ADMISSIBILITY OF (!PPR NAME NIL) HAS NOT BEEN ESTABLISHED %. WE WILL ASSUME THAT THERE EXISTS A FUNCTION SATISFYING THIS DEFINITION %. AN INDUCTION PRINCIPLE FOR THIS FUNCTION HAS ALSO BEEN ASSUMED , CORRESPONDING TO THE OBVIOUS SUBGOAL INDUCTION FOR THE FUNCTION %. THESE ASSUMPTIONS MAY RENDER THE THEORY INCONSISTENT %. // //)) (BINDINGS (QUOTE NAME) NAME) (QUOTE WARNING))) (T (SETQ N (SUB1 (LENGTH TEMPS))) (PRINEVAL (PQUOTE (PROGN /#)) (BINDINGS) 0 PROVE-FILE) (for TEMP in TEMPS as I from 1 do (SETQ MEASURE (fetch (JUSTIFICATION MEASURE-TERM) of TEMP)) (SETQ RELATION (fetch (JUSTIFICATION RELATION) of TEMP)) (SETQ FLG NIL) (SETQ LEMMAS NIL) (SETQ DEFNS NIL) (for X in (fetch (JUSTIFICATION LEMMAS) of TEMP) do (COND ((EQ X (QUOTE ZERO)) (SETQ FLG T)) ((GETPROP X (QUOTE TYPE-PRESCRIPTION-LST)) (SETQ DEFNS (CONS X DEFNS))) (T (SETQ LEMMAS (CONS X LEMMAS))))) (PRINEVAL (PQUOTE (PROGN (COND (FINALLY? (COND ((EQUAL N 2) IN ADDITION) (T FINALLY)) ,)) (@ JUSTIFICATION-SENTENCE) EACH RECURSIVE CALL %. (COND ((EQUAL I 1) HENCE , (!PPR NAME NIL) IS ACCEPTED UNDER THE (? (PRINCIPLE OF DEFINITION) (DEFINITIONAL PRINCIPLE)) %. (COND ((EQUAL N 1) THE DEFINITION OF (!PPR NAME NIL) CAN BE JUSTIFIED IN ANOTHER WAY %.) (OTHERS THERE ARE (@ N) OTHER (? (EXPLANATIONS OF) (MEASURES AND WELL-FOUNDED FUNCTIONS EXPLAINING)) THE RECURSION ABOVE %.)))))) (BINDINGS (QUOTE N) N (QUOTE NAME) NAME (QUOTE I) I (QUOTE JUSTIFICATION-SENTENCE) (JUSTIFICATION-SENTENCE) (QUOTE RELATION) RELATION (QUOTE MEASURE) MEASURE (QUOTE DEFNS) DEFNS (QUOTE LEMMAS) LEMMAS (QUOTE FLG) FLG (QUOTE NUMBER) (LENGTH (fetch (JUSTIFICATION LEMMAS) of TEMP)) (QUOTE FINALLY?) (AND (NOT (EQUAL I 1)) (NOT (EQUAL N 1)) (EQUAL I (ADD1 N))) (QUOTE OTHERS) (GREATERP N 1)) 0 PROVE-FILE)))) (COND ((NOT (IEQP TYPE-SET-UNKNOWN (CAR (TYPE-PRESCRIPTION NAME)))) (SETQ TEMP-TEMP (CONS (DUMB-CONVERT-TYPE-SET-TO-TYPE-RESTRICTION-TERM (CAR (TYPE-PRESCRIPTION NAME)) (CONS NAME ARGS)) (for FLG in (CDR (TYPE-PRESCRIPTION NAME)) as I from 0 when FLG collect (LIST (QUOTE EQUAL) (CONS NAME ARGS) (BM-NTH I ARGS))))) (SETQ CONCL (COND ((NULL (CDR TEMP-TEMP)) (CAR TEMP-TEMP)) (T (CONS (QUOTE OR) TEMP-TEMP)))) (PRINEVAL (PQUOTE (PROGN (? (NOTE THAT) (OBSERVE THAT) (FROM THE DEFINITION WE CAN CONCLUDE THAT)) (!PPR CONCL NIL) IS A THEOREM %.)) (BINDINGS (QUOTE CONCL) CONCL) 0 PROVE-FILE))) (SETQ IOTHMTIME (DIFFERENCE (TIME-IN-60THS) TIME)) (RETURN NIL]) (TH-IFY [LAMBDA (N) (* kbr: "26-Oct-85 14:00") (SELECTQ N (1 (QUOTE FIRST)) (2 (QUOTE SECOND)) (3 (QUOTE THIRD)) (4 (QUOTE FOURTH)) (5 (QUOTE FIFTH)) (6 (QUOTE SIXTH)) (7 (QUOTE SEVENTH)) (8 (QUOTE EIGHTH)) (9 (QUOTE NINTH)) (10 (QUOTE TENTH)) (11 (QUOTE 11TH)) (12 (QUOTE 12TH)) (13 (QUOTE 13TH)) (COND ((FIXP N) (PACK (NCONC (UNPACK N) (SELECTQ (REMAINDER N 10) (1 (QUOTE ST)) (2 (QUOTE ND)) (3 (QUOTE RD)) (QUOTE TH))))) (T N]) (UN-NOTICE-CLAUSE [LAMBDA (CL) (* kbr: "26-Oct-85 13:52") (SETQ TEMP-TEMP (ASSOC CL CLAUSE-ALIST)) (COND ((NULL TEMP-TEMP) (ERROR1 (PQUOTE (PROGN UN-NOTICE-CLAUSE WAS CALLED ON A CLAUSE NOT IN CLAUSE-ALIST !)) NIL (QUOTE HARD)))) (SETQ CLAUSE-ALIST (DREMOVE TEMP-TEMP CLAUSE-ALIST)) TEMP-TEMP]) ) (RPAQQ PPRCOMS ((* BM-PPR *) (FNS PPRIND PPRPACK PPR1 PPR2 PPR22 TERPRISPACES))) (* BM-PPR *) (DEFINEQ (PPRIND [LAMBDA (FMLA LEFTMARGIN RPARCNT PPR-MACRO-LST PPRFILE) (* kbr: "20-Oct-85 16:00") (PROG (MARG2 PPR-MACRO-MEMO STARTLIST) (SETQ MARG2 (LINEL PPRFILE)) (COND ((NLISTP FMLA) (IPRIN1 FMLA PPRFILE) (RETURN NIL))) (SETQ POS (COND ((SETQ TEMP-TEMP (ASSOC PPRFILE IPOSITION-ALIST)) (CDR TEMP-TEMP)) (T 0))) (SETQ SPACELEFT (IDIFFERENCE MARG2 LEFTMARGIN)) (PPR1 FMLA (ADD1 RPARCNT)) (SETQ NEXTNODE (CDAR STARTLIST)) (SETQ NEXTIND (CAAR STARTLIST)) (SETQ PPR-MACRO-MEMO (DREVERSE PPR-MACRO-MEMO)) (SETQ NEXT-MEMO-KEY (CAR (CAR PPR-MACRO-MEMO))) (SETQ NEXT-MEMO-VAL (CDR (CAR PPR-MACRO-MEMO))) (PPR2 FMLA LEFTMARGIN RPARCNT) (IPOSITION PPRFILE POS NIL) (RETURN NIL]) (PPRPACK [LAMBDA NIL (* kbr: "19-Oct-85 16:31") (CONS (COND ((ILESSP MINREM DLHDFMLA) (SETQ REMAINDER 0) (MINUS (ADD1 MINREM))) (T (SETQ REMAINDER (IDIFFERENCE MINREM DLHDFMLA)) (ADD1 DLHDFMLA))) FMLA]) (PPR1 [LAMBDA (FMLA RPARCNT) (* kbr: "22-Oct-85 16:08") (LET (DLHDFMLA RUNFLAT MINREM L RUNSTART RUNEND (PPR-MACRO-LST PPR-MACRO-LST)) (PROG NIL (COND ((NOT (LISTP FMLA)) (SETQ NCHARS (IPLUS RPARCNT (NCHARS FMLA))) (SETQ REMAINDER (IDIFFERENCE SPACELEFT NCHARS)) (RETURN NIL))) (COND ((NLISTP (CAR FMLA)) (COND ((SETQ TEMP1 (ASSOC (CAR FMLA) PPR-MACRO-LST)) (SETQ TEMP1 (APPLY* (CDR TEMP1) FMLA)) (SETQ PPR-MACRO-MEMO (CONS (CONS FMLA TEMP1) PPR-MACRO-MEMO)) (COND ((NLISTP TEMP1) (SETQ NCHARS (IPLUS RPARCNT (NCHARS TEMP1))) (SETQ REMAINDER (IDIFFERENCE SPACELEFT NCHARS)) (RETURN NIL)) (T (SETQ FMLA TEMP1))))) (COND ((AND (EQ (QUOTE QUOTE) (CAR FMLA)) (NOT (NLISTP (CDR FMLA))) (NULL (CDDR FMLA))) (PPR1 (CADR FMLA) RPARCNT) (AND NCHARS (SETQ NCHARS (ADD1 NCHARS))) (SETQ REMAINDER (SUB1 REMAINDER)) (RETURN NIL))) (SETQ DLHDFMLA (ADD1 (NCHARS (CAR FMLA)))) (SETQ L FMLA)) (T (SETQ DLHDFMLA 0) (SETQ L (RPLACD NILCONS FMLA)) (GO OVER))) (COND ((NULL (CDR FMLA)) (SETQ NCHARS (IPLUS RPARCNT DLHDFMLA)) (SETQ REMAINDER (IDIFFERENCE SPACELEFT NCHARS)) (RETURN NIL))) OVER (SETQ RUNFLAT DLHDFMLA) (SETQ MINREM 1000) (SETQ SPACELEFT (SUB1 SPACELEFT)) LOOPFLAT (SETQ L (CDR L)) (COND ((NULL L) (SETQ SPACELEFT (ADD1 SPACELEFT)) (COND ((AND (NOT (IGREATERP RUNFLAT SPACELEFT)) (NOT (IGREATERP RUNFLAT FORCEIN))) (SETQ NCHARS RUNFLAT) (SETQ REMAINDER (IDIFFERENCE SPACELEFT RUNFLAT))) (T (SETQ STARTLIST (CONS (PPRPACK) NIL)) (SETQ ENDLIST STARTLIST) (SETQ NCHARS NIL))) (RETURN NIL))) (COND ((NLISTP L) (RPLACA (CDR DOTCONS) L) (SETQ L DOTCONS))) (COND ((NLISTP (CAR L)) (SETQ TEMP1 (NCHARS (CAR L))) (SETQ RUNFLAT (IPLUS TEMP1 (ADD1 RUNFLAT))) (SETQ TEMP1 (IDIFFERENCE SPACELEFT TEMP1)) (COND ((NULL (CDR L)) (SETQ RUNFLAT (IPLUS RPARCNT RUNFLAT)) (SETQ TEMP1 (IDIFFERENCE TEMP1 RPARCNT)))) (COND ((ILESSP TEMP1 MINREM) (SETQ MINREM TEMP1))) (GO LOOPFLAT)) (T (PPR1 (CAR L) (COND ((NULL (CDR L)) (ADD1 RPARCNT)) (T 1))) (COND ((ILESSP REMAINDER MINREM) (SETQ MINREM REMAINDER))) (COND (NCHARS (SETQ RUNFLAT (IPLUS NCHARS (ADD1 RUNFLAT))) (GO LOOPFLAT))))) (SETQ RUNSTART STARTLIST) (SETQ RUNEND ENDLIST) LOOPIND (SETQ L (CDR L)) (COND ((NULL L) (SETQ STARTLIST (CONS (PPRPACK) RUNSTART)) (SETQ ENDLIST RUNEND) (SETQ NCHARS NIL) (SETQ SPACELEFT (ADD1 SPACELEFT)) (RETURN NIL))) (COND ((NLISTP L) (RPLACA (CDR DOTCONS) L) (SETQ L DOTCONS))) (COND ((NLISTP (CAR L)) (SETQ TEMP1 (IDIFFERENCE SPACELEFT (NCHARS (CAR L)))) (COND ((NULL (CDR L)) (SETQ TEMP1 (IDIFFERENCE TEMP1 RPARCNT)))) (COND ((ILESSP TEMP1 MINREM) (SETQ MINREM TEMP1))) (GO LOOPIND))) (PPR1 (CAR L) (COND ((NULL (CDR L)) (ADD1 RPARCNT)) (T 1))) (COND ((ILESSP REMAINDER MINREM) (SETQ MINREM REMAINDER))) (COND (NCHARS) (T (RPLACD RUNEND STARTLIST) (SETQ RUNEND ENDLIST))) (GO LOOPIND]) (PPR2 [LAMBDA (FMLA MARG1 RPARCNT) (* kbr: "20-Oct-85 16:02") (PROG (NONLFLAG TEMP) (COND ((NLISTP FMLA) (PRIND FMLA PPRFILE) (RETURN NIL))) (COND ((EQ FMLA NEXT-MEMO-KEY) (SETQ FMLA NEXT-MEMO-VAL) (SETQ PPR-MACRO-MEMO (CDR PPR-MACRO-MEMO)) (SETQ NEXT-MEMO-KEY (CAR (CAR PPR-MACRO-MEMO))) (SETQ NEXT-MEMO-VAL (CDR (CAR PPR-MACRO-MEMO))) (COND ((NLISTP FMLA) (PRIND FMLA PPRFILE) (RETURN NIL))))) (COND ((AND (EQ (CAR FMLA) (QUOTE QUOTE)) (NOT (NLISTP (CDR FMLA))) (NULL (CDDR FMLA))) (PRIN1 "'" PPRFILE) (PPR2 (CADR FMLA) (ADD1 MARG1) RPARCNT) (RETURN NIL))) (COND ((EQ FMLA NEXTNODE) (SETQ MARG1 (IPLUS MARG1 (ABS NEXTIND))) (SETQ NONLFLAG (IGREATERP NEXTIND 0)) (SETQ STARTLIST (CDR STARTLIST)) (COND ((NULL STARTLIST)) (T (SETQ NEXTNODE (CDR (CAR STARTLIST))) (SETQ NEXTIND (CAR (CAR STARTLIST)))))) (T (PPR22 FMLA) (RETURN NIL))) (PRIN1 "(" PPRFILE) (COND ((NLISTP (CAR FMLA)) (PRIND (CAR FMLA) PPRFILE) (COND ((NULL (CDR FMLA)) (PRIN1 ")" PPRFILE) (RETURN NIL))) (COND ((AND (LISTP (CDR FMLA)) (OR (NLISTP (SETQ TEMP (CADR FMLA))) (AND (NOT (EQ (CADR FMLA) NEXTNODE)) (PROGN (COND ((EQ FMLA NEXT-MEMO-KEY) (SETQ TEMP NEXT-MEMO-VAL))) (OR (NLISTP TEMP) (AND (EQ (CAR TEMP) (QUOTE QUOTE)) (NOT (NLISTP (CDR TEMP))) (NLISTP (CADR TEMP)) (NULL (CDDR TEMP))))))) (ILESSP (IPLUS POS (NCHARS TEMP) RPARCNT) MARG2)) (PRIN1 " " PPRFILE) (PPR2 (CADR FMLA) MARG1 RPARCNT) (SETQ FMLA (CDR FMLA)) (GO LOOP1)) (NONLFLAG (PRIN1 " " PPRFILE)) (T (TERPRISPACES MARG1 PPRFILE))) (SETQ FMLA (CDR FMLA)))) LOOP (COND ((NLISTP FMLA) (PRIN1 "." PPRFILE) (PRIN1 " " PPRFILE) (PRIND FMLA PPRFILE) (PRIN1 ")" PPRFILE) (RETURN NIL))) (PPR2 (CAR FMLA) MARG1 (COND ((NULL (CDR FMLA)) (ADD1 RPARCNT)) (T 1))) LOOP1 (COND ((NULL (CDR FMLA)) (PRIN1 ")" PPRFILE) (RETURN NIL))) (COND ((AND (NLISTP (CAR FMLA)) (LISTP (CDR FMLA)) (OR (NLISTP (SETQ TEMP (CADR FMLA))) (AND (NOT (EQ TEMP NEXTNODE)) (PROGN (COND ((EQ FMLA NEXT-MEMO-KEY) (SETQ TEMP NEXT-MEMO-VAL))) (OR (NLISTP TEMP) (AND (EQ (CAR TEMP) (QUOTE QUOTE)) (NOT (NLISTP (CDR TEMP))) (NLISTP (CADR TEMP)) (NULL (CDDR TEMP))))))) (ILESSP (IPLUS POS (NCHARS TEMP) RPARCNT) MARG2)) (PRIN1 " " PPRFILE) (PPR2 (CADR FMLA) MARG2 RPARCNT) (SETQ FMLA (CDR FMLA)) (GO LOOP1))) (TERPRISPACES MARG1 PPRFILE) (SETQ FMLA (CDR FMLA)) (GO LOOP]) (PPR22 [LAMBDA (X) (* kbr: "19-Oct-85 16:31") (COND ((NLISTP X) (PRIND X PPRFILE)) (T (PRIN1 "(" PPRFILE) (PROG NIL LOOP (COND ((NLISTP X) (COND ((NULL X) (PRIN1 ")" PPRFILE)) (T (PRIN1 "." PPRFILE) (PRIN1 " " PPRFILE) (PRIND X PPRFILE) (PRIN1 ")" PPRFILE))) (RETURN NIL)) (T (PPR2 (CAR X) MARG2 0) (SETQ X (CDR X)) (COND ((NULL X)) (T (PRIN1 " " PPRFILE))) (GO LOOP]) (TERPRISPACES [LAMBDA (N FILE) (* kbr: "22-Oct-85 15:53") (TERPRI FILE) (for I from 1 to N do (PRIN1 " " FILE)) (SETQ POS N]) ) (FILESLOAD COMPILEBANG) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA TOGGLE REFLECT PROVE-LEMMA ENABLE DISABLE DEFN DCL ADD-SHELL ADD-AXIOM) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (PUTPROPS BOYERMOORE COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (1882 4524 (UNDEFN 1892 . 3169) (UNPROVE-LEMMA 3171 . 4522)) (38488 63236 (BM-UPCASE 38498 . 38731) (COMPILE-IF-APPROPRIATE-AND-POSSIBLE 38733 . 39901) (COPYLIST 39903 . 40148) ( EXTEND-FILE-NAME 40150 . 40408) (FIND-CHAR-IN-FILE 40410 . 41128) (FIND-STRING-IN-FILE 41130 . 42096) (GET-TOTAL-STATS 42098 . 43165) (GET-FROM-FILE 43167 . 43421) (GET-PLIST-FROM-FILE 43423 . 43796) ( GET-STATS-FILE 43798 . 44878) (BM-PRIN1 44880 . 45012) (PRINT-SYSTEM 45014 . 45416) (PRINT-DATE-LINE 45418 . 45577) (RANDOM-INITIALIZATION 45579 . 46159) (RANDOM-NUMBER 46161 . 46297) (READ-FILE 46299 . 46598) (REMQ 46600 . 46765) (STORE-DEFINITION 46767 . 46924) (SWAP-OUT 46926 . 47098) (R-LOOP 47100 . 47440) (TIME-IT 47442 . 47751) (TIME-IN-60THS 47753 . 47922) (XSEARCH 47924 . 48959) (*1*CAR 48961 . 49191) (*1*CDR 49193 . 49423) (ADD-TO-SET 49425 . 49600) (ARGN-MACRO 49602 . 50210) (BINDINGS-MACRO 50212 . 50527) (CELL 50529 . 50771) (CREATE-LEMMA-STACK 50773 . 50953) ( CREATE-LINEARIZE-ASSUMPTIONS-STACK 50955 . 51183) (CREATE-STACK1 51185 . 51603) (FARGN-MACRO 51605 . 52105) (FN-SYMB-MACRO 52107 . 52467) (HLOAD 52469 . 52883) (IPOSITION 52885 . 53445) (ITERPRI 53447 . 53605) (ITERPRIN 53607 . 53778) (ITERPRISPACES 53780 . 53944) (IPRIN1 53946 . 54122) (IPRINC 54124 . 54300) (IPRINT 54302 . 54480) (ISPACES 54482 . 54733) (KILL-DEFINITION 54735 . 54870) (LINEL 54872 . 55003) (MAKE-LIB 55005 . 57417) (MATCH-MACRO 57419 . 57806) (MATCH!-MACRO 57808 . 58022) (MATCH1-MACRO 58024 . 58547) (MATCH2-MACRO 58549 . 61263) (NOTE-LIB 61265 . 61708) (BM-NTH 61710 . 61840) ( PREPARE-FOR-THE-NIGHT 61842 . 61974) (SPELL-NUMBER 61976 . 62391) (SUB-PAIR 62393 . 62938) (UNIONQ 62940 . 63234)) (64942 186343 (*1*ADD1 64952 . 65156) (*1*AND 65158 . 65316) (*1*CONS 65318 . 65442) ( *1*COUNT 65444 . 66139) (*1*DIFFERENCE 66141 . 66387) (*1*EQUAL 66389 . 66559) (*1*FALSE 66561 . 66681 ) (*1*FALSEP 66683 . 66854) (*1*FIX 66856 . 67052) (*1*IMPLIES 67054 . 67216) (*1*LESSP 67218 . 67429) (*1*LISTP 67431 . 67670) (*1*LITATOM 67672 . 68079) (*1*MINUS 68081 . 68341) (*1*NEGATIVE-GUTS 68343 . 68551) (*1*NEGATIVEP 68553 . 68933) (*1*NLISTP 68935 . 69175) (*1*NOT 69177 . 69309) (*1*NUMBERP 69311 . 69517) (*1*OR 69519 . 69664) (*1*PACK 69666 . 70038) (*1*PLUS 70040 . 70199) (*1*QUOTIENT 70201 . 70432) (*1*REMAINDER 70434 . 70680) (*1*SUB1 70682 . 70880) (*1*TIMES 70882 . 71044) (*1*TRUE 71046 . 71165) (*1*TRUEP 71167 . 71337) (*1*UNPACK 71339 . 71805) (*1*ZERO 71807 . 71923) (*1*ZEROP 71925 . 72156) (ABBREVIATIONP 72158 . 72762) (ABBREVIATIONP1 72764 . 73224) ( ACCEPTABLE-TYPE-PRESCRIPTION-LEMMAP 73226 . 84063) (ACCESS-ERROR 84065 . 84353) (ADD-AXIOM1 84355 . 85251) (ADD-DCELL 85253 . 85482) (ADD-ELIM-LEMMA 85484 . 86309) (ADD-EQUATION 86311 . 93778) ( ADD-EQUATIONS 93780 . 95868) (ADD-EQUATIONS-TO-POT-LST 95870 . 101209) (ADD-FACT 101211 . 101421) ( ADD-GENERALIZE-LEMMA 101423 . 101703) (ADD-LEMMA 101705 . 101917) (ADD-LEMMA0 101919 . 102561) ( ADD-LESSP-ASSUMPTION-TO-POLY 102563 . 104400) (ADD-LINEAR-TERM 104402 . 107926) (ADD-LINEAR-VARIABLE 107928 . 108912) (ADD-LINEAR-VARIABLE1 108914 . 109920) (ADD-LITERAL 109922 . 110716) (ADD-META-LEMMA 110718 . 111308) (ADD-NOT-EQUAL-0-ASSUMPTION-TO-POLY 111310 . 113758) ( ADD-NOT-LESSP-ASSUMPTION-TO-POLY 113760 . 116508) (ADD-NUMBERP-ASSUMPTION-TO-POLY 116510 . 119719) ( ADD-PROCESS-HIST 119721 . 119975) (ADD-REWRITE-LEMMA 119977 . 122791) (ADD-SHELL-ROUTINES 122793 . 129115) (ADD-SHELL0 129117 . 141300) (ADD-SUB-FACT 141302 . 146290) (ADD-TERM-TO-POT-LST 146292 . 146890) (ADD-TERMS-TO-POT-LST 146892 . 153626) (ADD-TO-SET-EQ 153628 . 153810) (ADD-TYPE-SET-LEMMAS 153812 . 156061) (ALL-ARGLISTS 156063 . 157687) (ALL-FNNAMES 157689 . 157864) (ALL-FNNAMES-LST 157866 . 158072) (ALL-FNNAMES1 158074 . 158647) (ALL-FNNAMES1-EVG 158649 . 159850) (ALL-INSERTIONS 159852 . 160605) (ALL-PATHS 160607 . 167073) (ALL-PERMUTATIONS 167075 . 167661) (ALL-PICKS 167663 . 168426) ( ALL-SUBSEQUENCES 168428 . 169290) (ALL-VARS 169292 . 169929) (ALL-VARS-BAG 169931 . 170108) ( ALL-VARS-BAG1 170110 . 170406) (ALL-VARS-LST 170408 . 170904) (ALL-VARS1 170906 . 171563) ( ALMOST-SUBSUMES 171565 . 172122) (ALMOST-SUBSUMES-LOOP 172124 . 173866) (ALMOST-VALUEP 173868 . 174045 ) (ALMOST-VALUEP1 174047 . 174363) (APPLY-HINTS 174365 . 175191) (APPLY-INDUCT-HINT 175193 . 176918) ( APPLY-USE-HINT 176920 . 178814) (ARG1-IN-ARG2-UNIFY-SUBST 178816 . 179166) (ARGN0 179168 . 180054) ( ARITY 180056 . 180351) (ASSOC-OF-APPEND 180353 . 181128) (ASSUME-TRUE-FALSE 181130 . 186051) ( ATTEMPT-TO-REWRITE-RECOGNIZER 186053 . 186341)) (188185 332662 (BATCH-PROVEALL 188195 . 188720) ( BOOLEAN 188722 . 188900) (BOOT-STRAP0 188902 . 189130) (BREAK-LEMMA 189132 . 190243) (BTM-OBJECT 190245 . 190872) (BTM-OBJECT-OF-TYPE-SET 190874 . 191646) (BTM-OBJECTP 191648 . 192129) (BUILD-SUM 192131 . 192799) (CANCEL 192801 . 194837) (CANCEL-POSITIVE 194839 . 196016) (CANCEL1 196018 . 197638) (CAR-CDRP 197640 . 198154) (CDR-ALL 198156 . 198311) (CHK-ACCEPTABLE-DEFN 198313 . 200405) ( CHK-ACCEPTABLE-DCL 200407 . 201059) (CHK-ACCEPTABLE-ELIM-LEMMA 201061 . 205252) ( CHK-ACCEPTABLE-GENERALIZE-LEMMA 205254 . 205409) (CHK-ACCEPTABLE-HINTS 205411 . 212213) ( CHK-ACCEPTABLE-LEMMA 212215 . 213465) (CHK-ACCEPTABLE-META-LEMMA 213467 . 216705) ( CHK-ACCEPTABLE-REFLECT 216707 . 219132) (CHK-ACCEPTABLE-REWRITE-LEMMA 219134 . 230327) ( CHK-ACCEPTABLE-SHELL 230329 . 238499) (CHK-ACCEPTABLE-TOGGLE 238501 . 238967) (CHK-ARGLIST 238969 . 239835) (CHK-MEANING 239837 . 240460) (CHK-NEW-*1*NAME 240462 . 241433) (CHK-NEW-NAME 241435 . 243067) (CLAUSIFY 243069 . 243392) (CLAUSIFY-INPUT 243394 . 244087) (CLAUSIFY-INPUT1 244089 . 245892) ( CLEAN-UP-BRANCHES 245894 . 246322) (CNF-DNF 246324 . 248232) (COMMON-SWEEP 248234 . 249599) ( COMMUTE-EQUALITIES 249601 . 250094) (COMPARE-STATS 250096 . 258214) (COMPLEMENTARY-MULTIPLEP 258216 . 259983) (COMPLEMENTARYP 259985 . 260652) (COMPLEXITY 260654 . 261348) (COMPRESS-POLY 261350 . 261791) (COMPRESS-POLY1 261793 . 262293) (COMPUTE-VETOES 262295 . 266567) (COMSUBT1 266569 . 269576) ( COMSUBTERMS 269578 . 270156) (CONJOIN 270158 . 270441) (CONJOIN-CLAUSE-SETS 270443 . 270927) (CONJOIN2 270929 . 271927) (CONS-PLUS 271929 . 272176) (CONS-TERM 272178 . 274141) (CONSJOIN 274143 . 274427) ( CONTAINS-REWRITEABLE-CALLP 274429 . 275335) (CONVERT-CAR-CDR 275337 . 276103) (CONVERT-CONS 276105 . 276342) (CONVERT-NOT 276344 . 276609) (CONVERT-QUOTE 276611 . 277291) ( CONVERT-TYPE-NO-TO-RECOGNIZER-TERM 277293 . 277971) (BM-COUNT 277973 . 278196) (COUNT-IFS 278198 . 278590) (CREATE-REWRITE-RULE 278592 . 278907) (DCL0 278909 . 279210) (DECODE-IDATE 279212 . 279354) ( DEFN-ASSUME-TRUE-FALSE 279356 . 285727) (DEFN-LOGIOR 285729 . 285948) (DEFN-SETUP 285950 . 286746) ( DEFN-TYPE-SET 286748 . 288435) (DEFN-TYPE-SET2 288437 . 288615) (DEFN-WRAPUP 288617 . 289524) (DEFN0 289526 . 304479) (DELETE1 304481 . 304738) (DELETE-TAUTOLOGIES 304740 . 305268) (DELETE-TOGGLES 305270 . 305926) (DEPEND 305928 . 307268) (DEPENDENT-EVENTS 307270 . 307473) (DEPENDENTS-OF 307475 . 308111) (DEPENDENTS-OF1 308113 . 308773) (DESTRUCTORS 308775 . 309180) (DESTRUCTORS1 309182 . 309682) (DETACH 309684 . 309894) (DETACHED-ERROR 309896 . 310145) (DETACHEDP 310147 . 310267) (DISJOIN 310269 . 310553) (DISJOIN-CLAUSES 310555 . 311131) (DISJOIN2 311133 . 312407) (DTACK-0-ON-END 312409 . 312567) (DUMB-CONVERT-TYPE-SET-TO-TYPE-RESTRICTION-TERM 312569 . 314112) (DUMB-IMPLICATE-LITS 314114 . 314883) (DUMB-NEGATE-LIT 314885 . 315564) (DUMB-OCCUR 315566 . 315966) (DUMB-OCCUR-LST 315968 . 316149) (DUMP 316151 . 319470) (DUMP-ADD-AXIOM 319472 . 320153) (DUMP-ADD-SHELL 320155 . 322647) (DUMP-BEGIN-GROUP 322649 . 322998) (DUMP-DCL 323000 . 323544) (DUMP-DEFN 323546 . 324902) (DUMP-END-GROUP 324904 . 325280) (DUMP-HINTS 325282 . 330021) (DUMP-LEMMA-TYPES 330023 . 330847) (DUMP-OTHER 330849 . 331343) ( DUMP-PROVE-LEMMA 331345 . 332087) (DUMP-TOGGLE 332089 . 332660)) (335083 475823 (ELIMINABLE-VAR-CANDS 335093 . 335297) (ELIMINABLEP 335299 . 336045) (ELIMINATE-DESTRUCTORS-CANDIDATEP 336047 . 338796) ( ELIMINATE-DESTRUCTORS-CANDIDATES 338798 . 339363) (ELIMINATE-DESTRUCTORS-CANDIDATES1 339365 . 340162) (ELIMINATE-DESTRUCTORS-CLAUSE 340164 . 347723) (ELIMINATE-DESTRUCTORS-CLAUSE1 347725 . 348505) ( ELIMINATE-DESTRUCTORS-SENT 348507 . 348764) (ELIMINATE-IRRELEVANCE-CLAUSE 348766 . 350376) ( ELIMINATE-IRRELEVANCE-SENT 350378 . 350628) (EQUATIONAL-PAIR-FOR 350630 . 350981) (ERASE-EOL 350983 . 351119) (ERASE-EOP 351121 . 351257) (ERROR1 351259 . 353098) (EVENT-FORM 353100 . 353418) ( EVENT1-OCCURRED-BEFORE-EVENT2 353420 . 353639) (EVENTS-SINCE 353641 . 353954) (EVG 353956 . 356001) ( EVG-OCCUR-LEGAL-CHAR-CODE-SEQ 356003 . 357011) (EVG-OCCUR-NUMBER 357013 . 357903) (EVG-OCCUR-OTHER 357905 . 358611) (EXECUTE 358613 . 359031) (EXPAND-ABBREVIATIONS 359033 . 362301) (EXPAND-AND-ORS 362303 . 365041) (EXPAND-BOOT-STRAP-NON-REC-FNS 365043 . 365884) (EXPAND-NON-REC-FNS 365886 . 366609) (EXPAND-PPR-MACROS 366611 . 368185) (EXTEND-ALIST 368187 . 368822) (EXTERNAL-LINEARIZE 368824 . 369041 ) (EXTRACT-DEPENDENCIES-FROM-HINTS 369043 . 369588) (FALSE-NONFALSEP 369590 . 370372) ( FAVOR-COMPLICATED-CANDIDATES 370374 . 371022) (FERTILIZE-CLAUSE 371024 . 375319) (FERTILIZE-FEASIBLE 375321 . 376099) (FERTILIZE-SENT 376101 . 376335) (FERTILIZE1 376337 . 376902) (FILTER-ARGS 376904 . 377195) (FIND-EQUATIONAL-POLY 377197 . 380804) (FIRST-COEFFICIENT 380806 . 380980) (FIRST-VAR 380982 . 381144) (FITS 381146 . 381959) (FIXCAR-CDR 381961 . 382545) (FLATTEN-ANDS-IN-LIT 382547 . 383329) ( FLESH-OUT-IND-PRIN 383331 . 386613) (FLUSH-CAND1-DOWN-CAND2 386615 . 390867) (FN-SYMB0 390869 . 391587 ) (FNNAMEP 391589 . 392046) (FNNAMEP-IF 392048 . 392379) (FORM-COUNT 392381 . 393100) (FORM-COUNT-EVG 393102 . 394254) (FORM-COUNT1 394256 . 394619) (FORM-INDUCTION-CLAUSE 394621 . 395464) ( FORMP-SIMPLIFIER 395466 . 397366) (FORMULA-OF 397368 . 397666) (FREE-VAR-CHK 397668 . 399050) ( FREE-VARSP 399052 . 399351) (GEN-VARS 399353 . 400113) (GENERALIZE-CLAUSE 400115 . 401375) ( GENERALIZE-SENT 401377 . 401624) (GENERALIZE1 401626 . 402187) (GENERALIZE2 402189 . 402626) (GENRLT1 402628 . 403128) (GENRLTERMS 403130 . 403311) (GET-CANDS 403313 . 404177) (GET-LISP-SEXPR 404179 . 405102) (GET-LEVEL-NO 405104 . 405271) (GET-STACK-NAME 405273 . 405613) (GET-STACK-NAME1 405615 . 406042) (GET-TYPES 406044 . 408254) (GREATEREQP 408256 . 408389) (GUARANTEE-CITIZENSHIP 408391 . 408809) (GUESS-RELATION-MEASURE-LST 408811 . 409622) (HAS-LIB-PROPS 409624 . 409993) (ILLEGAL-CALL 409995 . 410238) (ILLEGAL-NAME 410240 . 410464) (IMMEDIATE-DEPENDENTS-OF 410466 . 414308) (IMPLIES? 414310 . 414444) (IMPOSSIBLE-POLYP 414446 . 414815) (IND-FORMULA 414817 . 418269) (INDUCT 418271 . 421684) (INDUCT-VARS 421686 . 422840) (INDUCTION-MACHINE 422842 . 424272) (INFORM-SIMPLIFY 424274 . 427137) (INIT-LEMMA-STACK 427139 . 427306) (INIT-LIB 427308 . 427913) ( INIT-LINEARIZE-ASSUMPTIONS-STACK 427915 . 428130) (INTERESTING-SUBTERMS 428132 . 428921) (INTERSECTP 428923 . 429084) (INTRODUCE-ANDS 429086 . 430297) (INTRODUCE-LISTS 430299 . 431324) (JUMPOUTP 431326 . 435046) (KILL-EVENT 435048 . 435584) (KILL-LIB 435586 . 436346) (KILLPROPLIST1 436348 . 436824) ( LEGAL-CHAR-CODE-SEQ 436826 . 438159) (LENGTH-TO-ATOM 438161 . 438341) (LESSEQP 438343 . 438473) ( LEXORDER 438475 . 439705) (LINEARIZE 439707 . 446713) (LISTABLE 446715 . 447267) (LOGSUBSETP 447269 . 447417) (LOOKUP-HYP 447419 . 449853) (LOOP-STOPPER 449855 . 450406) (MAIN-EVENT-OF 450408 . 450937) ( CREATE-EVENT 450939 . 451222) (MAKE-FLATTENED-MACHINE 451224 . 452685) (MAKE-NEW-NAME 452687 . 452953) (MAKE-REWRITE-RULES 452955 . 454209) (MAKE-TYPE-RESTRICTION 454211 . 455845) (MAX-FORM-COUNT 455847 . 457037) (MAXIMAL-ELEMENTS 457039 . 457599) (MEANING-SIMPLIFIER 457601 . 464013) (MEMB-NEGATIVE 464015 . 464268) (MENTIONSQ 464270 . 464522) (MENTIONSQ-LST 464524 . 464793) (MERGE-CAND1-INTO-CAND2 464795 . 469267) (MERGE-CANDS 469269 . 469578) (MERGE-DESTRUCTOR-CANDIDATES 469580 . 470564) ( MERGE-TESTS-AND-ALISTS 470566 . 472084) (MERGE-TESTS-AND-ALISTS-LSTS 472086 . 474752) (META-LEMMAP 474754 . 474921) (MULTIPLE-PIGEON-HOLE 474923 . 475821)) (477795 619591 (BM-NEGATE 477805 . 478768) ( NEGATE-LIT 478770 . 479214) (NEXT-AVAILABLE-TYPE-NO 479216 . 480143) (NO-CROWDINGP 480145 . 480631) ( NO-DUPLICATESP 480633 . 480845) (NO-OP 480847 . 480963) (NON-RECURSIVE-DEFNP 480965 . 481403) ( NORMALIZE-IFS 481405 . 484744) (NOT-EQUAL-0? 484746 . 485604) (NOT-IDENT 485606 . 486441) (NOT-LESSP? 486443 . 487129) (NOT-TO-BE-REWRITTENP 487131 . 488692) (NUMBERP? 488694 . 489087) (OBJ-TABLE 489089 . 490161) (OCCUR 490163 . 491459) (OCCUR-CNT 491461 . 492146) (OCCUR-LST 492148 . 492313) ( ONE-WAY-UNIFY 492315 . 492494) (ONE-WAY-UNIFY-LIST 492496 . 492946) (ONE-WAY-UNIFY1 492948 . 493307) ( ONE-WAY-UNIFY11 493309 . 495031) (ONEIFY 495033 . 497216) (ONEIFY-ASSUME-FALSE 497218 . 497388) ( ONEIFY-ASSUME-TRUE 497390 . 497904) (ONEIFY-TEST 497906 . 500468) (OPTIMIZE-COMMON-SUBTERMS 500470 . 508399) (PARTITION 508401 . 509036) (PARTITION-CLAUSES 509038 . 511186) (PATH-ADD-TO-SET 511188 . 511408) (PATH-EQ 511410 . 511643) (PATH-POT-SUBSUMES 511645 . 511937) (PATH-UNION 511939 . 512178) ( PEGATE-LIT 512180 . 512425) (PETITIO-PRINCIPII 512427 . 513290) (PICK-HIGH-SCORES 513292 . 513823) ( PIGEON-HOLE 513825 . 514349) (PIGEON-HOLE-IN-ALL-POSSIBLE-WAYS 514351 . 515678) (PIGEON-HOLE1 515680 . 516862) (PLUSJOIN 516864 . 517175) (POLY-MEMBER 517177 . 517627) (POP-CLAUSE-SET 517629 . 520102) ( POP-LEMMA-FRAME 520104 . 520496) (POP-LINEARIZE-ASSUMPTIONS-FRAME 520498 . 520986) (POPU 520988 . 521221) (POSSIBLE-IND-PRINCIPLES 521223 . 522473) (POSSIBLY-NUMERIC 522475 . 522722) (POWER-EVAL 522724 . 522984) (POWER-REP 522986 . 523249) (PPC 523251 . 523423) (PPE 523425 . 523556) (PPE-LST 523558 . 524581) (BM-PPR 524583 . 524784) (PPRINDENT 524786 . 525148) (PPSD 525150 . 525283) (PPSD-LST 525285 . 525680) (PREPROCESS 525682 . 526127) (PREPROCESS-HYPS 526129 . 527202) (PRETTYIFY-CLAUSE 527204 . 527752) (PRETTYIFY-LISP 527754 . 527937) (PRIMITIVE-RECURSIVEP 527939 . 528595) (PRIMITIVEP 528597 . 529046) (PRINT-STACK 529048 . 529277) (PRINT-STATS 529279 . 529597) (PRINT-TO-DISPLAY 529599 . 530807) (PROCESS-EQUATIONAL-POLYS 530809 . 533586) (PROPERTYLESS-SYMBOLP 533588 . 533779) (PROVE 533781 . 535357) (PROVE-TERMINATION 535359 . 536858) (PROVEALL 536860 . 537485) (PUSH-CLAUSE-SET 537487 . 537718) (PUSH-LEMMA 537720 . 537967) (PUSH-LEMMA-FRAME 537969 . 538142) ( PUSH-LINEARIZE-ASSUMPTION 538144 . 538376) (PUSH-LINEARIZE-ASSUMPTIONS-FRAME 538378 . 538599) (PUSHU 538601 . 538809) (PUT-CURSOR 538811 . 538943) (PUT-INDUCTION-INFO 538945 . 541528) (PUT-LEVEL-NO 541530 . 542127) (PUT-TYPE-PRESCRIPTION 542129 . 546737) (PUT0 546739 . 548634) (PUT00 548636 . 549190 ) (PUT1 549192 . 550297) (PUT1-LST 550299 . 550667) (PUTD1 550669 . 551364) (QUICK-BLOCK-INFO 551366 . 552612) (QUICK-BLOCK-INFO1 552614 . 552885) (QUICK-WORSE-THAN 552887 . 554098) (R 554100 . 554448) (REDO! 554450 . 554660) (REDO-UNDONE-EVENTS 554662 . 560468) (BM-REDUCE 560470 . 561023) (REDUCE1 561025 . 562852) (REFLECT0 562854 . 565896) (RELIEVE-HYPS 565898 . 566423) (RELIEVE-HYPS-NOT-OK 566425 . 567532) (RELIEVE-HYPS1 567534 . 571276) (REMOVE-*2*IFS 571278 . 572196) (REMOVE-NEGATIVE 572198 . 572493) (REMOVE-REDUNDANT-TESTS 572495 . 574037) (REMOVE1 574039 . 574303) (REMOVE-TRIVIAL-EQUATIONS 574305 . 577408) (REMOVE-UNCHANGING-VARS 577410 . 578460) (REMPROP1 578462 . 578774) (RESTART 578776 . 578992) (RESTART-BATCH 578994 . 579385) (REWRITE 579387 . 582861) (REWRITE-FNCALL 582863 . 589951) (REWRITE-FNCALLP 589953 . 593776) (REWRITE-IF 593778 . 595369) (REWRITE-IF1 595371 . 596360) ( REWRITE-LINEAR-CONCL 596362 . 598431) (REWRITE-SOLIDIFY 598433 . 601105) (REWRITE-TYPE-PRED 601107 . 605970) (REWRITE-WITH-LEMMAS 605972 . 616809) (REWRITE-WITH-LINEAR 616811 . 619245) (RPLACAI 619247 . 619589)) (621335 715338 (S 621345 . 621998) (SARGS 622000 . 623166) (SCONS-TERM 623168 . 623614) ( SCRUNCH 623616 . 623937) (SCRUNCH-CLAUSE 623939 . 624314) (SCRUNCH-CLAUSE-SET 624316 . 624784) ( SEARCH-GROUND-UNITS 624786 . 626875) (SEQUENTIAL-DIFFERENCE 626877 . 627485) (SET-DIFF 627487 . 627666 ) (SET-DIFF-N 627668 . 628221) (SET-EQUAL 628223 . 628380) (SET-SIMPLIFY-CLAUSE-POT-LST 628382 . 630735) (SETTLED-DOWN-CLAUSE 630737 . 631035) (SETTLED-DOWN-SENT 631037 . 631288) (SETUP 631290 . 632168) (SETUP-META-NAMES 632170 . 632664) (SHELL-CONSTRUCTORP 632666 . 632896) ( SHELL-DESTRUCTOR-NESTP 632898 . 633337) (SHELL-OCCUR 633339 . 634959) (SHELL-OCCUR1 634961 . 636987) ( SHELLP 636989 . 637322) (SIMPLIFY-CLAUSE 637324 . 642585) (SIMPLIFY-CLAUSE-MAXIMALLY 642587 . 643024) (SIMPLIFY-CLAUSE-MAXIMALLY1 643026 . 643627) (SIMPLIFY-CLAUSE0 643629 . 645468) (SIMPLIFY-CLAUSE1 645470 . 648472) (SIMPLIFY-LOOP 648474 . 648982) (SIMPLIFY-SENT 648984 . 649218) ( SINGLETON-CONSTRUCTOR-TO-RECOGNIZER 649220 . 649706) (SKO-DEST-NESTP 649708 . 650307) ( SOME-SUBTERM-WORSE-THAN-OR-EQUAL 650309 . 651016) (SORT-DESTRUCTOR-CANDIDATES 651018 . 652383) ( SOUND-IND-PRIN-MASK 652385 . 657525) (STACK-DEPTH 657527 . 657663) (START-STATS 657665 . 657847) ( STOP-STATS 657849 . 658281) (STORE-SENT 658283 . 660779) (STRIP-BRANCHES 660781 . 661359) ( STRIP-BRANCHES1 661361 . 666989) (SUB-SEQUENCEP 666991 . 667368) (SUBBAGP 667370 . 667721) ( SUBLIS-EXPR 667723 . 668032) (SUBLIS-EXPR1 668034 . 668436) (SUBLIS-VAR 668438 . 669074) ( SUBLIS-VAR-LST 669076 . 669265) (SUB-PAIR-EXPR 669267 . 669564) (SUB-PAIR-EXPR-LST 669566 . 669759) ( SUB-PAIR-EXPR1 669761 . 670488) (SUB-PAIR-VAR 670490 . 671256) (SUB-PAIR-VAR-LST 671258 . 671449) ( SUBST-EXPR 671451 . 671735) (SUBST-EXPR-ERROR1 671737 . 672130) (SUBST-EXPR-LST 672132 . 672313) ( SUBST-EXPR1 672315 . 672685) (SUBST-FN 672687 . 673539) (SUBST-VAR 673541 . 673934) (SUBST-VAR-LST 673936 . 674125) (BM-SUBST 674127 . 674349) (SUBSUMES 674351 . 674513) (SUBSUMES-REWRITE-RULE 674515 . 674966) (SUBSUMES1 674968 . 675367) (SUBSUMES11 675369 . 675575) (SUM-STATS-ALIST 675577 . 676015) (TABULATE 676017 . 676206) (TERM-ORDER 676208 . 680196) (TERMINATION-MACHINE 680198 . 681841) ( TP-EXPLODEN1 681843 . 682622) (TP-GETCHARN1 682624 . 683272) (TP-IMPLODE1 683274 . 684527) ( TO-BE-IGNOREDP 684529 . 684960) (TOO-MANY-IFS 684962 . 688612) (TOP-FNNAME 688614 . 688880) ( TOTAL-FUNCTIONP 688882 . 689264) (TRANSITIVE-CLOSURE 689266 . 692050) (TRANSLATE 692052 . 699038) ( TRANSLATE-TO-LISP 699040 . 699563) (TREE-DEPENDENTS 699565 . 699935) (TRIVIAL-POLYP 699937 . 700153) ( TRIVIAL-POLYP1 700155 . 703521) (TRUE-POLYP 703523 . 703886) (TYPE-ALIST-CLAUSE 703888 . 704382) ( TYPE-PRESCRIPTION-LEMMAP 704384 . 704793) (TYPE-SET 704795 . 707231) (TYPE-SET2 707233 . 707781) (UBT 707783 . 707931) (UNBREAK-LEMMA 707933 . 708229) (UNCHANGING-VARS 708231 . 708439) (UNCHANGING-VARS1 708441 . 709419) (UNDO-BACK-THROUGH 709421 . 709973) (UNDO-NAME 709975 . 710832) (UNION-EQUAL 710834 . 711834) (UNPRETTYIFY 711836 . 712739) (VARIANTP 712741 . 713054) (WORSE-THAN 713056 . 713591) ( WORSE-THAN-OR-EQUAL 713593 . 713779) (WRAPUP 713781 . 714667) (XXXJOIN 714669 . 715145) (ZERO-POLY 715147 . 715336)) (715870 733731 (BOOT-STRAP 715880 . 718163) (ADD-AXIOM 718165 . 719251) (ADD-SHELL 719253 . 721823) (DCL 721825 . 722539) (DEFN 722541 . 725351) (DEFN& 725353 . 725789) (DISABLE 725791 . 726049) (ENABLE 726051 . 726310) (PROVE-LEMMA 726312 . 729096) (PROVE-LEMMA& 729098 . 729403) ( REFLECT 729405 . 732801) (TOGGLE 732803 . 733729)) (734143 748312 (GENERATE-ADD-FACT-PART 734153 . 740658) (GENERATE-ADD-SUB-FACT1 740660 . 743936) (GENERATE-SUB-FACT-PART 743938 . 746933) ( GENERATE-UNDO-TUPLE-PART 746935 . 748310)) (748649 829912 (!CLAUSE-SET 748659 . 749399) (!CLAUSE 749401 . 749836) (EQUALITY-HYP-NO 749838 . 750255) (GET-SCHEMA-MEASURE-RELATION 750257 . 752347) (IO 752349 . 752680) (IO1 752682 . 808683) (JUSTIFICATION-SENTENCE 808685 . 811112) (!LIST 811114 . 811396 ) (MAPRINEVAL 811398 . 812214) (NOTICE-CLAUSE 812216 . 812485) (PEVAL 812487 . 813615) (PEVAL-APPLY 813617 . 814348) (PEVALV 814350 . 814808) (PLURALP 814810 . 815006) (!PPR-LIST 815008 . 815462) (!PPR 815464 . 817157) (PRIN5* 817159 . 820310) (PRINEVAL 820312 . 820392) (PRINEVAL1 820394 . 821819) ( PRINT-DEFN-MSG 821821 . 828705) (TH-IFY 828707 . 829489) (UN-NOTICE-CLAUSE 829491 . 829910)) (830036 842620 (PPRIND 830046 . 830992) (PPRPACK 830994 . 831341) (PPR1 831343 . 836904) (PPR2 836906 . 841538 ) (PPR22 841540 . 842407) (TERPRISPACES 842409 . 842618))))) STOP \ No newline at end of file diff --git a/lispusers/BRKDWNREPORT b/lispusers/BRKDWNREPORT new file mode 100644 index 00000000..d805fcf5 --- /dev/null +++ b/lispusers/BRKDWNREPORT @@ -0,0 +1 @@ +(FILECREATED "12-Feb-87 23:13:02" {FIREFS:CS:UNIV% ROCHESTER}LISP>BRKDWNREPORT.;1 8063 changes to: (VARS BRKDWNREPORTCOMS) (FNS BRKDWNFORM BDR-TYPE BRKDWN BRKDWNREPORT) previous date: "12-Feb-87 23:07:23" {FIREFS:CS:UNIV% ROCHESTER}LISP>BRKDWNREPORT.;1) (* Copyright (c) 1987 by Johannes A. G. M. Koomen. All rights reserved.) (PRETTYCOMPRINT BRKDWNREPORTCOMS) (RPAQQ BRKDWNREPORTCOMS ((FNS BRKDWNREPORT BRKDWNFORM BDR-TYPE BDR-TYPE-SORTED BDR-COL BDR-RPT))) (DEFINEQ (BRKDWNREPORT [LAMBDA (TITLE BRKDWNSTREAM) (* Koomen "18-Dec-86 16:11") (DECLARE (GLOBALVARS BRKDWNLABELS)) (if (NOT (OPENP BRKDWNSTREAM (QUOTE OUTPUT))) then (RESETLST (SETQ BRKDWNSTREAM (OPENSTREAM BRKDWNSTREAM (QUOTE OUTPUT))) [RESETSAVE NIL (BQUOTE (CLOSEF? (\, BRKDWNSTREAM] (BRKDWNREPORT TITLE BRKDWNSTREAM)) else (PROG [ENTRYCNT (FIRSTCOL 0) (TYPE-ENTRIES (for BDTYPE inside BRKDWNLABELS collect (* * Each entry is a list of three elements: total frequency of calls, total quantity measured, and list of  individual contributors, each of which is a 3-element list containing name, frequency and quantity measured.) (LIST 0 0 NIL] [for RESULT in (BRKDWNRESULTS T) as old ENTRYCNT from 0 bind NAME FREQUENCY unless (ZEROP (SETQ FREQUENCY (CADR RESULT))) do (SETQ NAME (CAR RESULT)) (for QUANTITY in (CDDR RESULT) as TYPE-ENTRY in TYPE-ENTRIES unless (ZEROP QUANTITY) do (add (CAR TYPE-ENTRY) FREQUENCY) (add (CADR TYPE-ENTRY) QUANTITY) (push (CADDR TYPE-ENTRY) (LIST NAME FREQUENCY QUANTITY))) (SETQ FIRSTCOL (MAX FIRSTCOL (NCHARS NAME] (SETQ FIRSTCOL (IPLUS FIRSTCOL 2)) (printout BRKDWNSTREAM "Breakdown Report:" 24 (OR TITLE "")) (printout BRKDWNSTREAM T T "Breakdown Date:" 24 (DATE)) (printout BRKDWNSTREAM T T "Functions measured:" 24 ENTRYCNT) (printout BRKDWNSTREAM T T "Non-zero entries:" T) (for BDTYPE inside BRKDWNLABELS as TYPE-ENTRY in TYPE-ENTRIES bind N do (SETQ N (LENGTH (CADDR TYPE-ENTRY))) (printout BRKDWNSTREAM 6 BDTYPE 24 .I6 N (if (EQP N 1) then " function" else " functions"))) (printout BRKDWNSTREAM T T T) (for BDTYPE inside BRKDWNLABELS as TYPE-ENTRY in TYPE-ENTRIES do (BDR-TYPE BRKDWNSTREAM FIRSTCOL (L-CASE BDTYPE) (CAR TYPE-ENTRY) (CADR TYPE-ENTRY) (CADDR TYPE-ENTRY))) (TERPRI BRKDWNSTREAM]) (BRKDWNFORM [LAMBDA (BRKDWNFORM BRKDWNFNS BRKDWNSTREAM NEWBRKDWNTYPE) (* Koomen "12-Feb-87 22:58") (DECLARE (GLOBALVARS BRKDWNTYPE BRKDWNTYPES) (LOCALVARS BRKDWNFORM BRKDWNFNS BRKDWNSTREAM NEWBRKDWNTYPE)) (RESETLST (APPLY (FUNCTION UNBREAK) BRKDWNFNS) (if NEWBRKDWNTYPE then (RESETSAVE BRKDWNTYPE (if (EQ NEWBRKDWNTYPE T) then (for BDT in BRKDWNTYPES collect (CAR BDT)) else NEWBRKDWNTYPE))) (BREAKDOWN) [RESETSAVE (APPLY (FUNCTION BREAKDOWN) BRKDWNFNS) (BQUOTE (UNBREAK (\,@ BRKDWNFNS] (EVAL BRKDWNFORM) (BRKDWNREPORT BRKDWNFORM BRKDWNSTREAM]) (BDR-TYPE [LAMBDA (OUTSTREAM FIRSTCOL BDTYPE TOTAL-FREQUENCY TOTAL-QUANTITY ENTRIES) (* Koomen "12-Feb-87 23:06") (if ENTRIES then [SORT ENTRIES (FUNCTION (LAMBDA (x y) (GEQ (CADDR x) (CADDR y] (printout OUTSTREAM T (U-CASE BDTYPE) " -- sorted by cummulative " BDTYPE ":" T) (BDR-TYPE-SORTED OUTSTREAM FIRSTCOL BDTYPE TOTAL-FREQUENCY TOTAL-QUANTITY ENTRIES) (if (CDR ENTRIES) then (SORT ENTRIES T) (printout OUTSTREAM T (U-CASE BDTYPE) " -- alphabetic sort:" T) (BDR-TYPE-SORTED OUTSTREAM FIRSTCOL BDTYPE TOTAL-FREQUENCY TOTAL-QUANTITY ENTRIES]) (BDR-TYPE-SORTED [LAMBDA (OUTSTREAM FIRSTCOL BDTYPE TOTAL-FREQUENCY TOTAL-QUANTITY ENTRIES) (* Koomen "17-Dec-86 15:10") (PROG (COL1-START COL1-WIDTH COL1-FORMAT COL2-START COL2-WIDTH COL2-FORMAT COL3-START COL3-WIDTH COL3-FORMAT COL4-START COL4-WIDTH COL4-FORMAT LINE-END) (SETQ COL1-START FIRSTCOL) (SETQ COL1-WIDTH 11) [SETQ COL1-FORMAT (BQUOTE (FIX (\, COL1-WIDTH] (SETQ COL2-START (PLUS COL1-START COL1-WIDTH 4)) (SETQ COL2-WIDTH 7) [SETQ COL2-FORMAT (BQUOTE (FIX (\, COL2-WIDTH] (SETQ COL3-START (PLUS COL2-START COL2-WIDTH 4)) (SETQ COL3-WIDTH 9) (SETQ COL3-FORMAT (BQUOTE (FLOAT (\, COL3-WIDTH) 3))) (SETQ COL4-START (PLUS COL3-START COL3-WIDTH 4)) (SETQ COL4-WIDTH 3) [SETQ COL4-FORMAT (BQUOTE (FIX (\, COL4-WIDTH] (SETQ LINE-END (PLUS COL4-START COL4-WIDTH)) (BDR-RPT "=" LINE-END OUTSTREAM) (TERPRI OUTSTREAM) (PRIN1 "Function:" OUTSTREAM) (BDR-COL OUTSTREAM COL1-START COL1-WIDTH BDTYPE) (BDR-COL OUTSTREAM COL2-START COL2-WIDTH "#calls") (BDR-COL OUTSTREAM COL3-START COL3-WIDTH "per call") (BDR-COL OUTSTREAM COL4-START COL4-WIDTH "%%") (TERPRI OUTSTREAM) (BDR-RPT "-" LINE-END OUTSTREAM) (TERPRI OUTSTREAM) (for ENTRY in ENTRIES as NLINES from 1 bind NAME FREQUENCY QUANTITY (LASTLINE _ (IDIFFERENCE (LENGTH ENTRIES) 4)) do (SETQ NAME (CAR ENTRY)) (SETQ FREQUENCY (CADR ENTRY)) (SETQ QUANTITY (CADDR ENTRY)) (PRIN1 NAME OUTSTREAM) (BDR-COL OUTSTREAM COL1-START COL1-WIDTH QUANTITY COL1-FORMAT) (BDR-COL OUTSTREAM COL2-START COL2-WIDTH FREQUENCY COL2-FORMAT) (BDR-COL OUTSTREAM COL3-START COL3-WIDTH (FQUOTIENT QUANTITY FREQUENCY) COL3-FORMAT) (BDR-COL OUTSTREAM COL4-START COL4-WIDTH (FQUOTIENT (FTIMES 100.0 QUANTITY) TOTAL-QUANTITY) COL4-FORMAT) (TERPRI OUTSTREAM) (if (AND (ZEROP (IREMAINDER NLINES 10)) (ILESSP NLINES LASTLINE)) then (BDR-RPT "-" LINE-END OUTSTREAM) (TERPRI OUTSTREAM))) (BDR-RPT "-" LINE-END OUTSTREAM) (TERPRI OUTSTREAM) (PRIN1 "Total:" OUTSTREAM) (BDR-COL OUTSTREAM COL1-START COL1-WIDTH TOTAL-QUANTITY COL1-FORMAT) (BDR-COL OUTSTREAM COL2-START COL2-WIDTH TOTAL-FREQUENCY COL2-FORMAT) (BDR-COL OUTSTREAM COL3-START COL3-WIDTH (FQUOTIENT TOTAL-QUANTITY TOTAL-FREQUENCY) COL3-FORMAT) (TERPRI OUTSTREAM) (BDR-RPT "=" LINE-END OUTSTREAM) (TERPRI OUTSTREAM) (TERPRI OUTSTREAM]) (BDR-COL [LAMBDA (OUTSTREAM START WIDTH VALUE FORMAT) (* Koomen "16-Dec-86 17:24") (if FORMAT then (TAB START 1 OUTSTREAM) (PRINTNUM FORMAT VALUE OUTSTREAM) else (SETQ START (IDIFFERENCE (IPLUS START WIDTH) (NCHARS VALUE))) (TAB START 1 OUTSTREAM) (PRIN1 VALUE OUTSTREAM]) (BDR-RPT [LAMBDA (STR N OUTSTREAM) (* Koomen "17-Dec-86 14:50") (for I from 1 to N do (PRIN1 STR OUTSTREAM]) ) (PUTPROPS BRKDWNREPORT COPYRIGHT ("Johannes A. G. M. Koomen" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (512 7973 (BRKDWNREPORT 522 . 2895) (BRKDWNFORM 2897 . 3703) (BDR-TYPE 3705 . 4464) ( BDR-TYPE-SORTED 4466 . 7414) (BDR-COL 7416 . 7794) (BDR-RPT 7796 . 7971))))) STOP \ No newline at end of file diff --git a/lispusers/BUTTONS b/lispusers/BUTTONS new file mode 100644 index 00000000..bc77c89b --- /dev/null +++ b/lispusers/BUTTONS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP" BASE 10) (FILECREATED "26-Oct-89 14:30:27" {ICE}LISPUSERS>MEDLEY>BUTTONS.;2 28959 changes to%: (VARS BUTTONSCOMS) (FNS MOVE-BUTTON \BUTTONS-DRAW-BOX \BUTTONS-TRACK-MOUSE EDIT-BUTTON-CONTENTS) previous date%: " 2-Dec-88 17:17:47" {ICE}LISPUSERS>KOTO>BUTTONS.;1) (* " Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT BUTTONSCOMS) (RPAQQ BUTTONSCOMS ((* ;;; "BUTTONS provides a mechanism for mapping mouse clicks to actions via mouse-sensitive pictures of buttons. Each button has a label and an action, which is an arbitrary Lisp form. If the left mouse button is clicked on a button, its associated action is executed. If the action is a string it is stuffed into the system buffer and read by the current tty process; otherwise it is evaluated under the mouse process.") (* ;;; "USER INTERFACE") (RECORDS BUTTON) (FNS ALIGN-BUTTONS BUTTONP BUTTONSPROP BUTTON-ACTION BUTTON-LABEL CLOSE-BUTTON CLOSE-BUTTONS COPY-BUTTON CREATE-BUTTON DELETE-BUTTON DELETE-BUTTONS EDIT-BUTTON EDIT-BUTTON-CONTENTS EXECUTE-BUTTON EXPOSE-BUTTONS LOAD-SOME-BUTTONS MOVE-BUTTON REDISPLAY-BUTTON RESTORE-BUTTONS SAVE-BUTTONS SAVE-SOME-BUTTONS) (PROP ARGNAMES BUTTONSPROP BUTTON-ACTION BUTTON-LABEL) (* ;;; "IMPLEMENTATION") (PROP MAKEFILE-ENVIRONMENT BUTTONS) (VARS *BUTTONS-DATAVERSION* *DEFAULT-BUTTONPROPS*) (INITVARS (*BUTTONPROPS* (COPYALL *DEFAULT-BUTTONPROPS*)) (*ALL-BUTTONS* NIL) (*BUTTONS-DEFAULT-ACTION* NIL) (*BUTTONS-DEFAULT-LABEL* NIL) (*BUTTONS-EDIT-MENU* NIL) (*BUTTONS-EDIT-SHADE* NIL) (*BUTTONS-EXEC-SHADE* NIL) (*BUTTONS-GRID-ORIGIN* NIL) (*BUTTONS-LABEL-FONT* NIL) (*BUTTONS-MENU-FONT* NIL) (*BUTTONS-SAVE-DIRECTORY* NIL)) (FNS \BUTTONS-BUTTONEVENTFN \BUTTONS-DATAFILE-NAME \BUTTONS-CHANGE-LABEL \BUTTONS-CREATE-ICON \BUTTONS-DRAW-BOX \BUTTONS-EDITE \BUTTONS-EDIT-MENU \BUTTONS-INIT \BUTTONS-IO-EXIT \BUTTONS-OPEN-STREAM \BUTTONS-PROMPT-FOR-DATAFILE-NAME \BUTTONS-READ \BUTTONS-SETPROP \BUTTONS-SHOW \BUTTONS-SHOW-EXEC \BUTTONS-TRACK-MOUSE \BUTTONS-WAIT-MOUSE) (COMS (* The button icon) (FILES (SYSLOAD FROM LISPUSERS) ICONW) (FNS DROPSHADOW ICONMASK CLEAR-MASK-OUTLINE) (BITMAPS *BUTTON-BITMAP*) (INITVARS (*BUTTON-INVERT-REGION* (QUOTE (6 10 85 25))) (*BUTTON-CLIPPING-REGION* (QUOTE (7 11 83 23))) (*BUTTON-ICON* (DROPSHADOW *BUTTON-BITMAP*)) (*BUTTON-ICON-MASK* (ICONMASK *BUTTON-ICON*)))) (ADDVARS (BackgroundMenuCommands ("Button Control" (QUOTE (EDIT-BUTTON)) "Manipulate action buttons"))) (VARS (BackgroundMenu)) (P (\BUTTONS-INIT)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA BUTTON-LABEL BUTTON-ACTION BUTTONSPROP))))) (* ;;; "BUTTONS provides a mechanism for mapping mouse clicks to actions via mouse-sensitive pictures of buttons. Each button has a label and an action, which is an arbitrary Lisp form. If the left mouse button is clicked on a button, its associated action is executed. If the action is a string it is stuffed into the system buffer and read by the current tty process; otherwise it is evaluated under the mouse process." ) (* ;;; "USER INTERFACE") (DECLARE%: EVAL@COMPILE (ACCESSFNS BUTTON ((LABEL (WINDOWPROP DATUM (QUOTE BUTTON-LABEL)) (WINDOWPROP DATUM (QUOTE BUTTON-LABEL) NEWVALUE)) (ACTION (WINDOWPROP DATUM (QUOTE BUTTON-ACTION)) (WINDOWPROP DATUM (QUOTE BUTTON-ACTION) NEWVALUE)) (EXECUTING? (WINDOWPROP DATUM (QUOTE BUTTON-EXECUTING?)) (WINDOWPROP DATUM (QUOTE BUTTON-EXECUTING?) NEWVALUE))) ) ) (DEFINEQ (ALIGN-BUTTONS (LAMBDA (BUTTON) (* Koomen "30-Dec-86 16:04") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (bind BUTTONREGION BUTTON2 BUTTON2REGION (EDGE _ (MENU (create MENU TITLE _ "Which axis? " ITEMS _ (QUOTE (Vertical Horizontal)) CENTERFLG _ T))) first (if (NULL EDGE) then (RETURN)) (SETQ BUTTONREGION (WINDOWREGION BUTTON)) while (PROGN (PROMPTPRINT "Indicate another button to align: ") (AND (SETQ BUTTON2 (WHICHW (GETPOSITION))) (NEQ BUTTON2 BUTTON) (FMEMB BUTTON2 *ALL-BUTTONS*))) do (SETQ BUTTON2REGION (WINDOWREGION BUTTON2)) (MOVEW BUTTON2 (fetch (REGION LEFT) of (if (EQ EDGE (QUOTE Horizontal)) then BUTTON2REGION else BUTTONREGION)) (fetch (REGION BOTTOM) of (if (EQ EDGE (QUOTE Vertical)) then BUTTON2REGION else BUTTONREGION))) finally (PROMPTPRINT "Done."))) ) (BUTTONP (LAMBDA (BUTTON ERROR?) (* Koomen "18-Mar-87 14:03") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (if (FMEMB BUTTON *ALL-BUTTONS*) then BUTTON elseif ERROR? then (ERROR "Arg not a BUTTON:" BUTTON))) ) (BUTTONSPROP (LAMBDA N (* Koomen " 8-Jun-88 11:42") (DECLARE (GLOBALVARS *BUTTONPROPS*)) (PROG (PROPNAME OLDVALUE NEWVALUE) (SETQ PROPNAME (if (IGREATERP N 0) then (ARG N 1))) (if (NOT PROPNAME) then (RETURN)) (if (NEQ (QUOTE *BUTTONPROPS*) (CAR (LISTP *BUTTONPROPS*))) then (RETURN)) (SETQ OLDVALUE (CADR (ASSOC PROPNAME *BUTTONPROPS*))) (if (IGREATERP N 1) then (SETQ NEWVALUE (ARG N 2)) (if (NOT (EQUAL NEWVALUE OLDVALUE)) then (PUTASSOC PROPNAME (LIST NEWVALUE) *BUTTONPROPS*) (\BUTTONS-SETPROP PROPNAME NEWVALUE))) (RETURN OLDVALUE))) ) (BUTTON-ACTION (LAMBDA N (* Koomen "18-Mar-87 14:22") (PROG (BUTTON OLDACTION NEWACTION) (SETQ BUTTON (if (IGREATERP N 0) then (ARG N 1))) (if (NOT (BUTTONP BUTTON T)) then (RETURN)) (SETQ OLDACTION (fetch (BUTTON ACTION) of BUTTON)) (if (IGREATERP N 1) then (SETQ NEWACTION (ARG N 2)) (replace (BUTTON ACTION) of BUTTON with NEWACTION)) (RETURN OLDACTION))) ) (BUTTON-LABEL (LAMBDA N (* edited%: "18-Mar-87 22:33") (PROG (BUTTON OLDLABEL NEWLABEL) (SETQ BUTTON (if (IGREATERP N 0) then (ARG N 1))) (if (NOT (BUTTONP BUTTON T)) then (RETURN)) (SETQ OLDLABEL (fetch (BUTTON LABEL) of BUTTON)) (if (IGREATERP N 1) then (SETQ NEWLABEL (MKSTRING (OR (ARG N 2) ""))) (if (NOT (EQUAL NEWLABEL OLDLABEL)) then (\BUTTONS-CHANGE-LABEL BUTTON NEWLABEL))) (RETURN OLDLABEL))) ) (CLOSE-BUTTON (LAMBDA (BUTTON) (* Koomen "18-Mar-87 13:14") (if (BUTTONP BUTTON T) then (CLOSEW BUTTON)))) (CLOSE-BUTTONS (LAMBDA (BUTTONS) (* Koomen "18-Mar-87 13:09") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (for BUTTON in (OR (LISTP BUTTONS) *ALL-BUTTONS*) do (CLOSE-BUTTON BUTTON))) ) (COPY-BUTTON (LAMBDA (BUTTON NEWLOCATION) (* Koomen "18-Mar-87 14:58") (if (BUTTONP BUTTON T) then (CREATE-BUTTON (COPYALL (fetch (BUTTON ACTION) of BUTTON)) (COPYALL (fetch (BUTTON LABEL) of BUTTON)) NEWLOCATION))) ) (CREATE-BUTTON (LAMBDA (ACTION LABEL LOCATION NOOPENFLG) (* Koomen " 8-Jun-88 14:26") (* edited%: "18-Mar-87 22:48") (DECLARE (GLOBALVARS *ALL-BUTTONS* *BUTTON-ICON-MASK* *BUTTONS-DEFAULT-ACTION* *BUTTONS-DEFAULT-LABEL* LASTMOUSEX LASTMOUSEY)) (if (BUTTONP ACTION) then (* ; "Interactive") (SETQ LABEL NIL) (SETQ ACTION NIL)) (if (AND (NULL ACTION) (NULL LABEL)) then (SETQ ACTION *BUTTONS-DEFAULT-ACTION*) (SETQ LABEL *BUTTONS-DEFAULT-LABEL*) elseif (NULL ACTION) then (SETQ ACTION (BQUOTE (PROMPTPRINT (\, (KWOTE LABEL))))) elseif (NULL LABEL) then (SETQ LABEL ACTION)) (SETQ LABEL (COPYALL (MKSTRING LABEL))) (SETQ ACTION (COPYALL ACTION)) (SETQ LOCATION (if (REGIONP LOCATION) then (CREATEPOSITION (fetch (REGION LEFT) of LOCATION) (fetch (REGION BOTTOM) of LOCATION)) else (POSITIONP LOCATION))) (PROG ((BUTTON (ICONW (\BUTTONS-CREATE-ICON LABEL) *BUTTON-ICON-MASK* (OR LOCATION (create POSITION XCOORD _ LASTMOUSEX YCOORD _ LASTMOUSEY)) (OR NOOPENFLG (NULL LOCATION))))) (push *ALL-BUTTONS* BUTTON) (WINDOWPROP BUTTON (QUOTE REPAINTFN) (FUNCTION REDISPLAY-BUTTON)) (WINDOWPROP BUTTON (QUOTE BUTTONEVENTFN) (FUNCTION \BUTTONS-BUTTONEVENTFN)) (WINDOWPROP BUTTON (QUOTE RIGHTBUTTONFN) (FUNCTION \BUTTONS-BUTTONEVENTFN)) (replace (BUTTON LABEL) of BUTTON with LABEL) (replace (BUTTON ACTION) of BUTTON with ACTION) (if (AND (NOT NOOPENFLG) (NULL LOCATION)) then (MOVE-BUTTON BUTTON)) (RETURN BUTTON))) ) (DELETE-BUTTON (LAMBDA (BUTTON) (* Koomen "18-Mar-87 13:14") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (if (BUTTONP BUTTON T) then (CLOSEW BUTTON) (SETQ *ALL-BUTTONS* (DREMOVE BUTTON *ALL-BUTTONS*)))) ) (DELETE-BUTTONS (LAMBDA (BUTTONS) (* edited%: "18-Mar-87 23:10") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (for BUTTON in (APPEND (OR (LISTP BUTTONS) *ALL-BUTTONS*)) do (DELETE-BUTTON BUTTON))) ) (EDIT-BUTTON (LAMBDA (BUTTON CONTENTS?) (* Koomen " 8-Jun-88 08:45") (DECLARE (GLOBALVARS *ALL-BUTTONS* *BUTTONS-EDIT-SHADE*)) (RESETFORM (\BUTTONS-SHOW BUTTON *BUTTONS-EDIT-SHADE*) (PROG ((CMD (if CONTENTS? then (QUOTE EDIT-BUTTON-CONTENTS) else (MENU (\BUTTONS-EDIT-MENU))))) (if (AND (NULL BUTTON) (FMEMB CMD (QUOTE (CLOSE-BUTTON DELETE-BUTTON REDISPLAY-BUTTON MOVE-BUTTON EDIT-BUTTON-CONTENTS COPY-BUTTON ALIGN-BUTTONS)))) then (PROMPTPRINT "Indicate button to manipulate: ") (SETQ BUTTON (WHICHW (GETPOSITION))) (CLRPROMPT) (if (OR (NULL BUTTON) (NOT (FMEMB BUTTON *ALL-BUTTONS*))) then (RETURN))) (if CMD then (if (DEFINEDP CMD) then (APPLY* CMD BUTTON) else (PROMPTPRINT "Button command " CMD " not yet implemented!")))))) ) (EDIT-BUTTON-CONTENTS (LAMBDA (BUTTON) (* ; "Edited 25-Oct-89 10:47 by Koomen") (if (BUTTONP BUTTON T) then (PROG (OLDLABEL OLDACTION RESULT NEWLABEL NEWACTION) (SETQ OLDLABEL (fetch (BUTTON LABEL) of BUTTON)) (SETQ OLDACTION (fetch (BUTTON ACTION) of BUTTON)) (SETQ RESULT (\BUTTONS-EDITE (BQUOTE ((:LABEL (\, (COPYALL OLDLABEL))) (:ACTION (\, (COPYALL OLDACTION))))))) (if (NULL RESULT) then (RETURN)) (if (SETQ NEWLABEL (FASSOC :LABEL RESULT)) then (BUTTON-LABEL BUTTON (CAR (LISTP (CDR NEWLABEL))))) (if (SETQ NEWACTION (FASSOC :ACTION RESULT)) then (BUTTON-ACTION BUTTON (CAR (LISTP (CDR NEWACTION))))) (RETURN BUTTON)))) ) (EXECUTE-BUTTON (LAMBDA (BUTTON NOMOUSE) (* Koomen " 8-Jun-88 12:58") (* edited%: "18-Mar-87 22:53") (if (AND (BUTTONP BUTTON T) (NOT (fetch (BUTTON EXECUTING?) of BUTTON))) then (RESETFORM (\BUTTONS-SHOW-EXEC BUTTON T) (if (OR NOMOUSE (\BUTTONS-WAIT-MOUSE BUTTON)) then (ALLOW.BUTTON.EVENTS) (PROG ((ACTION (fetch (BUTTON ACTION) of BUTTON))) (if (LISTP ACTION) then (EVAL ACTION) else (BKSYSBUF ACTION))))))) ) (EXPOSE-BUTTONS (LAMBDA (BUTTONS) (* Koomen "18-Mar-87 16:31") (DECLARE (GLOBALVARS *ALL-BUTTONS*)) (for BUTTON in (OR (LISTP BUTTONS) *ALL-BUTTONS*) do (REDISPLAY-BUTTON BUTTON))) ) (LOAD-SOME-BUTTONS (LAMBDA (FILENAME) (* Koomen " 2-Dec-88 15:02") (if (BUTTONP FILENAME) then (* ;; "Invoked from button menu") (SETQ FILENAME NIL)) (if (NULL FILENAME) then (SETQ FILENAME (\BUTTONS-PROMPT-FOR-DATAFILE-NAME "File to load buttons from (NIL to abort):"))) (if FILENAME then (RESTORE-BUTTONS FILENAME (QUOTE ASK)))) ) (MOVE-BUTTON (LAMBDA (BUTTON X/POS Y) (* Koomen "26-Oct-89 08:12") (DECLARE (GLOBALVARS BOXCURSOR)) (AND NIL (MOVE-BUTTON (WHICHW (GETPOSITION)))) (if (BUTTONP BUTTON T) then (PROG (BOX BL BB BW BH BR BT OK?) (DECLARE (SPECVARS BL BB BW BH BR BT)) (if (POSITIONP X/POS) then (SETQ BL (fetch (POSITION XCOORD) of X/POS)) (SETQ BB (fetch (POSITION YCOORD) of X/POS)) (SETQ OK? T) elseif (AND (SMALLP X/POS) (SMALLP Y)) then (SETQ BL X/POS) (SETQ BB Y) (SETQ OK? T) elseif (AND (NULL X/POS) (NULL Y)) then (SETQ BOX (WINDOWREGION BUTTON)) (SETQ BL (fetch (REGION LEFT) of BOX)) (SETQ BB (fetch (REGION BOTTOM) of BOX)) (SETQ BW (fetch (REGION WIDTH) of BOX)) (SETQ BH (fetch (REGION HEIGHT) of BOX)) (SETQ BR (fetch (REGION RIGHT) of BOX)) (SETQ BT (fetch (REGION TOP) of BOX)) (\SETCURSORPOSITION BL BB) (RESETLST (RESETSAVE (CURSOR BOXCURSOR)) (RESETSAVE (\BUTTONS-DRAW-BOX)) (SETQ OK? (NLSETQ (\BUTTONS-TRACK-MOUSE))))) (if OK? then (MOVEW BUTTON BL BB))))) ) (REDISPLAY-BUTTON (LAMBDA (BUTTON) (* Koomen " 8-Jun-88 09:10") (DECLARE (GLOBALVARS *BUTTONS-EXEC-SHADE*)) (if (BUTTONP BUTTON T) then (\BUTTONS-SHOW BUTTON T) (if (fetch (BUTTON EXECUTING?) of BUTTON) then (\BUTTONS-SHOW BUTTON *BUTTONS-EXEC-SHADE*)))) ) (RESTORE-BUTTONS (LAMBDA (FILENAME KEEP-CURRENT-BUTTONS?) (* Koomen " 2-Dec-88 15:02") (DECLARE (GLOBALVARS *BUTTONPROPS*)) (if (BUTTONP FILENAME) then (* ;; "invoked interactively") (SETQ FILENAME) (SETQ KEEP-CURRENT-BUTTONS? NIL)) (bind (BUTTONSPECS _ (\BUTTONS-READ FILENAME)) first (if (NLISTP BUTTONSPECS) then (RETURN)) (if (EQ KEEP-CURRENT-BUTTONS? (QUOTE ASK)) then (SETQ KEEP-CURRENT-BUTTONS? (MOUSECONFIRM "Keep current buttons? "))) (if (NOT KEEP-CURRENT-BUTTONS?) then (DELETE-BUTTONS)) (* ;; "First element is full file name") (SETQ FILENAME (pop BUTTONSPECS)) (* ;; "Second element is the new buttonprops") (SETQ *BUTTONPROPS* (pop BUTTONSPECS)) (\BUTTONS-SETPROP) (* ;; "remaining elements are button specs") while BUTTONSPECS do (APPLY (FUNCTION CREATE-BUTTON) (pop BUTTONSPECS)) finally (RETURN FILENAME))) ) (SAVE-BUTTONS (LAMBDA (FILENAME BUTTONS) (* Koomen " 8-Jun-88 14:05") (DECLARE (SPECVARS FILERDTBL) (GLOBALVARS *ALL-BUTTONS* *BUTTONPROPS* *BUTTONS-DATAVERSION*)) (if (BUTTONP FILENAME) then (* ;; "invoked interactively") (SETQ FILENAME)) (RESETLST (PROG ((STREAM (\BUTTONS-OPEN-STREAM FILENAME T))) (if (NULL STREAM) then (PROMPTPRINT "*** Buttons data file failed to open! ***") (RETURN)) (RESETSAVE NIL (LIST (FUNCTION \BUTTONS-IO-EXIT) STREAM T)) (PRINT (LIST* *BUTTONS-DATAVERSION* *BUTTONPROPS* (for BUTTON in (OR (LISTP BUTTONS) *ALL-BUTTONS*) when (BUTTONP BUTTON T) collect (LIST (fetch (BUTTON ACTION) of BUTTON) (fetch (BUTTON LABEL) of BUTTON) (WINDOWPROP BUTTON (QUOTE REGION))))) STREAM FILERDTBL) (RETURN (CLOSEF STREAM))))) ) (SAVE-SOME-BUTTONS (LAMBDA (FILENAME BUTTONS) (* Koomen " 2-Dec-88 17:16") (DECLARE (GLOBALVARS *BUTTONS-EDIT-SHADE*)) (RESETLST (LET (BUTTON SAVEBUTTONS MARKEDBUTTONS) (if (LISTP BUTTONS) then (SETQ SAVEBUTTONS BUTTONS) else (* ;; "Either got here through button menu (so FILENAME is a button) or through background menu (so FILENAME is NIL)") (if (SETQ BUTTON FILENAME) then (SETQ SAVEBUTTONS (LIST BUTTON)) (SETQ MARKEDBUTTONS (LIST BUTTON))) (SETQ FILENAME NIL) (* EXPOSE-BUTTONS) (PROMPTPRINT "Click on the buttons you wish to save;" (CHARACTER (CHARCODE CR)) " click again to undo;" (CHARACTER (CHARCODE CR)) " click on non-button to stop.") (do (SETQ BUTTON (WHICHW (GETPOSITION))) (if (NOT (BUTTONP BUTTON)) then (RETURN) elseif (FMEMB BUTTON SAVEBUTTONS) then (* ; "remove it") (SETQ SAVEBUTTONS (DREMOVE BUTTON SAVEBUTTONS)) (\BUTTONS-SHOW BUTTON) else (* ; "add it") (push SAVEBUTTONS BUTTON) (if (FMEMB BUTTON MARKEDBUTTONS) then (\BUTTONS-SHOW BUTTON *BUTTONS-EDIT-SHADE*) else (push MARKEDBUTTONS BUTTON) (RESETSAVE (\BUTTONS-SHOW BUTTON *BUTTONS-EDIT-SHADE*)))))) (if (NULL FILENAME) then (SETQ FILENAME (\BUTTONS-PROMPT-FOR-DATAFILE-NAME "File to save buttons in (NIL to abort):"))) (if FILENAME then (SAVE-BUTTONS FILENAME SAVEBUTTONS))))) ) ) (PUTPROPS BUTTONSPROP ARGNAMES (PROPNAME {NEWVALUE})) (PUTPROPS BUTTON-ACTION ARGNAMES (BUTTON {NEWACTION})) (PUTPROPS BUTTON-LABEL ARGNAMES (BUTTON {NEWLABEL})) (* ;;; "IMPLEMENTATION") (PUTPROPS BUTTONS MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10)) (RPAQQ *BUTTONS-DATAVERSION* 3) (RPAQQ *DEFAULT-BUTTONPROPS* (*BUTTONPROPS* (GRID-ORIGIN (15 . 15)) (DEFAULT-LABEL "Create Button") (DEFAULT-ACTION (CREATE-BUTTON)) (MENU-FONT (MODERN 12 BOLD)) (LABEL-FONT (MODERN 10 BOLD)) (SAVE-DIRECTORY NIL) (EDIT-SHADE 4104) (EXEC-SHADE 65535))) (RPAQ? *BUTTONPROPS* (COPYALL *DEFAULT-BUTTONPROPS*)) (RPAQ? *ALL-BUTTONS* NIL) (RPAQ? *BUTTONS-DEFAULT-ACTION* NIL) (RPAQ? *BUTTONS-DEFAULT-LABEL* NIL) (RPAQ? *BUTTONS-EDIT-MENU* NIL) (RPAQ? *BUTTONS-EDIT-SHADE* NIL) (RPAQ? *BUTTONS-EXEC-SHADE* NIL) (RPAQ? *BUTTONS-GRID-ORIGIN* NIL) (RPAQ? *BUTTONS-LABEL-FONT* NIL) (RPAQ? *BUTTONS-MENU-FONT* NIL) (RPAQ? *BUTTONS-SAVE-DIRECTORY* NIL) (DEFINEQ (\BUTTONS-BUTTONEVENTFN (LAMBDA (BUTTON) (* Koomen " 8-Jun-88 09:19") (DECLARE (GLOBALVARS *BUTTONS-EDIT-SHADE* LASTMOUSEBUTTONS)) (if (LASTMOUSESTATE (ONLY LEFT)) then (EXECUTE-BUTTON BUTTON) elseif (LASTMOUSESTATE (ONLY MIDDLE)) then (RESETFORM (\BUTTONS-SHOW BUTTON *BUTTONS-EDIT-SHADE*) (MOVE-BUTTON BUTTON)) elseif (LASTMOUSESTATE (ONLY RIGHT)) then (EDIT-BUTTON BUTTON))) ) (\BUTTONS-DATAFILE-NAME (LAMBDA (FILENAME DATAVERSION) (* Koomen " 2-Dec-88 15:07") (DECLARE (GLOBALVARS *BUTTONS-SAVE-DIRECTORY*)) (LET ((FILE (UNPACKFILENAME FILENAME)) (DFLT (UNPACKFILENAME (if (EQP DATAVERSION 1) then (PACKFILENAME (QUOTE NAME) (QUOTE SAVED-BUTTONS) (QUOTE EXTENSION) NIL (QUOTE VERSION) NIL (QUOTE BODY) (DIRECTORYNAME)) else (PACKFILENAME (QUOTE NAME) (QUOTE SAVED-BUTTONS) (QUOTE EXTENSION) (QUOTE DATA) (QUOTE VERSION) NIL (QUOTE BODY) *BUTTONS-SAVE-DIRECTORY*))))) (if (LISTGET FILE (QUOTE HOST)) then (* ;; "Make sure we don't insert a directory where none's wanted (like on a Dorado DSK)") (LISTPUT DFLT (QUOTE DIRECTORY) NIL)) (PACKFILENAME (NCONC FILE DFLT)))) ) (\BUTTONS-CHANGE-LABEL (LAMBDA (BUTTON NEWLABEL) (* edited%: "18-Mar-87 22:25") (replace (BUTTON LABEL) of BUTTON with NEWLABEL) (WINDOWPROP BUTTON (QUOTE ICONIMAGE) (\BUTTONS-CREATE-ICON NEWLABEL)) (if (OPENWP BUTTON) then (REDISPLAY-BUTTON BUTTON))) ) (\BUTTONS-CREATE-ICON (LAMBDA (LABEL) (* edited%: "18-Mar-87 22:11") (DECLARE (GLOBALVARS *BUTTON-CLIPPING-REGION* *BUTTON-ICON* *BUTTONS-LABEL-FONT*)) (PROG (BM DSP LW LH X Y W H) (SETQ BM (BITMAPCOPY *BUTTON-ICON*)) (SETQ DSP (DSPCREATE BM)) (DSPFONT *BUTTONS-LABEL-FONT* DSP) (DSPCLIPPINGREGION *BUTTON-CLIPPING-REGION* DSP) (SETQ X (fetch (REGION LEFT) of *BUTTON-CLIPPING-REGION*)) (SETQ Y (fetch (REGION BOTTOM) of *BUTTON-CLIPPING-REGION*)) (SETQ W (fetch (REGION WIDTH) of *BUTTON-CLIPPING-REGION*)) (SETQ H (fetch (REGION HEIGHT) of *BUTTON-CLIPPING-REGION*)) (SETQ LW (STRINGWIDTH LABEL *BUTTONS-LABEL-FONT*)) (SETQ LH (FONTHEIGHT *BUTTONS-LABEL-FONT*)) (add Y (FONTDESCENT *BUTTONS-LABEL-FONT*)) (if (IGREATERP W LW) then (add X (LRSH (IDIFFERENCE W LW) 1))) (if (IGREATERP H LH) then (add Y (LRSH (IDIFFERENCE H LH) 1))) (MOVETO X Y DSP) (PRIN1 LABEL DSP) (RETURN BM))) ) (\BUTTONS-DRAW-BOX (LAMBDA NIL (* Koomen "26-Oct-89 08:12") (DECLARE (SPECVARS BB BL BR BT) (GLOBALVARS ScreenBitMap)) (DRAWGRAYBOX BL BB BR BT ScreenBitMap GRAYSHADE)) ) (\BUTTONS-EDITE (LAMBDA (FORM) (* edited%: "18-Mar-87 22:39") (ALLOW.BUTTON.EVENTS) (EVAL.IN.TTY.PROCESS (BQUOTE (CAR (NLSETQ (EDITE (\, (KWOTE FORM)))))) T)) ) (\BUTTONS-EDIT-MENU (LAMBDA NIL (* Koomen " 2-Dec-88 14:50") (DECLARE (GLOBALVARS *BUTTONS-EDIT-MENU* *BUTTONS-MENU-FONT*)) (* * If adding/changing menu entries, do (SETQ *BUTTONS-EDIT-MENU*)) (OR *BUTTONS-EDIT-MENU* (SETQ *BUTTONS-EDIT-MENU* (create MENU TITLE _ "Button Control" ITEMS _ (QUOTE (("Redisplay" (QUOTE REDISPLAY-BUTTON) "Redisplay the button") ("Move" (QUOTE MOVE-BUTTON) "Move the button") ("Copy" (QUOTE COPY-BUTTON) "Create a copy of the button") ("Edit" (QUOTE EDIT-BUTTON-CONTENTS) "Edit the label and the action of the button") ("" NIL "Does nothing") ("Close" (QUOTE CLOSE-BUTTON) "Close the button" (SUBITEMS ("Close All Buttons" (QUOTE CLOSE-BUTTONS)))) ("Delete" (QUOTE DELETE-BUTTON) "Delete this button" (SUBITEMS ("Delete All Buttons" (QUOTE DELETE-BUTTONS)))) ("" NIL "Does nothing") ("Create Button" (QUOTE CREATE-BUTTON) "Create a new button") ("" NIL "Does nothing") ("Expose Buttons" (QUOTE EXPOSE-BUTTONS) "Bring all buttons to the top") ("Align Buttons" (QUOTE ALIGN-BUTTONS) "Align one or more buttons with this button") ("" NIL "Does nothing") ("Save Buttons" (QUOTE SAVE-BUTTONS) "Save all current buttons in default datafile" (SUBITEMS ("Save Some Buttons" (QUOTE SAVE-SOME-BUTTONS) "Save some buttons in some datafile"))) ("Restore Buttons" (QUOTE RESTORE-BUTTONS) "Throw away current buttons, then restore saved buttons from default datafile" (SUBITEMS ("Load Some Buttons" (QUOTE LOAD-SOME-BUTTONS) "Load some buttons from some datafile"))))) MENUFONT _ *BUTTONS-MENU-FONT* MENUOUTLINESIZE _ 1 CENTERFLG _ T CHANGEOFFSETFLG _ (QUOTE Y) MENUOFFSET _ (QUOTE (-1 . 0)))))) ) (\BUTTONS-INIT (LAMBDA NIL (* Koomen " 8-Jun-88 14:13") (* edited%: "18-Mar-87 22:02") (DECLARE (GLOBALVARS *ALL-BUTTONS* *BUTTONS-GRID-ORIGIN*)) (\BUTTONS-SETPROP) (if (NULL *ALL-BUTTONS*) then (CREATE-BUTTON NIL NIL *BUTTONS-GRID-ORIGIN*))) ) (\BUTTONS-IO-EXIT (LAMBDA (STREAM SAVING?) (* Koomen "18-Mar-87 16:19") (if (OPENP STREAM) then (* * Error occurred, so close and discard if saving.) (if SAVING? then (DELFILE (CLOSEF STREAM)) else (CLOSEF STREAM))) NIL) ) (\BUTTONS-OPEN-STREAM (LAMBDA (FILENAME NEW? DATAVERSION) (* Koomen " 2-Dec-88 13:40") (PROG ((FILE (\BUTTONS-DATAFILE-NAME FILENAME DATAVERSION)) (ACCESS (if NEW? then (QUOTE OUTPUT) else (QUOTE INPUT))) (RECOG (if NEW? then (QUOTE NEW) else (QUOTE OLD))) (PARAMETERS (QUOTE (SEQUENTIAL)))) (RETURN (if FILENAME then (OPENSTREAM FILE ACCESS RECOG PARAMETERS) else (CAR (NLSETQ (OPENSTREAM FILE ACCESS RECOG PARAMETERS))))))) ) (\BUTTONS-PROMPT-FOR-DATAFILE-NAME (LAMBDA (PROMPTSTR) (* Koomen " 2-Dec-88 14:46") (DECLARE (GLOBALVARS PROMPTWINDOW)) (PROMPTPRINT PROMPTSTR) (MKATOM (U-CASE (PROMPTFORWORD " " (LET ((FILENAME (\BUTTONS-DATAFILE-NAME (DIRECTORYNAME T)))) (if (NEQ FILENAME (\BUTTONS-DATAFILE-NAME)) then FILENAME)) NIL PROMPTWINDOW NIL NIL (CHARCODE (CR)))))) ) (\BUTTONS-READ (LAMBDA (FILENAME) (* Koomen " 8-Jun-88 11:54") (DECLARE (SPECVARS FILERDTBL) (GLOBALVARS *DEFAULT-BUTTONPROPS*)) (RESETLST (PROG (STREAM PROPS BUTTONSPECS DATAVERSION) (if (AND (NOT (LITATOM FILENAME)) (NOT (STRINGP FILENAME))) then (SETQ FILENAME)) (SETQ STREAM (OR (\BUTTONS-OPEN-STREAM FILENAME NIL (SETQ DATAVERSION 2)) (\BUTTONS-OPEN-STREAM FILENAME NIL (SETQ DATAVERSION 1)))) (if (NULL STREAM) then (PROMPTPRINT "*** Buttons data file not found! ***") (RETURN)) (RESETSAVE NIL (LIST (FUNCTION \BUTTONS-IO-EXIT) STREAM)) (SETQ BUTTONSPECS (LISTP (READ STREAM FILERDTBL))) (if (NUMBERP (CAR BUTTONSPECS)) then (SETQ DATAVERSION (pop BUTTONSPECS))) RETRY (SELECTQ DATAVERSION (1 (SETQ PROPS (COPYALL *DEFAULT-BUTTONPROPS*)) (SETQ BUTTONSPECS (for SPEC in BUTTONSPECS collect (LIST (CADDR SPEC) (CAR SPEC) (CADR SPEC))))) (2 (if (EQ (CAR BUTTONSPECS) (QUOTE *BUTTONPROPS*)) then (SETQ PROPS (CONS (QUOTE *BUTTONPROPS*) (for P on (CDDR BUTTONSPECS) by (CDDR P) collect (LIST (CAR P) (CADR P))))) (SETQ BUTTONSPECS (bind SPEC while (NEQ (QUOTE STOP) (SETQ SPEC (READ STREAM FILERDTBL))) collect SPEC)) else (SETQ DATAVERSION 1) (GO RETRY))) (3 (SETQ PROPS (pop BUTTONSPECS))) (PROGN (PROMPTPRINT "*** Out-of-sync buttons data file version: " DATAVERSION "! ***") (RETURN))) (RETURN (LIST* (CLOSEF STREAM) PROPS BUTTONSPECS))))) ) (\BUTTONS-SETPROP (LAMBDA (PROPNAME PROPVALUE) (* Koomen " 8-Jun-88 11:47") (DECLARE (GLOBALVARS *BUTTONPROPS* *BUTTONS-DEFAULT-ACTION* *BUTTONS-DEFAULT-LABEL* *BUTTONS-EDIT-SHADE* *BUTTONS-EXEC-SHADE* *BUTTONS-GRID-ORIGIN* *BUTTONS-LABEL-FONT* *BUTTONS-MENU-FONT* *BUTTONS-SAVE-DIRECTORY*)) (SELECTQ PROPNAME (NIL (for PROP in (CDR *BUTTONPROPS*) do (\BUTTONS-SETPROP (CAR PROP) (CADR PROP)))) (GRID-ORIGIN (SETQ *BUTTONS-GRID-ORIGIN* (POSITIONP PROPVALUE))) (SAVE-DIRECTORY (SETQ *BUTTONS-SAVE-DIRECTORY* (MKSTRING (DIRECTORYNAME PROPVALUE)))) (EDIT-SHADE (SETQ *BUTTONS-EDIT-SHADE* (SMALLP PROPVALUE))) (EXEC-SHADE (SETQ *BUTTONS-EXEC-SHADE* (SMALLP PROPVALUE))) (LABEL-FONT (SETQ *BUTTONS-LABEL-FONT* (FONTCREATE PROPVALUE))) (MENU-FONT (SETQ *BUTTONS-MENU-FONT* (FONTCREATE PROPVALUE))) (DEFAULT-ACTION (SETQ *BUTTONS-DEFAULT-ACTION* PROPVALUE)) (DEFAULT-LABEL (SETQ *BUTTONS-DEFAULT-LABEL* (MKSTRING PROPVALUE))) NIL)) ) (\BUTTONS-SHOW (LAMBDA (BUTTON SHADE) (* Koomen " 8-Jun-88 09:10") (* ;;; "Resets or inverts the inner area of the button with the given shade.") (DECLARE (GLOBALVARS *BUTTON-INVERT-REGION*)) (if BUTTON then (if (FIXP SHADE) then (DSPFILL *BUTTON-INVERT-REGION* SHADE (QUOTE INVERT) BUTTON) elseif (OR (EQ SHADE T) (OPENWP BUTTON)) then (\ICONW.REPAINTFN BUTTON)) BUTTON)) ) (\BUTTONS-SHOW-EXEC (LAMBDA (BUTTON EXECUTING?) (* Koomen " 8-Jun-88 08:56") (* ;;; "Resets or inverts the inner area of the button. Returns the button so it can be used inside a RESET.") (DECLARE (GLOBALVARS *BUTTONS-EXEC-SHADE*)) (replace (BUTTON EXECUTING?) of BUTTON with EXECUTING?) (\BUTTONS-SHOW BUTTON (if EXECUTING? then *BUTTONS-EXEC-SHADE*)) BUTTON) ) (\BUTTONS-TRACK-MOUSE (LAMBDA NIL (* Koomen "26-Oct-89 08:12") (DECLARE (GLOBALVARS *BUTTONS-GRID-ORIGIN* LASTMOUSEBUTTONS LASTMOUSEX LASTMOUSEY SCREENHEIGHT SCREENWIDTH) (SPECVARS BB BH BL BR BT BW)) (if (NOT (POSITIONP *BUTTONS-GRID-ORIGIN*)) then (SETQ *BUTTONS-GRID-ORIGIN* (CREATEPOSITION 0 0))) (bind MOUSEUP? MOUSEDOWN? NEWBL NEWBB (GRIDXORIGIN _ (fetch (POSITION XCOORD) of *BUTTONS-GRID-ORIGIN*)) (GRIDYORIGIN _ (fetch (POSITION YCOORD) of *BUTTONS-GRID-ORIGIN*)) (GRIDWIDTH _ (PLUS 16 BW)) (GRIDHEIGHT _ (PLUS 8 BH)) (MAXBL _ (IDIFFERENCE SCREENWIDTH BW)) (MAXBB _ (IDIFFERENCE SCREENHEIGHT BH)) until (PROGN (SETQ MOUSEUP? (MOUSESTATE UP)) (if (NOT MOUSEUP?) then (SETQ MOUSEDOWN? T)) (AND MOUSEUP? MOUSEDOWN?)) do (SETQ NEWBL LASTMOUSEX) (SETQ NEWBB LASTMOUSEY) (if (NOT (KEYDOWNP (QUOTE LSHIFT))) then (SETQ NEWBL (IPLUS GRIDXORIGIN (ITIMES GRIDWIDTH (IQUOTIENT NEWBL GRIDWIDTH)))) (SETQ NEWBB (IPLUS GRIDYORIGIN (ITIMES GRIDHEIGHT (IQUOTIENT NEWBB GRIDHEIGHT))))) (SETQ NEWBL (MAX 0 (MIN NEWBL MAXBL))) (SETQ NEWBB (MAX 0 (MIN NEWBB MAXBB))) (if (OR (NEQ NEWBL BL) (NEQ NEWBB BB)) then (UNINTERRUPTABLY (\BUTTONS-DRAW-BOX) (* ; "wipe old") (SETQ BR (IPLUS BW (SETQ BL NEWBL))) (SETQ BT (IPLUS BH (SETQ BB NEWBB))) (\BUTTONS-DRAW-BOX) (* ; "draw new"))))) ) (\BUTTONS-WAIT-MOUSE (LAMBDA (BUTTON) (* Koomen " 8-Jun-88 08:53") (DECLARE (GLOBALVARS LASTMOUSEBUTTONS LASTMOUSEX LASTMOUSEY)) (PROG ((REGION (WINDOWPROP BUTTON (QUOTE REGION)))) LP (GETMOUSESTATE) (if (NOT (INSIDEP REGION LASTMOUSEX LASTMOUSEY)) then (RETURN) elseif (NOT (LASTMOUSESTATE UP)) then (BLOCK) (GO LP) else (RETURN T)))) ) ) (* The button icon) (FILESLOAD (SYSLOAD FROM LISPUSERS) ICONW) (DEFINEQ (DROPSHADOW (LAMBDA (BM SHADOWOFFSET SHADOWSHADE) (* Koomen "31-Dec-86 12:47") (PROG (IMAGE (OFFSET (OR SHADOWOFFSET 4)) (SHADE (OR SHADOWSHADE 42405)) (MASK (BITMAPCOPY BM)) (SHADOW (BITMAPCOPY BM))) (SETQ IMAGE (BITMAPCREATE (PLUS OFFSET (BITMAPWIDTH BM)) (PLUS OFFSET (BITMAPHEIGHT BM)) (BITSPERPIXEL BM))) (* * Compute mask * *) (BLTSHADE BLACKSHADE MASK) (CLEAR-MASK-OUTLINE MASK BM) (* * Fill shadow * *) (BLTSHADE SHADE SHADOW) (* * Remove outline from shadow * *) (BITBLT MASK NIL NIL SHADOW NIL NIL NIL NIL (QUOTE INVERT) (QUOTE ERASE)) (* * Put shadow in bottom-right corner of image * *) (BITBLT SHADOW NIL NIL IMAGE OFFSET NIL NIL NIL (QUOTE INPUT) (QUOTE REPLACE)) (* * Put original in top-left corner of image * *) (BITBLT MASK NIL NIL IMAGE NIL OFFSET NIL NIL (QUOTE INPUT) (QUOTE ERASE)) (BITBLT BM NIL NIL IMAGE NIL OFFSET NIL NIL (QUOTE INPUT) (QUOTE PAINT)) (RETURN IMAGE))) ) (ICONMASK (LAMBDA (ICON) (* Koomen "31-Dec-86 12:40") (PROG ((MASK (BITMAPCOPY ICON))) (BITBLT ICON NIL NIL MASK NIL NIL NIL NIL (QUOTE INVERT) (QUOTE REPLACE)) (CLEAR-MASK-OUTLINE MASK ICON) (RETURN MASK))) ) (CLEAR-MASK-OUTLINE (LAMBDA (MASK BM) (* Koomen "31-Dec-86 12:35") (* * Make outline of MASK same as BM * *) (for I from 0 to (SUB1 (BITMAPWIDTH BM)) bind (BMH _ (SUB1 (BITMAPHEIGHT BM))) do (for J from 0 to BMH by 1 while (ZEROP (BITMAPBIT BM I J)) do (BITMAPBIT MASK I J 0)) (for J from BMH to 0 by -1 while (ZEROP (BITMAPBIT BM I J)) do (BITMAPBIT MASK I J 0)))) ) ) (RPAQQ *BUTTON-BITMAP* #*(97 37)@OOOOOOOOOOOOOOOOOOOOOOH@@@@COOOOOOOOOOOOOOOOOOOOOON@@@@G@@@@@@@@@@@@@@@@@@@@@@G@@@@F@@@@@@@@@@@@@@@@@@@@@@C@@@@LGOOOOOOOOOOOOOOOOOOOOOAH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LH@@@@@@@@@@@@@@@@@@@@@IH@@@LGOOOOOOOOOOOOOOOOOOOOOAH@@@F@@@@@@@@@@@@@@@@@@@@@@C@@@@G@@@@@@@@@@@@@@@@@@@@@@G@@@@COOOOOOOOOOOOOOOOOOOOOON@@@@@OOOOOOOOOOOOOOOOOOOOOOH@@@@) (RPAQ? *BUTTON-INVERT-REGION* (QUOTE (6 10 85 25))) (RPAQ? *BUTTON-CLIPPING-REGION* (QUOTE (7 11 83 23))) (RPAQ? *BUTTON-ICON* (DROPSHADOW *BUTTON-BITMAP*)) (RPAQ? *BUTTON-ICON-MASK* (ICONMASK *BUTTON-ICON*)) (ADDTOVAR BackgroundMenuCommands ("Button Control" (QUOTE (EDIT-BUTTON)) "Manipulate action buttons")) (RPAQQ BackgroundMenu NIL) (\BUTTONS-INIT) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA) (ADDTOVAR NLAML) (ADDTOVAR LAMA BUTTON-LABEL BUTTON-ACTION BUTTONSPROP) ) (PUTPROPS BUTTONS COPYRIGHT ("Xerox Corporation" 1986 1987 1988 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3565 14600 (ALIGN-BUTTONS 3575 . 4350) (BUTTONP 4352 . 4557) (BUTTONSPROP 4559 . 5104) (BUTTON-ACTION 5106 . 5470) (BUTTON-LABEL 5472 . 5881) (CLOSE-BUTTON 5883 . 5993) (CLOSE-BUTTONS 5995 . 6176) (COPY-BUTTON 6178 . 6399) (CREATE-BUTTON 6401 . 7810) (DELETE-BUTTON 7812 . 8013) ( DELETE-BUTTONS 8015 . 8209) (EDIT-BUTTON 8211 . 8946) (EDIT-BUTTON-CONTENTS 8948 . 9580) ( EXECUTE-BUTTON 9582 . 9998) (EXPOSE-BUTTONS 10000 . 10186) (LOAD-SOME-BUTTONS 10188 . 10524) ( MOVE-BUTTON 10526 . 11489) (REDISPLAY-BUTTON 11491 . 11751) (RESTORE-BUTTONS 11753 . 12582) ( SAVE-BUTTONS 12584 . 13332) (SAVE-SOME-BUTTONS 13334 . 14598)) (15579 25703 (\BUTTONS-BUTTONEVENTFN 15589 . 15972) (\BUTTONS-DATAFILE-NAME 15974 . 16670) (\BUTTONS-CHANGE-LABEL 16672 . 16929) ( \BUTTONS-CREATE-ICON 16931 . 17818) (\BUTTONS-DRAW-BOX 17820 . 17994) (\BUTTONS-EDITE 17996 . 18160) ( \BUTTONS-EDIT-MENU 18162 . 19779) (\BUTTONS-INIT 19781 . 20029) (\BUTTONS-IO-EXIT 20031 . 20257) ( \BUTTONS-OPEN-STREAM 20259 . 20690) (\BUTTONS-PROMPT-FOR-DATAFILE-NAME 20692 . 21045) (\BUTTONS-READ 21047 . 22401) (\BUTTONS-SETPROP 22403 . 23333) (\BUTTONS-SHOW 23335 . 23713) (\BUTTONS-SHOW-EXEC 23715 . 24082) (\BUTTONS-TRACK-MOUSE 24084 . 25358) (\BUTTONS-WAIT-MOUSE 25360 . 25701)) (25776 27275 (DROPSHADOW 25786 . 26685) (ICONMASK 26687 . 26900) (CLEAR-MASK-OUTLINE 26902 . 27273))))) STOP \ No newline at end of file diff --git a/lispusers/BUTTONS.TEDIT b/lispusers/BUTTONS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..322fb93ec3f6027d9d6621cd9c833202cee82d65 GIT binary patch literal 8481 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.;15 139806 changes to: (FNS CREATEC150BUFFER) (VARS C150COLORMAP C150FONTDIRECTORIES) previous date: " 3-Apr-86 16:05:11" {ERIS}LIBRARY>C150STREAM.;14) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT C150STREAMCOMS) (RPAQQ C150STREAMCOMS ((CONSTANTS \C150PointsPerInch \C150RealBPP) (FNS C150.SEPARATOR C150.SETMARGINS \C150.ALLWHITESPACE \C150.BUFFER.DOT \C150.MICROLINEFEED \C150.SENDLINE \C150.SENDLINEINFO \C150INIT \CREATECHARSET.C150) (FNS CREATEC150BUFFER NEWLINE.C150 NEWPAGE.C150 OPENC150STREAM C150.RESET SEND.TO.C150 STARTPAGE.C150 \BITBLT.C150 \BLTCHAR.C150 \BLTSHADE.C150 \C150.CRLF \CHANGECHARSET.C150 \CHARWIDTH.C150 \CLOSEFN.C150 \CREATEC150FONT \READC150FONTFILE \DRAWCIRCLE.C150 \DRAWCURVE.C150 \DRAWELLIPSE.C150 \DRAWLINE.C150 \DSPBACKCOLOR.C150 \DSPCLIPPINGREGION.C150 \DSPCOLOR.C150 \C150.ASSURE.COLOR \C150.LOOKUPRGB \DSPFONT.C150 \DSPLEFTMARGIN.C150 \DSPLINEFEED.C150 \DSPOPERATION.C150 \DSPPRINTCHAR.C150 \DSPPRINTCR/LF.C150 \DSPRESET.C150 \DSPRIGHTMARGIN.C150 \DSPXPOSITION.C150 \DSPYPOSITION.C150 \DUMPPAGEBUFFER.C150 \FILLCIRCLE.C150 \OUTCHARFN.C150 \SEARCHC150FONTFILES \STRINGWIDTH.C150) (VARS MISSINGC150FONTCOERCIONS (\C150COLORTABLE) (\C150.FRAMEBUFFER) (\C150STREAM) C150COLORMAP C150FONTCOERCIONS C150FONTDIRECTORIES C150FONTEXTENSIONS) (INITVARS (C150.CLIPBUFFER T) (\C150DEFAULTDEVICE (QUOTE CENTRONICS))) (FNS COLORMAP.TO.C150TABLE) (FILES COLOR XXGEOM XXFILL) [P (IF (NOT (GETD (QUOTE POLYSHADE.BLT))) THEN (* A fix for KOTO, which is not necessary in n>) (MOVD (QUOTE POLYSHADE.DISPLAY) (QUOTE POLYSHADE.BLT] (DECLARE: DONTEVAL@LOAD DOCOPY (P (\C150INIT)) (FILES CENTRONICS)) (DECLARE: EVAL@LOAD DONTCOPY (FILES (LOADFROM) ADISPLAY LLDISPLAY)) (MACROS \C150BackingStream))) (DECLARE: EVAL@COMPILE (RPAQQ \C150PointsPerInch 120) (RPAQQ \C150RealBPP 4) (CONSTANTS \C150PointsPerInch \C150RealBPP) ) (DEFINEQ (C150.SEPARATOR [LAMBDA (BACKINGSTREAM) (* hdj " 5-Sep-85 12:12") (LET ((SEPR.LENGTH 30)) (for C instring (CONCAT "g0" SEPR.LENGTH " ") do (BOUT BACKINGSTREAM C)) (for DASH from 1 to SEPR.LENGTH do (BOUT BACKINGSTREAM 255]) (C150.SETMARGINS [LAMBDA (BACKINGSTREAM C150LEFT C150RIGHT) (* hdj " 5-Sep-85 12:21") (* * Set the left and right margins for the C150 printer) (LET [[LEFTCODE (CONCAT (FIX (TIMES 10 (if (OR (EQ C150LEFT NIL) (LESSP C150LEFT .5) (GEQ C150LEFT 9.0) (GEQ C150LEFT C150RIGHT)) then .5 else C150LEFT] (RIGHTCODE (CONCAT (FIX (TIMES 10 (if (OR (EQ C150RIGHT NIL) (GREATERP C150RIGHT 9) (LEQ C150RIGHT .5) (LEQ C150RIGHT C150LEFT)) then 9 else C150RIGHT] (* send the left margin) (BOUT BACKINGSTREAM (CHARCODE ESC)) (BOUT BACKINGSTREAM (CHARCODE l)) (for CHAR instring LEFTCODE do (BOUT BACKINGSTREAM CHAR)) (BOUT BACKINGSTREAM (CHARCODE CR)) (* send the right margin) (BOUT BACKINGSTREAM (CHARCODE ESC)) (BOUT BACKINGSTREAM (CHARCODE r)) (for CHAR instring RIGHTCODE do (BOUT BACKINGSTREAM CHAR)) (BOUT BACKINGSTREAM (CHARCODE CR]) (\C150.ALLWHITESPACE [LAMBDA (BITMAP TABLES STARTINGSCAN) (* hdj " 6-Aug-85 15:50") (* is there anything to print on the next 4 scanlines?) (LET*((MaxX (SUB1 (BITMAPWIDTH BITMAP))) [MaxColor (SUB1 (EXPT 2 (BITSPERPIXEL BITMAP] (COLORUSED? (ARRAY (ADD1 MaxColor) (QUOTE POINTER) NIL 0)) (BlackTable (ELT TABLES 0)) (MagentaTable (ELT TABLES 1)) (YellowTable (ELT TABLES 2)) (CyanTable (ELT TABLES 3))) (for Scanline from STARTINGSCAN to (IDIFFERENCE STARTINGSCAN 3) by -1 do (for X from 0 to MaxX do (SETA COLORUSED? (BITMAPBIT BITMAP X Scanline) T))) (for Value from 0 to MaxColor never (AND (ELT COLORUSED? Value) (OR (EQ (ELT BlackTable Value) 1) (EQ (ELT MagentaTable Value) 1) (EQ (ELT YellowTable Value) 1) (EQ (ELT CyanTable Value) 1]) (\C150.BUFFER.DOT [LAMBDA (DOT X BUFFER) (* hdj " 3-Aug-85 20:55") (SETA BUFFER X DOT]) (\C150.MICROLINEFEED [LAMBDA (BACKINGSTREAM) (* hdj " 5-Sep-85 12:12") (for CHAR instring "k1" do (BOUT BACKINGSTREAM CHAR]) (\C150.SENDLINE [LAMBDA (BACKINGSTREAM LINE# COLOR BUFFER) (* hdj " 5-Sep-85 12:13") (for CHAR instring (CONCAT "g" (CHARACTER (IPLUS (ITIMES 4 COLOR) (IREMAINDER LINE# 4) (CHARCODE 0))) (FOLDHI (ARRAYSIZE BUFFER) 8) " ") do (BOUT BACKINGSTREAM CHAR)) (bind (BYTE.TO.SEND _ 0) for BYTE from 0 to (SUB1 (ARRAYSIZE BUFFER)) by 8 do [for BIT from 7 to 0 by -1 do (SETQ BYTE.TO.SEND (LOGOR BYTE.TO.SEND (LLSH (ELT BUFFER (IPLUS BYTE BIT)) BIT] (BOUT BACKINGSTREAM BYTE.TO.SEND]) (\C150.SENDLINEINFO [LAMBDA (BACKINGSTREAM COLOR LENGTHINBYTES LINE#) (* hdj " 5-Sep-85 12:13") (for CHAR instring (CONCAT "g" (CHARACTER (IPLUS (UNFOLD COLOR 4) LINE# (CHARCODE 0))) LENGTHINBYTES " ") do (BOUT BACKINGSTREAM CHAR]) (\C150INIT [LAMBDA NIL (* gbn " 5-Nov-85 19:34") (* Initializes global variables for the C150) (DECLARE (GLOBALVARS \C150IMAGEOPS)) (SETQ \C150IMAGEOPS (create IMAGEOPS IMAGETYPE _(QUOTE C150) IMFONT _(FUNCTION \DSPFONT.C150) IMLEFTMARGIN _(FUNCTION \DSPLEFTMARGIN.C150) IMRIGHTMARGIN _(FUNCTION \DSPRIGHTMARGIN.C150) IMLINEFEED _(FUNCTION \DSPLINEFEED.C150) IMXPOSITION _(FUNCTION \DSPXPOSITION.C150) IMYPOSITION _(FUNCTION \DSPYPOSITION.C150) IMCLOSEFN _(FUNCTION \CLOSEFN.C150) IMDRAWCURVE _(FUNCTION \DRAWCURVE.C150) IMFILLCIRCLE _(QUOTE \FILLCIRCLE.C150) IMDRAWLINE _(FUNCTION \DRAWLINE.C150) IMDRAWELLIPSE _(FUNCTION \DRAWELLIPSE.C150) IMDRAWCIRCLE _(FUNCTION \DRAWCIRCLE.C150) IMBITBLT _(FUNCTION \BITBLT.C150) IMBLTSHADE _(FUNCTION \BLTSHADE.C150) IMNEWPAGE _(FUNCTION NEWPAGE.C150) IMSCALE _[FUNCTION (LAMBDA NIL (FQUOTIENT 120 72] IMSPACEFACTOR _(FUNCTION NILL) IMFONTCREATE _(QUOTE C150) IMCOLOR _(FUNCTION \DSPCOLOR.C150) IMBACKCOLOR _(FUNCTION \DSPBACKCOLOR.C150) IMOPERATION _(FUNCTION \DSPOPERATION.C150) IMSTRINGWIDTH _(FUNCTION \STRINGWIDTH.C150) IMCHARWIDTH _(FUNCTION \CHARWIDTH.C150) IMCLIPPINGREGION _(FUNCTION \DSPCLIPPINGREGION.C150) IMRESET _(FUNCTION \DSPRESET.C150) IMFILLPOLYGON _(FUNCTION POLYSHADE.BLT))) [push IMAGESTREAMTYPES (LIST (QUOTE C150) (LIST (QUOTE OPENSTREAM) (FUNCTION OPENC150STREAM)) (LIST (QUOTE FONTCREATE) (FUNCTION \CREATEC150FONT)) (LIST (QUOTE FONTSAVAILABLE) (FUNCTION \SEARCHC150FONTFILES)) (LIST (QUOTE CREATECHARSET) (FUNCTION \CREATECHARSET.C150] (push PRINTERTYPES (LIST (LIST (QUOTE C150)) (LIST (QUOTE CANPRINT) (LIST (QUOTE C150))) (LIST (QUOTE STATUS) (FUNCTION TRUE)) (LIST (QUOTE PROPERTIES) (FUNCTION NILL)) (LIST (QUOTE SEND) (FUNCTION SEND.TO.C150)) (LIST (QUOTE BITMAPSCALE) NIL) (LIST (QUOTE BITMAPFILE) NIL))) (ADDTOVAR DEFAULTPRINTINGHOST (C150 C150)) (PUTPROP (QUOTE C150) (QUOTE PRINTERTYPE) (QUOTE C150)) [push PRINTFILETYPES (LIST (QUOTE C150) (LIST (QUOTE TEST) (FUNCTION NILL)) (LIST (QUOTE EXTENSION) (LIST (QUOTE C150] (DEFAULTFONT (QUOTE C150) (QUOTE (CLASSIC 10 MRR)) (QUOTE NEW)) T]) (\CREATECHARSET.C150 [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET FONTDESC NOSLUG?) (* gbn " 9-Jan-86 13:00") (* * tries to build the csinfo required for CHARSET. Does the necessary coercions. Returns NIL when unsuccessful (\CREATECHARSET will do the same)) (* * NOSLUG? means don't create an empty (slug) csinfo if the charset is not found, just return NIL) (DECLARE (GLOBALVARS C150FONTCOERCIONS MISSINGC150FONTCOERCIONS)) (* C150FONTCOERCIONS is a list of font coercions, in the form ((user-font real-font) (user-font real-font) ...)%. Each user-font is a list of FAMILY, and optionally SIZE and CHARSET, (e.g., (GACHA) or (GACHA 10) or (GACHA 10 143)), and each real-font is a similar list.) (COND ((PROG1 (for TRANSL in C150FONTCOERCIONS bind NEWCSINFO USERFONT REALFONT when (AND (SETQ USERFONT (CAR TRANSL)) (EQ FAMILY (CAR USERFONT)) (OR (NOT (CADR USERFONT)) (EQ SIZE (CADR USERFONT))) (OR (NOT (CADDR USERFONT)) (EQ CHARSET (CADDR USERFONT))) (SETQ REALFONT (CADR TRANSL)) (SETQ NEWCSINFO (\CREATECHARSET.C150 (OR (CAR REALFONT) FAMILY) (OR (CADR REALFONT) SIZE) FACE ROTATION DEVICE (OR (CADDR REALFONT) CHARSET) FONTDESC NOSLUG?))) do (RETURN NEWCSINFO)) (* Just recursively call ourselves to handle entries in C150FONTCOERCIONS) )) ((AND (EQ ROTATION 0) (* If it is available, this will force the appropriate file to be read to fill in the charset entry) (\READC150FONTFILE FAMILY SIZE FACE ROTATION (QUOTE C150) CHARSET))) (T (* * if we get here, the font is not directly available, either it needs to be rotated, boldified, or italicised "by hand") (PROG (NEWFONT XFONT XLATEDFAM) (RETURN (COND [(NEQ ROTATION 0) (* to make a rotated font (even if it is bold or whatnot), recursively call fontcreate to get the unrotated font (maybe bold, etc), then call \SFMAKEROTATEDFONT on the csinfo.) (OR (MEMB ROTATION (QUOTE (90 270))) (ERROR "only implemented rotations are 0, 90 and 270." ROTATION)) (COND ((SETQ XFONT (FONTCREATE FAMILY SIZE FACE 0 (QUOTE C150) T CHARSET)) (* actually call FONTCREATE here, rather than \CREATEC150FONT or \CREATECHARSET.C150 so that the vanilla font that is built in this process will be cached and not repeated.) (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) then (\SFROTATECSINFO CSINFO ROTATION) else NIL] ((AND (EQ (fetch WEIGHT of FACE) (QUOTE BOLD)) (SETQ XFONT (FONTCREATE FAMILY SIZE (create FONTFACE using FACE WEIGHT _(QUOTE MEDIUM)) 0 (QUOTE C150) T CHARSET))) (* if we want a bold font, and the medium weight font is available, build the medium weight version then call \SFMAKEBOLD on the csinfo) (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) then (\SFMAKEBOLD CSINFO) else NIL)) ((AND (EQ (fetch SLOPE of FACE) (QUOTE ITALIC)) (SETQ XFONT (FONTCREATE FAMILY SIZE (create FONTFACE using FACE SLOPE _(QUOTE REGULAR)) 0 (QUOTE C150) T CHARSET))) (if (SETQ CSINFO (\GETCHARSETINFO CHARSET XFONT T)) then (\SFMAKEITALIC CSINFO) else NIL)) ((for TRANSL in MISSINGC150FONTCOERCIONS bind NEWCSINFO USERFONT REALFONT when (AND (SETQ USERFONT (CAR TRANSL)) (EQ FAMILY (CAR USERFONT)) (OR (NOT (CADR USERFONT)) (EQ SIZE (CADR USERFONT))) (OR (NOT (CADDR USERFONT)) (EQ CHARSET (CADDR USERFONT))) (SETQ REALFONT (CADR TRANSL)) (SETQ NEWCSINFO (\CREATECHARSET.C150 (OR (CAR REALFONT) FAMILY) (OR (CADR REALFONT) SIZE) FACE ROTATION DEVICE (OR (CADDR REALFONT) CHARSET) FONTDESC NOSLUG?))) do (RETURN NEWCSINFO))) ((NOT NOSLUG?) (\BUILDSLUGCSINFO (fetch (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONTDESC) (FONTPROP FONTDESC (QUOTE ASCENT)) (FONTPROP FONTDESC (QUOTE DESCENT)) (FONTPROP FONTDESC (QUOTE DEVICE]) ) (DEFINEQ (CREATEC150BUFFER [LAMBDA (WIDTH HEIGHT) (* FS " 3-Apr-86 18:14") (LET*((BITWIDTH (ITIMES WIDTH \C150RealBPP)) (RASTERWIDTH (FOLDHI BITWIDTH BITSPERWORD)) (PAGES (FOLDHI (ITIMES RASTERWIDTH HEIGHT) WORDSPERPAGE))) (* * (create BITMAP BITMAPBITSPERPIXEL _ \C150RealBPP BITMAPRASTERWIDTH _ RASTERWIDTH BITMAPWIDTH _ BITWIDTH BITMAPHEIGHT _ HEIGHT BITMAPBASE _ (OR (\ALLOCPAGEBLOCK PAGES) (HELP "Can't allocate C150 buffer - pages needed = " PAGES)))) (* * Don't think code above is correct, commented out and added below, changing BITMAPWIDTH, and ignoring \MaxBitMapWords (safe?????) * *) (create BITMAP BITMAPBITSPERPIXEL _ \C150RealBPP BITMAPRASTERWIDTH _ RASTERWIDTH BITMAPWIDTH _ WIDTH BITMAPHEIGHT _ HEIGHT BITMAPBASE _(OR (\ALLOCPAGEBLOCK PAGES) (HELP "Can't allocate C150 buffer - pages needed = " PAGES]) (NEWLINE.C150 [LAMBDA (C150STREAM) (* hdj " 6-Jun-85 14:01") (* Go to next line (or next page if on last line)) (LET*[(C150DATA (fetch IMAGEDATA of C150STREAM)) (NEWYPOS (IPLUS (ffetch DDYPOSITION of C150DATA) (ffetch DDLINEFEED of C150DATA] (COND ((ILESSP NEWYPOS (ffetch DDClippingBottom of C150DATA)) (NEWPAGE.C150 C150STREAM)) (T (\DSPXPOSITION.C150 C150STREAM (ffetch DDLeftMargin of C150DATA)) (\DSPYPOSITION.C150 C150STREAM NEWYPOS]) (NEWPAGE.C150 [LAMBDA (C150STREAM) (* hdj " 7-Aug-85 16:48") (LET ((DD (fetch (STREAM IMAGEDATA) of C150STREAM))) [\DUMPPAGEBUFFER.C150 (fetch DDDestination of DD) C150STREAM (OR \C150COLORTABLE (SETQ \C150COLORTABLE (COLORMAP.TO.C150TABLE C150COLORMAP] (STARTPAGE.C150 C150STREAM]) (OPENC150STREAM [LAMBDA (C150FILE OPTIONS) (* gbn " 6-Nov-85 19:08") (* Opens a C150 stream) (* open a C150 stream. keep a permanent pointer to the frame buffer, because it can never be gc'ed any way, and we want to recycle it -- only allow one of them to be open at a time, due to global frame buffer) (DECLARE (GLOBALVARS \C150IMAGEOPS C150BAUDRATE \C150STREAM)) (if (AND (STREAMP \C150STREAM) (OPENP \C150STREAM)) then (ERROR "Sorry - you can only have one C150 stream open at one time" \C150STREAM) else (if (EQ (FILENAMEFIELD C150FILE (QUOTE HOST)) (QUOTE LPT)) then (* if the hardcopy interface is opening to the LPT pseudodevice, change it to be the device that the printer is actually connected to.) (SETQ C150FILE (PACKFILENAME (QUOTE HOST) \C150DEFAULTDEVICE (QUOTE BODY) C150FILE))) (LET*[(WIDTH (FIX (TIMES 8.5 \C150PointsPerInch))) (HEIGHT (FIX (TIMES 11 \C150PointsPerInch))) (BACKINGSTREAM (OPENSTREAM C150FILE (QUOTE OUTPUT))) (C150STREAM (SETQ \C150STREAM (DSPCREATE (OR \C150.FRAMEBUFFER (SETQ \C150.FRAMEBUFFER (CREATEC150BUFFER WIDTH HEIGHT] (replace (STREAM F1) of C150STREAM with BACKINGSTREAM) (replace (STREAM OUTCHARFN) of C150STREAM with (FUNCTION \OUTCHARFN.C150)) (replace (STREAM STRMBOUTFN) of C150STREAM with (FUNCTION \DSPPRINTCHAR.C150)) (replace (STREAM USERCLOSEABLE) of C150STREAM with T) (replace (STREAM IMAGEOPS) of C150STREAM with \C150IMAGEOPS) (replace (\DISPLAYDATA DDClippingRegion) of (\GETDISPLAYDATA C150STREAM) with (CREATEREGION 0 0 WIDTH HEIGHT)) (STREAMPROP C150STREAM (QUOTE COLORMAPCACHE) (LIST NIL)) (DSPLEFTMARGIN 0 C150STREAM) (DSPRIGHTMARGIN WIDTH C150STREAM) (DSPCOLOR 0 C150STREAM) (DSPBACKCOLOR 7 C150STREAM) (STARTPAGE.C150 C150STREAM) C150STREAM]) (C150.RESET [LAMBDA NIL (* gbn " 7-Nov-85 22:42") (* * just does things that the user prob doesn't know about.) (SETQ \C150STREAM) (CLOSEF? (QUOTE {CENTRONICS})) (CENTRONICS.RESET]) (SEND.TO.C150 [LAMBDA (HOST FILE PRINTOPTIONS) (* hdj " 6-Jun-85 15:37") (COPYFILE FILE (PACKFILENAME (QUOTE HOST) (QUOTE LPT) (QUOTE NAME) HOST (QUOTE EXTENSION) (QUOTE C150]) (STARTPAGE.C150 [LAMBDA (C150STREAM) (* hdj " 6-Aug-85 11:20") (LET*((DD (\GETDISPLAYDATA C150STREAM)) (CREG (fetch DDClippingRegion of DD)) (FONTASCENT (FONTASCENT (fetch DDFONT of DD))) (PAGEBUFFER (fetch DDDestination of DD))) (BLTSHADE (DSPBACKCOLOR NIL C150STREAM) PAGEBUFFER) (\DSPXPOSITION.C150 C150STREAM (fetch DDLeftMargin of DD)) (\DSPYPOSITION.C150 C150STREAM (ADD1 (IDIFFERENCE (fetch TOP of CREG) FONTASCENT]) (\BITBLT.C150 [LAMBDA (SOURCEBITMAP SOURCELEFT SOURCEBOTTOM DESTSTRM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION CLIPPEDSOURCELEFT CLIPPEDSOURCEBOTTOM) (* hdj " 6-Jun-85 16:17") (DECLARE (LOCALVARS . T)) (PROG (stodx stody left top bottom right DESTBITMAP DESTINATIONNBITS (SOURCENBITS (fetch (BITMAP BITMAPBITSPERPIXEL ) of SOURCEBITMAP)) (DESTDD (fetch IMAGEDATA of DESTSTRM))) (SETQ DESTBITMAP (fetch DDDestination of DESTDD)) [PROGN (* compute limits based on clipping regions.) (SETQ left (fetch DDClippingLeft of DESTDD)) (SETQ bottom (fetch DDClippingBottom of DESTDD)) (SETQ right (fetch DDClippingRight of DESTDD)) (SETQ top (fetch DDClippingTop of DESTDD)) (COND (CLIPPINGREGION (* hard case, two destination clipping regions: do calculations to merge them.) (PROG (CRLEFT CRBOTTOM) [SETQ left (IMAX left (SETQ CRLEFT (fetch LEFT of CLIPPINGREGION] [SETQ bottom (IMAX bottom (SETQ CRBOTTOM (fetch BOTTOM of CLIPPINGREGION ] [SETQ right (IMIN right (IPLUS CRLEFT (fetch WIDTH of CLIPPINGREGION ] (SETQ top (IMIN top (IPLUS CRBOTTOM (fetch HEIGHT of CLIPPINGREGION] (SETQ DESTINATIONNBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of DESTBITMAP)) (* left, right top and bottom are the limits in destination taking into account Clipping Regions. Clip to region in the arguments of this call.) [PROGN (SETQ left (IMAX DESTINATIONLEFT left)) (SETQ bottom (IMAX DESTINATIONBOTTOM bottom)) [COND (WIDTH (* WIDTH is optional) (SETQ right (IMIN (IPLUS DESTINATIONLEFT WIDTH) right] (COND (HEIGHT (* HEIGHT is optional) (SETQ top (IMIN (IPLUS DESTINATIONBOTTOM HEIGHT) top] (* Clip and translate coordinates.) (SETQ stodx (IDIFFERENCE DESTINATIONLEFT SOURCELEFT)) (SETQ stody (IDIFFERENCE DESTINATIONBOTTOM SOURCEBOTTOM)) (* compute the source dimensions (left right bottom top) by intersecting the source bit map, the source area to be moved with the limits of the region to be moved in the destination coordinates.) [PROGN (* compute left margin) (SETQ left (IMAX CLIPPEDSOURCELEFT (IDIFFERENCE left stodx) 0)) (* compute bottom margin) (SETQ bottom (IMAX CLIPPEDSOURCEBOTTOM (IDIFFERENCE bottom stody) 0)) (* compute right margin) (SETQ right (IMIN (\PIXELOFBITADDRESS SOURCENBITS (ffetch BITMAPWIDTH of SOURCEBITMAP )) (IDIFFERENCE right stodx) (IPLUS CLIPPEDSOURCELEFT WIDTH))) (* compute top margin) (SETQ top (IMIN (ffetch BITMAPHEIGHT of SOURCEBITMAP) (IDIFFERENCE top stody) (IPLUS CLIPPEDSOURCEBOTTOM HEIGHT] (COND ((AND (IGREATERP right left) (IGREATERP top bottom))) (T (* there is nothing to move.) (RETURN))) (OR OPERATION (SETQ OPERATION (ffetch (\DISPLAYDATA DDOPERATION) of DESTDD))) (* We'd rather handle the slow case when we are interruptable, so we do it here as a heuristic. But we might get interrupted before we go interruptable, so we do it there too.) (COND [(EQ SOURCENBITS DESTINATIONNBITS) (* going from one to another of the same size.) (* use LLSH with constant value rather than multiple because it compiles into opcodes.) [COND ((EQ DESTINATIONNBITS 4) (SETQ left (LLSH left 2)) (SETQ right (LLSH right 2)) (SETQ stodx (LLSH stodx 2))) (T (SETQ left (LLSH left 3)) (SETQ right (LLSH right 3)) (SETQ stodx (LLSH stodx 3] (* set texture if it will ever get looked at.) (AND (EQ SOURCETYPE (QUOTE MERGE)) (SETQ TEXTURE (COLORTEXTUREFROMCOLOR# TEXTURE DESTINATIONNBITS))) (* easy case of color to color) (PROG ([PILOTBBT (COND ((type? PILOTBBT \SYSPILOTBBT) \SYSPILOTBBT) (T (SETQ \SYSPILOTBBT (create PILOTBBT] (HEIGHT (IDIFFERENCE top bottom)) (WIDTH (IDIFFERENCE right left)) (DTY (\SFInvert DESTBITMAP (IPLUS top stody))) (DLX (IPLUS left stodx)) (STY (\SFInvert SOURCEBITMAP top)) (SLX left)) (replace PBTWIDTH of PILOTBBT with WIDTH) (replace PBTHEIGHT of PILOTBBT with HEIGHT) (COND ((EQ SOURCETYPE (QUOTE MERGE)) (\BITBLT.MERGE PILOTBBT SOURCEBITMAP SLX STY DESTBITMAP DLX DTY WIDTH HEIGHT OPERATION TEXTURE)) (T (\BITBLTSUB PILOTBBT SOURCEBITMAP SLX STY DESTBITMAP DLX DTY HEIGHT SOURCETYPE OPERATION TEXTURE] [(EQ SOURCENBITS 1) (* going from a black and white bitmap to a color map) (AND SOURCETYPE (NEQ SOURCETYPE (QUOTE INPUT)) (ERROR "SourceType not implemented from B&W to color bitmaps." SOURCETYPE)) (PROG ((HEIGHT (IDIFFERENCE top bottom)) (WIDTH (IDIFFERENCE right left)) (DBOT (IPLUS bottom stody)) (DLFT (IPLUS left stodx))) (SELECTQ OPERATION ((NIL REPLACE) (\BWTOCOLORBLT SOURCEBITMAP left bottom DESTBITMAP DLFT DBOT WIDTH HEIGHT (COLORNUMBERP (fetch (\DISPLAYDATA DDBACKGROUNDCOLOR) of DESTDD)) (COLORNUMBERP (fetch (\DISPLAYDATA DDFOREGROUNDCOLOR) of DESTDD)) DESTINATIONNBITS)) (PAINT) (INVERT) (ERASE) (SHOULDNT] (T (* going from color map into black and white map.) (ERROR "not implemented to blt between bitmaps of different pixel size."))) (RETURN T]) (\BLTCHAR.C150 [LAMBDA (CHARCODE C150STREAM C150DATA) (* hdj "19-Jul-85 13:32") (* * puts a character on a C150STREAM. Since a C150STREAM is based on a color bitmap stream, we can use \SLOWBLTCHAR) [COND ((NEQ (ffetch DDCHARSET of C150DATA) (\CHARSET CHARCODE)) (* The charset has changed.) (\CHANGECHARSET.C150 C150DATA (\CHARSET CHARCODE] (LET [(CHAR8CODE (\CHAR8CODE CHARCODE)) (ROTATION (ffetch (FONTDESCRIPTOR ROTATION) of (ffetch DDFONT of C150DATA] (COND [(EQ 0 ROTATION) (PROG (NEWX LEFT RIGHT (CURX (ffetch DDXPOSITION of C150DATA))) [COND ((IGREATERP (SETQ NEWX (IPLUS CURX (\DSPGETCHARWIDTH CHAR8CODE C150DATA))) (ffetch DDRightMargin of C150DATA)) (* past RIGHT margin, force eol) (\DSPPRINTCR/LF.C150 (CHARCODE EOL) C150STREAM) (SETQ CURX (ffetch DDXPOSITION of C150DATA)) (SETQ NEWX (IPLUS CURX (\DSPGETCHARWIDTH CHAR8CODE C150DATA] (* update the x position.) (freplace DDXPOSITION of C150DATA with NEWX) (SETQ LEFT (IMAX (ffetch DDClippingLeft of C150DATA) CURX)) (SETQ RIGHT (IMIN (ffetch DDClippingRight of C150DATA) NEWX)) (COND ((AND (ILESSP LEFT RIGHT) (NEQ (ffetch PBTHEIGHT of (SETQ NEWX (ffetch DDPILOTBBT of C150DATA))) 0)) (SELECTQ (ffetch (BITMAP BITMAPBITSPERPIXEL) of (ffetch (\DISPLAYDATA DDDestination) of C150DATA)) (1 (freplace PBTDESTBIT of NEWX with LEFT) (freplace PBTWIDTH of NEWX with (IDIFFERENCE RIGHT LEFT)) (freplace PBTSOURCEBIT of NEWX with (IDIFFERENCE (IPLUS ( \DSPGETCHAROFFSET CHAR8CODE C150DATA) LEFT) CURX)) (\PILOTBITBLT NEWX 0)) (4 (freplace PBTDESTBIT of NEWX with (SETQ LEFT (LLSH LEFT 2))) (freplace PBTWIDTH of NEWX with (IDIFFERENCE (LLSH RIGHT 2) LEFT)) (freplace PBTSOURCEBIT of NEWX with (IDIFFERENCE (IPLUS (LLSH (\DSPGETCHAROFFSET CHAR8CODE C150DATA ) 2) LEFT) (LLSH CURX 2))) (\PILOTBITBLT NEWX 0)) (8 (freplace PBTDESTBIT of NEWX with (SETQ LEFT (LLSH LEFT 3))) (freplace PBTWIDTH of NEWX with (IDIFFERENCE (LLSH RIGHT 3) LEFT)) (freplace PBTSOURCEBIT of NEWX with (IDIFFERENCE (IPLUS (LLSH (\DSPGETCHAROFFSET CHAR8CODE C150DATA ) 3) LEFT) (LLSH CURX 3))) (\PILOTBITBLT NEWX 0)) (SHOULDNT)) T] (T (* handle rotated fonts) (LET [(YPOS (ffetch DDYPOSITION of C150DATA)) (HEIGHTMOVED (\DSPGETCHARWIDTH CHAR8CODE C150DATA)) (CSINFO (\GETCHARSETINFO (\CHARSET CHARCODE) (ffetch DDFONT of C150DATA] (COND ((EQ ROTATION 90) (* don't force CR for rotated fonts.) (\DSPYPOSITION.C150 C150STREAM (IPLUS YPOS HEIGHTMOVED)) (* update the display stream x position.) (BITBLT (ffetch (CHARSETINFO CHARSETBITMAP) of CSINFO) 0 (\DSPGETCHAROFFSET CHAR8CODE C150DATA) C150STREAM (ADD1 (IDIFFERENCE (ffetch DDXPOSITION of C150DATA) (ffetch (CHARSETINFO CHARSETASCENT) of CSINFO))) YPOS (IPLUS (ffetch (CHARSETINFO CHARSETASCENT) of CSINFO) (ffetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) HEIGHTMOVED)) ((EQ ROTATION 270) (\DSPYPOSITION.C150 C150STREAM (IDIFFERENCE YPOS HEIGHTMOVED)) (BITBLT (ffetch (CHARSETINFO CHARSETBITMAP) of CSINFO) 0 (\DSPGETCHAROFFSET CHAR8CODE C150DATA) C150STREAM (IDIFFERENCE (ffetch DDXPOSITION of C150DATA) (ffetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) (ffetch DDYPOSITION of C150STREAM) (IPLUS (ffetch (CHARSETINFO CHARSETASCENT) of CSINFO) (ffetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) HEIGHTMOVED)) (T (ERROR "Not implemented to rotate by other than 0, 90 or 270"]) (\BLTSHADE.C150 [LAMBDA (TEXTURE STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* gbn " 5-Nov-85 18:42") (* BLTSHADE to C150 color printer) (DECLARE (LOCALVARS . T)) (PROG (left top bottom right DESTINATIONNBITS DESTINATIONBITMAP (DESTDD (fetch IMAGEDATA of STREAM))) (SETQ DESTINATIONLEFT DESTINATIONLEFT) (SETQ DESTINATIONBOTTOM DESTINATIONBOTTOM) [PROGN (* compute limits based on clipping regions.) (SETQ left (fetch DDClippingLeft of DESTDD)) (SETQ bottom (fetch DDClippingBottom of DESTDD)) (SETQ right (fetch DDClippingRight of DESTDD)) (SETQ top (fetch DDClippingTop of DESTDD)) (COND (CLIPPINGREGION (* hard case, two destination clipping regions: do calculations to merge them.) (PROG (CRLEFT CRBOTTOM) [SETQ left (IMAX left (SETQ CRLEFT (fetch LEFT of CLIPPINGREGION] [SETQ bottom (IMAX bottom (SETQ CRBOTTOM (fetch BOTTOM of CLIPPINGREGION ] [SETQ right (IMIN right (IPLUS CRLEFT (fetch WIDTH of CLIPPINGREGION ] (SETQ top (IMIN top (IPLUS CRBOTTOM (fetch HEIGHT of CLIPPINGREGION] [SETQ DESTINATIONNBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of (SETQ DESTINATIONBITMAP (fetch DDDestination of DESTDD] (* SETQ right (\PIXELOFBITADDRESS DESTINATIONNBITS right)) (* left, right top and bottom are the limits in destination taking into account Clipping Regions. Clip to region in the arguments of this call.) [PROGN (SETQ left (IMAX DESTINATIONLEFT left)) (SETQ bottom (IMAX DESTINATIONBOTTOM bottom)) [COND (WIDTH (* WIDTH is optional) (SETQ right (IMIN (IPLUS DESTINATIONLEFT WIDTH) right] (COND (HEIGHT (* HEIGHT is optional) (SETQ top (IMIN (IPLUS DESTINATIONBOTTOM HEIGHT) top] (COND ((OR (ILEQ right left) (ILEQ top bottom)) (* there is nothing to move.) (RETURN))) [SETQ TEXTURE (COND ((NULL TEXTURE) (DSPBACKCOLOR NIL STREAM)) [(FIXP TEXTURE) (* if fixp use the low order bits as a color number. This picks up the case of BLACKSHADE being used to INVERT.) (OR (COLORNUMBERP TEXTURE DESTINATIONNBITS T) (LOGAND TEXTURE (COND ((EQ DESTINATIONNBITS 4) 15) (T 255] (T (\C150.ASSURE.COLOR TEXTURE STREAM] (* filling an area with a texture.) (SETQ left (ITIMES DESTINATIONNBITS left)) (SETQ right (ITIMES DESTINATIONNBITS right)) (SETQ TEXTURE (COLORTEXTUREFROMCOLOR# TEXTURE DESTINATIONNBITS)) (* easy case of black and white bitmap into black and white or color to color or texture filling.) (* We'd rather handle the slow case when we are interruptable, so we do it here as a heuristic. But we might get interrupted before we go interruptable, so we do it there too.) (PROG ([PILOTBBT (COND ((type? PILOTBBT \SYSPILOTBBT) \SYSPILOTBBT) (T (SETQ \SYSPILOTBBT (create PILOTBBT] (HEIGHT (IDIFFERENCE top bottom))) (replace PBTWIDTH of PILOTBBT with (IDIFFERENCE right left)) (replace PBTHEIGHT of PILOTBBT with HEIGHT) (\BITBLTSUB PILOTBBT NIL left NIL DESTINATIONBITMAP left (\SFInvert DESTINATIONBITMAP top) HEIGHT (QUOTE TEXTURE) (OR OPERATION (ffetch (\DISPLAYDATA DDOPERATION) of DESTDD)) TEXTURE)) (RETURN T]) (\C150.CRLF [LAMBDA (STREAM) (* hdj "25-Jan-85 17:11") (* Send a CRLF to the printer) (BOUT STREAM (CHARCODE CR)) (BOUT STREAM (CHARCODE LF]) (\CHANGECHARSET.C150 [LAMBDA (DISPLAYDATA CHARSET) (* hdj "19-Jul-85 13:48") (* Called when the character set information cached in a display stream doesn't correspond to CHARSET) (PROG [BM (PBT (ffetch DDPILOTBBT of DISPLAYDATA)) (CSINFO (COND ((IEQP 1 (fetch (BITMAP BITMAPBITSPERPIXEL) of (fetch (\DISPLAYDATA DDDestination) of DISPLAYDATA))) (\GETCHARSETINFO CHARSET (ffetch DDFONT of DISPLAYDATA))) (T (\GETCOLORCSINFO (fetch (\DISPLAYDATA DDFONT) of DISPLAYDATA) (fetch DDFOREGROUNDCOLOR of DISPLAYDATA) (fetch DDBACKGROUNDCOLOR of DISPLAYDATA) (fetch (BITMAP BITMAPBITSPERPIXEL) of (fetch (\DISPLAYDATA DDDestination) of DISPLAYDATA)) CHARSET] (UNINTERRUPTABLY (freplace DDWIDTHSCACHE of DISPLAYDATA with (ffetch (CHARSETINFO WIDTHS) of CSINFO)) (freplace DDOFFSETSCACHE of DISPLAYDATA with (ffetch (CHARSETINFO OFFSETS) of CSINFO)) (freplace DDCHARIMAGEWIDTHS of DISPLAYDATA with (ffetch (CHARSETINFO IMAGEWIDTHS) of CSINFO)) (freplace DDCHARSET of DISPLAYDATA with CHARSET) (SETQ BM (ffetch CHARSETBITMAP of CSINFO)) (freplace PBTSOURCEBPL of PBT with (UNFOLD (ffetch BITMAPRASTERWIDTH of BM) BITSPERWORD)) [if (OR (NEQ (ffetch DDCHARSETASCENT of DISPLAYDATA) (ffetch CHARSETASCENT of CSINFO)) (NEQ (ffetch DDCHARSETDESCENT of DISPLAYDATA) (ffetch CHARSETDESCENT of CSINFO))) then (\SFFixY DISPLAYDATA CSINFO) else (freplace PBTSOURCE of PBT with (\ADDBASE (ffetch BITMAPBASE of BM) (ITIMES (ffetch BITMAPRASTERWIDTH of BM) (ffetch DDCHARHEIGHTDELTA of DISPLAYDATA])]) (\CHARWIDTH.C150 [LAMBDA (C150STREAM CHARCODE) (* hdj " 5-Jun-85 12:56") (* gets the width of a character code in a display stream. Need to fix up for spacefactor.) (\FGETWIDTH (ffetch (\DISPLAYDATA DDWIDTHSCACHE) of (ffetch IMAGEDATA of C150STREAM)) CHARCODE]) (\CLOSEFN.C150 [LAMBDA (C150STREAM) (* hdj " 4-Oct-85 12:31") (* * do cleanup prefatory to closing. dump last buffer and close the backing stream) (LET ((DD (fetch (STREAM IMAGEDATA) of C150STREAM))) [\DUMPPAGEBUFFER.C150 (fetch DDDestination of DD) C150STREAM (OR \C150COLORTABLE (SETQ \C150COLORTABLE (COLORMAP.TO.C150TABLE C150COLORMAP] (CLOSEF (\C150BackingStream C150STREAM]) (\CREATEC150FONT [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* gbn " 8-Jan-86 17:09") (* * create a font for the C150, synthesizing it if we must) (PROG [(FONTDESC (create FONTDESCRIPTOR FONTDEVICE _(QUOTE C150) FONTFAMILY _ FAMILY FONTSIZE _ SIZE FONTFACE _ FACE \SFAscent _ 0 \SFDescent _ 0 \SFHeight _ 0 ROTATION _ ROTATION FONTDEVICESPEC _(LIST FAMILY SIZE FACE ROTATION (QUOTE C150] (if (\GETCHARSETINFO CHARSET FONTDESC T) then (RETURN FONTDESC) else (RETURN NIL]) (\READC150FONTFILE [LAMBDA (FAMILY SIZE FACE ROTATION DEVICE CHARSET) (* hdj "26-Sep-85 21:49") (DECLARE (GLOBALVARS C150FONTEXTENSIONS C150FONTDIRECTORIES)) (bind FONTFILE CSINFO STRM for EXT inside C150FONTEXTENSIONS when (SETQ FONTFILE (FINDFILE (\FONTFILENAME FAMILY SIZE FACE EXT CHARSET) T C150FONTDIRECTORIES)) do (SETQ STRM (OPENSTREAM FONTFILE (QUOTE INPUT))) (RESETLST (SETQ CSINFO (\READACFONTFILE STRM FAMILY SIZE FACE))) (* If not a recognizable format, I guess we should keep looking for another possible extension, altho it would also be nice to tell the user that he has a bogus file.) (RETURN CSINFO]) (\DRAWCIRCLE.C150 [LAMBDA (C150STREAM CENTERX CENTERY RADIUS BRUSH DASHING) (* gbn " 9-Jan-86 13:36") (* \DRAWCIRCLE.C150 extended for color. Color is specified by either BRUSH or the DSPCOLOR of DS.) (* * how is a litatom passed in as brush?) (DECLARE (LOCALVARS . T)) (COND ((OR (NOT (NUMBERP RADIUS)) (ILESSP (SETQ RADIUS (FIXR RADIUS)) 0)) (\ILLEGAL.ARG RADIUS)) ((EQ RADIUS 0) (* don't draw anything.) NIL) (T (GLOBALRESOURCE \BRUSHBBT (PROG ((BRUSH (create BRUSH using BRUSH BRUSHCOLOR _(\C150.ASSURE.COLOR (fetch BRUSHCOLOR of BRUSH) C150STREAM))) (X 0) (Y RADIUS) (D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) DestinationBitMap LEFT RIGHTPLUS1 TOP BOTTOM BRUSHWIDTH BRUSHHEIGHT LEFTMINUSBRUSH BOTTOMMINUSBRUSH TOPMINUSBRUSH BRUSHBM DESTINATIONBASE BRUSHBASE RASTERWIDTH BRUSHRASTERWIDTH NBITSRIGHTPLUS1 OPERATION HEIGHTMINUS1 CX CY (BBT \BRUSHBBT) COLOR COLORBRUSHBASE NBITS (DISPLAYDATA (fetch IMAGEDATA of C150STREAM)) (USERFN (AND (LITATOM BRUSH) BRUSH))) (* many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.) (COND (USERFN (* if calling user fn, don't bother with set up and leave points in stream coordinates.) (SETQ CX CENTERX) (SETQ CY CENTERY)) (T (.SETUP.FOR.\BBTCURVEPT.) (SELECTQ NBITS (1 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH 2)))) (4 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO (LRSH BRUSHWIDTH 2) 2)))) (8 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO (LRSH BRUSHWIDTH 3) 2)))) (SHOULDNT)) (* take into account the brush thickness.) (SETQ CY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2))) (* Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points) )) [COND ((EQ RADIUS 1) (* put a single brush down.) (* draw the top and bottom most points.) (COND (USERFN (APPLY* USERFN CX CY C150STREAM)) (T (\CURVEPT CX CY))) (RETURN)) (T (* draw the top and bottom most points.) (COND (USERFN (APPLY* USERFN CX (IPLUS CY RADIUS) C150STREAM) (APPLY* USERFN CX (IDIFFERENCE CY RADIUS) C150STREAM)) (T (\CURVEPT CX (IPLUS CY RADIUS)) (\CURVEPT CX (IDIFFERENCE CY RADIUS] LP (* (UNFOLD x 2) is used instead of (ITIMES x 2)) [COND [(IGREATERP 0 D) (SETQ X (ADD1 X)) (COND ((IGREATERP (UNFOLD (IPLUS D Y) 2) 1) (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) 2) 4)) (SETQ Y (SUB1 Y))) (T (SETQ D (IPLUS D (UNFOLD X 2) 1] ((OR (EQ 0 D) (IGREATERP X D)) (SETQ X (ADD1 X)) (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) 2) 4)) (SETQ Y (SUB1 Y))) (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) 3)) (SETQ Y (SUB1 Y] (COND [(EQ Y 0) (* left most and right most points are drawn specially so that they are not duplicated which leaves a hole in XOR mode.) (COND (USERFN (APPLY* USERFN (IPLUS CX X) CY C150STREAM) (APPLY* USERFN (IDIFFERENCE CX X) CY C150STREAM)) (T (\CURVEPT (IPLUS CX X) CY) (\CURVEPT (IDIFFERENCE CX X) CY] (T (COND (USERFN (APPLY* USERFN (IPLUS CX X) (IPLUS CY Y) C150STREAM) (APPLY* USERFN (IDIFFERENCE CX X) (IPLUS CY Y) C150STREAM) (APPLY* USERFN (IPLUS CX X) (IDIFFERENCE CY Y) C150STREAM) (APPLY* USERFN (IDIFFERENCE CX X) (IDIFFERENCE CY Y) C150STREAM)) (T (\CIRCLEPTS CX CY X Y))) (GO LP))) (MOVETO CENTERX CENTERY C150STREAM) (RETURN NIL]) (\DRAWCURVE.C150 [LAMBDA (C150STREAM KNOTS CLOSED BRUSH DASHING) (* gbn "12-Jan-86 15:03") (* draws a spline curve with a given brush.) (GLOBALRESOURCE \BRUSHBBT (PROG ([DASHLST (AND DASHING (OR (AND (LISTP DASHING) (EVERY DASHING (FUNCTION FIXP)) DASHING) (\ILLEGAL.ARG DASHING] (BBT \BRUSHBBT) (CBRUSH (CREATE BRUSH USING BRUSH BRUSHCOLOR _( \C150.ASSURE.COLOR (FETCH BRUSHCOLOR OF BRUSH) C150STREAM))) LKNOT) (SELECTQ (LENGTH KNOTS) (0 (* No knots => empty curve rather than error?) NIL) (1 (* only one knot, put down a brush shape) (OR (type? POSITION (CAR KNOTS)) (ERROR "bad knot" (CAR KNOTS))) (DRAWPOINT (fetch XCOORD of (CAR KNOTS)) (fetch YCOORD of (CAR KNOTS)) BRUSH C150STREAM)) (2 (OR (type? POSITION (CAR KNOTS)) (ERROR "bad knot" (CAR KNOTS))) (OR (type? POSITION (CADR KNOTS)) (ERROR "bad knot" (CADR KNOTS))) (\LINEWITHBRUSH (fetch XCOORD of (CAR KNOTS)) (fetch YCOORD of (CAR KNOTS)) (fetch XCOORD of (CADR KNOTS)) (fetch YCOORD of (CADR KNOTS)) BRUSH DASHLST C150STREAM BBT)) (\CURVE2 (PARAMETRICSPLINE KNOTS CLOSED) CBRUSH DASHLST BBT C150STREAM)) (RETURN C150STREAM]) (\DRAWELLIPSE.C150 [LAMBDA (DISPLAYSTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) (* hdj " 6-Jun-85 16:17") (DECLARE (LOCALVARS . T)) (* Draws an ellipse. At ORIENTATION 0, the semimajor axis is horizontal, the semiminor axis vertical. Orientation is positive in the counterclockwise direction. The current location in the stream is left at the center of the ellipse.) (PROG ((CENTERX (FIXR CENTERX)) (CENTERY (FIXR CENTERY)) (SEMIMINORRADIUS (FIXR SEMIMINORRADIUS)) (SEMIMAJORRADIUS (FIXR SEMIMAJORRADIUS))) (COND ((OR (EQ 0 SEMIMINORRADIUS) (EQ 0 SEMIMAJORRADIUS)) (MOVETO CENTERX CENTERY DISPLAYSTREAM) (RETURN))) (COND ((ILESSP SEMIMINORRADIUS 1) (\ILLEGAL.ARG SEMIMINORRADIUS)) ((ILESSP SEMIMAJORRADIUS 1) (\ILLEGAL.ARG SEMIMAJORRADIUS)) ((OR (NULL ORIENTATION) (EQ SEMIMINORRADIUS SEMIMAJORRADIUS)) (SETQ ORIENTATION 0)) ((NULL (NUMBERP ORIENTATION)) (\ILLEGAL.ARG ORIENTATION))) (* This function is the implementation of the algorithm given in "Algorithm for drawing ellipses or hyperbolae with a digital plotter" by Pitteway appearing in Computer Journal 10: (3) Nov 1967.0 The input parameters are used to determine the ellipse equation (1/8) Ayy+ (1/8) Bxx+ (1/4) Gxy+ (1/4) Ux+ (1/4) Vy= (1/4) K which specifies a translated version of the desired ellipse. This ellipse passes through the mesh point (0,0), the initial point of the algorithm. The power of 2 factors reflect an implementation convenience.) (GLOBALRESOURCE \BRUSHBBT (PROG (DestinationBitMap LEFT RIGHTPLUS1 BOTTOM TOP BOTTOMMINUSBRUSH TOPMINUSBRUSH LEFTMINUSBRUSH DESTINATIONBASE BRUSHBASE BRUSHHEIGHT BRUSHWIDTH RASTERWIDTH BRUSHRASTERWIDTH BRUSHBM OPERATION HEIGHTMINUS1 (BBT \BRUSHBBT) (cosOrientation (COS ORIENTATION)) (sinOrientation (SIN ORIENTATION)) (SEMIMINORRADIUSSQUARED (ITIMES SEMIMINORRADIUS SEMIMINORRADIUS)) (SEMIMAJORRADIUSSQUARED (ITIMES SEMIMAJORRADIUS SEMIMAJORRADIUS)) (x 0) (y 0) (x2 1) x1 y1 y2 k1 k2 k3 a b d w A B G U V K CX CY yOffset CYPlusOffset CYMinusOffset NBITSRIGHTPLUS1 COLORBRUSHBASE COLOR NBITS (DISPLAYDATA (fetch IMAGEDATA of DISPLAYSTREAM)) (USERFN (AND (LITATOM BRUSH) BRUSH))) (* many of these variables are used by the macro for \CURVEPT that passes them to \BBTCURVEPT and .SETUP.FOR.\BBTCURVEPT. sets them up.) (COND (USERFN (* if calling user fn, don't bother with set up and leave points in window coordinates.) (SETQ CX CENTERX) (SETQ CY CENTERY)) (T (.SETUP.FOR.\BBTCURVEPT.) (* take into account the brush thickness.) (SELECTQ NBITS (1 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO BRUSHWIDTH 2)))) (4 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO (LRSH BRUSHWIDTH 2) 2)))) (8 (SETQ CX (IDIFFERENCE CENTERX (FOLDLO (LRSH BRUSHWIDTH 3) 2)))) (SHOULDNT)) (SETQ CY (IDIFFERENCE CENTERY (FOLDLO BRUSHHEIGHT 2))) (* Move the window to top while interruptable, but verify that it is still there uninterruptably with drawing points) )) (SETQ A (FPLUS (FTIMES SEMIMAJORRADIUSSQUARED cosOrientation cosOrientation) (FTIMES SEMIMINORRADIUSSQUARED sinOrientation sinOrientation))) (SETQ B (LSH (FIXR (FPLUS (FTIMES SEMIMINORRADIUSSQUARED cosOrientation cosOrientation) (FTIMES SEMIMAJORRADIUSSQUARED sinOrientation sinOrientation))) 3)) (SETQ G (FTIMES cosOrientation sinOrientation (LSH (IDIFFERENCE SEMIMINORRADIUSSQUARED SEMIMAJORRADIUSSQUARED ) 1))) [SETQ yOffset (FIXR (FQUOTIENT (ITIMES SEMIMINORRADIUS SEMIMAJORRADIUS) (SQRT A] (SETQ CYPlusOffset (IPLUS CY yOffset)) (SETQ CYMinusOffset (IDIFFERENCE CY yOffset)) (SETQ U (LSH (FIXR (FTIMES A (LSH yOffset 1))) 2)) (SETQ V (LSH (FIXR (FTIMES G yOffset)) 2)) (SETQ K (LSH [FIXR (FDIFFERENCE (ITIMES SEMIMINORRADIUSSQUARED SEMIMAJORRADIUSSQUARED) (FTIMES A (ITIMES yOffset yOffset] 2)) (SETQ A (LSH (FIXR A) 3)) (SETQ G (LSH (FIXR G) 2)) (* The algorithm is incremental and iterates through the octants of a cartesian plane. The octants are labeled from 1 through 8 beginning above the positive X axis and proceeding counterclockwise. Decisions in making the incremental steps are determined according to the error term d which is updated according to the curvature terms a and b. k1, k2, and k3 are used to correct the error and curvature terms at octant boundaries. The initial values of these terms depends on the octant in which drawing begins. The initial move steps (x1,y1) and (x2,y2) also depend on the starting octant.) [COND [(ILESSP (ABS U) (ABS V)) (SETQ x1 0) (COND [(MINUSP V) (* start in octant 2) (SETQ y1 1) (SETQ y2 1) (SETQ k1 (IMINUS A)) (SETQ k2 (IDIFFERENCE k1 G)) (SETQ k3 (IDIFFERENCE k2 (IPLUS B G))) (SETQ b (IPLUS U (RSH (IPLUS A G) 1))) (SETQ a (IMINUS (IPLUS b V))) (SETQ d (IPLUS b (RSH B 3) (RSH V 1) (IMINUS K] (T (* start in octant 7) (SETQ y1 -1) (SETQ y2 -1) (SETQ k1 A) (SETQ k2 (IDIFFERENCE k1 G)) (SETQ k3 (IPLUS k2 B (IMINUS G))) (SETQ b (IPLUS U (RSH (IDIFFERENCE G A) 1))) (SETQ a (IDIFFERENCE V b)) (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH V 1) (RSH B 3] (T (SETQ x1 1) (SETQ y1 0) (COND [(MINUSP V) (* start in octant 1) (SETQ y2 1) (SETQ k1 B) (SETQ k2 (IPLUS k1 G)) (SETQ k3 (IPLUS k2 A G)) [SETQ b (IMINUS (IPLUS V (RSH (IPLUS B G) 1] (SETQ a (IDIFFERENCE U b)) (SETQ d (IPLUS b K (IMINUS (IPLUS (RSH A 3) (RSH U 1] (T (* start in octant 8) (SETQ y2 -1) (SETQ k1 (IMINUS B)) (SETQ k2 (IPLUS k1 G)) (SETQ k3 (IPLUS k2 G (IMINUS A))) (SETQ b (IPLUS V (RSH (IDIFFERENCE B G) 1))) (SETQ a (IDIFFERENCE U b)) (SETQ d (IPLUS b (RSH A 3) (IMINUS (IPLUS K (RSH U 1] (* The ellipse equation describes an ellipse of the desired size and ORIENTATION centered at (0,0) and then dropped yOffset mesh points so that it will pass through (0,0)%. Thus, the intended starting point is (CX, CY+yOffset) where (CX, CY) is the center of the desired ellipse. Drawing is accomplished with point relative steps. In each octant, the error term d is used to choose between move 1 (an axis move) and move 2 (a diagonal move)%.) MOVE [COND ((MINUSP d) (* move 1) (SETQ x (IPLUS x x1)) (SETQ y (IPLUS y y1)) (SETQ b (IDIFFERENCE b k1)) (SETQ a (IPLUS a k2)) (SETQ d (IPLUS b d))) (T (* move 2) (SETQ x (IPLUS x x2)) (SETQ y (IPLUS y y2)) (SETQ b (IDIFFERENCE b k2)) (SETQ a (IPLUS a k3)) (SETQ d (IDIFFERENCE d a] (COND ((MINUSP x) (MOVETO CENTERX CENTERY DISPLAYSTREAM) (RETURN NIL))) [COND (USERFN (APPLY* USERFN (IPLUS CX x) (IPLUS CYPlusOffset y) DISPLAYSTREAM) (APPLY* USERFN (IDIFFERENCE CX x) (IDIFFERENCE CYMinusOffset y) DISPLAYSTREAM)) (T (\CURVEPT (IPLUS CX x) (IPLUS CYPlusOffset y)) (\CURVEPT (IDIFFERENCE CX x) (IDIFFERENCE CYMinusOffset y] (AND (MINUSP b) (GO SQUARE)) DIAGONAL (OR (MINUSP a) (GO MOVE)) (* diagonal octant change) (SETQ x1 (IDIFFERENCE x2 x1)) (SETQ y1 (IDIFFERENCE y2 y1)) (SETQ w (IDIFFERENCE (LSH k2 1) k3)) (SETQ k1 (IDIFFERENCE w k1)) (SETQ k2 (IDIFFERENCE k2 k3)) (SETQ k3 (IMINUS k3)) [SETQ b (IPLUS b a (IMINUS (RSH (ADD1 k2) 1] [SETQ d (IPLUS b (RSH (IPLUS k3 4) 3) (IMINUS d) (IMINUS (RSH (ADD1 a) 1] (SETQ a (IDIFFERENCE (RSH (ADD1 w) 1) a)) (OR (MINUSP b) (GO MOVE)) SQUARE (* square octant change) [COND ((EQ 0 x1) (SETQ x2 (IMINUS x2))) (T (SETQ y2 (IMINUS y2] (SETQ w (IDIFFERENCE k2 k1)) (SETQ k1 (IMINUS k1)) (SETQ k2 (IPLUS w k1)) (SETQ k3 (IDIFFERENCE (LSH w 2) k3)) (SETQ b (IDIFFERENCE (IMINUS b) w)) (SETQ d (IDIFFERENCE (IDIFFERENCE b a) d)) (SETQ a (IDIFFERENCE (IDIFFERENCE a w) (LSH b 1))) (GO DIAGONAL]) (\DRAWLINE.C150 [LAMBDA (C150STREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR) (* gbn " 5-Nov-85 13:39") (* C150STREAM is guaranteed to be a C150STREAM Draws a line from x1,y1 to x2,y2 leaving the position at x2,y2) (PROG ((DD (fetch IMAGEDATA of C150STREAM))) (\CLIPANDDRAWLINE (OR (FIXP X1) (FIXR X1)) (OR (FIXP Y1) (FIXR Y1)) (OR (FIXP X2) (FIXR X2)) (OR (FIXP Y2) (FIXR Y2)) [COND ((NULL WIDTH) 1) ((OR (FIXP WIDTH) (FIXR WIDTH] (SELECTQ OPERATION (NIL (ffetch DDOPERATION of DD)) ((REPLACE PAINT INVERT ERASE) OPERATION) (\ILLEGAL.ARG OPERATION)) (ffetch DDDestination of DD) (ffetch DDClippingLeft of DD) (SUB1 (ffetch DDClippingRight of DD)) (ffetch DDClippingBottom of DD) (SUB1 (ffetch DDClippingTop of DD)) C150STREAM (\C150.ASSURE.COLOR COLOR C150STREAM))) (* the generic case of MOVETO is used so that the hardcopy streams get handled as well.) (MOVETO X2 Y2 C150STREAM]) (\DSPBACKCOLOR.C150 [LAMBDA (STREAM COLOR) (* rmk: "12-Sep-84 09:54") (* sets and returns a display stream's background color.) (PROG (COLORCELL (DD (\GETDISPLAYDATA STREAM))) (SETQ COLORCELL (fetch DDCOLOR of DD)) (RETURN (COND (COLOR (OR (\POSSIBLECOLOR COLOR) (\ILLEGAL.ARG COLOR)) (PROG1 (COND (COLORCELL (PROG1 (CDR COLORCELL) (RPLACD COLORCELL COLOR))) (T (* no color cell yet, make one.) (replace DDCOLOR of DD with (CONS WHITECOLOR COLOR)) BLACKCOLOR)) (\SFFixFont STREAM DD))) (T (OR (CDR COLORCELL) BLACKCOLOR]) (\DSPCLIPPINGREGION.C150 [LAMBDA (C150STREAM REGION) (* hdj " 5-Jun-85 12:56") (* sets the clipping region of a display stream.) (PROG ((DD (\GETDISPLAYDATA C150STREAM))) (RETURN (PROG1 (ffetch DDClippingRegion of DD) (COND (REGION (OR (type? REGION REGION) (ERROR REGION " is not a REGION.")) (UNINTERRUPTABLY (freplace DDClippingRegion of DD with REGION) (\SFFixClippingRegion DD) (\SFFixY DD))]) (\DSPCOLOR.C150 [LAMBDA (STREAM COLOR) (* gbn "13-Jan-86 12:08") (* sets and returns a display stream's foreground color.) (LET (CURRENTCOLOR NEWCOLOR (DD (\GETDISPLAYDATA STREAM))) (SETQ CURRENTCOLOR (fetch DDCOLOR of DD)) (COND (COLOR (SETQ NEWCOLOR (\C150.ASSURE.COLOR COLOR STREAM)) (PROG1 (COND (CURRENTCOLOR (PROG1 (CAR CURRENTCOLOR) (RPLACA CURRENTCOLOR NEWCOLOR))) (T (* no color cell yet, make one.) (replace DDCOLOR of DD with (CONS NEWCOLOR BLACKCOLOR)) WHITECOLOR)) (\SFFixFont STREAM DD))) (T (OR (CAR CURRENTCOLOR) WHITECOLOR]) (\C150.ASSURE.COLOR [LAMBDA (COLOR# C150STREAM) (* gbn " 7-Jan-86 17:44") (PROG (LEVELS) (AND (COND ((NULL COLOR) (RETURN (DSPCOLOR NIL C150STREAM))) [(FIXP COLOR#) (RETURN (COND ((AND (IGEQ COLOR# 0) (ILESSP COLOR# 8) COLOR#)) (T (\ILLEGAL.ARG COLOR#] [(LITATOM COLOR#) (RETURN (COND ((SETQ LEVELS (\LOOKUPCOLORNAME COLOR#)) (* recursively look up color number) (\C150.ASSURE.COLOR (CDR LEVELS) C150STREAM)) (T (ERROR "Unknown color name" COLOR#] ((EQ (LENGTH COLOR#) 2) (* temporarily, handle the case of being given a texture and a color, by using the color) (RETURN (\C150.ASSURE.COLOR (CADR COLOR#) C150STREAM))) ((HLSP COLOR#) (* HLS form convert to RGB) (SETQ LEVELS (HLSTORGB COLOR#))) ((RGBP COLOR#) (* check for RGB or HLS) (SETQ LEVELS COLOR#)) ((TYPENAMEP COLOR# (QUOTE BITMAP)) (* just a hack to not blow up) (RETURN (IMOD (for I from 1 to (BITMAPWIDTH COLOR#) sum (BITMAPBIT COLOR# I 1)) 8))) (T (\ILLEGAL.ARG COLOR#))) (RETURN (COND ((\C150.LOOKUPRGB LEVELS C150STREAM)) (T (ERROR COLOR# "not available in color map"]) (\C150.LOOKUPRGB [LAMBDA (RGB C150STREAM) (* gbn " 5-Nov-85 15:47") (* * returns the colormap index whose value is RGB. Looks first in the cache, then runs through the colormap. Returns NIL if RGB NOT found) (DECLARE (GLOBALVARS C150COLORMAP)) (PROG [INDEX (CACHE (STREAMPROP C150STREAM (QUOTE COLORMAPCACHE] (RETURN (if (SETQ INDEX (SASSOC RGB CACHE)) then (CDR INDEX) else [SETQ INDEX (bind (CM _ C150COLORMAP) for I from 0 to (SUB1 (EXPT 2 3)) thereis (AND (EQ (\GENERIC.COLORLEVEL CM I (QUOTE RED)) (fetch (RGB RED) of LEVELS)) (EQ (\GENERIC.COLORLEVEL CM I (QUOTE GREEN)) (fetch (RGB GREEN) of LEVELS)) (EQ (\GENERIC.COLORLEVEL CM I (QUOTE BLUE)) (fetch (RGB BLUE) of LEVELS] (if INDEX then (PUTASSOC RGB INDEX CACHE)) INDEX]) (\DSPFONT.C150 [LAMBDA (C150STREAM FONT) (* hdj " 4-Oct-85 11:55") (* sets the font that a display stream uses to print characters. C150STREAM is guaranteed to be a stream of type C150) (PROG (XFONT OLDFONT (DD (fetch IMAGEDATA of C150STREAM))) (* save old value to return, smash new value and update the bitchar portion of the record.) (RETURN (PROG1 (SETQ OLDFONT (fetch DDFONT of DD)) (COND (FONT (SETQ XFONT (OR (\GETFONTDESC FONT (QUOTE C150) T) (FONTCOPY (ffetch DDFONT of DD) FONT))) (* color case, create a font with the current foreground and background colors.) (* (SETQ XFONT (\GETCOLORFONT XFONT (DSPCOLOR NIL C150STREAM) (DSPBACKCOLOR NIL C150STREAM) (ffetch (BITMAP BITMAPBITSPERPIXEL) of (ffetch (\DISPLAYDATA DDDestination) of DD))))) (* updating font information is fairly expensive operation. Don't bother unless font has changed.) (OR (EQ XFONT OLDFONT) (UNINTERRUPTABLY (freplace DDFONT of DD with XFONT) (freplace DDLINEFEED of DD with (IMINUS (fetch \SFHeight of XFONT))) (\SFFixFont C150STREAM DD))]) (\DSPLEFTMARGIN.C150 [LAMBDA (C150STREAM XPOSITION) (* hdj " 5-Jun-85 12:56") (* sets the xposition that a carriage return returns to.) (PROG ((DD (fetch IMAGEDATA of C150STREAM))) (RETURN (PROG1 (ffetch DDLeftMargin of DD) (AND XPOSITION (COND ((AND (SMALLP XPOSITION) (IGREATERP XPOSITION -1)) (UNINTERRUPTABLY (freplace DDLeftMargin of DD with XPOSITION) (\SFFIXLINELENGTH C150STREAM))) (T (\ILLEGAL.ARG XPOSITION]) (\DSPLINEFEED.C150 [LAMBDA (C150STREAM DELTAY) (* hdj " 5-Jun-85 12:56") (* sets the amount that a line feed increases the y coordinate by.) (PROG ((DD (fetch IMAGEDATA of C150STREAM))) (RETURN (PROG1 (ffetch DDLINEFEED of DD) (AND DELTAY (COND ((NUMBERP DELTAY) (freplace DDLINEFEED of DD with DELTAY)) (T (\ILLEGAL.ARG DELTAY]) (\DSPOPERATION.C150 [LAMBDA (C150STREAM OPERATION) (* hdj " 5-Jun-85 12:56") (* sets the operation field of a display stream) (PROG ((DD (\GETDISPLAYDATA C150STREAM))) (RETURN (PROG1 (fetch DDOPERATION of DD) (COND (OPERATION (OR (FMEMB OPERATION (QUOTE (PAINT REPLACE INVERT ERASE))) (LISPERROR "ILLEGAL ARG" OPERATION)) (UNINTERRUPTABLY (freplace DDOPERATION of DD with OPERATION) (* update other fields that depend on operation.) (\SETPBTFUNCTION (fetch DDPILOTBBT of DD) (fetch DDSOURCETYPE of DD) OPERATION))]) (\DSPPRINTCHAR.C150 [LAMBDA (STREAM CHARCODE) (* hdj " 5-Jun-85 12:56") (* Displays the character and increments the Xposition. STREAM is guaranteed to be of type display.) (PROG ((DD (fetch IMAGEDATA of STREAM))) (SELCHARQ CHARCODE ((EOL CR LF) (\DSPPRINTCR/LF.C150 CHARCODE STREAM) (replace CHARPOSITION of STREAM with 0)) (LF (\DSPPRINTCR/LF.C150 CHARCODE STREAM)) (TAB (PROG (TABWIDTH (SPACEWIDTH (CHARWIDTH (CHARCODE SPACE) STREAM))) (SETQ TABWIDTH (UNFOLD SPACEWIDTH 8)) (if (IGREATERP (\DISPLAYSTREAMINCRXPOSITION (SETQ TABWIDTH (IDIFFERENCE TABWIDTH (MOD (IDIFFERENCE (fetch DDXPOSITION of DD) (ffetch DDLeftMargin of DD)) TABWIDTH))) DD) (ffetch DDRightMargin of DD)) then (* tab was past rightmargin, force cr.) (\DSPPRINTCR/LF.C150 (CHARCODE EOL) STREAM)) (* return the number of spaces taken.) (add (fetch CHARPOSITION of STREAM) (IQUOTIENT TABWIDTH SPACEWIDTH)))) (add (fetch CHARPOSITION of STREAM) (IPLUS (if (ILESSP CHARCODE 32) then (* CONTROL character) (\BLTCHAR.C150 CHARCODE STREAM DD) 0 else (\BLTCHAR.C150 CHARCODE STREAM DD) 1]) (\DSPPRINTCR/LF.C150 [LAMBDA (CHARCODE DS) (* hdj " 6-Jun-85 14:08") (* CHARCODE is EOL, CR, or LF Assumes that DS has been checked by \DSPPRINTCHAR) (PROG (BTM AMOUNT/BELOW Y ROTATION FONT (DD (fetch IMAGEDATA of DS))) (COND ((AND (fetch DDSlowPrintingCase of DD) (NEQ (SETQ ROTATION (fetch (FONTDESCRIPTOR ROTATION) of (fetch DDFONT of DD))) 0)) (PROG ((CLIPREG (ffetch DDClippingRegion of DD)) X) [COND ((EQ CHARCODE (CHARCODE EOL)) (* on LF, no change in X) (COND ((SETQ Y (fetch DDEOLFN of DD)) (* call the eol function for ds.) (APPLY* Y DS))) (\DSPYPOSITION.C150 DS (SELECTQ ROTATION (90 (fetch (REGION BOTTOM) of CLIPREG)) (270 (fetch (REGION TOP) of CLIPREG)) (ERROR "Only rotations supported are 0, 90 and 270" ] [SETQ X (IPLUS (fetch DDXPOSITION of DD) (SELECTQ ROTATION (90 (IMINUS (ffetch DDLINEFEED of DD))) (270 (ffetch DDLINEFEED of DD)) (ERROR "Only rotations supported are 0, 90 and 270"] (DSPXPOSITION X DS))) (T (COND ((EQ CHARCODE (CHARCODE EOL)) (* on LF, no change in X) (COND ((SETQ Y (fetch DDEOLFN of DD)) (* call the eol function for ds.) (APPLY* Y DS))) (DSPXPOSITION (ffetch DDLeftMargin of DD) DS))) (SETQ Y (IPLUS (ffetch DDYPOSITION of DD) (ffetch DDLINEFEED of DD))) (DSPYPOSITION Y DS]) (\DSPRESET.C150 [LAMBDA (C150STREAM) (* hdj " 5-Aug-85 18:57") (DECLARE (GLOBALVARS \CURRENTDISPLAYLINE)) (* resets a display stream) (PROG (CREG FONT FONTASCENT (DD (\GETDISPLAYDATA C150STREAM))) (SETQ CREG (ffetch DDClippingRegion of DD)) (SETQ FONT (fetch DDFONT of DD)) (SETQ FONTASCENT (FONTASCENT FONT)) (SELECTQ (fetch (FONTDESCRIPTOR ROTATION) of FONT) (0 (\DSPXPOSITION.C150 C150STREAM (ffetch DDLeftMargin of DD)) (\DSPYPOSITION.C150 C150STREAM (ADD1 (IDIFFERENCE (fetch TOP of CREG) FONTASCENT)))) (90 (\DSPXPOSITION.C150 C150STREAM (IPLUS (fetch LEFT of CREG) FONTASCENT)) (\DSPYPOSITION.C150 C150STREAM (fetch BOTTOM of CREG))) (270 (\DSPXPOSITION.C150 C150STREAM (IDIFFERENCE (fetch RIGHT of CREG) FONTASCENT)) (\DSPYPOSITION.C150 C150STREAM (fetch TOP of CREG))) (ERROR "only supported rotations are 0, 90 and 270")) (\CLEARBM (ffetch (\DISPLAYDATA DDDestination) of DD) (DSPBACKCOLOR NIL C150STREAM) CREG]) (\DSPRIGHTMARGIN.C150 [LAMBDA (C150STREAM XPOSITION) (* hdj " 5-Jun-85 12:56") (* Sets the right margin that determines when a cr is inserted by print.) (PROG (OLDRM (DD (fetch IMAGEDATA of C150STREAM))) (SETQ OLDRM (ffetch DDRightMargin of DD)) (COND ((NULL XPOSITION)) [(AND (SMALLP XPOSITION) (IGREATERP XPOSITION -1)) (* Avoid fixing linelength if right margin hasn't changed.) (OR (EQ XPOSITION OLDRM) (UNINTERRUPTABLY (freplace DDRightMargin of DD with XPOSITION) (\SFFIXLINELENGTH C150STREAM))] (T (\ILLEGAL.ARG XPOSITION))) (RETURN OLDRM]) (\DSPXPOSITION.C150 [LAMBDA (C150STREAM XPOSITION) (* hdj " 5-Jun-85 12:56") (* coordinate position is stored in 15 bits in the range -2^15 to +2^15.) (PROG ((DD (fetch IMAGEDATA of C150STREAM))) (RETURN (PROG1 (fetch DDXPOSITION of DD) (COND ((NULL XPOSITION)) ((NUMBERP XPOSITION) (freplace DDXPOSITION of DD with XPOSITION) (* reset the charposition field so that PRINT etc. won't put out eols.) (freplace (STREAM CHARPOSITION) of C150STREAM with 0)) (T (\ILLEGAL.ARG XPOSITION]) (\DSPYPOSITION.C150 [LAMBDA (DISPLAYSTREAM YPOSITION) (* hdj " 3-Oct-85 17:57") (LET ((DD (fetch IMAGEDATA of DISPLAYSTREAM))) (PROG1 (ffetch DDYPOSITION of DD) (COND ((NULL YPOSITION)) ((NUMBERP YPOSITION) (UNINTERRUPTABLY (freplace DDYPOSITION of DD with YPOSITION) (\INVALIDATEDISPLAYCACHE DD))) (T (\ILLEGAL.ARG YPOSITION]) (\DUMPPAGEBUFFER.C150 [LAMBDA (BITMAP C150STREAM COLOR.TABLES) (* gbn "13-Jan-86 21:37") (CENTRONICS.RESET C150STREAM) (LET*[(BACKINGSTREAM (\C150BackingStream C150STREAM)) (MAXX (SUB1 (BITMAPWIDTH BITMAP))) (MAXY (SUB1 (BITMAPHEIGHT BITMAP))) (LINEBYTES (FOLDHI (BITMAPWIDTH BITMAP) BITSPERBYTE)) (PrintingTimeInSeconds 1) (PrintingTimer (SETUPTIMER PrintingTimeInSeconds NIL (QUOTE SECONDS] (C150.SETMARGINS BACKINGSTREAM) (C150.SEPARATOR BACKINGSTREAM) (bind (BLANKLINES _ 0) (FIRSTLINE _ T) for SCANLINE from MAXY to 0 by -4 do (if (\C150.ALLWHITESPACE BITMAP COLOR.TABLES SCANLINE) then (add BLANKLINES 1) (BLOCK) else (* * First dump the buffered microlinefeeds) (if (AND FIRSTLINE C150.CLIPBUFFER) then (* don't bother printing these microlinefeeds, since they are just the blanks at the top of the buffer) (SETQ FIRSTLINE NIL) else (for I to BLANKLINES do (\C150.MICROLINEFEED BACKINGSTREAM))) (SETQ BLANKLINES 0) [for SUBSCAN from 0 to 3 do (if (TIMEREXPIRED? PrintingTimer (QUOTE SECONDS)) then (BLOCK) (SETUPTIMER PrintingTimeInSeconds PrintingTimer (QUOTE SECONDS))) (for COLOR from 0 to 3 do (* loop over (black magenta yellow cyan)) (LET [(COLOR.ARRAY.BASE (fetch (ARRAYP BASE) of (ELT COLOR.TABLES COLOR] (\C150.SENDLINEINFO BACKINGSTREAM COLOR LINEBYTES SUBSCAN) (for XPOSITION from 0 to MAXX by 8 do (BOUT BACKINGSTREAM (for BIT from 0 to 7 sum (LLSH (\GETBASE COLOR.ARRAY.BASE (BITMAPBIT BITMAP (IPLUS XPOSITION BIT) (IDIFFERENCE SCANLINE SUBSCAN))) (IDIFFERENCE 7 BIT] (\C150.MICROLINEFEED BACKINGSTREAM)) finally (if (NOT C150.CLIPBUFFER) then (* print out the remaining microlinefeeds) (for I from 1 to BLANKLINES do (\C150.MICROLINEFEED BACKINGSTREAM]) (\FILLCIRCLE.C150 [LAMBDA (C150STREAM CENTERX CENTERY RADIUS TEXTURE) (* hdj " 6-Jun-85 16:17") (COND ((OR (NOT (NUMBERP RADIUS)) (ILESSP (SETQ RADIUS (FIXR RADIUS)) 0)) (\ILLEGAL.ARG RADIUS)) (T (GLOBALRESOURCE \BRUSHBBT (PROG (TOP BOTTOM RIGHT LEFT OPERATION DestinationBitMap (DISPLAYDATA (fetch IMAGEDATA of C150STREAM)) (X 0) (Y RADIUS) (D (ITIMES 2 (IDIFFERENCE 1 RADIUS))) DESTINATIONBASE RASTERWIDTH CX CY TEXTUREBM GRAYHEIGHT GRAYWIDTH GRAYBASE NBITS (FCBBT \BRUSHBBT)) (SETQ TOP (SUB1 (fetch DDClippingTop of DISPLAYDATA))) (SETQ BOTTOM (fetch DDClippingBottom of DISPLAYDATA)) (SETQ LEFT (fetch DDClippingLeft of DISPLAYDATA)) (SETQ RIGHT (SUB1 (fetch DDClippingRight of DISPLAYDATA))) (SETQ OPERATION (ffetch DDOPERATION of DISPLAYDATA)) (SETQ DestinationBitMap (fetch DDDestination of DISPLAYDATA)) (SETQ NBITS (fetch (BITMAP BITMAPBITSPERPIXEL) of DestinationBitMap)) [SETQ TEXTUREBM (COND ((BITMAPP TEXTURE)) [(AND (NEQ NBITS 1) (BITMAPP (COLORTEXTUREFROMCOLOR# (COLORNUMBERP (OR TEXTURE (DSPCOLOR NIL C150STREAM ] [(AND (NULL TEXTURE) (BITMAPP (ffetch DDTexture of DISPLAYDATA] ([OR (FIXP TEXTURE) (AND (NULL TEXTURE) (SETQ TEXTURE (ffetch DDTexture of DISPLAYDATA] (* create bitmap for the texture. Could reuse a bitmap but for now this is good enough.) (SETQ TEXTUREBM (BITMAPCREATE 16 4)) (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of TEXTUREBM)) (\PUTBASE GRAYBASE 0 (\SFReplicate (LOGAND (LRSH TEXTURE 12) 15))) (\PUTBASE GRAYBASE 1 (\SFReplicate (LOGAND (LRSH TEXTURE 8 ) 15))) (\PUTBASE GRAYBASE 2 (\SFReplicate (LOGAND (LRSH TEXTURE 4 ) 15))) (\PUTBASE GRAYBASE 3 (\SFReplicate (LOGAND TEXTURE 15))) TEXTUREBM) (T (\ILLEGAL.ARG TEXTURE] (SETQ GRAYBASE (fetch (BITMAP BITMAPBASE) of TEXTUREBM)) (SETQ DESTINATIONBASE (fetch BITMAPBASE of DestinationBitMap)) (SETQ RASTERWIDTH (fetch BITMAPRASTERWIDTH of DestinationBitMap)) (* update as many fields in the brush bitblt table as possible from DS.) (replace PBTFLAGS of FCBBT with 0) (replace PBTDESTBPL of FCBBT with (UNFOLD RASTERWIDTH BITSPERWORD)) (* clear gray information. PBTSOURCEBPL is used for gray information too.) (replace PBTSOURCEBPL of FCBBT with 0) (replace PBTUSEGRAY of FCBBT with T) [replace PBTGRAYWIDTHLESSONE of FCBBT with (SUB1 (SETQ GRAYWIDTH (IMIN (fetch (BITMAP BITMAPWIDTH) of TEXTUREBM) 16] [replace PBTGRAYHEIGHTLESSONE of FCBBT with (SUB1 (SETQ GRAYHEIGHT (IMIN (fetch (BITMAP BITMAPHEIGHT) of TEXTUREBM ) 16] (replace PBTDISJOINT of FCBBT with T) (\SETPBTFUNCTION FCBBT (QUOTE TEXTURE) OPERATION) (replace PBTHEIGHT of FCBBT with 1) (* take into account the brush thickness.) (SETQ CX CENTERX) (SETQ CY CENTERY) (* change Y TOP and BOTTOM to be in bitmap coordinates) (SETQ CY (\SFInvert DestinationBitMap CY)) [SETQ BOTTOM (PROG1 (SUB1 (\SFInvert DestinationBitMap TOP)) (SETQ TOP (SUB1 (\SFInvert DestinationBitMap BOTTOM] (COND ((EQ RADIUS 0) (* put a single point down. Use \LINEBLT to get proper texture. NIL) (\LINEBLT FCBBT CX CY CX DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS) (RETURN))) LP (* (UNFOLD x 2) is used instead of (ITIMES x 2)) [COND [(IGREATERP 0 D) (SETQ X (ADD1 X)) (COND ((IGREATERP (UNFOLD (IPLUS D Y) 2) 1) (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) 2) 4))) (T (SETQ D (IPLUS D (UNFOLD X 2) 1)) (* don't draw unless Y changes.) (GO LP] ((OR (EQ 0 D) (IGREATERP X D)) (SETQ X (ADD1 X)) (SETQ D (IPLUS D (UNFOLD (IDIFFERENCE X Y) 2) 4))) (T (SETQ D (IPLUS (IDIFFERENCE D (UNFOLD Y 2)) 3] (COND ((EQ Y 0) (* draw the middle line differently to avoid duplication.) (\LINEBLT FCBBT (IDIFFERENCE CX X) CY (IPLUS CX X) DESTINATIONBASE RASTERWIDTH LEFT RIGHT BOTTOM TOP GRAYWIDTH GRAYHEIGHT GRAYBASE NBITS)) (T (\FILLCIRCLEBLT CX CY X Y) (SETQ Y (SUB1 Y)) (GO LP))) (MOVETO CENTERX CENTERY C150STREAM) (RETURN NIL]) (\OUTCHARFN.C150 [LAMBDA (C150STREAM CHARCODE) (* hdj "10-Jun-85 15:14") (SELCHARQ CHARCODE (EOL (* New Line) (NEWLINE.C150 C150STREAM) (replace (STREAM CHARPOSITION) of C150STREAM with 0)) (LF (* Line feed--move down, but not over) (\DSPXPOSITION.C150 C150STREAM (PROG1 (\DSPXPOSITION.C150 C150STREAM) (NEWLINE.C150 C150STREAM)))) (^L (* Form Feed) (replace (STREAM CHARPOSITION) of C150STREAM with 0) (NEWPAGE.C150 C150STREAM)) (\BOUT C150STREAM CHARCODE]) (\SEARCHC150FONTFILES [LAMBDA (FAMILY SIZE FACE ROTATION) (* hdj " 5-Jun-85 14:19") (* * returns a list of the fonts that can be read in for the C150 device. Rotation is ignored because it is assumed that all devices support 0 90 and 270) (DECLARE (GLOBALVARS DISPLAYFONTEXTENSIONS DISPLAYFONTDIRECTORIES)) (SELECTQ (SYSTEMTYPE) (D (for E FILENAMEPATTERN FONTSFOUND THISFONT inside DISPLAYFONTEXTENSIONS do (SETQ FILENAMEPATTERN (\FONTFILENAME FAMILY SIZE FACE E)) [for DIR inside DISPLAYFONTDIRECTORIES do (for FONTFILE in (DIRECTORY (PACKFILENAME (QUOTE DIRECTORY) DIR (QUOTE BODY) FILENAMEPATTERN)) do (OR (MEMBER (SETQ THISFONT (\FONTINFOFROMFILENAME FONTFILE (QUOTE DISPLAY ))) FONTSFOUND) (SETQ FONTSFOUND (CONS THISFONT FONTSFOUND] finally (RETURN FONTSFOUND))) (SHOULDNT]) (\STRINGWIDTH.C150 [LAMBDA (C150STREAM STR RDTBL) (* hdj " 5-Jun-85 12:56") (* Returns the width of for the current font/spacefactor in STREAM.) (PROG (WIDTHSBASE) (RETURN (\STRINGWIDTH.GENERIC STR (SETQ WIDTHSBASE (ffetch (\DISPLAYDATA DDWIDTHSCACHE) of (ffetch IMAGEDATA of C150STREAM))) RDTBL (\FGETWIDTH WIDTHSBASE (CHARCODE SPACE]) ) (RPAQQ MISSINGC150FONTCOERCIONS (((GACHA) (MODERN)) ((TIMESROMAN) (MODERN)) ((HELVETICA) (MODERN)))) (RPAQQ \C150COLORTABLE NIL) (RPAQQ \C150.FRAMEBUFFER NIL) (RPAQQ \C150STREAM NIL) (RPAQ C150COLORMAP (READARRAY 16 (QUOTE POINTER) 0)) ((0 0 0) (0 0 255) (0 255 0) (255 0 0) (255 255 0) (255 0 255) (0 255 255) (255 255 255) (0 0 0) (0 0 255) (0 255 0) (255 0 0) (255 255 0) (255 0 255) (0 255 255) (255 255 255) NIL ) (RPAQQ C150FONTCOERCIONS (((CLASSIC 8) (CLASSIC 10)) ((MODERN 8) (MODERN 10)) ((MODERN 24) (MODERN 18)) ((MODERN 18) (CLASSIC 18)) ((CLASSIC 24) (CLASSIC 18)) ((CLASSIC 12) (CLASSIC 14)))) (RPAQQ C150FONTDIRECTORIES ({ERIS}LIBRARY>)) (RPAQQ C150FONTEXTENSIONS (C150FONT)) (RPAQ? C150.CLIPBUFFER T) (RPAQ? \C150DEFAULTDEVICE (QUOTE CENTRONICS)) (DEFINEQ (COLORMAP.TO.C150TABLE [LAMBDA (COLORMAP) (* hdj " 3-Aug-85 21:36") (LET*((SIZE (ARRAYSIZE COLORMAP)) (TABLETABLE (ARRAY 4 (QUOTE POINTER) NIL 0)) (BLACKTABLE (ARRAY SIZE (QUOTE SMALLP) 0 0)) (CYANTABLE (ARRAY SIZE (QUOTE SMALLP) 0 0)) (MAGENTATABLE (ARRAY SIZE (QUOTE SMALLP) 0 0)) (YELLOWTABLE (ARRAY SIZE (QUOTE SMALLP) 0 0))) (bind CYAN MAGENTA YELLOW for PIXELVAL from 0 to (SUB1 SIZE) do [SETQ CYAN (SETA CYANTABLE PIXELVAL (IDIFFERENCE 1 (IQUOTIENT (fetch (RGB RED) of (COLORMAPENTRY COLORMAP PIXELVAL)) 128] [SETQ MAGENTA (SETA MAGENTATABLE PIXELVAL (IDIFFERENCE 1 (IQUOTIENT (fetch (RGB GREEN) of (COLORMAPENTRY COLORMAP PIXELVAL)) 128] [SETQ YELLOW (SETA YELLOWTABLE PIXELVAL (IDIFFERENCE 1 (IQUOTIENT (fetch (RGB BLUE) of (COLORMAPENTRY COLORMAP PIXELVAL )) 128] (if (AND (EQ CYAN 1) (EQ MAGENTA 1) (EQ YELLOW 1)) then (SETA CYANTABLE PIXELVAL 0) (SETA MAGENTATABLE PIXELVAL 0) (SETA YELLOWTABLE PIXELVAL 0) (SETA BLACKTABLE PIXELVAL 1))) (SETA TABLETABLE 0 BLACKTABLE) (SETA TABLETABLE 1 MAGENTATABLE) (SETA TABLETABLE 2 YELLOWTABLE) (SETA TABLETABLE 3 CYANTABLE) TABLETABLE]) ) (FILESLOAD COLOR XXGEOM XXFILL) (IF (NOT (GETD (QUOTE POLYSHADE.BLT))) THEN (* A fix for KOTO, which is not necessary in n>) (MOVD (QUOTE POLYSHADE.DISPLAY) (QUOTE POLYSHADE.BLT))) (DECLARE: DONTEVAL@LOAD DOCOPY (\C150INIT) (FILESLOAD CENTRONICS) ) (DECLARE: EVAL@LOAD DONTCOPY (FILESLOAD (LOADFROM) ADISPLAY LLDISPLAY) ) (DECLARE: EVAL@COMPILE (DEFMACRO \C150BackingStream (C150STREAM) (BQUOTE (fetch (STREAM F1) of , C150STREAM))) ) (PUTPROPS C150STREAM COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (2416 20778 (C150.SEPARATOR 2426 . 2839) (C150.SETMARGINS 2841 . 4574) ( \C150.ALLWHITESPACE 4576 . 6320) (\C150.BUFFER.DOT 6322 . 6553) (\C150.MICROLINEFEED 6555 . 6835) ( \C150.SENDLINE 6837 . 7856) (\C150.SENDLINEINFO 7858 . 8357) (\C150INIT 8359 . 12525) ( \CREATECHARSET.C150 12527 . 20776)) (20779 135286 (CREATEC150BUFFER 20789 . 21931) (NEWLINE.C150 21933 . 22878) (NEWPAGE.C150 22880 . 23386) (OPENC150STREAM 23388 . 26698) (C150.RESET 26700 . 27074) ( SEND.TO.C150 27076 . 27516) (STARTPAGE.C150 27518 . 28241) (\BITBLT.C150 28243 . 39228) (\BLTCHAR.C150 39230 . 46739) (\BLTSHADE.C150 46741 . 54213) (\C150.CRLF 54215 . 54665) (\CHANGECHARSET.C150 54667 . 58079) (\CHARWIDTH.C150 58081 . 58888) (\CLOSEFN.C150 58890 . 59533) (\CREATEC150FONT 59535 . 60463 ) (\READC150FONTFILE 60465 . 61352) (\DRAWCIRCLE.C150 61354 . 70823) (\DRAWCURVE.C150 70825 . 74177) ( \DRAWELLIPSE.C150 74179 . 90084) (\DRAWLINE.C150 90086 . 92331) (\DSPBACKCOLOR.C150 92333 . 93755) ( \DSPCLIPPINGREGION.C150 93757 . 94804) (\DSPCOLOR.C150 94806 . 96147) (\C150.ASSURE.COLOR 96149 . 98725) (\C150.LOOKUPRGB 98727 . 100214) (\DSPFONT.C150 100216 . 103285) (\DSPLEFTMARGIN.C150 103287 . 104410) (\DSPLINEFEED.C150 104412 . 105295) (\DSPOPERATION.C150 105297 . 106757) (\DSPPRINTCHAR.C150 106759 . 109848) (\DSPPRINTCR/LF.C150 109850 . 112967) (\DSPRESET.C150 112969 . 114625) ( \DSPRIGHTMARGIN.C150 114627 . 115995) (\DSPXPOSITION.C150 115997 . 117372) (\DSPYPOSITION.C150 117374 . 118012) (\DUMPPAGEBUFFER.C150 118014 . 121744) (\FILLCIRCLE.C150 121746 . 131735) (\OUTCHARFN.C150 131737 . 132803) (\SEARCHC150FONTFILES 132805 . 134363) (\STRINGWIDTH.C150 134365 . 135284)) (136566 139219 (COLORMAP.TO.C150TABLE 136576 . 139217))))) STOP \ No newline at end of file diff --git a/lispusers/CALENDAR b/lispusers/CALENDAR new file mode 100644 index 00000000..98a5725d --- /dev/null +++ b/lispusers/CALENDAR @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "21-Aug-90 09:16:22" {DSK}/lisp/ice/lyric/CALENDAR.;4 175016 changes to%: (FNS DOREMINDER CIRCLETODAY DAYSIN PRINTMONTH SHOWMOON MDMENUITEMREGION SHOWREMSINMONTH WEEKOF CALLOADFILE) (VARS CALENDARCOMS) previous date%: "21-Feb-90 15:20:05" {DSK}/lisp/ice/lyric/CALENDAR.;2) (* " Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CALENDARCOMS) (RPAQQ CALENDARCOMS ((VARS (CALCIRCLEDAY) (CALCIRCLEMONTH) (CALENDARVERSION "Calendar Version 2.1") CALOPTIONSDESC CALOPTIONSDESCLYRIC (LAFITE.AFTER.GETMAIL.FN 'CALPEEKNEWMAIL)) (INITVARS (CALALERTFLG T) (CALCURBROWSER '(NIL)) (CALCURDAY) (CALDAYBROWSERS) (CALDAYDEFAULTREGION '(32 200 362 100)) (CALDAYSTART 900) (CALDEFAULTALERTDELTA 0) (CALDEFAULTHOST&DIR) (CALDIRTYREMLST NIL) (CALFILELST) (CALFLASHTIMES 0) (CALFLASHTYPE 'None) (CALFONT) (CALHARDCOPYPOMFLG T) (CALHASH (HARRAY 200)) (CALHILITETODAY 'CIRCLE) (CALKEEPEXPIREDREMSFLG) (CALMAINMENU) (CALMONLOCK) (CALMONTHDEFAULTREGION '(32 32 500 400)) (CALMONTHICON) (CALMONTHLST) (CALNEEDSUPDATE) (CALREMCREATEREGION '(400 400 400 300)) (CALREMDISPLAYREGION '(200 400 400 300)) (CALREMINDERS) (CALREMSLOADED) (CALTEDITWINDOW) [CALTUNE '((750 . 20000) (650 . 20000] (CALUPDATEONSHRINKFLG 'Never) (CALWATCHMAILFLG 'TEXT) (CALYEARICON) (PBIGFONT) (PCALFONT) (PLITTLEFONT)) (DECLARE%: EVAL@LOAD EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) TABLEBROWSER)) (FNS CALADDEVENT CALCREATEREM CALDELETEREM CALDISPEVENT CALDOOPTIONS CALENDAR CALENDARWATCHER CALEXTENDSEL CALLOADFILE CALMAKEKEY CALMONTHBEF CALMONTHICONFN CALMONTHRBF CALOPTIONMENU CALPEEKNEWMAIL CALPRINTREM CALREMDEF CALTBCLOSEFN CALTBCOPYFN CALTBNULLFN CALTBSELECTEDFN CALTEDITEXIT CALTEDITSTRING CALUPDATEFILE CALUPDATEINIT CALYEARICONFN CALYEARINRANGE CIRCLETODAY CLEARDAY CLOSEMONTH DAYABBR DAYNAME DAYOF DAYPLUS DAYSIN DERIVENEWDATE DOREMINDER FMNWAYITEM GETREMDEF INVERTGROUP LISPDATEDAY LISPDATEMONTH LISPDATEYEAR MDMENUITEMREGION MENUITEM MENUREGIONITEM MONTHABBR MONTHNAME MONTHNUM MONTHOFDAYPLUS MONTHPLUS MONTHYEARPLUS NEWPARSETIME NEXTMDISPLAYREGION PACKDATE PARSETIME PICKFONTSIZE POM POMDAYS PRINTMONTH REMINDERSOF REMINDERTIME REMINDERTIMELT REMSINMONTH REPAINTMONTH REPAINTYEAR SAMEDAYAS SAMEMONTHAS SCALEBITMAP SHOWDAY SHOWMONTH SHOWMONTHSMALL SHOWMOON SHOWREMSINDAY SHOWREMSINMONTH SHOWYEAR SHRINKMONTH SHRINKYEAR TIMEDREMP TPLUS WEEKOF YNCONVERT) (BITMAPS CALDAYICON CALMONTHICONMAP CALYEARICONMAP FQMAP FMMAP LQMAP NMMAP) (FILES (SYSLOAD FROM VALUEOF DIRECTORIES) FREEMENU TABLEBROWSER))) (RPAQQ CALCIRCLEDAY NIL) (RPAQQ CALCIRCLEMONTH NIL) (RPAQ CALENDARVERSION "Calendar Version 2.1") (RPAQQ CALOPTIONSDESC (((TYPE TITLE LABEL Alert%: FONT (HELVETICA 10 BOLD)) (TYPE NWAY ID CALALERTFLG LABEL Yes MESSAGE "Reminders will alert you when they fire.") (TYPE NWAY ID CALALERTFLG LABEL No MESSAGE "Reminders will not alert you when they fire.")) ((TYPE TITLE LABEL "Keep expired rems.:" FONT (HELVETICA 10 BOLD)) (TYPE NWAY ID CALKEEPEXPIREDREMSFLG LABEL Yes MESSAGE "Expired reminders will not be deleted.") (TYPE NWAY ID CALKEEPEXPIREDREMSFLG LABEL No MESSAGE "Reminders are deleted automatically when they fire.")) ((TYPE TITLE LABEL "Auto. file update:" FONT (HELVETICA 10 BOLD)) (TYPE NWAY ID CALUPDATEONSHRINKFLG LABEL Always MESSAGE "Update after each reminder is created.") (TYPE NWAY ID CALUPDATEONSHRINKFLG LABEL Shrink MESSAGE "Update only when you shrink a month window.") (TYPE NWAY ID CALUPDATEONSHRINKFLG LABEL Never MESSAGE "No automatic updates - use Update in day browser menu.")) ((TYPE EDITSTART LABEL "Alert delta:" ITEMS (CALDEFAULTALERTDELTA) FONT (HELVETICA 10 BOLD) MESSAGE "Default alert time offset in minutes: - for before, + for after.") (TYPE EDIT ID CALDEFAULTALERTDELTA LABEL 0)) ((TYPE EDITSTART LABEL "Host & dir.:" ITEMS (CALDEFAULTHOST&DIR) FONT (HELVETICA 10 BOLD)) (TYPE EDIT ID CALDEFAULTHOST&DIR LABEL "")) ((TYPE MOMENTARY LABEL Apply! FONT (HELVETICA 10 BOLD) SELECTEDFN CALDOOPTIONS MESSAGE "Puts the selected options into effect and closes this window.")) (WINDOWPROPS TITLE "Calendar Options"))) (RPAQQ CALOPTIONSDESCLYRIC ([(GROUP (PROPS ID ALERTGROUP) ((TYPE DISPLAY LABEL "Alert:" FONT (HELVETICA 10 BOLD)) (TYPE NWAY COLLECTION CALALERTFLG LABEL Yes MESSAGE "Reminders will alert you when they fire.") (TYPE NWAY COLLECTION CALALERTFLG LABEL No MESSAGE "Reminders will not alert you when they fire."] [(GROUP (PROPS ID XGROUP) ((TYPE DISPLAY LABEL "Keep expired rems.:" FONT (HELVETICA 10 BOLD)) (TYPE NWAY COLLECTION CALKEEPEXPIREDREMSFLG LABEL Yes MESSAGE "Expired reminders will not be deleted.") (TYPE NWAY COLLECTION CALKEEPEXPIREDREMSFLG LABEL No MESSAGE "Reminders are deleted automatically when they fire."] [(GROUP (PROPS ID UPGROUP) ((TYPE DISPLAY LABEL "Auto. file update:" FONT (HELVETICA 10 BOLD)) (TYPE NWAY COLLECTION CALUPDATEONSHRINKFLG LABEL Always MESSAGE "Update after each reminder is created.") (TYPE NWAY COLLECTION CALUPDATEONSHRINKFLG LABEL Shrink MESSAGE "Update only when you shrink a month window.") (TYPE NWAY COLLECTION CALUPDATEONSHRINKFLG LABEL Never MESSAGE "No automatic updates - use Update in day browser menu." ] ((TYPE EDITSTART LABEL "Alert delta:" ITEMS (CALDEFAULTALERTDELTA) FONT (HELVETICA 10 BOLD) MESSAGE "Default alert time offset in minutes: - for before, + for after." ) (TYPE EDIT ID CALDEFAULTALERTDELTA LABEL 0)) ((TYPE EDITSTART LABEL "Host & dir.:" ITEMS (CALDEFAULTHOST&DIR) FONT (HELVETICA 10 BOLD)) (TYPE EDIT ID CALDEFAULTHOST&DIR LABEL "")) ((TYPE MOMENTARY LABEL Apply! FONT (HELVETICA 10 BOLD) SELECTEDFN CALDOOPTIONS MESSAGE "Puts the selected options into effect and closes this window." )))) (RPAQQ LAFITE.AFTER.GETMAIL.FN CALPEEKNEWMAIL) (RPAQ? CALALERTFLG T) (RPAQ? CALCURBROWSER '(NIL)) (RPAQ? CALCURDAY ) (RPAQ? CALDAYBROWSERS ) (RPAQ? CALDAYDEFAULTREGION '(32 200 362 100)) (RPAQ? CALDAYSTART 900) (RPAQ? CALDEFAULTALERTDELTA 0) (RPAQ? CALDEFAULTHOST&DIR ) (RPAQ? CALDIRTYREMLST NIL) (RPAQ? CALFILELST ) (RPAQ? CALFLASHTIMES 0) (RPAQ? CALFLASHTYPE 'None) (RPAQ? CALFONT ) (RPAQ? CALHARDCOPYPOMFLG T) (RPAQ? CALHASH (HARRAY 200)) (RPAQ? CALHILITETODAY 'CIRCLE) (RPAQ? CALKEEPEXPIREDREMSFLG ) (RPAQ? CALMAINMENU ) (RPAQ? CALMONLOCK ) (RPAQ? CALMONTHDEFAULTREGION '(32 32 500 400)) (RPAQ? CALMONTHICON ) (RPAQ? CALMONTHLST ) (RPAQ? CALNEEDSUPDATE ) (RPAQ? CALREMCREATEREGION '(400 400 400 300)) (RPAQ? CALREMDISPLAYREGION '(200 400 400 300)) (RPAQ? CALREMINDERS ) (RPAQ? CALREMSLOADED ) (RPAQ? CALTEDITWINDOW ) (RPAQ? CALTUNE '((750 . 20000) (650 . 20000))) (RPAQ? CALUPDATEONSHRINKFLG 'Never) (RPAQ? CALWATCHMAILFLG 'TEXT) (RPAQ? CALYEARICON ) (RPAQ? PBIGFONT ) (RPAQ? PCALFONT ) (RPAQ? PLITTLEFONT ) (DECLARE%: EVAL@LOAD EVAL@COMPILE DONTCOPY (FILESLOAD (LOADCOMP) TABLEBROWSER) ) (DEFINEQ (CALADDEVENT [LAMBDA (M D YR W BROWSER INITMSG MSGSTREAM) (* ; "Edited 14-Oct-88 13:25 by MJD") (* MJD " 2-Jul-86 14:10") (PROG (ANS MSGTITLE DATELST REMDATE REMTIME ALERTFLG ALERTTIME PARSEDALERTTIME PARSEDREMTIME AMBIGUOUSTIMEFLG HOUR PMFLG ASTARTPOS TSTARTPOS) (OBTAIN.MONITORLOCK CALMONLOCK) [OR MSGSTREAM (WITH.MONITOR CALMONLOCK (SETQ MSGSTREAM (CALTEDITSTRING INITMSG M D YR)))] (if (NOT MSGSTREAM) then (printout PROMPTWINDOW T "Reminder aborted") (RELEASE.MONITORLOCK CALMONLOCK) (RETURN NIL)) (SETQ ANS (COERCETEXTOBJ MSGSTREAM 'STRINGP)) (if (NOT D) then (* ;; "This is a rem. coming in via mail, so find its date from the rem. text:") [SETQ DATELST (\UNPACKDATE (IDATE (CONCAT (SUBSTRING ANS 7 15) " 12:00:00"] (SETQ D (CADDR DATELST)) (SETQ M (ADD1 (CADR DATELST))) (SETQ YR (CAR DATELST))) (if (NOT (STRPOS (CONCAT (CHARACTER 13) "Event time: ") ANS)) then (printout PROMPTWINDOW T "Error parsing event time: reminder aborted") (RELEASE.MONITORLOCK CALMONLOCK) (RETURN NIL)) (SETQ TSTARTPOS (IPLUS (STRPOS (CONCAT (CHARACTER 13) "Event time: ") ANS) 13)) [SETQ REMTIME (SUBSTRING ANS TSTARTPOS (SUB1 (STRPOS (CHARACTER 13) ANS TSTARTPOS] (if (STRING-EQUAL REMTIME ">>Time<<") then (SETQ REMTIME NIL)) (SETQ REMDATE (PACKDATE (SETQ PARSEDREMTIME (NEWPARSETIME REMTIME)) M D YR)) (if (NOT (STRPOS (CONCAT (CHARACTER 13) "Alert time: ") ANS)) then (printout PROMPTWINDOW T "Error parsing alert time: reminder aborted") (RELEASE.MONITORLOCK CALMONLOCK) (RETURN NIL)) (SETQ ASTARTPOS (IPLUS (STRPOS (CONCAT (CHARACTER 13) "Alert time: ") ANS) 13)) [SETQ ALERTTIME (SUBSTRING ANS ASTARTPOS (SUB1 (STRPOS (CHARACTER 9) ANS ASTARTPOS] (* ;  "Alert time field ends with a TAB") (if (STRING-EQUAL ALERTTIME ">>Time<<") then (SETQ ALERTTIME NIL)) (SETQ PARSEDALERTTIME (NEWPARSETIME ALERTTIME)) (if (NULL PARSEDREMTIME) then (printout PROMPTWINDOW T "Sorry - I couldn't parse that time.") (CALADDEVENT M D YR W BROWSER ANS) (RETURN T) elseif (IGREATERP PARSEDREMTIME 2359) then (SHOULDNT "Illegal time: must be <= 23:59") elseif (AND REMTIME (ILEQ (IDATE REMDATE) (IDATE))) then (printout PROMPTWINDOW T "Warning: you have added a reminder with a time in the past.")) (* ;  "If user gave an alert time w/o an event time, assume event time = alert time.") (if (AND (EQ PARSEDREMTIME 0) (NEQ PARSEDALERTTIME 0)) then (SETQ PARSEDREMTIME PARSEDALERTTIME)) (* ;; "If user didn't give an alert time, but has a default delta, then derive an alert time from that plus the event time.") (if (AND (NEQ CALDEFAULTALERTDELTA 0) (EQ PARSEDALERTTIME 0)) then (SETQ PARSEDALERTTIME (TPLUS PARSEDREMTIME CALDEFAULTALERTDELTA))) (if (NOT (STRPOS (CONCAT (CHARACTER 9) "Alert: ") ANS)) then (printout PROMPTWINDOW T "Error parsing alert option: reminder aborted") (RELEASE.MONITORLOCK CALMONLOCK) (RETURN NIL)) (SETQ ASTARTPOS (IPLUS (STRPOS (CONCAT (CHARACTER 9) "Alert: ") ANS) 8)) [SETQ ALERTFLG (SUBSTRING ANS ASTARTPOS (SUB1 (STRPOS (CHARACTER 13) ANS ASTARTPOS] (SETQ ALERTFLG (COND ((STRING-EQUAL ALERTFLG "Yes") T) ((STRING-EQUAL ALERTFLG "No") NIL) (T CALALERTFLG))) (if (AND (IGREATERP (HARRAYPROP CALHASH 'NUMKEYS) 0) (NOT CALNEEDSUPDATE)) then (SETQ CALREMSLOADED T)) (if AMBIGUOUSTIMEFLG then (SETQ HOUR (QUOTIENT PARSEDREMTIME 100)) [if (IGEQ HOUR 12) then (SETQ PMFLG T) (if (IGEQ HOUR 12) then (SETQ HOUR (IDIFFERENCE HOUR 12] (printout PROMPTWINDOW "Assuming " HOUR ":" |.I2.10.0| (IMOD PARSEDREMTIME 100) (if PMFLG then " p.m." else " a.m.") T)) (* ; " tell user translated time") (RELEASE.MONITORLOCK CALMONLOCK) [SETQ MSGTITLE (SUBSTRING ANS 24 (SUB1 (STRPOS (CONCAT (CHARACTER 13) "Event time") ANS] (* ; "This needs fixing for groups") (if (EQ (WINDOWPROP W 'GROUPEND) '% ) then (WINDOWPROP W 'GROUPEND NIL)) (for RDAY from D to (OR (WINDOWPROP W 'GROUPEND) D) do (CALCREATEREM (LIST MSGTITLE MSGSTREAM) PARSEDREMTIME PARSEDALERTTIME ALERTFLG M RDAY YR BROWSER) (AND W (SHOWREMSINDAY W M RDAY YR))) (SETQ CALNEEDSUPDATE T) (if (NOT CALUPDATEONSHRINKFLG) then (CALUPDATEINIT]) (CALCREATEREM [LAMBDA (MSG REMTIME ALERTTIME ALERTFLG M D YR BROWSER) (* MJD "23-Feb-88 15:53") (* ;;  "MSG is a list of the form (title-string TEdit-stream), REMTIME is a number representing the time") (* ;; "ALERTTIME is either a time if > 0, a Timer if < 0, or not used if = 0 (note that this disallows times of 0000, ie. midnight, and should eventually be fixed). ALERTFLG if NIL means do not fire this reminder.") (* ;; "Timed reminders are stored on the list CALREMINDERS as (timer-object date-string TB-pointer) The message itself is stored in the data field of the browser item.") (* ;; "BROWSER is always supplied, unless the user clicked Middle in the month window to go startight to CALADDEVENT w/o calling Add from a browser menu.") (PROG (R REMDATE ITEM) (SETQ REMDATE (PACKDATE REMTIME M D YR)) (SETQ ITEM (create TABLEITEM)) (SETQ R (LIST (COND ((LESSP ALERTTIME 0) ALERTTIME) ((GREATERP ALERTTIME 0) (SETUPTIMER.DATE (PACKDATE ALERTTIME M D YR))) ((NEQ REMTIME 0) (SETUPTIMER.DATE REMDATE)) (T NIL)) REMDATE ITEM)) (replace TIDATA of ITEM with (APPEND R MSG)) (if BROWSER then (TB.INSERT.ITEM BROWSER ITEM) (if (ILESSP (TB.NUMBER.OF.ITEMS BROWSER 'SELECTED) 1) then (TB.SELECT.ITEM BROWSER ITEM))) [if (AND (NEQ REMTIME 0) ALERTFLG (IGREATERP (IDATE REMDATE) (IDATE))) then (* ;; "It's a timed reminder. If he wants an alert AND this rem. is not in the past (we now allow this for historical purposes), then put it on CALREMINDERS.") (if CALREMINDERS then (MERGE (LIST R) CALREMINDERS T) else (SETQ CALREMINDERS (LIST R] (pushnew CALDIRTYREMLST ITEM) (PUTHASH (CALMAKEKEY M D YR) (SORT (NCONC1 (GETHASH (CALMAKEKEY M D YR) CALHASH) ITEM) 'REMINDERTIMELT) CALHASH]) (CALDELETEREM [LAMBDA (BROWSER ITEM) (* MJD "10-Dec-87 15:44") (* ;; "ITEM can be either a timed list-form reminder (timer-obj date-str TI-pointer) from CALREMINDERS if this is being called by DOREMINDER, or a TABLEITEM if this is being called by the user via the browser menu.") (PROG (M D YR R RTIMESTR DAYBROWSER ITEMKEY) (if BROWSER then (TB.DELETE.ITEM BROWSER ITEM)) (SETQ CALDIRTYREMLST (REMOVE ITEM CALDIRTYREMLST)) (SETQ R (if (EQ (TYPENAME ITEM) 'TABLEITEM) then (if (EQ (TYPENAME (fetch TIDATA of ITEM)) 'TABLEITEM) then (fetch TIDATA of (fetch TIDATA of ITEM)) else (fetch TIDATA of ITEM)) else ITEM)) (SETQ RTIMESTR (CADR R)) (SETQ M (LISPDATEMONTH RTIMESTR)) (SETQ D (LISPDATEDAY RTIMESTR)) (SETQ YR (LISPDATEYEAR RTIMESTR)) (* ;; "See if this rem. has a browser open so it can be marked as deleted. However, if it has an alert time earlier than its event time, leave it be (looks bad to have a rem. crossed out before the event time.)") [if (AND (NOT BROWSER) (LESSP (IDATE RTIMESTR) (IDATE))) then (SETQ DAYBROWSER (for B in CALDAYBROWSERS thereis (AND (EQ D (CADR (TB.USERDATA B))) (EQ M (CAR (TB.USERDATA B))) (EQ YR (CADDR (TB.USERDATA B] [if DAYBROWSER then (TB.DELETE.ITEM DAYBROWSER (CAR (LAST ITEM] (* ;; "If this is a timed rem and it hasn't expired yet, remove it form CALREMINDERS.") (if (AND (TIMEDREMP R) (IGREATERP (IDATE RTIMESTR) (IDATE))) then (SETQ CALREMINDERS (REMOVE [for REM in CALREMINDERS thereis (EQ ITEM (CAR (NTH REM 3] CALREMINDERS))) (* ;; "If this reminder is periodic, its hash key is stored in its 6th slot. If nothing is found there, compute the key the usual way.") (SETQ ITEMKEY (OR (CAR (NTH R 6)) (CALMAKEKEY M D YR))) (* ;  "Now that we have the key, we can remove it from the list of rems. in that day.") (PUTHASH ITEMKEY (REMOVE (CADDR R) (GETHASH ITEMKEY CALHASH)) CALHASH]) (CALDISPEVENT [LAMBDA (ITEM MNAME BUTTON) (* ; "Edited 24-Oct-88 15:58 by MJD") (* ;  "Handles browser menu item selections --- Add, Display, Delete, Update, SendMail, Period.") (PROG (M D YR DLIST W BROWSER CHOICE ITEMKEY RECIPIENTS) (SETQ BROWSER (GETMENUPROP MNAME 'BROWSER)) (SETQ DLIST (TB.USERDATA BROWSER)) (SETQ W (CADDDR DLIST)) (* ; "Browser's wndow.") (SETQ M (CAR DLIST)) (SETQ D (CADR DLIST)) (SETQ YR (CADDR DLIST)) [COND [(EQ (CADR ITEM) 'CALADD) (* ; "Add:") (CALADDEVENT M D YR W (GETMENUPROP MNAME 'BROWSER] ((EQ (CADR ITEM) 'CALDISPLAY) (* ; "Display:") (TB.MAP.SELECTED.ITEMS BROWSER [FUNCTION (LAMBDA (B I) (TEDIT (CAR (NTH (GETREMDEF I) 5)) (CREATEW CALREMDISPLAYREGION "Reminder Display Window") NIL '(QUITFN T LEAVETTY T] 'CALTBNULLFN)) ((EQ (CADR ITEM) 'CALUPDATE) (* ; "Update:") (CALUPDATEINIT) (TB.MAP.DELETED.ITEMS BROWSER [FUNCTION (LAMBDA (B I) (TB.REMOVE.ITEM B I] 'NILL)) ((EQ (CADR ITEM) 'CALMAIL) (* ; "Mail:") (if (EQ (TB.NUMBER.OF.ITEMS BROWSER) 0) then (CALTBNULLFN BROWSER) else (SETQ RECIPIENTS (PROMPTFORWORD (PROGN (TERPRI PROMPTWINDOW) "Send message to: ") NIL NIL PROMPTWINDOW NIL NIL (CHARCODE EOL))) (TB.MAP.SELECTED.ITEMS BROWSER [FUNCTION (LAMBDA (B I) (change (CAR (NTH (GETREMDEF I) 5)) (LIST 'LAFITE.SENDMESSAGE (CONCAT "Subject: A CALENDAR Message" (CHARACTER 13) "To: " RECIPIENTS (CHARACTER 13) (CHARACTER 13) (COERCETEXTOBJ (CAR (NTH (GETREMDEF I) 5)) 'STRINGP] 'CALTBNULLFN) (PRINTOUT PROMPTWINDOW T "The message will be mailed when its time arrives."))) ((EQ (CADR ITEM) 'CALDELETE) (* ; "Delete:") (if (EQ (TB.NUMBER.OF.ITEMS BROWSER) 0) then (CALTBNULLFN BROWSER) else (SETCURSOR WAITINGCURSOR) (TB.MAP.SELECTED.ITEMS BROWSER 'CALDELETEREM 'CALTBNULLFN) (SHOWREMSINDAY W M D YR) (SETQ CALNEEDSUPDATE T) (CURSOR T))) ((EQ (CADR ITEM) 'CALPERIOD) (* ; "Periodic:") (* ;; "When adding new period types here, you must change REMINDERSOF also.") (if (EQ (TB.NUMBER.OF.ITEMS BROWSER) 0) then (CALTBNULLFN BROWSER) else (SETQ CHOICE (MENU (create MENU ITEMS _ '(Daily Weekly Monthly Yearly) TITLE _ "Period:"))) (if (NOT CHOICE) then (PRINTOUT (GETPROMPTWINDOW (TB.WINDOW BROWSER) 1) T "No period set.") (RETURN NIL)) (TB.MAP.SELECTED.ITEMS BROWSER [FUNCTION (LAMBDA (B I) (PROG (DSTR D M YR) (SETQ DSTR (CADR (GETREMDEF I))) (SETQ D (LISPDATEDAY DSTR)) (SETQ M (LISPDATEMONTH DSTR)) (SETQ YR (LISPDATEYEAR DSTR)) (* ;  "First, remove the item from its original slot...") (PUTHASH (CALMAKEKEY M D YR) (REMOVE I (GETHASH (CALMAKEKEY M D YR) CALHASH)) CALHASH) (* ;; "Hash key period codes: 0 = daily; 1-31 = monthly; 32-38 = weekly (32 + day no.); yearly is set by using 1900 for YR (because of the way calmakekey works.") [SETQ ITEMKEY (COND ((EQ CHOICE 'Daily) 0) ((EQ CHOICE 'Weekly) (IPLUS (DAYOF M D YR) 32)) ((EQ CHOICE 'Monthly) D) ((EQ CHOICE 'Yearly) (CALMAKEKEY M D 1900] (* ;  "...and move it to the appropriate periodic slot:") (replace TIDATA of I with (NCONC1 (GETREMDEF I) ITEMKEY)) (* ;; "Note that we save the access key to this item in the rem. itself so that 1. we'll be able to find it if we need to delete it, and 2. when it fires we can tell it's periodic, figure out its next firing time and put it back on CALREMINDERS.") (PUTHASH ITEMKEY (SORT (NCONC1 (GETHASH ITEMKEY CALHASH) I) 'REMINDERTIMELT) CALHASH] 'CALTBNULLFN) (PRINTOUT (GETPROMPTWINDOW (TB.WINDOW BROWSER) 1) T "OK"] (TOTOPW (TB.WINDOW BROWSER]) (CALDOOPTIONS [LAMBDA (ITEM WINDOW BUTTON) (* MJD " 9-Dec-87 10:24") (* ;; " The conversion to Lyric has turned this routine into a disgusting mess, in particular that whole TYPEP clause.") (PROG [VALLIST (OPTLIST (if (EQ MAKESYSNAME 'KOTO) then (FM.READSTATE WINDOW) else (FM.GETSTATE WINDOW] (SETQ VALLIST (CDR OPTLIST)) [for ITEM in OPTLIST by (CDDR OPTLIST) as VAL in VALLIST by (CDDR VALLIST) when (NEQ VAL T) do (SET ITEM (COND ((EQ VAL 'Yes) T) ((EQ VAL 'No) NIL) [(AND (NEQ MAKESYSNAME 'KOTO) (TYPEP VAL 'FREEMENUITEM)) (if (AND (EQ (FM.ITEMPROP VAL 'TYPE) 'NWAY) (NEQ (FM.ITEMPROP VAL 'LABEL) 'Yes) (NEQ (FM.ITEMPROP VAL 'LABEL) 'No)) then (FM.ITEMPROP VAL 'LABEL) else (FM.ITEMPROP VAL 'STATE] (T (MKATOM VAL] (CLOSEW WINDOW) (PRINTOUT PROMPTWINDOW T "OK"]) (CALENDAR [LAMBDA (M D YR) (* MJD " 9-Dec-87 10:21") (* ;  "Top-level entry to the program, and public programming interface.") (* ;;; "If you use any part of Calendar code in your own programs, I would appreciate it if you would include credit to the original author. Thanks.") (pushnew BACKGROUNDFNS 'CALENDARWATCHER) [OR (EQ (TYPENAME CALMONLOCK) 'MONITORLOCK) (SETQ CALMONLOCK (CREATE.MONITORLOCK 'CALLOCKNAME] [if (NOT CALDEFAULTHOST&DIR) then (SETQ CALDEFAULTHOST&DIR (PROMPTFORWORD "Please enter a default host & directory for reminder files:" NIL NIL PROMPTWINDOW NIL NIL (CHARCODE EOL] (COND ((type? MENU CALMAINMENU) (DELETEMENU CALMAINMENU))) (SETQ CALMAINMENU (create MENU ITEMS _ [APPEND (for YR from (IDIFFERENCE (LISPDATEYEAR (DATE)) 1) to (IPLUS (LISPDATEYEAR (DATE)) 3) collect (LIST YR YR "Will make a calendar for this year.")) (LIST '(Other 'OTHER "Lets you choose another year"] TITLE _ "Year" CENTERFLG _ T CHANGEOFFSETFLG _ T WHENSELECTEDFN _ 'SHOWYEAR)) (COND ((NOT CALFONT) (if (AND (NOT M) (NOT D) (NOT YR)) then (printout PROMPTWINDOW T "Looking for font TimesRoman 36 - one moment please ...") (SETCURSOR WAITINGCURSOR)) (SETQ CALFONT (FONTCREATE 'TIMESROMAN 36)) (CURSOR T))) (COND ((AND (NOT M) (NOT D) (NOT YR)) (printout T CALENDARVERSION T) (printout T "See the Prompt Window for Calendar messages." T) (printout PROMPTWINDOW T "Select a year for calendar.") (MENU CALMAINMENU)) [(EQ M 'TODAY) (SHOWDAY (LIST (LISPDATEDAY (DATE)) (LISPDATEMONTH (DATE)) (LISPDATEYEAR (DATE] [(EQ M 'THISMONTH) (SHOWMONTH (LIST NIL (LISPDATEMONTH (DATE)) (LISPDATEYEAR (DATE] [(EQ M 'THISYEAR) (SHOWYEAR (LIST (LISPDATEYEAR (DATE] ((AND (NUMBERP M) (NUMBERP D) (NUMBERP YR)) (SHOWDAY (LIST D M YR))) ((AND (NOT M) (NUMBERP YR)) (SHOWYEAR (LIST YR))) [(NUMBERP M) (SHOWMONTH (LIST NIL M (OR YR (LISPDATEYEAR (DATE] (T NIL]) (CALENDARWATCHER [LAMBDA NIL (* MJD "23-Jun-87 15:53") (if (AND CALREMINDERS (TIMEREXPIRED? (CAAR CALREMINDERS) 'SECONDS)) then (DOREMINDER (CAR CALREMINDERS]) (CALEXTENDSEL [LAMBDA (CALMONTHWINDOW) (* MJD "29-Jan-88 11:06") (* ;  "Changes the length of a day group selection.") (PROG [DEND NEWEND [CALMONTHMENU (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] (CALCURMONTH (WINDOWPROP CALMONTHWINDOW 'MONTH#)) (CALCURYEAR (WINDOWPROP CALMONTHWINDOW 'YEAR#] (while (MOUSESTATE (ONLY RIGHT)) do (SETQ DEND (CAR (MENUREGIONITEM CALMONTHWINDOW CALMONTHMENU))) (if (EQ DEND '% ) then (* ; " He clicked Right in a blank box.") (RETURN (TOTOPW CALMONTHWINDOW))) (OR CALCURDAY (RETURN (TOTOPW CALMONTHWINDOW))) (* ;  "Happens if he clicked right before selecting any day - (SHOWDAY sets CALCURDAY)") (OR DEND (SETQ DEND CALCURDAY)) (INVERTGROUP CALCURMONTH CALCURDAY CALCURYEAR CALCURMONTH DEND CALCURYEAR BLACKSHADE CALMONTHMENU) (SETQ NEWEND (CAR (MENUREGIONITEM CALMONTHWINDOW CALMONTHMENU))) (* ;; " At this point we have to check NEWEND for two possibilities: user wandered into a blank box (which makes it a blank), or out of the menu entirely (which makes it NIL). Either way, skip it.") (if (AND NEWEND (NEQ NEWEND '% ) (ILESSP NEWEND DEND)) then (INVERTGROUP CALCURMONTH NEWEND CALCURYEAR CALCURMONTH DEND CALCURYEAR WHITESHADE CALMONTHMENU) (SETQ DEND NEWEND))) (WINDOWPROP CALMONTHWINDOW 'GROUPEND DEND]) (CALLOADFILE [LAMBDA (F) (* ; "Edited 20-Feb-90 16:13 by MJD") (* ;; "Each reminder on the file has the format:") (* ;; " (timer-value date-string hash-key title-string) [TEdit-text] *start*. Note that the text may be omitted. The file ends in STOP.") (PROG ((*readtable* (FIND-READTABLE "OLD-INTERLISP-T")) (*package* (CL:FIND-PACKAGE "INTERLISP")) (R# 0) (R#SKIP 0) FILE FNAME FILESTREAM TEMPSTREAM RSTREAM R REMLIST ITEM TIMER REMDATE REMSTARTPTR REMENDPTR SAMETITLES TITLE ITEMKEY) (SETCURSOR WAITINGCURSOR) [SETQ FILE (OR F (U-CASE (PROMPTFORWORD "File to load:" NIL NIL PROMPTWINDOW NIL NIL (CHARCODE EOL] (* ;; " First see if he typed in a full file name. If not, make it one, using the value of CALDEFAULTHOST&DIR:") (if (NOT (MEMBER 'HOST (UNPACKFILENAME FILE))) then (SETQ FILE (PACKFILENAME 'NAME FILE 'DIRECTORY CALDEFAULTHOST&DIR))) (* ;; "Now that we have a complete name, see if it's really out there:") (if (NOT (INFILEP FILE)) then (PRINTOUT PROMPTWINDOW T FILE " not found. No reminders loaded.") (CURSOR T) (RETURN NIL)) (if (AND (INFILEP FILE) (GETPROP (CAR (MEMBER FILE CALFILELST)) 'CONTENTS)) then (if (NOT (MOUSECONFIRM (CONCAT FILE " is already loaded. " "Are you sure you want to do this?"))) then (PRINTOUT PROMPTWINDOW T "OK. No reminders loaded.") (CURSOR T) (RETURN NIL))) (SETQ FILESTREAM (OPENSTREAM FILE 'INPUT 'OLD)) (* ;; "Open a stream on it and verify that it's a valid file:") (if (NEQ (CAR (READ FILESTREAM *readtable*)) '$$CALREMINDERS) then (PRINTOUT PROMPTWINDOW T FILE " is not a valid reminders file. No reminders loaded.") (CLOSEF FILESTREAM) (CURSOR T) (RETURN NIL)) (* ;; "Looks OK - let's read it:") (PRINTOUT PROMPTWINDOW T "Loading " FILE "...") (until (EQ (SETQ R (READ FILESTREAM *readtable*)) 'STOP) do (SETQ TIMER (CAR R)) (* ; " eg. -1558614616") (SETQ REMDATE (CADR R)) (* ; " eg. %"12-Oct-87%"") (SETQ ITEMKEY (CADDR R)) (* ; "eg. 29271") (SETQ TITLE (CADDDR R)) (* ; "eg. %"FOO%"") (* SETQ RSTREAM (OPENTEXTSTREAM)) (* ;; "9/28/88: Attempt to fix formatted rem. read-in bug (it's not clear this is all really needed - the old way also seems to work. The only problem may have been just in selecting the right start and end points to copy out of the file):") (SETQ TEMPSTREAM (OPENSTREAM '{NODIRCORE} 'BOTH 'NEW)) (SETQ REMSTARTPTR (GETFILEPTR FILESTREAM)) (SETQ REMENDPTR (FILEPOS (CONCAT (CHARACTER 13) "*start*") FILESTREAM)) (* ;; "Check for Unix-style converted files with LF's instead o CR's:") (OR REMENDPTR (SETQ REMENDPTR (FILEPOS (CONCAT (CHARACTER 10) "*start*") FILESTREAM))) (SETFILEPTR FILESTREAM REMSTARTPTR) (COPYCHARS FILESTREAM TEMPSTREAM (ADD1 REMSTARTPTR) REMENDPTR) (SETFILEPTR TEMPSTREAM 0) (SETQ RSTREAM (OPENTEXTSTREAM TEMPSTREAM)) (* ; " the reminder text stream.") (* TEDIT.INCLUDE (TEXTOBJ RSTREAM)  FILESTREAM (ADD1 REMSTARTPTR)  REMENDPTR) (* ;; "Move past the separator: always skip 8 for the string %"*start*%". If the just-read rem. had no text, it ended with and reading stopped with the first , so we have to skip one more char - that is what the IF tests for.") (SETFILEPTR FILESTREAM (IPLUS (GETFILEPTR FILESTREAM) 8 (if (GREATERP REMENDPTR (ADD1 REMSTARTPTR)) then 0 else 1))) (* ; " Move past the separator.") (* ;; "Only load this rem. if it hasn't been loaded before. Tests are ordered from easy to hard to minimize performance hit. First see if there are already any rems already in this day. If not, this one must be new. Then compare titles. If any matches there, compare message lengths. Note that this still doesn't *guarantee* the rems. are different.") (if (OR (NOT (GETHASH ITEMKEY CALHASH)) (NOT (SETQ SAMETITLES (for ENTRY in (GETHASH ITEMKEY CALHASH) when (STRING-EQUAL TITLE (CAR (NTH (fetch TIDATA of ENTRY) 4))) collect ENTRY))) (NOT (for ENTRY in SAMETITLES when [EQ (NCHARS RSTREAM) (NCHARS (CAR (NTH (fetch TIDATA of ENTRY) 5] collect ENTRY))) then (SETQ ITEM (create TABLEITEM)) (if (AND (ILEQ ITEMKEY 38) (TIMEREXPIRED? TIMER 'SECONDS)) then (* ;; " It's a periodic rem. with an expired timer, so we need to find the next future time it will come up so we can add it to CALREMINDERS.") (SETQ REMDATE (DERIVENEWDATE REMDATE ITEMKEY)) (SETQ TIMER (SETUPTIMER.DATE REMDATE))) (replace TIDATA of ITEM with (LIST TIMER REMDATE ITEM TITLE RSTREAM ITEMKEY)) [if [AND TIMER (NOT (TIMEREXPIRED? TIMER 'SECONDS] then (* ;; "It's a timed reminder. Note that we don't put already expired timers on the list, as might happen when an old file containing timed-keep's is reloaded.") (if CALREMINDERS then (MERGE (LIST (LIST TIMER REMDATE ITEM ITEMKEY)) CALREMINDERS T) else (SETQ CALREMINDERS (LIST (LIST TIMER REMDATE ITEM ITEMKEY] (* ;; " Stuff it into the hash array:") (PUTHASH ITEMKEY (SORT (NCONC1 (GETHASH ITEMKEY CALHASH) ITEM) 'REMINDERTIMELT) CALHASH) (* ;;  " Keep track of the rems. we're making so we can save it at the end:") (SETQ REMLIST (NCONC1 REMLIST ITEM)) (add R# 1) (if (EQ (REMAINDER R# 5) 0) then (PRINTOUT PROMPTWINDOW R# ",")) else (add R#SKIP 1))) (* ;; "Wrap up: First, close the file:") (CLOSEF FILESTREAM) (* ;; "Add the file to the list of known files:") (pushnew CALFILELST (SETQ FNAME (MKATOM FILE))) (* ;; "Save the list of rems. in this file as a prop on the name. You have to do the MEMBER in the case that the user is reloading an already loaded file, where the name isn't at the CAR of the list.") (PUTPROP (CAR (MEMBER FNAME CALFILELST)) 'CONTENTS REMLIST) (SETQ CALREMSLOADED T) (OR (EQ (REMAINDER R# 5) 0) (printout PROMPTWINDOW R# ",")) (PRINTOUT PROMPTWINDOW " done.") (if (GREATERP R#SKIP 0) then (PRINTOUT PROMPTWINDOW " " R#SKIP " duplicate" (if (GREATERP R#SKIP 1) then "s" else "") " skipped.")) (CURSOR T) (RETURN T]) (CALMAKEKEY [LAMBDA (M D YR) (* MJD "20-Nov-86 15:48") (BLOCK) (LOGOR (LLSH M 12) (LLSH D 7) (IDIFFERENCE YR 1900]) (CALMONTHBEF [LAMBDA (CALMONTHWINDOW) (* MJD " 2-Dec-87 12:27") (PROG (CALMONTHSTREAM FILE) (SETQ CALMONTHSTREAM (WINDOWPROP CALMONTHWINDOW 'DSP)) (if [AND (MOUSESTATE MIDDLE) (NOT (INSIDEP (CREATEREGION 0 0 (WINDOWPROP CALMONTHWINDOW 'WIDTH) (WINDOWPROP CALMONTHWINDOW 'HEIGHT)) (LASTMOUSEX CALMONTHSTREAM) (LASTMOUSEY CALMONTHSTREAM] then (SETQ FILE (MENU (create MENU ITEMS _ (APPEND CALFILELST (LIST 'Other)) TITLE _ "Load file:"))) (if (EQ FILE 'Other) then (SETQ FILE (PROMPTFORWORD "File name:" NIL NIL PROMPTWINDOW))) (if FILE then (CALLOADFILE FILE) else (PRINTOUT PROMPTWINDOW T "No file given.")) else (MENUBUTTONFN CALMONTHWINDOW]) (CALMONTHICONFN [LAMBDA (W ICON) (* MJD "17-Jun-87 15:47") (if ICON then [ICONW.TITLE ICON (MONTHNAME (WINDOWPROP W 'MONTH#] ICON else [SETQ CALMONTHICON (create TITLEDICON ICON _ CALMONTHICONMAP TITLEREG _ '(3 51 56 9] (TITLEDICONW CALMONTHICON (MONTHNAME (WINDOWPROP W 'MONTH#)) LITTLEFONT]) (CALMONTHRBF [LAMBDA (CALMONTHWINDOW) (* MJD "17-Nov-87 16:53") (* ;; "User clicked in a month window. If inside menu area with left, pass on to menu. If inside menu area with right, extend a selection. If outside menu area, do standard window menu.") (PROG [(CALMONTHSTREAM (WINDOWPROP CALMONTHWINDOW 'DSP] (if (INSIDEP [MENUREGION (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] (LASTMOUSEX CALMONTHSTREAM) (LASTMOUSEY CALMONTHSTREAM)) then (if (MOUSESTATE LEFT) then (MENUBUTTONFN CALMONTHWINDOW) else (CALEXTENDSEL CALMONTHWINDOW)) else (DOWINDOWCOM CALMONTHWINDOW]) (CALOPTIONMENU [LAMBDA NIL (* ; "Edited 5-Nov-87 16:58 by MJD") (if (EQ MAKESYSNAME 'KOTO) then (SETQ CALOPTIONWINDOW (FM.FORMATMENU CALOPTIONSDESC)) (FM.CHANGELABEL (FM.ITEMFROMID CALOPTIONWINDOW 'CALDEFAULTHOST&DIR) CALOPTIONWINDOW CALDEFAULTHOST&DIR) (FM.CHANGELABEL (FM.ITEMFROMID CALOPTIONWINDOW 'CALDEFAULTALERTDELTA) CALOPTIONWINDOW CALDEFAULTALERTDELTA) (FM.CHANGESTATE (FMNWAYITEM CALOPTIONWINDOW 'CALALERTFLG (YNCONVERT CALALERTFLG)) CALOPTIONWINDOW) (FM.CHANGESTATE (FMNWAYITEM CALOPTIONWINDOW 'CALKEEPEXPIREDREMSFLG (YNCONVERT CALKEEPEXPIREDREMSFLG )) CALOPTIONWINDOW) (FM.CHANGESTATE (FM.ITEMFROMID CALOPTIONWINDOW CALUPDATEONSHRINKFLG) CALOPTIONWINDOW) (MOVEW CALOPTIONWINDOW LASTMOUSEX LASTMOUSEY) (OPENW CALOPTIONWINDOW) else (SETQ CALOPTIONWINDOW (FREEMENU CALOPTIONSDESCLYRIC "Calendar Options")) (FM.CHANGELABEL (FM.GETITEM 'CALDEFAULTHOST&DIR NIL CALOPTIONWINDOW) CALDEFAULTHOST&DIR CALOPTIONWINDOW) (FM.CHANGELABEL (FM.GETITEM 'CALDEFAULTALERTDELTA NIL CALOPTIONWINDOW) CALDEFAULTALERTDELTA CALOPTIONWINDOW) (FM.CHANGESTATE 'CALALERTFLG (FM.GETITEM (YNCONVERT CALALERTFLG) 'ALERTGROUP CALOPTIONWINDOW) CALOPTIONWINDOW) (FM.CHANGESTATE 'CALKEEPEXPIREDREMSFLG (FM.GETITEM (YNCONVERT CALKEEPEXPIREDREMSFLG) 'XGROUP CALOPTIONWINDOW) CALOPTIONWINDOW) (FM.CHANGESTATE 'CALUPDATEONSHRINKFLG (FM.GETITEM CALUPDATEONSHRINKFLG 'UPGROUP CALOPTIONWINDOW) CALOPTIONWINDOW) (MOVEW CALOPTIONWINDOW LASTMOUSEX LASTMOUSEY) (OPENW CALOPTIONWINDOW]) (CALPEEKNEWMAIL [LAMBDA (FOLDER MSGLST) (* ; "Edited 29-Feb-88 16:21 by DENBER") (* ; "This is a LAFITE.AFTER.GETMAIL.FN. It checks your mail for msgs. that start with %"$CALENDAR%" in the subject. These get added to your calendar automatically.") (* ;; "The decls for this is on {Erinyes}Lyric>Internal>Library>LAFITEDECLS.") (PROG (FSTREAM RSTREAM OLDPTR MSTRING MSTARTPOS MSGTEXT (TOT# 0)) (if CALWATCHMAILFLG then (SETQ FSTREAM (fetch FOLDERSTREAM of FOLDER)) (for MSG in MSGLST when (STRING.EQUAL (SUBSTRING (fetch SUBJECT of MSG) 1 9) "$CALENDAR") do (SETQ OLDPTR (GETFILEPTR FSTREAM)) (TEDIT.INCLUDE (TEXTOBJ (SETQ RSTREAM (OPENTEXTSTREAM))) FSTREAM (PROGN (SETFILEPTR FSTREAM (fetch START of MSG)) (IPLUS (FILEPOS (CONCAT (CHARACTER 13) (CHARACTER 13)) FSTREAM) 2)) (fetch END of MSG)) (* ;; "All this stuff is to see if the msg. is a list. If so, see if posting it is allowed before adding it (guards against possible Trojan horses):") (SETQ MSTRING (COERCETEXTOBJ RSTREAM 'STRINGP)) (SETQ MSTARTPOS (IPLUS (OR (STRPOS (CONCAT (CHARACTER 13) "Message: ") MSTRING) -9) 9)) (SETFILEPTR RSTREAM MSTARTPOS) (if (IGREATERP (IDIFFERENCE (NCHARS MSTRING) MSTARTPOS) 1) then (SETQ MSGTEXT (READ RSTREAM))) (if [OR (NOT (LISTP MSGTEXT)) (AND (LISTP MSGTEXT) (EQ CALWATCHMAILFLG 'ANY] then (CALADDEVENT NIL NIL NIL NIL NIL NIL RSTREAM) (add TOT# 1)) (SETFILEPTR FSTREAM OLDPTR)) (if (IGREATERP TOT# 0) then (PLAYTUNE CALTUNE) (PRINTOUT PROMPTWINDOW T TOT# " reminder" (if (EQ TOT# 1) then "" else "s") " posted to Calendar from new mail."]) (CALPRINTREM [LAMBDA (B ITEM STREAM) (* MJD " 7-Oct-87 13:52") (* ;  "Prints reminder in day box of month window. Caller must set x,y position in STREAM first.") (PROG (REMINDER (XOFFSET 0)) (SETQ REMINDER (fetch TIDATA of ITEM)) (if (EQ (TYPENAME REMINDER) 'TABLEITEM) then (SETQ REMINDER (fetch TIDATA of REMINDER))) (if (TIMEDREMP REMINDER) then (PRIN1 (REMINDERTIME REMINDER) STREAM) (SPACES 1 STREAM) (if (NEQ (IMAGESTREAMTYPE STREAM) 'DISPLAY) then (SETQ XOFFSET -10))) (* ;; "This kludge is required because IP streams currently do not support clipping regions (SHOWREMSINMONTH sets the clipping region that limits the line length automatically):") (PRIN1 (if (EQ (IMAGESTREAMTYPE STREAM) 'DISPLAY) then (CALREMDEF REMINDER) else (OR (SUBSTRING (CALREMDEF REMINDER) 1 (IPLUS 26 XOFFSET)) (CALREMDEF REMINDER))) STREAM) (* ;  " The OR above hinges on the fact that SUBSTRING returns NIL if its arg is too big.") (TERPRI STREAM]) (CALREMDEF [LAMBDA (REMINDER) (* MJD " 5-Jun-87 12:48") (* Return reminder message title text.) (CAR (NTH REMINDER 4]) (CALTBCLOSEFN [LAMBDA (BROWSER W TYPE) (* MJD "16-Nov-87 12:50") (* ;  "Before closing a day browser, remove it from the list of active browsers.") (if (EQ TYPE 'CLOSE) then (SETQ CALDAYBROWSERS (REMOVE BROWSER CALDAYBROWSERS))) NIL]) (CALTBCOPYFN [LAMBDA (BROWSER ITEM) (* MJD "23-Feb-88 17:00") (* ;  "Copy a rem. from BROWSER into previously selected browser.") (PROG (DDATE DBROWSER M D YR R REMTIME MSG ALERTTIME ALERTFLG DATELST) (* ;; " CALCURBROWSER is a dotted pair containing (source-browser . dest.-browser). It is set by CALTBSELECTEDFN every time you click in a day browser.") (if (NOT (CDR CALCURBROWSER)) then (PRINTOUT PROMPTWINDOW T "Please select a destination for copy first.") (RETURN NIL) else (SETQ DBROWSER (CDR CALCURBROWSER)) (SETQ DDATE (TB.USERDATA DBROWSER)) (SETQ M (CAR DDATE)) (SETQ D (CADR DDATE)) (SETQ YR (CADDR DDATE)) (SETQ R (fetch TIDATA of ITEM)) (SETQ REMTIME (OR (REMINDERTIME R) 0)) [SETQ MSG (LIST (CALREMDEF R) (CAR (NTH (GETREMDEF (CAR (NTH R 3))) 5] (* ;; "Extract the actual remind-time from the old Timer, so CALCREATEREM will know the time for the new date. \UNPACKDATE returns a list in the form (YR M D HR MIN SEC x x). The PROGN turns the hr and min ints. into a single 24-hr. time integer.") (SETQ ALERTTIME (if (TIMEDREMP R) then [PROGN [SETQ DATELST (\UNPACKDATE (IPLUS (IDATE) (TIME.UNTIL (TIMEDREMP R) 'SECONDS] (IPLUS (ITIMES (CAR (NTH DATELST 4)) 100) (CAR (NTH DATELST 5] else 0)) (SETQ ALERTFLG (TIMEDREMP R)) (CALCREATEREM MSG REMTIME ALERTTIME ALERTFLG M D YR DBROWSER]) (CALTBNULLFN [LAMBDA (BROWSER) (* MJD "22-Jun-87 14:49") (PRINTOUT (GETPROMPTWINDOW (TB.WINDOW BROWSER) 1) T "No reminders selected."]) (CALTBSELECTEDFN [LAMBDA (W) (* MJD "23-Feb-88 13:07") (* ;  "Makes this browser be the source for rem. copies.") (RPLACD CALCURBROWSER (CAR CALCURBROWSER)) (RPLACA CALCURBROWSER (WINDOWPROP W 'TABLEBROWSER]) (CALTEDITEXIT [LAMBDA (ITEM MNAME BUTTON) (* MJD "17-Jun-87 12:38") (COND ((EQ ITEM 'Save) (TEDIT.QUIT (TEXTSTREAM CALTEDITWINDOW))) ((EQ ITEM 'Abort) (TEDIT.QUIT (TEXTSTREAM CALTEDITWINDOW) 'Abort]) (CALTEDITSTRING [LAMBDA (STRING M D YR) (* ; "Edited 14-Oct-88 12:48 by MJD") (* T.Bigham "12-Nov-84 11:03") (* ;; "this may not be needed in Carol. In harmony, this makes tedit put the value into the item editor without the confirmation that always pops up when changes have been made without saving the file.") (PROG ((*readtable* (FIND-READTABLE "INTERLISP")) (*package* (CL:FIND-PACKAGE "INTERLISP")) STREAM) (if (NOT (WINDOWP CALTEDITWINDOW)) then (SETQ CALTEDITWINDOW (CREATEW CALREMCREATEREGION "" NIL T)) (ATTACHMENU (create MENU ITEMS _ '(Save Abort) ITEMWIDTH _ 199 CENTERFLG _ T MENUROWS _ 1 MENUFONT _ (FONTCREATE 'HELVETICA 12 'BOLD) MENUBORDERSIZE _ 1 WHENSELECTEDFN _ 'CALTEDITEXIT) CALTEDITWINDOW 'TOP 'LEFT)) (WINDOWPROP CALTEDITWINDOW 'TITLE (CONCAT "Calendar message editor for " (MKSTRING (MONTHNAME M)) " " D ", " (MKSTRING YR))) (RETURN (EVAL.IN.TTY.PROCESS `(PROGN [SETQ STREAM (OPENTEXTSTREAM (OR %, STRING (CONCAT "Date: " (GDATE (\PACKDATE ,YR (SUB1 ,M) ,D 0 0 0) (DATEFORMAT NO.TIME)) (CHARACTER 13) "Title: >>One line<<" (CHARACTER 13) "Event time: >>Time<<" (CHARACTER 13) "Alert time: >>Time<<" (CHARACTER 9) "Alert: >>Yes No<<" (CHARACTER 13) "Duration: >>hh:mm<<" (CHARACTER 13) "Message: >>Any text<<")) NIL NIL NIL '(QUITFN T] (TEDIT.SETSEL STREAM 24 12 NIL T) (SPAWN.MOUSE) [SETQ RESULT (TEDIT STREAM CALTEDITWINDOW T '(QUITFN T] (IF (EQ RESULT 'Abort) THEN NIL ELSE STREAM)) T]) (CALUPDATEFILE [LAMBDA (FILE) (* ; "Edited 24-Oct-88 16:09 by MJD") (* ;; "Each reminder on the file has the form:") (* ;; " (timer-value date-string hash-key title-string) TEdit-stream *start*.") (* ;; " File updates work like this: The file to be updated will contain all still-valid reminders that were on it when it was loaded (this info. was cached in the hash array under the file name when it was loaded or initally created), plus any new reminders that have not yet been saved (this comes from CALDIRTYREMLST).") (* ;; "9/23/88: A long-standing bug involving a break when reading in TEdit-formatted rems. is hopefully fixed. See the fns. NC.PutTextSubstance and NC.GetTextSubstance in {QV}1.3L>NCTEXTCARD for the model. A change was made to CALLOADFILE for this also. I'm still not sure *what* the problem was. At the moment, the old way seems to be working here - the only change was in CALLOADFILE where we start reading one byte later.") (PROG ((*readtable* (FIND-READTABLE "OLD-INTERLISP-T")) (*package* (CL:FIND-PACKAGE "INTERLISP")) FSTREAM REMSTREAM RDATA REMLIST WRITTENREMS (R# 0)) (OBTAIN.MONITORLOCK CALMONLOCK) (WITH.MONITOR CALMONLOCK [OUTPUT (SETQ FSTREAM (OPENSTREAM FILE 'BOTH 'OLD/NEW] (printout PROMPTWINDOW T "Updating reminder file " FILE "...") (pushnew CALFILELST FILE) (* ;; " A list of all the reminders that were in this file when it was loaded (or NIL if this is a new file to be written):") (SETQ REMLIST (GETPROP (CAR (MEMBER FILE CALFILELST)) 'CONTENTS)) (PRINT (LIST '$$CALREMINDERS CALENDARVERSION) FSTREAM) (* ;; "The hash array contains both lists of items and items in files.") [MAPHASH CALHASH (FUNCTION (LAMBDA (VLIST KEY) (* ;; " This is ugly, but we need the key of each item being written - it's the only way to tell if it's periodic. We sweep through the entire hash array looking for items that are on REMLIST. This test isn't done when creating a new file from scratch. In this case, there are no previously loaded rems., and so REMLIST is NIL.") (SETQ WRITTENREMS (APPEND WRITTENREMS (for VAL in VLIST when (OR (MEMBER VAL REMLIST) (MEMBER VAL CALDIRTYREMLST)) collect (PROGN (SETQ RDATA (fetch TIDATA of VAL)) (* ;; " Now put out the timer (CAR), the date-string (CADR), the hash key (KEY), and the title (CADDDR):") (PRINT (LIST (CAR RDATA) (CADR RDATA) KEY (CADDDR RDATA)) FSTREAM) (* ;; "Finally, write the reminder text:") (if [STREAMP (SETQ REMSTREAM (CAR (LAST (fetch TIDATA of VAL] then (* ;; "Proposed fix for fmt. bug:") (* SETQ STARTPTR (GETFILEPTR FSTREAM)) (* SETQ TEXTLEN (fetch  (TEXTOBJ TEXTLEN) of  (TEXTOBJ REMSTREAM))) (* TEDIT.PUT.PCTB (TEXTOBJ REMSTREAM)  FSTREAM)(* SETFILEPTR FSTREAM  (IDIFFERENCE (SETQ EOFPTR  (GETEOFPTR FSTREAM)) 8)) (* SETQ STARTFORMATPTR  (\DWIN FSTREAM)) (* SETFILEPTR FSTREAM  (IDIFFERENCE EOFPTR 8)) (* \DWOUT FSTREAM (DIFFERENCE  STARTFORMATPTR STARTPTR)) (* ; "Set file ptr to eof:") (* SETFILEPTR FSTREAM -1) (* ;; "Old way:") (COPYCHARS (OPENSTREAM (COERCETEXTOBJ (CAR (LAST (fetch TIDATA of VAL))) 'FILE) 'INPUT) FSTREAM)) (* ;; "and the separator:") (TERPRI FSTREAM) (PRINT '*start* FSTREAM) (add R# 1) (* ;; "User feedback - print N every 5:") (if (EQ (REMAINDER R# 5) 0) then (PRINTOUT PROMPTWINDOW R# ",")) VAL] (* ;; "Wrap-up:") (PRINT 'STOP FSTREAM) (CLOSEF FSTREAM) (SETQ CALDIRTYREMLST NIL) (* ;; "Make sure the entry for this file knows what rems. are on it so that the next Update of it will work right.:") (PUTPROP (CAR (MEMBER FILE CALFILELST)) 'CONTENTS WRITTENREMS) (SETQ CALREMSLOADED T) (OR (EQ (REMAINDER R# 5) 0) (printout PROMPTWINDOW R# ",")) (printout PROMPTWINDOW " done.")) (RELEASE.MONITORLOCK CALMONLOCK]) (CALUPDATEINIT [LAMBDA NIL (* ; "Edited 24-Oct-88 11:31 by MJD") (* ; "Handles file update preliminaries - getting and checking name, adding to known file list, then calls CALUPDATEFILE.") (PROG (FILE) (SETQ FILE (MENU (create MENU ITEMS _ (APPEND CALFILELST (LIST 'Other 'Abort)) TITLE _ "File to update:"))) (if (OR (NOT FILE) (EQ FILE 'Abort)) then (PRINTOUT PROMPTWINDOW T "Update aborted.") (RETURN NIL)) [if (EQ FILE 'Other) then (SETQ FILE (U-CASE (PROMPTFORWORD "File name:" NIL NIL PROMPTWINDOW))) (if (NOT FILE) then (PRINTOUT PROMPTWINDOW T "No file given - update aborted.") (RETURN NIL)) (* ;; " Now see if he typed in a full file name. If not, make it one, using the value of CALDEFAULTHOST&DIR:") (if (NOT (MEMBER 'HOST (UNPACKFILENAME FILE))) then (SETQ FILE (PACKFILENAME 'NAME FILE 'DIRECTORY (OR CALDEFAULTHOST&DIR (SETQ CALDEFAULTHOST&DIR (U-CASE (PROMPTFORWORD "Please enter a host & directory for the reminders file:" NIL NIL PROMPTWINDOW NIL NIL (CHARCODE EOL] (* ;; "Apparently, we were passing a string filename to calupdatefile sometimes. This was causing the putprop there to croak. This should fix that:") (SETQ FILE (MKATOM FILE)) (if (AND (NOT (GETPROP (CAR (MEMBER FILE CALFILELST)) 'CONTENTS)) (INFILEP FILE)) then (* ;; "If there's already a file out there with this name but we can't find it in the hash array, it hasn't been loaded - this could be trouble (typo in name, forgot to load, etc.) so warn user:") (if (MOUSECONFIRM (CONCAT FILE " already exists but hasn't been loaded into this Calendar yet." " Should I overwrite it?")) then (CALUPDATEFILE FILE) else (PRINTOUT PROMPTWINDOW T "File not updated.") (RETURN NIL)) else (* ;; "If the file's not on disk, make sure he really wants to create it:") (if (NOT (INFILEP FILE)) then (if (MOUSECONFIRM (CONCAT "Should I create " FILE "?")) then (CALUPDATEFILE FILE) else (PRINTOUT PROMPTWINDOW T "File not updated.") (RETURN NIL)) else (CALUPDATEFILE FILE) (* ; "_ The normal case.")]) (CALYEARICONFN [LAMBDA (W ICON) (* MJD "22-Jun-87 14:40") (if ICON then [ICONW.TITLE ICON (MONTHNAME (WINDOWPROP W 'YEAR#] ICON else [SETQ CALYEARICON (create TITLEDICON ICON _ CALYEARICONMAP TITLEREG _ '(6 26 50 9] (TITLEDICONW CALYEARICON (WINDOWPROP W 'YEAR#) LITTLEFONT]) (CALYEARINRANGE [LAMBDA (YR) (* MJD " 7-Jan-86 12:33"  "Actual range is 3/1/1700 - 2/28/2100") (AND YR (ILESSP YR 2100) (IGREATERP YR 1700]) (CIRCLETODAY [LAMBDA (CALMONTHWINDOW) (* ; "Edited 16-May-90 15:51 by MJD") (* ;; "Put a circle around today. Only do this if: 1: the current month is this month, 2: the current year is this year (don't want circle around 3/12/87 if it's 3/12/86), and 3: today is different from the day already circled.") (PROG ([CALMONTHMENU (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] (CENTERFACTOR 0.62) RADIUS DAYREGION) (OR CALHILITETODAY (RETURN NIL)) (* ; " Don't if not wanted.") (COND ([AND (NEQ CALCIRCLEDAY (LISPDATEDAY (DATE))) (EQ (WINDOWPROP CALMONTHWINDOW 'MONTH#) (LISPDATEMONTH (DATE))) (EQ (WINDOWPROP CALMONTHWINDOW 'YEAR#) (LISPDATEYEAR (DATE] (TOTOPW CALMONTHWINDOW T) (SETQ DAYREGION (MDMENUITEMREGION CALCIRCLEDAY CALMONTHMENU)) (* ;; "Bug! The following doesn't work for circles on SPARC's:") (DSPOPERATION 'INVERT CALMONTHWINDOW) (* ;; "Can the topfn to avoid loops (drawcircle calls totopw):") (WINDOWPROP CALMONTHWINDOW 'TOTOPFN NIL) (* ; "Erase the old circle, if any") [AND CALCIRCLEDAY (EQ CALCIRCLEMONTH (LISPDATEMONTH (DATE))) (SETQ RADIUS (TIMES (MAXMENUITEMWIDTH CALMONTHMENU) CENTERFACTOR)) (COND ((EQ CALHILITETODAY 'CIRCLE) (DRAWCIRCLE (IPLUS (CAR DAYREGION) RADIUS) (IPLUS (CADR DAYREGION) RADIUS) RADIUS 1 NIL CALMONTHWINDOW)) ((EQ CALHILITETODAY 'BOX) (BITBLT NIL 0 0 CALMONTHWINDOW (CAR DAYREGION) (CADR DAYREGION) (MAXMENUITEMWIDTH CALMONTHMENU) (MAXMENUITEMHEIGHT CALMONTHMENU) 'TEXTURE NIL 32800] (* ;; "Then reset the circle to today, and draw a new circle:") (SETQ CALCIRCLEDAY (LISPDATEDAY (DATE))) (SETQ RADIUS (TIMES (MAXMENUITEMWIDTH CALMONTHMENU) CENTERFACTOR)) (* ; " Figure out the new location:") (SETQ DAYREGION (MDMENUITEMREGION CALCIRCLEDAY CALMONTHMENU)) (COND ((EQ CALHILITETODAY 'CIRCLE) (DRAWCIRCLE (IPLUS (CAR DAYREGION) RADIUS) (IPLUS (CADR DAYREGION) RADIUS) RADIUS 1 NIL CALMONTHWINDOW)) ((EQ CALHILITETODAY 'BOX) (BITBLT NIL 0 0 CALMONTHWINDOW (CAR DAYREGION) (CADR DAYREGION) (PLUS (MAXMENUITEMWIDTH CALMONTHMENU) 4) (PLUS (MAXMENUITEMHEIGHT CALMONTHMENU) 4) 'TEXTURE NIL 32800))) (DSPOPERATION 'REPLACE CALMONTHWINDOW) (WINDOWPROP CALMONTHWINDOW 'TOTOPFN 'CIRCLETODAY) (SETQ CALCIRCLEMONTH (LISPDATEMONTH (DATE]) (CLEARDAY [LAMBDA (D CALMONTHWINDOW CALMONTHMENU) (* MJD "29-Jan-88 12:04") (* ;  "Erase the contents of this day box so it can be rewritten.") (PROG ((DAYREGION (MDMENUITEMREGION D CALMONTHMENU))) (* ;; "Fool CIRCLETODAY into erasing the circle before clearing the box. Then we'll be OK when we redraw the circle. We have to do this since the circle overlaps into the text area and its top part would get lopped off otherwise.") (if (EQ D CALCIRCLEDAY) then (SETQ CALCIRCLEDAY NIL) (CIRCLETODAY CALMONTHWINDOW)) (* ; " Second const. was .08714") (if (IGREATERP (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 100) then (BITBLT NIL NIL NIL CALMONTHWINDOW (CAR DAYREGION) (IPLUS (CADR DAYREGION) (TIMES (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 0.053)) (CADDR DAYREGION) (SUB1 (TIMES (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 0.0868)) 'TEXTURE 'ERASE BLACKSHADE)) (if (EQ D CALCIRCLEDAY) then (SETQ CALCIRCLEDAY NIL) (CIRCLETODAY CALMONTHWINDOW]) (CLOSEMONTH [LAMBDA (W) (* MJD " 1-Dec-87 17:29") (PROG [(M (WINDOWPROP W 'MONTH#)) (YR (WINDOWPROP W 'YEAR#] [AND (NEQ CALUPDATEONSHRINKFLG 'Never) CALNEEDSUPDATE (ADD.PROCESS '(CALUPDATEINIT] (SETQ CALMONTHLST (REMOVE W CALMONTHLST)) (for B in CALDAYBROWSERS when [AND (EQ M (CAR (TB.USERDATA B))) (EQ YR (CADDR (TB.USERDATA B] do (CLOSEW (TB.WINDOW B]) (DAYABBR [LAMBDA (D SCALE) (* MJD " 7-Aug-87 14:15") (if (GEQ SCALE 0.2) then (CAR (NTH '(Sun Mon Tue Wed Thu Fri Sat % ) (ADD1 D))) else (CAR (NTH '(S M T W T F S % ) (ADD1 D]) (DAYNAME [LAMBDA (D) (* MD " 2-Feb-84 17:15") (CAR (NTH '(Sunday Monday Tuesday Wednesday Thursday Friday Saturday % ) (ADD1 D]) (DAYOF [LAMBDA (M D Y) (* MD " 2-Feb-84 15:39") (PROG (N) (SETQ N (FQUOTIENT (IDIFFERENCE (IPLUS [FIX (FTIMES 365.25 (COND ((IGREATERP M 2) Y) (T (SUB1 Y] [FIX (FTIMES 30.6 (COND ((IGREATERP M 2) (ADD1 M)) (T (IPLUS M 13] D) 621049) 7)) (RETURN (FIX (FPLUS (FTIMES (FDIFFERENCE N (FIX N)) 7) 0.5]) (DAYPLUS [LAMBDA (M D YR N) (* MJD " 4-Jan-88 12:02") (if (ILEQ (IPLUS D N) (DAYSIN M YR)) then (IPLUS D N) else (IDIFFERENCE N (IDIFFERENCE (DAYSIN M YR) D]) (DAYSIN [LAMBDA (M Y) (* ; "Edited 2-Jul-90 09:23 by MJD") (* ;  "Returns number of days in month M of year Y.") (COND ((EQ M 2) (* ;; "K&R put it this way: %"...a year is a leap year if it is divisible by 4 but not by 100, except that years divisible by 400 ARE leap years.%"") (COND ((OR (AND (EQ (IREMAINDER Y 4) 0) (NOT (EQ (IREMAINDER Y 100) 0))) (EQ (IREMAINDER Y 400) 0)) 29) (T 28))) (T (CAR (NTH '(31 NIL 31 30 31 30 31 31 30 31 30 31) M]) (DERIVENEWDATE [LAMBDA (DSTRING ITEMKEY) (* MJD " 6-Jan-88 13:35") (* ; "Previous edit by Sybalsky") (* ;; " Takea a date string for some expired periodic reminder and returns a new date representing the next scheduled firing time for the reminder. ITEMKEY is the rem's. hash key. This is used to tell what kind of periodic rem. it is.") (PROG (M D YR DNEW NEWM NEWDATESTR) (SETQ M (LISPDATEMONTH DSTRING)) (SETQ D (LISPDATEDAY DSTRING)) (SETQ YR (LISPDATEYEAR DSTRING)) (* ;; "Start incrementing the day, month, or year, as appropriate until we create some date in the future from now:") (repeatwhile (LESSP (IDATE NEWDATESTR) (IDATE (DATE))) do (COND ((EQ ITEMKEY 0) (* ; "Daily Item") (SETQ DNEW (DAYPLUS M D YR 1)) (SETQ NEWM (MONTHOFDAYPLUS M D YR 1)) (COND ((ILESSP NEWM M) (* ;  "Ran into a new year when we bumped the month: Up the year.") (ADD YR 1))) (SETQ D DNEW) (SETQ M NEWM)) ((ILESSP ITEMKEY 32) (* ; "Monthly Item") (SETQ NEWM (MONTHPLUS M 1)) (COND ((ILESSP NEWM M) (* ;  "Ran into a new year when we bumped the month: Up the year.") (ADD YR 1))) (SETQ M NEWM)) ((GEQ ITEMKEY 32) (* ; "Weekly Item") (SETQ DNEW (DAYPLUS M D YR 7)) (SETQ NEWM (MONTHOFDAYPLUS M D YR 7)) (SETQ D DNEW) (COND ((ILESSP NEWM M) (* ;  "Ran into a new year when we bumped the month: Up the year.") (ADD YR 1))) (SETQ M NEWM))) (SETQ NEWDATESTR (PACKDATE (GDATE (IDATE DSTRING) (DATEFORMAT NO.DATE)) M D YR))) (RETURN NEWDATESTR]) (DOREMINDER [LAMBDA (REM) (* ; "Edited 14-May-90 14:21 by MJD") (PROG ((*readtable* (FIND-READTABLE "OLD-INTERLISP-T")) (*package* (CL:FIND-PACKAGE "INTERLISP")) RSTREAM RDATESTR MSG MSTARTPOS MSGTEXT ITEM ITEMKEY DNEW R NEWTIMER REMDATE) (* ;; "Sometimes a machine boots with no time set, which makes the time be '31-Dec-00' causing all pending reminders to fire at once. This prevents that - until the year 2000, I guess.") (if (LESSP (IDATE) (IDATE "31-Dec-86 00:00")) then (RETURN NIL)) (pop CALREMINDERS) (* ;  "Get rid of it before CALENDARWATCHER sees it again") (* ;; "REM is an instance of what goes on CALREMINDERS, ie. (timer-integer date-string tableitem-obj). The tableitem-obj has the form (timer-integer date-string tableitem-obj title-string text-stream hashkey). Hashkey is present only if this is a periodic reminder (we need it to figure out when the next firing time will be).") (SETQ RSTREAM (CAR (NTH (GETREMDEF (CAR (NTH REM 3))) 5))) (SETQ RDATESTR (CADR REM)) [if (LISTP RSTREAM) then (EVAL RSTREAM) else (SETQ MSG (COERCETEXTOBJ RSTREAM 'STRINGP)) (SETQ MSTARTPOS (IPLUS (OR (STRPOS (CONCAT (CHARACTER 13) "Message: ") MSG) -9) 9)) (SETFILEPTR RSTREAM MSTARTPOS) (* ;;  " This check is to catch rems. whose message is a lone CR (the READ causes a break otherwise):") (if (IGREATERP (IDIFFERENCE (NCHARS MSG) MSTARTPOS) 1) then (SETQ MSGTEXT (READ RSTREAM *readtable*))) (if (LISTP MSGTEXT) then (EVAL MSGTEXT) else (if (STRING-EQUAL (CL:MACHINE-TYPE) "sparc") then (CLOSEF (CREATE-PROCESS-STREAM (CONCAT "cat " CALTUNE "> /dev/audio"))) else (PLAYTUNE CALTUNE)) (if (EQ CALFLASHTYPE 'SCREEN) then (FLASHWINDOW NIL CALFLASHTIMES)) (TEDIT.SETSEL RSTREAM 1 0) (TEDIT.SHOWSEL RSTREAM NIL) (TEDIT RSTREAM (PROG1 (CREATEW CALREMDISPLAYREGION "Reminder Display Window") (if (EQ CALFLASHTYPE 'WINDOW) then (FLASHWINDOW RSTREAM CALFLASHTIMES))) NIL '(QUITFN T LEAVETTY T SEL DON'T] (* ;  "Let's see if this one is periodic:") (SETQ ITEM (CAR (NTH REM 3))) (SETQ ITEMKEY (CAR (NTH (GETREMDEF (CAR (NTH REM 3))) 6))) [if (AND ITEMKEY (ILEQ ITEMKEY 38)) then (* ;  "Yup, so figure out its next scheduled firing time and put it back on CALREMINDERS") (SETQ REMDATE (DERIVENEWDATE RDATESTR ITEMKEY)) (SETQ NEWTIMER (SETUPTIMER.DATE REMDATE)) (SETQ R (LIST NEWTIMER REMDATE ITEM)) (if CALREMINDERS then (MERGE (LIST R) CALREMINDERS T) else (SETQ CALREMINDERS (LIST R] (if (NOT CALKEEPEXPIREDREMSFLG) then (CALDELETEREM NIL REM]) (FMNWAYITEM [LAMBDA (W ID LABEL) (* MJD "22-Jul-87 12:01") (for I in (WINDOWPROP W 'FM.ITEMS) thereis (AND (EQ (FM.ITEMPROP I 'ID) ID) (EQ (FM.ITEMPROP I 'LABEL) LABEL]) (GETREMDEF [LAMBDA (ITEM) (* MJD "21-May-87 16:49") (if (EQ (TYPENAME (fetch TIDATA of ITEM)) 'TABLEITEM) then (fetch TIDATA of (fetch TIDATA of ITEM)) else (fetch TIDATA of ITEM]) (INVERTGROUP [LAMBDA (M1 D1 YR1 M2 D2 YR2 SHADE CALMONTHMENU) (* MJD " 9-Dec-87 10:54") (AND D2 (for D from D1 to D2 do (SHADEITEM (MENUITEM D CALMONTHMENU) CALMONTHMENU SHADE]) (LISPDATEDAY [LAMBDA (LD) (* MJD "10-Jul-86 12:54") (SUBATOM LD (COND ((STREQUAL (SUBSTRING LD 1 1) " ") 2) (T 1)) 2]) (LISPDATEMONTH [LAMBDA (LD) (* MD "14-Feb-84 15:56") (MONTHNUM (SUBATOM LD 4 6]) (LISPDATEYEAR [LAMBDA (LD) (* MJD "24-Jun-87 10:55") (* Returns the year of a date in Lisp date format.  eg.%: "26-Nov-86 15:30:00") (if (EQ (SUBATOM LD 10 10) '% ) then (IPLUS 1900 (SUBATOM LD 8 9)) else (SUBATOM LD 8 11]) (MDMENUITEMREGION [LAMBDA (ITEM MNAME SCALE) (* MJD "12-Feb-86 16:00") (for I in (fetch ITEMS of MNAME) until (EQ ITEM (CAR I)) do NIL finally (RETURN (if SCALE then (for J in (MENUITEMREGION I MNAME) collect (TIMES J SCALE)) else (MENUITEMREGION I MNAME]) (MENUITEM [LAMBDA (ITEM MNAME) (* MJD "25-Jun-86 12:03") (for I in (fetch ITEMS of MNAME) thereis (EQ ITEM (CAR I]) (MENUREGIONITEM [LAMBDA (W MNAME) (* MJD "22-May-87 13:44") (GETMOUSESTATE) (for I in (fetch ITEMS of MNAME) thereis (INSIDEP (MENUITEMREGION I MNAME) (LASTMOUSEX W) (LASTMOUSEY W]) (MONTHABBR [LAMBDA (M) (* MD "15-Feb-84 12:19") (CAR (NTH '(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) M]) (MONTHNAME [LAMBDA (M) (* MJD "28-Jan-88 16:23") (CAR (NTH '(January February March April May June July August September October November December ) M]) (MONTHNUM [LAMBDA (MNAME) (* MD "14-Feb-84 16:01") (LISTGET '(Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep 9 Oct 10 Nov 11 Dec 12) MNAME]) (MONTHOFDAYPLUS [LAMBDA (M D YR N) (* MJD "23-Jun-87 16:27") (if (ILEQ (DAYPLUS M D YR N) D) then (MONTHPLUS M 1) else M]) (MONTHPLUS [LAMBDA (M N) (* MD "19-Oct-84 13:57") (COND ((ILEQ (IPLUS M N) 0) (IPLUS M N 12)) ((AND (EQ M 12) (IGREATERP N 0)) 1) (T (IREMAINDER (IPLUS M N) 13]) (MONTHYEARPLUS [LAMBDA (M YR N) (* MD " 5-Nov-84 14:48") (IPLUS YR (IQUOTIENT (IPLUS M N) 13) (if (ILEQ (IPLUS M N) 0) then -1 else 0]) (NEWPARSETIME [LAMBDA (TSTRING) (* MJD " 9-Dec-87 11:07") (* ;;; " This function converts the string TSTRING into an atom doing all the error checking to insure the time is valid. An a.m. or p.m. specifier is allowed as well as time in the 12 or 24 hour format. If the 12 hour format is allowed then the routine tries to deduce what the user meant. The global variable CALDAYSTART is an atom which represents the time that the user's day starts. Typically CALDAYSTART might be set to 900. The user's day when goes from 9:00 am to 8:59 pm. If TSTRING is 1:00 then this means 1:00 p.m. or 13:00. If TSTRING is 9:00 this translates to 9;00 am. If TSTRING is 8:00 this translates to 8:00 pm or 20:00") (LET* ([TempCleanedString (PACK (LDIFFERENCE (UNPACK TSTRING) '(%. %: - % A P M a p m] (CleanedString (if (AND (NOT (STRPOS "." TSTRING 1)) (NOT (STRPOS ":" TSTRING 1)) (NOT (STRPOS "-" TSTRING 1)) (NUMBERP TempCleanedString) (IGEQ TempCleanedString 0) (ILEQ TempCleanedString 23)) then (* ;; "handle the cases where the user says n meaning n:00") (TIMES TempCleanedString 100) else TempCleanedString)) (TwelveHours 1200) (TwentyFourHours (TIMES 2 TwelveHours)) Start End Time NewTime AMBIGUOUSTIMEFLG) (if (NULL TSTRING) then 0 elseif (NOT (NUMBERP CleanedString)) then NIL else (if (OR (STRPOS "A" TSTRING 1) (STRPOS "a" TSTRING 1)) then (* ;; "am specified") (if (AND (IGEQ CleanedString 0) (ILEQ CleanedString 1200)) then CleanedString else (printout PROMPTWINDOW " - time greater than 12:00 plus am doesn't make sense") NIL) elseif (OR (STRPOS "P" TSTRING 1) (STRPOS "p" TSTRING 1)) then (* ;; "pm specified") (if (AND (IGEQ CleanedString 0) (ILEQ CleanedString 1200)) then (IPLUS CleanedString 1200) elseif (AND (IGREATERP CleanedString 1200) (ILEQ CleanedString 2400)) then CleanedString else (printout PROMPTWINDOW " - time greater than 23:59 doesn't make sense") NIL) elseif (AND (IGREATERP CleanedString 1259) (ILEQ CleanedString 2359)) then (* ;; "In 24 hour mode between 12:59 and 23:59") CleanedString elseif (IGEQ CleanedString 2400) then (* ;; " time greater than 23:59") (printout PROMPTWINDOW " - time greater than 23:59 doesn't make sense") NIL else (* ambiguous time) (SETQ AMBIGUOUSTIMEFLG T) (if (OR (NOT (SMALLP CALDAYSTART)) (ILESSP CALDAYSTART 0) (IGREATERP CALDAYSTART 2359)) then (printout PROMPTWINDOW "- invalid variable CALDAYSTART " CALDAYSTART T) NIL else (SETQ Time CleanedString) (SETQ Start CALDAYSTART) (if (EQ Start TwelveHours) then (* Special case when we are starting  at 12%:00) (SETQ End TwentyFourHours) else (SETQ End (IMOD (IPLUS Start TwelveHours) TwentyFourHours))) (SETQ NewTime (IMOD (IPLUS Time TwelveHours) TwentyFourHours)) (if (GREATERP Start TwelveHours) then (if (OR (IGEQ NewTime Start) (ILESSP NewTime End)) then (* the time is the new time) else (SETQ NewTime Time)) else (if (AND (IGEQ NewTime Start) (ILESSP NewTime End)) then (* the time is the new time) else (SETQ NewTime Time))) NewTime]) (NEXTMDISPLAYREGION [LAMBDA (W H) (* MJD " 2-Dec-87 10:34") (* ; " Handles tiling of month windows given the locaiton of the previous one (in CALMONTHLST) if any. Otherwise use defaults.") (PROG (REG WWIDTH WHEIGHT WXLOC WYLOC) (SETQ REG (if CALMONTHLST then (WINDOWPROP (CAR CALMONTHLST) 'REGION) else CALMONTHDEFAULTREGION)) (* ;; " If the month we're keying off is shrunken, find the position of the window itself, not the icon. If this isn't the case, we've got the xloc in REG:") (SETQ WXLOC (if (AND CALMONTHLST (WINDOWPROP (CAR CALMONTHLST) 'ICONFOR)) then (CAR (WINDOWPROP (WINDOWPROP (CAR CALMONTHLST) 'ICONFOR) 'REGION)) else (CAR REG))) (SETQ WYLOC (if (AND CALMONTHLST (WINDOWPROP (CAR CALMONTHLST) 'ICONFOR)) then (CADR (WINDOWPROP (WINDOWPROP (CAR CALMONTHLST) 'ICONFOR) 'REGION)) else (CADR REG))) (SETQ WWIDTH (CADDR REG)) (SETQ WHEIGHT (CADDDR REG)) (RETURN (LIST (if (AND CALMONTHLST (IGREATERP (IPLUS WXLOC WWIDTH W) SCREENWIDTH)) then (CAR CALMONTHDEFAULTREGION) else (if (AND CALMONTHLST (ILEQ (IPLUS WXLOC WWIDTH W) SCREENWIDTH)) then (IPLUS WXLOC WWIDTH 1) else (CAR CALMONTHDEFAULTREGION))) (if (IGREATERP (IPLUS WXLOC WWIDTH W) SCREENWIDTH) then (if (IGREATERP (IPLUS WYLOC WHEIGHT H) SCREENHEIGHT) then (CADR CALMONTHDEFAULTREGION) else (IPLUS WYLOC WHEIGHT 1)) else WYLOC) W H]) (PACKDATE [LAMBDA (MTIME M D YR) (* MJD "15-May-87 09:38") (* Takes a time, M, D, and YR, and packs them into a formatted date which is  returned.) (* If MTIME = 0, then this is an untimed rem., so store NIL in the time field.) (CONCAT (if (IGEQ D 10) then D else (CONCAT " " D)) "-" (MONTHABBR M) "-" (if (IGREATERP YR 1999) then YR else (IDIFFERENCE YR 1900)) " " (if (EQ MTIME 0) then NIL else MTIME]) (PARSETIME [LAMBDA (TSTRING) (* MJD "22-Oct-85 12:06") (COND ([AND TSTRING (NOT (NUMBERP (PACK (LDIFFERENCE (UNPACK TSTRING) '(%. %: - % A P M a p m] NIL) [TSTRING (IPLUS (ITIMES [PACK (LDIFFERENCE (UNPACK TSTRING) '(%. %: - % A P M a p m] (COND ([OR (AND (NUMBERP (MKATOM TSTRING)) (ILEQ (MKATOM TSTRING) 24)) (AND (NOT (NUMBERP (MKATOM TSTRING))) (NOT (MEMBER '%: (UNPACK TSTRING] 100) (T 1))) (COND ((STRPOS "P" TSTRING 1) 1200) ((STRPOS "p" TSTRING 1) 1200) (T 0] (T 0]) (PICKFONTSIZE [LAMBDA (W H) (* MJD " 4-Jan-88 13:45") (PROG ((KEYSIZE (MIN W H))) (RETURN (COND ((LEQ KEYSIZE 40) 8) ((LEQ KEYSIZE 50) 10) ((LEQ KEYSIZE 60) 12) ((LEQ KEYSIZE 70) 14) ((LEQ KEYSIZE 80) 18) ((LEQ KEYSIZE 90) 24) ((LESSP KEYSIZE 100) 30) (T 36]) (POM [LAMBDA (M D YR) (* MD " 4-Apr-84 13:38") (PROG [GOLDEN CENTURY GREGCORRECTION CLAVCORRECTION EXTRADAYS EPACT SECSFROMNEWTHISYEAR SECSTHISMOON DAYINYEAR (SECSPERMIN 60) SECSPERHR SECSPERDAY SECSPERMOON (MONTHTABLE '(0 31 60 91 121 152 182 213 244 274 305 335 366] (SETQ SECSPERHR (ITIMES SECSPERMIN 60)) (SETQ SECSPERDAY (ITIMES SECSPERHR 24)) (SETQ SECSPERMOON (IPLUS (ITIMES SECSPERDAY 29) (ITIMES SECSPERHR 12) (ITIMES SECSPERMIN 44) 3)) (SETQ GOLDEN (ADD1 (IREMAINDER YR 19))) (SETQ CENTURY (ADD1 (IQUOTIENT YR 100))) (SETQ GREGCORRECTION (IDIFFERENCE (IQUOTIENT (ITIMES 3 CENTURY) 4) 12)) (SETQ CLAVCORRECTION (IQUOTIENT (IDIFFERENCE (IDIFFERENCE CENTURY 16) (IQUOTIENT (IDIFFERENCE CENTURY 18) 25)) 3)) (SETQ EXTRADAYS (IDIFFERENCE (IDIFFERENCE (IQUOTIENT (ITIMES 5 YR) 4) GREGCORRECTION) 10)) (SETQ EPACT (ADD1 (IREMAINDER (IPLUS (ITIMES 11 GOLDEN) 19 CLAVCORRECTION (IMINUS GREGCORRECTION)) 30))) (COND ((OR (AND (EQ EPACT 25) (IGREATERP GOLDEN 11)) (EQ EPACT 24)) (add EPACT 1))) (SETQ DAYINYEAR (IPLUS (CAR (NTH MONTHTABLE M)) D)) [COND ((IGREATERP M 2) (COND ((EQ (IREMAINDER YR 4) 0) (COND [(NEQ (IREMAINDER YR 100) 0) (COND ((EQ (IREMAINDER YR 400) 0) (add DAYINYEAR 1] (T (add DAYINYEAR 1] (SETQ SECSFROMNEWTHISYEAR (IPLUS (ITIMES DAYINYEAR SECSPERDAY) (ITIMES EPACT SECSPERDAY))) (SETQ SECSTHISMOON (IREMAINDER SECSFROMNEWTHISYEAR SECSPERMOON)) (RETURN (IQUOTIENT SECSTHISMOON (IQUOTIENT SECSPERMOON 8]) (POMDAYS [LAMBDA (M YR) (* MJD "13-Mar-86 15:47") (* PLIST is list of phase of each day. Then return list of first days of phases  NM, FQ, Full, LQ in that order.) (* The COND is complicated because the first phase may be split between the  beginning and end of the month. Since we want the first day of the phase  (which might not be the first time it appears on the list) we have to check for  this.) (PROG (PLIST) (SETQ PLIST (for D from 1 to (DAYSIN M YR) collect (POM M D YR))) (RETURN (for D in '(0 2 4 6) collect (COND ((EQ D (CAR PLIST)) (if (EQ D (CAR (LAST PLIST))) then [ADD1 (IDIFFERENCE (DAYSIN M YR) (COUNT (MEMBER (CAR PLIST) (NLEFT PLIST 15] else 1)) (T (ADD1 (IDIFFERENCE (DAYSIN M YR) (COUNT (MEMBER D PLIST]) (PRINTMONTH [LAMBDA (W STREAM) (* ; "Edited 21-Aug-90 09:16 by MJD") (* ;; "Prints a month calendar on paper. Fully cut over for IP printers.") (PROG [CALPRINTSTREAM (M (WINDOWPROP W 'MONTH#)) (YR (WINDOWPROP W 'YEAR#] (SETCURSOR WAITINGCURSOR) (PRINTOUT PROMPTWINDOW T "Formatting for print...") (* ;; "First, bag the stupid portrait stream we got sent (thanks, BVM):") (LET ((RESETSTATE 'ERROR)) (DECLARE (SPECVARS RESETSTATE)) (DELFILE (CLOSEF STREAM))) (* ;; "Now open our own landscape stream:") (* ;; "NIL used to be (PACKFILENAME 'VERSION NIL 'BODY (FULLNAME STREAM)):") [SETQ CALPRINTSTREAM (OPENIMAGESTREAM NIL 'INTERPRESS '(LANDSCAPE T] [OR PBIGFONT (SETQ PBIGFONT (FONTCREATE 'HELVETICA 14 NIL 0 'INTERPRESS] [OR PCALFONT (SETQ PCALFONT (FONTCREATE 'TIMESROMAN 24 NIL 0 'INTERPRESS] [OR PLITTLEFONT (SETQ PLITTLEFONT (FONTCREATE 'HELVETICA 8 NIL 0 'INTERPRESS] (DSPFONT PCALFONT CALPRINTSTREAM) [PROG (X Y CT) (SETQ CT 0) (DSPRESET CALPRINTSTREAM) (MOVETO 9500 20400 CALPRINTSTREAM) (PRIN1 (MONTHNAME M) CALPRINTSTREAM) (PRIN1 " " CALPRINTSTREAM) (* ;  "Leaves room for 3-ring binder hole") (PRIN1 YR CALPRINTSTREAM) (SETQ X 550) (SETQ Y 16700) (for I in (APPEND (for N from 1 to (DAYOF M 1 YR) collect '% ) (for N from 1 to (DAYSIN M YR) collect N)) do (MOVETO X Y CALPRINTSTREAM) (PRIN1 I CALPRINTSTREAM) (* ; "Print day numbers") (add X 3750) (add CT 1) (COND ((EQ (IREMAINDER CT 7) 0) (SETQ X 600) (add Y -3166] (for X from 300 to 26800 by 3750 do (DRAWLINE X 600 X 19600 40 'PAINT CALPRINTSTREAM)) (* ; "Print vertical lines") (DSPFONT PBIGFONT CALPRINTSTREAM) (for X from 800 to 25600 by 3750 as D from 0 to 6 do (MOVETO X 19800 CALPRINTSTREAM) (PRIN1 (DAYNAME D) CALPRINTSTREAM)) (* ; "Print day names") (for Y from 600 to 19600 by 3166 do (DRAWLINE 300 Y 26550 Y 40 'PAINT CALPRINTSTREAM)) (* ; "Print horizontal lines") (if CALHARDCOPYPOMFLG then (SHOWMOON M YR 32.0 (CAR (WINDOWPROP W 'MENU)) CALPRINTSTREAM)) (DSPFONT PLITTLEFONT CALPRINTSTREAM) (SHOWMONTHSMALL (MONTHPLUS M -1) (MONTHYEARPLUS M YR -1) 19300 950 28.0 CALPRINTSTREAM) (SHOWMONTHSMALL (MONTHPLUS M 1) (MONTHYEARPLUS M YR 1) 23100 950 28.0 CALPRINTSTREAM) (SHOWREMSINMONTH M YR 1 W (CAR (WINDOWPROP W 'MENU)) CALPRINTSTREAM) (CLOSEF CALPRINTSTREAM) (PRINTOUT PROMPTWINDOW "done." T) (CURSOR T]) (REMINDERSOF [LAMBDA (M D YR) (* ; "Edited 12-Dec-88 16:37 by MJD") (* ; "Returns all rems. for this day.") (* ;; "This day's reminders are the union of one shot rems. explicitly stored on this day; yearlies, keyed by M and D with YR = 1900; weeklies (in the 32-38 range); monthlies, keyed by D; and dailies, keyed by 0 (always applies).") (* ;; "See CALDISPEVENT for period setup.") (SORT (APPEND (GETHASH (CALMAKEKEY M D YR) CALHASH) (GETHASH (CALMAKEKEY M D 1900) CALHASH) (GETHASH (IPLUS (DAYOF M D YR) 32) CALHASH) (GETHASH D CALHASH) (GETHASH 0 CALHASH)) 'REMINDERTIMELT]) (REMINDERTIME [LAMBDA (R) (* MJD "15-May-87 11:16") (if (CAR R) then (MKATOM (GDATE (IDATE (CADR R)) (DATEFORMAT NO.DATE NO.SECONDS]) (REMINDERTIMELT [LAMBDA (R1 R2) (* ; "Edited 19-Jan-89 15:15 by MJD") (* ;; "Returns T if R1's time is earlier than R2 (the AND clause), or if R2 is untimed (the NOT clause). (That has the effect of putting all the untimed's at the end of the list). R1 and R2 are TABLEITEM's. Their TIDATA is a list of the form (timer# date-string tableitem-obj stream-obj).") (OR (NOT (CAR (fetch TIDATA of R2))) (AND (CAR (fetch TIDATA of R1)) (CAR (fetch TIDATA of R2)) (ILESSP (IDATE (CADR (fetch TIDATA of R1))) (IDATE (CADR (fetch TIDATA of R2]) (REMSINMONTH [LAMBDA (M YR) (* MJD "16-May-86 11:57") (for D to (DAYSIN M YR) collect (REMINDERSOF M D YR]) (REPAINTMONTH [LAMBDA (W REG) (* MJD "28-Jan-88 17:27") (DSPCLIPPINGREGION (CREATEREGION 0 0 (WINDOWPROP W 'WIDTH) (IPLUS (WINDOWPROP W 'HEIGHT) 3)) (WINDOWPROP W 'DSP)) (SHOWMONTH (LIST W (WINDOWPROP W 'MONTH#) (WINDOWPROP W 'YEAR#]) (REPAINTYEAR [LAMBDA (W REG) (* MJD "22-May-87 13:24") (DSPCLIPPINGREGION (CREATEREGION 0 0 (WINDOWPROP W 'WIDTH) (WINDOWPROP W 'HEIGHT)) (WINDOWPROP W 'DSP)) (SHOWYEAR (LIST (WINDOWPROP W 'YEAR#)) NIL NIL W]) (SAMEDAYAS [LAMBDA (LD M D YR) (* MD "12-Oct-84 14:23") (COND ((AND (EQ (LISPDATEDAY LD) D) (EQ (LISPDATEMONTH LD) M) (OR (EQ (LISPDATEYEAR LD) YR) (EQ (LISPDATEYEAR LD) 2034))) T) (T NIL]) (SAMEMONTHAS [LAMBDA (LD M YR) (* MD "10-May-85 10:50") (AND (EQ (LISPDATEMONTH LD) M) (OR (EQ (LISPDATEYEAR LD) YR) (EQ (LISPDATEYEAR LD) 2034]) (SCALEBITMAP [LAMBDA (BITMAP FACTOR) (* PmT "18-Mar-85 14:34") (* SCALES BITMAPS BY AN ARBITRARY AMOUNT OF 2 DECIMAL PLACES.  FACTOR CAN BE OF THE FOLLOWING FORMS%: I  (AN INTEGER REPRESENTING A PERCENTAGE AMOUNT;  E.G. I=67 MEANS REDUCE THE X AND Y AXIS TO 67% OF THEIR ORIGINAL);  R (A REAL; E.G. R=1.3 MEANS INCREASE THE X AND Y AXIS BY A FACTOR OF 1.3);  (IX . IY) (A DOTTED PAIR OF INTEGERS; E.G.  (75 . 125) MEANS REDUCE THE X AXIS TO 75% OF ORIGINAL;  INCREASE Y TO 125% OF ORIGINAL); (RX . RY)  (A DOTTED PAIR OF REALS; E.G. (2.3 . 0.81) MEANS 2.3 TIMES ORIGINAL X AXIS,  0.81 TIMES ORIGINAL Y)) (PROG (XFACTOR YFACTOR DELTAX DELTAY XROUND YROUND BITMAPWIDTH BITMAPHEIGHT HEIGHT-1 RASTERWIDTH BITMAPBASE NEWBITMAP NEWHEIGHT-1 NEWBITMAPBASE NEWRASTERWIDTH ORIGBASE NEWBASE ORIGWORD NEWWORD XSTART YSTART ENDX ENDY ONLINE) (OR (type? BITMAP BITMAP) (\ILLEGAL.ARG BITMAP)) (SETQ BITMAPWIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP)) (SETQ BITMAPHEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) (COND ((NUMBERP FACTOR) (SETQ XFACTOR FACTOR) (SETQ YFACTOR FACTOR)) ((POSITIONP FACTOR) (SETQ XFACTOR (CAR FACTOR)) (SETQ YFACTOR (CDR FACTOR))) (T (\ILLEGAL.ARG FACTOR))) [AND (FLOATP XFACTOR) (SETQ XFACTOR (FIX (FTIMES XFACTOR 100] [AND (FLOATP YFACTOR) (SETQ YFACTOR (FIX (FTIMES YFACTOR 100] (SETQ XFACTOR (IMIN SCREENWIDTH XFACTOR)) (SETQ YFACTOR (IMIN SCREENHEIGHT YFACTOR)) (COND ((ILESSP XFACTOR 101) (SETQ DELTAX 100) (SETQ XROUND (IQUOTIENT XFACTOR 2))) (T (SETQ DELTAX XFACTOR) (SETQ XROUND 50))) (COND ((ILESSP YFACTOR 101) (SETQ DELTAY 100) (SETQ YROUND (IQUOTIENT YFACTOR 2))) (T (SETQ DELTAY YFACTOR) (SETQ YROUND 50))) (SETQ NEWBITMAP (BITMAPCREATE (IQUOTIENT (IPLUS XROUND DELTAX (ITIMES (SUB1 BITMAPWIDTH) XFACTOR)) 100) (IQUOTIENT (IPLUS YROUND DELTAY (ITIMES (SUB1 BITMAPHEIGHT) YFACTOR)) 100) 1)) (* MAKE ALL VALUES QUICKLY AVAILABLE) (SETQ HEIGHT-1 (SUB1 BITMAPHEIGHT)) (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of BITMAP)) (SETQ BITMAPBASE (fetch (BITMAP BITMAPBASE) of BITMAP)) (* AND THE NEW BITMAP VALUES) (SETQ NEWHEIGHT-1 (SUB1 (fetch (BITMAP BITMAPHEIGHT) of NEWBITMAP))) (SETQ NEWRASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of NEWBITMAP)) (SETQ NEWBITMAPBASE (fetch (BITMAP BITMAPBASE) of NEWBITMAP)) (* OK, CRANK IT OUT) (* ORIGWORD AND NEWWORD ARE SORTA  CACHED FOR SPEED PURPOSES) [for Y from 0 to HEIGHT-1 do [SETQ ORIGBASE (\ADDBASE BITMAPBASE (ITIMES RASTERWIDTH (IDIFFERENCE HEIGHT-1 Y] (SETQ ONLINE NIL) [for X from 0 to (SUB1 BITMAPWIDTH) do [AND (ZEROP (IMOD X 16)) (SETQ ORIGWORD (\GETBASE ORIGBASE (LRSH X 4] (* LOOK FOR STRINGS OF "ON" BITS; THEN TREAT AS A LINE FOR TRANSLATIONAL  PURPOSES) (COND [(BITTEST ORIGWORD (\WORDELT BITMASKARRAY (IMOD X 16))) (OR ONLINE (AND (SETQ ONLINE T) (SETQ XSTART X) (SETQ YSTART Y] ((NULL ONLINE) (* JUST SKIP OVER BLANKS) ) (T (* SPELL THIS ALL OUT SO I CAN SEE WHAT'S GOIN' ON HERE) (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR)) 100)) (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR) YROUND DELTAY) 100)) (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR)) 100)) (SETQ ENDX (IQUOTIENT (IPLUS XROUND (ITIMES (SUB1 X) XFACTOR)) 100)) (for NY from YSTART to (SUB1 ENDY) do (SETQ NEWWORD (\GETBASE [SETQ NEWBASE (\ADDBASE NEWBITMAPBASE (ITIMES NEWRASTERWIDTH (IDIFFERENCE NEWHEIGHT-1 NY] (LRSH XSTART 4))) (for NX from XSTART to ENDX do [AND (ZEROP (IMOD NX 16)) (SETQ NEWWORD (\GETBASE NEWBASE (LRSH NX 4] [SETQ NEWWORD (LOGOR NEWWORD (\WORDELT BITMASKARRAY (IMOD NX 16] (AND (ZEROP (IMOD (ADD1 NX) 16)) (\PUTBASE NEWBASE (LRSH NX 4) NEWWORD))) (\PUTBASE NEWBASE (LRSH ENDX 4) NEWWORD)) (SETQ ONLINE NIL] (COND (ONLINE (* GOTTA CLEANUP AFTER THE LAST CASE) (* THIS IN CASE WORKING ON A LINE THAT GOES TO END OF BITMAP) (* GAWD! WHAT A WASTE O SPACE THIS IS. FIX LATER) (SETQ XSTART (IQUOTIENT (IPLUS XROUND (ITIMES XSTART XFACTOR)) 100)) (SETQ ENDY (IQUOTIENT (IPLUS (ITIMES YSTART YFACTOR) YROUND DELTAY) 100)) (SETQ YSTART (IQUOTIENT (IPLUS YROUND (ITIMES YSTART YFACTOR)) 100)) (SETQ ENDX (IQUOTIENT (IPLUS XROUND (ITIMES (SUB1 BITMAPWIDTH) XFACTOR)) 100)) (for NY from YSTART to (SUB1 ENDY) do (SETQ NEWWORD (\GETBASE [SETQ NEWBASE (\ADDBASE NEWBITMAPBASE (ITIMES NEWRASTERWIDTH (IDIFFERENCE NEWHEIGHT-1 NY] (LRSH XSTART 4))) (for NX from XSTART to ENDX do [AND (ZEROP (IMOD NX 16)) (SETQ NEWWORD (\GETBASE NEWBASE (LRSH NX 4] [SETQ NEWWORD (LOGOR NEWWORD (\WORDELT BITMASKARRAY (IMOD NX 16] (AND (ZEROP (IMOD (ADD1 NX) 16)) (\PUTBASE NEWBASE (LRSH NX 4) NEWWORD))) (\PUTBASE NEWBASE (LRSH ENDX 4) NEWWORD] (RETURN NEWBITMAP]) (SHOWDAY [LAMBDA (ITEM MENUNAME BUTTON) (* ; "Edited 19-Jan-89 14:35 by MJD") (* ;; "Handles action for for day-box clicked: bring up browser, show last/next month, show option menu, or do nothing. ITEM format is (day month help-string year '{OPTIONS|NEXT|PREV})") (PROG ((D (CAR ITEM)) (M (CADR ITEM)) (YR (CADDDR ITEM)) [CALMONTHWINDOW (OR (WINDOWP (CAR (LAST ITEM))) (WFROMMENU (OR MENUNAME (CAAR (LAST ITEM] (DFHEIGHT (FONTPROP DEFAULTFONT 'HEIGHT)) DAYBROWSER CALTBITEMS CALDISPMENU CALMONTHMENU CALMONTHSTREAM CALCURMONTH (CALDAYDEFAULTXLOC (CAR CALDAYDEFAULTREGION)) (CALDAYDEFAULTYLOC (CADR CALDAYDEFAULTREGION))) [SETQ CALMONTHMENU (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] [SETQ CALMONTHSTREAM (CAR (WINDOWPROP CALMONTHWINDOW 'STREAM] [SETQ CALCURMONTH (CAR (WINDOWPROP CALMONTHWINDOW 'MONTH#] (COND ((NOT M) (printout PROMPTWINDOW T "Selecting a day in this month with Left will give you a Day Window.") (RETURN NIL)) ((NOT (CALYEARINRANGE YR)) (RETURN NIL)) ((AND (EQ BUTTON 'MIDDLE) (NEQ D '% )) (* ;  "Middle gets you Add, but only if on a numbered day.") (CALADDEVENT M D YR CALMONTHWINDOW)) ((EQ BUTTON 'RIGHT) (GETMOUSESTATE) (if (INSIDEP (CREATEREGION 0 0 (WINDOWPROP CALMONTHWINDOW 'WIDTH) (WINDOWPROP CALMONTHWINDOW 'HEIGHT)) (LASTMOUSEX CALMONTHSTREAM) (LASTMOUSEY CALMONTHSTREAM)) then (CALEXTENDSEL CALMONTHWINDOW) else (DOWINDOWCOM CALMONTHWINDOW)) (RETURN NIL)) ((EQ (CAR (LAST ITEM)) 'OPTIONS) (CALOPTIONMENU) (RETURN NIL)) ((EQ (CAR (LAST ITEM)) 'OUCH) (PRINTOUT PROMPTWINDOW T "Ouch! Stop that!") (RETURN NIL)) ((EQ (CAR (LAST ITEM)) 'PREV) (SHOWMONTH (LIST (if (EQ BUTTON 'LEFT) then CALMONTHWINDOW) (MONTHPLUS M -1) (MONTHYEARPLUS M YR -1))) (RETURN NIL)) ((EQ (CAR (LAST ITEM)) 'NEXT) (SHOWMONTH (LIST (if (EQ BUTTON 'LEFT) then CALMONTHWINDOW) (MONTHPLUS M 1) (MONTHYEARPLUS M YR 1))) (RETURN NIL))) (if [AND BUTTON (NUMBERP (WINDOWPROP CALMONTHWINDOW 'GROUPEND] then (INVERTGROUP M CALCURDAY YR M (WINDOWPROP CALMONTHWINDOW 'GROUPEND) YR WHITESHADE CALMONTHMENU) (WINDOWPROP CALMONTHWINDOW 'GROUPEND NIL)) (if [AND CALMONTHWINDOW (EQ M (WINDOWPROP CALMONTHWINDOW 'MONTH#] then (SHOWREMSINDAY CALMONTHWINDOW M D YR)) (* ;  "Only write in month window if it exists, and is month of this day") (* ;  "You need default locs in case SHOWDAY is called programmatically w/o there being a Month window") [SETQ DAYBROWSER (for B in CALDAYBROWSERS thereis (AND (EQ D (CADR (TB.USERDATA B))) (EQ M (CAR (TB.USERDATA B))) (EQ YR (CADDR (TB.USERDATA B] (if (NOT DAYBROWSER) then [SETQ DAYBROWSER (TB.MAKE.BROWSER NIL (LIST (if CALMONTHMENU then (IDIFFERENCE (CAR (MDMENUITEMREGION D CALMONTHMENU)) (ITIMES (DAYOF M D YR) DFHEIGHT)) else CALDAYDEFAULTXLOC) (IPLUS (if CALMONTHMENU then (CADR (MDMENUITEMREGION D CALMONTHMENU)) else CALDAYDEFAULTYLOC) 180) (CADDR CALDAYDEFAULTREGION) (CADDDR CALDAYDEFAULTREGION)) (LIST 'PRINTFN (FUNCTION CALPRINTREM) 'CLOSEFN (FUNCTION CALTBCLOSEFN) 'COPYFN (FUNCTION CALTBCOPYFN) 'USERDATA (LIST M D YR CALMONTHWINDOW) 'TITLE (CONCAT "Day browser for " (MKSTRING (MONTHNAME M)) " " D ", " (MKSTRING YR] (push CALDAYBROWSERS DAYBROWSER) (SETQ CALTBITEMS (REMINDERSOF M D YR)) (for ITEM in CALTBITEMS do (TB.INSERT.ITEM DAYBROWSER ITEM)) (WINDOWPROP (TB.WINDOW DAYBROWSER) 'TOTOPFN 'CALTBSELECTEDFN) (SETQ CALDISPMENU (create MENU ITEMS _ '((Add CALADD "Add a new message in this day.") (Display CALDISPLAY "Displays the contents of the selected reminder." ) (Delete CALDELETE "The selected messages will be deleted immediately." ) (Update CALUPDATE "Write out all reminder changes to disk file." ) (SendMail CALMAIL "The selected messages will be mailed to the recipients of your choice." ) (Period CALPERIOD "Makes the selected messages periodic." )) MENUROWS _ 1 CENTERFLG _ T WHENSELECTEDFN _ 'CALDISPEVENT)) (PUTMENUPROP CALDISPMENU 'BROWSER DAYBROWSER) (ATTACHMENU CALDISPMENU (TB.WINDOW DAYBROWSER) 'TOP 'LEFT)) (OR (TB.WINDOW DAYBROWSER) (SHOULDNT "Browser window is NIL: please inform author")) (TB.REDISPLAY.ITEMS DAYBROWSER) (AND CALTBITEMS (TB.SELECT.ITEM DAYBROWSER (CAR CALTBITEMS))) (TOTOPW (TB.WINDOW DAYBROWSER)) (RETURN (SETQ CALCURDAY D]) (SHOWMONTH [LAMBDA (ITEM) (* ; "Edited 19-Jan-89 14:36 by MJD") (* ;  "Both displays new and redisplays existing month windows.") (PROG ((CALLTYPE (CAR ITEM)) (M (CADR ITEM)) (YR (CAR (LAST ITEM))) MLOC CALMONTHWINDOW CALMONTHSTREAM CALMONTHMENU TOFFSETX TOFFSETY NMOFFSETX LMOFFSETX LMOFFSETY OOFFSETX OOFFSETY DHEIGHT DOFFSET MOFFSET MWIDTH MHEIGHT FONTUSED TEMP (WWIDTH (CADDR CALMONTHDEFAULTREGION)) (WHEIGHT (CADDDR CALMONTHDEFAULTREGION))) (LET* ((TITLETEXT (CONCAT (MKSTRING (MONTHNAME M)) " " (MKSTRING YR))) (TITLETEXTWITHVERSION (CONCAT TITLETEXT " " CALENDARVERSION))) (if (NOT (CALYEARINRANGE YR)) then (RETURN NIL)) (* ; "Can it be done?") (SETCURSOR WAITINGCURSOR) (SETQ CALMONTHWINDOW (WINDOWP CALLTYPE)) [if (NOT CALMONTHWINDOW) then (* ;; " Magic numbers:") (SETQ MWIDTH (FIX (FQUOTIENT WWIDTH 7.15))) (* ; " Menu item width") (SETQ MHEIGHT (IQUOTIENT WHEIGHT 7)) (* ; " Menu item height") (SETQ MOFFSET (IQUOTIENT WHEIGHT 60)) (* ; " Menu offset w/in window") (SETQ DHEIGHT (FIX (FQUOTIENT WHEIGHT 1.096))) (* ; " Height of day names") (SETQ DOFFSET (FIX (FQUOTIENT WWIDTH 36.1667))) (* ; " Offset in x of day names") (SETQ OOFFSETX (FIX (FQUOTIENT WWIDTH 1.66))) (* ; "Option item offset in x") (SETQ OOFFSETY (FIX (FQUOTIENT WHEIGHT 12.1))) (* ; " Was 12.069") (* ; "Option item offset in y") (SETQ LMOFFSETX (FIX (FQUOTIENT WWIDTH 1.39))) (* ; " Little last mo. x offset") (SETQ LMOFFSETY (FIX (FQUOTIENT WHEIGHT 23.0))) (* ; " Little last mo. y offset") (SETQ NMOFFSETX (FIX (FQUOTIENT WWIDTH 1.165))) (* ; " Little next mo. x offset") (SETQ TOFFSETX (FIX (FQUOTIENT WWIDTH 3.472))) (SETQ TOFFSETY (FIX (FQUOTIENT WHEIGHT 1.045] (* ;; "Do we want to redo an existing month window?") (if CALMONTHWINDOW then (* ;; "Yes, so save the menu and delete it from the window (has the effect of clearing the window. Then the ADDMENU below will redraw the menu items for us.)") [SETQ CALMONTHMENU (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] (* ;;  "CALMONTHMENU could be NIL (eg. if the window being passed in is newly created):") (AND CALMONTHMENU (DELETEMENU CALMONTHMENU NIL CALMONTHWINDOW)) (* ;;  " If this call is due to a window reshape, we'll have to remake the menu anyway.") (if (OR (NEQ (WINDOWPROP CALMONTHWINDOW 'WIDTH) 868) (NEQ (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 700)) then (SETQ CALMONTHMENU NIL)) (* ;; "If this call is from a Next or Prev, the window passed in ITEM is there only to tell us to reuse this window --- it's month# and menu must be changed.") (if (NEQ (WINDOWPROP CALMONTHWINDOW 'MONTH#) M) then (WINDOWPROP CALMONTHWINDOW 'MONTH# M) (WINDOWPROP CALMONTHWINDOW 'YEAR# YR) (SETQ CALMONTHMENU NIL)) (SETQ WWIDTH (WINDOWPROP CALMONTHWINDOW 'WIDTH)) (SETQ WHEIGHT (WINDOWPROP CALMONTHWINDOW 'HEIGHT)) (SETQ MWIDTH (FIX (FQUOTIENT WWIDTH 7.15))) (SETQ MHEIGHT (IQUOTIENT WHEIGHT 7)) (SETQ MOFFSET (SUB1 (IQUOTIENT WHEIGHT 61))) (* ; " Was 60") (SETQ DHEIGHT (FIX (FQUOTIENT WHEIGHT 1.096))) (SETQ DOFFSET (FIX (FQUOTIENT WWIDTH 36.1667))) (SETQ OOFFSETX (FIX (FQUOTIENT WWIDTH 1.66))) [SETQ OOFFSETY (SUB1 (FIX (FQUOTIENT WHEIGHT 15.0] (* ; " WAS 12.069") (SETQ LMOFFSETX (FIX (FQUOTIENT WWIDTH 1.39))) (SETQ LMOFFSETY (FIX (FQUOTIENT WHEIGHT 23.0))) (SETQ NMOFFSETX (FIX (FQUOTIENT WWIDTH 1.165))) (SETQ TOFFSETX (IQUOTIENT [IMAX 1 (DIFFERENCE (WINDOWPROP CALMONTHWINDOW 'WIDTH) (STRINGWIDTH TITLETEXT (WINDOWPROP CALMONTHWINDOW 'DSP] 2)) (* ;; "(setq toffsetx (iquotient (imax 1 (difference (windowprop calmonthwindow 'width) (stringwidth titletext (windowprop calmonthwindow 'dsp)))) 2))") (* SETQ TOFFSETX (FIX  (FQUOTIENT (WINDOWPROP  CALMONTHWINDOW (QUOTE WIDTH)) 3.472))) (SETQ TOFFSETY (FIX (FQUOTIENT WHEIGHT 1.045))) else (SETQ CALMONTHWINDOW (CREATEW (NEXTMDISPLAYREGION (WIDTHIFWINDOW WWIDTH) (HEIGHTIFWINDOW WHEIGHT T)) TITLETEXTWITHVERSION NIL T)) (WINDOWPROP CALMONTHWINDOW 'HARDCOPYFN 'PRINTMONTH) (WINDOWPROP CALMONTHWINDOW 'CLOSEFN 'CLOSEMONTH) (WINDOWPROP CALMONTHWINDOW 'SHRINKFN 'SHRINKMONTH) (WINDOWPROP CALMONTHWINDOW 'ICONFN 'CALMONTHICONFN) (WINDOWPROP CALMONTHWINDOW 'TOTOPFN 'CIRCLETODAY) (WINDOWPROP CALMONTHWINDOW 'RIGHTBUTTONFN 'CALMONTHRBF) (WINDOWPROP CALMONTHWINDOW 'PROCESS (FIND.PROCESS 'BACKGROUND)) (WINDOWPROP CALMONTHWINDOW 'MINSIZE '(77 . 77)) (WINDOWPROP CALMONTHWINDOW 'BORDER 2) (WINDOWPROP CALMONTHWINDOW 'MONTH# M) (WINDOWPROP CALMONTHWINDOW 'YEAR# YR)) (if (ILEQ WWIDTH 100) then (SETQ TEMPFONT (WINDOWTITLEFONT)) (WINDOWTITLEFONT LITTLEFONT)) (SETQ CALMONTHSTREAM (DECODE/WINDOW/OR/DISPLAYSTREAM CALMONTHWINDOW NIL TITLETEXTWITHVERSION)) (WINDOWPROP CALMONTHWINDOW 'TITLE (if (ILESSP (STRINGWIDTH TITLETEXTWITHVERSION DEFAULTFONT) WWIDTH) then TITLETEXTWITHVERSION else TITLETEXT)) (* ; " Month name in title bar.") (CLEARW CALMONTHWINDOW) (WINDOWPROP CALMONTHWINDOW 'GROUPEND NIL) [OR CALMONTHMENU (SETQ CALMONTHMENU (create MENU ITEMS _ [APPEND (for I from 1 to (DAYOF M 1 YR) collect (LIST '% '% "Does nothing.")) (for I from 1 to (DAYSIN M YR) collect (LIST I M "Left opens a day browser; middle adds a reminder" YR)) (for I from 1 to (IDIFFERENCE 38 (IPLUS (DAYOF M 1 YR) (DAYSIN M YR))) collect (LIST '% '% "Does nothing.")) (LIST (LIST '% M " " YR 'OUCH)) (LIST (LIST '% M "Opens a menu for setting options." YR 'OPTIONS)) (LIST (LIST '% M "Left shows last month in this window; middle creates a new window." YR 'PREV)) (LIST (LIST '% M "Left shows next month in this window; middle creates a new window." YR 'NEXT] MENUCOLUMNS _ 7 MENUFONT _ (FONTCREATE 'TIMESROMAN (PICKFONTSIZE MWIDTH MHEIGHT)) ITEMHEIGHT _ (MAX MHEIGHT 10) ITEMWIDTH _ (MAX MWIDTH 10) MENUBORDERSIZE _ (if (GEQ WWIDTH 100) then 1 else 0) MENUOUTLINESIZE _ (if (GEQ WWIDTH 100) then 1 else 0) WHENSELECTEDFN _ 'SHOWDAY] (ADDMENU CALMONTHMENU CALMONTHWINDOW (CONS MOFFSET MOFFSET)) (WINDOWPROP CALMONTHWINDOW 'RESHAPEFN 'REPAINTMONTH) (WINDOWPROP CALMONTHWINDOW 'REPAINTFN 'REPAINTMONTH) (WINDOWPROP CALMONTHWINDOW 'SCROLLFN NIL) (WINDOWPROP CALMONTHWINDOW 'BUTTONEVENTFN 'CALMONTHBEF) (* ;  "WINDOWPROP CALMONTHWINDOW (QUOTE BUTTONEVENTFN) (QUOTE CALMONTHBEF)") (* ;; " Trailing blanks help erase previous name if this mo. is a display in an existing window (but this causes wrap-around problems with small month window sizes):") (* ;; "FIX: Just simply clear the window, as done above. andyiii") (DSPFONT (SETQ FONTUSED (FONTCREATE 'TIMESROMAN (PICKFONTSIZE MWIDTH MHEIGHT))) CALMONTHSTREAM) (SETQ TOFFSETX (IQUOTIENT (IMAX 1 (DIFFERENCE (WINDOWPROP CALMONTHWINDOW 'WIDTH) (STRINGWIDTH TITLETEXT FONTUSED))) 2)) (if (GEQ (IPLUS TOFFSETY 6) (IPLUS DHEIGHT (FONTHEIGHT FONTUSED))) then (* ; " Big month name at top") (MOVETO TOFFSETX TOFFSETY CALMONTHSTREAM) (PRIN3 TITLETEXT CALMONTHSTREAM) (* ;;  "Can't use this 'cause we have to use PRIN3 to fix the %"split text%" bug:") (* CENTERPRINTINREGION TITLETEXT  (CREATEREGION 0 TOFFSETY WWIDTH  (FONTHEIGHT FONTUSED))  CALMONTHSTREAM) ) (* ;; "Pick font for day names across the top:") (DSPFONT (SETQ FONTUSED (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 700) 0.6) then BIGFONT else (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 700) 0.4) then DEFAULTFONT else LITTLEFONT))) CALMONTHWINDOW) (* ;; "(|if| (geq toffsety (iplus dheight (fontheight fontused))) |then| (moveto toffsetx toffsety calmonthstream) (printout calmonthstream titletext))") (if (GEQ WHEIGHT 100) then (for X from MOFFSET to WWIDTH by MWIDTH as D from 0 to 6 do (* ; " Day names across the top:") (MOVETO (IPLUS X DOFFSET) DHEIGHT CALMONTHSTREAM) (PRIN1 (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 868) 0.7) then (DAYNAME D) else (DAYABBR D (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 868))) CALMONTHSTREAM))) (if (GEQ (WINDOWPROP CALMONTHWINDOW 'WIDTH) 175) then (SHOWMOON M YR 1 CALMONTHMENU CALMONTHWINDOW)) (* ; "Phases of moon") (DSPFONT (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 700) 0.6) then DEFAULTFONT else LITTLEFONT) CALMONTHWINDOW) (MOVETO OOFFSETX OOFFSETY CALMONTHSTREAM) (PRINTOUT CALMONTHSTREAM (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 868) 0.6) then "Options" else (if (GEQ (FQUOTIENT (WINDOWPROP CALMONTHWINDOW 'WIDTH) 868) 0.2) then "Opt" else "O"))) (DSPFONT LITTLEFONT CALMONTHWINDOW) (if (GEQ WHEIGHT 150) then (SHOWREMSINMONTH M YR 1 CALMONTHWINDOW CALMONTHMENU CALMONTHSTREAM)) [for DELTA in '(-1 1) as MOFFSETX in (LIST LMOFFSETX NMOFFSETX) do (* ; "Little last month") (if (GEQ (FQUOTIENT WHEIGHT 700) 0.9) then (SHOWMONTHSMALL (MONTHPLUS M DELTA) (MONTHYEARPLUS M YR DELTA) MOFFSETX LMOFFSETY 1 CALMONTHWINDOW) else (MOVETO MOFFSETX OOFFSETY CALMONTHSTREAM) (PRINTOUT CALMONTHSTREAM (SUBSTRING (MONTHNAME (MONTHPLUS M DELTA)) [SETQ TEMP (STRPOSL '(J F M A S O N D) (MONTHNAME (MONTHPLUS M DELTA] (if (GEQ (FQUOTIENT WWIDTH 868) 0.6) then NIL else (if (GEQ (FQUOTIENT WWIDTH 868) 0.2) then (IPLUS TEMP 2) else (IPLUS TEMP 0] (* ; "Little next month") (DSPFONT (FONTCREATE 'TIMESROMAN (PICKFONTSIZE MWIDTH MHEIGHT)) CALMONTHWINDOW) (SETQ CALCIRCLEDAY NIL) (CIRCLETODAY CALMONTHWINDOW) (pushnew CALMONTHLST CALMONTHWINDOW) (if (ILEQ WWIDTH 100) then (WINDOWTITLEFONT TEMPFONT)) (CURSOR T) (RETURN M]) (SHOWMONTHSMALL [LAMBDA (M YR XLOC YLOC SCALE WINDOW) (* MJD " 2-Feb-88 13:09") (PROG [(CT 0) (X XLOC) (Y (IPLUS YLOC (TIMES 48 SCALE] (MOVETO (IPLUS X (TIMES SCALE 24)) (IPLUS Y (TIMES SCALE 12)) WINDOW) (PRIN1 (if (OR (NEQ (IMAGESTREAMTYPE WINDOW) 'DISPLAY) (GEQ (WINDOWPROP WINDOW 'WIDTH) 280)) then (MONTHNAME M) else (MONTHABBR M)) WINDOW) (for I in (APPEND (for N from 1 to (DAYOF M 1 YR) collect '% ) (for N from 1 to (DAYSIN M YR) collect N)) do (MOVETO X Y WINDOW) (PRIN1 I WINDOW) (add X (TIMES SCALE 16)) (add CT 1) (COND ((EQ (IREMAINDER CT 7) 0) (SETQ X XLOC) (add Y (TIMES SCALE -10]) (SHOWMOON [LAMBDA (M YR SCALE CALMONTHMENU STREAM) (* ; "Edited 20-Aug-90 15:39 by MJD") (* ; " SCALE here is 1 for screen res. Other than that, it's obsolete - should be removed. Currently only supports IP for hardcopy.") (* ;; "The month window is 23550 x 18996 in 300 spi. landscape printer coordinates. Each day is 3750 x 3166. The origin is a 600,300. (The printer clause contains magic numbers that should be parameterized - sometime.)") (* ;; "Show each moon making sure they have the proper sense (depends on backgorund color).") (for P in (POMDAYS M YR) as PMAP in (if (AND (EQ (IMAGESTREAMTYPE STREAM) 'DISPLAY) (VIDEOCOLOR)) then '(NMMAP FQMAP FMMAP LQMAP) else '(FMMAP LQMAP NMMAP FQMAP)) do (if (EQ (IMAGESTREAMTYPE STREAM) 'INTERPRESS) then (* ;; "Print on paper: the first factor in the PLUS corrects for window offset on the page; the second factor adjusts position within the day box.") (\MOVETO.IP STREAM (PLUS (TIMES (DAYOF M P YR) 3750) 600 1500) (PLUS (TIMES (IDIFFERENCE 5 (WEEKOF M P YR)) 3166) 300 500)) (SHOWBITMAP.IP STREAM (EVAL PMAP) NIL 0.5) (* ; "Thanks, Dinh!") else (* ;; "Write to display:") (BITBLT (if (GEQ (MIN (WINDOWPROP STREAM 'WIDTH) (WINDOWPROP STREAM 'HEIGHT)) 600) then (EVAL PMAP) else (SCALEBITMAP (EVAL PMAP) (FQUOTIENT (MIN (WINDOWPROP STREAM 'WIDTH) (WINDOWPROP STREAM 'HEIGHT)) 900))) NIL NIL STREAM (IPLUS (CAR (MDMENUITEMREGION P CALMONTHMENU SCALE)) (FQUOTIENT (WINDOWPROP STREAM 'WIDTH) 16.6)) (IPLUS (CADR (MDMENUITEMREGION P CALMONTHMENU SCALE)) (FQUOTIENT (WINDOWPROP STREAM 'HEIGHT) 350.0)) 34 34 'INPUT 'INVERT]) (SHOWREMSINDAY [LAMBDA (CALMONTHWINDOW M D YR) (* MJD "10-Aug-87 13:35") (* ;; "This code is similar to SHOWREMSINMONTH except that it is optimized for picking out the reminders for only one particular day, rather than all reminders in a month. Changes here may need to be done to SHOWREMSINMONTH also.") (PROG [(CALMONTHSTREAM (WINDOWPROP CALMONTHWINDOW 'DSP)) [CALMONTHMENU (CAR (WINDOWPROP CALMONTHWINDOW 'MENU] (NREMS (FIX (TIMES (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 0.01] (CLEARDAY D CALMONTHWINDOW CALMONTHMENU) (DSPFONT LITTLEFONT CALMONTHWINDOW) (MOVETOUPPERLEFT CALMONTHSTREAM (MDMENUITEMREGION D CALMONTHMENU)) (DSPYPOSITION (IDIFFERENCE (DSPYPOSITION NIL CALMONTHSTREAM) 2) CALMONTHSTREAM) (SETQ DAYREGION (MDMENUITEMREGION D CALMONTHMENU)) (DSPCLIPPINGREGION DAYREGION CALMONTHSTREAM) (for REMINDER in (REMINDERSOF M D YR) as I to NREMS do (DSPXPOSITION (CAR (MDMENUITEMREGION D CALMONTHMENU)) CALMONTHSTREAM) (CALPRINTREM NIL REMINDER CALMONTHSTREAM)) (DSPCLIPPINGREGION (CREATEREGION 0 0 (WINDOWPROP CALMONTHWINDOW 'WIDTH) (WINDOWPROP CALMONTHWINDOW 'HEIGHT)) CALMONTHSTREAM]) (SHOWREMSINMONTH [LAMBDA (M YR SCALE CALMONTHWINDOW CALMONTHMENU STREAM)(* ; "Edited 20-Aug-90 16:05 by MJD") (* ;; "Handles printing of all reminders in a month both for screen and on paper. Changes here may need to be done to SHOWREMSINDAY also.") (* ;; "SCALE is now obsolete (8/20/90).") (PROG [D REMLIST DAYREGION NREMS (TOSCREEN (EQ (IMAGESTREAMTYPE STREAM) 'DISPLAY] (SETQ REMLIST (REMSINMONTH M YR)) (* ;; "Set the max. number of rems. to show in each day:") (SETQ NREMS (if TOSCREEN then (FIX (TIMES (WINDOWPROP CALMONTHWINDOW 'HEIGHT) 0.01)) else 8)) (for REMINDER in REMLIST as D to (DAYSIN M YR) when REMINDER do (SETQ DAYREGION (if TOSCREEN then (MDMENUITEMREGION D CALMONTHMENU SCALE) else (LIST (PLUS (TIMES (DAYOF M D YR) 3750) 600) (PLUS (TIMES (IDIFFERENCE 5 (WEEKOF M D YR)) 3166) 300) 3750 3166))) (MOVETOUPPERLEFT STREAM DAYREGION) (* ;; "Provide a little clearance off the top edge:") (DSPYPOSITION (IDIFFERENCE (DSPYPOSITION NIL STREAM) 2) STREAM) (DSPCLIPPINGREGION DAYREGION STREAM) (for R in REMINDER as I to NREMS do (DSPXPOSITION (CAR DAYREGION) STREAM) (CALPRINTREM NIL R STREAM))) (if TOSCREEN then (DSPCLIPPINGREGION (CREATEREGION 0 0 (WINDOWPROP CALMONTHWINDOW 'WIDTH) (WINDOWPROP CALMONTHWINDOW 'HEIGHT)) STREAM]) (SHOWYEAR [LAMBDA (ITEM MNAME BUTTON CALYEARWINDOW) (* MJD "22-Jan-88 16:52") (PROG ((YR (CAR ITEM)) (CALLTYPE (LENGTH ITEM)) (MHEIGHT 70) MLOC CALYEARSTREAM CALYEARMENU) [if (EQ YR 'Other) then (TERPRI PROMPTWINDOW) (SETQ YR (MKATOM (PROMPTFORWORD "Year: " NIL NIL PROMPTWINDOW NIL NIL (CHARCODE EOL] (COND [(CALYEARINRANGE YR) (if CALYEARWINDOW then (CLEARW CALYEARWINDOW) else [SETQ CALYEARWINDOW (CREATEW (if (NEQ CALLTYPE 1) then (PROGN (SETQ MLOC (GETBOXPOSITION 364 324 NIL NIL NIL "Please position the Year Window.")) (create REGION LEFT _ (CAR MLOC) BOTTOM _ (CDR MLOC) WIDTH _ 364 HEIGHT _ 324)) else '(32 400 364 324)) (CONCAT CALENDARVERSION " " (MKSTRING YR] [SETQ CALYEARSTREAM (DECODE/WINDOW/OR/DISPLAYSTREAM CALYEARWINDOW NIL (CONCAT CALENDARVERSION " " (MKSTRING YR] (WINDOWPROP CALYEARWINDOW 'ICON CALYEARICON) (WINDOWPROP CALYEARWINDOW 'ICONFN 'CALYEARICONFN) (WINDOWPROP CALYEARWINDOW 'YEAR# YR) (ATTACHMENU CALMAINMENU CALYEARWINDOW 'RIGHT 'TOP)) (SETQ CALYEARMENU (create MENU ITEMS _ (for I from 1 to 12 collect (LIST '% I YR)) MENUCOLUMNS _ 3 ITEMHEIGHT _ (IPLUS MHEIGHT 2) ITEMWIDTH _ 118 WHENSELECTEDFN _ 'SHOWMONTH)) (ADDMENU CALYEARMENU CALYEARWINDOW '(0 . 0)) (WINDOWPROP CALYEARWINDOW 'RESHAPEFN 'DON'T) (WINDOWPROP CALYEARWINDOW 'REPAINTFN 'REPAINTYEAR) (WINDOWPROP CALYEARWINDOW 'SCROLLFN NIL) (DSPFONT DEFAULTFONT CALYEARWINDOW) (MOVETO 157 294 CALYEARSTREAM) (PRIN1 YR CALYEARSTREAM) (DSPFONT LITTLEFONT CALYEARWINDOW) (for Y from 0 to 3 do (for X from 0 to 2 do (SHOWMONTHSMALL (IPLUS (ADD1 X) (ITIMES Y 3)) YR (IPLUS (ITIMES X 120) 4) (IPLUS (ITIMES (IDIFFERENCE 3 Y) MHEIGHT) 8) 1 CALYEARWINDOW] (T (printout PROMPTWINDOW T "Sorry - I can only handle years between 1700 and 2100."]) (SHRINKMONTH [LAMBDA (X) (* MJD "20-Jul-87 14:10") [AND (EQ CALUPDATEONSHRINKFLG 'Shrink) CALNEEDSUPDATE (ADD.PROCESS '(CALUPDATEINIT] (OR CALMONTHICON (SETQ CALMONTHICON (create TITLEDICON ICON _ CALMONTHICONMAP TITLEREG _ '(3 51 56 9]) (SHRINKYEAR [LAMBDA (X) (* MJD "19-Jun-87 12:09") [OR (WINDOWPROP CALYEARWINDOW 'ICONPOSITION) (WINDOWPROP CALYEARWINDOW 'ICONPOSITION (GETBOXPOSITION (BITMAPWIDTH CALYEARICON) (BITMAPHEIGHT CALYEARICON] (OR CALYEARICON (SETQ CALYEARICON (create TITLEDICON ICON _ CALYEARICONMAP TITLEREG _ '(6 26 50 9]) (TIMEDREMP [LAMBDA (REM) (* MJD "30-Jun-87 16:15") (CAR REM]) (TPLUS [LAMBDA (TIME MINS) (* ; "Edited 16-Dec-88 11:36 by MJD") (* ;; "Adds a time number and minute number, returning a time number. E.g. 1300 + -10 = 1250. The %"1987%" is just to make PACKDATE happy - the date itself is ignored.") (PACK (LDIFFERENCE (UNPACK (GDATE (PLUS (IDATE (PACKDATE TIME 7 1 1987)) (TIMES MINS 60)) (DATEFORMAT NO.DATE NO.SECONDS))) '(%:]) (WEEKOF [LAMBDA (M D YR) (* ; "Edited 20-Aug-90 14:49 by MJD") (* ;; "First week of month is number 0.") (IQUOTIENT (IPLUS (SUB1 D) (DAYOF M 1 YR)) 7]) (YNCONVERT [LAMBDA (X) (* MJD "22-Jul-87 12:07") (if X then 'Yes else 'No]) ) (RPAQQ CALDAYICON #*(64 64)OOOOOOOOOOOOOOOOOANOGLCGFAOGHOOONOMGGMOCGFNKKGOONOKKGLGCGFMMKGOONOHCGMOEGFLAHOOONOKKGMOEGFMMJGOOOAKK@LCFFAMMKGOOOOOOOOOOOOOOOOOOH@@@@@@@@@@@@@@AHOOOOOOOOOOO@@@AHOOOOOOOOOOOH@@AHOOOOOOOOOOOL@@AHOOOOOOOOOOON@@AHMOOOOOOOOOOO@@AHMOOOOOOOOOOOH@AHMGOOOOOOOOOOL@AHMD@@@@@@@@@@L@AHMD@AL@@@CH@@D@AHMD@CN@@@GL@@D@AHMD@CN@@@GL@@D@AHMD@CN@@@GL@@D@AHMD@AL@@@CH@@D@AHMD@@@@@@@@@@D@AHMD@@@@@@@@@@D@AHMD@@@@@@@@@@D@AHMD@@@@B@AH@CD@AHMEOL@@G@AL@CD@AHMEON@@MH@L@FD@AHMDFG@AHL@F@FD@AHMDFCHC@F@F@LD@AHMDFAHB@F@CAHD@AHMDFAHF@C@CAHD@AHMDFAHL@CHAK@D@AHMDFAHL@AH@O@D@AHMDFAHL@AH@N@D@AHMDFAHL@AH@F@D@AHMDFAHL@AH@F@D@AHMDFAHOOOH@F@D@AHMDFAHOOOH@F@D@AHMDFAHOOOH@F@D@AHMDFAHL@AH@F@D@AHMDFAHL@AH@F@D@AHMDFAHL@AH@F@D@AHMDFCHL@AH@F@D@AHMEOO@L@AH@F@D@AHMEOL@L@AH@F@D@AHMD@@@@@@@@@@D@AHMD@@@@@@@@@@F@AHMD@@@@@@@@@@B@AHMD@@@@@@@@@@C@AHMD@@@@@@@@@@AHAHMD@@@@@@@@@@@LAHMB@@@@@@@@@@@FAHMA@@@@@@@@@@@LAHMA@@@@@@@@@@AHAHM@H@@@@@@@@@C@AHM@L@@@@@@@@ON@AHE@GOOOOOOOO@D@AHG@@@@@@@@@@@D@AHC@@@@@@@@@@@D@AHAOOOOOOOOOOOL@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AOOOOOOOOOOOOOOOO ) (RPAQQ CALMONTHICONMAP #*(64 64)OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AH@@@@@@@@@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@@@@@@@@@@AHG@HHOHDDCN@O@NAHD@MHB@ED@H@H@HAHG@JHB@ED@H@N@NAHA@JHB@CH@H@H@BAHG@HHB@BH@H@H@NAH@@@@@@@@@@@@@@AOOOOOOOOOOOOOOOOH@D@B@A@@H@D@B@AH@D@B@AB@KHELBJAH@D@B@AB@HHDDBJAH@D@B@AB@IHELBOAH@D@B@AB@J@DDBBAH@D@B@AB@KHELBBAH@D@B@A@@H@D@B@AOOOOOOOOOOOOOOOOH@D@B@A@@H@D@B@AKHELBNAG@KHEGBJAJ@E@BBAE@JHEEBJAKHELBBAG@KHEEBJAHHEDBBAE@HHEEBJAKHELBBAG@HHEGBJAH@D@B@A@@H@D@B@AOOOOOOOOOOOOOOOOH@D@B@A@@H@D@B@AJNEGBJIELJNEGBKIJBEABJIE@JHEABJIJNEGBKMELJNEABKIJHEABHIDDJJEABJIJNEGBHIELJNEABKIH@D@B@A@@H@D@B@AOOOOOOOOOOOOOOOOH@D@B@A@@H@D@B@AJNEKJNIFLKGEJJMMJJDJJBIBDIADJJEAJNEJJNIFLKGEKJMMJBEBJHIDHJAE@JHEJBEKJNIFLKGEHJMMH@D@B@A@@H@D@B@AOOOOOOOOOOOOOOOOH@D@B@A@@H@D@B@AKGEKJMMFNKGD@B@AIDDHJEMBNIED@B@AJGE@JIEDBIED@B@AKGEHJMMFBKGD@B@AH@D@B@A@@H@D@B@AOOOOOOOOOOOOOOOO ) (RPAQQ CALYEARICONMAP #*(64 64)OOOOOOOOOOOOOOOOOANOGLCGFAOGHOHANOMGGMOCGFNKKGMENOKKGLGCGFMMKGMENOHCGMOEGFLAHOOMNOKKGMOEGFMMJGLAOAKK@LCFFAMMKGMMOOOOOOOOOOOOOOLAH@@@@H@@@@D@@@GOHCOOHHGOO@D@GN@AH@@@@H@@@@D@@@@AHEEEDH@BJHD@@EDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHED@@HJJ@@DEEEDAH@@@@H@@@@D@@@@AOOOOOOOOOOOOOOOOH@@@@H@@@@D@@@@AH@OL@H@GH@D@CN@AH@@@@H@@@@D@@@@AHEEEDH@JJHD@@ADAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHE@@@HJJH@DEEEDAH@@@@H@@@@D@@@@AOOOOOOOOOOOOOOOOH@@@@H@@@@D@@@@AH@GL@HAON@DCOOHAH@@@@H@@@@D@@@@AHEEEDH@BJHD@@@DAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHED@@HJJJ@DEEEDAH@@@@H@@@@D@@@@AOOOOOOOOOOOOOOOOH@@@@H@@@@D@@@@AHCOO@HGOO@DCOOHAH@@@@H@@@@D@@@@AHAEEDH@@JHD@@@DAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAH@@@@H@@@@D@@@@AHEEEDHJJJHDEEEDAJ@@@@H@@@@D@@@@AKEEEDHJJJHDEEEDAJ@@@@H@@@@D@@@@AHEE@@HJJJ@DEEEDAH@@@@H@@@@D@@@@AOOOOOOOOOOOOOOOO ) (RPAQQ FQMAP #*(34 34)@@@GOH@@@@@@@@COOO@@@@@@@@OLGOL@@@@@@AN@GON@@@@@@GH@GOOH@@@@@O@@GOOL@@@@@L@@GOOL@@@@AL@@GOON@@@@CH@@GOOO@@@@C@@@GOOO@@@@G@@@GOOOH@@@F@@@GOOOH@@@F@@@GOOOH@@@N@@@GOOOL@@@L@@@GOOOL@@@L@@@GOOOL@@@L@@@GOOOL@@@L@@@GOOOL@@@L@@@GOOOL@@@L@@@GOOOL@@@N@@@GOOOL@@@F@@@GOOOH@@@F@@@GOOOH@@@G@@@GOOOH@@@C@@@GOOO@@@@CH@@GOOO@@@@AL@@GOON@@@@@L@@GOOL@@@@@O@@GOOL@@@@@GH@GOOH@@@@@AN@GON@@@@@@@OLGOL@@@@@@@COOO@@@@@@@@@GOH@@@@@@ ) (RPAQQ FMMAP #*(34 34)@@@GOH@@@@@@@@COOO@@@@@@@@OOOOL@@@@@@AOOOON@@@@@@GOOOOOH@@@@@OOOOOOL@@@@@OOOOOOL@@@@AOOOOOON@@@@COOOOOOO@@@@COOOOOOO@@@@GOOOOOOOH@@@GOOOOOOOH@@@GOOOOOOOH@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@OOOOOOOOL@@@GOOOOOOOH@@@GOOOOOOOH@@@GOOOOOOOH@@@GOOOOOOO@@@@COOOOOOO@@@@AOOOOOON@@@@@OOOOOOL@@@@@OOOOOOL@@@@@GOOOOOH@@@@@AOOOON@@@@@@@OOOOL@@@@@@@COOO@@@@@@@@@GOH@@@@@@ ) (RPAQQ LQMAP #*(34 34)@@@GOH@@@@@@@@COOO@@@@@@@@OOHOL@@@@@@AOOHAN@@@@@@GOOH@GH@@@@@OOOH@CL@@@@@OOOH@@L@@@@AOOOH@@N@@@@COOOH@@G@@@@COOOH@@C@@@@GOOOH@@CH@@@GOOOH@@AH@@@GOOOH@@AH@@@OOOOH@@AL@@@OOOOH@@@L@@@OOOOH@@@L@@@OOOOH@@@L@@@OOOOH@@@L@@@OOOOH@@@L@@@OOOOH@@@L@@@OOOOH@@AL@@@GOOOH@@AH@@@GOOOH@@AH@@@GOOOH@@CH@@@COOOH@@C@@@@COOOH@@G@@@@AOOOH@@N@@@@@OOOH@@L@@@@@OOOH@CL@@@@@GOOH@GH@@@@@AOOHAN@@@@@@@OOHOL@@@@@@@COOO@@@@@@@@@GOH@@@@@@ ) (RPAQQ NMMAP #*(34 34)@@@GOH@@@@@@@@COOO@@@@@@@@OL@OL@@@@@@AN@@AN@@@@@@GH@@@GH@@@@@O@@@@CL@@@@@L@@@@@L@@@@AL@@@@@N@@@@CH@@@@@G@@@@C@@@@@@C@@@@G@@@@@@CH@@@F@@@@@@AH@@@F@@@@@@AH@@@N@@@@@@AL@@@L@@@@@@@L@@@L@@@@@@@L@@@L@@@@@@@L@@@L@@@@@@@L@@@L@@@@@@@L@@@L@@@@@@@L@@@N@@@@@@AL@@@F@@@@@@AH@@@F@@@@@@AH@@@G@@@@@@CH@@@C@@@@@@C@@@@CH@@@@@G@@@@AL@@@@@N@@@@@L@@@@@L@@@@@O@@@@CL@@@@@GH@@@GH@@@@@AN@@AN@@@@@@@OL@OL@@@@@@@COOO@@@@@@@@@GOH@@@@@@ ) (FILESLOAD (SYSLOAD FROM VALUEOF DIRECTORIES) FREEMENU TABLEBROWSER) (PUTPROPS CALENDAR COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (10435 169896 (CALADDEVENT 10445 . 17549) (CALCREATEREM 17551 . 20144) (CALDELETEREM 20146 . 23056) (CALDISPEVENT 23058 . 31241) (CALDOOPTIONS 31243 . 33026) (CALENDAR 33028 . 36102) ( CALENDARWATCHER 36104 . 36381) (CALEXTENDSEL 36383 . 38331) (CALLOADFILE 38333 . 48175) (CALMAKEKEY 48177 . 48378) (CALMONTHBEF 48380 . 49473) (CALMONTHICONFN 49475 . 49982) (CALMONTHRBF 49984 . 50776) (CALOPTIONMENU 50778 . 53033) (CALPEEKNEWMAIL 53035 . 56226) (CALPRINTREM 56228 . 57846) (CALREMDEF 57848 . 58089) (CALTBCLOSEFN 58091 . 58493) (CALTBCOPYFN 58495 . 60863) (CALTBNULLFN 60865 . 61091) ( CALTBSELECTEDFN 61093 . 61490) (CALTEDITEXIT 61492 . 61785) (CALTEDITSTRING 61787 . 65215) ( CALUPDATEFILE 65217 . 72172) (CALUPDATEINIT 72174 . 75543) (CALYEARICONFN 75545 . 76028) ( CALYEARINRANGE 76030 . 76304) (CIRCLETODAY 76306 . 79783) (CLEARDAY 79785 . 81308) (CLOSEMONTH 81310 . 81879) (DAYABBR 81881 . 82143) (DAYNAME 82145 . 82338) (DAYOF 82340 . 83372) (DAYPLUS 83374 . 83671 ) (DAYSIN 83673 . 84505) (DERIVENEWDATE 84507 . 88246) (DOREMINDER 88248 . 92582) (FMNWAYITEM 92584 . 92985) (GETREMDEF 92987 . 93299) (INVERTGROUP 93301 . 93569) (LISPDATEDAY 93571 . 93849) ( LISPDATEMONTH 93851 . 93999) (LISPDATEYEAR 94001 . 94365) (MDMENUITEMREGION 94367 . 94831) (MENUITEM 94833 . 95024) (MENUREGIONITEM 95026 . 95394) (MONTHABBR 95396 . 95573) (MONTHNAME 95575 . 95814) ( MONTHNUM 95816 . 96022) (MONTHOFDAYPLUS 96024 . 96252) (MONTHPLUS 96254 . 96559) (MONTHYEARPLUS 96561 . 96849) (NEWPARSETIME 96851 . 102502) (NEXTMDISPLAYREGION 102504 . 105075) (PACKDATE 105077 . 105792 ) (PARSETIME 105794 . 106921) (PICKFONTSIZE 106923 . 107577) (POM 107579 . 110233) (POMDAYS 110235 . 111576) (PRINTMONTH 111578 . 115444) (REMINDERSOF 115446 . 116364) (REMINDERTIME 116366 . 116608) ( REMINDERTIMELT 116610 . 117309) (REMSINMONTH 117311 . 117500) (REPAINTMONTH 117502 . 117904) ( REPAINTYEAR 117906 . 118236) (SAMEDAYAS 118238 . 118641) (SAMEMONTHAS 118643 . 118928) (SCALEBITMAP 118930 . 127982) (SHOWDAY 127984 . 136230) (SHOWMONTH 136232 . 156310) (SHOWMONTHSMALL 156312 . 157448 ) (SHOWMOON 157450 . 160389) (SHOWREMSINDAY 160391 . 161881) (SHOWREMSINMONTH 161883 . 164333) ( SHOWYEAR 164335 . 167849) (SHRINKMONTH 167851 . 168277) (SHRINKYEAR 168279 . 168808) (TIMEDREMP 168810 . 168934) (TPLUS 168936 . 169470) (WEEKOF 169472 . 169726) (YNCONVERT 169728 . 169894))))) STOP \ No newline at end of file diff --git a/lispusers/CALENDAR.TEDIT b/lispusers/CALENDAR.TEDIT new file mode 100644 index 00000000..3aca2d98 --- /dev/null +++ b/lispusers/CALENDAR.TEDIT @@ -0,0 +1,19 @@ +enˇvĹos CALENDAR 2 4 1 CALENDAR 1 4 By: Michel Denber (Denber.WBST @ Xerox.COM) Uses: TABLEBROWSER, TEDIT INTRODUCTION CALENDAR is a program which can be used to display a calendar on your screen, and keep track and remind you of events and appointments. Calendar 2.04 (the current distributed version) runs in the Koto or Lyric releases of Lisp. The version number appears in the title bar of each Calendar window. Calendar needs the Lisp Library package TABLEBROWSER, which it loads automatically. It also uses TEdit. Various font sizes (from 8 to 36) in the families TimesRoman and Helvetica may be needed, depending on the size chosen for month windows. Reminder files created by earlier versions of Calendar are incompatible with this version. I. STARTING CALENDAR Load CALENDAR.LCOM from your favorite LispUsers directory, eg. LOAD ({ERIS}CALENDAR.LCOM] and then type (CALENDAR). You will get a menu of years (the menu always shows five years starting with last year). If you select a year with Left, it will create a Year window containing a calendar for that year. Each month in the Year window is also a menu item. If you now select a particular month with Left, CALENDAR will create a Month window showing a calendar for that month. You can now select a particular day within the month to bring up a Day browser (described in the next section). The Month window also shows small calendars of last month and next month. You can bring up those months in the current month window by selecting them with Left. If you select them with Middle, the program will create a new window for that month. The Year menu has an entry labelled ``Other". If you select this, it will prompt you to type in a year, if you want one that isn't on the menu. You can have as many year and month windows open at the same time as you like. Month and day windows can also be reshaped to occupy less room on the screen. You can Shrink any of the CALENDAR windows to an appropriate icon, or close them when they are not needed. The reminder facility remains active. If you close your last year window, call (CALENDAR) again to get a new one. CALENDAR uses the Lisp Prompt Window to display informative messages. Please send your comments, suggestions, and bug reports to me - Denber.WBST (ARPA: Denber.WBST@Xerox.COM). Thanks. II. REMINDERS The Day Browser Clicking Left in any day in a month window will open a browser on that day. The browser displays each reminder for the day, along with its event time if it is a timed reminder. You may have more than one browser open at the same time. When you close a month window, it will automatically close all day browsers for that month. There is a menu across the top of the browser with the following items: Add: Lets you create a new reminder in this day. If you select Add, the program will bring up a TEdit window containing a template for the new reminder. The template contains several fields you can select and fill in. These are described in Creating Reminders, below. Display: Brings up the full contents of the reminder in a TEdit window. Delete: Useful for deleting reminders that you no longer need. By default, timed reminders are deleted automatically after they "fire"; untimed reminders do not fire and are never deleted automatically. Calendar will immediately remove reminders which you delete from the month window (and the reminder's line in the day browser is crossed out), however it will leave reminders that have fired visible in the month window until you redisplay it (eg. September is visible, you select Redisplay from the right-button menu in the title bar or select September again in the Year window, and all fired September reminders will be purged from the month window when it redraws). Update: Saves your reminders to disk (see the section on Saving reminders below). Send Mail: Prompts you for a name to send to. The selected reminder will be mailed to that person when it activates, rather than displaying on your screen. Note that no validity checking is done when you enter a name, so your message could conceivably not be delivered if you typed the name wrong, for example. The message is mailed when the time arrives. Of course, this assumes that your system is running at that time, that you have Lafite active, and that Lafite is running in the mode (GV or NS) corresponding to your intended recipients. Period: Brings up a menu with the choices Daily, Weekly, Monthly. The selected reminder will be made periodic and will appear at the selected intervals. Creating Reminders You can create a new reminder either by clicking Add in a day browser, or by clicking the middle button in a day box in the month window. This opens a new reminder form with the following fields: Title: The reminder title should not exceed one line in length. This field will be displayed in the Day browser and the month window. This field may not be omitted; all others are optional. Event time: The scheduled time for the event. By default, this is also the time at which the reminder will be activated. If this field is omitted, the reminder is "untimed". Untimed reminders do not alert you. When a timed reminder activates, it beeps and brings up a TEdit window containing the full reminder text. Alert time: The time at which you would like the reminder to activate. You might want to be reminded of a meeting 10 minutes early, for example. The alert time can be set to any time, before or after the event time, as long as it is in the same day. If this field is omitted, it defaults to the value of the event time. Alert: Edit this field to contain just the word Yes or No. If you choose No, the reminder will not alert you, even if it is a timed reminder. If this field is omitted, it defaults to the value set in the Options menu (see Programming below). Duration: The expected length of the event. Version 2.04 makes no use of this field. Message: The actual message you want to save. This may be any TEdit text or omitted entirely. The new reminder form includes a menu with the choices Save and Abort. After filling in the fields you want, clicking Save will add the reminder to the system and close the form. Clicking Abort at any point cancels the reminder being created. The time can be entered in almost any reasonable format, eg. 9:00 AM, 9 AM, 9 a.m., 2:30 PM, 2:30 P.M., 1430, or can be left out by skipping over the field. Times are "AM" by default, so if you only type 8:30, it will assume 8:30 AM. A heuristic is included to ask "Are you sure?" if you type a time earlier than 9 without an AM/PM qualifier (this value is controlled by CALDAYSTART, see Programming, below). Times of noon and midnight are special cases. There is no generally accepted meaning for the expressions "12:00 AM" and "12:00 PM". If you want a reminder at noon, enter the time as "12:00" or just "1200". Because reminders are added to a particular day, midnight is ambiguous; there is no provision for entering a time of midnight. If you add a reminder for a time that is already in the past (for example, to keep a historical record of an event after the fact), the program will save the reminder but will warn you that the reminder time has already passed. Expired timed reminders are automatically deleted upon expiration by default. Setting the variable CALKEEPEXPIREDREMS (see Programming, below) will cause timed reminders to be retained after firing. Reminders which are scheduled for a time when your machine is not running will not be activated the next time you login. This avoids having a possibly long sequence of "dead" reminders popping up at login time. Saving and loading reminders You can save your reminders in a file at any point. The first time tou start Calendar , it will ask you to provide a default host and directory for reminder files. You should enter this in the usual format, for example {DSK} or {ERIS}LISP>. This will become the new value of CALDEFAULTHOST&DIR (it is initially NIL). To save your reminders, select Update from any day browser. This will open a pop-up menu of currently loaded files, plus an "other" item for giving a new file name. If you enter a new name, all currently unsaved reminders will be stored under that name. If you select an existing file, the contents of that file will be updated and any new reminders created since the last update will be added to it. If you abandon your sysout or if your machine crashes, you can have Calendar automatically reload your reminders file when you restart (see CALDEFAULTHOST&DIR and CALLOADFILE in Programming, below). You can also load a reminder file at any time by holding the middle button down in the title bar of a month window. This will open a pop-up menu of files that have already been loaded, plus an "other" item to specify a new file. In this version of Calendar there is never any need to load a reminder file more than once. The menu is useful, however, to show which files have already been loaded. An "almanac" reminder file is distributed along with Calendar. It contains a variety of holidays and notable dates for the year. The file is called CALMANACnn, where nn is the last two digits of the year. For example, the file for 1986 is called CALMANAC86. You can load this file by selecting Other from the middle button menu and typing CALMANAC86. By default, the program will only save your reminders when you select Update. You may control file updating by changing the Auto File Update option available under the Options menu item in the month window. See Programming, below. III. PROGRAMMING A programmatic interface is provided to let you create day, month, or year windows from your own programs. If your reminder text is a Lisp list (anything inside parentheses), when the reminder fires the program will evaluate the list rather than displaying the reminder in a window and beeping. Functions (CALENDAR m d yr) [Function] m, d, and yr are integers specifying a month, day, and year, respectively. Arguments are specified as follows: If only yr (must be 4 digits) is supplied, brings up a year window for that year and returns yr. If m and yr are supplied, brings up a month window for that month and returns m. If m, d, and yr are supplied, brings up a day window for that day and returns d. For invalid combinations (missing yr, d and yr only), returns NIL. Also returns NIL if yr is out of range (the calendar algorithm is only valid for years between 1700 and 2100). Examples: (CALENDAR NIL NIL 1984) shows a calendar for 1984 and returns 1984. (CALENDAR 10 NIL 1984) shows a calendar for October 1984 and returns 10. (CALENDAR 10 NIL 84) returns NIL (out of range). (CALENDAR 10 21 1984) shows October 21st, 1984 and returns 21. You can also call Calendar with the keywords TODAY, THISMONTH, and THISYEAR. Examples: (CALENDAR 'THISYEAR) shows a Year window for 1986, if this year is 1986. This might be used in an init file, to always start a Calendar of "this year". (CALENDAR 'TODAY) opens a Day browser for today, containing all of today's active reminders. (CALLOADFILE file-name) [Function] Loads the file file-name into the reminder system and returns T. Returns NIL if the file is not found or is not a valid reminder file. Example: (CALLOADFILE '{DSK}CALREMINDERS) Variables CALALERTFLG [Variable] Initially T. This controls whether or not reminders whose Alert field is not specified should alert you when they fire. T means they will. NIL means they won't. CALDAYDEFAULTREGION [Variable] Initially (32 200 350 100). This specifies the default size for day browsers. The location is only used for day browsers opened programatically. CALDAYSTART [Variable] Initially 900. This represents the time (in 24 hour format) at which your regular day starts. The system will use it to confirm times you enter without a "PM" indicator if they are less than this value. For example, it is more likely that 4 means 4 PM than 4 AM. CALDEFAULTALERTDELTA [Variable] Initially 0. This represents the time (in minutes) before or efater the event time you want reminders to be activated, if no explicit alert time was given for them. To be reminded before the event, make this value negative. The resulting time must still be in the same day as the event. CALDEFAULTHOST&DIR [Variable] Initially NIL. This is the host and directory on which your reminder files will be saved if you type the file name without a directory specification. The system will prompt you to enter a value for this the first time you start it. CALFLASHTIMES [Variable] Initially 0. Specifies the number of times to flash the destination given by CALFLASHTYPE when a reminder is activated. CALFLASHTYPE [Variable] Initially 'None. Specifies which window should be flashed when a reminder is activated. Can be set to 'WINDOW, to flash the reminder display window, or 'SCREEN to flash the entire screen. CALFLASHTIMES (above) should be set to the desired number of flashes. CALFONT [Variable] Initially 'TimesRoman36. This variable controls the font used to display the Month Window. You can change it for example, by saying (SETQ CALFONT (FONTCREATE 'HELVETICA 18)). The change takes effect the next time you display a month. If you reshape a month window, the program will try to find a smaller font to fit the new window size, but the value of CALFONT will not be changed. CALHARDCOPYPOMFLG [Variable] Initially T. This variable controls the printing of the phase-of-the-moon icons when you hardcopy a month window. Setting it to NIL suppresses this printing. Month windows are hardcopied at printer resolution in Koto, screen resolution in Lyric. CALHILITETODAY [Variable] Initially 'CIRCLE. This variable determines how today's date will be highlighted in a month window. The default is to draw a circle cround it. If you set this to 'BOX, a light gray grid will be placed over the date. Setting this to NIL suppresses all date highlighting. CALKEEPEXPIREDREMSFLG [Variable] Initially NIL. If you set this to T, Calendar will not automatically delete reminders when they fire (they can still be deleted using the Delete menu command, above). The default action is to delete reminders when they fire, although they will remain visible until the window is redisplayed. CALMONTHDEFAULTREGION [Variable] Initially (32 32 868 700). This specifies the default position and size for month windows. If you set the size to a value small enough to allow several month windows side by side, the windows will tile left to right, bottom to top. CALREMDISPLAYREGION [Variable] Initially (200 400 300 400). This specifies the default position and size for reminder display windows. CALTUNE [Variable] When a reminder is activated, it will play the tune stored here (in PLAYTUNE format).This is initially a two-note "ding-dong". Set this to NIL if you want no audible warning. 1100's and 1132's have no hardware for sound. CALUPDATEONSHRINKFLG [Variable] Initially 'Never. This means that Calendar will save your reminders on a file only when you explicitly click Update from a Day Browser. If set to 'Shrink, it will cause Calendar to save your reminder file automatically only when you shrink the Month window. This is useful when you are entering many reminders at the same time, but it means you must remember to explicitly shrink the month window or your reminders will be lost if your machine dies. If set to 'Always, causes Calendar to immediately save each reminder as soon as it is created. You can also set these variables interactively by clicking on the box marked "Options" in any Month window. This brings up a freemenu similar to the TEdit expanded menu. l˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţüń˙˙÷˙˙ř˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţűżý˙˙÷˙˙÷ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţű¸ý㧗?÷iĂǎž?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţű˙}ݛgěß÷fď÷vmß˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţűř}Áťw ˙÷nď÷vî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţűˇ}ßťví˙÷nď÷vďż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţűˇ}Ýťfí˙÷fí÷víß˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţüx}㻗 ˙řéó÷Žî?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţŔŔŔŔ˙˙řÁ ť˙řˆÌť˙řČÌóď˜×ČŕĆ͛f×včŠĆÍűď8ŠÇ̓ďؙĚm›ďvč™Ěló˜ďˆŕŔ˙˙řŔ˙˙řŔ˙˙řŔŔŔŔ˙˙đĚŔ€w˙đ̀€w˙đĎ>ćo›çóĎxđ0Ż0‘ŔÎ Ůł3ĚŰlفśl͐0ŽíĐR ĎßłńŒŰف‡ěÍŔŢpR ͌3ŒŰ † ĚpŢ˙°2 ĚĚŮł3ĚŰ Ů†lÍ30ŢíĐ2 Ěg>ćo›ƒĚÍă0ß0ŔŔ0 ˙˙đŔ0 ˙˙đŔ0 ˙˙đŔŔŔŔ€˙˙˙˙ćÁ°pˆ€ť˙˙˙ćÀ 00(H€›˙˙˙ćÌß<}łŔfřůÇĎ(ÄGKX›Žî:fĆĚĚf1ś`f͘c˜($H€ ™d ŤvíŮŚĆĚĚf1ˇŕf͙ă€DQäFˆDŔŤ\ćÇĚĚf1śf͛c|R"HD ł]űćĚlĚf`1ś`f͛c˜D˘"ˆ€HDłw˝ŰćĚgÇ<`1łŔ>řůńĎDĄáˆDˆťž;ćŔŔ˙˙˙˙ćŔŔ˙˙˙˙ćŔŔ˙˙˙˙ćŔŔŔŔÁ Ì`€Ìóď€ůćůĂ €Ć͛f›6`c +€ĆÍű›öaŕ +€Ç̓›c` €Ěm››6cc€Ěló€ůć9óŔŔŔŔŔŔŔ`Ŕ`Ě`€`"Ï@řâĚ`0@‘$!„H@Ěg|@o€‘(A„H@€ĎěŮ0€3m€Œ8ƒž@đŔ@ĚlÜ0°3l‚$ €@€ @ĚlÇ0ŕ3l‘$A„H@€ĚlÓ0`3l€‘"!„H@Ěgž°l€"ńÈ|řâŔŔŔ`ŔŔŔŔŔÁ0À0ϟ63ĆĚŮś3ĆĚŮłcÇĚŮą@ĚlŮąĂĚoŸ0ƒŔ €Ŕ Ŕ ŔŔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ Alert: Specifies the default for the Alert field in the new reminder form. Sets the value of CALALERTFLG (described above). Keep expired rems.: If set to No, the system will automatically delete reminders when they fire (although they remain listed in the month window until the next time you redisplay it). Sets the value of CALKEEPEXPIREDREMSFLG. Auto. file update: Always means that the system will update the reminder file every time you create a new reminder. Shrink means update only when a month window is shrunken. Never means updates will be done only when you explicitly select Update from a Day browser. Sets the value of CALDUPDATEONSHRINKFLG. Alert delta: Sets the value of CALDEFAULTALERTDELTA. Host & dir.: Sets the value of CALDEFAULTHOST&DIR . After you have made the selections you want, click Apply! This sets the selections and closes the menu. If you don't want to make any changes, just close the menu (like closing any window). This preserves the previous settings even if you changed them in the menu. Any changes you make to these variables are not saved automatically in reminder files. IV. LIMITATIONS Day groups must begin and end in the same month. The calendar algorithm is valid only for years between 1700 and 2100. V. KNOWN BUGS Today-circling function occasionally fails to erase the old day. VI. FUTURE PLANS Automatic scheduling. Automatic communication with other Calendars. (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# 27) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))) ,3ČČT-ČT,Č3ČČT2ČČ,ŠŠ8,Č ,Č,ŠŠ8,ŠŠ8HČČ PAGEHEADING RUNNINGHEAD CLASSICCLASSICCLASSICMODERN +MODERN +MODERN MODERN +MODERN HELVETICA +    HRULE.GETFNMODERN +  HRULE.GETFNMODERN +  HRULE.GETFNMODERN + + HRULE.GETFNMODERN + HRULE.GETFNMODERN + -  } ?&Čt“@›K +“Ĺş 6 8đ MWőíäČÔDcęlź +  paQQł +EJ4@M +›^   p .   ¤ “   + # ę y   „ ů  ' ę i  ß (Ťd BMOBJ.GETFN3MODERN +wĎ$ * (d1FA.QÎ/zş \ No newline at end of file diff --git a/lispusers/CANVASCONVERTER.TEDIT b/lispusers/CANVASCONVERTER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..0531f003dadcf70b41fee5c0ec586e6bb5d68694 GIT binary patch literal 6107 zcmeHL-EZ606_=g#Bh3hGLzZn18_v28l~7ypSCmB9y3rD4v!O_pq->`{2T;g zNXm*k>}hZPH}<;s0eK(LKWo2pN$SH+opc-4mk6;%p3mR?opaBUNG4+36LHGn;$SkN@-@*lFRh!1q)vyX-_|=V+tW0E zBoi7${TUXJ(l|&`5(AlL*vqxOo!X=QgD3lBn->36w5n#>zUwr*4c~O^%zqLMW@AAj z40=pfIuew|L6{6hOwo{fGMxm|gnA;K3y{isBfN+bvSc!)ARN${h@%&DBE`HDNdOVy zg^Z(+K_yl4;V=QL*@R|H>oAJflVA-&NVZ2q2^@)tFOaz`tD;IlCL6@T9J2XH_D9r* zaZgat?~8=v^-!-U9j#@pWND{SlE|JM%k+|$QYSR7DC3e+nXK|nY~XUP6+ z9K`4ktYbJEtCbY&FG2>>=~(uIR7PP^)!N|NGRQdVSh}q<=^j`YG4SJu7Z9d07$asn zk7yG78RXD#7WS2YT`QYb{nRymBWrict4}S{GAeie*vc)x%t~1}(mX~NWVOuNg_{{m zWH(i^N$?zc^~%ItPQ^<78bNpwBwOGcKtXS2H<_Wmn0bV{RwQv zCFBx#w%$2xuMv*MSE_8e+b!2=Z=afW(>W!|zppW1oayb3Wq6uC9+P+xOs2f!6tUoy ztH7ujUP#!ehHIH#2Zo|w)%+-{D)t0+0P4e_bJ8g3$GkUVaSj&HHLERC&cSQ+@n3AO zg+1n}Emm(vlR$=bCq55C`IYL}zy6l>O|{)VZAD{@xlet=^VLdjgfN%kAetlfEBGj% z9-EEhQ_Q{p0RrxuB?s4A2M|2N|D5QI%1#I4)^`oPP1=8+I&bKYO}o?eD;2G5G)@1o zjbnxLaEbCgR$lG@vkIFwEXOlibXLK6bz=;v0r~}sG|SG@L}VrB^Ke@NO);N_YDX4hN|B_fP`luzn&Q995xo2rIY6j7gQjQ& zMR6?8M=9DT2ge=ETidi-PPJOCEXE$w%5~qOV4R{X=Odbh7zPwZ@gx{iU&gp}Bq_Hj z1`!esB0Pjxi8^{z^DW3&rKw20;05&nd%-38fJOnvZ;vM#*vD-|HLAd|!%X%B)H0gI z46bc7E#p~LYoPTox$-l9#8WXuHB=0ofZX{Y75%nO_)Wi4+|~Eypq)riaS9s~?&T`tU>itB~jGu5a2$?E7olKd4Z7hjys8yGM_n z?BT7fT#K--ZaL0VkIJ8S^(Hk89_~i7LXBhH%{5+^b2nVG<0Fu1pO~I`h~wI6wa7Cp zqv3ae#8>Yf*TI#*H=3E20q^cmOK+RjGs2z2aBXsMW425?58%7zQ^VP_PKTj}Pe4!2vzoTlMvgGhaC} z2sU|Aql1Svs_pD#;Vba`?`y0U_O{4xi~M#c^91~!c5Ai-fd!E@S z{Wvq&EWK9vvxVjT()&10+or8s2v&T4TDo&=SSN;WHuM$oz0$kc0a?hhA+9SSB{zy(Fb?3e0LmZ%4g^Fvm#F&psrCUkd?UHr#E^#~U!+}9t&1|w^&eEaBuNAP=dSsu!dNLXC9QQaN@8Frr2INsT^#=_DZ4}jwPy< z+3+J)tx2em@B-G*ESwf=d^H-jQ;S@S`^zHkBFtJQmVQ~76sZ@Be03s5r=oEp_Td*b zN?7owLISP>UTIL>CD.;8 18509 changes to%: (VARS CDCOMS) (FNS CDFun) previous date%: "14-Dec-87 15:41:38" {ERINYES}LYRIC>LISPUSERS>CD.;2) (* " Copyright (c) 1984, 1985, 1986, 1987, 1988 by Henry Thompson, Dept. of Artificial Intelligence, Univ. of Edinburgh. All rights reserved. ") (PRETTYCOMPRINT CDCOMS) (RPAQQ CDCOMS ((FNS CDFun CDSepr CDName ChangeDir ReshowConn ShowCDMenu COPYBUTTONDOWN?) (INITVARS [LocalDiskVolume (COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY] (CD.DEFAULT.HOST 'DSK) (CD.DEFAULT.PREFIX LocalDiskVolume) [CD.DEFAULT.USER (LET [(pos (STRPOS "." (USERNAME] (COND [pos (PACK* (SUBSTRING (USERNAME) 1 (DIFFERENCE pos 1] (T (USERNAME] (CD.DEFAULT.LEFT) (CD.DEFAULT.BOTTOM) (CDMenuItems) (LOGINHOST/DIR (CDName)) (CONNWINDOW) (CDMenu) (CDCommandMenu)) (ADDVARS (LISPXCOMS CD) [AFTERSYSOUTFORMS (SETQ CD.DEFAULT.PREFIX (SETQ LocalDiskVolume (COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY] (POSTGREETFORMS [SETQ CD.DEFAULT.USER (LET [(pos (STRPOS "." (USERNAME] (COND [pos (PACK* (SUBSTRING (USERNAME) 1 (DIFFERENCE pos 1] (T (USERNAME] [SETQ CD.DEFAULT.PREFIX (SETQ LocalDiskVolume (COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY] (SETQ LOGINHOST/DIR (CDName))) (CD.OS.SEPRS (DSK . >) (UNIX . /) (VMS . /) (NS . >) (IFS . >)) (CDCommandMenuItems (Connect (CDFun $dir$) "Connect to the directory") (Browse (APPLY* (FUNCTION FB) $dir$) "Bring up a file browser on the directory") (Delete (PROGN (SETQ CDMenu NIL) (SETQ CDMenuItems (DREMOVE $dir$ CDMenuItems))) "Remove the directory from the CD menu"))) (ADVISE CNDIR DIRECTORYNAME) (LISPXMACROS CD) (COMMANDS "CD") [P ([LAMBDA (new) (COND ((FMEMB new CDMenuItems) CDMenuItems) (T (SETQ CDMenuItems (CONS new CDMenuItems] (PACK* (DIRECTORYNAME '{DSK}] (PROP MAKEFILE-ENVIRONMENT CD) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (GLOBALVARS CD.DEFAULT.HOST CD.DEFAULT.PREFIX CD.OS.SEPRS LocalDiskVolume CD.DEFAULT.USER CD.DEFAULT.LEFT CD.DEFAULT.BOTTOM CONNWINDOW CDMenu CDMenuItems CDCommandMenuItems CDCommandMenu)))) (DEFINEQ (CDFun [LAMBDA (d) (* ; "Edited 6-Jul-88 11:49 by ht:") (if d then [LET* ((target (DIRECTORYNAME T)) (host (FILENAMEFIELD target 'HOST)) (dir (FILENAMEFIELD target 'DIRECTORY)) (sep (CDSepr host))) (SELECTQ (NTHCHAR d 1) ({ (ChangeDir d)) (< [if (AND (EQ (NCHARS d) 2) (EQ (NTHCHAR d 1) '<)) then (* ;; "this hack here for common lisp readtables which reject ..") [bind (prev _ 0) this while (SETQ this (STRPOS sep dir (PLUS prev 1))) do (SETQ prev this) finally (ChangeDir (PACKFILENAME 'HOST host 'DIRECTORY (SUBSTRING dir 1 (IMAX (IDIFFERENCE prev 1) 0) dir] else (ChangeDir (CDName (SUBSTRING d 2) (FILENAMEFIELD (DIRECTORYNAME T) 'HOST]) (bind dp first (SETQ dp (MKSTRING d)) while (IGREATERP (NCHARS dp) 0) do (if (EQ (NTHCHAR dp 1) '%.) then (GNC dp) [if (EQ (NTHCHAR dp 1) '%.) then (GNC dp) (bind (prev _ 0) this while (SETQ this (STRPOS sep dir (PLUS prev 1))) do (SETQ prev this) finally (SETQ dir (SUBSTRING dir 1 (IMAX (IDIFFERENCE prev 1) 0) dir] else (SETQ dir (PACK* dir sep dp)) (GO $$OUT)) (if (OR (EQ (NTHCHAR dp 1) sep) (EQ (NTHCHAR dp 1) '>)) then (GNC dp)) finally (RETURN (ChangeDir (PACKFILENAME 'HOST host 'DIRECTORY dir] else (ChangeDir (CDName]) (CDSepr [LAMBDA (host) (* ht%: "19-Mar-86 09:34") (OR (CDR (ASSOC host CD.OS.SEPRS)) (CDR (ASSOC (GETOSTYPE host) CD.OS.SEPRS)) '>]) (CDName [LAMBDA (dir host) (* drc%: " 1-Jun-86 16:17") (if (NOT host) then (SETQ host CD.DEFAULT.HOST)) (if [AND (NOT dir) (FMEMB (MACHINETYPE) '(DANDELION DOVE] then (SETQ dir CD.DEFAULT.USER)) (PACKFILENAME 'HOST host 'DIRECTORY (if [AND CD.DEFAULT.PREFIX (NOT (AND (FMEMB (MACHINETYPE) '(DANDELION DOVE)) (EQ CD.DEFAULT.PREFIX LocalDiskVolume) (NEQ host 'DSK] then (PACK* CD.DEFAULT.PREFIX (CDSepr host) dir) else dir]) (ChangeDir [LAMBDA (dir) (* ht%: " 8-SEP-82 20:05") (CONS (DIRECTORYNAME T) (/CNDIR dir]) (ReshowConn [LAMBDA NIL (* ht%: "30-Apr-85 17:33") (PROG ((DN (DIRECTORYNAME T)) (TTYREG (WINDOWPROP \TopLevelTtyWindow 'REGION)) REG FONT) (if (NOT (WINDOWP CONNWINDOW)) then (SETQ CONNWINDOW (CREATEW (SETQ REG (create REGION LEFT _ 0 BOTTOM _ 0 WIDTH _ 10 HEIGHT _ 10)) NIL NIL T)) (WINDOWPROP CONNWINDOW 'BUTTONEVENTFN (FUNCTION ShowCDMenu)) (if (SETQ FONT (FONTCREATE 'HELVETICA 8 NIL NIL 'DISPLAY T)) then (DSPFONT FONT CONNWINDOW)) (replace HEIGHT of REG with (HEIGHTIFWINDOW (- (DSPLINEFEED NIL CONNWINDOW)) NIL NIL)) (SHAPEW CONNWINDOW REG)) (if (ACTIVEWP CONNWINDOW) then (CLOSEW CONNWINDOW)) [SETQ REG (APPEND (WINDOWPROP CONNWINDOW 'REGION] (replace LEFT of REG with (OR CD.DEFAULT.LEFT (fetch LEFT of TTYREG))) (replace BOTTOM of REG with (OR CD.DEFAULT.BOTTOM (fetch TOP of TTYREG))) (replace WIDTH of REG with (WIDTHIFWINDOW (STRINGWIDTH DN CONNWINDOW) NIL)) (SHAPEW CONNWINDOW REG) (DSPRESET CONNWINDOW) (OPENW CONNWINDOW) (PRIN3 DN CONNWINDOW]) (ShowCDMenu [LAMBDA (cw) (* ht%: " 3-Apr-86 12:07") (LET [(copyFlg (COPYBUTTONDOWN?)) (mv (MENU (OR CDMenu (create MENU ITEMS _ CDMenuItems MENUFONT _ (FONTCREATE 'HELVETICA 8 NIL NIL 'DISPLAY T) WHENSELECTEDFN _ (FUNCTION (LAMBDA (item menu key vals) (CONS key item] (if mv then (if copyFlg then [if (COPYBUTTONDOWN?) then (if (NLSETQ (while (COPYBUTTONDOWN?) do (BLOCK))) then (BKSYSBUF (CDR mv] else (SELECTQ (CAR mv) (LEFT (CDFun (CDR mv))) ((MIDDLE RIGHT) (PROMPTPRINT "Choose action for directory " (CDR mv)) [LET (($dir$ (CDR mv))) (DECLARE (SPECVARS $dir$)) (MENU (OR CDCommandMenu (create MENU ITEMS _ CDCommandMenuItems]) (SHOULDNT]) (COPYBUTTONDOWN? [LAMBDA NIL (* ht%: "19-Mar-86 09:37") (SHIFTDOWNP 'SHIFT]) ) (RPAQ? LocalDiskVolume [COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY]) (RPAQ? CD.DEFAULT.HOST 'DSK) (RPAQ? CD.DEFAULT.PREFIX LocalDiskVolume) (RPAQ? CD.DEFAULT.USER [LET [(pos (STRPOS "." (USERNAME] (COND [pos (PACK* (SUBSTRING (USERNAME) 1 (DIFFERENCE pos 1] (T (USERNAME]) (RPAQ? CD.DEFAULT.LEFT ) (RPAQ? CD.DEFAULT.BOTTOM ) (RPAQ? CDMenuItems ) (RPAQ? LOGINHOST/DIR (CDName)) (RPAQ? CONNWINDOW ) (RPAQ? CDMenu ) (RPAQ? CDCommandMenu ) (ADDTOVAR LISPXCOMS CD) (ADDTOVAR AFTERSYSOUTFORMS [SETQ CD.DEFAULT.PREFIX (SETQ LocalDiskVolume (COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY]) (ADDTOVAR POSTGREETFORMS [SETQ CD.DEFAULT.USER (LET [(pos (STRPOS "." (USERNAME] (COND [pos (PACK* (SUBSTRING (USERNAME) 1 (DIFFERENCE pos 1] (T (USERNAME] [SETQ CD.DEFAULT.PREFIX (SETQ LocalDiskVolume (COND ((FMEMB (MACHINETYPE) '(DANDELION DOVE)) (FILENAMEFIELD (DIRECTORYNAME '{DSK}) 'DIRECTORY] (SETQ LOGINHOST/DIR (CDName))) (ADDTOVAR CD.OS.SEPRS (DSK . >) (UNIX . /) (VMS . /) (NS . >) (IFS . >)) (ADDTOVAR CDCommandMenuItems (Connect (CDFun $dir$) "Connect to the directory") (Browse (APPLY* (FUNCTION FB) $dir$) "Bring up a file browser on the directory") (Delete (PROGN (SETQ CDMenu NIL) (SETQ CDMenuItems (DREMOVE $dir$ CDMenuItems))) "Remove the directory from the CD menu")) [XCL:REINSTALL-ADVICE 'CNDIR :AROUND '((:LAST (PROG ((val (NLSETQ *))) (ReshowConn) (RETURN (if val then (if (NOT (FMEMB (CAR val) CDMenuItems)) then (push CDMenuItems (CAR val)) (SETQ CDMenu NIL)) (CAR val) else (ERROR!] [XCL:REINSTALL-ADVICE 'DIRECTORYNAME :AFTER '((:LAST (COND ([AND (EQ 'DSK (FILENAMEFIELD !VALUE 'HOST)) (NOT (FMEMB (NTHCHAR !VALUE -1) '(> }] (SETQ !VALUE (PACK* !VALUE ">"] (READVISE CNDIR DIRECTORYNAME) (ADDTOVAR LISPXMACROS (CD (CDFun (CAR LISPXLINE)))) (ADDTOVAR LISPXCOMS CD) (DEFCOMMAND ("CD" :EVAL) (&OPTIONAL XCL-USER::DIR-SPEC) "un*x style directory changing, e.g. cd foo (use << for ..)" (LET ((XCL-USER::DS XCL-USER::DIR-SPEC)) (CDFun (CL:IF (EQ XCL-USER::DS 'XCL-USER::<<) 'XCL-USER::|..| XCL-USER::DS)))) [[LAMBDA (new) (COND ((FMEMB new CDMenuItems) CDMenuItems) (T (SETQ CDMenuItems (CONS new CDMenuItems] (PACK* (DIRECTORYNAME '{DSK}] (PUTPROPS CD MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CD.DEFAULT.HOST CD.DEFAULT.PREFIX CD.OS.SEPRS LocalDiskVolume CD.DEFAULT.USER CD.DEFAULT.LEFT CD.DEFAULT.BOTTOM CONNWINDOW CDMenu CDMenuItems CDCommandMenuItems CDCommandMenu) ) ) (PUTPROPS CD COPYRIGHT ("Henry Thompson, Dept. of Artificial Intelligence, Univ. of Edinburgh" 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5118 13308 (CDFun 5128 . 8719) (CDSepr 8721 . 8951) (CDName 8953 . 9897) (ChangeDir 9899 . 10061) (ReshowConn 10063 . 11752) (ShowCDMenu 11754 . 13163) (COPYBUTTONDOWN? 13165 . 13306)))) ) STOP \ No newline at end of file diff --git a/lispusers/CD.TEDIT b/lispusers/CD.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..529546f6edaa8b1922653c812761a0521ae34be5 GIT binary patch literal 6591 zcmeHLTW=f36{ch-sq1cw6zK&h3LK~}R6tRdqR6sg2%*TOv^7OCL4ZEz_Y^45_X2tBFX%sLe?z}Bv%6gC;y8V1Q6Pl89G*GX?_6fqGWg5o-&Az3 z-mvy9>%g-1EDLKqu|8QoCOVTrxFmO~X7fk|R6fg=)w%fOxeV3o>PXGDEqCfgG*+Wz zCWDxK5yd3OUM$D-`@~<;VTJY{9UWCIr|tGSjX~XYI&BC^ns~mXdV{>#+?OmIk)T1_ zdH&%}6fdzi5hKs{;w4Q~NHY<5^TZdi7hF&b@sSDwIbu6wFT_HH%PNr*lkg)&UJxar zjKC@4+t>+?3x6S&@ZXE(zF5j}6(~@*=DK#TeeVnVwH(3F493S_TIX=TWt089+p4u| z97mtIIeahC)w53Dz4yhlbnnaJR<~z2o#(e~4*GWQmMvDvfQZCLMq@>d{!=8TVAN<{?5h#nM}l6`rSef_1c(GRkP_)5)(R=Gg$pl|)OK3yrr6JGhAxGl zK+A-9w_Q88D+FbXV=^BLt|*bjYKBsSWxy&Xu?*?7XWK4PRn^6t>o5h7mXV-3iehIj zyfAZL`A`S#fn3~>O;1Kus}s;vMF7iGOq9&$DvT*oh!v$jV^vWy+{x>_!fg{sIo9~T z4AjDu_*8@f9TBFAIG_m8AP12|i6FE!J#3uN;gVvm3{Fv}U+vr7USGEcVBYaP^t176 zETMXaI_Iu}?wOd+xpa5Pi<#dGP=dkQWP*v0J7%<|>N3 zA1i z8;>g^Z|=0uxcUlIF8ZqV73K{f4lXQ*;hu*Q^_P2@jxo$-l+4PTXf8+I1YN<_P1B?U zO1thM{3qY3_ZD?r9Yaa45>(K{GXt#PwVoCGx#)Kh?j$ z#x5E()b@=p#6)gr6sg7|OoD)$OrMMEzU&%b7AnDr0d%)}q^<12b0boe7RW6Qo8 z15@=#K!Et0;|Rt4<4VV&hUyTysF$?x;;C^7x^7f9ml)3QTTLdI*O==(z_wSppM+|r z+h>%7AwV>z*VO~Pl6Fc~4rn&*U?H~^1~*N<89X;7LXQI^3C=QVdvBM)y<>pUR_FnJ zjTp+2K)$%`_>4ybV%W{$lNck3=nY&?Lf!KfTB?LbA_!E>GZ=Pp5nvn=oLWfuH3d6* z)M@N7q?dsTmNRL-`cqY_x@w#BgXwE*srHcvmRHi74o>rsN`a*l32F@jeHfccRZ(2 zr)tgvN%&RkTm}gyJSG}0kJ75)Hi&yw?BOI$GeW+c#57Fe82Q8T!Qn2vV2m>~y#%u2 zB2=s5%FEY)7U6a!a8AG^(8X0ji)Bna`q?I~X)rEfQ{qTkDT@{0?Bnn-7eFqKg$Ero zTobh*d2XHGt_+l!BJUxy*3OVAN4ucxepP#@)RG$QW~b$JoOZKAx2R;Tl{PvuVswFcGgHeOWh#x~W@YQ1!)KVaMSp3`-q z$Z0=w`p!wqrcSd-eY<7X-7Y+F_3v)4POx4qCMy^;?~;o&WmGc23V+I=36n;G7+^dzodv zlxTDqJzUk`E>_#r?DWp@rga@R0JHb-0C>^<(UFEt^Ow);S_5brxY8ed^P}FN-Npu! zAbWH`4-XFL9=_6ikd|P@CUz>OCV!iS0hTdI&Y`FRFqR7VEiR`oR zTUg0$l!_8>GP07Wq&D8i_ub7qtBo60mC`q*Z#Irf?|u(nR&#d~2)*HR#(RiUf384t zpQl?oHB0vkBhzqSd)_TsrC*fZtG8O`pY`y6jnz}zZMHYoJb*;{(W*?cH%)W=R|OeJUBcX# z>^l?Qt$qp(({{xT!vQSb=LJz*A(sFcT-`N#$%-pL5es#}9uSv_;;HFMMEDLEY>CHATEMACS.;2 19237 changes to%: (FILES CHATDECLS) (FNS CHAT.BUTTONFN CHAT.TYPEIN CHAT.TYPEOUT CHAT.SCREENPARAMS) (VARS CHATEMACSCOMS) previous date%: "18-Jan-89 16:46:52" |{IE:PARC:XEROX}MEDLEY>CHATEMACS.;1|) (* " Copyright (c) 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CHATEMACSCOMS) (RPAQQ CHATEMACSCOMS ((DECLARE%: DONTEVAL@LOAD EVAL@COMPILE DONTCOPY (FILES (SOURCE FROM LOADUP) CHATDECLS)) (DECLARE%: (GLOBALVARS CHATEMACS.SWITCH.ENABLED CHAT.META.ESC)) (INITVARS (CHATEMACS.SWITCH.ENABLED T) (CHAT.META.ESC T)) (FNS CHAT.BUTTONFN CHAT.TYPEIN CHAT.TYPEOUT CHAT.SCREENPARAMS) (ADVISE CHAT.INIT CHAT.CLOSE))) (DECLARE%: DONTEVAL@LOAD EVAL@COMPILE DONTCOPY (FILESLOAD (SOURCE FROM LOADUP) CHATDECLS) ) (DECLARE%: (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CHATEMACS.SWITCH.ENABLED CHAT.META.ESC) ) ) (RPAQ? CHATEMACS.SWITCH.ENABLED T) (RPAQ? CHAT.META.ESC T) (DEFINEQ (CHAT.BUTTONFN [LAMBDA (WINDOW) (* ; "Edited 4-Mar-89 21:55 by Randy.Gobbel") (GETMOUSESTATE) (if (type? CHAT.STATE (WINDOWPROP WINDOW 'CHATSTATE)) then [with CHAT.STATE (WINDOWPROP WINDOW 'CHATSTATE) (LET ((CY (LASTMOUSEY WINDOW)) (CX (LASTMOUSEX WINDOW)) (BUTTONS LASTMOUSEBUTTONS) (TTYLINES (IQUOTIENT TTYHEIGHT FONTHEIGHT)) CSTRING (SHIFTSTATE 0)) (* ;; "The characters are FONTHEIGHT high by FONTWIDTH wide") (COND [(IGREATERP CY TOPMARGIN) (COND ((MOUSESTATE (ONLY RIGHT)) (DOWINDOWCOM WINDOW)) ((MOUSESTATE (ONLY MIDDLE)) (CHAT.MENU WINDOW] ((EQ BUTTONS 0) NIL) (CHATINEMACS (for SS in '(SHIFT CTRL META) as I from 1 by I when (SHIFTDOWNP SS) do (SETQ SHIFTSTATE (IPLUS SHIFTSTATE I))) (SETQ CY (MAX (SUB1 (IDIFFERENCE TTYLINES (IQUOTIENT CY FONTHEIGHT))) 0)) (SETQ CX (IQUOTIENT (IPLUS (IQUOTIENT FONTWIDTH 2) CX) FONTWIDTH)) (SETQ CSTRING (CONCAT (CHARACTER (CHARCODE ^\)) "m" CX ";" CY ";" BUTTONS ";" SHIFTSTATE ";")) (UNINTERRUPTABLY (BKSYSBUF CSTRING))) (T (CHAT.HOLD WINDOW] else (DOWINDOWCOM WINDOW]) (CHAT.TYPEIN [LAMBDA (HOST WINDOW LOGOPTION INITSTREAM) (* ; "Edited 4-Mar-89 21:55 by Randy.Gobbel") (DECLARE (SPECVARS STREAM)) (* ; "so that menu can change it") (PROG ((THISPROC (THIS.PROCESS)) (DEFAULTSTREAM T) (STATE (WINDOWPROP WINDOW 'CHATSTATE)) CHATSTREAM INSTREAM WINDOWSTREAM STREAM CH DISPLAYTYPE DISPLAYNAME CHATPROMPTWINDOW CSTRING) (SETQ CHATSTREAM (fetch (CHAT.STATE OUTSTREAM) of STATE)) (SETQ INSTREAM (fetch (CHAT.STATE INSTREAM) of STATE)) (PROCESSPROP THISPROC 'TTYEXITFN (FUNCTION CHAT.TTYEXITFN)) (PROCESSPROP THISPROC 'TTYENTRYFN (FUNCTION CHAT.TTYENTRYFN)) (COND ((TTY.PROCESSP) (* ;; "Already have tty (probably from menu), so explicitly turn off interrupts, since our TTYENTRYFN hadn't been set yet (so that ^E could interrupt GETCHATWINDOW)") (CHAT.TTYENTRYFN THISPROC)) (T (* ; "want to do this early so users can start typing ahead") (TTY.PROCESS THISPROC))) (PROCESSPROP THISPROC 'WINDOW WINDOW) (SETQ WINDOWSTREAM (WINDOWPROP WINDOW 'DSP)) (DSPFONT (OR CHAT.FONT (DEFAULTFONT 'DISPLAY)) WINDOWSTREAM) (DSPRESET WINDOWSTREAM) (WINDOWPROP WINDOW 'PROCESS (THIS.PROCESS)) (WINDOWPROP WINDOW 'CHATHOST (CONS HOST LOGOPTION)) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (WINDOW STATE) (AND RESETSTATE (fetch (CHAT.STATE RUNNING?) of STATE) (CHAT.CLOSE WINDOW T] WINDOW STATE)) (* ; "If an error occurs, process is killed, or HARDRESET happens, this will flush the connection etc") [COND ((SETQ DISPLAYTYPE (STREAMPROP INSTREAM 'DISPLAYTYPE)) (SETQ DISPLAYNAME (fetch (CHATDISPLAYTYPE DPYNAME) of DISPLAYTYPE] (replace (CHAT.STATE TYPEOUTPROC) of STATE with (ADD.PROCESS `(CHAT.TYPEOUT ,WINDOW ',DISPLAYNAME ',STATE) '%,NAME 'CHAT.TYPEOUT)) [COND (DISPLAYTYPE (CHAT.SETDISPLAYTYPE INSTREAM (fetch (CHATDISPLAYTYPE DPYCODE) of DISPLAYTYPE] (CHAT.SCREENPARAMS STATE INSTREAM WINDOW) (AND (NEQ LOGOPTION 'NONE) (CHAT.LOGIN HOST LOGOPTION WINDOW STATE)) [COND (INITSTREAM (NLSETQ (SETQ STREAM (COND ((STRINGP INITSTREAM) (OPENSTRINGSTREAM INITSTREAM)) (T (OPENSTREAM INITSTREAM 'INPUT] (TTYDISPLAYSTREAM WINDOWSTREAM) (* ; "So that \TTYBACKGROUND flashes the caret where we expect") (while (EQ (fetch (CHAT.STATE RUNNING?) of STATE) T) do (COND ((NULL STREAM) (SETQ STREAM DEFAULTSTREAM))) [COND [(EQ STREAM T) (* ;; "Handle terminal differently. Mainly because we may be inside a blocked process's \fillbuffer, making READP think there is input. Ugh!!!") [COND ((STREAMPROP CHATSTREAM 'SEND.SCREEN.SIZE) (STREAMPROP CHATSTREAM 'SEND.SCREEN.SIZE NIL) (SETQ CSTRING (CONCAT (CHARACTER (CHARCODE ^\)) "s" (IQUOTIENT (fetch (CHAT.STATE TTYWIDTH) of STATE) (fetch (CHAT.STATE FONTWIDTH) of STATE)) ";" (IQUOTIENT (fetch (CHAT.STATE TTYHEIGHT) of STATE) (fetch (CHAT.STATE FONTHEIGHT) of STATE)) ";")) (UNINTERRUPTABLY (BKSYSBUF CSTRING))] (OR (TTY.PROCESSP) (\WAIT.FOR.TTY)) (COND ((\SYSBUFP) (do (SETQ CH (\GETKEY)) (BOUT CHATSTREAM (COND ((AND CHAT.META.ESC (NEQ (LOGAND CH 256) 0)) (BOUT CHATSTREAM 27) (LOGAND CH 127)) ((EQ CH CHAT.CONTROLCHAR) (* ; "Controlify it") (LOGAND (CHAT.BIN CHATSTREAM STATE) 31)) ((EQ CH CHAT.METACHAR) (* ; "Prefix meta, turn on 200q bit") (LOGOR (CHAT.BIN CHATSTREAM STATE) 128)) (T CH))) repeatwhile (\SYSBUFP)) (FORCEOUTPUT CHATSTREAM] (T [until (EOFP STREAM) do (BOUT CHATSTREAM (COND ((AND CHAT.META.ESC (NEQ (LOGAND (SETQ CH (\BIN STREAM)) 256) 0)) (BOUT CHATSTREAM 27) (LOGAND CH 127)) (T CH] (FORCEOUTPUT CHATSTREAM) (CLOSEF STREAM) (SETQ STREAM) (COND ((SETQ CHATPROMPTWINDOW (GETPROMPTWINDOW WINDOW NIL NIL T)) (* ; "Indicate completion of Input if came from menu command") (CLEARW CHATPROMPTWINDOW] (\TTYBACKGROUND)) (* ;; "Get here if we close connection.") [SELECTQ (fetch (CHAT.STATE RUNNING?) of STATE) (CLOSE (CHAT.CLOSE WINDOW)) (ABORT (CHAT.CLOSE WINDOW T)) (NIL (* ; "Already dead.")) (SHOULDNT (CONCAT "Unknown state in CHAT: " (fetch (CHAT.STATE RUNNING?) of STATE] (BLOCK]) (CHAT.TYPEOUT [LAMBDA (WINDOW DPYNAME CHAT.STATE) (* ; "Edited 4-Mar-89 21:44 by Randy.Gobbel") (bind (CNT _ 1) HANDLECHARFN MSG CH INSTREAM DSPSTREAM TYPESCRIPTSTREAM CRPENDING ESCPENDING TERM.STATE CHAT.OUTSTREAM first (SETQ INSTREAM (fetch (CHAT.STATE INSTREAM) of CHAT.STATE )) (SETQ CHAT.OUTSTREAM (fetch (CHAT.STATE OUTSTREAM) of CHAT.STATE )) (SETQ HANDLECHARFN (CADR (FASSOC DPYNAME CHAT.DRIVERTYPES))) (replace (CHAT.STATE TERM.STATE) of CHAT.STATE with (SETQ TERM.STATE (APPLY* (CADDR (FASSOC DPYNAME CHAT.DRIVERTYPES)) CHAT.STATE))) [COND [(EQ DPYNAME 'TEDIT) (SETQ DSPSTREAM (WINDOWPROP WINDOW 'TEXTSTREAM] (T (SETQ DSPSTREAM (WINDOWPROP WINDOW 'DSP] (* ; "TERM.HOME CHAT.STATE") while (IGEQ (SETQ CH (BIN INSTREAM)) 0) do (while (fetch (CHAT.STATE HELD) of CHAT.STATE) do (BLOCK)) (\CHECKCARET DSPSTREAM) (COND ((SETQ MSG (STREAMPROP INSTREAM 'MESSAGE)) (PRIN1 MSG DSPSTREAM) (STREAMPROP INSTREAM 'MESSAGE NIL))) (* ; "Print any protocol related msgs that might have come along while we where asleep") (SETQ CH (LOGAND CH (MASK.1'S 0 7))) (if ESCPENDING then (SETQ ESCPENDING NIL) (SELCHARQ CH (1 (if (NOT (fetch (CHAT.STATE CHATINEMACS) of CHAT.STATE)) then (CHAT.SWITCH.EMACS CHAT.STATE WINDOW) (STREAMPROP CHAT.OUTSTREAM 'SEND.SCREEN.SIZE T))) (0 (if (fetch (CHAT.STATE CHATINEMACS) of CHAT.STATE) then (CHAT.SWITCH.EMACS CHAT.STATE WINDOW))) (PROGN (SPREADAPPLY* HANDLECHARFN (CHARCODE ESC) CHAT.STATE TERM.STATE) (SPREADAPPLY* HANDLECHARFN CH CHAT.STATE TERM.STATE))) else (if (EQ CH (CHARCODE ESC)) then (SETQ ESCPENDING T) else (SPREADAPPLY* HANDLECHARFN CH CHAT.STATE TERM.STATE))) [COND ((SETQ TYPESCRIPTSTREAM (fetch (CHAT.STATE TYPESCRIPTSTREAM) of CHAT.STATE)) (COND ((SELCHARQ CH (CR (PROG1 CRPENDING (SETQ CRPENDING T))) (LF (COND (CRPENDING (\OUTCHAR TYPESCRIPTSTREAM (CHARCODE EOL)) (* ; "Have the typescript put turn crlf into whatever it likes for eol") (SETQ CRPENDING NIL)) (T T))) (PROGN (COND (CRPENDING (\BOUT TYPESCRIPTSTREAM (CHARCODE CR)) (SETQ CRPENDING NIL))) T)) (\BOUT TYPESCRIPTSTREAM CH] [COND (CHATDEBUGFLG (COND ((OR (EQ CHATDEBUGFLG T) (IGREATERP (add CNT 1) CHATDEBUGFLG)) (BLOCK) (SETQ CNT 1] finally (SELECTQ CH (-1 (CHAT.TYPEOUT.CLOSE WINDOW DSPSTREAM CHAT.STATE 'CLOSE "closed")) (-2 (CHAT.TYPEOUT.CLOSE WINDOW DSPSTREAM CHAT.STATE 'ABORT "aborted")) (CHAT.TYPEOUT.CLOSE WINDOW DSPSTREAM CHAT.STATE 'CLOSE "closed somehow")) (COND ((NOT (OPENWP WINDOW)) (DEL.PROCESS (WINDOWPROP WINDOW 'PROCESS]) (CHAT.SCREENPARAMS [LAMBDA (CHAT.STATE INSTREAM WINDOW) (* ; "Edited 4-Mar-89 22:09 by Randy.Gobbel") (* ;; "Sends screen width, height to partner and updates title. If INSTREAM is NIL then only update title.") (PROG ((HEIGHT (IMIN [IQUOTIENT (WINDOWPROP WINDOW 'HEIGHT) (IABS (DSPLINEFEED NIL (WINDOWPROP WINDOW 'DSP] 127)) (WIDTH (IMIN (LINELENGTH NIL WINDOW) 127)) (TITLE (WINDOWPROP WINDOW 'TITLE)) EMACSMODE TITLEMIDDLE) (COND (INSTREAM (CHAT.SENDSCREENPARAMS INSTREAM HEIGHT WIDTH))) [WINDOWPROP WINDOW 'TITLE (CONCAT (SUBSTRING TITLE 1 (SUB1 (OR (SETQ TITLEMIDDLE (STRPOS ", height" TITLE)) 0))) ", height = " HEIGHT ", width = " WIDTH (COND [[OR (SETQ EMACSMODE (fetch (CHAT.STATE CHATINEMACS ) of CHAT.STATE )) (AND TITLEMIDDLE (NOT (FIXP (NTHCHAR TITLE -1] (CONCAT ", Emacs " (COND (EMACSMODE "ON") (T "OFF"] (T ""] (COND (EMACSMODE (STREAMPROP (fetch (CHAT.STATE OUTSTREAM) of CHAT.STATE) 'SEND.SCREEN.SIZE T]) ) [XCL:REINSTALL-ADVICE 'CHAT.INIT :AFTER '((:LAST (WINDOWPROP WINDOW 'RIGHTBUTTONFN (FUNCTION CHAT.BUTTONFN] [XCL:REINSTALL-ADVICE 'CHAT.CLOSE :AFTER '((:LAST (WINDOWPROP WINDOW 'RIGHTBUTTONFN NIL] (READVISE CHAT.INIT CHAT.CLOSE) (PUTPROPS CHATEMACS COPYRIGHT ("Xerox Corporation" 1987 1988 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1254 18858 (CHAT.BUTTONFN 1264 . 3610) (CHAT.TYPEIN 3612 . 11510) (CHAT.TYPEOUT 11512 . 16871) (CHAT.SCREENPARAMS 16873 . 18856))))) STOP \ No newline at end of file diff --git a/lispusers/CHATEMACS.TEDIT b/lispusers/CHATEMACS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..f63627c6b844aa6f9569b528471035e0d2410b4c GIT binary patch literal 7205 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.;11 47957 changes to%: (FNS CHATSERVEROPENFN) previous date%: "19-May-88 00:37:49" {ERINYES}MEDLEY>CHATSERVER.;10) (* " Copyright (c) 1984, 1985, 1986, 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CHATSERVERCOMS) (RPAQQ CHATSERVERCOMS [(FNS CHATSERVER CHATSERVERWHENCLOSEDFN CHATSERVEROPENFN DOBE REQUIRED.LOGIN SERVER-EXEC SWEEP.OFD \CLEARSYSBUF PROMPTFORWORD \CREATELINEBUFFER \PROMPTFORWORDBIN \REMOTE.BIN \REMOTE.EXEC.OUTCHARFN CHATSERVER.FONT) (DECLARE%: DONTEVAL@LOAD DOCOPY (VARS (DISPLAYTERMFLG 'DM)) (INITVARS (CHATSERVER.PROFILE) (\SIMPLEIMAGEOPS)) (P (SETQ CHATSERVERTTBL (COPYTERMTABLE 'ORIG)) (for I from 1 to 8 do (ECHOCHAR I 'IGNORE CHATSERVERTTBL) (ECHOCHAR I 'IGNORE ASKUSERTTBL)) (ECHOCHAR (CHARCODE CR) 'SIMULATE CHATSERVERTTBL) (ECHOCHAR (CHARCODE CR) 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE CHATSERVERTTBL))) (ADDVARS (\SWEPT.OFDS)) (DECLARE%: EVAL@COMPILE DONTCOPY (P (CHECKIMPORTS '(LLCHAR ATERM IMAGEIO FILEIO ATBL AOFD) T))) [COMS (FNS SIMPLECHATSERVER) (INITVARS (CHATSERVERWINDOW) (CHATSERVERWINDOWREGION '(11 228 392 190] (MACROS \SYNCODE) (DECLARE%: DONTEVAL@LOAD DOCOPY (FILES CL-TTYEDIT SIMPLECHAT) (ADVISE MENU CHAT RINGBELLS)) (COMMANDS "QUIT" "SAY") (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA \REMOTE.BIN CHATSERVEROPENFN]) (DEFINEQ (CHATSERVER [LAMBDA NIL (* ; "Edited 18-May-88 23:56 by amd") (PROMPTPRINT "Remote CHAT connection attempted") (PRINTOUT T "Remote " HERALDSTRING T T) (CL:UNWIND-PROTECT [COND ((AND (LISTGET CHATSERVER.PROFILE 'IDLE.ONLY) (NOT \IDLING)) (PRINTOUT T " Machine not in idle mode, login not allowed " T) (DISMISS 10000)) (T (COND ((LET ((PROFILE (APPEND CHATSERVER.PROFILE IDLE.PROFILE))) (OR (REQUIRED.LOGIN PROFILE) (REQUIRED.LOGIN PROFILE) (REQUIRED.LOGIN PROFILE))) (* ; "try three times") (PROMPTPRINT "Remote CHAT exec in use") (PRINTOUT T (IF \IDLING THEN "[Idling, " ELSE "[Not in Idle, ") "last user action " (GDATE (ALTO.TO.LISP.DATE \LASTUSERACTION)) "]" T) (LET ((*PACKAGE* (CL:FIND-PACKAGE "XCL-USER")) (*READTABLE* (FIND-READTABLE "XCL"))) (SERVER-EXEC))) (T (PRINTOUT T T "Sorry... bye" T] (PROMPTPRINT "Remote CHAT disconnect"]) (CHATSERVERWHENCLOSEDFN [LAMBDA (STREAM) (* ; "Edited 6-Oct-87 11:43 by Masinter") (* ;; "when a connection gets closed, signal the server process to abort") (LET [(PROC (STREAMPROP STREAM 'SERVER.PROCESS] (AND PROC (FIND.PROCESS PROC) (DEL.PROCESS PROC]) (CHATSERVEROPENFN [CL:LAMBDA (*KEYBOARD-STREAM* OUTSTREAM) (* ; "Edited 2-Sep-88 23:36 by masinter") (* ;; "code common to all chat servers") (CL:UNWIND-PROTECT [PROGN (LINELENGTH 80 OUTSTREAM) (PAGEHEIGHT 24 OUTSTREAM) (STREAMPROP *KEYBOARD-STREAM* 'SERVER.PROCESS (THIS.PROCESS)) (STREAMPROP *KEYBOARD-STREAM* 'AFTERCLOSE 'CHATSERVERWHENCLOSEDFN) (STREAMPROP OUTSTREAM 'SERVER.PROCESS (THIS.PROCESS)) (STREAMPROP OUTSTREAM 'AFTERCLOSE 'CHATSERVERWHENCLOSEDFN) [COND ((fetch (FDEV BUFFERED) of (fetch (STREAM DEVICE) of OUTSTREAM )) (* ;; "output is a buffered device: spawn/restart process to send it out") (pushnew \SWEPT.OFDS OUTSTREAM) (DEL.PROCESS 'SWEEP.OFD) (ADD.PROCESS '(SWEEP.OFD] [OR \SIMPLEIMAGEOPS (SETQ \SIMPLEIMAGEOPS (create IMAGEOPS using \NOIMAGEOPS IMFONT _ 'CHATSERVER.FONT] (AND (EQ (fetch IMAGEOPS of OUTSTREAM) \NOIMAGEOPS) (replace IMAGEOPS of OUTSTREAM with \SIMPLEIMAGEOPS)) (replace (STREAM OUTCHARFN) of OUTSTREAM with (FUNCTION \REMOTE.EXEC.OUTCHARFN )) (replace (STREAM EOLCONVENTION) of OUTSTREAM with CRLF.EOLC) (if (EQ (fetch (STREAM STRMBINFN) of *KEYBOARD-STREAM*) (fetch (FDEV BIN) (fetch (STREAM DEVICE) *KEYBOARD-STREAM*))) then (replace (STREAM STRMBINFN) of *KEYBOARD-STREAM* with '\REMOTE.BIN) elseif (NOT (EQ (fetch (STREAM STRMBINFN) of *KEYBOARD-STREAM*) '\REMOTE.BIN)) then (PRINTOUT OUTSTREAM "[Interrupts not enabled]" T)) (LET* ((BUFFERED (\CREATELINEBUFFER *KEYBOARD-STREAM*)) (\TERM.OFD OUTSTREAM) (*STANDARD-OUTPUT* \TERM.OFD) (\LINEBUF.OFD BUFFERED) (*STANDARD-INPUT* \LINEBUF.OFD) (*TRACE-OUTPUT* *STANDARD-OUTPUT*)) (DECLARE (CL:SPECIAL PROMPTWINDOW \TERM.OFD *STANDARD-OUTPUT* \LINEBUF.OFD *STANDARD-INPUT*)) (HANDLER-BIND [(XCL:STREAM-NOT-OPEN (FUNCTION (LAMBDA (COND) (IF (FMEMB (XCL:STREAM-NOT-OPEN-STREAM COND) (LIST OUTSTREAM INSTREAM (FULLNAME OUTSTREAM) (FULLNAME INSTREAM))) THEN (RESET) (* ; " abort") ELSE NIL (* ; "ignore")] (CHATSERVER] (SETQ \SWEPT.OFDS (REMOVE OUTSTREAM \SWEPT.OFDS)))]) (DOBE [LAMBDA NIL (FLUSHOUTPUT T T]) (REQUIRED.LOGIN [LAMBDA (PROFILE) (* ; "Edited 30-Oct-87 16:13 by masinter") (PROG ((GROUP (LISTGET PROFILE 'ALLOWED.LOGINS)) (AUTHTYPE (LISTGET PROFILE 'AUTHENTICATE)) (NAME (USERNAME NIL NIL T)) PWD) (COND ((NLISTP GROUP) (* ; "no login check at all") (COND ((LISTGET PROFILE 'FORGET) (SETPASSWORD NIL NAME ""))) (RETURN T))) (COND ((EQ 0 (NCHARS NAME)) (* ;  "Not logged in, so don't complain about anything") (RETURN T))) CLEAR (CLEARBUF T T) (SETQ NAME (USERNAME NIL NIL T)) (SETQ PWD NIL) RETRY (COND [(AND (EQUAL GROUP '(T)) NAME) (* ;  "Only previous user allowed to login") (SETQ PWD (PROMPTFORWORD (CONCAT NAME " password:") NIL NIL NIL '*] (T [SETQ NAME (PROMPTFORWORD "Login ( to terminate): " NAME NIL T NIL T (CHARCODE (CR LF] (if (MEMBER NAME '("Logon" "ogon")) then (GO CLEAR)) (SETQ PWD (PROMPTFORWORD " (password) " NIL NIL T '*)) (TERPRI T))) (if (EQUAL PWD "Logon") then (GO CLEAR)) (RETURN (COND ((NULL PWD) NIL) ([AND (OR (MEMB T GROUP) (MEMB '* GROUP)) (\IDLE.IS.PREVIOUS NAME PWD (EQUAL GROUP '(T] (* ;; "Previous user is allowed to login. Also, if only allowed login is old user, but old password is unknown, allow it") T) ((\IDLE.ISMEMBER GROUP NAME PWD) (PROG1 (COND ((COND [AUTHTYPE (\IDLE.AUTHENTICATE NAME PWD AUTHTYPE (NOT (MEMB T GROUP] (T T)) (AND (LISTGET PROFILE 'FORGET) (SETPASSWORD NIL NAME PWD)) (SETQ \IDLE.PASSWORD.SET T) T)) (TERPRI T))) (T (PRINTOUT T "login incorrect" T) NIL]) (SERVER-EXEC [LAMBDA NIL (* ; "Edited 6-Oct-87 16:37 by Masinter") (\CALLME 'T) (do (EXEC :TOP-LEVEL-P T]) (SWEEP.OFD [LAMBDA NIL (* lmm "15-Mar-86 14:40") (while \SWEPT.OFDS do (for X in \SWEPT.OFDS do (if (if (NLISTP X) then [OR (NOT (OPENP X 'OUTPUT)) (NOT (NLSETQ (FORCEOUTPUT X] else T) then (SETQ \SWEPT.OFDS (REMOVE X \SWEPT.OFDS))) (BLOCK]) (\CLEARSYSBUF [LAMBDA (ALLFLG) (* ; "Edited 30-Oct-87 11:07 by Masinter") (LET ((KEY (fetch (LINEBUFFER KEYBOARDSTREAM) of \LINEBUF.OFD))) (while (READP KEY) do (BIN KEY]) (PROMPTFORWORD [LAMBDA (PROMPT.STR CANDIDATE.STR GENERATE?LIST.FN ECHO.CHANNEL DONTECHOTYPEIN.FLG URGENCY.OPTION TERMINCHARS.LST KEYBD.CHANNEL) (* lmm "16-Jan-86 18:07") (DECLARE (SPECVARS TERMINCHARS.LST ECHO.CHANNEL DONTECHOTYPEIN.FLG)) [COND ((NOT (TERMTABLEP \PROMPTFORWORDTTBL)) (* ;  "Initializes the special readtable on the first time through.") (SETQ \PROMPTFORWORDTTBL (bind (TTBL _ (COPYTERMTABLE 'ORIG)) for CHAR from 0 to 31 do (SELCHARQ CHAR ((EOL ESCAPE SPACE LF TAB)) (ECHOCHAR CHAR 'INDICATE TTBL)) finally (PROGN (ECHOMODE NIL TTBL) (CONTROL T TTBL) (RETURN TTBL] (RESETLST (RESETSAVE (SETTERMTABLE \PROMPTFORWORDTTBL)) (PROG ([CHARBUFFER (COND (CANDIDATE.STR (DREVERSE (CHCON CANDIDATE.STR] TTYD X0Y0 TIMELIMITEXPIRED? BELLBEENHEARD? CANDIDATATE.LENGTH CHAR BEGUNTYPING? RUBBING? ?HELPMSGTRIEDP ?HELPMSGLIST TIMER) (DECLARE (SPECVARS TTYD X0Y0 TIMELIMITEXPIRED? BELLBEENHEARD? CHARBUFFER RUBBING?)) [COND [(EQMEMB 'TTY URGENCY.OPTION) (* ;  "If we're going to switch the TTY process, better do it before looking for TTYDISPLAYSTREAM etc.") [OR (TTY.PROCESSP) (RESETSAVE (TTY.PROCESS (THIS.PROCESS] (AND \PROMPTFORWORD.CURSOR (RESETSAVE (CURSOR \PROMPTFORWORD.CURSOR] (T (OR (FIXP URGENCY.OPTION) (SELECTQ URGENCY.OPTION ((NIL T) T) NIL) (\ILLEGAL.ARG URGENCY.OPTION] (SETQ ECHO.CHANNEL (GETSTREAM (OR ECHO.CHANNEL T) 'OUTPUT)) (* ; "Normalize the echo channel.") (CL:WHEN (SETQ TTYD (DISPLAYSTREAMP ECHO.CHANNEL)) (RESETSAVE (TTYDISPLAYSTREAM ECHO.CHANNEL))) [COND ((AND DONTECHOTYPEIN.FLG (NEQ DONTECHOTYPEIN.FLG T)) (SETQ DONTECHOTYPEIN.FLG (COND ((EQ (NCHARS DONTECHOTYPEIN.FLG) 1) (NTHCHARCODE DONTECHOTYPEIN.FLG 1)) (T T] (COND [(NULL TERMINCHARS.LST) (SETQ TERMINCHARS.LST (CHARCODE (EOL ESCAPE SPACE LF TAB] ((CHARCODEP TERMINCHARS.LST) (SETQ TERMINCHARS.LST (LIST TERMINCHARS.LST))) ([OR (NLISTP TERMINCHARS.LST) (for C in TERMINCHARS.LST bind CONVERTIBLEP unless (CHARCODEP C) do (COND ((AND (OR (LITATOM C) (STRINGP C)) (EQ 1 (NCHARS C))) (SETQ CONVERTIBLEP T)) (T (RETURN T))) finally (COND (CONVERTIBLEP (* ;  "List not all charcodes, but all are at least charcode like") (SETQ TERMINCHARS.LST (MAPCAR TERMINCHARS.LST (FUNCTION (LAMBDA (C) (OR (FIXP C) (CHCON1 C] (\ILLEGAL.ARG TERMINCHARS.LST))) [COND (KEYBD.CHANNEL (SETQ KEYBD.CHANNEL (\INSTREAMARG KEYBD.CHANNEL] [COND (URGENCY.OPTION (SETQ TIMER (SETUPTIMER (OR (FIXP URGENCY.OPTION) 0) NIL 'SECONDS] (* ;;; "Now ready to begin. Print the prompt, gather input") PROMPTAGAIN (COND (PROMPT.STR (PRIN3 PROMPT.STR ECHO.CHANNEL) (PRIN3 " " ECHO.CHANNEL))) [COND (TTYD (SETQ X0Y0 (create POSITION XCOORD _ (DSPXPOSITION NIL TTYD) YCOORD _ (DSPYPOSITION NIL TTYD] (COND (CHARBUFFER (* ;; "If there is input, e.g. the candidate string, echo it. This is the one place calling \PROMPTFORWORDRETYPE that doesn't want the line erased first.") (\PROMPTFORWORDRETYPE))) [until (OR (NULL (SETQ CHAR (\PROMPTFORWORDBIN KEYBD.CHANNEL TTYD URGENCY.OPTION TIMER))) (FMEMB CHAR TERMINCHARS.LST)) do (COND ((SELECTQ (GETSYNTAX CHAR \PROMPTFORWORDTTBL) (CHARDELETE (COND (CHARBUFFER (SETQ BEGUNTYPING? T) (\PROMPTFORWORDBS)) (T (SETQ RUBBING?))) NIL) (LINEDELETE (COND (CHARBUFFER (COND ((NEQ DONTECHOTYPEIN.FLG T) (\PROMPTFORWORDERASE))) (SETQ BEGUNTYPING? T) (SETQ CHARBUFFER)) (T (SETQ RUBBING?))) NIL) (RETYPE (COND (CHARBUFFER (COND ((NEQ DONTECHOTYPEIN.FLG T) (\PROMPTFORWORDERASE))) (\PROMPTFORWORDRETYPE)) (T (SETQ RUBBING?))) NIL) (WORDDELETE (COND [CHARBUFFER (SETQ BEGUNTYPING? T) (bind (SPACEP _ (SYNTAXP (CAR CHARBUFFER) 'WORDSEPR \PROMPTFORWORDTTBL)) do (\PROMPTFORWORDBS) (COND ((NULL CHARBUFFER) (RETURN))) (SETQ CHAR (CAR CHARBUFFER)) (COND [(NOT SPACEP) (COND ((SYNTAXP CHAR 'WORDSEPR \PROMPTFORWORDTTBL) (RETURN] ((NOT (SYNTAXP CHAR 'WORDSEPR \PROMPTFORWORDTTBL)) (SETQ SPACEP NIL] (T (SETQ RUBBING?))) NIL) (CNTRLV (COND ((NOT DONTECHOTYPEIN.FLG) (* ;; "Well, so echo the ^V SO THAT THE LOSER CAN SEE THAT HE'S IN THE STATE OF WAITING FOR THE NEXT CHARACTER AFTER A ^V") (COND ((AND RUBBING? (NOT TTYD)) (BOUT ECHO.CHANNEL (CHARCODE \)) (SETQ RUBBING?))) (PRIN3 (CHARACTER CHAR) ECHO.CHANNEL))) (COND ((NULL (SETQ CHAR (\PROMPTFORWORDBIN KEYBD.CHANNEL TTYD URGENCY.OPTION TIMER T))) (RETURN T))) (COND ((AND TTYD (NOT DONTECHOTYPEIN.FLG) (NULL (DSPRUBOUTCHAR TTYD CHAR))) (* ;; "Well, we tried to erase the ^V so that the typed-in charcter could be echoed, but apparently the ^V was split between lines.") (\PROMPTFORWORDERASE) (\PROMPTFORWORDRETYPE))) T) (COND ((EQ CHAR (CHARCODE ?)) (FRESHLINE ECHO.CHANNEL) [COND ((AND GENERATE?LIST.FN (NOT ?HELPMSGTRIEDP)) (SETQ ?HELPMSGLIST (OR (STRINGP GENERATE?LIST.FN) (APPLY* GENERATE?LIST.FN PROMPT.STR CANDIDATE.STR))) (SETQ ?HELPMSGTRIEDP T)) ((NOT ?HELPMSGTRIEDP) (SETQ ?HELPMSGLIST '??] (COND ((LISTP ?HELPMSGLIST) (PRIN3 '{ ECHO.CHANNEL) (PRIN3 (CONSTANT (CHARACTER (CHARCODE SPACE))) ECHO.CHANNEL) [MAPC ?HELPMSGLIST (FUNCTION (LAMBDA (X) (PRIN1 X ECHO.CHANNEL) (PRIN3 (CONSTANT (CHARACTER (CHARCODE SPACE))) ECHO.CHANNEL] (PRIN3 '} ECHO.CHANNEL)) (T (PRIN1 ?HELPMSGLIST ECHO.CHANNEL) (* ;  "FOO we'd really like this FRESHLINE to be just a MOVETO some initial position.") )) (FRESHLINE ECHO.CHANNEL) (GO PROMPTAGAIN)) (T T))) (* ;  "If the SELCHARQ does't select out any of its 'special' characters, then just fall through here") (COND ((AND (NOT BEGUNTYPING?) CHARBUFFER) (* ;; "This is the case of the CANDIDATE.STR having been proffered, but the user starts typing something else.") (COND ((EQ CHAR (CHARCODE SPACE)) (* ;; "Special kludge for benefit of those with old space-terminating habits: If there is a candidate string, and the first thing you do is type a space, then the space terminates even if it isn't a member of TERMINCHARS.LST") (RETURN))) (COND ((NOT DONTECHOTYPEIN.FLG) (* ;  "Don't need to do anything if type-in isn't being echoed") (\PROMPTFORWORDERASE))) (SETQ CHARBUFFER))) (push CHARBUFFER CHAR) (SETQ BEGUNTYPING? T) (COND ((NEQ DONTECHOTYPEIN.FLG T) (* ;  "Well, so echo the typed-in character already!") (COND ((AND RUBBING? (NOT TTYD)) (PRIN3 '\ ECHO.CHANNEL) (SETQ RUBBING?))) (BOUT ECHO.CHANNEL (OR DONTECHOTYPEIN.FLG CHAR] [SETQ CHARBUFFER (COND [TIMELIMITEXPIRED? (* ;  "Ha, we overflowed the time limit.") (COND (CANDIDATE.STR (CONCAT CANDIDATE.STR] (CHARBUFFER (CONCATCODES (DREVERSE CHARBUFFER] (\CARET.DOWN ECHO.CHANNEL) (RETURN CHARBUFFER]) (\CREATELINEBUFFER [LAMBDA (TERMINAL.STREAM) (* ; "Edited 13-Apr-87 22:57 by bvm:") (* ;;  "Create a new stream that buffers the raw input from TERMINAL.STREAM (default is the keyboard).") (LET* ([STREAM (\OPENFILE '{LINEBUFFER} 'BOTH 'NEW '((CHARSET T] (DEV (fetch (STREAM DEVICE) of STREAM)) EOFMETHOD) (replace LINEBUFSTATE of STREAM with READING.LBS) (replace (LINEBUFFER KEYBOARDSTREAM) of STREAM with (OR TERMINAL.STREAM \KEYBOARD.STREAM)) (replace USERCLOSEABLE of STREAM with NIL) (replace USERVISIBLE of STREAM with NIL) (* ;  "Other linebuffer fields default properly") [replace ENDOFSTREAMOP of STREAM with (FUNCTION (LAMBDA (STREAM) (CL:FUNCALL \RefillBufferFn] (if (AND TERMINAL.STREAM (NEQ (SETQ EOFMETHOD (fetch (FDEV EOFP) of (fetch (STREAM DEVICE) TERMINAL.STREAM))) 'NILL)) then (* ;; "Need to install an eof method for the buffered stream that looks at TERMINAL.STREAM when the buffer runs out. This is optimized away for the normal keyboard case, which never runs out.") (replace (STREAM DEVICE) of STREAM with (SETQ DEV (NCREATE 'FDEV DEV))) (* ;  "Copy the basic linebuffer device") (replace (FDEV EOFP) of DEV with EOFMETHOD)) STREAM]) (\PROMPTFORWORDBIN [LAMBDA (INSTREAM DISPLAYECHOSTREAM URGENCY.OPTION TIMER) (* ; "Edited 7-Oct-87 11:25 by Masinter") (* ;  "Takes in one character from the KEYBD.CHANNEL") (DECLARE (USEDFREE TERMINCHARS.LST TIMELIMITEXPIRED? BELLBEENHEARD?)) (PROG ((WAITINTERVAL.secs 15) (TTYWAITLIMIT (if URGENCY.OPTION then (if BELLBEENHEARD? then 30000 else 0))) [BROADURGENCY? (AND URGENCY.OPTION (NOT (FIXP URGENCY.OPTION] CHAR READABLE (KEYSTREAM (fetch (LINEBUFFER KEYBOARDSTREAM) of \LINEBUF.OFD))) NEXTROUND [if BROADURGENCY? then (SETQ TIMER (SETUPTIMER WAITINTERVAL.secs TIMER 'SECONDS] LP (if (SETQ READABLE (OR INSTREAM (NEQ KEYSTREAM \KEYBOARD.STREAM) (WAIT.FOR.TTY TTYWAITLIMIT))) then (* ; "Ready to read") (if (SETQ CHAR (if (NULL INSTREAM) then (if (READP KEYSTREAM T) then (BIN KEYSTREAM)) elseif (READP INSTREAM T) then (BIN INSTREAM) elseif (EOFP INSTREAM) then (CAR TERMINCHARS.LST))) then (RETURN CHAR)) (if DISPLAYECHOSTREAM then (* ;  "\TTYBACKGROUND so that a caret will flash") (\TTYBACKGROUND) else (BLOCK))) (if (AND TIMER (TIMEREXPIRED? TIMER 'SECONDS)) then (if (AND URGENCY.OPTION (NOT BROADURGENCY?)) then (SETQ TIMELIMITEXPIRED? T) (RETURN)) else (SETQ TTYWAITLIMIT 30000) (AND READABLE (GO LP))) (if (NULL BELLBEENHEARD?) then (SETQ BELLBEENHEARD? T) (RINGBELLS)) [if (AND BROADURGENCY? (TTY.PROCESSP)) then (* ;; "Double the wait interval time (the time between 'flashings') up to about 2 minutes, so that it doesn't become obnoxious") (SETQ WAITINTERVAL.secs (IMIN (LLSH WAITINTERVAL.secs 1) (TIMES 2 60] (GO NEXTROUND]) (\REMOTE.BIN [CL:LAMBDA (STREAM) (* ; "Edited 30-Oct-87 10:47 by Masinter") (CL:MACROLET [(REALBIN NIL '(CL:FUNCALL (FETCH (FDEV BIN) (fetch (STREAM DEVICE) STREAM)) STREAM)) (CLR NIL '(while (READP STREAM) do (REALBIN] (PROG (CH) RETRY (SELCHARQ (SETQ CH (REALBIN)) (^E (CLR) (ERROR!)) (^D (CLR) (RESET)) (^B (CLR) (\DOHELPINTERRUPT1) (GO RETRY)) (^T (CL:CATCH 'DONE (PROG ((CNT 0)) (FRESHLINE T) [BACKTRACE -2 T NIL T (FUNCTION (LAMBDA (X) (PRIN1 (if (EQ CNT 0) then "Running in " else " in ") T) (CL:PRIN1 X *TERMINAL-IO*) (if (IGEQ (add CNT 1) 5) then (CL:THROW 'DONE NIL] (FRESHLINE T))) (GO RETRY)) NIL) (RETURN CH]) (\REMOTE.EXEC.OUTCHARFN [LAMBDA (STREAM CHARCODE) (* ; "Edited 11-Oct-87 23:17 by Masinter") (* ; "OUTCHARFN for standard files") [SELECTC (ffetch CCECHO of (\SYNCODE \PRIMTERMSA CHARCODE)) (INDICATE.CCE (* ;  "Make sure that all the chars in the indicate-string fit on the line or wrap-around together.") (CL:MAP NIL #'[LAMBDA (CH) (CL:WRITE-CHAR CH STREAM) (CL:INCF (ffetch CHARPOSITION of STREAM] ( \INDICATESTRING CHARCODE))) (IGNORE.CCE) (PROGN (if (EQ CHARCODE ERASECHARCODE) then (BOUT STREAM (CHARCODE ^H)) (BOUT STREAM (CHARCODE SPACE)) (BOUT STREAM (CHARCODE ^H)) (add (fetch CHARPOSITION of STREAM) -1) else (SELCHARQ CHARCODE ((EOL CR LF) (BLOCK) [COND ([OR (EQ \CURRENTDISPLAYLINE -1) (AND (SMALLP \CURRENTDISPLAYLINE) (EQ \#DISPLAYLINES (SETQ \CURRENTDISPLAYLINE (ADD1 \CURRENTDISPLAYLINE] (SETQ \CURRENTDISPLAYLINE 0) (LET ((KEYSTREAM (fetch (LINEBUFFER KEYBOARDSTREAM) of \LINEBUF.OFD))) (COND ((READP KEYSTREAM)) (T (PRIN1 \STOPSCROLLMESSAGE STREAM) (SELCHARQ (BIN KEYSTREAM) (^B (INTERRUPT)) (^E (ERROR!)) NIL) (* ; "Now erase the message") (FRPTQ (NCHARS \STOPSCROLLMESSAGE) (\REMOTE.EXEC.OUTCHARFN STREAM ERASECHARCODE)) (BLOCK] (BOUT STREAM (SELECTC (ffetch EOLCONVENTION of STREAM) (CR.EOLC (CHARCODE CR)) (LF.EOLC (CHARCODE LF)) (CRLF.EOLC (* ;; "The CRLF is EOL only if the bytes are immediately adjacent in the stream, with no additional encoding bytes") (BOUT STREAM (CHARCODE CR)) (CHARCODE LF)) (SHOULDNT))) (freplace CHARPOSITION of STREAM with 0)) (ESCAPE (BOUT STREAM (CHARCODE $)) (add (ffetch CHARPOSITION of STREAM) 1)) (TAB (SPACES (DIFFERENCE 8 (IMOD (POSITION) 8)) STREAM)) (PROGN (BOUT STREAM CHARCODE) (add (ffetch CHARPOSITION of STREAM) 1] CHARCODE]) (CHATSERVER.FONT [LAMBDA (STREAM FONT) (* lmm "20-Nov-86 00:01") (SELECTQ DISPLAYTERMFLG (DM [COND ((OR (EQ BOLDFONT FONT) (EQ FONT LAMBDAFONT)) (BOUT STREAM (CHARCODE ^N))) (T (BOUT STREAM (CHARCODE ^X)) (BOUT STREAM (CHARCODE "^]"]) NIL]) ) (DECLARE%: DONTEVAL@LOAD DOCOPY (RPAQQ DISPLAYTERMFLG DM) (RPAQ? CHATSERVER.PROFILE ) (RPAQ? \SIMPLEIMAGEOPS ) (SETQ CHATSERVERTTBL (COPYTERMTABLE 'ORIG)) (for I from 1 to 8 do (ECHOCHAR I 'IGNORE CHATSERVERTTBL) (ECHOCHAR I 'IGNORE ASKUSERTTBL)) (ECHOCHAR (CHARCODE CR) 'SIMULATE CHATSERVERTTBL) (ECHOCHAR (CHARCODE CR) 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE CHATSERVERTTBL) ) (ADDTOVAR \SWEPT.OFDS ) (DECLARE%: EVAL@COMPILE DONTCOPY (CHECKIMPORTS '(LLCHAR ATERM IMAGEIO FILEIO ATBL AOFD) T) ) (DEFINEQ (SIMPLECHATSERVER [LAMBDA (INSTREAM OUTSTREAM) (* ; "Edited 6-Oct-87 14:37 by Masinter") (if NIL then (PRINTOUT OUTSTREAM "Simple chat echo service") (do (\OUTCHAR OUTSTREAM (BIN INSTREAM))) else (PROG ([WINDOW (OR CHATSERVERWINDOW (SETQ CHATSERVERWINDOW (CREATEW CHATSERVERWINDOWREGION "Chat Listener"] (KEYSTREAM \KEYBOARD.STREAM) MYSTREAM) (printout OUTSTREAM "Xerox Lisp Chat echo service" T) (CLEARW WINDOW) (SETQ MYSTREAM (GETSTREAM WINDOW 'OUTPUT)) [WINDOWPROP WINDOW 'CLOSEFN (FUNCTION (LAMBDA (W) (SETQ SIMPLECHATSERVERDONE T) (AND (OPENWP W) (WINDOWPROP W 'TITLE "Connection closed"] (WINDOWPROP WINDOW 'PROCESS (THIS.PROCESS)) (bind CH do (while (READP INSTREAM) do (\OUTCHAR OUTSTREAM (SETQ CH (BIN INSTREAM))) (\OUTCHAR MYSTREAM CH)) (BLOCK) (while (READP KEYSTREAM) do (\OUTCHAR OUTSTREAM (SETQ CH (BIN KEYSTREAM))) (\OUTCHAR MYSTREAM CH)) (if (EQ (TTY.PROCESS) (THIS.PROCESS)) then (\TTYBACKGROUND) else (BLOCK))) (printout MYSTREAM T T "Connection closed" T) (WINDOWPROP WINDOW 'TITLE "Connection closed") (WINDOWPROP WINDOW 'CLOSEFN NIL))) (* ;;; "The following isn't executed") ]) ) (RPAQ? CHATSERVERWINDOW ) (RPAQ? CHATSERVERWINDOWREGION '(11 228 392 190)) (DECLARE%: EVAL@COMPILE [PROGN (PUTPROPS \SYNCODE DMACRO [OPENLAMBDA (TABLE CHAR) (CHECK (type? CHARTABLE TABLE)) (* ;  "0 is either NONE.TC, REAL.CCE, or OTHER.RC") (COND ((IGREATERP CHAR \MAXTHINCHAR) (OR (AND (fetch (CHARTABLE NSCHARHASH) of TABLE) (GETHASH CHAR (fetch (CHARTABLE NSCHARHASH) of TABLE))) 0)) (T (\GETBASEBYTE TABLE CHAR]) (PUTPROPS \SYNCODE MACRO [OPENLAMBDA (TABLE CHAR) (CHECK (type? CHARTABLE TABLE)) (COND ((IGREATERP CHAR \MAXTHINCHAR) (OR (AND (fetch (CHARTABLE NSCHARHASH) of TABLE) (GETHASH CHAR (fetch (CHARTABLE NSCHARHASH) of TABLE))) 0)) (T (\GETBASEBYTE TABLE CHAR])] ) (DECLARE%: DONTEVAL@LOAD DOCOPY (FILESLOAD CL-TTYEDIT SIMPLECHAT) [XCL:REINSTALL-ADVICE 'MENU :BEFORE '((:LAST (OR (DISPLAYSTREAMP \TERM.OFD) (RETURN (ASKUSER NIL NIL (OR (FETCH (MENU TITLE) MENU) "Menu choice:") (MAPCAR (FETCH (MENU ITEMS) MENU) (FUNCTION (LAMBDA (X) (COND ((LISTP X) (LIST (CAR X) "" 'RETURN (CADR X))) (T X] [XCL:REINSTALL-ADVICE 'CHAT :BEFORE '((:LAST (AND (NOT WINDOW) (NOT FROMMENU) (NOT (DISPLAYSTREAMP (TTYDISPLAYSTREAM))) (RETURN (TTYCHAT HOST LOGOPTION] [XCL:REINSTALL-ADVICE 'RINGBELLS :BEFORE '((:LAST (OR (WFROMDS \TERM.OFD) (RETURN (RPTQ (OR (FIXP N) 1) (BOUT \TERM.OFD 7] (READVISE MENU CHAT RINGBELLS) ) (DEFCOMMAND "QUIT" () (RETFROM 'CHATSERVEROPENFN)) (DEFCOMMAND "SAY" (&REST LINE) [MAPC \PROCESSES (FUNCTION (LAMBDA (PROC) (CL:WHEN (STRPOS "CHAT.SERVER" (PROCESS.NAME PROC)) (MAPRINT LINE (IF (EQ PROC (THIS.PROCESS)) THEN *STANDARD-OUTPUT* ELSE (EVALV '*STANDARD-OUTPUT* PROC)) " " " "))] (MAPRINT LINE PROMPTWINDOW " " " ") (CL:VALUES)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA \REMOTE.BIN CHATSERVEROPENFN) ) (PRETTYCOMPRINT CHATSERVERCOMS) (RPAQQ CHATSERVERCOMS [(FNS CHATSERVER CHATSERVERWHENCLOSEDFN CHATSERVEROPENFN DOBE REQUIRED.LOGIN SERVER-EXEC SWEEP.OFD \CLEARSYSBUF PROMPTFORWORD \CREATELINEBUFFER \PROMPTFORWORDBIN \REMOTE.BIN \REMOTE.EXEC.OUTCHARFN CHATSERVER.FONT) (DECLARE%: DONTEVAL@LOAD DOCOPY (VARS (DISPLAYTERMFLG 'DM)) (INITVARS (CHATSERVER.PROFILE) (\SIMPLEIMAGEOPS)) (P (SETQ CHATSERVERTTBL (COPYTERMTABLE 'ORIG)) (for I from 1 to 8 do (ECHOCHAR I 'IGNORE CHATSERVERTTBL) (ECHOCHAR I 'IGNORE ASKUSERTTBL)) (ECHOCHAR (CHARCODE CR) 'SIMULATE CHATSERVERTTBL) (ECHOCHAR (CHARCODE CR) 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE ASKUSERTTBL) (ECHOCHAR 0 'SIMULATE CHATSERVERTTBL))) (ADDVARS (\SWEPT.OFDS)) (DECLARE%: EVAL@COMPILE DONTCOPY (P (CHECKIMPORTS '(LLCHAR ATERM IMAGEIO FILEIO ATBL AOFD) T))) [COMS (FNS SIMPLECHATSERVER) (INITVARS (CHATSERVERWINDOW) (CHATSERVERWINDOWREGION '(11 228 392 190] (MACROS \SYNCODE) (DECLARE%: DONTEVAL@LOAD DOCOPY (FILES CL-TTYEDIT SIMPLECHAT) (ADVISE MENU CHAT RINGBELLS)) (COMMANDS "QUIT" "SAY") (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA CHATSERVEROPENFN]) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA CHATSERVEROPENFN) ) (PUTPROPS CHATSERVER COPYRIGHT ("Xerox Corporation" 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2216 38509 (CHATSERVER 2226 . 3955) (CHATSERVERWHENCLOSEDFN 3957 . 4304) ( CHATSERVEROPENFN 4306 . 8433) (DOBE 8435 . 8481) (REQUIRED.LOGIN 8483 . 11220) (SERVER-EXEC 11222 . 11395) (SWEEP.OFD 11397 . 11933) (\CLEARSYSBUF 11935 . 12184) (PROMPTFORWORD 12186 . 26531) ( \CREATELINEBUFFER 26533 . 28708) (\PROMPTFORWORDBIN 28710 . 31646) (\REMOTE.BIN 31648 . 33890) ( \REMOTE.EXEC.OUTCHARFN 33892 . 38114) (CHATSERVER.FONT 38116 . 38507)) (39151 41493 (SIMPLECHATSERVER 39161 . 41491))))) STOP \ No newline at end of file diff --git a/lispusers/CHATSERVER-NS b/lispusers/CHATSERVER-NS new file mode 100644 index 00000000..b35d99ee --- /dev/null +++ b/lispusers/CHATSERVER-NS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED " 7-Sep-88 17:17:04" {ERINYES}MEDLEY>CHATSERVER-NS.;2 7560 changes to%: (FNS MAKE.NS.CHAT.CONNECTION) previous date%: "16-Mar-88 22:34:39" {ERINYES}MEDLEY>CHATSERVER-NS.;1) (* " Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CHATSERVER-NSCOMS) (RPAQQ CHATSERVER-NSCOMS [(FNS MAKE.NS.CHAT.CONNECTION NS.CHAT.SERVE NSCHAT.SERVER.ATTENTION NSCHAT.SERVER.OUTPUTABORTED NSCHAT.SERVER.WHENCLOSED SPP.EOMP \NSCHAT.BIN \REMOTE.EOFP \REMOTE.PEEKBIN \REMOTE.READP GAP-SERVER-INIT) (FILES COURIERSERVE CHATSERVER) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (GAP-SERVER-INIT) (COURIER.START.SERVER))) (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (SOURCE) MODARITH) (FILES (LOADCOMP) LLNS SPP)) (FUNCTIONS CHECK) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA MAKE.NS.CHAT.CONNECTION ]) (DEFINEQ (MAKE.NS.CHAT.CONNECTION (CL:LAMBDA (CSTREAM CPROG CPROC PARAMETERS TRANSPORT WAITTIME CREDENTIALS VERIFIER) (* ; "Edited 2-Sep-88 23:43 by masinter") (LET ((OUTPUTSTREAM (SPPOUTPUTSTREAM CSTREAM))) (with SPPCON (fetch SPP.CONNECTION of CSTREAM) (SETQ SPPEOMONFORCEOUT T) (SETQ SPPATTENTIONFN (FUNCTION NSCHAT.SERVER.ATTENTION)) (SETQ SPPOUTPUTABORTEDFN (FUNCTION NSCHAT.SERVER.OUTPUTABORTED)) (SETQ SPPWHENCLOSEDFN (FUNCTION CHATSERVERWHENCLOSEDFN))) (with STREAM CSTREAM (SETQ DEVICE (create FDEV DEVICENAME _ 'NSCHATDEVICE (* ; "") PEEKBIN _ #'\REMOTE.PEEKBIN (* ; "") READP _ #'\REMOTE.READP (* ; "") EOFP _ #'\REMOTE.EOFP (* ; "") GETEOFPTR _ (FUNCTION NILL) (* ; "") BIN _ '\NSCHAT.BIN using DEVICE)) (SETQ STRMBINFN '\NSCHAT.BIN)) (* ;; "return the value, and then ") [COURIER.RETURN CSTREAM CPROG CPROC '((0 0] (SPP.FORCEOUTPUT OUTPUTSTREAM) (SPP.SENDATTENTION CSTREAM 209) (PROCESS.NAME (THIS.PROCESS) 'CHAT.SERVER) (SPP.DSTYPE OUTPUTSTREAM 192) (CHATSERVEROPENFN CSTREAM OUTPUTSTREAM)))) (NS.CHAT.SERVE (LAMBDA (INPUTSTREAM OUTPUTSTREAM OPENFN WHENCLOSEDFN) (* lmm " 7-Jan-86 13:21") (PROG (PARAMETERS TRANSPORT WAITTIME CREDENTIALS VERIFIER) (repeatuntil (SPP.READP INPUTSTREAM) do (BLOCK)) (for I to 4 do (* Echo Courier version number) (BOUT OUTPUTSTREAM (BIN INPUTSTREAM))) (SPP.SENDEOM OUTPUTSTREAM) (SPP.CLEAREOM INPUTSTREAM) (repeatuntil (SPP.READP INPUTSTREAM) do (BLOCK)) (for I to 12 do (* Courier protocol bytes |...|) (BIN INPUTSTREAM)) (SETQ PARAMETERS (COURIER.READ INPUTSTREAM (QUOTE GAP) (QUOTE SessionParameterObject))) (SETQ TRANSPORT (COURIER.READ INPUTSTREAM (QUOTE GAP) (QUOTE Sequence.TransportObject))) (SETQ WAITTIME (COURIER.READ INPUTSTREAM (QUOTE GAP) (QUOTE WaitTime))) (SETQ CREDENTIALS (COURIER.READ INPUTSTREAM (QUOTE GAP) (QUOTE credentials))) (SETQ VERIFIER (COURIER.READ INPUTSTREAM (QUOTE GAP) (QUOTE verifier))) (* Courier RETURN command) (BOUT OUTPUTSTREAM 0) (BOUT OUTPUTSTREAM 2) (BOUT OUTPUTSTREAM 0) (BOUT OUTPUTSTREAM 0) (COURIER.WRITE OUTPUTSTREAM (QUOTE (0 0)) (QUOTE GAP) (QUOTE SessionHandle)) (SPP.SENDEOM OUTPUTSTREAM) (SPP.FLUSH.TO.EOF INPUTSTREAM) (with STREAM OUTPUTSTREAM (SETQ EOLCONVENTION 2)) (with STREAM INPUTSTREAM (SETQ IMAGEDATA OUTPUTSTREAM) (SETQ DEVICE (create FDEV DEVICENAME _ (QUOTE NSCHAT) BIN _ (FUNCTION \REMOTE.BIN) PEEKBIN _ (FUNCTION \REMOTE.PEEKBIN) READP _ (FUNCTION \REMOTE.READP) EOFP _ (FUNCTION \REMOTE.EOFP) GETEOFPTR _ (FUNCTION NILL) using DEVICE)) (SETQ STRMBINFN (FUNCTION \REMOTE.BIN))) (SPP.CLEAREOM INPUTSTREAM T) (SPP.CLEARATTENTION INPUTSTREAM T) (CHATSERVEROPENFN INPUTSTREAM OUTPUTSTREAM) (SPP.CLOSE INPUTSTREAM T))) ) (NSCHAT.SERVER.ATTENTION (LAMBDA (X) (* ; "Edited 6-Oct-87 13:25 by Masinter") (SPP.CLEARATTENTION X T) (LET (BYTE) (SELECTQ (SETQ BYTE (BIN X)) (209 (* ; "attention 209, whatever that is") NIL) (PRINTOUT PROMPTWINDOW T "attention byte " BYTE " recieved.")))) ) (NSCHAT.SERVER.OUTPUTABORTED (LAMBDA (STREAM X Y Z) (* lmm "10-Jan-86 00:32") NIL)) (NSCHAT.SERVER.WHENCLOSED (LAMBDA (STREAM X Y Z) (* lmm " 9-Jan-86 18:06") (CLOSEF? (SPPOUTPUTSTREAM STREAM)))) (SPP.EOMP (LAMBDA (STREAM) (* ; "Edited 6-Oct-87 13:04 by Masinter") (EQ (fetch SPPEOFBITS of STREAM) \SPPFLAG.EOM)) ) (\NSCHAT.BIN (LAMBDA (STREAM) (* ; "Edited 30-Oct-87 10:35 by Masinter") (until (\REMOTE.READP STREAM) do (BLOCK)) (\BUFFERED.BIN STREAM)) ) (\REMOTE.EOFP (LAMBDA (STREAM) (* ; "Edited 6-Oct-87 11:37 by Masinter") (* ;; "terminal EOF: never") NIL)) (\REMOTE.PEEKBIN (LAMBDA (STREAM NOERRORFLG) (* ; "Edited 6-Oct-87 11:35 by Masinter") (* ;; "SPP peek: ignore EOM") (until (SPP.READP STREAM) do (if (SPP.EOMP STREAM) then (SPP.CLEAREOM STREAM T)) (BLOCK)) (PROG ((BYTE (\BUFFERED.PEEKBIN STREAM NOERRORFLG))) (if (SPP.EOMP STREAM) then (SPP.CLEAREOM STREAM T)) (RETURN BYTE))) ) (\REMOTE.READP (LAMBDA (STREAM) (* ; "Edited 6-Oct-87 14:06 by Masinter") (* ;; " termal READP: ignore EOM") (PROG NIL RETRY (COND ((SPP.READP STREAM) (RETURN T)) ((SPP.EOMP STREAM) (SPP.CLEAREOM STREAM) (GO RETRY)) (T (RETURN NIL))))) ) (GAP-SERVER-INIT (LAMBDA NIL (LET* ((DEF (GETDEF (QUOTE GAP) (QUOTE COURIERPROGRAMS))) (LST (CDDDR (ASSOC (QUOTE Create) (CL:GETF (CDR DEF) (QUOTE PROCEDURES)))))) (CL:UNLESS (EQ (CL:GETF LST (QUOTE IMPLEMENTEDBY)) (QUOTE MAKE.NS.CHAT.CONNECTION)) (CL:SETF (CL:GETF LST (QUOTE IMPLEMENTEDBY)) (QUOTE MAKE.NS.CHAT.CONNECTION)) (PUTDEF (QUOTE GAP) (QUOTE COURIERPROGRAMS) DEF))) (COURIER.START.SERVER)) ) ) (FILESLOAD COURIERSERVE CHATSERVER) (DECLARE%: DONTEVAL@LOAD DOCOPY (GAP-SERVER-INIT) (COURIER.START.SERVER) ) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD (SOURCE) MODARITH) (FILESLOAD (LOADCOMP) LLNS SPP) ) (DEFMACRO CHECK (X) `(CL:ASSERT ,X)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA MAKE.NS.CHAT.CONNECTION) ) (PUTPROPS CHATSERVER-NS COPYRIGHT ("Xerox Corporation" 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1506 7035 (MAKE.NS.CHAT.CONNECTION 1516 . 3560) (NS.CHAT.SERVE 3562 . 5186) ( NSCHAT.SERVER.ATTENTION 5188 . 5454) (NSCHAT.SERVER.OUTPUTABORTED 5456 . 5543) ( NSCHAT.SERVER.WHENCLOSED 5545 . 5660) (SPP.EOMP 5662 . 5785) (\NSCHAT.BIN 5787 . 5931) (\REMOTE.EOFP 5933 . 6045) (\REMOTE.PEEKBIN 6047 . 6381) (\REMOTE.READP 6383 . 6625) (GAP-SERVER-INIT 6627 . 7033))) )) STOP \ No newline at end of file diff --git a/lispusers/CHATSERVER-RS232 b/lispusers/CHATSERVER-RS232 new file mode 100644 index 00000000..9d2ef901 --- /dev/null +++ b/lispusers/CHATSERVER-RS232 @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 7-Sep-88 17:33:28" {ERINYES}MEDLEY>CHATSERVER-RS232.;1 2044 changes to%: (FNS DO.RS232.CHAT.SERVER DO.TTY.CHAT.SERVER) previous date%: "29-Oct-87 15:36:45" {PHYLUM}LYRIC>LISPUSERS>CHATSERVER-RS232.;1) (* " Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CHATSERVER-RS232COMS) (RPAQQ CHATSERVER-RS232COMS ((FNS DO.RS232.CHAT.SERVER TTYCHATSERVER DO.TTY.CHAT.SERVER RS232CHATSERVER) (FILES DLRS232C CHATSERVER))) (DEFINEQ (DO.RS232.CHAT.SERVER [LAMBDA NIL (* ; "Edited 7-Sep-88 17:32 by masinter") (PROG [(INS (OPENSTREAM '{RS232} 'INPUT)) (OUTS (OPENSTREAM '{RS232} 'OUTPUT] LP (READC INS) (CHATSERVEROPENFN INS OUTS) (GO LP]) (TTYCHATSERVER (LAMBDA (BAUDRATE BITSPERCHAR PARITY STOPBITS FLOWCONTROL) (* lmm "20-Mar-86 17:34") (TTY.INIT BAUDRATE BITSPERCHAR PARITY STOPBITS FLOWCONTROL) (DEL.PROCESS (QUOTE DO.TTY.CHAT.SERVER)) (ADD.PROCESS (QUOTE (DO.TTY.CHAT.SERVER)) (QUOTE RESTARTABLE) T)) ) (DO.TTY.CHAT.SERVER [LAMBDA NIL (* ; "Edited 7-Sep-88 17:33 by masinter") (PROG [(INS (OPENSTREAM '{TTY} 'INPUT)) (OUTS (OPENSTREAM '{TTY} 'OUTPUT] LP (READC INS) (CHATSERVEROPENFN INS OUTS) (GO LP]) (RS232CHATSERVER [LAMBDA (BAUDRATE BITSPERCHAR PARITY STOPBITS FLOWCONTROL) (* ; "Edited 29-Oct-87 15:34 by masinter") (DEL.PROCESS 'RS232) (RS232C.SHUTDOWN) (RS232C.INIT BAUDRATE BITSPERCHAR PARITY STOPBITS FLOWCONTROL) (ADD.PROCESS '(DO.RS232.CHAT.SERVER) 'RESTARTABLE T 'NAME 'RS232]) ) (FILESLOAD DLRS232C CHATSERVER) (PUTPROPS CHATSERVER-RS232 COPYRIGHT ("Xerox Corporation" 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (650 1918 (DO.RS232.CHAT.SERVER 660 . 962) (TTYCHATSERVER 964 . 1236) ( DO.TTY.CHAT.SERVER 1238 . 1534) (RS232CHATSERVER 1536 . 1916))))) STOP \ No newline at end of file diff --git a/lispusers/CHATSERVER-TCP b/lispusers/CHATSERVER-TCP new file mode 100644 index 00000000..f170f55d --- /dev/null +++ b/lispusers/CHATSERVER-TCP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 7-Sep-88 17:13:08" {ERINYES}MEDLEY>CHATSERVER-TCP.;2 1699 changes to%: (VARS CHATSERVER-TCPCOMS) (FNS TCP.CHAT.LISTENER)) (* " Copyright (c) 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CHATSERVER-TCPCOMS) (RPAQQ CHATSERVER-TCPCOMS ((FNS TCP.CHAT.LISTENER TCPCHATSERVER) (FILES TCP CHATSERVER))) (DEFINEQ (TCP.CHAT.LISTENER [LAMBDA (PORT) (* ; "Edited 2-Sep-88 23:09 by masinter") (LET* [(INSTREAM (TCP.OPEN NIL NIL (OR PORT \TCP.TELNET.PORT) 'PASSIVE 'INPUT T)) (OUTSTREAM (AND INSTREAM (TCP.OTHER.STREAM INSTREAM] (* ;; "ok, I'm the server") (PROCESS.NAME (THIS.PROCESS) 'CHATSERVER) (PROCESSPROP (THIS.PROCESS) 'RESTARTABLE NIL) (* ;; "spawn another listener") (ADD.PROCESS (LIST (FUNCTION TCP.CHAT.LISTENER) (KWOTE PORT)) 'RESTARTABLE 'HARDRESET) (PROCESSPROP (THIS.PROCESS) 'RESTARTABLE NIL) (CHATSERVEROPENFN INSTREAM OUTSTREAM]) (TCPCHATSERVER [LAMBDA NIL (* ejs%: "26-Mar-86 16:47") (DEL.PROCESS 'TCP.CHAT.LISTENER) (ADD.PROCESS '(TCP.CHAT.LISTENER) 'RESTARTABLE 'HARDRESET]) ) (FILESLOAD TCP CHATSERVER) (PUTPROPS CHATSERVER-TCP COPYRIGHT ("Xerox Corporation" 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (484 1585 (TCP.CHAT.LISTENER 494 . 1343) (TCPCHATSERVER 1345 . 1583))))) STOP \ No newline at end of file diff --git a/lispusers/CHATSERVER.TEDIT b/lispusers/CHATSERVER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..c959be448016cb2877f51406856666a1a94a9691 GIT binary patch literal 8331 zcmeHL-)|dP6?U@SAEo#Kv>+sebP0&HCC4P$Zkz4C;M$XPw2qzHlWt2z#f^RA%yv9u z=0{Q^@q~C_#UH^763@IK@s6~A0DlT^yzqVJ&UnUY+Ac33q>b9dzH`sH=X~d!@0>d( z{OiTvqvU4yLB|_AqesrDzE`i`uGe?#^~xH)VeS6%o>F}s$4hmj6F*E%tQy6q_HpND zk4+rCXm^K4&ANB)Cu$l^vbhOU73d^YX6mPAs-jSh%_24PQ;6SfsojtF_uKW6^YFwS zIY-XG8&^)=9*ot<{3`Qfli={uB&EZt>JCpvt}_zD+f}L2c<;kK6~9uj(d&EO6BWg( z*O$HBW?QLFqM|dEisd>rt;%uRR^z#zh99Kr)R<7ECZRi*etNEs%rr2|H50t<@oNmg z)Ano6qc{-E!q^19J`D`KPtT2-oaG^o8~VdQyc+=^%+z5b0^6`hK!F!RAEGqiGgEL$|+;FgZQflM~18 z(Q)5l4z!V9Cf}xxM~-uJ?75E|K`b$6S)lxoAbg&M76pk?C3{Y@Q~=4Hn*xY|HyZX% zx}G~6R8om5bpeq&(-S}N(Y%LvzMi5g7$=C7_O;Y9%JQ%oh*u&rjeQ_}&j$b84`=xy04!o z*q6Yi1VNYt+0>{EWHD2ZQOg&;t_Y*LTTGFky2r|M`UA%+t+=uiyO5yBWm||>p2}i- zT{9!cT9`-Ro}!ANBS_DqY*zJQRosaL5qRg@mrNt-=r3b`!d0Ua(^iswd0PAPMPNvB zKu{+MvS2Ds3zHFHp;QT|eLNZ-xP7OUM_^`f zU}AJUIcIwLF`Q(oDjW{_PXt2J32Gt90+913%0E+Ht0D{1 z3zkLU<~1Wni6wJAK}AU{V1*A(C&z%WoEMs5zE^LI9q-|F{(jI{LtZt!X2mkE*{siv zhD)qR(uOsJjxAzy!2*O`@O}o!aCQb)ZN6hm*s{CDMm!{hxnXFU-p!}Z3o}t&6gdjS z#)<37aGABwx-l<&WDK}qg(G60uuj1PE)v0?fs>eo%EU1;iP$l1NCWI0aTbOQ5e&Fi zOTCwOd&@FR#xkE!>GvwE%C=r99Ks;8gBqBWJgUY^G}n2e4m-zJhykp*V%{=0bfyn1u?dA;-a^Yd~>;oFzcv>WwF&l7aE!^rJNT?UqB}T zC|P!l9_>$1_0p>o)v(NIgFp3kuni!kEyQLXrJ&lpEs!>uC7}>zXaT`Nk9$tF$1qYD zrT|@xJ_6wYO=!DU`Xph%xu2q?w=9FTib17WKhzk(0%*4lZi1febEL471(2AFPR5qd9Du!1E=hEDsva&=jLf!h2RUXu_{!VTh{! zdL#eV9($dU*S0fi^XAioT#)Gw*)4S5I8C;MYhHE+;|RE2S{DpX4GNL@S;-%rBHtEi zBIyN%7@r`cG3p`~wB4piBMK*`iG~MpBjrI>Wu9{%$|Zhj7-*}8%c+u;9*H4SKc9{` zzyVvGL@4pHCXKCjq@zZtoa0REkn$UMc_~T6jnk9lf@{C z(?!4wtWbmakf14+4k7};i6eZAy{=tvAXFu3uBACx@6~C!DkC1T(3f^H+k8GT<>^$^4jr`owq9Jgm{^1C?1tpv(PE5G^U2t+G_|iY7N? zW-+X|j|wO`W1{8I2FQj}jS;Z%xZ7_^2X3o@&^sGWK8E26IgJz;b^%ICK9Ovh8deB& zuP$qq@|266#-nf=UFOpOQ;g2AkK|1r7J!vj7cDlYp4B(Qr9n=ol-fd$8p>|Tr98r| zOVG_$_iA)<7DJVuC$k`ZId%dO){R^kT z@nwnA%5cnNuwCMZM8lmr0khOOC*(S?I}~@%1|6XY?=W^Ip&%NcKcRD&hh${CN{RX+@*xOD#hIYCk~47AzVJya z#eFxw%d;0lHP15Pg^z2Bys;9_45N6?u|-W7176-jT$I5hxO7dPTRsOEw!3ek-^q0! z9&f4VW_cQs2qcxQ`;|UL0#2g9NbLjAHDm0h864>jY<}|18PkDA7Cd1uhn%M}WHDQz zSSEhRb_P=LodfrA*_-nhL-60SIx@jFX3+sR+jUj1*ZA{R zqwkJA)sPBP1GmpwJI1Ry_veo4))xLXm5g@o;E>h% zBXxVHsTwtaQsJ;Dt{At?#jR#Jr2Q)2Q`4{gA zjW`($@PJE@-M_8w-oC9q+N;WX&SOsmC4|`W@f~&hqdV%(4x&PHnvi6itoAa-+}~Dx z$3rl%H8-vWvOM4cKLSVjxdO^9J4y=E)^1gp)$U&VUHE+qt8Y4!f;SNG@6_Jy_B-RT z+pT@uD%-5Raq)Yro$uG)v8@ZLil3L(pz*u4_dwW3?x53u!_HFro7bE|=f{Lt|Z1{<~O4-pNvHa2VTLCJqt zkhLkc^JpHH^RIS9O8OB-jZ(R-f>w zdt4wga&F-!Wls2{Sl}`5bD`?yi|PVJ#E=Sh8-J+opy;2g3skyQUBHeF5id@mQrS^e z`lqT0b$q|NK+&hw1?u=Q7b-exzp3t^jvrJPs3WW{P=`e5B@D53<9FOzAVt|fUS0V8 d)rEgvS=jg`7bwfLqb?f75ASztpa1%A{|29crdCHECKSET.;3 3992 changes to: (FNS CHECKSET1) previous date: " 6-JAN-83 22:58:57" CHECKSET.;2) (* Copyright (c) 1983 by Xerox Corporation) (PRETTYCOMPRINT CHECKSETCOMS) (RPAQQ CHECKSETCOMS ((* making sure files are up to date) (FNS CHECKSET CHECKSET1 CSETASK COMPFILES) (LOCALVARS . T) (GLOBALVARS COMPILE.EXT FILERDTBL DWIMWAIT))) (* making sure files are up to date) (DEFINEQ (CHECKSET [LAMBDA (SET COMPFLG) (* lmm " 6-JAN-83 22:57") (OR COMPFLG (SETQQ COMPFLG Y)) (COND [SET (SETQ SET (CHECKSET1 (OR (LISTP SET) [LISTP (GETATOMVAL (PACK* SET (QUOTE LISPSET] (LIST SET)) COMPFLG)) (COND ((EQ COMPFLG (QUOTE N)) SET) (T (COMPFILES SET] (T (for X in FILESETS join (CHECKSET (EVAL X) COMPFLG]) (CHECKSET1 [LAMBDA (FILES COMPFLG) (* lmm " 8-JAN-83 14:31") (PROG (@COM.SOURCES .COM @LISP LISP @PREV @SOURCE NEEDCOMPILE TEM TODO SFD) (for GROUP in FILES do (SETQ NEEDCOMPILE) (SETQ @COM.SOURCES (COND [(SETQ .COM (FINDFILE [PACKFILENAME (QUOTE EXTENSION) COMPILE.EXT (QUOTE BODY) (CAR (OR (LISTP GROUP) (SETQ GROUP (LIST GROUP] T)) (INPUT (INFILE .COM)) (SKREAD .COM) (for SOURCE in GROUP collect (IDATE (CADR (READ .COM] (T (SETQQ NEEDCOMPILE COMPILE) NIL))) [for SOURCE in GROUP as @COM.SOURCE in (OR @COM.SOURCES GROUP) do (COND ((NOT (SETQ TEM (FINDFILE SOURCE T))) (PRINT (LIST SOURCE (QUOTE (not found))) T T) (SETQ NEEDCOMPILE) (RETURN))) (SETQ TEM (INPUT (INFILE TEM))) (SETFILEPTR TEM 0) (SETQ SFD (READ TEM FILERDTBL)) (CLOSEF TEM) (SETQ @PREV (AND [STRINGP (SETQ @PREV (CAR (NLEFT SFD 2] (IDATE @PREV))) (SETQ @SOURCE (IDATE (CADR SFD))) (SETQ SFD (CONS (CADR SFD) TEM)) (COND ((NEQ NEEDCOMPILE (QUOTE COMPILE)) (COND (@COM.SOURCE (COND ((NOT (IEQP @COM.SOURCE @SOURCE)) (SETQ NEEDCOMPILE (COND ((AND @PREV (IEQP @PREV @COM.SOURCE)) (QUOTE RECOMPILE)) (T (QUOTE COMPILE] [COND ((AND NEEDCOMPILE (PROGN (SETQ NEEDCOMPILE (CONS NEEDCOMPILE GROUP)) (CSETASK NEEDCOMPILE COMPFLG))) (SETQ TODO (NCONC1 TODO NEEDCOMPILE] (AND .COM (CLOSEF .COM))) (RETURN TODO]) (CSETASK [LAMBDA (Q DEFAULT) (* bvm: "30-DEC-81 12:58") (SELECTQ DEFAULT ((Y N) (MAPRINT Q T NIL " ") T) (EQ (QUOTE Y) (ASKUSER DWIMWAIT DEFAULT Q NIL T]) (COMPFILES [LAMBDA (FILES FLG) (* bvm: "30-DEC-81 13:28") (PROG [LISPXHIST (LISTING (OR (SELECTQ (COND ((LISTP FLG) (OR (CADR FLG) (CAR FLG))) (T FLG)) (F (QUOTE F)) (ST (QUOTE ST)) NIL) (QUOTE F] (DECLARE (SPECVARS LISPXHIST)) (SELECTQ (OR (CAR (LISTP FLG)) FLG) (C (SETQQ FLG COMPILE)) (RC (SETQQ FLG RECOMPILE)) NIL) (RETURN (for FL in FILES collect (SELECTQ [CAR (OR (LISTP FL) (SETQ FL (LIST FLG FL] (RECOMPILE (PRINT (CONS (QUOTE recompiling) (CDR FL)) T) (LISPXUNREAD (LIST LISTING)) (BRECOMPILE (CDR FL) NIL (QUOTE CHANGES))) (COMPILE (PRINT (CONS (QUOTE compiling) (CDR FL)) T) (LISPXUNREAD (LIST LISTING)) (BCOMPL (CDR FL))) (HELP FL]) ) (DECLARE: DOEVAL@COMPILE DONTCOPY (LOCALVARS . T) ) (DECLARE: DOEVAL@COMPILE DONTCOPY (ADDTOVAR GLOBALVARS COMPILE.EXT FILERDTBL DWIMWAIT) ) (PUTPROPS CHECKSET COPYRIGHT ("Xerox Corporation" 1983)) (DECLARE: DONTCOPY (FILEMAP (NIL (485 3770 (CHECKSET 495 . 926) (CHECKSET1 928 . 2571) (CSETASK 2573 . 2785) (COMPFILES 2787 . 3768))))) STOP \ No newline at end of file diff --git a/lispusers/CHECKSET.TEDIT b/lispusers/CHECKSET.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..fc858d4e3f385f30663badf9f2ec40b50efb6985 GIT binary patch literal 3627 zcmeHH%Wm6N5Tzdppt?lcAd4=#7@$QX7OG&YaqI?;0ol5e3DcxXQnuV63r4z%7|WzU zQgPBx$OrT*`UTx|o6qW*OOaNDI0=xVt0=KV&Yj1ZGiPpJxK6)vcq9&wJ>lyOUB9pE zTe@Ca@C?hrtA|AU`{(g2Av?H~dwW!!zeX~nU^q-cQ? zWFTo2PEaCv7K9OE2l3?;hT+^CMikI6OynSoQ9g)@=rSvMEQSdaLWpp)`3NKr( z0-ylOsw<2`=cH>|0%(gW**M714bq2Moy@#kfWDPa8_tKW0OA(Oms6%AjH9%s$_`~F zlgluIZ&5Fx16LG9uEK0gheu7jBRskaClg9%qfv+k#oLP`4|UVI18nM^dBbGn7kYHcKK^x=t1Y$OE93GzGEX zUS(qZb^V;X2bM}PSiR{TS1LhzQKJ!#WH1;j__dN%B$$hUhm^MqfR)FmbIecl9v4C< z*L0zT@vv-$`@LqT=oN!hI&C0 ze-~uQ47*Hi$1)w$Zad)DZ627126=wd^-a6OQQy;6V+U|IX_FpoHE8G82HvVFs>tXz zEyp?bsQOzEgK^Ey5$MMy;Lgonk82*fX4gj+(>^sl^8idZ?KXJ=w~gNg0$;s%UB`z3 zcaJ({pj(^NZl0LdIh{By;o9V!3fD62c>>=xkA>6A!+SP7$}`dLHf_&zY;r}XXEj~& zET=2Vw==<5=>&r5oiH%r7L|LRa1|@en&+PbE^im;a!;BdXMr#9(b(ApPt@4mrC%Nx zxo7nVG6jn{OY;~19Oc`N!}Pic+`dnZ9opXhs5ofIcQ{cVxbvW~6zPk;uga-WBRBuw zypO@{=AaBjzDo=2|3M+B{y$9!pEl0-4Da(`J`d&{oAzI9jA5v|^puW1`UU`G>8$MOG!}}Zjtgo)!;H7C*?X~uLWf%EB&W{tVudd&iuf->*t3GS+TR^$N z+dsdHv<B`{m0+`0&jO7Bme*a literal 0 HcmV?d00001 diff --git a/lispusers/CIRCLPRINT b/lispusers/CIRCLPRINT new file mode 100644 index 00000000..dbaf641b --- /dev/null +++ b/lispusers/CIRCLPRINT @@ -0,0 +1 @@ +(FILECREATED "30-MAY-79 00:25:14" CIRCLPRINT.;3 19722 changes to: CIRCLPRINTCOMS previous date: " 5-JUL-78 19:49:27" CIRCLPRINT.;2) (PRETTYCOMPRINT CIRCLPRINTCOMS) (RPAQQ CIRCLPRINTCOMS [(FNS CIRCLMAKER CIRCLMAKER1 CIRCLPRINT CIRCLMARK RLPRIN1 RLRESTORE CSEARCH PLACEPRINT C2PRINT ROOMLEFT RLPRIN2 CPRINT CLPRINT CIRCLNC) (VARS CIRCLMARKER) (BLOCKS (CIRCLBLOCK CIRCLMAKER CIRCLMAKER1 CIRCLPRINT CIRCLMARK RLPRIN1 RLRESTORE CSEARCH PLACEPRINT C2PRINT ROOMLEFT RLPRIN2 CPRINT CLPRINT CIRCLNC (ENTRIES CIRCLPRINT CIRCLMARK RLPRIN1 RLPRIN2 RLRESTORE CIRCLMAKER CIRCLMAKER1) (SPECVARS RLKNT LABELIST REFLIST) (LOCALFREEVARS PLACELIST LL) (NOLINKFNS . T) (GLOBALVARS #UNDOSAVES RESETVARSLST]) (DEFINEQ (CIRCLMAKER [LAMBDA (L) (* lmm: 19 MAY 75 232) (PROG (LABELIST REFLIST) (CIRCLMAKER1 L) (* An error is generated if REFLIST is non-NIL, because this means that some nodes are referenced in L without being labeled (i.e. defined) and indicates that the user may have omitted some code. See the comments in CIRCLMAKER1 for additional information.) (COND (REFLIST (ERROR (QUOTE "LABEL NOT FOUND FOR REFERENCE"))) (T (RETURN L]) (CIRCLMAKER1 [LAMBDA (L) (* This function makes use of two free variables,  REFLIST and LABELIST, which are alist-like  structures that provide information about nodes that have been defined (labeled) and where they have been referenced. LABELIST is a list of lists. Each list in labelist is of the form  (n . L), where n is the number that is being used to label the node L. REFLIST is also a list of lists. Each list in REFLIST is of the form  (n (L1 L2 ...) (L1' L2' ...)), where n is the number of the node that is being referred to, and L1,  L2,... are those nodes for which car is a reference  to {n}, and L1', L2',... are those nodes for which  cdr is a reference to {n}.) (PROG (CARL CDRL CARLN CDRLN NODECODE) [COND ((LISTP L) (SETQ CARL (CAR L)) (SETQ CDRL (CDR L] (COND [(AND CARL (ATOM CARL)) (COND [[AND (NEQ CARL (QUOTE {})) (EQ (NTHCHAR CARL 1) (QUOTE {)) (EQ (NTHCHAR CARL -1) (QUOTE })) (FIXP (SETQ CARLN (MKATOM (SUBSTRING CARL 2 -2] (* This part of the conditional checks to see  whether CARL is a reference to a node, i.e. an atom  of the form {n}, where n is a number. If so, then we check to see whether the node has yet been labeled (this is the assoc on labelist),  whether it has been previously referred to, but not  labelled (this is the assoc on reflist), or else  assume that it has neither been referred to nor  labelled previously. In the first case, we replace  (/rplaca) CARL with a pointer to the node that is  labelled n (as explained above, this would be cdr of nodecode). In the second case, we add a pointer to L to (cadr nodecode) which is that part of REFLIST  which contains pointers to those nodes for which car is the atom {n}. In the final case, we add a new  sublist to REFLIST, to record that a reference has  been made to a node numbered n. It should be noted that, throughout this program,  all such manipulations are undoable, so that the  user can (for example) control-D and undo circlmaker to regain his original expression.) (COND ((SETQ NODECODE (ASSOC CARLN LABELIST)) (/RPLACA L (CDR NODECODE))) ((SETQ NODECODE (ASSOC CARLN REFLIST)) (/NCONC1 (CADR NODECODE) L)) (T (SETQ REFLIST (/NCONC1 REFLIST (LIST CARLN (LIST L) NIL] ([AND (NEQ CARL (QUOTE *)) (NEQ CARL (QUOTE **)) (EQ (NTHCHAR CARL 1) (QUOTE *)) (EQ (NTHCHAR CARL -1) (QUOTE *)) (FIXP (SETQ CARLN (MKATOM (SUBSTRING CARL 2 -2] (* This part of the conditional checks to see  whether CARL is a label for a node, i.e. an atom of  the form *n*, where n is a number. If so, then we check to see whether a node has  already been labelled by the same number, in which  case an error is generated  (*n* is ambiguous, multiply used label). Otherwise,  we check to see that cdr of l is a list, in which  case we physically (but undoably) remove the label  from L , add a new sublist to LABELIST, and check to see whether there is a sublist on REFLIST that  indicates that references to L have already been  made. If so, then we make the appropriate changes to car and cdr of the nodes wwich referenced L, and  undoably remove the sublist  (NODECODE) from REFLIST, because the only purpose of this sublist was to preserve a record of those nodes which referenced L, before the label for L was found and the actual pointers from those nodes to L could  be established-- now that the pointers have been  established, we can decrement REFLIST-- if all nodes that are referenced are in fact labeled somewhere in the structure, then REFLIST should eventually in  this way be decremented to NIL-- otherwise the  monitoring function CIRCLMAKER will generate an  error, if it was the top level function that called  CIRCLMAKER1. Finally, we call circlmaker1  recursively on L, and return the resultant value of  L. If the original cdr of l were not a list, then we would generate the CARL "IS MISPLACED LABEL" error-- this is intended to handle expressions like  (*1* . {1}), which are anomalous because the label  does not really point to a node, and there is a  likelihood that the user has inadvertently omitted  some code.) (COND ((ASSOC CARLN LABELIST) (ERROR CARL (QUOTE "IS AMBIGUOUS, MULTIPLY USED LABEL"))) ((LISTP (CDR L)) (/RPLACA L (CADR L)) (/RPLACD L (CDDR L)) (SETQ LABELIST (/NCONC1 LABELIST (CONS CARLN L))) [COND ((SETQ NODECODE (ASSOC CARLN REFLIST)) (SETQ REFLIST (/DREMOVE NODECODE REFLIST)) [MAPC (CADR NODECODE) (FUNCTION (LAMBDA (X) (/RPLACA X L] (MAPC (CADDR NODECODE) (FUNCTION (LAMBDA (X) (/RPLACD X L] (CIRCLMAKER1 L) (RETURN L)) (T (ERROR CARL (QUOTE "IS MISPLACED LABEL"] ((LISTP CARL) (CIRCLMAKER1 CARL))) (COND [(AND CDRL (ATOM CDRL)) (COND [[AND (NEQ CDRL (QUOTE {})) (EQ (NTHCHAR CDRL 1) (QUOTE {)) (EQ (NTHCHAR CDRL -1) (QUOTE })) (FIXP (SETQ CDRLN (MKATOM (SUBSTRING CDRL 2 -2] (* This branch of the conditional checks to see  whether CDRL is a reference to a node, i.e. an atom  of the form {n} where n is a number. If so, then the steps followed are analogous to  those described above for the case in which CARL is  a reference to a node. A similar check is made below to see whether CDRL is a label for a node. An error is generated in this case, because such a  label has no meaning (the label does not point to a  node), and there is a likelihood that the user has  inadvertently omitted some code. The error message reads "*n* IS MISPLACED LABEL".) (COND ((SETQ NODECODE (ASSOC CDRLN LABELIST)) (/RPLACD L (CDR NODECODE))) ((SETQ NODECODE (ASSOC CDRLN REFLIST)) (/NCONC1 (CADDR NODECODE) L)) (T (SETQ REFLIST (/NCONC1 REFLIST (LIST CDRLN NIL (LIST L] ([AND (EQ (NTHCHAR CDRL 1) (QUOTE *)) (NEQ CDRL (QUOTE *)) (NEQ CDRL (QUOTE **)) (EQ (NTHCHAR CDRL -1) (QUOTE *)) (FIXP (MKATOM (SUBSTRING CDRL 2 -2] (ERROR CDRL (QUOTE "IS MISPLACED LABEL"] ((LISTP CDRL) (CIRCLMAKER1 CDRL))) (RETURN L]) (CIRCLPRINT [LAMBDA (L PRINTFLG RLKNT) (* lmm: 24-JAN-76 1 22) [RESETLST (RESETSAVE (RADIX 10)) (RESETVARS (#UNDOSAVES) (PROG NIL (CIRCLMARK L RLKNT) (COND (PRINTFLG (RLPRIN1 L)) (T (RLPRIN2 L))) (RLRESTORE L] L]) (CIRCLMARK [LAMBDA (L RLKNT) (* lmm: 19 MAY 75 233) (PROG NIL (COND ((NULL RLKNT) (SETQ RLKNT 0))) (RETURN (CSEARCH L]) (RLPRIN1 [LAMBDA (L) (PROG (PLACELIST LL) (SETQ PLACELIST NIL) (SETQ LL (LINELENGTH)) (CLPRINT L (QUOTE CAR)) (TERPRI]) (RLRESTORE [LAMBDA (L) (* lmm: 19 MAY 75 234) (PROG NIL (COND ((AND (LISTP L) (EQ (CAAR L) CIRCLMARKER)) (RPLACA L (CADAR L)) (RLRESTORE (CAR L)) (RLRESTORE (CDR L]) (CSEARCH [LAMBDA (L) (* lmm: 19 MAY 75 234) (PROG (NXPOINT) (COND ((LISTP L) (SETQ NXPOINT (CAR L)) [COND [(LISTP NXPOINT) (COND ((EQ (CAR NXPOINT) CIRCLMARKER) [COND ((NULL (CDDR NXPOINT)) (NCONC1 NXPOINT (SETQ RLKNT (ADD1 RLKNT] (RETURN NIL)) (T (/RPLACA L (LIST CIRCLMARKER NXPOINT)) (CSEARCH NXPOINT] (T (/RPLACA L (LIST CIRCLMARKER NXPOINT] (RETURN (CSEARCH (CDR L]) (PLACEPRINT [LAMBDA (P) (COND (P (COND ((IGREATERP (CDAR P) -1) (SPACES (IDIFFERENCE (CDAR P) (POSITION))) (PRIN1 (CAAR P)) (RPLACD (CAR P) -1))) (PLACEPRINT (CDR P]) (C2PRINT [LAMBDA (L CAMEFROM) (* lmm: 19 MAY 75 234) (PROG NIL (TERPRI) (PLACEPRINT PLACELIST) (TERPRI) (TERPRI) (RETURN (CPRINT L CAMEFROM]) (ROOMLEFT [LAMBDA NIL (IDIFFERENCE LL (POSITION]) (RLPRIN2 [LAMBDA (L) (RESETLST (PROG (PLACELIST LL) (* Rather than checking NCHARS of every atom before  printing it just to make sure that lines don't go  over the boundary (causing LISP to put in TERPRI's  where we don't want them) LINELENGTH is just changed to be something huge and we are conservative about  how much we think will fit on a line... If a structure has atoms with more than 8  characters, and appears on the end of a line, it  might overflow, though) (SETQ LL (IDIFFERENCE (LINELENGTH) 8)) (RESETSAVE (LINELENGTH (IPLUS LL 80))) (CPRINT L (QUOTE CAR)) (TERPRI) (PLACEPRINT PLACELIST) (TERPRI]) (CPRINT [LAMBDA (L CAMEFROM) (* This function does most of the work involved in  circlprinting in the double line format. IN this format, a node is labeled by the appearance  of its number on the line below where the node  begins. If the node is car of the node we came from  (i.e. if CAMEFRON = 'CAR) then the node begins with  a left parens, and the node's number should begin  immediately below that left parens. If the node is cdr of the node we came from  (i.e. if CAMEFROM = 'CDR) then the node is a tail of a list, and the number identifying it should appear  on the line below the beginning of that tail. Thus, when labeeling a node we have to save the  position where the node begins. Also, we have to alternate printing nodes and  printing their labels below them. The function that prints labels below nodes is  PLACEPRINT. CPRINT saves the information necessary  to print labels in the correct position by adding  sublists to an alist called PLACELIST. When CPRINT adds a sublist to PLACELIST, this  sublist is of the form (N . P), where N is the  number of the ndoe being labeled, and P is the  position where printing of the label should begin. When PLACEPRINT prints a line of labels, it merely  cdr's thru PLACELIST checking to see if there are  any sublists of the form (N . P), where P is greater than -1.0 For each such sublist, N is printed and  then the sublist is physically altered to be of the  form (N . -1). Thus PLACELIST can also be used as a  list of all labels that have been printed  (or will be printed, when PLACEPRINT is called next),  and CPRINT can merely do an assoc on placelist to  see if a given node has been previously labeled.) (PROG (LN N CARL CARLN CDRL CDRLN LABELEDCDRL? LABELEDCARL? EXSPACES ROOM) (COND ((ILESSP (SETQ ROOM (ROOMLEFT)) 3) (C2PRINT L CAMEFROM)) ((OR (NLISTP L) (NLISTP (CAR L)) (NEQ (CAAR L) CIRCLMARKER)) (ERROR (QUOTE "UNCIRCLMARKED LIST STRUCTURE"))) ((AND (SETQ LN (CDDAR L)) (SETQ N (CAR LN)) (FASSOC N PLACELIST)) (* L has already been printed; print a back reference) [COND ((ILESSP ROOM (IPLUS 2 (CIRCLNC N))) (RETURN (C2PRINT L CAMEFROM] (PRIN1 (QUOTE {)) (PRIN1 N) (PRIN1 (QUOTE }))) ([AND LN (ILESSP ROOM (IPLUS 3 (SETQ EXSPACES (CIRCLNC N] (C2PRINT L CAMEFROM)) (T [COND (LN (SETQ PLACELIST (NCONC1 PLACELIST (CONS (CAR LN) (POSITION] (* If LN is not NIL, the  structure needs to be labeled) [COND ((EQ CAMEFROM (QUOTE CAR)) (PRIN1 (QUOTE %(] [COND (LN (COND ((OR (NEQ EXSPACES 1) (NEQ CAMEFROM (QUOTE CAR))) (* Make sure there is enough  space to clearly label L) (SPACES EXSPACES] [COND ((NLISTP (SETQ CARL (CADAR L))) (PRIN2 CARL)) ((EQ L CARL) (COND ((ILESSP (ROOMLEFT) (IPLUS 2 EXSPACES)) (TERPRI) (PLACEPRINT PLACELIST) (TERPRI) (TERPRI))) (PRIN1 (QUOTE {)) (PRIN1 (CAR LN)) (PRIN1 (QUOTE }))) (T (CPRINT CARL (QUOTE CAR] (COND ((NULL (CDR L)) (PRIN1 (QUOTE %)))) ((NLISTP (CDR L)) (PRIN1 (QUOTE " .")) (SPACES 1) (PRIN2 (CDR L)) (PRIN1 (QUOTE %)))) ((AND (SETQ CDRLN (CDDADR L)) (FASSOC (CAR CDRLN) PLACELIST)) (* If (CDR L) has been labeled,  then print a reference.) (COND ([ILESSP (ROOMLEFT) (IPLUS 6 (CIRCLNC (CAR CDRLN] (TERPRI) (PLACEPRINT PLACELIST) (TERPRI) (TERPRI))) (PRIN1 (QUOTE " .")) (SPACES 1) (PRIN1 (QUOTE {)) (PRIN1 (CAR CDRLN)) (PRIN1 (QUOTE })) (PRIN1 (QUOTE %)))) (T (SPACES 1) (CPRINT (CDR L) (QUOTE CDR]) (CLPRINT [LAMBDA (L CAMEFROM) (* This function does most of the work involved in  cirlcprinting in the single line format. The problems encountered with the double line format (see CPRINT) do not occur here. In particular the alist PLACELIST is used by CLPRINT only to store the numbers of the reentrant nodes  that have already been labeled, not the positions  where they were labeled. CLPRINT prints a  description of each node (i.e. a label, a reference, or car and cdr) as it encounters it.) (PROG (LN N LABELIT CARL CDRL CDRLN LISTPCDRL? LABELEDCDRL? EXSPACES) (COND ((ILESSP (ROOMLEFT) 2) (TERPRI))) (COND ((LISTP L) (COND ((NOT (EQ (CAAR L) CIRCLMARKER)) (ERROR (QUOTE "UNCIRCLMARKED LIST STRUCTURE"))) ((AND (SETQ LN (CDDAR L)) (SETQ N (CAR LN)) (SETQ EXSPACES (CIRCLNC N)) (FMEMB N PLACELIST)) (* If L is a reentrant node and has already been  labeled then we simply print a reference to L. CIRCLNC computes the number of digits in N which is  2 less than the number of characters needed to label or reference L, and makes it the value of EXSPACES. If N is greater than or equal to 10000, then an  error is generated. Otherwise, the FMEMB on  placelist checks to see if L has already been  labeled, in which case we print a reference to L, in the code below this comment.) (COND ((ILESSP (ROOMLEFT) (IPLUS 2 EXSPACES)) (TERPRI))) (PRIN1 (QUOTE {)) (PRIN1 N) (PRIN1 (QUOTE }))) (T (COND (LN (* Checks to see if L has to be  labeled.) (COND ((ILESSP (ROOMLEFT) (IPLUS 3 EXSPACES)) (TERPRI))) (SETQ LABELIT T))) [COND (LABELIT (* If L is to be labeled, then  add N to placelist.) (SETQ PLACELIST (NCONC PLACELIST LN] [COND ((EQ CAMEFROM (QUOTE CAR)) (PRIN1 (QUOTE %(] (COND (LABELIT (* If L is to be labeled, then  print a label.) (PRIN1 (QUOTE *)) (PRIN1 (CAR LN)) (PRIN1 (QUOTE *)) (SPACES 1))) (COND [(LISTP (SETQ CARL (CADAR L))) (* If CARL is a list then if L = CARL then print a  reference to CARL automatically, else CPRINT CARL.) (COND ((EQ L CARL) (COND ((ILESSP (ROOMLEFT) (IPLUS 2 EXSPACES)) (TERPRI))) (PRIN1 (QUOTE {)) (PRIN1 (CAR LN)) (PRIN1 (QUOTE }))) (T (CLPRINT CARL (QUOTE CAR] (T (PRIN2 CARL))) (COND ((LISTP (SETQ CDRL (CDR L))) (* Check whether CDRL needs to  be labeled.) (COND ((AND (SETQ CDRLN (CDDADR L)) (FMEMB (CAR CDRLN) PLACELIST)) (SETQ LABELEDCDRL? T)) (T (SETQ LABELEDCDRL? NIL))) (SETQ LISTPCDRL? T)) (T (SETQ LISTPCDRL? NIL))) (COND (CDRL (* make sure there will be a  space between carl and cdrl.) (SPACES 1))) (COND [LISTPCDRL? (* If CDRL has been labeled and is reentrant, then  print a reference. Else if CDRL is a list the  CLPRINT CDRL, else just prin1 it.) (COND (LABELEDCDRL? (SETQ N (CAR CDRLN)) (COND ((ILESSP (ROOMLEFT) (IPLUS 5 (CIRCLNC N))) (TERPRI))) (PRIN1 (QUOTE %.)) (SPACES 1) (PRIN1 (QUOTE {)) (PRIN1 (CAR CDRLN)) (PRIN1 (QUOTE })) (PRIN1 (QUOTE %)))) (T (CLPRINT CDRL (QUOTE CDR] ((NULL CDRL) (PRIN1 (QUOTE %)))) (T (PRIN1 (QUOTE %.)) (SPACES 1) (PRIN2 CDRL) (PRIN1 (QUOTE %)]) (CIRCLNC [LAMBDA (N) (COND ((ILESSP N 10) 1) ((ILESSP N 100) 2) ((ILESSP N 1000) 3) ((ILESSP N 10000) 4) (T (ERROR (QUOTE "REENTRANT NODE HAS BEEN NUMBERD OVER 10000"]) ) (RPAQQ CIRCLMARKER "BEENHERE") [DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK: CIRCLBLOCK CIRCLMAKER CIRCLMAKER1 CIRCLPRINT CIRCLMARK RLPRIN1 RLRESTORE CSEARCH PLACEPRINT C2PRINT ROOMLEFT RLPRIN2 CPRINT CLPRINT CIRCLNC (ENTRIES CIRCLPRINT CIRCLMARK RLPRIN1 RLPRIN2 RLRESTORE CIRCLMAKER CIRCLMAKER1) (SPECVARS RLKNT LABELIST REFLIST) (LOCALFREEVARS PLACELIST LL) (NOLINKFNS . T) (GLOBALVARS #UNDOSAVES RESETVARSLST)) ] (DECLARE: DONTCOPY (FILEMAP (NIL (798 19253 (CIRCLMAKER 808 . 1331) (CIRCLMAKER1 1335 . 8241) (CIRCLPRINT 8245 . 8552) ( CIRCLMARK 8554 . 8739) (RLPRIN1 8743 . 8914) (RLRESTORE 8916 . 9169) (CSEARCH 9171 . 9675) (PLACEPRINT 9679 . 9909) (C2PRINT 9911 . 10133) (ROOMLEFT 10137 . 10194) (RLPRIN2 10198 . 10942) (CPRINT 10946 . 15100) (CLPRINT 15104 . 19037) (CIRCLNC 19041 . 19251))))) STOP P \ No newline at end of file diff --git a/lispusers/CIRCLPRINT.SKETCH b/lispusers/CIRCLPRINT.SKETCH new file mode 100644 index 0000000000000000000000000000000000000000..a5e93a2808a62d85e885bdfe32cb0decdad3aeeb GIT binary patch literal 7855 zcmcIp;cg-~5Kg83s_Iv$tVkyQOjon4^ zw%+ef&DWFGRdv|E@1C{QlM(&(W&hk9cG_6_{IuUb>qGPUzFi%(avw&xYTeM?2Q6=G z*zS+b^LDdqw3*P|BfZ;f^>%fHhwN&6NB>9q#FybuZN?KkT2<9}VrN?0*?1xs0mxT+ z%)^{4+RT@DoAE0yf_qtl!4mw#$m-oN{?YqgN|=m-A7z6qw+=_DimVyjRM3P z?HntB>)gW3!9~}AQMCGQAjXpidVGY&$)cIV7FJDu?w{_-og^}ov{*N(>?7ffb+a{K94un(L|{TUIV{oz}%t`oDB8hEEAZ__){*y*5j2M=wPy zN8RbSXfXm>@ib9-Y_BYravXY;M;#1?VMD`)WVsKw@3$@R5^m-7i@f0@h}GK(Hd&aUN%bk;ibz5u^oOR55Y1Vlw%{k?aL6Yr+R^OUB7K9#IHE3``h0Nl) zAbARljme<+A;N}_k%3#BuAT7TdhAk~?;%{gLS8G-w-(Tx*^rGdB{oROp>~pzLl+bm zeiU!xYS;v~-{EKngMI2eOv|;n;%=NEYIBy(>QUA%9xTPtZD->k6(PQ%XGl7WEBk3d5B};dL1s znF3|gbxTCmrPFJ72+RbzJ)+7TyhkDR{fCD(s6~iqYk>@di>&;7O>Xfe1VxBb({i}e zgdzgp(1S#FR4w7?%1#>KtHzF?F+2~W`hx|&2G<0$q;x12f{N!NHZZt&@vfzf*Nruw zm!oh;Sso~ECr|fB8{qWZv3{IVbx@OFyIM`kz1#W;kbHQq6%H7#Jzv1#3!1m9`Syf? zrhSMGmgyE=5OK?cZ>MS`%B`tCpYa@aQN&rUlm5kVNE#SIBPPTP&Q%y2d9w#ouy_*s zooda77V_|tRa9nCupR*;fg75e_Zm_vZV6ax5guho@?Far_24306tr$S2~qM?3MQhL z7q_S(7EFnv4-XYbN{v*7?PqQIccB?KX?`6cl!{QRJN*0c?uWbI?@aaFysX~0rx*IE zn11W5URUeSD`L&ae_YZh`Wg7kX1Chvmedley>cl-ttyedit.\;2 4515 |changes| |to:| (vars cl-ttyeditcoms) (usermacros ||) |previous| |date:| "29-Oct-87 11:59:24" {erinyes}medley>cl-ttyedit.\;1) ; Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. (prettycomprint cl-ttyeditcoms) (rpaqq cl-ttyeditcoms ((vars (**comment**flg ";..") (editrdtbl nil) (dummy nil)) (p (setq postgreetforms (remove (find x in postgreetforms suchthat (and (eq (car x) 'and) (eq (cadr x) 'editcharacters))) postgreetforms))) (variables edit-atoms) (functions subpat) (p (unadvise editfpat \\editblock/editcoma \\editblock/editcoml editl) (* "This is because EDITCOMA attempts to rebind RDTBL to EDITRDTBL on PP -- a useless thing, but PP will error if *READTABLE* is NIL" ) (changename '\\editblock/editcoma '*readtable* 'dummy)) (advise editl editfpat \\editblock/editcoma \\editblock/editcoml) (usermacros ||))) (rpaq **comment**flg ";..") (rpaqq editrdtbl nil) (rpaqq dummy nil) (setq postgreetforms (remove (find x in postgreetforms suchthat (and (eq (car x) 'and) (eq (cadr x) 'editcharacters))) postgreetforms)) (cl:defparameter edit-atoms '(("--" . --) ("&" . &) ("*ANY*" . *any*) ("---" . |..|) ("==" . ==)) ) (cl:defun subpat (x) (|if| (litatom x) |then| (|for| p |in| edit-atoms |when| (strequal (car p) x) |do| (return (cdr p)) |finally| (return x)) |else| x)) (unadvise editfpat \\editblock/editcoma \\editblock/editcoml editl) (* "This is because EDITCOMA attempts to rebind RDTBL to EDITRDTBL on PP -- a useless thing, but PP will error if *READTABLE* is NIL" ) (changename '\\editblock/editcoma '*readtable* 'dummy) (xcl:reinstall-advice 'editl :around '((:last (let ((*readtable* *readtable*) (name (readtableprop *readtable* 'name))) (if (or (null name) (strpos "EDIT-" name)) then (setq editrdtbl *readtable*) else (or (find-readtable (setq name (concat "EDIT-" name))) (progn (setq editrdtbl (copyreadtable *readtable*)) (readtableprop editrdtbl 'name name) (apply 'settermchars editcharacters))) (setq *readtable* editrdtbl)) *)))) (xcl:reinstall-advice 'editfpat :before '((:last (setq pat (subpat pat))))) (xcl:reinstall-advice '\\editblock/editcoma :before '((:last (setq c (mkatom (u-case (mkstring c))))) )) (xcl:reinstall-advice '\\editblock/editcoml :before '((:last (and (litatom (car c)) (rplaca c (mkatom (u-case (mkstring (car c))))))))) (readvise editl editfpat \\editblock/editcoma \\editblock/editcoml) (addtovar usermacros (|| (a . b) up (1 a . b))) (addtovar editcomsl ||) (putprops cl-ttyedit copyright ("Xerox Corporation" 1987 1988)) (declare\: dontcopy (filemap (nil))) stop \ No newline at end of file diff --git a/lispusers/CL-TTYEDIT.TEDIT b/lispusers/CL-TTYEDIT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..78858b1366725b03d319f5ad387cb5a952bd8f09 GIT binary patch literal 3444 zcmeHI+iu%N5Tz9-LF?+FMGN$)7`Q-788Tz5itQu_P+FpFA{41oRATpyp;i`QiYt&* zTow6({7`|u76tMj{eyl%&nzX`xj4yFivl5Ja(8xS_RKl6Ymxr;>`$40(sH(g;M8i{ zLA6n>HmlX$YW0c@GuRI2_lcY^%jVP#^EfR;M*4DO^voYmL?(YRT3)wS4aRX!LmAB` zA}uHh^Mb@MF2s;zO0Ik+CQlLFXx3@>-od_6wcWt?+JjbLdu|y#iW5Q8u!zPYr(!G! z096i|Q7&N#3ySf}DWoJW3V2UsCTNz2Pce>Da^_ha-RX*9BIYzgSSr(Pn_(w$K1GsQ z7Kz*-JHMYL9)xl5#aO@twJ23i&_9E|<=?;GBNS*m<@fpYIn=%^fx&iqWBa-D}upSFBGaCbGa$C^I~uvM65RG+b4RW{lwtTYX?@f2yhnY~e;Sx=YFTbz`BuBeh5Cz?{($#x`F1ZrBHMjz_idab@;V*BcC1#= z1Cl_^d%hRIV71Ft2E4mN9kXjYr_}Y@mhX}W5gglHBnW)_k>w4_@PP}D)tYtEGu=Ke zGxDvYfn)mAcf6jpnmw`XqvL?Opl;A*V3xn!nGcO(huP}~r+|x54Yc`P6ZE{n8;IH6 zZ_*EY)Hpc6r&jvw$GA4YW=Yp#5}Y!Kf$L&{O^7{c(tfi^cN2{gj>`MZ+QdA04{?PPAH0-K{sZTUvuhYcI9i z_*8DJW4!iqO|4${T1ITZVf}+5>YNIDe9jS-8$7%AscSE^7i$MV_Tj#qY`p^P?|6=R z4H(q(8tM(ccNX`VwsGY$E4|-%uY;|xwA(Gm?Dy@K_C@JX(cWwPdgb}0cB}jkpnZD1 z4J(&^pS{J8NxFP0C24G6j+Kf4RStNjEUP6}oHf*L@=GhDD{$I4_6Lq-99cofUAux{ zfmC^`RLemA{=0#!wZdL9P|?`%E(n+GEofK?I3K^&R{vJ{3P@M=~r; jQ+e3%3UipOeY1=yE6}t*UN`*py5aAIVcpSczyAIY!>tBN literal 0 HcmV?d00001 diff --git a/lispusers/COLOR b/lispusers/COLOR new file mode 100644 index 00000000..13695db2 --- /dev/null +++ b/lispusers/COLOR @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §PACKAGE "INTERLISP" §READTABLE "INTERLISP" §BASE 10) (FILECREATED "27-Jan-87 15:56:46" {ERIS}NEXT>COLOR.;2 65054 changes to%: (VARS COLORCOMS EditColorMapHeight EditColorMapWidth DICOLOR.hueMapping DICOLOR.lightnessMapping DICOLOR.saturationMapping NEWCOLORITEM DICOLOR.hueConstants DICOLOR.achromatic DICOLOR.blue DICOLOR.bluePurple DICOLOR.bluishGreen DICOLOR.bluishPurple DICOLOR.brown DICOLOR.brownYellow DICOLOR.brownishRed DICOLOR.brownishYellow DICOLOR.green DICOLOR.greenBlue DICOLOR.greenishBlue DICOLOR.greenishYellow DICOLOR.orange DICOLOR.orangeYellow DICOLOR.orangishRed DICOLOR.orangishYellow DICOLOR.purple DICOLOR.purpleRed DICOLOR.purplishBlue DICOLOR.purplishRed DICOLOR.red DICOLOR.redBrown DICOLOR.redOrange DICOLOR.reddishBrown DICOLOR.reddishOrange DICOLOR.reddishPurple DICOLOR.yellow DICOLOR.yellowGreen DICOLOR.yellowishBrown DICOLOR.yellowishGreen DICOLOR.yellowishOrange DICOLOR.saturationConstants DICOLOR.noSaturation DICOLOR.grayish DICOLOR.moderate DICOLOR.strong DICOLOR.vivid DICOLOR.lightnessConstants DICOLOR.black DICOLOR.veryDark DICOLOR.dark DICOLOR.medium DICOLOR.light DICOLOR.veryLight DICOLOR.white) (FNS DISPLAYCOLORLEVELS DISPLAYHLSLEVELS HLSLEVEL HLSTORGB HLSVALUEFN HLSVALUEFROMLEVEL LEVELFROMHLSVALUE RAINBOWMAP RGBTOHLS OVERPAINT BITMAPFROMSTRING SHADEBITMAP EDITCOLORMAP GETCOLOR#FROMUSER GETCOLOR#FROMSCREEN DISPLAYCOLORLEVEL FILLINREGION AREAFILL CENTEREDLEFT OUTLINEAREA OUTLINEREGION ADJUSTCOLORMAP SHOWCOLORBLOCKS MAPOFACOLOR CNSMENUINIT CNSTOCSL CNSTORGB CSLTOCNS DICOLOR.FROM.USER GETCNS HLSTOCSL CSLTOHLS RGBTOCNS DICOLOR.hueN DICOLOR.hueNvalue DICOLOR.hueNname DICOLOR.lightnessN DICOLOR.lightnessNvalue DICOLOR.lightnessNname DICOLOR.saturationN DICOLOR.saturationNvalue DICOLOR.saturationNname) (RECORDS hueRecord lightnessRecord saturationRecord) previous date%: "16-Jan-87 18:20:53" {ERIS}NEXT>COLOR.;1) (* " Copyright (c) 1982, 1983, 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COLORCOMS) (RPAQQ COLORCOMS [(FNS DISPLAYCOLORLEVELS DISPLAYHLSLEVELS HLSLEVEL HLSTORGB HLSVALUEFN HLSVALUEFROMLEVEL LEVELFROMHLSVALUE RAINBOWMAP RGBTOHLS) (FNS OVERPAINT BITMAPFROMSTRING SHADEBITMAP) (INITVARS (EDITCOLORMAP.WINDOW NIL)) (FNS EDITCOLORMAP EDITCOLORMAP.BUTTONEVENTFN EDITCOLORMAP.REDISPLAYFN EDITCOLORMAP.VALUELEVEL EDITCOLORMAP.WINDOWLEVEL CHANGECOLORLEVELS GETCOLOR#FROMUSER GETCOLOR#FROMSCREEN DISPLAYCOLORLEVEL FILLINREGION AREAFILL CENTEREDLEFT OUTLINEAREA OUTLINEREGION) (FNS ADJUSTCOLORMAP SHOWCOLORBLOCKS MAPOFACOLOR COLORHEXPATTERN) (VARS EditColorMapHeight EditColorMapWidth (COLOR#MENUSAVE) (CONTROLMENUSAVE) (EDIT8BITCOLORMAPMENU) (EDIT8BITCOLORMAPNUMBERREADER)) (GLOBALVARS COLOR#MENUSAVE CONTROLMENUSAVE EDIT8BITCOLORMAPMENU EDIT8BITCOLORMAPNUMBERREADER EditColorMapHeight EditColorMapWidth) (COMS (* ;;; "support for global naming and querying of colors.") (FNS CNSMENUINIT CNSTOCSL CNSTORGB CSLTOCNS DICOLOR.FROM.USER GETCNS HLSTOCSL CSLTOHLS RGBTOCNS) (VARS DICOLOR.hueMapping DICOLOR.lightnessMapping DICOLOR.saturationMapping NEWCOLORITEM) (INITVARS (COLORNAMEMENU)) (FNS DICOLOR.hueN DICOLOR.hueNvalue DICOLOR.hueNname DICOLOR.lightnessN DICOLOR.lightnessNvalue DICOLOR.lightnessNname DICOLOR.saturationN DICOLOR.saturationNvalue DICOLOR.saturationNname) (DECLARE%: EVAL@LOAD DONTCOPY (*) (RECORDS hueRecord lightnessRecord saturationRecord) (CONSTANTS * DICOLOR.hueConstants) (CONSTANTS * DICOLOR.saturationConstants) (CONSTANTS * DICOLOR.lightnessConstants)) (P (CNSMENUINIT))) (FILES LLCOLOR READNUMBER) (P (SETQ EDITBMMENU NIL) (MOVD 'ARRAYP 'COLORMAPP]) (DEFINEQ (DISPLAYCOLORLEVELS [LAMBDA (WINDOW RGB) (* kbr%: " 3-Jun-86 19:45") (PROG (HLS) (DISPLAYCOLORLEVEL WINDOW 'RED (fetch (RGB RED) of RGB) (fetch (RGB RED) of RGB)) (DISPLAYCOLORLEVEL WINDOW 'GREEN (fetch (RGB GREEN) of RGB) (fetch (RGB GREEN) of RGB)) (DISPLAYCOLORLEVEL WINDOW 'BLUE (fetch (RGB BLUE) of RGB) (fetch (RGB BLUE) of RGB)) (SETQ HLS (RGBTOHLS RGB)) (DISPLAYCOLORLEVEL WINDOW 'HUE (fetch (HLS HUE) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'HUE (fetch (HLS HUE) of HLS))) (DISPLAYCOLORLEVEL WINDOW 'LIGHTNESS (fetch (HLS LIGHTNESS) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'LIGHTNESS (fetch (HLS LIGHTNESS) of HLS))) (DISPLAYCOLORLEVEL WINDOW 'SATURATION (fetch (HLS SATURATION) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'SATURATION (fetch (HLS SATURATION) of HLS]) (DISPLAYHLSLEVELS [LAMBDA (HLS WIN) (* rrb "25-OCT-82 14:08") (* displays a hue lightness saturation triple in the edit window.) (DISPLAYHLSLEVEL HLS 'HUE NIL WIN) (DISPLAYHLSLEVEL HLS 'LIGHTNESS NIL WIN) (DISPLAYHLSLEVEL HLS 'SATURATION NIL WIN]) (HLSLEVEL [LAMBDA (HLS FIELD NEWLEVEL) (* rrb "25-OCT-82 13:29") (* returns the value of the named field from a hue lightness saturation record.) (SELECTQ FIELD (HUE (PROG1 (fetch (HLS HUE) of HLS) (AND NEWLEVEL (replace (HLS HUE) of HLS with NEWLEVEL)))) (LIGHTNESS (PROG1 (fetch (HLS LIGHTNESS) of HLS) (AND NEWLEVEL (replace (HLS LIGHTNESS) of HLS with NEWLEVEL)))) (SATURATION (PROG1 (fetch (HLS SATURATION) of HLS) (AND NEWLEVEL (replace (HLS SATURATION) of HLS with NEWLEVEL)))) (SHOULDNT]) (HLSTORGB [LAMBDA (HLS LIGHTNESS SATURATION) (* kbr%: " 3-Jun-86 21:16") (* Converts from a hue saturation lightness triple into red green blue triple.  HUE is in range 0 to 360, lightness and saturation are in the range 0 to 1.0 *) (* This algorithm was taken from siggraph vol 13 number 3 August 1979%: Status  report on graphics standards planning committee.  *) (PROG (HUE M1 M2 RGB) (COND ((LISTP HLS) (SETQ HUE (fetch (HLS HUE) of HLS)) (SETQ LIGHTNESS (fetch (HLS LIGHTNESS) of HLS)) (SETQ SATURATION (fetch (HLS SATURATION) of HLS))) (T (SETQ HUE HLS))) [SETQ M1 (COND ((FGREATERP 0.5 LIGHTNESS) (FTIMES LIGHTNESS (FPLUS 1.0 SATURATION))) (T (FDIFFERENCE (FPLUS LIGHTNESS SATURATION) (FTIMES LIGHTNESS SATURATION] (SETQ M2 (FDIFFERENCE (FTIMES 2.0 LIGHTNESS) M1)) [SETQ RGB (create RGB RED _ (HLSVALUEFN M1 M2 HUE) GREEN _ (HLSVALUEFN M1 M2 (IDIFFERENCE HUE 120)) BLUE _ (HLSVALUEFN M1 M2 (IDIFFERENCE HUE 240] (RETURN RGB]) (HLSVALUEFN [LAMBDA (M1 M2 HUE) (* kbr%: " 3-Jun-86 20:45") (* Internal value function for converting from HLS to RGB.  *) (SETQ HUE (IMOD HUE 360)) (FIX (FTIMES (COND ((ILESSP HUE 60) M1) [(ILESSP HUE 120) (FPLUS M1 (FTIMES (FQUOTIENT (FDIFFERENCE HUE 60) 60) (FDIFFERENCE M2 M1] ((ILESSP HUE 240) M2) [(ILESSP HUE 300) (FPLUS M2 (FTIMES (FQUOTIENT (FDIFFERENCE HUE 240) 60) (FDIFFERENCE M1 M2] (T M1)) 255]) (HLSVALUEFROMLEVEL [LAMBDA (HLS LEVEL) (* rrb "25-OCT-82 13:26") (* returns the scaled value of the hls marker on a scale from 0 to 255) (SELECTQ HLS (HUE (IQUOTIENT (ITIMES LEVEL 360) 255)) (FQUOTIENT LEVEL 255]) (LEVELFROMHLSVALUE [LAMBDA (HLS LEVEL) (* rrb "25-OCT-82 14:06") (* returns the level on a scale from 0 to 255 that this value would have.) (SELECTQ HLS (HUE (IQUOTIENT (ITIMES LEVEL 255) 360)) (FIX (FTIMES LEVEL 255]) (RAINBOWMAP [LAMBDA (NBITS) (* rrb "21-OCT-82 18:14") [OR NBITS (NULL (COLORDISPLAYP)) (SETQ NBITS (COLORMAPBITS (SCREENCOLORMAP] (COLORMAPCREATE (COND [(EQ NBITS 8) (PROG (MAXINTENSITY MINVISIBLERED MINVISIBLEBLUE MINVISIBLEGREEN NSTEPS REDSTEPSIZE GREENSTEPSIZE BLUESTEPSIZE) (SETQ MAXINTENSITY 255) (SETQ MINVISIBLERED 69) (SETQ MINVISIBLEBLUE 38) (SETQ MINVISIBLEGREEN 38) (SETQ NSTEPS (IQUOTIENT (EXPT 2 NBITS) 8)) (* determine how many steps are available for each transition from one color to  the next. There are 8 such transitions. red up, green up, red down, blue up,  green down, red up, green up, all down) (* minimum visible intensity values were emperically determined but will differ  depending upon the brightness setting of the individual display.  They are also diddled to make the numer of steps come out right.) (RETURN (NCONC (for I from MINVISIBLERED to MAXINTENSITY by (SETQ REDSTEPSIZE (IQUOTIENT (IPLUS (IDIFFERENCE MAXINTENSITY MINVISIBLERED ) NSTEPS -2) NSTEPS)) collect (* red up) (LIST I 0 0)) (for I from MINVISIBLEGREEN to MAXINTENSITY by (SETQ GREENSTEPSIZE (IQUOTIENT (IPLUS (IDIFFERENCE MAXINTENSITY MINVISIBLEGREEN ) -1 NSTEPS) NSTEPS)) collect (* GREEN UP) (LIST 255 I 0)) (for I from REDSTEPSIZE to (IDIFFERENCE MAXINTENSITY MINVISIBLERED) by REDSTEPSIZE collect (* red down) (LIST (IDIFFERENCE MAXINTENSITY I) 255 0)) (CONS '(0 255 0)) (for I from MINVISIBLEBLUE to MAXINTENSITY by (SETQ BLUESTEPSIZE (IQUOTIENT (IPLUS (IDIFFERENCE MAXINTENSITY MINVISIBLEBLUE ) -1 NSTEPS) NSTEPS)) collect (* BLUE UP) (LIST 0 255 I)) (for I from GREENSTEPSIZE to (IDIFFERENCE MAXINTENSITY MINVISIBLEGREEN) by GREENSTEPSIZE collect (* GREEN down) (LIST 0 (IDIFFERENCE MAXINTENSITY I) 255)) (CONS '(0 0 255)) (for I from MINVISIBLERED to MAXINTENSITY by REDSTEPSIZE collect (* red up) (LIST I 0 255)) (for I from MINVISIBLEGREEN to MAXINTENSITY by GREENSTEPSIZE collect (* GREEN UP) (LIST 255 I 255)) (for I from GREENSTEPSIZE to (IDIFFERENCE MAXINTENSITY MINVISIBLEGREEN) by GREENSTEPSIZE collect (* all down) (LIST (IDIFFERENCE MAXINTENSITY I) (IDIFFERENCE MAXINTENSITY I) (IDIFFERENCE MAXINTENSITY I))) (CONS '(0 0 0] (T RAINBOWINTENSITIES)) NBITS]) (RGBTOHLS [LAMBDA (RGB GREEN BLUE) (* kbr%: " 3-Jun-86 20:13") (* Converts from a red green blue triple of color information into a hue  lightness saturation triple. *) (* This algorithm was taken from Procedural Elements for Computer Graphics 1985  page 405 by David F. Rogers *) (PROG (RED CR CG CB M1 M2 LIGHTNESS HLS) (COND ((LISTP RGB) (SETQ RED (fetch (RGB RED) of RGB)) (SETQ GREEN (fetch (RGB GREEN) of RGB)) (SETQ BLUE (fetch (RGB BLUE) of RGB))) (T (SETQ RED RGB))) (SETQ M1 (MAX RED GREEN BLUE)) (SETQ M2 (MIN RED GREEN BLUE)) (SETQ LIGHTNESS (FQUOTIENT (FPLUS (FQUOTIENT M1 255) (FQUOTIENT M2 255)) 2)) [SETQ HLS (COND ((EQ M1 M2) (create HLS HUE _ 0 LIGHTNESS _ LIGHTNESS SATURATION _ 0.0)) (T (SETQ CR (FQUOTIENT (IDIFFERENCE M1 RED) (IDIFFERENCE M1 M2))) (SETQ CG (FQUOTIENT (IDIFFERENCE M1 GREEN) (IDIFFERENCE M1 M2))) (SETQ CB (FQUOTIENT (IDIFFERENCE M1 BLUE) (IDIFFERENCE M1 M2))) (create HLS HUE _ (IMOD (FIX (FTIMES [COND ((EQ M1 RED) (FDIFFERENCE CB CG)) ((EQ M1 GREEN) (FPLUS 2.0 (FDIFFERENCE CR CB))) (T (FPLUS 4.0 (FDIFFERENCE CG CR] 60.0)) 360) LIGHTNESS _ LIGHTNESS SATURATION _ (COND ((FGREATERP 0.5 LIGHTNESS) (FQUOTIENT (IDIFFERENCE M1 M2) (IPLUS M1 M2))) (T (FQUOTIENT (IDIFFERENCE M1 M2) (IDIFFERENCE (ITIMES 2 255) (IPLUS M1 M2] (RETURN HLS]) ) (DEFINEQ (OVERPAINT [LAMBDA (BM1 BM2 X Y TXT SCR) (* kbr%: " 2-Sep-85 20:30") (* Uses BM1 as a mask thru which it paints the INVERSE of texture onto BM2 at  position X Y) (PROG (BMW BMH) (SETQ BMW (BITMAPWIDTH BM1)) (SETQ BMH (BITMAPHEIGHT BM1)) (OR SCR (SETQ SCR (BITMAPCOPY BM1))) (* We need a scratch BM.  Most demos cache one) (BITBLT BM1 0 0 SCR 0 0 BMW BMH 'INPUT 'REPLACE) (BITBLT NIL NIL NIL SCR 0 0 BMW BMH 'TEXTURE 'ERASE TXT) (BITBLT BM1 0 0 BM2 X Y BMW BMH 'INPUT 'ERASE) (BITBLT SCR 0 0 BM2 X Y BMW BMH 'INPUT 'PAINT]) (BITMAPFROMSTRING [LAMBDA (STRING FONT BITSPERPIXEL) (* kbr%: "11-Aug-85 16:14") (PROG (BITMAP DS) (SETQ BITMAP (BITMAPCREATE (STRINGWIDTH STRING FONT) (FONTPROP FONT 'HEIGHT) BITSPERPIXEL)) (SETQ DS (DSPCREATE BITMAP)) (DSPFONT FONT DS) (MOVETO 0 (FONTPROP FONT 'DESCENT) DS) (PRIN3 STRING DS) (RETURN BITMAP]) (SHADEBITMAP [LAMBDA (BM T0 T1) (* bas%: "25-APR-82 15:02") (* Shades bitmap BM with T0 into 0 areas and T1 into 1 areas) (BITBLT NIL NIL NIL BM NIL NIL NIL NIL 'TEXTURE 'INVERT (LOGAND T0 (LOGXOR T0 T1))) (BITBLT NIL NIL NIL BM NIL NIL NIL NIL 'TEXTURE 'PAINT (LOGAND T0 T1)) (BITBLT NIL NIL NIL BM NIL NIL NIL NIL 'TEXTURE 'ERASE (LOGXOR (LOGOR T0 T1) 65535]) ) (RPAQ? EDITCOLORMAP.WINDOW NIL) (DEFINEQ (EDITCOLORMAP [LAMBDA NIL (* kbr%: " 5-Jun-86 22:49") (* Colormap Editor. Let's user  interactively adjust colormap.  *) (PROG (XPOS REDREGION GREENREGION BLUEREGION HUEREGION LIGHTNESSREGION SATURATIONREGION BOTTOM) (COND ((NULL EDITCOLORMAP.WINDOW) (SETQ EDITCOLORMAP.WINDOW (CREATEW (GETBOXREGION EditColorMapWidth EditColorMapHeight NIL NIL NIL "Select location of Colormap Editor window.") "Colormap Editor")) (CLRPROMPT) (WINDOWPROP EDITCOLORMAP.WINDOW 'BUTTONEVENTFN 'EDITCOLORMAP.BUTTONEVENTFN) (WINDOWPROP EDITCOLORMAP.WINDOW 'REPAINTFN 'EDITCOLORMAP.REDISPLAYFN) (WINDOWPROP EDITCOLORMAP.WINDOW 'COLOR 0)) (T (CLEARW EDITCOLORMAP.WINDOW))) (REDISPLAYW EDITCOLORMAP.WINDOW]) (EDITCOLORMAP.BUTTONEVENTFN [LAMBDA (WINDOW) (* kbr%: " 4-Jun-86 21:21") (* Colormap editor. Displays a colormap in a window and allows the user to  change it. *) (PROG (REDREGION GREENREGION BLUEREGION HUEREGION LIGHTNESSREGION SATURATIONREGION BOTTOM COLOR COLORMAP LEVEL LASTX LASTY HLS OLDLEVEL COMPONENT) (PROGN (SETQ REDREGION (WINDOWPROP WINDOW 'REDREGION)) (SETQ GREENREGION (WINDOWPROP WINDOW 'GREENREGION)) (SETQ BLUEREGION (WINDOWPROP WINDOW 'BLUEREGION)) (SETQ HUEREGION (WINDOWPROP WINDOW 'HUEREGION)) (SETQ LIGHTNESSREGION (WINDOWPROP WINDOW 'LIGHTNESSREGION)) (SETQ SATURATIONREGION (WINDOWPROP WINDOW 'SATURATIONREGION)) (SETQ BOTTOM (fetch (REGION BOTTOM) of REDREGION))) (SETQ COLOR (WINDOWPROP WINDOW 'COLOR)) (SETQ COLORMAP (SCREENCOLORMAP)) (COND [(LASTMOUSESTATE MIDDLE) (COND ((NUMBERP (SETQ LEVEL (GETCOLOR#FROMUSER))) (WINDOWPROP WINDOW 'COLOR LEVEL) (REDISPLAYW WINDOW] ((LASTMOUSESTATE LEFT) (SETQ LASTX (LASTMOUSEX WINDOW)) (SETQ LASTY (LASTMOUSEY WINDOW)) (COND ([SETQ COMPONENT (COND ((INSIDEP REDREGION LASTX LASTY) 'RED) ((INSIDEP GREENREGION LASTX LASTY) 'GREEN) ((INSIDEP BLUEREGION LASTX LASTY) 'BLUE) ((INSIDEP HUEREGION LASTX LASTY) 'HUE) ((INSIDEP LIGHTNESSREGION LASTX LASTY) 'LIGHTNESS) ((INSIDEP SATURATIONREGION LASTX LASTY) 'SATURATION] (SETQ OLDLEVEL (WINDOWPROP WINDOW COMPONENT)) (until (MOUSESTATE (NOT LEFT)) do (* As long as LEFT is down, adjust the color.  *) [SETQ LEVEL (IMIN 255 (IMAX 0 (IDIFFERENCE (LASTMOUSEY WINDOW ) BOTTOM] (COND ((NOT (EQ LEVEL OLDLEVEL)) (CHANGECOLORLEVELS WINDOW COMPONENT LEVEL) [SCREENCOLORMAPENTRY COLOR (create RGB RED _ (WINDOWPROP WINDOW 'RED) GREEN _ (WINDOWPROP WINDOW 'GREEN) BLUE _ (WINDOWPROP WINDOW 'BLUE] (SETQ OLDLEVEL LEVEL]) (EDITCOLORMAP.REDISPLAYFN [LAMBDA (WINDOW) (* kbr%: " 4-Jun-86 20:46") (* Colormap Editor. Let's user  interactively adjust colormap.  *) (PROG (XPOS REDREGION GREENREGION BLUEREGION HUEREGION LIGHTNESSREGION SATURATIONREGION BOTTOM COLORMAP COLOR) (CLEARW WINDOW) (PROGN (MOVETO 35 4 WINDOW) (PRIN1 "RED" WINDOW) (SETQ REDREGION '(40 16 10 256)) (OUTLINEREGION REDREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'REDREGION REDREGION)) (PROGN (MOVETO 70 4 WINDOW) (PRIN1 "GREEN" WINDOW) (SETQ GREENREGION '(82 16 10 256)) (OUTLINEREGION GREENREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'GREENREGION GREENREGION)) (PROGN (MOVETO 119 4 WINDOW) (PRIN1 "BLUE" WINDOW) (SETQ BLUEREGION '(128 16 10 256)) (OUTLINEREGION BLUEREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'BLUEREGION BLUEREGION)) (PROGN (MOVETO 181 4 WINDOW) (PRIN1 "HUE" WINDOW) (SETQ HUEREGION '(186 16 10 256)) (OUTLINEREGION HUEREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'HUEREGION HUEREGION)) (PROGN (MOVETO 216 4 WINDOW) (PRIN1 "LIGHTNESS" WINDOW) (SETQ LIGHTNESSREGION '(242 16 10 256)) (OUTLINEREGION LIGHTNESSREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'LIGHTNESSREGION LIGHTNESSREGION)) (PROGN (MOVETO 300 4 WINDOW) (PRIN1 "SAT" WINDOW) (SETQ SATURATIONREGION '(305 16 10 256)) (OUTLINEREGION SATURATIONREGION 2 NIL WINDOW) (WINDOWPROP WINDOW 'SATURATIONREGION SATURATIONREGION)) (PROGN (SETQ COLORMAP (SCREENCOLORMAP)) (SETQ COLOR (WINDOWPROP WINDOW 'COLOR)) (MOVETO 8 250 WINDOW) (printout WINDOW |.I3| COLOR) (DISPLAYCOLORLEVELS WINDOW (ELT COLORMAP COLOR]) (EDITCOLORMAP.VALUELEVEL [LAMBDA (COMPONENT WINDOWLEVEL) (* kbr%: " 3-Jun-86 19:55") (* * Value that would be stored in an RGB or HLS corresponding to WINDOWLEVEL.  *) (SELECTQ COMPONENT (HUE (IQUOTIENT (ITIMES WINDOWLEVEL 360) 255)) ((LIGHTNESS SATURATION) (FQUOTIENT WINDOWLEVEL 255)) ((RED GREEN BLUE) WINDOWLEVEL) (SHOULDNT]) (EDITCOLORMAP.WINDOWLEVEL [LAMBDA (COMPONENT VALUELEVEL) (* kbr%: " 3-Jun-86 19:55") (* * Given VALUELEVEL of an RGB or HLS, what WINDOWLEVEL should be used to  display it? *) (SELECTQ COMPONENT (HUE (IQUOTIENT (ITIMES VALUELEVEL 255) 360)) ((LIGHTNESS SATURATION) (FIX (FTIMES VALUELEVEL 255))) ((RED GREEN BLUE) VALUELEVEL) (SHOULDNT]) (CHANGECOLORLEVELS [LAMBDA (WINDOW COMPONENT WINDOWLEVEL) (* kbr%: " 3-Jun-86 19:55") (PROG (RGB HLS) (DISPLAYCOLORLEVEL WINDOW COMPONENT (EDITCOLORMAP.VALUELEVEL COMPONENT WINDOWLEVEL) WINDOWLEVEL) (SELECTQ COMPONENT ((RED GREEN BLUE) [SETQ HLS (RGBTOHLS (WINDOWPROP WINDOW 'RED) (WINDOWPROP WINDOW 'GREEN) (WINDOWPROP WINDOW 'BLUE] (DISPLAYCOLORLEVEL WINDOW 'HUE (fetch (HLS HUE) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'HUE (fetch (HLS HUE) of HLS))) (DISPLAYCOLORLEVEL WINDOW 'LIGHTNESS (fetch (HLS LIGHTNESS) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'LIGHTNESS (fetch (HLS LIGHTNESS) of HLS))) (DISPLAYCOLORLEVEL WINDOW 'SATURATION (fetch (HLS SATURATION) of HLS) (EDITCOLORMAP.WINDOWLEVEL 'SATURATION (fetch (HLS SATURATION) of HLS)))) ((HUE LIGHTNESS SATURATION) [SETQ RGB (HLSTORGB (EDITCOLORMAP.VALUELEVEL 'HUE (WINDOWPROP WINDOW 'HUE)) (EDITCOLORMAP.VALUELEVEL 'LIGHTNESS (WINDOWPROP WINDOW 'LIGHTNESS)) (EDITCOLORMAP.VALUELEVEL 'SATURATION (WINDOWPROP WINDOW 'SATURATION] (DISPLAYCOLORLEVEL WINDOW 'RED (fetch (RGB RED) of RGB) (fetch (RGB RED) of RGB)) (DISPLAYCOLORLEVEL WINDOW 'GREEN (fetch (RGB GREEN) of RGB) (fetch (RGB GREEN) of RGB)) (DISPLAYCOLORLEVEL WINDOW 'BLUE (fetch (RGB BLUE) of RGB) (fetch (RGB BLUE) of RGB))) (SHOULDNT]) (GETCOLOR#FROMUSER [LAMBDA NIL (* edited%: " 8-SEP-82 21:44") (* reads a color number from the user.) (PROG (RESPONSE) (MOVEW [COND ((TYPENAMEP EDIT8BITCOLORMAPNUMBERREADER 'WINDOW) EDIT8BITCOLORMAPNUMBERREADER) (T (SETQ EDIT8BITCOLORMAPNUMBERREADER (CREATE.NUMBERPAD.READER '(Enter color number to edit%:) (create POSITION XCOORD _ LASTMOUSEX YCOORD _ LASTMOUSEY] (create POSITION XCOORD _ LASTMOUSEX YCOORD _ LASTMOUSEY)) LP (COND ([NULL (ERSETQ (SETQ RESPONSE (NUMBERPAD.READ EDIT8BITCOLORMAPNUMBERREADER] (* currently there is no way NIL can be returned from NUMBERPAD.READ but there  should be a way to quit.) (RETURN NIL)) ((OR (ILESSP RESPONSE 0) (IGREATERP RESPONSE 255)) (PROMPTPRINT "Color numbers must be between 0 and 255.") (GO LP)) (T (RETURN RESPONSE]) (GETCOLOR#FROMSCREEN [LAMBDA NIL (* rrb " 3-NOV-82 13:57") (* returns the color number of a point selected by the user.) (RESETFORM (CHANGECURSORSCREEN (COLORSCREENBITMAP)) (PROG (POS) (SETQ POS (GETPOSITION)) (RETURN (AND POS (BITMAPBIT (COLORSCREENBITMAP) (fetch (POSITION XCOORD) of POS) (fetch (POSITION YCOORD) of POS]) (DISPLAYCOLORLEVEL [LAMBDA (WINDOW COMPONENT NEWLEVEL WINDOWLEVEL) (* kbr%: " 4-Jun-86 20:23") (PROG (REGION) (WINDOWPROP WINDOW COMPONENT WINDOWLEVEL) (SETQ REGION (SELECTQ COMPONENT (RED (WINDOWPROP WINDOW 'REDREGION)) (BLUE (WINDOWPROP WINDOW 'BLUEREGION)) (GREEN (WINDOWPROP WINDOW 'GREENREGION)) (HUE (WINDOWPROP WINDOW 'HUEREGION)) (LIGHTNESS (WINDOWPROP WINDOW 'LIGHTNESSREGION)) (SATURATION (WINDOWPROP WINDOW 'SATURATIONREGION)) (SHOULDNT))) [PROGN (* Print out new level of COMPONENT.  *) (MOVETO (IDIFFERENCE (fetch (REGION LEFT) of REGION) 12) (IPLUS 8 (fetch (REGION TOP) of REGION)) WINDOW) (* Overstrike extra digits in case the old value was larger.  *) (COND ((FIXP NEWLEVEL) (printout WINDOW " " |.I3| NEWLEVEL)) (T (printout WINDOW |.F5.3| NEWLEVEL] (FILLINREGION REGION WINDOWLEVEL GRAYSHADE WINDOW]) (FILLINREGION [LAMBDA (REGION HEIGHT GRAY WINDOW) (* rrb "23-FEB-82 12:26") (* fills part of a region with gray.) (DSPFILL REGION WHITESHADE 'REPLACE WINDOW) (AREAFILL (fetch (REGION LEFT) of REGION) (fetch (REGION BOTTOM) of REGION) (fetch (REGION WIDTH) of REGION) HEIGHT GRAY 'REPLACE WINDOW]) (AREAFILL [LAMBDA (LFT BTM WDTH HGTH SHADE OPERATION WINDOW) (* fills an area of a window with  shade.) (BITBLT NIL NIL NIL WINDOW LFT BTM WDTH HGTH 'TEXTURE OPERATION SHADE]) (CENTEREDLEFT [LAMBDA (WIDTH LEFT RIGHT) (* rrb "16-FEB-82 14:58") (* returns the left point that would leave WIDTH centered between LEFT and  RIGHT) (IQUOTIENT (IDIFFERENCE (IPLUS LEFT RIGHT) WIDTH) 2]) (OUTLINEAREA [LAMBDA (LFT BTM WDTH HGHT LINEWIDTH OPERATION WIN) (* rrb "17-FEB-82 10:59") (* outlines an area of a window.) (PROG (LEFTPLUSWIDTH RIGHTLINELEFT VERTLINETOP TOPY LINEWIDTH) (SETQ LINEWIDTH (OR (NUMBERP LINEWIDTH) 1)) (SETQ LFT (IDIFFERENCE LFT LINEWIDTH)) (SETQ BTM (IDIFFERENCE BTM LINEWIDTH)) (SETQ WDTH (IPLUS WDTH (ITIMES LINEWIDTH 2))) (SETQ HGHT (IPLUS HGHT (ITIMES LINEWIDTH 2))) (DRAWLINE LFT BTM LFT (SETQ VERTLINETOP (SUB1 (IPLUS BTM HGHT))) LINEWIDTH OPERATION WIN) (DRAWLINE (SETQ RIGHTLINELEFT (IDIFFERENCE (IPLUS LFT WDTH) LINEWIDTH)) BTM RIGHTLINELEFT VERTLINETOP LINEWIDTH OPERATION WIN) (DRAWLINE (SETQ LEFTPLUSWIDTH (IPLUS LFT LINEWIDTH)) BTM (SETQ RIGHTLINELEFT (SUB1 RIGHTLINELEFT)) BTM LINEWIDTH OPERATION WIN) (DRAWLINE LEFTPLUSWIDTH (SETQ TOPY (ADD1 (IDIFFERENCE VERTLINETOP LINEWIDTH))) RIGHTLINELEFT TOPY LINEWIDTH OPERATION WIN]) (OUTLINEREGION [LAMBDA (REGION OUTLINEWIDTH OPERATION WIN) (* rrb "17-FEB-82 10:58") (* outlines the region REGION with a  width wide line) (OUTLINEAREA (fetch (REGION LEFT) of REGION) (fetch (REGION BOTTOM) of REGION) (fetch (REGION WIDTH) of REGION) (fetch (REGION HEIGHT) of REGION) OUTLINEWIDTH OPERATION WIN]) ) (DEFINEQ (ADJUSTCOLORMAP [LAMBDA (PRIMARY DELTA) (* kbr%: " 5-Jun-86 19:41") (* Adds DELTA points of intensity to all values of PRIMARY color in  SCREENCOLORMAP *) (PROG NIL (for COLOR from 0 to (MAXIMUMCOLOR (BITSPERPIXEL (SCREENCOLORMAP))) do (COLORLEVEL COLOR PRIMARY (IMIN 255 (IMAX 0 (IPLUS (COLORLEVEL COLOR PRIMARY) DELTA]) (SHOWCOLORBLOCKS [LAMBDA (DESTINATION) (* kbr%: "17-Aug-85 21:44") (* Puts shade blocks onto DESTINATION.  *) (PROG (BITSPERPIXEL MAXSHADE N WIDTH HEIGHT SHADE) (SETQ BITSPERPIXEL (BITSPERPIXEL DESTINATION)) (SETQ MAXSHADE (MAXIMUMSHADE BITSPERPIXEL)) [SETQ N (FIXR (SQRT (ADD1 MAXSHADE] (SETQ WIDTH (IQUOTIENT (IPLUS (BITMAPWIDTH DESTINATION) N -1) N)) (SETQ HEIGHT (IQUOTIENT (IPLUS (BITMAPHEIGHT DESTINATION) N -1) N)) (SETQ SHADE 0) (for Y from (SUB1 N) to 0 by -1 do (for X from 0 to (SUB1 N) do (BLTSHADE SHADE DESTINATION (ITIMES X WIDTH) (ITIMES Y HEIGHT) WIDTH HEIGHT 'REPLACE) (SETQ SHADE (ADD1 SHADE)) (COND ((IGREATERP SHADE MAXSHADE) (SETQ SHADE 0]) (MAPOFACOLOR [LAMBDA (RGB BITSPERPIXEL) (* kbr%: "11-Jul-85 20:04") (* creates a gray color map *) (PROG (MAXCOLOR RED GREEN BLUE OPRED OPGREEN OPBLUE COLORMAP) (SETQ MAXCOLOR (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ RED (fetch (RGB RED) of RGB)) (SETQ GREEN (fetch (RGB GREEN) of RGB)) (SETQ BLUE (fetch (RGB BLUE) of RGB)) (SETQ OPRED (IDIFFERENCE MAXCOLOR RED)) (SETQ OPGREEN (IDIFFERENCE MAXCOLOR GREEN)) (SETQ OPBLUE (IDIFFERENCE MAXCOLOR BLUE)) (SETQ COLORMAP (COLORMAPCREATE (for I from 0 to MAXCOLOR as OPI from MAXCOLOR to 0 by -1 collect (create RGB RED _ (IQUOTIENT (IPLUS (ITIMES OPI OPRED) (ITIMES I RED)) MAXCOLOR) GREEN _ (IQUOTIENT (IPLUS (ITIMES OPI OPGREEN) (ITIMES I GREEN)) MAXCOLOR) BLUE _ (IQUOTIENT (IPLUS (ITIMES OPI OPBLUE) (ITIMES I BLUE)) MAXCOLOR))) BITSPERPIXEL)) (RETURN COLORMAP]) (COLORHEXPATTERN [LAMBDA (LIGHTNESS) (* kbr%: " 3-Jun-86 22:36") (* Put a color hex pattern on the color display.  *) (PROG (DESTINATION WIDTH HEIGHT BITSPERPIXEL N HEXWIDTH HEXHEIGHT LEFT BOTTOM COLOR MAXI JDIST IDIST) (COND ((NULL LIGHTNESS) (SETQ LIGHTNESS 0.5))) (SETQ DESTINATION (COLORSCREENBITMAP)) (SETQ WIDTH (BITMAPWIDTH DESTINATION)) (SETQ HEIGHT (BITMAPHEIGHT DESTINATION)) (SETQ BITSPERPIXEL (BITSPERPIXEL DESTINATION)) (SETQ N (SELECTQ BITSPERPIXEL (4 1) (8 8) (RETURN))) (SETQ HEXWIDTH (IQUOTIENT WIDTH (IPLUS (ITIMES 2 N) 1))) (SETQ HEXHEIGHT (IQUOTIENT HEIGHT (IPLUS (ITIMES 2 N) 1))) (BLTSHADE MINIMUMSHADE DESTINATION) (SETQ COLOR 0) [for J from N to 0 by -1 do (SETQ BOTTOM (ITIMES (IPLUS J N) HEXHEIGHT)) (SETQ MAXI (IDIFFERENCE (IPLUS (ITIMES 2 N) 1) J)) (for I from 0 to MAXI do (SETQ LEFT (IQUOTIENT (ITIMES (IPLUS (ITIMES 2 I) J) HEXWIDTH) 2)) (SETQ COLOR (ADD1 COLOR)) (BLTSHADE COLOR DESTINATION LEFT BOTTOM HEXWIDTH HEXHEIGHT) (SETQ JDIST (FQUOTIENT J N)) (SETQ IDIST (FDIFFERENCE (FTIMES 2.0 (FQUOTIENT I MAXI)) 1.0)) (SCREENCOLORMAPENTRY COLOR (HLSTORGB (ATAN JDIST IDIST) LIGHTNESS (SQRT (FQUOTIENT (FPLUS (FTIMES IDIST IDIST) (FTIMES JDIST JDIST)) 2.0] (for J from -1 to (IMINUS N) by -1 do (SETQ BOTTOM (ITIMES (IPLUS J N) HEXHEIGHT)) (SETQ MAXI (IPLUS (IPLUS (ITIMES 2 N) 1) J)) (for I from 0 to MAXI do (SETQ LEFT (IQUOTIENT (ITIMES (IPLUS (ITIMES 2 I) (IMINUS J)) HEXWIDTH) 2)) (SETQ COLOR (ADD1 COLOR)) (BLTSHADE COLOR DESTINATION LEFT BOTTOM HEXWIDTH HEXHEIGHT) (SETQ JDIST (FQUOTIENT J N)) (SETQ IDIST (FDIFFERENCE (FTIMES 2.0 (FQUOTIENT I MAXI)) 1.0)) (SCREENCOLORMAPENTRY COLOR (HLSTORGB (ATAN JDIST IDIST) LIGHTNESS (SQRT (FQUOTIENT (FPLUS (FTIMES IDIST IDIST) (FTIMES JDIST JDIST)) 2.0]) ) (RPAQQ EditColorMapHeight 315) (RPAQQ EditColorMapWidth 380) (RPAQQ COLOR#MENUSAVE NIL) (RPAQQ CONTROLMENUSAVE NIL) (RPAQQ EDIT8BITCOLORMAPMENU NIL) (RPAQQ EDIT8BITCOLORMAPNUMBERREADER NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS COLOR#MENUSAVE CONTROLMENUSAVE EDIT8BITCOLORMAPMENU EDIT8BITCOLORMAPNUMBERREADER EditColorMapHeight EditColorMapWidth) ) (* ;;; "support for global naming and querying of colors.") (DEFINEQ (CNSMENUINIT [LAMBDA NIL (* gbn " 9-Aug-85 03:11") [SETQ CNSHUEMENU (create MENU ITEMS _ (for I in DICOLOR.hueMapping collect (CAR I] [SETQ CNSSATURATIONMENU (create MENU ITEMS _ (for I in DICOLOR.saturationMapping collect (CAR I] (SETQ CNSLIGHTNESSMENU (create MENU ITEMS _ (for I in DICOLOR.lightnessMapping collect (CAR I]) (CNSTOCSL [LAMBDA (hue saturation lightness) (* hdj "12-Apr-85 19:01") (PROG ((hueAtom (MKATOM hue)) (saturationAtom (MKATOM saturation)) (lightnessAtom (MKATOM lightness)) c s l) (if [NOT (SETQ c (fetch (hueRecord ordering) of (ASSOC hueAtom DICOLOR.hueMapping] then (SETQ c DICOLOR.achromatic)) (if (EQ c DICOLOR.achromatic) then (SETQ s DICOLOR.noSaturation) else (if [NOT (SETQ s (fetch (saturationRecord ordering) of (ASSOC saturationAtom DICOLOR.saturationMapping ] then (SETQ s DICOLOR.vivid))) (SELECTQ hueAtom (Black (SETQ l DICOLOR.black)) (White (SETQ l DICOLOR.white)) (if [NOT (SETQ l (fetch (lightnessRecord ordering) of (ASSOC lightnessAtom DICOLOR.lightnessMapping] then (SETQ l DICOLOR.medium))) (RETURN (LIST c s l]) (CNSTORGB [LAMBDA (saturation lightness hue) (* hdj "15-Jul-85 12:33") (LET ((CSL (CNSTOCSL hue saturation lightness))) (HLSTORGB (APPLY (FUNCTION CSLTOHLS) CSL]) (CSLTOCNS [LAMBDA (c s l) (* hdj "15-Jul-85 12:37") (PROG (hue saturation lightness) [if (EQ c DICOLOR.achromatic) then (SETQ saturation "") [SELECTC l (DICOLOR.black (SETQ hue "Black") (SETQ lightness "")) (DICOLOR.white (SETQ hue "White") (SETQ lightness "")) (PROGN (SETQ hue "Gray") (SETQ lightness (MKSTRING (fetch (lightnessRecord name) of (DICOLOR.lightnessN l] else (SETQ hue (fetch (hueRecord name) of (DICOLOR.hueN c))) (SETQ saturation (fetch (saturationRecord name) of (DICOLOR.saturationN s))) (SETQ lightness (fetch (lightnessRecord name) of (DICOLOR.lightnessN l] (RETURN (LIST saturation lightness hue]) (DICOLOR.FROM.USER [LAMBDA NIL (* gbn "30-Oct-85 11:28") (* * Returns a color, either by its name  (which can then be looked up on colornames) or as an RGB triple if it is not  named. Prompts the user first with the global color name menu.  She can then choose NEWCOLOR which can be specified as RGB or CNS) (PROG (NAME RGB) (* first try to get a color name) [SETQ NAME (MENU (OR COLORNAMEMENU (SETQ COLORNAMEMENU (create MENU ITEMS _ (CONS NEWCOLORITEM (for ENTRY in COLORNAMES collect (CAR ENTRY] (if (NOT NAME) then (* the user clicked outside the menu) (RETURN)) (SETQ RGB (SELECTQ NAME (RGB (READCOLOR1 "specify new color")) (CNS (APPLY (FUNCTION CNSTORGB) (GETCNS))) (RETURN NAME))) (if (NOT (SETQ NAME (TTYIN "New color name? "))) then (* user decided that she didn't want to name the color) (RETURN RGB)) (push COLORNAMES (CONS (SETQ NAME (CAR NAME)) RGB)) (SETQ COLORNAMEMENU NIL) (* invalidate the menu) (RETURN NAME]) (GETCNS [LAMBDA NIL (* gbn " 9-Aug-85 03:13") (LIST (MENU CNSLIGHTNESSMENU) (MENU CNSSATURATIONMENU) (MENU CNSHUEMENU]) (HLSTOCSL [LAMBDA (hue lightness saturation) (* hdj "15-Jul-85 12:14") (LET ((ISLHue (FQUOTIENT (MOD (PLUS hue 240) 360) 360))) (PROG (c s l) (for old s from DICOLOR.noSaturation to DICOLOR.vivid do (if (EQ s DICOLOR.vivid) then (RETURN)) (if (LEQ saturation (PLUS (DICOLOR.saturationNvalue s) (QUOTIENT (DIFFERENCE (DICOLOR.saturationNvalue (ADD1 s)) (DICOLOR.saturationNvalue s)) 2))) then (RETURN))) [if (EQ s DICOLOR.noSaturation) then (SETQ c DICOLOR.achromatic) (for old l from DICOLOR.black to DICOLOR.white do (if (EQ l DICOLOR.white) then (RETURN)) (if (LEQ lightness (PLUS (DICOLOR.lightnessNvalue l) (QUOTIENT (DIFFERENCE (DICOLOR.lightnessNvalue (ADD1 l)) (DICOLOR.lightnessNvalue l)) 2))) then (RETURN))) else (for old c from DICOLOR.red to DICOLOR.purplishRed do (* (HELP c)) (if (EQ c DICOLOR.purplishRed) then (if (GREATERP ISLHue (PLUS (DICOLOR.hueNvalue c) (QUOTIENT (DIFFERENCE 1 (  DICOLOR.hueNvalue c)) 2))) then (SETQ c DICOLOR.red)) (RETURN)) (if (LEQ ISLHue (PLUS (DICOLOR.hueNvalue c) (QUOTIENT (DIFFERENCE (DICOLOR.hueNvalue (ADD1 c)) (DICOLOR.hueNvalue c)) 2))) then (RETURN))) (for old l from DICOLOR.veryDark to DICOLOR.veryLight do (if (EQ l DICOLOR.veryLight) then (RETURN)) (if (LEQ lightness (PLUS (DICOLOR.lightnessNvalue l) (QUOTIENT (DIFFERENCE (DICOLOR.lightnessNvalue (ADD1 l)) (DICOLOR.lightnessNvalue l)) 2))) then (RETURN] (RETURN (LIST c s l]) (CSLTOHLS [LAMBDA (c s l) (* hdj "15-Jul-85 12:23") (PROG (hue saturation lightness) (if (EQ c DICOLOR.achromatic) then (SETQ hue 0.0) (SETQ saturation 0.0) (SETQ lightness (DICOLOR.lightnessNvalue l)) else (SETQ hue (DICOLOR.hueNvalue c)) (SETQ saturation (DICOLOR.saturationNvalue s)) (SETQ lightness (DICOLOR.lightnessNvalue l))) (RETURN (LIST (MOD (FPLUS 120 (FTIMES hue 360)) 360) lightness saturation]) (RGBTOCNS [LAMBDA (Red Green Blue) (* hdj "15-Jul-85 12:36") (APPLY (FUNCTION CSLTOCNS) (APPLY (FUNCTION HLSTOCSL) (RGBTOHLS Red Green Blue]) ) (RPAQQ DICOLOR.hueMapping ((Achromatic 0.0 -1) (Red 0.0 0) (OrangishRed 0.01 1) (RedOrange 0.02 2) (ReddishOrange 0.03 3) (Orange 0.04 4) (YellowishOrange 0.070 5) (OrangeYellow 0.1 6) (OrangishYellow 0.13 7) (Yellow 0.1673 8) (GreenishYellow 0.2073 9) (YellowGreen 0.2473 10) (YellowishGreen 0.2873 11) (Green 0.3333 12) (BluishGreen 0.4133 13) (GreenBlue 0.4933 14) (GreenishBlue 0.5733 15) (Blue 0.6666 16) (PurplishBlue 0.6816 17) (BluePurple 0.6966 18) (BluishPurple 0.7116 19) (Purple 0.73 20) (ReddishPurple 0.8 21) (PurpleRed 0.87 22) (PurplishRed 0.94 23) (BrownishRed 0.01 24) (RedBrown 0.02 25) (ReddishBrown 0.03 26) (Brown 0.04 27) (YellowishBrown 0.070 28) (BrownYellow 0.1 29) (BrownishYellow 0.13 30))) (RPAQQ DICOLOR.lightnessMapping ((Black 0.0 0) (VeryDark 0.1666 1) (Dark 0.3333 2) (Medium 0.5 3) (Light 0.6666 4) (VeryLight 0.8333 5) (White 1.0 6))) (RPAQQ DICOLOR.saturationMapping ((NoSaturation 0.0 0) (Grayish 0.25 1) (Moderate 0.5 2) (Strong 0.75 3) (Vivid 1.0 4))) (RPAQQ NEWCOLORITEM (New% Color 'CNS "Allows specification of a new color" (SUBITEMS (RGB 'RGB "Specify a new color using Red, Green, Blue sliders" ) (CNS 'CNS "Specify a new color using English" )))) (RPAQ? COLORNAMEMENU ) (DEFINEQ (DICOLOR.hueN [LAMBDA (N) (* hdj "17-Apr-85 13:38") (DECLARE (GLOBALVARS DICOLOR.hueMapping)) (for ELT in DICOLOR.hueMapping suchthat (EQ (fetch (hueRecord ordering) of ELT) N]) (DICOLOR.hueNvalue [LAMBDA (N) (* hdj "18-Apr-85 09:58") (fetch (hueRecord value) of (DICOLOR.hueN N]) (DICOLOR.hueNname [LAMBDA (N) (* hdj "18-Apr-85 10:07") (fetch (hueRecord name) of (DICOLOR.hueN N]) (DICOLOR.lightnessN [LAMBDA (N) (* hdj "17-Apr-85 13:40") (DECLARE (GLOBALVARS DICOLOR.lightnessMapping)) (for ELT in DICOLOR.lightnessMapping suchthat (EQ (fetch (lightnessRecord ordering) of ELT) N]) (DICOLOR.lightnessNvalue [LAMBDA (N) (* hdj "17-Apr-85 13:36") (fetch (lightnessRecord value) of (DICOLOR.lightnessN N]) (DICOLOR.lightnessNname [LAMBDA (N) (* hdj "17-Apr-85 14:02") (fetch (lightnessRecord name) of (DICOLOR.lightnessN N]) (DICOLOR.saturationN [LAMBDA (N) (* hdj "17-Apr-85 13:39") (DECLARE (GLOBALVARS DICOLOR.saturationMapping)) (for ELT in DICOLOR.saturationMapping suchthat (EQ (fetch (saturationRecord ordering) of ELT) N]) (DICOLOR.saturationNvalue [LAMBDA (N) (* hdj "17-Apr-85 13:36") (fetch (saturationRecord value) of (DICOLOR.saturationN N]) (DICOLOR.saturationNname [LAMBDA (N) (* hdj "17-Apr-85 14:02") (fetch (saturationRecord name) of (DICOLOR.saturationN N]) ) (DECLARE%: EVAL@LOAD DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD hueRecord (name value ordering)) (RECORD lightnessRecord (name value ordering)) (RECORD saturationRecord (name value ordering)) ) (RPAQQ DICOLOR.hueConstants (DICOLOR.achromatic DICOLOR.blue DICOLOR.bluePurple DICOLOR.bluishGreen DICOLOR.bluishPurple DICOLOR.brown DICOLOR.brownYellow DICOLOR.brownishRed DICOLOR.brownishYellow DICOLOR.green DICOLOR.greenBlue DICOLOR.greenishBlue DICOLOR.greenishYellow DICOLOR.orange DICOLOR.orangeYellow DICOLOR.orangishRed DICOLOR.orangishYellow DICOLOR.purple DICOLOR.purpleRed DICOLOR.purplishBlue DICOLOR.purplishRed DICOLOR.red DICOLOR.redBrown DICOLOR.redOrange DICOLOR.reddishBrown DICOLOR.reddishOrange DICOLOR.reddishPurple DICOLOR.yellow DICOLOR.yellowGreen DICOLOR.yellowishBrown DICOLOR.yellowishGreen DICOLOR.yellowishOrange)) (DECLARE%: EVAL@COMPILE (RPAQQ DICOLOR.achromatic -1) (RPAQQ DICOLOR.blue 16) (RPAQQ DICOLOR.bluePurple 18) (RPAQQ DICOLOR.bluishGreen 13) (RPAQQ DICOLOR.bluishPurple 19) (RPAQQ DICOLOR.brown 27) (RPAQQ DICOLOR.brownYellow 29) (RPAQQ DICOLOR.brownishRed 24) (RPAQQ DICOLOR.brownishYellow 30) (RPAQQ DICOLOR.green 12) (RPAQQ DICOLOR.greenBlue 14) (RPAQQ DICOLOR.greenishBlue 15) (RPAQQ DICOLOR.greenishYellow 9) (RPAQQ DICOLOR.orange 4) (RPAQQ DICOLOR.orangeYellow 6) (RPAQQ DICOLOR.orangishRed 1) (RPAQQ DICOLOR.orangishYellow 7) (RPAQQ DICOLOR.purple 20) (RPAQQ DICOLOR.purpleRed 22) (RPAQQ DICOLOR.purplishBlue 17) (RPAQQ DICOLOR.purplishRed 23) (RPAQQ DICOLOR.red 0) (RPAQQ DICOLOR.redBrown 25) (RPAQQ DICOLOR.redOrange 2) (RPAQQ DICOLOR.reddishBrown 26) (RPAQQ DICOLOR.reddishOrange 3) (RPAQQ DICOLOR.reddishPurple 21) (RPAQQ DICOLOR.yellow 8) (RPAQQ DICOLOR.yellowGreen 10) (RPAQQ DICOLOR.yellowishBrown 28) (RPAQQ DICOLOR.yellowishGreen 11) (RPAQQ DICOLOR.yellowishOrange 5) (CONSTANTS DICOLOR.achromatic DICOLOR.blue DICOLOR.bluePurple DICOLOR.bluishGreen DICOLOR.bluishPurple DICOLOR.brown DICOLOR.brownYellow DICOLOR.brownishRed DICOLOR.brownishYellow DICOLOR.green DICOLOR.greenBlue DICOLOR.greenishBlue DICOLOR.greenishYellow DICOLOR.orange DICOLOR.orangeYellow DICOLOR.orangishRed DICOLOR.orangishYellow DICOLOR.purple DICOLOR.purpleRed DICOLOR.purplishBlue DICOLOR.purplishRed DICOLOR.red DICOLOR.redBrown DICOLOR.redOrange DICOLOR.reddishBrown DICOLOR.reddishOrange DICOLOR.reddishPurple DICOLOR.yellow DICOLOR.yellowGreen DICOLOR.yellowishBrown DICOLOR.yellowishGreen DICOLOR.yellowishOrange) ) (RPAQQ DICOLOR.saturationConstants (DICOLOR.noSaturation DICOLOR.grayish DICOLOR.moderate DICOLOR.strong DICOLOR.vivid)) (DECLARE%: EVAL@COMPILE (RPAQQ DICOLOR.noSaturation 0) (RPAQQ DICOLOR.grayish 1) (RPAQQ DICOLOR.moderate 2) (RPAQQ DICOLOR.strong 3) (RPAQQ DICOLOR.vivid 4) (CONSTANTS DICOLOR.noSaturation DICOLOR.grayish DICOLOR.moderate DICOLOR.strong DICOLOR.vivid) ) (RPAQQ DICOLOR.lightnessConstants (DICOLOR.black DICOLOR.veryDark DICOLOR.dark DICOLOR.medium DICOLOR.light DICOLOR.veryLight DICOLOR.white)) (DECLARE%: EVAL@COMPILE (RPAQQ DICOLOR.black 0) (RPAQQ DICOLOR.veryDark 1) (RPAQQ DICOLOR.dark 2) (RPAQQ DICOLOR.medium 3) (RPAQQ DICOLOR.light 4) (RPAQQ DICOLOR.veryLight 5) (RPAQQ DICOLOR.white 6) (CONSTANTS DICOLOR.black DICOLOR.veryDark DICOLOR.dark DICOLOR.medium DICOLOR.light DICOLOR.veryLight DICOLOR.white) ) ) (CNSMENUINIT) (FILESLOAD LLCOLOR READNUMBER) (SETQ EDITBMMENU NIL) (MOVD 'ARRAYP 'COLORMAPP) (PUTPROPS COLOR COPYRIGHT ("Xerox Corporation" 1982 1983 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5033 20085 (DISPLAYCOLORLEVELS 5043 . 6161) (DISPLAYHLSLEVELS 6163 . 6503) (HLSLEVEL 6505 . 7240) (HLSTORGB 7242 . 8671) (HLSVALUEFN 8673 . 9550) (HLSVALUEFROMLEVEL 9552 . 9884) ( LEVELFROMHLSVALUE 9886 . 10223) (RAINBOWMAP 10225 . 17234) (RGBTOHLS 17236 . 20083)) (20086 21872 ( OVERPAINT 20096 . 20857) (BITMAPFROMSTRING 20859 . 21349) (SHADEBITMAP 21351 . 21870)) (21910 38520 ( EDITCOLORMAP 21920 . 23139) (EDITCOLORMAP.BUTTONEVENTFN 23141 . 26871) (EDITCOLORMAP.REDISPLAYFN 26873 . 29232) (EDITCOLORMAP.VALUELEVEL 29234 . 29727) (EDITCOLORMAP.WINDOWLEVEL 29729 . 30232) ( CHANGECOLORLEVELS 30234 . 32361) (GETCOLOR#FROMUSER 32363 . 33681) (GETCOLOR#FROMSCREEN 33683 . 34241) (DISPLAYCOLORLEVEL 34243 . 35667) (FILLINREGION 35669 . 36136) (AREAFILL 36138 . 36400) (CENTEREDLEFT 36402 . 36728) (OUTLINEAREA 36730 . 37959) (OUTLINEREGION 37961 . 38518)) (38521 45894 ( ADJUSTCOLORMAP 38531 . 39051) (SHOWCOLORBLOCKS 39053 . 40520) (MAPOFACOLOR 40522 . 42173) ( COLORHEXPATTERN 42175 . 45892)) (46360 55962 (CNSMENUINIT 46370 . 47005) (CNSTOCSL 47007 . 48269) ( CNSTORGB 48271 . 48518) (CSLTOCNS 48520 . 49593) (DICOLOR.FROM.USER 49595 . 51354) (GETCNS 51356 . 51560) (HLSTOCSL 51562 . 55062) (CSLTOHLS 55064 . 55732) (RGBTOCNS 55734 . 55960)) (58806 61057 ( DICOLOR.hueN 58816 . 59134) (DICOLOR.hueNvalue 59136 . 59315) (DICOLOR.hueNname 59317 . 59494) ( DICOLOR.lightnessN 59496 . 59844) (DICOLOR.lightnessNvalue 59846 . 60043) (DICOLOR.lightnessNname 60045 . 60240) (DICOLOR.saturationN 60242 . 60653) (DICOLOR.saturationNvalue 60655 . 60855) ( DICOLOR.saturationNname 60857 . 61055))))) STOP \ No newline at end of file diff --git a/lispusers/COLORDEMO b/lispusers/COLORDEMO new file mode 100644 index 00000000..f73eb01b --- /dev/null +++ b/lispusers/COLORDEMO @@ -0,0 +1 @@ +(FILECREATED " 3-Sep-86 21:36:32" {ERIS}LIBRARY>COLORDEMO.;17 59524 changes to: (FNS COLORDEMO CD.RANDCOLORMAP TILEDEMO CD.INIT.COLORMAPS KINETICDEMO CD.QUITP WELLDEMO TUNNELDEMO CD.KINETIC VINEDEMO RAINING MODARTDEMO STARBURSTDEMO COLORPEANODEMO BUBBLEDEMO OVERPAINTDEMO CD.INIT CD.INIT.WINDOWS WALKDEMO CD.WALKBM CD.DEMOKINETIC COLORBACKGROUND COLORMAPOF CD.CIRKIN CD.INRANGE CD.PUTDROPS CD.DOCOLORDROP CD.RAININGCOLORMAP CD.STARBURST CD.STARSHINE CD.BUBBLE CD.INIT.MENU CD.NEXTELEMENT CD.RANDELEMENT CD.CHOOSEDEMO CD.MINESHAFT CD.POINTTEST CD.SQUARETUNNEL CD.CIRCULARTUNNEL CD.ROTATEIT) (VARS COLORDEMOCOMS) previous date: " 3-Sep-86 16:25:44" {ERIS}CML>COLORDEMO.;3) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT COLORDEMOCOMS) (RPAQQ COLORDEMOCOMS ((* * COLORDEMO -- Color demonstration programs. By Richard Burton and Kelly Roach. *) (COMS (* Color Demo. Stuff needed to run through different demos, but not the individual demos themselves. *) (VARS (CD.DEMOS (QUOTE (KINETICDEMO VINEDEMO RAINING MODARTDEMO STARBURSTDEMO COLORPEANODEMO BUBBLEDEMO OVERPAINTDEMO TILEDEMO TUNNELDEMO POLYGONSDEMO)))) (INITVARS (CD.NEWDEMO NIL) (CD.STOPDATE 0) (CD.TIMECELL NIL) (CD.WINDOW1 NIL) (CD.WINDOW2 NIL) (CD.WINDOW3 NIL) (CD.WINDOW4 NIL) (CD.MENU NIL) (CD.COLORMAPS NIL)) (GLOBALVARS CD.DEMOS CD.NEWDEMO CD.STOPDATE) (FNS COLORDEMO CD.INIT CD.INIT.COLORMAPS CD.INIT.WINDOWS CD.INIT.MENU CD.NEXTELEMENT CD.RANDELEMENT CD.CHOOSEDEMO CD.QUITP)) (COMS (* Tunnel demo. *) (FNS CD.MINESHAFT CD.POINTTEST) (FNS WELLDEMO TUNNELDEMO CD.SQUARETUNNEL CD.CIRCULARTUNNEL)) (COMS (* Junk fns. *) (FNS CD.ROTATEIT) (FNS COLORMAPOF COLORMAPCOPY COLORFILL COLORBACKGROUND COLORFILLAREA)) (COMS (* Walk demos) (FNS WALKDEMO CD.WALKBM CD.RANDCOLORMAP) (INITVARS CD.MAXWALK CD.MINWALK CD.RANDCOLORPROB (CD.RANDOM.COLORMAP NIL) (CD.RAINBOW.COLORMAP NIL) (CD.8BITBMEXP (LIST (HARRAY 60))) (CD.4BITBMEXP (LIST (HARRAY 60)))) (GLOBALVARS CD.8BITBMEXP CD.4BITBMEXP CD.RANDOM.COLORMAP CD.RAINBOW.COLORMAP)) (COMS (* Kinetic demos *) (FNS KINETICDEMO CD.DEMOKINETIC CD.CIRKIN) (VARS (CD.KINETICWAITTIME 150)) (GLOBALVARS CD.KINETICWAITTIME)) (COMS (* Vine demo *) (FNS VINEDEMO CD.INRANGE)) (COMS (* Raining demo *) (FNS RAINING CD.PUTDROPS CD.DOCOLORDROP CD.RAININGCOLORMAP)) (COMS (* Modart demo *) (FNS MODARTDEMO)) (COMS (* Starburst demo *) (FNS STARBURSTDEMO CD.STARBURST CD.STARSHINE)) (COMS (* Peano demo *) (FILES (FROM LISPUSERS) PEANO) (FNS COLORPEANODEMO)) (COMS (* Bubble demo *) (FNS BUBBLEDEMO CD.BUBBLE)) (COMS (* Overpaint demo *) (FNS OVERPAINTDEMO) (VARS (CD.OVERPAINTBITMAPS))) (COMS (* Tile demo *) (INITVARS (CD.TILEBITMAPS NIL)) (FNS TILEDEMO)) (COMS (* Polygons demo *) (FILES (FROM LISPUSERS) COLORPOLYGONS) (FNS POLYGONSDEMO)) (FILES COLOR) (COMS (* Color font profile *) (VARS COLORFONTPROFILE) (P (FONTPROFILE COLORFONTPROFILE) (* Create color fonts now instead of later. COLOR should already be LOADed. *) (for FONTCLASS in (LIST DEFAULTFONT BOLDFONT LITTLEFONT BIGFONT) do (FONTCREATE FONTCLASS NIL NIL NIL (QUOTE 8DISPLAY))) (FONTCREATE (QUOTE TIMESROMAND) 36 NIL NIL NIL (QUOTE 8DISPLAY)))))) (* * COLORDEMO -- Color demonstration programs. By Richard Burton and Kelly Roach. *) (* Color Demo. Stuff needed to run through different demos, but not the individual demos themselves. *) (RPAQQ CD.DEMOS (KINETICDEMO VINEDEMO RAINING MODARTDEMO STARBURSTDEMO COLORPEANODEMO BUBBLEDEMO OVERPAINTDEMO TILEDEMO TUNNELDEMO POLYGONSDEMO)) (RPAQ? CD.NEWDEMO NIL) (RPAQ? CD.STOPDATE 0) (RPAQ? CD.TIMECELL NIL) (RPAQ? CD.WINDOW1 NIL) (RPAQ? CD.WINDOW2 NIL) (RPAQ? CD.WINDOW3 NIL) (RPAQ? CD.WINDOW4 NIL) (RPAQ? CD.MENU NIL) (RPAQ? CD.COLORMAPS NIL) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CD.DEMOS CD.NEWDEMO CD.STOPDATE) ) (DEFINEQ (COLORDEMO (LAMBDA NIL (* kbr: " 3-Sep-86 21:19") (DECLARE (GLOBALVARS CD.DEMOS CD.NEWDEMO CD.STOPDATE CD.COLORMAPS)) (PROG (WINDOWS WINDOW DEMO BITSPERPIXEL BITMAP) (COND ((NULL CD.MENU) (CD.INIT))) (COND ((NULL (WFROMMENU CD.MENU)) (ADDMENU CD.MENU NIL (GETBOXPOSITION (fetch (MENU IMAGEWIDTH) of CD.MENU) (fetch (MENU IMAGEHEIGHT) of CD.MENU)))) ((NOT (OPENWP (WFROMMENU CD.MENU))) (OPENW (WFROMMENU CD.MENU)))) (SETQ WINDOWS (LIST CD.WINDOW1 CD.WINDOW2 CD.WINDOW3 CD.WINDOW4)) (do (SETQ WINDOW (CD.NEXTELEMENT WINDOW WINDOWS)) (SETQ DEMO (OR CD.NEWDEMO (CD.NEXTELEMENT DEMO CD.DEMOS))) (SETQ CD.NEWDEMO NIL) (COND ((EQ DEMO (QUOTE STOP)) (RETURN))) (SETQ CD.STOPDATE (IPLUS (IDATE) 60)) (* Each DEMO takes a WAIT argument telling how long to run and an optional  WINDOW argument telling which window to use.  WAIT can be defaulted to NIL. *) (SCREENCOLORMAP (CD.RANDELEMENT CD.COLORMAPS)) (APPLY* DEMO NIL WINDOW) (COND ((ILESSP (LENGTH CD.TILEBITMAPS) 10) (SETQ BITSPERPIXEL (BITSPERPIXEL (COLORSCREENBITMAP))) (SETQ BITMAP (BITMAPCREATE 100 100 BITSPERPIXEL)) (BITBLT WINDOW NIL NIL BITMAP) (push CD.TILEBITMAPS BITMAP)))) (CLOSEW (WFROMMENU CD.MENU))))) (CD.INIT (LAMBDA NIL (* kbr: " 3-Sep-86 19:06") (PROG NIL (CD.INIT.COLORMAPS) (CD.INIT.WINDOWS) (CD.INIT.MENU)))) (CD.INIT.COLORMAPS (LAMBDA NIL (* kbr: " 3-Sep-86 20:39") (PROG (BITSPERPIXEL MAXCOLOR) (SETQ BITSPERPIXEL (BITSPERPIXEL (COLORSCREENBITMAP))) (SETQ MAXCOLOR (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ CD.CMYCOLORMAP (SELECTQ BITSPERPIXEL (4 (CMYCOLORMAP 2 1 1 4)) (8 (CMYCOLORMAP 3 2 2 8)) NIL)) (SETQ CD.RGBCOLORMAP (SELECTQ BITSPERPIXEL (4 (CMYCOLORMAP 2 1 1 4)) (8 (RGBCOLORMAP 3 2 2 8)) NIL)) (SETQ CD.RANDOM.COLORMAP (COLORMAPCREATE (for COLOR from 0 to MAXCOLOR collect (create RGB RED _ (RAND 0 255) GREEN _ (RAND 0 255) BLUE _ (RAND 0 255))) BITSPERPIXEL)) (PROGN (SETQ CD.RAINBOW.COLORMAP (RAINBOWMAP BITSPERPIXEL)) (for COLOR from (RAND 0 15) to MAXCOLOR by 16 do (SETA CD.RAINBOW.COLORMAP COLOR (create RGB RED _ (RAND 0 255) GREEN _ (RAND 0 255) BLUE _ (RAND 0 255))))) (SETQ CD.COLORMAPS (LIST CD.CMYCOLORMAP CD.RGBCOLORMAP CD.RANDOM.COLORMAP CD.RAINBOW.COLORMAP)) (RETURN CD.COLORMAPS)))) (CD.INIT.WINDOWS (LAMBDA NIL (* kbr: " 3-Sep-86 18:34") (PROG (CSWIDTH CSHEIGHT TAB NORTHWEST NORTHEAST SOUTHWEST SOUTHEAST NORTH EAST SOUTH WEST WIDTH HEIGHT) (SETQ CSWIDTH (BITMAPWIDTH (COLORSCREENBITMAP))) (SETQ CSHEIGHT (BITMAPHEIGHT (COLORSCREENBITMAP))) (SETQ TAB 20) (SETQ WIDTH (IQUOTIENT (IDIFFERENCE CSWIDTH (ITIMES 3 TAB)) 2)) (SETQ HEIGHT (IQUOTIENT (IDIFFERENCE CSHEIGHT (ITIMES 3 TAB)) 2)) (SETQ NORTHWEST (create POSITION XCOORD _ TAB YCOORD _ (IPLUS TAB HEIGHT TAB))) (SETQ NORTHEAST (create POSITION XCOORD _ (IPLUS TAB WIDTH TAB) YCOORD _ (IPLUS TAB HEIGHT TAB))) (SETQ SOUTHWEST (create POSITION XCOORD _ TAB YCOORD _ TAB)) (SETQ SOUTHEAST (create POSITION XCOORD _ (IPLUS TAB WIDTH TAB) YCOORD _ TAB)) (SETQ NORTH (create POSITION XCOORD _ (IQUOTIENT (IDIFFERENCE CSWIDTH WIDTH) 2) YCOORD _ (IDIFFERENCE CSHEIGHT (IPLUS TAB HEIGHT)))) (SETQ EAST (create POSITION XCOORD _ (IDIFFERENCE CSWIDTH (IPLUS WIDTH TAB)) YCOORD _ (IQUOTIENT (IDIFFERENCE CSHEIGHT HEIGHT) 2))) (SETQ SOUTH (create POSITION XCOORD _ (IQUOTIENT (IDIFFERENCE CSWIDTH WIDTH) 2) YCOORD _ TAB)) (SETQ WEST (create POSITION XCOORD _ TAB YCOORD _ (IQUOTIENT (IDIFFERENCE CSHEIGHT HEIGHT) 2))) (SETQ CD.WINDOW1 (CREATEW (create SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ (fetch (POSITION XCOORD) of NORTHWEST) BOTTOM _ (fetch (POSITION YCOORD) of NORTHWEST) WIDTH _ WIDTH HEIGHT _ HEIGHT) (QUOTE WINDOW1))) (SETQ CD.WINDOW2 (CREATEW (create SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ (fetch (POSITION XCOORD) of NORTHEAST) BOTTOM _ (fetch (POSITION YCOORD) of NORTHEAST) WIDTH _ WIDTH HEIGHT _ HEIGHT) (QUOTE WINDOW2))) (SETQ CD.WINDOW3 (CREATEW (create SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ (fetch (POSITION XCOORD) of SOUTHWEST) BOTTOM _ (fetch (POSITION YCOORD) of SOUTHWEST) WIDTH _ WIDTH HEIGHT _ HEIGHT) (QUOTE WINDOW3))) (SETQ CD.WINDOW4 (CREATEW (create SCREENREGION SCREEN _ (COLORSCREEN) LEFT _ (fetch (POSITION XCOORD) of SOUTHEAST) BOTTOM _ (fetch (POSITION YCOORD) of SOUTHEAST) WIDTH _ WIDTH HEIGHT _ HEIGHT) (QUOTE WINDOW4)))))) (CD.INIT.MENU (LAMBDA NIL (* kbr: "11-Aug-85 15:05") (SETQ CD.MENU (create MENU TITLE _ "Color Demos" ITEMS _ (APPEND CD.DEMOS (QUOTE (STOP))) WHENSELECTEDFN _ (QUOTE CD.CHOOSEDEMO))))) (CD.NEXTELEMENT (LAMBDA (ELEMENT LIST) (* kbr: "10-Jul-85 18:12") (* Pick element after ELEMENT in  rotating LIST. *) (PROG (TAIL ANSWER) (SETQ TAIL (FMEMB ELEMENT LIST)) (SETQ ANSWER (COND ((CDR TAIL) (CADR TAIL)) (T (CAR LIST)))) (RETURN ANSWER)))) (CD.RANDELEMENT (LAMBDA (LIST) (* kbr: "31-Jan-86 16:24") (CAR (NTH LIST (RAND 1 (LENGTH LIST)))))) (CD.CHOOSEDEMO (LAMBDA (NEW) (DECLARE (GLOBALVARS CD.NEWDEMO)) (* bas: " 5-JUN-82 13:07") (SETQ CD.NEWDEMO NEW))) (CD.QUITP (LAMBDA (N) (* kbr: " 3-Sep-86 20:05") (DECLARE (GLOBALVARS CD.NEWDEMO CD.STOPDATE)) (BLOCK) (OR CD.TIMECELL (SETQ CD.TIMECELL (CREATECELL \FIXP))) (OR CD.NEWDEMO (COND ((FIXP N) (SETQ CD.STOPDATE (IPLUS (ITIMES N 1000) (CLOCK 0 CD.TIMECELL))) NIL) (T (AND CD.STOPDATE (ILESSP CD.STOPDATE (CLOCK 0 CD.TIMECELL)))))))) ) (* Tunnel demo. *) (DEFINEQ (CD.MINESHAFT (LAMBDA (WINDOW N OUTFLG) (* kbr: "20-Jun-91 11:02") (* Draws a mineshaft on WINDOW.) (PROG (COLOR WIDTH HEIGHT MAXCOLOR) (WINDOWPROP WINDOW (QUOTE TITLE) (QUOTE CD.MINESHAFT)) (COND ((NULL N) (SETQ N 1))) (SETQ COLOR 0) (SETQ WIDTH (WINDOWPROP WINDOW (QUOTE WIDTH))) (SETQ HEIGHT (WINDOWPROP WINDOW (QUOTE HEIGHT))) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (for LEFT from 0 by (ITIMES N 4) as BOTTOM from 0 by (ITIMES N 3) to (IQUOTIENT HEIGHT 2) do (BLTSHADE COLOR WINDOW LEFT BOTTOM (IDIFFERENCE WIDTH (ITIMES LEFT 2)) (IDIFFERENCE HEIGHT (ITIMES BOTTOM 2))) (COND (OUTFLG (SETQ COLOR (SUB1 COLOR)) (COND ((ILESSP COLOR 0) (SETQ COLOR MAXCOLOR)))) (T (SETQ COLOR (ADD1 COLOR)) (COND ((IGREATERP COLOR MAXCOLOR) (SETQ COLOR 0))))))))) (CD.POINTTEST (LAMBDA (WINDOW) (* kbr: " 8-Jul-85 09:44") (* randomly puts points in a region) (PROG (MAXX MAXY MAXCOLOR) (SETQ MAXX (SUB1 (WINDOWPROP WINDOW (QUOTE WIDTH)))) (SETQ MAXY (SUB1 (WINDOWPROP WINDOW (QUOTE HEIGHT)))) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (for I from 1 to 100 do (BITMAPBIT WINDOW (RAND 0 MAXX) (RAND 0 MAXY) (RAND 0 MAXCOLOR)))))) ) (DEFINEQ (WELLDEMO (LAMBDA (WAIT) (* kbr: " 3-Sep-86 20:08") (PROG (STARTCOLOR THRUCOLOR) (SETQ STARTCOLOR 1) (SETQ THRUCOLOR 14) (CD.SQUARETUNNEL CD.WINDOW1 4 STARTCOLOR THRUCOLOR) (CD.SQUARETUNNEL CD.WINDOW2 4 THRUCOLOR STARTCOLOR) (CD.CIRCULARTUNNEL CD.WINDOW3 4 THRUCOLOR STARTCOLOR) (CD.CIRCULARTUNNEL CD.WINDOW4 4 STARTCOLOR THRUCOLOR) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (ROTATECOLORMAP STARTCOLOR THRUCOLOR))))) (TUNNELDEMO (LAMBDA (WAIT) (* kbr: " 3-Sep-86 20:08") (PROG (STARTCOLOR THRUCOLOR) (SETQ STARTCOLOR 1) (SETQ THRUCOLOR 14) (CD.SQUARETUNNEL CD.WINDOW1 STARTCOLOR THRUCOLOR) (CD.SQUARETUNNEL CD.WINDOW2 THRUCOLOR STARTCOLOR) (CD.CIRCULARTUNNEL CD.WINDOW3 THRUCOLOR STARTCOLOR) (CD.CIRCULARTUNNEL CD.WINDOW4 STARTCOLOR THRUCOLOR) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (ROTATECOLORMAP STARTCOLOR THRUCOLOR))))) (CD.SQUARETUNNEL (LAMBDA (WINDOW STARTCOLOR THRUCOLOR) (* kbr: "24-Feb-86 12:16") (* Draws a CD.SQUARETUNNEL on the  WINDOW.) (PROG (LEFT BOTTOM MAXBOTTOM FACTOR LEFTFACTOR BOTTOMFACTOR INCR DELTA COLOR) (SETQ LEFT 0.0) (SETQ BOTTOM 0.0) (SETQ MAXBOTTOM (FQUOTIENT (BITMAPHEIGHT WINDOW) 2.0)) (SETQ FACTOR .2) (SETQ LEFTFACTOR (FTIMES 4.0 FACTOR)) (SETQ BOTTOMFACTOR (FTIMES 3.0 FACTOR)) (COND ((IGEQ THRUCOLOR STARTCOLOR) (SETQ DELTA 1)) (T (SETQ DELTA -1))) (SETQ COLOR STARTCOLOR) (do (BLTSHADE COLOR WINDOW (FIX LEFT) (FIX BOTTOM) (IDIFFERENCE (BITMAPWIDTH WINDOW) (FTIMES LEFT 2)) (IDIFFERENCE (BITMAPHEIGHT WINDOW) (FTIMES BOTTOM 2))) (SETQ INCR (FPLUS 1.0 (FTIMES .1 (FDIFFERENCE MAXBOTTOM BOTTOM)))) (SETQ LEFT (FPLUS LEFT (FTIMES INCR LEFTFACTOR))) (SETQ BOTTOM (FPLUS BOTTOM (FTIMES INCR BOTTOMFACTOR))) (COND ((FGREATERP BOTTOM MAXBOTTOM) (RETURN))) (COND ((EQ COLOR THRUCOLOR) (SETQ COLOR STARTCOLOR)) (T (SETQ COLOR (IPLUS COLOR DELTA)))))))) (CD.CIRCULARTUNNEL (LAMBDA (WINDOW STARTCOLOR THRUCOLOR) (* kbr: "24-Feb-86 12:23") (PROG (N WIDTH HEIGHT SIZE DELTA COLOR) (SETQ N 4) (SETQ WIDTH (BITMAPWIDTH WINDOW)) (SETQ HEIGHT (BITMAPHEIGHT WINDOW)) (SETQ SIZE (IQUOTIENT (SQRT (IPLUS (ITIMES WIDTH WIDTH) (ITIMES HEIGHT HEIGHT))) 2)) (COND ((IGEQ THRUCOLOR STARTCOLOR) (SETQ DELTA 1)) (T (SETQ DELTA -1))) (SETQ COLOR STARTCOLOR) (for I from 1 to SIZE by N do (* Have to make the brush a little bit thicker than the amount by which we are  incrementing the radius to avoid cracks appearing between circles.  *) (DRAWCIRCLE (IQUOTIENT WIDTH 2) (IQUOTIENT HEIGHT 2) I (LIST (QUOTE ROUND) (IPLUS N 2) COLOR) NIL WINDOW) (COND ((EQ COLOR THRUCOLOR) (SETQ COLOR STARTCOLOR)) (T (SETQ COLOR (IPLUS COLOR DELTA)))))))) ) (* Junk fns. *) (DEFINEQ (CD.ROTATEIT (LAMBDA (BEGINCOLOR ENDCOLOR WAIT) (* kbr: "23-Feb-86 17:30") (PROG NIL (do (ROTATECOLORMAP BEGINCOLOR ENDCOLOR) (COND ((NULL WAIT)) ((SMALLP WAIT) (DISMISS WAIT)) (T (GETMOUSESTATE) (DISMISS (LRSH LASTMOUSEX 3)))))))) ) (DEFINEQ (COLORMAPOF (LAMBDA (NEWCM BITSPERPIXEL) (* kbr: " 3-Sep-86 16:24") (COND ((COLORMAPP NEWCM) (COND ((EQ BITSPERPIXEL (COLORMAPBITS NEWCM)) NEWCM) (T (COLORMAPCOPY NEWCM BITSPERPIXEL)))) ((EQ NEWCM T) (COLORMAPCREATE NIL BITSPERPIXEL)) (T (COLORMAPCREATE NEWCM BITSPERPIXEL))))) (COLORMAPCOPY (LAMBDA (COLORMAP BITSPERPIXEL) (* rrb "21-OCT-82 18:32") (* makes a copy of a color map If COLORMAP is not a color map, it returns a new  color map with default values. If the colormaps are different sizes, the first  16 entries will be the same and the rest will be black) (COLORMAPCREATE (AND (COLORMAPP COLORMAP BITSPERPIXEL) (INTENSITIESFROMCOLORMAP COLORMAP)) BITSPERPIXEL))) (COLORFILL (LAMBDA (REGION COLOR# COLORBM OPERATION) (* rrb "21-DEC-82 20:54") (* fills a region in a color bitmap  with a color. Calls the standard  BITBLT with a texture.) (PROG (COLORBM) (SETQ COLORBM (COND ((TYPENAMEP COLORBM (QUOTE BITMAP)) COLORBM) ((NULL COLORBM) (COLORSCREENBITMAP)) (T (\ILLEGAL.ARG COLORBM)))) (COND ((NULL REGION) (COLORFILLAREA 0 0 NIL NIL COLOR# COLORBM OPERATION)) (T (COLORFILLAREA (fetch (REGION LEFT) of REGION) (fetch (REGION BOTTOM) of REGION) (fetch (REGION WIDTH) of REGION) (fetch (REGION HEIGHT) of REGION) COLOR# COLORBM OPERATION)))))) (COLORBACKGROUND (LAMBDA (TEXTURE) (* kbr: " 3-Sep-86 16:30") (CHANGEBACKGROUND TEXTURE (COLORSCREEN)))) (COLORFILLAREA (LAMBDA (LEFT BOTTOM WIDTH HEIGHT COLOR# COLORBM OPERATION)(* kbr: " 8-Jul-85 08:53") (* fills an area of a color bitmap  with color.) (COND ((NULL COLORBM) (SETQ COLORBM (COLORSCREENBITMAP)))) (BITBLT NIL NIL NIL COLORBM LEFT BOTTOM WIDTH HEIGHT (QUOTE TEXTURE) OPERATION COLOR#))) ) (* Walk demos) (DEFINEQ (WALKDEMO (LAMBDA (WINDOW WAIT SPEED WORD1 WORDS) (* kbr: " 3-Sep-86 18:50") (DECLARE (GLOBALVARS CD.STOPDATE)) (PROG NIL (CLEARW WINDOW) (for I in (COND (CD.OVERPAINTBITMAPS) (T (SETQ CD.OVERPAINTBITMAPS (LIST (BITMAPFROMSTRING "Interlisp-D"))))) until (CD.QUITP (OR WAIT 10)) do (CD.WALKBM WINDOW I NIL SPEED) (OR (CD.QUITP 10) (CD.WALKBM WINDOW NIL NIL SPEED)))))) (CD.WALKBM (LAMBDA (WINDOW BM FONT SPEED) (* kbr: " 3-Sep-86 18:52") (PROG (BITSPERPIXEL EBM SCR MAXX MAXY MAXCOLOR) (SETQ BITSPERPIXEL (BITSPERPIXEL WINDOW)) (OR SPEED (SETQ SPEED 5)) (SETQ MAXCOLOR (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ EBM (CACHEBITMAP BM FONT BITSPERPIXEL)) (SETQ SCR (BITMAPCOPY EBM)) (SETQ MAXX (IDIFFERENCE (WINDOWPROP WINDOW (QUOTE WIDTH)) (BITMAPWIDTH EBM))) (SETQ MAXY (IDIFFERENCE (WINDOWPROP WINDOW (QUOTE HEIGHT)) (BITMAPHEIGHT EBM))) (SCREENCOLORMAP (CD.RANDCOLORMAP)) (bind (X _ -1) (Y _ -1) (DX _ 0) (DY _ 0) (I _ 1) (J _ 0) (COLORCOUNTER _ 0) until (CD.QUITP) do (COND ((EQ I MAXCOLOR) (SETQ I 1)) (T (SETQ I (ADD1 I)))) (add X DX) (add Y DY) (COND ((OR (ILEQ J 0) (ILESSP X 0) (IGEQ X MAXX) (ILESSP Y 0) (IGEQ Y MAXY)) (SETQ X (RAND 0 MAXX)) (SETQ Y (RAND 0 MAXY)) (SETQ DX (RAND (IMINUS SPEED) SPEED)) (SETQ DY (RAND (IMINUS SPEED) SPEED)) (SETQ J (RAND CD.MINWALK CD.MAXWALK))) (T (SETQ J (SUB1 J)))) (OVERPAINT EBM (COLORSCREENBITMAP) X Y (COLORTEXTUREFROMCOLOR# I) SCR) (COND ((IGREATERP (SETQ COLORCOUNTER (ADD1 COLORCOUNTER )) 300) (SETQ COLORCOUNTER 0) (SCREENCOLORMAP (CD.RANDCOLORMAP))) (T (ROTATECOLORMAP 1 MAXCOLOR))) (DISMISS 15))))) (CD.RANDCOLORMAP (LAMBDA NIL (* kbr: " 3-Sep-86 21:16") (PROG (MAXCOLOR) (SETQ MAXCOLOR (BITSPERPIXEL (SCREENCOLORMAP))) (SELECTQ (RAND 1 2) (1 (COND ((NULL CD.RANDOM.COLORMAP) (SETQ CD.RANDOM.COLORMAP (COLORMAPCREATE)) (for COLOR from 0 to MAXCOLOR do (SETA (ELT CD.RANDOM.COLORMAP COLOR) (create RGB RED _ (RAND 0 255) GREEN _ (RAND 0 255) BLUE _ (RAND 0 255)))))) (RETURN CD.RANDOM.COLORMAP)) (2 (COND ((NULL CD.RAINBOW.COLORMAP) (SETQ CD.RAINBOW.COLORMAP (RAINBOWMAP (COLORMAPBITS (SCREENCOLORMAP)))) (* make every 16th color random) (for COLOR from (RAND 0 15) to MAXCOLOR by 16 do (SETA (ELT CD.RAINBOW.COLORMAP COLOR) (create RGB RED _ (RAND 0 255) GREEN _ (RAND 0 255) BLUE _ (RAND 0 255)))) (RETURN CD.RAINBOW.COLORMAP))) CD.RAINBOW.COLORMAP) NIL)))) ) (RPAQ? CD.MAXWALK NIL) (RPAQ? CD.MINWALK NIL) (RPAQ? CD.RANDCOLORPROB NIL) (RPAQ? CD.RANDOM.COLORMAP NIL) (RPAQ? CD.RAINBOW.COLORMAP NIL) (RPAQ? CD.8BITBMEXP (LIST (HARRAY 60))) (RPAQ? CD.4BITBMEXP (LIST (HARRAY 60))) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CD.8BITBMEXP CD.4BITBMEXP CD.RANDOM.COLORMAP CD.RAINBOW.COLORMAP) ) (* Kinetic demos *) (DEFINEQ (KINETICDEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:12") (* test example (KINETICDEMO)) (PROG (MAXCOLOR MAXX MAXY X Y) (WINDOWPROP WINDOW (QUOTE TITLE) "KINETIC") (CLEARW WINDOW) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ MAXX (SUB1 (BITMAPWIDTH WINDOW))) (SETQ MAXY (SUB1 (BITMAPHEIGHT WINDOW))) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (SETQ X (RAND 0 MAXX)) (SETQ Y (RAND 0 MAXY)) (BLTSHADE (RAND 0 MAXCOLOR) WINDOW X Y (RAND 2 (IDIFFERENCE MAXX X)) (RAND 2 (IDIFFERENCE MAXY Y)) (SELECTQ (RAND 0 5) (0 (QUOTE PAINT)) (1 (QUOTE ERASE)) (2 (QUOTE INVERT)) (QUOTE REPLACE))))))) (CD.DEMOKINETIC (LAMBDA (WINDOW FIRSTCOLOR LASTCOLOR) (* kbr: " 3-Sep-86 18:40") (* test example (CD.DEMOKINETIC)) (PROG (BITSPERPIXEL LEFT RIGHT BOTTOM TOP X Y COLOR# ROTATETIME KINROTATETIME HALFWIDTH HALFHEIGHT) (SETQ BITSPERPIXEL (BITSPERPIXEL WINDOW)) (OR (COLORNUMBERP FIRSTCOLOR) (SETQ FIRSTCOLOR 0)) (OR (COLORNUMBERP LASTCOLOR) (SETQ LASTCOLOR (MAXIMUMCOLOR BITSPERPIXEL))) (COND ((IGREATERP FIRSTCOLOR LASTCOLOR) (swap FIRSTCOLOR LASTCOLOR))) (SETQ LEFT 0) (SETQ RIGHT (WINDOWPROP WINDOW (QUOTE WIDTH))) (SETQ BOTTOM 0) (SETQ TOP (WINDOWPROP WINDOW (QUOTE HEIGHT))) (SETQ COLOR# FIRSTCOLOR) (SETQ ROTATETIME (CLOCK 0)) (SETQ KINROTATETIME (CLOCK 0)) (SETQ HALFWIDTH (IQUOTIENT RIGHT 2)) (SETQ HALFHEIGHT (IQUOTIENT TOP 2)) (BLTSHADE FIRSTCOLOR WINDOW) BLTLP (COND ((IGREATERP (CLOCKDIFFERENCE ROTATETIME) CD.LOGOWAITTIME) (* cycle the colors in the logo) (ROTATECOLORMAP 1 (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ ROTATETIME (CLOCK0 ROTATETIME)))) (COND ((IGREATERP (CLOCKDIFFERENCE KINROTATETIME) CD.KINWAITTIME) (* cycle the colors in the logo) (ROTATECOLORMAP FIRSTCOLOR LASTCOLOR) (SETQ KINROTATETIME (CLOCK0 KINROTATETIME)))) (SETQ X (RAND LEFT RIGHT)) (SETQ Y (RAND BOTTOM TOP)) (BLTSHADE (COND ((EQ COLOR# LASTCOLOR) (SETQ COLOR# FIRSTCOLOR)) (T (SETQ COLOR# (ADD1 COLOR#)))) WINDOW X Y (RAND 2 (IMIN (IDIFFERENCE RIGHT X) HALFWIDTH)) (RAND 2 (IMIN (IDIFFERENCE TOP Y) HALFHEIGHT)) (QUOTE REPLACE)) MOUSELP (COND ((MOUSESTATE MIDDLE) (SELECTQ (CAR (ERSETQ (MENU (PROGN (COND ((NOT (TYPENAMEP CD.KINETICMENU (QUOTE MENU))) (INIT/COLORDEMO/MENUS))) CD.KINETICMENU)))) (EditColorMap (EDITCOLORMAP)) (IncreaseLogoSpeed (SETQ CD.LOGOWAITTIME (FIX (FTIMES CD.LOGOWAITTIME .8)))) (DecreaseLogoSpeed (SETQ CD.LOGOWAITTIME (FIX (FTIMES CD.LOGOWAITTIME 1.3)))) (IncreaseColorFlip (SETQ CD.KINWAITTIME (FIX (FTIMES CD.KINWAITTIME .8)))) (DecreaseColorFlip (SETQ CD.KINWAITTIME (FIX (FTIMES CD.KINWAITTIME 1.3)))) (STOP (RETURN)) NIL)) ((MOUSESTATE LEFT) (* on left rotate colormap) (ROTATECOLORMAP FIRSTCOLOR LASTCOLOR) (COND ((IGREATERP (CLOCKDIFFERENCE ROTATETIME) CD.LOGOWAITTIME) (* cycle the colors in the logo) (ROTATECOLORMAP 1 (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ ROTATETIME (CLOCK0 ROTATETIME)))) (COND ((IGREATERP (CLOCKDIFFERENCE KINROTATETIME) CD.KINWAITTIME) (* cycle the colors in the logo) (ROTATECOLORMAP FIRSTCOLOR LASTCOLOR) (SETQ KINROTATETIME (CLOCK0 KINROTATETIME)))) (DISMISS (IMIN CD.KINETICWAITTIME CD.LOGOWAITTIME)) (GO MOUSELP))) (GO BLTLP)))) (CD.CIRKIN (LAMBDA (WINDOW) (* kbr: " 8-Jul-85 15:18") (PROG (MAXX MAXY MAXRAD MAXCOLOR) (WINDOWPROP WINDOW (QUOTE TITLE) (QUOTE CD.CIRKIN)) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ MAXX (SUB1 (WINDOWPROP WINDOW (QUOTE WIDTH)))) (SETQ MAXY (SUB1 (WINDOWPROP WINDOW (QUOTE HEIGHT)))) (SETQ MAXRAD (IQUOTIENT (IMIN MAXX MAXY) 3)) LP (for I from 1 to 4 do (FILLCIRCLE (RAND 0 MAXX) (RAND 0 MAXY) (RAND 0 MAXRAD) (RAND 0 MAXCOLOR) WINDOW)) (DSPOPERATION (SELECTQ (RAND 0 3) (0 (QUOTE REPLACE)) (1 (QUOTE PAINT)) (2 (QUOTE INVERT)) (QUOTE ERASE)) WINDOW) (GO LP)))) ) (RPAQQ CD.KINETICWAITTIME 150) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS CD.KINETICWAITTIME) ) (* Vine demo *) (DEFINEQ (VINEDEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:12") (PROG (MAXX MAXY X1 Y1 DX DY X2 Y2 COLOR MAXCOLOR WIDTH MAXWIDTH) (WINDOWPROP WINDOW (QUOTE TITLE) "VINE") (CLEARW WINDOW) (SETQ MAXX (SUB1 (BITMAPWIDTH WINDOW))) (SETQ MAXY (SUB1 (BITMAPHEIGHT WINDOW))) (SETQ X1 (IQUOTIENT MAXX 2)) (SETQ Y1 (IQUOTIENT MAXY 2)) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ COLOR (IQUOTIENT MAXCOLOR 2)) (SETQ MAXWIDTH (IQUOTIENT (IMIN MAXX MAXY) 4)) (SETQ WIDTH 10) (SETQ DX 0) (SETQ DY 0) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP NIL) do (* Update velocity. *) (SETQ DX (CD.INRANGE (IQUOTIENT (IMINUS X1) 2) (IQUOTIENT (IDIFFERENCE MAXX X1) 2) (IPLUS DX (RAND (IQUOTIENT (IMINUS X1) 24) (IQUOTIENT (IDIFFERENCE MAXX X1) 24))))) (SETQ DY (CD.INRANGE (IQUOTIENT (IMINUS Y1) 2) (IQUOTIENT (IDIFFERENCE MAXY Y1) 2) (IPLUS DY (RAND (IQUOTIENT (IMINUS Y1) 24) (IQUOTIENT (IDIFFERENCE MAXY Y1) 24))))) (* Knowing current (X1 Y1) and last WIDTH and COLOR, compute the point we draw  to (X2 Y2) and new WIDTH and COLOR. *) (SETQ X2 (CD.INRANGE 0 MAXX (IPLUS X1 DX))) (COND ((OR (EQ X2 0) (EQ X2 MAXX)) (SETQ DX (IMINUS DX)))) (SETQ Y2 (CD.INRANGE 0 MAXY (IPLUS Y1 DY))) (COND ((OR (EQ Y2 0) (EQ Y2 MAXY)) (SETQ DY (IMINUS DY)))) (SETQ WIDTH (CD.INRANGE 1 MAXWIDTH (IPLUS WIDTH (ITIMES (CAR (NTH (QUOTE (-1 0 0 0 0 0 0 1)) (RAND 1 8))) (ADD1 (IQUOTIENT WIDTH 3)))))) (SETQ COLOR (IMOD (IPLUS COLOR (CAR (NTH (QUOTE (-1 0 0 0 0 0 0 1)) (RAND 1 8)))) MAXCOLOR)) (* Drawline and update position  (X1 Y1) *) (DRAWLINE X1 Y1 X2 Y2 WIDTH (QUOTE REPLACE) WINDOW COLOR) (SETQ X1 X2) (SETQ Y1 Y2))))) (CD.INRANGE (LAMBDA (MIN MAX VALUE) (* kbr: " 4-Mar-85 14:12") (IMAX MIN (IMIN MAX VALUE)))) ) (* Raining demo *) (DEFINEQ (RAINING (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:12") (PROG (N MAXCOLOR WIDTH HEIGHT COLOR#) (WINDOWPROP WINDOW (QUOTE TITLE) "RAINING") (CLEARW WINDOW) (SETQ N 3) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ WIDTH (BITMAPWIDTH WINDOW)) (SETQ HEIGHT (BITMAPHEIGHT WINDOW)) (SETQ COLOR# (RAND 0 MAXCOLOR)) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP NIL) do (SETQ COLOR# (CD.DOCOLORDROP (RAND 10 (IDIFFERENCE WIDTH 10)) (RAND 10 (IDIFFERENCE HEIGHT 10)) N (ITIMES N 3) 8 COLOR# MAXCOLOR WINDOW)))))) (CD.PUTDROPS (LAMBDA (WINDOW N) (* kbr: " 8-Jul-85 10:53") (PROG (POS MAXCOLOR) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) LP (SETQ POS (GETPOSITION WINDOW)) (COND ((LASTMOUSESTATE RIGHT) (RETURN))) (CD.DOCOLORDROP (fetch (POSITION XCOORD) of POS) (fetch (POSITION YCOORD) of POS) (OR N 3) (COND ((LASTMOUSESTATE LEFT) (RAND 8 15)) (T (RAND 10 20))) 6 0 MAXCOLOR WINDOW) (GO LP)))) (CD.DOCOLORDROP (LAMBDA (X Y WIDTH RADIUSINCR NCIRCLES COLOR# MAXCOLOR WINDOW) (* kbr: " 8-Jul-85 10:32") (* draws a series of concentric  circles.) (for I from 1 to NCIRCLES do (DRAWCIRCLE X Y (ITIMES I RADIUSINCR) (LIST (QUOTE ROUND) WIDTH (COND ((ILESSP (SETQ COLOR# (ADD1 COLOR#)) MAXCOLOR) COLOR#) (T (SETQ COLOR# 0)))) NIL WINDOW)) COLOR#)) (CD.RAININGCOLORMAP (LAMBDA (BITSPERPIXEL) (* kbr: " 8-Jul-85 11:13") (COLORMAPCREATE (SELECTQ BITSPERPIXEL (4 (NCONC (LIST (QUOTE (0 0 0))) (for I from 100 to 255 by 50 collect (LIST 0 0 I)) (for I from 0 to 11 collect (QUOTE (0 0 0))))) (8 (NCONC (LIST (QUOTE (0 0 0))) (for I from 100 to 255 by 50 collect (LIST 0 0 I)) (for I from 0 to 11 collect (QUOTE (0 0 0))))) (\ILLEGAL.ARG BITSPERPIXEL)) BITSPERPIXEL))) ) (* Modart demo *) (DEFINEQ (MODARTDEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:12") (PROG (WIDTH HEIGHT MAXCOLOR W H L B) (WINDOWPROP WINDOW (QUOTE TITLE) "MODART") (CLEARW WINDOW) (SETQ WIDTH (BITMAPWIDTH WINDOW)) (SETQ HEIGHT (BITMAPHEIGHT WINDOW)) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (SETQ W (RAND 0 WIDTH)) (SETQ H (RAND 0 HEIGHT)) (SETQ L (RAND 0 (IDIFFERENCE WIDTH W))) (SETQ B (RAND 0 (IDIFFERENCE HEIGHT H))) (BITBLT WINDOW 0 0 WINDOW L B W H (SELECTQ (RAND 0 2) (0 (QUOTE INPUT)) (1 (QUOTE INVERT)) (QUOTE TEXTURE)) (SELECTQ (RAND 0 3) (0 (QUOTE REPLACE)) (1 (QUOTE PAINT)) (2 (QUOTE INVERT)) (QUOTE ERASE)) (RAND 0 MAXCOLOR)))))) ) (* Starburst demo *) (DEFINEQ (STARBURSTDEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:11") (PROG (MAXX MAXY MAXCOLOR MAXWIDTH MINWIDTH) (WINDOWPROP WINDOW (QUOTE TITLE) "STARBURST") (CLEARW WINDOW) (SETQ MAXX (SUB1 (BITMAPWIDTH WINDOW))) (SETQ MAXY (SUB1 (BITMAPHEIGHT WINDOW))) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ MAXWIDTH (IQUOTIENT (IMIN MAXX MAXY) 2)) (SETQ MINWIDTH (IQUOTIENT MAXWIDTH 6)) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (CD.STARBURST MAXX MAXY MINWIDTH MAXWIDTH WINDOW))))) (CD.STARBURST (LAMBDA (MAXX MAXY MINWIDTH MAXWIDTH WINDOW) (* kbr: "23-Feb-86 17:15") (PROG (BITSPERPIXEL NCOLORS RADIUS C S CX1 CY1 COLOR1 DELTA1 CX2 CY2 COLOR2 DELTA2 CX3 CY3 COLOR3 DELTA3) (* Do several starbursts at once to  help minimize calls to COS and SIN  which are slow. *) (SETQ BITSPERPIXEL (BITSPERPIXEL WINDOW)) (SETQ NCOLORS (ADD1 (MAXIMUMCOLOR BITSPERPIXEL))) (SETQ RADIUS (RAND MINWIDTH MAXWIDTH)) (PROGN (SETQ CX1 (RAND 0 MAXX)) (SETQ CY1 (RAND 0 MAXY)) (SETQ COLOR1 (RAND 0 (SUB1 NCOLORS))) (SETQ DELTA1 (EXPT 2 (RAND 0 (SUB1 BITSPERPIXEL))))) (PROGN (SETQ CX2 (RAND 0 MAXX)) (SETQ CY2 (RAND 0 MAXY)) (SETQ COLOR2 (RAND 0 (SUB1 NCOLORS))) (SETQ DELTA2 (EXPT 2 (RAND 0 (SUB1 BITSPERPIXEL))))) (PROGN (SETQ CX3 (RAND 0 MAXX)) (SETQ CY3 (RAND 0 MAXY)) (SETQ COLOR3 (RAND 0 (SUB1 NCOLORS))) (SETQ DELTA3 (EXPT 2 (RAND 0 (SUB1 BITSPERPIXEL))))) (for THETA from 0 to 44 by 5 do (SETQ C (FTIMES RADIUS (COS THETA))) (SETQ S (FTIMES RADIUS (SIN THETA))) (PROGN (CD.STARSHINE CX1 CY1 C S WINDOW COLOR1) (SETQ COLOR1 (IMOD (IPLUS COLOR1 DELTA1) NCOLORS))) (PROGN (CD.STARSHINE CX2 CY2 C S WINDOW COLOR2) (SETQ COLOR2 (IMOD (IPLUS COLOR2 DELTA2) NCOLORS))) (PROGN (CD.STARSHINE CX3 CY3 C S WINDOW COLOR3) (SETQ COLOR3 (IMOD (IPLUS COLOR3 DELTA3) NCOLORS))))))) (CD.STARSHINE (LAMBDA (CX1 CY1 C S WINDOW COLOR) (* kbr: "23-Feb-86 16:57") (PROG NIL (DRAWLINE (IDIFFERENCE CX1 C) (IDIFFERENCE CY1 S) (IPLUS CX1 C) (IPLUS CY1 S) 1 (QUOTE REPLACE) WINDOW COLOR) (DRAWLINE (IDIFFERENCE CX1 C) (IPLUS CY1 S) (IPLUS CX1 C) (IDIFFERENCE CY1 S) 1 (QUOTE REPLACE) WINDOW COLOR) (DRAWLINE (IDIFFERENCE CX1 S) (IPLUS CY1 C) (IPLUS CX1 S) (IDIFFERENCE CY1 C) 1 (QUOTE REPLACE) WINDOW COLOR) (DRAWLINE (IPLUS CX1 S) (IPLUS CY1 C) (IDIFFERENCE CX1 S) (IDIFFERENCE CY1 C) 1 (QUOTE REPLACE) WINDOW COLOR)))) ) (* Peano demo *) (FILESLOAD (FROM LISPUSERS) PEANO) (DEFINEQ (COLORPEANODEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:13") (PROG (BITSPERPIXEL MAXCOLOR MAXSHADE LEVEL SCALE) (WINDOWPROP WINDOW (QUOTE TITLE) "PEANO") (SETQ BITSPERPIXEL (BITSPERPIXEL WINDOW)) (SETQ MAXCOLOR (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ MAXSHADE (MAXIMUMSHADE BITSPERPIXEL)) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (DSPCOLOR (RAND 0 MAXCOLOR) WINDOW) (DSPTEXTURE (RAND 0 MAXSHADE) WINDOW) (DSPBACKCOLOR (RAND 0 MAXCOLOR) WINDOW) (SETQ LEVEL (RAND 4 6)) (SETQ SCALE (IQUOTIENT (IMAX (BITMAPWIDTH WINDOW) (BITMAPHEIGHT WINDOW)) (EXPT 2 LEVEL))) (SETQ PEANOWINDOW WINDOW) (PEANODEMO LEVEL SCALE))))) ) (* Bubble demo *) (DEFINEQ (BUBBLEDEMO (LAMBDA (WAIT WINDOW) (* kbr: " 3-Sep-86 20:13") (PROG (MAXX MAXY MAXCOLOR MAXWIDTH MINWIDTH HOLLOW) (WINDOWPROP WINDOW (QUOTE TITLE) "BUBBLE") (CLEARW WINDOW) (SETQ MAXX (SUB1 (BITMAPWIDTH WINDOW))) (SETQ MAXY (SUB1 (BITMAPHEIGHT WINDOW))) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (SETQ MAXWIDTH (IQUOTIENT (IMIN MAXX MAXY) 8)) (SETQ MINWIDTH (IQUOTIENT MAXWIDTH 6)) (COND ((EQ (RAND 0 1) 1) (SETQ HOLLOW T))) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP NIL) do (CD.BUBBLE (RAND 0 MAXX) (RAND 0 MAXY) (RAND MINWIDTH MAXWIDTH) HOLLOW WINDOW))))) (CD.BUBBLE (LAMBDA (CENTERX CENTERY RADIUS HOLLOW WINDOW) (* kbr: "29-Jul-85 18:09") (PROG (MAXCOLOR) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL WINDOW))) (FILLCIRCLE CENTERX CENTERY RADIUS (RAND 0 MAXCOLOR) WINDOW) (COND (HOLLOW (FILLCIRCLE CENTERX CENTERY (SUB1 RADIUS) 0 WINDOW)))))) ) (* Overpaint demo *) (DEFINEQ (OVERPAINTDEMO (LAMBDA (WAIT) (* kbr: " 3-Sep-86 20:14") (PROG (BITMAP BITSPERPIXEL MAXCOLOR WIDTH HEIGHT X Y) (WINDOWPROP CD.WINDOW1 (QUOTE TITLE) "MASK") (WINDOWPROP CD.WINDOW2 (QUOTE TITLE) "BACKGROUND") (WINDOWPROP CD.WINDOW3 (QUOTE TITLE) "INPUT") (WINDOWPROP CD.WINDOW4 (QUOTE TITLE) "OUTPUT") (SETQ BITSPERPIXEL (BITSPERPIXEL CD.WINDOW1)) (SETQ MAXCOLOR (MAXIMUMCOLOR BITSPERPIXEL)) (SETQ WIDTH (BITMAPWIDTH CD.WINDOW1)) (SETQ HEIGHT (BITMAPHEIGHT CD.WINDOW1)) (COND ((NULL CD.OVERPAINTBITMAPS) (SETQ CD.OVERPAINTBITMAPS (for STRING in (QUOTE ("Interlisp-D" "Xerox" "Color")) collect (BITMAPFROMSTRING STRING (FONTCREATE (QUOTE TIMESROMAND ) 36) BITSPERPIXEL))))) (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (BITBLT CD.WINDOW2 NIL NIL CD.WINDOW4) (for I from 1 to (RAND 6 20) do (SETQ BITMAP (CD.NEXTELEMENT BITMAP CD.OVERPAINTBITMAPS)) (SETQ X (RAND 0 (IDIFFERENCE WIDTH (BITMAPWIDTH BITMAP)))) (SETQ Y (RAND 0 (IDIFFERENCE HEIGHT (BITMAPHEIGHT BITMAP)))) (CLEARW CD.WINDOW1) (BITBLT BITMAP NIL NIL CD.WINDOW1 X Y) (BLTSHADE (RAND 0 MAXCOLOR) CD.WINDOW3) (BITBLT CD.WINDOW1 NIL NIL CD.WINDOW3 NIL NIL NIL NIL (QUOTE INVERT) (QUOTE ERASE)) (BITBLT CD.WINDOW1 NIL NIL CD.WINDOW4 NIL NIL NIL NIL (QUOTE INPUT) (QUOTE ERASE)) (BITBLT CD.WINDOW3 NIL NIL CD.WINDOW4 NIL NIL NIL NIL (QUOTE INPUT) (QUOTE PAINT))))))) ) (RPAQQ CD.OVERPAINTBITMAPS NIL) (* Tile demo *) (RPAQ? CD.TILEBITMAPS NIL) (DEFINEQ (TILEDEMO (LAMBDA (WAIT) (* kbr: " 3-Sep-86 21:19") (PROG (WINDOWS WINDOW BITSPERPIXEL BITMAP) (SETQ WINDOWS (LIST CD.WINDOW1 CD.WINDOW2 CD.WINDOW3 CD.WINDOW4)) (COND ((ILESSP (LENGTH CD.TILEBITMAPS) 4) (SETQ BITSPERPIXEL (BITSPERPIXEL (COLORSCREENBITMAP))) (for WINDOW in WINDOWS do (SETQ BITMAP (BITMAPCREATE 100 100 BITSPERPIXEL)) (BITBLT WINDOW NIL NIL BITMAP) (push CD.TILEBITMAPS BITMAP)))) (CHANGEBACKGROUND (CD.RANDELEMENT CD.TILEBITMAPS) (COLORSCREEN)) (WINDOWPROP CD.WINDOW1 (QUOTE TITLE) "WINDOW1") (WINDOWPROP CD.WINDOW2 (QUOTE TITLE) "WINDOW2") (WINDOWPROP CD.WINDOW3 (QUOTE TITLE) "WINDOW3") (WINDOWPROP CD.WINDOW4 (QUOTE TITLE) "WINDOW4") (CD.QUITP (OR WAIT 120)) (until (CD.QUITP) do (SETQ WINDOW (CD.NEXTELEMENT WINDOW WINDOWS)) (SETQ BITMAP (CD.RANDELEMENT CD.TILEBITMAPS)) (TILE BITMAP WINDOW))))) ) (* Polygons demo *) (FILESLOAD (FROM LISPUSERS) COLORPOLYGONS) (DEFINEQ (POLYGONSDEMO (LAMBDA (WAIT) (* kbr: " 6-Jun-86 00:27") (PROG NIL (CD.QUITP (OR WAIT 120)) (until (CD.QUITP NIL) do (COLORPOLYGON CD.WINDOW1) (COLORPOLYGON CD.WINDOW2) (COLORPOLYGON CD.WINDOW3) (COLORPOLYGON CD.WINDOW4) (COLORPOLYGONS.ROTATECOLORMAP))))) ) (FILESLOAD COLOR) (* Color font profile *) (RPAQQ COLORFONTPROFILE ((DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8) (4DISPLAY (GACHA 10 MRR-WHITE-RED)) (8DISPLAY (GACHA 10 MRR-WHITE-RED)) (24DISPLAY (GACHA 10 MRR-WHITE-RED))) (BOLDFONT 2 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR) (4DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (8DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA)) (24DISPLAY (HELVETICA 10 BRR-WHITE-MAGENTA))) (LITTLEFONT 3 (HELVETICA 8) (HELVETICA 6 MIR) (MODERN 8 MIR) (4DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (8DISPLAY (HELVETICA 8 MRR-WHITE-GREEN)) (24DISPLAY (HELVETICA 8 MRR-WHITE-GREEN))) (BIGFONT 4 (HELVETICA 12 BRR) (HELVETICA 10 BRR) (MODERN 10 BRR) (4DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (8DISPLAY (HELVETICA 12 BRR-WHITE-BLUE)) (24DISPLAY (HELVETICA 12 BRR-WHITE-BLUE))) (USERFONT BOLDFONT) (COMMENTFONT LITTLEFONT) (LAMBDAFONT BIGFONT) (SYSTEMFONT) (CLISPFONT BOLDFONT) (CHANGEFONT) (PRETTYCOMFONT BOLDFONT) (FONT1 DEFAULTFONT) (FONT2 BOLDFONT) (FONT3 LITTLEFONT) (FONT4 BIGFONT) (FONT5 5 (HELVETICA 10 BIR) (HELVETICA 8 BIR) (MODERN 8 BIR)) (FONT6 6 (HELVETICA 10 BRR) (HELVETICA 8 BRR) (MODERN 8 BRR)) (FONT7 7 (GACHA 12) (GACHA 12) (TERMINAL 12)))) (FONTPROFILE COLORFONTPROFILE) (* Create color fonts now instead of later. COLOR should already be LOADed. *) (for FONTCLASS in (LIST DEFAULTFONT BOLDFONT LITTLEFONT BIGFONT) do (FONTCREATE FONTCLASS NIL NIL NIL (QUOTE 8DISPLAY))) (FONTCREATE (QUOTE TIMESROMAND) 36 NIL NIL NIL (QUOTE 8DISPLAY)) (PUTPROPS COLORDEMO COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (5128 14880 (COLORDEMO 5138 . 6924) (CD.INIT 6926 . 7146) (CD.INIT.COLORMAPS 7148 . 9003 ) (CD.INIT.WINDOWS 9005 . 13127) (CD.INIT.MENU 13129 . 13458) (CD.NEXTELEMENT 13460 . 14003) ( CD.RANDELEMENT 14005 . 14166) (CD.CHOOSEDEMO 14168 . 14330) (CD.QUITP 14332 . 14878)) (14908 17153 ( CD.MINESHAFT 14918 . 16512) (CD.POINTTEST 16514 . 17151)) (17154 21488 (WELLDEMO 17164 . 17758) ( TUNNELDEMO 17760 . 18348) (CD.SQUARETUNNEL 18350 . 19917) (CD.CIRCULARTUNNEL 19919 . 21486)) (21513 21915 (CD.ROTATEIT 21523 . 21913)) (21916 24640 (COLORMAPOF 21926 . 22326) (COLORMAPCOPY 22328 . 22858 ) (COLORFILL 22860 . 23996) (COLORBACKGROUND 23998 . 24161) (COLORFILLAREA 24163 . 24638)) (24664 30332 (WALKDEMO 24674 . 25293) (CD.WALKBM 25295 . 28716) (CD.RANDCOLORMAP 28718 . 30330)) (30729 36945 (KINETICDEMO 30739 . 31911) (CD.DEMOKINETIC 31913 . 35878) (CD.CIRKIN 35880 . 36943)) (37075 40482 ( VINEDEMO 37085 . 40333) (CD.INRANGE 40335 . 40480)) (40510 43827 (RAINING 40520 . 41436) (CD.PUTDROPS 41438 . 42110) (CD.DOCOLORDROP 42112 . 43064) (CD.RAININGCOLORMAP 43066 . 43825)) (43854 45278 ( MODARTDEMO 43864 . 45276)) (45308 49308 (STARBURSTDEMO 45318 . 46022) (CD.STARBURST 46024 . 48286) ( CD.STARSHINE 48288 . 49306)) (49376 50561 (COLORPEANODEMO 49386 . 50559)) (50588 51968 (BUBBLEDEMO 50598 . 51560) (CD.BUBBLE 51562 . 51966)) (51998 54683 (OVERPAINTDEMO 52008 . 54681)) (54777 56090 ( TILEDEMO 54787 . 56088)) (56169 56673 (POLYGONSDEMO 56179 . 56671))))) STOP \ No newline at end of file diff --git a/lispusers/COLORNNCC b/lispusers/COLORNNCC new file mode 100644 index 00000000..8cdff283 --- /dev/null +++ b/lispusers/COLORNNCC @@ -0,0 +1 @@ +(FILECREATED "16-Feb-86 00:08:50" {ERIS}LIBRARY>COLORNNCC.;9 31542 changes to: (FNS \COLORNNCC.CMD \COLORNNCC.PAR2 \COLORNNCC.INIT \COLORNNCC.STARTBOARD \COLORNNCC.SENDCOLORMAPENTRY \COLORNNCC.SENDPAGE \COLORNNCC.PILOTBITBLT \COLORNNCC24.STARTBOARD \COLORNNCC24.STARTCOLOR \COLORNNCC24.SENDPAGE \COLORNNCC.DEMO \COLORNNCC.DRAWLINE1 \COLORNNCC.TEST3 MYTEST TEST24 TESTMODE TESTCM) (VARS COLORNNCCCOMS) previous date: "15-Feb-86 21:44:39" {ERIS}LIBRARY>COLORNNCC.;7) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT COLORNNCCCOMS) (RPAQQ COLORNNCCCOMS ((* COLORNNCC -- Drivers for Number Nine Computer Corporation color cards. -- By Kelly Roach. *) (DECLARE: DOEVAL@LOAD DOEVAL@COMPILE DONTCOPY (CONSTANTS (DISPLAYADRH 10) (PARAMADRH 12) (REDTABLEADRL 256) (GREENTABLEADRL 512) (BLUETABLEADRL 768) (BANK0ADRL 1797) (BANK1ADRL 1798))) (COMS (* Specific to REV512X8 board. *) (INITVARS (\COLORNNCC.BANK1 0) (\COLORNNCC.BANK0 0) (\DEBUG.CURSORRAN NIL) (\DEBUG.SENDPAGERAN NIL) (\DEBUG.CURSORINTERRUPTED NIL) (\DEBUG.SENDPAGEINTERRUPTED NIL)) (MACROS \COLORNNCCBANK1 \COLORNNCCBANK0)) (COMS (* Specific to REV512X32 board. *) (INITVARS (\COLORNNCC24.REDBASE NIL) (\COLORNNCC24.GREENBASE NIL) (\COLORNNCC24.BLUEBASE NIL))) (FNS \COLORNNCC.CMD \COLORNNCC.PAR2) (FNS \COLORNNCC.INIT) (FNS \COLORNNCC.STARTBOARD \COLORNNCC.SENDCOLORMAPENTRY \COLORNNCC.SENDPAGE \COLORNNCC.PILOTBITBLT) (FNS \COLORNNCC24.STARTBOARD \COLORNNCC24.STARTCOLOR \COLORNNCC24.SENDPAGE) (FNS \COLORNNCC.DEMO \COLORNNCC.DRAWLINE1 \COLORNNCC.TEST3 MYTEST TEST24 TESTMODE TESTCM) (FILES BUSCOLOR) (* \DEBUG vars are temporary till I figure out bank switching. *) (VARS \COLORNNCC.LOCKEDFNS \COLORNNCC.LOCKEDVARS) (DECLARE: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (P (\COLORNNCC.INIT))))) (* COLORNNCC -- Drivers for Number Nine Computer Corporation color cards. -- By Kelly Roach. *) (DECLARE: DOEVAL@LOAD DOEVAL@COMPILE DONTCOPY (DECLARE: EVAL@COMPILE (RPAQQ DISPLAYADRH 10) (RPAQQ PARAMADRH 12) (RPAQQ REDTABLEADRL 256) (RPAQQ GREENTABLEADRL 512) (RPAQQ BLUETABLEADRL 768) (RPAQQ BANK0ADRL 1797) (RPAQQ BANK1ADRL 1798) (CONSTANTS (DISPLAYADRH 10) (PARAMADRH 12) (REDTABLEADRL 256) (GREENTABLEADRL 512) (BLUETABLEADRL 768) (BANK0ADRL 1797) (BANK1ADRL 1798)) ) ) (* Specific to REV512X8 board. *) (RPAQ? \COLORNNCC.BANK1 0) (RPAQ? \COLORNNCC.BANK0 0) (RPAQ? \DEBUG.CURSORRAN NIL) (RPAQ? \DEBUG.SENDPAGERAN NIL) (RPAQ? \DEBUG.CURSORINTERRUPTED NIL) (RPAQ? \DEBUG.SENDPAGEINTERRUPTED NIL) (DECLARE: EVAL@COMPILE (PUTPROPS \COLORNNCCBANK1 MACRO ((BANK1) (SETQ \COLORNNCC.BANK1 BANK1) (PCBUS.WRITEHL PARAMADRH BANK1ADRL \COLORNNCC.BANK1))) (PUTPROPS \COLORNNCCBANK0 MACRO ((BANK0) (SETQ \COLORNNCC.BANK0 BANK0) (PCBUS.WRITEHL PARAMADRH BANK0ADRL \COLORNNCC.BANK0))) ) (* Specific to REV512X32 board. *) (RPAQ? \COLORNNCC24.REDBASE NIL) (RPAQ? \COLORNNCC24.GREENBASE NIL) (RPAQ? \COLORNNCC24.BLUEBASE NIL) (DEFINEQ (\COLORNNCC.CMD (LAMBDA (ARG RESETFLG) (* kbr: " 4-Jan-86 16:31") (OR RESETFLG (until (EQ 0 (LOGAND 2 (PCBUS.READHL PARAMADRH 0))))) (PCBUS.WRITEHL PARAMADRH 1 (CAR ARG)) (for X in (CDR ARG) do (until (EQ 0 (LOGAND 2 (PCBUS.READHL PARAMADRH 0)))) (PCBUS.WRITEHL PARAMADRH 0 X)))) (\COLORNNCC.PAR2 (LAMBDA (ARG) (* kbr: " 4-Jan-86 16:31") (until (EQ 0 (LOGAND 2 (PCBUS.READHL 12 0)))) (PCBUS.WRITEHL 12 0 (LOGAND ARG 255)) (until (EQ 0 (LOGAND 2 (PCBUS.READHL 12 0)))) (PCBUS.WRITEHL 12 0 (LOGAND (LRSH ARG 8) 255)))) ) (DEFINEQ (\COLORNNCC.INIT (LAMBDA NIL (* kbr: "15-Feb-86 18:14") (DECLARE (GLOBALVARS \COLORNNCCWSOPS \COLORNNCC24WSOPS \COLORNNCCINFO \COLORNNCCINFO24)) (for FN in \COLORNNCC.LOCKEDFNS do (\LOCKFN FN)) (for VAR in \COLORNNCC.LOCKEDVARS do (\LOCKVAR VAR)) (SETQ \COLORNNCCWSOPS (create WSOPS STARTBOARD _(FUNCTION \COLORNNCC.STARTBOARD) STARTCOLOR _(FUNCTION \BUSCOLOR.STARTCOLOR) STOPCOLOR _(FUNCTION \BUSCOLOR.STOPCOLOR) EVENTFN _(FUNCTION \BUSCOLOR.EVENTFN) SENDCOLORMAPENTRY _(FUNCTION \COLORNNCC.SENDCOLORMAPENTRY) SENDPAGE _(FUNCTION \COLORNNCC.SENDPAGE) PILOTBITBLT _(FUNCTION \COLORNNCC.PILOTBITBLT))) (SETQ \COLORNNCCINFO (create DISPLAYINFO DITYPE _(QUOTE REV512X8) DIWIDTH _ 512 DIHEIGHT _ 480 DIBITSPERPIXEL _ 8 DIWSOPS _ \COLORNNCCWSOPS)) (\DEFINEDISPLAYINFO \COLORNNCCINFO) (SETQ \COLORNNCC24WSOPS (create WSOPS STARTBOARD _(FUNCTION \COLORNNCC24.STARTBOARD) STARTCOLOR _(FUNCTION \COLORNNCC24.STARTCOLOR) STOPCOLOR _(FUNCTION \BUSCOLOR.STOPCOLOR) EVENTFN _(FUNCTION \BUSCOLOR.EVENTFN) SENDCOLORMAPENTRY _(FUNCTION NILL) SENDPAGE _(FUNCTION \COLORNNCC24.SENDPAGE) PILOTBITBLT _(FUNCTION NILL))) (SETQ \COLORNNCCINFO24 (create DISPLAYINFO DITYPE _(QUOTE REV512X32) DIWIDTH _ 512 DIHEIGHT _ 480 DIBITSPERPIXEL _ 24 DIWSOPS _ \COLORNNCC24WSOPS)) (\DEFINEDISPLAYINFO \COLORNNCCINFO24))) ) (DEFINEQ (\COLORNNCC.STARTBOARD (LAMBDA NIL (* kbr: "13-Feb-86 23:21") (* IBM Bus Access Mode. *) (PCBUS.WRITEHL PARAMADRH 1796 255) (PCBUS.WRITEHL PARAMADRH 1797 0) (* Overlay Select. *) (PCBUS.WRITEHL PARAMADRH 1798 0) (* Board Enable. *) (PCBUS.WRITEHL PARAMADRH 1799 255) (\COLORNNCC.CMD (QUOTE (0 31 62 100 8 5 3 240 64)) T) (\COLORNNCC.CMD (QUOTE (71 64))) (\COLORNNCC.CMD (QUOTE (111))) (\COLORNNCC.CMD (QUOTE (70 0))) (* Zoom Factor. *) (PCBUS.WRITEHL PARAMADRH 1792 255) (PCBUS.WRITEHL PARAMADRH 1793 255) (PCBUS.WRITEHL PARAMADRH 1794 255) (PCBUS.WRITEHL PARAMADRH 1795 255) (\COLORNNCC.CMD (QUOTE (75 0 192 0))) (\COLORNNCC.CMD (QUOTE (112 0 0 0 127))) (\COLORNNCC.CMD (QUOTE (120 255 255 255 255 255 255 255 255))) (\COLORNNCC.CMD (QUOTE (74 255 255))) (\COLORNNCC.CMD (QUOTE (107))) (\COLORNNCC.CMD (QUOTE (13))))) (\COLORNNCC.SENDCOLORMAPENTRY (LAMBDA (FDEV COLOR# RGB) (* kbr: "15-Feb-86 21:04") (PROG NIL (PCBUS.WRITEHL PARAMADRH (IPLUS 256 COLOR#) (fetch (RGB RED) of RGB)) (PCBUS.WRITEHL PARAMADRH (IPLUS 512 COLOR#) (fetch (RGB GREEN) of RGB)) (PCBUS.WRITEHL PARAMADRH (IPLUS 768 COLOR#) (fetch (RGB BLUE) of RGB))))) (\COLORNNCC.SENDPAGE (LAMBDA (PAGE PAGE#) (* kbr: "16-Feb-86 00:03") (PROG (BANK1 BANK0 ADRL DISPINTERRUPT) (* Keyboard interrupts have to be turned off to gaurantee proper COLORNNCC bank selection. *) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (* \PUTBASE \EM.DISPINTERRUPT 0 0) (SETQ BANK1 (COND ((EQ (LOGAND PAGE# 256) 0) 0) (T 255))) (SETQ BANK0 (COND ((EQ (LOGAND PAGE# 128) 0) 0) (T 255))) (\COLORNNCCBANK1 BANK1) (\COLORNNCCBANK0 BANK0) (SETQ ADRL (UNFOLD (LOGAND PAGE# 127) BYTESPERPAGE)) (\BUSBLTOUTBYTES PAGE DISPLAYADRH ADRL WORDSPERPAGE) (* \PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT) ))) (\COLORNNCC.PILOTBITBLT (LAMBDA (PILOTBBT N) (* kbr: "30-Jun-85 16:01") (PROG (DEST DESTBIT WIDTH HEIGHT VMADDR BUSADDRHI BUSADDRLO NWORDS ABSCURRPAGE CURRPAGEINBITMAP PAGE DISPINTERRUPT) (* The busmaster UPDATEDAEMON is a narrow communication bottleneck from the color screen bitmap to the color frame buffer. We work around this bottleneck by communicating small important changes to the color screen bitmap quickly and big less important changes slower. *) (* We try to make small changes that cross lots of pages appear visible in the frame buffer quickly by writing to both color screen bitmap and frame buffer. Big changes, which could be overwritten by other big changes before the UPDATEDAEMON notices them (and so save us time this way) are best left to the UPDATEDAEMON to handle. *) (* First, output to the color screen bitmap. *) (\PILOTBITBLT PILOTBBT N) (* If the PILOTBBT is disjoint or is fairly wide, then just return now. *) (COND ((OR (NOT (fetch (PILOTBBT PBTDISJOINT) of PILOTBBT)) (IGREATERP (fetch (PILOTBBT PBTWIDTH) of PILOTBBT) 1000)) (RETURN))) (* Probably a case worth optimizing: cursors, carets, characters, vertical drawlines, and vertical scroll bars. \BUSBLTOUTBYTES works in words, not pixels (bytes)%. We handle this problem by getting the values for our pixels from the DEST we just did our \PILOTBITBLT to, slopping over to a few unchanged pixels when necessary. *) (SETQ DEST (fetch (PILOTBBT PBTDEST) of PILOTBBT)) (SETQ DESTBIT (fetch (PILOTBBT PBTDESTBIT) of PILOTBBT)) (SETQ WIDTH (fetch (PILOTBBT PBTWIDTH) of PILOTBBT)) (SETQ HEIGHT (fetch (PILOTBBT PBTHEIGHT) of PILOTBBT)) (SETQ ABSCURRPAGE (fetch (POINTER PAGE#) of DEST)) (SETQ CURRPAGEINBITMAP (IDIFFERENCE ABSCURRPAGE ColorScreenBitMapBasePage)) (SETQ PAGE (LOGAND CURRPAGEINBITMAP 127)) (SETQ BUSADDRLO (UNFOLD (IPLUS (UNFOLD PAGE WORDSPERPAGE) (fetch (POINTER WORDINPAGE) of DEST) (FOLDLO DESTBIT BITSPERWORD)) BYTESPERWORD)) (SETQ NWORDS (IDIFFERENCE (FOLDHI (IPLUS DESTBIT WIDTH -1) BITSPERWORD) (FOLDLO DESTBIT BITSPERWORD))) (* Keyboard interrupts have to be turned off to gaurantee proper COLORNNCC bank selection. *) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (\PUTBASE \EM.DISPINTERRUPT 0 0) (SETQ \COLORNNCC.SENDPAGERAN NIL) (SETQ \COLORNNCC.CURSORRAN T) (\COLORNNCCBANK1 (COND ((EQ (LOGAND CURRPAGEINBITMAP 256) 0) 0) (T 255))) (\COLORNNCCBANK0 (COND ((EQ (LOGAND CURRPAGEINBITMAP 128) 0) 0) (T 255))) (SETQ DEST (\ADDBASE DEST (FOLDLO DESTBIT BITSPERWORD))) (for I from 1 to HEIGHT do (\BUSBLTOUTBYTES DEST DISPLAYADRH BUSADDRLO NWORDS) (COND ((EQ I HEIGHT) (RETURN))) (SETQ DEST (\ADDBASE DEST WORDSPERPAGE)) (SETQ PAGE (ADD1 PAGE)) (COND ((ILESSP PAGE 128) (SETQ BUSADDRLO (IPLUS BUSADDRLO BYTESPERPAGE ))) (T (* Crossing into different bank. *) (COND ((EQ \COLORNNCC.BANK0 0) (\COLORNNCCBANK0 255)) (T (\COLORNNCCBANK1 255) (\COLORNNCCBANK0 0))) (SETQ PAGE 0) (SETQ BUSADDRLO (IDIFFERENCE BUSADDRLO (IDIFFERENCE 65536 BYTESPERPAGE) ))))) (COND (\COLORNNCC.SENDPAGERAN (SETQ \COLORNNCC.SENDPAGEINTERRUPTED T))) (\PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT)))) ) (DEFINEQ (\COLORNNCC24.STARTBOARD (LAMBDA NIL (* kbr: "15-Feb-86 16:14") (* First part is just like setting up the REV512X8. *) (\COLORNNCC.STARTBOARD) (* Set up REV512X32 color lookup tables. *) (for I from 4096 to 16383 do (PCBUS.WRITEHL PARAMADRH I (LOGXOR (LOGAND I 255) 255))) (* I believe the following two commands will set REV512X32 to work in RGB-GUN MODE. I was never able to find and/or make PIXEL MODE work. *) (PCBUS.WRITEHL 12 1796 0) (PCBUS.WRITEHL 12 1797 0))) (\COLORNNCC24.STARTCOLOR (LAMBDA (FDEV) (* kbr: "15-Feb-86 18:24") (PROG NIL (COND ((NULL \COLORNNCC24.REDBASE) (SETQ \COLORNNCC24.REDBASE (NCREATE (QUOTE VMEMPAGEP))) (SETQ \COLORNNCC24.GREENBASE (NCREATE (QUOTE VMEMPAGEP))) (SETQ \COLORNNCC24.BLUEBASE (NCREATE (QUOTE VMEMPAGEP))) (\LOCKPAGES \COLORNNCC24.REDBASE 1) (\LOCKPAGES \COLORNNCC24.GREENBASE 1) (\LOCKPAGES \COLORNNCC24.BLUEBASE 1) (\LOCKVAR (QUOTE \COLORNNCC24.REDBASE)) (\LOCKVAR (QUOTE \COLORNNCC24.GREENBASE)) (\LOCKVAR (QUOTE \COLORNNCC24.BLUEBASE)))) (\BUSCOLOR.STARTCOLOR FDEV)))) (\COLORNNCC24.SENDPAGE (LAMBDA (PAGE PAGE#) (* kbr: "16-Feb-86 00:01") (PROG (POINTER ADRL DISPINTERRUPT X Y REDBANK GREENBANK BLUEBANK) (* Keyboard interrupts have to be turned off to gaurantee proper COLORNNGS bank selection. *) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (* \PUTBASE \EM.DISPINTERRUPT 0 0) (* The code below separates out the 8bit red, 8bit green, and 8bit blue components of a packed page of 24bit color. The first color boundary begins with one of first three bytes of the packed page, and we must case out. There will be 171, 171, and 170 bytes or a rotation thereof of red, green, and blue to be dealt with. Once the red, green, and blue components are separated out, they must be shipped to the BusMaster. We need to ship these components to the right banks of the REV512X32 board. We are only allowed to ship out a multiple of words, so we ship 172 bytes in all cases getting the extra 1, 1, and 2 bytes that we will need to ship from the right places. *) (PROGN (* Calculate red, green, blue components. *) (SETQ POINTER PAGE) (SETQ Y (IQUOTIENT PAGE# 3)) (SELECTQ (IREMAINDER PAGE# 3) (0 (SETQ X 0)) (1 (SETQ POINTER (\ADDBASE POINTER -1)) (SETQ X 170)) (PROGN (SETQ POINTER (\ADDBASE POINTER -2)) (SETQ X 340))) (for I from 0 to 171 as R from 0 by 3 as G from 1 by 3 as B from 2 by 3 do (\PUTBASEBYTE \COLORNNCC24.REDBASE I (\GETBASEBYTE POINTER R)) (\PUTBASEBYTE \COLORNNCC24.GREENBASE I (\GETBASEBYTE POINTER G)) (\PUTBASEBYTE \COLORNNCC24.BLUEBASE I (\GETBASEBYTE POINTER B))) (SETQ ADRL (IPLUS (LLSH (LOGAND Y 127) 9) X))) (PROGN (* Ship red component. *) (SETQ REDBANK (LRSH Y 7)) (PCBUS.WRITEHL 12 1024 REDBANK) (\BUSBLTOUTBYTES \COLORNNCC24.REDBASE DISPLAYADRH ADRL (FOLDLO 172 2))) (PROGN (* Ship green component. *) (SETQ GREENBANK (IPLUS 4 REDBANK)) (PCBUS.WRITEHL 12 1024 GREENBANK) (\BUSBLTOUTBYTES \COLORNNCC24.GREENBASE DISPLAYADRH ADRL (FOLDLO 172 2))) (PROGN (* Ship blue component. *) (SETQ BLUEBANK (IPLUS 8 REDBANK)) (PCBUS.WRITEHL 12 1024 BLUEBANK) (\BUSBLTOUTBYTES \COLORNNCC24.BLUEBASE DISPLAYADRH ADRL (FOLDLO 172 2))) (* \PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT) ))) ) (DEFINEQ (\COLORNNCC.DEMO (LAMBDA NIL (* kbr: " 4-Jan-86 16:26") (for I from 0 to 511 do (for J from 0 to 127 do (PCBUS.WRITEHL 10 (PLUS (TIMES 512 J) I) I))) (for I from 0 to 255 do (PCBUS.WRITEHL 12 (PLUS 256 I) I) (PCBUS.WRITEHL 12 (PLUS 512 I) I) (PCBUS.WRITEHL 12 (PLUS 768 I) I)))) (\COLORNNCC.DRAWLINE1 (LAMBDA (X0 Y0 XLIMIT YLIMIT DX DY CDL YINC MODE) (* edited: " 2-Jun-85 17:53") (PROG NIL (* DIR PLANE EAD DC D D2 D1 DM DI DD) (SETQ DI (IMAX DX DY)) (SETQ DD (IMIN DX DY)) (SETQ DIR (COND ((ILESSP YINC 0) (COND ((IGREATERP DY DX) 0) (T 1))) (T (COND ((IGREATERP DY DX) 2) (T 3))))) (SETQ PLANE 0) (SETQ EAD (IPLUS (ITIMES (IDIFFERENCE 479 Y0) 64) (LRSH X0 4) (ITIMES PLANE 16384))) (* CURS) (\COLORNNCC.CMD (LIST 73 (LOGAND EAD 255) (LOGAND (LRSH EAD 8) 255) (IPLUS (LLSH (LOGAND X0 15) 4) (LRSH EAD 16)))) (* WDAT) (\COLORNNCC.CMD (LIST (IPLUS 32 (SELECTQ MODE (PAINT 3) (REPLACE 0) (INVERSE 1) (RETURN))))) (PROGN (* FIGS) (\COLORNNCC.CMD (LIST 76 (IPLUS 8 DIR))) (\COLORNNCC.PAR2 (SETQ DC (IMAX DX DY))) (\COLORNNCC.PAR2 (SETQ D (IPLUS DD DD (IMINUS DI)))) (\COLORNNCC.PAR2 (SETQ D2 (LLSH (IDIFFERENCE DD DI) 1))) (\COLORNNCC.PAR2 (SETQ D1 (IPLUS DD DD))) (\COLORNNCC.PAR2 (SETQ DM 65535))) (* FIGD) (\COLORNNCC.CMD (QUOTE (108)))))) (\COLORNNCC.TEST3 (LAMBDA NIL (* edited: " 2-Jun-85 18:12") (for X from 0 to 100 by 10 do (\COLORNNCC.DRAWLINE1 0 479 512 0 X 100 0 -1 (QUOTE INVERSE))) (for Y from 0 to 90 by 10 do (\COLORNNCC.DRAWLINE1 0 479 512 0 100 Y 0 -1 (QUOTE INVERSE))))) (MYTEST (LAMBDA (COLOR) (* kbr: "14-Feb-86 00:37") (for I from 0 to 511 do (for J from 0 to I do (TEST24 I J COLOR))))) (TEST24 (LAMBDA (X Y NEWVALUE) (* kbr: "14-Feb-86 00:58") (* Write NEWVALUE out to X Y of REV512X32 board. *) (PROG (LO) (SETQ LO (IPLUS (LLSH (LOGAND Y 127) 9) X)) (PCBUS.WRITEHL 12 1024 (LRSH Y 7)) (PCBUS.WRITEHL 10 LO (LOGAND (LRSH NEWVALUE 16) 255)) (PCBUS.WRITEHL 12 1024 (IPLUS 4 (LRSH Y 7))) (PCBUS.WRITEHL 10 LO (LOGAND (LRSH NEWVALUE 8) 255)) (PCBUS.WRITEHL 12 1024 (IPLUS 8 (LRSH Y 7))) (PCBUS.WRITEHL 10 LO (LOGAND NEWVALUE 255))))) (TESTMODE (LAMBDA (X Y) (* kbr: "13-Feb-86 23:28") (PCBUS.WRITEHL 12 1796 X) (PCBUS.WRITEHL 12 1797 Y))) (TESTCM (LAMBDA NIL (* kbr: "15-Feb-86 11:14") (* Set up color tables. *) (for I from 4096 to 16383 do (PCBUS.WRITEHL PARAMADRH I (LOGXOR (LOGAND I 255) 255))))) ) (FILESLOAD BUSCOLOR) (* \DEBUG vars are temporary till I figure out bank switching. *) (RPAQQ \COLORNNCC.LOCKEDFNS (\COLORNNCC.SENDPAGE \COLORNNCC.PILOTBITBLT)) (RPAQQ \COLORNNCC.LOCKEDVARS (\COLORNNCC.BANK1 \COLORNNCC.BANK0 \DEBUG.CURSORRAN \DEBUG.SENDPAGERAN \DEBUG.CURSORINTERRUPTED \DEBUG.SENDPAGEINTERRUPTED)) (DECLARE: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (\COLORNNCC.INIT) ) (PUTPROPS COLORNNCC COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (4685 5616 (\COLORNNCC.CMD 4695 . 5178) (\COLORNNCC.PAR2 5180 . 5614)) (5617 7947 ( \COLORNNCC.INIT 5627 . 7945)) (7948 18345 (\COLORNNCC.STARTBOARD 7958 . 9539) ( \COLORNNCC.SENDCOLORMAPENTRY 9541 . 10089) (\COLORNNCC.SENDPAGE 10091 . 11747) (\COLORNNCC.PILOTBITBLT 11749 . 18343)) (18346 25083 (\COLORNNCC24.STARTBOARD 18356 . 19565) (\COLORNNCC24.STARTCOLOR 19567 . 20421) (\COLORNNCC24.SENDPAGE 20423 . 25081)) (25084 30973 (\COLORNNCC.DEMO 25094 . 25996) ( \COLORNNCC.DRAWLINE1 25998 . 28329) (\COLORNNCC.TEST3 28331 . 28786) (MYTEST 28788 . 29135) (TEST24 29137 . 30150) (TESTMODE 30152 . 30407) (TESTCM 30409 . 30971))))) STOP \ No newline at end of file diff --git a/lispusers/COLOROBJ b/lispusers/COLOROBJ new file mode 100644 index 00000000..ad5235f0 --- /dev/null +++ b/lispusers/COLOROBJ @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED " 4-Feb-87 23:58:42" {ERIS}LYRIC>COLOROBJ.;2 7868 changes to%: (VARS COLOROBJCOMS COLOROBJFNS) previous date%: "26-Feb-86 14:47:40" {ERIS}LYRIC>COLOROBJ.;1) (* " Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COLOROBJCOMS) (RPAQQ COLOROBJCOMS [(FNS * COLOROBJFNS) (FILES COLOR) (INITVARS (COLOROBJ.DEFAULT.COLOR 'RED)) (VARS (COLOROBJFNS '(COLOROBJ.CREATE COLOROBJ.DISPLAYFN COLOROBJ.GETFN COLOROBJ.IMAGEBOXFN COLOROBJ.PUTFN COLOROBJ.COPYFN COLOROBJ.WHENOPERATEDONFN)) (COLOROBJ.IMAGEFNS (IMAGEFNSCREATE (FUNCTION COLOROBJ.DISPLAYFN) (FUNCTION COLOROBJ.IMAGEBOXFN) (FUNCTION COLOROBJ.PUTFN) (FUNCTION COLOROBJ.GETFN) (FUNCTION COLOROBJ.COPYFN) (FUNCTION COLOROBJ.BUTTONEVENTFN) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION COLOROBJ.WHENOPERATEDONFN) (FUNCTION NILL]) (RPAQQ COLOROBJFNS (COLOROBJ.CREATE COLOROBJ.DISPLAYFN COLOROBJ.GETFN COLOROBJ.IMAGEBOXFN COLOROBJ.PUTFN COLOROBJ.COPYFN COLOROBJ.WHENOPERATEDONFN)) (DEFINEQ (COLOROBJ.CREATE [LAMBDA (COLOR) (* gbn "13-Jan-86 16:00") (* * create a color object. color is anything acceptable to dspcolor  (atoms on colornames, rgb triples, indices)) (LET ((COLOROBJ (IMAGEOBJCREATE NIL COLOROBJ.IMAGEFNS))) (IMAGEOBJPROP COLOROBJ 'COLOR (OR COLOR COLOROBJ.DEFAULT.COLOR)) COLOROBJ]) (COLOROBJ.DISPLAYFN [LAMBDA (COLOROBJ IMAGE.STREAM) (* gbn "13-Jan-86 17:51") (* On the display a color object shows up as the color name, otherwise it has  no image. On any stream it has the sideeffect of changing the foreground color) (LET* ((COLOR (IMAGEOBJPROP COLOROBJ 'COLOR)) (X (DSPXPOSITION NIL IMAGE.STREAM)) (Y (DSPYPOSITION NIL IMAGE.STREAM))) (DSPCOLOR COLOR IMAGE.STREAM) (SELECTQ (IMAGESTREAMTYPE IMAGE.STREAM) (DISPLAY (DSPFONT '(WEIGHT BOLD) IMAGE.STREAM) (LET* ((STRING (IMAGEOBJPROP COLOROBJ 'COLOR)) (STRINGREGION (STRINGREGION STRING IMAGE.STREAM)) (LEFT (ADD1 (fetch (REGION LEFT) of STRINGREGION))) (BOTTOM (fetch (REGION BOTTOM) of STRINGREGION)) (REGION (create REGION LEFT _ LEFT BOTTOM _ BOTTOM HEIGHT _ (IPLUS (fetch (REGION HEIGHT) of STRINGREGION) 2) WIDTH _ (IPLUS (fetch (REGION WIDTH) of STRINGREGION) 6))) (TOP (fetch (REGION TOP) of REGION)) (RIGHT (fetch (REGION RIGHT) of REGION))) (IMAGEOBJPROP COLOROBJ 'REGION REGION) (CENTERPRINTINREGION STRING REGION IMAGE.STREAM) (DRAWLINE LEFT BOTTOM LEFT (SUB1 TOP) 1 'INVERT IMAGE.STREAM) (DRAWLINE LEFT TOP (SUB1 RIGHT) TOP 1 'INVERT IMAGE.STREAM) (DRAWLINE RIGHT TOP RIGHT (ADD1 BOTTOM) 1 'INVERT IMAGE.STREAM) (DRAWLINE RIGHT BOTTOM (ADD1 LEFT) BOTTOM 1 'INVERT IMAGE.STREAM))) (NILL]) (COLOROBJ.GETFN [LAMBDA (INPUT.STREAM TEXTSTREAM) (* gbn "13-Jan-86 15:42") (* reads the COLOR and creates an  COLOROBJ) (COLOROBJ.CREATE (READ INPUT.STREAM]) (COLOROBJ.IMAGEBOXFN [LAMBDA (COLOROBJ IMAGE.STREAM CURRENT.X RIGHT.MARGIN) (* gbn "13-Jan-86 16:01") (* * Returns a null imagebox, except to the display, where it returns the size  of the box) (LET NIL (SELECTQ (IMAGESTREAMTYPE IMAGE.STREAM) (DISPLAY (create IMAGEBOX XSIZE _ (IPLUS (STRINGWIDTH (IMAGEOBJPROP COLOROBJ 'COLOR) (DSPFONT NIL IMAGE.STREAM)) 8) YSIZE _ (IPLUS (FONTHEIGHT (DSPFONT NIL IMAGE.STREAM)) 4) YDESC _ 4 XKERN _ 0)) (create IMAGEBOX XSIZE _ 0 YSIZE _ 0 YDESC _ 0 XKERN _ 0]) (COLOROBJ.PUTFN [LAMBDA (COLOROBJ OUTPUT.STREAM) (* gbn "13-Jan-86 15:57") (* prints only the color to the file) (PRINT (IMAGEOBJPROP COLOROBJ 'COLOR) OUTPUT.STREAM]) (COLOROBJ.COPYFN [LAMBDA (IMAGEOBJ FROMSTREAM TOSTREAM) (* gbn "13-Jan-86 15:58") (COLOROBJ.CREATE (IMAGEOBJPROP IMAGEOBJ 'COLOR) TOSTREAM]) (COLOROBJ.WHENOPERATEDONFN [LAMBDA (A B C C) (* gbn " 6-Jan-85 13:23") (* DUMMY) ]) ) (FILESLOAD COLOR) (RPAQ? COLOROBJ.DEFAULT.COLOR 'RED) (RPAQQ COLOROBJFNS (COLOROBJ.CREATE COLOROBJ.DISPLAYFN COLOROBJ.GETFN COLOROBJ.IMAGEBOXFN COLOROBJ.PUTFN COLOROBJ.COPYFN COLOROBJ.WHENOPERATEDONFN)) (RPAQ COLOROBJ.IMAGEFNS (IMAGEFNSCREATE (FUNCTION COLOROBJ.DISPLAYFN) (FUNCTION COLOROBJ.IMAGEBOXFN) (FUNCTION COLOROBJ.PUTFN) (FUNCTION COLOROBJ.GETFN) (FUNCTION COLOROBJ.COPYFN) (FUNCTION COLOROBJ.BUTTONEVENTFN) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION COLOROBJ.WHENOPERATEDONFN) (FUNCTION NILL))) (PUTPROPS COLOROBJ COPYRIGHT ("Xerox Corporation" 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1994 6812 (COLOROBJ.CREATE 2004 . 2428) (COLOROBJ.DISPLAYFN 2430 . 4799) ( COLOROBJ.GETFN 4801 . 5136) (COLOROBJ.IMAGEBOXFN 5138 . 6118) (COLOROBJ.PUTFN 6120 . 6406) ( COLOROBJ.COPYFN 6408 . 6601) (COLOROBJ.WHENOPERATEDONFN 6603 . 6810))))) STOP \ No newline at end of file diff --git a/lispusers/COLORPOLYGONS b/lispusers/COLORPOLYGONS new file mode 100644 index 00000000..7d3c9085 --- /dev/null +++ b/lispusers/COLORPOLYGONS @@ -0,0 +1 @@ +(FILECREATED " 3-Sep-86 22:07:11" {ERIS}LIBRARY>COLORPOLYGONS.;4 27440 changes to: (FNS MOTIONIT COLORPOLYGONS.ROTATECOLORMAP) previous date: " 6-Jun-86 00:35:47" {ERIS}LIBRARY>COLORPOLYGONS.;2) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT COLORPOLYGONSCOMS) (RPAQQ COLORPOLYGONSCOMS ((FNS COLORPOLYGONS COLORPOLYGON COLORPOLYGONS.ROTATECOLORMAP) (FNS BLACKHOLE BLACKHOLE1 COLORCONNECTPOLYS COLORDRAWPOLY1 DRAWCOLORPOLYSTEPS LENSE LINETEST MAPIT MAPIT2 MOTIONIT ONECOLORPOLY RANDOMPT) (INITVARS (MOTIONMAP) (ONEMAP) (PRETTYMAP)) (VARS MOTIONMAPCOLORS ONEMAPCOLORS PRETTYCOLORS))) (DEFINEQ (COLORPOLYGONS (LAMBDA (DS) (* kbr: " 6-Jun-86 00:16") (PROG (BITSPERPIXEL NPTS) (COND ((NULL DS) (SETQ DS (DSPCREATE (COLORSCREENBITMAP))) (DSPCLIPPINGREGION (LIST 0 0 (BITMAPWIDTH (COLORSCREENBITMAP)) (BITMAPHEIGHT (COLORSCREENBITMAP))) DS))) LP (COLORPOLYGON DS) (COLORPOLYGONS.ROTATECOLORMAP) (GO LP)))) (COLORPOLYGON (LAMBDA (DS) (* kbr: " 6-Jun-86 00:10") (PROG (NPTS) (COLORCONNECTPOLYS (for I from 1 to (SETQ NPTS (RAND 3 8)) collect (RANDOMPT DS)) (for I from 1 to NPTS collect (RANDOMPT DS)) (ITIMES 15 (RAND 3 4)) T 1 1 15 8 DS)))) (COLORPOLYGONS.ROTATECOLORMAP (LAMBDA NIL (* kbr: " 3-Sep-86 21:31") (PROG (BITSPERPIXEL) (SETQ BITSPERPIXEL (BITSPERPIXEL (COLORSCREENBITMAP))) (COND ((EQ BITSPERPIXEL 4) (OR MOTIONMAP (SETQ MOTIONMAP (COLORMAPCREATE MOTIONMAPCOLORS BITSPERPIXEL))) (OR PRETTYMAP (SETQ PRETTYMAP (COLORMAPCREATE PRETTYCOLORS BITSPERPIXEL))) (SETQ WAITTIME 70)) (T (OR MOTIONMAP (SETQ MOTIONMAP (COLORMAPCREATE (for I from 1 to 8 join (NCONC (for J from 0 to 255 by 8 collect (LIST 0 0 J)) (for J from 1 to 8 collect (QUOTE (128 128 128))))) BITSPERPIXEL))) (OR PRETTYMAP (SETQ PRETTYMAP (RAINBOWMAP 8))) (SETQ WAITTIME 20))) (SCREENCOLORMAP MOTIONMAP) (CD.QUITP 40) (until (CD.QUITP) do (ROTATECOLORMAP 1)) (SCREENCOLORMAP PRETTYMAP) (CD.QUITP 40) (until (CD.QUITP) do (ROTATECOLORMAP 1) (DISMISS WAITTIME))))) ) (DEFINEQ (BLACKHOLE (LAMBDA (PTLST DS DENSITY PERCENT) (* kbr: " 5-Jun-86 23:45") (* maps a list of points onto itself  repeatedly until closure) (PROG NIL (DSPFILL NIL NIL 0 DS) (BLACKHOLE1 PTLST DS (OR DENSITY 3) (OR PERCENT 30))))) (BLACKHOLE1 (LAMBDA (PTLST DS DENSITY PERCENT) (* kbr: " 5-Jun-86 23:46") (* maps a list of points onto itself  repeatedly until closure) (PROG (CENTERX CENTERY X Y OTHERPTS) (SETQ CENTERX (IQUOTIENT (for PT in PTLST sum (fetch (POSITION XCOORD) of PT)) (LENGTH PTLST))) (SETQ CENTERY (IQUOTIENT (for PT in PTLST sum (fetch (POSITION YCOORD) of PT)) (LENGTH PTLST))) (* make another polygon that is 80%%  of the way to the edge.) (SETQ OTHERPTS (for PT in PTLST collect (create POSITION XCOORD _ (COND ((IGREATERP (SETQ X (fetch (POSITION XCOORD) of PT)) CENTERX) (IPLUS CENTERX (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE X CENTERX)) 100))) (T (IDIFFERENCE CENTERX (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE CENTERX X)) 100)))) YCOORD _ (COND ((IGREATERP (SETQ Y (fetch (POSITION YCOORD) of PT)) CENTERY) (IPLUS CENTERY (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE Y CENTERY)) 100))) (T (IDIFFERENCE CENTERY (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE CENTERY Y)) 100))))))) (* make sure the number of steps is  integral to number of colors.) (* draw from the outer one into the  inner one, shifted by one) (DRAWCOLORPOLYSTEPS PTLST (SETQ OTHERPTS (APPEND (CDR OTHERPTS) (LIST (CAR OTHERPTS)))) (ITIMES (OR DENSITY 3) 15) T 1 (MAXIMUMCOLOR) DS) (COND ((AND (for PT in OTHERPTS thereis (IGREATERP (ABS (IDIFFERENCE CENTERX (fetch (POSITION XCOORD) of PT))) 20)) (for PT in OTHERPTS thereis (IGREATERP (ABS (IDIFFERENCE CENTERY (fetch (POSITION YCOORD) of PT))) 20))) (BLACKHOLE1 OTHERPTS DS (ADD1 DENSITY) PERCENT)))))) (COLORCONNECTPOLYS (LAMBDA (FROMS TOS NSTEPS CONNECTEDFLG INCOLOR? FROMCOLOR TOCOLOR TWEENCOLOR DS) (* kbr: " 6-Jun-86 00:03") (* draws the source and destination  polygons and shows the track taken by  the sides; then leaves the trace of  the polygon in tranformation) (SETQ LASTPOLYGONFROMS FROMS) (SETQ LASTPOLYGONTOS TOS) (ERSETQ (PROG NIL (DSPFILL NIL NIL NIL DS) (COLORDRAWPOLY1 FROMS 1 CONNECTEDFLG (OR FROMCOLOR INCOLOR?) DS) (COLORDRAWPOLY1 TOS 1 CONNECTEDFLG (OR TOCOLOR INCOLOR?) DS) (SETQ DIFFS (for FPT in FROMS as TPT in TOS do (DRAWBETWEEN FPT TPT 1 NIL DS (OR TWEENCOLOR 15)))) (DISMISS 1500) (DSPFILL NIL NIL NIL DS) (DRAWCOLORPOLYSTEPS FROMS TOS NSTEPS CONNECTEDFLG INCOLOR? TOCOLOR DS))))) (COLORDRAWPOLY1 (LAMBDA (PTLIST WIDTH CONNECT? COLOR DS) (* rrb "11-OCT-82 11:43") (* draws a closed polygon of the  points given) (COND (PTLIST (for PTA in PTLIST as PTB in (CDR PTLIST) do (DRAWBETWEEN PTA PTB WIDTH (DSPOPERATION NIL DS) DS (COND ((LISTP COLOR) (* COLOR can be a list of colors for  each side.) (PROG1 (CAR COLOR) (SETQ COLOR (COND ((CDR COLOR)) (T (CAR COLOR)))))) (T COLOR))) finally (AND CONNECT? (DRAWBETWEEN (CAR (LAST PTLIST)) (CAR PTLIST) WIDTH (DSPOPERATION NIL DS) DS (COND ((LISTP COLOR) (PROG1 (CAR COLOR) (SETQ COLOR (COND ((CDR COLOR)) (T (CAR COLOR)))))) (T COLOR))) DS)))) (BLOCK))) (DRAWCOLORPOLYSTEPS (LAMBDA (FROMS TOS NSTEPS CONNECTEDFLG FROMCOLOR MAXCOLOR DS) (* rrb "15-OCT-82 14:47") (PROG (DIFFS XFROMS) (SETQ XFROMS (COPY FROMS)) (SETQ DIFFS (for FPT in XFROMS as TPT in TOS collect (create POSITION XCOORD _ (IDIFFERENCE (fetch (POSITION XCOORD) of TPT) (fetch (POSITION XCOORD) of FPT)) YCOORD _ (IDIFFERENCE (fetch (POSITION YCOORD) of TPT) (fetch (POSITION YCOORD) of FPT))))) (for I from 1 to NSTEPS do (COLORDRAWPOLY1 XFROMS 1 CONNECTEDFLG (COND ((FIXP FROMCOLOR) (COND ((IGREATERP FROMCOLOR MAXCOLOR) (SETQ FROMCOLOR 1))) (PROG1 FROMCOLOR (SETQ FROMCOLOR (ADD1 FROMCOLOR)))) (T FROMCOLOR)) DS) (for PT in XFROMS as DIF in DIFFS as FROMPT in FROMS do (replace (POSITION XCOORD) of PT with (IPLUS (fetch (POSITION XCOORD) of FROMPT) (IQUOTIENT (ITIMES (fetch (POSITION XCOORD) of DIF) I) NSTEPS))) (replace (POSITION YCOORD) of PT with (IPLUS (fetch (POSITION YCOORD) of FROMPT) (IQUOTIENT (ITIMES (fetch (POSITION YCOORD) of DIF) I) NSTEPS)))) finally (COLORDRAWPOLY1 XFROMS 1 CONNECTEDFLG (COND ((FIXP FROMCOLOR) (COND ((IGREATERP FROMCOLOR MAXCOLOR ) (SETQ FROMCOLOR 1))) (PROG1 FROMCOLOR (SETQ FROMCOLOR (ADD1 FROMCOLOR )))) (T FROMCOLOR)) DS)) (RETURN FROMCOLOR)))) (LENSE (LAMBDA (PTLST DS DENSITY PERCENT OUTTOOFLG) (* kbr: " 5-Jun-86 23:52") (* maps a list of points onto itself  repeatedly until closure) (PROG (CENTERX CENTERY X Y OTHERPTS MAXCOLOR ENDCOLOR) (SETQ CENTERX (IQUOTIENT (for PT in PTLST sum (fetch (POSITION XCOORD) of PT)) (LENGTH PTLST))) (SETQ CENTERY (IQUOTIENT (for PT in PTLST sum (fetch (POSITION YCOORD) of PT)) (LENGTH PTLST))) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL (COLORSCREENBITMAP)))) (DSPFILL NIL NIL NIL DS) (* make another polygon that is 80%%  of the way to the edge.) (SETQ OTHERPTS (for PT in PTLST collect (create POSITION XCOORD _ (COND ((IGREATERP (SETQ X (fetch (POSITION XCOORD) of PT)) CENTERX) (IPLUS CENTERX (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE X CENTERX)) 100))) (T (IDIFFERENCE CENTERX (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE CENTERX X)) 100)))) YCOORD _ (COND ((IGREATERP (SETQ Y (fetch (POSITION YCOORD) of PT)) CENTERY) (IPLUS CENTERY (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE Y CENTERY)) 100))) (T (IDIFFERENCE CENTERY (IQUOTIENT (ITIMES PERCENT (IDIFFERENCE CENTERY Y)) 100))))))) (* make sure the number of steps is  integral to number of colors.) (* draw from the outer one into the  inner one, shifted by one) (SETQ ENDCOLOR (DRAWCOLORPOLYSTEPS PTLST (CONS (CAR (LAST OTHERPTS)) (BUTLAST OTHERPTS)) (ITIMES (OR DENSITY 3) 15) T 1 MAXCOLOR DS)) (* draw from the inner polygon to the  outer one shifted by two sides) (AND OUTTOOFLG (DRAWCOLORPOLYSTEPS (APPEND (CDR OTHERPTS) (LIST (CAR OTHERPTS))) PTLST (ITIMES (OR DENSITY 3) 15) T ENDCOLOR MAXCOLOR DS))))) (LINETEST (LAMBDA (DS) (for Y from 100 to 400 by 300 do (for I from 100 to 400 by 20 do (DRAWLINE 250 250 I Y 1 NIL DS (RAND 1 15)))) (for X from 100 to 400 by 300 do (for I from 100 to 400 by 20 do (DRAWLINE 250 250 X I 1 NIL DS (RAND 1 15)))))) (MAPIT (LAMBDA (PTLST DS DENSITY) (* kbr: " 5-Jun-86 23:52") (* maps a list of points onto itself) (DSPFILL NIL NIL NIL DS) (DRAWCOLORPOLYSTEPS PTLST (SETQ PTLST (APPEND (CDR PTLST) (CONS (CAR PTLST)))) (ITIMES (OR DENSITY 3) 15) T 1 (MAXIMUMCOLOR (BITSPERPIXEL (COLORSCREENBITMAP))) DS))) (MAPIT2 (LAMBDA (N DS DENSITY) (* kbr: " 5-Jun-86 23:53") (* create a random list of N points  and maps it onto N others.) (PROG (ORGPOINTS NOWCOLOR MAXCOLOR) (SETQ ORGPOINTS (for I from 1 to N collect (RANDOMPT DS))) (SETQ NOWCOLOR 1) (SETQ MAXCOLOR (MAXIMUMCOLOR (BITSPERPIXEL (COLORSCREENBITMAP)))) (DSPFILL NIL NIL NIL DS) (SETQ STARTPTS ORGPOINTS) (* make sure the number of steps is  integral to number of colors.) (for COUNTER from 1 to N do (* make the first pt of the new set  the same as the last pt of the  previous one.) (SETQ NEWPTS (COND ((EQ COUNTER N) (* for the past group, return to the  starting points.) ORGPOINTS) (T (CONS (CAR (LAST STARTPTS)) (COND ((EQ COUNTER (SUB1 N)) (* for next to last group make the  last point the same as the start.) (NCONC1 (for I from 1 to (IDIFFERENCE N 2) collect (RANDOMPT DS)) (CAR ORGPOINTS))) (T (for I from 1 to (SUB1 N) collect (RANDOMPT DS)))))))) (SETQ NOWCOLOR (DRAWCOLORPOLYSTEPS STARTPTS NEWPTS (ITIMES (OR DENSITY 3) 15) NIL NOWCOLOR MAXCOLOR DS)) (SETQ STARTPTS NEWPTS))))) (MOTIONIT (LAMBDA (WINDOW) (* kbr: " 3-Sep-86 22:06") (PROG NIL LP (SCREENCOLORMAP ONEMAP) (ONECOLORPOLY (RAND 3 4) 45 T 1 1 15 8 WINDOW) (DISMISS 2000) (SCREENCOLORMAP MOTIONMAP) (CD.QUITP 10) (until (CD.QUITP) do (ROTATECOLORMAP 1) (DISMISS 75)) (SCREENCOLORMAP PRETTYMAP) (CD.QUITP 20) (until (CD.QUITP) do (ROTATECOLORMAP 1) (DISMISS 75)) (SCREENCOLORMAP ONEMAP) (DISMISS 2000) (GO LP)))) (ONECOLORPOLY (LAMBDA (NPOINTS NSTEPS CONNECTED? INCOLOR? FROMCOLOR TOCOLOR TWEENCOLOR DS) (* rrb "11-OCT-82 11:41") (* draws a polygon figure on the display stream DS.  INCOLOR? can be NIL for black and white case, a color number for the increment  each polygons case, or a list of color numbers to be used for each edge of the  polygons.) (COLORCONNECTPOLYS (for I from 1 to NPOINTS collect (RANDOMPT DS)) (for I from 1 to NPOINTS collect (RANDOMPT DS)) (OR NSTEPS POLYGONSTEPS) CONNECTED? INCOLOR? TOCOLOR FROMCOLOR TWEENCOLOR DS))) (RANDOMPT (LAMBDA (DS) (* kbr: " 6-Jun-86 00:01") (PROG (REG) (SETQ REG (DSPCLIPPINGREGION NIL DS)) (RETURN (create POSITION XCOORD _ (RAND (fetch (REGION LEFT) of REG) (fetch (REGION RIGHT) of REG)) YCOORD _ (RAND (fetch (REGION BOTTOM) of REG) (fetch (REGION TOP) of REG))))))) ) (RPAQ? MOTIONMAP ) (RPAQ? ONEMAP ) (RPAQ? PRETTYMAP ) (RPAQQ MOTIONMAPCOLORS ((0 0 0) (0 0 0) (0 0 0) (0 0 0) (0 0 0) (0 0 0) (0 0 0) (0 0 79) (0 0 126) (0 0 168) (0 0 199) (0 0 255) (0 0 0) (0 0 0) (0 0 0) (0 0 0))) (RPAQQ ONEMAPCOLORS ((100 100 100) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0) (255 0 0))) (RPAQQ PRETTYCOLORS ((0 0 0) (255 0 0) (255 206 0) (255 255 0) (128 255 0) (0 255 0) (0 255 128) (0 255 255) (0 128 255) (0 0 255) (128 0 255) (255 0 255) (255 128 255) (217 210 195) (160 172 180) (203 161 75))) (PUTPROPS COLORPOLYGONS COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (876 3221 (COLORPOLYGONS 886 . 1403) (COLORPOLYGON 1405 . 1808) ( COLORPOLYGONS.ROTATECOLORMAP 1810 . 3219)) (3222 25720 (BLACKHOLE 3232 . 3670) (BLACKHOLE1 3672 . 8507 ) (COLORCONNECTPOLYS 8509 . 9805) (COLORDRAWPOLY1 9807 . 11661) (DRAWCOLORPOLYSTEPS 11663 . 15717) ( LENSE 15719 . 20419) (LINETEST 20421 . 20841) (MAPIT 20843 . 21355) (MAPIT2 21357 . 23757) (MOTIONIT 23759 . 24427) (ONECOLORPOLY 24429 . 25187) (RANDOMPT 25189 . 25718))))) STOP \ No newline at end of file diff --git a/lispusers/COMMENTHACKS b/lispusers/COMMENTHACKS new file mode 100644 index 00000000..8a3c1b25 --- /dev/null +++ b/lispusers/COMMENTHACKS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "11-Dec-87 13:33:22" {DSK}COMMENTHACKS.;7 14426 changes to%: (FNS MYSUPERPRINT/COMMENT2 MYSUPERPRINT/COMMENT EDITDEF.FUNCTIONS FIXDEFUNEDITDATE COMMENT2 MYEDITDATE? EDITDATE?) (VARS COMMENTHACKSCOMS) (FUNCTIONS FOOFUNCTIONS) (PROPS (COMMENTHACKS MAKEFILE-ENVIRONMENT)) previous date%: "10-Dec-87 10:58:48" {DSK}COMMENTHACKS.;1) (* " Copyright (c) 1987 by Unisys Corp.. All rights reserved. ") (PRETTYCOMPRINT COMMENTHACKSCOMS) (RPAQQ COMMENTHACKSCOMS ((FNS EDITDEF.FUNCTIONS FIXDEFUNEDITDATE MYEDITDATE? MYSUPERPRINT/COMMENT MYSUPERPRINT/COMMENT2) (P (MOVD 'MYEDITDATE? 'EDITDATE?) (MOVD 'MYSUPERPRINT/COMMENT 'SUPERPRINT/COMMENT)) (PROP EDITDEF FUNCTIONS) (PROP (MAKEFILE-ENVIRONMENT FILETYPE) COMMENTHACKS) (EDITHIST COMMENTHACKS))) (DEFINEQ (EDITDEF.FUNCTIONS [LAMBDA (NAME TYPE SOURCE EDITCOMS OPTIONS) (* ; "Edited 10-Dec-87 10:37 by DJVB") (LET [(DEF (GETDEF NAME TYPE SOURCE '(EDIT NOCOPY] (SETQ RETRY NIL) (EDITE DEF EDITCOMS NAME TYPE [FUNCTION (LAMBDA (NAME DEF TYPE EXITFLG) (MARKASCHANGED NAME TYPE 'CHANGED) (FIXDEFUNEDITDATE DEF) (PUTDEF NAME TYPE DEF] OPTIONS) (* ; "AND SAY WE EDITED IT") T]) (FIXDEFUNEDITDATE [LAMBDA (EXPR) (* ; "Edited 10-Dec-87 10:42 by DJVB") (* ;; "Inserts or replaces previous edit date in a (DEFUN f (args) (DECLARE --)... %"doc string%" EDITDATE body") (AND INITIALS (LISTP EXPR) (FMEMB (CAR EXPR) '(CL:DEFUN DEFMACRO ) ) (LISTP (CDDR EXPR)) (PROG ((E (CDDDR EXPR))) RETRY (COND ((NLISTP E) (RETURN)) ((LISTP (CAR E)) (SELECTQ (CAAR E) ((DECLARE) (SETQ E (CDR E)) (GO RETRY)) (BREAK1 (COND ((EQ (CAR (CADAR E)) 'PROGN) (SETQ E (CDR (CADAR E))) (GO RETRY)))) (ADV-PROG (* No easy way to mark cleanly the date of an advised function) (RETURN)) NIL)) ((STRINGP (CAR E)) (* ; "DOC STRING") (SETQ E (CDR E)) (GO RETRY))) (COND ((AND (LISTP (CDR E)) (EDITDATE? (CAR E))) (/RPLACA E (EDITDATE (CAR E) INITIALS))) (T (/ATTACH (EDITDATE NIL INITIALS) E))) (RETURN EXPR]) (MYEDITDATE? [LAMBDA (COMMENT) (* ; "Edited 10-Dec-87 13:50 by DJVB") (AND *REPLACE-OLD-EDIT-DATES* (LISTP COMMENT) (SUPERPRINTEQ (CAR COMMENT) COMMENTFLG) (LISTP (CDR COMMENT)) (LISTP (CDDR COMMENT)) (NULL (CDDDR COMMENT)) (STRINGP (CADDR COMMENT)) (LET ((C2 (CADR COMMENT))) (AND (NOT (SUPERPRINTEQ C2 COMMENTFLG)) (OR (EQ C2 INITIALS) (COND [(LITATOM C2) (COND [(EQ C2 ';) (AND (STRPOS "Edited " (CADDR COMMENT) 1 NIL T) (GREATERP (CL:LENGTH (CADDR COMMENT)) (CONSTANT (CL:LENGTH "Edited 01-jan-86 00:00 by X"] (T (NOT (for PC from 1 to (NCHARS C2) always (EQ (NTHCHARCODE C2 PC) (CHARCODE ;] (T (AND (STRINGP C2) (IGREATERP 12 (NCHARS C2]) (MYSUPERPRINT/COMMENT [LAMBDA (L FILE) (* ; "Edited 11-Dec-87 13:32 by DJVB") (COND ((AND **COMMENT**FLG (NOT FILEFLG) (NOT MAKEMAP)) (AND (GREATERP (PLUS (DSPXPOSITION NIL FILE) (STRINGWIDTH **COMMENT**FLG FILE)) (DSPRIGHTMARGIN NIL FILE)) (PRINENDLINE 0 FILE)) (PRIN1S **COMMENT**FLG NIL FILE)) (T (LET (COMMENT-LMARGIN COMMENT-RMARGIN RIGHTFLG FLUSH-LEFTP SEMIP BODY) (DECLARE (SPECVARS RIGHTFLG)) [SETQ RIGHTFLG (NOT (if (SUPERPRINTEQ (CADR L) COMMENTFLG) elseif (SETQ SEMIP (SEMI-COLON-COMMENT-P L)) then (NEQ SEMIP 1) else (GREATERP (LENGTH L) 10] [COND (RIGHTFLG (SETQ COMMENT-LMARGIN (OR COMMENTCOL (SUPERPRINT/COMMENT1 L RMARGIN FILE) )) (SETQ COMMENT-RMARGIN RMARGIN)) ((AND (EQ SEMIP 3) (NOT MAKEMAP)) (SETQ COMMENT-LMARGIN 0) (SETQ COMMENT-RMARGIN RMARGIN)) (T (SETQ COMMENT-LMARGIN (FIXR (TIMES RMARGIN 0.1))) (SETQ COMMENT-RMARGIN (DIFFERENCE RMARGIN COMMENT-LMARGIN)) (CL:IF (EQ COMMENT-LMARGIN (DSPXPOSITION NIL FILE)) (SETQ RIGHTFLG T] (CL:IF (GREATERP (DSPXPOSITION NIL FILE) COMMENT-LMARGIN) (PRINENDLINE COMMENT-LMARGIN FILE) (DSPXPOSITION COMMENT-LMARGIN FILE)) (OR RIGHTFLG (PRINENDLINE COMMENT-LMARGIN FILE)) (SETFONT (PROG1 (SETFONT COMMENTFONT FILE) (CL:IF (AND SEMIP (NOT MAKEMAP) [STRINGP (SETQ BODY (CAR (LISTP (CDR (LISTP (CDR L] (NULL (CDDDR L)) (OR (IMAGESTREAMP FILE) *PRINT-SEMICOLON-COMMENTS*)) (PRIN2-LONG-STRING BODY FILE NIL NIL COMMENT-LMARGIN COMMENT-RMARGIN T SEMIP) (MYSUPERPRINT/COMMENT2 L COMMENT-LMARGIN (IQUOTIENT (PLUS COMMENT-LMARGIN COMMENT-RMARGIN) 2) COMMENT-RMARGIN FILE))) FILE) (CL:IF (OR (AND SEMIP (NOT MAKEMAP)) (NOT RIGHTFLG)) (PRINENDLINE 0 FILE)) L]) (MYSUPERPRINT/COMMENT2 [LAMBDA (CMT COMMENT-LMARGIN COMMENT-MIDPOINT COMMENT-RMARGIN FILE SEMIN) (* ; "Edited 11-Dec-87 13:31 by DJVB") (* ;  "SEMIN USED IN RECURSIVE CALLS TO PASS DOWN SEMI LEVEL") (if (EQ *PRINT-SEMICOLON-COMMENTS* 'ALL) then (* ;; "Print comment between given margins. Use 2 semis if (* * --) or (* --) over 10 long, otherwise use one semi.") (LET* ((SEMI (OR SEMIN (if (OR (AND (SUPERPRINTEQ (CADR CMT) COMMENTFLG) (SETQ CMT (CDR CMT))) (GREATERP (LENGTH CMT) 10)) then 2 else 1))) (SEMIS (if (EQ SEMI 2) then ";;" else ";"))) (OR SEMIN (SETQ CMT (CDR CMT))) (* ; "IF TOP LEVEL, SKIP *") (SETQ FILE (\GETSTREAM FILE 'OUTPUT)) (AND (EQ (DSPXPOSITION NIL FILE) COMMENT-LMARGIN) (PRINOPEN TAIL SEMIS FILE)) (* ;  "does PRIN3, but only do if still at left") (for TAIL on CMT bind LASTITEM THISITEM finally (if TAIL then (PRINDOTP TAIL FILE)) do (SETQ THISITEM (CAR TAIL)) [if (OR (EQ LASTITEM '-) (AND (GEQ (DSPXPOSITION NIL FILE) COMMENT-MIDPOINT) (NOT (LISTP THISITEM)) (LITATOM LASTITEM) (SELCHARQ (NTHCHARCODE LASTITEM -1) ((; %. -) T) NIL))) then (PRINENDLINE COMMENT-LMARGIN FILE) (PRINOPEN TAIL SEMIS FILE) else (if [AND (NEQ CMT TAIL) (OR (LISTP LASTITEM) (NOT (MEMB THISITEM '(%. %, ; %:] then (SUPERPRINT/SPACE FILE)) (OR (LISTP THISITEM) (STRINGP THISITEM) (if (GEQ (PLUS (DSPXPOSITION NIL FILE) (STRINGWIDTH THISITEM (OR FILE *STANDARD-OUTPUT*) T) (STRINGWIDTH (if (CDR TAIL) then " " else ")") (OR FILE *STANDARD-OUTPUT*))) COMMENT-RMARGIN) then (PRINENDLINE COMMENT-LMARGIN FILE) (PRINOPEN TAIL SEMIS FILE] (SETQ LASTITEM THISITEM) (if (LISTP LASTITEM) then (MYSUPERPRINT/COMMENT2 LASTITEM COMMENT-LMARGIN COMMENT-MIDPOINT COMMENT-RMARGIN FILE SEMI) elseif (STRINGP LASTITEM) then (PRIN2-LONG-STRING LASTITEM FILE NIL TAIL COMMENT-LMARGIN COMMENT-RMARGIN T SEMI) else (PRIN2S LASTITEM TAIL FILE))) (PRINSHUT TAIL NIL FILE) (* ; "IN CASE MAKING MAP") (* ;  "AND FORCE NEWLINE IN MYSUPERPRINT/COMMENT") (SETQ RIGHTFLG NIL)) else (* ; "Do it the old way as (* --)") (SUPERPRINT/COMMENT2 CMT COMMENT-LMARGIN COMMENT-MIDPOINT COMMENT-RMARGIN FILE]) ) (MOVD 'MYEDITDATE? 'EDITDATE?) (MOVD 'MYSUPERPRINT/COMMENT 'SUPERPRINT/COMMENT) (PUTPROPS FUNCTIONS EDITDEF EDITDEF.FUNCTIONS) (PUTPROPS COMMENTHACKS MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (PUTPROPS COMMENTHACKS FILETYPE :TCOMPL) (DECLARE%: DONTCOPY (ADDTOVAR EDITHISTALIST (COMMENTHACKS ("10-Dec-87 10:59:27" DJVB {DSK}COMMENTHACKS.;1 (COMMENT2 EDITDATE? MYEDITDATE? MYSUPERPRINT/COMMENT EDITDEF.FUNCTIONS FIXDEFUNEDITDATE)) ("10-Dec-87 17:09:35" DJVB {DSK}COMMENTHACKS.;3 (MYSUPERPRINT/COMMENT COMMENT2 MYSUPERPRINT/COMMENT2 MYEDITDATE?) (STUFF TO GET EDITDATE INTO FUNCTIONS AND PRINT SEMICOLON COMMENTS FOR EVERYTHING)) ("11-Dec-87 12:49:30" DJVB {DSK}COMMENTHACKS.;4 ( MYSUPERPRINT/COMMENT2 )) ("11-Dec-87 12:52:55" DJVB {DSK}COMMENTHACKS.;6 ( EDITDEF.FUNCTIONS FIXDEFUNEDITDATE ) (FIXED DETAILS)) ("11-Dec-87 13:33:43" DJVB {DSK}COMMENTHACKS.;7 ( MYSUPERPRINT/COMMENT2 MYSUPERPRINT/COMMENT ) (FIXING DETAILS)))) ) (PUTPROPS COMMENTHACKS COPYRIGHT ("Unisys Corp." 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1135 12019 (EDITDEF.FUNCTIONS 1145 . 1784) (FIXDEFUNEDITDATE 1786 . 3426) (MYEDITDATE? 3428 . 4692) (MYSUPERPRINT/COMMENT 4694 . 7753) (MYSUPERPRINT/COMMENT2 7755 . 12017))))) STOP ˙ \ No newline at end of file diff --git a/lispusers/COMMON-MAKE b/lispusers/COMMON-MAKE new file mode 100644 index 00000000..6d64ebb6 --- /dev/null +++ b/lispusers/COMMON-MAKE @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "11-Dec-87 14:48:16" {DSK}COMMON-MAKE.;5 15290 changes to%: (VARS COMMON-MAKECOMS) (FNS COMMON-FILE-COMMAND COMMON-MAKEFILE) (PROPS (COMMON-MAKE MAKEFILE-ENVIRONMENT)) previous date%: "11-Dec-87 12:53:46" {DSK}COMMON-MAKE.;1) (* " Copyright (c) 1987 by Unisys Corp.. All rights reserved. ") (PRETTYCOMPRINT COMMON-MAKECOMS) (RPAQQ COMMON-MAKECOMS ((* FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES) (FNS COMMON-FILE-COMMAND COMMON-MAKEFILE) (PROP MAKEFILE-ENVIRONMENT COMMON-MAKE) (EDITHIST COMMON-MAKE))) (* FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES) (DEFINEQ (COMMON-FILE-COMMAND [LAMBDA (COMMAND) (* ; "Edited 11-Dec-87 14:46 by DJVB") (* THE NEW COMMONLISP COMMANDS ARE MOSTLY MACROS TO THINGS THIS HANDLES) (SELECTQ (SETQ TYPE (GETFILEPKGTYPE (CAR COMMAND) 'COMMAND)) (FNS [for FN in (PRETTYCOM1 COMMAND T T) bind DEF do (SETQ DEF (GETDEF FN 'FNS)) (CL:PPRINT (SELECTQ (CAR DEF) (CL:LAMBDA `(CL:DEFUN (\, FN) ,@(CDR DEF) ) ) (LAMBDA `(CL:DEFUN (\, FN) (&OPTIONAL ,@(CADR DEF)) ,@(CDDR DEF)) ) (HELP "UNSUPPORTED LAMBDA" (CAR DEF]) (DECLARE%: [FOR DEC IN (PRETTYCOM1 COMMAND T T) BIND (CND _ '(CL:LOAD CL:EVAL)) DO (SELECTQ DEC ((EVAL@LOADWHEN EVAL@COMPILEWHEN COPYWHEN) (HELP)) ((FIRST NOTFIRST)) (COMPILERVARS (RETURN)) ((COPY DOCOPY) (SETQ CND (CL:ADJOIN 'CL:LOAD CND))) ((DOEVAL@COMPILE EVAL@COMPILE) (SETQ CND (CL:ADJOIN 'CL:COMPILE CND))) ((DOEVAL@LOAD EVAL@LOAD) (SETQ CND (CL:ADJOIN 'CL:LOAD CND))) (DONTCOPY (SETQ CND (CL:REMOVE 'CL:LOAD CND))) (DONTEVAL@COMPILE (SETQ CND (CL:REMOVE 'CL:COMPILE CND))) (DONTEVAL@LOAD (SETQ CND (CL:REMOVE 'CL:EVAL CND))) (PROGN (CL:FORMAT T "~&(EVAL-WHEN ~S " CND) (COMMON-FILE-COMMAND DEC) (CL:FORMAT T ")"]) (SPECVARS [CL:PPRINT `(PROCLAIM (SPECIAL ,@(PRETTYCOM1 COMMAND T T]) (GLOBALVARS [CL:PPRINT `(PROCLAIM (USER::GLOBAL ,@(PRETTYCOM1 COMMAND T T]) (LOCALVARS [CL:PPRINT `(PROCLAIM (USER::LEXICAL ,@(PRETTYCOM1 COMMAND T T]) ((PROP IFPROP) [LET ((IFFLG (EQ (CAR COMMAND) PROP)) (PROP (CADR COMMAND)) (ATMS (PRETTYCOM1 (CDR COMMAND) T T))) (IF (LISTP PROP) THEN [FOR PRP IN PROP DO (for ATM in ATMS when (OR IFFLG (GET ATM PRP)) do (CL:PPRINT `(CL:SETF (GET ',ATM ',PRP) ',(GET ATM PRP] ELSEIF (EQ PROP 'ALL) THEN (* ALL PROPERTIES) [FOR ATM IN ATMS DO (FOR PAIR ON (GETPROPLIST ATM) BY (CDDR PAIR) UNLESS (MEMB (CAR PAIR) SYSPROPS) DO (CL:PPRINT `(CL:SETF [GET ',ATM ',(CAR PAIR] ',(CADR PAIR] ELSE (for ATM in ATMS when (OR (NOT IFFLG) (GET ATM PROP)) do (CL:PPRINT `(CL:SETF (GET ',ATM ',PROP) ',(GET ATM PROP]) (PROPS [FOR AP in (PRETTYCOM1 (CDR COMMAND) T T) do (CL:PPRINT `(CL:SETF [GET ',(CAR AP) ',(CADR AP] ',(GET (CAR AP) (CADR AP]) (P (for PTHIS in (PRETTYCOM1 COMMAND T) do (CL:PPRINT PTHIS))) (MACROS (HELP "I THOUGHT YOU TRANSORED ALL THOSE MACROS" COMMAND)) ((VARS ARRAY) [for VAR in (PRETTYCOM1 COMMAND T T) do (CL:PPRINT (if (LITATOM VAR) then `(CL:DEFPARAMETER (\, VAR) ',(GETTOPVAL VAR) ) else `(CL:DEFPARAMETER (\, (CAR VAR)) ',(CADR VAR) ) ]) (INITVARS [FOR VAR IN (PRETTYCOM1 COMMAND T T) DO (CL:PPRINT (IF (LITATOM VAR) THEN `(CL:DEFVAR (\, VAR) NIL) ELSE (IF (SUPERPRINTEQ (CAR VAR) COMMENTFLG) THEN VAR ELSE `(CL:DEFVAR (\,@ VAR) ) ]) (CONSTANTS [VARS (FOR VAR IN (PRETTYCOM1 COMMAND T T) DO (CL:PPRINT (IF (LITATOM VAR) THEN `(CL:DEFCONSTANT (\, VAR) ',(GETTOPVAL VAR) ) ELSE `(CL:DEFCONSTANT (\, (CAR VAR)) ',(CADR VAR) ) ]) ((UGLYVARS HORRIBLEVARS) [LET ((*PRINT-CIRCLE* T)) (DECLARE (SPECVARS *PRINT-CIRCLE*)) (FOR VAR IN (PRETTYCOM1 COMMAND T T) DO (CL:PPRINT `(DEFPARAMETER ,VAR ',(GETTOPVAL VAR]) (ADDVARS [for AV in (PRETTYCOM1 COMMAND T T) do (CL:PPRINT (if (CDDR AV) then `[SETQ ,(CAR AV) (UNION ',(CDR AV) ,(CAR AV] else `(CL:PUSHNEW ',(CADR AV) ,(CAR AV]) (APPENDVARS [FOR AV IN (PRETTYCOM1 COMMAND T T) DO (CL:PPRINT `(SETQ ,(CAR AV) (CL:APPEND ,(CAR AV) ',(CDR AV]) (E (HELP "I HOPE THIS %"E%"KNOWS WHAT ITS DOING" COMMAND) (FOR EXP IN (PRETTYCOM1 COMMAND T) DO (EVAL EXP))) ((FILEPKGCOMS I.S.OPRS TEMPLATES BLOCKS EXPORT EDITHIST) (* JUST IGNORE THESE) NIL) ((RECORDS INITRECORDS SYSRECORDS) (HELP "I THOUGHT YOU TRANSORED ALL THOSE RECORDS" COMMAND)) (COMS (FOR COM IN (PRETTYCOM1 COMMAND T) DO (COMMON-FILE-COMMAND COM))) (ORIGINAL (* COMS, BUT WITHOUT ANY USER DEFINED  COMMANDS) (LET* ((PRTTYTEM (PRETTYCOM1 COMMAND T)) (ORIGFLG T)) (DECLARE (SPECVARS ORIGFLG)) (for COM in PRTTYTEM do (COMMON-FILE-COMMAND COM)))) (FILES (* INSIDE LISTP%: FROM dir SOURCE COMPILED LOAD LOADCOMP LOADFROM SYSLOAD PROP  ALLPROP) (* REQUIRE IS NOT IDENTICAL, BUTS IS AS CLOSE AS CL GETS) [for F in (PRETTYCOM1 COMMAND T T) bind DIR PLACE do (if (LISTP F) then (if (SETQ PLACE (MEMB 'FROM F)) then (SETQ DIR (LIST (CADR PLACE))) else (HELP "FILES OPTION?" F)) else (CL:PPRINT `(CL:REQUIRE ,F ,@DIR]) (* (IF (EQ (CADR COMMAND) '*) THEN (BOUT *STANDARD-OUTPUT* (CHARCODE FORM)) ELSE (TERPRI) (TERPRI) (TERPRI)) (PRINTDEF COMMAND NIL T) (TERPRI) (TERPRI)) (LET (MACRO) (if (SETQ MACRO (CDR (ASSOC (CAR COMMAND) PRETTYDEFMACROS))) then (for COM in (SUBPAIR (CAR MACRO) (PRETTYCOM1 COMMAND T T) (CDR MACRO)) do (COMMON-FILE-COMMAND COM)) else (HELP "CAN'T HANDLE" (CAR COMMAND]) (COMMON-MAKEFILE [LAMBDA (FILE DEBUG) (* ; "Edited 11-Dec-87 13:25 by DJVB") (PROG ((*PRINT-SEMICOLON-COMMENTS* 'ALL) (*PRINT-ARRAY* T) (*PRINT-STRUCTURE* T) **COMMENTFLG** FONTCHANGEFLG *PRINT-LENGTH* *PRINT-LEVEL* %#RPARS) (DECLARE (SPECVARS *PRINT-SEMICOLON-COMMENTS* *PRINT-ARRAY* *PRINT-STRUCTURE* **COMMENTFLG** FONTCHANGEFLG *PRINT-LENGTH* *PRINT-LEVEL* %#RPARS)) (RETURN (PROG [(*STANDARD-OUTPUT* (OPENSTREAM (PACKFILENAME 'EXTENSION 'LISP 'BODY FILE) 'OUTPUT] (DECLARE (SPECVARS *STANDARD-OUTPUT*)) (RETURN (CL:UNWIND-PROTECT (PROG (DATES FILEILNAME PKGNAME BASE (*PACKAGE* *PACKAGE*) (*PRINT-BASE* *PRINT-BASE*) (*READTABLE* (FIND-READTABLE "LISP")) ) (DECLARE (SPECVARS *PACKAGE* *PRINT-BASE* *READTABLE*)) (SETQ DATES (GETPROP (SETQ FILEILNAME (CL:INTERN (STRING FILE) "IL")) 'FILEDATES)) (SETQ PKGNAME (OR (LISTGET (GETPROP FILEILNAME 'MAKEFILE-ENVIRONMENT) :PACKAGE) "USER")) (SETQ BASE (OR (LISTGET (GETPROP FILEILNAME ' MAKEFILE-ENVIRONMENT ) :BASE) 10)) (CL:FORMAT T ";;; -*- Mode: LISP; Syntax: Common-lisp; Package: ~A; Base: ~A -*-" PKGNAME BASE) (SETQ *PACKAGE* (CL:FIND-PACKAGE PKGNAME)) (SETQ *PRINT-BASE* BASE) (CL:FORMAT T "~%%;;; File converted ~A from source ~A" (DATE) FILE) (AND DATES (CL:FORMAT T "~&;;; Original source ~A created ~A" (CDAR DATES) (CAAR DATES))) (for P in (LISTP (GETTOPVAL (FILECOMS FILE))) do (COMMON-FILE-COMMAND P)) (RETURN (FULLNAME *STANDARD-OUTPUT*))) (CLOSEF *STANDARD-OUTPUT*]) ) (PUTPROPS COMMON-MAKE MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (DECLARE%: DONTCOPY (ADDTOVAR EDITHISTALIST (COMMON-MAKE ("11-Dec-87 12:54:22" DJVB {DSK}COMMON-MAKE.;1 (COMMON-FILE-COMMAND COMMON-MAKEFILE)) ("11-Dec-87 13:35:35" DJVB {DSK}COMMON-MAKE.;2 ( COMMON-FILE-COMMAND COMMON-MAKEFILE ) (GETTING DETAILS RIGHT)) ("11-Dec-87 13:40:48" DJVB {DSK}COMMON-MAKE.;3 ( COMMON-FILE-COMMAND )) ("11-Dec-87 14:09:04" DJVB {DSK}COMMON-MAKE.;4 ( COMMON-FILE-COMMAND )) ("11-Dec-87 14:48:44" DJVB {DSK}COMMON-MAKE.;5 ( COMMON-FILE-COMMAND ) (FIXED FILE COMMENTS AND CL:DEFVAR ET AL)))) ) (PUTPROPS COMMON-MAKE COPYRIGHT ("Unisys Corp." 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (829 13460 (COMMON-FILE-COMMAND 839 . 9055) (COMMON-MAKEFILE 9057 . 13458))))) STOP ˙ \ No newline at end of file diff --git a/lispusers/COMMWINDOW b/lispusers/COMMWINDOW new file mode 100644 index 00000000..c17b191c --- /dev/null +++ b/lispusers/COMMWINDOW @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §PACKAGE "INTERLISP" §READTABLE "INTERLISP" §BASE 10) (FILECREATED " 2-Apr-87 17:06:05" {ERIS}LYRIC>COMMWINDOW.;3 49786 changes to%: (VARS REMOTE-CURSOR COMMWINDOWCOMS) (COURIERPROGRAMS COMMWINDOW) (FNS CLOSE-FRAME START-GET-BITS SEND-BITS FRAME-EVENT MAKE-FRAME) (FUNCTIONS \PILOTBITBLT) previous date%: " 2-Apr-87 16:54:24" {ERIS}LYRIC>COMMWINDOW.;2) (* " Copyright (c) 1986, 1900, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COMMWINDOWCOMS) (RPAQQ COMMWINDOWCOMS ( (* ;;; "Viewer end") (FNS CLOSE-FRAME GET-BITS START-GET-BITS) (FILES COURIERSERVE) (* ;;; "Sender end") (FNS SEND-BITS SEND-TILE LISTEN-TO-VIEWER MAPTILES SHUT-DOWN-VIEWER CHANGE-SENDER-UPDATE-MODE) (FUNCTIONS INCR \PILOTBITBLT) (* ;; "Controling update schemes") (INITVARS (COMM.DEFAULT.TRANSMIT.TYPE 'SQUARE) (COMM.SEND.UNCHANGED.TILES T) (COMM.UPDATE.MOUSE.POSITION 'Sender)) (GLOBALVARS COMM.DEFAULT.TRANSMIT.TYPE COMM.UPDATE.MOUSE.POSITION COMM.SEND.UNCHANGED.TILES) (* ;;; "Pruning out unchanged screen tiles") (FNS PACKET-EQUAL GET-CACHED-PACKET PUT-CACHED-PACKET) (* ;;; "Low level packet exchange code") (CONSTANTS COMM.BAND.PACKET.TYPE COMM.CURSOR.PACKET.TYPE COMM.CURSOR.CLOSE.PACKET.TYPE COMM.SHUT.DOWN.PACKET.TYPE) (VARIABLES MAX-PACKET-BITS) (RECORDS COMM.XFER.PACKET) (* ;;; "Packing and unpacking bitmaps into etherpackets") (FNS BMTOPACKET PACKETTOBM) (* ;;; "Displaying the viewing machine's cursor") (VARS REMOTE-CURSOR) (INITVARS (CURSORICON NIL)) (* ;;; "Manipulating the frame that outlines the region being viewed") (INITVARS (*FRAME-SHADE* GRAYSHADE)) (FNS FRAME-EVENT MAKE-FRAME MOVE-FRAME SHAPE-FRAME SET-FRAME-TITLE) (* ;;; "Changing the system parameters") (FNS MAKE-MENUS-WINDOW MODE-MENU) (VARS COMM-MODES) (* ;;; "Initialization") (P (COURIER.START.SERVER)) (* ;;; "Unused stuff, as far as I can tell") (FNS FASTBITBLT) (* ;;; "System file dependencies") (DECLARE%: DONTCOPY DOEVAL@COMPILE (FILES (LOADCOMP) LLDISPLAY LLETHER LLNS)) (COURIERPROGRAMS COMMWINDOW))) (* ;;; "Viewer end") (DEFINEQ (CLOSE-FRAME [LAMBDA (FRAME) (* ; "Edited 2-Apr-87 16:50 by Masinter") (MAPC FRAME 'CLOSEW]) (GET-BITS (LAMBDA (RECEIVE-SOCKET WINDOW) (* ; "Edited 24-Nov-86 13:16 by smL") (RESETLST (RESETSAVE NIL (LIST 'CLOSENSOCKET RECEIVE-SOCKET)) (LET ((BBT (create PILOTBBT)) (STREAM (GETSTREAM WINDOW 'OUTPUT)) (SCRATCHX 0) (SCRATCHY 0) SPREAD SCRATCH SEENX SEENY CURSORUP CURLFT CURBTM CURX CURY X Y DATA WORDLEFT WINDOWBOTTOMLINE (CURSORCOVEREDIMAGE (BITMAPCREATE 16 16)) (TRACKING-CURSOR? NIL)) (* ;  "CURLFT and CURBTM are the left and bottom of the cursor bitmap positions, adjusted for hot spot.") (bind CP PACKET THISWIDTH THISHEIGHT while T do (COND ((SETQ PACKET (GETXIP RECEIVE-SOCKET 3000)) (SELECTC (fetch (COMM.XFER.PACKET PACKET-TYPE) of PACKET) (COMM.CURSOR.PACKET.TYPE (* ; "ignore data, just move cursor ") ) (COMM.BAND.PACKET.TYPE (SETQ SPREAD (fetch (COMM.XFER.PACKET SPREAD) of PACKET)) (SETQ X (fetch (COMM.XFER.PACKET DATAX) of PACKET)) (SETQ Y (fetch (COMM.XFER.PACKET DATAY) of PACKET)) (SETQ THISWIDTH (fetch (COMM.XFER.PACKET THISWIDTH) of PACKET)) (SETQ THISHEIGHT (fetch (COMM.XFER.PACKET THISHEIGHT) of PACKET)) (COND ((AND CURSORUP (<= (- X 16) CURLFT (+ X THISWIDTH 16)) (<= (- Y 16) CURBTM (+ Y THISHEIGHT 16))) (BITBLT CURSORCOVEREDIMAGE 0 0 STREAM CURLFT CURBTM) (SETQ CURSORUP NIL))) (COND ((OR (> THISWIDTH SCRATCHX) (> THISHEIGHT SCRATCHY)) (* ;;  "make sure scratch bitmap is big enough") (SETQ SCRATCH (BITMAPCREATE (SETQ SCRATCHX (MAX SCRATCHX THISWIDTH)) (SETQ SCRATCHY (MAX SCRATCHY THISHEIGHT)) )))) (PACKETTOBM BBT (fetch (COMM.XFER.PACKET BITS) of PACKET) THISWIDTH THISHEIGHT SCRATCH 0 0 SPREAD) (BITBLT SCRATCH 0 0 WINDOW X Y THISWIDTH THISHEIGHT)) (COMM.SHUT.DOWN.PACKET.TYPE (* ;; "Shut down the listener") (CLOSEW WINDOW) (RETURN)) (PRINTOUT PROMPTWINDOW "Odd packet" (fetch (COMM.XFER.PACKET PACKET-TYPE) of PACKET))) (SETQ SEENX (fetch (COMM.XFER.PACKET CURSORX) of PACKET)) (SETQ SEENY (fetch (COMM.XFER.PACKET CURSORY) of PACKET)) (RELEASE.XIP PACKET) (COND ((AND (KEYDOWNP 'LSHIFT) (<= 0 (SETQ X (LASTMOUSEX WINDOW)) (WINDOWPROP WINDOW 'WIDTH)) (<= 0 (SETQ Y (LASTMOUSEY WINDOW)) (WINDOWPROP WINDOW 'HEIGHT))) (* ;;  "Tell the sender to track our cursor.") (SETQ CP (\FILLINXIP \XIPT.EXCHANGE RECEIVE-SOCKET (fetch XIPSOURCEHOST of PACKET) (fetch XIPSOURCESOCKET of PACKET) (fetch XIPSOURCENET of PACKET) NIL)) (* ;  "send more than we need just to see if it fixes the problem") (XIPAPPEND.WORD CP 0) (XIPAPPEND.WORD CP COMM.CURSOR.PACKET.TYPE) (* ; "turn into a cursor ack") (XIPAPPEND.WORD CP X) (XIPAPPEND.WORD CP Y) (CL:ASSERT (AND (= (fetch (COMM.XFER.PACKET PACKET-TYPE) of CP) COMM.CURSOR.PACKET.TYPE) (= (fetch (COMM.XFER.PACKET CURSORX) CP) X) (= (fetch (COMM.XFER.PACKET CURSORY) CP) Y))) (replace (ETHERPACKET EPREQUEUE) of CP with 'FREE) (SENDXIP RECEIVE-SOCKET CP) (SETQ TRACKING-CURSOR? T) (BLOCK)) (TRACKING-CURSOR? (* ;;  "Last pass we were tracking the cursor, but we aren't now. Tell the sender to stop.") (SETQ CP (\FILLINXIP \XIPT.EXCHANGE RECEIVE-SOCKET (fetch XIPSOURCEHOST of PACKET) (fetch XIPSOURCESOCKET of PACKET) (fetch XIPSOURCENET of PACKET) NIL)) (XIPAPPEND.WORD CP 0) (XIPAPPEND.WORD CP COMM.CURSOR.CLOSE.PACKET.TYPE) (replace (ETHERPACKET EPREQUEUE) of CP with 'FREE) (SENDXIP RECEIVE-SOCKET CP) (SETQ TRACKING-CURSOR? NIL))) (SETQ X (DIFFERENCE SEENX (fetch CUHOTSPOTX DEFAULTCURSOR))) (SETQ Y (DIFFERENCE SEENY (fetch CUHOTSPOTY DEFAULTCURSOR))) (COND ((AND CURSORUP (OR (NEQ X CURLFT) (NEQ Y CURBTM))) (BITBLT CURSORCOVEREDIMAGE 0 0 STREAM CURLFT CURBTM) (SETQ CURSORUP NIL))) (COND ((AND (NULL CURSORUP) (<= 0 SEENX (WINDOWPROP WINDOW 'WIDTH)) (<= 0 SEENY (WINDOWPROP WINDOW 'HEIGHT))) (* ; "put cursor up") (SETQ CURLFT X) (SETQ CURBTM Y) (BITBLT STREAM CURLFT CURBTM CURSORCOVEREDIMAGE 0 0 16 16) (BITBLT (fetch CUIMAGE DEFAULTCURSOR) 0 0 STREAM CURLFT CURBTM NIL NIL 'INPUT 'PAINT) (SETQ CURSORUP T)))))))))) (START-GET-BITS [LAMBDA (DUMMY-STREAM DUMMY-PROGRAM DUMMY-PROGRAM REGION REMOTE-USER) (* ; "Edited 2-Apr-87 16:32 by Masinter") (LET ((NS (OPENNSOCKET)) (BORDERSIZE 8)) [ADD.PROCESS (LIST 'GET-BITS NS (LIST 'QUOTE (CREATEW (with REGION REGION (CREATEREGION (DIFFERENCE LEFT BORDERSIZE) (DIFFERENCE BOTTOM BORDERSIZE) (WIDTHIFWINDOW WIDTH BORDERSIZE) (HEIGHTIFWINDOW HEIGHT T BORDERSIZE))) (CONCAT "Viewing region of " REMOTE-USER "'s display") BORDERSIZE] (LIST 'RETURN (LIST (NSOCKETNUMBER NS) (USERNAME]) ) (FILESLOAD COURIERSERVE) (* ;;; "Sender end") (DEFINEQ (SEND-BITS [LAMBDA (PARTNER FRAME) (* ; "Edited 2-Apr-87 16:51 by Masinter") (* ;  "process that monitors the bits that are in the FRAME region and send them to RECADDR.") (OR CURSORICON (SETQ CURSORICON (ICONW REMOTE-CURSOR REMOTE-CURSOR '(0 . 0) T))) (RESETLST [CL:UNLESS FRAME (SETQ FRAME (MAKE-FRAME (GETREGION))) (RESETSAVE NIL `(CLOSE-FRAME ,FRAME] (LET* ((SENDSOCKET (OPENNSOCKET)) [PARTNERADDRESS (COND ((TYPENAMEP PARTNER 'NSADDRESS) PARTNER) (T (LOOKUP.NS.SERVER PARTNER] (PARTNERHOST (fetch NSHOSTNUMBER PARTNERADDRESS)) (PARTNERNET (fetch NSNET PARTNERADDRESS)) (PARTNERCALL (COURIER.OPEN PARTNERADDRESS)) (PACKET NIL) (VIEWER-RETURNED-VALUE (COURIER.CALL PARTNERCALL 'COMMWINDOW 'START-GET-BITS (WINDOWPROP (CAR FRAME) 'FRAME-REGION) (USERNAME))) (PARTNERSOCKET (CAR VIEWER-RETURNED-VALUE)) (PARTNERUSERNAME (CADR VIEWER-RETURNED-VALUE)) (BBT (create PILOTBBT))) (RESETSAVE NIL (LIST 'CLOSENSOCKET SENDSOCKET)) (CLOSEF PARTNERCALL) (* ;  "close SPP connection, needs no more RPC") (DISCARDXIPS SENDSOCKET) (RESETSAVE NIL (LIST 'SHUT-DOWN-VIEWER SENDSOCKET PARTNERHOST PARTNERNET PARTNERSOCKET)) (SET-FRAME-TITLE FRAME (CONCAT "Displaying region on " PARTNERUSERNAME "'s display") ) (while T do (DESTRUCTURING-BIND (L B W H) (WINDOWPROP (CAR FRAME) 'FRAME-REGION) (MAPC FRAME (FUNCTION TOTOPW)) (MAPTILES MAX-PACKET-BITS W H L B (FUNCTION (LAMBDA (X Y THIS-WIDTH THIS-HEIGHT SPREAD) (LISTEN-TO-VIEWER SENDSOCKET L B) (SEND-TILE X Y L B THIS-WIDTH THIS-HEIGHT SPREAD SENDSOCKET PARTNERHOST PARTNERNET PARTNERSOCKET PACKET]) (SEND-TILE (LAMBDA (X Y FRAME-LEFT FRAME-BOTTOM THIS-WIDTH THIS-HEIGHT SPREAD SENDSOCKET PARTNERHOST PARTNERNET PARTNERSOCKET PACKET) (* ; "Edited 24-Nov-86 14:45 by smL") (* ;;; "Send a tile to the receiver") (SETQ PACKET (\FILLINXIP \XIPT.EXCHANGE SENDSOCKET PARTNERHOST PARTNERSOCKET PARTNERNET)) (replace EPREQUEUE of PACKET with 'FREE) (XIPAPPEND.WORD PACKET (OR SPREAD (SETQ SPREAD 0))) (XIPAPPEND.WORD PACKET COMM.BAND.PACKET.TYPE) (* ;;  "Reserve space for the cursor pos, to be filled in later on") (XIPAPPEND.WORD PACKET 0) (XIPAPPEND.WORD PACKET 0) (XIPAPPEND.WORD PACKET X) (XIPAPPEND.WORD PACKET Y) (XIPAPPEND.WORD PACKET THIS-WIDTH) (XIPAPPEND.WORD PACKET THIS-HEIGHT) (BMTOPACKET NIL (SCREENBITMAP) (+ FRAME-LEFT X) (+ FRAME-BOTTOM Y) THIS-WIDTH THIS-HEIGHT (fetch (COMM.XFER.PACKET BITS) of PACKET) SPREAD) (add (fetch XIPLENGTH PACKET) (IQUOTIENT (+ 7 (TIMES THIS-WIDTH THIS-HEIGHT)) 8)) (CL:ASSERT (with COMM.XFER.PACKET PACKET (AND (EQ DATAX X) (EQ DATAY Y) (EQ THISWIDTH THIS-WIDTH) (EQ THISHEIGHT THIS-HEIGHT)))) (if (OR COMM.SEND.UNCHANGED.TILES (NOT (PACKET-EQUAL PACKET (GET-CACHED-PACKET X Y PARTNERHOST PARTNERNET PARTNERSOCKET)))) then (PUT-CACHED-PACKET PACKET X Y PARTNERHOST PARTNERNET PARTNERSOCKET) else (* ;;  "There has been no change in the bits, so don't bother to send them") (replace (XIP XIPLENGTH) of PACKET with (CONSTANT (PLUS \XIPOVLEN (TIMES 2 (INDEXF (FETCH ( COMM.XFER.PACKET DATALOC) OF T))))))) (* ;;  "Set in the cursor pos and send the packet") (replace (COMM.XFER.PACKET CURSORX) of PACKET with (LOGAND (- LASTMOUSEX FRAME-LEFT) 65535)) (replace (COMM.XFER.PACKET CURSORY) of PACKET with (LOGAND (- LASTMOUSEY FRAME-BOTTOM) 65535)) (SENDXIP SENDSOCKET PACKET) (BLOCK))) (LISTEN-TO-VIEWER (LAMBDA (SENDSOCKET FRAME-LEFT FRAME-BOTTOM) (* ; "Edited 24-Nov-86 13:13 by smL") (* ;;  "Update the display of the viewers cursor") (bind CURSORPACKET while (SETQ CURSORPACKET (GETXIP SENDSOCKET 0)) do (* ; "got an ack") (SELECTC (fetch (COMM.XFER.PACKET PACKET-TYPE) CURSORPACKET) (COMM.CURSOR.PACKET.TYPE (MOVEW CURSORICON (+ (fetch (COMM.XFER.PACKET CURSORX) CURSORPACKET) FRAME-LEFT) (+ (fetch (COMM.XFER.PACKET CURSORY) CURSORPACKET) FRAME-BOTTOM)) (OPENW CURSORICON)) (COMM.CURSOR.CLOSE.PACKET.TYPE (* ;;  "Stop shadowing the viewers cursor") (if (OPENWP CURSORICON) then (CLOSEW CURSORICON))) NIL)))) (MAPTILES (LAMBDA (MAXBITS W H L B FN) (* ; "Edited 24-Nov-86 17:42 by smL") (LET* ((SQRT-BITS (CL:ISQRT MAXBITS)) (PACKETHEIGHT NIL) (PACKETWIDTH NIL) (XMARGIN (IQUOTIENT SQRT-BITS 2)) (YMARGIN (IQUOTIENT SQRT-BITS 2)) (XD 1) (YD 1) (SPREAD NIL) (MX LASTMOUSEX) (MY LASTMOUSEY) (VIEWER-X -100) (VIEWER-Y -100)) (CL:ECASE COMM.DEFAULT.TRANSMIT.TYPE (SQUARE (SETQ PACKETHEIGHT SQRT-BITS)) (RECTANGLE (SETQ PACKETWIDTH (CL:* 2 SQRT-BITS))) (HORIZONTAL (SETQ PACKETWIDTH (MIN W MAXBITS))) (VERTICAL (SETQ PACKETHEIGHT (MIN H MAXBITS))) (H3 (SETQ PACKETWIDTH (MIN W MAXBITS)) (SETQ YD 8))) (OR PACKETWIDTH (SETQ PACKETWIDTH (IQUOTIENT MAXBITS PACKETHEIGHT))) (OR PACKETHEIGHT (SETQ PACKETHEIGHT (IQUOTIENT MAXBITS PACKETWIDTH))) (INCR Y (- H PACKETHEIGHT) (- PACKETHEIGHT) YD (< Y (- PACKETHEIGHT)) (INCR X 0 PACKETWIDTH XD (>= X W) (SELECTQ COMM.UPDATE.MOUSE.POSITION (NIL (* ;; "Don't do anything special") NIL) (Sender (* ;;  "Update around the sender's cursor (this machine is the sender) if the mouse has moved") (if (OR (NEQ LASTMOUSEX MX) (NEQ LASTMOUSEY MY)) then (SETQ MX LASTMOUSEX) (SETQ MY LASTMOUSEY) (LET ((X (- MX XMARGIN L)) (Y (- MY YMARGIN B))) (* ;;  "X and Y are now in block coordinates ") (CL:IF (AND (<= 0 X (- W 1)) (<= 0 Y (- H 1))) (CL:FUNCALL FN X Y (MIN (+ XMARGIN XMARGIN) (- W X)) (MIN (+ YMARGIN YMARGIN) (- H Y))))))) (Viewer (* ;; "Update around the viewer's cursor (the other machine is the viewer) if the cursor is in the frame (and hence open frame)") (LET ((VIEWERS-REGION (WINDOWPROP CURSORICON 'REGION))) (if (AND (OPENWP CURSORICON) (OR (NEQ (fetch LEFT of VIEWERS-REGION) VIEWER-X) (NEQ (fetch BOTTOM of VIEWERS-REGION) VIEWER-Y))) then (SETQ VIEWER-X (fetch LEFT of VIEWERS-REGION)) (SETQ VIEWER-Y (fetch BOTTOM of VIEWERS-REGION)) (LET ((X (- VIEWER-X XMARGIN L)) (Y (- VIEWER-Y YMARGIN B))) (* ;;  "X and Y are now in block coordinates ") (CL:IF (AND (<= 0 X (- W 1)) (<= 0 Y (- H 1))) (CL:FUNCALL FN X Y (MIN (+ XMARGIN XMARGIN) (- W X)) (MIN (+ YMARGIN YMARGIN) (- H Y)))))))) NIL) (CL:FUNCALL FN (MAX X 0) (MAX Y 0) (MIN PACKETWIDTH (- W X)) (MIN PACKETHEIGHT (- H Y)))))))) (SHUT-DOWN-VIEWER (LAMBDA (SENDSOCKET PARTNERHOST PARTNERNET PARTNERSOCKET) (* ; "Edited 24-Nov-86 11:40 by smL") (* ;;;  "Send a shut-down packet to the receiver") (* ;;  "Beware, this may fail on a noisey line, so we do it twice, just to be safer.") (to 2 do (LET ((PACKET (\FILLINXIP \XIPT.EXCHANGE SENDSOCKET PARTNERHOST PARTNERSOCKET PARTNERNET ))) (replace EPREQUEUE of PACKET with 'FREE) (XIPAPPEND.WORD PACKET 0) (XIPAPPEND.WORD PACKET COMM.SHUT.DOWN.PACKET.TYPE) (SENDXIP SENDSOCKET PACKET))))) (CHANGE-SENDER-UPDATE-MODE (LAMBDA (NEW-MODE) (* ; "Edited 24-Nov-86 12:49 by smL") (SETQ COMM.DEFAULT.TRANSMIT.TYPE NEW-MODE))) ) (DEFMACRO INCR (VAR START HEIGHT REPEATS UNTIL &REST FORMS) `(CL:DO ((REPEAT-COUNT 0 (+ REPEAT-COUNT 1))) ((>= REPEAT-COUNT ,REPEATS)) (CL:DO [(,VAR (+ ,START (CL:* REPEAT-COUNT ,HEIGHT)) (+ ,VAR (CL:* ,REPEATS ,HEIGHT] (,UNTIL) ,@FORMS))) (DEFMACRO \PILOTBITBLT (XCL-USER::TABLE &OPTIONAL (XCL-USER::N 0)) (CL:ASSERT (EQL XCL-USER::N 0)) `((OPCODES PILOTBITBLT) ,XCL-USER::TABLE 0)) (* ;; "Controling update schemes") (RPAQ? COMM.DEFAULT.TRANSMIT.TYPE 'SQUARE) (RPAQ? COMM.SEND.UNCHANGED.TILES T) (RPAQ? COMM.UPDATE.MOUSE.POSITION 'Sender) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS COMM.DEFAULT.TRANSMIT.TYPE COMM.UPDATE.MOUSE.POSITION COMM.SEND.UNCHANGED.TILES) ) (* ;;; "Pruning out unchanged screen tiles") (DEFINEQ (PACKET-EQUAL (LAMBDA (PACKET1 PACKET2) (* ; "Edited 24-Nov-86 14:36 by smL") (* ;;  "Are the data parts of two packets equal?") (AND (type? ETHERPACKET PACKET1) (type? ETHERPACKET PACKET2) (EQ (fetch (XIP XIPLENGTH) of PACKET1) (fetch (XIP XIPLENGTH) of PACKET2)) (LET ((DATA-BYTES (DIFFERENCE (fetch (XIP XIPLENGTH) of PACKET1) \XIPOVLEN))) (AND (for I from 0 to (LRSH DATA-BYTES 1) bind (DATA1 _ (fetch (COMM.XFER.PACKET BITS) of PACKET1)) (DATA2 _ (fetch (COMM.XFER.PACKET BITS) of PACKET2)) always (EQ (\GETBASE DATA1 I) (\GETBASE DATA2 I))) (OR (ZEROP (LOGAND 1 DATA-BYTES)) (EQ (\GETBASEBYTE PACKET1 (SUB1 (fetch (XIP XIPLENGTH) of PACKET1))) (\GETBASEBYTE PACKET2 (SUB1 (fetch (XIP XIPLENGTH) of PACKET1)))))))))) (GET-CACHED-PACKET (LAMBDA (X Y PARTNERHOST PARTNERNET PARTNERSOCKET) (* ; "Edited 24-Nov-86 14:41 by smL") (* ;; "Make sure the cursor pos in the packet is smashed to zero, and that the packet has actually been sent") NIL)) (PUT-CACHED-PACKET (LAMBDA (PACKET X Y PARTNERHOST PARTNERNET PARTNERSOCKET) (* ; "Edited 24-Nov-86 13:28 by smL") T)) ) (* ;;; "Low level packet exchange code") (DECLARE%: EVAL@COMPILE (RPAQQ COMM.BAND.PACKET.TYPE 1321) (RPAQQ COMM.CURSOR.PACKET.TYPE 2925) (RPAQQ COMM.CURSOR.CLOSE.PACKET.TYPE 2926) (RPAQQ COMM.SHUT.DOWN.PACKET.TYPE 4246) (CONSTANTS COMM.BAND.PACKET.TYPE COMM.CURSOR.PACKET.TYPE COMM.CURSOR.CLOSE.PACKET.TYPE COMM.SHUT.DOWN.PACKET.TYPE) ) (CL:DEFCONSTANT MAX-PACKET-BITS (CL:* 400 8) ) (DECLARE%: EVAL@COMPILE (ACCESSFNS COMM.XFER.PACKET ((COMMPACKET (fetch (XIP XIPCONTENTS) of DATUM))) (BLOCKRECORD COMMPACKET ((SPREAD WORD) (PACKET-TYPE WORD) (CURSORX WORD) (CURSORY WORD) (DATAX WORD) (DATAY WORD) (THISWIDTH WORD) (THISHEIGHT WORD) (DATALOC 64 WORD))) [ACCESSFNS COMM.XFER.PACKET ((BITS (LOCF (FETCH (COMM.XFER.PACKET DATALOC ) OF DATUM]) ) (* ;;; "Packing and unpacking bitmaps into etherpackets") (DEFINEQ (BMTOPACKET (LAMBDA (BBT SOURCEBITMAP SOURCELEFT SOURCEBOTTOM WIDTH HEIGHT PACKETLOC SPREAD) (* ; "Edited 24-Nov-86 10:48 by smL") (* ;; "copy bitmap to packet") (CL:ASSERT (AND (BITMAPP SOURCEBITMAP) (<= 0 SOURCELEFT (- (BITMAPWIDTH SOURCEBITMAP) WIDTH 1)) (<= 0 SOURCEBOTTOM (- (BITMAPHEIGHT SOURCEBITMAP) HEIGHT 1)) (< 0 WIDTH) (< 0 HEIGHT))) (\PILOTBITBLT (create PILOTBBT smashing (OR BBT (create PILOTBBT)) PBTWIDTH _ WIDTH PBTHEIGHT _ HEIGHT PBTFLAGS _ 0 PBTDESTBPL _ WIDTH PBTDESTBIT _ 0 PBTUSEGRAY _ NIL PBTSOURCEBPL _ (CL:* (fetch (BITMAP BITMAPRASTERWIDTH ) of SOURCEBITMAP) 16 (+ SPREAD 1)) PBTSOURCEBIT _ SOURCELEFT PBTDISJOINT _ T PBTSOURCE _ (\ADDBASE (fetch (BITMAP BITMAPBASE) of SOURCEBITMAP) (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of SOURCEBITMAP) (- (fetch (BITMAP BITMAPHEIGHT) of SOURCEBITMAP) HEIGHT SOURCEBOTTOM))) PBTDEST _ PACKETLOC PBTOPERATION _ 0 PBTSOURCETYPE _ 0) 0))) (PACKETTOBM (LAMBDA (BBT PACKETLOC WIDTH HEIGHT DESTBITMAP DESTLEFT DESTBOTTOM SPREAD) (* ; "Edited 24-Nov-86 10:48 by smL") (* ;;  "Do a bitblt from a packet into a bitmap. Inverts BMTOPACKET.") (CL:ASSERT (AND (BITMAPP DESTBITMAP) (<= 0 DESTLEFT (- (BITMAPWIDTH DESTBITMAP) WIDTH -1)) (<= 0 DESTBOTTOM (- (BITMAPHEIGHT DESTBITMAP) (CL:* HEIGHT (CL:1+ SPREAD)) -1)) (< 0 WIDTH) (< 0 HEIGHT))) (\PILOTBITBLT (create PILOTBBT smashing (OR BBT (create PILOTBBT)) PBTWIDTH _ WIDTH PBTHEIGHT _ HEIGHT PBTFLAGS _ 0 PBTDESTBPL _ (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of DESTBITMAP) 16 (CL:1+ SPREAD)) PBTDESTBIT _ DESTLEFT PBTUSEGRAY _ NIL PBTSOURCEBPL _ WIDTH PBTSOURCEBIT _ 0 PBTDISJOINT _ T PBTSOURCE _ PACKETLOC PBTDEST _ (\ADDBASE (fetch (BITMAP BITMAPBASE) of DESTBITMAP) (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of DESTBITMAP) (- (fetch (BITMAP BITMAPHEIGHT) of DESTBITMAP) HEIGHT DESTBOTTOM))) PBTOPERATION _ 0 PBTSOURCETYPE _ 0) 0))) ) (* ;;; "Displaying the viewing machine's cursor") (RPAQQ REMOTE-CURSOR #*(16 16)@C@@@C@@@F@@@F@@@LGN@LDAIHDAMHDAO@DAONGNOLDDOHDDO@DBN@DBL@DAH@DA) (RPAQ? CURSORICON NIL) (* ;;; "Manipulating the frame that outlines the region being viewed") (RPAQ? *FRAME-SHADE* GRAYSHADE) (DEFINEQ (FRAME-EVENT [LAMBDA (WINDOW) (* ; "Edited 2-Apr-87 16:53 by Masinter") (if (KEYDOWNP 'RIGHT) then (CLOSE-FRAME (WINDOWPROP WINDOW 'FRAME)) else (LET [(FRAME (WINDOWPROP WINDOW 'FRAME] (if (SHIFTDOWNP 'SHIFT) then [SHAPE-FRAME FRAME (LET [(REGION (WINDOWPROP WINDOW 'FRAME-REGION] (with REGION REGION (\SETCURSORPOSITION LEFT BOTTOM) (GETREGION 32 32 REGION NIL NIL] else (MOVE-FRAME WINDOW]) (MAKE-FRAME [LAMBDA (REGION VIEWER-NAME) (* ; "Edited 2-Apr-87 16:46 by Masinter") (LET (FRAME) [with REGION REGION (SETQ FRAME (LIST (CREATEW (LIST (- LEFT 8) (- BOTTOM 8) 8 (+ HEIGHT 8 8)) NIL 0) (CREATEW (LIST LEFT (- BOTTOM 8) (+ WIDTH 8) 8) NIL 0) (CREATEW (LIST (+ LEFT WIDTH) BOTTOM 8 (+ HEIGHT 8)) NIL 0) (CREATEW (LIST LEFT (+ BOTTOM HEIGHT) WIDTH (HEIGHTIFWINDOW 8 T 0)) "Viewed region" 0] (for X in FRAME do (DSPTEXTURE *FRAME-SHADE* X) (DSPRESET X) (WINDOWPROP X 'FRAME-REGION REGION) (WINDOWPROP X 'MINSIZE '(8 . 8)) (WINDOWPROP X 'FRAME FRAME) (WINDOWPROP X 'RIGHTBUTTONFN (FUNCTION FRAME-EVENT)) (WINDOWPROP X 'BUTTONEVENTFN (FUNCTION FRAME-EVENT))) FRAME]) (MOVE-FRAME (LAMBDA (W) (* lmm "17-Nov-86 02:11") (with REGION (WINDOWPROP W 'FRAME-REGION) (SHAPE-FRAME (WINDOWPROP W 'FRAME) (GETBOXREGION WIDTH HEIGHT LEFT BOTTOM))))) (SHAPE-FRAME (LAMBDA (FRAME REGION) (* ; "Edited 24-Nov-86 13:23 by smL") (with REGION REGION (PROGN (SHAPEW (CAR FRAME) (LIST (- LEFT 8) (- BOTTOM 8) 8 (+ HEIGHT 8 8))) (SHAPEW (CADR FRAME) (LIST LEFT (- BOTTOM 8) (+ WIDTH 8) 8)) (SHAPEW (CADDR FRAME) (LIST (+ LEFT WIDTH) BOTTOM 8 (+ HEIGHT 8))) (SHAPEW (CADDDR FRAME) (LIST LEFT (+ BOTTOM HEIGHT) WIDTH (HEIGHTIFWINDOW 8 (WINDOWPROP (CADDDR FRAME) 'TITLE) (WINDOWPROP (CADDDR FRAME) 'BORDER)))))) (for X in FRAME do (CLEARW X) (WINDOWPROP X 'FRAME-REGION REGION)))) (SET-FRAME-TITLE (LAMBDA (FRAME TITLE) (* ; "Edited 24-Nov-86 13:07 by smL") (WINDOWPROP (CAR (LAST FRAME)) 'TITLE TITLE))) ) (* ;;; "Changing the system parameters") (DEFINEQ (MAKE-MENUS-WINDOW (LAMBDA (MENUS TITLE POSITION) (* ; "Edited 24-Nov-86 10:40 by smL") (* ;;  "Make sure all the menu fields are filled in and up to date") (for MENU in MENUS do (UPDATE/MENU/IMAGE MENU)) (* ;;  "Create a window big enough to hold all the menus, and put the menus in it") (LET* ((MENU-GAP 5) (INSIDE-WINDOW-WIDTH (PLUS MENU-GAP (for MENU in MENUS sum (PLUS MENU-GAP (fetch (MENU IMAGEWIDTH) of MENU))))) (INSIDE-WINDOW-HEIGHT (PLUS MENU-GAP MENU-GAP (for MENU in MENUS largest (fetch (MENU IMAGEHEIGHT) of MENU) finally (RETURN $$EXTREME)))) (CONTROL-WINDOW (CREATEW (if POSITION then (CREATEPOSITION (fetch XCOORD of POSITION) (fetch YCOORD of POSITION)) else (GETBOXREGION (WIDTHIFWINDOW INSIDE-WINDOW-WIDTH) (HEIGHTIFWINDOW INSIDE-WINDOW-HEIGHT TITLE) NIL NIL NIL "Position the Mode Menu")) TITLE))) (for MENU in MENUS bind (LEFT _ MENU-GAP) do (ADDMENU MENU CONTROL-WINDOW (CREATEPOSITION LEFT (QUOTIENT (DIFFERENCE INSIDE-WINDOW-HEIGHT (fetch (MENU IMAGEHEIGHT) of MENU)) 2))) (add LEFT (fetch (MENU IMAGEWIDTH) of MENU) MENU-GAP)) CONTROL-WINDOW))) (MODE-MENU (LAMBDA NIL (* ; "Edited 24-Nov-86 16:52 by smL") (LET ((UPDATE-MENU (create MENU CENTERFLG _ T MENUTITLEFONT _ BOLDFONT WHENSELECTEDFN _ (FUNCTION (LAMBDA (ITEM MENU BUTTON) (MENUDESELECT COMM.DEFAULT.TRANSMIT.TYPE MENU) (MENUSELECT ITEM MENU) (CHANGE-SENDER-UPDATE-MODE ITEM))) TITLE _ "Update method" ITEMS _ COMM-MODES)) (MOUSE-POS-UPDATE-MENU (create MENU CENTERFLG _ T MENUTITLEFONT _ BOLDFONT WHENSELECTEDFN _ (FUNCTION (LAMBDA (ITEM MENU BUTTON) (MENUDESELECT COMM.UPDATE.MOUSE.POSITION MENU) (MENUSELECT ITEM MENU) (SETQ COMM.UPDATE.MOUSE.POSITION ITEM))) TITLE _ "Update near cursor?" ITEMS _ '(Sender Viewer NIL))) (SEND-UNCHANGED-TILES-MENU (create MENU CENTERFLG _ T MENUTITLEFONT _ BOLDFONT WHENSELECTEDFN _ (FUNCTION (LAMBDA (ITEM MENU BUTTON) (MENUDESELECT COMM.SEND.UNCHANGED.TILES MENU) (MENUSELECT ITEM MENU) (SETQ COMM.SEND.UNCHANGED.TILES ITEM))) TITLE _ "Send unchanged tiles?" ITEMS _ '(T NIL))) (LIGHTNING-MENU (create MENU CENTERFLG _ T MENUTITLEFONT _ BOLDFONT WHENSELECTEDFN _ (FUNCTION (LAMBDA (ITEM MENU BUTTON) (MENUDESELECT \ETHERLIGHTNING MENU) (MENUSELECT ITEM MENU) (SETQ \ETHERLIGHTNING ITEM))) TITLE _ "Ether Lightning" ITEMS _ '(NIL 3 6 1 4 7 2 5 8) MENUROWS _ 3))) (* ;; "") (* ;;  "Bring up a window with all the menus, at a location the user specifies") (* ;; "") (MAKE-MENUS-WINDOW (LIST UPDATE-MENU MOUSE-POS-UPDATE-MENU SEND-UNCHANGED-TILES-MENU LIGHTNING-MENU) "Send-Bits mode menu") (* ;; "") (* ;;  "Highlight the current values, so the user can see what the current values are.") (* ;; "") (MENUSELECT COMM.DEFAULT.TRANSMIT.TYPE UPDATE-MENU) (MENUSELECT COMM.UPDATE.MOUSE.POSITION MOUSE-POS-UPDATE-MENU) (MENUSELECT COMM.SEND.UNCHANGED.TILES SEND-UNCHANGED-TILES-MENU) (MENUSELECT \ETHERLIGHTNING LIGHTNING-MENU)))) ) (RPAQQ COMM-MODES (SQUARE RECTANGLE HORIZONTAL VERTICAL H3)) (* ;;; "Initialization") (COURIER.START.SERVER) (* ;;; "Unused stuff, as far as I can tell") (DEFINEQ (FASTBITBLT (LAMBDA (BBT SOURCEBITMAP SOURCELEFT SOURCEBOTTOM WIDTH HEIGHT DESTBITMAP DESTLEFT DESTBOTTOM) (* lmm "17-Nov-86 03:55") (* ;; "copy bitmap to bitmap") (CL:ASSERT (AND (BITMAPP SOURCEBITMAP) (BITMAPP DESTBITMAP) (<= 0 SOURCELEFT (- (BITMAPWIDTH SOURCEBITMAP) WIDTH 1)) (<= 0 SOURCEBOTTOM (- (BITMAPHEIGHT SOURCEBITMAP) HEIGHT 1)) (<= 0 DESTLEFT (- (BITMAPWIDTH DESTBITMAP) WIDTH 1)) (<= 0 DESTBOTTOM (- (BITMAPHEIGHT DESTBITMAP) HEIGHT 1)) (< 0 WIDTH) (< 0 HEIGHT))) (\PILOTBITBLT (create PILOTBBT smashing (OR BBT (create PILOTBBT)) PBTWIDTH _ WIDTH PBTHEIGHT _ HEIGHT PBTFLAGS _ 0 PBTDESTBPL _ (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of DESTBITMAP) 16) PBTDESTBIT _ DESTLEFT PBTUSEGRAY _ NIL PBTSOURCEBPL _ (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of SOURCEBITMAP) 16) PBTSOURCEBIT _ SOURCELEFT PBTDISJOINT _ T PBTSOURCE _ (\ADDBASE (fetch (BITMAP BITMAPBASE) of SOURCEBITMAP) (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of SOURCEBITMAP ) (- (fetch (BITMAP BITMAPHEIGHT) of SOURCEBITMAP ) HEIGHT SOURCEBOTTOM))) PBTDEST _ (\ADDBASE (fetch (BITMAP BITMAPBASE) of DESTBITMAP ) (CL:* (fetch (BITMAP BITMAPRASTERWIDTH) of DESTBITMAP) (- (fetch (BITMAP BITMAPHEIGHT) of DESTBITMAP) HEIGHT DESTBOTTOM))) PBTOPERATION _ 0 PBTSOURCETYPE _ 0) 0))) ) (* ;;; "System file dependencies") (DECLARE%: DONTCOPY DOEVAL@COMPILE (FILESLOAD (LOADCOMP) LLDISPLAY LLETHER LLNS) ) (COURIERPROGRAM COMMWINDOW (1337 1) TYPES [(REGION (RECORD (LEFT INTEGER) (BOTTOM INTEGER) (WIDTH INTEGER) (HEIGHT INTEGER))) (USERNAME STRING) (RESPONSE (RECORD (SOCKET LONGINTEGER) (CORRESPONDENT USERNAME] PROCEDURES ((START-GET-BITS 1 (REGION USERNAME) RETURNS (RESPONSE) REPORTS (REMOTEERROR) IMPLEMENTEDBY START-GET-BITS)) ERRORS ((ERROR 1 (STRING)) (USE.COURIER 2 NIL))) (PUTPROPS COMMWINDOW COPYRIGHT ("Xerox Corporation" 1986 1900 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3203 13134 (CLOSE-FRAME 3213 . 3364) (GET-BITS 3366 . 11655) (START-GET-BITS 11657 . 13132)) (13189 26236 (SEND-BITS 13199 . 16020) (SEND-TILE 16022 . 19145) (LISTEN-TO-VIEWER 19147 . 20450) (MAPTILES 20452 . 25175) (SHUT-DOWN-VIEWER 25177 . 26046) (CHANGE-SENDER-UPDATE-MODE 26048 . 26234)) (27219 29090 (PACKET-EQUAL 27229 . 28632) (GET-CACHED-PACKET 28634 . 28949) (PUT-CACHED-PACKET 28951 . 29088)) (30529 34252 (BMTOPACKET 30539 . 32500) (PACKETTOBM 32502 . 34250)) (34556 38865 ( FRAME-EVENT 34566 . 35224) (MAKE-FRAME 35226 . 37008) (MOVE-FRAME 37010 . 37280) (SHAPE-FRAME 37282 . 38672) (SET-FRAME-TITLE 38674 . 38863)) (38915 45792 (MAKE-MENUS-WINDOW 38925 . 41284) (MODE-MENU 41286 . 45790)) (45968 48955 (FASTBITBLT 45978 . 48953))))) STOP \ No newline at end of file diff --git a/lispusers/COMMWINDOW.TEDIT b/lispusers/COMMWINDOW.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..d8de399737e0a4c81b9c90f8bac48a21c4488a1b GIT binary patch literal 9241 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 Le^a)e|MkBCNzb$v literal 0 HcmV?d00001 diff --git a/lispusers/COMPARE-PATHS b/lispusers/COMPARE-PATHS new file mode 100644 index 00000000..8a39d698 --- /dev/null +++ b/lispusers/COMPARE-PATHS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP") (FILECREATED "22-Sep-87 15:19:06" {ERINYES}LYRIC>COMPARE-PATHS.\;3 4836 |changes| |to:| (FUNCTIONS XCL-USER::COMPARE-PATHS XCL-USER::COMPARE-FLOPPY) (VARS COMPARE-PATHSCOMS) |previous| |date:| "22-Sep-87 12:03:37" {ERINYES}LYRIC>COMPARE-PATHS.\;1) ; Copyright (c) 1987 by Xerox Corporation. All rights reserved. (PRETTYCOMPRINT COMPARE-PATHSCOMS) (RPAQQ COMPARE-PATHSCOMS ((FUNCTIONS XCL-USER::COMPARE-FLOPPY XCL-USER::COMPARE-PATHS))) (CL:DEFUN XCL-USER::COMPARE-FLOPPY (XCL-USER::FLOPPYPATH XCL-USER::FSPATH) (* |;;;| "This resoundingly dumb function walks IL:COMPARESOURCES down the files of two directories.") (LET* ((XCL-USER::FLOPPYFILES (DIRECTORY XCL-USER::FLOPPYPATH)) (XCL-USER::FSFILES (DIRECTORY XCL-USER::FSPATH))) (WHILE (AND XCL-USER::FLOPPYFILES XCL-USER::FSFILES) BIND XCL-USER::FLOPPYNAME XCL-USER::FSNAME DO (CL:SETQ XCL-USER::FLOPPYNAME (CL:PATHNAME-NAME (PATHNAME (CAR XCL-USER::FLOPPYFILES)))) (CL:SETQ XCL-USER::FSNAME (CL:PATHNAME-NAME (PATHNAME (CAR XCL-USER::FSFILES)))) (COND ((CL:STRING= XCL-USER::FLOPPYNAME XCL-USER::FSNAME) (LET ((XCL-USER::FLOPPYDATE (GETFILEINFO (CAR XCL-USER::FLOPPYFILES) 'CREATIONDATE)) (XCL-USER::FSDATE (GETFILEINFO (CAR XCL-USER::FSFILES) 'CREATIONDATE))) (IF (NOT (CL:STRING= XCL-USER::FLOPPYDATE XCL-USER::FSDATE)) THEN (CL:FORMAT T "Creation dates for ~s don't match:~%~S: ~S ~S: ~S ~2%" XCL-USER::FLOPPYNAME (CAR XCL-USER::FLOPPYFILES) XCL-USER::FLOPPYDATE (CAR XCL-USER::FSFILES) XCL-USER::FSDATE) ELSE (COMPARESOURCES (CAR XCL-USER::FLOPPYFILES) (CAR XCL-USER::FSFILES)) (CL:FORMAT T "~%"))) (CL:POP XCL-USER::FLOPPYFILES) (CL:POP XCL-USER::FSFILES)) ((CL:STRING< XCL-USER::FLOPPYNAME XCL-USER::FSNAME) (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::FLOPPYFILES) XCL-USER::FSPATH) (CL:POP XCL-USER::FLOPPYFILES)) (T (CL:POP XCL-USER::FSFILES)))) (WHILE XCL-USER::FLOPPYFILES DO (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::FLOPPYFILES ) XCL-USER::FSPATH) (CL:POP XCL-USER::FLOPPYFILES)))) (CL:DEFUN XCL-USER::COMPARE-PATHS (XCL-USER::PATH1 XCL-USER::PATH2) (* |;;;| "This resoundingly dumb function walks IL:COMPARESOURCES down the files of two directories.") (LET* ((XCL-USER::PL1 (DIRECTORY XCL-USER::PATH1)) (XCL-USER::PL2 (DIRECTORY XCL-USER::PATH2))) (WHILE (AND XCL-USER::PL1 XCL-USER::PL2) BIND XCL-USER::PN1 XCL-USER::PN2 DO (CL:SETQ XCL-USER::PN1 (CL:PATHNAME-NAME (PATHNAME (CAR XCL-USER::PL1)))) (CL:SETQ XCL-USER::PN2 (CL:PATHNAME-NAME (PATHNAME (CAR XCL-USER::PL2)))) (COND ((CL:STRING= XCL-USER::PN1 XCL-USER::PN2) (COMPARESOURCES (CAR XCL-USER::PL1) (CAR XCL-USER::PL2)) (CL:FORMAT T "~%") (CL:POP XCL-USER::PL1) (CL:POP XCL-USER::PL2)) ((CL:STRING< XCL-USER::PN1 XCL-USER::PN2) (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::PL1) XCL-USER::PATH2) (CL:POP XCL-USER::PL1)) (T (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::PL2) XCL-USER::PATH1) (CL:POP XCL-USER::PL2)))) (WHILE XCL-USER::PL1 DO (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::PL1) XCL-USER::PATH2) (CL:POP XCL-USER::PL1)) (WHILE XCL-USER::PL2 DO (CL:FORMAT T "File ~S not found on ~S~%" (CAR XCL-USER::PL2) XCL-USER::PATH1) (CL:POP XCL-USER::PL2)))) (PUTPROPS COMPARE-PATHS COPYRIGHT ("Xerox Corporation" 1987)) (DECLARE\: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/COMPAREDIRECTORIES b/lispusers/COMPAREDIRECTORIES new file mode 100644 index 00000000..fcfeb89c --- /dev/null +++ b/lispusers/COMPAREDIRECTORIES @@ -0,0 +1,145 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED " 9-May-2018 16:32:02"  {DSK}kaplan>Local>medley3.5>lispcore>lispusers>COMPAREDIRECTORIES.;43 26134 changes to%: (FNS FIND-UNCOMPILED-FILES COMPAREDIRECTORIES) previous date%: " 9-May-2018 16:25:36" {DSK}kaplan>Local>medley3.5>lispcore>lispusers>COMPAREDIRECTORIES.;42) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1990, 1994, 1998, 2018 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COMPAREDIRECTORIESCOMS) (RPAQQ COMPAREDIRECTORIESCOMS ( (* ;; "Compare the contents to two directories.") (FNS COMPAREDIRECTORIES COMPAREDIRS.FORMATLINE COMPAREDIRECTORIES.NEWPAGEFN COMPARE-DIRECTORIES) (* ;; "look for compiled files older than the sources") (FNS FIND-UNCOMPILED-FILES))) (* ;; "Compare the contents to two directories.") (DEFINEQ (COMPAREDIRECTORIES [LAMBDA (FROMDIR TODIR SHOW FILEPATTERN EXTENSIONSTOAVOID USEDIRECTORYDATE LISTINGFILE ALLVERSIONS) (* ; "Edited 9-May-2018 16:25 by rmk:") (* ; "Edited 9-May-2018 16:24 by rmk:") (* ; "Edited 4-May-2018 23:28 by rmk:") (* ; "Edited 4-May-2018 23:26 by rmk:") (* ; "Edited 4-May-2018 16:20 by rmk:") (* ;; "Compare the contents of two directories, e.g., for change-control purposes. Compares files matching FILEPATTERN (or *.*;) on FROMDIR and TODIR, listing which is newer, or when one is not found on the other. If SHOW is or contains SAME, BEFORE, AFTER, then files where the FROM is the same as, earlier than, or later than the TO are shown. SHOW NIL is the same as (BEFORE AFTER), T is the same as (BEFORE AFTER SAME).") (* ;; "") (* ;; "Unless USEDIRECTORYDATE, comparison is respect to the the LISP filedate if evailable.") (* ;; "") (* ;; "If LISTINGFILE is NIL, output goes to the display. If a filename ending in TXT or TEXT, then output goes to a text file. Otherwise, output goes to an image stream.") (* ;; "Looks only at latest version unless ALLVERSIONS") (CL:UNLESS FILEPATTERN (SETQ FILEPATTERN '*.*;)) (SETQ EXTENSIONSTOAVOID (MKLIST EXTENSIONSTOAVOID)) (CL:UNLESS ALLVERSIONS (SETQ FILEPATTERN (PACKFILENAME.STRING 'VERSION "" 'BODY FILEPATTERN))) (SETQ FROMDIR (DIRECTORYNAME FROMDIR)) (* ; "Resolve relative directories, so we can suppress subdirectory matches. Don't know why DIRECTORY produces them ") (SETQ TODIR (DIRECTORYNAME TODIR)) (PROG (TEXT LISTINGSTREAM (TONAMEPOS (ADD1 (NCHARS TODIR))) (FROMNAMEPOS (ADD1 (NCHARS FROMDIR))) (FROMPATTERN (PACKFILENAME.STRING 'DIRECTORY FROMDIR 'BODY FILEPATTERN)) (TOPATTERN (PACKFILENAME.STRING 'DIRECTORY TODIR 'BODY FILEPATTERN)) FROM-FILES TO-FILES) [SETQ LISTINGSTREAM (AND LISTINGFILE (IF (EQMEMB (U-CASE (FILENAMEFIELD LISTINGFILE 'EXTENSION)) '(TXT TEXT)) THEN (SETQ TEXT T) (OPENSTREAM LISTINGFILE 'OUTPUT) ELSE (OPENIMAGESTREAM LISTINGFILE NIL '(LANDSCAPE T] (* ;; "Pack may have put on a < or / incorrectly for relative directories") (* ;; "(CL:UNLESS (MEMB (NTHCHAR FROMDIR 1) '(/ \ <)) (SETQ FROMPATTERN (SUBSTRING FROMPATTERN 2 -1)))(CL:UNLESS (MEMB (NTHCHAR TODIR 1) '(/ \ <)) (SETQ TOPATTERN (SUBSTRING TOPATTERN 2 -1)))") (* ;; "Filter extensions") (CL:WHEN (MEMB '* EXTENSIONSTOAVOID) (SETQ FROMPATTERN (PACKFILENAME.STRING 'EXTENSION "" 'BODY FROMPATTERN)) (SETQ TOPATTERN (PACKFILENAME.STRING 'EXTENSION "" 'BODY TOPATTERN))) (* ;; "> test to skip subdirectories") (SETQ FROM-FILES (for FROMFILE in (DIRECTORY FROMPATTERN) UNLESS (IF (STRPOS ">" FROMFILE FROMNAMEPOS) ELSEIF (MEMB '* EXTENSIONSTOAVOID) THEN (* ;;  "For some unknown reason, DIRECTORY let's some through") (FILENAMEFIELD FROMFILE 'EXTENSION) ELSE (CL:MEMBER (UNPACKFILENAME.STRING FROMFILE 'EXTENSION) EXTENSIONSTOAVOID :TEST #'STRING-EQUAL)) collect FROMFILE)) (SETQ TO-FILES (for TOFILE in (DIRECTORY TOPATTERN) UNLESS (IF (STRPOS ">" TOFILE TONAMEPOS) ELSEIF (MEMB '* EXTENSIONSTOAVOID) THEN (FILENAMEFIELD TOFILE 'EXTENSION) ELSE (CL:MEMBER (UNPACKFILENAME.STRING TOFILE 'EXTENSION) EXTENSIONSTOAVOID :TEST #'STRING-EQUAL)) collect TOFILE)) (CL:UNLESS (AND TO-FILES FROM-FILES) (CL:UNLESS FROM-FILES (PRINTOUT T "FROMDIR " FROMDIR " is empty" T)) (CL:UNLESS TO-FILES (PRINTOUT T "TODIR " TODIR " is empty" T)) (RETURN)) (PRINTOUT T "Comparing " FROMDIR 6 "vs. " TODIR T "as of " (DATE) T) [COND (LISTINGSTREAM (IF TEXT THEN (LINELENGTH 1000 LISTINGSTREAM) (* ; "Don't wrap") (PRINTOUT LISTINGSTREAM "Comparing " FROMDIR 6 "vs. " TODIR T "as of " (DATE) T T) ELSE (STREAMPROP LISTINGSTREAM 'AFTERNEWPAGEFN #'COMPAREDIRECTORIES.NEWPAGEFN) [STREAMPROP LISTINGSTREAM 'TITLE (CONS (CONCAT FROMDIR " vs " TODIR) (CONCAT "as of " (DATE] (COMPAREDIRECTORIES.NEWPAGEFN LISTINGSTREAM] (FOR FROMNAME IN FROM-FILES BIND TONAME DT1 DT2 FROMMATCH SHORT-FROM SHORT-TO EACHTIME (SETQ SHORT-FROM (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY FROMNAME)) (SETQ FROMMATCH (PACKFILENAME.STRING 'VERSION NIL 'BODY SHORT-FROM)) [SETQ DT1 (IF USEDIRECTORYDATE THEN [IDATE (OR (FILEDATE FROMNAME) (GETFILEINFO FROMNAME 'CREATIONDATE] ELSE (GETFILEINFO FROMNAME 'ICREATIONDATE] DO (FOR TONAME IN TO-FILES WHEN (STREQUAL FROMMATCH (PACKFILENAME.STRING 'HOST NIL 'DIRECTORY NIL 'VERSION NIL 'BODY TONAME)) DO (SETQ TO-FILES (CL:DELETE TONAME TO-FILES)) [SETQ DT2 (IF USEDIRECTORYDATE THEN (GETFILEINFO TONAME 'ICREATIONDATE) ELSE (IDATE (OR (FILEDATE TONAME) (GETFILEINFO TONAME 'CREATIONDATE] (SETQ SHORT-TO (PACKFILENAME 'HOST NIL 'DIRECTORY NIL 'BODY TONAME)) (COND [(IEQP DT1 DT2) (* ; "same") (COND ((EQMEMB SHOW '(T SAME)) (EQ SHOW FILESTOO) (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM "" (GDATE DT1) " =" (GDATE DT2) SHORT-TO "" TEXT] ([OR [AND (ILESSP DT1 DT2) (EQMEMB SHOW '(NIL BEFORE] (AND (IGREATERP DT1 DT2) (EQMEMB SHOW '(NIL AFTER] (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM (GETFILEINFO FROMNAME 'AUTHOR) (GDATE DT1) (COND ((LESSP DT1 DT2) "< ") (T " >")) (GDATE DT2) SHORT-TO (GETFILEINFO TONAME 'AUTHOR) TEXT))) (RETURN) FINALLY (* ;; "No match for a FROMFILE") (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM (GETFILEINFO FROMNAME 'AUTHOR) (GDATE DT1) "**" NIL NIL NIL TEXT))) (* ;; "The TO-FILES that didn't match a FROM-FILE. GDATE to expand 19xx to 4 digits (Y2K)") (FOR TONAME SHORT-TO IN TO-FILES DO (SETQ SHORT-TO (PACKFILENAME.STRING 'HOST NIL 'DIRECTORY NIL 'DEVICE NIL 'BODY TONAME)) (COMPAREDIRS.FORMATLINE LISTINGSTREAM NIL NIL NIL "**" [GDATE (IF USEDIRECTORYDATE THEN (GETFILEINFO TONAME 'ICREATIONDATE) ELSE (IDATE (OR (FILEDATE TONAME) (GETFILEINFO TONAME 'CREATIONDATE] SHORT-TO (GETFILEINFO TONAME 'AUTHOR) TEXT)) (RETURN (AND LISTINGSTREAM (CLOSEF LISTINGSTREAM]) (COMPAREDIRS.FORMATLINE [LAMBDA (STREAM FROM FROMAUTHOR FDATE COMP TDATE TO TOAUTHOR TEXT) (* ; "Edited 2-May-2018 16:49 by rmk:") (* ;; "Format one line of the directory comparison listing. If FROMAUTHOR or TOAUTHOR are non-NIL, list the author in parens; otherwise omit it.") (COND ((AND STREAM (NOT TEXT)) (* ;  "It's an image stream, where TAB doesn't work right.") (LET* [(COMPFONT (FONTCREATE 'MODERN 8 'BOLD NIL STREAM)) (MAINFONT (FONTCREATE 'MODERN 8 NIL NIL STREAM)) (SPACEWIDTH (CHARWIDTH (CHARCODE SPACE) STREAM)) (LEFTMARGIN (DSPLEFTMARGIN NIL STREAM)) (RIGHTMARGIN (DSPRIGHTMARGIN NIL STREAM)) (CENTER (IQUOTIENT (+ LEFTMARGIN RIGHTMARGIN) 2)) (COMPWIDTH (IQUOTIENT (IMAX (STRINGWIDTH " >" COMPFONT) (STRINGWIDTH "< " COMPFONT) (STRINGWIDTH "==" COMPFONT) (STRINGWIDTH "**" COMPFONT)) 2)) (LEFTSIDE (- CENTER 353 COMPWIDTH)) (RIGHTSIDE (+ CENTER COMPWIDTH 353)) (FROM-STRING (COND (FROM (CL:FORMAT NIL "~A (~A; ~A)" FROM FROMAUTHOR FDATE)) (T ""))) (TO-STRING (COND (TO (CL:FORMAT NIL "~A (~A; ~A)" TO TOAUTHOR TDATE)) (T ""] (DSPFONT COMPFONT STREAM) (DSPXPOSITION (- CENTER (IQUOTIENT (STRINGWIDTH COMP COMPFONT) 2)) STREAM) (PRIN1 COMP STREAM) (DSPFONT MAINFONT STREAM) (DSPXPOSITION (- LEFTSIDE (STRINGWIDTH FROM-STRING MAINFONT)) STREAM) (PRIN1 FROM-STRING STREAM) (DSPXPOSITION RIGHTSIDE STREAM) (PRINTOUT STREAM TO-STRING T))) (T (* ;  "the display, where TAB does work.") (PRINTOUT STREAM (OR FROM "") (COND (FROMAUTHOR (CONCAT " (" FROMAUTHOR ")")) (T " ")) 45 (IF FDATE THEN (CONCAT "[" FDATE "]") ELSEIF TDATE THEN (SPACES (IPLUS 2 (NCHARS TDATE)) STREAM) "") -2 COMP -2 (IF TDATE THEN (CONCAT "[" TDATE "]") ELSE "") -1 (OR TO "") (COND (TOAUTHOR (CONCAT " (" TOAUTHOR ")")) (T "")) T]) (COMPAREDIRECTORIES.NEWPAGEFN [LAMBDA (LISTINGSTREAM) (* ; "Edited 15-Nov-88 19:20 by jds") (* ;; "Print the new-page headings on a COMPARE-DIRECTORIES page.") (LET* ((LEFT (DSPLEFTMARGIN NIL LISTINGSTREAM)) (RIGHT (DSPRIGHTMARGIN NIL LISTINGSTREAM)) (TITLEFONT (FONTCREATE 'MODERN 10 'BOLD NIL LISTINGSTREAM)) (TITLE (STREAMPROP LISTINGSTREAM 'TITLE)) (HEAD-WIDTH (IQUOTIENT (STRINGWIDTH (CAR TITLE) TITLEFONT) 2)) (CENTER (IQUOTIENT (+ LEFT RIGHT) 2))) (DSPFONT TITLEFONT LISTINGSTREAM) (MOVETO (- CENTER HEAD-WIDTH) (DSPTOPMARGIN NIL LISTINGSTREAM) LISTINGSTREAM) (PRIN1 (CAR TITLE) LISTINGSTREAM) (MOVETO (- RIGHT (STRINGWIDTH (CDR TITLE) TITLEFONT)) 1270 LISTINGSTREAM) (PRIN1 (CDR TITLE) LISTINGSTREAM) (MOVETO LEFT [IDIFFERENCE (DSPTOPMARGIN NIL LISTINGSTREAM) (FIXR (FTIMES 1.5 (FONTPROP TITLEFONT 'HEIGHT] LISTINGSTREAM]) (COMPARE-DIRECTORIES + [LAMBDA (FROMDIR TODIR SHOW=FILESTOO FILEPATTERN LISTINGFILE EXTENSIONSTOAVOID) + (* ; "Edited 3-Nov-94 15:06 by jds") + + (* ;; "Compare the contents of two directories, e.g., for change-control purposes. Compares files matching FILEPATTERN (or *.*;) on FROMDIR and TODIR, listing which is newer, or when one is not found on the other. If SHOW=FILESTOO, then files that are the same are also listed. LISTINGFILE is either a filename for an interpress master, or NIL to go to the display.") + + (LET ((LISTINGSTREAM (COND + [LISTINGFILE (OPENIMAGESTREAM LISTINGFILE 'INTERPRESS '(LANDSCAPE T] + (T NIL))) + FROM-GENERATOR TO-GENERATOR) + (COND + (LISTINGSTREAM (STREAMPROP LISTINGSTREAM 'AFTERNEWPAGEFN #'COMPAREDIRECTORIES.NEWPAGEFN) + [STREAMPROP LISTINGSTREAM 'TITLE (CONS (CONCAT FROMDIR " vs " TODIR) + (CONCAT "as of " (DATE] + (COMPAREDIRECTORIES.NEWPAGEFN LISTINGSTREAM))) + [SETQ FROM-GENERATOR (\GENERATEFILES (PACKFILENAME.STRING 'BODY FROMDIR 'BODY + (OR FILEPATTERN '*.*;)) + NIL + '(SORT] + [SETQ TO-GENERATOR (\GENERATEFILES (PACKFILENAME.STRING 'BODY TODIR 'BODY + (OR FILEPATTERN '*.*;)) + NIL + '(SORT] + [bind FROM-FILE TO-FILE first (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR)) + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR)) + repeatwhile (OR FROM-FILE TO-FILE) bind DT1 DT2 TON SHORT-FROM SHORT-TO + do (COND + ((AND FROM-FILE (CL:MEMBER (UNPACKFILENAME.STRING FROM-FILE 'EXTENSION) + EXTENSIONSTOAVOID :TEST #'STRING-EQUAL)) + + (* ;; "FROM file is on the prohibited-extension list. Skip it.") + + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR))) + ((AND TO-FILE (CL:MEMBER (UNPACKFILENAME.STRING TO-FILE 'EXTENSION) + EXTENSIONSTOAVOID :TEST #'STRING-EQUAL)) + + (* ;; "TO file is on the prohibited-extension list. Skip it.") + + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR))) + (T (SETQ SHORT-FROM (PACKFILENAME.STRING 'HOST NIL 'DIRECTORY NIL 'VERSION NIL + 'BODY FROM-FILE)) + (SETQ SHORT-TO (PACKFILENAME.STRING 'HOST NIL 'DIRECTORY NIL 'VERSION NIL + 'BODY TO-FILE)) + (HELP) + (COND + ((NOT FROM-FILE) + + (* ;; " Ran out of FROM files first; print the missing-FROM marker") + + (COMPAREDIRS.FORMATLINE LISTINGSTREAM "" "" "" "**" + (GETFILEINFO TO-FILE 'CREATIONDATE) + SHORT-TO + (GETFILEINFO TO-FILE 'AUTHOR)) + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR))) + ((NOT TO-FILE) + + (* ;; " Ran out of TO files first; print the missing-TO marker") + + (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM (GETFILEINFO + FROM-FILE + 'AUTHOR) + (GETFILEINFO FROM-FILE 'CREATIONDATE) + "**" "" "" "") + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR))) + ((CL:STRING-LESSP SHORT-FROM SHORT-TO) + + (* ;; + "This FROM file has no TO equivalent. Print the missing-FROM marker") + + (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM (GETFILEINFO + FROM-FILE + 'AUTHOR) + (GETFILEINFO FROM-FILE 'CREATIONDATE) + "**" "" "" "") + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR))) + ((CL:STRING-LESSP SHORT-TO SHORT-FROM) + + (* ;; + "This TO file has no FROM equivalent. Print the missing-TO marker") + + (COMPAREDIRS.FORMATLINE LISTINGSTREAM "" "" "" "**" + (GETFILEINFO TO-FILE 'CREATIONDATE) + SHORT-TO + (GETFILEINFO TO-FILE 'AUTHOR)) + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR))) + ([= (SETQ DT1 (GETFILEINFO FROM-FILE 'ICREATIONDATE)) + (SETQ DT2 (GETFILEINFO TO-FILE 'ICREATIONDATE] + (AND SHOW=FILESTOO (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM + "" (GDATE DT1) + "==" + (GDATE DT2) + SHORT-TO "")) + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR)) + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR))) + (T (COMPAREDIRS.FORMATLINE LISTINGSTREAM SHORT-FROM + (GETFILEINFO FROM-FILE 'AUTHOR) + (GDATE DT1) + (COND + ((LESSP DT1 DT2) + "<<") + (T ">>")) + (GDATE DT2) + SHORT-TO + (GETFILEINFO TO-FILE 'AUTHOR)) + (SETQ TO-FILE (\GENERATENEXTFILE TO-GENERATOR)) + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR] + (AND LISTINGSTREAM (CLOSEF LISTINGSTREAM]) ) (* ;; "look for compiled files older than the sources") (DEFINEQ (FIND-UNCOMPILED-FILES + [LAMBDA (FROMDIR TODIR LISTINGFILE) (* ; "Edited 3-Nov-94 15:17 by jds") + + (* ;; "Compare the contents of two directories, e.g., for change-control purposes. Compares files matching FILEPATTERN (or *.*;) on FROMDIR and TODIR, listing which is newer, or when one is not found on the other. If SHOW=FILESTOO, then files that are the same are also listed. LISTINGFILE is either a filename for an interpress master, or NIL to go to the display.") + + (LET ((LISTINGSTREAM (COND + [LISTINGFILE (OPENIMAGESTREAM LISTINGFILE 'POSTSCRIPT '(LANDSCAPE T] + (T NIL))) + FROM-GENERATOR TO-GENERATOR) + (COND + (LISTINGSTREAM (STREAMPROP LISTINGSTREAM 'AFTERNEWPAGEFN #'COMPAREDIRECTORIES.NEWPAGEFN) + [STREAMPROP LISTINGSTREAM 'TITLE (CONS (CONCAT "Compiled-file search of " FROMDIR + " vs " TODIR) + (CONCAT "as of " (DATE] + (COMPAREDIRECTORIES.NEWPAGEFN LISTINGSTREAM))) + [SETQ FROM-GENERATOR (\GENERATEFILES (PACKFILENAME.STRING 'BODY FROMDIR 'BODY "*.;") + NIL + '(SORT] + (bind FROM-FILE first (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR)) + repeatwhile FROM-FILE bind DT1 DT2 TON SHORT-FROM SHORT-TO + do (COND + [[SETQ TO-FILE (OR (INFILEP (PACKFILENAME 'DIRECTORY TODIR 'VERSION NIL + 'EXTENSION + 'DFASL + 'BODY FROM-FILE)) + (INFILEP (PACKFILENAME 'DIRECTORY TODIR 'VERSION NIL + 'EXTENSION + 'LCOM + 'BODY FROM-FILE] + (COND + ((< (GETFILEINFO TO-FILE 'ICREATIONDATE) + (GETFILEINFO FROM-FILE 'ICREATIONDATE)) + (PRINTOUT LISTINGSTREAM FROM-FILE " (" (GETFILEINFO FROM-FILE + 'CREATIONDATE) + ") vs " TO-FILE " (" (GETFILEINFO TO-FILE 'CREATIONDATE) + ")" T] + (T (PRINTOUT LISTINGSTREAM FROM-FILE " has no compiled equivalent." T))) + (SETQ FROM-FILE (\GENERATENEXTFILE FROM-GENERATOR))) + (AND LISTINGSTREAM (CLOSEF LISTINGSTREAM]) ) (PUTPROPS COMPAREDIRECTORIES COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990 1994 1998 2018)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1114 23091 (COMPAREDIRECTORIES 1124 . 11760) (COMPAREDIRS.FORMATLINE 11762 . 14932) ( COMPAREDIRECTORIES.NEWPAGEFN 14934 . 16201) (COMPARE-DIRECTORIES 16203 . 23089)) (23156 26000 ( FIND-UNCOMPILED-FILES 23166 . 25998))))) STOP \ No newline at end of file diff --git a/lispusers/COMPAREDIRECTORIES.TEDIT b/lispusers/COMPAREDIRECTORIES.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..ca45d6e2281085055ee4dc5f3ad79ef28b1ccf75 GIT binary patch literal 4442 zcmeHK!EW0|5Tz6+P3p2h+o0&7hk<$s707}l%eL&sMHq>)*-)fPQi)T;hqbh_iAbbC z(sk5N$R8B_j$V4{HOGEZXO^T)$%%siMNT0QYB@V^IQ!*!wF>h)Dy>*%)D zb}d`i9JwLOO}-MihEDydjJLt!#VU=O z>!xd4ok82xE%Pl|!!Vf6SjZ!Y&pAF|zJ44*FoyUtfRPvSVH|`Wk18-c=fjtte+F>? z5$E8IflVgD6`^Bqf-0m{wt849a4ot!ht~7`u5M_KYgsUG zG(&g#^xRQh4QSC(`;cX-=pienOAi^MBSyrCpyfI*z+ZV0Rl-kBR0UZdgBPP_ zc;r7o$ViQtCaOB{a5=HdX1lo(2MY}xOd7T(F-C4Is~dH zz6gCZp3X(>sE8FIK!1+EeiUX-QiIi|9%XoBc$kuxbY4<@e~xOv7LKUBvSN8>eh~7JsBlisDV%!vHy#oqT0qjN zFhYG{*5RcWaa7`DE;9A`B_63N=Nl(IGZQQcNn@&bZqBB}K_WIH0NJ>h2whjPe|V;> z2yh6&8TWaJ3C$O^48p1GSOdGQ5$}pRa1SlJ3~)>mILQkqwP3g8J>{-w5H_7nxU9Cd z>W_8BVZP5N6IO=f#zv3LH(FazZ|&7K_qLiR@aPd7Z`L*(J`?u(UcI^3Y@L7rZz|6G zlue?S^RoOLiQ!OsRKhbb8FLA_)6`f&rAFJ*&Z<>ra&?Zq4e-! z2_-S|hA8`VtdLJKQ6iXnkrN?$$D0DBQ|)u&PR zs|E&-Nqk+)&@J8UTA--5`b2M+!Esfa#v!48fO;8}8q{FB-hiFm20keQlf|=D!?K<_ zp!_mWJJ8ll9I0BT4DCbJPIsIEy;O{D45XXSbVq-Jqt@zn0mm|aTKkxSE1vtd<)Q(* zQS4Ht^%`{5o^HGV{0`8(ws0I9x|s%WZT+cc4HEdkM32RucGOqJEC*XV7#J#k6b!4c zEuNlh`oWC!MmzU-cg?BobTO6ogJ*xZIjtA#)1 z#8Wxc)DF^^5S2c-FX;6H)5HxjA-2_oon{lZ8hNaXy)S^GYUr}N4b81>*sj%*@MT1P zP+8IcQyD*%5tL8e2w7|XkKI@(b8PfouXj=Ha!Vp(1PN8LknS+5|^S>kk$`v{0~p{Ky$lh;T<6bIT?_C zKQ53oA#zW|QN%*roWd2ks1@`T0D`GlNJ= z+%PS26|W|PFy^EFMVPyEOI?K~mR#3qbIFqV-lrV`pVER}L_NF|E?71EnHj|2c7*vd zvt(iaB||RBf>2=2AgL=J(u36)`>O^)L3U6&jY%HKv`I+%BM(_kaplan>Local>medley3.5>lispcore>lispusers>COMPARESOURCES.;2 15689 changes to%: (FNS COMPARESOURCES) previous date%: "15-Apr-88 14:42:45" {DSK}kaplan>Local>medley3.5>lispcore>lispusers>COMPARESOURCES.;1) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 2018 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COMPARESOURCESCOMS) (RPAQQ COMPARESOURCESCOMS ((FNS COMPARESOURCES \CS.COMPARE.MASTERS \CS.COMPARE.TYPES \CS.SORT.DECLARES \CS.SORT.DECLARE1 \CS.FILTER.GARBAGE) (FNS \CS.ISVARFORM \CS.COMPARE.VARS \CS.ISMACROFORM \CS.ISRECFORM \CS.ISCOURIERFORM \CS.ISTEMPLATEFORM \CS.COMPARE.TEMPLATES \CS.ISPROPFORM \CS.PROP.NAME \CS.COMPARE.PROPS \CS.ISADDVARFORM \CS.COMPARE.ADDVARS \CS.ISFPKGCOMFORM \CS.COMPARE.FPKGCOMS) (VARS COMPARESOURCETYPES DEFAULT.DECLARE.TAGS) (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS CSTYPE) (GLOBALVARS COMPARESOURCETYPES CLISPRECORDTYPES MACROPROPS DEFAULT.DECLARE.TAGS)))) (DEFINEQ (COMPARESOURCES [LAMBDA (FILEX FILEY EXAMINE DW? LISTSTREAM) (* ; "Edited 19-Apr-2018 10:49 by rmk:") (* ;;; "Compare two lisp source files, reporting differences.") (DECLARE (SPECVARS FILEX FILEY EXAMINE DIFFERENCES)) (PROG (DIFFERENCES BODYX BODYY ENVX ENVY DECLAREX DECLAREY) [SETQ FILEX (OR (FINDFILE FILEX T) (RETURN (printout LISTSTREAM FILEX " not found" T] [SETQ FILEY (OR (FINDFILE FILEY T) (RETURN (printout LISTSTREAM FILEY " not found" T] (* ;; "Read the two files, throwing out extraneous forms & such:") (CL:MULTIPLE-VALUE-SETQ (BODYX ENVX) (READFILE FILEX)) (SETQ BODYX (\CS.FILTER.GARBAGE BODYX)) (CL:MULTIPLE-VALUE-SETQ (BODYY ENVY) (READFILE FILEY)) (SETQ BODYY (\CS.FILTER.GARBAGE BODYY)) (printout LISTSTREAM "Comparing " FILEX " dated " (GETFILEINFO FILEX 'CREATIONDATE) " and " FILEY " dated " (GETFILEINFO FILEY 'CREATIONDATE) ":" T T) [SETQ DECLAREX (for EXPR in BODYX collect EXPR when (EQ (CAR EXPR) 'DECLARE%:] (SETQ BODYX (CL:SET-DIFFERENCE BODYX DECLAREX)) [SETQ DECLAREY (for EXPR in BODYY collect EXPR when (EQ (CAR EXPR) 'DECLARE%:] (SETQ BODYY (CL:SET-DIFFERENCE BODYY DECLAREY)) (WITH-READER-ENVIRONMENT (OR ENVX ENVY (MAKE-READER-ENVIRONMENT)) (\CS.COMPARE.MASTERS BODYX BODYY DW? LISTSTREAM) (* ;; "Done with the non-DECLARE: expressions. Now sort what's left according to when it is eval'ed so that we can hopefully further reduce the amount of stuff to compare") (SETQ BODYX (\CS.SORT.DECLARES DECLAREX)) (SETQ BODYY (\CS.SORT.DECLARES DECLAREY)) [SETQ BODYX (APPEND BODYX (for Y in BODYY collect (LIST (CAR Y)) unless (SASSOC (CAR Y) BODYX] (* ;  "Add placeholders for any declaration types in Y not in X to simplify what follows") [for X in BODYX bind Y TYPE do (SETQ Y (SASSOC (CAR X) BODYY)) (SETQ TYPE (CAR X)) [SETQ X (LDIFFERENCE (CDR X) (PROG1 (CDR Y) (SETQ Y (LDIFFERENCE (CDR Y) X)))] (COND ((OR X Y) (printout LISTSTREAM T "------" [CONS 'DECLARE%: (APPEND ( CL:SET-DIFFERENCE TYPE DEFAULT.DECLARE.TAGS ) '(--] " forms------" T) (* ;  "REVERSE because \CS.SORT.DECLARES delivered expressions in reverse order") (\CS.COMPARE.MASTERS (REVERSE X) (REVERSE Y) DW? LISTSTREAM] (TERPRI LISTSTREAM)) (RETURN (OR (REVERSE DIFFERENCES) 'SAME]) (\CS.COMPARE.MASTERS (LAMBDA (BODYX BODYY DW? LISTSTREAM) (* ; "Edited 15-Apr-88 14:41 by bvm") (LET (FNSX FNSY YTHING XTHING PRED DIFS Y TMP DEFFERS) (DECLARE (USEDFREE DIFFERENCES)) (SETQ FNSX (for EXPR in BODYX collect EXPR when (EQ (CAR EXPR) (QUOTE DEFINEQ)))) (SETQ BODYX (CL:SET-DIFFERENCE BODYX FNSX)) (SETQ FNSX (for BOD in FNSX join (CDR BOD))) (SETQ FNSY (for EXPR in BODYY collect EXPR when (EQ (CAR EXPR) (QUOTE DEFINEQ)))) (SETQ BODYY (CL:SET-DIFFERENCE BODYY FNSY)) (SETQ FNSY (for BOD in FNSY join (CDR BOD))) (COND ((OR FNSX FNSY) (printout LISTSTREAM "---Functions: " T) (COND (DW? (LET ((NOSPELLFLG T)) (DECLARE (SPECVARS NOSPELLFLG)) (for X in FNSX when (SETQ Y (ASSOC (CAR X) FNSY)) do (* ; "Only bother dwimifying the ones that look different") (DWIMIFY (CADR X) T) (DWIMIFY (CADR Y) T))))) (COND ((SETQ DIFS (\CS.COMPARE.TYPES FNSX FNSY NIL (FUNCTION (LAMBDA (X Y STREAM) (COMPARELISTS (CADR X) (CADR Y) STREAM))) (FUNCTION CAR) LISTSTREAM)) (push DIFFERENCES (CONS (QUOTE FNS) DIFS)))))) (for TYPE in FILEPKGTYPES when (AND (CL:SYMBOLP TYPE) (SETQ DEFFERS (GET TYPE :DEFINED-BY))) do (* ;; "handle definer based things") (for DEFFER in DEFFERS do (SETQ XTHING (for X in BODYX collect X when (EQ (CAR X) DEFFER))) (SETQ YTHING (for X in BODYY collect X when (EQ (CAR X) DEFFER))) (SETQ BODYX (CL:SET-DIFFERENCE BODYX XTHING)) (SETQ BODYY (CL:SET-DIFFERENCE BODYY YTHING)) (COND ((SETQ DIFS (\CS.COMPARE.TYPES XTHING YTHING (CONCAT (OR (CL:DOCUMENTATION TYPE (QUOTE DEFINE-TYPES)) TYPE) " defined by " DEFFER) NIL (GET DEFFER :DEFINITION-NAME) LISTSTREAM)) (COND ((SETQ TMP (ASSOC TYPE DIFFERENCES)) (NCONC TMP DIFS)) (T (push DIFFERENCES (CONS TYPE DIFS)))))))) (for TYPE in COMPARESOURCETYPES do (SETQ PRED (fetch (CSTYPE PREDFN) of TYPE)) (SETQ XTHING (for X in BODYX collect X when (CL:FUNCALL PRED X))) (SETQ YTHING (for X in BODYY collect X when (CL:FUNCALL PRED X))) (SETQ BODYX (CL:SET-DIFFERENCE BODYX XTHING)) (SETQ BODYY (CL:SET-DIFFERENCE BODYY YTHING)) (COND ((SETQ DIFS (\CS.COMPARE.TYPES XTHING YTHING (OR (fetch (CSTYPE TITLE) of TYPE) (L-CASE (MKSTRING (fetch (CSTYPE FPKGTYPE) of TYPE)) T)) (fetch (CSTYPE COMPAREFN) of TYPE) (OR (fetch (CSTYPE IDFN) of TYPE) (FUNCTION CADR)) LISTSTREAM)) (SETQ TYPE (fetch (CSTYPE FPKGTYPE) of TYPE)) (COND ((SETQ TMP (ASSOC TYPE DIFFERENCES)) (NCONC TMP DIFS)) (T (push DIFFERENCES (CONS TYPE DIFS))))))) (SETQ BODYY (LDIFFERENCE BODYY (PROG1 BODYX (SETQ BODYX (LDIFFERENCE BODYX BODYY))))) (COND ((OR BODYX BODYY) (printout LISTSTREAM T "---Expressions:" T) (LET ((COMMENTX 0) (COMMENTY 0) EXTRAS) (* ; "Remove comments") (SETQ BODYX (for X in BODYX collect X unless (COND ((EQ (CAR X) COMMENTFLG) (add COMMENTX 1) T)))) (SETQ BODYY (for Y in BODYY collect Y unless (COND ((EQ (CAR Y) COMMENTFLG) (add COMMENTY 1) T)))) (COND ((OR (NEQ COMMENTX 0) (NEQ COMMENTY 0)) (printout LISTSTREAM |.I1| COMMENTX " comments -> " |.I1| COMMENTY " comments." T T))) (COND ((SETQ EXTRAS (COND (BODYX (COND (BODYY (COMPARELISTS BODYX BODYY LISTSTREAM) NIL) (T (printout LISTSTREAM "These are not on " FILEY) BODYX))) (BODYY (printout LISTSTREAM "These are not on " FILEX) BODYY))) (printout LISTSTREAM ":" T) (for X in EXTRAS do (LVLPRINT X LISTSTREAM 2 3)))) (COND ((AND (OR BODYX BODYY) (OR (EQ EXAMINE T) (EQMEMB (QUOTE MISC) EXAMINE))) (EDITE (LIST BODYX BODYY)))) (OR (ASSOC (QUOTE Other) DIFFERENCES) (push DIFFERENCES (LIST (QUOTE Other) (QUOTE --))))))))) ) (\CS.COMPARE.TYPES (LAMBDA (XTHING YTHING TITLE COMPAREFN IDFN LISTSTREAM) (DECLARE (USEDFREE FILEX FILEY EXAMINE)) (* ; "Edited 29-Dec-86 11:49 by jds") (* ;;; "Compare things using COMPAREFN. Deltas -> LISTSTREAM.") (COND ((AND (OR XTHING YTHING) (PROGN (SETQ XTHING (LDIFFERENCE XTHING (PROG1 YTHING (SETQ YTHING (LDIFFERENCE YTHING XTHING))))) (OR XTHING YTHING))) (LET (X Y RESULT NAME) (AND TITLE (printout LISTSTREAM T "---" TITLE ":" T T)) (for TAIL on XTHING do (SETQ NAME (CL:FUNCALL IDFN (SETQ X (CAR TAIL)))) (COND ((NOT (SETQ Y (find Y in YTHING suchthat (EQUAL (CL:FUNCALL IDFN Y) NAME)))) (printout LISTSTREAM |.P2| NAME " is not on " FILEY T) (COND ((OR (EQ EXAMINE T) (EQMEMB (QUOTE NEW) EXAMINE)) (EDITE X)))) (T (printout LISTSTREAM |.P2| NAME ": " T) (COND (COMPAREFN (CL:FUNCALL COMPAREFN X Y LISTSTREAM)) (T (COMPARELISTS X Y LISTSTREAM))) (TERPRI LISTSTREAM) (COND ((OR (EQ EXAMINE T) (EQMEMB (QUOTE OLD) EXAMINE)) (EDITE (LIST X Y)))) (RPLACA (FMEMB Y YTHING)))) (RPLACA TAIL) (push RESULT NAME)) (for Y in (LDIFFERENCE YTHING XTHING) do (printout LISTSTREAM |.P2| (SETQ NAME (CL:FUNCALL IDFN Y)) " is not on " FILEX T) (COND ((OR (EQ EXAMINE T) (EQMEMB (QUOTE NEW) EXAMINE)) (EDITE Y))) (push RESULT NAME)) RESULT)))) ) (\CS.SORT.DECLARES (LAMBDA (DECLS) (* bvm%: "15-Nov-85 18:58") (* ;;; "Sorts DECLS, a list of (DECLARE: --) expressions, into a set of declarations by tag, returning a list of entries of the form (tags . expressions)") (LET (RESULT) (DECLARE (SPECVARS RESULT)) (for DEC in DECLS do (\CS.SORT.DECLARE1 DEC DEFAULT.DECLARE.TAGS)) RESULT)) ) (\CS.SORT.DECLARE1 (LAMBDA (DEC TAGLST) (* bvm%: "15-Nov-85 19:09") (DECLARE (USEDFREE RESULT)) (* ;;; "Process one DECLARE: expression, partitioning it into subdeclarations put on RESULT assuming that the default tags in effect by the time you get here are in TAGLST") (for TAIL on (CDR DEC) bind CURRENT TAG COMPLEMENT do (COND ((NLISTP (SETQ TAG (CAR TAIL))) (* ; "Canonicalize tag") (SELECTQ TAG (DOEVAL@LOAD (SETQQ TAG EVAL@LOAD)) (DOEVAL@COMPILE (SETQQ TAG EVAL@COMPILE)) (DOCOPY (SETQQ TAG COPY)) NIL) (COND ((NOT (MEMB TAG TAGLST)) (SETQ TAGLST (COND ((STRPOS (QUOTE WHEN) TAG) (* ; "These take an extra expression") (APPEND TAGLST (LIST TAG (CAR (SETQ TAIL (CDR TAIL)))))) ((FMEMB (SETQ COMPLEMENT (SELECTQ TAG (COPY (QUOTE DONTCOPY)) (DONTCOPY (QUOTE COPY)) (EVAL@COMPILE (QUOTE DONTEVAL@COMPILE)) (DONTEVAL@COMPILE (QUOTE EVAL@COMPILE)) (EVAL@LOAD (QUOTE DONTEVAL@LOAD)) (DONTEVAL@LOAD (QUOTE EVAL@LOAD)) (FIRST (QUOTE NOTFIRST)) (NOTFIRST (QUOTE FIRST)) NIL)) TAGLST) (SUBST TAG COMPLEMENT TAGLST)) (T (APPEND TAGLST (LIST TAG))))) (SETQ CURRENT NIL)))) ((EQ (CAR TAG) (QUOTE DECLARE%:)) (* ; "Process embedded declaration") (\CS.SORT.DECLARE1 TAG TAGLST)) (T (* ; "Stick this expression on the entry for the tags that tell when to eval it") (COND ((AND (NOT CURRENT) (NOT (SETQ CURRENT (SASSOC TAGLST RESULT)))) (SETQ RESULT (NCONC1 RESULT (SETQ CURRENT (LIST TAGLST)))))) (push (CDR CURRENT) TAG))))) ) (\CS.FILTER.GARBAGE (LAMBDA (FILECONTENTS) (* ; "Edited 29-Dec-86 10:44 by jds") (* ;;; "Remove %"Uninteresting%" items from files to be compared. Removes FILECREATED form, filemap, copyright notice, and DECLARE: DONTCOPY items.") (for X in FILECONTENTS collect X unless (OR (EQ (CAR X) (QUOTE FILECREATED)) (AND (EQ (CAR X) (QUOTE DECLARE%:)) (EQ (CADR X) (QUOTE DONTCOPY)) (LISTP (CADDR X)) (OR (FMEMB (QUOTE COPYRIGHT) (CADDR X)) (FMEMB (QUOTE FILEMAP) (CADDR X))))))) ) ) (DEFINEQ (\CS.ISVARFORM (LAMBDA (X) (* bvm%: "25-Sep-85 12:05") (SELECTQ (CAR X) ((RPAQ RPAQQ RPAQ?) T) NIL))) (\CS.COMPARE.VARS (LAMBDA (X Y STREAM) (* ; "Edited 29-Dec-86 12:15 by jds") (* ;;; "Compares two variable setting forms") (COND ((EQ (CAR X) (CAR Y)) (* ; "Same type of setting fn") (COMPARELISTS (CADDR X) (CADDR Y) STREAM)) (T (LET ((XVAL (COND ((EQ (CAR X) (QUOTE RPAQQ)) (KWOTE (CADDR X))) (T (CADDR X)))) (YVAL (COND ((EQ (CAR Y) (QUOTE RPAQQ)) (KWOTE (CADDR Y))) (T (CADDR Y))))) (COND ((EQUAL XVAL YVAL) (* ; "Same value, different setter") (printout STREAM (COND ((EQ (CAR X) (QUOTE RPAQ?)) (QUOTE INITVARS)) (T (QUOTE VARS))) " -> " (COND ((EQ (CAR Y) (QUOTE RPAQ?)) (QUOTE INITVARS)) (T (QUOTE VARS))) T)) (T (COMPARELISTS XVAL YVAL STREAM))))))) ) (\CS.ISMACROFORM (LAMBDA (X) (* bvm%: "25-Sep-85 12:19") (SELECTQ (CAR X) (DEFMACRO T) (PUTPROPS (FMEMB (CADDR X) MACROPROPS)) NIL)) ) (\CS.ISRECFORM (LAMBDA (X) (* bvm%: "25-Sep-85 12:20") (FMEMB (CAR X) CLISPRECORDTYPES))) (\CS.ISCOURIERFORM (LAMBDA (X) (* bvm%: "13-Mar-86 16:21") (EQ (CAR X) (QUOTE COURIERPROGRAM)))) (\CS.ISTEMPLATEFORM (LAMBDA (X) (* bvm%: "13-Mar-86 16:20") (EQ (CAR X) (QUOTE SETTEMPLATE)))) (\CS.COMPARE.TEMPLATES (LAMBDA (X Y STREAM) (* ; "Edited 29-Dec-86 12:15 by jds") (* ;;; "Templates usually look like (SETTEMPLATE (QUOTE FN) (QUOTE TEMPLATE))") (COND ((AND (EQUAL (CADR X) (CADR Y)) (EQ (CAR (CADDR X)) (QUOTE QUOTE)) (EQ (CAR (CADDR Y)) (QUOTE QUOTE))) (COMPARELISTS (CADR (CADDR X)) (CADR (CADDR Y)) STREAM)) (T (COMPARELISTS X Y STREAM)))) ) (\CS.ISPROPFORM (LAMBDA (X) (* bvm%: "13-Mar-86 16:34") (* ;;; "(PUTPROPS SYMBOL PROP VALUE)") (AND (EQ (CAR X) (QUOTE PUTPROPS)) (NULL (CDDDDR X)))) ) (\CS.PROP.NAME (LAMBDA (X) (* bvm%: "13-Mar-86 16:29") (* ;;; "The 'Name' of a property is its atom/value pair") (LIST (CADR X) (CADDR X))) ) (\CS.COMPARE.PROPS (LAMBDA (X Y STREAM) (* ; "Edited 29-Dec-86 12:15 by jds") (* ;;; "Compare the values") (COMPARELISTS (CADDDR X) (CADDDR Y) STREAM)) ) (\CS.ISADDVARFORM (LAMBDA (X) (* bvm%: "13-Mar-86 16:40") (EQ (CAR X) (QUOTE ADDTOVAR)))) (\CS.COMPARE.ADDVARS (LAMBDA (X Y STREAM) (* ; "Edited 29-Dec-86 12:15 by jds") (* ;;; "(ADDTOVAR ListName . values)") (COMPARELISTS (CDDR X) (CDDR Y) STREAM)) ) (\CS.ISFPKGCOMFORM (LAMBDA (X) (* bvm%: "13-Mar-86 16:50") (* * (PUTDEF (QUOTE name) (QUOTE FILEPKGCOMS) (QUOTE stuff))) (AND (EQ (CAR X) (QUOTE PUTDEF)) (EQUAL (CADDR X) (QUOTE (QUOTE FILEPKGCOMS))))) ) (\CS.COMPARE.FPKGCOMS (LAMBDA (X Y STREAM) (* ; "Edited 29-Dec-86 12:16 by jds") (* * (PUTDEF (QUOTE name) (QUOTE FILEPKGCOMS) (QUOTE stuff))) (COMPARELISTS (CADR (CADDDR X)) (CADR (CADDDR Y)) STREAM)) ) ) (RPAQQ COMPARESOURCETYPES ((VARS \CS.ISVARFORM \CS.COMPARE.VARS) (MACROS \CS.ISMACROFORM) (RECORDS \CS.ISRECFORM) (PROPS \CS.ISPROPFORM \CS.COMPARE.PROPS \CS.PROP.NAME "Properties") (ADDVARS \CS.ISADDVARFORM \CS.COMPARE.ADDVARS CADR "Additions to lists") (TEMPLATES \CS.ISTEMPLATEFORM \CS.COMPARE.TEMPLATES CADADR) (COURIERPROGRAMS \CS.ISCOURIERFORM) (FILEPKGCOMS \CS.ISFPKGCOMFORM \CS.COMPARE.FPKGCOMS CADADR))) (RPAQQ DEFAULT.DECLARE.TAGS (EVAL@LOAD DONTEVAL@COMPILE COPY NOTFIRST)) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD CSTYPE (FPKGTYPE PREDFN COMPAREFN IDFN TITLE)) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS COMPARESOURCETYPES CLISPRECORDTYPES MACROPROPS DEFAULT.DECLARE.TAGS) ) ) (PUTPROPS COMPARESOURCES COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 2018)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1153 12054 (COMPARESOURCES 1163 . 5121) (\CS.COMPARE.MASTERS 5123 . 8554) ( \CS.COMPARE.TYPES 8556 . 9805) (\CS.SORT.DECLARES 9807 . 10150) (\CS.SORT.DECLARE1 10152 . 11572) ( \CS.FILTER.GARBAGE 11574 . 12052)) (12055 14783 (\CS.ISVARFORM 12065 . 12170) (\CS.COMPARE.VARS 12172 . 12834) (\CS.ISMACROFORM 12836 . 12974) (\CS.ISRECFORM 12976 . 13069) (\CS.ISCOURIERFORM 13071 . 13171) (\CS.ISTEMPLATEFORM 13173 . 13271) (\CS.COMPARE.TEMPLATES 13273 . 13638) (\CS.ISPROPFORM 13640 . 13795) (\CS.PROP.NAME 13797 . 13942) (\CS.COMPARE.PROPS 13944 . 14101) (\CS.ISADDVARFORM 14103 . 14196) (\CS.COMPARE.ADDVARS 14198 . 14363) (\CS.ISFPKGCOMFORM 14365 . 14572) (\CS.COMPARE.FPKGCOMS 14574 . 14781))))) STOP \ No newline at end of file diff --git a/lispusers/COMPARESOURCES.TEDIT b/lispusers/COMPARESOURCES.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..421b05b541af3b275823c931922373e44d2b2890 GIT binary patch literal 9365 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 literal 0 HcmV?d00001 diff --git a/lispusers/COMPARETEXT b/lispusers/COMPARETEXT new file mode 100644 index 00000000..954a5466 --- /dev/null +++ b/lispusers/COMPARETEXT @@ -0,0 +1,654 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") +(FILECREATED "18-Nov-93 14:43:00" {DSK}export>lispcore>lispusers>comparetext.;2 39517 + + changes to%: (VARS COMPARETEXTCOMS) + + previous date%: "11-Jul-85 09:12:06" {DSK}export>lispcore>lispusers>comparetext.;1) + + +(* ; " +Copyright (c) 1984, 1985, 1993 by Xerox Corporation. All rights reserved. +") + +(PRETTYCOMPRINT COMPARETEXTCOMS) + +(RPAQQ COMPARETEXTCOMS + ((DECLARE%: EVAL@COMPILE (FILES (LOADCOMP) + GRAPHER)) + (FNS COMPARETEXT IMCOMPARE.BOXNODE IMCOMPARE.CHUNKS IMCOMPARE.COLLECT.HASH.CHUNKS + IMCOMPARE.DISPLAY.FILE.DIFFERENCE.GRAPH IMCOMPARE.FIND.TEDIT.TEXT.OBJECT IMCOMPARE.HASH + IMCOMPARE.LEFTBUTTONFN IMCOMPARE.LENGTHEN.ATOM IMCOMPARE.MERGE.CONNECTED.CHUNKS + IMCOMPARE.MERGE.UNCONNECTED.CHUNKS IMCOMPARE.MIDDLEBUTTONFN IMCOMPARE.SHOW.DIST + IMCOMPARE.UPDATE.SYMBOL.TABLE) + (P (MOVD 'COMPARETEXT 'IMCOMPARE)) + (VARS (IMCOMPARE.LAST.NODE NIL) + (IMCOMPARE.LAST.GRAPH.WINDOW NIL) + (IMCOMPARE.HASH.TYPE.MENU NIL)) + (RECORDS IMCOMPARE.CHUNK IMCOMPARE.SYMB) + (FILES GRAPHER))) +(DECLARE%: EVAL@COMPILE + +(FILESLOAD (LOADCOMP) + GRAPHER) +) +(DEFINEQ + +(COMPARETEXT + [LAMBDA (NEWFILENAME OLDFILENAME HASH.TYPE GRAPH.REGION) + (* mjs " 8-Jan-84 21:06") + + (* Compares the two files, and produces a graph showing their corresponding + chunks. The courseness of the "chunking" is determined by HASH.TYPE, which may + be PARA, LINE, or WORD. HASH.TYPE = NIL defaults to PARA. + The file difference graph is displayed at GRAPHREGION. + If GRAPH.REGION = NIL, the user is asked to specify a region. + If GRAPH.REGION = T, a standard region is used.) + + (PROG ((NEWFILE (FINDFILE NEWFILENAME T)) + (OLDFILE (FINDFILE OLDFILENAME T))) + (if (AND OLDFILE NEWFILE) + then (* compare the two "chunks" + consisting of the entire text of the + two files) + (IMCOMPARE.CHUNKS (create IMCOMPARE.CHUNK + FILENAME _ NEWFILE + FILEPTR _ 0 + CHUNKLENGTH _ (GETFILEINFO NEWFILE 'LENGTH)) + (create IMCOMPARE.CHUNK + FILENAME _ OLDFILE + FILEPTR _ 0 + CHUNKLENGTH _ (GETFILEINFO OLDFILE 'LENGTH)) + HASH.TYPE + (if (EQ GRAPH.REGION T) + then (create REGION + LEFT _ 25 + BOTTOM _ 25 + WIDTH _ 500 + HEIGHT _ 150) + elseif GRAPH.REGION + else (CLRPROMPT) + (printout PROMPTWINDOW + "Please specify a window for the file difference graph" T) + (GETREGION))) + else (printout T "Can't find both files: " NEWFILENAME " & " OLDFILENAME + " --- IMCOMPARE aborted" T]) + +(IMCOMPARE.BOXNODE + [LAMBDA (NODE WINDOW) (* rmk%: "14-Dec-84 13:40") + (if IMCOMPARE.LAST.NODE + then (RESET/NODE/BORDER IMCOMPARE.LAST.NODE 'INVERT IMCOMPARE.LAST.GRAPH.WINDOW) + (SETQ IMCOMPARE.LAST.NODE NIL) + (SETQ IMCOMPARE.LAST.GRAPH.WINDOW NIL)) + (if NODE + then (RESET/NODE/BORDER NODE 'INVERT WINDOW) + (SETQ IMCOMPARE.LAST.NODE NODE) + (SETQ IMCOMPARE.LAST.GRAPH.WINDOW WINDOW]) + +(IMCOMPARE.CHUNKS + [LAMBDA (NEWFILE.SPEC.CHUNK OLDFILE.SPEC.CHUNK HASH.TYPE GRAPH.REGION) + (* rmk%: " 8-Sep-84 00:06") + + (* this is the main text-comparison function. + It compares the text in the two chunks and produces a graph showing how the sub-chunks of the two main + chunks are related. The two main chunks may be in the same file, and the file + may actually be an open Tedit textstream. + The main chunks are broken down according to HASH.TYPE, which may be PARA + , LINE, or WORD. HASH.TYPE = NIL defaults to PARA. + The file difference graph is displayed at GRAPH.REGION.) + + (* this text comparison algorithm is originally from the article + "A Technique for Isolating Differences Between Files" by Paul Heckel, in CACM, + V21, %#4, April 1978 --- major difference is that I use lists instead of arrays) + + (PROG ((CHUNK.SYMBOL.TABLE (HASHARRAY 500)) + NEWFILE.CHUNK.LIST OLDFILE.CHUNK.LIST) + + (* * collect lists of chunks from each of the main chunks, dividing them + according to HASH.TYPE) + + (SETQ NEWFILE.CHUNK.LIST (IMCOMPARE.COLLECT.HASH.CHUNKS NEWFILE.SPEC.CHUNK HASH.TYPE)) + (SETQ OLDFILE.CHUNK.LIST (IMCOMPARE.COLLECT.HASH.CHUNKS OLDFILE.SPEC.CHUNK HASH.TYPE)) + + (* * update the chunk symbol table. For each hash value, this table records the + number of "new" chunks with that hash value, the number of "old" chunks with + that value, and a pointer to the place in OLD.CHUNK.LIST .) + + (IMCOMPARE.UPDATE.SYMBOL.TABLE NEWFILE.CHUNK.LIST CHUNK.SYMBOL.TABLE NIL) + (IMCOMPARE.UPDATE.SYMBOL.TABLE OLDFILE.CHUNK.LIST CHUNK.SYMBOL.TABLE T) + + (* * For every new chunk whose hash value matches EXACTLY ONE old chunk's + value, "connect" it to the old chunk by setting the new chunk's OTHERCHUNK + field to point to the appropriate place in the old chunk list . Also, make sure that OTHERCHUNK of the matching old chunk is + non-NIL, so that unconnected old chunks will be merged correctly.) + + (for NEW.CHUNK in NEWFILE.CHUNK.LIST bind SYMB + do (SETQ SYMB (GETHASH (fetch (IMCOMPARE.CHUNK HASHVALUE) of NEW.CHUNK) + CHUNK.SYMBOL.TABLE)) + (if (AND (EQ 1 (fetch (IMCOMPARE.SYMB NEWCOUNT) of SYMB)) + (EQ 1 (fetch (IMCOMPARE.SYMB OLDCOUNT) of SYMB))) + then (replace (IMCOMPARE.CHUNK OTHERCHUNK) of NEW.CHUNK + with (fetch (IMCOMPARE.SYMB OLDPTR) of SYMB)) + (replace (IMCOMPARE.CHUNK OTHERCHUNK) + of (CAR (fetch (IMCOMPARE.SYMB OLDPTR) of SYMB)) + with T))) + + (* * merge connected chunks forward) + + (IMCOMPARE.MERGE.CONNECTED.CHUNKS NEWFILE.CHUNK.LIST NIL) + + (* * merge connected chunks backwards) + + (SETQ NEWFILE.CHUNK.LIST (DREVERSE NEWFILE.CHUNK.LIST)) + (SETQ OLDFILE.CHUNK.LIST (DREVERSE OLDFILE.CHUNK.LIST)) + (IMCOMPARE.MERGE.CONNECTED.CHUNKS NEWFILE.CHUNK.LIST T) + (SETQ NEWFILE.CHUNK.LIST (DREVERSE NEWFILE.CHUNK.LIST)) + (SETQ OLDFILE.CHUNK.LIST (DREVERSE OLDFILE.CHUNK.LIST)) + + (* * merge unconnected chunks) + + (IMCOMPARE.MERGE.UNCONNECTED.CHUNKS NEWFILE.CHUNK.LIST) + (IMCOMPARE.MERGE.UNCONNECTED.CHUNKS OLDFILE.CHUNK.LIST) + + (* * now, the file comparison is complete. + Format and display the file difference graph) + + (IMCOMPARE.DISPLAY.FILE.DIFFERENCE.GRAPH NEWFILE.SPEC.CHUNK OLDFILE.SPEC.CHUNK + HASH.TYPE GRAPH.REGION NEWFILE.CHUNK.LIST OLDFILE.CHUNK.LIST]) + +(IMCOMPARE.COLLECT.HASH.CHUNKS + [LAMBDA (CHUNK HASH.TYPE) (* mjs " 8-Jan-84 20:57") + + (* * returns a list of the chunks in CHUNK as hashed of type HASH.TYPE) + + (PROG ((FILENAME (fetch (IMCOMPARE.CHUNK FILENAME) of CHUNK)) + STREAM END.OF.CHUNK.PTR CHUNK.LIST) + [SETQ STREAM (GETSTREAM (OPENFILE FILENAME 'INPUT 'OLD] + (SETFILEPTR STREAM (fetch (IMCOMPARE.CHUNK FILEPTR) of CHUNK)) + (SETQ END.OF.CHUNK.PTR (IPLUS (fetch (IMCOMPARE.CHUNK FILEPTR) of CHUNK) + (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of CHUNK))) + (SETQ CHUNK.LIST (until (IGEQ (GETFILEPTR STREAM) + END.OF.CHUNK.PTR) collect (IMCOMPARE.HASH STREAM + END.OF.CHUNK.PTR + HASH.TYPE))) + (CLOSEF STREAM) + (RETURN CHUNK.LIST]) + +(IMCOMPARE.DISPLAY.FILE.DIFFERENCE.GRAPH + [LAMBDA (NEWFILE.SPEC.CHUNK OLDFILE.SPEC.CHUNK HASH.TYPE GRAPH.REGION NEWFILE.CHUNK.LIST + OLDFILE.CHUNK.LIST) (* mjs "11-Jul-85 09:10") + + (* * format and display the graph) + + (PROG ((NEWFILENAME (fetch (IMCOMPARE.CHUNK FILENAME) of NEWFILE.SPEC.CHUNK)) + (OLDFILENAME (fetch (IMCOMPARE.CHUNK FILENAME) of OLDFILE.SPEC.CHUNK)) + (OLD.CHUNK.NODE.FROM.NODES NIL) + (BORDERSIZE 1) + GRAPH.WINDOW NEW.CHUNK.NODES OLD.CHUNK.NODES OLD.CHUNK.XCOORD NEW.CHUNK.XCOORD + YCOORD.INCREMENT DIFF.GRAPH) + + (* * set up GRAPH.WINDOW. This is done first so you can get the width and + height of strings to be printed in the window.) + + [SETQ GRAPH.WINDOW (CREATEW GRAPH.REGION (CONCAT "Text File Differences, hashed by " + (SELECTQ HASH.TYPE + ((PARA NIL) + "Paragraph") + (LINE "Line") + (WORD "Word") + (SHOULDNT] + (WINDOWPROP GRAPH.WINDOW 'IMPARE.HASH.TYPE HASH.TYPE) + [WINDOWADDPROP GRAPH.WINDOW 'CLOSEFN (FUNCTION (LAMBDA (WINDOW) + (if (EQ WINDOW + IMCOMPARE.LAST.GRAPH.WINDOW) + then (SETQ + IMCOMPARE.LAST.GRAPH.WINDOW + NIL) + (SETQ IMCOMPARE.LAST.NODE NIL] + (SETQ NEW.CHUNK.XCOORD (IQUOTIENT (STRINGWIDTH NEWFILENAME GRAPH.WINDOW) + 2)) + [SETQ OLD.CHUNK.XCOORD (IPLUS NEW.CHUNK.XCOORD (IMAX 100 (IPLUS NEW.CHUNK.XCOORD + (IQUOTIENT (STRINGWIDTH + OLDFILENAME + GRAPH.WINDOW) + 2) + 20] + [SETQ YCOORD.INCREMENT (IMINUS (IPLUS 2 (ITIMES 2 BORDERSIZE) + (fetch (REGION HEIGHT) of (STRINGREGION + NEWFILENAME + GRAPH.WINDOW] + + (* * collect new-chunk graph nodes, while accumulating + OLD.CHUNK.NODE.FROM.NODES, assoc list from old-chunks to new-chunks) + + (SETQ NEW.CHUNK.NODES (for NEW.CHUNK in NEWFILE.CHUNK.LIST as Y from + YCOORD.INCREMENT + by YCOORD.INCREMENT bind CORRESPONDING.OLD.CHUNK + collect (SETQ CORRESPONDING.OLD.CHUNK + (CAR (fetch (IMCOMPARE.CHUNK OTHERCHUNK) + of NEW.CHUNK))) + (if CORRESPONDING.OLD.CHUNK + then (SETQ OLD.CHUNK.NODE.FROM.NODES + (CONS (CONS CORRESPONDING.OLD.CHUNK NEW.CHUNK) + OLD.CHUNK.NODE.FROM.NODES))) + (* Start out with 2 point white + border, so we can invert it) + (NODECREATE NEW.CHUNK (IMCOMPARE.LENGTHEN.ATOM + (PACK* (fetch (IMCOMPARE.CHUNK + FILEPTR) + of NEW.CHUNK) + ":" + (fetch (IMCOMPARE.CHUNK + CHUNKLENGTH) + of NEW.CHUNK)) + 12) + (create POSITION + XCOORD _ NEW.CHUNK.XCOORD + YCOORD _ Y) + (if CORRESPONDING.OLD.CHUNK + then (LIST CORRESPONDING.OLD.CHUNK) + else NIL) + NIL DEFAULTFONT -2))) + (SETQ OLD.CHUNK.NODES (for OLD.CHUNK in OLDFILE.CHUNK.LIST as Y from + YCOORD.INCREMENT + by YCOORD.INCREMENT bind CORRESPONDING.NEW.CHUNK + collect (SETQ CORRESPONDING.NEW.CHUNK (CDR (ASSOC OLD.CHUNK + OLD.CHUNK.NODE.FROM.NODES + ))) + (NODECREATE OLD.CHUNK (IMCOMPARE.LENGTHEN.ATOM + (PACK* (fetch (IMCOMPARE.CHUNK + FILEPTR) + of OLD.CHUNK) + ":" + (fetch (IMCOMPARE.CHUNK + CHUNKLENGTH) + of OLD.CHUNK)) + 12 "-") + (create POSITION + XCOORD _ OLD.CHUNK.XCOORD + YCOORD _ Y) + NIL + (if CORRESPONDING.NEW.CHUNK + then (LIST CORRESPONDING.NEW.CHUNK) + else NIL) + DEFAULTFONT -2))) + (SETQ DIFF.GRAPH (create GRAPH + DIRECTEDFLG _ T + SIDESFLG _ T + GRAPHNODES _ + (NCONC (LIST (NODECREATE NEWFILE.SPEC.CHUNK NEWFILENAME + (create POSITION + XCOORD _ NEW.CHUNK.XCOORD + YCOORD _ 0) + NIL NIL DEFAULTFONT -2)) + NEW.CHUNK.NODES + (LIST (NODECREATE OLDFILE.SPEC.CHUNK OLDFILENAME + (create POSITION + XCOORD _ OLD.CHUNK.XCOORD + YCOORD _ 0) + NIL NIL DEFAULTFONT -2)) + OLD.CHUNK.NODES))) + (SHOWGRAPH DIFF.GRAPH GRAPH.WINDOW (FUNCTION IMCOMPARE.LEFTBUTTONFN) + (FUNCTION IMCOMPARE.MIDDLEBUTTONFN) + T NIL]) + +(IMCOMPARE.FIND.TEDIT.TEXT.OBJECT + [LAMBDA (FILE) (* mjs " 2-Jan-84 16:19") + + (* returns the Tedit text object of the first Tedit window which is currently + looking at FILE, if there is one. Returns NIL if none is found.) + + (PROG ((TEDIT.TEXT.OBJECT NIL)) + (for X in (OPENWINDOWS) bind POSS.TOBJ POSS.FILENAME + when (SETQ POSS.TOBJ (WINDOWPROP X 'TEXTOBJ)) repeatuntil TEDIT.TEXT.OBJECT + do (SETQ POSS.FILENAME (FULLNAME (fetch (TEXTOBJ TXTFILE) of POSS.TOBJ))) + (if (EQ FILE POSS.FILENAME) + then (SETQ TEDIT.TEXT.OBJECT POSS.TOBJ))) + (RETURN TEDIT.TEXT.OBJECT]) + +(IMCOMPARE.HASH + [LAMBDA (STREAM EOF.PTR HASH.TYPE) (* rmk%: " 8-Sep-84 00:37") + + (* reads caracters from STREAM and creates a hash value for the "next" "chunk" + A chunk is a paragraph ending in two consecutive CRs , + a line ending in a CR , or a word ending in any white space + character space . In computing the hash value, white space is + ignored. IMCOMPARE.HASH automatically stops before reading char number EOF.PTR + Returns an IMCOMPARE.CHUNK containing the hash value, the file pointer of the + beginning of the chunk, the length of the chunk, and the fullname of the stream) + + (* Note%: Most of the time in COMPARETEXT is spent reading in and hashing + chunks, so this function was optimizes for speed, at the expense of length) + + (PROG ((BEGIN.FILE.PTR (GETFILEPTR STREAM)) + (EOLC (GETFILEINFO STREAM 'EOL)) + (HASHNUM 0) + FILE.PTR C) + (SETQ FILE.PTR BEGIN.FILE.PTR) + (SELECTQ HASH.TYPE + ((NIL PARA) + + (* Paragraph chunks end with two consecutive EOL's. + In order to detect this without slowing down the gobbling of normal chars, + LAST.EOL.POS is set to the filepos of the last EOL detected. + This is only checked when another EOL comes along.) + + (PROG ((LAST.EOL.POS -5)) + loop + (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SETQ FILE.PTR (ADD1 FILE.PTR)) + (SELCHARQ (SETQ C (BIN STREAM)) + (CR + + (* If this is the second consecutive CR, this is the end of the chunk. + Otherwise, reset LAST.EOL.POS) + + (SELECTQ EOLC + (CR (if (IEQP LAST.EOL.POS (SUB1 (GETFILEPTR STREAM))) + then (GO endchunk) + else (SETQ LAST.EOL.POS (GETFILEPTR STREAM)))) + (CRLF (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SELCHARQ (\PEEKBIN STREAM T) + (LF (SETQ FILE.PTR (ADD1 FILE.PTR)) + (BIN STREAM) + (if (IEQP LAST.EOL.POS (IDIFFERENCE + (GETFILEPTR STREAM) + 2)) + then (GO endchunk) + else (SETQ LAST.EOL.POS (GETFILEPTR STREAM + )))) + NIL)) + NIL)) + (LF [COND + ((EQ EOLC 'LF) + (if (IEQP LAST.EOL.POS (SUB1 (GETFILEPTR STREAM))) + then (GO endchunk) + else (SETQ LAST.EOL.POS (GETFILEPTR STREAM]) + ((SPACE TAB)) + (SETQ HASHNUM (ROT (ROT (ROT (LOGXOR HASHNUM C) + 1 16) + 1 16) + 1 16))) + (GO loop))) + (LINE (* Line chunks end on a single CR.) + (PROG NIL + loop + (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SETQ FILE.PTR (ADD1 FILE.PTR)) + (SELCHARQ (SETQ C (BIN STREAM)) + (CR (SELECTQ EOLC + (CR (GO endchunk)) + (LF) + (CRLF (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SELCHARQ (\PEEKBIN STREAM T) + (LF (SETQ FILE.PTR (ADD1 FILE.PTR)) + (BIN STREAM) + (GO endchunk)) + NIL)) + (SHOULDNT))) + (LF (AND (EQ EOLC 'LF) + (GO endchunk))) + ((SPACE TAB)) + (SETQ HASHNUM (ROT (ROT (ROT (LOGXOR HASHNUM C) + 1 16) + 1 16) + 1 16))) + (GO loop))) + (WORD (* word chunks end on any white + space) + (PROG NIL + loop + (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SETQ FILE.PTR (ADD1 FILE.PTR)) + (SELCHARQ (SETQ C (BIN STREAM)) + ((CR SPACE TAB LF) + (GO endchunk)) + (SETQ HASHNUM (ROT (ROT (ROT (LOGXOR HASHNUM C) + 1 16) + 1 16) + 1 16))) + (GO loop))) + (SHOULDNT)) + endchunk + (* flush all white space before next + chunk) + (if (IGEQ FILE.PTR EOF.PTR) + then (GO return)) + (SETQ FILE.PTR (ADD1 FILE.PTR)) + (SELCHARQ (BIN STREAM) + ((CR SPACE TAB LF) + (GO endchunk)) + (PROGN (SETQ FILE.PTR (SUB1 FILE.PTR)) + (SETFILEPTR STREAM FILE.PTR))) + return + (RETURN (create IMCOMPARE.CHUNK + HASHVALUE _ HASHNUM + FILEPTR _ BEGIN.FILE.PTR + CHUNKLENGTH _ (IDIFFERENCE FILE.PTR BEGIN.FILE.PTR) + FILENAME _ (FULLNAME STREAM]) + +(IMCOMPARE.LEFTBUTTONFN + [LAMBDA (GNODE WINDOW) (* mjs " 2-Apr-85 14:21") + (if GNODE + then (IMCOMPARE.BOXNODE GNODE WINDOW) + (PROG ((NODEID (fetch (GRAPHNODE NODEID) of GNODE)) + (FILEPTR 1) + (CHUNKLENGTH 0) + (TEDIT.TEXT.OBJECT NIL) + FILE) + (SETQ FILE (fetch (IMCOMPARE.CHUNK FILENAME) of NODEID)) + (SETQ FILEPTR (fetch (IMCOMPARE.CHUNK FILEPTR) of NODEID)) + (SETQ CHUNKLENGTH (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of NODEID)) + (SETQ TEDIT.TEXT.OBJECT (IMCOMPARE.FIND.TEDIT.TEXT.OBJECT FILE)) + (if TEDIT.TEXT.OBJECT + then (TEDIT.SETSEL TEDIT.TEXT.OBJECT (IMAX 1 (IDIFFERENCE FILEPTR 25)) + 0 + 'LEFT) + (TEDIT.NORMALIZECARET TEDIT.TEXT.OBJECT) + (TEDIT.SETSEL TEDIT.TEXT.OBJECT FILEPTR CHUNKLENGTH 'LEFT) + (TEDIT.NORMALIZECARET TEDIT.TEXT.OBJECT) + (TTY.PROCESS (WINDOWPROP (CAR (fetch (TEXTOBJ \WINDOW) of + + TEDIT.TEXT.OBJECT + )) + 'PROCESS)) + else (TEDIT FILE NIL NIL (LIST 'SEL (LIST FILEPTR CHUNKLENGTH]) + +(IMCOMPARE.LENGTHEN.ATOM + [LAMBDA (X MIN.LENGTH EXTENDER) (* mjs "30-Dec-83 15:11") + + (* makes sure that the atom X is at least MIN.LENGTH characters long, by + concatinating the first character of EXTENDER + (or space, if not given) to the front) + + (PROG ((C (CHCON X))) + (SETQ EXTENDER (if EXTENDER + then (CHCON1 EXTENDER) + else (CHARCODE SPACE))) + (while (ILESSP (LENGTH C) + MIN.LENGTH) do (SETQ C (CONS EXTENDER C))) + (RETURN (PACKC C]) + +(IMCOMPARE.MERGE.CONNECTED.CHUNKS + [LAMBDA (NEW.CHUNK.LIST BACKWARDS.FLG) (* mjs " 6-Jan-84 10:35") + (while NEW.CHUNK.LIST bind NEW.CHUNK OLD.CHUNK.PTR + do (SETQ NEW.CHUNK (CAR NEW.CHUNK.LIST)) + (SETQ OLD.CHUNK.PTR (fetch (IMCOMPARE.CHUNK OTHERCHUNK) of NEW.CHUNK)) + (if [OR (NULL (CDR NEW.CHUNK.LIST)) + (NULL OLD.CHUNK.PTR) + (NULL (CDR OLD.CHUNK.PTR)) + (NOT (EQP (fetch (IMCOMPARE.CHUNK HASHVALUE) of (CADR NEW.CHUNK.LIST + )) + (fetch (IMCOMPARE.CHUNK HASHVALUE) of (CADR OLD.CHUNK.PTR] + then (SETQ NEW.CHUNK.LIST (CDR NEW.CHUNK.LIST)) + else + + (* next chunks have same hash, so "murge" them into current chunks by adding + their chunk lengths to the current chunks, and splicing out the next chunks) + + [replace (IMCOMPARE.CHUNK CHUNKLENGTH) of NEW.CHUNK + with (IPLUS (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of NEW.CHUNK) + (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of (CADR + NEW.CHUNK.LIST + ] + [replace (IMCOMPARE.CHUNK CHUNKLENGTH) of (CAR OLD.CHUNK.PTR) + with (IPLUS (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of (CAR + OLD.CHUNK.PTR + )) + (fetch (IMCOMPARE.CHUNK CHUNKLENGTH) of (CADR + OLD.CHUNK.PTR + ] + [if BACKWARDS.FLG + then (* if the list is backwards, copy + next fileptr) + (replace (IMCOMPARE.CHUNK FILEPTR) of NEW.CHUNK + with (fetch (IMCOMPARE.CHUNK FILEPTR) of (CADR + NEW.CHUNK.LIST + ))) + (replace (IMCOMPARE.CHUNK FILEPTR) of (CAR OLD.CHUNK.PTR) + with (fetch (IMCOMPARE.CHUNK FILEPTR) of (CADR + OLD.CHUNK.PTR + ] + (* splice chunks out of new and old + list) + (RPLACD NEW.CHUNK.LIST (CDDR NEW.CHUNK.LIST)) + (RPLACD OLD.CHUNK.PTR (CDDR OLD.CHUNK.PTR]) + +(IMCOMPARE.MERGE.UNCONNECTED.CHUNKS + [LAMBDA (CHUNK.LST) (* mjs " 5-JAN-84 13:58") + (while CHUNK.LST bind CHUNK do (SETQ CHUNK (CAR CHUNK.LST)) + (if (OR (NULL (CDR CHUNK.LST)) + (fetch (IMCOMPARE.CHUNK OTHERCHUNK) + of CHUNK) + (fetch (IMCOMPARE.CHUNK OTHERCHUNK) + of (CADR CHUNK.LST))) + then (SETQ CHUNK.LST (CDR CHUNK.LST)) + else (* both current chunk and next chunk + have no OTHERCHUNK, so merge them) + [replace (IMCOMPARE.CHUNK CHUNKLENGTH) + of CHUNK + with (IPLUS (fetch (IMCOMPARE.CHUNK + CHUNKLENGTH) + of CHUNK) + (fetch (IMCOMPARE.CHUNK + CHUNKLENGTH) + of (CADR CHUNK.LST] + (* splice chunks out of new and old + list) + (RPLACD CHUNK.LST (CDDR CHUNK.LST]) + +(IMCOMPARE.MIDDLEBUTTONFN + [LAMBDA (GNODE WINDOW) (* mjs " 6-Jan-84 11:37") + + (* This function is called if the MIDDLE mouse button is pressed over a graph + node. The selected node is IMCOMPARE-ed with the last node selected . The type of hashing used is selected from a + pop-up menu. If none of the hashing types is selected, the current node is + boxed. The pop-up menu is always located a little above the current cursor + position, so a quick double-MIDDLE-click is an easy way to change the current + boxed node.) + + (if GNODE + then (PROG (INNER.HASH.TYPE) + (CLRPROMPT) + (printout PROMPTWINDOW "Please select the type of hashing you wish." T) + [SETQ INNER.HASH.TYPE + (MENU (if (type? MENU IMCOMPARE.HASH.TYPE.MENU) + then IMCOMPARE.HASH.TYPE.MENU + else (SETQ IMCOMPARE.HASH.TYPE.MENU + (create MENU + ITEMS _ '(PARA LINE WORD) + MENUOFFSET _ + (create POSITION + XCOORD _ 20 + YCOORD _ -20] + (if (NULL INNER.HASH.TYPE) + then (* if no hash type is selected, just + box the current node and return) + (IMCOMPARE.BOXNODE GNODE WINDOW) + (RETURN)) + (if (NULL IMCOMPARE.LAST.NODE) + then (CLRPROMPT) + (PRIN1 "You must select another graph node first." PROMPTWINDOW) + (RETURN)) + (printout PROMPTWINDOW "Comparing chunks by " INNER.HASH.TYPE T) + (IMCOMPARE.CHUNKS (fetch (GRAPHNODE NODEID) of IMCOMPARE.LAST.NODE + ) + (fetch (GRAPHNODE NODEID) of GNODE) + INNER.HASH.TYPE + (WINDOWPROP WINDOW 'REGION]) + +(IMCOMPARE.SHOW.DIST + [LAMBDA (LST MAX) (* mjs "30-Dec-83 15:13") + (PROG ((WINDOW (CREATEW)) + MAX.Y X MAX.X) + (SETQ MAX.X (WINDOWPROP WINDOW 'WIDTH)) + (SETQ MAX.Y (WINDOWPROP WINDOW 'HEIGHT)) + (for SAMPLE in LST do (SETQ X (FTIMES MAX.X (FQUOTIENT SAMPLE MAX))) + (DRAWLINE X 0 X MAX.Y 1 'PAINT WINDOW]) + +(IMCOMPARE.UPDATE.SYMBOL.TABLE + [LAMBDA (CHUNK.LIST CHUNK.SYMBOL.TABLE OLD.CHUNK.FLG) (* mjs " 8-Jan-84 21:01") + + (* * update the chunk symbol table. For each hash value, this table records the + number of "new" chunks with that hash value, the number of "old" chunks with + that value, and a pointer to the place in OLD.CHUNK.LIST .) + + (for CHUNK.PTR on CHUNK.LIST bind CHUNK SYMB + do (SETQ CHUNK (CAR CHUNK.PTR)) + (SETQ SYMB (if (GETHASH (fetch (IMCOMPARE.CHUNK HASHVALUE) of CHUNK) + CHUNK.SYMBOL.TABLE) + else (PUTHASH (fetch (IMCOMPARE.CHUNK HASHVALUE) of CHUNK) + (create IMCOMPARE.SYMB + NEWCOUNT _ 0 + OLDCOUNT _ 0 + OLDPTR _ NIL) + CHUNK.SYMBOL.TABLE))) + (if OLD.CHUNK.FLG + then (* increment old-chunk count) + (replace (IMCOMPARE.SYMB OLDCOUNT) of SYMB + with (ADD1 (fetch (IMCOMPARE.SYMB OLDCOUNT) of SYMB))) + + (* smash old-chunk pointer. Note that it must point to the LIST of old-chunks, + rather than to the individual one) + + (replace (IMCOMPARE.SYMB OLDPTR) of SYMB with CHUNK.PTR) + else (* increment new-chunk count) + (replace (IMCOMPARE.SYMB NEWCOUNT) of SYMB + with (ADD1 (fetch (IMCOMPARE.SYMB NEWCOUNT) of SYMB]) +) + +(MOVD 'COMPARETEXT 'IMCOMPARE) + +(RPAQQ IMCOMPARE.LAST.NODE NIL) + +(RPAQQ IMCOMPARE.LAST.GRAPH.WINDOW NIL) + +(RPAQQ IMCOMPARE.HASH.TYPE.MENU NIL) +(DECLARE%: EVAL@COMPILE + +(RECORD IMCOMPARE.CHUNK (HASHVALUE FILEPTR CHUNKLENGTH FILENAME . OTHERCHUNK) + FILEPTR _ 1 CHUNKLENGTH _ 0) + +(RECORD IMCOMPARE.SYMB (NEWCOUNT OLDCOUNT . OLDPTR)) +) + +(FILESLOAD GRAPHER) +(PUTPROPS COMPARETEXT COPYRIGHT ("Xerox Corporation" 1984 1985 1993)) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (1295 39023 (COMPARETEXT 1305 . 3700) (IMCOMPARE.BOXNODE 3702 . 4218) (IMCOMPARE.CHUNKS +4220 . 8406) (IMCOMPARE.COLLECT.HASH.CHUNKS 8408 . 9491) (IMCOMPARE.DISPLAY.FILE.DIFFERENCE.GRAPH 9493 + . 18359) (IMCOMPARE.FIND.TEDIT.TEXT.OBJECT 18361 . 19124) (IMCOMPARE.HASH 19126 . 26281) ( +IMCOMPARE.LEFTBUTTONFN 26283 . 28019) (IMCOMPARE.LENGTHEN.ATOM 28021 . 28659) ( +IMCOMPARE.MERGE.CONNECTED.CHUNKS 28661 . 32157) (IMCOMPARE.MERGE.UNCONNECTED.CHUNKS 32159 . 34114) ( +IMCOMPARE.MIDDLEBUTTONFN 34116 . 36688) (IMCOMPARE.SHOW.DIST 36690 . 37136) ( +IMCOMPARE.UPDATE.SYMBOL.TABLE 37138 . 39021))))) +STOP diff --git a/lispusers/COMPARETEXT.TEDIT b/lispusers/COMPARETEXT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..e5a3011999ed32e666c2ad6aa3f6abec30d04baa GIT binary patch literal 6144 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.;3 3465 changes to%: (FNS COMPILE!) previous date%: "18-Nov-86 22:23:43" {ERIS}LISPCORE>COMPILEBANG.;2) (* " Copyright (c) 1982, 1983, 1984, 1986 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COMPILEBANGCOMS) (RPAQQ COMPILEBANGCOMS ((FNS COMPILE!) (LISPXMACROS C) (USERMACROS C) (COMMANDS C) (PROP FILETYPE COMPILEBANG))) (DEFINEQ (COMPILE! [LAMBDA (X NOSAVE NOREDEFINE PRINTLAP) (* bvm%: "10-MAR-83 12:48") (DECLARE (SPECVARS LCFIL LAPFLG STRF SVFLG LSTFIL SPECVARS LOCALVARS NLAMA NLAML LAMS LAMA NOFIXFNSLST NOFIXVARSLST)) (* ;; "In-core compiling for functions and forms, without the interview. If X is a list, we assume that we are being called merely to display the lap and machine code. THe form is compiled as the definition of FOO but the compiled code is thrown away. --- If X is a litatom, then saving, redefining, and printing is controlled by the flags.") (RESETLST (* ; "RESETLST to provide reset context for macros under COMPILE1 as generated e.g. by DECL.") (LET ((LCFIL) [LAPFLG (AND PRINTLAP (COND (BYTECOMPFLG T) (T 2] (STRF (NOT NOREDEFINE)) (SVFLG (NOT NOSAVE)) (LSTFIL T) (SPECVARS T) (LOCALVARS (COND ((NEQ LOCALVARS T) (UNION SYSLOCALVARS LOCALVARS)) (T SYSLOCALVARS))) (NLAMA NLAMA) (NLAML NLAML) (LAMS LAMS) (LAMA LAMA) (NOFIXFNSLST NOFIXFNSLST) (NOFIXVARSLST NOFIXVARSLST)) (COMPILE1 (COND ((LITATOM X) X) (T '*DUMMY-COMPILED-FUNCTION*)) (COND ((NLISTP X) (VIRGINFN X T)) ((ARGTYPE X) X) (T (LIST 'LAMBDA NIL X))) T]) ) (ADDTOVAR LISPXMACROS (C (COND (LISPXLINE (COMPILE! (CAR LISPXLINE) NIL NIL T)) (T C)))) (ADDTOVAR USERMACROS [C NIL (ORR (UP 1) NIL) (ORR ((E (COMPILE! (OR (LISTP (%##)) (%## !0)) T T T))) ((E 'C?]) (ADDTOVAR EDITCOMSA C) (DEFCOMMAND (C :EVAL) (&REST LISPXLINE) (COND (LISPXLINE (COMPILE! (CAR LISPXLINE) NIL NIL T)) (T C))) (PUTPROPS COMPILEBANG FILETYPE CL:COMPILE-FILE) (PUTPROPS COMPILEBANG COPYRIGHT ("Xerox Corporation" 1982 1983 1984 1986)) (DECLARE%: DONTCOPY (FILEMAP (NIL (622 2567 (COMPILE! 632 . 2565))))) STOP \ No newline at end of file diff --git a/lispusers/COMPILEBANG.TEDIT b/lispusers/COMPILEBANG.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..bfa0d8419a392aaac4501fb89c351f070c8254fb GIT binary patch literal 3934 zcmeHJZExFD6n4AUQY-;t5+4vc3<(k`i_$D3bcCek&G3|q!+$@H~4zbf0 zegWDaLPC5++P{M5T)#9;yKWN_d?9M=d(S=R+~+*cxi=NzZ^wT|@mkC7bPZGA(X2hS zuBr`H-B8shtGfey-#D)|H;ft}L;XLf~I%V~JUICba z%xVVl^iO@{B$`x+f+VJa7zSY=A!0R)9!OYmf+7c~R>CbR>5K80 z=HXbx@d7TS%L|Lfg9~YgSUKapWB(ZWKn9Zvai(IHoB>aqoaf_m0oRJ)042a8Gd}jG z1TnzTC_$)8#Vih}@Q$c*8O9_T@RXxNWXXKCL zh>nCL3*gWP6Q+=XGfC)!N)bqY9M30c4B1Cq**r#9!A~}lh!fQO;~Z%~WGn<%G>T4A zcg{>F(Hx9r)MFnHIphLzh{=%{3{n+*GX2TXz$bA!oq>IBE9N{G4WafBv-yni0SQ_Z zDZ;4e!Us}2FoW6(buk6CQk$yUT6>oEWry4GIk*&L8gBQnqqQ8HS}2}7E$`3@odn6K z=t*c>$@LAzX+mNwCL&B&LS`lir}G4YheDRgGPMZABMW*etD{2bI_^po!R0YB8NJk3 zd^!;e%!CtTx#cuV%;fUdmsq(Ecy)$6uLTPjfuO+T++Ss97shsYW&0+^EymqdI0K8JeecG}E@9xK#SC zr|nWpw>%wpOPN~xnv<=#J>I+J7+nvE4C}yfjU7`byWJ*NH}#g+1rkrryN>O_pzo%u z40xkPZLMRNPpMW)SBf$o@mcgX~}q@U<^FAeWm@F>>w!>(qzhHa6f@AXVHhHKhg zy_kKk8+-d6b@W|a@(fIO@|}CGj*AiOFng}|6mT&rgEpt5fu2jeftZc020h%Q`t~+n z<q=cuyHb&$6(Z%(+@ovC?$l;qfKfwH)*p5RTxeg zkymNV{+9$^mR8pD4%#|Q)AY<;UnXvDXqxNY0q$qoXW4XSTZv$;s` z>!m>l+Ln|Q3e zT9K<4A1huluk$DiS-mEt2v90n#5&$LSFy=8pWOFD>3icEPX&2jDlb>ImD}&&%L(6v zVV|8)q5LdWxXzbNc5IaOg&QpOzVy7Q+*R%=cUq?Ax<*U+D0Ns>-e~-!@cdZ0onHIO z`&Zbw`1Et`_g-p%ke6&&`9|3&;a^{^XL@ZLKRO#!+SBl3g`XK*6X_6#xP+gvj$vsg zZKGkbl-X9RvSFl>ERpOO)RYc*CN0I%Em$OWZZkzmqgUayzVGx*y}GA+ZENL9uvw}+ zkgNT70}JeF->xcbxDLX(NE!A#@J-lX8^{U1!dH^co3r8GqM=|q=ZVGmW6^^JS<4Ml zox7NQ%9a!t25gZ!bC$w~H{^7m;hWwQJm4VyUbHy5MW*5Pc5ac*{AlDB35PA5y{L^R sUoRUZ7COURIERDEFS.;4| 7141 changes to%: (VARS COURIERDEFSCOMS) previous date%: "15-Sep-87 11:22:40" |{MCS:MCS:STANFORD}COURIERDEFS.;3|) (* " Copyright (c) 1985, 1986, 1987, 1988 by Xerox Corporation & Stanford University. All rights reserved. ") (PRETTYCOMPRINT COURIERDEFSCOMS) (RPAQQ COURIERDEFSCOMS ((FNS READCOURIERATOM READCOURIERBRUSH READCOURIERFONT WRITECOURIERFONT WRITECOURIERBRUSH READCOURIERNUMBER WRITECOURIERNUMBER READCOURIERPOSITION WRITECOURIERPOSITION READCOURIERTEXTURE WRITECOURIERTEXTURE) (PROP COURIERDEF ATOM BRUSH FONT NUMBER POSITION TEXTURE) (COURIERPROGRAMS INTERLISP))) (DEFINEQ (READCOURIERATOM [LAMBDA (STREAM PROGRAM TYPE) (* cdl "10-Nov-85 17:16") (MKATOM (COURIER.READ.STRING STREAM]) (READCOURIERBRUSH [LAMBDA (STREAM PROGRAM TYPE) (* cdl "21-Nov-85 19:10") (* DECLARATIONS%: (RECORD ITEM  (TYPENAME VALUE))) (with ITEM (COURIER.READ STREAM 'INTERLISP 'LISPBRUSH) (SELECTQ TYPENAME (NIL NIL) ((NUMBERP BRUSH) VALUE) (SHOULDNT]) (READCOURIERFONT [LAMBDA (STREAM PROGRAM TYPE) (* cdl " 5-Dec-85 19:01") (FONTCREATE (COURIER.READ STREAM 'INTERLISP 'FONTRECORD]) (WRITECOURIERFONT [LAMBDA (STREAM FONT PROGRAM TYPE) (* cdl " 6-Feb-86 19:01") (COURIER.WRITE STREAM (COURIER.CREATE (INTERLISP . FONTRECORD) FAMILY _ (FONTPROP FONT 'FAMILY) SIZE _ (FONTPROP FONT 'SIZE) FACE _ (FONTPROP FONT 'FACE) ROTATION _ (FONTPROP FONT 'ROTATION) DEVICE _ (FONTPROP FONT 'DEVICE)) 'INTERLISP 'FONTRECORD]) (WRITECOURIERBRUSH [LAMBDA (STREAM ITEM PROGRAM TYPE) (* ; "Edited 3-Sep-87 09:54 by cdl") (COURIER.WRITE STREAM (if (NULL ITEM) then '(NIL 0) elseif (NUMBERP ITEM) then (LIST 'NUMBERP ITEM) elseif (LISTP ITEM) then [until [GEQ (LENGTH ITEM) (CONSTANT (LENGTH (RECORDFIELDNAMES 'BRUSH] do (SETQ ITEM (APPEND ITEM '(NIL] (LIST 'BRUSH ITEM) else (SHOULDNT)) 'INTERLISP 'LISPBRUSH]) (READCOURIERNUMBER [LAMBDA (STREAM PROGRAM TYPE) (* cdl "13-Oct-85 12:50") (* DECLARATIONS%: (RECORD ITEM  (TYPENAME VALUE))) (with ITEM (COURIER.READ STREAM 'INTERLISP 'LISPNUMBER) (SELECTQ TYPENAME (NIL NIL) (NUMBERP VALUE) (SHOULDNT]) (WRITECOURIERNUMBER [LAMBDA (STREAM ITEM PROGRAM TYPE) (* cdl "13-Oct-85 13:31") (COURIER.WRITE STREAM (if (NULL ITEM) then '(NIL 0) elseif (NUMBERP ITEM) then (LIST 'NUMBERP ITEM) else (SHOULDNT)) 'INTERLISP 'LISPNUMBER]) (READCOURIERPOSITION [LAMBDA (STREAM PROGRAM TYPE) (* cdl "21-Nov-85 18:47") (create POSITION XCOORD _ (COURIER.READ STREAM PROGRAM 'NUMBER) YCOORD _ (COURIER.READ STREAM PROGRAM 'NUMBER]) (WRITECOURIERPOSITION [LAMBDA (STREAM ITEM PROGRAM TYPE) (* cdl "21-Nov-85 18:46") (with POSITION ITEM (COURIER.WRITE STREAM XCOORD PROGRAM 'NUMBER) (COURIER.WRITE STREAM YCOORD PROGRAM 'NUMBER]) (READCOURIERTEXTURE [LAMBDA (STREAM PROGRAM TYPE) (* ; "Edited 15-Sep-87 11:18 by cdl") (LOGOR (LLSH (BIN STREAM) BITSPERBYTE) (BIN STREAM]) (WRITECOURIERTEXTURE [LAMBDA (STREAM SHADE PROGRAM TYPE) (* ; "Edited 15-Sep-87 11:22 by cdl") (SETQ SHADE (SELECTQ SHADE (T BLACKSHADE) (NIL WHITESHADE) (if (NUMBERP SHADE) then SHADE else BLACKSHADE))) (BOUT STREAM (LRSH SHADE BITSPERBYTE)) (BOUT STREAM (LOGAND SHADE (MASK.1'S 0 BITSPERBYTE]) ) (PUTPROPS ATOM COURIERDEF (READCOURIERATOM COURIER.WRITE.STRING)) (PUTPROPS BRUSH COURIERDEF (READCOURIERBRUSH WRITECOURIERBRUSH)) (PUTPROPS FONT COURIERDEF (READCOURIERFONT WRITECOURIERFONT)) (PUTPROPS NUMBER COURIERDEF (READCOURIERNUMBER WRITECOURIERNUMBER)) (PUTPROPS POSITION COURIERDEF (READCOURIERPOSITION WRITECOURIERPOSITION)) (PUTPROPS TEXTURE COURIERDEF (READCOURIERTEXTURE WRITECOURIERTEXTURE)) (COURIERPROGRAM INTERLISP (1100 0) TYPES [(REGION (SEQUENCE INTEGER)) (FONTRECORD (RECORD (FAMILY ATOM) (SIZE CARDINAL) (FACE FONTFACE) (ROTATION NUMBER) (DEVICE ATOM))) [FONTFACE (RECORD (WEIGHT (ENUMERATION (LIGHT 0) (MEDIUM 1) (BOLD 2))) (SLOPE (ENUMERATION (REGULAR 0) (ITALIC 1))) (EXPANSION (ENUMERATION (REGULAR 0) (COMPRESSED 1) (EXPANDED 2] (OPERATION (ENUMERATION (NIL 0) (REPLACE 1) (PAINT 2) (INVERT 3) (ERASE 4))) (LISPNUMBER (CHOICE (NIL 0 UNSPECIFIED) (NUMBERP 1 INTEGER))) (LISPBRUSH (CHOICE (NIL 0 UNSPECIFIED) (NUMBERP 1 CARDINAL) (BRUSH 2 (RECORD (BRUSHSHAPE ATOM) (BRUSHSIZE NUMBER) (BRUSHCOLOR NUMBER] PROCEDURES NIL ERRORS NIL) (PUTPROPS COURIERDEFS COPYRIGHT ("Xerox Corporation & Stanford University" 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (920 5241 (READCOURIERATOM 930 . 1083) (READCOURIERBRUSH 1085 . 1579) (READCOURIERFONT 1581 . 1754) (WRITECOURIERFONT 1756 . 2309) (WRITECOURIERBRUSH 2311 . 3168) (READCOURIERNUMBER 3170 . 3637) (WRITECOURIERNUMBER 3639 . 4057) (READCOURIERPOSITION 4059 . 4316) (WRITECOURIERPOSITION 4318 . 4566) (READCOURIERTEXTURE 4568 . 4779) (WRITECOURIERTEXTURE 4781 . 5239))))) STOP \ No newline at end of file diff --git a/lispusers/COURIERDEFS.TEDIT b/lispusers/COURIERDEFS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..2e564fe4897e779300675c2f721331c59d9d1b1c GIT binary patch literal 3555 zcmeHHOK;mo5T+dG;kr7sXwe=A$wdMb!B!Q=$*DB8l88{Gx}=)Nji%PtHZrO5Vb?wO znE%n=P@wk$`3wCwomoD_%2m<^MNcIJiaWFO?Kj`dtO$R({4GlM3}?no#s_TZHhaxx zzu7!&HtR-QqVeSVDS)wvWs*j#g^0oOLjf&%f9+-$;)jR2yy&{AAD%_=yvycUyN&`u z6sEom6YyabM}e4Uv3R%?NdiWc#S#J0d>;E39SHp8Qp~}$J;p85op#`AA%g|X#hDC6 z0*Sa3vA+ZsUPcL6GFd@-y+Vh-2E*f$G|qw)fpTXQlRp$!wFBjaOy#90cC;>~kM!2L z6Qz}i)9W^1QjjGAu4KBX01^=+6Y#@11WPHxw9Fyt0(c8iFrMFJD#Kuz&BfEE?l}|K zGolcI(ge~72_SJ9o zIdUulEDq92f>@psa*8a^urymvQ~o0A)DK?gFdNWy7MzVt$KKPiNZ)573B2KmtOJGfB6QRz>o=r{|-?QXvQPP0ZEX5u} z371I(rvhx#>NZdK%pI?JkuH~hETb%eRg@&C))H%hO-7yI!)cr)3us|zr^M}m!T`<; zhYvucLARajWsDuuU}b{qx?-!BMJ=<5VtFn@Z0=+w0(m9_Kb06zPsy1wt}7Mw5Ev#{ zEJ|CU9cPI6eapB9$QyUMtlRY13vb5RI$IwKQ-=^}r&lo7`M|VwG*!*m z!93C|R+DVh+*Kob3yCVpr2zb2M*bW}@btQx+6bkM;Ub!6IQ`gPep-yl##rGvS93-4 zq*wmpqEI!YnWS3fGoIfNb8H@EtZtBUE{R8$lzng7W5!L-g=86}Wz5EHlyk$%M`2f^ z=T-}^BoA7xsXk&#E&RfYxaKPcmPk`fZs=I1W7i`bm=&%QmpY(9mQlTX**Dc3+=0fY6nLYr6(S^tcZ7{|Eo| zl#NfYv2W^z!W=&C!&gVpJ3hw0cD}zgW;%A~D3_~PcrS^>%(l@%CX7Aq!{dG*9`)+6 z)bJ{hNYIuiN6>$C1V;x4IeZ%O+Ee}6B5?d~A=cRVU7mEw^_rh?yryc+J>mRHz49EZg literal 0 HcmV?d00001 diff --git a/lispusers/COURIEREVALSERVE b/lispusers/COURIEREVALSERVE new file mode 100644 index 00000000..d271ebf6 --- /dev/null +++ b/lispusers/COURIEREVALSERVE @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "21-Jul-88 11:44:33" |{MCS:MCS:STANFORD}COURIEREVALSERVE.;6| 9135 changes to%: (VARS COURIEREVALSERVECOMS) previous date%: "17-Sep-87 13:47:38" |{MCS:MCS:STANFORD}COURIEREVALSERVE.;5|) (* " Copyright (c) 1985, 1986, 1987, 1988 by Xerox Corporation & Stanford University. All rights reserved. ") (PRETTYCOMPRINT COURIEREVALSERVECOMS) (RPAQQ COURIEREVALSERVECOMS ((* Client Routines) (FNS REMOTEEVAL REMOTEAPPLY) (* Server Routines) (FNS CES.REMOTEEVAL CES.REMOTEAPPLY CES.ERRORN) (COURIERPROGRAMS EVAL) (FILES COURIERSERVE) (P (COURIER.START.SERVER)))) (* Client Routines) (DEFINEQ (REMOTEEVAL [LAMBDA (FORM COURIERSTREAM NOERRORFLG) (* ; "Edited 17-Sep-87 13:12 by cdl") (* DECLARATIONS%: (RECORD RESULT  (REJECTTYPE ERRORTYPE ERRORSTRING))) (LET (STRING STREAM RESULT) (DECLARE (SPECVARS STREAM STRING)) (if [LISTP (SETQ STRING (COURIER.CALL COURIERSTREAM 'EVAL 'EVAL (MKSTRING FORM T) 'RETURNERRORS] then [with RESULT STRING (if ERRORSTRING then [if (ZEROP (COURIER.FETCH (EVAL . ERRORN) NUMBER OF ERRORSTRING)) then (OR NOERRORFLG (ERROR "Remote evaluation error!" FORM)) else (OR NOERRORFLG (ERROR (ERRORMESS ERRORSTRING] else (OR NOERRORFLG (ERROR REJECTTYPE ERRORTYPE] elseif [SETQ RESULT (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM STRING 'INPUT] (NLSETQ (READ STREAM)))] then (CAR RESULT) else (OR NOERRORFLG (ERROR "Unreadable remote evaluation result!" STRING]) (REMOTEAPPLY [LAMBDA (FN ARGS COURIERSTREAM NOERRORFLG) (* ; "Edited 17-Sep-87 13:14 by cdl") (* DECLARATIONS%: (RECORD RESULT  (REJECTTYPE ERRORTYPE ERRORSTRING))) (LET (STRING STREAM RESULT) (DECLARE (SPECVARS STRING STREAM)) (if [LISTP (SETQ STRING (COURIER.CALL COURIERSTREAM 'EVAL 'APPLY (MKSTRING FN T) (for ARG in ARGS collect (MKSTRING ARG T)) 'RETURNERRORS] then [with RESULT STRING (if ERRORSTRING then [if (ZEROP (COURIER.FETCH (EVAL . ERRORN) NUMBER OF ERRORSTRING)) then (OR NOERRORFLG (ERROR "Remote apply error!" (CONS FN ARGS))) else (OR NOERRORFLG (ERROR (ERRORMESS ERRORSTRING] else (OR NOERRORFLG (ERROR REJECTTYPE ERRORTYPE] else (if [SETQ RESULT (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM STRING 'INPUT] (NLSETQ (READ STREAM)))] then (CAR RESULT) else (OR NOERRORFLG (ERROR "Unreadable remote apply result!" STRING]) ) (* Server Routines) (DEFINEQ (CES.REMOTEEVAL [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE STRING) (* ; "Edited 17-Sep-87 10:14 by cdl") (LET (STREAM SEXPR) (DECLARE (SPECVARS STREAM SEXPR)) (if [SETQ SEXPR (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM STRING 'INPUT] (NLSETQ (READ STREAM)))] then (SETQ SEXPR (CAR SEXPR)) [if (SETQ SEXPR (ERRORSET SEXPR)) then `(RETURN ,(MKSTRING (CAR SEXPR) T)) else `(ABORT REMOTE.EVAL.ERROR ,(CES.ERRORN] else `(ABORT REMOTE.READ.ERROR ,(CES.ERRORN]) (CES.REMOTEAPPLY [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE FN ARGS) (* ; "Edited 17-Sep-87 11:12 by cdl") (DECLARE (SPECVARS FN ARGS)) (LET (ERROR SEXPR STREAM) (DECLARE (SPECVARS STREAM)) [SETQ ARGS (for ARG in ARGS declare%: (SPECVARS ARG) collect [SETQ SEXPR (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM ARG 'INPUT] (NLSETQ (READ STREAM)))] (if SEXPR then (CAR SEXPR) else (SETQ ERROR 'REMOTE.READ.ERROR) (RETURN] (if ERROR then `(ABORT ,ERROR ,(CES.ERRORN)) else (if [SETQ FN (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM FN 'INPUT] (NLSETQ (READ STREAM)))] then (SETQ FN (CAR FN)) [if (SETQ SEXPR (NLSETQ (APPLY FN ARGS))) then `(RETURN ,(MKSTRING (CAR SEXPR) T)) else `(ABORT REMOTE.APPLY.ERROR ,(CES.ERRORN] else `(ABORT REMOTE.READ.ERROR ,(CES.ERRORN]) (CES.ERRORN [LAMBDA NIL (* ; "Edited 17-Sep-87 13:41 by cdl") (* Minimal functionality, just for  backward compatibility) (COURIER.CREATE (EVAL . ERRORN) NUMBER _ (CONSTANT (ZERO)) EXPR _ (CONSTANT null]) ) (COURIERPROGRAM EVAL (1105 0) TYPES [(SEXPR STRING) (FN STRING) (ARGS (SEQUENCE SEXPR)) (ERRORN (RECORD (NUMBER CARDINAL) (EXPR SEXPR] PROCEDURES ((EVAL 0 (SEXPR) RETURNS (SEXPR) REPORTS (REMOTE.EVAL.ERROR REMOTE.READ.ERROR) IMPLEMENTEDBY CES.REMOTEEVAL) (APPLY 1 (FN ARGS) RETURNS (SEXPR) REPORTS (REMOTE.APPLY.ERROR REMOTE.READ.ERROR) IMPLEMENTEDBY CES.REMOTEAPPLY)) ERRORS ((REMOTE.EVAL.ERROR 0 (ERRORN)) (REMOTE.APPLY.ERROR 1 (ERRORN)) (REMOTE.READ.ERROR 2 (ERRORN)))) (FILESLOAD COURIERSERVE) (COURIER.START.SERVER) (PUTPROPS COURIEREVALSERVE COPYRIGHT ("Xerox Corporation & Stanford University" 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (899 5041 (REMOTEEVAL 909 . 3155) (REMOTEAPPLY 3157 . 5039)) (5070 8241 (CES.REMOTEEVAL 5080 . 5981) (CES.REMOTEAPPLY 5983 . 7822) (CES.ERRORN 7824 . 8239))))) STOP \ No newline at end of file diff --git a/lispusers/COURIEREVALSERVE.TEDIT b/lispusers/COURIEREVALSERVE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..45037576c38985c5d493773123b542e360406ed8 GIT binary patch literal 3517 zcmeHH&2HO95T+gHudaZ$NYEaq>7f!}3$~&-PS8UcX(bV%NR_1Aq(KgpxUz^)q_8CI zs!vel-j~P=6v(|mUZa=3L@%A$B`GIPoU|xt(!0SkGp!fXu6pn z&k_+dS&%ns zbm@{x90gz#Jf*TghA5~H^CZns z13v@Ai#(1ALppboT!gsCLS)i=?x$tAsyQG^{D22d0AnU`>y1*xIEi;H!`y*TCE!^u zh+sIw3IZ1bONMS~cpUqYB2LMR(h<2Gz{+!R8m3&vuQZ2a9&_Pih093IS~o|hMEX$( ztUM$$kjh(t>~TWj&6NnJm?YwU%6FtmQJLd5rD~Eoc3Fxof^D_HW;nq_GzIPp>_Gw8 zdnpxP?R}Nx;0x?er7!LUiTJP-d{?DYn~`}^R6mN~G!f4z=7eJk0z>MWS}(`To?z#Pe9iJDBpD9l#nF_O(+_RUfx$HHG=ph2?avpkAcq%;PU zd!JB|mythJMfV}*r=_B0nPj{o4jw*ILdiN!guot-R;3VBR0@FN2O*uv-3eAUD0U^Q z%0*M7=ThA?To3B?k=|#3y$LuPF~>E2U|{kr!^-w-)36PzXG2|g^an-RjWjJe-C>4(7?N6Xm^=ofqldr z)3AyFo?|>@_E^Ek7J5``?9oWKT*J1&Vg0eGJK&mlM^v-#nb9A3Fl1e0JS1YwDKn4p zx|ZsYdam~v>Efs%?>!ymIj0*6vwyb@w-2Coc!-~d@~;n=-bFQ)T*btDOeDsZg$rat z>|q=3w%aK8S**t%c@ii~h%WaIpnc~64)*p`_y!`Y8cU~twN$cS{<-`Yh)u*>hb?Gh zQ?>rFT5VKpt@QtDQKP-PxBj+TjfT8UE^Ak`+cesErCp`Zr7e7IyxNefufI0DYTlwz z0ol9&QUSD`0`Vz+w>B@W7v3`3(VlD1Hx7~7hx<~PtxY6SWe zT*23Vq?3Bqwjy3p$4#XrIg#|zid@xzX3|nEQ72HLw9E9;6nYb#wg=AGWX(SFde(+^ zE}Qh0p-Lcq|63rnfaI=J+0@8z5rws)g$yO|ecay(BpuuMujC`cjk5;Q{+BlmU!OIQ ziZTJQkll3+2bH#R={1X7qP=e8zsgM3T4}gRgV#VG8ix4FFogb@!VoRlV`NE73n@*$ Zf0l+S@_CJCCC@fpQYv26z@-NZY{yqQz literal 0 HcmV?d00001 diff --git a/lispusers/COURIERIMAGESTREAM b/lispusers/COURIERIMAGESTREAM new file mode 100644 index 00000000..b3ab16e0 --- /dev/null +++ b/lispusers/COURIERIMAGESTREAM @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "20-Jul-88 10:15:36" |{MCS:MCS:STANFORD}COURIERIMAGESTREAM.;7| 49756 changes to%: (VARS COURIERIMAGESTREAMCOMS) (FNS \BITBLT.COURIER \SCALEDBITBLT.COURIER \COURIER.OPENIMAGESTREAM) previous date%: "16-Sep-87 17:41:23" |{MCS:MCS:STANFORD}COURIERIMAGESTREAM.;5|) (* " Copyright (c) 1985, 1986, 1987, 1988 by Xerox Corporation & Stanford University. All rights reserved. ") (PRETTYCOMPRINT COURIERIMAGESTREAMCOMS) (RPAQQ COURIERIMAGESTREAMCOMS ((* * ImageOp Functions) (FNS \BACKCOLOR.COURIER \BITBLT.COURIER \BLTSHADE.COURIER \BOTTOMMARGIN.COURIER \CHARSET.COURIER \CHARWIDTH.COURIER \CHARWIDTHY.COURIER \CLIPPINGREGION.COURIER \CLOSEFN.COURIER \COLOR.COURIER \COURIERIMAGESTREAM.BOUT \DEFAULTSTATE.COURIER \DRAWARC.COURIER \DRAWCIRCLE.COURIER \DRAWCURVE.COURIER \DRAWELLIPSE.COURIER \DRAWLINE.COURIER \DRAWPOINT.COURIER \DRAWPOLYGON.COURIER \FILLCIRCLE.COURIER \FILLPOLYGON.COURIER \FONT.COURIER \LEFTMARGIN.COURIER \LINEFEED.COURIER \MOVETO.COURIER \NEWPAGE.COURIER \OPENIMAGESTREAM.COURIER \OPERATION.COURIER \POPSTATE.COURIER \PUSHSTATE.COURIER \RESET.COURIER \RIGHTMARGIN.COURIER \ROTATE.COURIER \SCALE.COURIER \SCALEDBITBLT.COURIER \SCALE2.COURIER \SPACEFACTOR.COURIER \STRINGWIDTH.COURIER \TERPRI.COURIER \TOPMARGIN.COURIER \TRANSLATE.COURIER \XPOSITION.COURIER \YPOSITION.COURIER \OUTCHAR.COURIER) (* * Courier Server Functions) (FNS \COURIER.BACKCOLOR \COURIER.BITBLT \COURIER.BLTSHADE \COURIER.BOTTOMMARGIN \COURIER.CHARSET \COURIER.CHARWIDTH \COURIER.CHARWIDTHY \COURIER.CLIPPINGREGION \COURIER.CLOSEIMAGESTREAM \COURIER.COLOR \COURIER.DEFAULTSTATE \COURIER.DRAWARC \COURIER.DRAWCIRCLE \COURIER.DRAWCURVE \COURIER.DRAWELLIPSE \COURIER.DRAWLINE \COURIER.DRAWPOINT \COURIER.DRAWPOLYGON \COURIER.FILLCIRCLE \COURIER.FILLPOLYGON \COURIER.FONT \COURIER.FONTTYPE \COURIER.LEFTMARGIN \COURIER.LINEFEED \COURIER.MOVETO \COURIER.NEWPAGE \COURIER.OPERATION \COURIER.OPENIMAGESTREAM \COURIER.OUTCHAR \COURIER.POPSTATE \COURIER.PUSHSTATE \COURIER.RESET \COURIER.RIGHTMARGIN \COURIER.ROTATE \COURIER.SCALE \COURIER.SCALEDBITBLT \COURIER.SCALE2 \COURIER.SPACEFACTOR \COURIER.STRINGWIDTH \COURIER.TERPRI \COURIER.TOPMARGIN \COURIER.TRANSLATE \COURIER.XPOSITION \COURIER.YPOSITION) (* * etc.) (FNS \INITCOURIERIMAGESTREAM READSTREAMHANDLE WRITESTREAMHANDLE) (INITVARS \COURIERIMAGEOPS \NULLFDEV IMAGESTREAMALST) (PROP COURIERDEF STREAMHANDLE) (GLOBALVARS \COURIERIMAGEOPS \NULLFDEV IMAGESTREAMALST) (DECLARE%: DONTCOPY (RECORDS COURIERIMAGEDATA)) [ADDVARS (IMAGESTREAMTYPES (COURIER (OPENSTREAM \OPENIMAGESTREAM.COURIER] (FILES BITMAPFNS COURIERDEFS COURIERSERVE) (COURIERPROGRAMS IMAGESTREAM OLDIMAGESTREAM) (P (\INITCOURIERIMAGESTREAM) (COURIER.START.SERVER)))) (* * ImageOp Functions) (DEFINEQ (\BACKCOLOR.COURIER [LAMBDA (STREAM COLOR) (* cdl "10-Oct-85 20:56") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'BACKCOLOR CIS.IMAGESTREAM COLOR]) (\BITBLT.COURIER [LAMBDA (SOURCE SOURCELEFT SOURCEBOTTOM STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION) (* ; "Edited 20-Jul-88 09:09 by cdl") (PROG (BULK.DATA.STREAM (BITMAP (BITMAPCREATE WIDTH HEIGHT))) (DECLARE (SPECVARS BULK.DATA.STREAM)) (BITBLT SOURCE SOURCELEFT SOURCEBOTTOM BITMAP) (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (SETQ BULK.DATA.STREAM (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'BITBLT CIS.IMAGESTREAM NIL DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION)) (RESETLST [RESETSAVE NIL `(CLOSEF? ,BULK.DATA.STREAM] (WRITEBINARYBITMAP BITMAP BULK.DATA.STREAM))]) (\BLTSHADE.COURIER [LAMBDA (TEXTURE STREAM LEFT BOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* cdl "30-Oct-85 20:59") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'BLTSHADE (SELECTQ TEXTURE (NIL WHITESHADE) (T BLACKSHADE) TEXTURE) CIS.IMAGESTREAM LEFT BOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION]) (\BOTTOMMARGIN.COURIER [LAMBDA (STREAM YPOSITION) (* cdl "10-Oct-85 20:33") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'BOTTOMMARGIN CIS.IMAGESTREAM YPOSITION]) (\CHARSET.COURIER [LAMBDA (STREAM CHARACTERSET) (* cdl " 7-Nov-85 20:01") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'CHARSET CIS.IMAGESTREAM CHARACTERSET]) (\CHARWIDTH.COURIER [LAMBDA (STREAM CHARCODE) (* cdl "26-Nov-85 17:33") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (if CIS.LOCALFONTS? then (CHARWIDTH CHARCODE CIS.FONT) else (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'CHARWIDTH CIS.IMAGESTREAM CHARCODE]) (\CHARWIDTHY.COURIER [LAMBDA (STREAM CHARCODE) (* cdl "26-Nov-85 17:55") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (if CIS.LOCALFONTS? then (CHARWIDTHY CHARCODE CIS.FONT) else (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'CHARWIDTHY CIS.IMAGESTREAM CHARCODE]) (\CLIPPINGREGION.COURIER [LAMBDA (STREAM REGION) (* cdl "10-Oct-85 20:50") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'CLIPPINGREGION CIS.IMAGESTREAM REGION]) (\CLOSEFN.COURIER [LAMBDA (STREAM) (* cdl "10-Oct-85 19:01") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'CLOSE CIS.IMAGESTREAM]) (\COLOR.COURIER [LAMBDA (STREAM COLOR) (* cdl "10-Oct-85 19:08") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'COLOR CIS.IMAGESTREAM COLOR]) (\COURIERIMAGESTREAM.BOUT [LAMBDA (STREAM BYTE) (* cdl "26-Nov-85 16:50") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'OUTCHAR CIS.IMAGESTREAM BYTE]) (\DEFAULTSTATE.COURIER [LAMBDA (STREAM) (* ; "Edited 3-Sep-87 09:01 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DEFAULTSTATE CIS.IMAGESTREAM]) (\DRAWARC.COURIER [LAMBDA (STREAM CENTERX CENTERY RADIUS ANGLE DEGREES BRUSH DASHING) (* ; "Edited 3-Sep-87 08:47 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWARC CIS.IMAGESTREAM CENTERX CENTERY RADIUS ANGLE DEGREES BRUSH DASHING]) (\DRAWCIRCLE.COURIER [LAMBDA (STREAM CENTERX CENTERY RADIUS BRUSH DASHING) (* cdl "10-Oct-85 18:28") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWCIRCLE CIS.IMAGESTREAM CENTERX CENTERY RADIUS BRUSH DASHING]) (\DRAWCURVE.COURIER [LAMBDA (STREAM KNOTS CLOSED BRUSH DASHING) (* cdl "21-Nov-85 18:51") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWCURVE CIS.IMAGESTREAM KNOTS CLOSED BRUSH DASHING]) (\DRAWELLIPSE.COURIER [LAMBDA (STREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) (* cdl "10-Oct-85 20:23") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWELLIPSE CIS.IMAGESTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING]) (\DRAWLINE.COURIER [LAMBDA (STREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) (* cdl "10-Nov-85 17:56") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWLINE CIS.IMAGESTREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING]) (\DRAWPOINT.COURIER [LAMBDA (STREAM X Y BRUSH OPERATION) (* ; "Edited 3-Sep-87 09:20 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWPOINT CIS.IMAGESTREAM X Y BRUSH OPERATION]) (\DRAWPOLYGON.COURIER [LAMBDA (STREAM POINTS CLOSED BRUSH DASHING) (* cdl "21-Nov-85 18:52") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'DRAWPOLYGON CIS.IMAGESTREAM POINTS CLOSED BRUSH DASHING]) (\FILLCIRCLE.COURIER [LAMBDA (STREAM CENTERX CENTERY RADIUS TEXTURE) (* cdl "10-Oct-85 19:11") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'FILLCIRCLE CIS.IMAGESTREAM CENTERX CENTERY RADIUS TEXTURE]) (\FILLPOLYGON.COURIER [LAMBDA (STREAM POINTS TEXTURE) (* cdl "26-Nov-85 16:25") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'FILLPOLYGON CIS.IMAGESTREAM POINTS TEXTURE]) (\FONT.COURIER [LAMBDA (STREAM FONT) (* cdl " 5-Dec-85 19:15") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (PROG1 CIS.FONT (if (AND FONT (NEQ FONT CIS.FONT)) then (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'FONT CIS.IMAGESTREAM FONT) (SETQ CIS.FONT FONT)))]) (\LEFTMARGIN.COURIER [LAMBDA (STREAM XPOSITION) (* cdl "10-Oct-85 19:42") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'LEFTMARGIN CIS.IMAGESTREAM XPOSITION]) (\LINEFEED.COURIER [LAMBDA (STREAM DELTAY) (* cdl "10-Oct-85 19:54") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'LINEFEED CIS.IMAGESTREAM DELTAY]) (\MOVETO.COURIER [LAMBDA (STREAM X Y) (* cdl "10-Oct-85 19:14") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'MOVETO CIS.IMAGESTREAM X Y]) (\NEWPAGE.COURIER [LAMBDA (STREAM) (* cdl "10-Oct-85 20:29") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'NEWPAGE CIS.IMAGESTREAM]) (\OPENIMAGESTREAM.COURIER [LAMBDA (COURIERSTREAM OPTIONS) (* ; "Edited 3-Sep-87 09:29 by cdl") (* DECLARATIONS%: (RECORD PAIR  (KEY VALUE))) (LET (FILE TYPE IMAGESTREAM IMAGEOPS STREAM) (DECLARE (GLOBALVARS DEFAULTFONT)) [if (NULL \NULLFDEV) then (SETQ \NULLFDEV (create FDEV CLOSEFILE _ (FUNCTION NILL] [SETQ OPTIONS (for PAIR on OPTIONS by (CDDR PAIR) when (with PAIR PAIR (SELECTQ KEY (FILE (SETQ FILE VALUE) NIL) (TYPE (SETQ TYPE VALUE) NIL) T)) join (with PAIR PAIR (LIST KEY VALUE] (if (NULL TYPE) then (SETQ TYPE 'DISPLAY)) (SETQ IMAGESTREAM (COURIER.CALL COURIERSTREAM 'IMAGESTREAM 'OPEN FILE TYPE (MKSTRING OPTIONS T))) (SETQ IMAGEOPS (create IMAGEOPS IMFONTCREATE _ (COURIER.CALL COURIERSTREAM 'IMAGESTREAM 'FONTTYPE IMAGESTREAM) reusing \COURIERIMAGEOPS)) (SETQ STREAM (create STREAM IMAGEDATA _ (create COURIERIMAGEDATA CIS.COURIERSTREAM _ COURIERSTREAM CIS.IMAGESTREAM _ IMAGESTREAM CIS.FONT _ (FONTCLASSCOMPONENT DEFAULTFONT (with IMAGEOPS IMAGEOPS IMFONTCREATE))) IMAGEOPS _ IMAGEOPS OUTCHARFN _ (FUNCTION \OUTCHAR.COURIER) ACCESS _ 'OUTPUT DEVICE _ \NULLFDEV)) (with STREAM STREAM (SETQ STRMBOUTFN (FUNCTION \COURIERIMAGESTREAM.BOUT))) STREAM]) (\OPERATION.COURIER [LAMBDA (STREAM OPERATION) (* cdl "10-Oct-85 20:41") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'OPERATION CIS.IMAGESTREAM OPERATION]) (\POPSTATE.COURIER [LAMBDA (STREAM) (* ; "Edited 3-Sep-87 08:59 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'POPSTATE CIS.IMAGESTREAM]) (\PUSHSTATE.COURIER [LAMBDA (STREAM) (* ; "Edited 3-Sep-87 08:58 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'PUSHSTATE CIS.IMAGESTREAM]) (\RESET.COURIER [LAMBDA (STREAM) (* cdl "26-Nov-85 16:42") (with STREAM STREAM (SETQ CHARPOSITION 0) (with COURIERIMAGEDATA IMAGEDATA (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'RESET CIS.IMAGESTREAM]) (\RIGHTMARGIN.COURIER [LAMBDA (STREAM XPOSITION) (* cdl "10-Oct-85 19:42") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'RIGHTMARGIN CIS.IMAGESTREAM XPOSITION]) (\ROTATE.COURIER [LAMBDA (STREAM ROTATION) (* ; "Edited 3-Sep-87 08:40 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'ROTATE CIS.IMAGESTREAM ROTATION]) (\SCALE.COURIER [LAMBDA (STREAM SCALE) (* cdl "10-Oct-85 18:47") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'SCALE CIS.IMAGESTREAM SCALE]) (\SCALEDBITBLT.COURIER [LAMBDA (SOURCE SOURCELEFT SOURCEBOTTOM STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION CLIPPEDSOURCELEFT CLIPPEDSOURCEBOTTOM SCALE) (* ; "Edited 20-Jul-88 09:22 by cdl") (PROG (BULK.DATA.STREAM BITMAP) (DECLARE (SPECVARS BULK.DATA.STREAM)) (if (NULL WIDTH) then (SETQ WIDTH (BITMAPWIDTH SOURCE))) (if (NULL HEIGHT) then (SETQ HEIGHT (BITMAPHEIGHT SOURCE))) (BITBLT SOURCE SOURCELEFT SOURCEBOTTOM (SETQ BITMAP (BITMAPCREATE WIDTH HEIGHT))) (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (SETQ BULK.DATA.STREAM (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'SCALEDBITBLT CIS.IMAGESTREAM NIL DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION SCALE)) (RESETLST [RESETSAVE NIL `(CLOSEF? ,BULK.DATA.STREAM] (WRITEBINARYBITMAP BITMAP BULK.DATA.STREAM))]) (\SCALE2.COURIER [LAMBDA (STREAM X Y) (* ; "Edited 3-Sep-87 08:54 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'SCALE2 CIS.IMAGESTREAM X Y]) (\SPACEFACTOR.COURIER [LAMBDA (STREAM FACTOR) (* cdl "10-Oct-85 20:43") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'SPACEFACTOR CIS.IMAGESTREAM FACTOR]) (\STRINGWIDTH.COURIER [LAMBDA (STREAM STRING RDTBL) (* cdl "26-Nov-85 17:32") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (if CIS.LOCALFONTS? then (STRINGWIDTH STRING CIS.FONT) else (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'STRINGWIDTH CIS.IMAGESTREAM STRING]) (\TERPRI.COURIER [LAMBDA (STREAM) (* cdl "26-Nov-85 16:35") (with STREAM STREAM (SETQ CHARPOSITION 0) (with COURIERIMAGEDATA IMAGEDATA (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'TERPRI CIS.IMAGESTREAM]) (\TOPMARGIN.COURIER [LAMBDA (STREAM YPOSITION) (* cdl "10-Oct-85 20:32") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'TOPMARGIN CIS.IMAGESTREAM YPOSITION]) (\TRANSLATE.COURIER [LAMBDA (STREAM X Y) (* ; "Edited 3-Sep-87 08:52 by cdl") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'TRANSLATE CIS.IMAGESTREAM X Y]) (\XPOSITION.COURIER [LAMBDA (STREAM XPOSITION) (* cdl "10-Oct-85 18:43") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'XPOSITION CIS.IMAGESTREAM XPOSITION]) (\YPOSITION.COURIER [LAMBDA (STREAM YPOSITION) (* cdl "10-Oct-85 18:45") (with COURIERIMAGEDATA (with STREAM STREAM IMAGEDATA) (COURIER.CALL CIS.COURIERSTREAM 'IMAGESTREAM 'YPOSITION CIS.IMAGESTREAM YPOSITION]) (\OUTCHAR.COURIER [LAMBDA (STREAM CHARCODE) (* cdl " 3-Dec-85 17:47") [if (EQ CHARCODE (CHARCODE EOL)) then (with STREAM STREAM (SETQ CHARPOSITION 0)) else (freplace CHARPOSITION of STREAM with (PROGN (* Ugh. Don't overflow) (\LOLOC (\ADDBASE (ffetch CHARPOSITION of STREAM) 1] (BOUT STREAM CHARCODE]) ) (* * Courier Server Functions) (DEFINEQ (\COURIER.BACKCOLOR [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM COLOR) (* ; "Edited 24-Mar-87 20:52 by cdl") `(RETURN ,(IMAGEOP 'IMBACKCOLOR IMAGESTREAM IMAGESTREAM COLOR]) (\COURIER.BITBLT [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM BULK.DATA.STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION) (* ; "Edited 24-Mar-87 20:52 by cdl") (BITBLT (READBINARYBITMAP WIDTH HEIGHT BULK.DATA.STREAM) NIL NIL IMAGESTREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION) '(RETURN]) (\COURIER.BLTSHADE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE TEXTURE IMAGESTREAM LEFT BOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* cdl "10-Nov-85 16:36") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMBLTSHADE IMAGESTREAM TEXTURE IMAGESTREAM LEFT BOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) NIL]) (\COURIER.BOTTOMMARGIN [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM YPOSITION) (* ; "Edited 24-Mar-87 20:54 by cdl") `(RETURN ,(IMAGEOP 'IMBOTTOMMARGIN IMAGESTREAM IMAGESTREAM YPOSITION]) (\COURIER.CHARSET [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM CHARACTERSET) (* ; "Edited 24-Mar-87 20:54 by cdl") `(RETURN ,(IMAGEOP 'IMCHARSET IMAGESTREAM IMAGESTREAM CHARACTERSET]) (\COURIER.CHARWIDTH [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM CHARCODE) (* ; "Edited 24-Mar-87 20:55 by cdl") `(RETURN ,(IMAGEOP 'IMCHARWIDTH IMAGESTREAM IMAGESTREAM CHARCODE]) (\COURIER.CHARWIDTHY [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM CHARCODE) (* ; "Edited 24-Mar-87 20:55 by cdl") `(RETURN ,(IMAGEOP 'IMCHARWIDTHY IMAGESTREAM IMAGESTREAM CHARCODE]) (\COURIER.CLIPPINGREGION [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM REGION) (* ; "Edited 24-Mar-87 20:56 by cdl") `(RETURN ,(IMAGEOP 'IMCLIPPINGREGION IMAGESTREAM IMAGESTREAM REGION]) (\COURIER.CLOSEIMAGESTREAM [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE HANDLE) (* ; "Edited 24-Mar-87 20:56 by cdl") (* DECLARATIONS%: (RECORD PAIR  (KEY . VALUE))) [LET ((PAIR (ASSOC HANDLE IMAGESTREAMALST))) (SETQ IMAGESTREAMALST (DREMOVE PAIR IMAGESTREAMALST)) (with PAIR PAIR (if (IMAGESTREAMTYPEP VALUE 'DISPLAY) then (CLOSEW VALUE) else (CLOSEF? VALUE] '(RETURN]) (\COURIER.COLOR [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM COLOR) (* ; "Edited 24-Mar-87 20:50 by cdl") `(RETURN ,(IMAGEOP 'IMCOLOR IMAGESTREAM IMAGESTREAM COLOR]) (\COURIER.DEFAULTSTATE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* ; "Edited 3-Sep-87 09:00 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDEFAULTSTATE IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.DRAWARC [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y RADIUS ANGLE DEGREES BRUSH DASHING) (* ; "Edited 3-Sep-87 08:46 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWARC IMAGESTREAM IMAGESTREAM X Y RADIUS ANGLE DEGREES BRUSH DASHING) NIL]) (\COURIER.DRAWCIRCLE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y RADIUS BRUSH DASHING) (* cdl "10-Nov-85 16:40") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWCIRCLE IMAGESTREAM IMAGESTREAM X Y RADIUS BRUSH DASHING) NIL]) (\COURIER.DRAWCURVE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM KNOTS CLOSED BRUSH DASHING) (* cdl "21-Nov-85 19:14") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWCURVE IMAGESTREAM IMAGESTREAM KNOTS CLOSED BRUSH DASHING) NIL]) (\COURIER.DRAWELLIPSE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) (* cdl "10-Nov-85 16:42") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWELLIPSE IMAGESTREAM IMAGESTREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) NIL]) (\COURIER.DRAWLINE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y X2 Y2 WIDTH OPERATION COLOR DASHING) (* cdl "10-Nov-85 17:58") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWLINE IMAGESTREAM IMAGESTREAM X Y X2 Y2 WIDTH OPERATION COLOR DASHING) NIL]) (\COURIER.DRAWPOINT [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y BRUSH OPERATION) (* ; "Edited 3-Sep-87 09:04 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWPOINT IMAGESTREAM IMAGESTREAM X Y BRUSH OPERATION) NIL]) (\COURIER.DRAWPOLYGON [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM POINTS CLOSED BRUSH DASHING) (* cdl "21-Nov-85 20:20") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMDRAWPOLYGON IMAGESTREAM IMAGESTREAM POINTS CLOSED BRUSH DASHING) NIL]) (\COURIER.FILLCIRCLE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y RADIUS TEXTURE) (* cdl "10-Nov-85 16:43") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMFILLCIRCLE IMAGESTREAM IMAGESTREAM X Y RADIUS TEXTURE) NIL]) (\COURIER.FILLPOLYGON [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM POINTS TEXTURE) (* cdl "26-Nov-85 16:25") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMFILLPOLYGON IMAGESTREAM IMAGESTREAM POINTS TEXTURE) NIL]) (\COURIER.FONT [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM FONT) (* ; "Edited 24-Mar-87 20:58 by cdl") `(RETURN ,(IMAGEOP 'IMFONT IMAGESTREAM IMAGESTREAM FONT]) (\COURIER.FONTTYPE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* ; "Edited 24-Mar-87 20:58 by cdl") `(RETURN ,(with IMAGEOPS (with STREAM IMAGESTREAM IMAGEOPS) IMFONTCREATE]) (\COURIER.LEFTMARGIN [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM XPOSITION) (* ; "Edited 24-Mar-87 20:59 by cdl") `(RETURN ,(IMAGEOP 'IMLEFTMARGIN IMAGESTREAM IMAGESTREAM XPOSITION]) (\COURIER.LINEFEED [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM DELTAY) (* ; "Edited 24-Mar-87 20:59 by cdl") `(RETURN ,(IMAGEOP 'IMLINEFEED IMAGESTREAM IMAGESTREAM DELTAY]) (\COURIER.MOVETO [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y) (* cdl "10-Nov-85 16:46") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMMOVETO IMAGESTREAM IMAGESTREAM X Y) NIL]) (\COURIER.NEWPAGE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* cdl "10-Nov-85 16:47") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMNEWPAGE IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.OPERATION [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM OPERATION) (* ; "Edited 24-Mar-87 20:59 by cdl") `(RETURN ,(IMAGEOP 'IMOPERATION IMAGESTREAM IMAGESTREAM OPERATION]) (\COURIER.OPENIMAGESTREAM [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE FILE IMAGETYPE OPTIONS) (* ; "Edited 20-Jul-88 09:00 by cdl") (DECLARE (SPECVARS OPTIONS)) (LET (STREAM HANDLE) (DECLARE (SPECVARS STREAM)) [SETQ OPTIONS (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ STREAM (OPENSTRINGSTREAM OPTIONS 'INPUT] (CAR (NLSETQ (READ STREAM))))] (SETQ HANDLE (if IMAGESTREAMALST then (ADD1 (in IMAGESTREAMALST maximize CAR)) else (ZERO))) (push IMAGESTREAMALST (CONS HANDLE (OPENIMAGESTREAM FILE IMAGETYPE OPTIONS))) `(RETURN ,HANDLE]) (\COURIER.OUTCHAR [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM CHARCODE) (* cdl " 7-Nov-85 18:49") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (\OUTCHAR IMAGESTREAM CHARCODE) NIL]) (\COURIER.POPSTATE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* ; "Edited 3-Sep-87 08:58 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMPOPSTATE IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.PUSHSTATE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* ; "Edited 3-Sep-87 08:57 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMPUSHSTATE IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.RESET [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* cdl "10-Nov-85 16:48") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMRESET IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.RIGHTMARGIN [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM XPOSITION) (* ; "Edited 24-Mar-87 21:00 by cdl") `(RETURN ,(IMAGEOP 'IMRIGHTMARGIN IMAGESTREAM IMAGESTREAM XPOSITION]) (\COURIER.ROTATE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM COLOR ROTATION) (* ; "Edited 3-Sep-87 08:38 by cdl") `(RETURN ,(IMAGEOP 'IMROTATE IMAGESTREAM IMAGESTREAM ROTATION]) (\COURIER.SCALE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM SCALE) (* ; "Edited 24-Mar-87 21:00 by cdl") `(RETURN ,(IMAGEOP 'IMSCALE IMAGESTREAM IMAGESTREAM SCALE]) (\COURIER.SCALEDBITBLT [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM BULK.DATA.STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION SCALE) (* cdl "13-Nov-85 19:46") (SCALEDBITBLT (READBINARYBITMAP WIDTH HEIGHT BULK.DATA.STREAM) NIL NIL IMAGESTREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION SCALE) '(RETURN]) (\COURIER.SCALE2 [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y) (* ; "Edited 3-Sep-87 08:53 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMSCALE2 IMAGESTREAM IMAGESTREAM X Y) NIL]) (\COURIER.SPACEFACTOR [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM FACTOR) (* ; "Edited 24-Mar-87 21:01 by cdl") `(RETURN ,(IMAGEOP 'IMSPACEFACTOR IMAGESTREAM IMAGESTREAM FACTOR]) (\COURIER.STRINGWIDTH [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM STRING) (* ; "Edited 24-Mar-87 21:01 by cdl") `(RETURN ,(IMAGEOP 'IMSTRINGWIDTH IMAGESTREAM IMAGESTREAM STRING]) (\COURIER.TERPRI [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM) (* cdl "10-Nov-85 16:52") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMTERPRI IMAGESTREAM IMAGESTREAM) NIL]) (\COURIER.TOPMARGIN [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM YPOSITION) (* ; "Edited 24-Mar-87 21:02 by cdl") `(RETURN ,(IMAGEOP 'IMTOPMARGIN IMAGESTREAM IMAGESTREAM YPOSITION]) (\COURIER.TRANSLATE [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM X Y) (* ; "Edited 3-Sep-87 08:51 by cdl") (COURIER.RETURN COURIERSTREAM PROGRAM PROCEDURE) (IMAGEOP 'IMTRANSLATE IMAGESTREAM IMAGESTREAM X Y) NIL]) (\COURIER.XPOSITION [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM XPOSITION) (* ; "Edited 24-Mar-87 21:02 by cdl") `(RETURN ,(IMAGEOP 'IMXPOSITION IMAGESTREAM IMAGESTREAM XPOSITION]) (\COURIER.YPOSITION [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE IMAGESTREAM YPOSITION) (* ; "Edited 24-Mar-87 21:02 by cdl") `(RETURN ,(IMAGEOP 'IMYPOSITION IMAGESTREAM IMAGESTREAM YPOSITION]) ) (* * etc.) (DEFINEQ (\INITCOURIERIMAGESTREAM [LAMBDA NIL (* ; "Edited 3-Sep-87 09:59 by cdl") (SETQ \COURIERIMAGEOPS (create IMAGEOPS IMAGETYPE _ 'COURIER IMCLOSEFN _ (FUNCTION \CLOSEFN.COURIER) IMXPOSITION _ (FUNCTION \XPOSITION.COURIER) IMYPOSITION _ (FUNCTION \YPOSITION.COURIER) IMFONT _ (FUNCTION \FONT.COURIER) IMLEFTMARGIN _ (FUNCTION \LEFTMARGIN.COURIER) IMRIGHTMARGIN _ (FUNCTION \RIGHTMARGIN.COURIER) IMLINEFEED _ (FUNCTION \LINEFEED.COURIER) IMDRAWLINE _ (FUNCTION \DRAWLINE.COURIER) IMDRAWCURVE _ (FUNCTION \DRAWCURVE.COURIER) IMDRAWCIRCLE _ (FUNCTION \DRAWCIRCLE.COURIER) IMFILLCIRCLE _ (FUNCTION \FILLCIRCLE.COURIER) IMFILLPOLYGON _ (FUNCTION \FILLPOLYGON.COURIER) IMBITBLT _ (FUNCTION \BITBLT.COURIER) IMBLTSHADE _ (FUNCTION \BLTSHADE.COURIER) IMMOVETO _ (FUNCTION \MOVETO.COURIER) IMSCALE _ (FUNCTION \SCALE.COURIER) IMTERPRI _ (FUNCTION \TERPRI.COURIER) IMFONTCREATE _ 'DISPLAY IMCOLOR _ (FUNCTION \COLOR.COURIER) IMBACKCOLOR _ (FUNCTION \BACKCOLOR.COURIER) IMSTRINGWIDTH _ (FUNCTION \STRINGWIDTH.COURIER) IMCHARWIDTH _ (FUNCTION \CHARWIDTH.COURIER) IMCHARWIDTHY _ (FUNCTION \CHARWIDTHY.COURIER) IMRESET _ (FUNCTION \RESET.COURIER) IMDRAWPOLYGON _ (FUNCTION \DRAWPOLYGON.COURIER) IMSCALEDBITBLT _ (FUNCTION \SCALEDBITBLT.COURIER) IMTOPMARGIN _ (FUNCTION \TOPMARGIN.COURIER) IMBOTTOMMARGIN _ (FUNCTION \BOTTOMMARGIN.COURIER) IMNEWPAGE _ (FUNCTION \NEWPAGE.COURIER) IMDRAWELLIPSE _ (FUNCTION \DRAWELLIPSE.COURIER) IMCLIPPINGREGION _ (FUNCTION \CLIPPINGREGION.COURIER) IMOPERATION _ (FUNCTION \OPERATION.COURIER) IMSPACEFACTOR _ (FUNCTION \SPACEFACTOR.COURIER) IMCHARSET _ (FUNCTION \CHARSET.COURIER) IMROTATE _ (FUNCTION \ROTATE.COURIER) IMDRAWARC _ (FUNCTION \DRAWARC.COURIER) IMTRANSLATE _ (FUNCTION \TRANSLATE.COURIER) IMSCALE2 _ (FUNCTION \SCALE2.COURIER) IMPUSHSTATE _ (FUNCTION \PUSHSTATE.COURIER) IMPOPSTATE _ (FUNCTION \POPSTATE.COURIER) IMDEFAULTSTATE _ (FUNCTION \DEFAULTSTATE.COURIER) IMDRAWPOINT _ (FUNCTION \DRAWPOINT.COURIER]) (READSTREAMHANDLE [LAMBDA (STREAM PROGRAM TYPE) (* cdl "10-Nov-85 17:13") (* DECLARATIONS%: (RECORD ITEM  (TYPENAME VALUE))) (CDR (ASSOC (COURIER.READ STREAM PROGRAM 'UNSPECIFIED) IMAGESTREAMALST]) (WRITESTREAMHANDLE [LAMBDA (STREAM ITEM PROGRAM TYPE) (* cdl "10-Nov-85 17:13") (COURIER.WRITE STREAM ITEM PROGRAM 'UNSPECIFIED]) ) (RPAQ? \COURIERIMAGEOPS NIL) (RPAQ? \NULLFDEV NIL) (RPAQ? IMAGESTREAMALST NIL) (PUTPROPS STREAMHANDLE COURIERDEF (READSTREAMHANDLE WRITESTREAMHANDLE)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \COURIERIMAGEOPS \NULLFDEV IMAGESTREAMALST) ) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD COURIERIMAGEDATA (CIS.COURIERSTREAM CIS.IMAGESTREAM CIS.FONT CIS.LOCALFONTS?) CIS.LOCALFONTS? _ T) ) ) (ADDTOVAR IMAGESTREAMTYPES (COURIER (OPENSTREAM \OPENIMAGESTREAM.COURIER))) (FILESLOAD BITMAPFNS COURIERDEFS COURIERSERVE) (COURIERPROGRAM IMAGESTREAM (1111 1) TYPES [(X1 INTEGER) (Y1 INTEGER) (X2 INTEGER) (Y2 INTEGER) (ANGLE INTEGER) (RADIUS INTEGER) (SEMIMINORRADIUS INTEGER) (SEMIMAJORRADIUS INTEGER) (X NUMBER) (Y NUMBER) (LEFT NUMBER) (BOTTOM NUMBER) (WIDTH NUMBER) (HEIGHT NUMBER) (SCALE NUMBER) (COLOR NUMBER) (ROTATION NUMBER) (ORIENTATION NUMBER) (CHARACTERSET NUMBER) (CHARACTER CARDINAL) (CLOSED BOOLEAN) (FILE ATOM) (IMAGETYPE ATOM) (OPTIONS STRING) (DASHING (SEQUENCE CARDINAL)) (KNOTS (SEQUENCE POSITION)) (SOURCETYPE (ENUMERATION (NIL 0) (INPUT 1) (INVERT 2) (TEXTURE 3] INHERITS (INTERLISP) PROCEDURES ((OPEN 0 (FILE IMAGETYPE OPTIONS) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.OPENIMAGESTREAM) (CLOSE 1 (CARDINAL) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.CLOSEIMAGESTREAM) (DRAWLINE 2 (STREAMHANDLE X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWLINE) (DRAWCIRCLE 3 (STREAMHANDLE X1 Y1 RADIUS BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWCIRCLE) (OUTCHAR 4 (STREAMHANDLE CHARACTER) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.OUTCHAR) (DRAWCURVE 5 (STREAMHANDLE KNOTS CLOSED BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWCURVE) (DRAWPOLYGON 6 (STREAMHANDLE KNOTS CLOSED BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWPOLYGON) (SCALE 7 (STREAMHANDLE SCALE) RETURNS (SCALE) REPORTS NIL IMPLEMENTEDBY \COURIER.SCALE) (XPOSITION 8 (STREAMHANDLE X) RETURNS (X) REPORTS NIL IMPLEMENTEDBY \COURIER.XPOSITION) (YPOSITION 9 (STREAMHANDLE Y) RETURNS (Y) REPORTS NIL IMPLEMENTEDBY \COURIER.YPOSITION) (COLOR 10 (STREAMHANDLE COLOR) RETURNS (COLOR) REPORTS NIL IMPLEMENTEDBY \COURIER.COLOR) (FILLCIRCLE 11 (STREAMHANDLE X1 Y1 RADIUS TEXTURE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.FILLCIRCLE) (MOVETO 12 (STREAMHANDLE X1 Y1) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.MOVETO) (RESET 13 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.RESET) (BLTSHADE 14 (TEXTURE STREAMHANDLE LEFT BOTTOM WIDTH HEIGHT OPERATION REGION) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.BLTSHADE) (RIGHTMARGIN 15 (STREAMHANDLE X) RETURNS (X) REPORTS NIL IMPLEMENTEDBY \COURIER.RIGHTMARGIN) (LEFTMARGIN 16 (STREAMHANDLE X) RETURNS (X) REPORTS NIL IMPLEMENTEDBY \COURIER.LEFTMARGIN) (TERPRI 17 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.TERPRI) (STRINGWIDTH 18 (STREAMHANDLE STRING) RETURNS (WIDTH) REPORTS NIL IMPLEMENTEDBY \COURIER.STRINGWIDTH) (LINEFEED 19 (STREAMHANDLE Y) RETURNS (Y) REPORTS NIL IMPLEMENTEDBY \COURIER.LINEFEED) (FONT 20 (STREAMHANDLE FONT) RETURNS (FONT) REPORTS NIL IMPLEMENTEDBY \COURIER.FONT) (DRAWELLIPSE 21 (STREAMHANDLE X1 Y1 SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWELLIPSE) (NEWPAGE 22 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.NEWPAGE) (TOPMARGIN 23 (STREAMHANDLE Y) RETURNS (Y) REPORTS NIL IMPLEMENTEDBY \COURIER.TOPMARGIN) (BOTTOMMARGIN 24 (STREAMHANDLE Y) RETURNS (Y) REPORTS NIL IMPLEMENTEDBY \COURIER.BOTTOMMARGIN) (SPACEFACTOR 25 (STREAMHANDLE X) RETURNS (WIDTH) REPORTS NIL IMPLEMENTEDBY \COURIER.SPACEFACTOR) (OPERATION 26 (STREAMHANDLE OPERATION) RETURNS (OPERATION) REPORTS NIL IMPLEMENTEDBY \COURIER.OPERATION) (CHARWIDTH 27 (STREAMHANDLE CHARACTER) RETURNS (WIDTH) REPORTS NIL IMPLEMENTEDBY \COURIER.CHARWIDTH) (CHARWIDTHY 28 (STREAMHANDLE CHARACTER) RETURNS (WIDTH) REPORTS NIL IMPLEMENTEDBY \COURIER.CHARWIDTHY) (CLIPPINGREGION 29 (STREAMHANDLE REGION) RETURNS (REGION) REPORTS NIL IMPLEMENTEDBY \COURIER.CLIPPINGREGION) (BACKCOLOR 30 (STREAMHANDLE COLOR) RETURNS (COLOR) REPORTS NIL IMPLEMENTEDBY \COURIER.BACKCOLOR) (FILLPOLYGON 31 (STREAMHANDLE KNOTS TEXTURE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.FILLPOLYGON) (BITBLT 32 (STREAMHANDLE BULK.DATA.SOURCE LEFT BOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE REGION) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.BITBLT) (SCALEDBITBLT 33 (STREAMHANDLE BULK.DATA.SOURCE LEFT BOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE REGION NUMBER) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.SCALEDBITBLT) (CHARSET 34 (STREAMHANDLE CHARACTERSET) RETURNS (CHARACTERSET) REPORTS NIL IMPLEMENTEDBY \COURIER.CHARSET) (FONTTYPE 35 (STREAMHANDLE) RETURNS (ATOM) REPORTS NIL IMPLEMENTEDBY \COURIER.FONTTYPE) (ROTATE 36 (STREAMHANDLE ROTATION) RETURNS (ROTATION) REPORTS NIL IMPLEMETEDBY \COURIER.ROTATE) (DRAWARC 37 (STREAMHANDLE X1 Y1 RADIUS ANGLE ROTATION BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWARC) (TRANSLATE 38 (STREAMHANDLE X Y) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.TRANSLATE) (SCALE2 39 (STREAMHANDLE X Y) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.SCALE2) (PUSHSTATE 40 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.PUSHSTATE) (POPSTATE 41 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.POPSTATE) (DEFAULTSTATE 42 (STREAMHANDLE) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.DEFAULTSTATE) (DRAWPOINT 43 (STREAMHANDLE X1 Y1 BRUSH OPERATION) RETURNS NIL REPORTS NIL IMPLEMETEDBY \COURIER.DRAWPOINT)) ERRORS NIL) (COURIERPROGRAM OLDIMAGESTREAM (1111 0) TYPES ((X NUMBER) (Y NUMBER) (X1 INTEGER) (Y1 INTEGER) (X2 INTEGER) (Y2 INTEGER) (COLOR NUMBER) (RADIUS CARDINAL) (DASHING (SEQUENCE CARDINAL)) (SCALE NUMBER) (LEFT NUMBER) (BOTTOM NUMBER) (WIDTH NUMBER) (HEIGHT NUMBER) (SEMIMINORRADIUS NUMBER) (SEMIMAJORRADIUS NUMBER) (ORIENTATION NUMBER)) INHERITS (INTERLISP IMAGESTREAM) PROCEDURES ((DRAWLINE 2 (STREAMHANDLE X1 Y1 X2 Y2 CARDINAL OPERATION COLOR DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWLINE) (DRAWCIRCLE 3 (STREAMHANDLE X Y RADIUS BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWCIRCLE) (SCALE 7 (STREAMHANDLE SCALE) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.SCALE) (XPOSITION 8 (STREAMHANDLE NUMBER) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.XPOSITION) (YPOSITION 9 (STREAMHANDLE NUMBER) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.YPOSITION) (COLOR 10 (STREAMHANDLE COLOR) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.COLOR) (FILLCIRCLE 11 (STREAMHANDLE X Y RADIUS TEXTURE) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.FILLCIRCLE) (MOVETO 12 (STREAMHANDLE CARDINAL CARDINAL) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.MOVETO) (DRAWELLIPSE 21 (STREAMHANDLE X Y SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.DRAWELLIPSE) (BITBLT 32 (STREAMHANDLE BULK.DATA.SOURCE LEFT BOTTOM WIDTH HEIGHT ATOM OPERATION TEXTURE REGION) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.BITBLT) (SCALEDBITBLT 33 (STREAMHANDLE BULK.DATA.SOURCE LEFT BOTTOM WIDTH HEIGHT ATOM OPERATION TEXTURE REGION NUMBER) RETURNS NIL REPORTS NIL IMPLEMENTEDBY \COURIER.SCALEDBITBLT) (CHARSET 34 (STREAMHANDLE NUMBER) RETURNS (CARDINAL) REPORTS NIL IMPLEMENTEDBY \COURIER.CHARSET)) ERRORS NIL) (\INITCOURIERIMAGESTREAM) (COURIER.START.SERVER) (PUTPROPS COURIERIMAGESTREAM COPYRIGHT ("Xerox Corporation & Stanford University" 1985 1986 1987 1988) ) (DECLARE%: DONTCOPY (FILEMAP (NIL (3228 21422 (\BACKCOLOR.COURIER 3238 . 3509) (\BITBLT.COURIER 3511 . 4553) ( \BLTSHADE.COURIER 4555 . 5235) (\BOTTOMMARGIN.COURIER 5237 . 5518) (\CHARSET.COURIER 5520 . 5794) ( \CHARWIDTH.COURIER 5796 . 6200) (\CHARWIDTHY.COURIER 6202 . 6609) (\CLIPPINGREGION.COURIER 6611 . 6893 ) (\CLOSEFN.COURIER 6895 . 7154) (\COLOR.COURIER 7156 . 7419) (\COURIERIMAGESTREAM.BOUT 7421 . 7695) ( \DEFAULTSTATE.COURIER 7697 . 7980) (\DRAWARC.COURIER 7982 . 8399) (\DRAWCIRCLE.COURIER 8401 . 8724) ( \DRAWCURVE.COURIER 8726 . 9036) (\DRAWELLIPSE.COURIER 9038 . 9496) (\DRAWLINE.COURIER 9498 . 9887) ( \DRAWPOINT.COURIER 9889 . 10205) (\DRAWPOLYGON.COURIER 10207 . 10523) (\FILLCIRCLE.COURIER 10525 . 10842) (\FILLPOLYGON.COURIER 10844 . 11128) (\FONT.COURIER 11130 . 11537) (\LEFTMARGIN.COURIER 11539 . 11816) (\LINEFEED.COURIER 11818 . 12088) (\MOVETO.COURIER 12090 . 12353) (\NEWPAGE.COURIER 12355 . 12616) (\OPENIMAGESTREAM.COURIER 12618 . 15192) (\OPERATION.COURIER 15194 . 15469) (\POPSTATE.COURIER 15471 . 15746) (\PUSHSTATE.COURIER 15748 . 16025) (\RESET.COURIER 16027 . 16360) (\RIGHTMARGIN.COURIER 16362 . 16641) (\ROTATE.COURIER 16643 . 16923) (\SCALE.COURIER 16925 . 17188) (\SCALEDBITBLT.COURIER 17190 . 18470) (\SCALE2.COURIER 18472 . 18747) (\SPACEFACTOR.COURIER 18749 . 19025) ( \STRINGWIDTH.COURIER 19027 . 19433) (\TERPRI.COURIER 19435 . 19770) (\TOPMARGIN.COURIER 19772 . 20047) (\TRANSLATE.COURIER 20049 . 20330) (\XPOSITION.COURIER 20332 . 20607) (\YPOSITION.COURIER 20609 . 20884) (\OUTCHAR.COURIER 20886 . 21420)) (21460 35552 (\COURIER.BACKCOLOR 21470 . 21730) ( \COURIER.BITBLT 21732 . 22252) (\COURIER.BLTSHADE 22254 . 22649) (\COURIER.BOTTOMMARGIN 22651 . 22925) (\COURIER.CHARSET 22927 . 23197) (\COURIER.CHARWIDTH 23199 . 23465) (\COURIER.CHARWIDTHY 23467 . 23735) (\COURIER.CLIPPINGREGION 23737 . 24009) (\COURIER.CLOSEIMAGESTREAM 24011 . 24630) ( \COURIER.COLOR 24632 . 24884) (\COURIER.DEFAULTSTATE 24886 . 25132) (\COURIER.DRAWARC 25134 . 25508) ( \COURIER.DRAWCIRCLE 25510 . 25850) (\COURIER.DRAWCURVE 25852 . 26194) (\COURIER.DRAWELLIPSE 26196 . 26666) (\COURIER.DRAWLINE 26668 . 27034) (\COURIER.DRAWPOINT 27036 . 27376) (\COURIER.DRAWPOLYGON 27378 . 27726) (\COURIER.FILLCIRCLE 27728 . 28056) (\COURIER.FILLPOLYGON 28058 . 28380) (\COURIER.FONT 28382 . 28630) (\COURIER.FONTTYPE 28632 . 28865) (\COURIER.LEFTMARGIN 28867 . 29137) ( \COURIER.LINEFEED 29139 . 29399) (\COURIER.MOVETO 29401 . 29691) (\COURIER.NEWPAGE 29693 . 29917) ( \COURIER.OPERATION 29919 . 30187) (\COURIER.OPENIMAGESTREAM 30189 . 31050) (\COURIER.OUTCHAR 31052 . 31332) (\COURIER.POPSTATE 31334 . 31572) (\COURIER.PUSHSTATE 31574 . 31814) (\COURIER.RESET 31816 . 32036) (\COURIER.RIGHTMARGIN 32038 . 32310) (\COURIER.ROTATE 32312 . 32578) (\COURIER.SCALE 32580 . 32832) (\COURIER.SCALEDBITBLT 32834 . 33366) (\COURIER.SCALE2 33368 . 33670) (\COURIER.SPACEFACTOR 33672 . 33938) (\COURIER.STRINGWIDTH 33940 . 34206) (\COURIER.TERPRI 34208 . 34430) ( \COURIER.TOPMARGIN 34432 . 34700) (\COURIER.TRANSLATE 34702 . 35010) (\COURIER.XPOSITION 35012 . 35280 ) (\COURIER.YPOSITION 35282 . 35550)) (35570 39599 (\INITCOURIERIMAGESTREAM 35580 . 39043) ( READSTREAMHANDLE 39045 . 39428) (WRITESTREAMHANDLE 39430 . 39597))))) STOP \ No newline at end of file diff --git a/lispusers/COURIERIMAGESTREAM.TEDIT b/lispusers/COURIERIMAGESTREAM.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..79d28b51d13c185ad5496aae470b6a52003abb8b GIT binary patch literal 6767 zcmeHK-EQ015vG*vPnv3h{-PHJdXTnQsdd!Yahz;`0!vFr7O}LbC8=c7JDNJOxRFSe zr0jM327BLU=pz*9ebMb(^_%lUQI@^lU9`QbVawv2nK^Uj`)1Biq<_2kM^-%Oc@y8^ zzH@4y@F4WLecC!`wGLaY{Z{LSHAt~`eD#vC-aJo=GF#0>&fF*!tWBRE2kWKy;<249 zyFnSHvn-!>`E=cBO$t$vmD(@h{wuy`p89+cuqd6fV<$Yd$AeLD!`>`et`=e`(z0L? z>t*Xa!Orm_fkYY?BENuSm1pO9v}Bj_B%ZTqvB)k9mWyRp3O3IQSeF@_W^fms3s#i5 zfbud*lht|=l}VNsEK6Bd(z!0P{B2Qc=|vJTNLeaMl6M&krK5756niWw*;LGuRKP!! z^f}o@l9%gfvAtV)wG!L$k;xhdpxCNdgbBMID!I?I_4%AFviO?gqT33GoYlar;u!nh zi4Sl?Y_!a#>xHPo-6Yeb4t^J6y5*;>(wU@4OM)EE@@y#&>Wo6}yG}5!ATeH4I;Jd1 zO%#N42YDN0ITI1kk&$|1QlSj!$3lgc5Ey&3kPDUo^puG|u9J&sL5LdyV7FLI*Q8Q& zqNr@RKu~SY9cO77C4iZ>jI*g=U@1ET;!a(8f1@ztLr(URY z&eXO+%U5*U#x2GH&IHR=B1Ll7MUtK~kl)w)H+;$^;vFLD*@vWmY!*}PW(~8+C!9z%SkZy{4ii6$29~%K9lq!dy7-c zX5uErik)4dHKQ=#+fc1%yY6*P$*nXeKa^bDjsPU6$VT0RR`*nUk-VY1#!!rqE0Sfh zh-CLA=%V}_w-{YCyL=*45IQA|T_*TYL*f z9M`tqOi?I~2*=GmoQu!V=W+WPx)9q`JJ_OT6}2vfo!VBJI>&{R!^4%yQ-MauFqwgm zNX!o7NpKP6NwzK!=Wp0-oyuqm-EXVR?~t^u$0-vfn=U2J7kQ_JK+PCr3e$vr1vgDxW z_Ul2nKVKJs4H>QacWrE?s*3PNAc2rC2iuc#%@b9JSOmRPvXv|ZFDXAx!1;90xG^e#;Ya`0u0|!gn{!1l&mN*tFnRTI-WBcc&u&v z_Oa7rj~?N-gTdPNLlBc}f61Ob?XdO}3?4`O2kiMr2Y6~rQ{&dRUC;Xj^T($X8>2d> zcNE_5NJ8tCU_yKMd}kcOku!Sb1kN!AOm8q?0e5*X93zrYK7*hk1iY_SDd7DlY+#={ z?i+UM^|?P{9@y(TBkcfH^a=MS%6u|{MzzL28`~q|Iqu+-iEH~TaM6sar`NJqu~Xi6 zCZ`k__sz}|yf(}1Q1*iG4Z@{?3Tg9C(aU!8hQ#bYKV(mj*ujez_}5YT?IE}O^ztH6 z&=0aJ`jZj8;gATnFAmxB!$bD$pl(a;QW{EQsC;z94xb&dqbH~r3a10h3S+7CAB9Tt z<-4c?ZG6Eo+ayHNLXm!@p+p zzLekg@st*f?!5-SH@?E>&QBw(MB65Cf49kFGR7|S(`?@1|A4frkZ$)+YU;;W&{I<$ z!W!zOTmG38NsBvDWOON=jc=lB_Pp_+X3?r(`T<1uoA)*gH++NAC|IiLh0eqpSZkx!o$I+abr~4l`*8y{?%`D zK>YO~Y_g|gH->k`eybrlIK*F-J`(({E_eqIXGS3X5H|lZ5{ZUFuxXL*FKFd`{K*xQ zT&y&HPb)Qn)h5ABs@C$l>Z4m#Wy3UHWfvh;`a-#+SfwoqB&q0w__U?6Ul&lU9TJdN zc?vogSy8ONqOUta6CeLfD<%@!;)n!QNM?m>e@!b!K&mGsFhSFH0SSx-3I19akjZaJ zP&e6e`rK%2K|!H@Oe++K;+xfwL^9h!y+K;l{MEDLEY>COURIERSERVE.;2| 29040 changes to%: (VARS COURIERSERVECOMS) previous date%: "21-Jul-88 15:19:08" |{PELE:MV:ENVOS}MEDLEY>COURIERSERVE.;1|) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1991 by Xerox Corporation & Stanford University. All rights reserved. ") (PRETTYCOMPRINT COURIERSERVECOMS) (RPAQQ COURIERSERVECOMS ((DECLARE%: EVAL@COMPILE DONTCOPY (FILES UTILISOPRS ETHERRECORDS (LOADCOMP) COURIER)) (FNS COURIER.START.SERVER COURIER.RETURN COURIER.ABORT COURIER.REJECT CLOSE.BULK.DATA COURIER.RESET.SOCKET) (FNS \COURIERSERVER \COURIER.SERVE \COURIER.APPLY \COURIER.SETUP.REPLY \COURIER.FINISH.REPLY \FIND.COURIER.PROGRAM \FIND.COURIER.PROCEDURE) (FNS \EXPEDITEDCOURIERSERVER \EXPEDITEDCOURIER.SERVE \CREATE.EXPEDITED.STREAM) (PROP ARGNAMES COURIER.CALL COURIER.EXPEDITED.CALL) (CONSTANTS (\REJECT.NOSUCHPROGRAM 0) (\REJECT.NOSUCHVERSION 1) (\REJECT.NOSUCHPROCEDURE 2) (\REJECT.INVALIDARGUMENTS 3) (\REJECT.UNSPECIFIED 65535) (\SINK.NULL 0) (\SINK.IMMEDIATE 1) (\SINK.PASSIVE 2) (\SINK.ACTIVE 3)) (DECLARE%: DONTCOPY (RECORDS COURIERSERVERFN XIPSOCKETPAIR)))) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD UTILISOPRS ETHERRECORDS (LOADCOMP) COURIER) ) (DEFINEQ (COURIER.START.SERVER [LAMBDA (RESTART) (* ; "Edited 21-Jul-88 14:44 by cdl") (LET (PROCESS) (while (AND (SETQ PROCESS (FIND.PROCESS 'COURIER.LISTENER)) RESTART) do (DEL.PROCESS PROCESS) (BLOCK)) (if (NULL PROCESS) then (COURIER.RESET.SOCKET) (SPP.OPEN NIL \NS.WKS.Courier NIL 'COURIER.LISTENER '(SERVER.FUNCTION \COURIERSERVER OTHERXIPHANDLER \EXPEDITEDCOURIERSERVER )) (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Courier Server started")) (until (SETQ PROCESS (FIND.PROCESS 'COURIER.LISTENER)) do (BLOCK))) PROCESS]) (COURIER.RETURN [LAMBDA (COURIERSTREAM PROGRAM PROCEDURE RESULTLST) (* cdl "26-Nov-85 17:10") (LET (RESULTS STREAM) (SETQ RESULTS (with COURIERFN (\GET.COURIER.DEFINITION PROGRAM PROCEDURE 'PROCEDURES (\GET.COURIERPROGRAM PROGRAM)) RESULTS)) (if (EQLENGTH RESULTLST (LENGTH RESULTS)) then (SETQ STREAM (\COURIER.SETUP.REPLY COURIERSTREAM \COURIERMSG.RETURN)) (if (\COURIER.EXPEDITED.ARGS STREAM PROGRAM RESULTLST RESULTS) then (\COURIER.FINISH.REPLY COURIERSTREAM STREAM) else (COURIER.REJECT COURIERSTREAM)) else (COURIER.REJECT COURIERSTREAM \REJECT.INVALIDARGUMENTS]) (COURIER.ABORT [LAMBDA (COURIERSTREAM PROGRAM ERROR RESULTLST) (* cdl "26-Nov-85 17:20") (LET [(STREAM (\COURIER.SETUP.REPLY COURIERSTREAM \COURIERMSG.ABORT)) (ERRORFORM (CDR (ASSOC ERROR (fetch (COURIERPGM ERRORS) of (\GET.COURIERPROGRAM PROGRAM] (PUTWORD STREAM (CAR ERRORFORM)) (if (\COURIER.EXPEDITED.ARGS STREAM PROGRAM RESULTLST (CADR ERRORFORM)) then (\COURIER.FINISH.REPLY COURIERSTREAM STREAM) else (COURIER.REJECT \REJECT.INVALIDARGUMENTS]) (COURIER.REJECT [LAMBDA (COURIERSTREAM ERROR RESULTLST) (* cdl "26-Jun-87 10:13") (* DECLARATIONS%: (RECORD  VERSIONRANGE (LOWEST . HIGHEST))) (LET ((STREAM (\COURIER.SETUP.REPLY COURIERSTREAM \COURIERMSG.REJECT))) [if (NOT (NUMBERP ERROR)) then (SETQ ERROR (SELECTQ ERROR ((NIL UNSPECIFIED) \REJECT.UNSPECIFIED) (NO.SUCH.PROGRAM \REJECT.NOSUCHPROGRAM) (NO.SUCH.VERSION \REJECT.NOSUCHVERSION) (NO.SUCH.PROCEDURE \REJECT.NOSUCHPROCEDURE) (INVALID.ARGUMENTS \REJECT.INVALIDARGUMENTS) (SHOULDNT] (PUTWORD STREAM ERROR) (SELECTC ERROR (\REJECT.NOSUCHVERSION (with VERSIONRANGE RESULTLST (PUTWORD STREAM LOWEST) (PUTWORD STREAM HIGHEST))) NIL) (\COURIER.FINISH.REPLY COURIERSTREAM STREAM]) (CLOSE.BULK.DATA [LAMBDA (STREAM ABORTFLG) (* ; "Edited 21-Jul-88 15:18 by cdl") (* Close a Bulk Data stream after the transfer has taken place.  If a result function was specified in COURIER.CALL, call it on the stream and  the result or list of results.) (PROG ((CON (fetch (SPPSTREAM SPP.CONNECTION) of STREAM))) (with SPPCON CON (SETQ SPPATTENTIONFN NIL) (if (NULL SPPSUBSTREAM) then (* This stream has already been closed.  We don't want to try to read the Courier results twice) (RETURN))) (if (WRITEABLE STREAM) then (if ABORTFLG then (SPP.SENDATTENTION STREAM 1) else (SPP.SENDEOM STREAM)) elseif (NOT (\EOFP STREAM)) then (* Closing before all the data has  been read -- abort the transfer.) (if (NOT ABORTFLG) then (SETQ ABORTFLG T)) (\ABORT.BULK.DATA STREAM)) (SPP.DSTYPE STREAM \SPPDSTYPE.COURIER) (with SPPCON CON (SETQ SPPINPKT NIL) (SETQ SPPSUBSTREAM NIL)) (* This stream is closing; make sure there aren't any dangling pointers into  the middle of ether packets.) (with STREAM STREAM (SETQ CBUFPTR NIL) (SETQ CBUFSIZE 0)) (* The result of the Courier call may be an error which the user should see;  however, we still need to clean up the substream, so we wrap it in this  RESETLST.) (if ABORTFLG then (with STREAM (with SPPCON CON SPPINPUTSTREAM) (SETQ ENDOFSTREAMOP (FUNCTION \COURIER.EOF))) (with STREAM STREAM (SETQ ENDOFSTREAMOP (FUNCTION ERROR!]) (COURIER.RESET.SOCKET [LAMBDA NIL (* ; "Edited 5-Apr-88 14:08 by cdl") (CLOSENSOCKET (OPENNSOCKET \NS.WKS.Courier 'ACCEPT) T]) ) (DEFINEQ (\COURIERSERVER [LAMBDA (STREAM) (* ; "Edited 5-Apr-88 14:02 by cdl") (DECLARE (SPECVARS STREAM)) (RESETLST (RESETSAVE NIL `(CLOSEF? %, STREAM)) [PROG (LOW.VERSION HIGH.VERSION) (SPP.DSTYPE STREAM \SPPDSTYPE.COURIER) (with STREAM STREAM (SETQ ENDOFSTREAMOP (FUNCTION \COURIER.EOF))) (PROCESS.NAME (THIS.PROCESS) (PACK* 'COURIER (SPP.DESTADDRESS STREAM))) (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Server opened connection with" %, (SPP.DESTADDRESS STREAM))) (PUTWORD STREAM COURIER.VERSION#) (PUTWORD STREAM COURIER.VERSION#) (SPP.FORCEOUTPUT STREAM) (SETQ LOW.VERSION (GETWORD STREAM)) (SETQ HIGH.VERSION (GETWORD STREAM)) (if (AND (LEQ LOW.VERSION COURIER.VERSION#) (LEQ COURIER.VERSION# HIGH.VERSION)) then (SPP.CLEAREOM STREAM T) (\COURIER.SERVE STREAM) else (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Client requesting unknown version of Courier" %, (SPP.DESTADDRESS STREAM) %, LOW.VERSION %, HIGH.VERSION])]) (\COURIER.SERVE [LAMBDA (STREAM) (* cdl "30-Jun-87 08:57") (until (SPP.EOFP STREAM) do (SELECTC (GETWORD STREAM) (\COURIERMSG.CALL (PROG (PROGRAM PROGRAM# VERSION# PROCEDURE# PROCEDURE PGMDEF PROCDEF VERSIONS RESULTLST) (STREAMPROP STREAM 'TRANSACTIONID (GETWORD STREAM)) (* Save the Transaction ID.) (SETQ PROGRAM# (GETLONG STREAM)) (SETQ VERSION# (GETWORD STREAM)) (SETQ PROCEDURE# (GETWORD STREAM)) (if (SETQ VERSIONS (\FIND.COURIER.PROGRAM PROGRAM# VERSION#)) then [if (SETQ PROGRAM (CDR (FASSOC VERSION# VERSIONS))) then (if (SETQ PROCEDURE (\FIND.COURIER.PROCEDURE (SETQ PGMDEF ( \GET.COURIERPROGRAM PROGRAM)) PROCEDURE#)) then (SETQ PROCDEF (\GET.COURIER.DEFINITION PROGRAM PROCEDURE 'PROCEDURES PGMDEF)) (with COURIERSERVERFN PROCDEF (if SERVERFN then (if (NEQ (\COURIER.APPLY SERVERFN STREAM PROGRAM PROCEDURE PGMDEF PROCDEF) 'FLUSH) then (RETURN)) else (COURIER.REJECT STREAM \REJECT.NOSUCHPROCEDURE))) else (COURIER.REJECT STREAM \REJECT.NOSUCHPROCEDURE)) else (COURIER.REJECT STREAM \REJECT.NOSUCHVERSION (CONS (in VERSIONS minimize CAR) (in VERSIONS maximize CAR] else (COURIER.REJECT STREAM \REJECT.NOSUCHPROGRAM)) (* Flush arguments from rejected  call) (bind FLG until (SETQ FLG (SPP.EOFP STREAM)) do (BIN STREAM) finally (SELECTQ FLG (EOM (SPP.CLEAREOM STREAM)) NIL)))) (SHOULDNT]) (\COURIER.APPLY [LAMBDA (FN STREAM PROGRAM PROCEDURE PGMDEF PROCDEF) (* cdl "26-Jun-87 11:37") (DECLARE (SPECVARS FN STREAM PROGRAM PROCEDURE PGMDEF PROCDEF)) (RESETLST (PROG (XIPSOCKETPAIR ARGLST RESULTS DATASTREAM) (DECLARE (SPECVARS XIPSOCKETPAIR ARGLST)) [if (type? XIPSOCKETPAIR STREAM) then (with XIPSOCKETPAIR (SETQ XIPSOCKETPAIR STREAM) (SETQ STREAM (\CREATE.EXPEDITED.STREAM XIP 'INPUT NIL (INDEXF (fetch (EXPEDITEDXIP ARG0) of T] [SETQ ARGLST (for TYPE in (with COURIERFN PROCDEF ARGS) collect (SELECTQ TYPE ((BULK.DATA.SINK BULK.DATA.SOURCE) (SELECTC (GETWORD STREAM) (\SINK.IMMEDIATE NIL) ((LIST \SINK.NULL \SINK.PASSIVE \SINK.ACTIVE) (* Server only handles IMMEDIATE  transfer, error out as cleanly as we  can) (COURIER.REJECT STREAM) (RETURN 'FLUSH)) (SHOULDNT)) (SETQ DATASTREAM (\BULK.DATA.STREAM STREAM (SELECTQ TYPE (BULK.DATA.SOURCE 'INPUT) 'OUTPUT) PROGRAM PROCEDURE PGMDEF PROCDEF ))) (COURIER.READ STREAM PROGRAM TYPE] (if XIPSOCKETPAIR then (SETQ STREAM XIPSOCKETPAIR) else (SELECTQ (SPP.EOFP STREAM) (EOM (SPP.CLEAREOM STREAM)) NIL)) (if [SETQ RESULTS (NLSETQ (APPLY FN (LIST* STREAM PROGRAM PROCEDURE ARGLST] then (SETQ RESULTS (CAR RESULTS)) else (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Courier server function break:" %, FN)) (COURIER.REJECT STREAM \REJECT.UNSPECIFIED) (RETURN)) (if (AND DATASTREAM (OPENP DATASTREAM)) then (CLOSE.BULK.DATA DATASTREAM)) (SELECTQ (CAR RESULTS) (RETURN (COURIER.RETURN STREAM PROGRAM PROCEDURE (CDR RESULTS))) (ABORT (COURIER.ABORT STREAM PROGRAM (CADR RESULTS) (CDDR RESULTS))) (REJECT (COURIER.REJECT STREAM (CADR RESULTS) (CDDR RESULTS))) NIL) (RETURN)))]) (\COURIER.SETUP.REPLY [LAMBDA (STREAM TYPE) (* cdl "26-Jun-87 11:30") (LET (TRANSACTIONID) [if (type? XIPSOCKETPAIR STREAM) then (SETQ TRANSACTIONID (with EXPEDITEDXIP (with XIPSOCKETPAIR STREAM XIP) TRANSACTIONID)) [with XIPSOCKETPAIR STREAM (SETQ STREAM (\CREATE.EXPEDITED.STREAM XIP 'OUTPUT NIL (INDEXF (fetch (EXPEDITEDXIP MSGTYPE) of T] else (SETQ TRANSACTIONID (STREAMPROP STREAM 'TRANSACTIONID] (PUTWORD STREAM TYPE) (PUTWORD STREAM TRANSACTIONID) (* Transaction ID just echoed for  now.) STREAM]) (\COURIER.FINISH.REPLY [LAMBDA (COURIERSTREAM STREAM) (* cdl " 7-Nov-85 19:22") (if (type? XIPSOCKETPAIR COURIERSTREAM) then (with XIPSOCKETPAIR COURIERSTREAM (replace (XIP XIPLENGTH) of XIP with (with STREAM STREAM COFFSET)) (SWAPXIPADDRESSES XIP) (with ETHERPACKET XIP (SETQ EPREQUEUE 'FREE)) (SENDXIP SOCKET XIP)) else (SPP.SENDEOM COURIERSTREAM]) (\FIND.COURIER.PROGRAM [LAMBDA (PROGRAM VERSION) (* cdl "30-Jun-87 08:56") (DECLARE (SPECVARS PROGRAM VERSION)) (LET (VERSIONS) (DECLARE (SPECVARS VERSIONS)) [MAPHASH \COURIERPROGRAM (FUNCTION (LAMBDA (VALUE KEY) (DECLARE (USEDFREE PROGRAM VERSION VERSIONS)) (with COURIERPGM VALUE (if (EQP PROGRAM# PROGRAM) then (push VERSIONS (CONS VERSION# KEY)) (if (EQP VERSION# VERSION) then (* We found the requested version,  no reason to look for others) (RETFROM (FUNCTION MAPHASH] VERSIONS]) (\FIND.COURIER.PROCEDURE [LAMBDA (PGMDEF PROCEDURE#) (* cdl "26-Jun-87 08:33") (LET (PROCEDURE) (if [SETQ PROCEDURE (OR (for PROCEDURE in (with COURIERPGM PGMDEF PROCEDURES ) thereis (EQP (with COURIERFN (CDR PROCEDURE) FN#) PROCEDURE#)) (for OTHERPROGRAM in (with COURIERPGM PGMDEF INHERITS) when [SETQ $$VAL (with COURIERPGM (\GET.COURIERPROGRAM OTHERPROGRAM) (for PROCEDURE in PROCEDURES thereis (EQP (with COURIERFN (CDR PROCEDURE) FN#) PROCEDURE#] do (RETURN $$VAL] then (CAR PROCEDURE]) ) (DEFINEQ (\EXPEDITEDCOURIERSERVER [LAMBDA (XIP SOCKET) (* cdl "26-Jun-87 09:08") (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Expedited server connection with" %, (with XIP XIP XIPSOURCENSADDRESS))) (LET ((XIPSOCKETPAIR (create XIPSOCKETPAIR XIP _ XIP SOCKET _ SOCKET))) (with EXPEDITEDXIP XIP (if (NOT (AND (LEQ LOWVERSION COURIER.VERSION#) (LEQ COURIER.VERSION# HIGHVERSION))) then (if COURIERTRACEFLG then (printout COURIERTRACEFILE T "Client requesting unknown version of Courier" %, (with XIP XIP XIPSOURCENSADDRESS) %, LOWVERSION %, HIGHVERSION)) (COURIER.REJECT XIPSOCKETPAIR))) (ADD.PROCESS `(\EXPEDITEDCOURIER.SERVE %, (KWOTE XIPSOCKETPAIR]) (\EXPEDITEDCOURIER.SERVE [LAMBDA (XIPSOCKETPAIR) (* cdl "30-Jun-87 08:57") (with EXPEDITEDXIP (with XIPSOCKETPAIR XIPSOCKETPAIR XIP) (SELECTC MSGTYPE (\COURIERMSG.CALL (PROG (PROGRAM PROCEDURE PGMDEF PROCDEF VERSIONS RESULTLST) (if (SETQ VERSIONS (\FIND.COURIER.PROGRAM PROGRAM# VERSION#)) then [if (SETQ PROGRAM (CDR (FASSOC VERSION# VERSIONS))) then (if (SETQ PROCEDURE (\FIND.COURIER.PROCEDURE (SETQ PGMDEF ( \GET.COURIERPROGRAM PROGRAM)) PROCEDURE#)) then (SETQ PROCDEF (\GET.COURIER.DEFINITION PROGRAM PROCEDURE 'PROCEDURES PGMDEF)) (with COURIERSERVERFN PROCDEF (if SERVERFN then (\COURIER.APPLY SERVERFN XIPSOCKETPAIR PROGRAM PROCEDURE PGMDEF PROCDEF) else (COURIER.REJECT XIPSOCKETPAIR \REJECT.NOSUCHPROCEDURE ))) else (COURIER.REJECT XIPSOCKETPAIR \REJECT.NOSUCHPROCEDURE)) else (COURIER.REJECT XIPSOCKETPAIR \REJECT.NOSUCHVERSION (CONS (in VERSIONS minimize CAR) (in VERSIONS maximize CAR] else (COURIER.REJECT XIPSOCKETPAIR \REJECT.NOSUCHPROGRAM)))) (SHOULDNT]) (\CREATE.EXPEDITED.STREAM [LAMBDA (XIP ACCESS OSTREAM OFFSET) (* ; "Edited 21-Jul-88 15:08 by cdl") (* * Makes a STREAM to access the contents of XIP as an expedited courier  message body. We use the BASEBYTES device for simplicity.  All the operations we actually need are BIN, BOUT, BLOCKIN and BLOCKOUT) (LET ([STREAM (OR OSTREAM (NCREATE 'STREAM] END) (replace (STREAM DEVICE) of STREAM with \BASEBYTESDEVICE) (replace (STREAM ACCESS) of STREAM with ACCESS) (replace (STREAM CBUFPTR) of STREAM with (fetch (XIP XIPBASE) of XIP)) [replace (STREAM COFFSET) of STREAM with (IPLUS \XIPOVLEN (UNFOLD 3 BYTESPERWORD) (if (EQ ACCESS 'INPUT) then (* For COURIER.RESULTS) (SETQ END (fetch (XIP XIPLENGTH) of XIP)) (UNFOLD (OR OFFSET (INDEXF (fetch (EXPEDITEDXIP MSGTYPE) of T))) BYTESPERWORD) else (* For COURIER.EXPEDITED.ARGS) (SETQ END (IPLUS \MAX.XIPDATALENGTH \XIPOVLEN)) (UNFOLD (OR OFFSET (INDEXF (fetch (EXPEDITEDXIP ARG0) of T))) BYTESPERWORD] (replace (STREAM EOFFSET) of STREAM with (replace (STREAM CBUFSIZE) of STREAM with END)) [if (EQ ACCESS 'INPUT) then (* Will cause error if COURIER.RESULTS tries to read more than was sent --  should never happen) (with STREAM STREAM (SETQ ENDOFSTREAMOP (FUNCTION \COURIER.EOF))) else (* Invoked if COURIER.EXPEDITED.ARGS  tries to write more than will fit in  the packet) (with BASEBYTESTREAM STREAM (SETQ WRITEXTENSIONFN (FUNCTION \COURIER.EXPEDITED.OVERFLOW] STREAM]) ) (PUTPROPS COURIER.CALL ARGNAMES (NIL (STREAM PROGRAM PROCEDURE ARG1 ... ARGn NOERRORFLG) . U)) (PUTPROPS COURIER.EXPEDITED.CALL ARGNAMES (NIL (ADDRESS SOCKET PROGRAM PROCEDURE ARG1 ... ARGn NOERRORFLG) . U)) (DECLARE%: EVAL@COMPILE (RPAQQ \REJECT.NOSUCHPROGRAM 0) (RPAQQ \REJECT.NOSUCHVERSION 1) (RPAQQ \REJECT.NOSUCHPROCEDURE 2) (RPAQQ \REJECT.INVALIDARGUMENTS 3) (RPAQQ \REJECT.UNSPECIFIED 65535) (RPAQQ \SINK.NULL 0) (RPAQQ \SINK.IMMEDIATE 1) (RPAQQ \SINK.PASSIVE 2) (RPAQQ \SINK.ACTIVE 3) (CONSTANTS (\REJECT.NOSUCHPROGRAM 0) (\REJECT.NOSUCHVERSION 1) (\REJECT.NOSUCHPROCEDURE 2) (\REJECT.INVALIDARGUMENTS 3) (\REJECT.UNSPECIFIED 65535) (\SINK.NULL 0) (\SINK.IMMEDIATE 1) (\SINK.PASSIVE 2) (\SINK.ACTIVE 3)) ) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD COURIERSERVERFN (FN# ARGS RETURNSNOISE RESULTS REPORTSNOISE ERRORS IMPLEMENTEDNOISE SERVERFN)) (TYPERECORD XIPSOCKETPAIR (XIP . SOCKET)) ) ) (PUTPROPS COURIERSERVE COPYRIGHT ("Xerox Corporation & Stanford University" 1985 1986 1987 1988 1991)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1593 7933 (COURIER.START.SERVER 1603 . 2726) (COURIER.RETURN 2728 . 3548) ( COURIER.ABORT 3550 . 4187) (COURIER.REJECT 4189 . 5621) (CLOSE.BULK.DATA 5623 . 7730) ( COURIER.RESET.SOCKET 7732 . 7931)) (7934 21043 (\COURIERSERVER 7944 . 9463) (\COURIER.SERVE 9465 . 12794) (\COURIER.APPLY 12796 . 16571) (\COURIER.SETUP.REPLY 16573 . 17735) (\COURIER.FINISH.REPLY 17737 . 18313) (\FIND.COURIER.PROGRAM 18315 . 19499) (\FIND.COURIER.PROCEDURE 19501 . 21041)) (21044 27777 (\EXPEDITEDCOURIERSERVER 21054 . 22390) (\EXPEDITEDCOURIER.SERVE 22392 . 25156) ( \CREATE.EXPEDITED.STREAM 25158 . 27775))))) STOP \ No newline at end of file diff --git a/lispusers/COURIERSERVE.TEDIT b/lispusers/COURIERSERVE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..3842e4d5b34d22f53c01f34aee44cf6399418cf2 GIT binary patch literal 9906 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 literal 0 HcmV?d00001 diff --git a/lispusers/COURIERSERVEPATCH b/lispusers/COURIERSERVEPATCH new file mode 100644 index 00000000..4d143692 --- /dev/null +++ b/lispusers/COURIERSERVEPATCH @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "10-Mar-88 14:59:38" {ERINYES}LYRIC>COURIERSERVEPATCH.;2 3329 changes to%: (FNS \SPP.ESTABLISH) previous date%: " 9-Mar-88 16:56:49" {ERINYES}LYRIC>COURIERSERVEPATCH.;1) (* " Copyright (c) 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT COURIERSERVEPATCHCOMS) (RPAQQ COURIERSERVEPATCHCOMS ((FNS \SPP.ESTABLISH \SPP.CREATE.CON) (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (SOURCE) SPPDECLS))) ) (DEFINEQ (\SPP.ESTABLISH (LAMBDA (INITCON XIP) (* ; "Edited 10-Mar-88 14:58 by bvm") (* ;;; "The arrival of XIP causes this SPP connection to be established. Fix up state as appropriate") (PROG (CON INSTREAM NAME) (COND ((NOT (fetch SPPSERVERFLAG of INITCON)) (SETQ CON INITCON) (* ; "For user connection, need to update socket info, as server may have switched from a well-known socket to a private one.") (\BLT (LOCF (fetch SPPDESTNSADDRESS0 of CON)) (LOCF (fetch XIPSOURCENET of XIP)) \#WDS.NSADDRESS)) (T (* ;; "The connection was opened in server mode. Create a new spp connection, and establish it to the remote side, spawning a new process") (COND ((\SPP.DUPLICATE.REQUEST XIP) (* ; "We've already spawned a server for this source") (RETURN))) (SETQ CON (\SPP.CREATE.CON)) (\BLT (LOCF (fetch SPPDESTNSADDRESS0 of CON)) (LOCF (fetch XIPSOURCENET of XIP)) \#WDS.NSADDRESS) (* ; "Fill in address of port that contacted us") (SETQ NAME (CONCAT (PROCESSPROP (fetch SPPPROCESS of INITCON) (QUOTE NAME)) (QUOTE +) (OCTALSTRING (fetch SPPSOURCESKT# of CON)))) (replace SPPATTENTIONFN of CON with (fetch SPPATTENTIONFN of INITCON)) (* ; "Copy some methods from the listener con") (replace SPPWHENCLOSEDFN of CON with (fetch SPPWHENCLOSEDFN of INITCON)) (replace SPPERRORHANDLER of CON with (fetch SPPERRORHANDLER of INITCON)))) (replace SPPDESTID of CON with (fetch (SPPXIP SOURCECONID) of XIP)) (replace SPPSYSPKT of CON with NIL) (* ; "Flush any cached sys packet, now out of date") (replace SPPESTABLISHEDP of CON with T) (replace SPPSTATE of CON with \SPS.OPEN) (replace SPPDESTINATIONKNOWN of CON with T) (if NAME then (* ; "Finally, get server going") (SETQ INSTREAM (\SPP.CREATE.STREAMS CON)) (\SPP.CREATE.WATCHER CON NAME) (WITH.MONITOR (fetch SPPLOCK of CON) (* ; "Have to reply to the sender so he knows our id & socket") (\SPP.PROBE CON)) (ADD.PROCESS (LIST (fetch SPPSERVERFN of INITCON) INSTREAM (SPPOUTPUTSTREAM INSTREAM)) (QUOTE AFTEREXIT) (QUOTE DELETE))) (NOTIFY.EVENT (fetch SPPINPUTEVENT of CON)))) ) (\SPP.CREATE.CON (LAMBDA (SKT#) (* ; "Edited 9-Mar-88 16:00 by bvm") (* ;; "Creates an SPPCON object, initialized to be a connection from this machine, etc. If SKT# is specified, we open that exact socket, else a random user socket.") (LET* ((NSOC (OPENNSOCKET SKT#)) (CON (create SPPCON SPPXIPLENGTH _ (+ \XIPOVLEN \SPPHEAD.LENGTH) SPPXIPTYPE _ \XIPT.SPP SPPSOURCEID _ (LOGOR 32768 (LOGAND (DAYTIME) 32767)) SPPMYNSOCKET _ NSOC SPPSOURCESKT# _ (NSOCKETNUMBER NSOC) SPPACCEPTNO _ \SPP.INITIAL.ALLOCATION))) (\BLT (LOCF (fetch SPPSOURCENSADDRESS0 of CON)) \MY.NSADDRESS (SUB1 \#WDS.NSADDRESS)) CON)) ) ) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD (SOURCE) SPPDECLS) ) (PUTPROPS COURIERSERVEPATCH COPYRIGHT ("Xerox Corporation" 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (540 3174 (\SPP.ESTABLISH 550 . 2564) (\SPP.CREATE.CON 2566 . 3172))))) STOP \ No newline at end of file diff --git a/lispusers/CROCK b/lispusers/CROCK new file mode 100644 index 00000000..1a309cd4 --- /dev/null +++ b/lispusers/CROCK @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED " 2-Apr-87 00:37:46" {ERIS}LYRIC>CROCK.;2 17791 previous date%: "11-Jan-86 19:46:27" {PHYLUM}LYRIC>CROCK.;1) (* " Copyright (c) 1984, 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT CROCKCOMS) (RPAQQ CROCKCOMS ((* CROCK -- By Kelly Roach *) (FNS CROCK CROCK.BUTTONEVENTFN CROCK.CHANGE.STYLE CROCK.CLOSEFN CROCK.PROCESS CROCK.RESHAPEFN CROCK.ALARM CROCK.RING.ALARM CROCK.INIT) (INITVARS (CROCK.DEFAULT.STYLE '(HANDS T TIMES NIL RINGS NIL NUMBERS T)) (CROCK.STYLE.MENU) (CROCK.ALARMS) (CROCK.DATEFORMAT '(DATEFORMAT NO.SECONDS)) [CROCK.TUNE '((1000 . 1000) (800 . 1000) (600 . 1000) (500 . 1000) (400 . 1000) (NIL . 500) (440 . 1000) (484 . 1000) (540 . 1000) (600 . 1000) (2000 . 1000) (1600 . 1000) (1200 . 1000) (1000 . 1000) (800 . 1000) (NIL . 500) (880 . 1000) (968 . 1000) (1080 . 1000) (1188 . 1000] (CROCKWINDOW)))) (* CROCK -- By Kelly Roach *) (DEFINEQ (CROCK [LAMBDA (REGION) (DECLARE (GLOBALVARS CROCKWINDOW)) (* lmm "22-Feb-84 17:07") (PROG NIL (COND ((NOT (WINDOWP CROCKWINDOW)) [COND ((NULL REGION) (PROMPTPRINT "Please indicate a region for the clock") (SETQ REGION (GETREGION] (SETQ CROCKWINDOW (CREATEW REGION))) (REGION (SHAPEW CROCKWINDOW REGION))) (DEL.PROCESS 'CROCK.PROCESS) (ADD.PROCESS '(CROCK.PROCESS) 'RESTARTABLE T]) (CROCK.BUTTONEVENTFN [LAMBDA (WINDOW) (* edited%: "24-AUG-82 17:15") (COND ((LASTMOUSESTATE MIDDLE) (CROCK.CHANGE.STYLE WINDOW)) ((LASTMOUSESTATE (NOT UP)) (WAKE.PROCESS 'CROCK.PROCESS 'REPAINT]) (CROCK.CHANGE.STYLE [LAMBDA (WINDOW) (* bvm%: "22-APR-83 17:13") (PROG (MENU COMMAND STYLE NO.CHANGE) [SETQ MENU (OR CROCK.STYLE.MENU (SETQ CROCK.STYLE.MENU (create MENU ITEMS _ '(NUMBERS POINTS NO.NUMBERS RINGS NO.RINGS HANDS NO.HANDS TIMES NO.TIMES (" " NIL) SHOW.STYLE SET.TO.DEFAULT CHANGE.DEFAULT (" " NIL) SETTIME] (SETQ COMMAND (MENU MENU)) (SETQ STYLE (WINDOWPROP WINDOW 'STYLE)) (SELECTQ COMMAND (NIL (SETQ NO.CHANGE T)) (SETTIME (RESETFORM (TTY.PROCESS (THIS.PROCESS)) (SETTIME))) (SET.TO.DEFAULT (SETQ STYLE (COPY CROCK.DEFAULT.STYLE))) (HANDS (LISTPUT STYLE 'HANDS T)) (NO.HANDS (LISTPUT STYLE 'HANDS NIL)) (TIMES (LISTPUT STYLE 'TIMES T)) (NO.TIMES (LISTPUT STYLE 'TIMES NIL)) (RINGS (LISTPUT STYLE 'RINGS T)) (NO.RINGS (LISTPUT STYLE 'RINGS NIL)) (NUMBERS (LISTPUT STYLE 'NUMBERS T)) (POINTS (LISTPUT STYLE 'NUMBERS 'POINTS)) (NO.NUMBERS (LISTPUT STYLE 'NUMBERS NIL)) (CHANGE.DEFAULT (SETQ CROCK.DEFAULT.STYLE (COPY STYLE)) (SETQ NO.CHANGE T)) (SHOW.STYLE (printout PROMPTWINDOW T "CROCK style: " T 3 "Numbers: " (COND ((LISTGET STYLE 'NUMBERS) "yes") (T "no")) "; Rings: " (COND ((LISTGET STYLE 'RINGS) "yes") (T "no")) "; Hands: " (COND ((LISTGET STYLE 'HANDS) "yes") (T "no")) "; Times: " (COND ((LISTGET STYLE 'TIMES) "yes") (T "no"))) (SETQ NO.CHANGE T)) (SHOULDNT)) (COND (NO.CHANGE) (T (WINDOWPROP WINDOW 'STYLE STYLE) (WAKE.PROCESS 'CROCK.PROCESS 'CHANGE.STYLE]) (CROCK.CLOSEFN [LAMBDA (WINDOW) (* edited%: "24-AUG-82 17:17") (WAKE.PROCESS 'CROCK.PROCESS 'CLOSING]) (CROCK.PROCESS [LAMBDA NIL (DECLARE (GLOBALVARS CROCKWINDOW)) (* ; "Edited 1-Apr-00 by Briggs & Dixon") (PROG (SIZE HALFSIZE XCENTER YCENTER RADIUS INSIDERADIUS MINUTEHANDSIZE HOURHANDSIZE DS STYLE CLIPPINGREGION OUTLINE OUTLINEDSP DONE IDATE UDATE DATE HOURS MINUTES SECONDS OLDMINUTES WIDTH HEIGHT HOURANGLE MINUTEANGLE NUM FONTHALFHEIGHT CHANGE.STYLE FONT STRPTR 1APR OLDHOURS) (CROCK.INIT CROCKWINDOW) (SETQ STRPTR (DATE CROCK.DATEFORMAT)) (SETQ DS (WINDOWPROP CROCKWINDOW 'DSP)) RESTART (SETQ CHANGE.STYLE T) (SETQ CLIPPINGREGION (DSPCLIPPINGREGION NIL DS)) (SETQ XCENTER (IQUOTIENT (SETQ WIDTH (fetch (REGION WIDTH) of CLIPPINGREGION)) 2)) (SETQ YCENTER (IQUOTIENT (SETQ HEIGHT (IDIFFERENCE (fetch (REGION HEIGHT) of CLIPPINGREGION ) 10)) 2)) (* ;  "Allow 10 points at top for digital form") (SETQ SIZE (IMIN HEIGHT WIDTH)) (SETQ HALFSIZE (IQUOTIENT SIZE 2)) (SETQ RADIUS (FIXR (FTIMES 0.9 HALFSIZE))) (SETQ INSIDERADIUS (IDIFFERENCE RADIUS 10)) (SETQ HOURHANDSIZE (FTIMES 0.5 INSIDERADIUS)) (SETQ MINUTEHANDSIZE (FTIMES 0.8 INSIDERADIUS)) (SETQ OUTLINE (BITMAPCREATE WIDTH HEIGHT)) (SETQ OUTLINEDSP (DSPCREATE)) (DSPDESTINATION OUTLINE OUTLINEDSP) (DSPFONT [SETQ FONT (COND ((ILESSP RADIUS 50) (FONTCREATE 'GACHA 8)) (T (FONTCREATE 'HELVETICA 10 'BOLD] OUTLINEDSP) (DSPFONT FONT DS) (SETQ STYLE (WINDOWPROP CROCKWINDOW 'STYLE)) (SETQ 1APR 1) [until DONE do (COND (CHANGE.STYLE (SETQ CHANGE.STYLE (SETQ OLDMINUTES (SETQ OLDHOURS NIL))) (DSPFILL NIL WHITESHADE 'REPLACE OUTLINEDSP) (DRAWCIRCLE XCENTER YCENTER RADIUS 4 NIL OUTLINEDSP) (DRAWCIRCLE XCENTER YCENTER 2 4 NIL OUTLINEDSP) (COND ((LISTGET STYLE 'RINGS) (DRAWCIRCLE XCENTER YCENTER HOURHANDSIZE 2 NIL OUTLINEDSP) (DRAWCIRCLE XCENTER YCENTER MINUTEHANDSIZE 2 NIL OUTLINEDSP))) (SELECTQ (LISTGET STYLE 'NUMBERS) (T (SETQ FONTHALFHEIGHT (IDIFFERENCE (IQUOTIENT (FONTHEIGHT FONT) 2) (FONTDESCENT FONT))) (for I from 1 to 12 do (SETQ NUM (MKSTRING I)) (SETQ MINUTEANGLE (FTIMES 1APR 30 I)) (MOVETO (FDIFFERENCE (FPLUS XCENTER (FTIMES INSIDERADIUS (SIN MINUTEANGLE))) (IQUOTIENT (STRINGWIDTH NUM OUTLINEDSP) 2)) (FDIFFERENCE (FPLUS YCENTER (FTIMES INSIDERADIUS (COS MINUTEANGLE))) FONTHALFHEIGHT) OUTLINEDSP) (PRIN1 NUM OUTLINEDSP))) (POINTS (for I from 1 to 12 bind (RAD _ (FPLUS INSIDERADIUS 5)) do (SETQ MINUTEANGLE (FTIMES 30 I)) (DRAWCIRCLE (FPLUS XCENTER (FTIMES RAD (SIN MINUTEANGLE)) ) (FPLUS YCENTER (FTIMES RAD (COS MINUTEANGLE))) 1 2 NIL OUTLINEDSP))) NIL))) (SETQ IDATE (IDATE)) (SETQ UDATE (\UNPACKDATE IDATE)) (SETQ DATE (\OUTDATE UDATE CROCK.DATEFORMAT STRPTR)) (SETQ MINUTES (CAR (NTH UDATE 5))) (SETQ SECONDS (CAR (NTH UDATE 6))) [COND ((NEQ MINUTES OLDMINUTES) (SETQ HOURS (CAR (NTH UDATE 4))) (BITBLT OUTLINE 0 0 DS 0 0 WIDTH HEIGHT 'INPUT 'REPLACE) (SETQ HOURANGLE (FPLUS (FTIMES 1APR 30.0 HOURS) (FTIMES 1APR 0.5 MINUTES))) (SETQ MINUTEANGLE (FTIMES 1APR 6.0 MINUTES)) (COND ((LISTGET STYLE 'HANDS) (DRAWLINE XCENTER YCENTER [PLUS XCENTER (FIXR (FTIMES HOURHANDSIZE (SIN HOURANGLE] [PLUS YCENTER (FIXR (FTIMES HOURHANDSIZE (COS HOURANGLE] 5 'PAINT DS) (DRAWLINE XCENTER YCENTER [PLUS XCENTER (FIXR (FTIMES MINUTEHANDSIZE (SIN MINUTEANGLE] [PLUS YCENTER (FIXR (FTIMES MINUTEHANDSIZE (COS MINUTEANGLE] 3 'PAINT DS))) (COND ((LISTGET STYLE 'TIMES) (MOVETO (FPLUS XCENTER -5 (FTIMES HOURHANDSIZE (SIN HOURANGLE))) (FPLUS YCENTER -5 (FTIMES HOURHANDSIZE (COS HOURANGLE))) DS) (PRIN1 (COND ((IGREATERP HOURS 12) (IDIFFERENCE HOURS 12)) (T HOURS)) DS) (MOVETO (FPLUS XCENTER -5 (FTIMES MINUTEHANDSIZE (SIN MINUTEANGLE))) (FPLUS YCENTER -5 (FTIMES MINUTEHANDSIZE (COS MINUTEANGLE))) DS) (PRIN1 MINUTES DS))) (COND ((NEQ HOURS OLDHOURS) (COND ((NEQ 1APR (SETQ 1APR (if (AND (EQ (CADR UDATE) 3) (EQ (CADDR UDATE) 1) (ILESSP (CADDDR UDATE) 12)) then -1 else 1))) (SETQ CHANGE.STYLE T] (SETQ OLDHOURS HOURS) (SETQ OLDMINUTES MINUTES) (MOVETOUPPERLEFT CROCKWINDOW CLIPPINGREGION) (PRIN3 DATE CROCKWINDOW) (while [AND CROCK.ALARMS (GEQ IDATE (CAR (CAR CROCK.ALARMS] do (CROCK.RING.ALARM)) (SELECTQ (BLOCK (ITIMES 1000 (IDIFFERENCE 60 SECONDS))) (CHANGE.STYLE (SETQ CHANGE.STYLE T)) (SHAPE (GO RESTART)) (CLOSING (SETQ DONE T)) NIL) (COND ((AND (EQ MINUTES 0) (EQ (IREMAINDER HOURS 6) 0) (EQ (MACHINETYPE) 'DANDELION)) (* ;; "\NET.SETTIME every six hours if possible because Xerox computers can't keep time right. SETTIME would make non-network users enter time manually--we don't want this. *") (\NET.SETTIME] (PROCESS.RETURN]) (CROCK.RESHAPEFN [LAMBDA (WINDOW REGION) (* bvm%: "27-AUG-82 16:26") (WAKE.PROCESS 'CROCK.PROCESS 'SHAPE]) (CROCK.ALARM [LAMBDA (DATESTRING MESSAGE FORM) (* kbr%: "29-Mar-84 14:57") (* Add (IDATE . MESSAGE) to  CROCK.ALARMS *) (PROG (IDATE) (SETQ IDATE (IDATE DATESTRING)) (COND ((ILESSP IDATE (IDATE)) (printout T "CROCK: Can't set alarm to " DATESTRING " in the past!" T) (RINGBELLS)) (T (SETQ CROCK.ALARMS (NCONC (for BUCKET in CROCK.ALARMS when (ILEQ (CAR BUCKET) IDATE) collect BUCKET) (LIST (LIST IDATE (GDATE IDATE) MESSAGE FORM)) (for BUCKET in CROCK.ALARMS when (IGREATERP (CAR BUCKET) IDATE) collect BUCKET))) (printout T "CROCK: Alarm set at " (GDATE IDATE) "." T]) (CROCK.RING.ALARM [LAMBDA NIL (* kbr%: "29-Mar-84 14:59") (PROG (BUCKET IDATE MESSAGE FORM) (SETQ BUCKET (pop CROCK.ALARMS)) (SETQ IDATE (CAR BUCKET)) (SETQ MESSAGE (CADDR BUCKET)) (SETQ FORM (CADDDR BUCKET)) (SELECTQ (MACHINETYPE) (DANDELION (COND (CROCK.TUNE (PLAYTUNE CROCK.TUNE)) (T (RINGBELLS 3)))) (RINGBELLS 3)) (printout PROMPTWINDOW "CROCK: It is now " (GDATE IDATE) "." T) (COND (MESSAGE (printout PROMPTWINDOW MESSAGE T))) (EVAL FORM) (INVERTW CROCKWINDOW]) (CROCK.INIT [LAMBDA (WINDOW) (* kbr%: "21-JUN-83 09:44") (WINDOWPROP WINDOW 'BUTTONEVENTFN 'CROCK.BUTTONEVENTFN) (WINDOWPROP WINDOW 'RESHAPEFN 'CROCK.RESHAPEFN) (WINDOWPROP WINDOW 'CLOSEFN 'CROCK.CLOSEFN) (COND ((NULL (WINDOWPROP WINDOW 'STYLE)) (WINDOWPROP WINDOW 'STYLE (COPY CROCK.DEFAULT.STYLE]) ) (RPAQ? CROCK.DEFAULT.STYLE '(HANDS T TIMES NIL RINGS NIL NUMBERS T)) (RPAQ? CROCK.STYLE.MENU ) (RPAQ? CROCK.ALARMS ) (RPAQ? CROCK.DATEFORMAT '(DATEFORMAT NO.SECONDS)) (RPAQ? CROCK.TUNE '((1000 . 1000) (800 . 1000) (600 . 1000) (500 . 1000) (400 . 1000) (NIL . 500) (440 . 1000) (484 . 1000) (540 . 1000) (600 . 1000) (2000 . 1000) (1600 . 1000) (1200 . 1000) (1000 . 1000) (800 . 1000) (NIL . 500) (880 . 1000) (968 . 1000) (1080 . 1000) (1188 . 1000))) (RPAQ? CROCKWINDOW ) (PUTPROPS CROCK COPYRIGHT ("Xerox Corporation" 1984 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1940 16814 (CROCK 1950 . 2520) (CROCK.BUTTONEVENTFN 2522 . 2811) (CROCK.CHANGE.STYLE 2813 . 5626) (CROCK.CLOSEFN 5628 . 5790) (CROCK.PROCESS 5792 . 14290) (CROCK.RESHAPEFN 14292 . 14451) (CROCK.ALARM 14453 . 15681) (CROCK.RING.ALARM 15683 . 16424) (CROCK.INIT 16426 . 16812))))) STOP \ No newline at end of file diff --git a/lispusers/CROCK.TEDIT b/lispusers/CROCK.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..479ba1f855db0f601a02d28c41a79e12f94479c5 GIT binary patch literal 6651 zcmeHLU2ogw6_%Z}U6$!$U59;QIA}LS8f4XR?8FIzV6;TpoF!5vsW@)Y3rcz=6QM|r zA6C@6-S$sx!0vas0lOd2AF}5O*27JOo5k*7`k#0I$1bM{V2>;UwEul&?JgyRb`iK{n)U~ z`kgNd-Y=^zv-ok6LiJ@df)QvK#R9q$^75D$emIU64W;?aFx%EygQC$Wn=jcvrIr?c zdO=CL3`8D#TkmLtuG@6n^RAAVjY+}kClrWDN~Y0mz)CEpY-Y~cF+v`TxxgQUKa8S4pel1KK2o%}@JAP`ij={QqA-o4 z;0c{*X4|0}SHT5JFrjE7Ib{^}2DwI0=W`%IV}I(S>gO@yK`;yH#99&#K)^Q4V+ep} z3T3Jh6nNYqVBkVG2fZWR2HX8T3bWZz!~iCi;j_LdOA~*L?~*UFzql(9dycKDN#q#5 zr--x_MYAt=wOJDx7lb99q#MNT9M4MBZ48>rK^4&9>(19n0=% zuFN|3I{FuVp^&AEXd!{*YFW8gK!+BUp03I=_j{$2l8Yz{#>mN~ShXnC)<&sGPt)k7 z2$N^hU6g{rJj;pC2ySzg13}Z0zBc%Qvxx_Ze$(nSdzR^*H0WH{>}J<8j~nE4HRnWk z@X*&VXrxqE*V@QxvmmjS=I53PRTwc)>*y^DWu%gWmgBTZQKHy$8*MM>_|H zMN$pB2mV2b{!OzGAO*_?B@xOjLJ7n)kCMb6`hlOKgmID~IJ8e&J7>qwbp2F;6Go_c zfpqz^c_4Vm!XkRez(WiN<~wa#3hrvOAN*qF0!9U~q<880fj7iBN+XpLX3nc@EGAwS zq;%;8n5K{^X4X1QfVrHMH5Oc{9Y}~*9{bg(Qt_!dy8GE{n%3uv?_ODLo|LPJD?wkc zR~NEiX5Pzu(XjHe-RU&7KfipGR?_c#Y$u<(|U4@W_U z39tqfBwF&YyV@#6Luy^k?h(dW&fyMBeX})jXR9+zXD{&L8D08be(yDvI5(K%@(kO! z0oABmA94hIO?dH?ywOO^)1rn}Wd|Du3s9{nU7l<*7YZsl3pi5clNtqFHtJYTG;f3w zo%1MAv;~vTc;P2>7Dpft1LJ#9>bZz#Wv3kysNtPgXu(sDZb< z(m4pB-__0;$kIeyfd}W3X4OXT_j~QRpT+e0^FIhv$DR)(oU`Oz0 zGco3p&G)5Z>dQ?4_G;DyH)R&{CX6EB{VV0k<)P5HAb8la2{<|u38Fx$kFx;x0;*z) zs=$|@HtW@%(QbG3cXE5?kH;{v;rJX2Hm(j{&v1nRe0Fa(Lt1eC!wacpUtM= z+^TgA$E8}Wk5R$9J>jX3UC{Vkr>;nGX;a7Q8kS*pEUIa?c4V~ZvcJQ z->clI?D5mqH(*`j+4^Qnp5FB50UzWN+i#HAa#tG4Mz(K3{W}?XlUp|$`FA2| zv~TcX?*!v$%4%G>8@V zYkzMepFga8(8AAl$7oePR1Djdw-SH6;{2%czPi0C-&Hgu>opoQu4&)9Sr#X2J_b&G z*0kJ4PTz+60F2)_7qSXrN1{CGJ+TM)|A)uA+cCFF9+a&~ zRfQmH`tJ&|W$C*@Wm~r2n_O6K`iMSAY8#eB%^h literal 0 HcmV?d00001 diff --git a/lispusers/CUT-HKB b/lispusers/CUT-HKB new file mode 100644 index 00000000..fe433e0f --- /dev/null +++ b/lispusers/CUT-HKB @@ -0,0 +1 @@ +(FILECREATED "10-Feb-87 17:00:26" {DSK}H.ALFA>CUT.HKB;1 545 ) (PRETTYCOMPRINT CUTCOMS) (RPAQQ CUTCOMS (*functions1* *predicates1* *variables1* *temp-foo* *temp-pred*)) (RPAQQ *functions1* NIL) (RPAQQ *predicates1* (A-CUT C B A)) (RPAQQ *variables1* (:b :a :y :x)) (RPAQQ *temp-foo* NIL) (RPAQQ *temp-pred* [(((A-CUT :x :y) < (B :x) / (C :y))) (((C 3)) ((C 4))) (((B 1)) ((B 2))) (((A :x :y) < (B :x) (C :y]) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/DANDELIONUFO b/lispusers/DANDELIONUFO new file mode 100644 index 00000000..03f799d6 --- /dev/null +++ b/lispusers/DANDELIONUFO @@ -0,0 +1 @@ +(FILECREATED "16-Feb-86 00:14:45" {ERIS}LIBRARY>DANDELIONUFO.;24 11913 changes to: (VARS DANDELIONUFOCOMS \DANDELIONUFO.LOCKEDFNS) (FNS \DANDELIONUFO.WRITE \DANDELIONUFO.SENDPAGE) previous date: "15-Feb-86 12:35:33" {ERIS}LIBRARY>DANDELIONUFO.;23) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DANDELIONUFOCOMS) (RPAQQ DANDELIONUFOCOMS ((* DANDELIONUFO -- Driver for the UFO systems Dandelion BusMaster color board -- By Kelly Roach and Herb Jellinek. *) (CONSTANTS (NYBBLESPERWORD 4) (BITSPERNYBBLE 4) (\PCColorMapBase 917520) (\RochesterDisplayBase 917504) (\RochesterDisplayOffsetRegister 917552) (\RochesterDisplayOffsetRegisterLo 917553) (\RochesterBUSADDRHI 8) (\RochesterBUSADDRLO 0) (\RochesterPIXELSPERPAGE 1024) (\RochesterRASTERWIDTH 160)) (FNS \DANDELIONUFO.WRITE) (FNS \DANDELIONUFO.INIT \DANDELIONUFO.STARTBOARD \DANDELIONUFO.SENDCOLORMAPENTRY \DANDELIONUFO.SENDPAGE \DANDELIONUFO.PILOTBITBLT) (FILES BUSCOLOR) (VARS \DANDELIONUFO.LOCKEDFNS) (DECLARE: DONTEVAL@COMPILE DOCOPY (P (\DANDELIONUFO.INIT))))) (* DANDELIONUFO -- Driver for the UFO systems Dandelion BusMaster color board -- By Kelly Roach and Herb Jellinek. *) (DECLARE: EVAL@COMPILE (RPAQQ NYBBLESPERWORD 4) (RPAQQ BITSPERNYBBLE 4) (RPAQQ \PCColorMapBase 917520) (RPAQQ \RochesterDisplayBase 917504) (RPAQQ \RochesterDisplayOffsetRegister 917552) (RPAQQ \RochesterDisplayOffsetRegisterLo 917553) (RPAQQ \RochesterBUSADDRHI 8) (RPAQQ \RochesterBUSADDRLO 0) (RPAQQ \RochesterPIXELSPERPAGE 1024) (RPAQQ \RochesterRASTERWIDTH 160) (CONSTANTS (NYBBLESPERWORD 4) (BITSPERNYBBLE 4) (\PCColorMapBase 917520) (\RochesterDisplayBase 917504) (\RochesterDisplayOffsetRegister 917552) (\RochesterDisplayOffsetRegisterLo 917553) (\RochesterBUSADDRHI 8) (\RochesterBUSADDRLO 0) (\RochesterPIXELSPERPAGE 1024) (\RochesterRASTERWIDTH 160)) ) (DEFINEQ (\DANDELIONUFO.WRITE (LAMBDA (A D) (* kbr: " 4-Feb-86 17:24") (PCBUS.WRITE (IPLUS 917504 A) D))) ) (DEFINEQ (\DANDELIONUFO.INIT (LAMBDA NIL (* kbr: "15-Feb-86 12:32") (DECLARE (GLOBALVARS \DANDELIONUFOWSOPS \DANDELIONUFOINFO)) (for FN in \DANDELIONUFO.LOCKEDFNS do (\LOCKFN FN)) (SETQ \DANDELIONUFOWSOPS (create WSOPS STARTBOARD _(FUNCTION \DANDELIONUFO.STARTBOARD) STARTCOLOR _(FUNCTION \BUSCOLOR.STARTCOLOR) STOPCOLOR _(FUNCTION \BUSCOLOR.STOPCOLOR) EVENTFN _(FUNCTION \BUSCOLOR.EVENTFN) SENDCOLORMAPENTRY _(FUNCTION \DANDELIONUFO.SENDCOLORMAPENTRY) SENDPAGE _(FUNCTION \DANDELIONUFO.SENDPAGE) PILOTBITBLT _(FUNCTION \DANDELIONUFO.PILOTBITBLT))) (SETQ \DANDELIONUFOINFO (create DISPLAYINFO DITYPE _(QUOTE DANDELIONUFO) DIWIDTH _ 640 DIHEIGHT _ 400 DIBITSPERPIXEL _ 4 DIWSOPS _ \DANDELIONUFOWSOPS)) (\DEFINEDISPLAYINFO \DANDELIONUFOINFO))) (\DANDELIONUFO.STARTBOARD (LAMBDA NIL (* kbr: "25-Aug-85 16:23") (\DANDELIONUFO.WRITE 1 0) (\DANDELIONUFO.WRITE 1 0) (\DANDELIONUFO.WRITE 1 16) (\DANDELIONUFO.WRITE 0 24) (\DANDELIONUFO.WRITE 0 (SELECTQ COLORMONITORTYPE ((NIL CONRAC) 10) (HITACHI 11) (ERROR "ILLEGAL ARG" COLORMONITORTYPE))) (\DANDELIONUFO.WRITE 0 25) (\DANDELIONUFO.WRITE 0 43) (\DANDELIONUFO.WRITE 0 227) (\DANDELIONUFO.WRITE 0 39) (\DANDELIONUFO.WRITE 0 0) (\DANDELIONUFO.WRITE 0 0) (\DANDELIONUFO.WRITE 0 0) (\DANDELIONUFO.WRITE 0 0) (\DANDELIONUFO.WRITE 0 0) (\DANDELIONUFO.WRITE 1 63) (\DANDELIONUFO.WRITE 2 1) (\DANDELIONUFO.WRITE 3 0) (\DANDELIONUFO.WRITE 32 8) (\DANDELIONUFO.WRITE 48 0) (\DANDELIONUFO.WRITE 49 0))) (\DANDELIONUFO.SENDCOLORMAPENTRY (LAMBDA (FDEV COLOR# RGB) (* kbr: " 4-Feb-86 17:22") (* sends the Ith entry of the colormap COLORMAP to the extension bus.) (PROG (LUT) (SETQ LUT (LOGXOR 63 (LOGOR 128 (LLSH (LRSH (fetch (RGB BLUE) of RGB) 6) 4) (LLSH (LRSH (fetch (RGB GREEN) of RGB) 6) 2) (LRSH (fetch (RGB RED) of RGB) 6)))) (PCBUS.WRITE (IPLUS \PCColorMapBase COLOR#) LUT)))) (\DANDELIONUFO.SENDPAGE (LAMBDA (PAGE PAGE#) (* kbr: "16-Feb-86 00:14") (PROG (DISPINTERRUPT) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (\PUTBASE \EM.DISPINTERRUPT 0 0) (PCBUS.WRITEHL 14 48 (LLSH (LOGAND PAGE# 3) 6)) (PCBUS.WRITEHL 14 49 (LRSH PAGE# 2)) (* ((1024 pixels / page) / (16 pixels / offset)) = 64 offsets / page) (\BUSBLTOUTNYBBLES PAGE \RochesterBUSADDRHI \RochesterBUSADDRLO WORDSPERPAGE) (\PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT)))) (\DANDELIONUFO.PILOTBITBLT (LAMBDA (PILOTBBT N) (* kbr: " 4-Feb-86 17:23") (PROG (DEST DESTBIT WIDTH HEIGHT BUSADDRHI BUSADDRLO NWORDS ABSCURRPAGE CURRPAGEINBITMAP DISPINTERRUPT) (* The busmaster UPDATEDAEMON is a narrow communication bottleneck from the color screen bitmap to the color frame buffer. We work around this bottleneck by communicating small important changes to the color screen bitmap quickly and big less important changes slower. *) (* We try to make small changes that cross lots of pages appear visible in the frame buffer quickly by writing to both color screen bitmap and frame buffer. Big changes, which could be overwritten by other big changes before the UPDATEDAEMON notices them (and so save us time this way) are best left to the UPDATEDAEMON to handle. *) (* First, output to the color screen bitmap. *) (\PILOTBITBLT PILOTBBT N) (* Probably a case worth optimizing: cursors, carets, characters, vertical drawlines, and vertical scroll bars. \BUSBLTOUTNYBBLES works in words, not pixels (nybbles)%. We handle this problem by getting the values for our pixels from the DEST we just did our \PILOTBITBLT to, slopping over to a few unchanged pixels when necessary. *) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (\PUTBASE \EM.DISPINTERRUPT 0 0) (SETQ DEST (fetch (PILOTBBT PBTDEST) of PILOTBBT)) (SETQ DESTBIT (fetch (PILOTBBT PBTDESTBIT) of PILOTBBT)) (SETQ WIDTH (fetch (PILOTBBT PBTWIDTH) of PILOTBBT)) (SETQ HEIGHT (fetch (PILOTBBT PBTHEIGHT) of PILOTBBT)) (SETQ ABSCURRPAGE (fetch (POINTER PAGE#) of DEST)) (SETQ CURRPAGEINBITMAP (IDIFFERENCE ABSCURRPAGE ColorScreenBitMapBasePage)) (SETQ NWORDS (IPLUS (FOLDHI (IPLUS DESTBIT WIDTH -1) BITSPERWORD) (IMINUS (FOLDLO DESTBIT BITSPERWORD)) 1)) (SETQ BUSADDRLO (UNFOLD (IPLUS (fetch (POINTER WORDINPAGE) of DEST) (FOLDLO DESTBIT BITSPERWORD)) NYBBLESPERWORD)) (SETQ DEST (\ADDBASE DEST (FOLDLO DESTBIT BITSPERWORD))) (PCBUS.WRITEHL 14 48 (LLSH (LOGAND CURRPAGEINBITMAP 3) 6)) (PCBUS.WRITEHL 14 49 (LRSH CURRPAGEINBITMAP 2)) (for I from 1 to HEIGHT do (\BUSBLTOUTNYBBLES DEST \RochesterBUSADDRHI BUSADDRLO NWORDS) (COND ((EQ I HEIGHT) (RETURN))) (SETQ DEST (\ADDBASE DEST \RochesterRASTERWIDTH)) (SETQ BUSADDRLO (IPLUS BUSADDRLO (UNFOLD \RochesterRASTERWIDTH NYBBLESPERWORD))) (COND ((IGEQ BUSADDRLO 32768) (* Can't let BUSADDRLO exceed MAX.SMALLP. *) (SETQ BUSADDRLO (IDIFFERENCE BUSADDRLO 32768)) (SETQ CURRPAGEINBITMAP (IPLUS CURRPAGEINBITMAP 32)) (PCBUS.WRITEHL 14 48 (LLSH (LOGAND CURRPAGEINBITMAP 3) 6)) (PCBUS.WRITEHL 14 49 (LRSH CURRPAGEINBITMAP 2))))) (\PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT)))) ) (FILESLOAD BUSCOLOR) (RPAQQ \DANDELIONUFO.LOCKEDFNS (\DANDELIONUFO.PILOTBITBLT \DANDELIONUFO.SENDPAGE)) (DECLARE: DONTEVAL@COMPILE DOCOPY (\DANDELIONUFO.INIT) ) (PUTPROPS DANDELIONUFO COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (2638 2904 (\DANDELIONUFO.WRITE 2648 . 2902)) (2905 11658 (\DANDELIONUFO.INIT 2915 . 4263) (\DANDELIONUFO.STARTBOARD 4265 . 5304) (\DANDELIONUFO.SENDCOLORMAPENTRY 5306 . 6388) ( \DANDELIONUFO.SENDPAGE 6390 . 7342) (\DANDELIONUFO.PILOTBITBLT 7344 . 11656))))) STOP \ No newline at end of file diff --git a/lispusers/DANDELIONUFO4096 b/lispusers/DANDELIONUFO4096 new file mode 100644 index 00000000..195e1100 --- /dev/null +++ b/lispusers/DANDELIONUFO4096 @@ -0,0 +1 @@ +(FILECREATED " 5-Jun-86 23:23:29" {ERIS}LIBRARY>DANDELIONUFO4096.;19 14610 changes to: (FNS \DANDELIONUFO4096.SENDCOLORMAPENTRY \DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL ) (VARS DANDELIONUFO4096COMS) previous date: " 5-Jun-86 21:19:03" {ERIS}LIBRARY>DANDELIONUFO4096.;18) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DANDELIONUFO4096COMS) (RPAQQ DANDELIONUFO4096COMS ((* * DANDELIONUFO4096 -- Driver for the old version of UFO systems Dandelion BusMaster color board -- By Kelly Roach and Herb Jellinek. *) (CONSTANTS (NYBBLESPERWORD 4) (BITSPERNYBBLE 4) (\PCColorMapRedBase 917568) (\PCColorMapGreenBase 917584) (\PCColorMapBlueBase 917600) (\RochesterDisplayBase 917504) (\RochesterDisplayOffsetRegister.4096 917696) (\RochesterBUSADDRHI 8) (\RochesterBUSADDRLO 0) (\RochesterPIXELSPERPAGE 1024) (\RochesterRASTERWIDTH 160) (DDLPIXELSPERPAGE 1024) (DDLPIXELSPERWORD 4)) (FNS \DANDELIONUFO4096.WRITE) (FNS \DANDELIONUFO4096.INIT \DANDELIONUFO4096.STARTBOARD \DANDELIONUFO4096.SENDCOLORMAPENTRY \DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL \DANDELIONUFO4096.SENDPAGE \DANDELIONUFO4096.PILOTBITBLT) (FILES BUSCOLOR) (VARS \DANDELIONUFO4096.LOCKEDFNS) (DECLARE: DONTEVAL@COMPILE DOCOPY (P (\DANDELIONUFO4096.INIT))))) (* * DANDELIONUFO4096 -- Driver for the old version of UFO systems Dandelion BusMaster color board -- By Kelly Roach and Herb Jellinek. *) (DECLARE: EVAL@COMPILE (RPAQQ NYBBLESPERWORD 4) (RPAQQ BITSPERNYBBLE 4) (RPAQQ \PCColorMapRedBase 917568) (RPAQQ \PCColorMapGreenBase 917584) (RPAQQ \PCColorMapBlueBase 917600) (RPAQQ \RochesterDisplayBase 917504) (RPAQQ \RochesterDisplayOffsetRegister.4096 917696) (RPAQQ \RochesterBUSADDRHI 8) (RPAQQ \RochesterBUSADDRLO 0) (RPAQQ \RochesterPIXELSPERPAGE 1024) (RPAQQ \RochesterRASTERWIDTH 160) (RPAQQ DDLPIXELSPERPAGE 1024) (RPAQQ DDLPIXELSPERWORD 4) (CONSTANTS (NYBBLESPERWORD 4) (BITSPERNYBBLE 4) (\PCColorMapRedBase 917568) (\PCColorMapGreenBase 917584) (\PCColorMapBlueBase 917600) (\RochesterDisplayBase 917504) (\RochesterDisplayOffsetRegister.4096 917696) (\RochesterBUSADDRHI 8) (\RochesterBUSADDRLO 0) (\RochesterPIXELSPERPAGE 1024) (\RochesterRASTERWIDTH 160) (DDLPIXELSPERPAGE 1024) (DDLPIXELSPERWORD 4)) ) (DEFINEQ (\DANDELIONUFO4096.WRITE [LAMBDA (A D) (* N.H.Briggs "29-May-86 15:19") (PCBUS.WRITE (IPLUS \RochesterDisplayBase A) D]) ) (DEFINEQ (\DANDELIONUFO4096.INIT [LAMBDA NIL (* kbr: "15-Feb-86 12:42") (DECLARE (GLOBALVARS \DANDELIONUFO4096WSOPS \DANDELIONUFO4096INFO)) (for FN in \DANDELIONUFO4096.LOCKEDFNS do (\LOCKFN FN)) [SETQ \DANDELIONUFO4096WSOPS (create WSOPS (SETQ STARTBOARD (FUNCTION \DANDELIONUFO4096.STARTBOARD)) (SETQ STARTCOLOR (FUNCTION \BUSCOLOR.STARTCOLOR)) (SETQ STOPCOLOR (FUNCTION \BUSCOLOR.STOPCOLOR)) (SETQ EVENTFN (FUNCTION \BUSCOLOR.EVENTFN)) (SETQ SENDCOLORMAPENTRY (FUNCTION \DANDELIONUFO4096.SENDCOLORMAPENTRY)) (SETQ SENDPAGE (FUNCTION \DANDELIONUFO4096.SENDPAGE)) (SETQ PILOTBITBLT (FUNCTION \DANDELIONUFO4096.PILOTBITBLT] (SETQ \DANDELIONUFO4096INFO (create DISPLAYINFO DITYPE _ (QUOTE DANDELIONUFO4096) DIWIDTH _ 640 DIHEIGHT _ 400 DIBITSPERPIXEL _ 4 DIWSOPS _ \DANDELIONUFO4096WSOPS)) (\DEFINEDISPLAYINFO \DANDELIONUFO4096INFO]) (\DANDELIONUFO4096.STARTBOARD [LAMBDA (DISPLAY) (* N.H.Briggs "29-May-86 15:24") (* * the ufo4096 card uses a Signetics 2672 programmable video timing controller. See the Signetics databook for  details) (* * offsets (write): initialization = 0; command = 1; screen start lower = 2; screen start upper = 3; cursor address lower = 4; cursor address upper = 5; display pointer address lower = 6; display pointer address  upper = 7) (\DANDELIONUFO4096.WRITE 1 0) (* master reset) (\DANDELIONUFO4096.WRITE 1 0) (* master reset) (\DANDELIONUFO4096.WRITE 1 16) (* load IR ptr with 0 (ten values follow)) (\DANDELIONUFO4096.WRITE 0 24) (* non-interlaced 4 lines, vsync, buffer mode  independent) (\DANDELIONUFO4096.WRITE 0 (SELECTQ COLORMONITORTYPE ((NIL CONRAC) 10) (HITACHI 11) (ERROR "ILLEGAL ARG" COLORMONITORTYPE))) (* equalizing constant EC = .5  (Hact+Hfp+Hsync+Hbp) -2 (Hsync)) (\DANDELIONUFO4096.WRITE 0 25) (* Hsync width = 8, H back porch = 1) (\DANDELIONUFO4096.WRITE 0 43) (* V front porch = 8 scan lines, V back porch = 26  scan lines) (\DANDELIONUFO4096.WRITE 0 227) (* Char blink = 1/32 Vsync, 100 active rows per  screen) (\DANDELIONUFO4096.WRITE 0 39) (* 39 active "characters" per row) (\DANDELIONUFO4096.WRITE 0 0) (* cursor first line 0, last line 0  (don't care)) (\DANDELIONUFO4096.WRITE 0 0) (* lightpen line 0, no cursor blink, single height  chars, underline position scan line 0  (don't care)) (\DANDELIONUFO4096.WRITE 0 0) (* display buffer first address least significant bits = 0) (\DANDELIONUFO4096.WRITE 0 0) (* display buffer last address  (0) = 1023, display buffer first address most  significant bits = 0) (\DANDELIONUFO4096.WRITE 0 0) (* cursor blink rate = 1/32 Vsync, split screen  interrupt row 0 (don't care)) (\DANDELIONUFO4096.WRITE 1 63) (* enable light pen, display on next field, cursor on) (\DANDELIONUFO4096.WRITE 2 1) (* screen start address lower register = 1) (\DANDELIONUFO4096.WRITE 3 0) (* screen start address upper register = 0) (\DANDELIONUFO4096.WRITE 128 8) (* video control register = 8) (\DANDELIONUFO4096.WRITE 192 0) (* address offset register low = 0) (\DANDELIONUFO4096.WRITE 193 0) (* address offset register high = 0) ]) (\DANDELIONUFO4096.SENDCOLORMAPENTRY (LAMBDA (FDEV COLOR ACTUALRGB) (* kbr: " 5-Jun-86 23:16") (* sends the Ith entry of the colormap  COLORMAP to the extension bus.) (PROG (HLS RGB) (SETQ HLS (RGBTOHLS ACTUALRGB)) (replace (HLS LIGHTNESS) of HLS with (FMAX (fetch (HLS LIGHTNESS) of HLS) .6)) (SETQ RGB (HLSTORGB HLS)) (PCBUS.WRITE (IPLUS \PCColorMapRedBase COLOR) (\DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL (fetch (RGB RED) of RGB))) (PCBUS.WRITE (IPLUS \PCColorMapGreenBase COLOR) (\DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL (fetch (RGB GREEN) of RGB))) (PCBUS.WRITE (IPLUS \PCColorMapBlueBase COLOR) (\DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL (fetch (RGB BLUE) of RGB)))))) (\DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL (LAMBDA (COLOR) (* kbr: " 5-Jun-86 23:14") (PROG (ANSWER) (RETURN (FOLDLO COLOR 16)) (SETQ ANSWER (IMIN HIGHFUDGE (IMAX (FOLDLO COLOR 16) LOWFUDGE))) (RETURN ANSWER)))) (\DANDELIONUFO4096.SENDPAGE [LAMBDA (PAGE PAGE#) (* kbr: "16-Feb-86 00:17") (PROG (DISPINTERRUPT) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0)) (\PUTBASE \EM.DISPINTERRUPT 0 0) (PCBUS.WRITE \RochesterDisplayOffsetRegister.4096 (LLSH (LOGAND PAGE# 3) 6)) (PCBUS.WRITE (ADD1 \RochesterDisplayOffsetRegister.4096) (LRSH PAGE# 2)) (* ((1024 pixels / page) /  (16 pixels / offset)) = 64 offsets / page) (\BUSBLTOUTNYBBLES PAGE \RochesterBUSADDRHI \RochesterBUSADDRLO WORDSPERPAGE) (\PUTBASE \EM.DISPINTERRUPT 0 DISPINTERRUPT]) (\DANDELIONUFO4096.PILOTBITBLT (LAMBDA (PILOTBBT N) (* kbr: " 5-Jun-86 21:17") (PROG (DEST DESTBIT WIDTH HEIGHT BUSADDRHI BUSADDRLO NWORDS ABSCURRPAGE CURRPAGEINBITMAP DISPINTERRUPT) (* The busmaster UPDATEDAEMON is a narrow communication bottleneck from the  color screen bitmap to the color frame buffer.  We work around this bottleneck by communicating small important changes to the  color screen bitmap quickly and big less important changes slower.  *) (* We try to make small changes that cross lots of pages appear visible in the  frame buffer quickly by writing to both color screen bitmap and frame buffer.  Big changes, which could be overwritten by other big changes before the  UPDATEDAEMON notices them (and so save us time this way) are best left to the  UPDATEDAEMON to handle. *) (* First, output to the color screen  bitmap. *) (\PILOTBITBLT PILOTBBT N) (* Probably a case worth optimizing: cursors, carets, characters, vertical  drawlines, and vertical scroll bars. \BUSBLTOUTNYBBLES works in words, not  pixels (nybbles)%. We handle this problem by getting the values for our pixels  from the DEST we just did our \PILOTBITBLT to, slopping over to a few unchanged  pixels when necessary. *) (SETQ DISPINTERRUPT (\GETBASE \EM.DISPINTERRUPT 0))(* \PUTBASE \EM.DISPINTERRUPT 0 0) (SETQ DEST (fetch (PILOTBBT PBTDEST) of PILOTBBT)) (SETQ DESTBIT (fetch (PILOTBBT PBTDESTBIT) of PILOTBBT)) (SETQ WIDTH (fetch (PILOTBBT PBTWIDTH) of PILOTBBT)) (SETQ HEIGHT (fetch (PILOTBBT PBTHEIGHT) of PILOTBBT)) (SETQ ABSCURRPAGE (fetch (POINTER PAGE#) of DEST)) (SETQ CURRPAGEINBITMAP (IDIFFERENCE ABSCURRPAGE ColorScreenBitMapBasePage)) (SETQ NWORDS (IPLUS (FOLDHI (IPLUS DESTBIT WIDTH -1) BITSPERWORD) (IMINUS (FOLDLO DESTBIT BITSPERWORD)) 1)) (SETQ BUSADDRLO (UNFOLD (IPLUS (fetch (POINTER WORDINPAGE) of DEST) (FOLDLO DESTBIT BITSPERWORD)) NYBBLESPERWORD)) (SETQ DEST (\ADDBASE DEST (FOLDLO DESTBIT BITSPERWORD))) (PCBUS.WRITEHL 14 192 (LLSH (LOGAND CURRPAGEINBITMAP 3) 6)) (PCBUS.WRITEHL 14 193 (LRSH CURRPAGEINBITMAP 2)) (for I from 1 to HEIGHT do (\BUSBLTOUTNYBBLES DEST \RochesterBUSADDRHI BUSADDRLO NWORDS) (COND ((EQ I HEIGHT) (RETURN))) (SETQ DEST (\ADDBASE DEST \RochesterRASTERWIDTH)) (SETQ BUSADDRLO (IPLUS BUSADDRLO (UNFOLD \RochesterRASTERWIDTH NYBBLESPERWORD))) (COND ((IGEQ BUSADDRLO 32768) (* Can't let BUSADDRLO exceed  MAX.SMALLP. *) (SETQ BUSADDRLO (IDIFFERENCE BUSADDRLO 32768)) (SETQ CURRPAGEINBITMAP (IPLUS CURRPAGEINBITMAP 32)) (PCBUS.WRITEHL 14 192 (LLSH (LOGAND CURRPAGEINBITMAP 3) 6)) (PCBUS.WRITEHL 14 193 (LRSH CURRPAGEINBITMAP 2))))) (* \PUTBASE \EM.DISPINTERRUPT 0  DISPINTERRUPT) ))) ) (FILESLOAD BUSCOLOR) (RPAQQ \DANDELIONUFO4096.LOCKEDFNS (\DANDELIONUFO4096.PILOTBITBLT \DANDELIONUFO4096.SENDPAGE)) (DECLARE: DONTEVAL@COMPILE DOCOPY (\DANDELIONUFO4096.INIT) ) (PUTPROPS DANDELIONUFO4096 COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (3245 3443 (\DANDELIONUFO4096.WRITE 3255 . 3441)) (3444 14335 (\DANDELIONUFO4096.INIT 3454 . 4603) (\DANDELIONUFO4096.STARTBOARD 4605 . 7879) (\DANDELIONUFO4096.SENDCOLORMAPENTRY 7881 . 8953) (\DANDELIONUFO4096.SENDCOLORMAPENTRY.LEVEL 8955 . 9302) (\DANDELIONUFO4096.SENDPAGE 9304 . 10005 ) (\DANDELIONUFO4096.PILOTBITBLT 10007 . 14333))))) STOP \ No newline at end of file diff --git a/lispusers/DATATYPESPLUS b/lispusers/DATATYPESPLUS new file mode 100644 index 00000000..800c3d6e --- /dev/null +++ b/lispusers/DATATYPESPLUS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) (FILECREATED "18-Feb-88 11:36:24" {ERINYES}LYRIC>DATATYPESPLUS.\;1 32709 |previous| |date:| "29-Jan-88 18:11:10" {QV}LISP>MAPLE>DATATYPESPLUS.\;4) ; Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. (PRETTYCOMPRINT DATATYPESPLUSCOMS) (RPAQQ DATATYPESPLUSCOMS ( (* |;;| "System functions that (unfortunately) had to be redefined to add the record field types REVERSEDWORD and REVERSEDFIXP. These are a 16 bit (unsigned) word with LSB, MSB and a 32 bit integer with LSW, MSW in the same reversed word format.") (* |;;| "") (DECLARE\: DONTCOPY (FILES (LOADCOMP) LLDATATYPE)) (FNS FETCHFIELD REPLACEFIELD COMPILEDFETCHFIELD COMPILEDREPLACEFIELD TRANSLATE.DATATYPE \\PUTREVERSEDFIXP) (* |;;| "") (VARS DATATYPEFIELDTYPES))) (* |;;| "System functions that (unfortunately) had to be redefined to add the record field types REVERSEDWORD and REVERSEDFIXP. These are a 16 bit (unsigned) word with LSB, MSB and a 32 bit integer with LSW, MSW in the same reversed word format." ) (* |;;| "") (DECLARE\: DONTCOPY (FILESLOAD (LOADCOMP) LLDATATYPE) ) (DEFINEQ (FETCHFIELD (LAMBDA (DESCRIPTOR DATUM) (* \; "Edited 17-Dec-87 18:45 by Briggs") (* |;;| "retrieves a data field from a user data structure.") (PROG ((TN (|fetch| |fdTypeName| |of| DESCRIPTOR)) (OFFSET (|fetch| |fdOffset| |of| DESCRIPTOR))) (AND TN (SETQ DATUM (\\DTEST DATUM TN))) (RETURN (SELECTQ (|fetch| |fdType| |of| DESCRIPTOR) ((POINTER XPOINTER FULLPOINTER FULLXPOINTER) (\\GETBASEPTR DATUM OFFSET)) (FLOATP (MAKEFLOATNUMBER (\\GETBASE DATUM OFFSET) (\\GETBASE (\\ADDBASE DATUM 1) OFFSET))) (FIXP (\\MAKENUMBER (\\GETBASE DATUM OFFSET) (\\GETBASE (\\ADDBASE DATUM 1) OFFSET))) (SWAPPEDFIXP (\\MAKENUMBER (\\GETBASE (\\ADDBASE DATUM 1) OFFSET) (\\GETBASE DATUM OFFSET))) (REVERSEDFIXP (PROG ((HI (\\GETBASE (\\ADDBASE DATUM 1) OFFSET)) (LO (\\GETBASE DATUM OFFSET))) (RETURN (\\MAKENUMBER (LOGOR (LRSH HI 8) (LLSH (LOGAND HI 255) 8)) (LOGOR (LRSH LO 8) (LLSH (LOGAND LO 255) 8)))))) (PROG ((FT (|fetch| |fdType| |of| DESCRIPTOR)) (OFF OFFSET)) (RETURN (SELECTQ (CAR FT) (BITS (LOGAND (LRSH (\\GETBASE DATUM OFF) (|BitFieldShift| (CDR FT))) (|BitFieldMask| (CDR FT)))) (SIGNEDBITS ((LAMBDA (N WIDTH) (COND ((IGREATERP N (SUB1 (LLSH 1 (SUB1 WIDTH)))) (SUB1 (IDIFFERENCE N (SUB1 (LLSH 1 WIDTH))))) (T N))) (LOGAND (LRSH (\\GETBASE DATUM OFF) (|BitFieldShift| (CDR FT))) (|BitFieldMask| (CDR FT))) (|BitFieldWidth| (CDR FT)))) (LONGBITS (\\MAKENUMBER (LOGAND (LRSH (\\GETBASE DATUM OFF) (|BitFieldShift| (CDR FT))) (|BitFieldMask| (CDR FT))) (\\GETBASE (\\ADDBASE DATUM 1) OFF))) (FLAGBITS (NEQ (LOGAND (\\GETBASE DATUM OFF) (|BitFieldShiftedMask| (CDR FT))) 0)) (REVERSEDWORD (LOGOR (LRSH (\\GETBASE DATUM OFF) 8) (LLSH (LOGAND (\\GETBASE DATUM OFF) 255) 8))) (LISPERROR "ILLEGAL ARG" DESCRIPTOR))))))))) (REPLACEFIELD (LAMBDA (DESCRIPTOR DATUM NEWVALUE) (* \; "Edited 11-Dec-87 12:28 by N.H.Briggs") (* \;  "replace a field in a user data structure. return coerced value.") (PROG ((OFFSET (|fetch| |fdOffset| |of| DESCRIPTOR)) (FT (|fetch| |fdType| |of| DESCRIPTOR)) (TN (|fetch| |fdTypeName| |of| DESCRIPTOR)) SHIFT MASK) (AND TN (SETQ DATUM (\\DTEST DATUM TN))) (RETURN (SELECTQ FT ((POINTER FULLPOINTER) (\\RPLPTR DATUM OFFSET NEWVALUE)) (XPOINTER (* \; "no ref count, hi bits used") (PUTBASEPTRX DATUM OFFSET NEWVALUE)) (FULLXPOINTER (\\PUTBASEPTR DATUM OFFSET NEWVALUE)) (FLOATP (\\PUTBASEFLOATP DATUM OFFSET NEWVALUE)) (FIXP (\\PUTFIXP (\\ADDBASE DATUM OFFSET) NEWVALUE) NEWVALUE) (SWAPPEDFIXP (\\PUTSWAPPEDFIXP (\\ADDBASE DATUM OFFSET) NEWVALUE) NEWVALUE) (REVERSEDFIXP (\\PUTREVERSEDFIXP (\\ADDBASE DATUM OFFSET) NEWVALUE) NEWVALUE) (SELECTQ (CAR FT) (BITS (LOGAND (LRSH (\\PUTBASE DATUM OFFSET (LOGOR (LOGAND (\\GETBASE DATUM OFFSET) (LOGXOR 65535 (LLSH (SETQ MASK (|BitFieldMask| (CDR FT))) (SETQ SHIFT (|BitFieldShift| (CDR FT)))))) (LLSH (LOGAND NEWVALUE MASK) SHIFT))) SHIFT) MASK)) (SIGNEDBITS ((LAMBDA (X) (COND ((IGREATERP X (SUB1 (LLSH 1 (SUB1 (|BitFieldWidth| (CDR FT)))))) (SUB1 (IDIFFERENCE X (SUB1 (LLSH 1 (|BitFieldWidth| (CDR FT))))))) (T X))) (LOGAND (LRSH (\\PUTBASE DATUM OFFSET (LOGOR (LOGAND (\\GETBASE DATUM OFFSET) (LOGXOR 65535 (LLSH (SETQ MASK (|BitFieldMask| (CDR FT))) (SETQ SHIFT (|BitFieldShift| (CDR FT)))))) (LLSH (LOGAND (LOGAND NEWVALUE (SUB1 (LLSH 1 (|BitFieldWidth| (CDR FT))))) MASK) SHIFT))) SHIFT) MASK))) (FLAGBITS (\\PUTBASE DATUM OFFSET (LOGOR (LOGAND (\\GETBASE DATUM OFFSET) (LOGXOR 65535 (LLSH (SETQ MASK (|BitFieldMask| (CDR FT))) (SETQ SHIFT (|BitFieldShift| (CDR FT)))))) (LLSH (LOGAND (COND (NEWVALUE 65535) (T 0)) MASK) SHIFT))) (AND NEWVALUE T)) (LONGBITS (PROG (LO HI) (.UNBOX. NEWVALUE HI LO) (UNINTERRUPTABLY (\\PUTBASE DATUM OFFSET (LOGOR (LOGAND (\\GETBASE DATUM OFFSET) (LOGXOR 65535 (LLSH (SETQ MASK (|BitFieldMask| (CDR FT))) (SETQ SHIFT (|BitFieldShift| (CDR FT)))))) (LLSH (LOGAND HI MASK) SHIFT))) (\\PUTBASE DATUM (ADD1 OFFSET) LO))) NEWVALUE) (REVERSEDWORD (\\PUTBASE DATUM OFFSET (LOGOR (LRSH NEWVALUE 8) (LLSH (LOGAND NEWVALUE 255) 8))) NEWVALUE) (LISPERROR "ILLEGAL ARG" DESCRIPTOR))))))) (COMPILEDFETCHFIELD (LAMBDA (X FASTFLG) (* \; "Edited 15-Dec-87 12:33 by N.H.Briggs") (COND ((EQ (CAR (LISTP (CAR X))) 'QUOTE) ((LAMBDA (DESCRIPTOR DATUM) (PROG (TYPENAME) (COND ((AND (NOT FASTFLG) (SETQ TYPENAME (|fetch| |fdTypeName| |of| DESCRIPTOR))) (SETQ DATUM (LIST (FUNCTION \\DTEST) DATUM (KWOTE TYPENAME))))) (RETURN (SELECTQ (|fetch| |fdType| |of| DESCRIPTOR) ((POINTER XPOINTER FULLPOINTER FULLXPOINTER) (LIST '\\GETBASEPTR DATUM (|fetch| |fdOffset| |of| DESCRIPTOR))) (SWAPPEDXPOINTER `((OPENLAMBDA (D) (\\VAG2 (\\GETBASE D ,(ADD1 (|fetch| |fdOffset| |of| DESCRIPTOR)) ) (\\GETBASE D ,(|fetch| |fdOffset| |of| DESCRIPTOR)))) ,DATUM)) (FLOATP `(\\GETBASEFLOATP ,DATUM ,(|fetch| |fdOffset| |of| DESCRIPTOR))) (FIXP `(\\GETBASEFIXP ,DATUM ,(|fetch| |fdOffset| |of| DESCRIPTOR))) (SWAPPEDFIXP `((OPENLAMBDA (D) (\\MAKENUMBER (\\GETBASE D ,(ADD1 (|fetch| |fdOffset| |of| DESCRIPTOR))) (\\GETBASE D ,(|fetch| |fdOffset| |of| DESCRIPTOR) ))) ,DATUM)) (REVERSEDFIXP `((OPENLAMBDA (D) (\\MAKENUMBER (LOGOR (LRSH (\\GETBASE D ,(ADD1 (|fetch| |fdOffset| |of| DESCRIPTOR))) 8) (LLSH (LOGAND (\\GETBASE D ,(ADD1 (|fetch| |fdOffset| |of| DESCRIPTOR))) 255) 8)) (LOGOR (LRSH (\\GETBASE D ,(|fetch| |fdOffset| |of| DESCRIPTOR )) 8) (LLSH (LOGAND (\\GETBASE D ,(|fetch| |fdOffset| |of| DESCRIPTOR )) 255) 8)))) ,DATUM)) (PROG ((FT (|fetch| |fdType| |of| DESCRIPTOR)) (OFF (|fetch| |fdOffset| |of| DESCRIPTOR))) (RETURN (SELECTQ (CAR FT) (BITS (LIST '\\GETBITS DATUM OFF (CDR FT))) (SIGNEDBITS `(SIGNED (\\GETBITS ,DATUM ,OFF ,(CDR FT)) ,(|BitFieldWidth| (CDR FT)))) (FLAGBITS (LIST '\\TESTBITS DATUM OFF (CDR FT))) (REVERSEDWORD `((OPENLAMBDA (D) (LOGOR (\\GETBITS D ,OFF 7) (LLSH (\\GETBITS D ,OFF 135) 8))) ,DATUM)) (LONGBITS `((OPENLAMBDA (D) (\\MAKENUMBER (\\GETBITS D ,OFF ,(CDR FT)) (\\GETBASE D ,(ADD1 OFF)))) ,DATUM)) (SHOULDNT)))))))) (CADAR X) (CADR X))) (T 'IGNOREMACRO)))) (COMPILEDREPLACEFIELD (LAMBDA (X FASTFLG RPLVALFLG) (* \; "Edited 29-Jan-88 17:50 by Briggs") (* |compile| |code| |for| |replacing| |field| |values.|  |Goes| |to| |great| |length| |to| |ensure| |that| |the| |coerced| |value| |is|  |returned|) (COND ((EQ (CAR (LISTP (CAR X))) 'QUOTE) ((LAMBDA (DESCRIPTOR DATUM NEWVALUE) (PROG ((TYPENAME (|fetch| |fdTypeName| |of| DESCRIPTOR)) (FT (|fetch| |fdType| |of| DESCRIPTOR)) (OFFSET (|fetch| |fdOffset| |of| DESCRIPTOR))) (COND ((AND (NOT FASTFLG) TYPENAME) (SETQ DATUM (LIST (FUNCTION \\DTEST) DATUM (KWOTE TYPENAME))))) (RETURN (SELECTQ FT ((POINTER FULLPOINTER) (LIST (FUNCTION \\RPLPTR) DATUM OFFSET NEWVALUE)) (XPOINTER (LIST (FUNCTION PUTBASEPTRX) DATUM OFFSET NEWVALUE)) (FULLXPOINTER (LIST '\\PUTBASEPTR DATUM OFFSET NEWVALUE)) (SWAPPEDXPOINTER `((OPENLAMBDA (D R) (\\PUTBASE D ,OFFSET (\\LOLOC R)) (\\PUTBASE D ,(ADD1 OFFSET) (\\HILOC R)) R) ,DATUM ,NEWVALUE)) (FIXP `(\\PUTBASEFIXP ,DATUM ,OFFSET ,NEWVALUE)) (SWAPPEDFIXP `(\\PUTSWAPPEDFIXP (\\ADDBASE ,DATUM ,OFFSET) ,NEWVALUE)) (REVERSEDFIXP `(\\PUTREVERSEDFIXP (\\ADDBASE ,DATUM ,OFFSET) ,NEWVALUE)) (FLOATP `(\\PUTBASEFLOATP ,DATUM ,OFFSET ,NEWVALUE)) (SELECTQ (CAR FT) (BITS (LIST '\\PUTBITS DATUM OFFSET (CDR FT) NEWVALUE)) (REVERSEDWORD `((OPENLAMBDA (D V) (\\PUTBITS D ,OFFSET 7 (LOGAND V 255)) (\\PUTBITS D ,OFFSET 135 (LRSH V 8)) V) ,DATUM ,NEWVALUE)) (LONGBITS (LIST (SUBPAIR '(OFFSET FT) (LIST OFFSET (CDR FT)) '(OPENLAMBDA (D V) (\\PUTBITS D OFFSET FT (\\HINUM V)) (\\PUTBASE D (ADD1 OFFSET) (\\LONUM V)) V)) DATUM NEWVALUE)) (SIGNEDBITS `(SIGNED (\\PUTBITS ,DATUM ,OFFSET ,(CDR FT) (UNSIGNED ,NEWVALUE ,(|BitFieldWidth| (CDR FT)))) ,(|BitFieldWidth| (CDR FT)))) (FLAGBITS `(NEQ (\\PUTBITS ,DATUM ,OFFSET ,(CDR FT) (COND (,NEWVALUE ,(|BitFieldMask| (CDR FT))) (T 0))) 0)) (RETURN 'IGNOREMACRO)))))) (CADAR X) (CADR X) (CADDR X))) (T 'IGNOREMACRO)))) (TRANSLATE.DATATYPE (LAMBDA (TYPENAME FIELDSPECS) (* DECLARATIONS\: (RECORD SPEC  (N LEN . FD))) (DECLARE (SPECVARS TYPENAME UNUSED BIT OFFSET FD)) (* \;  "Edited 11-Dec-87 12:00 by N.H.Briggs") (COND ((NULL TYPENAME)) ((OR (NOT (LITATOM TYPENAME)) (EQ TYPENAME '**DEALLOC**)) (ERROR "Invalid type name" TYPENAME))) (PROG ((N 0) UNUSED (OFFSET 0) (BIT 0) DLIST REUSE LEN FD) (SETQ DLIST (|for| S |in| FIELDSPECS |collect| (|create| SPEC N _ (|add| N 1) LEN _ (SELECTQ S ((POINTER XPOINTER) 24) ((FIXP FLOATP SWAPPEDFIXP REVERSEDFIXP FULLPOINTER SWAPPEDXPOINTER FULLXPOINTER) BITSPERCELL) (FLAG (SETQQ S FLAGBITS) 1) (BYTE (SETQQ S BITS) BITSPERBYTE) (WORD (SETQQ S BITS) BITSPERWORD) (REVERSEDWORD BITSPERWORD) (SIGNEDWORD (SETQQ S SIGNEDBITS) BITSPERWORD) (SELECTQ (CAR (LISTP S)) ((BITS FLAGBITS SIGNEDBITS) (PROG1 (CADR S) (SETQ S (CAR S)))) (ERROR "invalid field spec: " S))) FD _ (|create| |FldDsc| |fdTypeName| _ TYPENAME |fdType| _ S |fdOffset| _ NIL)))) (|for| S |in| DLIST |do| (|replace| |fdOffset| |of| (SETQ FD (|fetch| FD |of| S)) |with| (SELECTQ (|fetch| |fdType| |of| FD) ((POINTER XPOINTER) (COND ((AND TYPENAME (|find| X |in| UNUSED |suchthat| (AND (EQ 0 (LOGAND (CAR X) 1)) (IGEQ (CADDR X) 8) (EQ (IPLUS (CADR X) (CADDR X)) BITSPERWORD) (|find| Y |in| UNUSED |suchthat| (AND (EQ (CAR Y) (ADD1 (CAR X))) (EQ (CADDR Y) BITSPERWORD)))))) (* |unused| 24 |bit| |quantity|) (* |this| |case| |not| |implemented|  |yet|) )) (COND ((IGREATERP BIT 8) (* |Less| |than| 8 |bits| |left| |in|  |this| |word|) (\\REUSETO BITSPERWORD))) (COND ((ODDP OFFSET WORDSPERCELL) (* |not| |on| |double| |word|  |boundary|) (\\REUSETO BITSPERWORD))) (COND ((NEQ BIT 8) (\\REUSETO 8 (EQ BIT 0)))) (SETQ BIT 0) (PROG1 OFFSET (|add| OFFSET WORDSPERCELL))) ((FIXP SWAPPEDFIXP REVERSEDFIXP FLOATP SWAPPEDXPOINTER) (* 32 |bit| |quantities|) (COND ((NEQ BIT 0) (\\REUSETO BITSPERWORD))) (PROG1 OFFSET (|add| OFFSET WORDSPERCELL))) ((FULLPOINTER FULLXPOINTER) (* 32 |bit| |doubleword-aligned|  |quantities|) (COND ((NEQ BIT 0) (\\REUSETO BITSPERWORD))) (COND ((ODDP OFFSET WORDSPERCELL) (\\REUSETO BITSPERWORD))) (PROG1 OFFSET (|add| OFFSET WORDSPERCELL))) ((BITS FLAGBITS SIGNEDBITS REVERSEDWORD) (SETQ LEN (|fetch| LEN |of| S)) (COND ((AND TYPENAME (SETQ REUSE (|find| X |in| UNUSED |suchthat| (ILEQ LEN (CADDR X))))) (RPLACA (CDDR REUSE) (IDIFFERENCE (CAR (CDDR REUSE)) LEN)) (|replace| |fdType| |of| FD |with| (CONS (|fetch| |fdType| |of| FD) (|MakeBitField| (CADR REUSE) LEN))) (|add| (CADR REUSE) LEN) (CAR REUSE)) ((IGREATERP LEN BITSPERWORD) (* |more| |than| 1 |word| -  |Must| |right| |justify| |first| |word|) (SETQ LEN (IDIFFERENCE LEN BITSPERWORD)) (COND ((IGREATERP LEN (IDIFFERENCE BITSPERWORD BIT)) (\\REUSETO BITSPERWORD))) (COND ((NEQ (IDIFFERENCE BITSPERWORD BIT) LEN) (\\REUSETO (IDIFFERENCE BITSPERWORD LEN)))) (|replace| |fdType| |of| FD |with| (CONS 'LONGBITS (|MakeBitField| BIT LEN))) (SETQ BIT 0) (PROG1 OFFSET (|add| OFFSET 2))) (T (COND ((IGREATERP LEN (IDIFFERENCE BITSPERWORD BIT)) (\\REUSETO BITSPERWORD))) (|replace| |fdType| |of| FD |with| (CONS (|fetch| |fdType| |of| FD) (|MakeBitField| BIT LEN))) (|add| BIT LEN) (PROG1 OFFSET (COND ((EQ BIT BITSPERWORD) (SETQ BIT 0) (|add| OFFSET 1))))))) (SHOULDNT)))) (COND (TYPENAME (COND ((NEQ BIT 0) (\\REUSETO BITSPERWORD))) (|while| (ODDP OFFSET WORDSPERCELL) |do| (|add| OFFSET 1)) (COND ((IGREATERP OFFSET |\\MDSIncrement|) (ERROR TYPENAME "DATATYPE TOO BIG"))))) (RETURN (CONS OFFSET (MAPCAR DLIST (FUNCTION (LAMBDA (X) (|fetch| FD |of| X))))))))) (\\PUTREVERSEDFIXP (LAMBDA (PTR NUM) (* \; "Edited 11-Dec-87 12:19 by N.H.Briggs") (* |;;| "Store in completely reversed byte order") (PROG (HI LO) (.UNBOX. NUM HI LO) (|replace| (FIXP LONUM) |of| PTR |with| (LOGOR (LRSH HI 8) (LLSH (LOGAND HI 255) 8))) (|replace| (FIXP HINUM) |of| PTR |with| (LOGOR (LRSH LO 8) (LLSH (LOGAND LO 255) 8))) (RETURN NUM)))) ) (* |;;| "") (RPAQQ DATATYPEFIELDTYPES ((FLOATP 0.0) (FIXP 0) (SWAPPEDFIXP 0) (REVERSEDFIXP 0) (POINTER NIL) (XPOINTER NIL) (FULLPOINTER NIL) (FULLXPOINTER NIL) (SWAPPEDXPOINTER NIL) (FLAG NIL) (BYTE 0) (WORD 0) (REVERSEDWORD 0) (SIGNEDWORD 0))) (PUTPROPS DATATYPESPLUS COPYRIGHT ("Xerox Corporation" 1987 1988)) (DECLARE\: DONTCOPY (FILEMAP (NIL (1487 32010 (FETCHFIELD 1497 . 5916) (REPLACEFIELD 5918 . 12320) (COMPILEDFETCHFIELD 12322 . 17667) (COMPILEDREPLACEFIELD 17669 . 22035) (TRANSLATE.DATATYPE 22037 . 31268) ( \\PUTREVERSEDFIXP 31270 . 32008))))) STOP \ No newline at end of file diff --git a/lispusers/DATE b/lispusers/DATE new file mode 100644 index 00000000..0ef8c74e --- /dev/null +++ b/lispusers/DATE @@ -0,0 +1 @@ +(FILECREATED "18-Feb-87 15:42:27" {SUMEX-AIM}PS:DATE.;4 19668 previous date: "17-Feb-87 14:29:37" {SUMEX-AIM}DATE.;7) (* Copyright (c) 1987 by Leland Stanford Junior University. All rights reserved.) (PRETTYCOMPRINT DATECOMS) (RPAQQ DATECOMS ((* Developed under support from NIH grant RR-00785.) (* Written by Frank Gilmurray and Sami Shaio.) (FNS DATEOBJ DATEOBJP DATE.DISPLAYFN DATE.IMAGEBOXFN CURRENT.DISPLAY.FONT DATE.PUTFN DATE.GETFN DATE.BUTTONEVENTINFN DATES.TEMPLATE AMPM DATES.MENU.APPLY DATES.MENU.WHENSELECTEDFN DATES.SET FINDDAY FINDHOUR FINDMONTH FINDTIME FINDYEAR NUMP WHICHDATE) (RECORDS DATEOBJ STREAM FONTCLASS))) (* Developed under support from NIH grant RR-00785.) (* Written by Frank Gilmurray and Sami Shaio.) (DEFINEQ (DATEOBJ (LAMBDA (TEMPLATE) (* fsg "23-Jul-86 09:53") (* Create an instance of a date imageobj. A dateobj is also defined as a record with a  datestring field. *) (LET* ((TEMPLATE.TYPE (OR TEMPLATE '(M D Y F))) (DATEANDTIME (MKSTRING (DATE))) (DISPLAYDATE (MKSTRING (DATES.TEMPLATE DATEANDTIME TEMPLATE.TYPE))) (NEWOBJ (IMAGEOBJCREATE (create DATEOBJ DATESTRING _ DATEANDTIME DISPLAY.DATE _ DISPLAYDATE TEMPLATE.DATE _ TEMPLATE.TYPE) (IMAGEFNSCREATE (FUNCTION DATE.DISPLAYFN) (FUNCTION DATE.IMAGEBOXFN) (FUNCTION DATE.PUTFN) (FUNCTION DATE.GETFN) (FUNCTION NILL) (FUNCTION DATE.BUTTONEVENTINFN) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL))))) (* By convention, every image object will have a type  property associated with it that will facilitate  imageobj mapping in a TEdit file.) (IMAGEOBJPROP NEWOBJ 'TYPE 'DATEOBJ) NEWOBJ))) (DATEOBJP (LAMBDA (IMOBJ) (* ss: "24-Jun-85 16:33") (* Tests an imageobj to see if it is a date imageobject. By convention, testing functions for an imageobject will  be named (CONCAT "P")) (AND IMOBJ (EQ (IMAGEOBJPROP IMOBJ 'TYPE) 'DATEOBJ)))) (DATE.DISPLAYFN (LAMBDA (OBJ STREAM STREAMTYPE HOSTSTREAM) (* fsg "17-Feb-87 09:28") (* * Display function for date imageobjs.) (PRIN1 (fetch DISPLAY.DATE of (fetch OBJECTDATUM of OBJ)) STREAM))) (DATE.IMAGEBOXFN (LAMBDA (OBJ STREAM CURRENTX RIGHTMARGIN) (* fsg "15-Feb-87 14:05") (* * Return the ImageBox for the date string. The size is determined by the stream's current font.) (DSPFONT (CURRENT.DISPLAY.FONT STREAM) STREAM) (create IMAGEBOX XSIZE _(STRINGWIDTH (fetch DISPLAY.DATE of (fetch OBJECTDATUM of OBJ)) STREAM) YSIZE _(FONTPROP STREAM 'HEIGHT) YDESC _(FONTPROP STREAM 'DESCENT) XKERN _ 0))) (CURRENT.DISPLAY.FONT (LAMBDA (STREAM) (* fsg "17-Feb-87 10:19") (* * Return the current font. This function is here instead of TMAX because the DATE code is also used in the  LetterHead code.) (LET ((CURRENT.FONT (fetch CLFONT of (with TEXTSTREAM (TEXTSTREAM (CAR (fetch \WINDOW of TEXTOBJ))) CURRENTLOOKS)))) (COND ((TYPENAMEP CURRENT.FONT 'FONTDESCRIPTOR) CURRENT.FONT) ((TYPENAMEP CURRENT.FONT 'FONTCLASS) (fetch DISPLAYFD of CURRENT.FONT)) (T (SHOULDNT "Can't get current font")))))) (DATE.PUTFN (LAMBDA (DATEOBJ STREAM) (* fsg " 4-Feb-87 09:40") (PRIN2 (LIST 'Date (fetch (DATEOBJ TEMPLATE.DATE) of (fetch OBJECTDATUM of DATEOBJ))) STREAM))) (DATE.GETFN (LAMBDA (STREAM) (* fsg " 4-Feb-87 09:42") (OR (WINDOWPROP (PROCESSPROP (THIS.PROCESS) 'WINDOW) 'IMAGEOBJ.MENUW) (AND (FGETD 'TSP.FMMENU) (TSP.FMMENU (TEXTSTREAM (PROCESSPROP (THIS.PROCESS) 'WINDOW))))) (APPLY 'DATEOBJ (CDR (READ STREAM))))) (DATE.BUTTONEVENTINFN (LAMBDA (DATEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON) (* fsg "26-Jan-87 10:06") (AND (MOUSESTATE MIDDLE) (LET ((DATE.MENU (create MENU TITLE _ "Date Menu" ITEMS _ '((Month% Day,% Year (DATES.TEMPLATE DATE '(M D Y F)) "Insert current date as %"March 8, 1952%"") (Month/Day/Year (DATES.TEMPLATE DATE '(M D Y A)) "Insert current date as %"3/8/52%"") (Day% Month,% Year (DATES.TEMPLATE DATE '(D M Y F)) "Insert current date as %"8 March, 1952%"") (Day/Month/Year (DATES.TEMPLATE DATE '(D M Y A)) "Insert current date as %"8/3/52%"") (Time (DATES.TEMPLATE DATE '(T F)) "Insert current time as %"four thirty p.m.%"") (Numbered% Time (DATES.TEMPLATE DATE '(T A)) "Insert current time as %"4:30 p.m.%"") (Military% Time (DATES.TEMPLATE DATE '(T E)) "Insert current time as %"16:30%"")) WHENSELECTEDFN _(FUNCTION DATES.MENU.WHENSELECTEDFN)))) (PUTMENUPROP DATE.MENU 'IMAGEOBJ DATEOBJ) (MENU DATE.MENU) 'CHANGED)))) (DATES.TEMPLATE (LAMBDA (DATE TEMPLATE) (* fsg "24-Jul-86 14:43") (* * comment) (COND (TEMPLATE (LET ((VERSION (if (EQUAL (LAST TEMPLATE) '(A)) then 'ABBREV else (if (EQUAL (LAST TEMPLATE) '(F)) then 'FULL else 'EURO))) (FUNCLST '((D FINDDAY) (M FINDMONTH) (Y FINDYEAR)))) (COND ((EQ (CAR TEMPLATE) T) (FINDTIME DATE VERSION)) (T (LET ((CH (if (EQ VERSION 'ABBREV) then "/" else " "))) (CONCAT (APPLY (CADR (ASSOC (CAR TEMPLATE) FUNCLST)) (LIST DATE VERSION)) CH (APPLY (CADR (ASSOC (CADR TEMPLATE) FUNCLST)) (LIST DATE VERSION)) (if (EQUAL CH " ") then ", " else CH) (APPLY (CADR (ASSOC (CADDR TEMPLATE) FUNCLST)) (LIST DATE VERSION)))))))) (DATE)))) (AMPM (LAMBDA (HOUR) (if (OR (LESSP (MKATOM HOUR) 12) (EQUAL (MKATOM HOUR) 24)) then "a.m." else "p.m."))) (DATES.MENU.APPLY (LAMBDA (ITEM MENU) (* fsg "31-Jul-86 10:18") (* This function serves the purpose of calculating the stream and the editing window from information stored on the window containing the menu. It then applies the appropiate function for each ITEM in the menu*) (SETQ ITEM (COND ((ATOM ITEM) ITEM) (T (CAR ITEM)))) (LET* ((DATE.RECORD (fetch OBJECTDATUM of (GETMENUPROP MENU 'IMAGEOBJ))) (DATE (fetch DATESTRING of DATE.RECORD))) (COND ((fetch ITEMS of MENU) (LET ((FUNCALL (CADR (ASSOC ITEM (fetch ITEMS of MENU))))) (replace DISPLAY.DATE of DATE.RECORD with (EVAL FUNCALL)) (replace TEMPLATE.DATE of DATE.RECORD with (CADAR (LAST FUNCALL))))))))) (DATES.MENU.WHENSELECTEDFN (LAMBDA (ITEM MENU MB) (* fsg "28-Jul-86 14:57") (COND ((OR (EQ MB 'LEFT) (EQ MB 'MIDDLE)) (DATES.MENU.APPLY ITEM MENU))))) (DATES.SET (LAMBDA (PROPERTY VALUE) (WINDOWPROP (CREATEW) PROPERTY VALUE) VALUE)) (FINDDAY (LAMBDA (OLDDATE VERSION) (* shw: " 1-Jul-85 11:28") (MKATOM (if (NUMP (SUBSTRING OLDDATE 1 2)) then (SUBSTRING OLDDATE 1 2) else (SUBSTRING OLDDATE 2 2))))) (FINDHOUR (LAMBDA (HOUR) (* ss: " 8-Feb-86 17:49") (COND ((LESSP (MKATOM HOUR) 13) (COND ((LESSP (MKATOM HOUR) 10) (MKSTRING (CADR (UNPACK HOUR)))) (T HOUR))) (T (MKSTRING (SELECTQ (MKATOM HOUR) (13 1) (14 2) (15 3) (16 4) (17 5) (18 6) (19 7) (20 8) (21 9) (22 10) (23 11) (24 12) NIL)))))) (FINDMONTH (LAMBDA (OLDDATE VERSION) (* shw: " 1-Jul-85 11:38") (PROG ((DATES '((Jan 1 January) (Feb 2 February) (Mar 3 March) (Apr 4 April) (May 5 May) (Jun 6 June) (Jul 7 July) (Aug 8 August) (Sep 9 September) (Oct 10 October) (Nov 11 November) (Dec 12 December))) (OUTPUT NIL)) (if (EQ VERSION 'ABBREV) then (SETQ OUTPUT (CAR (CDR (ASSOC (MKATOM (SUBSTRING OLDDATE 4 6)) DATES)))) else (SETQ OUTPUT (CAR (CDDR (ASSOC (MKATOM (SUBSTRING OLDDATE 4 6)) DATES))))) (RETURN OUTPUT)))) (FINDTIME (LAMBDA (OLDDATE VERSION) (* shw: "24-Jul-85 15:39") (LET ((HOUR (SUBSTRING OLDDATE 11 12)) (MINUTES (SUBSTRING OLDDATE 14 15))) (if (EQUAL VERSION 'ABBREV) then (CONCAT (FINDHOUR HOUR) ":" MINUTES " " (AMPM HOUR)) else (if (EQUAL VERSION 'EURO) then (SUBSTRING OLDDATE 11 15) else (CONCAT (SELECTQ (if (LESSP (MKATOM MINUTES) 46) then (MKATOM (FINDHOUR HOUR)) else (PLUS 1 (MKATOM (FINDHOUR HOUR)))) (1 "one") (2 "two") (3 "three") (4 "four") (5 "five") (6 "six") (7 "seven") (8 "eight") (9 "nine") (10 "ten") (11 "eleven") (12 "twelve") NIL) " " (if (AND (GREATERP (MKATOM MINUTES) 15) (LESSP (MKATOM MINUTES) 45)) then "thirty" else "o'clock") " " (if (AND (GREATERP (MKATOM MINUTES) 44) (EQUAL (FINDHOUR HOUR) "11")) then (if (EQUAL (AMPM HOUR) "a.m.") then "p.m." else "a.m.") else (AMPM HOUR)))))))) (FINDYEAR (LAMBDA (OLDDATE VERSION) (* shw: " 1-Jul-85 11:31") (if (EQ VERSION 'ABBREV) then (MKATOM (SUBSTRING OLDDATE 8 9)) else (MKATOM (CONCAT "19" (SUBSTRING OLDDATE 8 9)))))) (NUMP (LAMBDA (N) (* edited: " 4-Apr-86 17:55") (* changed) (NOT (NULL (NUMBERP (MKATOM N)))))) (WHICHDATE (LAMBDA (VAR1 VAR2 YEAR OLDDATE VERSION) (* edited " 1-Jan-00 00:00") (* * comment) (PROG (DIVIDER) (SETQ DIVIDER (if (EQ VERSION 'ABBREV) then "/" else " ")) (RETURN (MKATOM (CONCAT (APPLY VAR1 (LIST OLDDATE VERSION)) DIVIDER (APPLY VAR2 (LIST OLDDATE VERSION)) DIVIDER (APPLY YEAR (LIST OLDDATE VERSION)))))))) ) [DECLARE: EVAL@COMPILE (RECORD DATEOBJ (DATESTRING DISPLAY.DATE TEMPLATE.DATE)) (DATATYPE STREAM ( (* First 4 words are fixed for BIN, BOUT opcodes. Length of whole datatype is multiple of 4, so  quad-aligned) (COFFSET WORD) (* Offset in CPPTR of next bin or bout) (CBUFSIZE WORD) (* Offset past last byte in that buffer) (BINABLE FLAG) (* BIN punts unless this bit on) (BOUTABLE FLAG) (* BOUT punts unless this bit on) (EXTENDABLE FLAG) (* BOUT punts when COFFSET ge CBUFFSIZE unless this  bit set and COFFSET lt 512) (NIL BITS 5) (CBUFPTR POINTER) (* Pointer to current buffer) (NONDEFAULTDATEFLG FLAG) (REVALIDATEFLG FLAG) (MULTIBUFFERHINT FLAG) (* True if stream likes to read and write more than  one buffer at a time) (USERCLOSEABLE FLAG) (* Can be closed by CLOSEF; NIL for terminal, dribble...) (USERVISIBLE FLAG) (* Listed by OPENP; NIL for terminal, dribble ...) (ACCESSBITS BITS 3) (* What kind of access file is open for  (read, write, append)) (FULLFILENAME POINTER) (* Name by which file is known to user) (DEVICE POINTER) (* FDEV of this guy) (VALIDATION POINTER) (* A number somehow identifying file, used to  determine if file has changed in our absence) (EPAGE WORD) (EOFFSET WORD) (* Page, byte offset of eof) (* Following are device-specific fields) (F1 POINTER) (F2 POINTER) (F3 POINTER) (F4 POINTER) (F5 POINTER) (FW6 WORD) (FW7 WORD) (* Following only filled in for open streams) (BYTESIZE BYTE) (BUFFS POINTER) (CPAGE WORD) (FW8 WORD) (MAXBUFFERS WORD) (CHARPOSITION WORD) (* Used by POSITION etc.) (DIRTYBITS WORD) (LINELENGTH WORD) (EOLCONVENTION BITS 2) (* End-of-line convention) (CBUFDIRTY FLAG) (NIL BITS 5) (OUTCHARFN POINTER) (ENDOFSTREAMOP POINTER) (* For use of applications programs, not devices) (OTHERPROPS POINTER) (IMAGEOPS POINTER) (* Image operations vector) (IMAGEDATA POINTER) (* Image instance variables--format depends on  IMAGEOPS value) (EXTRASTREAMOP POINTER) (STRMBINFN POINTER) (* Either the BIN fn from the FDEV, or a trap) (STRMBOUTFN POINTER) (* Either the BIN fn from the FDEV, or a trap) (CBUFMAXSIZE WORD) (FW9 WORD) (F10 POINTER) (* the current character set for this stream. gbn 4-2-85) (CHARSET BYTE)) (BLOCKRECORD STREAM ((NIL 2 WORD) (UCODEFLAGS BYTE) (NIL POINTER))) (ACCESSFNS STREAM ((ACCESS \GETACCESS \SETACCESS) (FULLNAME (OR (fetch (STREAM FULLFILENAME) of DATUM) DATUM)) (NAMEDP (AND (fetch (STREAM FULLFILENAME) of DATUM) T)))) (SYNONYM CBUFPTR (CPPTR)) USERCLOSEABLE _ T USERVISIBLE _ T ACCESSBITS _ NoBits BUFFS _ NIL BYTESIZE _ 8 CBUFPTR _ NIL MAXBUFFERS _(PROGN (DECLARE (GLOBALVARS \STREAM.DEFAULT.MAXBUFFERS)) \STREAM.DEFAULT.MAXBUFFERS) CHARPOSITION _ 0 LINELENGTH _(PROGN (DECLARE (GLOBALVARS FILELINELENGTH)) FILELINELENGTH) OUTCHARFN _(FUNCTION \FILEOUTCHARFN) ENDOFSTREAMOP _(FUNCTION \EOSERROR) IMAGEOPS _ \NOIMAGEOPS EOLCONVENTION _(SELECTQ (SYSTEMTYPE) (D CR.EOLC) (VAX LF.EOLC) (JERICHO CRLF.EOLC) CR.EOLC) STRMBINFN _(FUNCTION \STREAM.NOT.OPEN) STRMBOUTFN _(FUNCTION \STREAM.NOT.OPEN)) (DATATYPE FONTCLASS ((PRETTYFONT# BYTE) DISPLAYFD PRESSFD INTERPRESSFD OTHERFDS FONTCLASSNAME)) ] (/DECLAREDATATYPE 'STREAM '(WORD WORD FLAG FLAG FLAG (BITS 5) POINTER FLAG FLAG FLAG FLAG FLAG (BITS 3) POINTER POINTER POINTER WORD WORD POINTER POINTER POINTER POINTER POINTER WORD WORD BYTE POINTER WORD WORD WORD WORD WORD WORD (BITS 2) FLAG (BITS 5) POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER WORD WORD POINTER BYTE) '((STREAM 0 (BITS . 15)) (STREAM 1 (BITS . 15)) (STREAM 2 (FLAGBITS . 0)) (STREAM 2 (FLAGBITS . 16)) (STREAM 2 (FLAGBITS . 32)) (STREAM 2 (BITS . 52)) (STREAM 2 POINTER) (STREAM 4 (FLAGBITS . 0)) (STREAM 4 (FLAGBITS . 16)) (STREAM 4 (FLAGBITS . 32)) (STREAM 4 (FLAGBITS . 48)) (STREAM 4 (FLAGBITS . 64)) (STREAM 4 (BITS . 82)) (STREAM 4 POINTER) (STREAM 6 POINTER) (STREAM 8 POINTER) (STREAM 10 (BITS . 15)) (STREAM 11 (BITS . 15)) (STREAM 12 POINTER) (STREAM 14 POINTER) (STREAM 16 POINTER) (STREAM 18 POINTER) (STREAM 20 POINTER) (STREAM 22 (BITS . 15)) (STREAM 23 (BITS . 15)) (STREAM 20 (BITS . 7)) (STREAM 24 POINTER) (STREAM 26 (BITS . 15)) (STREAM 27 (BITS . 15)) (STREAM 28 (BITS . 15)) (STREAM 29 (BITS . 15)) (STREAM 30 (BITS . 15)) (STREAM 31 (BITS . 15)) (STREAM 24 (BITS . 1)) (STREAM 24 (FLAGBITS . 32)) (STREAM 24 (BITS . 52)) (STREAM 32 POINTER) (STREAM 34 POINTER) (STREAM 36 POINTER) (STREAM 38 POINTER) (STREAM 40 POINTER) (STREAM 42 POINTER) (STREAM 44 POINTER) (STREAM 46 POINTER) (STREAM 48 (BITS . 15)) (STREAM 49 (BITS . 15)) (STREAM 50 POINTER) (STREAM 50 (BITS . 7))) '52) (/DECLAREDATATYPE 'FONTCLASS '(BYTE POINTER POINTER POINTER POINTER POINTER) '((FONTCLASS 0 (BITS . 7)) (FONTCLASS 0 POINTER) (FONTCLASS 2 POINTER) (FONTCLASS 4 POINTER) (FONTCLASS 6 POINTER) (FONTCLASS 8 POINTER)) '10) (PUTPROPS DATE COPYRIGHT ("Leland Stanford Junior University" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (850 12872 (DATEOBJ 862 . 2359) (DATEOBJP 2363 . 2736) (DATE.DISPLAYFN 2740 . 3015) ( DATE.IMAGEBOXFN 3019 . 3575) (CURRENT.DISPLAY.FONT 3579 . 4284) (DATE.PUTFN 4288 . 4541) (DATE.GETFN 4545 . 4956) (DATE.BUTTONEVENTINFN 4960 . 6275) (DATES.TEMPLATE 6279 . 7439) (AMPM 7443 . 7615) ( DATES.MENU.APPLY 7619 . 8538) (DATES.MENU.WHENSELECTEDFN 8542 . 8780) (DATES.SET 8784 . 8895) (FINDDAY 8899 . 9154) (FINDHOUR 9158 . 9662) (FINDMONTH 9666 . 10427) (FINDTIME 10431 . 11846) (FINDYEAR 11850 . 12124) (NUMP 12128 . 12368) (WHICHDATE 12372 . 12869))))) STOP \ No newline at end of file diff --git a/lispusers/DATEFNS b/lispusers/DATEFNS new file mode 100644 index 00000000..b0e6c54d --- /dev/null +++ b/lispusers/DATEFNS @@ -0,0 +1 @@ +(FILECREATED "10-Oct-86 13:07:26" {DSK}DATEFNS.;1 20771 changes to: (FNS MAKE.DATE) previous date: " 4-May-84 18:46:07" {DANTE}LISPUSERS>DATEFNS.;1) (* Copyright (c) 1984, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DATEFNSCOMS) (RPAQQ DATEFNSCOMS ((FNS BUILDCALENDAR CALRBUTTONFN CENTERBLTINREGION DATEMENU DAY DAYOFWEEK DAYSIN DRAWCALENDAR FOLLOWING.MONTH LEAPYEARP MAKE.DATE PREVIOUS.MONTH XYTODATE \CALBOXITEM \CALINVERTITEM) (VARS LISTOFDAYS MONTH.LIST) (VARS (CALBORDER 3) (CALGRIDBORDER 1)) [VARS (MONTHNAMEFONT (FONTCREATE (QUOTE GACHA) 12)) (OTHERMONTHFONT (FONTCREATE (QUOTE GACHA) 8)) (DAYNAMEFONT (FONTCREATE (QUOTE GACHA) 10)) (DAYNUMBERFONT (FONTCREATE (QUOTE GACHA) 12 (QUOTE BOLD] (DECLARE: DONTCOPY (RECORDS CALENDARINFO)))) (DEFINEQ (BUILDCALENDAR [LAMBDA (MON YEAR CALENDARW) (* rrb " 3-May-84 12:41") (PROG ([YEAR (OR YEAR (MKATOM (SUBSTRING (DATE) 8 9] (MON (OR MON (SUBSTRING (DATE) 4 6))) DAYSIN FIRSTDAY WEEKROWS CALWIDTH CALHEIGHT CALWWIDTH CALWHEIGHT DAYWIDTH DAYHEIGHT OTHERMONWIDTH OTHERMONHEIGHT) (SETQ MON (MKATOM (U-CASE MON))) MONLP (COND ((MEMB MON MONTH.LIST)) ((IGREATERP (NCHARS MON) 3) (SETQ MON (MKATOM (SUBSTRING MON 1 3))) (GO MONLP)) (T (ERROR MON "not recognized as a month. Should be 3 letter abbrev."))) (SETQ DAYSIN (DAYSIN MON YEAR)) [SETQ FIRSTDAY (DAYOFWEEK (IDATE (CONCAT "01-" MON "-" YEAR " 12:00:00"] (SETQ WEEKROWS (COND ((IGREATERP (IPLUS DAYSIN FIRSTDAY) 35) 6) ((IGREATERP (IPLUS DAYSIN FIRSTDAY) 28) 5) (T 4))) [SETQ CALWIDTH (IPLUS (IMAX (ITIMES (IPLUS (ITIMES 2 (IPLUS CALGRIDBORDER 1)) (IMAX (STRINGWIDTH "Su" DAYNAMEFONT) (STRINGWIDTH "28" DAYNUMBERFONT))) 7) (IPLUS [ITIMES 2 (SETQ OTHERMONWIDTH (IPLUS 4 (STRINGWIDTH "MAY" OTHERMONTHFONT] (STRINGWIDTH " MAR 84 " MONTHNAMEFONT] (SETQ CALWWIDTH (WIDTHIFWINDOW CALWIDTH CALBORDER)) (SETQ CALHEIGHT (IPLUS (IPLUS 2 (IMAX (SETQ OTHERMONHEIGHT (IPLUS 2 (FONTHEIGHT OTHERMONTHFONT))) (FONTHEIGHT MONTHNAMEFONT))) (IPLUS 2 (FONTHEIGHT DAYNAMEFONT)) (ITIMES (SETQ DAYHEIGHT (IPLUS CALGRIDBORDER 2 (FONTHEIGHT DAYNUMBERFONT))) WEEKROWS))) (SETQ CALWHEIGHT (HEIGHTIFWINDOW CALHEIGHT NIL CALBORDER)) [COND [(WINDOWP CALENDARW) (PROG [(CURRENTREG (WINDOWPROP CALENDARW (QUOTE REGION] (CLEARW CALENDARW) (WINDOWPROP CALENDARW (QUOTE RESHAPEFN) NIL) (COND ((NEQ (fetch (REGION HEIGHT) of CURRENTREG) CALWHEIGHT) (* do reshape so that upper part of window remains  fixed.) (WINDOWPROP CALENDARW (QUOTE REGION) (CREATEREGION (fetch (REGION LEFT) of CURRENTREG) (IDIFFERENCE (fetch (REGION BOTTOM) of CURRENTREG) (IDIFFERENCE CALWHEIGHT (fetch (REGION HEIGHT) of CURRENTREG))) CALWWIDTH CALWHEIGHT] (T (SETQ CALENDARW (CREATEW (MAKEWITHINREGION (CREATEREGION LASTMOUSEX LASTMOUSEY CALWWIDTH CALWHEIGHT)) NIL CALBORDER NIL] (WINDOWPROP CALENDARW (QUOTE BUTTONEVENTFN) (FUNCTION CALRBUTTONFN)) (WINDOWPROP CALENDARW (QUOTE CURSORINFN) (FUNCTION CALRBUTTONFN)) (WINDOWPROP CALENDARW (QUOTE CURSORMOVEDFN) (FUNCTION CALRBUTTONFN)) (WINDOWPROP CALENDARW (QUOTE RESHAPEFN) (QUOTE DON'T)) (WINDOWPROP CALENDARW (QUOTE CALENDARINFO) (create CALENDARINFO MONTH _ MON YEAR _ YEAR #DAYS _ DAYSIN DAYOFFIRST _ FIRSTDAY WEEKROWS _ WEEKROWS) DAYSIN) (WINDOWPROP CALENDARW (QUOTE CALGRIDSPEC) (create REGION LEFT _(IQUOTIENT [IDIFFERENCE CALWIDTH (ITIMES 7 (SETQ DAYWIDTH (IQUOTIENT CALWIDTH 7] 2) BOTTOM _ 0 WIDTH _ DAYWIDTH HEIGHT _ DAYHEIGHT)) (WINDOWPROP CALENDARW (QUOTE OTHERMONTHREGIONS) (LIST (create REGION LEFT _ 0 BOTTOM _(IDIFFERENCE CALHEIGHT OTHERMONHEIGHT) WIDTH _ OTHERMONWIDTH HEIGHT _ OTHERMONHEIGHT) (create REGION LEFT _(IDIFFERENCE CALWIDTH OTHERMONWIDTH) BOTTOM _(IDIFFERENCE CALHEIGHT OTHERMONHEIGHT) WIDTH _ OTHERMONWIDTH HEIGHT _ OTHERMONHEIGHT))) (DRAWCALENDAR CALENDARW) (RETURN CALENDARW]) (CALRBUTTONFN [LAMBDA (CALENDARW) (* rrb " 2-May-84 19:51") (* buttoneventfn for calendar menus) (PROG ((CALINFO (WINDOWPROP CALENDARW (QUOTE CALENDARINFO))) (OTHERMONTHREGIONS (WINDOWPROP CALENDARW (QUOTE OTHERMONTHREGIONS))) (MGRIDSPEC (WINDOWPROP CALENDARW (QUOTE CALGRIDSPEC))) (LASTBUTTONSTATE LASTMOUSEBUTTONS) (MAXXBOX 7) OLDBOXX OLDBOXY BOXX BOXY DSPX DSPY MAXYBOX MOUSEDOWN ITEM YEAR MONTH) (SETQ MONTH (fetch (CALENDARINFO MONTH) of CALINFO)) (SETQ YEAR (fetch (CALENDARINFO YEAR) of CALINFO)) (SETQ MAXYBOX (fetch (CALENDARINFO WEEKROWS) of CALINFO)) [RETURN (until (COND (MOUSEDOWN (* if mouse has been down, process it) (MOUSESTATE UP)) ((MOUSESTATE (NOT UP)) (* mouse hasn't been down but just went down.) [COND ((LASTMOUSESTATE RIGHT) (DOWINDOWCOM CALENDARW) (SETQ MOUSEDOWN NIL)) (T (SETQ MOUSEDOWN T) (COND (OLDBOXX (* switch between boxing to flipping items.) (\CALBOXITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW) (\CALINVERTITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW] NIL)) do [COND [[OR (AND (STRICTLY/BETWEEN (SETQ BOXY (GRIDYCOORD (LASTMOUSEY CALENDARW) MGRIDSPEC)) -1 MAXYBOX) (STRICTLY/BETWEEN (SETQ BOXX (GRIDXCOORD (LASTMOUSEX CALENDARW) MGRIDSPEC)) -1 MAXXBOX)) (SETQ BOXX (for REG in OTHERMONTHREGIONS when (INSIDE? REG (LASTMOUSEX CALENDARW) (LASTMOUSEY CALENDARW)) do (RETURN REG] (* BOXX and BOXY hold the number of the box pointed at.) (COND ((OR (NEQ BOXX OLDBOXX) (NEQ BOXY OLDBOXY)) (* selected item has changed.) (* uninvert old item if there was one.) [COND (OLDBOXX (COND (MOUSEDOWN (\CALINVERTITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW)) (T (\CALBOXITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW] (* invert new item) (COND (MOUSEDOWN (\CALINVERTITEM BOXX BOXY MGRIDSPEC CALENDARW)) (T (\CALBOXITEM BOXX BOXY MGRIDSPEC CALENDARW))) (SETQ OLDBOXX BOXX) (SETQ OLDBOXY BOXY] (T (* cursor moved outside of the menu.) (COND (OLDBOXX (COND (MOUSEDOWN (\CALINVERTITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW)) (T (\CALBOXITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW))) (* OLDBOXX denotes item inverted.) (SETQ OLDBOXX))) (COND ((INSIDEP (WINDOWPROP CALENDARW (QUOTE REGION)) LASTMOUSEX LASTMOUSEY) (* cursor is still inside the window, keep control.) NIL) (T (RETURN] finally (* turn off inverse image. and call whenunheldfn is  necessary.) (COND (OLDBOXX (COND (MOUSEDOWN (\CALINVERTITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW)) (T (\CALBOXITEM OLDBOXX OLDBOXY MGRIDSPEC CALENDARW))) (* something was selected, take down the window.) (CLOSEW CALENDARW))) (* return selected date or bring up new calendar) (RETURN (COND ((REGIONP OLDBOXX) (* selected a month) [COND [(EQ OLDBOXX (CAR OTHERMONTHREGIONS)) (COND ((EQ (SETQ MONTH (PREVIOUS.MONTH MONTH)) (QUOTE DEC)) (SETQ YEAR (SUB1 YEAR] (T (COND ((EQ (SETQ MONTH (FOLLOWING.MONTH MONTH)) (QUOTE JAN)) (SETQ YEAR (ADD1 YEAR] (BUILDCALENDAR MONTH YEAR CALENDARW)) (OLDBOXX (WINDOWPROP CALENDARW (QUOTE VALUE) (MAKE.DATE (XYTODATE CALENDARW OLDBOXX OLDBOXY) MONTH YEAR] (* return selected date or bring up new calendar) ]) (CENTERBLTINREGION [LAMBDA (BITMAP REGION STRM) (* rrb " 1-May-84 14:18") (* puts a bitmap centered in a region of a stream) (BITBLT BITMAP 0 0 STRM (IPLUS (fetch (REGION LEFT) of REGION) (IQUOTIENT (IDIFFERENCE (fetch (REGION WIDTH) of REGION) (BITMAPWIDTH BITMAP)) 2)) (IPLUS (fetch (REGION BOTTOM) of REGION) (IQUOTIENT (IDIFFERENCE (fetch (REGION HEIGHT) of REGION) (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) 2)) NIL NIL (QUOTE INPUT) NIL NIL REGION]) (DATEMENU [LAMBDA (MON YEAR) (* rrb " 2-May-84 19:53") (* puts up a calendar menu and reads a date from the  user) (PROG ((CALMENUW (BUILDCALENDAR MON YEAR))) (until (WINDOWPROP CALMENUW (QUOTE VALUE)) do (TOTOPW CALMENUW) (DISMISS 500)) (RETURN (WINDOWPROP CALMENUW (QUOTE VALUE) NIL]) (DAY [LAMBDA (STRDATE) (* rrb " 1-May-84 14:30") (SELECTQ (DAYOFWEEK (IDATE STRDATE)) (1 "MONDAY") (2 "TUESDAY") (3 "WEDNESDAY") (4 "THURSDAY") (5 "FRIDAY") (6 "SATURDAY") (0 "SUNDAY") (SHOULDNT]) (DAYOFWEEK [LAMBDA (INTERNALDATE) (* gbn "11-MAY-83 10:47") (* Returns a number between 0  (Sunday) and 6 (Saturday) representing the day of the  week which the given IDATE was/is/willbe) (PROG ((UNITSSINCEBASE (IQUOTIENT (LRSH (LISP.TO.ALTO.DATE INTERNALDATE) 1) 30))) (* UNITSSINCEBASE represents the number of minutes since Jan 1,1901 GMT) (* now, adjust for the time zone. Since this may make UNITSSINCEBASE go negative , add in  one week of hours) (SETQ UNITSSINCEBASE (IDIFFERENCE (IPLUS (IQUOTIENT UNITSSINCEBASE 60) (ITIMES 24 7)) \TimeZoneComp)) (* UNITSSINCEBASE now represents the number of hours  since Genesis) (RETURN (IREMAINDER (IPLUS 2 (IQUOTIENT UNITSSINCEBASE 24)) 7]) (DAYSIN [LAMBDA (MONTH YEAR) (* rrb " 2-May-84 19:38") (SELECTQ (MKATOM MONTH) (FEB (COND ((LEAPYEARP YEAR) 29) (T 28))) ((APR JUN SEP NOV) 30) 31]) (DRAWCALENDAR [LAMBDA (CALENDARW) (* rrb " 2-May-84 18:47") (* Adds the grid numbering and messages to calendar) (PROG ((CALENDARINFO (WINDOWPROP CALENDARW (QUOTE CALENDARINFO))) (CALGRIDSPEC (WINDOWPROP CALENDARW (QUOTE CALGRIDSPEC))) ROWS GRIDWIDTH GRIDHEIGHT BOTTOM MONTH) (CLEARW CALENDARW) (* prepares the grid for the calendar) (GRID CALGRIDSPEC 7 (SETQ ROWS (fetch (CALENDARINFO WEEKROWS) of CALENDARINFO)) CALGRIDBORDER CALENDARW) (SETQ GRIDWIDTH (fetch WIDTH of CALGRIDSPEC)) (SETQ GRIDHEIGHT (fetch HEIGHT of CALGRIDSPEC)) (DSPFONT DAYNUMBERFONT CALENDARW) (* print in the numbers for the days.) (for #DAYOFWEEK from (fetch (CALENDARINFO DAYOFFIRST) of CALENDARINFO) as DATE from 1 to (fetch (CALENDARINFO #DAYS) of CALENDARINFO) do (CENTERPRINTINREGION DATE (create REGION BOTTOM _(BOTTOMOFGRIDCOORD (SUB1 (IDIFFERENCE ROWS (IQUOTIENT #DAYOFWEEK 7))) CALGRIDSPEC) LEFT _(LEFTOFGRIDCOORD (IREMAINDER #DAYOFWEEK 7) CALGRIDSPEC) WIDTH _ GRIDWIDTH HEIGHT _ GRIDHEIGHT) CALENDARW)) (* Now print the day headings in the top row of the  calendar) (DSPFONT DAYNAMEFONT CALENDARW) (for CHAR in LISTOFDAYS as #DAYOFWEEK from 0 do (CENTERPRINTINREGION CHAR (create REGION BOTTOM _( BOTTOMOFGRIDCOORD ROWS CALGRIDSPEC) LEFT _( LEFTOFGRIDCOORD #DAYOFWEEK CALGRIDSPEC) WIDTH _ GRIDWIDTH HEIGHT _ GRIDHEIGHT) CALENDARW)) (* put up the scroll bars for moving to previous and  following months.) (DSPFONT OTHERMONTHFONT CALENDARW) (SETQ MONTH (fetch (CALENDARINFO MONTH) of CALENDARINFO)) (for REGION in (WINDOWPROP CALENDARW (QUOTE OTHERMONTHREGIONS)) as NEARMONTH in (LIST (PREVIOUS.MONTH MONTH) (FOLLOWING.MONTH MONTH)) do (DRAWAREABOX (fetch (REGION LEFT) of REGION) (fetch (REGION BOTTOM) of REGION) (fetch (REGION WIDTH) of REGION) (fetch (REGION HEIGHT) of REGION) 1 NIL CALENDARW) (CENTERPRINTINREGION NEARMONTH REGION CALENDARW)) (* put up month and year.) (DSPFONT MONTHNAMEFONT CALENDARW) (CENTERPRINTINREGION (CONCAT MONTH " " (fetch (CALENDARINFO YEAR) of CALENDARINFO)) (create REGION LEFT _(LEFTOFGRIDCOORD 0 CALGRIDSPEC) BOTTOM _(SETQ BOTTOM (BOTTOMOFGRIDCOORD (ADD1 ROWS) CALGRIDSPEC)) WIDTH _(ITIMES 7 GRIDWIDTH) HEIGHT _(IDIFFERENCE (WINDOWPROP CALENDARW (QUOTE HEIGHT)) BOTTOM)) CALENDARW]) (FOLLOWING.MONTH [LAMBDA (MONTH) (* rrb " 2-May-84 17:55") (* returns the following months) (for TAIL on MONTH.LIST when (EQ MONTH (CAR TAIL)) do (RETURN (COND ((CADR TAIL)) (T (CAR MONTH.LIST]) (LEAPYEARP [LAMBDA (YEAR) (* rrb " 2-May-84 19:38") (* determines if YEAR is a leap year. Uses current year if YEAR is NIL) (* assumes year is two digit number.) (AND (ZEROP (REMAINDER [SETQ YEAR (COND ((NUMBERP YEAR)) ((NULL YEAR) (MKATOM (SUBSTRING (DATE) 8 9))) (T (\ILLEGAL.ARG YEAR] 4)) (NOT (ZEROP YEAR]) (MAKE.DATE [LAMBDA (DAY MONTH YEAR) (* Newman "10-Oct-86 12:58") (* returns a date string.) [COND [(ILESSP DAY 1) (* day from previous month) (SETQ MONTH (PREVIOUS.MONTH MONTH)) [COND ((EQ MONTH (QUOTE DEC)) (SETQ YEAR (SUB1 YEAR] (SETQ DAY (IPLUS (ADD1 DAY) (DAYSIN MONTH YEAR] ((IGREATERP DAY (DAYSIN MONTH YEAR)) (* day in next month) (SETQ DAY (IDIFFERENCE DAY (DAYSIN MONTH YEAR))) (SETQ MONTH (FOLLOWING.MONTH MONTH)) (COND ((EQ MONTH (QUOTE JAN)) (SETQ YEAR (ADD1 YEAR] (CONCAT (COND ((IGEQ DAY 10) DAY) (T (CONCAT "0" DAY))) "-" MONTH "-" YEAR " 00:00:00"]) (PREVIOUS.MONTH [LAMBDA (MONTH) (* rrb " 2-May-84 17:53") (* returns the previous months) (COND ((EQ MONTH (CAR MONTH.LIST)) (CAR (LAST MONTH.LIST))) (T (for TAIL on MONTH.LIST when (EQ MONTH (CADR TAIL)) do (RETURN (CAR TAIL]) (XYTODATE [LAMBDA (WINDOW X Y) (* rrb " 2-May-84 15:33") (* Takes an x y position in grid coordinates and returns the date which corresponds to it) (PROG [(CALINFO (WINDOWPROP WINDOW (QUOTE CALENDARINFO] (RETURN (IPLUS 1 X (MINUS (fetch (CALENDARINFO DAYOFFIRST) of CALINFO)) (ITIMES (IPLUS -1 (fetch (CALENDARINFO WEEKROWS) of CALINFO) (MINUS Y)) 7]) (\CALBOXITEM [LAMBDA (COLUMN ROW GRID DSP) (* rrb " 2-May-84 20:00") (* inverts an item in a calendar displayed in DSP.) (PROG (LFT BTM WID HGHT) [COND ((REGIONP COLUMN) (* either the previous or next months.) (SETQ LFT (fetch (REGION LEFT) of COLUMN)) (SETQ BTM (fetch (REGION BOTTOM) of COLUMN)) (SETQ WID (fetch (REGION WIDTH) of COLUMN)) (SETQ HGHT (fetch (REGION HEIGHT) of COLUMN))) (T (* must be part of calendar.) (SETQ LFT (LEFTOFGRIDCOORD COLUMN GRID)) (SETQ BTM (BOTTOMOFGRIDCOORD ROW GRID)) (SETQ WID (fetch (REGION WIDTH) of GRID)) (SETQ HGHT (fetch (REGION HEIGHT) of GRID] (BITBLT NIL NIL NIL DSP (ADD1 LFT) (ADD1 BTM) (IDIFFERENCE WID 2) (IDIFFERENCE HGHT 2) (QUOTE TEXTURE) (QUOTE INVERT) BLACKSHADE) (BITBLT NIL NIL NIL DSP (IPLUS LFT 2) (IPLUS BTM 2) (IDIFFERENCE WID 4) (IDIFFERENCE HGHT 4) (QUOTE TEXTURE) (QUOTE INVERT) BLACKSHADE]) (\CALINVERTITEM [LAMBDA (COLUMN ROW GRID DSP) (* rrb " 2-May-84 18:37") (* inverts an item in a calendar displayed in DSP.) (COND ((REGIONP COLUMN) (* either the previous or next months.) (DSPFILL COLUMN BLACKSHADE (QUOTE INVERT) DSP)) (T (* must be part of calendar.) (SHADEGRIDBOX COLUMN ROW BLACKSHADE (QUOTE INVERT) GRID CALGRIDBORDER DSP]) ) (RPAQQ LISTOFDAYS ("Su" "M" "Tu" "W" "Th" "F" "Sa")) (RPAQQ MONTH.LIST (JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC)) (RPAQQ CALBORDER 3) (RPAQQ CALGRIDBORDER 1) (RPAQ MONTHNAMEFONT (FONTCREATE (QUOTE GACHA) 12)) (RPAQ OTHERMONTHFONT (FONTCREATE (QUOTE GACHA) 8)) (RPAQ DAYNAMEFONT (FONTCREATE (QUOTE GACHA) 10)) (RPAQ DAYNUMBERFONT (FONTCREATE (QUOTE GACHA) 12 (QUOTE BOLD))) (DECLARE: DONTCOPY [DECLARE: EVAL@COMPILE (RECORD CALENDARINFO (MONTH YEAR #DAYS DAYOFFIRST WEEKROWS)) ] ) (PUTPROPS DATEFNS COPYRIGHT ("Xerox Corporation" 1984 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (896 20124 (BUILDCALENDAR 906 . 4810) (CALRBUTTONFN 4812 . 9418) (CENTERBLTINREGION 9420 . 10087) (DATEMENU 10089 . 10559) (DAY 10561 . 10864) (DAYOFWEEK 10866 . 11981) (DAYSIN 11983 . 12233 ) (DRAWCALENDAR 12235 . 15548) (FOLLOWING.MONTH 15550 . 15906) (LEAPYEARP 15908 . 16475) (MAKE.DATE 16477 . 17393) (PREVIOUS.MONTH 17395 . 17773) (XYTODATE 17775 . 18299) (\CALBOXITEM 18301 . 19544) ( \CALINVERTITEM 19546 . 20122))))) STOP \ No newline at end of file diff --git a/lispusers/DATEFORMAT-EDITOR b/lispusers/DATEFORMAT-EDITOR new file mode 100644 index 00000000..62330089 --- /dev/null +++ b/lispusers/DATEFORMAT-EDITOR @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP" BASE 10) (FILECREATED "19-May-89 17:52:44" {ERINYES}MEDLEY>DATEFORMAT-EDITOR.;1 13443 changes to%: (VARS DATEFORMAT-EDITORCOMS) previous date%: "16-Sep-88 12:50:52" {PHYLUM}MEDLEY>LISPUSERS>DATEFORMAT-EDITOR.;1) (* " Copyright (c) 1987, 1988, 1989 by Johannes A. G. M. Koomen. All rights reserved. ") (PRETTYCOMPRINT DATEFORMAT-EDITORCOMS) (RPAQQ DATEFORMAT-EDITORCOMS ((* ;;; "This system provides a facility for editing date formats as described in section 12.5 of the Interlisp-D manual, Koto version. User entry point is the function EDIT-DATEFORMAT. Editing is accomplished using a FREEMENU. Items displayed in this menu are stored on DATEFORMAT-EDITOR-ITEMS. Call (GET-DATEFORMAT-EDITOR T) after changing this variable. Input to EDIT-DATEFORMAT is either NIL or a value returned by the DATEFORMAT function. Output is either NIL -- in case editing was aborted -- or another value as returned from the DATEFORMAT function.") (* ;;; "Interface") (FNS EDIT-DATEFORMAT GET-DATEFORMAT-EDITOR) (INITVARS (EDIT-DATEFORMAT-DEFAULT (DATEFORMAT))) (* ;;; "Support") (FILES (SYSLOAD) FREEMENU) (FNS DATEFORMAT-EDITOR-STATUS DATEFORMAT-EDITOR-GET-STATE DATEFORMAT-EDITOR-PUT-STATE DATEFORMAT-EDITOR-SHOW-STATE DATEFORMAT-EDITOR-ABORTFN DATEFORMAT-EDITOR-CLOSEFN DATEFORMAT-EDITOR-GETDFLTFN DATEFORMAT-EDITOR-PUTDFLTFN DATEFORMAT-EDITOR-QUITFN DATEFORMAT-EDITOR-SHOWFN) (VARS $$DATEFORMAT-EDITOR-ITEMS) (INITVARS (DATEFORMAT-EDITOR-ITEMS (COPY $$DATEFORMAT-EDITOR-ITEMS))) (DECLARE%: DONTEVAL@LOAD DOCOPY (VARS ($$DATEFORMAT-EDITOR (GET-DATEFORMAT-EDITOR)) ($$DATEFORMAT-EDITOR-IDATE (IDATE " 1-Jan-88 23:56:41"))) (P (COND ((NOT (GETD (QUOTE \OUTDATE-STRING))) (* ; "Get DATE extensions") (FILESLOAD (SYSLOAD) DATEPATCH))))) (PROP MAKEFILE-ENVIRONMENT DATEFORMAT-EDITOR))) (* ;;; "This system provides a facility for editing date formats as described in section 12.5 of the Interlisp-D manual, Koto version. User entry point is the function EDIT-DATEFORMAT. Editing is accomplished using a FREEMENU. Items displayed in this menu are stored on DATEFORMAT-EDITOR-ITEMS. Call (GET-DATEFORMAT-EDITOR T) after changing this variable. Input to EDIT-DATEFORMAT is either NIL or a value returned by the DATEFORMAT function. Output is either NIL -- in case editing was aborted -- or another value as returned from the DATEFORMAT function." ) (* ;;; "Interface") (DEFINEQ (EDIT-DATEFORMAT (LAMBDA (DATEFORMAT) (* ; "Edited 29-Mar-88 17:24 by Koomen") (* ;;; "This system provides a facility for editing date formats as described in section 12.14 of the Interlisp-D manual, Koto version. Editing is accomplished using a FREEMENU. Items displayed in this menu are stored on DATEFORMAT-EDITOR-ITEMS. Call (GET-DATEFORMAT-EDITOR T) after changing this variable. Input is either NIL or a value returned by the DATEFORMAT function. Output is either NIL -- in case editing was aborted -- or another value as returned from the DATEFORMAT function.") (PROG ((DFE (GET-DATEFORMAT-EDITOR))) (DATEFORMAT-EDITOR-PUT-STATE DFE (OR DATEFORMAT EDIT-DATEFORMAT-DEFAULT)) (OPENW DFE) (DATEFORMAT-EDITOR-SHOW-STATE DFE) (DATEFORMAT-EDITOR-STATUS DFE (QUOTE EDIT)) (NLSETQ (while (EQ (DATEFORMAT-EDITOR-STATUS DFE) (QUOTE EDIT)) do (BLOCK))) (CLOSEW DFE) (if (EQ (DATEFORMAT-EDITOR-STATUS DFE) (QUOTE QUIT)) then (RETURN (DATEFORMAT-EDITOR-GET-STATE DFE)) else (DATEFORMAT-EDITOR-STATUS DFE (QUOTE ABORT))))) ) (GET-DATEFORMAT-EDITOR (LAMBDA (RECOMPUTE?) (* ; "Edited 24-Sep-87 13:36 by Koomen") (DECLARE (GLOBALVARS $$DATEFORMAT-EDITOR DATEFORMAT-EDITOR-ITEMS LASTMOUSEX LASTMOUSEY SCREENWIDTH SCREENHEIGHT)) (PROG ((DFE $$DATEFORMAT-EDITOR)) (if (OR RECOMPUTE? (NOT (WINDOWP DFE)) (NOT (FMEMB (DATEFORMAT-EDITOR-STATUS DFE) (QUOTE (QUIT ABORT))))) then (SETQ DFE (FREEMENU DATEFORMAT-EDITOR-ITEMS "Date Format Editor")) (SETQ $$DATEFORMAT-EDITOR DFE) (WINDOWPROP DFE (QUOTE CLOSEFN) (FUNCTION DATEFORMAT-EDITOR-CLOSEFN)) (WINDOWPROP DFE (QUOTE SHRINKFN) (QUOTE DON'T)) (WINDOWPROP DFE (QUOTE RESHAPEFN) (QUOTE DON'T)) (DATEFORMAT-EDITOR-STATUS DFE (QUOTE QUIT))) (MOVEW DFE (IMAX 0 (IMIN LASTMOUSEX (IDIFFERENCE SCREENWIDTH (fetch (REGION WIDTH) of (WINDOWREGION DFE))))) (IMAX 0 (IMIN LASTMOUSEY (IDIFFERENCE SCREENHEIGHT (fetch (REGION HEIGHT) of (WINDOWREGION DFE)))))) (RETURN DFE))) ) ) (RPAQ? EDIT-DATEFORMAT-DEFAULT (DATEFORMAT)) (* ;;; "Support") (FILESLOAD (SYSLOAD) FREEMENU) (DEFINEQ (DATEFORMAT-EDITOR-STATUS (LAMBDA (DFE NEWSTATUS) (* Koomen "30-Jan-87 23:41") (if NEWSTATUS then (WINDOWPROP DFE (QUOTE DATEFORMAT-EDITOR-STATUS) NEWSTATUS) else (WINDOWPROP DFE (QUOTE DATEFORMAT-EDITOR-STATUS)))) ) (DATEFORMAT-EDITOR-GET-STATE (LAMBDA (DFE) (* ; "Edited 29-Mar-88 15:05 by Koomen") (PROG ((FMT NIL) (ITEM NIL) (STATE (FM.GETSTATE DFE))) (if (SETQ ITEM (LISTGET STATE (QUOTE TIME))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (TIME-SECS NIL) (TIME-NONE (push FMT (QUOTE NO.TIME))) (TIME-MINS (push FMT (QUOTE NO.SECONDS))) (SHOULDNT "Bad TIME"))) (if (NOT (LISTGET FMT (QUOTE NO.TIME))) then (if (SETQ ITEM (LISTGET STATE (QUOTE TIMEZONE))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (TIMEZONE-NO NIL) (TIMEZONE-YES (push FMT (QUOTE TIME.ZONE))) (SHOULDNT "Bad TIMEZONE")))) (if (SETQ ITEM (LISTGET STATE (QUOTE DATE))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (DATE-NONE (push FMT (QUOTE NO.DATE))) (DATE-NORMAL NIL) (DATE-SPACES (push FMT (QUOTE SPACES))) (DATE-SLASHES (push FMT (QUOTE SLASHES))) (DATE-LEADING (push FMT (QUOTE MONTH.LEADING))) (SHOULDNT "Bad DATE"))) (if (NOT (LISTGET FMT (QUOTE NO.DATE))) then (if (SETQ ITEM (LISTGET STATE (QUOTE DAY))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (DAY-NONE NIL) (DAY-LONG (push FMT (QUOTE DAY.OF.WEEK))) (DAY-SHORT (push FMT (QUOTE DAY.OF.WEEK)) (push FMT (QUOTE DAY.SHORT))) (SHOULDNT "Bad DAY"))) (if (SETQ ITEM (LISTGET STATE (QUOTE MONTH))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (MONTH-LONG (push FMT (QUOTE MONTH.LONG))) (MONTH-SHORT NIL) (MONTH-NUMERIC (push FMT (QUOTE NUMBER.OF.MONTH))) (SHOULDNT "Bad MONTH"))) (if (SETQ ITEM (LISTGET STATE (QUOTE YEAR))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (YEAR-LONG (push FMT (QUOTE YEAR.LONG))) (YEAR-SHORT NIL) (SHOULDNT "Bad YEAR"))) (if (SETQ ITEM (LISTGET STATE (QUOTE LEADER))) then (SELECTQ (FM.ITEMPROP ITEM (QUOTE ID)) (LEADER-NO (push FMT (QUOTE NO.LEADING.SPACES))) (LEADER-YES NIL) (SHOULDNT "Bad LEADER")))) (RETURN (APPLY (FUNCTION DATEFORMAT) (DREVERSE FMT))))) ) (DATEFORMAT-EDITOR-PUT-STATE (LAMBDA (DFE DATEFORMAT) (* ; "Edited 29-Mar-88 14:17 by Koomen") (FM.RESETMENU DFE) (for FMT in (if (AND DATEFORMAT (EQ (CAR (LISTP DATEFORMAT)) (QUOTE DATEFORMAT))) then (CDR DATEFORMAT)) bind (DATE _ (QUOTE DATE-NORMAL)) (YEAR _ (QUOTE YEAR-SHORT)) (MONTH _ (QUOTE MONTH-SHORT)) (DAY _ (QUOTE DAY-NONE)) (LEADER _ (QUOTE LEADER-YES)) (TIME _ (QUOTE TIME-SECS)) (TIMEZONE _ (QUOTE TIMEZONE-NO)) do (SELECTQ FMT (NO.DATE (SETQ DATE (QUOTE DATE-NONE))) (NUMBER.OF.MONTH (SETQ MONTH (QUOTE MONTH-NUMERIC))) (MONTH.LEADING (SETQ DATE (QUOTE DATE-LEADING))) (MONTH.LONG (SETQ MONTH (QUOTE MONTH-LONG))) (YEAR.LONG (SETQ YEAR (QUOTE YEAR-LONG))) (SLASHES (SETQ DATE (QUOTE DATE-SLASHES))) (SPACES (SETQ DATE (QUOTE DATE-SPACES))) (NO.LEADING.SPACES (SETQ LEADER (QUOTE LEADER-NO))) (NO.TIME (SETQ TIME (QUOTE TIME-NONE))) (TIME.ZONE (SETQ TIMEZONE (QUOTE TIMEZONE-YES))) (NO.SECONDS (SETQ TIME (QUOTE TIME-MINS))) (DAY.OF.WEEK (OR (EQ DAY (QUOTE DAY-SHORT)) (SETQ DAY (QUOTE DAY-LONG)))) (DAY.SHORT (SETQ DAY (QUOTE DAY-SHORT))) (PROGN (* ; "???") NIL)) finally (if (AND DATE (SETQ DATE (FM.GETITEM DATE NIL DFE))) then (FM.CHANGESTATE (QUOTE DATE) DATE DFE)) (if (AND YEAR (SETQ YEAR (FM.GETITEM YEAR NIL DFE))) then (FM.CHANGESTATE (QUOTE YEAR) YEAR DFE)) (if (AND MONTH (SETQ MONTH (FM.GETITEM MONTH NIL DFE))) then (FM.CHANGESTATE (QUOTE MONTH) MONTH DFE)) (if (AND DAY (SETQ DAY (FM.GETITEM DAY NIL DFE))) then (FM.CHANGESTATE (QUOTE DAY) DAY DFE)) (if (AND LEADER (SETQ LEADER (FM.GETITEM LEADER NIL DFE))) then (FM.CHANGESTATE (QUOTE LEADER) LEADER DFE)) (if (AND TIME (SETQ TIME (FM.GETITEM TIME NIL DFE))) then (FM.CHANGESTATE (QUOTE TIME) TIME DFE)) (if (AND TIMEZONE (SETQ TIMEZONE (FM.GETITEM TIMEZONE NIL DFE))) then (FM.CHANGESTATE (QUOTE TIMEZONE) TIMEZONE DFE)))) ) (DATEFORMAT-EDITOR-SHOW-STATE (LAMBDA (DFE) (* ; "Edited 29-Mar-88 13:01 by Koomen") (LET ((PROMPTW (GETPROMPTWINDOW DFE)) (FORMAT (DATEFORMAT-EDITOR-GET-STATE DFE))) (CLEARW PROMPTW) (printout PROMPTW (GDATE $$DATEFORMAT-EDITOR-IDATE FORMAT)))) ) (DATEFORMAT-EDITOR-ABORTFN (LAMBDA (ITEM WINDOW BUTTONS) (* Koomen "30-Jan-87 23:43") (DATEFORMAT-EDITOR-STATUS WINDOW (QUOTE ABORT))) ) (DATEFORMAT-EDITOR-CLOSEFN (LAMBDA (WINDOW) (* Koomen "30-Jan-87 23:42") (if (EQ (DATEFORMAT-EDITOR-STATUS WINDOW) (QUOTE EDIT)) then (DATEFORMAT-EDITOR-STATUS WINDOW (QUOTE ABORT)))) ) (DATEFORMAT-EDITOR-GETDFLTFN (LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 29-Mar-88 13:08 by Koomen") (if (EQ (DATEFORMAT-EDITOR-STATUS WINDOW) (QUOTE EDIT)) then (DATEFORMAT-EDITOR-PUT-STATE WINDOW EDIT-DATEFORMAT-DEFAULT) (DATEFORMAT-EDITOR-SHOW-STATE WINDOW))) ) (DATEFORMAT-EDITOR-PUTDFLTFN (LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 29-Mar-88 13:16 by Koomen") (if (EQ (DATEFORMAT-EDITOR-STATUS WINDOW) (QUOTE EDIT)) then (SETQ EDIT-DATEFORMAT-DEFAULT (DATEFORMAT-EDITOR-GET-STATE WINDOW)))) ) (DATEFORMAT-EDITOR-QUITFN (LAMBDA (ITEM WINDOW BUTTONS) (* Koomen "30-Jan-87 23:44") (DATEFORMAT-EDITOR-STATUS WINDOW (QUOTE QUIT))) ) (DATEFORMAT-EDITOR-SHOWFN (LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 29-Mar-88 13:03 by Koomen") (if (EQ (DATEFORMAT-EDITOR-STATUS WINDOW) (QUOTE EDIT)) then (DATEFORMAT-EDITOR-SHOW-STATE WINDOW))) ) ) (RPAQQ $$DATEFORMAT-EDITOR-ITEMS (((TYPE MOMENTARY LABEL "Quit" FONT (GACHA 10 BOLD) SELECTEDFN DATEFORMAT-EDITOR-QUITFN MESSAGE "Stop editing, return current settings") (TYPE DISPLAY LABEL "") (TYPE MOMENTARY LABEL "Abort" FONT (GACHA 10 BOLD) SELECTEDFN DATEFORMAT-EDITOR-ABORTFN MESSAGE "Stop editing, ignore changes, return NIL") (TYPE DISPLAY LABEL " Default:") (TYPE MOMENTARY LABEL "Get" FONT (GACHA 10 BOLD) SELECTEDFN DATEFORMAT-EDITOR-GETDFLTFN MESSAGE "Use default settings") (TYPE MOMENTARY LABEL "Put" FONT (GACHA 10 BOLD) SELECTEDFN DATEFORMAT-EDITOR-PUTDFLTFN MESSAGE "Save settings as default") (TYPE DISPLAY LABEL "")) ((TYPE DISPLAY LABEL "")) ((TYPE DISPLAY LABEL "DATE: " FONT (GACHA 10 BOLD))) ((TYPE DISPLAY LABEL " Format: " FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION DATE ID DATE-NORMAL LABEL "dd-mon-yy" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION DATE ID DATE-SLASHES LABEL "dd/mon/yy" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION DATE ID DATE-NONE LABEL "none" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " ") (TYPE NWAY COLLECTION DATE ID DATE-SPACES LABEL "dd mon yy" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION DATE ID DATE-LEADING LABEL "mon dd, yy" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " Year: " FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION YEAR ID YEAR-LONG LABEL "long" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION YEAR ID YEAR-SHORT LABEL "short" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " Month: " FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION MONTH ID MONTH-LONG LABEL "long" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION MONTH ID MONTH-SHORT LABEL "short" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION MONTH ID MONTH-NUMERIC LABEL "numeric" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " Weekday:" FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION DAY ID DAY-LONG LABEL "long" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION DAY ID DAY-SHORT LABEL "short" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION DAY ID DAY-NONE LABEL "none" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " Spaces: " FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION LEADER ID LEADER-YES LABEL "yes" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION LEADER ID LEADER-NO LABEL "no" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL "")) ((TYPE DISPLAY LABEL "TIME:" FONT (GACHA 10 BOLD))) ((TYPE DISPLAY LABEL " Format: " FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION TIME ID TIME-SECS LABEL "hh:mm:ss" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION TIME ID TIME-MINS LABEL "hh:mm" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION TIME ID TIME-NONE LABEL "none" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)) ((TYPE DISPLAY LABEL " Time Zone:" FONT (GACHA 10 BOLD)) (TYPE NWAY COLLECTION TIMEZONE ID TIMEZONE-YES LABEL "yes" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN) (TYPE NWAY COLLECTION TIMEZONE ID TIMEZONE-NO LABEL "no" SELECTEDFN DATEFORMAT-EDITOR-SHOWFN)))) (RPAQ? DATEFORMAT-EDITOR-ITEMS (COPY $$DATEFORMAT-EDITOR-ITEMS)) (DECLARE%: DONTEVAL@LOAD DOCOPY (RPAQ $$DATEFORMAT-EDITOR (GET-DATEFORMAT-EDITOR)) (RPAQ $$DATEFORMAT-EDITOR-IDATE (IDATE " 1-Jan-88 23:56:41")) (COND ((NOT (GETD (QUOTE \OUTDATE-STRING))) (* ; "Get DATE extensions") (FILESLOAD (SYSLOAD) DATEPATCH))) ) (PUTPROPS DATEFORMAT-EDITOR MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10)) (PUTPROPS DATEFORMAT-EDITOR COPYRIGHT ("Johannes A. G. M. Koomen" 1987 1988 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2483 4408 (EDIT-DATEFORMAT 2493 . 3520) (GET-DATEFORMAT-EDITOR 3522 . 4406)) (4513 9803 (DATEFORMAT-EDITOR-STATUS 4523 . 4743) (DATEFORMAT-EDITOR-GET-STATE 4745 . 6551) ( DATEFORMAT-EDITOR-PUT-STATE 6553 . 8363) (DATEFORMAT-EDITOR-SHOW-STATE 8365 . 8616) ( DATEFORMAT-EDITOR-ABORTFN 8618 . 8758) (DATEFORMAT-EDITOR-CLOSEFN 8760 . 8949) ( DATEFORMAT-EDITOR-GETDFLTFN 8951 . 9218) (DATEFORMAT-EDITOR-PUTDFLTFN 9220 . 9456) ( DATEFORMAT-EDITOR-QUITFN 9458 . 9596) (DATEFORMAT-EDITOR-SHOWFN 9598 . 9801))))) STOP \ No newline at end of file diff --git a/lispusers/DATEFORMAT-EDITOR.TEDIT b/lispusers/DATEFORMAT-EDITOR.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..d15f4baa86f909c3813b8b2b7f18b96303763de7 GIT binary patch literal 12050 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 UIUiW(5H-UWPkxI<{`~F#1cVU*1poj5 literal 0 HcmV?d00001 diff --git a/lispusers/DATESORT b/lispusers/DATESORT new file mode 100644 index 00000000..da7945f2 --- /dev/null +++ b/lispusers/DATESORT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "25-Feb-88 18:29:26" |{NEWTON:EUROPARC:RX}LISP>DATESORT.;2| 9298 previous date%: "11-Jun-87 10:15:34" |{NEWTON:EUROPARC:RX}LISP>DATESORT.;1|) (* " Copyright (c) 1986, 1987, 1988 by XEROX Corporation. All rights reserved. ") (PRETTYCOMPRINT DATESORTCOMS) (RPAQQ DATESORTCOMS ((UGLYVARS RQIREADTABLE) (FNS DATESORTER COMPAREDATE COMPAREDATE2 FIXNAME GETRF GETFTS DATESORT GETDATE GETINFORMATION CORRECTDATE MAKEFINALFILE) (ADDVARS (BackgroundMenuCommands ("Date Sorter" '(DATESORTER) "Sort a Mail file by date"))) (VARS (BackgroundMenu) (DEFAULTDATESORT NIL)))) (READVAR-FROM-STRING 'RQIREADTABLE "{D(9 10 11 25 31 32 39 44 63 96 124)OTHER OTHER SEPRCHAR (MACRO FIRST (LAMBDA (FILE RDTBL) (EVAL (READ FILE RDTBL)))) OTHER OTHER (MACRO FIRST READ') (MACRO FIRST READBQUOTECOMMA) (INFIX FIRST NOESCQUOTE DO?) (MACRO FIRST READBQUOTE) (INFIX ALWAYS READVBAR) } ") (DEFINEQ (DATESORTER [LAMBDA NIL (* edited%: "28-Jan-86 11:24") (ADD.PROCESS '(DATESORT) 'NAME 'DATESORTER 'INFOHOOK '(PROMPTPRINT "This is the Mail Date Sorter process" "Killing this process may leave open files, so make sure to close them" " and erase the files in {CORE}"]) (COMPAREDATE [LAMBDA (A B) (* edited%: "21-Jan-86 15:57") (PROG NIL (RETURN (OR (NOT (IDATE (CAR B))) (AND (IDATE (CAR A)) (ILESSP (IDATE (CAR A)) (IDATE (CAR B]) (COMPAREDATE2 [LAMBDA (A B) (* edited%: "23-Jan-86 17:45") (PROG NIL (RETURN (OR (NOT (IDATE (CAR A))) (AND (IDATE (CAR B)) (ILESSP (IDATE (CAR A)) (IDATE (CAR B]) (FIXNAME [LAMBDA (NAMETOFIX RVFLG) (* edited%: "23-Jan-86 14:43") (PROG NIL (RETURN (PACKFILENAME (if (MEMB 'EXTENSION (UNPACKFILENAME NAMETOFIX)) then [if RVFLG then (UNPACKFILENAME NAMETOFIX) else (for X in (UNPACKFILENAME NAMETOFIX) collect X until (EQUAL X 'VERSION] else (if RVFLG then (APPEND (UNPACKFILENAME NAMETOFIX) '(EXTENSION MAIL)) else (for X in (APPEND (UNPACKFILENAME NAMETOFIX) '(EXTENSION MAIL)) collect X until (EQUAL X 'VERSION]) (GETRF [LAMBDA (RF FTS) (* edited%: "23-Jan-86 15:04") (PROG NIL (SETQ FTS (FULLNAME (FIXNAME FTS) 'NEW)) (if (NOT RF) then (SETQ RF (MKATOM (PROMPTFORWORD "Enter name of resulting file: " FTS))) (TERPRI T)) (if [AND RF (SETQ RF (FULLNAME (FIXNAME RF) 'NEW] then (RETURN RF) else (RETURN]) (GETFTS [LAMBDA (FTS) (* edited%: "23-Jan-86 15:05") (PROG NIL (if (NOT FTS) then (SETQ FTS (MKATOM (PROMPTFORWORD "Enter name of file to be sorted: "))) (TERPRI T)) (if [AND FTS (SETQ FTS (FULLNAME (FIXNAME FTS T] then (RETURN FTS) else (RETURN]) (DATESORT [LAMBDA (FILETOSORT SORTEDFILE) (* edited%: "23-Jan-86 17:48") (PROG (COREFILE FILEINFO RESULTS) (CLRPROMPT) (* Code to check the filenames and  error if problems!!) (if (SETQ FILETOSORT (GETFTS FILETOSORT)) then (if (NOT (SETQ SORTEDFILE (GETRF SORTEDFILE FILETOSORT))) then (PRINTOUT PROMPTWINDOW "Error, no file to sort to ...aborted!" T) (FLASHWINDOW) (RETURN (CLOSEW T))) else (PRINTOUT PROMPTWINDOW "Error, no file to sort or file not found " FILETOSORT " ...aborted!" T) (FLASHWINDOW) (RETURN (CLOSEW T))) (* Error on file being open -  FATAL) (if (OPENP FILETOSORT) then (PRINTOUT PROMPTWINDOW "File to be sorted is already open ...aborted" T) (FLASHWINDOW) (RETURN (CLOSEW T))) (PRINTOUT T "Working ..." T) (SETQ COREFILE (COPYFILE FILETOSORT '{CORE}DATESORT.SCRATCH)) (SETQ COREFILE (OPENSTREAM COREFILE 'INPUT 'OLD)) (SETQ FILEINFO (GETINFORMATION COREFILE)) (CLOSEF COREFILE) (DELFILE COREFILE) (if DEFAULTDATESORT then (SORT FILEINFO 'COMPAREDATE) else (SORT FILEINFO 'COMPAREDATE2)) (BLOCK) (SETQ RESULTS (MAKEFINALFILE FILETOSORT SORTEDFILE FILEINFO)) (if RESULTS then (PRINTOUT PROMPTWINDOW " Messages sorted" T) (FLASHWINDOW PROMPTWINDOW) (CLOSEW T) (RETURN SORTEDFILE) else (PRINTOUT PROMPTWINDOW "Errors...") (FLASHWINDOW) (CLOSEW T) (RETURN "Errors..."]) (GETDATE [LAMBDA (GDFIL GDBEG GDNEXT) (* edited%: "22-Jan-86 10:25") (PROG NIL (SETFILEPTR GDFIL (FFILEPOS "DATE: " GDFIL GDBEG GDNEXT NIL NIL UPPERCASEARRAY)) (RSTRING GDFIL) (RETURN (RSTRING GDFIL RQIREADTABLE]) (GETINFORMATION [LAMBDA (SFIL) (* edited%: "23-Jan-86 17:20") (* Will return a list consisting of the Message number and the information  about it.) (PROG ((CURRENTSTART (FFILEPOS "*start*" SFIL 0)) (NEXTSTART 0) (MSGCOUNT 0) INFO) (repeatwhile (SETQ CURRENTSTART NEXTSTART) do (SETQ NEXTSTART (FFILEPOS "*start*" SFIL (ADD1 CURRENTSTART))) [SETQ INFO (APPEND INFO (LIST (LIST (GETDATE SFIL CURRENTSTART NEXTSTART) CURRENTSTART NEXTSTART] (BLOCK)) [SETQ INFO (for X in INFO collect (APPEND (LIST (CORRECTDATE (CAR X))) (CDR X] (* fixes bug when a date is of the form Wed 16 Dec...) (RETURN INFO]) (CORRECTDATE [LAMBDA (DATETOFIX) (* edited%: "22-Jan-86 09:52") (PROG (TEMP) (if (IDATE DATETOFIX) then (RETURN DATETOFIX) else (SETQ TEMP (GNC DATETOFIX)) (until (NUMBERP TEMP) do (SETQ TEMP (GNC DATETOFIX))) (RETURN (CONCAT TEMP DATETOFIX]) (MAKEFINALFILE [LAMBDA (FROMFILE TOFILE DATESLIST) (* edited%: "23-Jan-86 17:27") (PROG (ENDOFMSG) (if (OR (OPENP FROMFILE) (OPENP TOFILE)) then (PRINTOUT PROMPTWINDOW "File open in conflicting way ... aborted" T) (FLASHWINDOW) (RETURN)) (SETQ FROMFILE (OPENSTREAM FROMFILE 'INPUT 'OLD)) (SETQ TOFILE (OPENSTREAM TOFILE 'OUTPUT 'NEW)) (for X in DATESLIST do (if (SETQ ENDOFMSG (CADDR X)) then (COPYBYTES FROMFILE TOFILE (CADR X) ENDOFMSG) else (COPYBYTES FROMFILE TOFILE (CADR X) (GETEOFPTR FROMFILE))) (BLOCK)) (CLOSEF TOFILE) (CLOSEF FROMFILE) (RETURN TOFILE]) ) (ADDTOVAR BackgroundMenuCommands ("Date Sorter" '(DATESORTER) "Sort a Mail file by date")) (RPAQQ BackgroundMenu NIL) (RPAQQ DEFAULTDATESORT NIL) (PUTPROPS DATESORT COPYRIGHT ("XEROX Corporation" 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1178 9047 (DATESORTER 1188 . 1685) (COMPAREDATE 1687 . 2005) (COMPAREDATE2 2007 . 2326) (FIXNAME 2328 . 3366) (GETRF 3368 . 3899) (GETFTS 3901 . 4314) (DATESORT 4316 . 6418) (GETDATE 6420 . 6711) (GETINFORMATION 6713 . 7676) (CORRECTDATE 7678 . 8067) (MAKEFINALFILE 8069 . 9045))))) STOP \ No newline at end of file diff --git a/lispusers/DATESORT.TEDIT b/lispusers/DATESORT.TEDIT new file mode 100644 index 00000000..0bca4dd0 --- /dev/null +++ b/lispusers/DATESORT.TEDIT @@ -0,0 +1 @@ +DATESORT [Internal Lafite Utility] Datesort places an item on the background menu. When selected you will be prompted for the name of a Lafite Mail folder to be sorted, and the name of a new resulting sorted folder. The folder messages will then be sorted in ascending order on their "Date:" fields (this takes some time). \ No newline at end of file diff --git a/lispusers/DEBUGGER-CONTEXT b/lispusers/DEBUGGER-CONTEXT new file mode 100644 index 00000000..5e8a2265 --- /dev/null +++ b/lispusers/DEBUGGER-CONTEXT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL-USER") (il:filecreated "14-Aug-87 17:09:50" il:{qv}convert>debugger-context.\;2 il:|changes| il:|to:| (il:commands "unlex") (il:functions open-lex-env init-debugger-context lex-eval-input) (il:vars il:debugger-contextcoms) il:|previous| il:|date:| "10-Aug-87 13:19:47" il:{qv}tools>lex-tool.\;1) ; Copyright (c) 1987 by Xerox Corporation. All rights reserved. (il:prettycomprint il:debugger-contextcoms) (il:rpaqq il:debugger-contextcoms ( (il:* il:|;;;| "Debugger-Context -- fix the Xerox Lisp debugger so that you can work with lexically-defined functions, variables, blocks, and tag-bodies sensibly.") (il:* il:|;;;| "Written out of frustration by Herb Jellinek, 13-Aug-87.") (il:functions init-debugger-context lex-do-event open-lex-env) (il:variables xcl::*environment*) (il:p (init-debugger-context)) (il:commands "lex" "unlex") (il:prop il:makefile-environment il:debugger-context))) (il:* il:|;;;| "Debugger-Context -- fix the Xerox Lisp debugger so that you can work with lexically-defined functions, variables, blocks, and tag-bodies sensibly." ) (il:* il:|;;;| "Written out of frustration by Herb Jellinek, 13-Aug-87.") (defun init-debugger-context nil "Set things up for the DEBUGGER-CONTEXT hack" (undoably (setf *per-exec-variables* (il:* il:\;  "cause *environment* to be bound to nil in each executive.") (acons 'xcl::*environment* nil *per-exec-variables*) ) (il:* il:\;  "\"advise\" do-event to look at *environment* for its env.") (unless (fboundp 'old-do-event) (setf (symbol-function 'old-do-event) (symbol-function 'il:do-event)) (setf (symbol-function 'il:do-event) (symbol-function 'lex-do-event))))) (defun lex-do-event (original-input env &optional (fn nil function-p)) "Replacement for the executive's old DO-EVENT function." (if function-p (old-do-event original-input (or env xcl::*environment*) fn) (old-do-event original-input (or env xcl::*environment*)))) (defun open-lex-env nil "Finds the 'current' lex env and makes this debugger instance use it" (let ((frame-vars (il:stkargs il:lastpos))) (declare (special il:lastpos)) (dolist (value frame-vars (format t ";; ? found no lexical environment") ) (if (il:environment-p value) (progn (setq xcl::*environment* value) (format t ";; set lexical environment") (return)))))) (defvar xcl::*environment* nil) (init-debugger-context) (defcommand ("lex" :debugger) nil "Sets the debugger's lexical environment to that of the selected frame" (open-lex-env) (il:* il:\; "") (values)) (defcommand ("unlex" :debugger) nil "Unsets the lexical environment in the debugger" (setq xcl::*environment* nil) (format t ";; unset lexical environment") (values)) (il:putprops il:debugger-context il:makefile-environment (:readtable "XCL" :package "XCL-USER")) (il:putprops il:debugger-context il:copyright ("Xerox Corporation" 1987)) il:stop \ No newline at end of file diff --git a/lispusers/DECL b/lispusers/DECL new file mode 100644 index 00000000..f906482a --- /dev/null +++ b/lispusers/DECL @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 3-Nov-87 13:42:29" {QV}PARSER>LYRIC>DECL.;2 159700 changes to%: (FNS *DECLMAC) previous date%: "23-Feb-87 13:22:27" {QV}PARSER>LYRIC>DECL.;1) (* " Copyright (c) 1983, 1984, 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DECLCOMS) (RPAQQ DECLCOMS [(* DECLTYPE machinery, declaration translator, and declaration enforcer) (LOCALVARS . T) (GLOBALVARS FILEPKGFLG CLISPCHANGE CLISPARRAY DWIMESSGAG NOSPELLFLG MSDATABASELST DECLTYPESARRAY COMMENTFLG CLISPCHARS DECLATOMS LCASEFLG DECLMESSAGES CLISPRETRANFLG) (E (RESETSAVE CLISPIFYPRETTYFLG NIL) (RESETSAVE PRETTYPRINTMACROS (APPEND '((DECL . QUOTE) (DPROGN . QUOTE) (DLAMBDA . QUOTE) (DPROG . QUOTE)) PRETTYPRINTMACROS))) (COMS (* Interface to file package) (FNS DECLTYPE DECLTYPES DUMPDECLTYPES GETDECLDEF) (FILEPKGCOMS DECLTYPES IGNOREDECL) (PROP ARGNAMES DECLTYPE)) (* User functions) (FNS COVERS GETDECLTYPEPROP SETDECLTYPEPROP SUBTYPES SUPERTYPES) (MACROS SELCOVERSQ SELTYPEQ) (ALISTS (PRETTYEQUIVLST SELCOVERSQ SELTYPEQ) (DWIMEQUIVLST SELCOVERSQ SELTYPEQ)) [P (SETSYNONYM '(THE TYPE) '(AS A TYPE] (* Internal machinery) (DECLARE%: DONTCOPY (RECORDS TYPEBLOCK TYPEDEF) (ALISTS (PRETTYPRINTYPEMACROS TYPEBLOCK))) (INITRECORDS TYPEBLOCK) (P (DEFPRINT 'TYPEBLOCK 'TBDEFPRINT)) (FNS CHECKTYPEXP COLLECTTYPES COVERSCTYPE COVERSTB COVERSTE CREATEFNPROP CREATEFNVAL DECLERROR DELETETB FINDDECLTYPE FINDPROP FINDTYPEXP GETCTYPE GETDECLTYPE GETDECLTYPE.NOERROR GETTBPROP INHERITPROP INITDECLTYPES LCCTYPE LCC2 MAKECTYPE MAKEDECLTYPE MAKEBINDFN MAKESETFN MAPTYPEUSERS NOTICETB PPDTYPE RECDTYPE DECLCHANGERECORD RECDEFTYPE REPROPTB SETTBPROP TBDEFPRINT TETYPE TYPEMSANAL TYPEMSANAL1 UNCOMPLETE UNSAVETYPE USERDECLTYPE USESTYPE) (BLOCKS (LCCTYPE LCCTYPE LCC2) (TYPEMSANAL TYPEMSANAL TYPEMSANAL1)) (* Test fn creation block) (FNS MAKETESTFN MAKETESTFNBLOCK COMBINE.TESTS FUNIFY MKNTHCAR MKNTHCDR OF.TESTFN TUPLE.TESTFN WHOSE.TESTFN) (BLOCKS (MAKETESTFNBLOCK MAKETESTFNBLOCK COMBINE.TESTS FUNIFY MKNTHCAR MKNTHCDR OF.TESTFN TUPLE.TESTFN WHOSE.TESTFN)) (* Machinery to compile recursive testfns) (FILES (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) LABEL) (* Idioms. Expressed as macros for now) (DECLARE%: DONTCOPY EVAL@COMPILE (VARS DefaultBindFn DefaultSetFn) (ADDVARS (NLAMA MAKEDECLTYPEQ)) (MACROS ANYC DECLVARERROR DTYPENAME foreachTB GETCGETD KWOTEBOX LAMBIND LAMVAL MAKEDECLTYPEQ NONEC TESTFORM) (FNS TESTFORM) (ADDVARS (DONTCOMPILEFNS TESTFORM)) (TEMPLATES foreachTB MAKEDECLTYPEQ)) (* Runtime utility functions) (FNS EVERYCHAR LARGEP DECLRECURSING SMASHCAR) (DECLARE%: EVAL@COMPILE (MACROS LARGEP)) (DECLARE%: DONTCOPY EVAL@COMPILE (MACROS SMASHCAR)) (* translator of dprogs and dlambdas) (FNS ASSERT ASSERTFAULT ASSERTMAC \*DECL *DECLMAC \CHKINIT CHKINITMAC DECLCONSTANTP DD DECLCLISPTRAN DECLMSG DECLDWIMERROR DECLDWIMTESTFN DECLSET DECLSETQ DECLSETQQ DECLTRAN DECLVAR DLAMARGLIST DTYPE?TRAN EDITNEWSATLIST FORMUSESTB IGNOREDECL MAKETESTFORM PPDECL PPVARLIST SETQMAC THETRAN VALUEERROR \VARASRT VARASRT1 VARSETFN) (BLOCKS (DECLTRAN DECLTRAN DECLVAR) (PPDECL PPDECL PPVARLIST) (\VARASRT \VARASRT VARASRT1)) (* Declaration database fns) (FNS DECLOF DECLOF1 TBOF TYPEBLOCKOF VARDECL) (BLOCKS (DECLOFBLK DECLOF DECLOF1 TBOF TYPEBLOCKOF VARDECL (ENTRIES DECLOF TYPEBLOCKOF))) (* Enabling and disabling fns) (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS FNEQUIVS) (MACROS MOVEPROP PUTIFPROP)) (FNS STARTDECLS DODECLS) (FILES (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) LAMBDATRAN) (DECLARE%: EVAL@COMPILE (FILES (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) SIMPLIFY)) [DECLARE%: EVAL@COMPILE DONTCOPY (* the old NOBOX code.) (FNS IBOX FBOX NBOX) (P (MOVD? 'LIST 'LBOX) (MOVD? 'CONS 'CBOX)) (RECORDS FBOX IBOX) (MACROS IBOX FBOX NBOX) (MACROS CBOX LBOX) (I.S.OPRS scratchcollect) (ADDVARS (SYSLOCALVARS $$SCCONS $$SCPTR) (INVISIBLEVARS $$SCCONS $$SCPTR)) (* Definition of WITH. From WITH.) (MACROS WITH) (TEMPLATES WITH) (P (REMPROP 'WITH 'CLISPWORD) (ADDTOVAR DWIMEQUIVLST (WITH . PROG)) (ADDTOVAR PRETTYEQUIVLST (WITH . PROG] [DECLARE%: DOCOPY (DECLARE%: EVAL@LOADWHEN (NEQ (SYSTEMTYPE) 'D) (P (OR (GETPROP 'LOADTIMECONSTANT 'FILEDATES) (PROG ((X (FINDFILE (PACKFILENAME 'NAME 'LOADTIMECONSTANT 'EXTENSION COMPILE.EXT) T LISPUSERSDIRECTORIES))) (COND (X (LOAD X 'SYSLOAD)) ((NOT (GETPROP 'LOADTIMECONSTANT 'MACRO)) (PUTPROP 'LOADTIMECONSTANT 'MACRO '((FORM) (CONSTANT FORM] (ADDVARS (OPENFNS \DECLPROGN \CHKVAL \CHKINIT ASSERT \*DECL \VARASRT)) (PROP CLISPWORD DPROG DPROGN THE the) (PROP INFO DLAMBDA DPROG DPROGN) (VARS (SATISFIESLIST) (CSATISFIESLIST) (NEWSATLIST T)) (INITVARS (DECLMESSAGES) (COMPILEIGNOREDECL)) [ADDVARS (DECLATOMS DLAMBDA DPROG DPROGN) (LAMBDASPLST DLAMBDA) (SYSLOCALVARS VALUE) [DESCRIBELST ("types: " (GETRELATION FN '(USE TYPE] (BAKTRACELST (\DECLPROGN (DPROGN APPLY *PROG*LAM \*DECL *ENV*) (NIL APPLY *PROG*LAM \*DECL)) (PROG (DPROG \DECLPROGN APPLY *PROG*LAM \*DECL)] (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS SLISTENTRY VARDECL)) (ALISTS (LAMBDATRANFNS DLAMBDA)) [DECLARE%: DONTEVAL@LOAD (E (* Declare is so PRETTYPRINTMACROS don't get set up during LOADFROM, when PPDECL is not being defined. Don't use ALIST for print macros cause entries are removed while DECL is being dumped)) (ADDVARS (PRETTYPRINTMACROS (DPROGN . PPDECL) (DECL . PPDECL) (DLAMBDA . PPDECL) (DPROG . PPDECL] (PROP INFO ASSERT) (MACROS ASSERT .CBIND. \CHKINIT \CHKVAL \*DECL DECL DECLMSGMAC REALSETQ) (* MACROS REALSET) [P (AND (GETD 'STARTDECLS) (STARTDECLS)) (PROG [(COM (CDR (ASSOC 'DW EDITMACROS] (AND COM (RPLACD COM (CONS (APPEND '(RESETVAR NEWSATLIST (EDITNEWSATLIST)) (CDR COM] (* Builtin DECLOF properties) (PROP DECLOF APPEND CONS EQ LIST LISTP NCONC) [DECLARE%: EVAL@COMPILE DONTCOPY (P (RESETSAVE DWIMIFYCOMPFLG NIL) (AND (GETD 'DODECLS) (RESETSAVE (DODECLS) '(DODECLS T] (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA DECLSETQ DECLMSG DD \CHKINIT \*DECL ASSERT DECLTYPES DECLTYPE) (NLAML DECLSETQQ TYPEMSANAL) (LAMA DECLDWIMERROR]) (* DECLTYPE machinery, declaration translator, and declaration enforcer) (DECLARE%: DOEVAL@COMPILE DONTCOPY (LOCALVARS . T) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS FILEPKGFLG CLISPCHANGE CLISPARRAY DWIMESSGAG NOSPELLFLG MSDATABASELST DECLTYPESARRAY COMMENTFLG CLISPCHARS DECLATOMS LCASEFLG DECLMESSAGES CLISPRETRANFLG) ) (* Interface to file package) (DEFINEQ (DECLTYPE [NLAMBDA X (* bas%: " 7-NOV-79 16:22") (USERDECLTYPE (CAR X) (CADR X) (CDDR X]) (DECLTYPES [NLAMBDA DTS (* bas%: " 7-NOV-79 16:24") (* Defines a list of decltypes) (for D in DTS collect (USERDECLTYPE (CAR D) (CADR D) (CDDR D]) (DUMPDECLTYPES [LAMBDA (TL) (* rmk%: " 7-SEP-81 04:50") (WITH [[TWOFLG (OR (NLISTP TL) (LISTP (CDR TL] (FFLG (NEQ T (OUTPUT] (* Don't do the plural and extra parens if only one, and don't do the  EVAL@COMPILE stuff if going to T=SHOWDEF) (if FFLG then (printout NIL T "(DECLARE: EVAL@COMPILE" T T)) (printout NIL (if TWOFLG then "(DECLTYPES" else "(DECLTYPE ")) (for D in TL do (if TWOFLG then (printout NIL 11 "(")) [if (LISTP D) then (printout NIL |.P2| (CAR D) %, |.P2| (CAR D) %, |.P2| (CADR D) %, .PPV (GETDECLTYPEPROP (CAR D) (CADR D))) else [SETQ D (CDR (GETDECLDEF D NIL 'NOCOPY] (printout NIL |.P2| (CAR D) %,) (for TAIL (POS _ (POSITION)) on (CDDR D) by (CDDR TAIL) first (PRINTDEF (CADR D) POS) do (printout NIL .TAB POS |.P2| (CAR TAIL) %, .PPF (CADR TAIL] (if TWOFLG then (printout NIL ")"))) (printout NIL ")" T) (if FFLG then (printout NIL ")" T]) (GETDECLDEF [LAMBDA (NAME FPTYPE OPTIONS) (* bas%: " 9-OCT-79 23:04") (* This is the GETDEF function for DECLTYPE.  FPTYPE is the file-package-type argument, which we ignore.) (WITH ((TB (FINDDECLTYPE NAME)) (NOCOPYP (EQMEMB 'NOCOPY OPTIONS))) (if TB then [CONS 'DECLTYPE (CONS NAME (CONS (WITH ((TE (fetch TYPEXP of TB))) (if NOCOPYP then TE else (COPY TE))) (WITH ((TP (fetch PROPS of TB))) (if NOCOPYP then TP else (COPY TP] elseif (EQMEMB 'NOERROR OPTIONS) then NIL else (DECLERROR NAME "is not a DECLTYPE"]) ) (PUTDEF (QUOTE DECLTYPES) (QUOTE FILEPKGCOMS) '[[COM MACRO (X (E (DUMPDECLTYPES 'X] (TYPE DESCRIPTION "type declarations" GETDEF GETDECLDEF DELDEF (LAMBDA (NAME) (DELETETB (OR (FINDDECLTYPE NAME) (DECLERROR "Can't delete non-existent type:" NAME]) (PUTDEF (QUOTE IGNOREDECL) (QUOTE FILEPKGCOMS) '[(COM MACRO (X (DECLARE%: DOEVAL@COMPILE DONTEVAL@LOAD DONTCOPY (P (RESETSAVE COMPILEIGNOREDECL 'X]) (PUTPROPS DECLTYPE ARGNAMES (NIL (NAME TYPE PROP1 VAL1 |...|) . X)) (* User functions) (DEFINEQ (COVERS [LAMBDA (HI LO) (* bas%: "16-OCT-79 11:22") (AND (COVERSTB (GETDECLTYPE HI) (GETDECLTYPE LO)) T]) (GETDECLTYPEPROP [LAMBDA (TYPE PROP) (* bas%: " 9-OCT-79 22:56") (GETTBPROP (GETDECLTYPE TYPE) PROP]) (SETDECLTYPEPROP [LAMBDA (NAME PROP VAL) (* rmk%: " 2-AUG-81 08:41") (OR (LITATOM NAME) (DECLERROR "Can't set property of non-atomic type:" NAME)) (REPROPTB (OR (FINDDECLTYPE NAME) (DECLERROR "Can't set property of non-existent type:" NAME)) (LIST PROP VAL)) (MARKASCHANGED (LIST NAME PROP) 'DECLTYPES) VAL]) (SUBTYPES [LAMBDA (NAME) (* bas%: "16-OCT-79 18:59") (PROG (TYPES CT (BT (GETDECLTYPE NAME))) (DECLARE (SPECVARS TYPES CT)) (SETQ CT (GETCTYPE BT)) (if (NONEC CT) elseif (EQ (CAR (fetch TYPEXP of BT)) 'ONEOF) then [RETURN (APPEND (CDR (fetch TYPEXP of BT] else [foreachTB S (AND (LITATOM (fetch NAME of S)) (FMEMB CT (GETCTYPE S)) (push TYPES (fetch NAME of S] (RETURN (OR TYPES (LIST 'NONE]) (SUPERTYPES [LAMBDA (NAME) (* bas%: "16-OCT-79 18:20") (PROG (TYPES (CN (GETCGETD NAME))) (DECLARE (SPECVARS TYPES CN)) [if (ANYC CN) then NIL else (foreachTB TB (AND (LITATOM (fetch NAME of TB)) (if (NONEC CN) then (* Very expensive, but kinda wierd) (NULL (SUBTYPES (fetch NAME of TB))) else (* Any sups will be complete so we dont need to complete here) (FMEMB (fetch CTYPE of (fetch DEF of TB)) CN)) (push TYPES (fetch NAME of TB] (RETURN TYPES]) ) (DECLARE%: EVAL@COMPILE [PUTPROPS SELCOVERSQ MACRO (F (LIST [LIST 'LAMBDA '($$TMP) (CONS 'COND (MAPLIST (CDR F) (FUNCTION (LAMBDA (I) (COND ((CDR I) (CONS (LIST 'COVERS (KWOTE (CAAR I)) '$$TMP) (CDAR I))) (T (LIST T (CAR I] (LIST 'DECLOF (CAR F] [PUTPROPS SELTYPEQ MACRO (F (APPLYFORM [LIST 'LAMBDA '($$TMP) (CONS 'COND (MAPLIST (CDR F) (FUNCTION (LAMBDA (I) (COND ((CDR I) (CONS (LIST 'TYPE? (CAAR I) '$$TMP) (CDAR I))) (T (LIST T (CAR I] (CAR F] ) (ADDTOVAR PRETTYEQUIVLST (SELCOVERSQ . SELECTQ) (SELTYPEQ . SELECTQ)) (ADDTOVAR DWIMEQUIVLST (SELCOVERSQ . SELECTQ) (SELTYPEQ . SELECTQ)) (SETSYNONYM '(THE TYPE) '(AS A TYPE)) (* Internal machinery) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (DATATYPE TYPEBLOCK (NAME DEF BF SF TF PROPS) [ACCESSFNS TYPEBLOCK ([TYPEXP (fetch TEXP of (fetch DEF of DATUM)) (replace DEF of DATUM with (create TYPEDEF TEXP _ (COPY NEWVALUE] (BINDFN (OR (fetch BF of DATUM) (MAKEBINDFN DATUM)) (replace BF of DATUM with NEWVALUE)) (SETFN (OR (fetch SF of DATUM) (MAKESETFN DATUM)) (replace SF of DATUM with NEWVALUE)) (TESTFN (OR (fetch TF of DATUM) (MAKETESTFN DATUM)) (replace TF of DATUM with NEWVALUE] [CCREATE (PROGN (OR (FASSOC 'NAME FIELDS.IN.CREATE) (HELP "No NAME field in TYPEBLOCK create")) (OR (FASSOC 'TYPEXP FIELDS.IN.CREATE) (FASSOC 'DEF FIELDS.IN.CREATE) (HELP "No type expression in TYPEBLOCK create")) (LIST 'NOTICETB 'DATUM (CADR (FASSOC 'NAME FIELDS.IN.CREATE] (SYSTEM)) (RECORD TYPEDEF (TEXP . CTYPE)) ) (/DECLAREDATATYPE 'TYPEBLOCK '(POINTER POINTER POINTER POINTER POINTER POINTER) '((TYPEBLOCK 0 POINTER) (TYPEBLOCK 2 POINTER) (TYPEBLOCK 4 POINTER) (TYPEBLOCK 6 POINTER) (TYPEBLOCK 8 POINTER) (TYPEBLOCK 10 POINTER)) '12) (ADDTOVAR PRETTYPRINTYPEMACROS (TYPEBLOCK . PPDTYPE)) ) (/DECLAREDATATYPE 'TYPEBLOCK '(POINTER POINTER POINTER POINTER POINTER POINTER) '((TYPEBLOCK 0 POINTER) (TYPEBLOCK 2 POINTER) (TYPEBLOCK 4 POINTER) (TYPEBLOCK 6 POINTER) (TYPEBLOCK 8 POINTER) (TYPEBLOCK 10 POINTER)) '12) (DEFPRINT 'TYPEBLOCK 'TBDEFPRINT) (DEFINEQ (CHECKTYPEXP [LAMBDA (TE) (* bas%: "18-OCT-79 16:58") (* Checks that a type expression is  structurally valid) (OR (TETYPE TE) (DECLERROR "Invalid type expression" TE]) (COLLECTTYPES [LAMBDA (TYPES MERGE) (* bas%: " 9-OCT-79 22:53") (* Converts a list of type names into a list of typeblocks merging together  those that lie on the same sup-sub chain to the highest or lowest member of  that chain as specified by MERGE) (for SCR I VAL in TYPES eachtime (SETQ I (GETDECLTYPE SCR)) unless [for J in VAL thereis (OR (EQ I J) (SELECTQ MERGE (UP (COVERSTB J I)) (DOWN (COVERSTB I J)) (SHOULDNT] do (SETQ VAL (CONS I VAL)) (* Add to VAL unless dominated by an already existing entry) finally (* Walk back down list throwing out anything that is dominated by a subsequent  addition) (SETQ SCR VAL) (SETQ VAL NIL) [while SCR do (SETQ SCR (PROG1 (CDR SCR) (if (for J in VAL never (SELECTQ MERGE (UP (COVERSTB J (CAR SCR))) (DOWN (COVERSTB (CAR SCR) J)) (SHOULDNT))) then (RPLACD SCR VAL) (SETQ VAL SCR] (RETURN VAL]) (COVERSCTYPE [LAMBDA (H L) (* bas%: "11-OCT-79 11:35") (* COVERS for CTYPEs) (PROG NIL (* We use a PROG so we can chase singleton supertypes which are the common case  by looping rather than recursion.) LP (if (EQ H L) then (RETURN T) elseif (NLISTP L) then (RETURN (NONEC L)) (* Either we had NONE to start or we have arrived at ANY) elseif (CDR L) then (RETURN (for I in L thereis (COVERSCTYPE H I))) else (SETQ L (CAR L)) (* Single supertype) (GO LP]) (COVERSTB [LAMBDA (H L) (* bas%: "19-OCT-79 17:40") (* COVERS for type blocks. COVERSTE gets some cases that are difficult from the  lattice.) (OR (EQ H L) (COVERSCTYPE (GETCTYPE H) (GETCTYPE L)) (COVERSTE (fetch TYPEXP of H) (fetch TYPEXP of L]) (COVERSTE [LAMBDA (H L) (* bas%: "31-OCT-79 14:34") (* COVERS for type expressions. We pick off MEMQ and ONEOFs here because they  cannot be efficiently linked into the type lattice.) (SELECTQ (TETYPE H) (ONEOF (SELECTQ (TETYPE L) (ONEOF (for I in (CDR L) always (for J in (CDR H) thereis (COVERS J I)))) (for I in (CDR H) thereis (COVERS I L)))) (MEMQ (SELECTQ (TETYPE L) (MEMQ (for I in (CDR L) always (MEMBER I (CDR H)))) NIL)) NIL]) (CREATEFNPROP [LAMBDA (PL PN) (* bas%: " 7-NOV-79 16:51") (* If a value for prop PN appears on PL, CREATEFNVAL it.  NIL will indicate that no specification has yet been made.) (WITH ((PE (FINDPROP PL PN))) (AND PE (CREATEFNVAL (CADR PE) PN]) (CREATEFNVAL [LAMBDA (FVAL FNAME) (* bas%: " 7-NOV-79 16:53") (* Gets given a purported FNVAL. If that value is NIL, use the default.  Dwimify a list value.) (DECLARE (USEDFREE DWIMFLG)) (if FVAL then (AND DWIMFLG (LISTP FVAL) (DWIMIFY FVAL T)) FVAL else (SELECTQ FNAME (BINDFN (CONSTANT DefaultBindFn)) (SETFN (CONSTANT DefaultSetFn)) NIL]) (DECLERROR [LAMBDA (MSG1 MSG2) (* bas%: "25-NOV-78 18:25") (if (BOUNDP 'DECLERROR) then (SETQ DECLERROR T) (ERROR!) else (ERROR MSG1 MSG2]) (DELETETB [LAMBDA (TB) (* rmk%: "19-AUG-81 00:15") (* Dissasociates TB from its name and undoes any dependencies on it) (WITH ((NAME (fetch NAME of TB))) (SELECTQ NAME ((ANY NONE) (DECLERROR "(Futile) attempt to delete" NAME)) NIL) (UNSAVETYPE TB) (* Unsave dependent code) (UNCOMPLETE TB) (* Undo the cached values and  dependent types) (NOTICETB NIL NAME) (* Snap name association) (replace NAME of TB with (PACK* 'Deleted NAME]) (FINDDECLTYPE [LAMBDA (TE) (* bas%: "10-OCT-79 01:46") (* Finds the existing typeblock for a type expression if any) (COND ((LISTP TE) (* TE must be in CLISPARRAY to detect edits of the type expression) (AND (GETHASH TE CLISPARRAY) (GETHASH TE DECLTYPESARRAY))) (T (OR (GETHASH TE DECLTYPESARRAY) (RECDTYPE TE]) (FINDPROP [LAMBDA (L P) (* rmk%: "12-Mar-85 08:56") (for TAIL on L by (CDR (LISTP (CDR TAIL))) thereis (EQ P (CAR TAIL]) (FINDTYPEXP [LAMBDA (TYPE) (* bas%: "16-OCT-79 14:17") (* Tries to find an equivalent TYPEBLOCK for the expression TYPE) (DECLARE (SPECVARS TYPE)) (foreachTB TB (if (AND (LISTP (fetch NAME of TB)) (EQUAL TYPE (fetch TYPEXP of TB))) then (OR (EQUAL TYPE (fetch NAME of TB)) (replace NAME of TB with TYPE)) (* NAME has been edited) (NOTICETB TB TYPE) (* Remember this path) (RETFROM 'FINDTYPEXP TB))) NIL]) (GETCTYPE [LAMBDA (TB) (* rmk%: "29-NOV-81 14:33") (OR (fetch CTYPE of (fetch DEF of TB)) (if (DECLRECURSING 'GETCTYPE TB) then (DECLERROR "Invalid recursive type definition" (fetch TYPEXP of TB))) (replace CTYPE of (fetch DEF of TB) with (MAKECTYPE (fetch TYPEXP of TB]) (GETDECLTYPE [LAMBDA (TE VARNAME) (* bas%: "18-OCT-79 15:38") (* Either finds a typeblock with TE as its type expression or creates one.  We smuggle the name thru in the PROPS field as anyone who specifies a VARNAME  is unnamed so neither has nor can acquire any properties.) (OR (FINDDECLTYPE TE) (AND (LISTP TE) (OR (FINDTYPEXP TE) (MAKEDECLTYPE TE TE VARNAME))) (DECLERROR TE "is not a DECLTYPE"]) (GETDECLTYPE.NOERROR [LAMBDA (TE VAR) (* bas%: "19-OCT-79 16:05") (* Makes and completes a typeblock for TE suppressing any DECLERRORs) (WITH ((DECLERROR)) (DECLARE (SPECVARS DECLERROR)) (OR (CAR (ERSETQ (WITH ((TB (GETDECLTYPE TE VAR))) (* Force completion so any errors will happen now under the ERSETQ) (GETCTYPE TB) (fetch TESTFN of TB) TB))) (COND (DECLERROR NIL) (T (ERROR!]) (GETTBPROP [LAMBDA (TB P) (* bas%: "15-AUG-79 23:49") (SELECTQ P (BINDFN (fetch BINDFN of TB)) (SETFN (fetch SETFN of TB)) (TESTFN (fetch TESTFN of TB)) (WITH ((PL (FINDPROP (fetch PROPS of TB) P))) (if PL then (CADR PL) else (INHERITPROP TB P]) (INHERITPROP [LAMBDA (TB PROP) (* bas%: "19-OCT-79 16:45") (* Determines how types inherit their properties on the basis of the way they  were formed from other types) (WITH ((TE (fetch TYPEXP of TB))) (AND (LISTP TE) (GETDECLTYPEPROP (SELECTQ (TETYPE TE) ((ALLOF ONEOF) (WITH ((V (GETDECLTYPEPROP (CADR TE) PROP)) (ANYVAL (GETDECLTYPEPROP 'ANY PROP))) (RETFROM 'INHERITPROP (if [OR (EQ V ANYVAL) (for I in (CDDR TE) always (EQ V (GETDECLTYPEPROP I PROP] then V else ANYVAL)))) ((OF SATISFIES WHOSE) (CAR TE)) (MEMQ (CONS 'ONEOF (for I in (CDR TE) collect (DTYPENAME I)))) (SHARED (if (EQ PROP 'BINDFN) then (RETFROM 'INHERITPROP (CONSTANT DefaultBindFn)) else (CADR TE))) ((SUBTYPE SYNONYM) (CADR TE)) (TUPLE 'LISTP) 'ANY) PROP]) (INITDECLTYPES [LAMBDA NIL (* rmk%: "14-SEP-82 22:17") (* Initializes DECLTYPES hash array) [COND ((BOUNDP 'DECLTYPESARRAY) (CLRHASH DECLTYPESARRAY)) (T (SETQ DECLTYPESARRAY (CONS (HARRAY 128) 128] (FILEPKGCHANGES 'DECLTYPES NIL) (* Make FILEPKG forget about any types it may have noticed.) (RESETVARS (FILEPKGFLG) [for I in '(ANY NONE) do (create TYPEBLOCK NAME _ I DEF _ (create TYPEDEF TEXP _ I CTYPE _ I) BINDFN _ (CONSTANT DefaultBindFn) SETFN _ (CONSTANT DefaultSetFn) TESTFN _ (LAMVAL (EQ I 'ANY] (* ANY and NONE are created complete) (MAKEDECLTYPEQ ARRAYP (SUBTYPE ANY) (TESTFN ARRAYP)) (MAKEDECLTYPEQ HARRAYP (SUBTYPE ARRAYP) (TESTFN HARRAYP)) (MAKEDECLTYPEQ LISTP (SUBTYPE ANY) (TESTFN LISTP EVERYFN EVERY)) [MAKEDECLTYPEQ HASHARRAY (ONEOF HARRAYP (LISTP (WHOSE (CAR HARRAYP] (MAKEDECLTYPEQ READTABLEP (SUBTYPE ARRAYP) (TESTFN READTABLEP)) (MAKEDECLTYPEQ ATOM (SUBTYPE ANY) (TESTFN ATOM)) (MAKEDECLTYPEQ LITATOM (SUBTYPE ATOM) (TESTFN LITATOM)) (MAKEDECLTYPEQ BOOL (MEMQ NIL T)) (MAKEDECLTYPEQ NUMBERP (SUBTYPE ATOM) (TESTFN NUMBERP)) (MAKEDECLTYPEQ FIXP (SUBTYPE NUMBERP) (TESTFN FIXP)) [MAKEDECLTYPEQ CARDINAL (FIXP (SATISFIES (IGEQ VALUE 0] (MAKEDECLTYPEQ SMALLP (SUBTYPE FIXP) (TESTFN SMALLP)) (MAKEDECLTYPEQ LARGEP (SUBTYPE FIXP) (TESTFN LARGEP)) (MAKEDECLTYPEQ FLOATP (SUBTYPE NUMBERP) (TESTFN FLOATP)) (MAKEDECLTYPEQ FUNCTION (SUBTYPE ANY) (TESTFN FNTYP)) (MAKEDECLTYPEQ NIL (MEMQ NIL) (TESTFN NULL)) (MAKEDECLTYPEQ LST (ONEOF LISTP NIL) (EVERYFN EVERY)) (MAKEDECLTYPEQ ALIST (LST OF LISTP)) (MAKEDECLTYPEQ STACKP (SUBTYPE ANY) (TESTFN STACKP)) (MAKEDECLTYPEQ STRINGP (SUBTYPE ANY) (TESTFN STRINGP EVERYFN EVERYCHAR]) (LCCTYPE [LAMBDA (TL) (* bas%: "18-SEP-79 17:24") (* Returns the lowest common ctype for the type names in TL) (WITH [(C1 (GETCGETD (CAR TL] (if (CDR TL) then (LCC2 C1 (LCCTYPE (CDR TL))) else C1]) (LCC2 [LAMBDA (A B) (* bas%: "10-OCT-79 19:12") (* Returns the lcd of A and B) (if (COVERSCTYPE A B) then A elseif (COVERSCTYPE B A) then B else (for I C in A do (WITH ((D (LCC2 I B))) (if (OR (NULL C) (COVERSCTYPE C D)) then (SETQ C D))) finally (RETURN C]) (MAKECTYPE [LAMBDA (TE) (* bas%: "31-OCT-79 16:44") (* Computes the real sup types of TE) (SELECTQ (TETYPE TE) (ALLOF [WITH [(S (COLLECTTYPES (CDR TE) 'DOWN] (if (CDR S) then (SMASHCAR S (FUNCTION GETCTYPE)) else (* They are all on the same path) (GETCTYPE (CAR S]) (ONEOF [WITH [(S (COLLECTTYPES (CDR TE) 'UP] (* Rather than having the subtypes point to this new ctype, we pick that case  up in COVERS to avoid making the supertype structure bushy.) (if (CDR S) then (LIST (LCCTYPE (CDR TE))) else (* All on the same path) (GETCTYPE (CAR S]) ((SHARED SYNONYM) (GETCGETD (CADR TE))) (LIST (SELECTQ (TETYPE TE) (MEMQ (LCCTYPE (for I in (CDR TE) scratchcollect (DTYPENAME I)))) (GETCGETD (SELECTQ (TETYPE TE) ((OF SATISFIES WHOSE) (CAR TE)) (SUBTYPE (CADR TE)) (TUPLE (if (CDR TE) then 'LISTP else 'NIL)) (SHOULDNT]) (MAKEDECLTYPE [LAMBDA (NAME DECL PROPS) (* bas%: " 7-NOV-79 16:33") (* Defines the type specified by the  type expression DECL) (CHECKTYPEXP DECL) (* Provides an early check on well  formedness) (WITH [(TB (create TYPEBLOCK NAME _ NAME TYPEXP _ DECL PROPS _ (COPY PROPS] (if (LISTP PROPS) then (replace BINDFN of TB with (CREATEFNPROP PROPS 'BINDFN)) (replace SETFN of TB with (CREATEFNPROP PROPS 'SETFN)) (replace TESTFN of TB with (CREATEFNPROP PROPS 'TESTFN)) (CREATEFNPROP PROPS 'EVERYFN)) TB]) (MAKEBINDFN [LAMBDA (TB) (* bas%: "18-OCT-79 18:17") (* Finds a BINDFN for TB) (replace BINDFN of TB with (INHERITPROP TB 'BINDFN]) (MAKESETFN [LAMBDA (TB) (* bas%: "18-OCT-79 21:17") (* Finds a SETFN for TB) (replace SETFN of TB with (INHERITPROP TB 'SETFN]) (MAPTYPEUSERS [LAMBDA (NAME FN) (* bas%: "28-AUG-79 22:18") (DECLARE (SPECVARS . T)) (foreachTB TB (AND (USESTYPE NAME (fetch TYPEXP of TB)) (APPLY* FN TB]) (NOTICETB [LAMBDA (TBLOCK TEXP) (* rmk%: " 7-SEP-81 03:26") (* Enters hash links so TBLOCK can be found given type expression TEXP) (if (LISTP TEXP) then (PUTHASH TEXP TEXP CLISPARRAY) (* Access name is also in CLISPARRAY  to detect changes)) (PUTHASH TEXP TBLOCK DECLTYPESARRAY]) (PPDTYPE [LAMBDA (TYPE) (* bas%: "18-OCT-79 17:57") (* PPs typeblock, completing unless  NOCOMPFLG) (WITH [(LM (IPLUS 4 (POSITION))) (TB (if (type? TYPEBLOCK TYPE) then TYPE else (GETDECLTYPE TYPE] (printout NIL "DECLTYPE: " (fetch NAME of TB) " = " (OR (fetch TYPEXP of TB) "No type expression")) (printout NIL .TAB LM "Suptypes: ") (if (fetch CTYPE of (fetch DEF of TB)) then (for I in (GETCTYPE TB) declare (SPECVARS I) do (printout NIL .TAB0 (IPLUS LM 10)) (* Start each new suptype list on a  new line) (foreachTB S (AND (EQ I (fetch CTYPE of (fetch DEF of S))) (printout NIL (fetch NAME of S) %,))) (* Dont force a completion to get the  CTYPE)) else (printout NIL "... not completed...")) (if (fetch BF of TB) then (printout NIL .TAB LM "Bindfn: " .PPF (fetch BF of TB))) (if (fetch SF of TB) then (printout NIL .TAB LM "Setfn: " .PPF (fetch SF of TB))) (if (fetch TF of TB) then (printout NIL .TAB LM "Testfn: " .PPF (fetch TF of TB))) [if (fetch PROPS of TB) then (printout NIL .TAB LM "Property: ") (for P on (fetch PROPS of TB) by (CDDR P) do (printout NIL .TAB0 (IPLUS LM 10) (CAR P) " = " |.P2| (CADR P] (TERPRI) TB]) (RECDTYPE [LAMBDA (R) (* rmk%: " 6-SEP-81 04:29") (WITH [RDECL TB (TST (LIST 'type? R (CONS 'NILL] (* The CONS produces a unique, dwim-immune object to give RECORDTRAN to  dwimify. We can then substitute for it to build the testfn.) (COND ([RESETVARS (CLISPCHANGE (DWIMESSGAG T)) (* CLISPCHANGE bound cause RECORDTRAN  sets it) (* If the record package translation bombs, simply return NIL to GETDECLTYPE,  which might then print an error message.) (RETURN (NLSETQ (RECORDTRAN TST 'DTYPE?TRAN] (SETQ RDECL (RECLOOK R)) [SETQ TB (create TYPEBLOCK NAME _ R TYPEXP _ (LIST 'SUBTYPE (RECDEFTYPE RDECL] (* Use SETTBPROP to store TESTFN rather than doing it in the create, so that it  also shows up on the property list. Then the decltype will print with all its  info.) [SETTBPROP TB 'TESTFN (LAMVAL (LIST COMMENTFLG 'ASSERT%: (LIST 'RECORD R)) (SUBST 'VALUE (CADDR TST) (PROG1 (GETHASH TST CLISPARRAY) (PUTHASH TST NIL CLISPARRAY] (* The record package stores the DECL form in 9th car of the translation) (for X on (CDAR (FNTH (GETHASH RDECL CLISPARRAY) 9)) by (CDDR X) do (SETTBPROP TB (CAR X) (CADR X))) TB]) (DECLCHANGERECORD [LAMBDA (RNAME RFIELDS OLDFLG) (* rmk%: " 7-SEP-81 04:17") (* CHANGERECORD is the default value of RECORDCHANGEFN, which is applied by  RECREDECLARE. This makes sure that a record change wipes out a dependent  decltype) (REALCHANGERECORD RNAME RFIELDS OLDFLG) (AND OLDFLG (WITH (TEMP (TB (GETHASH RNAME DECLTYPESARRAY))) (* This is a marginal guess at the dependency%: we would be wrong if the user  had, e.g., dumped a record-derived decltype and loaded it into a system without  the record.) (if (AND TB (SETQ TEMP (fetch TESTFN of TB)) [EQ COMMENTFLG (CAR (SETQ TEMP (CADDR TEMP] (EQ (CADR TEMP) 'ASSERT%:) (EQ (CAR (SETQ TEMP (CADDR TEMP))) 'RECORD) (EQ RNAME (CADR TEMP))) then (DELETETB TB]) (RECDEFTYPE [LAMBDA (RD) (* bas%: "21-SEP-79 14:53") (* Computes the DECLOF type corresponding to a record package type expression) (SELECTQ (CAR RD) (ACCESSFNS (WITH ((CRF (FASSOC 'CREATE RD))) (if CRF then (DECLOF (CADR CRF)) else 'ANY))) (ARRAYRECORD 'ARRAYP) (ASSOCRECORD 'ALIST) (ATOMRECORD 'LITATOM) (DATATYPE (if (LISTP (CADR RD)) then (CADADR RD) else 'ANY)) (HASHLINK 'HARRAYP) (PROPRECORD 'LST) (RECORD (WITH ((FLDS (CADDR RD))) (if (LISTP FLDS) then 'LST elseif [AND FLDS (EQ FLDS (CADR (FASSOC 'SUBRECORD RD] then (* The declaration has a top-level field equal to the subrecord name) FLDS else 'ANY))) (TYPERECORD 'LISTP) 'ANY]) (REPROPTB [LAMBDA (TB PROPS INHERITING) (* bas%: " 7-NOV-79 15:46") (* Propgates changes in properties) (PROG [(NEWP (for old PROPS by (CDDR PROPS) while PROPS unless [if INHERITING then (FINDPROP (fetch PROPS of TB) (CAR PROPS)) else (EQUAL (CADR PROPS) (LISTGET (fetch PROPS of TB) (CAR PROPS] join (SETTBPROP TB (CAR PROPS) (COPY (CADR PROPS)) INHERITING) (LIST (CAR PROPS) (CADR PROPS] (DECLARE (SPECVARS NEWP)) [if NEWP then (UNSAVETYPE TB) (* Probably not necessary, but we cant  tell) (MAPTYPEUSERS (fetch NAME of TB) (FUNCTION (LAMBDA (X) (REPROPTB X NEWP T] (* Any recursions bottom out b/c the change will have been made the first time  the type is reached) (RETURN NEWP) (* Indicate if any changes) ]) (SETTBPROP [LAMBDA (TB P V BLKONLY) (* bas%: " 7-NOV-79 16:55") (SELECTQ P (BINDFN (replace BINDFN of TB with (CREATEFNVAL V 'BINDFN))) (EVERYFN (CREATEFNVAL V 'EVERYFN)) (SETFN (replace SETFN of TB with (CREATEFNVAL V 'SETFN))) (TESTFN [SELECTQ (fetch NAME of TB) ((ANY NONE) (DECLERROR "(Futile) attempt to change TESTFN of" (fetch NAME of TB))) (replace TESTFN of TB with (CREATEFNVAL V 'TESTFN]) NIL) (* Unless BLKONLY, must also put on property list so it is known) (if BLKONLY elseif (fetch PROPS of TB) then (LISTPUT (fetch PROPS of TB) P V) else (replace PROPS of TB with (LIST P V]) (TBDEFPRINT [LAMBDA (TB) (* bas%: "22-NOV-78 14:32") (* DEFPRINTer for TYPEBLOCKs. Made a function to allow supression of constant  cons) (CBOX (CONCAT "{DECLTYPE: " (fetch NAME of TB) "}") (PACK]) (TETYPE [LAMBDA (TE) (* rmk%: "18-Feb-85 18:07") (* returns the type of a type  expression) (if (LITATOM TE) then 'PRIMITIVE elseif (LISTP TE) then (SELECTQ (CAR TE) ((ALLOF MEMQ ONEOF SHARED SUBTYPE SYNONYM TUPLE) (CAR TE)) (AND (LISTP (CDR TE)) (SELECTQ (CADR TE) (OF 'OF) (SELECTQ (CAR (LISTP (CADR TE))) ((SATISFIES WHOSE) (CAADR TE)) NIL]) (TYPEMSANAL [NLAMBDA (KIND) (* rmk%: " 9-NOV-83 09:24") (* Returns the information that the  various templates expect.) (DECLARE (USEDFREE EXPR FNNAME)) (SELECTQ KIND (COVERS (SCRATCHLIST (CBOX) (TYPEMSANAL1 EXPR))) ((type? the) [LBOX KIND (SCRATCHLIST (CBOX) (TYPEMSANAL1 (CADR EXPR))) (OR (GETHASH EXPR CLISPARRAY) (RESETVARS (FILEPKGFLG (NOSPELLFLG T) (DWIMESSGAG T)) (PROG (LISPXHIST) (DECLARE (SPECVARS LISPXHIST)) (DWIMIFY0? EXPR EXPR NIL NIL NIL FNNAME)) (RETURN (GETHASH EXPR CLISPARRAY]) (\*DECL (* We assume that the \*DECL came from a previous dwimification which also got  the testfn. The typeblock should already exist, but sometimes it isn't found  cause the clisparray gets cleared. The MAKEAPPLYFORM means that bogus VALUE's  are most likely eliminated) (LBOX [SCRATCHLIST (CBOX) (TYPEMSANAL1 (fetch DECL of (fetch VARDECL of EXPR] (APPLYFORM [fetch TESTFN of (GETDECLTYPE (fetch DECL of (fetch VARDECL of EXPR] (fetch VARNAME of EXPR)))) (SHOULDNT]) (TYPEMSANAL1 [LAMBDA (TYPEXP) (* bas%: "16-AUG-79 11:55") (* Collects from a type expression the names of all the named types that it  uses) (if (LITATOM TYPEXP) then (ADDTOSCRATCHLIST TYPEXP) elseif (LISTP TYPEXP) then [SELECTQ (CAR TYPEXP) ((ALLOF ONEOF SHARED SUBTYPE TUPLE) (for X in (CDR TYPEXP) do (TYPEMSANAL1 X))) (MEMQ NIL) (PROGN (* Infix operator so CAR is a type) (TYPEMSANAL1 (CAR TYPEXP)) (* CDR TYPEXP must also be a listp) (if (EQ (CADR TYPEXP) 'OF) then [TYPEMSANAL1 (CAR (LISTP (CDDR TYPEXP] else (SELECTQ (CAR (LISTP (CADR TYPEXP))) (SATISFIES NIL) (WHOSE (for I in (CDADR TYPEXP) do (TYPEMSANAL1 (CADR I)))) (SHOULDNT] else (SHOULDNT]) (UNCOMPLETE [LAMBDA (TB) (* bas%: " 7-NOV-79 16:08") (* Reinitializes the TYPEBLOCK for  NAME, recursing if necessary) (replace BINDFN of TB with (CREATEFNPROP (fetch PROPS of TB) 'BINDFN)) (replace SETFN of TB with (CREATEFNPROP (fetch PROPS of TB) 'SETFN)) (replace TESTFN of TB with (CREATEFNPROP (fetch PROPS of TB) 'TESTFN)) (if (fetch CTYPE of (fetch DEF of TB)) then (replace CTYPE of (fetch DEF of TB) with NIL) (MAPTYPEUSERS (fetch NAME of TB) (FUNCTION UNCOMPLETE]) (UNSAVETYPE [LAMBDA (TYPE) (* rmk%: " 7-SEP-81 03:44") (DECLARE (SPECVARS TYPE)) [MAPHASH CLISPARRAY (FUNCTION (LAMBDA (TRAN ORIG) (if (FORMUSESTB ORIG TRAN TYPE) then (PUTHASH ORIG NIL CLISPARRAY] (* Clear translations that depend on  this type) (AND MSDATABASELST (MSNEEDUNSAVE (GETRELATION (fetch NAME of TYPE) '(USE TYPE) T) "type declarations" T]) (USERDECLTYPE [LAMBDA (NAME DECL PROPS) (* rmk%: " 2-AUG-81 08:42") (* User entry to MAKEDECLTYPE) (if (LITATOM NAME) then (WITH ((TB (GETHASH NAME DECLTYPESARRAY))) (* We use GETHASH to avoid creating  record based types) (if [OR (EQ DECL NAME) (AND TB (EQUAL DECL (fetch TYPEXP of TB] then (AND (REPROPTB (GETDECLTYPE NAME) PROPS) (MARKASCHANGED NAME 'DECLTYPES)) (* Adding properties to existing type) else (SELECTQ NAME ((ANY NONE) (DECLERROR "(Futile) attempt to redefine" NAME)) NIL) [MARKASCHANGED NAME 'DECLTYPES (COND (TB 'CHANGED) (T 'DEFINED] (if TB then (DELETETB TB)) (* Forget it if it exists then remake  it) (MAKEDECLTYPE NAME (OR (LISTP DECL) (LIST 'SYNONYM DECL)) PROPS))) NAME else (DECLERROR "Non-atomic DECLTYPE name" NAME]) (USESTYPE [LAMBDA (NAME TE) (* rmk%: "18-Feb-85 18:14") (* Computes whether NAME appears in TE) (OR (EQ NAME TE) (SELECTQ (TETYPE TE) ((ALLOF ONEOF SHARED SUBTYPE SYNONYM) (for I in (CDR TE) thereis (USESTYPE NAME I))) (MEMQ (for I in (CDR TE) thereis (EQ I (DTYPENAME I)))) (OF [OR (USESTYPE NAME (CAR TE)) (AND [LISTP (CDR (LISTP (CDR TE] (USESTYPE NAME (CADDR TE]) (PRIMITIVE NIL) (SATISFIES (USESTYPE (CAR TE))) (TUPLE [OR (EQ NAME (if (CDR TE) then 'LISTP else NIL)) (USESTYPE NAME (CONS 'ALLOF (CDR TE]) (WHOSE [OR (USESTYPE NAME (CAR TE)) (for I in (CADR TE) when (LISTP (CDR (LISTP I))) thereis (USESTYPE NAME (CADR I]) (SHOULDNT]) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK%: LCCTYPE LCCTYPE LCC2) (BLOCK%: TYPEMSANAL TYPEMSANAL TYPEMSANAL1) ) (* Test fn creation block) (DEFINEQ (MAKETESTFN [LAMBDA (TB) (* rmk%: "29-NOV-81 22:41") (* Computes the test fn for a type block.  Called from TESTFN fetch function. This is not a part of the MAKETESTFNBLOCK,  so that the name MAKETESTFN is a reliable indicator for checking recursion  (DECLRECURSING)) (MAKETESTFNBLOCK TB]) (MAKETESTFNBLOCK [LAMBDA (TB) (* rmk%: " 6-FEB-82 14:25") (* Computes the test fn for a type  block) (WITH [(TE (fetch TYPEXP of TB)) (BINDINGNAME (OR (AND (LITATOM (fetch PROPS of TB)) (fetch PROPS of TB)) 'VALUE] (DECLARE (SPECVARS BINDINGNAME)) (COND [(DECLRECURSING 'MAKETESTFNBLOCK TB) (* Name will be returned) (replace TESTFN of TB with (PACK* (fetch NAME of TB) '.TestFn] (T (WITH [(DEF (SELECTQ (TETYPE TE) (ALLOF (COMBINE.TESTS (SMASHCAR (COLLECTTYPES (CDR TE) 'DOWN) (FUNCTION TESTFORM)) 'AND)) (MEMQ [LAMBIND (COND [(COVERSTB (GETDECLTYPE '(ONEOF LITATOM SMALLP)) TB) (COND ((CDDR TE) (LIST 'SELECTQ BINDINGNAME (LIST (CDR TE) T) NIL)) (T (LIST 'EQ BINDINGNAME (KWOTE (CADR TE] (T (COND [(CDDR TE) (LIST 'MEMBER BINDINGNAME (KWOTE (CDR TE] (T (LIST 'EQUAL BINDINGNAME (KWOTE (CADR TE]) (OF [OF.TESTFN (GETDECLTYPE (CAR TE)) (GETDECLTYPE (COND ((CDDDR TE) (CDDR TE)) (T (CADDR TE]) (ONEOF (COMBINE.TESTS (SMASHCAR (COLLECTTYPES (CDR TE) 'UP) (FUNCTION TESTFORM)) 'OR)) (SATISFIES (COMBINE.TESTS [LIST (TESTFORM (GETDECLTYPE (CAR TE))) (COND ((CDDR (CADR TE)) (* There might be multiple forms or  disconnected CLISP) (CONS 'AND (CDADR TE))) (T (CADR (CADR TE] 'AND)) ((SHARED SUBTYPE SYNONYM) (fetch TESTFN of (GETDECLTYPE (CADR TE)))) (TUPLE (TUPLE.TESTFN (CDR TE))) (WHOSE (WHOSE.TESTFN TB (CAR TE) (CDADR TE))) (SHOULDNT] (WITH ((TF (fetch TF of TB))) (replace TESTFN of TB with (COND [TF (* Must be recursive with TF being the atom name.TestFn and DEF being a lambda  expression. Convert to a LABEL expression, then translate it using DOLABEL from  LABEL package.) (DOLABEL (CONS 'LABEL (CONS TF (CDR DEF] (T DEF]) (COMBINE.TESTS [LAMBDA (TESTS ANDOR) (* bas%: "28-AUG-79 13:29") (* Composes TESTS under either AND or  OR composition) (FUNIFY [for TST in TESTS join (COND ((EQ (CAR (LISTP TST)) ANDOR) (APPEND (CDR TST))) ((EQ TST (EQ ANDOR 'AND)) (* AND T or OR NIL) NIL) ((EQ TST (EQ ANDOR 'OR)) (* AND NIL or OR T) (RETURN (LIST TST))) (T (LIST TST] ANDOR]) (FUNIFY [LAMBDA (TEST ANDOR) (* bas%: "11-OCT-79 18:05") (* Provides LAMBDA abstraction for  COMBINE.TESTS) (LAMBIND (COND ((NLISTP TEST) (* No tests) (EQ ANDOR 'AND)) ((CDR TEST) (* More than one clause) (CONS ANDOR TEST)) (T (CAR TEST]) (MKNTHCAR [LAMBDA (L N) (* bas%: " 8-MAR-79 17:55") (* Constructs an expression for getting the Nth car of L) (PROG [(F (MKNTHCDR L (SUB1 N] (RETURN (SELECTQ (CAR F) (CDR (CONS 'CADR (CDR F))) (CDDR (CONS 'CADDR (CDR F))) (CDDDR (CONS 'CADDDR (CDR F))) (LIST 'CAR F]) (MKNTHCDR [LAMBDA (L N) (* bas%: " 9-MAR-79 14:50") (* Constructs an expresssion for getting the Nth cdr of L) (if (ZEROP N) then L elseif (ILESSP N 5) then (LIST (SELECTQ N (1 'CDR) (2 'CDDR) (3 'CDDDR) (4 'CDDDDR) (SHOULDNT)) L) elseif (ILESSP N 9) then (MKNTHCDR (LIST 'CDDDDR L) (IDIFFERENCE N 4)) else (LIST 'FNTH L (ADD1 N]) (OF.TESTFN [LAMBDA (AGG ELT) (* rmk%: "19-AUG-81 00:08") (COMBINE.TESTS [LIST (TESTFORM AGG) (LIST (OR (GETTBPROP AGG 'EVERYFN) (DECLERROR "OF construction used with non-aggregate type")) BINDINGNAME (LIST 'FUNCTION (fetch TESTFN of ELT] 'AND]) (TUPLE.TESTFN [LAMBDA (TYPES) (* rmk%: "19-AUG-81 00:16") (* Constructs the test function for  TUPLEs) (COND (TYPES (COMBINE.TESTS [CONS (LIST 'EQLENGTH BINDINGNAME (LENGTH TYPES)) (for I in TYPES as J from 1 collect (APPLYFORM (fetch TESTFN of (GETDECLTYPE I)) (MKNTHCAR BINDINGNAME J] 'AND)) (T 'NULL]) (WHOSE.TESTFN [LAMBDA (TB SNAM TAIL) (* bas%: " 6-NOV-79 16:56") (* Constructs TESTFN for WHOSE  expressions) (COMBINE.TESTS [CONS (TESTFORM (GETDECLTYPE SNAM)) (for I in TAIL collect (APPLYFORM [fetch TESTFN of (GETDECLTYPE (COND ((EQLENGTH I 2) (CADR I)) (T (CDR I] (COND [(EQ SNAM 'LISTP) (WITH ((V (CAR I))) (SELECTQ V ((CAR CDR CADR CDDR CAAR CDAR) (LIST V BINDINGNAME)) (COND ((AND (FIXP V) (NOT (MINUSP V))) (MKNTHCAR BINDINGNAME V] ((FMEMB (CAR I) (RECORDFIELDNAMES SNAM)) (LIST 'FETCH (LIST SNAM (CAR I)) 'OF BINDINGNAME)) (T (DECLERROR (CAR I) " is not a valid fieldname"] 'AND]) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK%: MAKETESTFNBLOCK MAKETESTFNBLOCK COMBINE.TESTS FUNIFY MKNTHCAR MKNTHCDR OF.TESTFN TUPLE.TESTFN WHOSE.TESTFN) ) (* Machinery to compile recursive testfns) (FILESLOAD (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) LABEL) (* Idioms. Expressed as macros for now) (DECLARE%: DONTCOPY EVAL@COMPILE (RPAQQ DefaultBindFn PROGN) (RPAQQ DefaultSetFn REALSETQ) (ADDTOVAR NLAMA MAKEDECLTYPEQ) (DECLARE%: EVAL@COMPILE [PUTPROPS ANYC MACRO ((C) (EQ C 'ANY] [PUTPROPS DECLVARERROR MACRO (ARGS (LSUBST ARGS 'ARGS '(DECLDWIMERROR ARGS T " inside " VARD] [PUTPROPS DTYPENAME MACRO ((X) (COND ((LARGEP X) 'LARGEP) (T (TYPENAME X] [PUTPROPS foreachTB MACRO (ARGS (LIST 'MAPHASH 'DECLTYPESARRAY (LIST 'FUNCTION (CONS 'LAMBDA (CONS (LIST (CAR ARGS)) (CDR ARGS] [PUTPROPS GETCGETD MACRO ((X) (GETCTYPE (GETDECLTYPE X] [PUTPROPS KWOTEBOX MACRO ((V) ([LAMBDA ($$8) (DECLARE (LOCALVARS $$8)) (FRPLACA (CDR $$8) V) $$8] ''Q] (PUTPROPS LAMBIND MACRO (ARGS (APPEND '(LIST 'LAMBDA (LIST BINDINGNAME)) ARGS))) (PUTPROPS LAMVAL MACRO (ARGS (APPEND '(LIST 'LAMBDA '(VALUE)) ARGS))) [PUTPROPS MAKEDECLTYPEQ MACRO ((NAME DEF PROPS) (MAKEDECLTYPE 'NAME 'DEF 'PROPS] [PUTPROPS NONEC MACRO ((C) (EQ C 'NONE] (PUTPROPS TESTFORM MACRO ((TB) (APPLYFORM (fetch TESTFN of TB) BINDINGNAME))) ) (DEFINEQ (TESTFORM [LAMBDA (TB) (* rmk%: "24-NOV-81 22:17") (* Doesn't get compiled, cause it is macroed out.  Symbolic definition exists because it get's APPLY*, not EVALed) (APPLYFORM (fetch TESTFN of TB) BINDINGNAME]) ) (ADDTOVAR DONTCOMPILEFNS TESTFORM) (SETTEMPLATE 'foreachTB '(CALL BIND |..| EFFECT)) (SETTEMPLATE 'MAKEDECLTYPEQ '(CALL NIL NIL NIL . PPE)) ) (* Runtime utility functions) (DEFINEQ (EVERYCHAR [LAMBDA (STRNG FN) (* bas%: " 6-MAR-79 17:58") (* The EVERY function for strings) (for I to (NCHARS STRNG) always (APPLY* FN (NTHCHAR STRNG I]) (LARGEP [LAMBDA (X) (* rmk%: "24-MAY-79 09:10") (* For LARGEP type-tests) (AND (FIXP X) (NOT (SMALLP X]) (DECLRECURSING [LAMBDA (NAME ARG) (* jtm%: "19-Feb-87 11:31") (* NAME is the name of a potentially looping function in our call chain.  ARG is the first arg in that lowest call to NAME.  Determines whether the function NAME exists higher on the stack with ARG as its  first argument. Used to check for recursive loops.) (bind (S _ (STKPOS NAME -1)) while (STKPOS NAME -2 S S) when (EQ ARG (STKARG 1 S)) do (* At each step we back off one from the last frame we checked b/c it would  otherwise be found by STKPOS, and search for the next one.  S is reused by both stack fns and released if the loop terminates with it  pointing to anything.) (RELSTK S) (RETURN T]) (SMASHCAR [LAMBDA (L FN) (* bas%: "31-OCT-79 17:11") (* Maps over L smashing the result of applying FN to each car into that car) [MAP L (FUNCTION (LAMBDA (X) (FRPLACA X (APPLY* FN (CAR X] L]) ) (DECLARE%: EVAL@COMPILE (DECLARE%: EVAL@COMPILE [PUTPROPS LARGEP MACRO ((X) (AND (FIXP X) (NOT (SMALLP X] ) ) (DECLARE%: DONTCOPY EVAL@COMPILE (DECLARE%: EVAL@COMPILE [PUTPROPS SMASHCAR MACRO (ARGS (SUBST [SELECTQ (CAADR ARGS) [(FUNCTION QUOTE) (APPLYFORM (CADADR ARGS) '(CAR I] (LIST 'APPLY* (CADR ARGS) '(CAR I] 'NEWVAL (LIST '[LAMBDA (L) (DECLARE (LOCALVARS L)) [MAP L (FUNCTION (LAMBDA (I) (DECLARE (LOCALVARS I)) (FRPLACA I NEWVAL] L] (CAR ARGS] ) ) (* translator of dprogs and dlambdas) (DEFINEQ (ASSERT [NLAMBDA ARGS (* rmk%: "11-NOV-83 08:00") (* ARGS is a mixed list of variable names and forms.  Forms must be true, and the test function for variables must be true too.) (DECLARE (LOCALVARS . T)) (for V in ARGS do (if (LITATOM V) then (\VARASRT V) elseif (LISTP V) then (OR (EVAL V 'INTERNAL) (ASSERTFAULT V NIL)) else (ERRORX (LIST 27 V]) (ASSERTFAULT [LAMBDA (DECL VARNAME) (* ; "Edited 23-Feb-87 08:35 by jtm:") (* Prints out the assertion error  messages.) (LET [(FN (STKNAME (REALSTKNTH -1 'ASSERTFAULT] [COND ((LISTP FN) (SETQ FN (STKNAME (REALSTKNTH -4 'ASSERTFAULT] (LISPXPRIN1 (if VARNAME then "DECLARATION" else "ASSERTION") T) (LISPXPRIN1 " NOT SATISFIED IN " T) (LISPXPRIN2 FN T) (LISPXPRIN1 (CONCAT ": " (if VARNAME then (LIST VARNAME DECL) else DECL)) T) (APPLY* (FUNCTION BREAK1) NIL T FN]) (ASSERTMAC [LAMBDA (ARGS) (* rmk%: " 2-AUG-79 23:21") (* Compiler for ASSERT forms.) (if (IGNOREDECL) then (CBOX COMMENTFLG (LBOX (CBOX 'ASSERT ARGS))) else (for V in ARGS collect (if (LISTP V) then (LIST 'OR V (LIST 'ASSERTFAULT (KWOTE V))) elseif (LITATOM V) then (MAKETESTFORM V (TYPEBLOCKOF V)) else (ERRORX (LIST 27 V))) finally (RETURN (if (CDR $$VAL) then (CONS 'PROGN $$VAL) else (CAR $$VAL]) (\*DECL [NLAMBDA ARGS (* DECLARATIONS%: (RECORD ARGRECORD  (SL . FORMS))) (* rmk%: "11-NOV-83 07:59") (* This maintains the proper bindings of SATISFIESLIST.  It is wrapped around function bodies by dprog's and dlambda's.  Compiles open, depending on COMPILEIGNOREDECL.) (PROG [(SATISFIESLIST (if [OR (NULL (fetch SL of ARGS)) (LISTP (CAAR (fetch SL of ARGS] then (* If NIL, then this is the top binding for a declarative without any bindings.  If LISTP, then this is the first binding in this lexical scope.) (fetch SL of ARGS) else (CONS (fetch SL of ARGS) SATISFIESLIST] (DECLARE (SPECVARS SATISFIESLIST)) (* Use \DECLPROGN instead of PROGN so BAKTRACELST can recognize us) (RETURN (APPLY (FUNCTION \DECLPROGN) (fetch FORMS of ARGS) 'INTERNAL]) (*DECLMAC [LAMBDA (ARGS) (* DECLARATIONS%: (RECORD ARGRECORD  (SL . FORMS))) (* rmk%: "15-Sep-87 10:16") (DECLARE (USEDFREE CSATISFIESLIST FREEVARS)) (PROG [FIRSTSL (FV FREEVARS) (SL (fetch SL of ARGS)) (FORM (if (CDR (fetch FORMS of ARGS)) then (CONS 'PROGN (fetch FORMS of ARGS)) else (CAR (fetch FORMS of ARGS] [SETQ FIRSTSL (OR (NULL SL) (LISTP (CAAR SL] (* The first declaration in this  function) (* Should maintain list of free variables for the benefit of clisp words  arising in macros, but FREEVARS in compiling context has different meaning from  FREEVARS in dwimify context. Interlisp-D byte compiler gets confused.) (for V in (if FIRSTSL then (CAR SL) else SL) when (EQ (fetch PROGNFLAG of (fetch VARDECL of V)) 'FREE) do (push FV (fetch VARNAME of V))) [SETQ SL (LIST 'CSATISFIESLIST (KWOTE (if FIRSTSL then SL else (CONS SL CSATISFIESLIST] (* Assumes that *DECLMAC is executed in the same compiletime context as CBIND.  If this is the first declaration, we bind COMPILEIGNOREDECL for the benefit of  compiler-generated sub-functions) (RETURN (LIST '.CBIND. [CONS SL (NCONC [PROG1 NIL (* (if (NEQ FV FREEVARS) then  (LIST (LIST (QUOTE FREEVARS)  (KWOTE FV)))))] (if FIRSTSL then (LIST (LIST 'COMPILEIGNOREDECL (IGNOREDECL] FORM]) (\CHKINIT [NLAMBDA ARGS (* bas%: " 9-OCT-79 23:15") (* ARGS is a list of variable names whose nearest assertions are to be checked.  Calls to \CHKINIT are generated by DLAMTRAN just for variables that have inital  values and test-forms in the nearest SATISFIESLIST entry.) (DECLARE (LOCALVARS . T)) (for V D in ARGS unless (APPLY* (fetch TESTFN of (GETDECLTYPE [SETQ D (fetch DECL of (fetch VARDECL of (ASSOC V (CAR SATISFIESLIST ] V)) (EVALV V)) do (ASSERTFAULT D V]) (CHKINITMAC [LAMBDA (ARGS) (* rmk%: " 9-NOV-83 09:20") (* Compiler for \CHKINIT forms.) (DECLARE (USEDFREE COMMENTFLG CSATISFIESLIST)) (if (IGNOREDECL) then (CBOX COMMENTFLG (CBOX '\CHKINIT ARGS)) else (* The \CHKINIT only includes variables whose testform is not T) (for V D TEMP in ARGS collect (LIST 'OR (APPLYFORM (fetch TESTFN of (GETDECLTYPE [SETQ D (fetch DECL of (fetch VARDECL of (ASSOC V (CAR CSATISFIESLIST ] V)) V) (LIST 'ASSERTFAULT (if (LISTP D) then (CONS 'DECLMSGMAC D) else (KWOTE D)) (KWOTE V))) finally (RETURN (if (CDR $$VAL) then (CONS 'PROGN $$VAL) else (CAR $$VAL]) (DECLCONSTANTP [LAMBDA (X) (* bas%: " 9-OCT-79 21:32") (OR (NULL X) (EQ X T) (NUMBERP X) (STRINGP X) (AND (LISTP X) (SELECTQ (CAR X) ('CONSTANT T) (WITH ((TEMP (if (GETP (CAR X) 'MACRO) then (EXPANDMACRO X T) else X))) (* If we did a DECLOF and got a MEMQ, we'd have a constant.  Thus, this code wouldn't have to duplicate what goes on in DECLOF, and we would  get the funny PROG and SELECTQ cases for free.) (if (AND (NEQ TEMP X) (NEQ TEMP 'IGNOREMACRO)) then (DECLCONSTANTP TEMP) elseif (SELECTQ (CAR X) ((SELECTQ CLOSER GO PROG COND) (* CLOSER has side-effects. The others have CTYPE properties but their  arguments can't be simply checked) NIL) (GETP (CAR X) 'CTYPE)) then (* The test we really want is that the function doesn't reference freevariables  or cause side-effects.) (EVERY (CDR X) (FUNCTION DECLCONSTANTP]) (DD [NLAMBDA X (* DECLARATIONS%: (RECORD ARGRECORD  (NAME . DEF) (RECORD DEF  (ARGS . BODY)))) (* rmk%: "24-JUL-78 08:13") (* For Defining DLambda functions. NAME is the function name and DEF the rest  of its definition.) (DEFINE [LIST (LIST (fetch NAME of X) (CONS 'DLAMBDA (fetch DEF of X] T]) (DECLCLISPTRAN [LAMBDA (X TRAN) (* rmk%: " 2-Nov-84 15:30") [PROG [DECL DFORM DPROGFLAG RETURNS (DECLARETAGS '(LOCALVARS SPECVARS ADDTOVAR DEFLIST PUTPROPS CONSTANTS SETQQ USEDFREE TYPE] (if [AND (LISTP TRAN) [EQ 'FORWORD (CAR (GETPROP (CAR (LISTP X)) 'CLISPWORD] [if (EQ 'PROG (CAR TRAN)) then (SETQ DPROGFLAG T) (SETQ DFORM TRAN) elseif (AND [EQ 'FUNCTION (CAR (SETQ DFORM (CAR (LISTP (CDR (LISTP (CDR TRAN] (EQ 'LAMBDA (CAR (SETQ DFORM (CAR (LISTP (CDR DFORM] (OR (NULL NEWSATLIST) (for D in (CDR (ASSOC 'DECLARE DFORM)) thereis (AND (LISTP D) (NOT (FMEMB (CAR D) DECLARETAGS] then (FRPLACA DFORM (if DPROGFLAG then 'DPROG else 'DLAMBDA)) [for F (PROGVARS _ (AND DPROGFLAG (CADR DFORM))) in (CDDR DFORM) when (EQ (CAR F) 'DECLARE) do (for D V DCLARE in (CDR F) do (if (OR (NLISTP D) (FMEMB (CAR D) DECLARETAGS)) then (push DCLARE D) elseif DPROGFLAG then (* Distribute declarations of local variables in the DPROG bindings.  This means that initial values will be taken into account) (for L on PROGVARS do (if (EQ (CAR D) (CAR L)) then [FRPLACA L (CONS (CAR L) (CONS NIL (CDR D] (RETURN) elseif (AND (LISTP (CAR L)) (EQ (CAR D) (CAAR L))) then [if (NLISTP (CDAR L)) then (FRPLACD (CAR L) (LIST (CDAR L] (* In case it's a list with no CADR) (NCONC (CAR L) (CDR D)) (RETURN)) finally (push DECL D)) elseif (EQ (CAR D) 'RETURNS) then (push RETURNS D) else (push DECL D)) finally (FRPLACD F (DREVERSE DCLARE] [if DECL then (push (CDDR DFORM) (CONS 'DECL (DREVERSE DECL] (RESETVARS (CLISPRETRANFLG) (* Resetting this flag avoids  redundancies in a !DW) (if RETURNS then (SETQ TRAN (LIST 'DPROGN (DREVERSE RETURNS) TRAN)) (DWIMIFY0? TRAN TRAN NIL NIL NIL FAULTFN) (* Only happens for a MAPC/AR etc that has a RETURNS) (SETQ TRAN (PROG1 (CAR (CDDDDR (GETHASH TRAN CLISPARRAY))) (PUTHASH TRAN NIL CLISPARRAY))) (* Skip down to the CHECKVALUE) else (DWIMIFY0? DFORM DFORM NIL NIL NIL FAULTFN))) (if (PROG1 (SETQ DECL (GETHASH DFORM CLISPARRAY)) (PUTHASH DFORM NIL CLISPARRAY)) then (* Don't clobber DFORM with an empty translation, which probably comes from a  lower-level error) (FRPLNODE2 DFORM DECL) else (SETQ TRAN NIL] (REALCLISPTRAN X TRAN]) (DECLMSG [NLAMBDA DECLMSG (* rmk%: "16-AUG-81 23:17") (* Purely for saving storage. For list declarations, the DECL argument of  ASSERTFAULT and VALUEERROR is compiled as a call to DECLMSGMAC which has a  macro that calls DECLMSG as a compiletime or loadtime constant.  We attempt to find an already existing copy of that list-structure, and if we  do, we return a pointer to that instead) (DECLARE (SPECVARS DECLMSG) (GLOBALVARS DECLTYPESARRAY DECLMESSAGES)) (if (GETHASH DECLMSG DECLTYPESARRAY) then (* This never works when we're loading from a file, but always works when we  are storing the compiled code directly into core.) DECLMSG else [foreachTB TB (if (EQUAL DECLMSG (fetch NAME of TB)) then (RETFROM 'DECLMSG (fetch NAME of TB] (* Fall through if didn't locate it. Look it up on our special message database  list.) (CAR (OR (MEMBER DECLMSG DECLMESSAGES) (push DECLMESSAGES DECLMSG]) (DECLDWIMERROR [LAMBDA ARGS (* bas%: "10-OCT-79 18:24") (DECLARE (USEDFREE FAULTFN)) (LISPXTERPRI T) (LISPXPRIN1 "{in " T) (LISPXPRIN1 FAULTFN T) (LISPXPRIN1 "} " T) (for I to ARGS do (if (EQ T (ARG ARGS I)) then (LISPXTERPRI T) else (LISPXPRIN1 (ARG ARGS I) T))) (LISPXTERPRI T) (ERROR!]) (DECLDWIMTESTFN [LAMBDA (TB) (* rmk%: " 6-FEB-82 14:26") (* Returns the dwimified TESTFN of TB) (DECLARE (USEDFREE FAULTFN)) (PROG ((FN (fetch TESTFN of TB))) (if [AND (LISTP FN) (OR CLISPRETRANFLG (NOT (GETHASH FN CLISPARRAY] then (DWIMIFY0? FN FN NIL NIL NIL FAULTFN) (* We hash the FN to itself to avoid repetitive dwimification unless  CLISPRETRANFLG is on. But we're careful to avoid circularity if FN begins with  a CLISPWORD.) (OR (GETHASH FN CLISPARRAY) (PUTHASH FN FN CLISPARRAY))) (RETURN FN]) (DECLSET [LAMBDA (VAR VAL) (* rmk%: "11-NOV-83 08:00") (* Version of SET that does ASSERT checks.  This is moved to SET when DECLTRAN is loaded.  The old definition of SET is available through the name REALSET.  Uses VARSETFN to find the run-time type-dependent SETFN, which will be that for  the lowest declaration on the satisfieslist for a DPROGN) (DECLARE (LOCALVARS . T)) (PROG1 (APPLY (VARSETFN VAR) (LBOX VAR (KWOTEBOX VAL))) (\VARASRT VAR]) (DECLSETQ [NLAMBDA U (* rmk%: "11-NOV-83 08:00") (* Version of SETQ that does ASSERT checks.  The old definition of SETQ is available through the name REALSETQ.  The contortions are so DWIM gets to see the value forms in the environment of  the running function.) (DECLARE (LOCALVARS . T)) (WITH [(V (APPLY (FUNCTION PROG1) (CDR U) 'INTERNAL] (* Bind the value so no recursion thru  the LBOX) (PROG1 (APPLY (VARSETFN (CAR U)) (LBOX (CAR U) (KWOTEBOX V)) 'INTERNAL) (\VARASRT (CAR U]) (DECLSETQQ [NLAMBDA (XSET YSET) (* bas%: " 1-NOV-79 17:54") (APPLY* (FUNCTION DECLSETQ) XSET (KWOTEBOX YSET]) (DECLTRAN [LAMBDA (FORM) (* DECLARATIONS%: FAST  (RECORD FORM (ATOM DCLS . FORMS))) (* rmk%: " 2-Nov-84 15:24") (* Translator for declarative  statements) (DECLARE (USEDFREE VARS CLISPCHANGE)) (* Used for DPROGN variable names) (SETQ CLISPCHANGE T) (PROG (TEMP CLISP%: DECLARE TOP BS PROGDCLS SPECVARS SAT INITVARS VARBINDFORMS RETURNS LOCALVARS (ATOM (fetch ATOM of FORM)) (FORMS (fetch FORMS of FORM)) (VARS VARS)) (DECLARE (SPECVARS VARS DECLARE PROGDCLS SPECVARS SAT INITVARS RETURNS LOCALVARS VARBINDFORMS)) (if (LISTP (SETQ TEMP (fetch DCLS of FORM))) then [for V in old TEMP do (if (AND (EQ ATOM 'DPROG) (EQ V 'THEN)) then [SETQ FORMS (LIST (LIST 'RETURN (CONS 'DPROG (CONS (CDR TEMP) FORMS] (RETURN)) (DECLVAR V (EQ ATOM 'DPROG) (NEQ ATOM 'DPROGN] (SETQ PROGDCLS (DREVERSE PROGDCLS)) else (if (AND TEMP (LITATOM TEMP) (EQ ATOM 'DLAMBDA)) then (DECLVAR (LIST TEMP 'CARDINAL) NIL T) (* Handles no-spread case;  not necessary to do \CHKINIT) (SETQ INITVARS NIL)) (SETQ PROGDCLS TEMP)) (if [AND (EQ ATOM 'DLAMBDA) (OR (EQ [CAR (SETQ TEMP (LISTP (CAR FORMS] 'CLISP%:) (AND (EQ (CAR TEMP) COMMENTFLG) (EQ (CADR TEMP) 'DECLARATIONS%:] then (SETQ CLISP%: TEMP) (SETQ FORMS (CDR FORMS))) [if (NEQ ATOM 'DPROGN) then (for F DECL in old FORMS do (if (NLISTP F) then (GO $$OUT) elseif (EQ (CAR F) COMMENTFLG) elseif (EQ (CAR F) 'DECLARE) then (* APPEND combines multiple declares) (SETQ DECLARE (APPEND DECLARE (CDR F))) elseif (EQ (CAR F) 'DECL) then (SETQ DECL (APPEND DECL (CDR F))) else (GO $$OUT)) finally [if (EQ ATOM 'DPROG) then (* This PROG represents the user's PROG, to which his RETURN and GO statements  are referred. The PROG introduced below is for the actual bindings, and allows  intervening checks for variables and RETURNS to be inserted.) (SETQ FORMS (LIST (CONS 'PROG (CONS NIL FORMS] (if DECL then (SETQ FORMS (LIST (CONS 'DPROGN (CONS DECL FORMS] (* The test-functions don't appear in the code, so they have to be dwimified  separately. This can't be done in MAKEDECLTYPE, because the variables in the  testfn aren't known until this whole binding set has been processed to add them  to VARS. -  We don't have to worry about set and bind functions, cause they are attached  only to named types and thus are dwimified when the type is defined.) [for V in SAT when (SETQ V (fetch VARDECL of V)) do (DECLDWIMTESTFN (OR (FINDDECLTYPE (fetch DECL of V)) (SHOULDNT] (if SPECVARS then (push DECLARE (CONS 'SPECVARS SPECVARS))) (if LOCALVARS then (push DECLARE (CONS 'LOCALVARS LOCALVARS))) [if RETURNS then (SETQ FORMS (LIST (CONS 'the (CONS RETURNS FORMS] (if DECLARE then (push DECLARE 'DECLARE)) (SETQ BS (CONS 'PROGN (NCONC [if INITVARS then (LIST (CONS '\CHKINIT (DREVERSE INITVARS] FORMS))) [if VARBINDFORMS then (FRPLACD BS (NCONC (DREVERSE VARBINDFORMS) (CDR BS] (* VARBINDFORMS is hook for  type-dependent initializations) (SELECTQ ATOM ((DLAMBDA) (* In parens to suppress PPDECL here) (SETQ FORMS (LIST BS)) (if DECLARE then (push FORMS DECLARE)) [push FORMS (CONS COMMENTFLG '(ASSERT%: (CLISP DLAMBDA] (if CLISP%: then (push FORMS CLISP%:)) (SETQ TOP (CONS 'LAMBDA (CONS PROGDCLS FORMS)))) ((DPROG) (SETQ TOP (LIST 'PROG PROGDCLS (LIST 'RETURN BS))) (if DECLARE then (push (CDDR TOP) DECLARE))) (SETQ TOP BS)) (* DPROGN falls through) (PROG (NEWSATLIST) (* Lower decl's are not new.) (DECLARE (SPECVARS NEWSATLIST)) (DWIMIFY0? TOP TOP NIL NIL NIL FAULTFN)) (if (OR SAT NEWSATLIST) then (FRPLACA BS '\*DECL) (* If no variables were declared, leave the PROGN that was to make sure that  the forms got dwimified correctly) (SETQ SAT (DREVERSE SAT)) (* So satlist is ordered like decls) (push (CDR BS) (if (AND NEWSATLIST SAT) then (LIST SAT) else SAT))) (* We can do the extra CONS statically when this is a newsatlist) (RETURN (if (EQ ATOM 'DLAMBDA) then TOP else (REALCLISPTRAN FORM TOP) FORM]) (DECLVAR [LAMBDA (VARD DPROGFLAG BINDFLAG) (* DECLARATIONS%: FAST) (* rmk%: " 2-Nov-84 15:33") (DECLARE (USEDFREE FAULTFN DECLARE RETURNS SAT INITVARS PROGDCLS LOCALVARS SPECVARS VARBINDFORMS VARS) (GLOBALVARS GLOBALVARS)) (PROG (TYPEBLOCK DECL TEMP TESTFORM NAME INITV TAIL SATFORM (PROGNFLAG (NOT BINDFLAG))) (if (LISTP VARD) then (SETQ NAME (CAR VARD)) (SELECTQ NAME ((RETURNS VALUE) (if RETURNS then (DECLVARERROR "Multiple RETURNS/VALUE declaration")) (SETQ DPROGFLAG (SETQ BINDFLAG NIL)) (SETQQ NAME VALUE)) NIL) (SETQ TAIL (CDR VARD)) (if DPROGFLAG then (RESETVARS ((NOSPELLFLG T) (DWIMESSGAG T)) (DWIMIFY0? TAIL VARD TAIL NIL NIL FAULTFN)) (* This will glue all the components of the initial value together.  It will also walk through the declarations, but no spelling corrections will be  done. Corrections in the SATISFIES will happen when the whole translation is  dwimified in DECLTRAN.) (SETQ INITV (pop TAIL))) else (SETQ NAME VARD)) (if (NOT (AND NAME (LITATOM NAME))) then (DECLVARERROR "Illegal variable name")) (for V in TAIL do (* RETRY is a label) RETRY (if (if BINDFLAG then [SELECTQ V (SPECIAL (if (FMEMB NAME LOCALVARS) then (DECLVARERROR "Variable can't be both LOCAL and SPECIAL: " NAME) else (push SPECVARS NAME))) (LOCAL (if (FMEMB NAME SPECVARS) then (DECLVARERROR "Variable can't be both LOCAL and SPECIAL: " NAME) else (push LOCALVARS NAME))) (if (EQ (CAR (LISTP V)) 'USEDIN) then (if (FMEMB NAME LOCALVARS) then (DECLVARERROR "Variable can't be both LOCAL and USEDIN: " NAME) else (push SPECVARS NAME] elseif (EQ V 'GLOBAL) then (pushnew GLOBALVARS NAME) elseif (OR (EQ V 'FREE) (EQ (CAR (LISTP V)) 'BOUNDIN)) then (SETQ PROGNFLAG 'FREE)) elseif (EQ (CAR (LISTP V)) 'SATISFIES) then (if SATFORM then (DECLVARERROR "Multiple SATISFIES")) (SETQ SATFORM V) elseif (EQ (CAR (LISTP V)) COMMENTFLG) elseif (SETQ TEMP (GETDECLTYPE.NOERROR V NAME)) then (if TYPEBLOCK then (DECLVARERROR "more than one type declaration: " V)) (SETQ TYPEBLOCK TEMP) (SETQ DECL V) elseif (AND (LISTP V) (FIXSPELL (CAR V) 80 '(SATISFIES BOUNDIN USEDIN) T V)) then (AND FAULTFN (NEQ FAULTFN 'TYPE-IN) (MARKASCHANGED FAULTFN 'FNS)) (GO RETRY) else (DECLVARERROR "invalid declaration: " V))) (if (NULL TYPEBLOCK) then (SETQQ DECL ANY)) (if SATFORM then (SETQ DECL (LIST DECL SATFORM)) (if (NULL (SETQ TYPEBLOCK (GETDECLTYPE.NOERROR DECL NAME))) then (DECLVARERROR "invalid declaration: " DECL))) (if (EQ NAME 'VALUE) then (SETQ RETURNS DECL) (* This gets reprocessed by THETRAN) (RETURN)) (if BINDFLAG then (for D in PROGDCLS when [OR (EQ NAME D) (EQ NAME (CAR (LISTP D] do (DECLVARERROR "more than one binding for " NAME))) (* TYPEBLOCK=NIL if default ANY with  no SATISFIES) [if TYPEBLOCK then (if (SETQ TEMP (GETTBPROP TYPEBLOCK 'DECLARESPEC)) then (push DECLARE (SUBST NAME 'VAR TEMP))) (if (EQ (SETQ TEMP (fetch BINDFN of TYPEBLOCK)) (CONSTANT DefaultBindFn)) elseif DPROGFLAG then [SETQ INITV (CONS TEMP (if INITV then (LIST INITV) else (* Indicate that the initialization is  not to be checked) (SETQ DPROGFLAG NIL] else (push VARBINDFORMS (LIST 'REALSETQ NAME (LIST TEMP NAME] (if (NEQ DECL 'ANY) then (* A missing VARDECL is interpreted as ANY, so don't bother to stick one in.) (push SAT (create SLISTENTRY VARNAME _ NAME VARDECL _ (create VARDECL DECL _ DECL PROGNFLAG _ PROGNFLAG))) (* PROGNFLAG means that inherited  declarations will be checked) (if (if INITV then DPROGFLAG elseif (NULL DPROGFLAG)) then (push INITVARS NAME)) elseif BINDFLAG then (* The empty VARDECL conceals type  information for higher declarations) (push SAT (create SLISTENTRY VARNAME _ NAME VARDECL _ NIL))) (if BINDFLAG then (push PROGDCLS (if INITV then (LIST NAME INITV) else NAME))) (push VARS NAME]) (DLAMARGLIST [LAMBDA (DEF) (* rmk%: " 6-APR-78 10:13") (if (LISTP (CADR DEF)) then (for A in (CADR DEF) unless (EQ (CAR (LISTP A)) 'RETURNS) collect (if (LISTP A) then (CAR A) else A)) else (CADR DEF]) (DTYPE?TRAN [LAMBDA (FORM) (* bas%: " 6-NOV-79 16:58") (SETQ CLISPCHANGE T) (if LCASEFLG then (/RPLACA FORM 'type?)) [PROG (TESTFORM (TYPEBLOCK (GETDECLTYPE.NOERROR (CADR FORM))) (FORMS (CDDR FORM))) (if (NULL TYPEBLOCK) then (DECLDWIMERROR "invalid type declaration: " (CADR FORM))) (DWIMIFY0? FORMS FORM NIL NIL NIL FAULTFN) (* The forms are dwimified first so that we can decide whether the testform  should be set-up for a bound VALUE.) (SETQ FORMS (if (CDR FORMS) then (CONS 'PROGN FORMS) else (CAR FORMS))) (SETQ TESTFORM (APPLYFORM (DECLDWIMTESTFN TYPEBLOCK) FORMS)) (REALCLISPTRAN FORM (if (NEQ TESTFORM T) then TESTFORM elseif (LISTP FORMS) then (LIST 'PROGN FORMS T) else (* Cause PPT prints a non-list  translation funny) '(PROGN T] FORM]) (EDITNEWSATLIST [LAMBDA NIL (* rmk%: " 7-SEP-81 03:31") (* Called from DW edit macro. True if there is no higher declarative on the  current edit chain.) (DECLARE (USEDFREE L)) (NOTANY (CDR L) (FUNCTION (LAMBDA (X) (AND (LISTP X) [OR (LITATOM (SETQ X (CAR X))) (LITATOM (SETQ X (CAR X] (OR (FMEMB X DECLATOMS) (EQ (CAR (GETPROP X 'CLISPWORD)) 'FORWORD]) (FORMUSESTB [LAMBDA (FORM TRANS TB) (* rmk%: " 9-NOV-83 09:24") (* Decides if FORM or its TRANSlation made use of the definition of the  typeblock TB (Currently, T for any decl expression regardless of typeblock)) (OR [AND (LISTP FORM) (FMEMB (CAR FORM) '(type? TYPE? the THE DLAMBDA DPROG DPROGN] (AND (LISTP TRAN) (OR (EQ (CAR TRAN) '\*DECL) (AND (EQ [CAR (LISTP (GETP (CAR (LISTP FORM)) 'CLISPWORD] 'FORWORD) (EQ [CAR (LISTP (SETQ TRAN (CAR (LAST TRAN] 'RETURN) (EQ [CAR (LISTP (CAR (LISTP (CDR TRAN] '\*DECL]) (IGNOREDECL [LAMBDA NIL (* rmk%: " 4-APR-79 00:04") (* Should be called only in macros; T if the function currently being compiled  should have debug information suppressed) (* FN is bound by COMPILE1 during ordinary compile, XXX during block compile.  The LISTP check inhibits the EVALV, and is necessary when called from  CHECKVALUEMAC inside masterscope.) (DECLARE (USEDFREE COMPILEIGNOREDECL)) (OR (EQ COMPILEIGNOREDECL T) (AND (LISTP COMPILEIGNOREDECL) (MEMB (EVALV 'FN 'COMPILE1) COMPILEIGNOREDECL) T]) (MAKETESTFORM [LAMBDA (VAR TYPE) (* rmk%: "16-AUG-81 23:12") (* Makes a form that tests VAR to be of type TYPE and reports errors if test  fails) (WITH ((TEST (APPLYFORM (fetch TESTFN of TYPE) VAR))) (if (EQ TEST T) then (CBOX COMMENTFLG (LBOX (LBOX 'ASSERT VAR))) else (LIST 'OR TEST (LIST 'ASSERTFAULT (WITH ((TN (fetch NAME of TYPE))) (if (LISTP TN) then (CONS 'DECLMSGMAC TN) else (KWOTE TN))) (KWOTE VAR]) (PPDECL [LAMBDA (FORM) (* rmk%: "28-JUN-82 12:44" posted%:  "17-MAY-77 22:06") (* Special prettyprinter for DLAMBDA's  and DPROG's. Called from  PRETTYPRINTMACROS) (DECLARE (GLOBALVARS %#RPARS CLISPARRAY PRETTYTRANFLG COMMENTFLG)) (COND ((OR (NLISTP (CDR FORM)) (AND PRETTYTRANFLG (GETHASH FORM CLISPARRAY))) FORM) (T (SELECTQ (CAR FORM) (DLAMBDA [PROG [(FORMPOS (IPLUS 2 (POSITION] (PRIN1 (COND (%#RPARS "[") (T "("))) (PRIN1 "DLAMBDA ") (PPVARLIST (CADR FORM)) (COND ((AND (LISTP (SETQ FORM (CDDR FORM))) (NEQ (CAR FORM) COMMENTFLG)) (printout NIL .TAB0 FORMPOS))) (PRINTDEF FORM FORMPOS T T FNSLST) (PRIN1 (COND (%#RPARS "]") (T ")"]) (DPROG (PROG [FORMPOS (LABELPOS (ADD1 (POSITION] (* For DPROG's. Highlights the THEN's in the argument list and formats initial  values) (SETQ FORMPOS (IPLUS LABELPOS 4)) (PRIN1 "(DPROG ") [COND ((LISTP (CADR FORM)) (PRIN1 "(") [for V VTAIL (LASTLIST _ T) (VARPOS _ (IPLUS LABELPOS 7)) in (CADR FORM) do (COND ((LISTP V) (printout NIL .TAB0 VARPOS "(" |.P2| (CAR V)) [COND ((SETQ VTAIL (CDR V)) (SPACES 1) (for X in old VTAIL do (PRINTDEF X (POSITION) T NIL FNSLST) repeatwhile (FMEMB (COND ((AND (LISTP X) (NLISTP (CADR VTAIL))) (NTHCHAR (CADR VTAIL) 1)) ((AND (NLISTP X) (LISTP (CADR VTAIL))) (NTHCHAR X -1))) CLISPCHARS) finally (SETQ VTAIL (CDR VTAIL))) (* Supress spaces in clisp initial  values) (for X in VTAIL do (SPACES 1) (PRINTDEF X (POSITION) T NIL FNSLST] (COND ((ILESSP (POSITION) VARPOS) (TAB VARPOS) (PRIN1 ")")) (T (PRIN3 ")"))) (SETQ LASTLIST T)) ((EQ V 'THEN) (printout NIL .TAB0 (IPLUS LABELPOS 2) 'THEN)) (T (COND (LASTLIST (TAB VARPOS 0)) (T (SPACES 1))) (SETQ LASTLIST NIL) (PRIN2 V] (PRIN3 ")")) (T (PRIN2 (CADR FORM] [for F in (CDDR FORM) do (COND ((LITATOM F) (printout NIL .TAB LABELPOS |.P2| F)) (T (COND ((NEQ (CAR (LISTP F)) COMMENTFLG) (printout NIL .TAB0 FORMPOS))) (PRINTDEF F (POSITION) T NIL FNSLST] (PRIN1 ")"))) (DECL (PRIN1 "(DECL ") (PPVARLIST (CDR FORM) T) (PRIN3 ")")) (DPROGN (PROG [(FORMPOS (IPLUS 3 (POSITION] (PRIN1 "(DPROGN ") (PPVARLIST (CADR FORM)) (COND ((AND (LISTP (SETQ FORM (CDDR FORM))) (NEQ (CAR FORM) COMMENTFLG)) (printout NIL .TAB0 FORMPOS))) (PRINTDEF FORM FORMPOS T T FNSLST) (PRIN1 ")"))) NIL) NIL]) (PPVARLIST [LAMBDA (VLIST TAILFLG) (* rmk%: "12-JUN-78 16:07") (* Pretty-prints the variable declarations for DLAMBDA, DPROGN, DECL.  The list begins at the current line position;  unless TAILFLG, enclosing parens are printed) (if (LISTP VLIST) then (OR TAILFLG (PRIN1 "(")) (for V (VARPOS _ (POSITION)) (LASTLIST _ T) in VLIST do (if (LISTP V) then (printout NIL .TAB0 VARPOS "(" |.P2| (CAR V)) (for X in (CDR V) do (SPACES 1) (PRINTDEF X (POSITION) T NIL FNSLST)) (if (ILESSP (POSITION) VARPOS) then (TAB VARPOS) (PRIN1 ")") else (PRIN3 ")")) (SETQ LASTLIST T) else (if LASTLIST then (TAB VARPOS 0) else (SPACES 1)) (SETQ LASTLIST NIL) (PRIN2 V)) finally (if $$LST1 then (PRIN1 " . ") (PRIN2 $$LST1))) (OR TAILFLG (PRIN3 ")")) else (PRIN2 VLIST]) (SETQMAC [LAMBDA (ARGS) (* bas%: "18-OCT-79 18:22") (* Compiler macro for SETQ.  Enforces declarations.) (PROG [SETFORM (TB (TYPEBLOCKOF (CAR ARGS] (SETQ SETFORM (CONS (fetch SETFN of TB) ARGS)) (* We can suppress the run time test if either IGNOREDECLS, type is ANY, the  value is a constant which passes the test fn now, or TB covers the possible set  of values. Can't do constant evaluation if there's a setfn, cause a setfn  clearly must have side-effects, and it may be doing coercions.) (RETURN (if [OR (IGNOREDECL) (EQ (fetch TYPEXP of TB) 'ANY) [AND (EQ (fetch SETFN of TB) (CONSTANT DefaultSetFn)) (DECLCONSTANTP (CADR ARGS)) (PROG (TEMP HELPFLAG (TST (fetch TESTFN of TB))) (DECLARE (SPECVARS HELPFLAG)) (RETURN (AND (OR (SUBRP TST) (NOT (FREEVARS TST))) [NLSETQ (OR [SETQ TEMP (APPLY* TST (EVAL (CADR ARGS] (COMPEM " Warning: Probable type fault in" (CONS 'SETQ ARGS] TEMP] (COVERSTB TB (TYPEBLOCKOF (if (EQ (fetch SETFN of TB) (CONSTANT DefaultSetFn)) then SETFORM else (CADR ARGS] then (* The variable's type includes the  value's, so we're OK.) SETFORM else (* PROG1 is used rather than embedding the SETFORM in the test to give  MAKEAPPLYFORM a better chance of simplifying) (LIST 'PROG1 SETFORM (MAKETESTFORM (CAR ARGS) TB]) (THETRAN [LAMBDA (FORM) (* rmk%: " 9-NOV-83 09:17") (DECLARE (USEDFREE LCASEFLG CLISPCHANGE)) (SETQ CLISPCHANGE T) (if LCASEFLG then (/RPLACA FORM 'the)) [WITH [(TYPEBLOCK (GETDECLTYPE.NOERROR (CADR FORM] (if (NULL TYPEBLOCK) then (DECLDWIMERROR "invalid type declaration: " (CADR FORM))) (DWIMIFY0? (CDDR FORM) FORM (CDDR FORM) NIL NIL FAULTFN) (WITH [(TESTFORM (APPLYFORM (DECLDWIMTESTFN TYPEBLOCK) 'VALUE)) (VALFORM (if (CDDDR FORM) then (CONS 'PROGN (CDDR FORM)) else (CADDR FORM] (REALCLISPTRAN FORM (if (EQ TESTFORM T) then VALFORM else (LIST '\CHKVAL (APPLYFORM [LAMVAL (LIST 'COND (LIST TESTFORM 'VALUE) (LIST T (LIST 'VALUEERROR 'VALUE (if (LISTP (CADR FORM)) then (CONS 'DECLMSGMAC (CADR FORM)) else (KWOTE (CADR FORM] VALFORM] FORM]) (VALUEERROR [LAMBDA (VALUE DECL) (* rmk%: "16-AUG-81 15:48") (DECLARE (SPECVARS VALUE)) (LISPXPRIN1 " VALUE ASSERTION NOT SATISFIED IN " T) (bind POS when [LITATOM (STKNAME (SETQ POS (REALSTKNTH -1 (OR POS 'VALUEERROR) NIL POS] do (LISPXPRIN2 (STKNAME POS) T) (RELSTK POS) (RETURN)) (* VALUE is the break expression so that an OK will simply return it.  Also, typing the command VALUE in the break will cause VALUE to be printed out,  given the EVAL command that sets it up. There are some paradoxes though%: If  the user sets VALUE, he will not see the change in the break unless he does  another EVAL. Instead, he must work with !VALUE.) (APPLY* (FUNCTION BREAK1) 'VALUE T (LIST 'VALUE DECL) '(EVAL]) (\VARASRT [LAMBDA (VARNAME) (* rmk%: " 2-DEC-78 14:47") (* Checks all the declaration predicates for VARNAME in the run-time context.) (DECLARE (LOCALVARS . T) (USEDFREE SATISFIESLIST)) (VARASRT1 VARNAME SATISFIESLIST]) (VARASRT1 [LAMBDA (VARNAME SLIST) (* bas%: " 9-OCT-79 23:24") (* Checks all run-time assertions for VARNAME.  Evaluates the highest predicate in the current scope first for DPROGN  variables.) (DECLARE (LOCALVARS . T)) (for S D in old SLIST when (SETQ D (ASSOC VARNAME S)) do (if (NULL (SETQ D (fetch VARDECL of D))) then (RETURN)) (if (fetch PROGNFLAG of D) then (VARASRT1 VARNAME (CDR SLIST))) (if (APPLY* (fetch TESTFN of (GETDECLTYPE (fetch DECL of D) VARNAME)) (EVALV VARNAME)) then (RETURN)) (ASSERTFAULT (fetch DECL of D) VARNAME]) (VARSETFN [LAMBDA (VARNAME) (* rmk%: " 2-Nov-84 15:05") (* Called by DECLSET and returns the setfn for VARNAME, or NIL if there isn't  one. The setfn is the lowest one found on a DPROGN chain.  Should be equivalent to (fetch SETFN of (VARDECL VARNAME T))%, but is opencoded  to avoid consing up the type each time.) (DECLARE (USEDFREE SATISFIESLIST)) (for S TEMP D in SATISFIESLIST when (SETQ D (ASSOC VARNAME S)) do (RETURN (fetch SETFN of (GETDECLTYPE (if (NULL (SETQ D (fetch VARDECL of D))) then 'ANY else (fetch DECL of D)) VARNAME))) finally (RETURN (CONSTANT DefaultSetFn]) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK%: DECLTRAN DECLTRAN DECLVAR) (BLOCK%: PPDECL PPDECL PPVARLIST) (BLOCK%: \VARASRT \VARASRT VARASRT1) ) (* Declaration database fns) (DEFINEQ (DECLOF [LAMBDA (FORM DECLCONTEXT) (* bas%: "31-JUL-79 13:40") (* Returns a declaration for FORM in the context maintained by the code reading  system DECLCONTEXT) (DECLARE (USEDFREE CSATISFIESLIST SATISFIESLIST DECLVARSLST)) (fetch NAME of (TBOF FORM (SELECTQ DECLCONTEXT (COMPILER CSATISFIESLIST) (INTERPRETER SATISFIESLIST) (NIL (if (BOUNDP DECLVARSLST) then DECLVARSLST else CSATISFIESLIST)) (ERRORX (LIST 27 DECLCONTEXT]) (DECLOF1 [LAMBDA (FORM) (* rmk%: " 9-NOV-83 09:24") (* Computes a declaration form for FORM.  May be redundant as it will be checked in DECLOF.) (if (LITATOM FORM) then (SELECTQ FORM (NIL NIL) (T '(MEMQ T)) (VARDECL FORM)) elseif (LISTP FORM) then [PROG (TEMP) (RETURN (if (LITATOM (CAR FORM)) then [OR (if (AND (EQ [CAR (LISTP (SETQ TEMP (GETP (CAR FORM) 'DECLOF] 'FUNCTION) (NEQ (CAR (LISTP (CDR TEMP))) 'SATISFIES)) then (APPLY* (CADR TEMP) FORM) else TEMP) (SELECTQ (CAR FORM) ((SETQ SETQQ) [PROG [VSF (VD (VARDECL (CADR FORM] (SETQ VSF (fetch SETFN of (GETDECLTYPE VD))) (RETURN (if (EQ VSF (CONSTANT DefaultSetFn)) then [LIST 'ALLOF VD (if (EQ (CAR FORM) 'SETQQ) then (LIST 'MEMQ (CADDR FORM)) else (DECLOF1 (CADDR FORM] else (DECLOF1 (CONS VSF (CDR FORM]) (PROG (* Declaration is known only if the first and only executable statement in the  prog is a RETURN) [for TAIL TEMP on (CDDR FORM) suchthat (SELECTQ (SETQ TEMP (CAAR TAIL)) ((ASSERT DECLARE) NIL) (NEQ TEMP COMMENTFLG)) finally (RETURN (if (AND (EQ TEMP 'RETURN) (NULL (CDR TAIL))) then (DECLOF1 (CADAR TAIL)) else 'ANY]) (PROGN (DECLOF1 (CAR (LAST FORM)))) (COND [for CL D TFLAG in (CDR FORM) unless (if (EQ [SETQ D (DECLOF1 (CAR (LAST CL] 'ANY) then (RETURN 'ANY) else (if (EQ (CAR CL) T) then (SETQ TFLAG T)) (MEMBER D $$VAL)) collect D finally (if (NOT (OR TFLAG (FMEMB NIL $$VAL))) then (SETQ $$VAL (NCONC1 $$VAL NIL))) (RETURN (if (CDR $$VAL) then (CONS 'ONEOF $$VAL) else (CAR $$VAL]) (SELECTQ [for TAIL D on (CDDR FORM) unless (if (EQ [SETQ D (DECLOF1 (if (CDR TAIL) then (CAR (LAST (CDAR TAIL))) else (CAR TAIL] 'ANY) then (RETURN 'ANY) else (MEMBER D $$VAL)) collect D finally (RETURN (if (CDR $$VAL) then (CONS 'ONEOF $$VAL) else (CAR $$VAL]) ((REPLACEFIELD FREPLACEFIELD /REPLACEFIELD) (DECLOF1 (CADDDR FORM))) (REALSETQ (DECLOF1 (CADDR FORM))) ((FETCHFIELD FFETCHFIELD) (if (FIXP (CADR FORM)) then (SELECTQ (LRSH (LOGAND (CADR FORM) 12582912) 22) (1 'FIXP) (2 'FLOATP) (3 (* FLAG) '(MEMQ NIL T)) (PROGN (* 0=pointer) 'ANY)) else 'ANY)) (REPLACEFIELDVAL (DECLOF1 (CADDR FORM))) (PROG1 (DECLOF1 (CADR FORM))) (\*DECL [PROG [(DECLVARSLST (if [OR (NULL (CADR FORM)) (LISTP (CAR (CAADR FORM] then (CADR FORM) else (CONS (CADR FORM) DECLVARSLST] (* Maintain proper DECLVARSLST for  recursion) (DECLARE (SPECVARS DECLVARSLST)) (RETURN (DECLOF1 (CAR (LAST (CDDR FORM]) ((the THE) (CADR FORM)) ((create CREATE) (CADR FORM)) (QUOTE (* Could be done in the constant eval, but here for efficiency cause very  common) (LIST 'MEMQ (CADR FORM))) (if (AND (NEQ FORM (SETQ TEMP (EXPANDMACRO FORM T))) (NEQ TEMP 'IGNOREMACRO)) then (DECLOF1 TEMP) else (if [SETQ TEMP (OR (GETHASH FORM CLISPARRAY) (AND (GETP (CAR FORM) 'CLISPWORD) (RESETVARS (FILEPKGFLG (NOSPELLFLG T) (DWIMESSGAG T)) (DWIMIFY0? FORM FORM) (RETURN (GETHASH FORM CLISPARRAY] then (DECLOF1 TEMP) elseif (DECLCONSTANTP FORM) then (LIST 'MEMQ (EVAL FORM)) else 'ANY] elseif [AND (LISTP (CAR FORM)) (SETQ TEMP (SELECTQ (CAAR FORM) ([LAMBDA NLAMBDA] (CAR (LAST (CDDAR FORM)))) (PROGN (* Hope it's a translated LAMBDAWORD) (GETHASH (CAR FORM) CLISPARRAY] then (DECLOF1 TEMP) else 'ANY] else (LIST 'MEMQ FORM]) (TBOF [LAMBDA (FORM DECLVARSLST) (* bas%: " 9-OCT-79 23:27") (* Returns a type block for the value  of form) (DECLARE (SPECVARS DECLVARSLST)) (* DECLVARSLST is SPECIAL for an eventual call on VARDECL on an atom.) (GETDECLTYPE (DECLOF1 FORM]) (TYPEBLOCKOF [LAMBDA (FORM) (* bas%: "31-JUL-79 13:40") (* Gets type block for compiler  declaration of FORM) (DECLARE (USEDFREE CSATISFIESLIST)) (TBOF FORM CSATISFIESLIST]) (VARDECL [LAMBDA (VARNAME) (* bas%: "30-JUL-79 18:07") (* Returns the declaration for VARNAME. The declaration will include all  inherited attributes for DPROGN variables.) (DECLARE (USEDFREE DECLVARSLST)) (for S ONE DECLS D in DECLVARSLST when (SETQ D (fetch VARDECL of (ASSOC VARNAME S))) do (if ONE then (SETQ DECLS (LIST (fetch DECL of D) ONE)) (* ONE is to avoid the cons in the common single-test case) (SETQ ONE NIL) elseif DECLS then (push DECLS (fetch DECL of D)) else (SETQ ONE (fetch DECL of D))) (if (NOT (fetch PROGNFLAG of D)) then (GO $$OUT)) finally (RETURN (if DECLS then (CONS 'ALLOF (DREVERSE DECLS)) elseif ONE else 'ANY]) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK%: DECLOFBLK DECLOF DECLOF1 TBOF TYPEBLOCKOF VARDECL (ENTRIES DECLOF TYPEBLOCKOF)) ) (* Enabling and disabling fns) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (ACCESSFNS FNEQUIVS ((DECLFN (PACK* 'DECL DATUM)) (REALFN (PACK* 'REAL DATUM)))) ) (DECLARE%: EVAL@COMPILE [PUTPROPS MOVEPROP MACRO ((PROP FROM TO) (PUTIFPROP TO PROP (GETPROP FROM PROP] [PUTPROPS PUTIFPROP MACRO ((ATM PROP VAL) (WITH ((V VAL)) (COND (V (PUTPROP ATM PROP V)) (T (REMPROP ATM PROP) NIL] ) ) (DEFINEQ (STARTDECLS [LAMBDA NIL (* rmk%: "12-Mar-85 09:15") (* Repository of various code that sets up dummy function defns and other  things that would require P commands in the file coms.  Distinct from DODECLS which actually activates DECLs.) (for I in '(DECL WHOSE) do (MOVD? 'QUOTE I)) (for I in '(\CHKVAL \DECLPROGN) do (MOVD? 'PROGN I)) [for I in '(CHANGERECORD CLISPTRAN SETQ SET SETQQ) do (AND (MOVD? I (fetch REALFN of I)) (BOUNDP 'SYSLINKEDFNS) (BOUNDP 'LINKEDFNS) (FMEMB I SYSLINKEDFNS) (push LINKEDFNS (fetch REALFN of I] (for P in MACROPROPS do (MOVEPROP P 'SETQ 'REALSETQ)) (for P in MACROPROPS do (MOVEPROP P 'SET 'REALSET)) (if (AND (BOUNDP 'DECLTYPESARRAY) (EQ (ASKUSER DWIMWAIT 'N "Reinitialize DECLTYPE lattice? ") 'N)) else (INITDECLTYPES)) (for I in '((COVERS CALL (IF (EQ (CAR EXPR) 'QUOTE) [NIL (@ (TYPEMSANAL COVERS) '((|..| TYPE] EVAL) (IF (EQ (CAR EXPR) 'QUOTE) [NIL (@ (TYPEMSANAL COVERS) '((|..| TYPE] EVAL) . PPE) (SELCOVERSQ . MACRO) (SELTYPEQ . MACRO) (\*DECL NIL [IF NULL NIL (IF (LISTP (CAAR EXPR)) [(|..| (@ (TYPEMSANAL \*DECL) '((|..| TYPE) TEST] (|..| (@ (TYPEMSANAL \*DECL) '((|..| TYPE) TEST] |..| EFFECT RETURN) (\CHKINIT NIL) (\CHKVAL NIL EVAL) (THE @ (TYPEMSANAL the) '(CLISP (|..| TYPE) RETURN)) (TYPE? @ (TYPEMSANAL type?) '(CLISP (|..| TYPE) RETURN)) (the @ (TYPEMSANAL the) '(CLISP (|..| TYPE) RETURN)) (type? @ (TYPEMSANAL type?) '(CLISP (|..| TYPE) RETURN)) (VALUEERROR NIL)) do (PUTHASH (CAR I) (CDR I) MSTEMPLATES)) (DODECLS T]) (DODECLS [LAMBDA (FLG) (* DECLARATIONS%: (RECORD DSF  (ATM FN . PRPLST))) (DECLARE (USEDFREE COMPILEIGNOREDECL)) (* rmk%: "12-Mar-85 09:07") (* Turns decls on if FLG; off if not. If turning on when they are currently  off, then the old values are saved in a private cons so they can be restored if  DECLS are turned off.) (SETQ COMPILEIGNOREDECL (NOT FLG)) (* Reset the compile switch) (WITH [[DECLSETFROM '((CHANGERECORD T) (CLISPTRAN T) (SET T) (SETQ T BYTEMACRO NIL MACRO (ARGS (SETQMAC ARGS))) (SETQQ T) (TYPE? NIL CLISPWORD (DTYPE?TRAN . type?)) (type? NIL CLISPWORD (DTYPE?TRAN . type?] (DECLUNSAVELST (CONSTANT (LIST NIL] [if (AND FLG (NOT (CAR DECLUNSAVELST))) then (* Collect the values to be restored) (RPLACA DECLUNSAVELST (for F in DECLSETFROM collect (create DSF ATM _ (fetch ATM of F) FN _ (GETD (fetch ATM of F)) PRPLST _ (for J on (fetch PRPLST of F) by (CDDR J) join (LIST (CAR J) (GETPROP (fetch ATM of F) (CAR J] [for F in (if FLG then DECLSETFROM else (CAR DECLUNSAVELST)) do [WITH ((DEF (fetch FN of F))) (AND DEF (PUTD (fetch ATM of F) (if (AND FLG (EQ DEF T)) then (GETD (fetch DECLFN of (fetch ATM of F))) else DEF] (for J on (fetch PRPLST of F) by (CDDR J) do (PUTIFPROP (fetch ATM of F) (CAR J) (CADR J] (if FLG else (RPLACA DECLUNSAVELST NIL) (* Nothing saved anymore))) FLG]) ) (FILESLOAD (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) LAMBDATRAN) (DECLARE%: EVAL@COMPILE (FILESLOAD (SYSLOAD FROM VALUEOF LISPUSERSDIRECTORIES) SIMPLIFY) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DEFINEQ (IBOX [LAMBDA (IVAL) (* edited%: "29-Jan-85 17:28") (* If needed, give field the initial value defined in the record) (create IBOX I _ (OR IVAL 0]) (FBOX [LAMBDA (FVAL) (* rmk%: "23-SEP-77 09:39") (create FBOX F _ (OR FVAL 0.0]) (NBOX [LAMBDA (NVAL) (* rmk%: "10-OCT-77 10:17") (* A boxing function for numbers of unknown type.  Since most functions that produce unknown-typed numbers compile closed and box  internally, this is really useful only to copy boxes produced by those  functions into new boxes at setq's. E.g.  (SETQ X (NBOX Y))%, where previously there was  (SETQ Y (DIFFERENCE A B))) (if (FLOATP NVAL) then (create FBOX F _ NVAL) else (create IBOX I _ NVAL]) ) (MOVD? 'LIST 'LBOX) (MOVD? 'CONS 'CBOX) (DECLARE%: EVAL@COMPILE (BLOCKRECORD FBOX ((F FLOATING)) [CREATE (SELECTQ (SYSTEMTYPE) ((TENEX TOPS-20) (FPLUS 0.0)) (D (\CREATECELL (CONSTANT \FLOATP))) (HELP "FBOX CREATE NOT DEFINED FOR SYSTEMTYPE " (SYSTEMTYPE]) (BLOCKRECORD IBOX ((I INTEGER)) [CREATE (SELECTQ (SYSTEMTYPE) ((TENEX TOPS-20) (IPLUS 100000)) (D (\CREATECELL (CONSTANT \FIXP))) (HELP "IBOX CREATE NOT DEFINED FOR SYSTEMTYPE " (SYSTEMTYPE]) ) (DECLARE%: EVAL@COMPILE [PUTPROPS IBOX DMACRO (ARGS (COND (ARGS (APPEND '(create IBOX smashing (LOADTIMECONSTANT (\CREATECELL (CONSTANT \FIXP) )) I _) ARGS)) (T '(LOADTIMECONSTANT (\CREATECELL (CONSTANT \FIXP] [PUTPROPS FBOX DMACRO (ARGS (COND (ARGS (APPEND '(create FBOX smashing (LOADTIMECONSTANT (\CREATECELL (CONSTANT \FLOATP)) ) F _) ARGS)) (T '(LOADTIMECONSTANT (\CREATECELL (CONSTANT \FLOATP] [PUTPROPS NBOX DMACRO (OPENLAMBDA (NVAL) (COND ((FLOATP NVAL) (FBOX NVAL)) (T (IBOX NVAL] ) (DECLARE%: EVAL@COMPILE (PROGN (PUTPROPS CBOX MACRO ((X Y) (FRPLNODE (CONSTANT (CONS)) X Y))) (PUTPROPS CBOX DMACRO (= . CONS))) (PROGN [PUTPROPS LBOX MACRO (ARGLIST (PROG (NILIST (FORM '$X$)) [MAP ARGLIST (FUNCTION (LAMBDA (ARG) (SETQ NILIST (CONS NIL NILIST)) (SETQ FORM (LIST 'FRPLACA FORM (CAR ARG))) (AND (CDR ARG) (SETQ FORM (LIST 'CDR FORM] (RETURN (LIST (LIST 'LAMBDA '($X$) '(DECLARE (LOCALVARS $X$)) FORM '$X$) (KWOTE NILIST] (PUTPROPS LBOX DMACRO (= . LIST))) ) (DECLARE%: EVAL@COMPILE [I.S.OPR 'scratchcollect '(SETQ $$SCPTR (FRPLACA [OR (CDR $$SCPTR) (CDR (FRPLACD $$SCPTR (CAR (FRPLACA $$SCCONS (CONS] BODY)) '(BIND $$SCPTR $$SCCONS _ (CONSTANT (CONS)) FIRST (SETQ $$SCPTR $$SCCONS) FINALLY (SETQ $$VAL (AND (NEQ $$SCPTR $$SCCONS) (PROG1 (CDR $$SCCONS) (COND ((CDR $$SCPTR) (FRPLACD $$SCCONS (PROG1 (CDR $$SCPTR) (FRPLACD $$SCPTR NIL) (FRPLACD (PROG1 (CAR $$SCCONS) (FRPLACA $$SCCONS $$SCPTR) ) (CDR $$SCCONS] ) (ADDTOVAR SYSLOCALVARS $$SCCONS $$SCPTR) (ADDTOVAR INVISIBLEVARS $$SCCONS $$SCPTR) (DECLARE%: EVAL@COMPILE [PUTPROPS WITH MACRO (ARGS (CONS (CONS 'LAMBDA (CONS [for I in (CAR ARGS) collect (COND ((LITATOM I) I) ((LISTP I) (CAR I)) (T (ERROR "Invalid WITH form binding" I] (CDR ARGS))) (for I in (CAR ARGS) collect (CADR (LISTP I] ) (SETTEMPLATE 'WITH '((BOTH (|..| (IF LISTP (NIL EVAL |..| EFFECT) NIL)) (|..| (IF LISTP (BIND EVAL |..| EFFECT) BIND))) |..| EFFECT RETURN)) (REMPROP 'WITH 'CLISPWORD) (ADDTOVAR DWIMEQUIVLST (WITH . PROG)) (ADDTOVAR PRETTYEQUIVLST (WITH . PROG)) ) (DECLARE%: DOCOPY (DECLARE%: EVAL@LOADWHEN (NEQ (SYSTEMTYPE) 'D) [OR (GETPROP 'LOADTIMECONSTANT 'FILEDATES) (PROG ((X (FINDFILE (PACKFILENAME 'NAME 'LOADTIMECONSTANT 'EXTENSION COMPILE.EXT) T LISPUSERSDIRECTORIES))) (COND (X (LOAD X 'SYSLOAD)) ((NOT (GETPROP 'LOADTIMECONSTANT 'MACRO)) (PUTPROP 'LOADTIMECONSTANT 'MACRO '((FORM) (CONSTANT FORM] ) ) (ADDTOVAR OPENFNS \DECLPROGN \CHKVAL \CHKINIT ASSERT \*DECL \VARASRT) (PUTPROPS DPROG CLISPWORD (DECLTRAN . DPROG)) (PUTPROPS DPROGN CLISPWORD (DECLTRAN . DPROGN)) (PUTPROPS THE CLISPWORD (THETRAN . the)) (PUTPROPS the CLISPWORD (THETRAN . the)) (PUTPROPS DLAMBDA INFO BINDS) (PUTPROPS DPROG INFO (BINDS LABELS)) (PUTPROPS DPROGN INFO EVAL) (RPAQQ SATISFIESLIST NIL) (RPAQQ CSATISFIESLIST NIL) (RPAQQ NEWSATLIST T) (RPAQ? DECLMESSAGES ) (RPAQ? COMPILEIGNOREDECL ) (ADDTOVAR DECLATOMS DLAMBDA DPROG DPROGN) (ADDTOVAR LAMBDASPLST DLAMBDA) (ADDTOVAR SYSLOCALVARS VALUE) (ADDTOVAR DESCRIBELST ["types: " (GETRELATION FN '(USE TYPE]) (ADDTOVAR BAKTRACELST (\DECLPROGN (DPROGN APPLY *PROG*LAM \*DECL *ENV*) (NIL APPLY *PROG*LAM \*DECL)) (PROG (DPROG \DECLPROGN APPLY *PROG*LAM \*DECL))) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD SLISTENTRY (VARNAME . VARDECL)) (RECORD VARDECL (DECL . PROGNFLAG)) ) ) (ADDTOVAR LAMBDATRANFNS (DLAMBDA DECLTRAN EXPR DLAMARGLIST)) (DECLARE%: DONTEVAL@LOAD (ADDTOVAR PRETTYPRINTMACROS (DPROGN . PPDECL) (DECL . PPDECL) (DLAMBDA . PPDECL) (DPROG . PPDECL)) ) (PUTPROPS ASSERT INFO EVAL) (DECLARE%: EVAL@COMPILE (PUTPROPS ASSERT MACRO (ARGS (ASSERTMAC ARGS))) [PROGN [PUTPROPS .CBIND. BYTEMACRO (APPLY (LAMBDA (PV BODY) (APPLY* 'PROG PV '(RETURN (COMP.EXP1 BODY] (PUTPROPS .CBIND. MACRO (X (HELP "Compiler dependent macro must be supplied for .CBIND."] (PUTPROPS \CHKINIT MACRO (ARGS (CHKINITMAC ARGS))) [PUTPROPS \CHKVAL MACRO (ARGS (COND [(IGNOREDECL) (COND ((EQ (CAAR ARGS) 'COND) (CADADR (CAR ARGS))) (T (CADAR ARGS] (T (CAR ARGS] (PUTPROPS \*DECL MACRO (ARGS (*DECLMAC ARGS))) [PUTPROPS DECL MACRO (X (COMPEM "DECL in illegal location" (CONS 'DECL X] [PROGN [PUTPROPS DECLMSGMAC DMACRO ((X . Y) (CONSTANT (DECLMSG X . Y] (PUTPROPS DECLMSGMAC MACRO ((X . Y) (LOADTIMECONSTANT (DECLMSG X . Y] (PROGN (DEFMACRO REALSETQ (X &REST CL:REST) (CONS 'CL:SETQ (CONS X CL:REST))) (PUTPROPS REALSETQ BYTEMACRO COMP.SETQ)) ) (* MACROS REALSET) (AND (GETD 'STARTDECLS) (STARTDECLS)) [PROG [(COM (CDR (ASSOC 'DW EDITMACROS] (AND COM (RPLACD COM (CONS (APPEND '(RESETVAR NEWSATLIST (EDITNEWSATLIST)) (CDR COM] (* Builtin DECLOF properties) (PUTPROPS APPEND DECLOF LST) (PUTPROPS CONS DECLOF LISTP) (PUTPROPS EQ DECLOF (MEMQ T NIL)) (PUTPROPS LIST DECLOF [FUNCTION (LAMBDA (FORM) (AND (CDR FORM) 'LISTP]) (PUTPROPS LISTP DECLOF LST) (PUTPROPS NCONC DECLOF LST) (DECLARE%: EVAL@COMPILE DONTCOPY (RESETSAVE DWIMIFYCOMPFLG NIL) [AND (GETD 'DODECLS) (RESETSAVE (DODECLS) '(DODECLS T] ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA DECLSETQ DECLMSG DD \CHKINIT \*DECL ASSERT DECLTYPES DECLTYPE) (ADDTOVAR NLAML DECLSETQQ TYPEMSANAL) (ADDTOVAR LAMA DECLDWIMERROR) ) (PUTPROPS DECL COPYRIGHT ("Xerox Corporation" 1983 1984 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (9122 12665 (DECLTYPE 9132 . 9313) (DECLTYPES 9315 . 9672) (DUMPDECLTYPES 9674 . 11510) (GETDECLDEF 11512 . 12663)) (13894 16410 (COVERS 13904 . 14107) (GETDECLTYPEPROP 14109 . 14286) ( SETDECLTYPEPROP 14288 . 14725) (SUBTYPES 14727 . 15427) (SUPERTYPES 15429 . 16408)) (20952 57979 ( CHECKTYPEXP 20962 . 21340) (COLLECTTYPES 21342 . 23044) (COVERSCTYPE 23046 . 23872) (COVERSTB 23874 . 24301) (COVERSTE 24303 . 25008) (CREATEFNPROP 25010 . 25394) (CREATEFNVAL 25396 . 25942) (DECLERROR 25944 . 26179) (DELETETB 26181 . 27014) (FINDDECLTYPE 27016 . 27496) (FINDPROP 27498 . 27697) ( FINDTYPEXP 27699 . 28470) (GETCTYPE 28472 . 28907) (GETDECLTYPE 28909 . 29480) (GETDECLTYPE.NOERROR 29482 . 30166) (GETTBPROP 30168 . 30633) (INHERITPROP 30635 . 32197) (INITDECLTYPES 32199 . 35163) ( LCCTYPE 35165 . 35508) (LCC2 35510 . 36098) (MAKECTYPE 36100 . 37835) (MAKEDECLTYPE 37837 . 38848) ( MAKEBINDFN 38850 . 39126) (MAKESETFN 39128 . 39400) (MAPTYPEUSERS 39402 . 39660) (NOTICETB 39662 . 40129) (PPDTYPE 40131 . 42395) (RECDTYPE 42397 . 44262) (DECLCHANGERECORD 44264 . 45399) (RECDEFTYPE 45401 . 46562) (REPROPTB 46564 . 48281) (SETTBPROP 48283 . 49218) (TBDEFPRINT 49220 . 49556) (TETYPE 49558 . 50361) (TYPEMSANAL 50363 . 52158) (TYPEMSANAL1 52160 . 53383) (UNCOMPLETE 53385 . 54348) ( UNSAVETYPE 54350 . 55076) (USERDECLTYPE 55078 . 56819) (USESTYPE 56821 . 57977)) (58141 69148 ( MAKETESTFN 58151 . 58574) (MAKETESTFNBLOCK 58576 . 63318) (COMBINE.TESTS 63320 . 64319) (FUNIFY 64321 . 64898) (MKNTHCAR 64900 . 65358) (MKNTHCDR 65360 . 66007) (OF.TESTFN 66009 . 66469) (TUPLE.TESTFN 66471 . 67167) (WHOSE.TESTFN 67169 . 69146)) (71069 71414 (TESTFORM 71079 . 71412)) (71602 73334 ( EVERYCHAR 71612 . 71901) (LARGEP 71903 . 72146) (DECLRECURSING 72148 . 73023) (SMASHCAR 73025 . 73332) ) (74575 130437 (ASSERT 74585 . 75218) (ASSERTFAULT 75220 . 76142) (ASSERTMAC 76144 . 76985) (\*DECL 76987 . 78332) (*DECLMAC 78334 . 80689) (\CHKINIT 80691 . 81821) (CHKINITMAC 81823 . 83507) ( DECLCONSTANTP 83509 . 85131) (DD 85133 . 85774) (DECLCLISPTRAN 85776 . 90580) (DECLMSG 90582 . 91845) (DECLDWIMERROR 91847 . 92342) (DECLDWIMTESTFN 92344 . 93150) (DECLSET 93152 . 93783) (DECLSETQ 93785 . 94661) (DECLSETQQ 94663 . 94850) (DECLTRAN 94852 . 102250) (DECLVAR 102252 . 110275) (DLAMARGLIST 110277 . 110772) (DTYPE?TRAN 110774 . 112135) (EDITNEWSATLIST 112137 . 112793) (FORMUSESTB 112795 . 113667) (IGNOREDECL 113669 . 114395) (MAKETESTFORM 114397 . 115220) (PPDECL 115222 . 121443) ( PPVARLIST 121445 . 123040) (SETQMAC 123042 . 125572) (THETRAN 125574 . 127119) (VALUEERROR 127121 . 128269) (\VARASRT 128271 . 128598) (VARASRT1 128600 . 129511) (VARSETFN 129513 . 130435)) (130633 141888 (DECLOF 130643 . 131411) (DECLOF1 131413 . 139868) (TBOF 139870 . 140333) (TYPEBLOCKOF 140335 . 140712) (VARDECL 140714 . 141886)) (142628 148350 (STARTDECLS 142638 . 145503) (DODECLS 145505 . 148348)) (148558 149651 (IBOX 148568 . 148818) (FBOX 148820 . 148977) (NBOX 148979 . 149649))))) STOP \ No newline at end of file diff --git a/lispusers/DECL.TEDIT b/lispusers/DECL.TEDIT new file mode 100644 index 00000000..0063219f --- /dev/null +++ b/lispusers/DECL.TEDIT @@ -0,0 +1,110 @@ +XEROX DECL 2 4 1 DECL 1 4 UNSUPPORTED INTERNAL Uses: SIMPLIFY, LABEL and LAMBDATRAN NOTE TO LYRIC/MEDLEY USERS The DECL module is not supported in Lyric/Medley since it uses the DWIM facilities heavily, and DWIM is not supported in Lyric/Medley. It is being released as a LispUsers module only for backward compatibility. The DECL module only runs under the OLD-INTERLISP-T executive, and all the code that uses it will also have to run under this executive. Therefore, you may wish to convert code that uses DECL to something else. INTRODUCTION The Decl LispUsers package is contained on the file DECL.LCOM. The Decl package requires the LambdaTran package. LAMBDATRAN.LCOM will automatically be loaded with Decl if it is not already present. The Decl package extends Interlisp to allow the user to declare the types of variables and expressions appearing in functions. It provides a convenient way of constraining the behavior of programs when the generality and flexibility of ordinary Interlisp is either unnecessary, confusing, or inefficient. Decl provides a simple language for declarations, and augments the interpreter and the compiler to guarantee that these declarations are always satisfied. The declarations make programs more readable by indicating the type, and therefore something about the intended usage, of variables and expressions in the code. They facilitate debugging by localizing errors that manifest themselves as type incompatibilities. Finally, the declaration information is available for other purposes: compiler macros can consult the declarations to produce more efficient code; coercions for arguments at user interfaces can be automatically generated; and the declarations will be noticed by the Masterscope function analyzer. The declarations interpreted by the Decl package are in terms of a set of declaration types called decltypes, each of which specifies a set of acceptable values and also (optionally) other type-specific behavior. The Decl package provides a set of facilities for defining decltypes and their relations to each other, including type-valued expressions and a comprehensive treatment of union types. The following description of the Decl package is divided into three parts. First, the syntactic extensions that permit the concise attachment of declarations to program elements are discussed. Second, the mechanisms by which new decltypes can be defined and manipulated are covered. Finally, some additional capabilities based on the availability of declarations are outlined. USING DECLARATIONS IN PROGRAMS Declarations may be attached to the values of arbitrary expressions and to LAMBDA and PROG variables throughout (or for part of) their lexical scope. The declarations are attached using constructs that resemble the ordinary Interlisp LAMBDA, PROG, and PROGN, but which also permit the expression of declarations. The following examples illustrate the use of declarations in programs. Consider the following definition for the factorial function (FACT N ): [LAMBDA (N) (COND ((EQ N 0) 1) (T (ITIMES N (FACT (SUB1 N] Obviously, this function presupposes that N is a number, and the run-time checks in ITIMES and SUB1 will cause an error if this is not so. For instance, (FACT T) will cause an error and print the message NON-NUMERIC ARG T. By defining FACT as a DLAMBDA, the Decl package analog of LAMBDA, this presupposition can be stated directly in the code: [DLAMBDA ((N NUMBERP)) (COND ((EQ N 0) 1) (T (ITIMES N (FACT (SUB1 N] With this definition, (FACT T) will result in a NON-NUMERIC ARG T error when the body of the code is executed. Instead, the NUMBERP declaration will be checked when the function is first entered, and a declaration fault will occur. Thus, the message that the user will see will not dwell on the offending value T, but instead give a symbolic indication of what variable and declaration were violated, as follows: DECLARATION NOT SATISFIED ((N NUMBERP) BROKEN): The user is left in a break from which the values of variables, e.g., N, can be examined to determine what the problem is. The function FACT also makes other presuppositions concerning its argument, N. For example, FACT will go into an infinite recursive loop if N is a number less than zero. Although the user could program an explicit check for this unexpected situation, such coding is tedious and tends to obscure the underlying algorithm. Instead, the requirement that N not be negative can be succinctly stated by declaring it to be a subtype of NUMBERP that is restricted to non-negative numbers. This can be done by adding a SATISFIES clause to N's type specification: [DLAMBDA ([N NUMBERP (SATISFIES (NOT (MINUSP N]) (COND ((EQ N 0) 1) (T (ITIMES N (FACT (SUB1 N] The predicate in the SATISFIES clause will be evaluated after N is bound and found to satisfy NUMBERP, but before the function body is executed. In the event of a declaration fault, the SATISFIES condition will be included in the error message. For example, (FACT -1) would result in: DECLARATION NOT SATISFIED ((N NUMBERP (SATISFIES (NOT (MINUSP N))) BROKEN): The DLAMBDA construct also permits the type of the value that is returned by the function to be declared by means of the pseudo-variable RETURNS. For example, the following definition specifies that FACT is to return a positive integer: [DLAMBDA ([N NUMBERP (SATISFIES (NOT (MINUSP N] [RETURNS FIXP (SATISFIES (IGREATERP VALUE 0]) (COND ((EQ N 0) 1) (T (ITIMES N (FACT (SUB1 N] After the function body is evaluated, its value is bound to the variable VALUE and the RETURNS declaration is checked. A declaration fault will occur if the value is not satisfactory. This prevents a bad value from propagating to the caller of FACT, perhaps causing an error far away from the source of the difficulty. Declaring a variable causes its value to be checked not only when it is first bound, but also whenever that variable is reset by SETQ within the DLAMBDA. In other words, the type-checking machinery will not allow a declared variable to take on an improper value. An iterative version of the factorial function illustrates this feature in the context of a DPROG, the analog of PROG: (DLAMBDA ([N NUMBERP (SATISFIES (NOT (MINUSP N] [RETURNS FIXP (SATISFIES (IGREATERP VALUE 0]) [DPROG ([TEMP 1 FIXP (SATISFIES (IGREATERP TEMP 0] [RETURNS FIXP (SATISFIES (IGREATERP VALUE 0]) LP (COND ((EQ N 0) (RETURN TEMP))) (SETQ TEMP (ITIMES N TEMP)) (SETQ N (SUB1 N)) (GO LP] DPROG declarations are much like DLAMBDA declarations, except that they also allow an initial value for the variable to be specified. In the above example, TEMP is declared to be a positive integer throughout the computation and N is declared to be non-negative. Thus, a bug which caused an incorrect value to be assigned by one of the SETQ expressions would cause a declaration failure. Note that the RETURNS declaration for a DPROG is also useful in detecting the common bug of omitting an explicit RETURN. DLAMBDAs The Decl package version of a LAMBDA expression is an expression beginning with the atom DLAMBDA. Such an expression is a function object that may be used in any context where a LAMBDA expression may be used. It resembles a LAMBDA expression except that it permits declaration expressions in its argument list, as illustrated in the examples given earlier. Each element of the argument list of a DLAMBDA may be a literal atom (as in a conventional LAMBDA) or a list of the form (NAME TYPE .EXTRAS). Strictly, this would require a declaration with a SATISFIES clause to take the form (N (NUMBERP (SATISFIES --)) --). However, due to the frequency with which this construction is used, it may be written without the inner set of parentheses, e.g., (N NUMBERP (SATISFIES --) --). NAME fulfills the standard function of a parameter, i.e., providing a name to which the value of the corresponding argument will be bound. TYPE is either a Decl package type name or type expression. When the DLAMBDA is entered, its arguments will be evaluated and bound to the corresponding argument names, and then, after all the argument names have been bound, the declarations will be checked. The type checking is delayed so that SATISFIES predicates can include references to other variables bound by the same DLAMBDA. For example, one might wish to define a function whose two arguments are not only both required to be of some given type, but are also required to satisfy some relationship (e.g., that one is less than the other). EXTRAS allows some additional properties to be attached to a variable. One such property is the accessibility of NAME outside the current lexical scope. Accessibility specifications include the atoms LOCAL or SPECIAL, which indicate that this variable is to be compiled so that it is either a LOCALVAR or a SPECVAR, respectively. This is illustrated by the following example: [DLAMBDA ((A LISTP SPECIAL) (B FIXP LOCAL)) ...] A more informative equivalent to the SPECIAL key word is the USEDIN form, the tail of which can be a list of the other functions that are expected to have access to the variable.1 [DLAMBDA ((A LISTP (USEDIN FOO FIE)) (B FIXP LOCAL)) ...] EXTRAS may also include a comment in standard format, so that descriptive information may be given where a variable is bound: [DLAMBDA ((A LISTP (USEDIN FOO FIE) (* This is an important variable)) (B FIXP LOCAL)) ...] As mentioned earlier, the value returned by a DLAMBDA can also be declared, by means of the pseudo-variable RETURNS. The RETURNS declaration is just like other DLAMBDA declarations, except (1) in any SATISFIES predicate, the value of the function is referred to by the distinguished name VALUE; and (2) it makes no sense to declare the return value to be LOCAL or SPECIAL. DPROG Just as DLAMBDA resembles LAMBDA, DPROG is analogous to PROG. As for an ordinary PROG, a variable binding may be specified as an atom or a list including an initial value form. However, a DPROG binding also allows TYPE and EXTRAS information to appear following the initial value form. The format for these augmented variable bindings is (NAME INITIALVALUE TYPE .EXTRAS). The only difference between a DPROG binding and a DLAMBDA binding is that the second position is interpreted as the initial value for the variable. Note that if the user wishes to supply a type declaration for a variable, an initial value must be specified. The same rules apply for the interpretation of the type information for DPROGs as for DLAMBDAs, and the same set of optional EXTRAs can be used. DPROGs may also declare the type of the value they return, by specifying the pseudo-variable RETURNS. Just as for a DLAMBDA, type tests in a DPROG are not asserted until after all the variables have been bound, thus permitting predicates to refer to other variables being bound by this DPROG. If NIL appears as the initial value for a binding (i.e., the atom NIL actually appears in the code, not simply an expression that evaluates to NIL) the initial type test will be suppressed, but subsequent type tests, e.g., following a SETQ, will still be performed. A common construct in Lisp is to bind and initialize a PROG variable to the value of a complicated expression in order to avoid recomputing it, and then to use this value in initializing other PROG variables, e.g. [PROG ((A EXPRESSION)) (RETURN (PROG ((B... ( A...)) (C... ( A... ))) ...] The ugliness of such constructions in conventional Lisp often tempts the programmer to loosen the scoping relationships of the variables by binding them all at a single level and using SETQ's in the body of the PROG to establish the initial values for variables that depend on the initial values of other variables, e.g., [PROG ((A EXPRESSION) B C) (SETQ B (...A... )) (SETQ C ( ...A... )) ...] In the Decl package environment, this procedure undermines the protection offered by the type mechanism by encouraging the use of uninitialized variables. Therefore, the DPROG offers a syntactic form to encourage more virtuous initialization of its variables. A DPROG variable list may be segmented by occurrences of the special atom THEN, which causes the binding of its variables in stages, so that the bindings made in earlier stages can be used in later ones, e.g., [DPROG ((A (LENGTH FOO) FIXP LOCAL) THEN (B (SQRT A) FLOATP) THEN (C (CONS A B) LISTP)) ...] Each stage is carried out as a conventional set of DPROG bindings (i.e., simultaneously, followed by the appropriate type testing). This layering of the bindings permits one to gradually descend into a inner scope, binding the local names in a very structured and clean fashion, with initial values type-checked as soon as possible. DECLARATIONS IN ITERATIVE STATEMENTS The CLISP iterative statement provides a very useful facility for specifying a variety of PROGs that follow certain widely used formats. The Decl package allows declarations to be made for the scope of an iterative statement via the DECLARE CLISP (I.S. operator). DECLARE can appear as an operator anywhere in an iterative statement, followed by a list of declarations, for example: (for J from 1 to 10 declare (J FIXP) do. . . Note that DECLARE declarations do not create bindings, but merely provide declarations for existing bindings. For this reason, an initial value cannot be specified and the form of the declaration is the same as that of DLAMBDAs, namely create (NAME TYPE . EXTRAS). Note that variables bound outside of the scope of the iterative statement, i.e., a variable used freely in the I.S., can also be declared using this construction. Such a declaration will only be in effect for the scope of the iterative statement. DECLARING A VARIABLE FOR A RESTRICTED LEXICAL SCOPE The Decl package also permits declaring the type of a variable over some restricted portion of its existence. For example, suppose the variable X is either a fixed or floating number, and a program branches to treat the two cases separately. On one path X is known to be fixed, whereas on the other it is known to be floating. The Decl package DPROGN construct can be used in such cases to state the type of the variable along each path. DPROGN is exactly like PROGN, except that the second element of the form is interpreted as a list of DLAMBDA format declarations. These declarations are added to any existing declarations in the containing scope, and the composite declaration (created using the ALLOF type expression), is considered to hold throughout the lexical scope created by the DPROGN. Thus, our example becomes: (if (FIXP X) then (DPROGN ((X FIXP))...else (DPROGN ((X FLOATP)) ...)) Like DPROG and DLAMBDA, the value of a DPROGN may also be declared, using the pseudo-variable RETURNS. DPROGN may be used not only to restrict the declarations of local variables, but also to declare variables that are being used freely. For example, if the variable A is used freely inside a function but is known to be FIXP, this fact could be noted by enclosing the body of the function in (DPROGN ((A FIXP FREE)) BODY). Instead of FREE, the more specific construction (BOUNDIN FUNCTION1 FUNCTION 2. . .) can be used. This not only states that the variable is used freely but also gives the names of the functions that might have provided this binding.2 Since the DPROGN form introduces another level of parenthesization, which results in the enclosed forms being prettyprinted indented, the Decl package also permits such declarations to be attached to their enclosing DLAMBDA or DPROG scopes by placing a DEC expression, e.g., (DECL (A FIXP (BOUNDIN FUM)), before the first executable form in that scope. Like DPROGN's, DECL declarations use DLAMBDA format. DECLARING THE VALUES OF EXPRESSIONS The Decl package allows the value of an arbitrary form to be declared with the Decl construct THE. A THE expression is of the form (THE TYPE . FORMS), e.g., (THE FIXP (FOO X)). FORMS are evaluated in order, and the value of the last one is checked to see if it satisfies TYPE, a type name or type expression. If so, its value is returned, otherwise a declaration fault occurs. ASSERTIONS The Decl package also allows for checking that an arbitrary predicate holds at a particular point in a program's execution, e.g., a condition that must hold at function entry but not throughout its execution. Such predicates can be checked using an expression of the form (ASSERT FORM1 FORM2), in which each FORM1 is either a list (which will be evaluated) or a variable (whose declaration will be checked). Unless all elements of the ASSERT form are satisfied, a declaration fault will take place. ASSERTing a variable provides a convenient way of verifying that the value of the variable has not been improperly changed by a lower function. Although a similar effect could be achieved for predicates by explicit checks of the form (OR PREDICATE (SHOULDNT)), ASSERT also provides the ability both to check that a variable's declaration is currently satisfied and to remove its checks at compile time without source code modification (see COMPILEIGNOREDECL). USING TYPE EXPRESSIONS AS PREDICATES The Decl package extends the Record package TYPE? construct so that it accepts decltypes, as well as record names, e.g., (TYPE? (FIXP (SATISFIES (ILESSP VALUE 0))) EXPR). Thus, a TYPE? expression is exactly the same as a THE expression except that, rather than causing a declaration fault, TYPE? is a predicate that determines whether or not the value satisfies the given type. ENFORCEMENT The Decl package is a ŠŠsoft'' typing system˙˙ď%˙that is, the data objects themselves are not inherently typed. Consequently, declarations can only be enforced within the lexical scope in which the declaration takes place, and then only in certain contexts. In general, changes to a variable's value such as those resulting from side effects to embedded structure (e.g., RPLACA, SETN, etc.) or free variable references from outside the scope of the declaration cannot be, and therefore are not, enforced. Declarations are enforced, i.e., checked, in three different situations: when a declared variable is bound to some value or rebound with SETQ or SETQQ, when a declared expression is evaluated, and when an ASSERT expression is evaluated. In a binding context, the type check takes place after the binding, including any user-defined behavior specified by the type's binding function. Any failure of the declarations causes a break to occur and an informative message to be printed. In that break, the name to which the declaration is attached (or VALUE if no name is available) will be bound to the offending value. Thus, in the FACT T example above, N would be bound to T. The problem can be repaired either by returning an acceptable value from the break via the RETURN command, or by assigning an acceptable value to the offending name and returning from the break via an OK or GO command. The unsatisfied declaration will be reasserted when the computation is continued, so an unacceptable value will be detected.3 The automatic enforcement of type declarations is a very flexible and powerful aid to program development. It does, however, exact a considerable run-time cost because of all the checking involved. Factors of two to ten in running speed are not uncommon, especially where low-level, frequently used functions employ type declarations. As a result, it is usually desirable to remove the declaration enforcement code when the system is believed to be bug-free and performance becomes more central. This can be done with the variable COMPILEIGNOREDECL. COMPILEIGNOREDECL [Variable] Setting the value of the variable COMPILEIGNOREDECL to T (initially NIL) instructs the compiler not to insert declaration enforcement tests in the compiled code. More selective removal can be achieved by setting COMPILEIGNOREDECL to a list of function names. Any function whose name is found on this list is compiled without declaration enforcement. IGNOREDECL. VAL [File Com] Declaration enforcement may be suppressed selectively by a file using the IGNOREDECL file package command. If this appears in a file's file commands, it redefines the value of COMPILEIGNOREDECL to VAL for the compilation of this file only. Note: The period in the IGNOREDECL file package command is significant. To set COMPILEIGNOREDECL to T, use (IGNOREDECL . T), not (IGNOREDECL T). DECLTYPES A Decl package type, or decltype, specifies a subset of data values to which values of this type are restricted. For example, a ŠŠpositive number'' type might be defined to include only those values that are numbers and greater than zero. A type may also specify how certain operations, such as assignment or binding (see BINDFN), are to be performed on variables declared to be of this type. The inclusion relations among the sets of values that satisfy the different types define a natural partial ordering on types, bound by the universal type ANY (which all values satisfy) and the empty type NONE (which no value satisfies). Each type has one or more supertypes (each type has at least ANY as a supertype) and one or more subtypes (each type has at least NONE as a subtype). This structure is important to the user of Decl as it provides the framework in which new types are defined. Typically, much of the definition of a new type is defaulted, rather than specified explicitly. The definition will be completed by inheriting attributes which are shared by all its immediate supertypes. An initial set of decltypes that defines the Interlisp built-in data types and a few other commonly used types is provided. Thereafter, new decltypes are created in terms of existing ones using the type expressions described below. For conciseness, such new types can be associated with literal atoms using the function DECLTYPE. PREDEFINED TYPES Some commonly used types, such as the Interlisp built-in data types, are already defined when the Decl package is loaded. These types, indented to show subtype-supertype relations, are:4 ANY ATOM LST ARRAYP STRINGP FUNCTION STACKP LITATOM ALIST HARRAYP NIL LISTP READTABLEP NUMBERP FIXP LARGEP SMALLP FLOATP NONE Note that the definition of LST causes NIL to have multiple supertypes, i.e., LITATOM and LST, reflecting the duality of NIL as an atom and a (degenerate) list. In addition, declarations made using the Record package also define types that are attached as subtypes to an appropriate existing type (e.g., a TYPERECORD declaration defines a subtype of LISTP, a DATATYPE declaration a subtype of ANY, etc.) and may be used directly in declaration contexts. TYPE EXPRESSIONS Type expressions provide convenient ways for defining new types in terms of modifications to, or compositions of one or more existing types. (MEMQ VALUE1. . .VALUE N) [Type Expression] Specifies a type whose values can be any one of the fixed set of elements VALUE 1. . .VALUE N. For example, the status of a device might be represented by a datum restricted to the values BUSY and FREE. Such a ŠŠdevice status'' type could be defined via (MEMQ BUSY FREE). The new type will be a subtype of the narrowest type that all of the alternatives satisfy (e.g., the "device status" type would be a subtype of LITATOM). The membership test uses EQ if this supertype is a LITATOM; EQUAL otherwise. Thus, lists, floating point numbers, etc., can be included in the set of alternatives. (ONEOF TYPE 1. . .TYPE N) [Type Expression] Specifies a type that is the union of two or more other types. For example, the notion of a possibly degenerate list is something that is either LISTP or NIL. Such a type can be (and the built-in type LST in fact is) defined simply as (ONEOF NIL LISTP). A union data type becomes a supertype of all of the alternative types specified in the ONEOF expression, and a subtype of their lowest common supertype. The type properties of a union type are taken from its alternative types if they all agree, otherwise from the supertype. (ALLOF TYPE 1. . .TYPE N) [Type Expression] Specifies a type that is the intersection of two or more other types. For example, a variable may be required to satisfy both FIXP and also some type that is defined as (NUMBERP (SATISFIES PREDICATE)). The latter type will admit numbers that are not FIXP, i.e., floating point numbers; the former does not include PREDICATE. Both restrictions can be obtained by using the type (ALLOF (NUMBERP (SATISFIES PREDICATE)) FIXP).5 (OF AGGREGATE OF ELEMENT) [Type Expression] Specifies DECLaggregate, a type that is an aggregate of values of some other type (e.g., list of numbers, array of strings, etc.). AGGREGATE must be a type that provides an EVERYFN property. The EVERYFN is used to apply an arbitrary function to each of the elements of a datum of the aggregate type, and check whether the result is non-NIL for each element. ELEMENT may be any type expression. For example, the type ŠŠlist of either strings or atoms'' can be defined as (LISTP OF (ONEOF STRINGP ATOM)). The type test for the new type will consist of applying the type test for ELEMENT to each element of the aggregate type using the EVERYFN property. The new type will be a subtype of its aggregate type.6 (SATISFIES TYPE (SATISFIES FORM 1. . .FORM N)) [Type Expression] Specifies a type whose values are a subset of the values of an existing type. The type test for the new type will first check that the base type is satisfied, i.e., that the object is a member of TYPE, and then evaluate FORM 1. . .FORM N. If each form returns a non-NIL value, the type is satisfied. The value that is being tested may be referred to in FORM 1. . . FORM N by either (a) the variable name if the type expression appears in a binding context such as DLAMBDA or DPROG, (b) the distinguished atom ELT for a SATISFIES clause on the elements of an aggregate type, or (c) the distinguished atom VALUE, when the type expression is used in a context where no name is available (e.g., a RETURNS declaration). For example, one might declare the program variable A to be a negative integer via (FIXP (SATISFIES (MINUSP A))) or declare the value of a DLAMBDA to be of type ((ONEOF FIXP FLOATP) (SATISFIES (GREATERP VALUE 25))). Note that more than one SATISFIES clause may appear in a single type expression attached to different alternatives in a ONEOF type expression, or attached to both the elements and the overall structure of an aggregate. For example, [LISTP OF [FIXP (SATISFIES (ILEQ ELT (CAR VALUE] (SATISFIES (ILESSP (LENGTH VALUE) 7] specifies a list of less than seven integers each of which is no greater than the first element of the list. (SHARED TYPE) [Type Expression] Specifies DECLshared, a subtype of TYPE, with default binding behavior, i.e., the binding function (see BINDFN), if any, will be suppressed.7 For example, if the type FLOATP were redefined so that DLAMBDA and DPROG bindings of variables that were declared to be FLOATP copied their initial values (e.g., to allow SETNs to be free of side effects), then variables declared (SHARED FLOATP) would be initialized in the normal fashion, without copying their initial values. NAMED TYPES Although type expressions can be used in any declaration context, it is often desirable to save the definition of a new type if it is to be used frequently, or if a more complex specification of its behavior is to be given than is convenient in an expression. The ability to define a named type is provided by the function DECLTYPE. (DECLTYPE TYPENAME TYPE PROP1 VAL1 PROPN VALN) [Function] NLambda, nospread function. TYPENAME is a literal atom, TYPE is either the name of an existing type or a type expression, and PROP 1, VAL 1...PROP N,VAL N is a specification (in property list format) of other attributes of the type. DECLTYPE derives a type from TYPE, associates it with TYPENAME, and then defines any properties specified with the values given. The following properties are interpreted by the Decl package.8 Each of these properties can have as its value either a function name or a LAMBDA expression. TESTFN [Property] will be used by the Decl package to test whether a given value satisfies this type. The type is considered satisfied if FN applied to the item is non-NIL. For example, one might define the type INTEGER with TESTFN FIXP.9 EVERYFN [Property] EVERYFN specifies a mapping function that can apply a functional argument to each ŠŠelement'' of an instance of this type, and which will return NIL unless the result of every such application was non-NIL. FN must be a function of two arguments: the aggregate and the function to be applied. For example, the EVERYFN for the built-in type LISTP is EVERY. The Decl package uses the EVERYFN property of the aggregate type to construct a type test for aggregate type expressions. In fact, it is the presence of an EVERYFN property that allows a type to be used as an aggregate type.10 BINDFN [Property] BINDFN is used to compute from the initial value supplied for a DLAMBDA or DPROG variable of this type, the value to which the variable will actually be initialized. FN must be a function of one argument that will be applied to the initial value, and which should produce another value which is to be used to make the binding.11 For example, a BINDFN could be used to bind variables of some type so that new bindings are copies of the initial value. Thus, if FLOATP were given the BINDFN FPLUS, any variable declared FLOATP would be initialized with a new floating box, rather than sharing with that of the original initial value.12 SETFN [Property] is used for performing a SETQ or SETQQ of variables of this type. FN is a function of two arguments, the name of the variable and its new value. A SETFN is typically used to avoid the allocation of storage for intermediate results. Note that the SETFN is not the mechanism for the enforcement of type compatibility, which is checked after the assignment has taken place. Also note that not all functions that can change values are affected: in particular, SET and SETN are not. MANIPULATING NAMED TYPES DECLTYPES is a file package type. Thus all of the operations relating to file package types, e.g., GETDEF, PUTDEF, EDITDEF, DELDEF, SHOWDEF, etc., can be performed on decltypes.13 The file package command, DECLTYPES , is provided to dump named decltypes symbolically. They will be written as a series of DECLTYPE forms that will specify only those fields that differ from the corresponding field of their supertype(s). If the type depends on any unnamed types, those types will be dumped (as a compound type expression), continuing up the supertype chain until a named type is found. Care should be exercised to ensure that enough of the named type context is dumped to allow the type definition to remain meaningful. The functions GETDECLTYPEPROP and SETDECLTYPEPROP, defined analogously to the property list functions for atoms, allow the manipulation of the properties of named types. Setting a property to NIL with SETDECLTYPEPROP removes it from the type. RELATIONS BETWEEN TYPES The notion of equivalence of two types is not well defined. However, type equivalence is rarely of interest. What is of interest is type inclusion, i.e., whether one type is a supertype or subtype of another. The predicate COVERS can be used to determine whether the values of one type include those of another. (COVERS HI LO) [Function] COVERS is T if HI can be found on some (possibly empty) supertype chain of LO; else NIL. Thus, (COVERS 'FIXP (DECLOF 4))= T, even though the DECLTYPE of four is SMALLP, not FIXP. The extremal cases are the obvious identities: (COVERS 'ANY ANYTYPE) = (COVERS ANYTYPE 'NONE) = (COVERS X ) for any type X = T. COVERS allows declaration-based transformations of a form that depend on elements of the form being of a certain type to express their applicability conditions in terms of the weakest type to which they apply, without explicit concern for other types that may be subtypes of it. For example, if a particular transformation is to be applied whenever an element is of type NUMBERP, the program that applies that transformation does not have to check whether the element is of type SMALLP, LARGEP, FIXP, FLOATP, etc., but can simply ask whether NUMBERP COVERS the type of that element. The elementary relations among the types, out of which arbitrary traversals of the type space can be constructed, are made available via: (SUBTYPE TYPE) [Function] Returns the list of types that are immediate subtypes of TYPE. (SUPERTYPES TYPE) [Function] Returns the list of types that are immediate supertypes of TYPE. THE DECLARATION DATA BASE One of the primary uses of type declarations is to provide information that other systems can use to interpret or optimize code. For example, one might choose to write all arithmetic operations in terms of general functions like PLUS and TIMES and then use variable declarations to substitute more efficient, special-purpose code at compile time based on the types of the operands. To this end, a data base of declarations is made available by the Decl package to support these operations. (DECLOF FORM) [Function] Returns the type of FORM in the current declaration context. If FORM is an atom, DECLOF will look up that atom directly in its data base of current declarations. Otherwise, DECLOF will look on the property list of (CAR FORM) for a DECLOF property, as described below. If there is no DECLOF property, DECLOF will check if (CAR FORM) is one of a large set of functions of known result type (e.g., the arithmetic functions). Failing that, if (CAR FORM) has a MACRO property, DECLOF will apply itself to the result of expanding (with EXPANDMACRO), the macro definition. Finally, if FORM is a Lisp program element that DECLOF ŠŠunderstands'' (e.g., a COND, PROG, SELECTQ, etc.), DECLOF applies itself recursively to the part(s) of the contained form which will be returned as value.14 DECLOF [Property] Allows the specification of the type of the values returned by a particular function. The value of the DECLOF property can be either a type, i.e., a type name or a type expression, or a list of the form (FUNCTION FN), where FN is a function object. FN will be applied (by DECLOF) to the form whose CAR has this DECLOF property on its property list. The value of this function application will then be considered to be the type of the form. As an example of how declarations can be used to automatically generate more efficient code, consider an arithmetic package. Declarations of numeric variables could be used to guide code generation to avoid the inefficiencies of Interlisp's handling of arithmetic values. Not only could the generic arithmetic functions be automatically specialized, as suggested above, but by redefining the BINDFN and the SETFN properties for the types FLOATP and LARGEP to reuse storage in the appropriate contexts (i.e., when the new value can be determined to be of the appropriate type), tremendous economies could be realized by not allocating storage to intermediate results that must later be reclaimed by the garbage collector. The Decl package has been used as the basis for several such code optimizing systems. DECLARATIONS AND MASTERSCOPE The Decl package notifies MASTERSCOPE about type declarations and defines a new MASTERSCOPE relation, TYPE, which depends on declarations. Thus, the user can ask questions such as ŠŠWHO USES MUMBLE AS A TYPE?,'' ŠŠ DOES FOO USE FIXP AS A TYPE?,'' and so on. END NOTES 1. USEDIN is mainly for documentation purposes, since there is no way for such a restriction to be enforced. 2. Like USEDIN declarations, FREE and BOUNDIN declarations cannot be checked, and are for documentation purposes only. 3. With this exception, assignments to variables from within the break are not considered to be in the scope of the declarations that were in effect when the break took place and so are not checked. 4. LST is defined as either LISTP or NIL. i.e., a list or NIL. The name LST is used because the name LIST is treated specially by CLISP. A LIST is defined as either NIL or a list of elements each of which is of type LISTP. 5. When a value is tested, the component type tests are applied from left to right. 6. The built-in aggregate types are ARRAP, LISTP, LST, and STRINGP (and their subtypes). 7. As no predefined type has a binding function, this is of no concern until the user defines or redefines a type to have a binding function. 8. Actually, any property can be attached to a type, and will be available for use by user functions via the function GETDECLTYPEPROP. 9. Typically, the TESTFN for a type is derived from its type expression, rather than specified explicitly. The ability to specify the TESTFN is provided for those cases where a predicate is available that is much more efficient than that which would be derived from the type expression. For example, the type SMALLP is defined to have the function SMALLP as its TESTFN, rather than (LAMBDA(DATUM) (AND(NUMBERP DATUM)(FIXP DATUM) (SMALLP DATUM))) as would be derived from the subtype structure. 10. Note that a type's EVERYFN is not used in type tests for that type, but only in type tests for types defined by OF expressions that used this type as the aggregate type. For example, EVERY is not used in defining whether some value satisfies the type LISTP. The Decl package never applies the EVERYFN of a type to a value without first verifying that the value satisfies that type. 11. For a PPROG binding, FN will be applied to no arguments if the initial value is lexically NIL. 12. The BINDFN, if any, associated with a type may be suppressed in a declaration context by creating a subtype with the type-expressing operator SHARED. 13. Deleting a named type could possibly invalidate other type definitions that have the named type as a subtype or supertype. Consequently, the deleted type is simply unnamed and left in the type space as long as it is needed. 14. ŠŠThe current declaration context'' is defined by the environment at the time that DECLOF is called. Code-reading systems, such as the compiler and the interpreter, keep track of the lexical scope within which they are currently operating, in particular, which declarations are in effect. Note that (currently) DECLOF does not have access to any global data base of declarations. For example, DECLOF does not have information available about the types of arguments of, or the value returned by, a particular function, unless it is currently ŠŠinside'' that function. However, the DECLOF property can be used to inform DECLOF of the type of the value returned by a particular function.(LIST ((PAGE NIL (PAPERSIZE LETTER FOLIOINFO (ARABIC "" "") STARTINGPAGE# 52) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE LETTER FOLIOINFO (ARABIC "" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE LETTER FOLIOINFO (ARABIC "" "")) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))2ČČ,Č,ŠŠ8,ŠŠ8HČČ PAGEHEADING RUNNINGHEAD MODERN +MODERNLOGOMODERN MODERNMODERNMODERN +˙ţTERMINAL˙ţTERMINAL +MODERN +MODERNMODERN +  HRULE.GETFNMODERN +  HRULE.GETFNMODERN +  HRULE.GETFNMODERN +  HRULE.GETFNMODERN  HRULE.GETFNMODERN   %   Ť  Č 2 Í c +" | ‚ D  +    # *  +0    # Ë  +Ĺ   D  +4 L  +@  +Ô  +ł  + 1   # >  +ß  2 î 0 1   # A  0 1 3 1 * &     +â  +  +‡  +V  +k  +    ˛  %  +   +w I   v Ů  +  +o  + đ  +  +v Ě Ö  $ &  C     Ř $ ! #   N %‚ - ő  +   +Ö 4>  : g <  +; + + + +š  ™  +$Œ +P  +&  +g    +  +  +ť ď +Ö %~  ,  Í   +  +  +Ő  *  a   + ó –  +‹  +° N ť    0 & +       * ¤ & Ž   + T   +    + ż +t + +R +   + +  +  +  +k +ß  +×  +y    +  + Ý  +B 4  +2 é 1 / m   + #  +d K  N  + = +   +  +B  +k  +  +C = c  y  +b   Ń  +x   Ś  +ž 1   F  +  + ˛   ö ‹ + +§   +   +9  +˜ R K Š   + # +  +   + " + +  + î   +   +)  +š  +i  +s  +‚  +Ä   ×  +  +  +ż *   +q x É ă V Z ‘ ‰ ň „ c › ĺ H  +h ™oˆzş \ No newline at end of file diff --git a/lispusers/DEDITHARDCOPY b/lispusers/DEDITHARDCOPY new file mode 100644 index 00000000..fca3d576 --- /dev/null +++ b/lispusers/DEDITHARDCOPY @@ -0,0 +1 @@ +(FILECREATED "28-May-86 09:36:42" {ERIS}KOTO>DEDITHARDCOPY.;2 1082 changes to: (FNS DEDIT-HARDCOPY) (VARS DEDITHARDCOPYCOMS) (ADVICE MAKEEDITW) previous date: "28-May-86 09:32:45" {ERIS}KOTO>DEDITHARDCOPY.;1) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DEDITHARDCOPYCOMS) (RPAQQ DEDITHARDCOPYCOMS ((ADVISE MAKEEDITW) (FNS DEDIT-HARDCOPY))) (PUTPROPS MAKEEDITW READVICE [NIL (AFTER NIL (WINDOWPROP !VALUE (QUOTE HARDCOPYFN) (QUOTE DEDIT-HARDCOPY]) (READVISE MAKEEDITW) (DEFINEQ (DEDIT-HARDCOPY [LAMBDA (WINDOW IMS) (* lmm "28-May-86 09:34") (PRINTOUT IMS .FONT BOLDFONT (WINDOWPROP WINDOW (QUOTE TITLE)) .FONT DEFAULTFONT T T) (PRINTDEF (CAR (WINDOWPROP WINDOW (QUOTE EDITEXPR))) NIL T NIL NIL IMS T]) ) (PUTPROPS DEDITHARDCOPY COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (681 998 (DEDIT-HARDCOPY 691 . 996))))) STOP \ No newline at end of file diff --git a/lispusers/DEFAULTICON b/lispusers/DEFAULTICON new file mode 100644 index 00000000..602fb86e --- /dev/null +++ b/lispusers/DEFAULTICON @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED "13-Jan-87 01:23:25" {ERIS}LISPCORE>DEFAULTICON.;1 4586 changes to%: (FNS \MAKEICONWINDOW) previous date%: "19-Dec-85 01:24:06" {ERIS}KOTO>LISPUSERS>DEFAULTICON.;1) (* " Copyright (c) 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DEFAULTICONCOMS) (RPAQQ DEFAULTICONCOMS ((FILES ICONW) (UGLYVARS \DEFAULTICON) (INITVARS (DEFAULTICON \DEFAULTICON)) (FNS \MAKEICONWINDOW))) (FILESLOAD ICONW) (READVARS \DEFAULTICON) (({(READBITMAP)(64 64 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@AOOOOOOOOOOH@@" "@@N@@@@@@@@@@G@@" "@C@@@@@@@@@@@@L@" "@D@@@@@@@@@@@@B@" "@H@@@@@@@@@@@@A@" "A@@@@@@@@@@@@@@H" "B@@@@@@@@@@@CO@D" "B@@@@@@@@@@@BDHD" "D@@@@@@@@@@@ABDB" "D@@@@@@@@@@@AODB" "D@@@@@@@@@@@ABLB" "D@@@@@@@@@@@ABDA" "H@@@@@@@@@@@ABDA" "H@@@@@@@@@@@AOHA" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "H@@@@@@@@@@@@@@A" "D@@@@@@@@@@@@@@B" "D@@@@@@@@@@@@@@B" "D@@@@@@@@@@@@@@B" "B@@@@@@@@@@@@@@D" "B@@@@@@@@@@@@@@D" "A@@@@@@@@@@@@@@H" "@H@@@@@@@@@@@@A@" "@D@@@@@@@@@@@@B@" "@C@@@@@@@@@@@@L@" "@@N@@@@@@@@@@G@@" "@@AOOOOOOOOOOH@@")} {(READBITMAP)(64 64 "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@" "@@AOOOOOOOOOOH@@" "@@OOOOOOOOOOOO@@" "@COOOOOOOOOOOOL@" "@GOOOOOOOOOOOON@" "@OOOOOOOOOOOOOO@" "AOOOOOOOOOOOOOOH" "COOOOOOOOOOOOOOL" "COOOOOOOOOOONDOL" "GOOOOOOOOOOOOBGN" "GOOOOOOOOOOOOOGN" "GOOOOOOOOOOOOBON" "GOOOOOOOOOOOOBGO" "OOOOOOOOOOOOOBGO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "OOOOOOOOOOOOOOOO" "GOOOOOOOOOOOOOON" "GOOOOOOOOOOOOOON" "GOOOOOOOOOOOOOON" "COOOOOOOOOOOOOOL" "COOOOOOOOOOOOOOL" "AOOOOOOOOOOOOOOH" "@OOOOOOOOOOOOOO@" "@GOOOOOOOOOOOON@" "@COOOOOOOOOOOOL@" "@@OOOOOOOOOOOO@@" "@@AOOOOOOOOOOH@@")} (5 6 52 46))) (RPAQ? DEFAULTICON \DEFAULTICON) (DEFINEQ (\MAKEICONWINDOW [LAMBDA (iconText) (* ; "Edited 13-Jan-87 01:22 by Masinter") (DECLARE (SPECVARS ICONPOSITION WINDOW) (GLOBALVARS DEFAULTICON \DEFAULTICON WindowTitleDisplayStream)) (* ;; "Note: This function has to be compiled for STKNTHNAME to work properly.") (LET ((icon (OR DEFAULTICON \DEFAULTICON))) (SETQ icon (SELECTQ (TYPENAME icon) (BITMAP (CREATEWFROMIMAGE (BITMAPCOPY icon))) (WINDOW (CREATEWFROMIMAGE (WINDOW.BITMAP icon))) (LISTP (TITLEDICONW icon (if (WINDOWP iconText) then (WINDOWPROP iconText 'TITLE) else iconText) WINDOWTITLEFONT (CONSTANT ORIGIN) T)) (ERROR icon "can't be used as an icon"))) [if [AND (NOT ICONPOSITION) (NOT (WINDOWPROP WINDOW 'ICONPOSITION] then (SETQ ICONPOSITION (GETBOXPOSITION (WINDOWPROP icon 'WIDTH) (WINDOWPROP icon 'HEIGHT] icon]) ) (PUTPROPS DEFAULTICON COPYRIGHT ("Xerox Corporation" 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3170 4498 (\MAKEICONWINDOW 3180 . 4496))))) STOP \ No newline at end of file diff --git a/lispusers/DEFAULTSUBITEMFN b/lispusers/DEFAULTSUBITEMFN new file mode 100644 index 00000000..e3ad3653 --- /dev/null +++ b/lispusers/DEFAULTSUBITEMFN @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED " 4-Mar-87 15:59:01" {PHYLUM}LYRIC>DEFAULTSUBITEMFN.;1 1299 previous date%: "31-Jan-86 17:45:55" {PHYLUM}KOTO>LISPUSERS>DEFAULTSUBITEMFN.;1) (* " Copyright (c) 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DEFAULTSUBITEMFNCOMS) (RPAQQ DEFAULTSUBITEMFNCOMS ((* * redefine the DEFAULTSUBITEMFN to add the EVAL keyword to the subitem menu field) (FNS DEFAULTSUBITEMFN)) ) (* * redefine the DEFAULTSUBITEMFN to add the EVAL keyword to the subitem menu field) (DEFINEQ (DEFAULTSUBITEMFN (LAMBDA (MENU ITEM) (* edited%: "31-Dec-85 16:41") (* rrb "17-Aug-84 17:24") (* default subitemfn for menus. Checks the fourth element of the item for an expression of the form (SUBITEMS a b c) or if the fourth element is (EVAL form) will return the value of form. MENU and ITEM will be available during the evaluation) (PROG (TEMP) (RETURN (if (AND (LISTP ITEM) (LISTP (SETQ TEMP (CDR ITEM))) (LISTP (SETQ TEMP (CDR TEMP))) (LISTP (SETQ TEMP (CDR TEMP)))) then (SELECTQ (CAR (SETQ TEMP (LISTP (CAR TEMP)))) (SUBITEMS (CDR TEMP)) (EVAL (EVAL (CADR TEMP))) NIL))))) ) ) (PUTPROPS DEFAULTSUBITEMFN COPYRIGHT ("Xerox Corporation" 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (606 1206 (DEFAULTSUBITEMFN 616 . 1204))))) STOP \ No newline at end of file diff --git a/lispusers/DEFAULTSUBITEMFN.TEDIT b/lispusers/DEFAULTSUBITEMFN.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..5b604f525d6d813a3d368d62e9ddc31bf7b6a6ba GIT binary patch literal 3427 zcmeHIOK;mo5T<44Rab`=ZBd|?se7md2!gFDvXfINX=M|kNR^}#ySFv9vKFRDmJiwL zPskrC(0hUWtj;Vc+3_pwrA2`dwzNC*&CIvo%u*u!eeq|MKI^lAJ~lmf+%-Hl99Y#> zwc4&$_o~&K9v~ySy33aUmh{h|o5-`X6l%qHGv=?3MG{>${b*jVdNTpHQp}@C9tcRp zL`-EUQpoN?Wf8<8nad1#2;wpm;Y3UzjfF3#(&w3sLWrg?7hw)*ekwCDPn!V7RHf_b z4tXhaJDY(B1OhWM@gjuqAdA}PVtElI6JT$2vr&fk%XprBkN_jZf(JRzkPHte3Y~~F z53&^Ul#E5rlG2BSiC{lZWO%0H%1m?;BD&y-YW- zM6d)DNQEf{h>AKAp73HO{h4ynfmY%uCUjyBF;6mN0^SU_WjAmYg_xB?nnm#$k5ML` z=2$upGZ|oVijAW*l}M3_qg!IYs*S2(m;2{u32_}>>kCZt5LriI15R_ylfi`y0*I4n zAt#uNXiT{;1DP$61#ooIsYprGe-c3$WjF(IAbo-qL!h`8jb9gNR>dWs$4F4Aq7=ct zCsL#@tIulFC<6R%rZ^8ib#TXuU?zeXtqCln{QDiKDbXg&kk6&xROoWL>h)@#Qt$Y> zRp3Wq#$`y>)etryO8!x;8eWw+&%}MjR_c-Hi73HJ?p4WV)hODN({_C}QusATtw2oiYDvt{06eI#5-f{moeJ==FR0m^hd6w4F4Cq(&t}au zTn}osk$%X)GEBhLh&itD3j>pR9&=z|n}%&z0~>0(qj!xS?CjuQ9b8X$Ji|Jq*dL(N zszYrTcA>M^g8dh?tEtdcT1Pi+`?U+TpT~M1dd$M)tY3%Tk?xcpcTBZ=jxq8ukzu_t zT%&6;um=NhnaO(I2$^_lKXPmj4Xj^yiSXVo4D_L4p1{!VGsgn^4RcJxDie5)@tWD= zB7AHiV(nwcBi(Wh+X9Cjj!k?4xu!j0>)l&s93FXixBJF;NW_@4syud?qtqewT<-+w z;;N3aIYS-gxuqKlv$x-dpE}SwIKZ!Zfv+7gy^m@Za+MqJgh-4n3ms&_*n>9gx7+Z% zbv@Q&$DRsQEkwwR4z!NSs7CB06WpfMH8}A>ESY`hL1Gg%h_a#>LhW1W-w{d`+ z{yvrhw<^fwf#-;P$XY!&SZ~uCr+kxX+t*%W1^U+K7V7l1_M~U(u50wPFAG3L`>65T zHS!znDgLYs4NEt*r|SY=X^)Fv1nu)R^2+wv9XOKd>Zug6k%3fJT|rvKf_BQXc2T#f zCn`$Qis%Z0wvU{#$(o1E8(16KT@1=pMfr;M2$TG~fz)j!Je8*6WO#_em7*p0Rp7_C z-y29e{z%1FDxlPrLISP>DEFINERPRINT.;20 29234 changes to%: (FNS PRINDOTP SUPERPRINT/COMMENT PRINTDEF1) (VARS DEFINERPRINTCOMS) (PROPS (DEFINE-SPECIAL-FORM :DEFINITION-PRINT-TEMPLATE)) (FUNCTIONS XCL::PPRINT-DEFINER) previous date%: "13-Apr-88 13:04:04" {ERIS}LISP>DEFINERPRINT.;19) (* " Copyright (c) 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DEFINERPRINTCOMS) (RPAQQ DEFINERPRINTCOMS ((FUNCTIONS XCL::PPRINT-DEFINER XCL::PPRINT-DEFINER-FITP XCL::PPRINT-DEFINER-RECURSE) (PROP :DEFINITION-PRINT-TEMPLATE DEFCOMMAND CL:DEFCONSTANT DEFDEFINER DEFGLOBALPARAMETER DEFGLOBALVAR DEFINE-CONDITION CL:DEFINE-MODIFY-MACRO CL:DEFINE-SETF-METHOD DEFINE-SPECIAL-FORM DEFINLINE DEFMACRO CL:DEFPARAMETER CL:DEFSETF CL:DEFSTRUCT CL:DEFTYPE CL:DEFUN CL:DEFVAR) (COMS (* ; "Macros for some things pp handles stupidly") (FNS CODEWRAPPER.PRETTYPRINT PROG1.PRETTYPRINT CASE.PRETTYPRINT PROGV.PRETTYPRINT INDENTATION.FROM.HERE SEQUENTIAL.PRETTYPRINT) (ALISTS (PRETTYPRINTMACROS UNINTERRUPTABLY CL:UNWIND-PROTECT RESETLST CL:BLOCK CL:IF PROG1 CL:WHEN CL:UNLESS WITH-READER-ENVIRONMENT CL:CATCH CASE CL:ECASE CL:ETYPECASE CL:TYPECASE CL:PROGV WITH.MONITOR) (PRETTYEQUIVLST PROG* CL:COMPILER-LET))) (COMS (* ; "Repairs to other prettyprinting functions") (FNS SUPERPRINT/COMMENT PRIN2-LONG-STRING SUPERPRINT/WRAPPER SUPERPRINT/SPACE PRINENDLINE PRINDOTP PRINTDEF1) (ADVISE MAKEFILE) (DECLARE%: EVAL@COMPILE DOCOPY (* ; "Doing this at compile suppresses dwim junk") (P (MOVD? (QUOTE \DSPRETTY/ENDLINE) (QUOTE SUBPRINT/ENDLINE) NIL T))) (DECLARE%: EVAL@COMPILE DONTCOPY (P (CL:PROCLAIM (QUOTE (CL:SPECIAL **COMMENT**FLG *PRINT-SEMICOLON-COMMENTS* COMMENTFONT FNSLST RMARGIN SPACEWIDTH)))) (FILES (LOADCOMP) DSPRINTDEF)) (DECLARE%: DONTEVAL@LOAD DOCOPY (* ; "Backward compatibility, needed in Lyric especially") (P (MOVD (QUOTE XCL::PPRINT-DEFINER) (QUOTE PPRINT-DEFINER) NIL T)))) (PROP (FILETYPE MAKEFILE-ENVIRONMENT) DEFINERPRINT))) (CL:DEFUN XCL::PPRINT-DEFINER (XCL::DEFINE-EXPRESSION) (DECLARE (CL:SPECIAL FORMFLG SPACEWIDTH)) (* ; "Bound in prettyprinter") (COND ((OR (NULL FORMFLG) (CL:ATOM (CDR XCL::DEFINE-EXPRESSION))) (* ; "Degenerate cases or printing as a quoted form--punt to default prettyprinting") XCL::DEFINE-EXPRESSION) (T (LET ((TAIL XCL::DEFINE-EXPRESSION) (LEFT (DSPXPOSITION)) XCL::TEMPLATE XCL::TOP-LEVEL-P XCL::NEXT TYPE XCL::FORM XCL::NEWLINEP) (DECLARE (CL:SPECIAL TAIL LEFT)) (* ; "For comment printer") (CL:SETQ XCL::TOP-LEVEL-P (EQ LEFT (DSPLEFTMARGIN))) (* ; "Printing definition to file, etc.") (CL:SETQ LEFT (+ LEFT (CL:* 3 SPACEWIDTH))) (* ; "Place we will indent body") (PRIN1 "(") (PRIN2 (CAR TAIL)) (CL:SETQ XCL::TEMPLATE (OR (GET (CL:POP TAIL) :DEFINITION-PRINT-TEMPLATE) (QUOTE (:NAME)))) (* ;; "This code should, and doesn't, pay attention to the NAME function to determine where the name is to decide what should and shouldn't be bold. Right now, it always bolds the second thing. Fortunately, we currently don't have any definers that don't have either the second or CAR of the second as the definition name.") (* ;; "Also, this code should be careful about calling the NAME function on the form. Sometimes, the form is not really a call to the definer but instead a back-quoted expression in a macro. In most such cases, the name is not really there; some comma-quoted expression is there instead.") (WHILE (CL:CONSP TAIL) DO (COND ((AND (CL:LISTP (CL:SETQ XCL::NEXT (CAR TAIL))) (EQ (CAR XCL::NEXT) COMMENTFLG) (SEMI-COLON-COMMENT-P XCL::NEXT)) (* ; "Comments can appear anywhere, so print this one without consuming the template. ENDLINE has side effect of printing comments") (SUBPRINT/ENDLINE LEFT *STANDARD-OUTPUT*) (CL:SETQ XCL::NEWLINEP T)) ((OR (CL:ATOM XCL::TEMPLATE) (EQ (CL:SETQ TYPE (CL:POP XCL::TEMPLATE)) :BODY)) (* ; "Once we hit the body, there's nothing more special to do.") (RETURN)) (T (SPACES 1) (CASE TYPE (:NAME (* ; "Embolden the name of this thing") (CL:SETQ XCL::NEWLINEP NIL) (COND ((NOT XCL::TOP-LEVEL-P) (* ; "Nothing special here--could even be a backquoted thing") (XCL::PPRINT-DEFINER-RECURSE)) (T (CL:POP TAIL) (COND ((CL:CONSP XCL::NEXT) (* ; "Name is a list. Assume the real name is the car and the rest is an options list or something") (CL:UNLESS (EQ (DSPYPOSITION) (PROGN (PRIN1 "(") (PRINTOUT NIL .FONT LAMBDAFONT |.P2| (CAR XCL::NEXT) .FONT DEFAULTFONT) (SPACES 1) (PRINTDEF (CDR XCL::NEXT) T T T FNSLST) (PRIN1 ")") (DSPYPOSITION))) (* ; "This thing took more than one line to print, so go to new line") (SUBPRINT/ENDLINE LEFT *STANDARD-OUTPUT*) (CL:SETQ XCL::NEWLINEP T))) (T (* ; "Atomic name is bold") (PRINTOUT NIL .FONT LAMBDAFONT |.P2| XCL::NEXT .FONT DEFAULTFONT)))))) (:ARG-LIST (* ; "NEXT is some sort of argument list. ") (COND ((NULL XCL::NEXT) (* ; "If NIL, be sure to print as ()") (PRIN1 "()") (CL:POP TAIL)) (T (XCL::PPRINT-DEFINER-RECURSE))) (CL:SETQ XCL::NEWLINEP NIL)) (T (* ; "Just print it, perhaps starting a new line") (CL:UNLESS (OR XCL::NEWLINEP (XCL::PPRINT-DEFINER-FITP XCL::NEXT)) (* ; "Go to new line if getting crowded") (PRINENDLINE LEFT)) (XCL::PPRINT-DEFINER-RECURSE) (CL:SETQ XCL::NEWLINEP NIL)))))) (* ;; "We've now gotten to the end of stuff we know how to print. Just prettyprint the rest") (CL:UNLESS (NULL TAIL) (COND (XCL::NEWLINEP (* ; "Already on new line")) ((OR (EQ TYPE :BODY) (NOT (XCL::PPRINT-DEFINER-FITP (CAR TAIL)))) (* ; "Go to new line and indent a bit. Always do this for the part matching &BODY, whether or not the prettyprinter thought that the remainder would %"fit%"") (PRINENDLINE LEFT NIL T)) (T (SPACES 1))) (WHILE (AND (CL:CONSP TAIL) (CL:ATOM (CL:SETQ XCL::FORM (CAR TAIL)))) DO (* ;; "Print this doc string or whatever on its own line. This is because otherwise the prettyprinter gets confused and tries to put the next thing after the string") (XCL::PPRINT-DEFINER-RECURSE) (CL:WHEN (AND (CL:KEYWORDP XCL::FORM) (CL:CONSP TAIL)) (* ; "Some sort of keyword-value pair stuff--print it on same line") (SPACES 1) (XCL::PPRINT-DEFINER-RECURSE)) (CL:WHEN (NULL TAIL) (RETURN)) (SUBPRINT/ENDLINE LEFT *STANDARD-OUTPUT*)) (PRINTDEF TAIL T T T FNSLST)) (PRIN1 ")") NIL)))) (CL:DEFUN XCL::PPRINT-DEFINER-FITP (XCL::ITEM) (* ;; "True if it won't look silly to try to print ITEM at current position instead of starting new line") (CL:IF (CL:CONSP XCL::ITEM) (OR (EQ (CAR XCL::ITEM) COMMENTFLG) (AND (< (COUNT XCL::ITEM) 20) (FITP XCL::ITEM))) (< (+ (DSPXPOSITION) (STRINGWIDTH XCL::ITEM *STANDARD-OUTPUT*)) (DSPRIGHTMARGIN)))) (CL:DEFUN XCL::PPRINT-DEFINER-RECURSE NIL (* ;; "Print and pop the next element. Prettyprinter uses the variable IL:TAIL for lookahead") (DECLARE (CL:SPECIAL TAIL)) (SUPERPRINT (CAR TAIL) TAIL NIL *STANDARD-OUTPUT*) (CL:SETQ TAIL (CDR TAIL))) (PUTPROPS DEFCOMMAND :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS CL:DEFCONSTANT :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE)) (PUTPROPS DEFDEFINER :DEFINITION-PRINT-TEMPLATE (:NAME :TYPE :ARG-LIST :BODY)) (PUTPROPS DEFGLOBALPARAMETER :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE)) (PUTPROPS DEFGLOBALVAR :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE)) (PUTPROPS DEFINE-CONDITION :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE :BODY)) (PUTPROPS CL:DEFINE-MODIFY-MACRO :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST)) (PUTPROPS CL:DEFINE-SETF-METHOD :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS DEFINE-SPECIAL-FORM :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS DEFINLINE :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS DEFMACRO :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS CL:DEFPARAMETER :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE)) (PUTPROPS CL:DEFSETF :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :ARG-LIST :BODY)) (PUTPROPS CL:DEFSTRUCT :DEFINITION-PRINT-TEMPLATE (:NAME :BODY)) (PUTPROPS CL:DEFTYPE :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS CL:DEFUN :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY)) (PUTPROPS CL:DEFVAR :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE)) (* ; "Macros for some things pp handles stupidly") (DEFINEQ (CODEWRAPPER.PRETTYPRINT (LAMBDA (FORM) (* ; "Edited 30-Mar-88 11:44 by bvm") (* ;; "Prettyprints things that wrap code like PROGN. We usually want them to start the code on the next line, rather than put the first expression way to the right of all the rest.") (PRIN1 "(") (LET ((HERE (INDENTATION.FROM.HERE))) (PRIN2 (pop FORM)) (* ; "Print the %"function%" itself") (if (NLISTP FORM) then (* ; "Ignore degenerate cases") (PRINTDEF FORM T T T FNSLST) else (SEQUENTIAL.PRETTYPRINT FORM HERE)) (PRIN1 ")") NIL)) ) (PROG1.PRETTYPRINT (LAMBDA (EXPR) (* ; "Edited 30-Mar-88 12:02 by bvm") (* ;; "Prettyprinter advice for PROG1, CL:IF, UNLESS, etc. Default way's main problem is that if the first expression is a non-list but some later expression is a list, it doesn't put ALL the subsequent expressions equally indented. Thus, you get something like (PROG1 A (expression) (expression) ...)") (if (OR (NLISTP (CDR (LISTP (CDR EXPR)))) (AND (NLISTP (CDDDR EXPR)) (for E in (LISTP (CADDR EXPR)) never (LISTP E)))) then (* ; "2 or fewer elements, or 3 elements, the last of which is very simple--let default prettyprinter do it") EXPR else (PRIN1 "(") (LET ((HERE (INDENTATION.FROM.HERE)) (LEFT (PROGN (PRIN2 (pop EXPR)) (* ; "Print the car of form") (SPACES 1) (DSPXPOSITION)))) (DECLARE (SPECVARS LEFT)) (if (OR (if (>= HERE LEFT) then (* ; "Default indentation wants to be greater than the function length, so change it to here") (SETQ HERE LEFT)) (NLISTP (CAR EXPR)) (FITP (CAR EXPR) NIL NIL NIL *STANDARD-OUTPUT*)) then (SUPERPRINT (CAR EXPR) EXPR NIL *STANDARD-OUTPUT*) (* ; "Print the first element right at this position") (pop EXPR)) (SEQUENTIAL.PRETTYPRINT EXPR HERE)) (PRIN1 ")") (* ; "Return NIL to say we handled it") NIL)) ) (CASE.PRETTYPRINT (LAMBDA (EXPR) (* ; "Edited 30-Mar-88 16:54 by bvm") (if (NLISTP (CDR EXPR)) then (* ; "Degenerate case--punt") EXPR else (PRIN1 "(") (LET ((HERE (INDENTATION.FROM.HERE)) (LEFT (PROGN (PRIN2 (pop EXPR)) (* ; "Print the car of form") (SPACES 1) (DSPXPOSITION))) (TAIL EXPR) INNERLEFT CASE) (DECLARE (SPECVARS LEFT TAIL)) (if (OR (if (>= HERE LEFT) then (* ; "Default indentation wants to be greater than the function length, so change it to here") (SETQ HERE LEFT)) (NLISTP (CAR TAIL)) (FITP (CAR TAIL) NIL NIL NIL *STANDARD-OUTPUT*)) then (SUPERPRINT (CAR TAIL) TAIL NIL *STANDARD-OUTPUT*) (* ; "Print the first element right at this position") (pop TAIL)) (SETQ INNERLEFT (+ (SETQ LEFT HERE) (TIMES 3 (CHARWIDTH (CHARCODE X) *STANDARD-OUTPUT*)))) (do (if (NLISTP TAIL) then (if TAIL then (* ; "dotted tail?") (PRINENDLINE LEFT *STANDARD-OUTPUT*) (PRINTDEF TAIL T T T)) (PRIN1 ")") (RETURN NIL) elseif (SEMI-COLON-COMMENT-P (LISTP (CAR TAIL))) then (* ; "Print any comments stuck in between elements") (SUPERPRINT/COMMENT (CAR TAIL) *STANDARD-OUTPUT*) (pop TAIL) else (* ; "Start new line, after printing any comments") (PRINENDLINE LEFT *STANDARD-OUTPUT*) (if (NLISTP (SETQ CASE (CAR TAIL))) then (* ; "degenerate case?") (PRIN2 CASE) else (PRIN1 "(") (LET (FORMFLG) (DECLARE (SPECVARS FORMFLG)) (* ; "Print the key(s) as data") (SUPERPRINT (CAR CASE) CASE NIL *STANDARD-OUTPUT*) (SPACES 1)) (if (NLISTP (SETQ CASE (CDR CASE))) then (* ; "No tail, but handle degenerates") (PRINTDEF CASE T T T) else (SEQUENTIAL.PRETTYPRINT CASE (LET ((HERE (DSPXPOSITION))) (if (OR (<= HERE INNERLEFT) (AND (NULL (CDR CASE)) (if (LISTP (CDR CASE)) then (* ; "Multiple things to print") NIL elseif (NLISTP (CAR CASE)) then (* ; "Print simple consequent if space") (< (STRINGWIDTH (CAR CASE) *STANDARD-OUTPUT* T) (- (DSPRIGHTMARGIN) HERE)) else (FITP CASE T NIL NIL *STANDARD-OUTPUT*)))) then (* ; "Key didn't go too far over, so just prettyprint from here") HERE else INNERLEFT)))) (PRIN1 ")")) (pop TAIL)))))) ) (PROGV.PRETTYPRINT (LAMBDA (EXPR) (* ; "Edited 31-Mar-88 11:30 by bvm") (* ;; "Prettyprinter advice for PROGV. Default way's main problem is that if the vars and values are non-lists the %"body%" of the form doesn't get uniformly indented. Thus, you get something like (PROGV vars values (expression) (expression) ...)") (if (OR (NLISTP (CDR EXPR)) (LISTP (CADR EXPR)) (NLISTP (CDR (LISTP (CDDR EXPR))))) then (* ; "3 or fewer elements, or the second is a list--default prettyprinter will do fine") EXPR else (PRIN1 "(") (LET ((HERE (INDENTATION.FROM.HERE)) (LEFT (PROGN (PRIN2 (pop EXPR)) (* ; "Print the car of form") (SPACES 1) (DSPXPOSITION)))) (DECLARE (SPECVARS LEFT)) (SUPERPRINT (CAR EXPR) EXPR NIL *STANDARD-OUTPUT*) (* ; "Print the first element (vars) at this position") (pop EXPR) (if (XCL::PPRINT-DEFINER-FITP (CAR EXPR)) then (SPACES 1) (* ; "Room for next element (values) here") (SUPERPRINT (CAR EXPR) EXPR NIL *STANDARD-OUTPUT*) (pop EXPR)) (* ; "Finally, print the body") (SEQUENTIAL.PRETTYPRINT EXPR HERE)) (PRIN1 ")") (* ; "Return NIL to say we handled it") NIL)) ) (INDENTATION.FROM.HERE (LAMBDA NIL (* ; "Edited 28-Mar-88 18:17 by bvm") (* ;; "Returns X-pos about 3 chars over, for use in indenting code") (+ (DSPXPOSITION) (TIMES 3 (CHARWIDTH (CHARCODE X) *STANDARD-OUTPUT*)))) ) (SEQUENTIAL.PRETTYPRINT (LAMBDA (TAIL LEFT) (* ; "Edited 1-Apr-88 14:12 by bvm") (DECLARE (SPECVARS TAIL LEFT)) (* ;; "Print each element of tail indented at position LEFT.") (PROG NIL (if (<= (DSPXPOSITION) LEFT) then (* ; "Don't start with newline if we aren't to the right of the left margin") (GO MIDDLE)) TOP (if (OR (NULL TAIL) (PROGN (SUBPRINT/ENDLINE LEFT *STANDARD-OUTPUT*) (NULL TAIL))) then (* ; "Done") (RETURN)) MIDDLE (if (NLISTP TAIL) then (* ; "Degenerate tail") (RETURN (PRINTDEF TAIL T T T))) (SUPERPRINT (CAR TAIL) TAIL NIL *STANDARD-OUTPUT*) (pop TAIL) (GO TOP))) ) ) (ADDTOVAR PRETTYPRINTMACROS (UNINTERRUPTABLY . CODEWRAPPER.PRETTYPRINT) (CL:UNWIND-PROTECT . CODEWRAPPER.PRETTYPRINT) (RESETLST . CODEWRAPPER.PRETTYPRINT) (CL:BLOCK . PROG1.PRETTYPRINT) (CL:IF . PROG1.PRETTYPRINT) (PROG1 . PROG1.PRETTYPRINT) (CL:WHEN . PROG1.PRETTYPRINT) (CL:UNLESS . PROG1.PRETTYPRINT) (WITH-READER-ENVIRONMENT . PROG1.PRETTYPRINT) (CL:CATCH . PROG1.PRETTYPRINT) (CASE . CASE.PRETTYPRINT) (CL:ECASE . CASE.PRETTYPRINT) (CL:ETYPECASE . CASE.PRETTYPRINT) (CL:TYPECASE . CASE.PRETTYPRINT) (CL:PROGV . PROGV.PRETTYPRINT) (WITH.MONITOR . PROG1.PRETTYPRINT)) (ADDTOVAR PRETTYEQUIVLST (PROG* . PROG) (CL:COMPILER-LET . LET)) (* ; "Repairs to other prettyprinting functions") (DEFINEQ (SUPERPRINT/COMMENT (LAMBDA (L FILE) (* ; "Edited 13-Apr-88 12:55 by bvm") (DECLARE (USEDFREE LEFT TAIL RMARGIN FILEFLG MAKEMAP)) (COND ((AND **COMMENT**FLG (NOT FILEFLG) (NOT MAKEMAP)) (* ;; "If we're eliding comments, not printing to a file, and not in DEdit, then just print the elision string") (COND ((> (+ (DSPXPOSITION NIL FILE) (STRINGWIDTH **COMMENT**FLG FILE)) (DSPRIGHTMARGIN NIL FILE)) (* ; "Watch out for overflowing the current line.") (PRINENDLINE (DSPLEFTMARGIN NIL FILE) FILE))) (PRIN1S **COMMENT**FLG NIL FILE)) (T (PROG ((DSLMARG (DSPLEFTMARGIN NIL FILE)) (HERE (DSPXPOSITION NIL FILE)) (COMMENT-RMARGIN RMARGIN) (SEMIP (SEMI-COLON-COMMENT-P L)) COMMENT-LMARGIN RIGHTFLG BODY HALFLINE) (if SEMIP then (* ; "Extract the comment body") (COND ((OR (NOT (STRINGP (SETQ BODY (CAR (LISTP (CDR (LISTP (CDR L)))))))) (CDDDR L)) (* ; "Not a good semi-colon comment") (SETQ SEMIP NIL)))) (COND ((SETQ RIGHTFLG (if SEMIP then (* ; "Only 1-semi comments go in right margin") (EQ SEMIP 1) else (* ; "Short single * comments go at right") (AND (NOT (SUPERPRINTEQ (CADR L) COMMENTFLG)) (<= (LENGTH L) 15)))) (* ; "Print comment in the righthand margin") (SETQ COMMENT-LMARGIN (OR COMMENTCOL (SUPERPRINT/COMMENT1 L RMARGIN FILE)))) ((AND SEMIP (NOT MAKEMAP)) (* ; "Semi-colon comment > 1, unless under DEdit (lest we confuse it)") (AND SEMIP (> SEMIP 2) (NOT MAKEMAP)) (SETQ COMMENT-LMARGIN (if (EQ SEMIP 2) then (* ; "indent like code, but no more than a third of the way over if it would take more than 2 lines to print this.") (MIN LEFT (MAX (- RMARGIN (FIXR (TIMES (STRINGWIDTH BODY FILE) 0.52))) (+ DSLMARG (IQUOTIENT (- RMARGIN DSLMARG) 3)))) else (* ; "Comment should be printed flush left.") DSLMARG))) (T (LET ((INDENT (IQUOTIENT (- RMARGIN DSLMARG) 11))) (* ; "Print old-style comment centered and wide, indented about 10%% from margins") (SETQ COMMENT-LMARGIN (+ DSLMARG INDENT)) (SETQ COMMENT-RMARGIN (- RMARGIN INDENT)) (COND ((EQ HERE COMMENT-LMARGIN) (* ;; "HACK: Almost certainly called from REPP, so we must supress the normal leading and trailing blank lines as they have already been done") (SETQ RIGHTFLG T)))))) (COND ((AND (NULL RIGHTFLG) (OR (NOT SEMIP) (> SEMIP 1))) (* ; "Centered comment starts on new line") (if (> HERE COMMENT-LMARGIN) then (* ; "We have not yet moved down a line, so do that first") (TERPRI FILE)) (if (AND (EQ SEMIP 2) (IMAGESTREAMP FILE)) then (* ; "For 2-semi comments, only go down half line, accomplished by moving up half line now before this next endline") (RELMOVETO 0 (SETQ HALFLINE (IQUOTIENT (- (DSPLINEFEED NIL FILE)) 2)))) (PRINENDLINE COMMENT-LMARGIN FILE)) ((< COMMENT-LMARGIN (DSPXPOSITION NIL FILE)) (* ; "Past the starting point, so start new line") (PRINENDLINE COMMENT-LMARGIN FILE)) (T (DSPXPOSITION COMMENT-LMARGIN FILE))) (SETFONT (PROG1 (SETFONT COMMENTFONT FILE) (COND ((AND SEMIP (NOT MAKEMAP) (OR *PRINT-SEMICOLON-COMMENTS* (IMAGESTREAMP FILE))) (* ; "do nice semi-colon stuff") (PRIN2-LONG-STRING BODY FILE NIL NIL COMMENT-LMARGIN COMMENT-RMARGIN T SEMIP)) (T (* ; "Old comment or in DEdit (makemap true), so have to do it the old way") (SETQ SEMIP NIL) (SUPERPRINT/COMMENT2 L COMMENT-LMARGIN (IQUOTIENT (+ COMMENT-LMARGIN COMMENT-RMARGIN) 2) COMMENT-RMARGIN FILE)))) FILE) (if (OR (NULL SEMIP) (> SEMIP 2)) then (* ; "Old centered comments and big semi-colon comments get new line") (OR RIGHTFLG (PRINENDLINE DSLMARG FILE)) elseif (NULL (CDR TAIL)) then (* ; "Nothing more will be printed. So even though we were a short comment, we need to go to new line so that the closing paren is on a new line, rather than here after the comment (AR 8475)") (PRINENDLINE LEFT FILE) elseif (AND HALFLINE (NOT (AND (LISTP (CDR TAIL)) (SEMI-COLON-COMMENT-P (LISTP (CADR TAIL)))))) then (* ; "Set off double-semi-colon comment by half line. Don't do for consecutive comments, since the next comment will take care of it") (RELMOVETO 0 HALFLINE) (PRINENDLINE DSLMARG FILE)) (RETURN L))))) ) (PRIN2-LONG-STRING (LAMBDA (STRING STREAM P2FLG TAIL LMARG RMARG COMMENTP USE-SEMI-COLONS) (* ; "Edited 4-Apr-88 14:26 by bvm") (* ;; "Fancy string printer that divides long strings into multiple lines at convenient breaks. If P2FLG is true, this is a call from PRIN2 or friend, in which case the surrounding doublequotes are printed, as well as escapes in front of special chars. TAIL is the list car of which is STRING. LMARG and RMARG specify the desired margins of the text. If COMMENTP is true, this is a comment. In addition, if USE-SEMI-COLONS is non-NIL, this is a semi-colon comment with that many semis.") (PROG ((ESC (fetch (READTABLEP ESCAPECHAR) of *READTABLE*)) (SA (fetch (READTABLEP READSA) of *READTABLE*)) (HERE (DSPXPOSITION NIL STREAM)) (FONT (DSPFONT NIL STREAM)) (IMSTREAMP (IMAGESTREAMP STREAM)) ESCWIDTH SPACEWIDTH CLOSEWIDTH SEMIWIDTH LASTSPACE I C NEXTC POS J MAPX1 MAPY1 SINGLELEFT SEMISTRING ESCAPESEPRS SEMICLOSE) (COND ((NOT (type? FONTDESCRIPTOR FONT)) (* ; "Ugh, happens for files") (SETQ FONT STREAM))) (SETQ ESCWIDTH (CHARWIDTH ESC FONT)) (SETQ SPACEWIDTH (CHARWIDTH (CHARCODE SPACE) FONT)) (SETQ CLOSEWIDTH (COND (P2FLG (STRINGWIDTH "%")" FONT)) (T 0))) (if USE-SEMI-COLONS then (if (< USE-SEMI-COLONS 5) then (* ; "Semicolon comment") (SETQ SEMIWIDTH (+ SPACEWIDTH (TIMES USE-SEMI-COLONS (CHARWIDTH (CHARCODE ";") FONT)))) (SETQ SEMISTRING (CONCAT (ALLOCSTRING USE-SEMI-COLONS (CHARCODE ";")) " ")) else (* ; "Balanced (hash bar) comment") (SETQ SEMISTRING "#|") (SETQ SEMIWIDTH (STRINGWIDTH SEMISTRING FONT)) (SETQ SEMICLOSE "|#"))) (COND ((for C instring (PROGN (* ; "dwimify bug tries to turn naked STRING into (STRING C) here.") STRING) as I from 1 bind (POS _ (+ HERE (COND (P2FLG (CHARWIDTH (CHARCODE %") FONT)) ((NULL USE-SEMI-COLONS) 0) ((< USE-SEMI-COLONS 5) SEMIWIDTH) (T (* ; "Include the width of the closing |#") (TIMES 2 SEMIWIDTH))) CLOSEWIDTH)) do (COND ((EQ C (CHARCODE CR)) (* ; "Always want to print these strings specially") (SETQ LASTSPACE I) (RETURN NIL)) ((AND P2FLG (OR (EQ C (CHARCODE %")) (EQ C ESC))) (* ; "Need escape") (add POS ESCWIDTH))) (COND ((> (add POS (CHARWIDTH C FONT)) RMARG) (RETURN NIL))) (COND ((EQ C (CHARCODE SPACE)) (SETQ LASTSPACE I))) finally (RETURN T)) (* ; "It all fits on this line") (RETURN (COND (P2FLG (PRIN2S STRING TAIL STREAM)) (T (if SEMISTRING then (PRIN1 SEMISTRING STREAM)) (PRIN1S STRING TAIL STREAM) (if SEMICLOSE then (PRIN1 SEMICLOSE STREAM))))))) (COND ((OR (NULL LASTSPACE) (AND (NULL COMMENTP) (NEQ HERE LMARG))) (* ;; "Can't print anything on this line before the end. Comments are allowed to have different first and subsequent margin.") (PRINENDLINE (SETQ HERE LMARG) STREAM) (SETQ LASTSPACE 0))) (COND (MAKEMAP (* ; "Note start") (SETQ MAPX1 HERE) (SETQ MAPY1 (DSPYPOSITION NIL STREAM)) (SETQ SINGLELEFT (EQ HERE LMARG)))) (COND (P2FLG (COND ((NOT (IMAGESTREAMP STREAM)) (* ; "Need to be able to read it back") (SETQ ESCAPESEPRS T) (LET ((HASH (fetch (READTABLEP HASHMACROCHAR) of *READTABLE*))) (\OUTCHAR STREAM HASH) (add HERE (CHARWIDTH HASH FONT))))) (\OUTCHAR STREAM (CHARCODE %")) (add HERE (CHARWIDTH (CHARCODE %") FONT))) (USE-SEMI-COLONS (* ; "Print the first set of semi-colons or #|") (PRIN1 SEMISTRING STREAM) (add HERE SEMIWIDTH) (if (EQ USE-SEMI-COLONS 5) then (* ; "No more semis now") (SETQ SEMISTRING NIL)))) (* ;;; "Now loop, printing as much as we can while there's room") (SETQ I 0) LP (COND ((NULL (SETQ C (NTHCHARCODE STRING (add I 1)))) (* ; "Done") (GO DONE)) ((NOT (< I LASTSPACE)) (* ;; "Must find the next safe place to print up to. LASTSPACE is either a space or CR position, or is 0, which is our state when printing from the left margin until we encounter a space.") (SETQ POS HERE) (SETQ J I) (* ; "Ordinarily, J is pointing at a space or CR except when we have just printed an endline") (SELCHARQ C (SPACE (* ; "Would like all spaces before the eol, where they're invisible, not after") (SELCHARQ (NTHCHARCODE STRING (ADD1 J)) ((SPACE CR NIL) (SETQ LASTSPACE (ADD1 J)) (* ; "Go ahead and print this space, and note that it is now okay to break the line") (COND ((AND (>= (+ HERE SPACEWIDTH) RMARG) (NOT ESCAPESEPRS)) (* ; "Extra spaces have no effect, so don't print them at all, lest the dsprightmargin bite") (GO LP)) (T (GO PRINTIT)))) NIL) (add POS SPACEWIDTH)) (CR (* ; "If two cr's in a row, print them all; if only one, must escape it") (COND ((EQ (SETQ C (NTHCHARCODE STRING (add I 1))) (CHARCODE CR)) (PRINENDLINE LMARG STREAM) (while (EQ (SETQ C (NTHCHARCODE STRING (add I 1))) (CHARCODE CR)) do (PRINENDLINE LMARG STREAM))) (ESCAPESEPRS (\OUTCHAR STREAM ESC))) (SETQ LASTSPACE 0) (GO ENDLINE)) (PROGN (* ;; "Gets set this way at left edge. Must print something on this line, even if there are no spaces before the right edge") (GO CHECKESCAPE))) (SETQ LASTSPACE 0) (while (< POS RMARG) do (SELCHARQ (SETQ NEXTC (NTHCHARCODE STRING (add J 1))) ((CR SPACE) (* ; "Can safely go this far") (SETQ LASTSPACE J) (RETURN)) (NIL (* ; "End of string -- ok if there is space for closing quote and paren as well") (COND ((< (+ POS CLOSEWIDTH) RMARG) (SETQ LASTSPACE J) (RETURN)) (T (GO $$OUT)))) NIL) (COND ((OR (EQ NEXTC (CHARCODE %")) (EQ NEXTC ESC)) (add POS ESCWIDTH))) (add POS (CHARWIDTH NEXTC FONT)) finally (COND ((EQ LASTSPACE 0) (* ; "Need break") (COND ((EQ C (CHARCODE SPACE)) (* ; "Will turn this space into CR") (SETQ C (NTHCHARCODE STRING (add I 1)))) (T (SHOULDNT))) (GO ENDLINE)))))) CHECKESCAPE (COND ((AND P2FLG (OR (EQ C (CHARCODE %")) (EQ C ESC))) (\OUTCHAR STREAM ESC) (add HERE ESCWIDTH))) PRINTIT (\OUTCHAR STREAM C) (add HERE (CHARWIDTH C FONT)) (GO LP) ENDLINE (PRINENDLINE LMARG STREAM) (SETQ HERE LMARG) (COND ((NULL C) (* ; "Done") (GO DONE)) ((AND ESCAPESEPRS (EQ (\SYNCODE SA C) SEPRCHAR.RC)) (* ; "Have to quote sepr immediately following CR") (\OUTCHAR STREAM ESC) (add HERE ESCWIDTH) (GO PRINTIT)) (T (COND (SEMISTRING (PRIN1 SEMISTRING STREAM) (add HERE SEMIWIDTH))) (GO CHECKESCAPE))) DONE (COND (P2FLG (\OUTCHAR STREAM (CHARCODE %")))) (COND (MAKEMAP (LET ((ENTRY (MAKEMAPENTRY TAIL (AND (NEQ MAKEMAP T) MAKEMAP) MAPX1 MAPY1 (DSPXPOSITION NIL STREAM) (DSPYPOSITION NIL STREAM) (\DEDITFONT# STREAM)))) (replace LONGSTRINGP of ENTRY with T) (COND (SINGLELEFT (replace LONGSTRING1MARGINP of ENTRY with T))) (COND ((EQ (- (DSPRIGHTMARGIN NIL STREAM) LMARG) RMARG) (* ;; "Assume that RMARG not equal to stream's right margin only happens for centered comments. In reality, it happens as well inside REPP, where RESETCLIP hides the true right margin.") (replace LONGSTRINGSYMMETRICP of ENTRY with T))))) (SEMICLOSE (PRIN1 SEMICLOSE STREAM))) (RETURN))) ) (SUPERPRINT/WRAPPER (LAMBDA (MACRO E TAIL BRFLG FILE) (* ; "Edited 31-Mar-88 12:00 by bvm") (* ;;; "Print E as MACRO followed by (CADR E), for example, print (QUOTE foo) as 'foo") (PRINOPEN TAIL MACRO FILE) (* ; "Print the prefix") (COND (MAKEMAP (* ;; "Need to fool DEDIT into thinking that it is printing the whole list E when only (CADR E) appears in print. So do a fake entry for (CAR E) whose width is zero") (replace WRAPPER of MAKEMAP with MACRO) (* ; "MAKEMAP is the entry for E -- want everyone to know it wasn't printed as normal list") (LET ((X (DSPXPOSITION NIL FILE)) (Y (DSPYPOSITION NIL FILE))) (MAKEMAPENTRY E (AND (NEQ MAKEMAP T) MAKEMAP) X Y X Y (\DEDITFONT# FILE))))) (PROG1 (SUPERPRINT (CADR E) (CDR E) BRFLG FILE) (* ; "Make sure to return the result of SUPERPRINT, so that caller (eventually SUBPRINT) knows whether we printed something like a list or not") (PRINSHUT TAIL NIL FILE) (* ; "Finally, print a vacuous closing paren"))) ) (SUPERPRINT/SPACE (LAMBDA (FILE) (* ; "Edited 31-Mar-88 12:18 by bvm") (* ;; "Print a space, preparing for next item to be printed") (DECLARE (CL:SPECIAL RMARGIN SPACEWIDTH LEFT)) (* ; "bound by prettyprinter stuff") (if (< (- RMARGIN (DSPXPOSITION NIL FILE)) (TIMES 2 SPACEWIDTH)) then (* ; "printing a space will overflow the line, or if not then the next char would, so go to new line") (PRINENDLINE LEFT FILE) else (PRIN3 " " FILE))) ) (PRINENDLINE (LAMBDA (NEWXPOSITION FILE) (* ; "Edited 1-Apr-88 14:24 by bvm") (* ;; "Terminate line, setting x at NEWXPOSITION.") (OR FILE (SETQ FILE *STANDARD-OUTPUT*)) (COND (MAKEMAP (* ; "From DEdit") (MOVETO NEWXPOSITION (+ (DSPYPOSITION NIL FILE) (DSPLINEFEED NIL FILE)) FILE)) (T (TERPRI FILE) (COND ((OR (SELECTQ (IMAGESTREAMTYPE FILE) ((NIL TEXT) (* ; "These don't know how to set x position") T) (PROGN (* ; "Assume all other image streams are ok") NIL)) (if (EQ FILE (TTYDISPLAYSTREAM)) then (* ; "Even if FILE knows how to set xpos, the dribble file doesn't, so use spaces") (DRIBBLEFILE))) (SETFONT (PROG1 (SETFONT DEFAULTFONT FILE) (* ;; "Print introductory spaces in the default font because we don't quite have this right yet for pspool files") (LET ((NS (QUOTIENT (- NEWXPOSITION (DSPXPOSITION NIL FILE)) SPACEWIDTH))) (RPTQ (QUOTIENT NS 8) (PRIN3 " " FILE)) (RPTQ (REMAINDER NS 8) (PRIN3 " " FILE)))) FILE))) (DSPXPOSITION NEWXPOSITION FILE)))) ) (PRINDOTP (LAMBDA (E FILE) (* ; "Edited 13-Apr-88 15:08 by bvm") (* ;; "Print a dotted tail consisting of the non-list E, i.e., print %" . %"") (LET* ((DOT " . ") (MAXPOS (- RMARGIN (WIDTH E FILE T) (WIDTH DOT FILE) (WIDTH ")" FILE)))) (* ; "MAXPOS is the rightmost position at which this will fit") (if (AND (> (DSPXPOSITION NIL FILE) MAXPOS) (>= MAXPOS FIRSTPOS)) then (* ; "Print dotted tail on next line as far to right as possible") (PRINENDLINE MAXPOS FILE)) (PRIN3 DOT FILE) (PRIN2S E (COND (MAKEMAP (MAKEDOTPTAIL E MAKEMAP)) (T (CONS E E))) FILE))) ) (PRINTDEF1 (LAMBDA (EXPR) (* ; "Edited 7-Apr-88 10:54 by bvm") (* ;; "Used by MAKEFILE to print P, etc expressions. These are at top level, so must be forms! But still print BLOCK: as a var to make it prettier") (TERPRI) (PRINTDEF EXPR NIL (NEQ (CAR EXPR) (QUOTE BLOCK%:)) NIL FNSLST) (TERPRI)) ) ) (XCL:REINSTALL-ADVICE (QUOTE MAKEFILE) :AROUND (QUOTE ((:LAST (LET ((PRETTYFLG (AND (NOT (MEMB (QUOTE FAST) OPTIONS)) PRETTYFLG))) (DECLARE (CL:SPECIAL PRETTYFLG)) *))))) (READVISE MAKEFILE) (DECLARE%: EVAL@COMPILE DOCOPY (MOVD? (QUOTE \DSPRETTY/ENDLINE) (QUOTE SUBPRINT/ENDLINE) NIL T) ) (DECLARE%: EVAL@COMPILE DONTCOPY (CL:PROCLAIM (QUOTE (CL:SPECIAL **COMMENT**FLG *PRINT-SEMICOLON-COMMENTS* COMMENTFONT FNSLST RMARGIN SPACEWIDTH))) (FILESLOAD (LOADCOMP) DSPRINTDEF) ) (DECLARE%: DONTEVAL@LOAD DOCOPY (MOVD (QUOTE XCL::PPRINT-DEFINER) (QUOTE PPRINT-DEFINER) NIL T) ) (PUTPROPS DEFINERPRINT FILETYPE :COMPILE-FILE) (PUTPROPS DEFINERPRINT MAKEFILE-ENVIRONMENT (:PACKAGE "INTERLISP" :READTABLE "INTERLISP")) (PUTPROPS DEFINERPRINT COPYRIGHT ("Xerox Corporation" 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (8172 13865 (CODEWRAPPER.PRETTYPRINT 8182 . 8700) (PROG1.PRETTYPRINT 8702 . 9931) ( CASE.PRETTYPRINT 9933 . 11951) (PROGV.PRETTYPRINT 11953 . 13049) (INDENTATION.FROM.HERE 13051 . 13271) (SEQUENTIAL.PRETTYPRINT 13273 . 13863)) (14562 28429 (SUPERPRINT/COMMENT 14572 . 18530) ( PRIN2-LONG-STRING 18532 . 25171) (SUPERPRINT/WRAPPER 25173 . 26133) (SUPERPRINT/SPACE 26135 . 26578) ( PRINENDLINE 26580 . 27555) (PRINDOTP 27557 . 28122) (PRINTDEF1 28124 . 28427))))) STOP \ No newline at end of file diff --git a/lispusers/DIALPHONE b/lispusers/DIALPHONE new file mode 100644 index 00000000..c2d24f11 --- /dev/null +++ b/lispusers/DIALPHONE @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP") (FILECREATED " 5-Oct-89 11:00:18" {ICE}LISP>LYRIC>DIALPHONE.\;6 10111 |changes| |to:| (FNS DIALPHONE) (VARS DIALPHONECOMS) |previous| |date:| "24-Jul-89 15:27:55" {ICE}LISP>LYRIC>DIALPHONE.\;5) (PRETTYCOMPRINT DIALPHONECOMS) (RPAQQ DIALPHONECOMS ((FNS DIALPHONE) (INITVARS (DIALHISTSIZE 10) (DIALITEMS) (DIALMENU) (DIALPREFIX "ATDT") (DIALSUFFIX (CHARACTER 13)) (LASTNUMBERDIALED) (PHONEBILLNUMBER)) (BITMAPS PHONEMAP))) (DEFINEQ (DIALPHONE (LAMBDA (NUMBER DMENU BUTTON) (* \; "Edited 5-Oct-89 10:52 by MJD") (* |;;| "Phone dialing program for Hayes-compatible modems on the RS-232 port. Creates a global var. DIALMENU (which it tries to attach to an AddressBook window), and uses global strings PHONEBILLNUMBER - your local extension, and LASTNUMBERDIALED. Prompts for a number from the user if NUMBER is not provided.") (NLSETQ (PROG ((ATOZ '(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)) MODEMLST MODEMSTR RS232STREAM DIALWINDOW) (|if| (AND (NOT NUMBER) (NOT DIALMENU)) |then| (* |;;|  "1st-time-only initializations (also skip this if the first call is programmatic):") (* |;;| "Note - no error checking:") (OR PHONEBILLNUMBER (SETQ PHONEBILLNUMBER (PROMPTFORWORD "What is your extension number?" NIL NIL PROMPTWINDOW))) (OR PHONEBILLNUMBER (SETQ PHONEBILLNUMBER "")) (SETQ DIALMENU (|create| MENU ITEMS _ (LIST (LIST (EVAL PHONEMAP) NIL "Dials a phone number.")) MENUOUTLINESIZE _ 2 MENUFONT _ (FONTCREATE 'HELVETICA 12 'BOLD) WHENSELECTEDFN _ 'DIALPHONE)) (SETQ DIALWINDOW (|for| W |in| (OPENWINDOWS) |when| (EQ (WINDOWPROP W 'TITLE) '|Address Book|) |do| (RETURN W))) (|if| (NOT DIALWINDOW) |then| (PRINTOUT T "I couldn't find an AddressBook window to attach the Dial menu. Click left in the window you want it attached to, or in the Background to make a free-standing menu." ) (UNTILMOUSESTATE LEFT) (SETQ DIALWINDOW (WHICHW))) (|if| DIALWINDOW |then| (ATTACHMENU DIALMENU DIALWINDOW 'TOP 'LEFT) |else| (ADDMENU DIALMENU)) (RETURN DIALWINDOW)) (* |;;| "The NLSETQ keeps this from breaking if the modem is already in use:") (SETQ RS232STREAM (OPENSTREAM '{RS232} 'OUTPUT)) (SETQ LASTNUMBERDIALED (|if| (NUMBERP (MKATOM NUMBER)) |then| (* |;;| "We were invoked programatically:") NUMBER |else| (* |;;| "Called from menu, so get a number to dial:") (|if| (EQ BUTTON 'LEFT) |then| (* |;;| "Wants to type it in:") (PROMPTFORWORD "Number please:" LASTNUMBERDIALED NIL PROMPTWINDOW) |else| (* |;;| "Wants to select from history list:") (MENU (|create| MENU ITEMS _ DIALITEMS TITLE _ "Number please:"))))) (|if| (NOT LASTNUMBERDIALED) |then| (* |;;| "Didn't give a number, so wrap it up right here:") (CLOSEF RS232STREAM) (SETQ LASTNUMBERDIALED "") (* \;  "So it won't print \"NIL\" next time.") (PRINTOUT PROMPTWINDOW "...aborted." T) (RETURN NIL)) (|push| DIALITEMS LASTNUMBERDIALED) (* \; "Add to history list.") (|if| (GREATERP (LENGTH DIALITEMS) DIALHISTSIZE) |then| (* \; "Dequeue as needed:") (CL:NBUTLAST DIALITEMS 1)) (SETQ MODEMSTR (CONCAT LASTNUMBERDIALED)) (* \;  "Make copy so it won't get smashed by RPLSTRING below.") (|if| (INTERSECTION (UNPACK MODEMSTR) (APPEND ATOZ (L-CASE ATOZ))) |then| (* |;;| "It's got letters! Turn them into numbers:") (SETQ MODEMLST (UNPACK MODEMSTR)) (|for| N |from| 2 |to| 9 |as| GROUP |in| '((A B C) (D E F) (G H I) (J K L) (M N O) (P R S) (T U V) (W X Y)) |do| (|for| LETTER |in| GROUP |do| (DSUBST N LETTER MODEMLST))) (SETQ MODEMSTR (CONCATLIST MODEMLST))) (SETQ MODEMSTR (|if| (ILEQ (NCHARS MODEMSTR) 5) |then| (* |;;| "Just another extension:") (CONCAT MODEMSTR ",") |else| (|if| (ILEQ (NCHARS MODEMSTR) 8) |then| (* |;;|  "It's a local call (7 digits +optional \"-\"), so dial 9 first:") (CONCAT "9" MODEMSTR) |else| (* |;;|  "Long distance, so dial 8 first and add local no. for billing:") (|if| (STRING-EQUAL (SUBSTRING MODEMSTR 1 2 ) "8*") |then| (* |;;| "It's an Intelnet number:") (CONCAT (RPLSTRING MODEMSTR 1 "8,") "," PHONEBILLNUMBER) |else| (* |;;| "It's outside:") (CONCAT "8," MODEMSTR "," PHONEBILLNUMBER))))) (* |;;| "Dial the number and hang up:") (PRIN1 (CONCAT DIALPREFIX MODEMSTR ";H0" DIALSUFFIX) RS232STREAM) (PRINTOUT PROMPTWINDOW "...dialing...") (FORCEOUTPUT RS232STREAM) (* \; "Ensure buffer is dumped.") (CLOSEF RS232STREAM) (* \; "Cleanup & exit.") (PRINTOUT PROMPTWINDOW "OK" T) (RETURN LASTNUMBERDIALED))))) ) (RPAQ? DIALHISTSIZE 10) (RPAQ? DIALITEMS ) (RPAQ? DIALMENU ) (RPAQ? DIALPREFIX "ATDT") (RPAQ? DIALSUFFIX (CHARACTER 13)) (RPAQ? LASTNUMBERDIALED ) (RPAQ? PHONEBILLNUMBER ) (RPAQQ PHONEMAP #*(64 32)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOL@@@@@@@@COOOOOOOOH@@@@@@OOL@@@@GON@@@@@CL@@@@@@@@GH@@@@G@@@@@@@@@AL@@@@NF@@@@@@@@HN@@@ALC@@F@@L@AHG@@@CHAH@IOOB@C@C@@@C@@LGIOOCLF@AH@@F@@BOIHCCND@AH@@F@@@HIHCBB@@AH@@F@C@GOOOOL@LAH@@F@NAOOOOOO@CAH@@FC@CL@@@@CK@OH@@GLCG@AIIHAMLAH@AN@NN@AIIH@NOCH@COCML@@@@@@GCO@@CCOCH@AIIH@CHN@@FALC@@AIIH@AH@@@G@@G@@@@@@@AL@@@F@@N@@AIIH@@N@@@EH@L@@AIIH@@F@@@CDAL@@@@@@@@G@@@BMAH@@AIIH@@C@@@AKAH@@AIIH@@C@@@@JOH@@@@@@@@C@@@@COH@@@@@@@@C@@@@BOOOOOOOOOOO@@@@@AOOOOOOOOOO@@@@@@GN@@@@@@OL@@@ ) (DECLARE\: DONTCOPY (FILEMAP (NIL (797 9336 (DIALPHONE 807 . 9334))))) STOP \ No newline at end of file diff --git a/lispusers/DIALPHONE.TEDIT b/lispusers/DIALPHONE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..e27772821f9a6eed4b1724b9e00d1257142f8b55 GIT binary patch literal 5916 zcmd^CO>^VM5v8=UU7HP46<4Z~V~06}bR^b_D`{otlM+D*Wr(Cfa95jD4ntx{A_4&h z09Rt}ImFleoBRU*h5Vbm?g2zlYpoq0l2k<{@ng`_)BXDO>(RC4_OG9I?6xzw?Dwo{ zt6Dv(Ru8My%@V#~>1_QO(N!>+>ySD+8ta7W=Dqp)Z0P;&S|{;c^Spo6sMgs4$#_Fd*<6!5JZQaW(K1dlvn8F!tI((0IJu$QAe&?BZQyHqtCB!xYl^4F zRf=e$iKZZ5bYG>elp zg?Q)46Ft#U7Oo9Qe(ok^bQda!GW==Y3FvO3_%@|^e9K7rT7?D;KbTH+qLFz@W1Zb< z9f>oJGK?oM(|4JUQecqo6EH{_JgkTKsv;jou=Ej+f)8_)3R4s#QBfMI41P`aCdHIX z#&O93Iz!oUu$tTu!i|drn$`Zma@)cgCssb)6R_!kRR(rJ*2L%p>2j2^Dgxq7Q5x()tIlv2&~)~*m0)P7_CVTUQkbGizJ?x98`$Tco+-N5IA8^A|SEJtK~ zZ_)#z=vYA!vMzg>i3WZ$GH0WX!jrmfv{XRiR5hr&(%Tl~T&nOU7 zngcR3NrEwmH`b_lv+ALLInvU0Ns}waF^b%THcpn|+CbMs)D9T>4=60(c} zJB4cUmV0-|3L2Xjw#Q4IDArxH3H#)ZfoTRUM~~#*H{{5@bClb8F9P4kfH67mo0@aa z&osLc>LV837b>*p;qyX(1YxNes15yNUb0!${FYP4Lzw}P>~yIyK@w?k zNC{JLwG<21>j35m-NS~h_UEayaRa8~1Z-2QEM5Q$ma;VgPGE!&YRXDd3JL0D;sHTQ zuF=Oh4+DuM1(QiAl~*)R2BJqZM8(zF65;J2`2d{;GfWgwJth+mMjD)5AEenDIHzl1 zwV=8Rxl*&acuWaA63qcV!E{X!4|bG55`cqYTZ-7y6#1aN(%=rM%mM^0!v*bTCb60F z=qN;~lW1!;$t+^ayeRrkO$4V@a$~|5CxMhN2`{I`DeoR&rpnf|`=x+gRBV~(X>fCgg-%Xg1NO1!tQG6CbjFw#i^ z;w(T_o^g2_4U90pHq(XC%Ht~pi=zO(O}YMF+Cy(>|K1{c`iEB#do>RAAJMXCFTNS! z`fF}!i_IM%HCZzuR8pKO;w7yMEtC1rUrI{&b#q`#4*_ULPt_{S=+}@w6W+kJy7u+M z;0nZWFGXBF3n^fb8+fF(kH(D=SC9pugLELLTXtV-dmWE?buKhQ5s)u7@%jKG#thl= zkk8`PWPTvG8(i$(2Dn@be#24sI|c~NSOgJA$jp{RwqpF%x%(Tcw}X;amOEYIpG5c+9_eZw3~* zqh1dWcnNl=NA&XOh>lyQ^x~w!)>!ncYfm;xI4|L|MMo#6baHfROd2ryx8jBUgZLz; zB44-d^!uL=ss6>N-66;7dJQ_iY`gjDaKwO|yY|3Cl6LQvJ+#jpi~8Lz4K2qy_XdE+ zlkWq!?_mMFkf+?!xIlE_GWQ^g^dxLNV+-~2!!oN`E zVgek-_@qUx({dTUWeIsNm+A#^wL4hOOiOLJ=DcQIQWSA6Aa})6Q3wXL#Ft zvRA3>;_J>=J7VzI%RWEArXS*MZ}-V#X0pCt`Lgom&MA)iHnuP-g4snd@A)bGvdP{z z*j};`{K^j}S<3JkOH$r6m1iZLGuH3C?o~dj{J8S;(sEu|o_*e~eDB`mx0S0a5rwnL{V#Af@CDjyoDDb`Smch+#&X6^gt=q)?O z+5CK5*>n0A{mM^@1$p0cJlb1zkP>2uOIID mxLA1noc+SYRJ9_aBhf#;XI$(N6D|*LMn2VlRxbbYkADG@vL@pI literal 0 HcmV?d00001 diff --git a/lispusers/DICOLOR b/lispusers/DICOLOR new file mode 100644 index 00000000..f9912ef3 --- /dev/null +++ b/lispusers/DICOLOR @@ -0,0 +1 @@ +(FILECREATED "15-Aug-85 19:44:58" {ERIS}LIBRARY>DICOLOR.;2 15766 changes to: (VARS DICOLORCOMS) previous date: " 9-Aug-85 05:58:26" {ERIS}LIBRARY>DICOLOR.;1) (* Copyright (c) 1985 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DICOLORCOMS) (RPAQQ DICOLORCOMS ((FNS CNSMENUINIT CNSTOCSL CNSTORGB CSLTOCNS DICOLOR.FROM.USER GETCNS HLSTOCSL CSLTOHLS RGBTOCNS) (VARS DICOLOR.hueMapping DICOLOR.lightnessMapping DICOLOR.saturationMapping NEWCOLORITEM) (INITVARS (COLORNAMEMENU)) (FNS DICOLOR.hueN DICOLOR.hueNvalue DICOLOR.hueNname DICOLOR.lightnessN DICOLOR.lightnessNvalue DICOLOR.lightnessNname DICOLOR.saturationN DICOLOR.saturationNvalue DICOLOR.saturationNname) (DECLARE: DONTCOPY (*) (RECORDS hueRecord lightnessRecord saturationRecord) (CONSTANTS * DICOLOR.hueConstants) (CONSTANTS * DICOLOR.saturationConstants) (CONSTANTS * DICOLOR.lightnessConstants)))) (DEFINEQ (CNSMENUINIT [LAMBDA NIL (* gbn " 9-Aug-85 03:11") [SETQ CNSHUEMENU (create MENU ITEMS _(for I in DICOLOR.hueMapping collect (CAR I] [SETQ CNSSATURATIONMENU (create MENU ITEMS _(for I in DICOLOR.saturationMapping collect (CAR I] (SETQ CNSLIGHTNESSMENU (create MENU ITEMS _(for I in DICOLOR.lightnessMapping collect (CAR I]) (CNSTOCSL [LAMBDA (hue saturation lightness) (* hdj "12-Apr-85 19:01") (PROG ((hueAtom (MKATOM hue)) (saturationAtom (MKATOM saturation)) (lightnessAtom (MKATOM lightness)) c s l) (if [NOT (SETQ c (fetch (hueRecord ordering) of (ASSOC hueAtom DICOLOR.hueMapping] then (SETQ c DICOLOR.achromatic)) (if (EQ c DICOLOR.achromatic) then (SETQ s DICOLOR.noSaturation) else (if [NOT (SETQ s (fetch (saturationRecord ordering) of (ASSOC saturationAtom DICOLOR.saturationMapping] then (SETQ s DICOLOR.vivid))) (SELECTQ hueAtom (Black (SETQ l DICOLOR.black)) (White (SETQ l DICOLOR.white)) (if [NOT (SETQ l (fetch (lightnessRecord ordering) of (ASSOC lightnessAtom DICOLOR.lightnessMapping] then (SETQ l DICOLOR.medium))) (RETURN (LIST c s l]) (CNSTORGB [LAMBDA (saturation lightness hue) (* hdj "15-Jul-85 12:33") (LET ((CSL (CNSTOCSL hue saturation lightness))) (HLSTORGB (APPLY (FUNCTION CSLTOHLS) CSL]) (CSLTOCNS [LAMBDA (c s l) (* hdj "15-Jul-85 12:37") (PROG (hue saturation lightness) [if (EQ c DICOLOR.achromatic) then (SETQ saturation "") [SELECTC l (DICOLOR.black (SETQ hue "Black") (SETQ lightness "")) (DICOLOR.white (SETQ hue "White") (SETQ lightness "")) (PROGN (SETQ hue "Gray") (SETQ lightness (MKSTRING (fetch (lightnessRecord name) of (DICOLOR.lightnessN l] else (SETQ hue (fetch (hueRecord name) of (DICOLOR.hueN c))) (SETQ saturation (fetch (saturationRecord name) of (DICOLOR.saturationN s))) (SETQ lightness (fetch (lightnessRecord name) of (DICOLOR.lightnessN l] (RETURN (LIST saturation lightness hue]) (DICOLOR.FROM.USER [LAMBDA (NAMES?) (* gbn " 9-Aug-85 04:51") (* * returns an RGB triple. If NAMES? prompts the user first with the global color name menu. She can then choose NEWCOLOR which can be specified as RGB or CNS) (PROG (NAME RGB) (if NAMES? then (* first try to get a color name) [SETQ NAME (MENU (OR COLORNAMEMENU (SETQ COLORNAMEMENU (CREATE MENU ITEMS _(CONS NEWCOLORITEM (FOR ENTRY IN COLORNAMES COLLECT (CAR ENTRY] (if (NOT NAME) then (* the user clicked outside the menu) (RETURN)) [SETQ RGB (SELECTQ NAME (RGB (READCOLOR1 "specify new color")) (CNS (APPLY (FUNCTION CNSTORGB) (GETCNS))) (RETURN (CDR (ASSOC NAME COLORNAMES] (if (NOT (SETQ NAME (TTYIN "New color name? "))) then (* user must have decided that she didn't want to keep  (name) the color) (RETURN)) (push COLORNAMES (CONS (CAR NAME) RGB)) (SETQ COLORNAMEMENU NIL) (* invalidate the menu) (RETURN RGB]) (GETCNS [LAMBDA NIL (* gbn " 9-Aug-85 03:13") (LIST (MENU CNSLIGHTNESSMENU) (MENU CNSSATURATIONMENU) (MENU CNSHUEMENU]) (HLSTOCSL [LAMBDA (hue lightness saturation) (* hdj "15-Jul-85 12:14") (LET ((ISLHue (FQUOTIENT (MOD (PLUS hue 240) 360) 360))) (PROG (c s l) (for old s from DICOLOR.noSaturation to DICOLOR.vivid do (if (EQ s DICOLOR.vivid) then (RETURN)) (if (LEQ saturation (PLUS (DICOLOR.saturationNvalue s) (QUOTIENT (DIFFERENCE (DICOLOR.saturationNvalue (ADD1 s)) (DICOLOR.saturationNvalue s)) 2))) then (RETURN))) [if (EQ s DICOLOR.noSaturation) then (SETQ c DICOLOR.achromatic) (for old l from DICOLOR.black to DICOLOR.white do (if (EQ l DICOLOR.white) then (RETURN)) (if (LEQ lightness (PLUS (DICOLOR.lightnessNvalue l) (QUOTIENT (DIFFERENCE (DICOLOR.lightnessNvalue (ADD1 l)) (DICOLOR.lightnessNvalue l)) 2))) then (RETURN))) else (for old c from DICOLOR.red to DICOLOR.purplishRed do (* (HELP c)) (if (EQ c DICOLOR.purplishRed) then (if (GREATERP ISLHue (PLUS (DICOLOR.hueNvalue c) (QUOTIENT (DIFFERENCE 1 ( DICOLOR.hueNvalue c)) 2))) then (SETQ c DICOLOR.red)) (RETURN)) (if (LEQ ISLHue (PLUS (DICOLOR.hueNvalue c) (QUOTIENT (DIFFERENCE (DICOLOR.hueNvalue (ADD1 c)) (DICOLOR.hueNvalue c)) 2))) then (RETURN))) (for old l from DICOLOR.veryDark to DICOLOR.veryLight do (if (EQ l DICOLOR.veryLight) then (RETURN)) (if (LEQ lightness (PLUS (DICOLOR.lightnessNvalue l) (QUOTIENT (DIFFERENCE (DICOLOR.lightnessNvalue (ADD1 l)) (DICOLOR.lightnessNvalue l)) 2))) then (RETURN] (RETURN (LIST c s l]) (CSLTOHLS [LAMBDA (c s l) (* hdj "15-Jul-85 12:23") (PROG (hue saturation lightness) (if (EQ c DICOLOR.achromatic) then (SETQ hue 0.0) (SETQ saturation 0.0) (SETQ lightness (DICOLOR.lightnessNvalue l)) else (SETQ hue (DICOLOR.hueNvalue c)) (SETQ saturation (DICOLOR.saturationNvalue s)) (SETQ lightness (DICOLOR.lightnessNvalue l))) (RETURN (LIST (MOD (FPLUS 120 (FTIMES hue 360)) 360) lightness saturation]) (RGBTOCNS [LAMBDA (Red Green Blue) (* hdj "15-Jul-85 12:36") (APPLY (FUNCTION CSLTOCNS) (APPLY (FUNCTION HLSTOCSL) (RGBTOHLS Red Green Blue]) ) (RPAQQ DICOLOR.hueMapping ((Achromatic 0.0 -1) (Red 0.0 0) (OrangishRed .01 1) (RedOrange .02 2) (ReddishOrange .03 3) (Orange .04 4) (YellowishOrange .07 5) (OrangeYellow .1 6) (OrangishYellow .13 7) (Yellow .1673 8) (GreenishYellow .2073 9) (YellowGreen .2473 10) (YellowishGreen .2873 11) (Green .3333 12) (BluishGreen .4133 13) (GreenBlue .4933 14) (GreenishBlue .5733 15) (Blue .6666 16) (PurplishBlue .6816 17) (BluePurple .6966 18) (BluishPurple .7116 19) (Purple .73 20) (ReddishPurple .8 21) (PurpleRed .87 22) (PurplishRed .94 23) (BrownishRed .01 24) (RedBrown .02 25) (ReddishBrown .03 26) (Brown .04 27) (YellowishBrown .07 28) (BrownYellow .1 29) (BrownishYellow .13 30))) (RPAQQ DICOLOR.lightnessMapping ((Black 0.0 0) (VeryDark .1666 1) (Dark .3333 2) (Medium .5 3) (Light .6666 4) (VeryLight .8333 5) (White 1.0 6))) (RPAQQ DICOLOR.saturationMapping ((NoSaturation 0.0 0) (Grayish .25 1) (Moderate .5 2) (Strong .75 3) (Vivid 1.0 4))) (RPAQQ NEWCOLORITEM (New% Color (QUOTE CNS) "Allows specification of a new color" (SUBITEMS (RGB (QUOTE RGB) "Specify a new color using Red, Green, Blue sliders") (CNS (QUOTE CNS) "Specify a new color using English")))) (RPAQ? COLORNAMEMENU ) (DEFINEQ (DICOLOR.hueN [LAMBDA (N) (* hdj "17-Apr-85 13:38") (DECLARE (GLOBALVARS DICOLOR.hueMapping)) (for ELT in DICOLOR.hueMapping suchthat (EQ (fetch (hueRecord ordering) of ELT) N]) (DICOLOR.hueNvalue [LAMBDA (N) (* hdj "18-Apr-85 09:58") (fetch (hueRecord value) of (DICOLOR.hueN N]) (DICOLOR.hueNname [LAMBDA (N) (* hdj "18-Apr-85 10:07") (fetch (hueRecord name) of (DICOLOR.hueN N]) (DICOLOR.lightnessN [LAMBDA (N) (* hdj "17-Apr-85 13:40") (DECLARE (GLOBALVARS DICOLOR.lightnessMapping)) (for ELT in DICOLOR.lightnessMapping suchthat (EQ (fetch (lightnessRecord ordering) of ELT) N]) (DICOLOR.lightnessNvalue [LAMBDA (N) (* hdj "17-Apr-85 13:36") (fetch (lightnessRecord value) of (DICOLOR.lightnessN N]) (DICOLOR.lightnessNname [LAMBDA (N) (* hdj "17-Apr-85 14:02") (fetch (lightnessRecord name) of (DICOLOR.lightnessN N]) (DICOLOR.saturationN [LAMBDA (N) (* hdj "17-Apr-85 13:39") (DECLARE (GLOBALVARS DICOLOR.saturationMapping)) (for ELT in DICOLOR.saturationMapping suchthat (EQ (fetch (saturationRecord ordering) of ELT) N]) (DICOLOR.saturationNvalue [LAMBDA (N) (* hdj "17-Apr-85 13:36") (fetch (saturationRecord value) of (DICOLOR.saturationN N]) (DICOLOR.saturationNname [LAMBDA (N) (* hdj "17-Apr-85 14:02") (fetch (saturationRecord name) of (DICOLOR.saturationN N]) ) (DECLARE: DONTCOPY [DECLARE: EVAL@COMPILE (RECORD hueRecord (name value ordering)) (RECORD lightnessRecord (name value ordering)) (RECORD saturationRecord (name value ordering)) ] (RPAQQ DICOLOR.hueConstants (DICOLOR.achromatic DICOLOR.blue DICOLOR.bluePurple DICOLOR.bluishGreen DICOLOR.bluishPurple DICOLOR.brown DICOLOR.brownYellow DICOLOR.brownishRed DICOLOR.brownishYellow DICOLOR.green DICOLOR.greenBlue DICOLOR.greenishBlue DICOLOR.greenishYellow DICOLOR.orange DICOLOR.orangeYellow DICOLOR.orangishRed DICOLOR.orangishYellow DICOLOR.purple DICOLOR.purpleRed DICOLOR.purplishBlue DICOLOR.purplishRed DICOLOR.red DICOLOR.redBrown DICOLOR.redOrange DICOLOR.reddishBrown DICOLOR.reddishOrange DICOLOR.reddishPurple DICOLOR.yellow DICOLOR.yellowGreen DICOLOR.yellowishBrown DICOLOR.yellowishGreen DICOLOR.yellowishOrange)) (DECLARE: EVAL@COMPILE (RPAQQ DICOLOR.achromatic -1) (RPAQQ DICOLOR.blue 16) (RPAQQ DICOLOR.bluePurple 18) (RPAQQ DICOLOR.bluishGreen 13) (RPAQQ DICOLOR.bluishPurple 19) (RPAQQ DICOLOR.brown 27) (RPAQQ DICOLOR.brownYellow 29) (RPAQQ DICOLOR.brownishRed 24) (RPAQQ DICOLOR.brownishYellow 30) (RPAQQ DICOLOR.green 12) (RPAQQ DICOLOR.greenBlue 14) (RPAQQ DICOLOR.greenishBlue 15) (RPAQQ DICOLOR.greenishYellow 9) (RPAQQ DICOLOR.orange 4) (RPAQQ DICOLOR.orangeYellow 6) (RPAQQ DICOLOR.orangishRed 1) (RPAQQ DICOLOR.orangishYellow 7) (RPAQQ DICOLOR.purple 20) (RPAQQ DICOLOR.purpleRed 22) (RPAQQ DICOLOR.purplishBlue 17) (RPAQQ DICOLOR.purplishRed 23) (RPAQQ DICOLOR.red 0) (RPAQQ DICOLOR.redBrown 25) (RPAQQ DICOLOR.redOrange 2) (RPAQQ DICOLOR.reddishBrown 26) (RPAQQ DICOLOR.reddishOrange 3) (RPAQQ DICOLOR.reddishPurple 21) (RPAQQ DICOLOR.yellow 8) (RPAQQ DICOLOR.yellowGreen 10) (RPAQQ DICOLOR.yellowishBrown 28) (RPAQQ DICOLOR.yellowishGreen 11) (RPAQQ DICOLOR.yellowishOrange 5) (CONSTANTS DICOLOR.achromatic DICOLOR.blue DICOLOR.bluePurple DICOLOR.bluishGreen DICOLOR.bluishPurple DICOLOR.brown DICOLOR.brownYellow DICOLOR.brownishRed DICOLOR.brownishYellow DICOLOR.green DICOLOR.greenBlue DICOLOR.greenishBlue DICOLOR.greenishYellow DICOLOR.orange DICOLOR.orangeYellow DICOLOR.orangishRed DICOLOR.orangishYellow DICOLOR.purple DICOLOR.purpleRed DICOLOR.purplishBlue DICOLOR.purplishRed DICOLOR.red DICOLOR.redBrown DICOLOR.redOrange DICOLOR.reddishBrown DICOLOR.reddishOrange DICOLOR.reddishPurple DICOLOR.yellow DICOLOR.yellowGreen DICOLOR.yellowishBrown DICOLOR.yellowishGreen DICOLOR.yellowishOrange) ) (RPAQQ DICOLOR.saturationConstants (DICOLOR.noSaturation DICOLOR.grayish DICOLOR.moderate DICOLOR.strong DICOLOR.vivid)) (DECLARE: EVAL@COMPILE (RPAQQ DICOLOR.noSaturation 0) (RPAQQ DICOLOR.grayish 1) (RPAQQ DICOLOR.moderate 2) (RPAQQ DICOLOR.strong 3) (RPAQQ DICOLOR.vivid 4) (CONSTANTS DICOLOR.noSaturation DICOLOR.grayish DICOLOR.moderate DICOLOR.strong DICOLOR.vivid) ) (RPAQQ DICOLOR.lightnessConstants (DICOLOR.black DICOLOR.veryDark DICOLOR.dark DICOLOR.medium DICOLOR.light DICOLOR.veryLight DICOLOR.white)) (DECLARE: EVAL@COMPILE (RPAQQ DICOLOR.black 0) (RPAQQ DICOLOR.veryDark 1) (RPAQQ DICOLOR.dark 2) (RPAQQ DICOLOR.medium 3) (RPAQQ DICOLOR.light 4) (RPAQQ DICOLOR.veryLight 5) (RPAQQ DICOLOR.white 6) (CONSTANTS DICOLOR.black DICOLOR.veryDark DICOLOR.dark DICOLOR.medium DICOLOR.light DICOLOR.veryLight DICOLOR.white) ) ) (PUTPROPS DICOLOR COPYRIGHT ("Xerox Corporation" 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL (1005 8438 (CNSMENUINIT 1015 . 1502) (CNSTOCSL 1504 . 2550) (CNSTORGB 2552 . 2782) ( CSLTOCNS 2784 . 3683) (DICOLOR.FROM.USER 3685 . 5118) (GETCNS 5120 . 5322) (HLSTOCSL 5324 . 7615) ( CSLTOHLS 7617 . 8217) (RGBTOCNS 8219 . 8436)) (9938 12002 (DICOLOR.hueN 9948 . 10228) ( DICOLOR.hueNvalue 10230 . 10405) (DICOLOR.hueNname 10407 . 10580) (DICOLOR.lightnessN 10582 . 10892) ( DICOLOR.lightnessNvalue 10894 . 11087) (DICOLOR.lightnessNname 11089 . 11280) (DICOLOR.saturationN 11282 . 11606) (DICOLOR.saturationNvalue 11608 . 11804) (DICOLOR.saturationNname 11806 . 12000))))) STOP \ No newline at end of file diff --git a/lispusers/DICT-WINDOW-TYPES b/lispusers/DICT-WINDOW-TYPES new file mode 100644 index 00000000..669f63e1 --- /dev/null +++ b/lispusers/DICT-WINDOW-TYPES @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL-USER") (IL:FILECREATED " 6-Oct-88 12:43:10" IL:{ERINYES}MEDLEY>DICT-WINDOW-TYPES.\;3 4434 IL:|changes| IL:|to:| (IL:FUNCTIONS DICT-WINDOW-RECONSTITUTER SEARCH-MENU-RECONSTITUTER DICT-WINDOW-ABSTRACTER SEARCH-MENU-ABSTRACTER SEARCH-MENU-P DICT-WINDOW-P) (IL:WINDOW-TYPES :DICT-WINDOW :SEARCH-MENU) (IL:VARS IL:DICT-WINDOW-TYPESCOMS) (IL:FNS SEARCH-MENU-P) (FILE-ENVIRONMENTS IL:DICT-WINDOW-TYPES) IL:|previous| IL:|date:| " 6-Oct-88 12:18:11" IL:{ERINYES}MEDLEY>DICT-WINDOW-TYPES.\;2 ) ; Copyright (c) 1988 by Xerox Corporation. All rights reserved. (IL:PRETTYCOMPRINT IL:DICT-WINDOW-TYPESCOMS) (IL:RPAQQ IL:DICT-WINDOW-TYPESCOMS ((FILE-ENVIRONMENTS IL:DICT-WINDOW-TYPES) (IL:WINDOW-TYPES :DICT-WINDOW :SEARCH-MENU) (IL:FUNCTIONS DICT-WINDOW-P DICT-WINDOW-ABSTRACTER DICT-WINDOW-RECONSTITUTER) (IL:FUNCTIONS SEARCH-MENU-P SEARCH-MENU-ABSTRACTER SEARCH-MENU-RECONSTITUTER))) (DEFINE-FILE-ENVIRONMENT IL:DICT-WINDOW-TYPES :COMPILER :COMPILE-FILE :READTABLE "XCL" :PACKAGE "XCL-USER") (ROOMS:DEF-WINDOW-TYPE :DICT-WINDOW :DEPENDENCIES (:TEDIT :TEXTSTREAM) :RECOGNIZER DICT-WINDOW-P :ABSTRACTER DICT-WINDOW-ABSTRACTER :RECONSTITUTER DICT-WINDOW-RECONSTITUTER :TITLE "Definitions" :FILES (IL:DICTTOOL IL:DICT-WINDOW-TYPES)) (ROOMS:DEF-WINDOW-TYPE :SEARCH-MENU :RECOGNIZER SEARCH-MENU-P :ABSTRACTER SEARCH-MENU-ABSTRACTER :RECONSTITUTER SEARCH-MENU-RECONSTITUTER :TITLE "Search Menu" :FILES (IL:SEARCHMENU IL:DICT-WINDOW-TYPES)) (DEFUN DICT-WINDOW-P (WINDOW) (DECLARE (GLOBAL IL:|Dict.DefWindow|)) (EQ WINDOW IL:|Dict.DefWindow|)) (DEFUN DICT-WINDOW-ABSTRACTER (W) (LET (NERD DICT) (DECLARE (GLOBAL IL:|Dict.OutputStream|)) (SETQ NERD (OR (IL:STREAMPROP (IL:TEXTSTREAM W) 'IL:|nerd|) (IL:STREAMPROP (IL:|Dict.OutputStream|) 'IL:|nerd|))) (SETQ DICT (OR (IL:STREAMPROP (IL:TEXTSTREAM W) 'IL:|dict|) (IL:STREAMPROP (IL:|Dict.OutputStream|) 'IL:|dict|))) (LIST :DICT (AND DICT (IL:|Dict.Name| DICT)) :NERD (AND NERD (IL:|InvertedDict.Name| NERD))))) (DEFUN DICT-WINDOW-RECONSTITUTER (DATA) (DECLARE (GLOBAL IL:|Dict.DefWindow|)) (LET (DICTSTREAM DICTNAME DICT NERDNAME NERD) (SETQ DICTSTREAM (IL:|Dict.OutputStream| (IL:CREATEREGION 0 0 100 100))) (COND ((SETQ DICTNAME (GETF DATA :DICT)) (COND ((SETQ DICT (IL:|DictFromName| DICTNAME)) (IL:STREAMPROP DICTSTREAM 'IL:|dict| DICT))))) (COND ((SETQ NERDNAME (GETF DATA :NERD)) (COND ((SETQ NERD (IL:|InvertedDictFromName| NERDNAME)) (IL:STREAMPROP DICTSTREAM 'IL:|nerd| NERD))))) IL:|Dict.DefWindow|)) (DEFUN SEARCH-MENU-P (W) (EQUAL "Search Menu" (IL:WINDOWPROP W 'IL:TITLE))) (DEFUN SEARCH-MENU-ABSTRACTER (W) (LET (NERD) (DECLARE (GLOBAL IL:|SearchMenu.Stream|)) (SETQ NERD (AND (STREAMP IL:|SearchMenu.Stream|) (IL:STREAMPROP IL:|SearchMenu.Stream| 'IL:|nerd|))) (LIST :NERD (AND NERD (IL:|InvertedDict.Name| NERD))))) (DEFUN SEARCH-MENU-RECONSTITUTER (DATA) (LET (NERDNAME NERD) (DECLARE (GLOBAL IL:|SearchMenu| IL:|SearchMenu.Stream|)) (IL:|SearchMenu.Create|) (COND ((NULL IL:|SearchMenu.Stream|) (SETQ IL:|SearchMenu.Stream| (IL:OPENTEXTSTREAM)))) (COND ((SETQ NERDNAME (GETF DATA :NERD)) (COND ((SETQ NERD (IL:|InvertedDictFromName| NERDNAME)) (IL:STREAMPROP IL:|SearchMenu.Stream| 'IL:|nerd| NERD))))) IL:|SearchMenu|)) (IL:PUTPROPS IL:DICT-WINDOW-TYPES IL:COPYRIGHT ("Xerox Corporation" 1988)) (IL:DECLARE\: IL:DONTCOPY (IL:FILEMAP (NIL))) IL:STOP \ No newline at end of file diff --git a/lispusers/DICTTOOL b/lispusers/DICTTOOL new file mode 100644 index 00000000..6cfcc445 --- /dev/null +++ b/lispusers/DICTTOOL @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "31-May-89 15:07:29" {ERINYES}MEDLEY>DICTTOOL.;14 91631 changes to%: (FNS Dict.AddCommands) (VARS DICTTOOLCOMS) previous date%: "28-Feb-89 10:54:26" {ERINYES}MEDLEY>DICTTOOL.;13) (* " Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DICTTOOLCOMS) (RPAQQ DICTTOOLCOMS ((COMS * DICTTOOLDEPENDENCIES) (FILES ANALYZER (FROM {PIGLET/N}DICTSERVER>LISP>) DICTCLIENT) (* ;; "1/6/89 jtm: fixed TEdit.PrintDefinition so that SimpleDicts would print their entries in the definition window.") (* ;; "1/6/89 jtm: changed TEdit.SetDictionary and DictForStream so that TEdit.DefaultDictionary reflects the default dictionary to use if no other is specified.") (* ;; "2/28/89 jtm: changed FILES so that DICTCLIENT is loaded from PIGLET.") (* ;;  "5/31/89 jtm: changed Dict.AddCommands to put Dictionary menu item on Lafite display windows.") (FNS TEDIT.INCLUDESTREAM TEdit.PrintDefinition DictTool.PrintDefinition Dict.PrintDefinition DictTool.GetEntry TEdit.SetDictionary DictForStream DictTool.Dictionaries PARSEBYCOLONS PrintPronunciationGuide ConvertPronunciation) (FNS TEdit.PrintSearch DictTool.PrintSearch DictTool.MergeSearch NerdForStream TEdit.SetNerd DictTool.PromptForCutoff DictTool.PromptForKeywordCutoff PARSESELECTION) (FNS TEdit.PrintPhraseSearch DictTool.PrintPhraseSearch) (FNS TEdit.PrintSynonyms REMOVEALL CONVERTFUNCTIONSTOFORMS TEdit.PrintNounSynonyms DictTool.PrintNounSynonyms DictTool.PrintVerbSynonyms DictTool.PrintAdjSynonyms TEdit.PrintVerbSynonyms TEdit.PrintAdjSynonyms DictTool.PrintSynonyms) (FNS DictTool.TEditWrapper Dict.OutputStream DictTool.PromptStream) (FNS DictTool.Init DictTool.Open DictTool.OpenDictionary DictTool.OpenAnalyzer DictTool.OpenNerd Dict.AddCommands DictTool.Close) (FNS DictTool.Analyze DictTool.Analyzers DictTool.Pronunciation DictTool.Corrections DictTool.CountWords) (COMS (* * FINDWORD & SUBSTITUTEWORD) (FNS DictTool.FindWord DictTool.SubstituteWord DictTool.CreateConjugationMap DictTool.FindWordInit) (FNS LingFns.FindWord LingFns.Capitalize LingFns.Capitalization) (P (DictTool.FindWordInit))) (INITVARS DictTool.TimeOperation Dict.DefWindow Dict.CommandsAdded InvertedDict.List DictTool.LastSearch DictTool.LastWord TEdit.DefaultDictionary (DictTool.MinKeywords 2) (DictTool.MaxWords 100)) (GLOBALVARS DictTool.TimeOperation Dict.DefWindow Dict.CommandsAdded InvertedDict.List DictTool.MinKeywords DictTool.MaxWords DictTool.LastSearch DictTool.LastWord TEdit.DefaultDictionary) (P (DictTool.Init)) (VARS PronunciationGuide PronunciationMap))) (RPAQQ DICTTOOLDEPENDENCIES [(* * code to make sure that the right versions of everything are loaded. The P must be executed before any FILES commands.) [E (PUTPROP 'DICTTOOL 'DEPENDENCIES (for FILE in (FILECOMSLST 'DICTTOOL 'FILES) collect (CONS FILE (CAAR (GETPROP FILE 'FILEDATES] (PROP DEPENDENCIES DICTTOOL) (P (for FILE FILEDATE in (GETPROP 'DICTTOOL 'DEPENDENCIES) do [SETQ FILEDATE (CAAR (GETPROP (CAR FILE) 'FILEDATES] (COND ([AND FILEDATE (CDR FILE) (ILESSP (IDATE FILEDATE) (IDATE (CDR FILE] (* clear FILEDATES to force FILESLOAD to reload the file.) (printout T "Flushing old version of " (CAR FILE) T) (PUTPROP (CAR FILE) 'FILEDATES NIL]) (* * code to make sure that the right versions of everything are loaded. The P must be executed before any FILES commands.) (PUTPROPS DICTTOOL DEPENDENCIES ((ANALYZER . " 9-Mar-89 15:24:58") (DICTCLIENT . " 8-Oct-87 15:15:08"))) [for FILE FILEDATE in (GETPROP 'DICTTOOL 'DEPENDENCIES) do [SETQ FILEDATE (CAAR (GETPROP (CAR FILE) 'FILEDATES] (COND ([AND FILEDATE (CDR FILE) (ILESSP (IDATE FILEDATE) (IDATE (CDR FILE] (* clear FILEDATES to force  FILESLOAD to reload the file.) (printout T "Flushing old version of " (CAR FILE) T) (PUTPROP (CAR FILE) 'FILEDATES NIL] (FILESLOAD ANALYZER (FROM {PIGLET/N}DICTSERVER>LISP>) DICTCLIENT) (* ;; "1/6/89 jtm: fixed TEdit.PrintDefinition so that SimpleDicts would print their entries in the definition window." ) (* ;; "1/6/89 jtm: changed TEdit.SetDictionary and DictForStream so that TEdit.DefaultDictionary reflects the default dictionary to use if no other is specified." ) (* ;; "2/28/89 jtm: changed FILES so that DICTCLIENT is loaded from PIGLET.") (* ;; "5/31/89 jtm: changed Dict.AddCommands to put Dictionary menu item on Lafite display windows." ) (DEFINEQ (TEDIT.INCLUDESTREAM [LAMBDA (TEXTSTREAM INCLUDEDSTREAM) (* jtm%: "28-Oct-87 14:41") (LET (STARTPOS) (SETQ STARTPOS (ADD1 (GETEOFPTR TEXTSTREAM))) (TEDIT.COPY (TEDIT.SETSEL INCLUDEDSTREAM 1 (GETEOFPTR INCLUDEDSTREAM) 'LEFT) (TEDIT.SETSEL TEXTSTREAM STARTPOS 0 'LEFT)) (TEDIT.SETSEL TEXTSTREAM STARTPOS 0 'LEFT) (TEDIT.NORMALIZECARET TEXTSTREAM) (TEDIT.STREAMCHANGEDP TEXTSTREAM T]) (TEdit.PrintDefinition [LAMBDA (stream dict words) (* ; "Edited 6-Jan-89 11:46 by jtm:") (* * prints out the definition of the currently selected text.) (OR stream (SETQ stream (Dict.OutputStream))) (DictTool.TEditWrapper (OR dict (DictForStream stream)) [FUNCTION (LAMBDA (dict selection stream) (LET (printFn entry) (for word exists in (PARSEBYCOLONS selection) do [COND ((AND (SETQ printFn (fetch (Dict printEntryFn) of dict)) (NEQ printFn 'NILL)) (SETQ exists (OR (APPLY* printFn dict word stream) exists))) ((SETQ printFn (fetch (Dict getEntryFn) of dict)) (SETQ entry (APPLY* printFn dict word NIL)) [for def (left _ (LENGTH entry)) inside entry first (TEDIT.INSERT stream (CONCAT word ": ")) do [COND ((STREAMP def) (SETQ def (STREAM.FETCHSTRING def 0 (GETEOFPTR def] (TEDIT.INSERT stream def) (add left -1) (COND ((IGEQ left 1) (TEDIT.INSERT stream ", ")) (T (TEDIT.INSERT stream " "] (SETQ exists (OR entry exists] finally (RETURN exists] stream words "word to look up:" "Getting definition for"]) (DictTool.PrintDefinition [LAMBDA (dict words stream) (* jtm%: "17-Nov-87 11:02") (PROG (def looks found pos (offset 0)) [for word inside (PARSEBYCOLONS words) do (SETQ def (Dict.GetEntry dict word)) (SETQ looks (Dict.Prop dict 'Looks)) (COND ((AND (NULL looks) (Dict.Prop dict 'RemoteDict)) [SETQ looks (DICTCLIENT.GETLOOKS (Dict.Prop dict 'RemoteDict] (Dict.Prop dict 'Looks looks))) (COND [(STRINGP def) (SETQ found T) (TEDIT.INSERT stream def) (for I from 1 to 2 when (NEQ 13 (NTHCHARCODE def (IMINUS I))) do (TEDIT.INSERT stream (CHARACTER 13] ([AND (STRINGP (CAR def)) (NOT (STREQUAL "" (CAR def] (SETQ found T) (TEDIT.INSERT stream (CAR def) NIL (CDAR looks)) (for I from 1 to 2 when (NEQ 13 (NTHCHARCODE def (IMINUS I))) do (TEDIT.INSERT stream (CHARACTER 13))) (* assumes that the first look given  is the default for the dictionary.) (SETQ pos (TEDIT.GETPOINT stream)) (* setting looks moves the selection) (for i in (CDR def) do (TEDIT.LOOKS stream (CDR (FASSOC (CADDR i) looks)) (IPLUS (CAR i) offset) (CADR i))) (SETQ offset (SUB1 pos)) (TEDIT.SETSEL stream pos 0 'LEFT)) (NIL (TEDIT.INSERT stream (CONCAT word ": not found.")) (TEDIT.LOOKS stream '(FAMILY HELVETICA SIZE 10 FACE BOLD) 1 (ADD1 (NCHARS word))) (TEDIT.LOOKS stream '(FAMILY TIMESROMAN SIZE 10 FACE STANDARD) (IPLUS 2 (NCHARS word)) 11] (RETURN found]) (Dict.PrintDefinition [LAMBDA (dict word stream) (* jtm%: "13-Oct-87 10:27") (PROG (scratch start) [COND ((NULL stream) (SETQ stream (Dict.OutputStream] [SETQ scratch (OPENTEXTSTREAM NIL NIL NIL NIL '(LEAVETTY] (COND ((Dict.PrintEntry dict word scratch) (TEDIT.INSERT scratch (CONCAT (CHARACTER 13) (CHARACTER 13)) (ADD1 (GETEOFPTR scratch))) (SETQ start (ADD1 (GETEOFPTR stream))) (TEDIT.COPY (TEDIT.SETSEL scratch 1 (GETEOFPTR scratch) 'LEFT) (TEDIT.SETSEL stream start 0 'LEFT)) (CLOSEF scratch) (TEDIT.SETSEL stream start 0 'RIGHT) (TEDIT.NORMALIZECARET stream) (TEDIT.STREAMCHANGEDP stream T) (RETURN T]) (DictTool.GetEntry [LAMBDA (dict uniqueID prop) (* jtm%: " 7-Apr-87 08:39") (COND [(NUMBERP uniqueID) (DICTCLIENT.ENUMERATE uniqueID (Dict.Prop dict 'RemoteDict] (T (DICTCLIENT.GETDEFINITION uniqueID (Dict.Prop dict 'RemoteDict]) (TEdit.SetDictionary [LAMBDA (stream dict) (* ; "Edited 6-Jan-89 12:24 by jtm:") (* * sets the dictionary property for the window) (PROG (menuItems) (OR stream (SETQ stream (Dict.OutputStream))) [COND ((NULL dict) [SETQ menuItems (for i in Dict.DictionaryList collect (LIST (Dict.Name i) (LIST 'QUOTE i) (if (Dict.Prop i 'RemoteDict) then "Calls the remote dictionary server"] [COND ((NULL menuItems) (TEDIT.PROMPTPRINT stream "Sorry, no dictionaries loaded." T)) ((EQ 1 (LENGTH menuItems)) (SETQ dict (CAR Dict.DictionaryList))) (T (SETQ dict (MENU (create MENU ITEMS _ menuItems TITLE _ "dictionaries" CENTERFLG _ T] (COND ((NULL dict) (SETQ dict (STREAMPROP stream 'dict)) (TEDIT.PROMPTPRINT stream (CONCAT "Dictionary is " (AND dict (Dict.Name dict)) ".") T) (RETURN] (TEDIT.PROMPTPRINT stream (CONCAT "Setting dictionary to " (AND dict (Dict.Name dict)) "...") T) (Dict.Open dict) (STREAMPROP stream 'dict dict) (* ;; "1/6/89 jtm: set TEdit.DefaultDictionary if this is the dictionary window or if it hasn't already been set.") (if [OR (NULL TEdit.DefaultDictionary) (AND (WINDOWP Dict.DefWindow) (EQ stream (WINDOWPROP Dict.DefWindow 'TEXTSTREAM] then (SETQ TEdit.DefaultDictionary dict)) (TEDIT.PROMPTPRINT stream "done.")) dict]) (DictForStream [LAMBDA (stream) (* ; "Edited 6-Jan-89 12:26 by jtm:") (* ;; "1/6/89 jtm: Try TEdit.DefaultDictionary if the stream doesn't have it's own dictionary.") (COND ((STREAMPROP stream 'dict)) (TEdit.DefaultDictionary) (T (TEdit.SetDictionary (Dict.OutputStream]) (DictTool.Dictionaries [LAMBDA (dict errorStream) (* jtm%: "13-Nov-86 10:57") (DICTCLIENT.DICTIONARIES]) (PARSEBYCOLONS [LAMBDA (STRING COLONSORSPACES) (* ; "Edited 11-Jan-89 13:55 by jtm:") (* * Actually, parse by SEMI-colons.) (LET (WORDS SEPARATOR (OLDPOS 1) (POS 0)) (COND ((STRINGP STRING) (SETQ SEPARATOR (COND ([AND COLONSORSPACES (NULL (STRPOS ";" STRING (ADD1 POS] " ") (T ";"))) [while (SETQ POS (STRPOS SEPARATOR STRING (ADD1 POS))) do (push WORDS (SUBSTRING STRING OLDPOS (SUB1 POS))) (SETQ OLDPOS (for I from (ADD1 POS) thereis (NEQ 32 (NTHCHARCODE STRING I] [COND ((AND (NEQ OLDPOS 0) (ILEQ OLDPOS (NCHARS STRING))) (push WORDS (SUBSTRING STRING OLDPOS (NCHARS STRING] (OR (DREVERSE WORDS) STRING)) (T STRING]) (PrintPronunciationGuide [LAMBDA (stream) (* jtm%: " 9-Feb-87 08:40") (LET (startPos) (SETQ startPos (GETFILEPTR stream)) [for i pronCode on PronunciationGuide do (SETQ pronCode (CAR i)) (TEDIT.INSERT stream (CONCAT (ConvertPronunciation (CAR pronCode)) ": " (CADR pronCode) " " (ConvertPronunciation (CADDR pronCode)) (COND ((CDR i) "; ") (T ""] (TEDIT.LOOKS stream '(FAMILY CLASSIC SIZE 10 FACE STANDARD) (ADD1 startPos) (IDIFFERENCE (GETFILEPTR stream) startPos]) (ConvertPronunciation [LAMBDA (string) (* jtm%: " 6-Feb-87 17:38") (CONCATLIST (for i char nschars from 1 to (NCHARS string) join (SETQ char (NTHCHAR string i)) (SETQ nschars (CDR (FASSOC char PronunciationMap))) (COND ((NULL nschars) (LIST char)) ((LISTP nschars) (COPY nschars)) (T (LIST nschars]) ) (DEFINEQ (TEdit.PrintSearch [LAMBDA (stream dict words) (* jtm%: "13-Oct-87 10:11") (* * prints out the definition of the currently selected text.) (OR stream (SETQ stream (Dict.OutputStream))) (DictTool.TEditWrapper (OR dict (NerdForStream stream)) 'DictTool.PrintSearch stream words "Type keywords to search on:" "Searching for words using" 'SEARCHKEYS]) (DictTool.PrintSearch [LAMBDA (dict selection stream) (* jtm%: " 7-Apr-87 09:52") (LET (looks venn) (SETQ venn (DictTool.MergeSearch dict selection)) [for i pos in venn do (* printout header) (SETQ pos (TEDIT.GETPOINT stream)) [for header on (CAR i) do (TEDIT.INSERT stream (CONCAT (CAR header) (COND ((CDR header) " ") (T ": "] (push looks (CONS pos (IDIFFERENCE (TEDIT.GETPOINT stream) pos))) [for word on (CADR i) do (TEDIT.INSERT stream (CONCAT (CAR word) (COND ((CDR word) "; ") (T ""] (TEDIT.INSERT stream (CHARACTER (CHARCODE CR))) (TEDIT.INSERT stream (CHARACTER (CHARCODE CR] (* do the looks last to avoid messing  up the text placement.) (TEDIT.LOOKS stream '(FAMILY TIMESROMAN SIZE 10 FACE STANDARD) 1 (TEDIT.GETPOINT stream)) (for look in looks do (TEDIT.LOOKS stream '(FAMILY HELVETICA SIZE 10 FACE BOLD) (CAR look) (CDR look))) venn]) (DictTool.MergeSearch [LAMBDA (dict synonymclasses minKeywords minWord maxWord) (* jtm%: " 2-Aug-88 13:15") (LET (minWord maxWord VennSearchFn) [for i on synonymclasses do (COND ((NLISTP (CAR i)) (RPLACA i (LIST (CAR i] [COND ((AND (NULL minWord) (NULL maxWord)) (COND ((AND (EQUAL synonymclasses DictTool.LastSearch) (NEQ 0 DictTool.MaxWords)) (COND ((NULL DictTool.LastWord) (SETQ DictTool.LastWord 0))) (SETQ minWord (ADD1 DictTool.LastWord)) [SETQ maxWord (COND ((EQ 0 DictTool.MaxWords) 0) (T (IPLUS DictTool.MaxWords DictTool.LastWord] (SETQ DictTool.LastWord maxWord)) (T (SETQ minWord 0) (SETQ maxWord DictTool.MaxWords) (SETQ DictTool.LastSearch synonymclasses) (SETQ DictTool.LastWord maxWord] (COND [(InvertedDict.Prop dict 'RemoteDict) (DICTCLIENT.SEARCHFORWORD synonymclasses DictTool.MinKeywords (OR minWord 0) (OR maxWord DictTool.MaxWords) (InvertedDict.Prop dict 'RemoteDict] ((SETQ VennSearchFn (InvertedDict.Prop dict 'VENNSEARCHFN)) (APPLY* VennSearchFn dict synonymclasses DictTool.MinKeywords (OR minWord 0) (OR maxWord DictTool.MaxWords))) (T (InvertedDict.MergeSearch dict synonymclasses DictTool.MinKeywords (OR minWord 0) (OR maxWord DictTool.MaxWords]) (NerdForStream [LAMBDA (stream) (* jtm%: "17-Nov-87 11:14") (* * comment) (COND ((STREAMPROP stream 'nerd)) ((STREAMPROP (Dict.OutputStream) 'nerd)) (T (TEdit.SetNerd (Dict.OutputStream]) (TEdit.SetNerd [LAMBDA (stream nerd) (* jtm%: "14-Oct-87 12:50") (* * sets the dictionary property for the window) (PROG (menuItems) (OR stream (SETQ stream (Dict.OutputStream))) [COND ((NULL nerd) [SETQ menuItems (for i in InvertedDict.List collect (LIST (InvertedDict.Name i) (LIST 'QUOTE i) (if (InvertedDict.Prop i 'RemoteDict) then "Calls the remote dictionary server"] [COND ((NULL menuItems)) ((EQ 1 (LENGTH menuItems)) (SETQ nerd (CAR InvertedDict.List))) (T (SETQ nerd (MENU (create MENU ITEMS _ menuItems TITLE _ "databases" CENTERFLG _ T] (COND ((NULL nerd) (SETQ nerd (STREAMPROP stream 'nerd)) (TEDIT.PROMPTPRINT stream (CONCAT "Database is " (AND nerd (InvertedDict.Name nerd)) ".") T) (RETURN] (TEDIT.PROMPTPRINT stream (CONCAT "Setting database to " (AND nerd (InvertedDict.Name nerd)) "...") T) (InvertedDict.Open nerd) (STREAMPROP stream 'nerd nerd) (TEDIT.PROMPTPRINT stream "done.") (SETQ DictTool.LastSearch NIL) (* so that you can do the same search  on a different data base.) ) nerd]) (DictTool.PromptForCutoff [LAMBDA (STREAM) (* jtm%: " 2-Feb-87 11:33") (OR STREAM (SETQ STREAM (Dict.OutputStream))) (TEDIT.PROMPTPRINT STREAM (CONCAT "Current maximum = " DictTool.MaxWords ".") T) (SETQ DictTool.MaxWords (RNUMBER "Enter the maximum number of words that each combination of keywords may return. (0 = no limit)" )) (TEDIT.PROMPTPRINT STREAM (CONCAT "New maximum = " DictTool.MaxWords ".") T]) (DictTool.PromptForKeywordCutoff [LAMBDA (STREAM) (* jtm%: " 2-Feb-87 11:33") (OR STREAM (SETQ STREAM (Dict.OutputStream))) (TEDIT.PROMPTPRINT STREAM (CONCAT "Current minimum = " DictTool.MinKeywords ".") T) (SETQ DictTool.MinKeywords (RNUMBER "Enter the minimum number of keywords that a word must have to be accepted. e.g. 2 = at least two keywords, 0 = all of the keywords given, -2 = all but two of the keywords given, etc." )) (TEDIT.PROMPTPRINT STREAM (CONCAT "New minimum = " DictTool.MinKeywords ".") T]) (PARSESELECTION [LAMBDA (selection) (* jtm%: "20-Mar-87 14:39") (LET (words temp) [for i charcode startPos alpha priorAlpha word from 1 to (ADD1 (NCHARS selection)) do (SETQ charcode (NTHCHARCODE selection i)) (SETQ priorAlpha alpha) [SETQ alpha (AND charcode (OR (ALPHACHARP charcode) (EQ charcode (CHARCODE -] [COND ((AND alpha (NULL priorAlpha)) (SETQ startPos i)) ((AND priorAlpha (NULL alpha)) (SETQ word (SUBSTRING selection startPos (SUB1 i))) (COND ((NULL temp) (push temp word)) (T (NCONC1 temp word] (COND ((EQ charcode (CHARCODE %()) (SETQ words (APPEND words temp)) (SETQ temp NIL)) ((EQ charcode (CHARCODE %))) (SETQ words (APPEND words (LIST temp))) (SETQ temp NIL] (SETQ words (APPEND words temp)) words]) ) (DEFINEQ (TEdit.PrintPhraseSearch [LAMBDA (stream dict words) (* jtm%: "26-May-87 09:26") (* * prints out the definitions that have a particular phrase in them.) (OR stream (SETQ stream (Dict.OutputStream))) (DictTool.TEditWrapper (NerdForStream stream) 'DictTool.PrintPhraseSearch stream words "Type phrase to search for:" "Searching for phrase using" 'SEARCHPHRASE]) (DictTool.PrintPhraseSearch [LAMBDA (dict selection stream) (* jtm%: "26-May-87 09:29") (LET (looks words fn pos) [SETQ words (COND [(InvertedDict.Prop dict 'RemoteDict) (DICTCLIENT.SEARCHFORPHRASE selection (InvertedDict.Prop dict 'RemoteDict] ((SETQ fn (InvertedDict.Prop dict 'SEARCHFORPHRASEFN)) (APPLY* fn dict selection] (SETQ pos (TEDIT.GETPOINT stream)) (TEDIT.INSERT stream (CONCAT "%"" selection "%": ")) (SETQ looks (CONS pos (IDIFFERENCE (TEDIT.GETPOINT stream) pos))) [for word on words do (TEDIT.INSERT stream (CONCAT (CAR word) (COND ((CDR word) "; ") (T ""] (TEDIT.INSERT stream (CHARACTER (CHARCODE CR))) (TEDIT.INSERT stream (CHARACTER (CHARCODE CR))) (* do the looks last to avoid messing  up the text placement.) (TEDIT.LOOKS stream '(FAMILY TIMESROMAN SIZE 10 FACE STANDARD) 1 (TEDIT.GETPOINT stream)) (TEDIT.LOOKS stream '(FAMILY HELVETICA SIZE 10 FACE BOLD) (CAR looks) (CDR looks)) words]) ) (DEFINEQ (TEdit.PrintSynonyms [LAMBDA (stream dict words) (* jtm%: "14-Oct-87 12:44") (* * prints out the synonyms of the selected word) (DictTool.TEditWrapper T 'DictTool.PrintSynonyms stream words "synonym to look up:" "Getting synonyms for" 'USERSYNONYM]) (REMOVEALL [LAMBDA (X L) (* jtm%: "14-Oct-87 12:39") (for TAIL on X unless (EQUAL L (CAR TAIL)) collect (COND ((LISTP (CAR TAIL)) (REMOVEALL (CAR TAIL) L)) (T (COPY (CAR TAIL]) (CONVERTFUNCTIONSTOFORMS [LAMBDA (LIST) (* jtm%: "14-Oct-87 12:57") (for ELT in LIST collect (COND [(EQ (CAR ELT) 'FUNCTION) (LIST 'QUOTE (LIST (CADR ELT] ((LISTP ELT) (CONVERTFUNCTIONSTOFORMS ELT)) (T (COPY ELT]) (TEdit.PrintNounSynonyms [LAMBDA (stream dict words) (* jtm%: "14-Oct-87 12:43") (* * prints out the synonyms of the selected word) (DictTool.TEditWrapper T (FUNCTION DictTool.PrintNounSynonyms) stream words "synonym to look up:" "Getting noun synonyms for" 'USERSYNONYM]) (DictTool.PrintNounSynonyms [LAMBDA (dict words stream) (* jtm%: "14-Oct-87 12:32") (DictTool.PrintSynonyms dict words stream "n"]) (DictTool.PrintVerbSynonyms [LAMBDA (dict words stream) (* jtm%: "14-Oct-87 12:34") (DictTool.PrintSynonyms dict words stream "v"]) (DictTool.PrintAdjSynonyms [LAMBDA (dict words stream) (* jtm%: "14-Oct-87 12:35") (DictTool.PrintSynonyms dict words stream "adj"]) (TEdit.PrintVerbSynonyms [LAMBDA (stream dict words) (* jtm%: "14-Oct-87 12:44") (* * prints out the synonyms of the selected word) (DictTool.TEditWrapper T 'DictTool.PrintVerbSynonyms stream words "synonym to look up:" "Getting verb synonyms for" 'USERSYNONYM]) (TEdit.PrintAdjSynonyms [LAMBDA (stream dict words) (* jtm%: "14-Oct-87 12:44") (* * prints out the synonyms of the selected word) (DictTool.TEditWrapper T 'DictTool.PrintAdjSynonyms stream words "synonym to look up:" "Getting adjective synonyms for" 'USERSYNONYM]) (DictTool.PrintSynonyms [LAMBDA (dict words stream form) (* jtm%: "14-Oct-87 12:31") (PROG (synonyms found startPos headerPos endPos) (for word inside words do (SETQ synonyms (DICTCLIENT.SYNONYMS word)) (AND synonyms (SETQ found T)) (SETQ startPos (TEDIT.GETPOINT stream)) (TEDIT.INSERT stream (CONCAT word ": ")) (SETQ headerPos (TEDIT.GETPOINT stream)) [for class in synonyms when (OR (NULL form) (EQUAL form (CAR class))) do (TEDIT.INSERT stream (CONCAT (CAR class) ": ")) [for word on (CDR class) do (TEDIT.INSERT stream (CONCAT (CAR word) (COND ((CDR word) ", ") (T ""] (TEDIT.INSERT stream (CHARACTER (CHARCODE CR] (TEDIT.INSERT stream (CHARACTER (CHARCODE CR))) (SETQ endPos (TEDIT.GETPOINT stream)) (TEDIT.LOOKS stream '(FAMILY HELVETICA SIZE 10 FACE BOLD) startPos (IDIFFERENCE (SUB1 headerPos) startPos)) (TEDIT.LOOKS stream '(FAMILY TIMESROMAN SIZE 10 FACE STANDARD) headerPos (IDIFFERENCE endPos headerPos)) (TEDIT.SETSEL stream endPos 0 'LEFT)) (RETURN found]) ) (DEFINEQ (DictTool.TEditWrapper [LAMBDA (dict proc stream selection promptString waitString cachePropName) (* jtm%: "29-Jun-88 09:56") (* * handles the TEdit user interface) (PROG (scratchStream textStream startPos startTime textObj) (* * set things up) [COND ((NULL stream) (SETQ stream (Dict.OutputStream] [COND ((NULL dict) (TEDIT.PROMPTPRINT stream "Please select a dictionary." T) (RETURN)) ((NULL selection) (SETQ selection (TEDIT.SEL.AS.STRING stream)) (COND ((ILEQ (NCHARS selection) 1) (SETQ selection NIL))) (* * "rht 4/27/88: No longer passes value of PROMPTWINDOW textprop to MOUSECONFIRM since it could be DON'T. Now looks for promptwindow on the WINDOWPROP of the stream's main window.") (COND [(AND selection (MOUSECONFIRM (CONCAT "CONFIRM INPUT: " selection) "" (CAR (WINDOWPROP (CAR (fetch (TEXTOBJ \WINDOW) of (TEXTOBJ stream))) 'PROMPTWINDOW] ([NULL (SETQ selection (TEDIT.GETINPUT stream (OR promptString "input: ") (AND cachePropName (STREAMPROP stream cachePropName] (TEDIT.PROMPTPRINT stream " Aborted." T) (RETURN] (* * print the results.) (SETQ startTime (CLOCK 0)) (AND cachePropName (STREAMPROP stream cachePropName selection)) (TEDIT.PROMPTPRINT stream (CONCAT (OR waitString "processing") " '" selection "' . . . ") T) [RESETSAVE (OUTPUT (CAR (WINDOWPROP Dict.DefWindow 'PROMPTWINDOW] (* redirects errors to the  promptwindow) [SETQ scratchStream (OPENTEXTSTREAM NIL NIL NIL NIL '(LEAVETTY] (COND [(APPLY* proc dict selection scratchStream) (TEDIT.INCLUDESTREAM (Dict.OutputStream) scratchStream) (COND (DictTool.TimeOperation (TEDIT.PROMPTPRINT stream (CONCAT "Elapsed Time: " (QUOTIENT (DIFFERENCE (CLOCK 0) startTime) 1000.0) " seconds."))) (T (TEDIT.PROMPTPRINT stream "Done."] (T (TEDIT.PROMPTPRINT stream "not found.") (TEDIT.PROMPTFLASH stream))) (CLOSEF scratchStream]) (Dict.OutputStream [LAMBDA (REGION) (* ; "Edited 12-Oct-88 09:20 by rmk:") (* ; "Edited 7-Oct-88 12:01 by jtm:") (LET (TEXTSTREAM HIDDENFN UNHIDEFN) [COND ((AND Dict.DefWindow (NOT (OPENWP Dict.DefWindow)) (WINDOWPROP Dict.DefWindow 'TEXTSTREAM)) (* window is shrunk.) (OPENW Dict.DefWindow)) ((AND Dict.DefWindow (CL:FIND-PACKAGE "ROOMS") (SETQ HIDDENFN (CL:FIND-SYMBOL "WINDOW-HIDDEN?" "ROOMS")) (GETD HIDDENFN) (CL:FUNCALL HIDDENFN Dict.DefWindow)) (* the FIND-SYMBOL calls are used to avoid a break that happens when you access  the ROOMS package when it hasn't been loaded.) (SETQ UNHIDEFN (CL:FIND-SYMBOL "UN-HIDE-WINDOW" "ROOMS")) (CL:FUNCALL UNHIDEFN Dict.DefWindow)) ((OR (NULL Dict.DefWindow) (NOT (OPENWP Dict.DefWindow))) (SETQ Dict.DefWindow (CREATEW [OR REGION (AND Dict.DefWindow (WINDOWPROP Dict.DefWindow 'REGION] "Definitions")) (SETQ TEXTSTREAM (OPENTEXTSTREAM NIL Dict.DefWindow)) (replace TXTFILE of (TEXTOBJ TEXTSTREAM) with "Definitions") (* do the replace before you spawn a TEDIT process in order to avoid a race  condition where sometimes the label on the icon was "T") (PROCESSPROP (TEDIT TEXTSTREAM Dict.DefWindow NIL '(LEAVETTY)) 'NAME 'DICTIONARY] (TEXTSTREAM Dict.DefWindow]) (DictTool.PromptStream [LAMBDA (stream) (* jtm%: "29-Sep-86 11:11") (COND [(STREAMPROP stream) (for window inside (STREAMPROP stream 'WINDOW) do (COND ((WINDOWPROP window 'PROMPTWINDOW) (RETURN (WINDOWPROP window ' PROMPTWINDOW] (T PROMPTWINDOW]) ) (DEFINEQ (DictTool.Init [LAMBDA (serverName) (* jtm%: "13-Oct-87 11:37") (PROG (analyzer dict wordNerd) (* * start up the interface) (Dict.AddCommands) (* * create the analyzer) [Analyzer.Establish (SETQ analyzer (create Morphalyzer analyzerName _ 'DictServer openFn _ (FUNCTION DictTool.OpenAnalyzer) closeFn _ (FUNCTION DictTool.Close) analyzeFn _ (FUNCTION DictTool.Analyze) correctionsFn _ (FUNCTION DictTool.Corrections] (Analyzer.Prop analyzer 'CountWords (FUNCTION DictTool.CountWords)) (* * create the dictionary) [Dict.Establish (SETQ dict (create Dict dictName _ 'DictServer openFn _ (FUNCTION DictTool.OpenDictionary) closeFn _ (FUNCTION DictTool.Close) getEntryFn _ (FUNCTION DictTool.GetEntry) printEntryFn _ (FUNCTION DictTool.PrintDefinition] (* * create the remote inverted dict.) [InvertedDict.Establish (SETQ wordNerd (create INVERTEDDICT INVERTEDDICTNAME _ 'DictServer] (InvertedDict.Prop wordNerd 'OPENFN (FUNCTION DictTool.OpenNerd)) (InvertedDict.Prop wordNerd 'DICTIONARY dict]) (DictTool.Open [LAMBDA (analyzer errors) (* jtm%: "13-Oct-87 10:43") (* * we import the interface here instead of in DictTool.Init to avoid hanging  the LOAD.) (PROG (analyzers dictionaries menuItems) (COND [(type? Morphalyzer analyzer) (COND ((NULL (Analyzer.Prop analyzer 'RemoteDict)) (SETQ analyzers (DictTool.Analyzers analyzer errors)) [SETQ menuItems (for i in analyzers collect (LIST i (LIST 'QUOTE i] (COND ((IGEQ 1 (LENGTH menuItems)) (Analyzer.Prop analyzer 'RemoteDict (CAR analyzers))) (T (Analyzer.Prop analyzer 'RemoteDict (OR (MENU (create MENU ITEMS _ menuItems TITLE _ (CONCAT (fetch (Morphalyzer analyzerName) of analyzer) " analyzers") CENTERFLG _ T)) (CAR analyzers))) (for i analyzerName in analyzers do (SETQ analyzerName (MKATOM (CONCAT (fetch (Morphalyzer analyzerName) of analyzer) ": " i))) (COND ([NOT (for j in Analyzer.List thereis (EQ analyzerName ( Analyzer.Name j] (push Analyzer.List (create Morphalyzer copying analyzer)) (Analyzer.Prop (CAR Analyzer.List) 'RemoteDict i] ((type? Dict analyzer) (COND ((NULL (Dict.Prop analyzer 'RemoteDict)) (SETQ dictionaries (DictTool.Dictionaries analyzer errors)) [SETQ menuItems (for i in dictionaries collect (LIST i (LIST 'QUOTE i] (COND ((IGEQ 1 (LENGTH menuItems)) (Dict.Prop analyzer 'RemoteDict (CAR dictionaries))) (T (Dict.Prop analyzer 'RemoteDict (OR (MENU (create MENU ITEMS _ menuItems TITLE _ (CONCAT (fetch (Dict dictName) of analyzer) " dictionaries") CENTERFLG _ T)) (CAR dictionaries))) (for i dictName in dictionaries do (SETQ dictName (MKATOM (CONCAT (fetch (Dict dictName) of analyzer) ": " i))) (COND ([NOT (for j in Dict.DictionaryList thereis (EQ dictName (Dict.Name j] (push Dict.DictionaryList (create Dict copying analyzer)) (Dict.Prop (CAR Dict.DictionaryList) 'RemoteDict i]) (DictTool.OpenDictionary [LAMBDA (dict errors) (* jtm%: "13-Oct-87 10:38") (* * we import the interface here instead of in DictTool.Init to avoid hanging  the LOAD.) (PROG (dictionaries menuItems) (COND ((type? Dict dict) (COND ((NULL (Dict.Prop dict 'RemoteDict)) (SETQ dictionaries (DICTCLIENT.DICTIONARIES)) [SETQ menuItems (for i in dictionaries collect (LIST i (LIST 'QUOTE i] (COND ((IGEQ 1 (LENGTH menuItems)) (Dict.Prop dict 'RemoteDict (CAR dictionaries))) (T (Dict.Prop dict 'RemoteDict (OR (MENU (create MENU ITEMS _ menuItems TITLE _ (CONCAT (fetch (Dict dictName) of dict) " dictionaries") CENTERFLG _ T)) (CAR dictionaries))) (for i dictName in dictionaries do (SETQ dictName (MKATOM (CONCAT (fetch (Dict dictName) of dict) ": " i))) (COND ([NOT (for j in Dict.DictionaryList thereis (EQ dictName (Dict.Name j] (push Dict.DictionaryList (create Dict copying dict)) (Dict.Prop (CAR Dict.DictionaryList) 'RemoteDict i]) (DictTool.OpenAnalyzer [LAMBDA (analyzer errors) (* jtm%: "13-Oct-87 10:43") (* * we import the interface here instead of in DictTool.Init to avoid hanging  the LOAD.) (PROG (analyzers menuItems) (COND ((type? Morphalyzer analyzer) (COND ((NULL (Analyzer.Prop analyzer 'RemoteDict)) (SETQ analyzers (DICTCLIENT.LANGUAGES)) [SETQ menuItems (for i in analyzers collect (LIST i (LIST 'QUOTE i] (COND ((IGEQ 1 (LENGTH menuItems)) (Analyzer.Prop analyzer 'RemoteDict (CAR analyzers))) (T (Analyzer.Prop analyzer 'RemoteDict (OR (MENU (create MENU ITEMS _ menuItems TITLE _ (CONCAT (fetch (Morphalyzer analyzerName) of analyzer) " analyzers") CENTERFLG _ T)) (CAR analyzers))) (for i analyzerName in analyzers do (SETQ analyzerName (MKATOM (CONCAT (fetch (Morphalyzer analyzerName) of analyzer) ": " i))) (COND ([NOT (for j in Analyzer.List thereis (EQ analyzerName ( Analyzer.Name j] (push Analyzer.List (create Morphalyzer copying analyzer)) (Analyzer.Prop (CAR Analyzer.List) 'RemoteDict i]) (DictTool.OpenNerd [LAMBDA (nerd errors) (* jtm%: "13-Oct-87 14:35") (* * we import the interface here instead of in DictTool.Init to avoid hanging  the LOAD.) (PROG (nerds menuItems dict remote) (COND ((type? INVERTEDDICT nerd) (COND ((NULL (InvertedDict.Prop nerd 'RemoteDict)) (SETQ nerds (DICTCLIENT.RESOURCES 'INDICES)) [SETQ menuItems (for i in nerds collect (LIST i (LIST 'QUOTE i] (COND ((IGEQ 1 (LENGTH menuItems)) (InvertedDict.Prop nerd 'RemoteDict (CAR nerds))) (T [InvertedDict.Prop nerd 'RemoteDict (SETQ remote (OR (MENU (create MENU ITEMS _ menuItems TITLE _ (CONCAT (fetch (INVERTEDDICT INVERTEDDICTNAME ) of nerd) " databases") CENTERFLG _ T)) (CAR nerds] (COND ((SETQ dict (InvertedDict.Prop nerd 'DICTIONARY)) (SETQ dict (COPYALL dict)) (Dict.Prop dict 'RemoteDict remote) (InvertedDict.Prop nerd 'DICTIONARY dict))) (for i in nerds do (COND ((NOT (InvertedDictFromName (fetch (INVERTEDDICT INVERTEDDICTNAME ) of nerd) i)) (push InvertedDict.List (create INVERTEDDICT copying nerd)) (InvertedDict.Prop (CAR InvertedDict.List) 'RemoteDict i) (COND ((SETQ dict (InvertedDict.Prop (CAR InvertedDict.List ) 'DICTIONARY)) (SETQ dict (COPYALL dict)) (Dict.Prop dict 'RemoteDict i) (InvertedDict.Prop (CAR InvertedDict.List) 'DICTIONARY dict]) (Dict.AddCommands [LAMBDA NIL (* ; "Edited 31-May-89 15:07 by jtm:") (* ; "Edited 31-May-89 15:06 by jtm:") (* ; "Edited 31-May-89 15:00 by jtm:") (* ; "Edited 31-May-89 13:36 by jtm:") (LET (menuItems) [SETQ menuItems '(Dictionary (FUNCTION TEdit.PrintDefinition) "Prints the definition of the selected word. Prompts the user for a word if there isn't a selection." (SUBITEMS (Set% Dictionary (FUNCTION TEdit.SetDictionary) "Gives the user a menu of dictionaries to select from." ) (Get% Definition (FUNCTION TEdit.PrintDefinition) "Prints the definition of the selected word. Prompts the user for a word if there isn't a selection." ) (Get% Synonyms (FUNCTION TEdit.PrintSynonyms) "Prints the synonyms of the selected word. Prompts the user for a word if there isn't a selection." (SUBITEMS (nouns (FUNCTION TEdit.PrintNounSynonyms) "Only prints the noun form synonyms." ) (verbs (FUNCTION TEdit.PrintVerbSynonyms) "Only prints the verb form synonyms.") (adjectives (FUNCTION TEdit.PrintAdjSynonyms) "Only prints the adjective form synonyms." ))) (|Search For Word| (FUNCTION TEdit.PrintSearch) "Prints the words in the dictionary containing at least two of the keywords in the selection. Prompts the user for keywords if there aren't any keywords selected." (SUBITEMS (Set% Database (FUNCTION TEdit.SetNerd) "Gives the user a menu of dictionaries to select from." ) (Max% Words (FUNCTION DictTool.PromptForCutoff) "Lets the user set the maximum number of words to be returned for a set of keywords." ) (Min% Keywords (FUNCTION DictTool.PromptForKeywordCutoff ) "Lets the user determine the minimum number of keywords needed by a word for it to accepted." ) (|Search For Phrase| (FUNCTION TEdit.PrintPhraseSearch) "Searches a dictionary for a particular phrase, using the Search For Word database to narrow the search. This can be an expensive operation, so please use it sparingly." ] (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU menuItems) (* ;; "add menu item to Lafite's display menu if Lafite has been loaded.") [COND ((BOUNDP '\LAFITE.ACTIVE) (pushnew LAFITE.EXTRA.DISPLAY.COMMANDS menuItems) (if \LAFITE.ACTIVE then (LAFITE.COMPUTE.CACHED.VARS] (PUTASSOC 'Dictionary (CONVERTFUNCTIONSTOFORMS (CDR menuItems)) BackgroundMenuCommands) (SETQ BackgroundMenu NIL]) (DictTool.Close [LAMBDA (analyzer) (* jtm%: "13-Nov-86 10:58") (CLOSEF DICTSERVERSTREAM]) ) (DEFINEQ (DictTool.Analyze [LAMBDA (analyzer stream fromLoc length analFn) (* jtm%: "14-Apr-87 14:16") (PROG (buffer bufferStream bufferLength char returnValue userWords (substring (ALLOCSTRING 0 32)) (maxBufferLength 5100) (offset fromLoc)) (SETQ userWords (Analyzer.Prop analyzer 'UserDict)) [COND ((NULL stream) NIL) [(STRINGP stream) (HELP "DictTool.Analyze not implemented for STRING") [SETQ returnValue (DICTCLIENT.PROOFREAD stream (Analyzer.Prop analyzer 'RemoteDict] (COND ((EQUAL 0 (CDR returnValue)) (RETURN (SETQ returnValue NIL] (T (* * break up the stream into strings of ~5000 characters.) (SETQ buffer (ALLOCSTRING (IMIN length maxBufferLength))) (SETQ bufferStream (OPENSTRINGSTREAM buffer 'OUTPUT)) (SETFILEPTR stream fromLoc) (while (IGREATERP length 0) do (SETFILEPTR bufferStream 0) (SETQ bufferLength 0) [do (SETQ char (BIN stream)) [COND ((OR (NOT (NUMBERP char)) (IGREATERP char 255)) (SETQ char (CHARCODE % ] (BOUT bufferStream char) (add length -1) (add bufferLength 1) (COND ((EQUAL length 0) (RETURN)) ((EQUAL bufferLength maxBufferLength) (RETURN)) ((IGREATERP bufferLength (IDIFFERENCE maxBufferLength 200)) (COND ([OR (EQ char (CHARCODE CR)) (AND (EQ char (CHARCODE SP)) (IGREATERP bufferLength (IDIFFERENCE maxBufferLength 50] (RETURN] [SETQ returnValue (DICTCLIENT.PROOFREAD (COND ((EQUAL bufferLength (NCHARS buffer) ) buffer) (T (SUBSTRING buffer 1 bufferLength substring))) (Analyzer.Prop analyzer 'RemoteDict] (COND ((EQUAL 0 (CDR returnValue)) (SETQ returnValue NIL) (add offset bufferLength)) ((AND userWords (Dict.GetEntry userWords (SUBSTRING buffer (ADD1 (CAR returnValue)) (IPLUS (CAR returnValue) (CDR returnValue)) substring))) [add length (IPLUS bufferLength (IMINUS (IPLUS (CAR returnValue) (CDR returnValue] (add offset (IPLUS (CAR returnValue) (CDR returnValue))) (SETFILEPTR stream offset) (SETQ returnValue NIL)) (returnValue (add (CAR returnValue) offset) (RETURN returnValue] (RETURN returnValue]) (DictTool.Analyzers [LAMBDA (analyzer errorStream) (* jtm%: "13-Nov-86 10:57") (* * wraps DictTool.RPCCall around a call to RemoteDict.Analyzers) (DICTCLIENT.LANGUAGES]) (DictTool.Pronunciation [LAMBDA (word dictName) (* jtm%: "13-Nov-86 10:58") [COND ((NOT (STRINGP word)) (SETQ word (MKSTRING word] [COND ((NULL dictName) (SETQ dictName 'AmericanHeritage] (DICTCLIENT.PRONUNCIATION word dictName]) (DictTool.Corrections [LAMBDA (analyzer stream loc len) (* jtm%: "13-Nov-86 10:58") (DICTCLIENT.CORRECTIONS (COND ((STRINGP stream) stream) (T (STREAM.FETCHSTRING stream loc len))) (Analyzer.Prop analyzer 'RemoteDict]) (DictTool.CountWords [LAMBDA (analyzer stream fromLoc length analFn) (* jtm%: "13-Nov-86 14:19") (PROG (buffer bufferStream bufferLength char (n 0) (substring (ALLOCSTRING 0 32)) (maxBufferLength 5100) (offset fromLoc)) [COND ((NULL stream) NIL) [(STRINGP stream) (HELP "DictTool.Analyze not implemented for STRING") [SETQ n (DICTCLIENT.PROOFREAD stream (Analyzer.Prop analyzer 'RemoteDict] (COND ((EQUAL 0 (CDR n)) (RETURN (SETQ n NIL] (T (* * break up the stream into strings of ~5000 characters.) (SETQ buffer (ALLOCSTRING (IMIN length maxBufferLength))) (SETQ bufferStream (OPENSTRINGSTREAM buffer 'OUTPUT)) (SETFILEPTR stream fromLoc) (while (IGREATERP length 0) do (SETFILEPTR bufferStream 0) (SETQ bufferLength 0) [do (SETQ char (BIN stream)) [COND ((OR (NOT (NUMBERP char)) (IGREATERP char 255)) (SETQ char (CHARCODE % ] (BOUT bufferStream char) (add length -1) (add bufferLength 1) (COND ((EQUAL length 0) (RETURN)) ((EQUAL bufferLength maxBufferLength) (RETURN)) ((IGREATERP bufferLength (IDIFFERENCE maxBufferLength 200)) (COND ([OR (EQ char (CHARCODE CR)) (AND (EQ char (CHARCODE SP)) (IGREATERP bufferLength (IDIFFERENCE maxBufferLength 50] (RETURN] [add n (DICTCLIENT.COUNTWORDS (COND ((EQUAL bufferLength (NCHARS buffer)) buffer) (T (SUBSTRING buffer 1 bufferLength substring) )) (Analyzer.Prop analyzer 'RemoteDict] (add offset bufferLength] (RETURN n]) ) (* * FINDWORD & SUBSTITUTEWORD) (DEFINEQ (DictTool.FindWord [LAMBDA (STREAM WORD CH) (* jtm%: "30-Apr-86 10:30") (* the TEDIT interface to FindWord) (PROG (SEL (TEXTOBJ (TEXTOBJ STREAM))) (* * prompt the user for a string if none is given.) [COND ((NULL WORD) (SETQ WORD (TEDIT.GETINPUT TEXTOBJ "Word to find: " (WINDOWPROP W ' TEDIT.LAST.FIND.STRING) (CHARCODE (EOL LF ESC] (* * search for the word.) [COND (WORD (SETQ SEL (fetch SEL of TEXTOBJ)) (\SHOWSEL SEL NIL NIL) (TEDIT.PROMPTPRINT TEXTOBJ "Searching..." T) (SETQ CH (LingFns.FindWord STREAM WORD CH)) (* * show the user what we found) (COND (CH (TEDIT.PROMPTPRINT TEXTOBJ "Done.") (replace CH# of SEL with (CAR CH)) [replace DCH of SEL with (IPLUS (CAR CH) (IMINUS (CADR CH] (replace CHLIM of SEL with (ADD1 (CADR CH))) (replace POINT of SEL with 'RIGHT) (TEDIT.RESET.EXTEND.PENDING.DELETE SEL) (\FIXSEL SEL TEXTOBJ) (TEDIT.NORMALIZECARET TEXTOBJ) (\SHOWSEL SEL NIL T) (WINDOWPROP W 'TEDIT.LAST.FIND.STRING WORD) (* And get it into the window) ) (T (TEDIT.PROMPTPRINT TEXTOBJ "(not found).") (\SHOWSEL SEL NIL T] (replace \INSERTNEXTCH of TEXTOBJ with -1]) (DictTool.SubstituteWord [LAMBDA (TEXTSTREAM PATTERN REPLACEMENT CONFIRM? DICTNAME) (* jtm%: "24-Mar-87 08:58") (* this procedure is a modification of  TEDIT.SUBSTITUTE.) (PROG (SEARCHSTRING REPLACESTRING ABORTFLG OUTOFRANGEFLG (TEXTOBJ (TEXTOBJ TEXTSTREAM)) ENDCHAR# STARTCHAR# RANGE (REPLACEDFLG 0) (YESLIST '("y" "Y" "yes" "Yes" "YES" "T")) CONFIRMFLG SEL PC# SELCH# SELCHLIM SELPOINT CRSEEN DICT) (COND ([NULL (SETQ SEARCHSTRING (OR PATTERN (TEDIT.GETINPUT TEXTOBJ "Search word:"] (* If the search pattern is empty,  bail out.) (TEDIT.PROMPTPRINT TEXTOBJ "[Aborted]") (RETURN))) (SETQ REPLACEMENT (OR REPLACEMENT (TEDIT.GETINPUT TEXTOBJ "Replace word:") "")) (* jtm%: use REPLACEMENT for the  original, REPLACESTRING for the  modified word.) (SETQ CRSEEN (STRPOS (CHARACTER (CHARCODE CR)) REPLACEMENT)) (* jtm%: use REPLACEMENT instead of  REPLACESTRING) (COND (PATTERN (* If a pattern is specd in the call,  use the caller's confirm flag.) (SETQ CONFIRMFLG CONFIRM?)) (T (* Otherwise, ask for one.) (SETQ CONFIRMFLG T) (* SETQ CONFIRMFLG (MEMBER  (TEDIT.GETINPUT TEXTOBJ  "Ask before each replace?" "Yes"  (CHARCODE (EOL SPACE ESCAPE LF TAB)))  YESLIST)) (* jtm%: change default to "Yes") )) (TEDIT.PROMPTPRINT TEXTOBJ "Substituting..." T) (SETQ DICT (DictTool.CreateConjugationMap DICTNAME SEARCHSTRING REPLACEMENT)) (SETQ SEL (fetch SEL of TEXTOBJ)) (* STARTCHAR# and ENDCHAR# are the  bound of the search) (\SHOWSEL SEL NIL NIL) (TEDIT.RESET.EXTEND.PENDING.DELETE SEL) (* Turn off any blue pending delete) (SETQ STARTCHAR# (fetch CH# of SEL)) [SETQ ENDCHAR# (IPLUS STARTCHAR# (SUB1 (fetch DCH of SEL] (while (AND (SETQ RANGE (LingFns.FindWord TEXTSTREAM SEARCHSTRING STARTCHAR# DICT) (* jtm%: use FindWord for TEDIT.FIND) ) (NOT ABORTFLG)) do (SETQ REPLACESTRING (CADDR RANGE)) (* jtm%: add the suffix.) [PROG (PENDING.SEL CHOICE) (COND [CONFIRMFLG (SETQ PENDING.SEL (TEDIT.SETSEL TEXTSTREAM (CAR RANGE) (IDIFFERENCE (CADR RANGE) (SUB1 (CAR RANGE))) 'RIGHT)) (TEDIT.SHOWSEL TEXTSTREAM T PENDING.SEL) (TEDIT.NORMALIZECARET TEXTOBJ SEL) [SETQ CHOICE (COND [(LISTP REPLACESTRING) (SETQ REPLACESTRING (MENU (create MENU ITEMS _ (CONS "*QUIT*" REPLACESTRING) CENTERFLG _ T CHANGEOFFSETFLG _ T TITLE _ "substitutions"] (T (TEDIT.GETINPUT TEXTOBJ (CONCAT "Substitute '" REPLACESTRING "'? ['q' quits]") "Yes" (CHARCODE (EOL SPACE ESCAPE LF TAB] (COND ((MEMBER CHOICE '("*QUIT*" "Q" "q")) (SETQ ABORTFLG T) (GO L1)) ((MEMBER CHOICE '(NIL "n" "N" "no" "NO")) (* turn off selection) (TEDIT.SHOWSEL TEXTSTREAM NIL PENDING.SEL) (RPLACA RANGE (IDIFFERENCE (CADR RANGE) (NCHARS REPLACESTRING))) (GO L1)) (T (* OK to replace) (TEDIT.DELETE TEXTSTREAM PENDING.SEL) (* make the replacement) (COND ((NOT (EQUAL REPLACESTRING "")) (* If the replacestring is nothing,  why bother to add nothing) (TEDIT.INSERT TEXTSTREAM REPLACESTRING (CAR RANGE)) [SETQ ENDCHAR# (IPLUS ENDCHAR# (IDIFFERENCE (NCHARS REPLACESTRING) (IDIFFERENCE (CADR RANGE) (SUB1 (CAR RANGE] (add REPLACEDFLG 1] (T (* No confirmation required.  Do the substitutions without showing  intermediate work) (SETQ PC# (\DELETECH (CAR RANGE) (CADR RANGE) (ADD1 (IDIFFERENCE (CADR RANGE) (CAR RANGE))) TEXTOBJ)) (\FIXDLINES (fetch LINES of TEXTOBJ) SEL (CAR RANGE) (CADR RANGE) TEXTOBJ) [COND ((NOT (EQUAL REPLACESTRING "")) (* If the replacestring is nothing,  why bother to add nothing) (COND [CRSEEN (for ACHAR instring REPLACESTRING as NCH# from (CAR RANGE) by 1 do (SELCHARQ ACHAR (CR (\INSERTCR ACHAR NCH# TEXTOBJ)) (\INSERTCH ACHAR NCH# TEXTOBJ] (T (\INSERTCH REPLACESTRING (CAR RANGE) TEXTOBJ PC#))) (SETQ ENDCHAR# (IPLUS ENDCHAR# (IDIFFERENCE (NCHARS REPLACESTRING) (IDIFFERENCE (CADR RANGE) (SUB1 (CAR RANGE] (add REPLACEDFLG 1))) L1 (SETQ STARTCHAR# (IPLUS (CAR RANGE) (NCHARS REPLACESTRING] (* start looking where you left off)) (COND ((ZEROP REPLACEDFLG) (TEDIT.PROMPTPRINT TEXTOBJ "No replacements made." T)) ((EQUAL REPLACEDFLG 1) (TEDIT.PROMPTPRINT TEXTOBJ "1 Replacement made." T)) (T (TEDIT.PROMPTPRINT TEXTOBJ (CONCAT (MKSTRING REPLACEDFLG) " Replacements made.") T))) (COND ((AND (NOT CONFIRMFLG) (NOT (ZEROP REPLACEDFLG))) (* There WERE replacements, and they  were not confirmed.) (replace CHLIM of SEL with ENDCHAR#) [replace DCH of SEL with (ADD1 (IDIFFERENCE (fetch CHLIM of SEL) (fetch CH# of SEL] (\TEDIT.MARK.LINES.DIRTY TEXTOBJ (fetch CH# of SEL) (fetch CHLIM of SEL)) (TEDIT.UPDATE.SCREEN TEXTOBJ) (\FIXSEL SEL TEXTOBJ) (\SHOWSEL SEL NIL T))) (RETURN REPLACEDFLG]) (DictTool.CreateConjugationMap [LAMBDA (language word1 word2) (* jtm%: "24-Mar-87 09:06") (* * creates a conjugation dictionary that maps word1 into word2.) (PROG [fullconj1 fullconj2 pp1 pp2 prior (dict (SimpleDict.New 'map] [COND [word2 (SETQ fullconj1 (DICTCLIENT.CONJUGATE word1 NIL NIL language)) (SETQ fullconj2 (DICTCLIENT.CONJUGATE word2 NIL NIL language)) (SETQ pp1 (FASSOC 'pp fullconj1)) (SETQ pp2 (FASSOC 'pp fullconj2)) [COND [(AND pp1 (NULL pp2) (FASSOC 'v fullconj2)) (push fullconj2 (CONS 'pp (CDR (FASSOC 'pst fullconj2] ((AND pp2 (NULL pp1) (FASSOC 'v fullconj1)) (push fullconj1 (CONS 'pp (CDR (FASSOC 'pst fullconj1] (for conj1 conj2 entry in fullconj1 do (SETQ conj2 (FASSOC (CAR conj1) fullconj2)) (AND conj2 (for caps oldValue newValue in '(NONE FIRST ALL) do (SETQ entry (LingFns.Capitalize (CADR conj1) caps)) (SETQ oldValue (Dict.GetEntry dict entry)) (SETQ newValue (LingFns.Capitalize (CADR conj2) caps)) (SETQ newValue (COND ((for i inside oldValue thereis (STREQUAL i newValue)) oldValue) ((LISTP oldValue) (CONS newValue oldValue)) (oldValue (LIST newValue oldValue)) (T newValue))) (Dict.PutEntry dict entry newValue] (T (for conjugation in (DICTCLIENT.CONJUGATE word1 NIL language) do (for caps in '(NONE FIRST ALL) do (Dict.PutEntry dict (LingFns.Capitalize (CADR conjugation) caps) T] (RETURN dict]) (DictTool.FindWordInit [LAMBDA NIL (* jtm%: "26-Feb-87 13:46") (* * add items to TEDIT's menu.) [for ITEM on (fetch (MENU ITEMS) of TEDIT.DEFAULT.MENU) do (COND [(EQ (CAR ITEM) 'Find) (RPLACA ITEM '(Find 'Find NIL (SUBITEMS (FindWord (FUNCTION DictTool.FindWord) "Looks for a word independent of its inflection or capitalization." ] ((EQ (CAR ITEM) 'Substitute) (RPLACA ITEM '(Substitute 'Substitute NIL (SUBITEMS (SubstituteWord (FUNCTION DictTool.SubstituteWord) "Substitutes one word for another, keeping the same capitalization and inflectional form." ] (* * force the menu to be recomputed.) (COND ((EQ (fetch MENUCOLUMNS of TEDIT.DEFAULT.MENU) 1) (* If there is only one column, force  a re-figuring of the number of rows) (replace MENUROWS of TEDIT.DEFAULT.MENU with NIL)) ((EQ (fetch MENUROWS of TEDIT.DEFAULT.MENU) 1) (* There's only one row, so recompute  %# of columns.) (replace MENUCOLUMNS of TEDIT.DEFAULT.MENU with NIL))) (replace ITEMWIDTH of TEDIT.DEFAULT.MENU with 10000) (replace ITEMHEIGHT of TEDIT.DEFAULT.MENU with 10000) (replace IMAGE of TEDIT.DEFAULT.MENU with NIL) (* Force it to create a new menu  image.) (UPDATE/MENU/IMAGE TEDIT.DEFAULT.MENU]) ) (DEFINEQ (LingFns.FindWord [LAMBDA (STREAM WORD CH DICT) (* jtm%: "24-Mar-87 09:28") (* * finds the next instance of WORD in the text stream, independent of how it is  conjugated or capitalized. returns the first character index, the last character  index, the suffix, and the capitalization.) (PROG (CHAR NODE END EXPO FIRSTCHAR LASTCHAR U-FIRSTCHAR EOFPTR dictCreated) (* * build the dictionary) [COND (WORD (SETQ WORD (MKSTRING WORD)) [COND ((NULL DICT) (SETQ DICT (STREAMPROP STREAM 'FINDWORDMAP)) (COND ((EQUAL WORD (CAR DICT)) (SETQ DICT (CDR DICT))) (T (SETQ DICT (DictTool.CreateConjugationMap NIL WORD)) (STREAMPROP STREAM 'FINDWORDMAP (CONS WORD DICT] (* * initialize.) [COND ((NULL CH) (SETQ CH (TEDIT.GETPOINT STREAM] (SETQ CH (SUB1 CH)) (SETQ EOFPTR (GETEOFPTR STREAM)) (COND ((GREATERP CH EOFPTR) (RETURN)) (T (SETFILEPTR STREAM CH))) [SETQ FIRSTCHAR (CHCON1 (L-CASE (NTHCHAR WORD 1] [SETQ U-FIRSTCHAR (CHCON1 (U-CASE (NTHCHAR WORD 1] (* * search for a word that begins with the first letter.) (while (NEQ EOFPTR (GETFILEPTR STREAM)) do (SETQ LASTCHAR CHAR) (SETQ CHAR (BIN STREAM)) (COND ([AND [OR (NULL LASTCHAR) (AND (NUMBERP LASTCHAR) (NOT (ALPHACHARP LASTCHAR] (NUMBERP CHAR) (SETQ NODE (FASSOC (CHARACTER CHAR) (fetch (SimpleDict.Node subnodes) of (fetch (Dict contents) of DICT] (SETQ CH (GETFILEPTR STREAM)) [while NODE do (COND ((EQP EOFPTR (GETFILEPTR STREAM)) (SETQ END EOFPTR) (RETURN)) ([AND (SETQ CHAR (BIN STREAM)) (NUMBERP CHAR) (ALPHACHARP CHAR) (SETQ NODE (FASSOC (CHARACTER CHAR) (fetch (SimpleDict.Node subnodes) of NODE] (* is this a legal character?) ) (T (RETURN] (COND ((SETQ EXPO (fetch (SimpleDict.Node value) of NODE)) (RETURN] (* * we are done.) (RETURN (COND ((AND EXPO CH) [COND ((NULL END) (SETQ END (SUB1 (GETFILEPTR STREAM] (LIST CH END EXPO]) (LingFns.Capitalize [LAMBDA (word caps) (* jtm%: " 6-Aug-84 12:53") (* * capitalizes word according to the parameter "caps") (COND ((LISTP word) (for w in word collect (LingFns.Capitalize w caps))) (T (PROG (stringP litAtom) (COND ((STRINGP word) (SETQ word (UNPACK word)) (SETQ stringP T)) ((LITATOM word) (SETQ word (UNPACK word)) (SETQ litAtom T))) [SELECTQ caps (FIRST [COND ((NOT (U-CASEP (CAR word))) (RPLACA word (U-CASE (CAR word] [for char on (CDR word) do (COND ((U-CASEP (CAR char)) (RPLACA char (L-CASE (CAR char]) (ALL [for char on word do (COND ((NOT (U-CASEP (CAR char))) (RPLACA char (U-CASE (CAR char]) (for char on word do (COND ((U-CASEP (CAR char)) (RPLACA char (L-CASE (CAR char] [COND [stringP (SETQ word (MKSTRING (PACK word] (litAtom (SETQ word (PACK word] (RETURN word]) (LingFns.Capitalization [LAMBDA (word) (* jtm%: "18-Jul-84 15:19") (* * returns NIL, ALL or FIRST) (COND ([OR (NULL word) (NOT (U-CASEP (CAR word] NIL) ([OR (NULL (CDR word)) (NOT (U-CASEP (CADR word] 'FIRST) (T 'ALL]) ) (DictTool.FindWordInit) (RPAQ? DictTool.TimeOperation NIL) (RPAQ? Dict.DefWindow NIL) (RPAQ? Dict.CommandsAdded NIL) (RPAQ? InvertedDict.List NIL) (RPAQ? DictTool.LastSearch NIL) (RPAQ? DictTool.LastWord NIL) (RPAQ? TEdit.DefaultDictionary NIL) (RPAQ? DictTool.MinKeywords 2) (RPAQ? DictTool.MaxWords 100) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DictTool.TimeOperation Dict.DefWindow Dict.CommandsAdded InvertedDict.List DictTool.MinKeywords DictTool.MaxWords DictTool.LastSearch DictTool.LastWord TEdit.DefaultDictionary) ) (DictTool.Init) (RPAQQ PronunciationGuide (("q" "cat" "(kqt)") ("A" "pay" "(pA)") ("Q" "care" "(kQr)") ("*" "father" "(f*%"T5r)") ("b" "bike" "(bIk)") ("ch" "church" "(ch/rch)") ("d" "deed" "(dEd)") ("4" "pet" "(p4t)") ("E" "seed" "(sEd)") ("I" "fife" "(fIf)") ("g" "gag" "(gqg)") ("h" "hat" "(hqt)") ("hw" "which" "(hw9ch)") ("9" "pit" "(p9t)") ("I" "lie" "(lI)") ("7" "pier" "(p7r)") ("j" "judge" "(j8j)") ("k" "kick" "(k9k)") ("l" "lid" "(l9d)") ("l" "needle" "(nEd%"l)") ("m" "mum" "(m8m)") ("n" "no, sudden" "(nO)") ("ng" "thing" "(th9ng)") ("0" "pot" "(p0t)") ("O" "toe" "(tO)") ("" "paw" "(p)") ("oi" "noise" "(noiz)") ("ou" "out" "(out)") ("1" "book" "(b1k)") ("|" "boot" "(b|t)") ("p" "people" "(pE%"p5l)") ("r" "roar" "(rr)") ("s" "sauce" "(ss)") ("sh" "ship" "(sh9p)") ("t" "tight" "(tIt)") ("th" "thin" "(th9n)") ("T" "this" "(T9s)") ("8" "cut" "(k8t)") ("/" "urge" "(/rj)") ("v" "valve" "(vqlv)") ("w" "with" "(w9T, w9th)") ("y" "yes" "(y4s)") ("z" "zebra" "(zE%"br5)") ("zh" "vision" "(v9zh%"5n)") ("5" "about" "(5-bout%")") ("KH" "loch" "(l0KH, l0k)") ("N" "bon" "(b0n; French bN)."))) (RPAQQ PronunciationMap ((%" %') (5 ˙&f˙) (/ Ď u) (8 Ć u) (T Î t h) (%| Ĺ o Ĺ o) (1 Ć o Ć o) (% ˙ńŃ˙) (O Ĺ o) (0 Ć o) (7 ˙ńŔ˙) (I ˙ńż˙) (9 ˙ńž˙) (E Ĺ e) (4 Ć e) (* ˙ń§˙) (Q ˙ńŁ˙) (A Ĺ a) (q Ć a))) (PUTPROPS DICTTOOL COPYRIGHT ("Xerox Corporation" 1986 1987 1988 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5787 18593 (TEDIT.INCLUDESTREAM 5797 . 6308) (TEdit.PrintDefinition 6310 . 8564) ( DictTool.PrintDefinition 8566 . 11103) (Dict.PrintDefinition 11105 . 12068) (DictTool.GetEntry 12070 . 12369) (TEdit.SetDictionary 12371 . 14530) (DictForStream 14532 . 14899) (DictTool.Dictionaries 14901 . 15055) (PARSEBYCOLONS 15057 . 16106) (PrintPronunciationGuide 16108 . 17579) ( ConvertPronunciation 17581 . 18591)) (18594 27955 (TEdit.PrintSearch 18604 . 19054) ( DictTool.PrintSearch 19056 . 21319) (DictTool.MergeSearch 21321 . 23149) (NerdForStream 23151 . 23461) (TEdit.SetNerd 23463 . 25535) (DictTool.PromptForCutoff 25537 . 26084) ( DictTool.PromptForKeywordCutoff 26086 . 26734) (PARSESELECTION 26736 . 27953)) (27956 30011 ( TEdit.PrintPhraseSearch 27966 . 28428) (DictTool.PrintPhraseSearch 28430 . 30009)) (30012 34807 ( TEdit.PrintSynonyms 30022 . 30351) (REMOVEALL 30353 . 30853) (CONVERTFUNCTIONSTOFORMS 30855 . 31345) ( TEdit.PrintNounSynonyms 31347 . 31698) (DictTool.PrintNounSynonyms 31700 . 31884) ( DictTool.PrintVerbSynonyms 31886 . 32070) (DictTool.PrintAdjSynonyms 32072 . 32257) ( TEdit.PrintVerbSynonyms 32259 . 32601) (TEdit.PrintAdjSynonyms 32603 . 32948) (DictTool.PrintSynonyms 32950 . 34805)) (34808 40396 (DictTool.TEditWrapper 34818 . 38056) (Dict.OutputStream 38058 . 39852) ( DictTool.PromptStream 39854 . 40394)) (40397 58304 (DictTool.Init 40407 . 42137) (DictTool.Open 42139 . 45990) (DictTool.OpenDictionary 45992 . 47887) (DictTool.OpenAnalyzer 47889 . 50072) ( DictTool.OpenNerd 50074 . 53438) (Dict.AddCommands 53440 . 58153) (DictTool.Close 58155 . 58302)) ( 58305 65911 (DictTool.Analyze 58315 . 62363) (DictTool.Analyzers 62365 . 62595) ( DictTool.Pronunciation 62597 . 62917) (DictTool.Corrections 62919 . 63285) (DictTool.CountWords 63287 . 65909)) (65950 83282 (DictTool.FindWord 65960 . 67971) (DictTool.SubstituteWord 67973 . 78188) ( DictTool.CreateConjugationMap 78190 . 81065) (DictTool.FindWordInit 81067 . 83280)) (83283 89085 ( LingFns.FindWord 83293 . 87111) (LingFns.Capitalize 87113 . 88725) (LingFns.Capitalization 88727 . 89083))))) STOP \ No newline at end of file diff --git a/lispusers/DICTTOOL.TEDIT b/lispusers/DICTTOOL.TEDIT new file mode 100644 index 00000000..17d488c8 --- /dev/null +++ b/lispusers/DICTTOOL.TEDIT @@ -0,0 +1,16 @@ +XEROX DICTTOOL 2 4 1 DICTTOOL 1 4 By: Maxwell (Maxwell.pa@Xerox.com) Uses DICTCLIENT, ANALYZER INTERNAL INTRODUCTION DICTTOOL is the user's interface to the Dictionary Server. The Dictionary Server is a prototype of a shared network resource for providing a suite of dictionary-based capabilities to programs running on client workstations. It has on it the American Heritage dictionary, the Word Finder synonym package by Microlytics, a Proofreader, and the WordNerd, a package for searching for words based on their meaning. (Note: The American Heritage dictionary has been licensed to us by Houghton-Miflin for research purposes only, and so we have not made the Dictionary Server generally available. The Dictionary Server should only be used by people within PARC.) HOW TO USE DICTTOOL When you load the DICTTOOL, it automatically adds a new menu item named "Dictionary" to the TEdit menu and the Background menu. The "Dictionary" menu item has three sub-items: "Get Definition", "Get Synonyms", and "Search For Word". Here is how each one works: Get Definition If you make a selection in a TEdit document, and then invoke the "Get Definition" command in that document, then DictTool will ask for a confirmation and then fetch the definition for that word from the Dictionary Server, printing it in a separate window. If there is more than one entry in the American Heritage Dictionary for that word, then it will print the definitions one after another. The Dictionary Server knows how to find the root forms of words, and so "breathing" "breathes" and "breathe" will all give you the same entry. If there is no selection in the TEdit document, or if you deny the confirmation, or if instead of using the TEdit menu you use the Background menu, then DictTool will first prompt you for a word to look up and then fetch its definition. (Since it is very hard to make a null selection with TEdit, DictTool treats a one character selection as meaning "no selection". If you really want to look up a single letter in the dictionary, you can type it in when prompted for a word.) If you want to look up several definitions at once, separate the entries with semi-colons followed by spaces. (i.e. "camera; photography; motion picture"). Semi-colons are used as delimiters because some of the entries in the American Heritage Dictionary have spaces and commas in them (as in "motion picture"). It also makes it easier to look up words in the output of the WordNerd (see "Search For Word" below). Get Synonyms The interface for getting synonyms is exactly the same as the interface for getting definitions. If you make a selection, then DictTool will first confirm the selection and then print out the synonyms in the same window that the definitions are printed in. If you don't make a selection, then DictTool will first prompt you for a word. The format of the information printed out is a series of synonym classes separated by carriage returns. Each synonym class begins with the part of speech that its elements belong to. The elements themselves are separated by commas. Search For Word The interface to the WordNerd is a little different from the other interfaces. Instead of typing just one word in, you want to type a list of keywords separated by spaces. For instance, if you were looking for the word for a mechanical model of the solar system, you might type: Type keywords to search on: mechanical model solar system The WordNerd then searches for words that have at least two of these keywords in their definitions. The results would be sorted according to the number of keywords found, with the words having the most keywords printed first: mechanical model solar system: orrery mechanical solar system: mechanism model solar system: planetarium mechanical system: automation; bar1; component; degree of freedom; energy level; hookup; ignition; instrument; key1; linkwork; load; machine; neutral; perpetual motion; quantize; resonance; schematic; servomechanism; shafting; stress; suspension; unit solar system: Copernican; cosmic; Earth; Ganymede3; Jupiter2; Mars2; mercury; Milky Way; nebular hypothesis; Neptune3; Pallas; planet; planetesimal hypothesis; Pluto2; Saturn2; solar battery; space; sun; Uranus2; Venus2; Vesta2 (The numbers after some of the words mean that this is the nth entry of this word in the American Heritage Dictionary.) If there is a word in the list that you want to see the definition for, you can merely select it and get its definition with "Get Definition". In this case you would probably want to know what "orrery" means: or|re|ry n., pl. -ries. A mechanical model of the solar system. [After Charles Boyle (16761731), fourth Earl of Orrery, for whom one was made.] There is also a mechanism for indicating that two words are synonyms of one another, and hence should not be counted as separate keywords for the purpose of deciding whether a word has the minimum two keywords. All you need to do is put parentheses around the words in question. For instance if you were looking for the word for the little plastic thing on the end of a shoe lace, you might try: Type keywords to search on: (shoe lace shoelace) (end tip) And get in return: shoe+ end+: aglet; fall; heel1; lift; point; quarter; spike1; toe (A plus at the end of a word indicates a synonym class.) If you only give the DictTool one word, then it will print out all of the words in the dictionary that have that word in its definition. Max Words There are two sub-items in the "Search For Word" sub-menu: "Max Words" and "Min Keywords". The first sub-item, "Max Words", allows the user to specify the maximum number of words that should be returned on each search. DictTool is set up to only return 100 words at a time. If WordNerd finds more than a hundred words, then it truncates the list and indicates how many words it eliminated. If you want to see the words that were eliminated, just make the same request with the same keywords in the same order and the WordNerd will return the next 100 words. (If there is no selection in the document, then DictTool will prompt you with the last set of keywords so that this is easier.) However, if 100 words is too many or too few, you can change it with this menu item or by setting the global variable DictTool.MaxWords. Min Keywords DictTool is set up to only return a word if it has at least two of the user's keywords in its definition. If the user wants, he can raise or lower the minimum as he sees fit. The minimum only comes into play whenever the user gives more keywords than the minimum, otherwise the WordNerd looks for words that have at least one of the keywords in their definition. A minimum of 1 means that only one word has to match. A negative minimum means that the WordNerd will set the minimum relative to the number of keywords given. For instance, a minimum of -1 says that all but one of the keywords have to match for the word to be returned. A minimum of zero means that all of the words have to match. Search For Phrase The Search For Phrase command returns all of the entries in the American Heritage Dictionary that have a particular phrase in them. It does this with the help of the Search For Word command, which is why it is a sub-command of that command. Whenever you search for a phrase, the dictionary server first uses the Search For Word command to get the list of words in the dictionary that have all of the words of the phrase in it. It then looks up the definition of each of these words, and returns the words that have the phrase in their definition. This can be a very time-consuming operation, so you should use this command sparingly. But if you are concerned about locality and word order, then this command can save you a lot of time. PROOFREADING The Dictionary Server also provides proofreading facilities similar to the PROOFREADER package. The interface is exactly the same: there is a "Proofread" menu item on the TEdit menu which produces a special fixed menu for proofreading. The only difference is that all of the proofreading is done remotely on the server. You should only use the Dictionary Server for proofreading small documents; if you are going to do a lot of proofreading, it is better to use the PROOFREADER. (For more documentation on how to proofread, see PROOFREADER.) (LIST ((PAGE NIL (FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 444 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (282 42 72 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 444 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (282 42 72 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 444 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))),$$Č,,Č,ŠŠ8,Č ,ŠŠ8HČČ PAGEHEADING RUNNINGHEAD  HELVETICA +TIMESROMAN + +TIMESROMAN + HELVETICA +MODERN +MODERN +MODERN +MODERN +MODERN MODERNLOGO  +  HRULE.GETFNMODERN + HRULE.GETFNMODERN + HRULE.GETFNMODERN +  HRULE.GETFNMODERN   HRULE.GETFNMODERN  $  Ąőߥ ? ă + éÖLZŽ! 5;‰ += žç " đzş \ No newline at end of file diff --git a/lispusers/DIGEST b/lispusers/DIGEST new file mode 100644 index 00000000..0b108c09 --- /dev/null +++ b/lispusers/DIGEST @@ -0,0 +1 @@ +(FILECREATED " 3-Jan-86 17:10:20" {ERIS}LIBRARY>DIGEST.;3 14384 changes to: (FNS DIGEST.FILE \DIGEST.FILE.FOR.TRANSMISSION \DIGEST.INITIALIZE \DIGEST.SEND.FILE.BYTES \DIGEST.SEND.PARAMETERS \DIGEST.WRITE \DIGEST.PREAMBLE \DIGEST.SEND.STRING \DIGEST.SEND.HEADER \DIGEST.SEND.PACKET) (MACROS \DIGEST.INCREMENT.SEQNO \DIGEST.DEFAULT.CHECKSUM \DIGEST.CTL \DIGEST.CHAR) (VARS DIGESTCOMS DIGEST.PACKET.TYPES \DIGESTOVLEN \DIGEST.INIT.PARAMETER.OFFSETS) previous date: " 3-Jan-86 16:49:25" {ERIS}LIBRARY>DIGEST.;1) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DIGESTCOMS) (RPAQQ DIGESTCOMS ((MACROS \DIGEST.CHAR \DIGEST.CTL \DIGEST.DEFAULT.CHECKSUM \DIGEST.INCREMENT.SEQNO) (VARS DIGEST.PACKET.TYPES \DIGEST.INIT.PARAMETER.OFFSETS \DIGESTOVLEN) (FNS DIGEST.FILE \DIGEST.FILE.FOR.TRANSMISSION \DIGEST.INITIALIZE \DIGEST.PREAMBLE \DIGEST.SEND.FILE.BYTES \DIGEST.SEND.HEADER \DIGEST.SEND.PACKET \DIGEST.SEND.PARAMETERS \DIGEST.SEND.STRING \DIGEST.WRITE) (RECORDS KERMITSTATE))) (DECLARE: EVAL@COMPILE (DEFMACRO \DIGEST.CHAR (X) (BQUOTE (IPLUS (\, X) 32))) (DEFMACRO \DIGEST.CTL (X) (BQUOTE (LOGAND (MASK.1'S 0 8) (LOGXOR , X 64)))) (DEFMACRO \DIGEST.DEFAULT.CHECKSUM (S) (BQUOTE (\KERMIT.CHAR (LOGAND (IPLUS (\, S) (FOLDLO (LOGAND (\, S) 192) 64)) (MASK.1'S 0 6))))) (DEFMACRO \DIGEST.INCREMENT.SEQNO (KERMITSTATE) (BQUOTE (change (fetch (KERMITSTATE CURRENTSEQNO) of (\, KERMITSTATE)) (IMOD (ADD1 DATUM) 64)))) ) (RPAQQ DIGEST.PACKET.TYPES ((DIGEST.DATA.PACKET (CHARCODE D)) (DIGEST.ACK.PACKET (CHARCODE Y)) (DIGEST.NAK.PACKET (CHARCODE N)) (DIGEST.SENDINIT.PACKET (CHARCODE S)) (DIGEST.BREAK.PACKET (CHARCODE B)) (DIGEST.FILEHEADER.PACKET (CHARCODE F)) (DIGEST.EOF.PACKET (CHARCODE Z)) (DIGEST.ERROR.PACKET (CHARCODE E)) (DIGEST.ILLEGAL.PACKET (CHARCODE T)) (DIGEST.GENERIC.SERVER.COMMAND (CHARCODE G)))) (RPAQQ \DIGEST.INIT.PARAMETER.OFFSETS ((\KPARM.MAXL 1) (\KPARM.TIME 2) (\KPARM.NPAD 3) (\KPARM.PADC 4) (\KPARM.EOL 5) (\KPARM.QCTL 6) (\KPARM.QBIN 7))) (RPAQQ \DIGESTOVLEN 5) (DEFINEQ (DIGEST.FILE (LAMBDA (INPUTFILE OUTPUTFILE) (* ejs: " 3-Jan-86 17:01") (* * Send a file to a remote kermit) (COND ((AND (SETQ INPUTFILE (INFILEP INPUTFILE)) OUTPUTFILE) (LET* ((KERMITSTATE (create KERMITSTATE EOL _(CHARCODE EOL) EOLCONVENTION _ NIL))) (\DIGEST.FILE.FOR.TRANSMISSION INPUTFILE OUTPUTFILE KERMITSTATE))) (OUTPUTFILE (ERROR "Can't find input file"))))) (\DIGEST.FILE.FOR.TRANSMISSION (LAMBDA (LOCALFILE REMOTEFILE KERMITSTATE) (* ejs: " 3-Jan-86 17:04") (* * Send a file) (LET ((OUTPUTSTREAM (COND ((STREAMP REMOTEFILE) REMOTEFILE) (T (OPENSTREAM REMOTEFILE (QUOTE OUTPUT) (QUOTE NEW) (QUOTE ((TYPE BINARY) (SEQUENTIAL T))))))) INPUTSTREAM) (\DIGEST.INITIALIZE KERMITSTATE OUTPUTSTREAM (QUOTE STORE)) (COND ((\DIGEST.PREAMBLE KERMITSTATE) (SETQ INPUTSTREAM (OPENSTREAM LOCALFILE (QUOTE INPUT) (QUOTE OLD) (QUOTE ((TYPE BINARY) (SEQUENTIAL T))))) (RESETLST (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (STREAM) (CLOSEF? STREAM))) INPUTSTREAM)) (\DIGEST.SEND.HEADER LOCALFILE KERMITSTATE) (\DIGEST.SEND.FILE.BYTES INPUTSTREAM KERMITSTATE)) (replace (KERMITSTATE STATE) of KERMITSTATE with (QUOTE COMPLETE))))))) (\DIGEST.INITIALIZE (LAMBDA (KERMITSTATE OUTPUTSTREAM FORWHAT) (* ejs: " 3-Jan-86 17:09") (with KERMITSTATE KERMITSTATE (SETQ CURRENTSEQNO 0) (SETQ OUTSTREAM OUTPUTSTREAM) (SETQ QBIN (CHARCODE &)) (SELECTQ FORWHAT (RECEIVE (SETQ STATE (QUOTE REC.INIT))) (STORE (SETQ STATE (QUOTE SEND.INIT))) (ERROR "Illegal Kermit operation" FORWHAT)) KERMITSTATE))) (\DIGEST.PREAMBLE (LAMBDA (KERMITSTATE) (* ejs: " 3-Jan-86 16:54") (LET (PARAMETER.PACKET) (SELECTQ (fetch (KERMITSTATE STATE) of KERMITSTATE) (REC.INIT (SETQ PARAMETER.PACKET (\KERMIT.GET.PACKET KERMITSTATE)) (SELECTC (NTHCHARCODE PARAMETER.PACKET KERMIT.PACKET.TYPE) (KERMIT.SENDINIT.PACKET (\KERMIT.PARSE.REMOTE.PARAMETERS PARAMETER.PACKET KERMITSTATE)) (KERMIT.ERROR.PACKET (HELP (\KERMIT.DATASECTION PARAMETER.PACKET))) (ERROR "Unexpected packet type: " PARAMETER.PACKET)) (LET ((QBIN (fetch (KERMITSTATE QBIN) of KERMITSTATE))) (SELECTC QBIN ((CHARCODE N) (replace (KERMITSTATE QBIN) of KERMITSTATE with NIL)) ((CHARCODE Y) (replace (KERMITSTATE QBIN) of KERMITSTATE with (CHARCODE &))) (COND ((OR (AND (GEQ QBIN 33) (LEQ QBIN 62)) (AND (GEQ QBIN 96) (LEQ QBIN 126))) (replace (KERMITSTATE QBIN) of KERMITSTATE with QBIN))))) (\DIGEST.SEND.PARAMETERS KERMITSTATE) (replace (KERMITSTATE STATE) of KERMITSTATE with (QUOTE REC.FILE))) (SEND.INIT (\DIGEST.SEND.PARAMETERS KERMITSTATE) (replace (KERMITSTATE STATE) of KERMITSTATE with (QUOTE SEND.FILE))) (HELP "Illegal Kermit state" (fetch (KERMITSTATE STATE) of KERMITSTATE)))))) (\DIGEST.SEND.FILE.BYTES (LAMBDA (FILESTREAM KERMITSTATE) (* ejs: " 3-Jan-86 17:02") (* * Send all the bytes of file) (replace (STREAM ENDOFSTREAMOP) of FILESTREAM with (FUNCTION (LAMBDA NIL -1))) (bind (PACKET _(ALLOCSTRING (fetch (KERMITSTATE MAXL) of KERMITSTATE))) (QCTL _(fetch (KERMITSTATE QCTL) of KERMITSTATE)) (QBIN _(fetch (KERMITSTATE QBIN) of KERMITSTATE)) DONE CHAR MASKEDCHAR DATASECTION FILLEDATASECTION MAXCHARS CHARINDEX first (SETQ DATASECTION (\KERMIT.DATASECTION PACKET)) (SETQ MAXCHARS (NCHARS DATASECTION)) until DONE as I from 1 do (for old CHARINDEX from 1 to MAXCHARS do (SETQ CHAR (BIN FILESTREAM)) (COND ((EQ -1 CHAR) (SETQ DONE T) (RETURN))) (COND ((AND QBIN (IGREATERP CHAR (MASK.1'S 0 7))) (SETQ MASKEDCHAR (LOGAND CHAR (MASK.1'S 0 7))) (COND ((OR (EQ CHARINDEX MAXCHARS) (AND (EQ CHARINDEX (SUB1 MAXCHARS)) (OR (ILESSP MASKEDCHAR (CHARCODE SPACE)) (EQ MASKEDCHAR QBIN) (EQ MASKEDCHAR QCTL) (EQ MASKEDCHAR (CHARCODE DEL))))) (* No room for possible quoted and controlified  character) (SETQ WAITINGCHAR CHAR) (RETURN))) (RPLCHARCODE DATASECTION CHARINDEX QBIN) (SETQ CHAR (LOGAND CHAR (MASK.1'S 0 7))) (add CHARINDEX 1))) (COND ((OR (ILESSP CHAR (CHARCODE SPACE)) (EQ CHAR QBIN) (EQ CHAR QCTL) (EQ CHAR (CHARCODE DEL))) (COND ((EQ CHARINDEX MAXCHARS) (* No room for both prefix and controlified character) (SETQ WAITINGCHAR CHAR) (RETURN))) (RPLCHARCODE DATASECTION CHARINDEX QCTL) (COND ((OR (EQ CHAR QBIN) (EQ CHAR QCTL))) (T (SETQ CHAR (\KERMIT.CTL CHAR)))) (add CHARINDEX 1))) (RPLCHARCODE DATASECTION CHARINDEX CHAR)) (SETQ FILLEDATASECTION (SUBSTRING DATASECTION 1 (SUB1 CHARINDEX) FILLEDATASECTION)) (COND ((NEQ 0 (NCHARS FILLEDATASECTION)) (\DIGEST.SEND.PACKET FILLEDATASECTION KERMIT.DATA.PACKET KERMITSTATE)) ((NOT DONE) (ERROR "No characters to send, but not done either." KERMITSTATE)))))) (\DIGEST.SEND.HEADER (LAMBDA (FILENAME KERMITSTATE) (* ejs: " 3-Jan-86 16:41") (* * Receive the file header, open the file according to TYPE, and return) (\DIGEST.SEND.PACKET (PACKFILENAME.STRING (QUOTE NAME) (FILENAMEFIELD FILENAME (QUOTE NAME)) (QUOTE EXTENSION) (FILENAMEFIELD FILENAME (QUOTE EXTENSION))) DIGEST.FILEHEADER.PACKET KERMITSTATE) (replace (KERMITSTATE STATE) of KERMITSTATE with (QUOTE SEND.DATA)))) (\DIGEST.SEND.PACKET (LAMBDA (CONTENTS TYPE KERMITSTATE SEQNO) (* ejs: " 3-Jan-86 16:40") (* * Send a packet and wait for the response) (DECLARE (USEDFREE KERMITSTATUSWINDOW)) (LET ((OUTSTREAM (fetch (KERMITSTATE OUTSTREAM) of KERMITSTATE)) (CURRENTSEQNO (fetch (KERMITSTATE CURRENTSEQNO) of KERMITSTATE)) ANSWER.PACKET LENGTH SEQ ANSWER.TYPE CHAR (CHECKSUM 0)) (\DIGEST.SEND.STRING CONTENTS TYPE KERMITSTATE SEQNO) (\DIGEST.INCREMENT.SEQNO KERMITSTATE)))) (\DIGEST.SEND.PARAMETERS (LAMBDA (KERMITSTATE) (* ejs: " 3-Jan-86 16:51") (LET ((MYPARAMETERS (ALLOCSTRING (CONSTANT (LENGTH \DIGEST.INIT.PARAMETER.OFFSETS))))) (RPLCHARCODE MYPARAMETERS \KPARM.MAXL (\KERMIT.CHAR 72)) (RPLCHARCODE MYPARAMETERS \KPARM.TIME (\KERMIT.CHAR 10)) (RPLCHARCODE MYPARAMETERS \KPARM.NPAD (\KERMIT.CHAR 0)) (RPLCHARCODE MYPARAMETERS \KPARM.PADC (\KERMIT.CHAR 0)) (RPLCHARCODE MYPARAMETERS \KPARM.EOL (\KERMIT.CHAR 0)) (RPLCHARCODE MYPARAMETERS \KPARM.QCTL (CHARCODE #)) (RPLCHARCODE MYPARAMETERS \KPARM.QBIN (CHARCODE &)) (SELECTQ (fetch (KERMITSTATE STATE) of KERMITSTATE) (REC.INIT (\DIGEST.SEND.PACKET MYPARAMETERS KERMIT.ACK.PACKET KERMITSTATE)) (SEND.INIT (\DIGEST.SEND.PACKET MYPARAMETERS DIGEST.SENDINIT.PACKET KERMITSTATE) ) (ERROR "Illegal Kermit state"))))) (\DIGEST.SEND.STRING (LAMBDA (STRING TYPE KERMITSTATE SEQNO) (* ejs: " 3-Jan-86 16:44") (* * Send a string of data to the remote kermit. The string MUST have been prefixified already) (LET* ((STREAM (fetch (KERMITSTATE OUTSTREAM) of KERMITSTATE)) (LENGTH (NCHARS STRING)) (PACKET (ALLOCSTRING (IPLUS LENGTH \DIGESTOVLEN))) (CHECKSUM 0) TEMP) (RPLCHARCODE PACKET KERMIT.PACKET.MARK (fetch (KERMITSTATE MARKCHAR) of KERMITSTATE)) (RPLCHARCODE PACKET KERMIT.PACKET.LEN (SETQ CHECKSUM (\DIGEST.CHAR (IPLUS LENGTH (CONSTANT (IDIFFERENCE \DIGESTOVLEN KERMIT.PACKET.LEN))))) ) (SETQ TEMP (\DIGEST.CHAR (OR SEQNO (fetch (KERMITSTATE CURRENTSEQNO) of KERMITSTATE) ))) (add CHECKSUM TEMP) (RPLCHARCODE PACKET KERMIT.PACKET.SEQ TEMP) (add CHECKSUM TYPE) (RPLCHARCODE PACKET KERMIT.PACKET.TYPE TYPE) (COND ((NEQ 0 LENGTH) (bind CHAR for I from \DIGESTOVLEN to (IPLUS LENGTH (CONSTANT (SUB1 \DIGESTOVLEN))) as J from 1 to LENGTH do (SETQ CHAR (NTHCHARCODE STRING J)) (COND ((ILESSP CHAR (CHARCODE SPACE)) (ERROR "Call to \KERMIT.SEND.STRING with unprefixed characters: " STRING)) ) (add CHECKSUM CHAR) (RPLCHARCODE PACKET I CHAR)))) (RPLCHARCODE PACKET (NCHARS PACKET) (\DIGEST.DEFAULT.CHECKSUM CHECKSUM)) (\DIGEST.WRITE PACKET KERMITSTATE) (replace (KERMITSTATE LASTPACKETOUT) of KERMITSTATE with PACKET) PACKET))) (\DIGEST.WRITE (LAMBDA (STRING KERMITSTATE) (* ejs: " 3-Jan-86 17:07") (* * Sends STRING out on STREAM with FORCEOUTPUT) (LET ((STREAM (fetch (KERMITSTATE OUTSTREAM) of KERMITSTATE)) PADC) (PRIN3 STRING STREAM) (TERPRI STREAM)))) ) [DECLARE: EVAL@COMPILE (DATATYPE KERMITSTATE ((LASTPACKETIN POINTER) (LASTPACKETOUT POINTER) (STATE POINTER) (INSTREAM POINTER) (OUTSTREAM POINTER) (EOLCONVENTION POINTER) (EOL POINTER) (QBIN POINTER) (TIME FIXP) (CURRENTSEQNO BYTE) (MARKCHAR BYTE) (MAXL BYTE) (NPAD BYTE) (PADC BYTE) (QCTL BYTE) (CHKT BYTE) (REPT BYTE)) CURRENTSEQNO _ 0 MARKCHAR _ KERMIT.DEFAULT.MARK.CHARACTER MAXL _ KERMIT.DEFAULT.RECV.PACKET.SIZE TIME _ KERMIT.DEFAULT.TIMEOUT.TIME NPAD _ KERMIT.DEFAULT.PAD.CHARS PADC _ KERMIT.DEFAULT.PAD.CHARACTER QCTL _ KERMIT.DEFAULT.PREFIX.CHARACTER EOL _ KERMIT.DEFAULT.EOL.CHARACTER) ] (/DECLAREDATATYPE (QUOTE KERMITSTATE) (QUOTE (POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER FIXP BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE)) (QUOTE ((KERMITSTATE 0 POINTER) (KERMITSTATE 2 POINTER) (KERMITSTATE 4 POINTER) (KERMITSTATE 6 POINTER) (KERMITSTATE 8 POINTER) (KERMITSTATE 10 POINTER) (KERMITSTATE 12 POINTER) (KERMITSTATE 14 POINTER) (KERMITSTATE 16 FIXP) (KERMITSTATE 14 (BITS . 7)) (KERMITSTATE 12 (BITS . 7)) (KERMITSTATE 10 (BITS . 7)) (KERMITSTATE 8 (BITS . 7)) (KERMITSTATE 6 (BITS . 7)) (KERMITSTATE 4 (BITS . 7)) (KERMITSTATE 2 (BITS . 7)) (KERMITSTATE 0 (BITS . 7)))) (QUOTE 18)) (PUTPROPS DIGEST COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (2343 12905 (DIGEST.FILE 2353 . 2857) (\DIGEST.FILE.FOR.TRANSMISSION 2859 . 3909) ( \DIGEST.INITIALIZE 3911 . 4383) (\DIGEST.PREAMBLE 4385 . 6032) (\DIGEST.SEND.FILE.BYTES 6034 . 8644) ( \DIGEST.SEND.HEADER 8646 . 9203) (\DIGEST.SEND.PACKET 9205 . 9765) (\DIGEST.SEND.PARAMETERS 9767 . 10781) (\DIGEST.SEND.STRING 10783 . 12574) (\DIGEST.WRITE 12576 . 12903))))) STOP \ No newline at end of file diff --git a/lispusers/DIGI-CLOCK b/lispusers/DIGI-CLOCK new file mode 100644 index 00000000..b3b4e7e0 --- /dev/null +++ b/lispusers/DIGI-CLOCK @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) (FILECREATED "15-Mar-89 16:24:43" {ERIS}DOC>HACKS>DIGI-CLOCK.\;5 50813 |changes| |to:| (VARS DIGI-CLOCKCOMS) (FNS DC-DELETE-ALARM-SETTING DIGI-CLOCK DC-KILL-PROCESS DC-PROMPT-FOR-ALARM-MESSAGE DC-START-PROCESS DC-ADD-AUXW DC-SHAPE-TO-FIT DC-SET-ALARM) |previous| |date:| "22-Feb-89 16:50:15" {ERIS}DOC>HACKS>DIGI-CLOCK.\;4) ; Copyright (c) 1988, 1989 by XEROX Corporation. All rights reserved. (PRETTYCOMPRINT DIGI-CLOCKCOMS) (RPAQQ DIGI-CLOCKCOMS ( (* |;;| "Top level functions") (FNS DIGI-CLOCK DC-START-PROCESS DC-KILL-PROCESS DC-BUTTONEVENTFN DC-AUXW-BUTTONEVENTFN DC-SET-TIME-BUTTONEVENTFN ST) (* |;;| "Dc-buttoneventfns") (FNS DC-PROCESS DC-UPDATE DC-GET-OPERATION) (* |;;| "Auxw functions") (FNS DC-AUXW-GET-OPERATION DC-ADD-AUXW DC-DELETE-AUXW DC-AUXW-UPDATE) (* |;;| "Set time functions") (FNS DC-WARNING-TIME-NOT-SET) (FNS DC-SET-TIME DC-UPDATE-TIME-ITEM DC-VALID-DATE-P DC-SET-LAST-DAY-FOR-MONTH) (FNS DC-INITIALIZE-SET-TIME-MENU DC-MAKE-NEW-SET-TIME-MENU DC-OPEN-SET-TIME-MENUW) (FNS DC-EXTRACT-STARTING-SET-TIME-DATE DC-SET-TIME-MAKE-DATE-STRING) (FNS DC-SET-TIME-ZONE-HEADING DC-SET-TIME-ZONE DC-GET-TIME-ZONE) (* |;;| "Alarm functions") (FNS DC-SET-ALARM DC-ADD-ALARM-SETTING DC-DELETE-ALARM-SETTING) (FNS DC-ALARM-DUE-TO-RING? DC-RING-ALARM DC-TURN-ALARM-OFF) (FNS DC-PROMPT-FOR-ALARM-MESSAGE DC-GET-MESSAGE-WINDOW DC-CLOSE-MESSAGE-WINDOW) (* |;;| "Display & Misc functions") (FNS DC-DISPLAY-TIME DC-MAKE-DISPLAY-TIME-STRING DC-PRINT-JUSTIFIED-STRING DC-CONVERT-DATE-FORMAT DC-SHAPE-TO-FIT DC-GET-DATE DC-MENU-POSITION) (* |;;| "Font functions") (FNS DC-SET-FONT DC-FONT-FAMILY-MENU DC-FONT-SIZE-MENU DC-FONT-FACE-MENU) (* |;;| "List of the world's time zones") (VARS *DC-TIME-ZONE-LIST*) (* |;;| "Call digi-clock ") )) (* |;;| "Top level functions") (DEFINEQ (DIGI-CLOCK (LAMBDA (RESTART-FROM-SCRATCH) (* \; "Edited 22-Feb-89 16:21 by Mountford") (|if| (FIND.PROCESS "DIGITAL CLOCK") |then| (DEL.PROCESS "DIGITAL CLOCK")) (|if| (NOT (MEMBER "DIGITAL CLOCK" IDLE.SUSPEND.PROCESS.NAMES)) |then| (|push| IDLE.SUSPEND.PROCESS.NAMES "DIGITAL CLOCK")) (BLOCK) (ADD.PROCESS (LIST 'DC-START-PROCESS RESTART-FROM-SCRATCH) 'NAME "DIGITAL CLOCK" 'RESTARTABLE T))) (DC-START-PROCESS (LAMBDA (RESTART-FROM-SCRATCH) (* \; "Edited 17-Feb-89 16:04 by Mountford") (|if| (GREATERP (IDATE) 0) |then| (SETQ *DC-OLD-DATE* (DATE)) |else| (SETQ *DC-OLD-DATE* " 1-Jan-88 08:00:00")) (|if| (BOUNDP '*DC-WINDOW*) |then| (WINDOWPROP *DC-WINDOW* 'CLOSEFN (REMOVE 'DC-KILL-PROCESS (WINDOWPROP *DC-WINDOW* 'CLOSEFN))) (CLOSEW *DC-WINDOW*) (WINDOWPROP *DC-WINDOW* 'CLOSEFN 'DC-KILL-PROCESS)) (|if| (OR RESTART-FROM-SCRATCH (NOT (BOUNDP '*DC-WINDOW*)) (NULL *DC-WINDOW*)) |then| (SETQ *DC-WINDOW* (CREATEW (CREATEREGION 1 (IDIFFERENCE SCREENHEIGHT 46) 430 46))) (WINDOWPROP *DC-WINDOW* 'RESHAPEFN 'DON\'T) (SETQ *DC-DATEFORMAT* (DATEFORMAT SPACES NO.SECONDS DAY.OF.WEEK DAY.SHORT)) (WINDOWPROP *DC-WINDOW* 'BUTTONEVENTFN 'DC-BUTTONEVENTFN) (WINDOWPROP *DC-WINDOW* 'CLOSEFN 'DC-KILL-PROCESS) (SETQ *DC-AUXW-FONT* (FONTCREATE 'HELVETICA 18)) (SETQ *DC-FONT* (FONTCREATE 'HELVETICA 36)) (WINDOWPROP *DC-WINDOW* 'ALARM-MODE 'LOUD) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE T) (DSPFONT *DC-FONT* *DC-WINDOW*) (DC-ADD-AUXW)) (DC-PROCESS))) (DC-KILL-PROCESS (LAMBDA NIL (* \; "Edited 22-Feb-89 16:16 by Mountford") (|if| (FIND.PROCESS "DIGITAL CLOCK") |then| (DEL.PROCESS "DIGITAL CLOCK")))) (DC-BUTTONEVENTFN (LAMBDA (WINDOW) (* \; "Edited 15-Aug-88 07:01 by Mountford") (|if| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE) |then| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE NIL) (TOTOPW WINDOW) (|if| (MOUSESTATE MIDDLE) |then| (SELECTQ (DC-GET-OPERATION) (* \; "") (|Set Font| (|if| (DC-SET-FONT) |then| (DC-UPDATE (IDATE)))) (|Set Time| (DC-SET-TIME)) (|Set Alarm| (DC-SET-ALARM)) (|Turn Alarm Off| (DC-TURN-ALARM-OFF) (DC-UPDATE (IDATE))) (|Delete Alarm Setting| (DC-DELETE-ALARM-SETTING)) (|Quiet Alarm| (WINDOWPROP *DC-WINDOW* 'ALARM-MODE 'QUIET)) (|Loud Alarm| (WINDOWPROP *DC-WINDOW* 'ALARM-MODE 'LOUD)) (|12-Hour Clock| (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE T) (DC-UPDATE (IDATE))) (|24-Hour Clock| (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE NIL) (DC-UPDATE (IDATE))) (|Set Local Time Zone| (DC-PRINT-JUSTIFIED-STRING *DC-WINDOW* "Select Local Time Zone" 'CENTER 'CLEARW) (DC-SET-TIME-ZONE WINDOW) (DC-UPDATE (IDATE))) (|Add New Regional Time Zone| (DC-ADD-AUXW)) (|Shape to Fit| (DC-SHAPE-TO-FIT *DC-WINDOW* (DC-MAKE-DISPLAY-TIME-STRING (DATE *DC-DATEFORMAT*) (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE ))) (DC-UPDATE (IDATE))) NIL)) (|if| (MOUSESTATE LEFT) |then| (DC-UPDATE (IDATE))) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE T)))) (DC-AUXW-BUTTONEVENTFN (LAMBDA (WINDOW) (* \; "Edited 2-Sep-88 15:45 by Mountford") (|if| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE) |then| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE NIL) (TOTOPW WINDOW) (|if| (MOUSESTATE MIDDLE) |then| (SELECTQ (DC-AUXW-GET-OPERATION) (* \; "") (|Set Font for Aux Clocks| (|if| (DC-SET-FONT WINDOW 'ALL-AUXW) |then| (DC-UPDATE (IDATE)))) (|Set Aux Clock Font In Just This Window| (|if| (DC-SET-FONT WINDOW) |then| (DC-UPDATE (IDATE)))) (|Delete This Window| (DC-DELETE-AUXW WINDOW)) (|Set Time-Zone Heading| (DC-SET-TIME-ZONE-HEADING WINDOW) (DC-UPDATE (IDATE))) (|Set Regional Time Zone| (DC-SET-TIME-ZONE WINDOW) (DC-UPDATE (IDATE))) NIL)) (|if| (MOUSESTATE LEFT) |then| (DC-UPDATE (IDATE))) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE T)))) (DC-SET-TIME-BUTTONEVENTFN (LAMBDA (ITEM MENU BUTTON) (* \; "Edited 15-Aug-88 07:16 by Mountford") (LET (DISPLAY-TIME) (COND ((EQ ITEM '|Set|) (CLOSEW *DC-SET-TIME-MENUW*) (|if| (WINDOWPROP *DC-SET-TIME-WINDOW* 'SETTING-ALARM) |then| (DC-ADD-ALARM-SETTING (DC-SET-TIME-MAKE-DATE-STRING)) |else| (SETTIME (DC-SET-TIME-MAKE-DATE-STRING)) (SETQ *DC-OLD-DATE* (DATE)) (|until| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE) |do| (BLOCK 1000)) (DC-UPDATE (IDATE)))) ((EQ ITEM '|Esc|) (CLOSEW *DC-SET-TIME-MENUW*)) (T (DC-UPDATE-TIME-ITEM ITEM) (SETQ DISPLAY-TIME (DC-CONVERT-DATE-FORMAT (DC-SET-TIME-MAKE-DATE-STRING) '(DATEFORMAT NO.SECONDS))) (SETQ DISPLAY-TIME (DC-MAKE-DISPLAY-TIME-STRING DISPLAY-TIME (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE))) (DC-PRINT-JUSTIFIED-STRING *DC-SET-TIME-WINDOW* DISPLAY-TIME 'CENTERED 'CLEARW)))))) (ST (LAMBDA (HOUR MINUTE DATE MONTH YEAR) (* \; "Edited 25-Jul-88 11:45 by Mountford") (|if| (NOT (BOUNDP '*DC-OLD-DATE*)) |then| (SETQ *DC-OLD-DATE* " 1-Jan-88 08:00:00")) (|if| (NOT HOUR) |then| (SETTIME *DC-OLD-DATE*) |else| (|if| (NOT MINUTE) |then| (SETQ MINUTE 0)) (|if| (NOT DATE) |then| (SETQ DATE (SUBSTRING *DC-OLD-DATE* 1 2))) (|if| (NOT MONTH) |then| (SETQ MONTH (SUBSTRING *DC-OLD-DATE* 4 6))) (|if| (NOT YEAR) |then| (SETQ YEAR (SUBSTRING *DC-OLD-DATE* 8 9))) (SETTIME (CONCAT MONTH "-" DATE "-" YEAR " " HOUR ":" MINUTE))) (CLRPROMPT) (SETQ *DC-OLD-DATE* (DATE)))) ) (* |;;| "Dc-buttoneventfns") (DEFINEQ (DC-PROCESS (LAMBDA NIL (* \; "Edited 15-Aug-88 06:52 by Mountford") (PROG NIL TOP (|if| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE) |then| (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE NIL) (DC-UPDATE (IDATE)) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE T)) (BLOCK 60000) (* \; "BLOCK FOR A MINUTE") (GO TOP)))) (DC-UPDATE (LAMBDA (ITIME) (* \; "Edited 15-Aug-88 08:13 by Mountford") (LET ((MERIDIAN (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE)) (AUX-CLOCKS (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS))) (|if| (IGREATERP ITIME 0) |then| (DC-DISPLAY-TIME ITIME MERIDIAN) (|if| (DC-ALARM-DUE-TO-RING? ITIME) |then| (DC-RING-ALARM) (SETQ AUX-CLOCKS (CDR AUX-CLOCKS))) (|for| WINDOW |in| AUX-CLOCKS |do| (DC-AUXW-UPDATE ITIME MERIDIAN WINDOW)) |else| (DC-WARNING-TIME-NOT-SET))))) (DC-GET-OPERATION (LAMBDA NIL (* \; "Edited 13-Aug-88 10:40 by Mountford") (LET ((MENU-LIST (LIST '|Set Font| '|Set Time| '|Set Alarm| (|if| (EQ (WINDOWPROP *DC-WINDOW* 'ALARM-MODE) 'QUIET) |then| '|Loud Alarm| |else| '|Quiet Alarm|) (COND ((WINDOWPROP *DC-WINDOW* 'ALARM-RINGING) '|Turn Alarm Off|) ((WINDOWPROP *DC-WINDOW* 'ALARM-LIST) '|Delete Alarm Setting|) (T '||)) '|Shape to Fit| (|if| (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE) |then| '|24-Hour Clock| |else| '|12-Hour Clock|) '|Set Local Time Zone| '|Add New Regional Time Zone|))) (MENU (|create| MENU ITEMS _ MENU-LIST CENTERFLG _ T))))) ) (* |;;| "Auxw functions") (DEFINEQ (DC-AUXW-GET-OPERATION (LAMBDA NIL (* \; "Edited 2-Sep-88 13:53 by Mountford") (MENU (|create| MENU ITEMS _ '(|Delete This Window| (|Set Font for Aux Clocks| '|Set Font for Aux Clocks| NIL (SUBITEMS |Set Aux Clock Font In Just This Window| )) |Set Time-Zone Heading| |Set Regional Time Zone|) CENTERFLG _ T)))) (DC-ADD-AUXW (LAMBDA NIL (* \; "Edited 17-Feb-89 16:08 by Mountford") (LET ((AUXW) (ITIME (IDATE)) (MERIDIAN (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE)) (WINDOW-HEIGHT (HEIGHTIFWINDOW (FONTPROP *DC-AUXW-FONT* 'HEIGHT)))) (SETQ AUXW (CREATEW (CREATEREGION 1 (IDIFFERENCE SCREENHEIGHT WINDOW-HEIGHT) 430 WINDOW-HEIGHT) NIL NIL T)) (ATTACHWINDOW AUXW *DC-WINDOW* 'BOTTOM 'JUSTIFY) (DSPFONT *DC-AUXW-FONT* AUXW) (DC-PRINT-JUSTIFIED-STRING AUXW "Select Time Zone for this Window" 'CENTER 'CLEARW) (|if| (DC-SET-TIME-ZONE AUXW) |then| (WINDOWPROP AUXW 'BUTTONEVENTFN 'DC-AUXW-BUTTONEVENTFN) (DC-SHAPE-TO-FIT *DC-WINDOW* (DC-MAKE-DISPLAY-TIME-STRING (GDATE ITIME *DC-DATEFORMAT* ) MERIDIAN)) (|if| (IGREATERP ITIME 0) |then| (DC-AUXW-UPDATE ITIME MERIDIAN AUXW) |else| (DC-AUXW-UPDATE (IDATE *DC-OLD-DATE*) MERIDIAN AUXW)) |else| (DETACHWINDOW AUXW) (CLOSEW AUXW))))) (DC-DELETE-AUXW (LAMBDA (WINDOW) (* \; "Edited 25-Jul-88 06:59 by Mountford") (DETACHWINDOW WINDOW) (CLOSEW WINDOW) (LET ((WINDOW-LIST (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS))) (|for| W |in| WINDOW-LIST |do| (DETACHWINDOW W)) (|for| W |in| WINDOW-LIST |do| (ATTACHWINDOW W *DC-WINDOW* 'BOTTOM 'JUSTIFY))))) (DC-AUXW-UPDATE (LAMBDA (ITIME MERIDIAN WINDOW) (* \; "Edited 13-Aug-88 11:20 by Mountford") (LET ((LOCATION (WINDOWPROP WINDOW 'LOCATION)) (TIME-OFFSET (WINDOWPROP WINDOW 'TIME-ZONE-OFFSET)) REGIONAL-TIME DISPLAY-TIME) (SETQ REGIONAL-TIME (DC-GET-DATE *DC-DATEFORMAT* ITIME TIME-OFFSET)) (SETQ DISPLAY-TIME (DC-MAKE-DISPLAY-TIME-STRING REGIONAL-TIME MERIDIAN)) (DC-PRINT-JUSTIFIED-STRING WINDOW LOCATION 'LEFT 'CLEARW) (DC-PRINT-JUSTIFIED-STRING WINDOW DISPLAY-TIME 'RIGHT) DISPLAY-TIME))) ) (* |;;| "Set time functions") (DEFINEQ (DC-WARNING-TIME-NOT-SET (LAMBDA NIL (* \; "Edited 15-Aug-88 06:42 by Mountford") (LET ((WINDOWS (CONS *DC-WINDOW* (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS)))) (DC-PRINT-JUSTIFIED-STRING *DC-WINDOW* "Time not set." 'CENTER 'CLEARW) (|for| I |to| 10 |do| (|for| W |in| WINDOWS |do| (BLOCK 100) (INVERTW W) (BLOCK 100) (INVERTW W)))))) ) (DEFINEQ (DC-SET-TIME (LAMBDA NIL (* \; "Edited 25-Jul-88 07:25 by Mountford") (DC-INITIALIZE-SET-TIME-MENU) (WINDOWPROP *DC-SET-TIME-WINDOW* 'SETTING-ALARM NIL))) (DC-UPDATE-TIME-ITEM (LAMBDA (ITEM) (* \; "Edited 1-Aug-88 06:23 by Mountford") (LET ((CHANGE (CAR ITEM)) (ITEM (CADR ITEM))) (|if| (EQ CHANGE '+) |then| (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM (ADD1 (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM ))) (|if| (NOT (DC-VALID-DATE-P (DC-SET-TIME-MAKE-DATE-STRING))) |then| (COND ((EQ ITEM 'DY) (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY 1)) ((EQ ITEM 'MO) (|if| (IGREATERP (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO) 12) |then| (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO 1) |else| (DC-SET-LAST-DAY-FOR-MONTH))) ((EQ ITEM 'YR) (WINDOWPROP *DC-SET-TIME-WINDOW* 'YR 1)) ((OR (EQ ITEM 'HR) (EQ ITEM 'MIN)) (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM 0)) (T (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM (SUB1 (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM)))))) |else| (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM (SUB1 (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM)) ) (|if| (NOT (DC-VALID-DATE-P (DC-SET-TIME-MAKE-DATE-STRING))) |then| (COND ((EQ ITEM 'DY) (DC-SET-LAST-DAY-FOR-MONTH)) ((EQ ITEM 'MO) (|if| (ILESSP (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO) 1) |then| (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO 12) |else| (DC-SET-LAST-DAY-FOR-MONTH))) ((EQ ITEM 'YR) (WINDOWPROP *DC-SET-TIME-WINDOW* 'YR 99)) ((EQ ITEM 'HR) (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM 23)) ((EQ ITEM 'MIN) (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM 59)) (T (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM (ADD1 (WINDOWPROP *DC-SET-TIME-WINDOW* ITEM)))))))))) (DC-VALID-DATE-P (LAMBDA (DATE-STRING) (* \; "Edited 23-Jul-88 10:56 by Mountford") (|if| (IDATE DATE-STRING) |then| DATE-STRING))) (DC-SET-LAST-DAY-FOR-MONTH (LAMBDA NIL (* \; "Edited 31-Jul-88 14:54 by Mountford") (SELECTQ (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO) (2 (|if| (ZEROP (IREMAINDER (WINDOWPROP *DC-SET-TIME-WINDOW* 'YR) 4)) |then| (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY 29) |else| (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY 28))) ((4 6 9 11) (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY 30)) ((1 3 5 7 8 10 12) (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY 31)) NIL))) ) (DEFINEQ (DC-INITIALIZE-SET-TIME-MENU (LAMBDA NIL (* \; "Edited 14-Aug-88 21:35 by Mountford") (|if| (OR (NOT (BOUNDP '*DC-SET-TIME-MENUW*)) (NULL *DC-SET-TIME-MENUW*)) |then| (DC-MAKE-NEW-SET-TIME-MENU)) (LET ((MERIDIAN (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE)) DATE-STRING DISPLAY-TIME) (|if| (IGREATERP (IDATE *DC-OLD-DATE*) (IDATE)) |then| (SETQ DATE-STRING (DC-CONVERT-DATE-FORMAT *DC-OLD-DATE* '(NUMBER.OF.MONTH NO.SECONDS))) (SETQ DISPLAY-TIME (DC-CONVERT-DATE-FORMAT *DC-OLD-DATE* '(NO.SECONDS))) |else| (SETQ DATE-STRING (DATE (DATEFORMAT NUMBER.OF.MONTH NO.SECONDS))) (SETQ DISPLAY-TIME (DATE (DATEFORMAT NO.SECONDS)))) (SETQ DISPLAY-TIME (DC-MAKE-DISPLAY-TIME-STRING DISPLAY-TIME MERIDIAN)) (DC-OPEN-SET-TIME-MENUW) (DC-PRINT-JUSTIFIED-STRING *DC-SET-TIME-WINDOW* DISPLAY-TIME 'CENTERED 'CLEARW) (DC-EXTRACT-STARTING-SET-TIME-DATE DATE-STRING)))) (DC-MAKE-NEW-SET-TIME-MENU (LAMBDA NIL (* \; "Edited 31-Dec-00 16:10 by Mountford") (LET ((TITLE-FONT (FONTCREATE 'HELVETICA 12)) (MENU-FONT (FONTCREATE 'HELVETICA 18))) (SETQ *DC-SET-TIME-MENUW* (ADDMENU (|create| MENU ITEMS _ '((+ DY) (\ - DY) (+ MO) (\ - MO) (+ YR) (\ - YR) (+ HR) (\ - HR) (+ MIN) (\ - MIN) |Set| |Esc|) MENUROWS _ 2 MENUFONT _ MENU-FONT MENUTITLEFONT _ TITLE-FONT TITLE _ "DY MO YR HR MIN SET " WHENSELECTEDFN _ 'DC-SET-TIME-BUTTONEVENTFN))) (SETQ *DC-SET-TIME-WINDOW* (CREATEW (CREATEREGION LASTMOUSEX LASTMOUSEY 120 27) NIL NIL T)) (ATTACHWINDOW *DC-SET-TIME-WINDOW* *DC-SET-TIME-MENUW* 'TOP 'JUSTIFY) (DSPFONT MENU-FONT *DC-SET-TIME-WINDOW*)))) (DC-OPEN-SET-TIME-MENUW (LAMBDA NIL (* \; "Edited 25-Jul-88 07:33 by Mountford") (LET ((CLOCK-REGION (WINDOWPROP *DC-WINDOW* 'REGION))) (|if| (IGREATERP (IPLUS (CAR CLOCK-REGION) (CADDR CLOCK-REGION) 215) SCREENWIDTH) |then| (ATTACHWINDOW *DC-SET-TIME-MENUW* *DC-WINDOW* 'LEFT 'TOP) |else| (ATTACHWINDOW *DC-SET-TIME-MENUW* *DC-WINDOW* 'RIGHT 'TOP)) (DETACHWINDOW *DC-SET-TIME-MENUW*) (OPENW *DC-SET-TIME-MENUW*)))) ) (DEFINEQ (DC-EXTRACT-STARTING-SET-TIME-DATE (LAMBDA (DATE-STRING) (* \; "Edited 4-Aug-88 06:16 by Mountford") (|if| (EQUAL " " (SUBSTRING DATE-STRING 1 1)) |then| (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY (MKATOM (SUBSTRING DATE-STRING 2 2))) |else| (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY (MKATOM (SUBSTRING DATE-STRING 1 2)))) (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO (MKATOM (SUBSTRING DATE-STRING 4 5))) (WINDOWPROP *DC-SET-TIME-WINDOW* 'YR (MKATOM (SUBSTRING DATE-STRING 7 8))) (WINDOWPROP *DC-SET-TIME-WINDOW* 'HR (MKATOM (SUBSTRING DATE-STRING 10 11))) (WINDOWPROP *DC-SET-TIME-WINDOW* 'MIN (MKATOM (SUBSTRING DATE-STRING 13 14))))) (DC-SET-TIME-MAKE-DATE-STRING (LAMBDA NIL (* \; "Edited 25-Jul-88 07:31 by Mountford") (CONCAT (WINDOWPROP *DC-SET-TIME-WINDOW* 'MO) "-" (WINDOWPROP *DC-SET-TIME-WINDOW* 'DY) "-" (WINDOWPROP *DC-SET-TIME-WINDOW* 'YR) " " (WINDOWPROP *DC-SET-TIME-WINDOW* 'HR) ":" (WINDOWPROP *DC-SET-TIME-WINDOW* 'MIN)))) ) (DEFINEQ (DC-SET-TIME-ZONE-HEADING (LAMBDA (WINDOW) (* \; "Edited 20-Jul-88 23:42 by Mountford") (LET ((LOCATION (WINDOWPROP WINDOW 'LOCATION))) (CLEARW WINDOW) (MOVETOUPPERLEFT WINDOW) (WINDOWPROP WINDOW 'LOCATION (PROMPTFORWORD "Location Name: " LOCATION NIL WINDOW NIL 'TTY (CHARCODE (EOL ESCAPE LF TAB))))))) (DC-SET-TIME-ZONE (LAMBDA (WINDOW) (* \; "Edited 25-Jul-88 06:54 by Mountford") (LET ((TIME-ZONE-INFO (DC-GET-TIME-ZONE))) (|if| TIME-ZONE-INFO |then| (|if| (EQ WINDOW *DC-WINDOW*) |then| (SETQ |\\TimeZoneComp| (CDR TIME-ZONE-INFO)) (|for| W |in| (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS) |do| (WINDOWPROP W 'TIME-ZONE-OFFSET (ITIMES 3600 (IDIFFERENCE (WINDOWPROP W 'TIME-ZONE) |\\TimeZoneComp|)))) |else| (WINDOWPROP WINDOW 'LOCATION (CAR TIME-ZONE-INFO)) (WINDOWPROP WINDOW 'TIME-ZONE (CDR TIME-ZONE-INFO)) (WINDOWPROP WINDOW 'TIME-ZONE-OFFSET (ITIMES 3600 (IDIFFERENCE (CDR TIME-ZONE-INFO) |\\TimeZoneComp|))))) TIME-ZONE-INFO))) (DC-GET-TIME-ZONE (LAMBDA NIL (* \; "Edited 20-Jul-88 23:23 by Mountford") (|if| (AND (BOUNDP 'TIME-ZONE-MENU) TIME-ZONE-MENU) |then| (MENU TIME-ZONE-MENU) |else| (MENU (SETQ TIME-ZONE-MENU (|create| MENU TITLE _ "ENTER TIME ZONE" ITEMS _ *DC-TIME-ZONE-LIST* CENTERFLG _ T)))))) ) (* |;;| "Alarm functions") (DEFINEQ (DC-SET-ALARM (LAMBDA NIL (* \; "Edited 17-Feb-89 15:28 by Mountford") (* |;;| "The time and alarm are actually set by DC-SET-TIME-BUTTONEVENTFN.") (DC-INITIALIZE-SET-TIME-MENU) (WINDOWPROP *DC-SET-TIME-WINDOW* 'SETTING-ALARM T))) (DC-ADD-ALARM-SETTING (LAMBDA (DATE-STRING) (* \; "Edited 15-Aug-88 07:29 by Mountford") (LET ((MESSAGE-WINDOW (DC-GET-MESSAGE-WINDOW)) (ALARM-LIST (WINDOWPROP *DC-WINDOW* 'ALARM-LIST)) (ITIME (IDATE DATE-STRING)) MESSAGE ALARM-DATE) (SETQ MESSAGE (DC-PROMPT-FOR-ALARM-MESSAGE MESSAGE-WINDOW)) (WINDOWPROP *DC-WINDOW* 'ALARM-LIST (|push| ALARM-LIST (CONS ITIME MESSAGE))) (SETQ DATE-STRING (DC-CONVERT-DATE-FORMAT DATE-STRING (DATEFORMAT SPACES NO.SECONDS))) (SETQ DATE-STRING (DC-MAKE-DISPLAY-TIME-STRING DATE-STRING (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE))) (SETQ ALARM-DATE (CONCAT "Alarm set for: " DATE-STRING)) (DC-PRINT-JUSTIFIED-STRING MESSAGE-WINDOW ALARM-DATE 'CENTERED 'CLEARW)))) (DC-DELETE-ALARM-SETTING (LAMBDA NIL (* \; "Edited 22-Feb-89 16:50 by Mountford") (LET ((MENU-LIST '("CLEAR ALL")) NEW-ALARM-LIST DELETE-ITEM) (|for| ITEM |in| (WINDOWPROP *DC-WINDOW* 'ALARM-LIST) |do| (|push| MENU-LIST (CONCAT (DC-GET-DATE *DC-DATEFORMAT* (CAR ITEM)) " - " (CDR ITEM)))) (SETQ DELETE-ITEM (MENU (|create| MENU ITEMS _ MENU-LIST))) (|if| (EQUAL DELETE-ITEM "CLEAR ALL") |then| (WINDOWPROP *DC-WINDOW* 'ALARM-LIST NIL) |else| (SETQ DELETE-ITEM (IDATE (SUBSTRING DELETE-ITEM 1 15))) (|for| ITEM |in| (WINDOWPROP *DC-WINDOW* 'ALARM-LIST) |do| (|if| (NOT (EQP (CAR ITEM) DELETE-ITEM)) |then| (|push| NEW-ALARM-LIST ITEM))) (WINDOWPROP *DC-WINDOW* 'ALARM-LIST NEW-ALARM-LIST))))) ) (DEFINEQ (DC-ALARM-DUE-TO-RING? (LAMBDA (ITIME) (* \; "Edited 25-Jul-88 06:56 by Mountford") (* |;;;| "Routine looks to see if the alarm is ringing. If it is, it rings bells and then prints out at associated message. If the alarm isn't ringing, and there is a list of alarm times, it iterates down the list looking to see if it is time for the alarm to ring. If it is time for the alarm to ring it simply substitutes NIL for the date in the alarm list. The list is rebuilt once when the alarm is turned off. The reason for doing it this way is so that the list isn't being rebuilt every time the clock looks to see if the alarm is set and so that the alarm times can be in any order. Ie. they don't have to be in chronological order. ") (PROG ((ALARM-RINGING (WINDOWPROP *DC-WINDOW* 'ALARM-RINGING)) (ALARM-LIST (WINDOWPROP *DC-WINDOW* 'ALARM-LIST))) (COND (ALARM-RINGING (RETURN T)) (ALARM-LIST (|for| ALARM |in| ALARM-LIST |do| (|if| (IGEQ ITIME (CAR ALARM)) |then| (WINDOWPROP *DC-WINDOW* 'ALARM-RINGING ALARM) (RPLACA ALARM NIL) (RETURN T)))))))) (DC-RING-ALARM (LAMBDA NIL (* \; "Edited 25-Jul-88 06:57 by Mountford") (LET ((ALARM-MESSAGE (CDR (WINDOWPROP *DC-WINDOW* 'ALARM-RINGING))) (MESSAGE-WINDOW (DC-GET-MESSAGE-WINDOW))) (DC-PRINT-JUSTIFIED-STRING MESSAGE-WINDOW ALARM-MESSAGE 'CENTERED 'CLEARW) (|if| (EQ (WINDOWPROP *DC-WINDOW* 'ALARM-MODE) 'LOUD) |then| (RINGBELLS) |else| (|for| I |to| 30 |do| (VIDEOCOLOR (NOT (VIDEOCOLOR))) (BLOCK 110)))))) (DC-TURN-ALARM-OFF (LAMBDA (ITEM MENU BUTTON) (* \; "Edited 25-Jul-88 06:53 by Mountford") (LET ((TEMP-ALARM-LIST)) (|for| ALARM |in| (WINDOWPROP *DC-WINDOW* 'ALARM-LIST) |do| (|if| (CAR ALARM) |then| (SETQ TEMP-ALARM-LIST (APPEND TEMP-ALARM-LIST (LIST ALARM))))) (WINDOWPROP *DC-WINDOW* 'ALARM-LIST TEMP-ALARM-LIST) (WINDOWPROP *DC-WINDOW* 'ALARM-RINGING NIL) (DC-CLOSE-MESSAGE-WINDOW)))) ) (DEFINEQ (DC-PROMPT-FOR-ALARM-MESSAGE (LAMBDA (MESSAGE-WINDOW) (* \; "Edited 22-Feb-89 16:19 by Mountford") (LET (MESSAGE) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE NIL) (CLEARW MESSAGE-WINDOW) (MOVETOUPPERLEFT WINDOW) (SETQ MESSAGE (PROMPTFORWORD " Message: " "No Message" NIL MESSAGE-WINDOW NIL 'TTY (CHARCODE (EOL ESCAPE LF TAB)))) (WINDOWPROP *DC-WINDOW* 'CAN-UPDATE T) MESSAGE))) (DC-GET-MESSAGE-WINDOW (LAMBDA NIL (* \; "Edited 25-Jul-88 07:07 by Mountford") (OR (CAR (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS)) (LET ((MESSAGE-WINDOW (CREATEW (CREATEREGION 1 (IDIFFERENCE SCREENHEIGHT 25) 430 30)))) (ATTACHWINDOW MESSAGE-WINDOW *DC-WINDOW* 'BOTTOM 'JUSTIFY) (WINDOWPROP MESSAGE-WINDOW 'MESSAGE-WINDOW T) (DSPFONT *DC-AUXW-FONT* MESSAGE-WINDOW) MESSAGE-WINDOW)))) (DC-CLOSE-MESSAGE-WINDOW (LAMBDA NIL (* \; "Edited 25-Jul-88 06:58 by Mountford") (LET ((MESSAGE-WINDOW (CAR (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS)))) (|if| (WINDOWPROP MESSAGE-WINDOW 'MESSAGE-WINDOW) |then| (DETACHWINDOW MESSAGE-WINDOW) (CLOSEW MESSAGE-WINDOW))))) ) (* |;;| "Display & Misc functions") (DEFINEQ (DC-DISPLAY-TIME (LAMBDA (ITIME MERIDIAN) (* \; "Edited 1-Aug-88 08:00 by Mountford") (LET* ((LOCAL-TIME (DC-GET-DATE *DC-DATEFORMAT* ITIME)) (DISPLAY-TIME (DC-MAKE-DISPLAY-TIME-STRING LOCAL-TIME MERIDIAN))) (DC-PRINT-JUSTIFIED-STRING *DC-WINDOW* DISPLAY-TIME 'CENTERED 'CLEARW)))) (DC-MAKE-DISPLAY-TIME-STRING (LAMBDA (DATE-STRING MERIDIAN) (* \; "Edited 15-Aug-88 09:18 by Mountford") (LET ((DISPLAY-TIME DATE-STRING) (HOUR (MKATOM (SUBSTRING DATE-STRING 11 12)))) (* |;;|  "If *DC-DATEFORMAT* is changed to number.of.month, it causes the clock to break in 12-hour mode.") (|if| MERIDIAN |then| (LET ((DAY (SUBSTRING DATE-STRING 16))) (COND ((ZEROP HOUR) (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 10) "12" (SUBSTRING DATE-STRING 13 15) "am"))) ((ILESSP HOUR 10) (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 10) " " (SUBSTRING DATE-STRING 12 15) "am"))) ((ILESSP HOUR 12) (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 15) "am"))) ((EQP HOUR 12) (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 15) "pm"))) ((ILESSP HOUR 22) (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 10) " " (IDIFFERENCE HOUR 12) (SUBSTRING DATE-STRING 13 15) "pm"))) (T (SETQ DISPLAY-TIME (CONCAT (SUBSTRING DATE-STRING 1 10) (IDIFFERENCE HOUR 12) (SUBSTRING DATE-STRING 13 15) "pm")))) (|if| DAY |then| (SETQ DISPLAY-TIME (CONCAT DISPLAY-TIME DAY))))) (|if| (EQUAL " " (SUBSTRING DISPLAY-TIME 1 1)) |then| (SETQ DISPLAY-TIME (SUBSTRING DISPLAY-TIME 2))) DISPLAY-TIME))) (DC-PRINT-JUSTIFIED-STRING (LAMBDA (WINDOW STRING JUSTIFICATION CLEARW?) (* \; "Edited 15-Aug-88 06:41 by Mountford") (LET ((STRING-WIDTH (STRINGWIDTH STRING WINDOW)) (WINDOW-WIDTH (WINDOWPROP WINDOW 'WIDTH))) (|if| CLEARW? |then| (CLEARW WINDOW)) (MOVETOUPPERLEFT WINDOW) (COND ((IGREATERP STRING-WIDTH WINDOW-WIDTH) (DC-SHAPE-TO-FIT *DC-WINDOW* STRING) (SETQ WINDOW-WIDTH (WINDOWPROP WINDOW 'WIDTH)))) (COND ((EQ JUSTIFICATION 'LEFT) (SETQ STRING (CONCAT " " STRING))) ((EQ JUSTIFICATION 'RIGHT) (SETQ STRING (CONCAT STRING " ")) (SETQ STRING-WIDTH (IPLUS 3 (STRINGWIDTH STRING WINDOW))) (DSPXPOSITION (IDIFFERENCE WINDOW-WIDTH STRING-WIDTH) WINDOW)) ('CENTER (DSPXPOSITION (IQUOTIENT (IDIFFERENCE WINDOW-WIDTH STRING-WIDTH) 2) WINDOW))) (PRINTOUT WINDOW STRING)))) (DC-CONVERT-DATE-FORMAT (LAMBDA (DATE-STRING NEW-FORMAT-LIST) (* \; "Edited 25-Jul-88 11:50 by Mountford") (|if| (EQ (CAR NEW-FORMAT-LIST) 'DATEFORMAT) |then| (GDATE (IDATE DATE-STRING) NEW-FORMAT-LIST) |else| (GDATE (IDATE DATE-STRING) (CONS 'DATEFORMAT NEW-FORMAT-LIST))))) (DC-SHAPE-TO-FIT (LAMBDA (WINDOW STRING) (* \; "Edited 17-Feb-89 16:12 by Mountford") (LET ((WINDOW-LIST (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS)) (STRING-WIDTH (STRINGWIDTH (CONCAT " " STRING) WINDOW)) (HEIGHT (HEIGHTIFWINDOW (FONTPROP WINDOW 'HEIGHT))) (REGION (WINDOWPROP WINDOW 'REGION)) STRING-WIDTH AUXW-STRING-WIDTH AUXW-HEIGHT X Y) (WINDOWPROP WINDOW 'RESHAPEFN NIL) (|for| AUXW |in| WINDOW-LIST |do| (DETACHWINDOW AUXW) (SETQ AUXW-STRING-WIDTH (STRINGWIDTH (CONCAT (WINDOWPROP AUXW 'LOCATION) " " STRING) AUXW)) (|if| (IGREATERP AUXW-STRING-WIDTH STRING-WIDTH) |then| (SETQ STRING-WIDTH AUXW-STRING-WIDTH))) (SETQ X (CAR REGION)) (SETQ Y (CADR REGION)) (SETQ WIDTH (WIDTHIFWINDOW STRING-WIDTH)) (SHAPEW WINDOW (LIST X Y WIDTH HEIGHT)) (SETQ AUXW-HEIGHT (HEIGHTIFWINDOW (FONTPROP (CAR WINDOW-LIST) 'HEIGHT))) (|for| AUXW |in| WINDOW-LIST |do| (SHAPEW AUXW (LIST X Y WIDTH AUXW-HEIGHT)) (ATTACHWINDOW AUXW *DC-WINDOW* 'BOTTOM 'JUSTIFY)) (WINDOWPROP *DC-WINDOW* 'RESHAPEFN 'DON\'T)))) (DC-GET-DATE (LAMBDA (DATEFORMAT ITIME OFFSET) (* \; "Edited 1-Aug-88 07:55 by Mountford") (|if| ITIME |then| (|if| OFFSET |then| (GDATE (IDIFFERENCE ITIME OFFSET) DATEFORMAT) |else| (GDATE ITIME DATEFORMAT)) |else| (|if| OFFSET |then| (GDATE (IDIFFERENCE (IDATE) OFFSET) DATEFORMAT) |else| (GDATE (IDATE) DATEFORMAT))))) (DC-MENU-POSITION (LAMBDA (MENU) (* \; "Edited 11-Aug-88 06:14 by Mountford") (LET ((WINDOW-REGION (WINDOWPROP *DC-WINDOW* 'REGION)) (MENU-HEIGHT (CADDDR (MENUREGION MENU)))) (CONS (IPLUS (CAR WINDOW-REGION) (CADDR WINDOW-REGION)) (IDIFFERENCE (IPLUS (CADR WINDOW-REGION) (CADDDR WINDOW-REGION)) MENU-HEIGHT))))) ) (* |;;| "Font functions") (DEFINEQ (DC-SET-FONT (LAMBDA (WINDOW ALL-AUXW-P) (* \; "Edited 2-Sep-88 15:44 by Mountford") (LET ((FAMILY (DC-FONT-FAMILY-MENU)) (SIZE (DC-FONT-SIZE-MENU)) (FACE (DC-FONT-FACE-MENU)) OLD-FONT NEW-FONT) (|if| (NOT (AND FAMILY SIZE FACE)) |then| (|if| WINDOW |then| (SETQ OLD-FONT (DSPFONT NIL WINDOW)) |else| (SETQ OLD-FONT (DSPFONT NIL *DC-WINDOW*))) (|if| (NOT FAMILY) |then| (SETQ FAMILY (FONTPROP OLD-FONT 'FAMILY))) (|if| (NOT SIZE) |then| (SETQ SIZE (FONTPROP OLD-FONT 'SIZE))) (|if| (NOT FACE) |then| (SETQ FACE (FONTPROP OLD-FONT 'FACE)))) (DC-PRINT-JUSTIFIED-STRING *DC-WINDOW* "Fetching Font" 'CENTER 'CLEARW) (SETQ NEW-FONT (FONTCREATE FAMILY SIZE FACE NIL NIL 'NOERRORFLG)) (|if| NEW-FONT |then| (COND (ALL-AUXW-P (SETQ *DC-AUXW-FONT* NEW-FONT) (|for| AUXW |in| (WINDOWPROP *DC-WINDOW* 'ATTACHEDWINDOWS) |do| (DSPFONT *DC-AUXW-FONT* AUXW))) (WINDOW (DSPFONT NEW-FONT WINDOW)) (T (SETQ *DC-FONT* NEW-FONT) (DSPFONT *DC-FONT* *DC-WINDOW*))) (DC-SHAPE-TO-FIT *DC-WINDOW* (DC-MAKE-DISPLAY-TIME-STRING (GDATE (IDATE) *DC-DATEFORMAT*) (WINDOWPROP *DC-WINDOW* '12-HOUR-MODE))) |else| (DC-PRINT-JUSTIFIED-STRING *DC-WINDOW* "Font Not Found" 'CENTER 'CLEARW)) NEW-FONT))) (DC-FONT-FAMILY-MENU (LAMBDA NIL (* \; "Edited 13-Aug-88 11:01 by Mountford") (|if| (OR (NOT (BOUNDP '*DC-FONT-FAMILY-MENU*)) (NULL *DC-FONT-FAMILY-MENU*)) |then| (SETQ *DC-FONT-FAMILY-MENU* (|create| MENU ITEMS _ '((|Titan| 'TITAN) (|Hippo| 'HIPPO) (|Gacha| 'GACHA) (|Classic| 'CLASSIC) (|BoldPS| 'BOLDPS) (|Modern| 'MODERN) (|Terminal| 'TERMINAL) (|Helvetica| 'HELVETICA) (|Helveticad| 'HELVETICAD) ("Old English" 'OLDENGLISH) ("Letter Gothic" 'LETTERGOTHIC) ("Times Roman" 'TIMESROMAN) ("Times Romand" 'TIMESROMAND)) CENTERFLG _ T TITLE _ " Font "))) (MENU *DC-FONT-FAMILY-MENU* (DC-MENU-POSITION *DC-FONT-FAMILY-MENU*)))) (DC-FONT-SIZE-MENU (LAMBDA NIL (* \; "Edited 13-Aug-88 10:52 by Mountford") (|if| (OR (NOT (BOUNDP '*DC-FONT-SIZE-MENU*)) (NULL *DC-FONT-SIZE-MENU*)) |then| (SETQ *DC-FONT-SIZE-MENU* (|create| MENU ITEMS _ '(6 7 8 9 10 11 12 14 16 18 24 26 30 36 72) MENUCOLUMNS _ 3 TITLE _ " Size "))) (MENU *DC-FONT-SIZE-MENU* (DC-MENU-POSITION *DC-FONT-SIZE-MENU*)))) (DC-FONT-FACE-MENU (LAMBDA NIL (* \; "Edited 11-Aug-88 06:46 by Mountford") (|if| (OR (NOT (BOUNDP '*DC-FONT-FACE-MENU*)) (NULL *DC-FONT-FACE-MENU*)) |then| (SETQ *DC-FONT-FACE-MENU* (|create| MENU ITEMS _ '((|Bold| 'BRR) (|Italic| 'MIR) ("Bold Italic" 'BIR) (|Regular| 'MRR)) TITLE _ " Face " CENTERFLG _ T))) (MENU *DC-FONT-FACE-MENU* (DC-MENU-POSITION *DC-FONT-FACE-MENU*)))) ) (* |;;| "List of the world's time zones") (RPAQQ *DC-TIME-ZONE-LIST* (("Nome, Alaska" '("Nome, Alaska: " . 11) '(-180 . -165)) ("Honolulu, Hawaii" '("Honolulu, Hawaii: " . 10) '(-165 . -150)) ("Marquesas Islands" '("Marquesas Islands: " . 9) '(-150 . -135)) ("San Francisco, California" '("San Francisco, California: " . 8) '(-135 . -120)) ("Denver, Colorado" '("Denver, Colorado: " . 7) '(-120 . -105)) ("Houston, Texas" '("Houston, Texas: " . 6) '(-105 . -90)) ("Washington DC" '("Washington DC: " . 5) '(-90 . -75)) ("Buenos Aires, Argentina" '("Buenos Aires, Argentina: " . 4) '(-75 . -60)) ("Brasilia, Brasil" '("Brasilia, Brasil: " . 3) '(-60 . -45)) ("Rio de Janeiro, Brasil" '("Rio de Janeiro, Brasil: " . 2) '(-45 . -30)) ("Reykjavik, Iceland" '("Reykjavik, Iceland: " . 1) '(-30 . -15)) ("Greenwich, England" '("Greenwich, England: " . 0) '(-15 . 0)) ("Paris, France" '("Paris, France: " . -1) '(0 . 15)) ("Athens, Greece" '("Athens, Greece: " . -2) '(15 . 30)) ("Moscow, USSR" '("Moscow, USSR: " . -3) '(30 . 45)) ("Riyadh, Arabia" '("Riyadh, Arabia: " . -4) '(45 . 60)) ("Kabul, Afganistan" '("Kabul, Afganistan: " . -5) '(60 . 75)) ("Kathmandu, Nepal" '("Kathmandu, Nepal: " . -6) '(75 . 90)) ("Bangkok, Thailand" '("Bangkok, Thailand:" . -7) '(90 . 105)) ("Hong Kong" '("Hong Kong: " . -8) '(105 . 120)) ("Seoul, South Korea" '("Seoul, South Korea: " . -9) '(120 . 135)) ("Tokyo, Japan" '("Tokyo, Japan: " . -10) '(135 . 150)) ("Sydney Austrailia" '("Sydney Austrailia:" . -11) '(150 . 165)) ("Aukland, New Zealand" '("Aukland, New Zealand: " . -12) '(165 . 180)))) (* |;;| "Call digi-clock ") (PUTPROPS DIGI-CLOCK COPYRIGHT ("XEROX Corporation" 1988 1989)) (DECLARE\: DONTCOPY (FILEMAP (NIL (3028 11522 (DIGI-CLOCK 3038 . 3527) (DC-START-PROCESS 3529 . 5030) (DC-KILL-PROCESS 5032 . 5254) (DC-BUTTONEVENTFN 5256 . 7915) (DC-AUXW-BUTTONEVENTFN 7917 . 9437) ( DC-SET-TIME-BUTTONEVENTFN 9439 . 10705) (ST 10707 . 11520)) (11560 13964 (DC-PROCESS 11570 . 12052) ( DC-UPDATE 12054 . 12752) (DC-GET-OPERATION 12754 . 13962)) (13999 17168 (DC-AUXW-GET-OPERATION 14009 . 14636) (DC-ADD-AUXW 14638 . 16136) (DC-DELETE-AUXW 16138 . 16552) (DC-AUXW-UPDATE 16554 . 17166)) ( 17207 17833 (DC-WARNING-TIME-NOT-SET 17217 . 17831)) (17834 21892 (DC-SET-TIME 17844 . 18067) ( DC-UPDATE-TIME-ITEM 18069 . 21076) (DC-VALID-DATE-P 21078 . 21276) (DC-SET-LAST-DAY-FOR-MONTH 21278 . 21890)) (21893 25094 (DC-INITIALIZE-SET-TIME-MENU 21903 . 23106) (DC-MAKE-NEW-SET-TIME-MENU 23108 . 24463) (DC-OPEN-SET-TIME-MENUW 24465 . 25092)) (25095 26274 (DC-EXTRACT-STARTING-SET-TIME-DATE 25105 . 25817) (DC-SET-TIME-MAKE-DATE-STRING 25819 . 26272)) (26275 28480 (DC-SET-TIME-ZONE-HEADING 26285 . 26761) (DC-SET-TIME-ZONE 26763 . 27951) (DC-GET-TIME-ZONE 27953 . 28478)) (28516 30916 ( DC-SET-ALARM 28526 . 28830) (DC-ADD-ALARM-SETTING 28832 . 29756) (DC-DELETE-ALARM-SETTING 29758 . 30914)) (30917 33527 (DC-ALARM-DUE-TO-RING? 30927 . 32382) (DC-RING-ALARM 32384 . 32995) ( DC-TURN-ALARM-OFF 32997 . 33525)) (33528 34968 (DC-PROMPT-FOR-ALARM-MESSAGE 33538 . 34034) ( DC-GET-MESSAGE-WINDOW 34036 . 34586) (DC-CLOSE-MESSAGE-WINDOW 34588 . 34966)) (35013 42503 ( DC-DISPLAY-TIME 35023 . 35386) (DC-MAKE-DISPLAY-TIME-STRING 35388 . 37966) (DC-PRINT-JUSTIFIED-STRING 37968 . 39058) (DC-CONVERT-DATE-FORMAT 39060 . 39452) (DC-SHAPE-TO-FIT 39454 . 41404) (DC-GET-DATE 41406 . 42016) (DC-MENU-POSITION 42018 . 42501)) (42538 47425 (DC-SET-FONT 42548 . 44456) ( DC-FONT-FAMILY-MENU 44458 . 46056) (DC-FONT-SIZE-MENU 46058 . 46622) (DC-FONT-FACE-MENU 46624 . 47423) )))) STOP \ No newline at end of file diff --git a/lispusers/DIGI-CLOCK.TEDIT b/lispusers/DIGI-CLOCK.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..e228d2ef048cc0be4984de57e1fe6207c745e9df GIT binary patch literal 5617 zcmeHKOLN=E5r$;%D+&+UY^rig7jq$95=)Y`vUZcI1R_BR5eR5WaBc4mBtQ{m5W@fi zOY||vJ>*B^o^z^lPu1pMb)lFR}eiy6sz zL^57P6sNQ(5*aU(a^syyqrB4?`R35K-7}&Zct-?boL<$o=sHdkdc$8qx}xYN&gC76 zWhSOk4v=X`S(M8llghn<+9C4NDO>}O#*XVGa1(_TOPU5LO`=K-dy^H()sj85Hn`d( zvidXmZP@i;GLNPLZuN!pwV}M`ZkmqN7H7HK zr956NlT`&tTdH3%6j4s8kW{3hP(hi_gY*iU3*3q`vA!!nI?+thq>xgid?{puPp@O> zUgP#f4!yNJD;LW!kVu=%qhwazQU^|-7L!q zE(c7Tnu!!QWxvc3y#leoFU1+Ah~5m6AY0Uyv=F#sD-i{Pp3z^6SVnDqt}W~HgF`+& zJfgWMvNi=7uz^8&BxNuG5mipu{UQ!SJnI0_B1#K&WpISoP|6YFTQm>CP+uY^6cq_r z$u_9-GGak-1IorhwyK1csd@1BA)k4@psIQT*mZ=6BclAtc_6FwG2x>SEUp5n#paPJ zq7q3M%>vXPS25$|FqGwaAEScD#_|A_%Slp2rTE3{;Ul#R8Zn@Xc=i2_g9R9xaA7Ko z#Y9CE`C3qOgu9u=4RuvF>9Zp{rN0!pL{$OlOU2J7gU*v^Dx(m$8AZHg9L>=@SSqUb zW7*U#0+p{ffl*UIlN|0$MvFXjL8LRsrJj!P*p(gcyMYBJ6^vtz-`a(YL$Mo=n9dnSF?_4E=7hO zD|8bogP5SBt84rAz}oxHbFDqc9{JBOA}s&jgy_zN$TbJRAs^kN`B*jY(jf*vhoGZ%4S%)g@J~@jt|C5 zqMOmINYO|@!y!i0spUAM+w%*JOU6kpw77{ZvXr?yo9&hqD(@7esaSzyd}TpdQOAq) zVnl(cJeDxpRR^PQ)RxIPc#ON9TF0xaY`U%rFet4v$Gybi!Kf{B0V8+%#yWfuV0^bw z0rsY`*3?yCrMSA{_qKHmC;WN`Gk84!Y4J|TRi27CU$HN4M4bkrP^1-Wl;icyn>|DT zT~H$&X^ndYyjL5?s-MC?_g-%Q3X6J4V1ix;XwIRs8E!(k6w5u-J6F3x!>Oy?L8Y*? z*7W&I!|`UbN1=2K{yb@MccND7(mb=swH?Ch(i)EJ?<~A+NeO=UJ;(NJx9?HQ9Ga(g zmzqudYg6^o%eud(pC&~!ZSVnnTP#%7PYmg`$XtJfyH zT@A~V(U^UAhxVlpL$>>^J+e<7i@biHMwVlB{YxP6)$`@h^RZ#|^eF>A*r&cZu$|X5 z@OswJCGT5n=-6&)z#rNdmN(YwV;2(ZGwao*>5lNH0u8ORG5R8n9PiRvKfScfQwZdVdI(iK->_RgBM5i{Fn|;PVm##@~v~r?D0#c z%0l_zzh)3)*Tn&ELHFc{UK}0Kmxpy--+JXMMWqapua4>H%VRp;-`D2b(ELAg46P3- z{gBcRRr+&PX}hiZ@<+zU#&ce6{a}28pY114vEKS&OP${S+Va=WhrD_Zm9>JgTWb6Y zzfZTHYz`h+?Hb=3-*24&+WX70nWx(T|H$W@&wyHe?p$<-n^xHjjh$L2)YA99pBld~ zeq(&nbbxx>Cg$1`?$%Cn_s>s9L~k&v#oQ(8=OkT79iCNeo{N@BL=gB|Hfzh zWoYef2<@B?$BxxGv;4lhWo%Gw(3hrkVz-Ttl={!9$etDUPZ>I}^TuP?HxVtdSBgJ{ z{YMo!jz{dg3Ll4BNps1nP}ffa7OeutqF?X^dsm`5liRq1vGrd*c`woJzuytv`p2CO qloC6CGyeGQ-~R(p45?-S literal 0 HcmV?d00001 diff --git a/lispusers/DINFO b/lispusers/DINFO new file mode 100644 index 00000000..056c76fe --- /dev/null +++ b/lispusers/DINFO @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED " 1-Oct-87 10:11:04" {ERINYES}LYRIC>DINFO.;4 63282 changes to%: (VARS DINFOCOMS) (FNS DINFO.UPDATE.GRAPH.DISPLAY DINFO.TOGGLE.GRAPH) (FUNCTIONS DINFOGRAPHPROP) previous date%: "14-Sep-87 12:00:05" {ERINYES}LYRIC>DINFO.;2) (* " Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DINFOCOMS) (RPAQQ DINFOCOMS ((FILES TEDIT GRAPHER) (RECORDS DINFOGRAPH DINFONODE) (FUNCTIONS DINFOGRAPHPROP) (FNS (* ; "Primary functions") DINFO DINFO.UPDATE DINFOGRAPH DINFO.SPECIAL.UPDATE DINFO.READ.GRAPH DINFO.WRITE.GRAPH DINFO.SELECT.GRAPH DINFO.DEFAULT.MENU DINFO.FIND DINFO.LOOKUP) (FNS (* ; "Koto compatability") DINFO.READ.KOTO.GRAPH) (FNS (* ; "Window functions") DINFO.SETUP.WINDOW DINFO.CLOSEFN DINFO.SHRINKFN DINFO.EXPANDFN DINFO.ICONFN) (FNS (* ; "FreeMenu functions") DINFO.ADD.FMENU DINFO.CREATE.FMENU DINFO.FMW.CLOSEFN DINFO.FMENU.HANDLER DINFO.UPDATE.FMENU DINFO.TOGGLE.MENU DINFO.TOGGLE.GRAPH DINFO.TOGGLE.HISTORY DINFO.TOGGLE.TEXT) (FNS (* ; "Other menu functions") DINFO.UPDATE.MENU.DISPLAY DINFO.UPDATE.FROM.MENU DINFO.UPDATE.HISTORY DINFO.HISTORIC.UPDATE) (FNS (* ; "Interface to GRAPHER") DINFO.UPDATE.GRAPH.DISPLAY DINFO.UPDATE.FROM.GRAPH DINFO.GET.GRAPH.WINDOW DINFO.CREATE.GRAPH.WINDOW DINFO.SHOWGRAPH DINFO.INVERT.NODE DINFO.LAYOUTGRAPH) (FNS (* ; "Interface to TEdit") DINFO.UPDATE.TEXT.DISPLAY DINFO.TITLEMENUFN DINFO.OPENTEXTSTREAM DINFO.SHOWSEL DINFO.GET.FILENAME) (ADDVARS (BackgroundMenuCommands (DInfo (DINFO.SELECT.GRAPH) "Open a DInfo window for browsing documentation." ))) (VARS (BackgroundMenu)) (INITVARS (DINFO.GRAPHS) (DINFOMODES '(TEXT GRAPH)) (DINFO.HISTORY.LENGTH 20) (\DINFO.MAX.MENU.LEN 10)) (GLOBALVARS DINFO.GRAPH.FILES DINFOMODES DINFO.HISTORY.LENGTH \DINFO.MAX.MENU.LEN) (PROP (FILETYPE) DINFO))) (FILESLOAD TEDIT GRAPHER) (DECLARE%: EVAL@COMPILE (DATATYPE DINFOGRAPH (NAME NODELST TOPNODEID CURRENTNODE USERDATA TEXTPROPS FREEMENUITEMS LOOKUPFN MENUFN DEFAULTHOST DEFAULTDEVICE DEFAULTDIR MONITORLOCK DINFO.MENU WINDOW MENUFONT FMENU.WINDOW GRAPH.WINDOW HISTORY.MENU.WINDOW SUBNODE.MENU.WINDOW LAST.TEXT LAST.INVERTED.NODE LAST.GRAPH.LOCATION HISTORY.ITEMS FIND.STRING LOOKUP.STRING) (SYSTEM)) (RECORD DINFONODE (ID LABEL FILE FROMBYTE TOBYTE PARENT CHILDREN NEXTNODE PREVIOUSNODE USERDATA) (SYSTEM)) ) (/DECLAREDATATYPE 'DINFOGRAPH '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((DINFOGRAPH 0 POINTER) (DINFOGRAPH 2 POINTER) (DINFOGRAPH 4 POINTER) (DINFOGRAPH 6 POINTER) (DINFOGRAPH 8 POINTER) (DINFOGRAPH 10 POINTER) (DINFOGRAPH 12 POINTER) (DINFOGRAPH 14 POINTER) (DINFOGRAPH 16 POINTER) (DINFOGRAPH 18 POINTER) (DINFOGRAPH 20 POINTER) (DINFOGRAPH 22 POINTER) (DINFOGRAPH 24 POINTER) (DINFOGRAPH 26 POINTER) (DINFOGRAPH 28 POINTER) (DINFOGRAPH 30 POINTER) (DINFOGRAPH 32 POINTER) (DINFOGRAPH 34 POINTER) (DINFOGRAPH 36 POINTER) (DINFOGRAPH 38 POINTER) (DINFOGRAPH 40 POINTER) (DINFOGRAPH 42 POINTER) (DINFOGRAPH 44 POINTER) (DINFOGRAPH 46 POINTER) (DINFOGRAPH 48 POINTER) (DINFOGRAPH 50 POINTER)) '52) (DEFMACRO DINFOGRAPHPROP (GRAPH PROP &OPTIONAL (NEW-VALUE NIL NEW-VALUE-SUPPLIED)) [LET [(REAL-FIELD (AND (LISTP PROP) (EQ (CAR PROP) 'QUOTE) (FMEMB (CADR PROP) (RECORDFIELDNAMES 'DINFOGRAPH T)) (CADR PROP] (IF NEW-VALUE-SUPPLIED THEN [IF REAL-FIELD THEN `(REPLACE (DINFOGRAPH ,REAL-FIELD) OF ,GRAPH WITH ,NEW-VALUE) ELSE `(LET* ((SI::$GRAPH$ ,GRAPH) (SI::$USERDATA$ (FETCH (DINFOGRAPH USERDATA) OF SI::$GRAPH$)) (SI::$PROP$ ,PROP) (SI::$NEW-VALUE$ ,NEW-VALUE)) (IF (LISTP SI::$USERDATA$) THEN (LISTPUT SI::$USERDATA$ SI::$PROP$ SI::$NEW-VALUE$) ELSE (REPLACE (DINFOGRAPH USERDATA) OF SI::$GRAPH$ WITH (LIST SI::$PROP$ SI::$NEW-VALUE$)) SI::$NEW-VALUE$] ELSE (IF REAL-FIELD THEN `(FETCH (DINFOGRAPH ,REAL-FIELD) OF ,GRAPH) ELSE `(LISTGET (FETCH (DINFOGRAPH USERDATA) OF ,GRAPH) ,PROP]) (DEFINEQ (DINFO [LAMBDA (GRAPH.OR.FILE WINDOW.OR.REGION SETUP.ONLY? NO.FREEMENU?) (* drc%: "25-Jan-86 18:23") (* Starts a DInfo browser.) (RESETLST (LET ((W (OR (WINDOWP WINDOW.OR.REGION) (AND (REGIONP WINDOW.OR.REGION) (CREATEW WINDOW.OR.REGION "DInfo" NIL T)) (AND (type? DINFOGRAPH GRAPH.OR.FILE) (WINDOWP (fetch (DINFOGRAPH WINDOW) of GRAPH.OR.FILE))) (CREATEW NIL "DInfo"))) GRAPH MONITORLOCK) (OPENW W) [SETQ GRAPH (if (type? DINFOGRAPH GRAPH.OR.FILE) then GRAPH.OR.FILE else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW W)) (DINFO.READ.GRAPH GRAPH.OR.FILE] [SETQ MONITORLOCK (OR (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) (replace (DINFOGRAPH MONITORLOCK) of GRAPH with (CREATE.MONITORLOCK "DInfo"] (RESETSAVE NIL (LIST 'RELEASE.MONITORLOCK MONITORLOCK)) (OBTAIN.MONITORLOCK MONITORLOCK) (DINFO.SETUP.WINDOW GRAPH W NO.FREEMENU?) (OR SETUP.ONLY? (DINFO.UPDATE GRAPH NIL NIL T)) GRAPH]) (DINFO.UPDATE [LAMBDA (GRAPH NEW.NODE SEL FORCE?) (* jow "20-May-86 15:14") (* * Called to visit a NEW.NODE in GRAPH, or to just make sure that the display  of GRAPH is current.) (LET ([NODE (OR NEW.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH) (FASSOC (fetch (DINFOGRAPH TOPNODEID) of GRAPH) (fetch (DINFOGRAPH NODELST) of GRAPH] (PREVIOUS.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)) (WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH))) (OPENW WINDOW) (WINDOWPROP WINDOW 'DINFOGRAPH GRAPH) (OR (FMEMB NODE (fetch (DINFOGRAPH NODELST) of GRAPH)) (ERROR NODE "NOT IN NODELST")) (LET ((FMENU.WINDOW (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH)) (MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH))) [RESETLST (RESETSAVE NIL (LIST 'RELEASE.MONITORLOCK MONITORLOCK)) (if (NOT (OBTAIN.MONITORLOCK MONITORLOCK T)) then (* somebody else is messing with this  graph.) (FLASHWINDOW WINDOW) (PROMPTPRINT "DInfo is busy") elseif (NULL FMENU.WINDOW) then (replace (DINFOGRAPH CURRENTNODE) of GRAPH with NODE) (* FreeMenu turned off, so just  display text) (DINFO.UPDATE.TEXT.DISPLAY GRAPH NODE SEL) else (* We've got a FreeMenu, so update  away!) (DINFO.UPDATE.FMENU GRAPH NODE) (LET ((STATUS (FM.GETSTATE FMENU.WINDOW))) (replace (DINFOGRAPH CURRENTNODE) of GRAPH with NODE) (AND (LISTGET STATUS 'GRAPH) (DINFO.UPDATE.GRAPH.DISPLAY GRAPH NODE FORCE?)) (AND (LISTGET STATUS 'MENU) (DINFO.UPDATE.MENU.DISPLAY GRAPH NODE)) (AND (LISTGET STATUS 'TEXT) (DINFO.UPDATE.TEXT.DISPLAY GRAPH NODE SEL)) (DINFO.UPDATE.HISTORY GRAPH NODE SEL (LISTGET STATUS 'HISTORY] (CLEARW (GETPROMPTWINDOW WINDOW]) (DINFOGRAPH [LAMBDA (X) (* drc%: " 8-Jan-86 11:12") (if (type? DINFOGRAPH X) then X elseif (AND (WINDOWP X) (WINDOWPROP X 'DINFOGRAPH)) elseif (AND (WINDOWP X) (WINDOWPROP X 'MAINWINDOW)) then (WINDOWPROP (WINDOWPROP X 'MAINWINDOW) 'DINFOGRAPH]) (DINFO.SPECIAL.UPDATE [LAMBDA (TYPE GRAPH) (* drc%: "25-Jan-86 18:26") (* * Do a TYPE update of Graph, where TYPE is one of Top, Parent, Previous or  Next.) (LET* [(DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (CURRENT.NODE (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)) (NEW.NODE (FASSOC (SELECTQ TYPE (Top (fetch (DINFOGRAPH TOPNODEID) of GRAPH)) (Parent (fetch (DINFONODE PARENT) of CURRENT.NODE)) (Next (fetch (DINFONODE NEXTNODE) of CURRENT.NODE)) (Previous (fetch (DINFONODE PREVIOUSNODE) of CURRENT.NODE)) NIL) (fetch (DINFOGRAPH NODELST) of GRAPH] (if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) T) then (if NEW.NODE then (PROCESSPROP (THIS.PROCESS) 'NAME (CONCAT "DInfo " TYPE)) (DINFO.UPDATE GRAPH NEW.NODE) else (* TYPE of Top! or Node! will sound silly here, but should never happen.) (printout (GETPROMPTWINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) T "This node has no " TYPE)) else (FLASHWINDOW DINFOW) (PROMPTPRINT "DInfo is busy"]) (DINFO.READ.GRAPH [LAMBDA (FILE QUIETFLG) (* drc%: "25-Jan-86 18:17") (* Reads a file written by DINFO.WRITE.GRAPH.  Returns the DInfo graph stored on FILE.) (OR QUIETFLG (printout T T "Reading " (FILENAMEFIELD FILE 'NAME) " graph...")) (LET* ((FULLFILENAME (INFILEP FILE)) [DATA (CDR (READFILE (OR FULLFILENAME (ERROR "FILE NOT FOUND" FILE] (GRAPH (create DINFOGRAPH))) (* fields stored on file) (replace (DINFOGRAPH TOPNODEID) of GRAPH with (LISTGET DATA 'TOPNODEID)) (replace (DINFOGRAPH TEXTPROPS) of GRAPH with (LISTGET DATA 'TEXTPROPS)) (replace (DINFOGRAPH LOOKUPFN) of GRAPH with (LISTGET DATA 'LOOKUPFN)) (replace (DINFOGRAPH MENUFN) of GRAPH with (LISTGET DATA 'MENUFN)) (replace (DINFOGRAPH FREEMENUITEMS) of GRAPH with (LISTGET DATA 'FREEMENUITEMS)) (replace (DINFOGRAPH NODELST) of GRAPH with (LISTGET DATA 'NODELST)) (replace (DINFOGRAPH USERDATA) of GRAPH with (LISTGET DATA 'USERDATA)) (* fields filled in at read time) (replace (DINFOGRAPH NAME) of GRAPH with (FILENAMEFIELD FULLFILENAME 'NAME)) (replace (DINFOGRAPH DEFAULTHOST) of GRAPH with (FILENAMEFIELD FULLFILENAME 'HOST)) (replace (DINFOGRAPH DEFAULTDEVICE) of GRAPH with (FILENAMEFIELD FULLFILENAME 'DEVICE)) (replace (DINFOGRAPH DEFAULTDIR) of GRAPH with (FILENAMEFIELD FULLFILENAME 'DIRECTORY)) (OR QUIETFLG (printout T "OK.")) GRAPH]) (DINFO.WRITE.GRAPH [LAMBDA (GRAPH FILE) (* drc%: "25-Jan-86 18:16") (* Writes a DInfo graph to a file for reading by DINFO.READ.GRAPH.  Returns the full file name of the file.) (* dump it out as a props list) (WRITEFILE (LIST 'TOPNODEID (fetch (DINFOGRAPH TOPNODEID) of GRAPH) 'TEXTPROPS (fetch (DINFOGRAPH TEXTPROPS) of GRAPH) 'LOOKUPFN (fetch (DINFOGRAPH LOOKUPFN) of GRAPH) 'MENUFN (fetch (DINFOGRAPH MENUFN) of GRAPH) 'FREEMENUITEMS (fetch (DINFOGRAPH FREEMENUITEMS) of GRAPH) 'NODELST (fetch (DINFOGRAPH NODELST) of GRAPH) 'USERDATA (fetch (DINFOGRAPH USERDATA) of GRAPH)) FILE]) (DINFO.SELECT.GRAPH [LAMBDA NIL (* drc%: "24-Jan-86 13:25") (* * This is called when DInfo is selected from the Background Menu.) (DECLARE (GLOBALVARS DINFO.GRAPHS)) (ALLOW.BUTTON.EVENTS) (RESETFORM (TTY.PROCESS (THIS.PROCESS)) (LET [(GRAPH (if (NULL DINFO.GRAPHS) then (PROMPTPRINT "No Graphs installed -- load HelpSys or DInfoEdit") elseif (NULL (CDR DINFO.GRAPHS)) then (EVAL (CADAR DINFO.GRAPHS)) else (MENU (create MENU CENTERFLG _ T TITLE _ "Select Graph" ITEMS _ DINFO.GRAPHS] (AND GRAPH (DINFO GRAPH]) (DINFO.DEFAULT.MENU [LAMBDA (GRAPH) (* jow "15-Jul-86 17:36") (* * This is the default MENUFN for DInfo graphs.) (LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))) (CLEARW (GETPROMPTWINDOW DINFOW)) (LET [(TYPE (MENU (OR (fetch (DINFOGRAPH DINFO.MENU) of GRAPH) (replace (DINFOGRAPH DINFO.MENU) of GRAPH with (create MENU ITEMS _ '(("Top" 'Top "Visit the top node in the graph" ) ("Parent" 'Parent "Visit the parent of the current node" ) ("Previous" 'Previous "Visit the node before this node") ("Next " 'Next "Visit the node following this node") ("Find" 'Find "Search the text of this node") ("Lookup" 'Lookup "Lookup a new term in this graph") ("Expanded Menu" 'FreeMenu "Add an expanded options menu.")) CENTERFLG _ T MENUFONT _ (FONTCREATE 'HELVETICA 10 'BOLD] (if TYPE then (PROCESSPROP (THIS.PROCESS) 'NAME (CONCAT "DInfo " TYPE)) (SELECTQ TYPE ((Top Parent Previous Next) (DINFO.SPECIAL.UPDATE TYPE GRAPH)) (Find (DINFO.FIND GRAPH)) (Lookup (DINFO.LOOKUP GRAPH '(LEFT))) (FreeMenu (DINFO.ADD.FMENU GRAPH) (DINFO.UPDATE GRAPH)) NIL]) (DINFO.FIND [LAMBDA (GRAPH BUTTONS) (* drc%: "25-Jan-86 18:23") (LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))) (if (NOT (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) T)) then (FLASHWINDOW DINFOW) (PROMPTPRINT "DInfo is busy") else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW)) (TERPRI T) (LET ([STRING (if (AND (FMEMB 'MIDDLE BUTTONS) (fetch (DINFOGRAPH FIND.STRING) of GRAPH)) else (PROMPTFORWORD "Find: " (fetch (DINFOGRAPH FIND.STRING) of GRAPH) NIL NIL NIL 'TTY (CONSTANT (CHARCODE (EOL ESCAPE LF] (TEXTSTREAM (WINDOWPROP DINFOW 'TEXTSTREAM)) PAIR) (replace (DINFOGRAPH FIND.STRING) of GRAPH with STRING) (if STRING then (PRINTOUT T " Searching...") (if (SETQ PAIR (TEDIT.FIND TEXTSTREAM STRING NIL NIL T)) then (printout T "OK.") (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SHOWSEL TEXTSTREAM T (TEDIT.SETSEL TEXTSTREAM (CAR PAIR) (NCHARS STRING) 'RIGHT T))) else (printout T "not found.") (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM 0 0]) (DINFO.LOOKUP [LAMBDA (GRAPH BUTTONS) (* drc%: "25-Jan-86 18:22") (LET ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH))) (if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) T) then [RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW)) (LET ((LOOKUPFN (fetch (DINFOGRAPH LOOKUPFN) of GRAPH))) (if LOOKUPFN then (CLEARW T) (LET* [(OLD.STRING (fetch (DINFOGRAPH LOOKUP.STRING) of GRAPH)) (STRING (if (AND OLD.STRING (FMEMB 'MIDDLE BUTTONS)) then OLD.STRING else (PROMPTFORWORD "Lookup: " OLD.STRING NIL NIL NIL 'TTY (CONSTANT (CHARCODE (EOL ESCAPE LF] (replace (DINFOGRAPH LOOKUP.STRING) of GRAPH with STRING) (AND STRING (APPLY* LOOKUPFN STRING GRAPH))) else (PRINTOUT T T "The " (fetch (DINFOGRAPH NAME) of GRAPH) " graph has no LOOKUPFN."] else (FLASHWINDOW DINFOW) (PROMPTPRINT "DInfo is busy"]) ) (DEFINEQ (DINFO.READ.KOTO.GRAPH [LAMBDA (FILE QUIETFLG) (* drc%: " 4-Feb-86 11:27") (* Reads a file written by Koto DINFO.WRITE.GRAPH and returns a Lute  DINFOGRAPH. Thus, (DINFO.WRITE.GRAPH (DINFO.READ.KOTO.GRAPH ) )  will convert the Koto format graph in to a Lute format graph in  .) (OR QUIETFLG (printout T T "Reading " (FILENAMEFIELD FILE 'NAME) " graph...")) (LET* ((FULLFILENAME (INFILEP FILE)) [DATA (CDR (READFILE (OR FULLFILENAME (ERROR "FILE NOT FOUND" FILE] (GRAPH (create DINFOGRAPH))) (* in Koto we just wrote out the  DINFOGRAPH record) (for FIELD in DATA as N from 1 to 11 do (* fields stored on file) (SELECTQ N ((1 4 5 6 10 11)) (2 (replace (DINFOGRAPH NODELST) of GRAPH with FIELD)) (3 (replace (DINFOGRAPH TOPNODEID) of GRAPH with FIELD)) (7 (replace (DINFOGRAPH TEXTPROPS) of GRAPH with FIELD)) (8 (replace (DINFOGRAPH LOOKUPFN) of GRAPH with FIELD)) (9 (replace (DINFOGRAPH MENUFN) of GRAPH with FIELD)) (SHOULDNT))) (* fields filled in at read time) (replace (DINFOGRAPH NAME) of GRAPH with (FILENAMEFIELD FULLFILENAME 'NAME)) (replace (DINFOGRAPH DEFAULTHOST) of GRAPH with (FILENAMEFIELD FULLFILENAME 'HOST)) (replace (DINFOGRAPH DEFAULTDEVICE) of GRAPH with (FILENAMEFIELD FULLFILENAME 'DEVICE)) (replace (DINFOGRAPH DEFAULTDIR) of GRAPH with (FILENAMEFIELD FULLFILENAME 'DIRECTORY)) (OR QUIETFLG (printout T "OK.")) GRAPH]) ) (DEFINEQ (DINFO.SETUP.WINDOW [LAMBDA (GRAPH WINDOW NO.FREEMENU?) (* jow "10-Jun-86 15:29") (replace (DINFOGRAPH WINDOW) of GRAPH with WINDOW) (WINDOWPROP WINDOW 'DINFOGRAPH GRAPH) (DETACHALLWINDOWS WINDOW) (if (NOT NO.FREEMENU?) then (DINFO.ADD.FMENU GRAPH)) (DINFO.UPDATE.TEXT.DISPLAY GRAPH NIL NIL T) (WINDOWPROP WINDOW 'TITLE (CONCAT (fetch (DINFOGRAPH NAME) of GRAPH) " DInfo")) (WINDOWADDPROP WINDOW 'CLOSEFN 'DINFO.CLOSEFN) (WINDOWADDPROP WINDOW 'SHRINKFN 'DINFO.SHRINKFN) (WINDOWADDPROP WINDOW 'EXPANDFN 'DINFO.EXPANDFN]) (DINFO.CLOSEFN [LAMBDA (W) (* drc%: "25-Jan-86 18:26") (LET [(GRAPH (WINDOWPROP W 'DINFOGRAPH] (if (type? DINFOGRAPH GRAPH) then (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)) (* remove circularity...) (WINDOWPROP W 'DINFOGRAPH NIL]) (DINFO.SHRINKFN [LAMBDA (W) (* drc%: "25-Jan-86 18:26") (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of (DINFOGRAPH W]) (DINFO.EXPANDFN [LAMBDA (W) (* jow "15-Jul-86 17:00") (LET* ((GRAPH (DINFOGRAPH W)) (FMENU (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH))) (if (AND FMENU (LISTGET (FM.GETSTATE FMENU) 'GRAPH)) then (LET ((GRAPHW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH))) (OPENW GRAPHW) (TOTOPW W) (WINDOWPROP GRAPHW 'DINFOGRAPH GRAPH]) (DINFO.ICONFN [LAMBDA (W) (* drc%: "25-Jan-86 16:33") (OR (WINDOWPROP WINDOW 'ICON) (WINDOWPROP WINDOW 'ICON (TITLEDICONW TEDIT.TITLED.ICON.TEMPLATE (WINDOWPROP WINDOW 'TITLE) TEDIT.ICON.FONT NIL T)) (WINDOWPROP WINDOW 'ICON]) ) (DEFINEQ (DINFO.ADD.FMENU [LAMBDA (GRAPH) (* jow "20-May-86 15:41") (* * Add a DInfo FreeMenu to WINDOW. then update the FreeMenu's display.) (LET ((WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (FM.WINDOW (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH))) (if [AND (WINDOWP FM.WINDOW) (FMEMB FM.WINDOW (WINDOWPROP WINDOW 'ATTACHEDWINDOWS] then (OPENW FM.WINDOW) else (REMOVEPROMPTWINDOW WINDOW) (SETQ FM.WINDOW (OR (WINDOWP FM.WINDOW) (DINFO.CREATE.FMENU GRAPH))) (replace (DINFOGRAPH FMENU.WINDOW) of GRAPH with FM.WINDOW) (ATTACHWINDOW FM.WINDOW WINDOW) (WINDOWPROP FM.WINDOW 'FM.PROMPTWINDOW (GETPROMPTWINDOW WINDOW)) (WINDOWDELPROP FM.WINDOW 'PASSTOMAINCOMS 'CLOSEW) (WINDOWADDPROP FM.WINDOW 'CLOSEFN 'DINFO.FMW.CLOSEFN T) (DINFO.UPDATE.FMENU GRAPH]) (DINFO.CREATE.FMENU [LAMBDA (GRAPH) (* jow "15-Jul-86 17:39") (* * Makes a DInfo FreeMenu for GRAPH) (LET* [(ADD.ITEMS (fetch (DINFOGRAPH FREEMENUITEMS) of GRAPH)) (FONT (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of GRAPH)) MENUFONT)) (FM (FREEMENU `((PROPS FONT %, FONT) ((LABEL Node%: TYPE DISPLAY FONT (HELVETICA 10)) (ID NODE LABEL "" TYPE DISPLAY)) ((LABEL Top! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Visit the top node") (ID TOP LABEL "" TYPE DISPLAY)) ((LABEL Parent! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Visit the parent of the current node") (ID PARENT LABEL "" TYPE DISPLAY)) ((LABEL Previous! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Visit the node previous to the current node") (ID PREVIOUS LABEL "" TYPE DISPLAY)) ((LABEL Next! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Visit the node after the current node") (ID NEXT LABEL "" TYPE DISPLAY)) ((LABEL Display%: TYPE DISPLAY FONT (HELVETICA 10)) (LABEL Graph ID GRAPH INITSTATE %, (MEMB 'GRAPH DINFOMODES) TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.GRAPH FONT (HELVETICA 10 BOLD) MESSAGE "Toggle display of the graph") (LABEL Menu ID MENU INITSTATE %, (MEMB 'MENU DINFOMODES) TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.MENU FONT (HELVETICA 10 BOLD) MESSAGE "Toggle display of the subnode menu") (LABEL Text ID TEXT INITSTATE %, (MEMB 'TEXT DINFOMODES) TYPE TOGGLE SELECTEDFN DINFO.TOGGLE.TEXT FONT (HELVETICA 10 BOLD) MESSAGE "Toggle display of the text of the current node") (LABEL History ID HISTORY INITSTATE %, (MEMB 'HISTORY DINFOMODES) TYPE TOGGLE FONT (HELVETICA 10 BOLD) SELECTEDFN DINFO.TOGGLE.HISTORY MESSAGE "Toggle the display of the History Menu")) %, (APPEND '((LABEL Find! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Perform a string search in the selected text of the current node" ) (LABEL Lookup! SELECTEDFN DINFO.FMENU.HANDLER FONT (HELVETICA 10 BOLD) MESSAGE "Lookup a term in this graph. LEFT for new term, MIDDLE to repeat last." )) ADD.ITEMS] (WINDOWPROP FM 'FM.DONTRESHAPE T) FM]) (DINFO.FMW.CLOSEFN [LAMBDA (W) (* drc%: "25-Jan-86 18:19") (* * CLOSEFN for a DInfo FreeMenu window.) (LET* ((DINFOW (WINDOWPROP W 'MAINWINDOW)) (GRAPH (DINFOGRAPH DINFOW))) (if GRAPH then (DETACHWINDOW W) (replace (DINFOGRAPH FMENU.WINDOW) of GRAPH with NIL) (DETACHWINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH)) (CLOSEW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH)) (DETACHWINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH)) (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH)) (REMOVEPROMPTWINDOW DINFOW]) (DINFO.FMENU.HANDLER [LAMBDA (ITEM WINDOW BUTTONS) (* drc%: "16-Jan-86 11:42") (* * Handle a command from the FreeMenu.) (LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW 'MAINWINDOW) 'DINFOGRAPH)) (TYPE (MKATOM (SUBSTRING (FM.ITEMPROP ITEM 'LABEL) 1 -2] (SELECTQ TYPE ((Top Parent Previous Next) (DINFO.SPECIAL.UPDATE TYPE GRAPH)) (Find (DINFO.FIND GRAPH BUTTONS)) (Lookup (DINFO.LOOKUP GRAPH BUTTONS)) (SHOULDNT]) (DINFO.UPDATE.FMENU [LAMBDA (GRAPH NEW.NODE) (* jow "20-May-86 15:13") (* * Update the display of GRAPH's FreeMenu.  If NEW.NODE is not specified, use Top node of GRAPH, and change Top node title.) (LET* [(W (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH)) (NODELST (fetch (DINFOGRAPH NODELST) of GRAPH)) (NODE (OR NEW.NODE (FASSOC (fetch (DINFONODE ID) of (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)) NODELST) (FASSOC (fetch (DINFOGRAPH TOPNODEID) of GRAPH) NODELST] (OR NEW.NODE (FM.CHANGELABEL (FM.GETITEM 'TOP NIL W) (fetch (DINFONODE LABEL) of (FASSOC (fetch (DINFOGRAPH TOPNODEID) of GRAPH) (fetch (DINFOGRAPH NODELST) of GRAPH))) W)) (FM.CHANGELABEL (FM.GETITEM 'NODE NIL W) (fetch (DINFONODE LABEL) of NODE) W) (FM.CHANGELABEL (FM.GETITEM 'PARENT NIL W) (fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE PARENT) of NODE) NODELST)) W) (FM.CHANGELABEL (FM.GETITEM 'NEXT NIL W) (fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE NEXTNODE) of NODE) NODELST)) W) (FM.CHANGELABEL (FM.GETITEM 'PREVIOUS NIL W) (fetch (DINFONODE LABEL) of NODE (FASSOC (fetch (DINFONODE PREVIOUSNODE) of NODE) NODELST)) W]) (DINFO.TOGGLE.MENU [LAMBDA (ITEM WINDOW) (* jow "10-Jun-86 14:15") (LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW 'MAINWINDOW) 'DINFOGRAPH] (if (FM.ITEMPROP ITEM 'STATE) then (DINFO.UPDATE.MENU.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)) else (LET ((SUBNODE.MENU.WINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH))) (DETACHWINDOW SUBNODE.MENU.WINDOW) (CLOSEW SUBNODE.MENU.WINDOW]) (DINFO.TOGGLE.GRAPH [LAMBDA (ITEM WINDOW) (* ; "Edited 1-Oct-87 09:56 by drc:") (LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW 'MAINWINDOW) 'DINFOGRAPH] (if (FM.ITEMPROP ITEM 'STATE) then (DINFO.UPDATE.GRAPH.DISPLAY GRAPH (fetch CURRENTNODE of GRAPH) T) else (CLOSEW (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH))) ITEM]) (DINFO.TOGGLE.HISTORY [LAMBDA (ITEM WINDOW) (* jow "10-Jun-86 14:22") (LET [(GRAPH (WINDOWPROP (WINDOWPROP WINDOW 'MAINWINDOW) 'DINFOGRAPH] (if (FM.ITEMPROP ITEM 'STATE) then (DINFO.UPDATE.HISTORY GRAPH NIL NIL T) else (LET ((HISTORY.MENU.WINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH))) (DETACHWINDOW HISTORY.MENU.WINDOW) (CLOSEW HISTORY.MENU.WINDOW]) (DINFO.TOGGLE.TEXT [LAMBDA (ITEM WINDOW) (* drc%: "25-Jan-86 18:26") (LET* ((DINFOW (WINDOWPROP WINDOW 'MAINWINDOW)) (GRAPH (WINDOWPROP DINFOW 'DINFOGRAPH)) (MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH))) (if (NOT (OBTAIN.MONITORLOCK MONITORLOCK T)) then (FLASHWINDOW DINFOW) (PROMPTPRINT "DInfo is busy") elseif (FM.ITEMPROP ITEM 'STATE) then (DINFO.UPDATE.TEXT.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH)) (RELEASE.MONITORLOCK MONITORLOCK) else (DINFO.UPDATE.TEXT.DISPLAY GRAPH (fetch (DINFOGRAPH CURRENTNODE) of GRAPH) NIL T) (RELEASE.MONITORLOCK MONITORLOCK]) ) (DEFINEQ (DINFO.UPDATE.MENU.DISPLAY [LAMBDA (GRAPH NODE) (* drc%: "25-Jan-86 18:20") (LET* [(DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (WINDOW (fetch (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH)) [CHILDREN (DREVERSE (for ID in (fetch (DINFONODE CHILDREN) of NODE) bind (NODELST _ (fetch (DINFOGRAPH NODELST) of GRAPH)) collect (FASSOC ID NODELST] (LENGTH (FLENGTH CHILDREN)) (SCROLLABLE (GREATERP LENGTH \DINFO.MAX.MENU.LEN)) (MENU (create MENU MENUFONT _ (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of GRAPH)) MENUFONT) ITEMWIDTH _ (WINDOWPROP DINFOW 'WIDTH) CENTERFLG _ T MENUCOLUMNS _ 1 MENUOUTLINESIZE _ 0 ITEMS _ (for CHILD in CHILDREN collect (LIST (fetch (DINFONODE LABEL) of CHILD) CHILD "Will visit this node if selected." )) WHENSELECTEDFN _ (FUNCTION DINFO.UPDATE.FROM.MENU] (AND WINDOW (PROGN (DETACHWINDOW WINDOW) (CLOSEW WINDOW))) (if CHILDREN then (UPDATE/MENU/IMAGE MENU) (SETQ WINDOW (CREATEW (create REGION LEFT _ 0 BOTTOM _ 0 WIDTH _ (WINDOWPROP DINFOW 'WIDTH) HEIGHT _ (HEIGHTIFWINDOW (if SCROLLABLE then (TIMES \DINFO.MAX.MENU.LEN (fetch (MENU ITEMHEIGHT) of MENU)) else (fetch (MENU IMAGEHEIGHT) of MENU)) T)) "Subnodes" NIL T)) (ADDMENU MENU WINDOW (create POSITION XCOORD _ 0 YCOORD _ (if SCROLLABLE then (TIMES (DIFFERENCE \DINFO.MAX.MENU.LEN LENGTH) (fetch (MENU ITEMHEIGHT) of MENU)) else 0)) T) (ATTACHWINDOW WINDOW DINFOW 'BOTTOM) (REDISPLAYW WINDOW) (replace (DINFOGRAPH SUBNODE.MENU.WINDOW) of GRAPH with WINDOW) (LET [(BITS (fetch (REGION BOTTOM) of (WINDOWPROP WINDOW 'REGION] (* Slide DINFOW up if our new menu is off the screen) (AND (ILESSP BITS 0) (RELMOVEW DINFOW (create POSITION XCOORD _ 0 YCOORD _ (IDIFFERENCE 0 BITS]) (DINFO.UPDATE.FROM.MENU [LAMBDA (ITEM MENU BUTTONS) (* drc%: "12-Dec-85 14:49") (DINFO.UPDATE (WINDOWPROP (WINDOWPROP (WFROMMENU MENU) 'MAINWINDOW) 'DINFOGRAPH) (CADR ITEM]) (DINFO.UPDATE.HISTORY [LAMBDA (GRAPH NODE SEL DISPLAY?) (* drc%: "25-Jan-86 18:21") (LET* ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (OLDWINDOW (fetch (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH)) (OLDITEMS (fetch (DINFOGRAPH HISTORY.ITEMS) of GRAPH)) (NEWITEM (if SEL then (LIST (if (LISTP SEL) then (CAR SEL) else SEL) (LIST (fetch (DINFONODE ID) of NODE) SEL) "Will re-lookup this term") elseif NODE then (LIST (fetch (DINFONODE LABEL) of NODE) (LIST (fetch (DINFONODE ID) of NODE) SEL) "Will re-visit this node"))) (ITEMS (if [AND NEWITEM (NOT (EQUAL NEWITEM (CAR OLDITEMS] then (CONS NEWITEM (for ITEM in OLDITEMS as I from 2 to DINFO.HISTORY.LENGTH collect ITEM)) else OLDITEMS))) (replace (DINFOGRAPH HISTORY.ITEMS) of GRAPH with ITEMS) (AND OLDWINDOW (PROGN (DETACHWINDOW OLDWINDOW) (CLOSEW OLDWINDOW))) (AND DISPLAY? ITEMS (LET [(HISTORYW (ATTACHMENU (create MENU MENUFONT _ (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of GRAPH)) MENUFONT) TITLE _ "History" CENTERFLG _ T MENUCOLUMNS _ 1 ITEMS _ ITEMS WHENSELECTEDFN _ (FUNCTION DINFO.HISTORIC.UPDATE)) DINFOW 'LEFT 'TOP] (replace (DINFOGRAPH HISTORY.MENU.WINDOW) of GRAPH with HISTORYW]) (DINFO.HISTORIC.UPDATE [LAMBDA (ITEM MENU BUTTONS) (* drc%: "25-Jan-86 18:24") (LET* [(ID (CAADR ITEM)) (SEL (CADADR ITEM)) (WINDOW (WINDOWPROP (WFROMMENU MENU) 'MAINWINDOW)) (GRAPH (WINDOWPROP WINDOW 'DINFOGRAPH)) (NODE (FASSOC ID (fetch (DINFOGRAPH NODELST) of GRAPH] (if (NOT (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) T)) then (FLASHWINDOW WINDOW) (PROMPTPRINT "DInfo is busy") elseif (NULL NODE) then (PRINTOUT (GETPROMPTWINDOW WINDOW) T "This node no longer exists") else (DINFO.UPDATE GRAPH NODE SEL]) ) (DEFINEQ (DINFO.UPDATE.GRAPH.DISPLAY [LAMBDA (DINFO.GRAPH NODE FORCE?) (* drc%: "27-Jan-86 16:19") (LET [(DINFOW (fetch (DINFOGRAPH WINDOW) of DINFO.GRAPH)) (LOCATION (CONS (fetch (DINFONODE PARENT) of NODE) (fetch (DINFONODE CHILDREN) of NODE] (if (AND (NOT FORCE?) (EQUAL LOCATION (fetch (DINFOGRAPH LAST.GRAPH.LOCATION) of DINFO.GRAPH))) then (* don't need to relayout grapher display --  just change which node is inverted.) (DINFO.INVERT.NODE (fetch (DINFOGRAPH GRAPH.WINDOW) of DINFO.GRAPH) NODE DINFO.GRAPH) else (DINFO.SHOWGRAPH (DINFO.LAYOUTGRAPH DINFO.GRAPH NODE) DINFO.GRAPH)) (replace (DINFOGRAPH LAST.GRAPH.LOCATION) of DINFO.GRAPH with LOCATION) (WINDOWPROP (fetch (DINFOGRAPH GRAPH.WINDOW) of DINFO.GRAPH) 'TITLE (CONCAT (fetch (DINFOGRAPH NAME) of DINFO.GRAPH) " - " (fetch (DINFONODE LABEL) of (fetch (DINFOGRAPH CURRENTNODE) of DINFO.GRAPH]) (DINFO.UPDATE.FROM.GRAPH [LAMBDA (GRAPHER.NODE GRAPH.WINDOW) (* drc%: "12-Dec-85 18:34") (AND GRAPHER.NODE (ADD.PROCESS `(DINFO.UPDATE (QUOTE %, (WINDOWPROP GRAPH.WINDOW 'DINFOGRAPH)) (QUOTE %, (fetch (GRAPHNODE NODEID) of GRAPHER.NODE))) 'NAME "DInfo From Graph"]) (DINFO.GET.GRAPH.WINDOW [LAMBDA (GRAPH REGION) (* drc%: "25-Jan-86 18:05") (LET ((W (fetch (DINFOGRAPH GRAPH.WINDOW) of GRAPH))) (COND ((WINDOWP W)) (T (SETQ W (DINFO.CREATE.GRAPH.WINDOW GRAPH REGION)) [WINDOWPROP W 'CLOSEFN (FUNCTION (LAMBDA (W) (WINDOWPROP W 'DINFOGRAPH NIL] (replace (DINFOGRAPH GRAPH.WINDOW) of GRAPH with W))) (WINDOWPROP W 'DINFOGRAPH GRAPH) W]) (DINFO.CREATE.GRAPH.WINDOW [LAMBDA (GRAPH REGION) (* drc%: "25-Jan-86 17:49") (LET* ((DINFOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (DINFOREGION (WINDOWPROP DINFOW 'REGION)) (LEFT (DIFFERENCE (DIFFERENCE (fetch (REGION LEFT) of DINFOREGION) (fetch (REGION WIDTH) of REGION)) 10)) (BOTTOM (DIFFERENCE (DIFFERENCE (fetch (REGION BOTTOM) of DINFOREGION) (fetch (REGION HEIGHT) of REGION)) 50))) (CREATEW (CREATEREGION (if (GEQ LEFT 0) then LEFT else (RAND 0 10)) (if (GEQ BOTTOM 0) then BOTTOM else (RAND 0 10)) (fetch (REGION WIDTH) of REGION) (fetch (REGION HEIGHT) of REGION)) NIL NIL T]) (DINFO.SHOWGRAPH [LAMBDA (GRAPHER.GRAPH DINFO.GRAPH) (* drc%: "27-Jan-86 16:15") (LET* [(GRAPH.REGION (GRAPHREGION GRAPHER.GRAPH)) (GRAPH.WINDOW (DINFO.GET.GRAPH.WINDOW DINFO.GRAPH GRAPH.REGION)) (WINDOW.REGION (WINDOWPROP GRAPH.WINDOW 'REGION] [SHAPEW GRAPH.WINDOW (LET [(LEFT (fetch (REGION LEFT) of WINDOW.REGION)) (BOTTOM (fetch (REGION BOTTOM) of WINDOW.REGION)) (HEIGHT (HEIGHTIFWINDOW (fetch (REGION HEIGHT) of GRAPH.REGION) T)) (WIDTH (WIDTHIFWINDOW (fetch (REGION WIDTH) of GRAPH.REGION] (create REGION LEFT _ LEFT BOTTOM _ BOTTOM HEIGHT _ (if (GEQ (IPLUS BOTTOM HEIGHT) SCREENHEIGHT) then (IDIFFERENCE SCREENHEIGHT BOTTOM) else HEIGHT) WIDTH _ (if (GEQ (IPLUS LEFT WIDTH) SCREENWIDTH) then (IDIFFERENCE SCREENWIDTH LEFT) else WIDTH] (SHOWGRAPH GRAPHER.GRAPH GRAPH.WINDOW (FUNCTION DINFO.UPDATE.FROM.GRAPH) (FUNCTION DINFO.UPDATE.FROM.GRAPH]) (DINFO.INVERT.NODE [LAMBDA (WINDOW DINFO.NODE DINFO.GRAPH) (* drc%: "25-Jan-86 18:24") (LET* ((NODE (for NODE in (fetch (GRAPH GRAPHNODES) of (WINDOWPROP WINDOW 'GRAPH)) thereis (EQ (fetch (GRAPHNODE NODEID) of NODE) DINFO.NODE))) (LAST.NODE (fetch (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH))) (replace (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH with NODE) (if (NEQ NODE LAST.NODE) then (replace (GRAPHNODE NODELABELSHADE) of NODE with BLACKSHADE) (* (PRINTDISPLAYNODE NODE  (create POSITION XCOORD _ 0 YCOORD _ 0)  WINDOW)) (replace (GRAPHNODE NODELABELSHADE) of LAST.NODE with WHITESHADE) (* (PRINTDISPLAYNODE LAST.NODE  (create POSITION XCOORD _ 0 YCOORD _ 0)  WINDOW)) (REDISPLAYW WINDOW) else (OPENW WINDOW]) (DINFO.LAYOUTGRAPH [LAMBDA (DINFO.GRAPH NODE) (* drc%: "25-Jan-86 18:20") (LET* [(WINDOW (fetch (DINFOGRAPH WINDOW) of DINFO.GRAPH)) (FONT (OR (FONTP (fetch (DINFOGRAPH MENUFONT) of DINFO.GRAPH)) MENUFONT)) (NODELST (fetch (DINFOGRAPH NODELST) of DINFO.GRAPH)) (CHILDREN (for ID in (fetch (DINFONODE CHILDREN) of NODE) collect (FASSOC ID NODELST))) [CHILD.GRAPHER.NODES (for CHILD in CHILDREN collect (create GRAPHNODE NODEID _ CHILD NODELABEL _ (fetch (DINFONODE LABEL) of CHILD] (GRAPHER.NODE (create GRAPHNODE NODELABELSHADE _ BLACKSHADE NODEID _ NODE TONODES _ CHILDREN NODELABEL _ (fetch (DINFONODE LABEL) of NODE] (replace (DINFOGRAPH LAST.INVERTED.NODE) of DINFO.GRAPH with GRAPHER.NODE) (* so DINFO.INVERT.NODE will work  right) (if (fetch (DINFONODE PARENT) of NODE) then (LET* ((PARENT (FASSOC (fetch (DINFONODE PARENT) of NODE) NODELST)) (SIBLINGS (for ID in (fetch (DINFONODE CHILDREN) of PARENT) collect (FASSOC ID NODELST))) [SIBLING.GRAPHER.NODES (for SIBLING in SIBLINGS collect (if (EQ (fetch (DINFONODE ID) of SIBLING) (fetch (DINFONODE ID) of NODE)) then GRAPHER.NODE else (create GRAPHNODE NODEID _ SIBLING NODELABEL _ (fetch (DINFONODE LABEL) of SIBLING] (PARENT.GRAPHER.NODE (create GRAPHNODE NODEID _ PARENT NODELABEL _ (fetch (DINFONODE LABEL) of PARENT) TONODES _ SIBLINGS))) (LAYOUTGRAPH (CONS PARENT.GRAPHER.NODE (NCONC SIBLING.GRAPHER.NODES CHILD.GRAPHER.NODES)) (LIST PARENT) NIL FONT)) else (LAYOUTGRAPH (CONS GRAPHER.NODE CHILD.GRAPHER.NODES) (LIST NODE) NIL FONT]) ) (DEFINEQ (DINFO.UPDATE.TEXT.DISPLAY [LAMBDA (GRAPH NODE SEL OFF?) (* drc%: "25-Jan-86 18:18") (LET ((WINDOW (fetch (DINFOGRAPH WINDOW) of GRAPH)) (FILENAME (DINFO.GET.FILENAME GRAPH NODE)) (FROM (fetch (DINFONODE FROMBYTE) of NODE)) (TO (fetch (DINFONODE TOBYTE) of NODE)) (PROPS (APPEND (LIST 'READONLY T 'NOTITLE T 'TITLEMENUFN 'DINFO.TITLEMENUFN) (fetch (DINFOGRAPH TEXTPROPS) of GRAPH))) (OLD.TEXTSTREAM (WINDOWPROP (fetch (DINFOGRAPH WINDOW) of GRAPH) 'TEXTSTREAM)) TEXTSTREAM FULLFILENAME) (* Default directory and host.) (if (OR OFF? (NULL FILENAME)) then (OPENTEXTSTREAM (if OFF? then "" else "This node has no text") WINDOW NIL NIL PROPS) (replace (DINFOGRAPH LAST.TEXT) of GRAPH with NIL) elseif (SETQ FULLFILENAME (MKATOM (INFILEP FILENAME))) then (SETQ TEXTSTREAM (DINFO.OPENTEXTSTREAM FULLFILENAME WINDOW FROM TO PROPS)) (DINFO.SHOWSEL TEXTSTREAM SEL) else (OPENTEXTSTREAM (CONCAT "Sorry, can't find the text for this node." (MKSTRING (CHARACTER (CHARCODE CR))) "Missing file is: " FILENAME) WINDOW NIL NIL PROPS) (replace (DINFOGRAPH LAST.TEXT) of GRAPH with NIL)) (CLOSEF? OLD.TEXTSTREAM) (WINDOWPROP WINDOW 'ICONFN 'DINFO.ICONFN) (WINDOWPROP WINDOW 'TEDIT.TITLEMENUFN 'DINFO.TITLEMENUFN]) (DINFO.TITLEMENUFN [LAMBDA (DINFOW) (* drc%: "25-Jan-86 18:19") (* * This is the TEdit TITLEMENUFN for a DInfo Window.  Uses the MENUFN of graph, defaulting to DINFO.DEFAULT.MENU.) (LET [(GRAPH (WINDOWPROP DINFOW 'DINFOGRAPH] (if (OBTAIN.MONITORLOCK (fetch (DINFOGRAPH MONITORLOCK) of GRAPH) T) then [LET ((MENUFN (fetch (DINFOGRAPH MENUFN) of GRAPH))) (if (FGETD MENUFN) then (OR (fetch (DINFOGRAPH FMENU.WINDOW) of GRAPH) (DINFO.ADD.FMENU GRAPH)) (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW)) (APPLY* MENUFN GRAPH)) else (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW DINFOW)) (DINFO.DEFAULT.MENU GRAPH] else (FLASHWINDOW DINFOW) (PROMPTPRINT "DInfo is busy"]) (DINFO.OPENTEXTSTREAM [LAMBDA (FILE WINDOW FROM TO PROPS) (* drc%: "25-Jan-86 18:24") (RESETFORM (TTYDISPLAYSTREAM (GETPROMPTWINDOW WINDOW)) (LET ((TEXTSTREAM (WINDOWPROP WINDOW 'TEXTSTREAM)) (THIS.TEXT (LIST FILE FROM TO))) (if (AND (EQUAL THIS.TEXT (fetch (DINFOGRAPH LAST.TEXT) of (DINFOGRAPH WINDOW))) TEXTSTREAM) then (* Same text, and its still there, so  do nothing.) TEXTSTREAM else (AND TEXTSTREAM (TEDIT.KILL TEXTSTREAM)) (CLEARW T) (CLEARW WINDOW) [RESETSAVE NIL `(AND RESETSTATE (WINDOWPROP %, WINDOW 'LAST.TEXT NIL] (PRINTOUT T "Fetching text from " FILE "...") (PROG1 (OPENTEXTSTREAM FILE WINDOW FROM TO PROPS) (PRINTOUT T "OK.") (replace (DINFOGRAPH LAST.TEXT) of (DINFOGRAPH WINDOW) with THIS.TEXT]) (DINFO.SHOWSEL [LAMBDA (TEXTSTREAM SEL) (* drc%: "16-Jan-86 21:30") (if (LISTP SEL) then (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM (CADR SEL) 0)) elseif (STRINGP SEL) then [LET ((CHAR# (TEDIT.FIND TEXTSTREAM SEL))) (if CHAR# then (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM CHAR# (NCHARS SEL) NIL T] else (TEDIT.NORMALIZECARET TEXTSTREAM (TEDIT.SETSEL TEXTSTREAM 0 0]) (DINFO.GET.FILENAME [LAMBDA (GRAPH NODE) (* drc%: "10-Jan-86 14:47") (* * returns the filename of the documentation for NODE in GRAPH.  Defaults HOST and DIRECTORY to that of graph) (LET ((FILE (fetch (DINFONODE FILE) of NODE))) (AND FILE (PACKFILENAME 'HOST (OR (FILENAMEFIELD FILE 'HOST) (fetch (DINFOGRAPH DEFAULTHOST) of GRAPH)) 'DEVICE (OR (FILENAMEFIELD FILE 'DEVICE) (fetch (DINFOGRAPH DEFAULTDEVICE) of GRAPH)) 'DIRECTORY (OR (FILENAMEFIELD FILE 'DIRECTORY) (fetch (DINFOGRAPH DEFAULTDIR) of GRAPH)) 'BODY FILE]) ) (ADDTOVAR BackgroundMenuCommands (DInfo (DINFO.SELECT.GRAPH) "Open a DInfo window for browsing documentation.")) (RPAQQ BackgroundMenu NIL) (RPAQ? DINFO.GRAPHS ) (RPAQ? DINFOMODES '(TEXT GRAPH)) (RPAQ? DINFO.HISTORY.LENGTH 20) (RPAQ? \DINFO.MAX.MENU.LEN 10) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DINFO.GRAPH.FILES DINFOMODES DINFO.HISTORY.LENGTH \DINFO.MAX.MENU.LEN) ) (PUTPROPS DINFO FILETYPE :COMPILE-FILE) (PUTPROPS DINFO COPYRIGHT ("Xerox Corporation" 1985 1986 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (6293 23119 (DINFO 6303 . 7917) (DINFO.UPDATE 7919 . 10783) (DINFOGRAPH 10785 . 11203) ( DINFO.SPECIAL.UPDATE 11205 . 12903) (DINFO.READ.GRAPH 12905 . 14760) (DINFO.WRITE.GRAPH 14762 . 15852) (DINFO.SELECT.GRAPH 15854 . 16761) (DINFO.DEFAULT.MENU 16763 . 19287) (DINFO.FIND 19289 . 21673) ( DINFO.LOOKUP 21675 . 23117)) (23120 25814 (DINFO.READ.KOTO.GRAPH 23130 . 25812)) (25815 28129 ( DINFO.SETUP.WINDOW 25825 . 26506) (DINFO.CLOSEFN 26508 . 26941) (DINFO.SHRINKFN 26943 . 27139) ( DINFO.EXPANDFN 27141 . 27698) (DINFO.ICONFN 27700 . 28127)) (28130 38978 (DINFO.ADD.FMENU 28140 . 29235) (DINFO.CREATE.FMENU 29237 . 32774) (DINFO.FMW.CLOSEFN 32776 . 33621) (DINFO.FMENU.HANDLER 33623 . 34262) (DINFO.UPDATE.FMENU 34264 . 36469) (DINFO.TOGGLE.MENU 36471 . 37061) (DINFO.TOGGLE.GRAPH 37063 . 37562) (DINFO.TOGGLE.HISTORY 37564 . 38108) (DINFO.TOGGLE.TEXT 38110 . 38976)) (38979 46677 ( DINFO.UPDATE.MENU.DISPLAY 38989 . 43009) (DINFO.UPDATE.FROM.MENU 43011 . 43310) (DINFO.UPDATE.HISTORY 43312 . 45846) (DINFO.HISTORIC.UPDATE 45848 . 46675)) (46678 56844 (DINFO.UPDATE.GRAPH.DISPLAY 46688 . 48006) (DINFO.UPDATE.FROM.GRAPH 48008 . 48451) (DINFO.GET.GRAPH.WINDOW 48453 . 49038) ( DINFO.CREATE.GRAPH.WINDOW 49040 . 50157) (DINFO.SHOWGRAPH 50159 . 51884) (DINFO.INVERT.NODE 51886 . 53274) (DINFO.LAYOUTGRAPH 53276 . 56842)) (56845 62701 (DINFO.UPDATE.TEXT.DISPLAY 56855 . 58716) ( DINFO.TITLEMENUFN 58718 . 59843) (DINFO.OPENTEXTSTREAM 59845 . 61061) (DINFO.SHOWSEL 61063 . 61796) ( DINFO.GET.FILENAME 61798 . 62699))))) STOP \ No newline at end of file diff --git a/lispusers/DIR-TREE.TEDIT b/lispusers/DIR-TREE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b347c79ba289e4aa92ba3f1cf18b2ad5fc607947 GIT binary patch literal 9615 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.\;2 102873 |changes| |to:| (vars dirgraphercoms) (fns dg.advise-generate-file) |previous| |date:| "20-Aug-87 19:28:44" {erinyes}lyric>dirgrapher.\;1) ; Copyright (c) 1985, 1986, 1900, 1987, 1988 by Shaul Markovitch. All rights reserved. (prettycomprint dirgraphercoms) (rpaqq dirgraphercoms ((files grapher filebrowser) (initvars (* |;;;| "VARIABLES TO BE SET BY THE USER") (dg.promptwindowfont (fontcreate '(gacha 8))) (dg.graph-label-font (fontcreate '(gacha 8))) (dg.vertical-horizontal-option 'vertical) (dg.copy-over nil) (dg.box-all t) (dg.default-dir '{dsk}) (dg.concurrent nil) (dg.concurrent-all t) (dg.max-width 900) (dg.max-height 700) (dg.min-width 200) (dg.min-height 100) (dg.menu-edge 'right) (dg.menu-font littlefont) (dg.file-info-attributes '(size creationdate writedate author)) (dg.default-backup-directory '{floppy}) (dg.stand-alone-hosts '(dsk floppy core)) (dg.background-directories nil)) (vars dg.cancel-button-bm dg.ok-button-bm dg.reset-button-bm (* |;;;| "PROGRAM VARIABLES") (dg.iconfont (fontcreate '(gacha 8))) (dg.directory-was-selected-event (create.event)) (dg.monitor-lock (create.monitorlock "DG.MONITOR")) (dg.last-directory-selected nil) (dg.window-of-last-directory nil)) (fns dg.add-item-to-background-menu dg.advise-generate-file dg.apply-dirgrapher-command dg.apply-fb-on-dir-and-subdirs-command dg.apply-filebrowser-command dg.ask-for-backup-type dg.attach-directory-files-menu dg.backup-command dg.file-exists dg.file-info-command dg.file-info-selection-fn dg.files-hardcopy-command dg.load-files-command dg.newer-file dg.backup-on-default-command dg.backup-on-selected-command dg.connect-dir-command dg.copy-directory-command dg.copy-file-command dg.copybuttoneventfn dg.create-backup-free-menu dg.create-backup-name dg.create-directory-chain dg.create-directory-spec dg.create-directory-tree dg.create-graph-from-tree dg.create-icon-title dg.create-menu dg.create-path-from-file-name dg.create-prefix-from-path dg.create-quit-menu dg.create-subdir-command dg.create-tree-from-lists dg.create-tree-nodes dg.createiconw dg.current-connected-directory dg.delete-directory-command dg.delete-from-tree dg.delete-old-versions-command dg.delete-selected-files-command dg.directory-minus-prefix dg.directory-selection-function dg.display-directory-tree dg.docommand dg.docommand-with-monitor dg.docommand-without-monitor dg.exclusive-directory dg.exclusive-new-versions dg.exclusive-old-versions dg.fbiconfn dg.file-selection-fn dg.filecopy dg.find-directory-subtree dg.find-menu-item dg.find-parent-dierctory dg.flashallwindows dg.get-fb-pattern dg.get-file-list dg.get-initial-region dg.kill-process dg.move-dir-command dg.move-file-command dg.movecopy-command dg.movecopy-dir-command dg.pack-name-ver-ext dg.promptwindow dg.redisplayfn dg.residual-path dg.restore-command dg.restore-from-default-command dg.restore-from-selected-command dg.setify dg.shade-current-directory dg.trim dg.unadvise dg.unadvise-generate-file dg.unpack-directory-name dg.update-command dg.update-directory-tree dg.update-directroy-tree dg.wait-for-dir-selection dirgrapher) (bitmaps dg.icon dg.mask dg.fill-window-texture dg.whitebm) (p (dg.advise-generate-file) (setq dg.background-directories (union dg.background-directories (union directories (cons '{floppy} (for d in (volumes) when (lispdirectoryp d) collect (pack* '{dsk}< d '>)))))) (dg.add-item-to-background-menu '|DirGrapher| '(dirgrapher) "Will initiate dirgrapher process on the current directory" (cons 'subitems (cons '("DG Windows to top" (|for| w |in| (openwindows) |when| (or (windowprop w 'dg.path-to-root) (and (windowprop w 'iconfor) (windowprop (windowprop w 'iconfor) 'dg.path-to-root))) |do| (totopw w))) (for d in dg.background-directories collect (list d (list 'dirgrapher (kwote d)) (concat "WILL APPLY DIRGRAPHER ON " d))))))) (* |;;;| "(declare\\: dontcopy (prop makefile-environment dirgrapher))") )) (filesload grapher filebrowser) (rpaq? dg.promptwindowfont (fontcreate '(gacha 8))) (rpaq? dg.graph-label-font (fontcreate '(gacha 8))) (rpaq? dg.vertical-horizontal-option 'vertical) (rpaq? dg.copy-over nil) (rpaq? dg.box-all t) (rpaq? dg.default-dir '{dsk}) (rpaq? dg.concurrent nil) (rpaq? dg.concurrent-all t) (rpaq? dg.max-width 900) (rpaq? dg.max-height 700) (rpaq? dg.min-width 200) (rpaq? dg.min-height 100) (rpaq? dg.menu-edge 'right) (rpaq? dg.menu-font littlefont) (rpaq? dg.file-info-attributes '(size creationdate writedate author)) (rpaq? dg.default-backup-directory '{floppy}) (rpaq? dg.stand-alone-hosts '(dsk floppy core)) (rpaq? dg.background-directories nil) (rpaqq dg.cancel-button-bm #*(50 20)AOOOOOOOOOON@@@@COOOOOOOOOOO@@@@G@@@@@@@@@@CH@@@N@@@@@@@@@@AL@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@LAO@@@@@@@C@L@@@LCAH@@@@@@C@L@@@LCAILGLGHOC@L@@@LC@@FFFLMIK@L@@@LC@ANFFLAOK@L@@@LCAKFFFLAHC@L@@@LCAKFFFLMIK@L@@@LAOAOFFGHOC@L@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@N@@@@@@@@@@AL@@@G@@@@@@@@@@CH@@@COOOOOOOOOOO@@@@AOOOOOOOOOON@@@@ ) (rpaqq dg.ok-button-bm #*(50 20)AOOOOOOOOOON@@@@COOOOOOOOOOO@@@@G@@@@@@@@@@CH@@@N@@@@@@@@@@AL@@@L@@@@@@@@@@@L@@@L@GL@@@@@@@@L@@@L@FF@@@@@F@@L@@@L@FFGHOCLOH@L@@@L@FFLMIFFF@@L@@@L@GLOMLGNF@@L@@@L@FFL@GF@F@@L@@@L@FFLMCFFF@@L@@@L@FFGINCLCH@L@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@N@@@@@@@@@@AL@@@G@@@@@@@@@@CH@@@COOOOOOOOOOO@@@@AOOOOOOOOOON@@@@ ) (rpaqq dg.reset-button-bm #*(50 20)AOOOOOOOOOON@@@@COOOOOOOOOOO@@@@G@@@@@@@@@@CH@@@N@@@@@@@@@@AL@@@L@@@@@@@@@@@L@@@L@GL@@@@@@@@L@@@L@FF@@@@@F@@L@@@L@FFGHOCLOH@L@@@L@FFLMIFFF@@L@@@L@GLOMLGNF@@L@@@L@FFL@GF@F@@L@@@L@FFLMCFFF@@L@@@L@FFGINCLCH@L@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@L@@@@@@@@@@@L@@@N@@@@@@@@@@AL@@@G@@@@@@@@@@CH@@@COOOOOOOOOOO@@@@AOOOOOOOOOON@@@@ ) (rpaq dg.iconfont (fontcreate '(gacha 8))) (rpaq dg.directory-was-selected-event (create.event)) (rpaq dg.monitor-lock (create.monitorlock "DG.MONITOR")) (rpaqq dg.last-directory-selected nil) (rpaqq dg.window-of-last-directory nil) (defineq (dg.add-item-to-background-menu (lambda (label command message subitemlist) (* |edited:| "13-May-86 14:03") (declare (globalvars |BackgroundMenuCommands| |BackgroundMenu|)) (setq |BackgroundMenuCommands| (remove (fassoc label |BackgroundMenuCommands|) |BackgroundMenuCommands|)) (nconc1 |BackgroundMenuCommands| (list label command message subitemlist)) (setq |BackgroundMenu| nil))) (dg.advise-generate-file (lambda nil (* \; "Edited 26-Jan-88 15:42 by smL") (movd '\\generatenextfile 'dg.generate-next-file t) (unadvise (\\generatenextfile in fb.updatebrowseritems)) (advise '(\\generatenextfile in fb.updatebrowseritems) 'around '(prog* ((window (tb.window (fb.tablebrowser browser))) (pattern (dg.get-fb-pattern window)) (fbdir (u-case (filenamefield pattern 'directory))) (fbhost (u-case (filenamefield pattern 'host))) next-file temp-host) (declare (global dg.stand-alone-hosts)) (setq fbhost (|if| (fmemb fbhost dg.stand-alone-hosts) |then| fbhost |else| (or (canonical.hostname fbhost) fbhost))) next (setq next-file (dg.generate-next-file genobj nameonly)) (|if| (null next-file) |then| (return nil)) (|if| (listp next-file) |then| (setq next-file (packc next-file))) (|if| (or (not (windowprop (mainwindow window) 'dg.directory-only)) (and (eq (u-case (filenamefield next-file 'directory)) fbdir) (eq (filenamefield next-file 'host) fbhost))) |then| (return next-file) |else| (go next)))))) (dg.apply-dirgrapher-command (lambda (window) (* |edited:| " 3-Apr-85 11:27") (prog (current-path dir-file-list fb-window temp-string) (setq current-path (car (dg.wait-for-dir-selection window "Select directory on which to apply DirGrapher."))) (cond (current-path (invertw window) (dirgrapher (dg.create-prefix-from-path current-path)) (invertw window)))))) (dg.apply-fb-on-dir-and-subdirs-command (lambda (window) (* |sm| "10-Jun-85 14:42") (dg.apply-filebrowser-command window t))) (dg.apply-filebrowser-command (lambda (window subdirs) (* |edited:| " 7-May-86 13:09") (prog (current-path dir-file-list fb-window temp-string) (setq current-path (car (dg.wait-for-dir-selection window "Select directory on which to apply FileBrowser."))) (cond (current-path (invertw window) (setq fb-window (filebrowser (dg.create-prefix-from-path current-path))) (|if| (not subdirs) |then| (windowprop fb-window 'dg.directory-only t)) (windowprop fb-window 'iconfn 'dg.fbiconfn) (invertw window)))))) (dg.ask-for-backup-type (lambda (current-directory) (* |sm| " 9-Jun-85 11:53") (prog (backup-type) (cond ((null (cdr current-directory)) (setq backup-type 'files-only)) (t (setq backup-type (menu (|create| menu items _ (list (list "Back up files in this directory (but not in subdirectories)" ''files-only) (list "Backup files of this directory and subdirectories" ''files-and-subs)) menufont _ bigfont) nil t)))) (return backup-type)))) (dg.attach-directory-files-menu (lambda (path window main-window file-selection-fn includefullnames) (* |edited:| "16-May-86 15:56") (declare (globalvars littlefont screenheight)) (prog (menu file-list number-of-columns number-of-rows length-file-list max-width menu-window) (setq file-selection-fn (or file-selection-fn 'dg.file-selection-fn)) (setq file-list (cons '\ stop (|for| f |in| (dg.exclusive-directory ( dg.create-prefix-from-path path)) |collect| (|if| includefullnames |then| (list (dg.pack-name-ver-ext f) f) |else| (dg.pack-name-ver-ext f))))) (|if| (cdr file-list) |then| (setq length-file-list (length file-list)) (setq max-width 6) (|for| f |in| file-list |bind| width |when| (greaterp (setq width (stringwidth (|if| includefullnames |then| (car f) |else| f) littlefont)) max-width) |do| (setq max-width width)) (setq number-of-columns (max 1 (iquotient (car (windowsize main-window)) max-width))) (setq number-of-rows (iplus (iquotient length-file-list number-of-columns) (|if| (eqp (iremainder length-file-list number-of-columns) 0) |then| 0 |else| 1))) (setq file-list (append file-list (|for| i |from| (add1 length-file-list) |to| (itimes number-of-columns number-of-rows) |collect| " "))) (setq file-list (|for| row |from| 1 |to| number-of-rows |join| (|for| i |in| (nth file-list row) |by| (nth i (add1 number-of-rows)) |collect| i))) (setq menu-window (attachmenu (|create| menu items _ file-list whenselectedfn _ file-selection-fn menucolumns _ number-of-columns menufont _ littlefont) main-window (|if| (greaterp (iplus (|fetch| bottom |of| (windowregion main-window)) (iquotient (cdr (windowsize main-window)) 2)) (iquotient screenheight 2)) |then| 'bottom |else| 'top) 'justify)) (return menu-window) |else| (return nil))))) (dg.backup-command (lambda (window backup-dir) (* |edited:| "13-May-86 14:02") (declare (globalvars dg.directory-subtree dg.files-backup-names copyrightflg dg.copy-over filelst )) (prog (backup-type source-path source-directory files-to-backup round-of-files files-backup-names backup-host oldcopyrightflg source-path-and-window source-window) (setq source-path-and-window (dg.wait-for-dir-selection window "Select the directory that you want to back up." t)) (setq source-path (car source-path-and-window)) (setq source-window (cadr source-path-and-window)) (setq source-directory (dg.find-directory-subtree source-path source-window)) (setq backup-type (dg.ask-for-backup-type source-directory)) (|if| (null (filenamefield backup-dir 'directory)) |then| (setq backup-dir (pack* backup-dir '<))) (setq backup-host (filenamefield backup-dir 'host)) (invertw window) (setq files-to-backup (|if| (eq backup-type 'files-and-subs) |then| (directory (dg.create-prefix-from-path source-path)) |else| (dg.exclusive-directory (dg.create-prefix-from-path source-path)))) (setq files-backup-names (|for| f |in| files-to-backup |collect| (dg.create-backup-name f source-path source-directory))) (setq dg.files-backup-names files-backup-names) (setq dg.directory-subtree source-directory) (set (filecoms 'backupinfo) '((vars dg.files-backup-names dg.directory-subtree))) (putprop 'backupinfo 'filetype 'don\'tlist) (cond ((eq backup-type 'files-and-subs) (setq dg.directory-subtree source-directory)) (t (setq dg.directory-subtree nil))) (|if| (eq backup-host 'floppy) |then| (invertw window) (|printout| (dg.promptwindow window) t "Insert floppy .") (floppy.wait.for.floppy) (invertw window)) (setq oldcopyrightflg copyrightflg) (setq copyrightflg nil) (makefile (pack* backup-dir (car source-directory) '> 'backupinfo) 'new) (setq copyrightflg oldcopyrightflg) (|while| files-to-backup |do| (|for| f1 |in| files-to-backup |as| f2 |in| files-backup-names |do| (|if| (and (not dg.copy-over) (dg.file-exists (pack* backup-dir f2)) (not (dg.newer-file f1 (pack* backup-dir f2)))) |then| (|printout| (dg.promptwindow window) t "File " f1 " exists on " backup-dir " and was not copied.") (setq files-to-backup (remove f1 files-to-backup)) (setq files-backup-names (remove f2 files-backup-names)) |else| (|if| (and dg.copy-over (dg.file-exists (pack* backup-dir f2))) |then| (delfile (pack* backup-dir f2))) (|if| (or (neq backup-host 'floppy) (greaterp (floppy.free.pages) (iplus (getfileinfo f1 'size) 400))) |then| (|if| (dg.filecopy f1 (pack* backup-dir f2) dg.copy-over) |then| (|printout| (dg.promptwindow window) t "File " f1 " is backed up.") |else| (|printout| (dg.promptwindow window) t "File " f1 " exists on " backup-dir " and was not copied.")) (setq files-to-backup (remove f1 files-to-backup)) (setq files-backup-names (remove f2 files-backup-names))) )) (|if| files-to-backup |then| (invertw window) (clearw (dg.promptwindow window)) (|printout| (dg.promptwindow window) t "No more space on this floppy. Insert a new one. ") (flashwindow (dg.promptwindow window) 3) (|for| i |from| 100 |to| 1000 |by| 200 |do| (playtune (list (cons i 5000)))) (floppy.wait.for.floppy t) (invertw window))) (setq filelst (remove 'backupinfo filelst)) (invertw window)))) (dg.file-exists (lambda (f) (* |edited:| " 6-Mar-86 14:43") (infilep f))) (dg.file-info-command (lambda (window) (* |edited:| "16-May-86 15:59") (declare (globalvars dg.promptwindowfont littlefont dg.file-info-attributes)) (prog (source-path selected-files source-prefix menu-window source-path-window wregion title-width title columns datewidth pwindow) (setq pwindow (dg.promptwindow window)) (setq source-path (car (dg.wait-for-dir-selection window "Select directory from which you want to files info."))) (cond (source-path (invertw window) (setq source-prefix (dg.create-prefix-from-path source-path)) (setq title " ") (|while| (greaterp (stringwidth "MMMMMMMMMMMMMMMMMMMM : " dg.promptwindowfont) (stringwidth title littlefont)) |do| (setq title (concat title " "))) (setq datewidth (stringwidth (date) dg.promptwindowfont)) (|for| i |in| dg.file-info-attributes |bind| i-with-blanks |do| (setq columns (nconc1 columns (stringwidth title littlefont))) (setq i-with-blanks i) (|if| (member i '(writedate readdate creationdate)) |then| (|while| (greaterp datewidth (stringwidth i-with-blanks littlefont)) |do| (setq i-with-blanks (concat i-with-blanks " ")))) (setq title (concat title i-with-blanks " "))) (windowprop window 'dg.info-columns columns) (setq title-width (stringwidth title littlefont)) (|if| (greaterp title-width (|fetch| width |of| (windowprop pwindow 'region))) |then| (setq wregion (windowregion window)) (|replace| width |of| wregion |with| (iplus (|fetch| width |of| wregion) (idifference title-width (|fetch| width |of| (windowprop pwindow 'region))))) (invertw window) (reshapeallwindows window wregion) (invertw window)) (windowprop pwindow 'title title) (setq menu-window (dg.attach-directory-files-menu source-path window window 'dg.file-info-selection-fn t)) (invertw window) (|if| menu-window |then| (windowprop menu-window 'dg.detach t) (clearw (dg.promptwindow window)) (await.event (windowprop window 'dg.file-selection-ended-event) 1000000) (detachwindow menu-window) (closew menu-window)) (windowprop pwindow 'title nil)))))) (dg.file-info-selection-fn (lambda (item menu key) (* |edited:| "13-May-86 14:17") (declare (globalvars dg.file-info-attributes)) (prog (window) (setq window (mainwindow (wfrommenu menu))) (cond ((eq item '\ stop) (notify.event (windowprop window 'dg.file-selection-ended-event))) ((equal item " ")) (item (printout (dg.promptwindow window) t (substring (car item) 1 (min (nchars (car item) 20))) " : ") (|for| att |in| dg.file-info-attributes |as| col |in| (windowprop window 'dg.info-columns) |do| (dspxposition col (dg.promptwindow window)) (printout (dg.promptwindow window) (getfileinfo (cadr item) att)))))))) (dg.files-hardcopy-command (lambda (window) (* |edited:| "13-May-86 14:06") (prog (source-path selected-files source-prefix menu-window source-path-window) (setq source-path (car (dg.wait-for-dir-selection window "Select directory from which you want to hardcopy selected files." ))) (cond (source-path (setq source-prefix (dg.create-prefix-from-path source-path)) (setq menu-window (dg.get-file-list " The selected files will be hardcopied. " window source-path window)) (setq selected-files (windowprop menu-window 'dg.selected-files)) (|if| selected-files |then| (invertw window) (|for| file |in| selected-files |do| (listfiles1 (pack* source-prefix file)) (shadeitem file (car (windowprop menu-window 'menu)) highlightshade menu-window) (block)) (invertw window)) (detachwindow menu-window) (closew menu-window)))))) (dg.load-files-command (lambda (window loadtype ldflg) (* |edited:| "13-May-86 16:31") (declare (globalvars highlightshade)) (prog (source-path selected-files source-prefix menu-window source-path-window) (setq loadtype (or loadtype 'load)) (setq source-path (car (dg.wait-for-dir-selection window (concat "Select directory from which you want to " loadtype " selected files." )))) (cond (source-path (setq source-prefix (dg.create-prefix-from-path source-path)) (setq menu-window (dg.get-file-list " The selected files will be LOADED. " window source-path window)) (setq selected-files (windowprop menu-window 'dg.selected-files)) (|if| selected-files |then| (invertw window) (|for| file |in| selected-files |do| (apply* loadtype (pack* source-prefix file) ldflg) (shadeitem file (car (windowprop menu-window 'menu)) highlightshade menu-window) (block)) (invertw window)) (detachwindow menu-window) (closew menu-window)))))) (dg.newer-file (lambda (f1 f2) (* |edited:| " 7-Mar-86 15:31") (greaterp (getfileinfo f1 'icreationdate) (getfileinfo f2 'icreationdate)))) (dg.backup-on-default-command (lambda (window) (* |edited:| "13-May-86 13:56") (declare (globalvars dg.default-backup-directory)) (|if| (null dg.default-backup-directory) |then| (dg.flashallwindows window) (|printout| (dg.promptwindow window) t "NULL default directory.Backup aborted") |else| (dg.backup-command window dg.default-backup-directory)))) (dg.backup-on-selected-command (lambda (window) (* |sm| " 8-Jun-85 12:49") (prog (backup-directory) (setq backup-directory (dg.create-prefix-from-path (car (dg.wait-for-dir-selection window "Select the directory that will contain the backup." t)))) (dg.backup-command window backup-directory)))) (dg.connect-dir-command (lambda (window) (* |edited:| "13-May-86 13:55") (declare (globalvars dg.box-all)) (prog (current-path current-prefix) (setq current-path (car (dg.wait-for-dir-selection window "Select the directory to which you want to be connected"))) (cond (current-path (cndir (setq current-prefix (dg.create-prefix-from-path current-path))) (|if| dg.box-all |then| (|for| w |in| (openwindows) |when| (windowprop w 'dg.tree) |do| (dg.shade-current-directory w)) |else| (dg.shade-current-directory window))))))) (dg.copy-directory-command (lambda (window) (* |edited:| " 2-Apr-85 18:02") (dg.movecopy-dir-command window))) (dg.copy-file-command (lambda (window) (* |edited:| " 2-Apr-85 18:05") (dg.movecopy-command window))) (dg.copybuttoneventfn (lambda (window) (* |sm| " 9-Jul-85 12:28") (prog (cursor-pos selected-node node-region released) (setq cursor-pos (cursorposition nil window)) (setq released (mousestate (and (not left) (not middle) (not right)))) (|if| (setq selected-node (|for| node |in| (|fetch| graphnodes |of| (windowprop window 'graph)) |thereis| (insidep (setq node-region (noderegion node)) cursor-pos))) |then| (flipnode selected-node window) |else| (graphercopybuttoneventfn window)) (|if| (and released selected-node) |then| (bksysbuf (dg.create-prefix-from-path (append (windowprop window ' dg.path-to-root) (cdr (|fetch| nodeid |of| selected-node ))))))))) (dg.create-backup-free-menu (lambda (left bottom) (* |edited:| "16-May-86 17:50") (fm.formatmenu (list '((type title label "Files to Backup : " font (modern 12 bold)) (type toggle label "Include SubDirectories" id subdirs) (type toggle label "No Old Versions" id subdirs)) (list `(type nway label ,dg.ok-button-bm id buttons) `(type nway label ,\,dg.reset-button-bm id buttons) `(type nway label ,\,dg.cancel-button-bm id buttons)))))) (dg.create-backup-name (lambda (f current-path current-directory) (* |edited:| " 5-Apr-85 10:34") (prog (second-half file-backup-name) (setq second-half (substring (filenamefield f 'directory) (iplus 2 (nchars (dg.create-directory-chain (cdr current-path)))) (nchars (filenamefield f 'directory)))) (setq file-backup-name (packfilename 'directory (cond (second-half (dg.create-directory-chain (list (car current-directory ) second-half))) (t (car current-directory))) 'name (filenamefield f 'name) 'extension (filenamefield f 'extension) 'version (filenamefield f 'version))) (return (pack (cdr (unpack file-backup-name))))))) (dg.create-directory-chain (lambda (path) (* |sm| " 9-Jun-85 11:49") (cond ((null path) '"") ((null (cdr path)) (car path)) (t (pack* (car path) '> (dg.create-directory-chain (cdr path))))))) (dg.create-directory-spec (lambda (path window) (* |edited:| "31-Dec-00 22:14") (prog (current-directory spec) (setq current-directory (dg.find-directory-subtree path window)) (setq spec (dg.create-prefix-from-path path)) (|for| sub |in| (cdr current-directory) |do| (setq spec (list spec '- (dg.create-prefix-from-path (append path (list (car sub))))))) (return spec)))) (dg.create-directory-tree (lambda (path) (* |edited:| "13-May-86 12:34") (prog (tree-paths root tree) (setq tree-paths (|for| f |in| (directory (dg.create-prefix-from-path path)) |collect| (nth (dg.create-path-from-file-name f) (length path)))) (setq tree-paths (dg.setify tree-paths)) (setq tree (car (dg.create-tree-from-lists tree-paths))) (|if| tree |then| (return tree) |else| (return (last path)))))) (dg.create-graph-from-tree (lambda (tree) (* |edited:| "13-May-86 14:09") (declare (globalvars dg.vertical-horizontal-option dg.graph-label-font)) (prog (node-list) (setq node-list (dg.create-tree-nodes tree nil)) (return (layoutgraph (cdr node-list) (list (car node-list)) (list dg.vertical-horizontal-option) dg.graph-label-font))))) (dg.create-icon-title (lambda (l) (* |edited:| " 5-Apr-85 11:16") (cond (l (cond ((greaterp (length l) 3) (setq l (cdr (lastn l 3))))) (apply 'concat (cons (dg.trim (car l) 11) (|for| w |in| (cdr l) |collect| (concat (character 13) (dg.trim w 11)))))) (t " ")))) (dg.create-menu (lambda (window) (* |edited:| "16-May-86 16:19") (declare (globalvars dg.menu-edge dg.menu-font)) (prog (menuitems temp) (setq menuitems '(("Create Dir" dg.create-subdir-command "Creates subdirectory. Will wait for parent directory selection, and prompt for subdirectory name" ) ("Delete Dir" dg.delete-directory-command "Will delete entire directory including all files in subdirectories. Will wait for directory selection and if the directory is nonempty it will ask for confirmation" ) ("Backup Dir" dg.backup-on-selected-command "Will ask you to select the directory on which the backup should be stored" (subitems ("On default" dg.backup-on-default-command "Will backup the selected directory on the default backup directory (the value of DG.DEFAULT-BACKUP-DIRECTORY ) " ) ("On selected" dg.backup-on-selected-command "Will ask you to select the directory on which the backup should be stored" ))) ("Restore Dir" dg.restore-from-selected-command "Will ask you to select the directory from where the backup should be restored" (subitems ("From default" dg.restore-from-default-command "Will restore the selected directory from the default backup directory (the value of DG.DEFAULT-BACKUP-DIRECTORY ) " ) ("From selected" dg.restore-from-selected-command "Will ask you to select the directory from where the backup should be restored" ))) ("Move Dir" dg.move-dir-command "Will move the selected directory (including subdirectories) to a new parent directory." ) ("Copy Dir" dg.copy-directory-command "Will copy the selected directory (including subdirectories) to a new parent directory." ) ("Connect Dir" dg.connect-dir-command "Changes the current directory") ("Apply DG" dg.apply-dirgrapher-command "Calls DirGrapher on the selected directory") ("Apply FB" dg.apply-filebrowser-command "Calls FileBrowser on files in the selected directory (but not files in the subdirectories)." (subitems ("on directory only" dg.apply-filebrowser-command "Calls FileBrowser on files in the selected directory (but not files in the subdirectories)." ) ("On directory and subdirectories" dg.apply-fb-on-dir-and-subdirs-command "Calls FileBrowser on files in the selected directory and subdirectories." ))) ("Files" null " The subitems of the item manipulate files within selected directories" (subitems ("Move Files" dg.move-file-command "Will ask you to select: (1) source directory, (2) files to be moved, and (3) target directory." ) ("Copy Files" dg.copy-file-command "Will ask you to select: (1) source directory, (2) files to be copied, and (3) target directory." ) ("Load Files" (dg.load-files-command load nil) "Will ask you to select a directory and files to be loaded" (subitems ("LOAD" (dg.load-files-command load nil) "Will ask you to select a directory and files to be loaded" (subitems ("LDFLG=NIL" ( dg.load-files-command load nil)) ("LDFLG=SYSLOAD" (dg.load-files-command load sysload)))) ("LOAD?" (dg.load-files-command load? nil) "Will ask you to select a directory and files to be loaded USING LOAD? function" (subitems ("LDFLG=NIL" ( dg.load-files-command load? nil)) ("LDFLG=SYSLOAD" ( dg.load-files-command load? sysload )))) ("LOADFROM" (dg.load-files-command loadfrom nil) "Will ask you to select a directory and files to be loaded USING LOADFROM function" (subitems ("LDFLG=NIL" ( dg.load-files-command loadfrom nil)) ("LDFLG=SYSLOAD" ( dg.load-files-command loadfrom sysload)))))) ("Delete Files" dg.delete-selected-files-command "Will ask you to select a directory and files to be deleted (EXPUNGED)." (subitems ("Selected Files" dg.delete-selected-files-command "Will ask you to select a directory and files to be deleted (EXPUNGED)." ) ("Old Versions" dg.delete-old-versions-command " Will ask you to select a directory, and will delete all old versions of files in the selected directory. Only DG.NUMBER-OF-VERSIONS (1 by default) last versions will remain" ))) ("Info" dg.file-info-command "Will ask you to select a directory, and will display info on selected files. " ) ("Hardcopy" dg.files-hardcopy-command "Will ask you to select a directory and files to be hardcopied." ))) ("Update" dg.update-command "Will update the tree structure according to the current file system state" ))) (|if| (fmemb dg.menu-edge '(top bottom)) |then| (setq menuitems (copy menuitems)) (setq temp (caddr menuitems)) (rplaca (cddr menuitems) (car (nth menuitems 8))) (rplaca (nth menuitems 8) temp)) (return (|create| menu items _ menuitems menucolumns _ (|if| (fmemb dg.menu-edge '(top bottom)) |then| 4 |else| 1) whenselectedfn _ 'dg.docommand menufont _ dg.menu-font))))) (dg.create-path-from-file-name (lambda (fname) (* |edited:| " 3-Apr-85 15:41") (prog (dir host) (setq dir (filenamefield fname 'directory)) (setq host (filenamefield fname 'host)) (return (|if| host |then| (cons (packfilename 'host (filenamefield fname 'host)) (|if| (null dir) |then| nil |else| (dg.unpack-directory-name (unpack dir)))) |else| (|if| (null dir) |then| nil |else| (dg.unpack-directory-name (unpack dir)))))))) (dg.create-prefix-from-path (lambda (path) (* |edited:| "17-Jul-84 14:58") (cond ((cdr path) (pack* (car path) '< (pack (|for| d |in| (cdr path) |join| (list d '>))))) (t (car path))))) (dg.create-quit-menu (lambda (window) (* |edited:| "12-May-86 13:06") (|create| menu items _ (subst window 'window '((" I n t e r r u p t / R e s e t " ( dg.kill-process window) "Will kill the current DirGrapher process if active, and will reset the DirGrapher display." ))) centerflg _ t))) (dg.create-subdir-command (lambda (window) (* |edited:| "30-Sep-85 14:45") (prog (current-path new-dir-name directory-subtree) (setq current-path (car (dg.wait-for-dir-selection window "Select parent directory."))) (cond (current-path (setq directory-subtree (dg.find-directory-subtree current-path window)) (terpri (dg.promptwindow window)) (setq new-dir-name (mkatom (promptforword (concat "Enter name for new subdirectory (of " (car directory-subtree) ") :") nil nil (dg.promptwindow window) nil 'tty))) (cond ((member new-dir-name (cdr directory-subtree))) (t (rplacd directory-subtree (cons (list new-dir-name) (cdr directory-subtree))) (dg.display-directory-tree (dg.create-graph-from-tree (windowprop window 'dg.tree)) window)))))))) (dg.create-tree-from-lists (lambda (lists) (* |edited:| "13-May-86 12:10") (prog (temp l2) (|for| x |in| lists |when| x |do| (cond ((not (setq temp (fassoc (car x) l2))) (setq l2 (cons (list (car x) (cdr x)) l2))) (t (rplacd temp (cons (cdr x) (cdr temp))))) (block)) (return (|for| x |in| l2 |collect| (cons (car x) (dg.create-tree-from-lists (cdr x)))))))) (dg.create-tree-nodes (lambda (tree former-path) (* |edited:| " 3-Apr-85 22:05") (prog (current-id to-nodes current-node) (cond (tree (return (cons (setq current-id (append former-path (list (car tree)))) (cons (setq current-node (|create| graphnode nodeid _ current-id nodelabel _ (car tree) fromnodes _ (list former-path) nodeborder _ -2)) (prog (son-list) (setq son-list (|for| son |in| (cdr tree) |join| (prog (n-list) (setq n-list (dg.create-tree-nodes son current-id)) (setq to-nodes (cons (car n-list) to-nodes)) (return (cdr n-list))))) (|replace| tonodes |of| current-node |with| to-nodes) (return son-list)))))))))) (dg.createiconw (lambda (window icon) (* |edited:| " 5-Apr-85 11:13") (cond ((null icon) (setq icon (titlediconw (|create| titledicon icon _ dg.icon mask _ dg.mask titlereg _ (createregion 5 5 65 60)) (windowprop window 'dg.icontitle) dg.iconfont)))) icon)) (dg.current-connected-directory (lambda nil (* |edited:| "22-May-85 13:55") (prog (current-dir) (setq current-dir (directoryname t t)) (|if| (not (fmemb (car (last (unpack current-dir))) '(} >))) |then| (return (pack* current-dir '>)) |else| (return current-dir))))) (dg.delete-directory-command (lambda (window) (* |edited:| "19-Apr-85 14:23") (prog (current-path current-directory father-directory files-to-be-deleted number-of-files) (setq current-path (car (dg.wait-for-dir-selection window "Select directory to be deleted") )) (cond (current-path (invertw window) (setq files-to-be-deleted (directory (dg.create-prefix-from-path current-path))) (invertw window) (setq number-of-files (length files-to-be-deleted)) (cond ((greaterp number-of-files 0) (|printout| (dg.promptwindow window) t "CAUTION !!! " number-of-files " files are going to be deleted !!" "Confirm with left button .") (flashwindow (dg.promptwindow window) 2) (cond ((mouseconfirm) (invertw window) (|for| f |in| files-to-be-deleted |do| (delfile f) (|printout| (dg.promptwindow window) t "File " f " was deleted." )) (invertw window)) (t (|printout| (dg.promptwindow window) t "Delete directory aborted.") (return nil))))) (cond ((equal current-path (windowprop window 'dg.path-to-root)) (closew window) (return nil))) (dg.delete-from-tree current-path window)))))) (dg.delete-from-tree (lambda (path window) (* |edited:| "13-May-86 13:58") (prog (parent-and-son father-directory) (setq parent-and-son (dg.find-parent-dierctory path window)) (setq father-directory (car parent-and-son)) (rplacd father-directory (remove (cadr parent-and-son) (cdr father-directory))) (dg.display-directory-tree (dg.create-graph-from-tree (windowprop window 'dg.tree)) window)))) (dg.delete-old-versions-command (lambda (window) (* |edited:| "13-May-86 12:07") (prog (source-path selected-files source-prefix menu-window source-path-window) (setq source-path (car (dg.wait-for-dir-selection window "Select directory from which you want to delete old versions of files." ))) (cond (source-path (setq source-prefix (dg.create-prefix-from-path source-path)) (setq selected-files (dg.exclusive-old-versions source-prefix)) (|if| selected-files |then| (printout (dg.promptwindow window) t " " (length selected-files) " files will be DELETED from " source-prefix " . Approve with left button. ") (|if| (mouseconfirm) |then| (invertw window) (|for| file |in| selected-files |do| (delfile file) (printout (dg.promptwindow window) t file " was deleted. ") (block)) (invertw window) |else| (printout (dg.promptwindow window) t " Delete files aborted."))) (detachwindow menu-window) (closew menu-window)))))) (dg.delete-selected-files-command (lambda (window) (* |edited:| "13-May-86 16:31") (declare (globalvars highlightshade)) (prog (source-path selected-files source-prefix menu-window source-path-window) (setq source-path (car (dg.wait-for-dir-selection window "Select directory from which you want to delete selected files." ))) (cond (source-path (setq source-prefix (dg.create-prefix-from-path source-path)) (setq menu-window (dg.get-file-list (concat " The selected files will be " " DELETED (EXPUNGED) " " from " source-prefix " .") window source-path window)) (setq selected-files (windowprop menu-window 'dg.selected-files)) (|if| selected-files |then| (printout (dg.promptwindow window) t " " (length selected-files) " files will be DELETED from " source-prefix " . Approve with left button. ") (|if| (mouseconfirm) |then| (invertw window) (|for| file |in| selected-files |do| (delfile (pack* source-prefix file)) (shadeitem file (car (windowprop menu-window 'menu)) highlightshade menu-window) (block)) (invertw window) |else| (printout (dg.promptwindow window) t " Delete files aborted."))) (detachwindow menu-window) (closew menu-window)))))) (dg.directory-minus-prefix (lambda (directory prefix) (* |edited:| "27-Mar-85 23:50") (cond (prefix (subatom directory (iplus 2 (nchars prefix)) (nchars directory))) (t directory)))) (dg.directory-selection-function (lambda (selected-obj g-window) (* |edited:| "13-May-86 14:26") (declare (globalvars dg.last-directory-selected dg.window-of-last-directory dg.directory-was-selected-event)) (prog (current-node) (cond (selected-obj (setq dg.last-directory-selected (append (windowprop g-window ' dg.path-to-root) (cdr (|fetch| nodeid |of| selected-obj )))) (setq dg.window-of-last-directory g-window))) (notify.event dg.directory-was-selected-event t)))) (dg.display-directory-tree (lambda (graph window) (* |sm| " 8-Jul-85 17:27") (showgraph graph window 'dg.directory-selection-function 'dg.directory-selection-function) (windowprop window 'repaintfn (cons 'dg.redisplayfn (mklist (windowprop window 'repaintfn)))) (windowprop window 'copybuttoneventfn 'dg.copybuttoneventfn) (dg.shade-current-directory window))) (dg.docommand (lambda (item menu key) (* |edited:| "13-May-86 14:27") (declare (globalvars dg.concurrent dg.concurrent-all dg.monitor-lock)) (prog (window) (setq window (mainwindow (wfrommenu menu))) (cond ((not dg.concurrent-all) (dg.docommand-with-monitor dg.monitor-lock window item menu)) ((not dg.concurrent) (dg.docommand-with-monitor (windowprop window 'dg.lock) window item menu)) (t (dg.docommand-without-monitor window item menu)))))) (dg.docommand-with-monitor (lambda (monitor-lock window item menu) (* |edited:| " 8-May-86 12:10") (prog (parent-item) (setq parent-item (dg.find-menu-item item (|fetch| items |of| menu))) (windowprop window 'dg.process (add.process (subpair '(monitor-lock window menu item parent-item) (list monitor-lock window menu item parent-item) '(progn (with.monitor monitor-lock (ttydisplaystream (dg.promptwindow window)) (shadeitem 'parent-item menu grayshade) (windowprop window 'dg.unshade-if-shaded '(shadeitem 'parent-item menu whiteshade)) (clearw (dg.promptwindow window)) (if (atom (cadr 'item)) then (apply* (cadr 'item) window) else (apply (caadr 'item) (cons window (cdadr 'item)))) (printout (dg.promptwindow window) t (car 'parent-item) " Completed. ") (windowprop window 'dg.unshade-if-shaded nil) (shadeitem 'parent-item menu whiteshade) (windowprop window 'dg.shaded-item nil) (windowprop window 'dg.process nil)))) 'window (dg.promptwindow window) 'name (car parent-item)))))) (dg.docommand-without-monitor (lambda (window item menu) (* |edited:| " 8-May-86 12:10") (windowprop window 'dg.process (add.process (subpair '(window menu item) (list window menu item) '(progn (ttydisplaystream (dg.promptwindow window)) (shadeitem 'item menu grayshade) (windowprop window 'dg.shaded-item 'item) (clearw (dg.promptwindow window)) (if (atom (cadr 'item)) then (apply* (cadr 'item) window) else (apply (caadr 'item) (cons window (cdadr 'item)))) (printout (dg.promptwindow window) t (car 'item) " Completed. ") (shadeitem 'item menu whiteshade) (windowprop window 'dg.shaded-item nil) (windowprop window 'dg.process nil))) 'window (dg.promptwindow window) 'name (car item))))) (dg.exclusive-directory (lambda (directory-pattern) (* |edited:| "22-May-85 12:23") (prog (current-directory) (setq current-directory (filenamefield directory-pattern 'directory)) (return (|for| f |in| (directory directory-pattern) |when| (eq (filenamefield f 'directory) current-directory) |collect| f))))) (dg.exclusive-new-versions (lambda (directory-pattern) (* |edited:| "16-May-86 16:24") (prog (current-directory) (setq current-directory (filenamefield directory-pattern 'directory)) (return (|for| file |in| (|for| f |in| (directory directory-pattern) |when| (eq (filenamefield f 'directory) current-directory) |collect| f) |when| (equal file (infilep (packfilename.string 'version nil 'body file))) |collect| file))))) (dg.exclusive-old-versions (lambda (directory-pattern) (* |edited:| " 7-May-86 17:59") (prog (current-directory) (setq current-directory (filenamefield directory-pattern 'directory)) (return (|for| file |in| (|for| f |in| (directory directory-pattern) |when| (eq (filenamefield f 'directory) current-directory) |collect| f) |when| (not (equal file (infilep (packfilename.string 'version nil 'body file))) ) |collect| file))))) (dg.fbiconfn (lambda (window icon) (* |edited:| "13-May-86 14:25") (declare (globalvars filedrawer filedrawerregion dg.iconfont)) (cond ((null icon) (setq icon (titlediconw (|create| titledicon icon _ filedrawer titlereg _ filedrawerregion) (dg.create-icon-title (dg.create-path-from-file-name (dg.get-fb-pattern window))) dg.iconfont))) ((iconw.title icon (dg.create-icon-title (dg.create-path-from-file-name (dg.get-fb-pattern window)))))) icon)) (dg.file-selection-fn (lambda (item menu key) (* |edited:| "13-May-86 14:08") (declare (globalvars whiteshade blackshade)) (prog (window) (setq window (wfrommenu menu)) (cond ((eq item '\ stop) (notify.event (windowprop (mainwindow window) 'dg.file-selection-ended-event))) ((equal item " ")) (item (cond ((fmemb item (windowprop window 'dg.selected-files)) (windowdelprop window 'dg.selected-files item) (shadeitem item menu whiteshade window)) (t (windowaddprop window 'dg.selected-files item) (shadeitem item menu blackshade window)))))))) (dg.filecopy (lambda (f1 f2 over-flag) (* |edited:| " 6-Mar-86 15:06") (cond ((dg.file-exists f2) (cond ((or over-flag (dg.newer-file f1 f2)) (delfile f2) (copyfile f1 f2)) (t nil))) (t (copyfile f1 f2) t)))) (dg.find-directory-subtree (lambda (path window) (* |edited:| "31-Dec-00 22:10") (prog (directory-subtree) (setq path (nth path (length (windowprop window 'dg.path-to-root)))) (setq directory-subtree (list (windowprop window 'dg.tree))) (|for| x |in| path |do| (setq directory-subtree (fassoc x directory-subtree))) (return directory-subtree)))) (dg.find-menu-item (lambda (item item-list) (* |edited:| "26-Sep-85 14:19") (cond ((null item-list) nil) ((atom item-list) nil) ((fmemb item item-list) item) ((and (cdddr (car item-list)) (eq (car (cadddr (car item-list))) 'subitems) (dg.find-menu-item item (cdr (cadddr (car item-list))))) (car item-list)) (t (dg.find-menu-item item (cdr item-list)))))) (dg.find-parent-dierctory (lambda (path window) (* |edited:| "30-Mar-85 16:29") (prog (father-directory current-directory) (setq father-directory (windowprop window 'dg.tree)) (setq path (cdr (dg.residual-path window path))) (|while| (and (setq current-directory (fassoc (car path) father-directory)) (cdr path)) |do| (setq father-directory current-directory) (setq path (cdr path))) (|if| (not (listp current-directory)) |then| (return (list nil father-directory)) |else| (return (list father-directory current-directory)))))) (dg.flashallwindows (lambda (window) (* |edited:| " 3-Apr-85 16:21") (|for| w |in| (cons window (attachedwindows window)) |do| (flashwindow w)))) (dg.get-fb-pattern (lambda (w) (* |edited:| " 7-May-86 12:50") (fetchfield '(filebrowser 14 pointer) (windowprop (mainwindow w) 'filebrowser)))) (dg.get-file-list (lambda (message window source-path source-window) (* |edited:| "16-May-86 16:16") (prog (menu-window) (invertw window) (setq menu-window (dg.attach-directory-files-menu source-path source-window window)) (invertw window) (|if| menu-window |then| (windowprop menu-window 'dg.detach t) (clearw (dg.promptwindow window)) (|printout| (dg.promptwindow window) "Select files from menu. When done select STOP." t message) (await.event (windowprop window 'dg.file-selection-ended-event) 1000000)) (return menu-window)))) (dg.get-initial-region (lambda (graph) (* \; "Edited 19-Aug-87 08:55 by smL") (declare (globalvars dg.max-width dg.max-height dg.min-width dg.min-height)) (* |;;| "Edited by smL to use WIDTHIFWINDOW and HEIGHTIFWINDOW") (let ((g-region (graphregion graph))) (getmousestate) (getregion (min dg.max-width (widthifwindow (max (|fetch| width |of| g-region) dg.min-width))) (min dg.max-height (heightifwindow (max (|fetch| height |of| g-region) dg.min-height) t)))))) (dg.kill-process (lambda (window) (* |edited:| "12-May-86 13:03") (cond ((windowprop window 'dg.process) (del.process (windowprop window 'dg.process)) (dg.flashallwindows window) (clearw (dg.promptwindow window)) (|printout| (dg.promptwindow window) "User interupt. Directory Grapher process aborted."))) (|for| w |in| (attachedwindows window) |when| (windowprop w 'dg.detach) |do| (detachwindow w) (closew w)) (windowprop (dg.promptwindow window) 'title nil) (redisplayw window) (eval (windowprop window 'dg.unshade-if-shaded)) (windowprop window 'dg.process nil))) (dg.move-dir-command (lambda (window) (* |edited:| " 2-Apr-85 18:02") (dg.movecopy-dir-command window t))) (dg.move-file-command (lambda (window) (* |edited:| " 2-Apr-85 18:05") (dg.movecopy-command window t))) (dg.movecopy-command (lambda (window move) (* |edited:| "20-May-86 23:22") (declare (globalvars dg.copy-over highlightshade)) (prog (target-path source-path selected-files target-prefix source-prefix menu-window source-window source-path-window) (setq source-path-window (dg.wait-for-dir-selection window "Select source directory " t)) (setq source-window (cadr source-path-window)) (setq source-path (car source-path-window)) (cond (source-path (setq source-prefix (dg.create-prefix-from-path source-path)) (setq target-path (car (dg.wait-for-dir-selection window "Select target directory " t))) (|if| target-path |then| (setq target-prefix (dg.create-prefix-from-path target-path)) (setq menu-window (dg.get-file-list (concat " The selected files will be " (|if| move |then| " MOVED " |else| " COPIED ") " from " source-prefix " to " target-prefix " .") window source-path source-window)) (setq selected-files (windowprop menu-window 'dg.selected-files)) (|if| selected-files |then| (invertw window) (|for| file |in| selected-files |do| (|if| (dg.filecopy (pack* source-prefix file) (pack* target-prefix file) dg.copy-over) |then| (|printout| (dg.promptwindow window) t file " : " source-prefix " --> " target-prefix) |else| (|printout| (dg.promptwindow window) t file " already exists and was not copied. " )) (|if| move |then| (delfile (pack* source-prefix file))) (shadeitem file (car (windowprop menu-window 'menu)) highlightshade menu-window) (block)) (invertw window)) (detachwindow menu-window) (closew menu-window))))))) (dg.movecopy-dir-command (lambda (window move) (* |edited:| "13-May-86 14:13") (declare (globalvars dg.copy-over)) (prog (target-path source-path selected-files target-prefix source-prefix source-window-path menu-window source-father-son target-father-son target-path-window source-window target-window file-name new-name new-prefix) (setq source-window-path (dg.wait-for-dir-selection window "Select the directory that you want to transfer." t)) (setq source-path (car source-window-path)) (setq source-window (cadr source-window-path)) (cond (source-path (invertw window) (setq source-prefix (dg.create-prefix-from-path source-path)) (setq selected-files (directory source-prefix)) (invertw window) (setq target-path-window (dg.wait-for-dir-selection window (concat "Select new parent for directory " (car (last source-path ))) t)) (setq target-path (car target-path-window)) (|if| (and move (greaterp (length target-path) (length source-path)) (|for| a1 |in| source-path |as| a2 |in| target-path |always| (equal a1 a2))) |then| (dg.flashallwindows window) (|printout| (dg.promptwindow window) t "Can not move a directory to its descendants") (return nil)) (setq target-window (cadr target-path-window)) (cond (target-path (invertw window) (setq target-prefix (dg.create-prefix-from-path target-path)) (|for| file |in| selected-files |do| (|if| (dg.filecopy file (setq new-name (pack* (setq new-prefix (dg.create-prefix-from-path (append target-path (nth ( dg.create-path-from-file-name file) (length source-path ))))) (setq file-name (dg.pack-name-ver-ext file)))) dg.copy-over) |then| (|printout| (dg.promptwindow window) t file-name " : " (packfilename 'host (filenamefield file 'host) 'directory (filenamefield file 'directory)) " --> " new-prefix) |else| (|printout| (dg.promptwindow window) t new-name " already exists and was not copied. ")) (|if| move |then| (delfile file)) (block)) (setq source-father-son (dg.find-parent-dierctory source-path source-window)) (setq target-father-son (dg.find-parent-dierctory target-path target-window)) (rplacd (cadr target-father-son) (cons (copy (cadr source-father-son)) (cdr (cadr target-father-son)))) (|if| move |then| (rplacd (car source-father-son) (remove (cadr source-father-son) (cdar source-father-son)))) (dg.display-directory-tree (dg.create-graph-from-tree (windowprop source-window 'dg.tree)) source-window) (|if| (neq target-window source-window) |then| (dg.display-directory-tree (dg.create-graph-from-tree (windowprop target-window 'dg.tree)) target-window))))))))) (dg.pack-name-ver-ext (lambda (f) (* |edited:| " 3-Apr-85 11:31") (packfilename 'name (filenamefield f 'name) 'version (filenamefield f 'version) 'extension (filenamefield f 'extension)))) (dg.promptwindow (lambda (window) (* |edited:| "29-Mar-85 16:07") (car (windowprop window 'promptwindow)))) (dg.redisplayfn (lambda (window) (* |edited:| "26-Sep-85 15:05") (dg.shade-current-directory window))) (dg.residual-path (lambda (window path) (* |edited:| "29-Mar-85 12:37") (nth path (length (windowprop window 'dg.path-to-root))))) (dg.restore-command (lambda (window backup-dir) (* |edited:| "12-May-86 14:57") (declare (globalvars dg.files-backup-names dg.directory-subtree dg.copy-over)) (prog (target-path target-directory files-to-backup n over-write-flag floppy-files dsk-files directory-info-file-name f-name new-name over-flag-asked unfound-files info-name backup-host files-backup-names target-path-and-window target-window) (setq target-path-and-window (dg.wait-for-dir-selection window "Select directory that you want to restore" t)) (setq target-path (car target-path-and-window)) (setq target-window (cadr target-path-and-window)) (setq target-directory (dg.find-directory-subtree target-path target-window)) (setq backup-host (filenamefield backup-dir 'host)) (|if| (eq backup-host 'floppy) |then| (|printout| (dg.promptwindow window) t "Insert Floppy") (floppy.wait.for.floppy)) (|if| (null (filenamefield backup-dir 'directory)) |then| (setq backup-dir (pack* backup-dir '<))) (invertw window) (setq info-name (pack* backup-dir (car target-directory) '>backupinfo)) (|if| (null (directory info-name)) |then| (clearw (dg.promptwindow window)) (invertw window) (dg.flashallwindows window) (|printout| (dg.promptwindow window) t "Couldn't find the file " info-name " . Resore aborted. ") |else| (prog nil (load info-name 'sysload) (rplacd target-directory (append (cdr target-directory) (|for| sub |in| (cdr dg.directory-subtree) |when| (not (fassoc (car sub) (cdr target-directory) )) |collect| sub))) (dg.display-directory-tree (dg.create-graph-from-tree (windowprop target-window 'dg.tree)) target-window) (|if| (neq target-window window) |then| (invertw window)) (setq files-backup-names dg.files-backup-names) newroundofcopy (invertw window) (|for| f |in| files-backup-names |bind| f-with-< |do| (cond ((dg.file-exists (setq f-name (pack* backup-dir f))) (setq new-name (pack* (dg.create-prefix-from-path (append target-path (cdr (dg.create-path-from-file-name (setq f-with-< (pack* '< f)))))) (dg.pack-name-ver-ext f-with-<))) (cond ((dg.filecopy f-name new-name dg.copy-over) (|printout| (dg.promptwindow window) t new-name " Restored.")) (t (|printout| (dg.promptwindow window) t new-name " exists and wasn't restored. ")))) (t (cond ((not (fmemb f unfound-files)) (setq unfound-files (cons f unfound-files))))))) (invertw window) (cond (unfound-files (ringbells) (dg.flashallwindows window) (clearw (dg.promptwindow window)) (|if| (eq backup-host 'floppy) |then| (|printout| (dg.promptwindow window) (length unfound-files) " Files were not found on this floppy !! please insert another one. " ) (setq files-backup-names unfound-files) (setq unfound-files nil) (floppy.wait.for.floppy t) (go newroundofcopy) |else| (|printout| (dg.promptwindow window) (length unfound-files) " Files wre not found on the backup directory and were not restored" ))))))))) (dg.restore-from-default-command (lambda (window) (* |edited:| "13-May-86 13:57") (declare (globalvars dg.default-backup-directory)) (|if| (null dg.default-backup-directory) |then| (dg.flashallwindows window) (|printout| (dg.promptwindow window) t "NULL default directory.Backup aborted") |else| (dg.restore-command window dg.default-backup-directory)))) (dg.restore-from-selected-command (lambda (window) (* |sm| " 8-Jun-85 13:05") (prog (backup-directory) (setq backup-directory (dg.create-prefix-from-path (car (dg.wait-for-dir-selection window "Select the directory that contains the backup." t)))) (dg.restore-command window backup-directory)))) (dg.setify (lambda (l) (* |edited:| "13-May-86 12:10") (prog (new-set) (|for| one-element |in| l |when| (not (member one-element new-set)) |do| (setq new-set (cons one-element new-set)) (block)) (return new-set)))) (dg.shade-current-directory (lambda (window) (* |edited:| "22-May-85 13:56") (prog (current-path) (setq current-path (nth (dg.create-path-from-file-name (dg.current-connected-directory)) (length (windowprop window 'dg.path-to-root)))) (|for| node |in| (|fetch| graphnodes |of| (windowprop window 'graph)) |do| (cond ((equal current-path (|fetch| nodeid |of| node)) (reset/node/border node 2 window)) (t (cond ((greaterp (|fetch| nodeborder |of| node) 0) (reset/node/border node -2 window))))))))) (dg.trim (lambda (w n) (* |edited:| " 5-Apr-85 11:08") (cond ((greaterp (nchars w) n) (subatom w 1 n)) (t w)))) (dg.unadvise (lambda nil (* |edited:| "31-Mar-85 23:26") (unadvise (\\generatenextfile in fb.updatebrowseritems)))) (dg.unadvise-generate-file (lambda nil (* |edited:| "31-Mar-85 23:26") (unadvise (\\generatenextfile in fb.updatebrowseritems)))) (dg.unpack-directory-name (lambda (name) (* |edited:| " 3-Apr-85 17:01") (cond ((null name) nil) (t (cons (pack (prog (packed-name) loop (cond ((or (null name) (eq (car name) '>)) (return packed-name)) (t (setq packed-name (nconc1 packed-name (car name))) (setq name (cdr name)) (go loop))))) (dg.unpack-directory-name (cdr name))))))) (dg.update-command (lambda (window) (* |edited:| " 3-Apr-85 13:38") (invertw window) (dg.update-directory-tree window))) (dg.update-directory-tree (lambda (window) (* |edited:| " 3-Apr-85 22:20") (prog (tree) (setq tree (dg.create-directory-tree (windowprop window 'dg.path-to-root))) (windowprop window 'dg.tree tree) (dg.display-directory-tree (dg.create-graph-from-tree tree) window)))) (dg.update-directroy-tree (lambda (window) (* |edited:| "30-Mar-85 15:21") (prog (tree) (setq tree (dg.create-directory-tree (windowprop window \'dg.path-to-root))) (dg.display-directory-tree tree window)))) (dg.wait-for-dir-selection (lambda (window message allow-other-windows) (* |edited:| "13-May-86 14:31") (declare (globalvars dg.last-directory-selected dg.directory-was-selected-event dg.window-of-last-directory)) (prog (waits) (setq dg.last-directory-selected nil) (setq waits 0) (|printout| (dg.promptwindow window) t message) wait-again (setq waits (add1 waits)) (await.event dg.directory-was-selected-event 1000) (cond ((or (null dg.last-directory-selected) (and (not allow-other-windows) (neq dg.window-of-last-directory window))) (cond ((greaterp waits 50) (return nil)) ((zerop (imod waits 10)) (flashwindow (dg.promptwindow window)) (playtune (list (cons (itimes 100 (iquotient waits 10)) 10000) (cons (itimes 100 (add1 (iquotient waits 10))) 10000) (cons (itimes 100 (iquotient waits 10)) 10000))))) (go wait-again))) (return (list dg.last-directory-selected dg.window-of-last-directory))))) (dirgrapher (lambda ({dev}

window-region path?) (* |edited:| "13-May-86 14:24") (declare (globalvars dg.default-dir waitingcursor promptwindow dg.min-width dg.min-height dg.promptwindowfont dg.menu-edge)) (prog (tree dg.window path old-cursor graph) (cond ((null {dev}) (setq {dev} dg.default-dir))) (setq old-cursor (cursor waitingcursor)) (printout promptwindow t "DirGrapher : Computing directory structure ") (|if| (listp {dev}) |then| (setq tree {dev}) (setq path (or path? (list (car tree)))) |else| (setq path (dg.create-path-from-file-name {dev})) (setq tree (dg.create-directory-tree (copy path)))) (setq graph (dg.create-graph-from-tree tree)) (printout promptwindow t "DirGrapher : Done.") (cursor old-cursor) (|if| window-region |then| (setq dg.window (createw window-region {dev})) |else| (setq dg.window (createw (dg.get-initial-region graph) {dev})) (windowprop dg.window 'minsize (cons dg.min-width dg.min-height))) (windowprop dg.window 'dg.path-to-root path) (dg.display-directory-tree graph dg.window) (windowprop dg.window 'dg.tree tree) (windowaddprop dg.window 'repaintfn 'dg.redisplayfn) (windowprop dg.window 'iconfn 'dg.createiconw) (windowprop dg.window 'expandfn '(dg.shade-current-directory redisplaygraph)) (windowprop dg.window 'dg.icontitle (dg.create-icon-title path)) (windowprop dg.window 'dg.process nil) (windowprop dg.window 'dg.file-selection-ended-event (create.event "DGEVENT")) (windowprop dg.window 'dg.lock (create.monitorlock "DG.LOCK")) (getpromptwindow dg.window 3 dg.promptwindowfont) (attachmenu (dg.create-menu dg.window) dg.window dg.menu-edge 'justify) (attachmenu (dg.create-quit-menu dg.window) dg.window 'bottom 'justify) (return dg.window)))) ) (rpaqq dg.icon #*(75 75)OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@N@@@@@@@@@@@@@@@@@N@N@@@@@@@@@@@@@@@@@N@NGOOOOOOOOOOOOOOOLN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@D@@@@@@@DN@ND@@@@@@@D@@@@@@@DN@ND@@@@@@@D@@@@@@@DN@ND@@@COOOOOOOH@@@DN@ND@@@B@@@@@@@H@@@DN@ND@@@B@@@@@@@H@@@DN@ND@@@B@@@@@@@H@@@DN@ND@GOOOO@@AOOOOH@DN@ND@D@@@A@@A@@@@H@DN@ND@D@@@A@@A@@@@H@DN@NDGOL@AOOAOO@@OOHDN@NDD@D@A@AA@A@@H@HDN@NDD@D@A@AA@A@@H@HDN@NDD@D@A@AA@A@@H@HDN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@ND@@@@@@@@@@@@@@@DN@NGOOOOOOOOOOOOOOOLN@N@@@@@@@@@@@@@@@@@N@N@@@@@@@@@@@@@@@@@N@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@ ) (rpaqq dg.mask #*(75 75)OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@ ) (rpaqq dg.fill-window-texture #*(16 16)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) (rpaqq dg.whitebm #*(16 16)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) (dg.advise-generate-file) (setq dg.background-directories (union dg.background-directories (union directories (cons '{floppy} (for d in (volumes) when (lispdirectoryp d) collect (pack* '{dsk}< d '>)))))) (dg.add-item-to-background-menu '|DirGrapher| '(dirgrapher) "Will initiate dirgrapher process on the current directory" (cons 'subitems (cons '("DG Windows to top" (|for| w |in| (openwindows) |when| (or (windowprop w 'dg.path-to-root) (and (windowprop w 'iconfor) (windowprop (windowprop w 'iconfor) 'dg.path-to-root))) |do| (totopw w))) (for d in dg.background-directories collect (list d (list 'dirgrapher (kwote d)) (concat "WILL APPLY DIRGRAPHER ON " d)))))) (* |;;;| "(declare\\: dontcopy (prop makefile-environment dirgrapher))") (putprops dirgrapher copyright ("Shaul Markovitch" 1985 1986 1900 1987 1988)) (declare\: dontcopy (filemap (nil (8084 97635 (dg.add-item-to-background-menu 8094 . 8552) (dg.advise-generate-file 8554 . 10241) (dg.apply-dirgrapher-command 10243 . 10764) (dg.apply-fb-on-dir-and-subdirs-command 10766 . 10939) (dg.apply-filebrowser-command 10941 . 11662) (dg.ask-for-backup-type 11664 . 12619) ( dg.attach-directory-files-menu 12621 . 16321) (dg.backup-command 16323 . 21827) (dg.file-exists 21829 . 21955) (dg.file-info-command 21957 . 25478) (dg.file-info-selection-fn 25480 . 26625) ( dg.files-hardcopy-command 26627 . 27988) (dg.load-files-command 27990 . 29633) (dg.newer-file 29635 . 29834) (dg.backup-on-default-command 29836 . 30287) (dg.backup-on-selected-command 30289 . 30776) ( dg.connect-dir-command 30778 . 31526) (dg.copy-directory-command 31528 . 31686) (dg.copy-file-command 31688 . 31837) (dg.copybuttoneventfn 31839 . 33270) (dg.create-backup-free-menu 33272 . 33892) ( dg.create-backup-name 33894 . 35331) (dg.create-directory-chain 35333 . 35645) ( dg.create-directory-spec 35647 . 36192) (dg.create-directory-tree 36194 . 36791) ( dg.create-graph-from-tree 36793 . 37277) (dg.create-icon-title 37279 . 37805) (dg.create-menu 37807 . 47220) (dg.create-path-from-file-name 47222 . 47939) (dg.create-prefix-from-path 47941 . 48228) ( dg.create-quit-menu 48230 . 48882) (dg.create-subdir-command 48884 . 50454) (dg.create-tree-from-lists 50456 . 51392) (dg.create-tree-nodes 51394 . 53153) (dg.createiconw 53155 . 53643) ( dg.current-connected-directory 53645 . 54038) (dg.delete-directory-command 54040 . 56106) ( dg.delete-from-tree 56108 . 56645) (dg.delete-old-versions-command 56647 . 58354) ( dg.delete-selected-files-command 58356 . 60575) (dg.directory-minus-prefix 60577 . 60833) ( dg.directory-selection-function 60835 . 61727) (dg.display-directory-tree 61729 . 62143) (dg.docommand 62145 . 62742) (dg.docommand-with-monitor 62744 . 64873) (dg.docommand-without-monitor 64875 . 66360) (dg.exclusive-directory 66362 . 66900) (dg.exclusive-new-versions 66902 . 67507) ( dg.exclusive-old-versions 67509 . 68133) (dg.fbiconfn 68135 . 68946) (dg.file-selection-fn 68948 . 69758) (dg.filecopy 69760 . 70085) (dg.find-directory-subtree 70087 . 70515) (dg.find-menu-item 70517 . 71022) (dg.find-parent-dierctory 71024 . 71780) (dg.flashallwindows 71782 . 71975) ( dg.get-fb-pattern 71977 . 72223) (dg.get-file-list 72225 . 72948) (dg.get-initial-region 72950 . 73678 ) (dg.kill-process 73680 . 74460) (dg.move-dir-command 74462 . 74616) (dg.move-file-command 74618 . 74769) (dg.movecopy-command 74771 . 78216) (dg.movecopy-dir-command 78218 . 83535) ( dg.pack-name-ver-ext 83537 . 83822) (dg.promptwindow 83824 . 83979) (dg.redisplayfn 83981 . 84131) ( dg.residual-path 84133 . 84306) (dg.restore-command 84308 . 89859) (dg.restore-from-default-command 89861 . 90316) (dg.restore-from-selected-command 90318 . 90809) (dg.setify 90811 . 91129) ( dg.shade-current-directory 91131 . 91896) (dg.trim 91898 . 92097) (dg.unadvise 92099 . 92267) ( dg.unadvise-generate-file 92269 . 92451) (dg.unpack-directory-name 92453 . 93166) (dg.update-command 93168 . 93340) (dg.update-directory-tree 93342 . 93705) (dg.update-directroy-tree 93707 . 93982) ( dg.wait-for-dir-selection 93984 . 95380) (dirgrapher 95382 . 97633))))) stop \ No newline at end of file diff --git a/lispusers/DLIONFNKEYS b/lispusers/DLIONFNKEYS new file mode 100644 index 00000000..704e92cb --- /dev/null +++ b/lispusers/DLIONFNKEYS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "29-Oct-87 18:18:54" {ERINYES}LISPCORE>DLIONFNKEYS.;1 6304 changes to%: (FNS BUILDFNKEYS) previous date%: "19-Nov-85 12:20:57" {ERINYES}LYRIC>LISPUSERS>DLIONFNKEYS.;1) (* " Copyright (c) 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DLIONFNKEYSCOMS) (RPAQQ DLIONFNKEYSCOMS [(FILES KEYOBJ) (GLOBALVARS DLION.FN.KEYS DLION.FN.KEYLABELS KEYOBJ.TEMPLATE) [VARS (DLION.FN.KEYS '(CENTER BOLD ITALICS UNDERLINE SUPERSCRIPT SUBSCRIPT SMALLER DEFAULTS)) (DLION.FN.KEYLABELS '(CENTER BOLD ITALICS (UNDER- LINE) (SUPER- SCRIPT) (SUB- SCRIPT) SMALLER DEFAULTS] (BITMAPS FNKEYICON) (FNS BUILDFNKEYS FNKEY.MENUFN) (INITVARS (FNKEY.MENU (create MENU ITEMS _ '((Close 'CLOSEW "Closes a window" ) (Bury 'BURYW "Puts a window on the bottom." ) (Move 'MOVEW "Moves a window by a corner." ) (Shrink 'SHRINKW "Replaces this window with its icon" ]) (FILESLOAD KEYOBJ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DLION.FN.KEYS DLION.FN.KEYLABELS KEYOBJ.TEMPLATE) ) (RPAQQ DLION.FN.KEYS (CENTER BOLD ITALICS UNDERLINE SUPERSCRIPT SUBSCRIPT SMALLER DEFAULTS)) (RPAQQ DLION.FN.KEYLABELS (CENTER BOLD ITALICS (UNDER- LINE) (SUPER- SCRIPT) (SUB- SCRIPT) SMALLER DEFAULTS)) (RPAQQ FNKEYICON #*(80 50)OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@OOOH@@@@@@@@@@@@@@@@AOOH@@@@@@@@@@@@@@@@AONL@@@@@@@@@@@@@@@@BGOFCOOOOOOOOOOOOOOLDGNKF@@@@@@@@@@@@@@FHGMEH@@@@@@@@@@@@@@A@CNK@@@@@@@@@@@@@@@@HCMG@@@@@@@@@@@@@@@@LCNJ@@@@@@@@@@@@@@@@DCMF@@@@@@@@@@@@@@@@DCNJ@@@@@@@@@@@@@@@@DCMF@@@@@@@@@@@@@@@@DCNJ@@@@@@@@@@D@@@@@DCMF@CO@@@@@@DD@@@@@DCNJ@B@@@@@@@D@@@@@@DCMF@B@BABNALODGHKH@DCNJ@CNBACABBDDHDLD@DCMF@B@BABAB@DDHDHD@DCNJ@B@BABAB@DDHDHD@DCMF@B@BCBABBDDHDHD@DCNJ@B@AMBAALCDGHHD@DCMF@@@@@@@@@@@@@@@@DCNJ@@@@@@@@@@@@@@@@DCMF@@@@@@@@@@@@@@@@DCNJ@@@@@@@@@@@@@@@@DCMF@@@@BA@@@@@@@@@@DCNJ@@@@BB@@@@@@@@@@DCMF@@@@BD@NBBCH@@@@DCNJ@@@@BHAABBDD@@@@DCMF@@@@CDAOADCH@@@@DCNJ@@@@BBA@AD@D@@@@DCMF@@@@BAAA@HDD@@@@DCNJ@@@@B@HN@HCH@@@@DCMF@@@@@@@@@H@@@@@@DCNJ@@@@@@@@C@@@@@@@DCMF@@@@@@@@@@@@@@@@DCNK@@@@@@@@@@@@@@@@LCME@@@@@@@@@@@@@@@@HCNKH@@@@@@@@@@@@@@A@COBN@@@@@@@@@@@@@@GHGNDKOOOOOOOOOOOOOONLGOIAEEEEEEEEEEEEEEEFGOBBJJJJJJJJJJJJJJJKOOLEEEEEEEEEEEEEEEEEOONBJJJJJJJJJJJJJJJOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ) (DEFINEQ (BUILDFNKEYS [LAMBDA NIL (* ; "Edited 29-Oct-87 18:14 by jds") (PROG ((TXT (OPENTEXTSTREAM NIL NIL NIL NIL)) (WIDTH (FIX (TIMES (BITMAPWIDTH KEYOBJ.TEMPLATE) 8.3))) W) (TEDIT.INSERT TXT (CHARACTER (CHARCODE EOL)) 1) (for KEY in DLION.FN.KEYS as LABEL in DLION.FN.KEYLABELS do (TEDIT.INSERT.OBJECT (KEYOBJ.CREATE KEY LABEL T) TXT)) (* ;  "this will create abortable key objects (if you slide out of the region, no transitions are sent)") (TEDIT.SETSEL TXT 2 0 'LEFT) (TEDIT.PARALOOKS TXT '(QUAD CENTERED)) (* ;  "(TEDIT.NORMALIZECARET TXT (TEDIT.SETSEL TXT 0 0 (QUOTE LEFT)))") (SETQ W (CREATEW (CREATEREGION (IQUOTIENT (IDIFFERENCE (BITMAPWIDTH (SCREENBITMAP)) WIDTH) 2) 5 WIDTH (IPLUS (FONTPROP MENUFONT 'HEIGHT) (BITMAPHEIGHT KEYOBJ.TEMPLATE) 10)) "Dandelion function keys" 2)) (SCROLLW W 0 -5) (* ;  "used to have NOTITLE T in the props") (* ;  "TEDIT TXT W NIL (QUOTE (LEAVETTY T PROMPTWINDOW DON'T))") (OPENTEXTSTREAM TXT W NIL NIL '(READONLY T)) (WINDOWPROP W 'WINDOWENTRYFN 'NIL) (* ;  "(WINDOWPROP W (QUOTE TITLE) (QUOTE NIL))") (WINDOWPROP W 'ICON FNKEYICON) (WINDOWPROP W 'RIGHTBUTTONFN 'FNKEY.MENUFN) (SETQ DLIONFNKEYS W]) (FNKEY.MENUFN [LAMBDA (KEYWINDOW) (* gbn "28-Jan-85 01:17") (PROG ((ITEM (MENU FNKEY.MENU))) (COND (ITEM (APPLY* ITEM KEYWINDOW]) ) (RPAQ? FNKEY.MENU [create MENU ITEMS _ '((Close 'CLOSEW "Closes a window") (Bury 'BURYW "Puts a window on the bottom.") (Move 'MOVEW "Moves a window by a corner.") (Shrink 'SHRINKW "Replaces this window with its icon"]) (PUTPROPS DLIONFNKEYS COPYRIGHT ("Xerox Corporation" 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3544 5868 (BUILDFNKEYS 3554 . 5655) (FNKEY.MENUFN 5657 . 5866))))) STOP \ No newline at end of file diff --git a/lispusers/DOC-OBJECTS b/lispusers/DOC-OBJECTS new file mode 100644 index 00000000..968f3a8d --- /dev/null +++ b/lispusers/DOC-OBJECTS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP" BASE 10) (FILECREATED " 9-May-2018 11:09:43"  {DSK}kaplan>Local>medley3.5>lispcore>lispusers>DOC-OBJECTS.;7 50515 changes to%: (FNS DOCOBJ-INCLUDE-EDIT DOCOBJ-INCLUDE-BEFOREHARDCOPYFN) previous date%: " 9-May-2018 10:35:47" {DSK}kaplan>Local>medley3.5>lispcore>lispusers>DOC-OBJECTS.;4) (* ; " Copyright (c) 1986, 1987, 1993, 2018 by Johannes A. G. M. Koomen. All rights reserved. ") (PRETTYCOMPRINT DOC-OBJECTSCOMS) (RPAQQ DOC-OBJECTSCOMS [ (* ;;; "This TEdit subsystem implements an extensible facility originally intended to provide bibliography and citation capabilities. The TEdit function GET.OBJ.FROM.USER, the one triggered by typing ^O, calls the function PROMPTFOREVALED which is redefined by this subsystem to be equivalent to the function DocObj-Acquire-Object. This function inserts IMAGEOBJects into the current TEdit, and is driven by the variables DocObjectsMenu and DocObjectsMenuCommands (analogous to BackgroundMenu and BackgroundMenuCommands). Each menu entry contains a form that, when EVAL'd, creates and returns a particular kind of IMAGEOBJ. Note that this form is EVAL'd under the function DocObj-Acquire-Object, which runs under the function GET.OBJ.FROM.USER, which gets TEXTSTREAM and TEXTOBJ as arguments. They can be (and are) used freely to record state or other desired info. The image objects supplied by this subsystem are 'Eval`d Form' (i.e., the original behavior of ^O), 'Screen Snap' (equivalent to right-buttoning in the background while holding the SHIFT key down), etc.") (FILES (SYSLOAD) TEDIT IMAGEOBJ) (VARS (DocObjectsMenu NIL) (DocObjectsConfirmEditMenu NIL)) [INITVARS (DocObjectsMenuCommands NIL) (DocObjectsMenuFont (FONTCREATE '(MODERN 12 BOLD] (COMS (* ;; "The hook into GET.OBJ.FROM.USER") (FNS DOCOBJ-ACQUIRE-OBJECT DOCOBJ-INIT DOCOBJ-TEDIT-MENU-ENTRY DOCOBJ-GET-LOOKS DOCOBJ-REGISTER-OBJECT DOCOBJ-STRING-IMAGEBOX DOCOBJ-WAIT-MOUSE DOCOBJ-INVOKE-IMAGEOBJFN DOCOBJ-BEFOREHARDCOPYFN DOCOBJ-AFTERHARDCOPYFN)) [COMS (* ;; "Eval'd Form") (FNS DOCOBJ-ACQUIRE-EVALED-OBJECT) (ADDVARS (DocObjectsMenuCommands ("Eval'd Form" (DOCOBJ-ACQUIRE-EVALED-OBJECT) "Insert the value of a form to be typed in"] [COMS (* ;; "Screen Snap") (FNS DOCOBJ-ACQUIRE-SNAPPED-OBJECT) (ADDVARS (DocObjectsMenuCommands ("Screen Snap" (DOCOBJ-ACQUIRE-SNAPPED-OBJECT) "Insert a snap from the screen"] [COMS (* ;; "Time Stamp") (DECLARE%: DONTCOPY (RECORDS DOCOBJ-TIMESTAMP)) (FILES (SYSLOAD) DATEFORMAT-EDITOR) (FNS DOCOBJ-EDIT-TIMESTAMP DOCOBJ-MAKE-TIMESTAMP DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS DOCOBJ-TIMESTAMP-BUTTONEVENTINFN DOCOBJ-TIMESTAMP-COPYFN DOCOBJ-TIMESTAMP-DISPLAYFN DOCOBJ-TIMESTAMP-GETFN DOCOBJ-TIMESTAMP-IMAGEBOXFN DOCOBJ-TIMESTAMP-PREPRINTFN DOCOBJ-TIMESTAMP-PUTFN DOCOBJ-TIMESTAMP-TO-STRING) (INITVARS (DocObjectsTimeStampFormat) (DOCOBJ-TIMESTAMP-IMAGEFNS (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS))) (ADDVARS (DocObjectsMenuCommands ("Time Stamp" (DOCOBJ-MAKE-TIMESTAMP) "Date & time this document is PUT"] [COMS (* ;; "File Stamp") (FNS DOCOBJ-MAKE-FILESTAMP DOCOBJ-MAKE-FILESTAMP-IMAGEFNS DOCOBJ-FILESTAMP-COPYFN DOCOBJ-FILESTAMP-DISPLAYFN DOCOBJ-FILESTAMP-GETFN DOCOBJ-FILESTAMP-IMAGEBOXFN DOCOBJ-FILESTAMP-GET-FULLNAME DOCOBJ-FILESTAMP-NEW-FULLNAME DOCOBJ-FILESTAMP-PREPRINTFN DOCOBJ-FILESTAMP-PUTFN) (INITVARS (DOCOBJ-FILESTAMP-IMAGEFNS (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS))) (ADDVARS (DocObjectsMenuCommands ("File Stamp" (DOCOBJ-MAKE-FILESTAMP) "Name of file to which this document was last PUT." ] (COMS (* ;; "Horizontal Rule") (FILES (SYSLOAD) HRULE READNUMBER) (FNS DOCOBJ-MAKE-HRULE DOCOBJ-EDIT-HRULE DOCOBJ-HRULE-INIT DOCOBJ-HRULE-GET-WIDTH DOCOBJ-HRULE-BUTTONEVENTINFN) (VARS (DOCOBJ-HRULE-RULE-PAD) (DOCOBJ-HRULE-BLANK-PAD)) (ADDVARS (DocObjectsMenuCommands ("Horizontal Rule" (DOCOBJ-MAKE-HRULE) "One or more horizontal rules"))) (P (DOCOBJ-HRULE-INIT))) [COMS (* ;; "INCLUDE") (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS INCLOBJ)) (FNS DOCOBJ-MAKE-INCLUDE DOCOBJ-MAKE-INCLUDE-IMAGEFNS DOCOBJ-INCLUDE-CREATE-OBJ DOCOBJ-INCLUDE-EDIT DOCOBJ-INCLUDE-EDIT-WINDOWP DOCOBJ-INCLUDE-RESET-OBJ) (FNS DOCOBJ-INCLUDE-AFTERHARDCOPYFN DOCOBJ-INCLUDE-BEFOREHARDCOPYFN DOCOBJ-INCLUDE-CLEANUPFN DOCOBJ-INCLUDE-BUTTONEVENTINFN DOCOBJ-INCLUDE-COPYFN DOCOBJ-INCLUDE-DISPLAYFN DOCOBJ-INCLUDE-GETFN DOCOBJ-INCLUDE-IMAGEBOXFN DOCOBJ-INCLUDE-PREPRINTFN DOCOBJ-INCLUDE-PUTFN) (INITVARS (DOCOBJ-INCLUDE-EDITMENU) (DOCOBJ-INCLUDE-IMAGEFNS (DOCOBJ-MAKE-INCLUDE-IMAGEFNS))) (ADDVARS (DocObjectsMenuCommands ("Include" (DOCOBJ-MAKE-INCLUDE) "Include another document right here when hardcopying" ] (DECLARE%: DONTEVAL@LOAD DOCOPY (P (DOCOBJ-INIT))) (DECLARE%: EVAL@LOAD DONTCOPY (COMS (PROP FILETYPE DOC-OBJECTS) (PROP MAKEFILE-ENVIRONMENT DOC-OBJECTS]) (* ;;; "This TEdit subsystem implements an extensible facility originally intended to provide bibliography and citation capabilities. The TEdit function GET.OBJ.FROM.USER, the one triggered by typing ^O, calls the function PROMPTFOREVALED which is redefined by this subsystem to be equivalent to the function DocObj-Acquire-Object. This function inserts IMAGEOBJects into the current TEdit, and is driven by the variables DocObjectsMenu and DocObjectsMenuCommands (analogous to BackgroundMenu and BackgroundMenuCommands). Each menu entry contains a form that, when EVAL'd, creates and returns a particular kind of IMAGEOBJ. Note that this form is EVAL'd under the function DocObj-Acquire-Object, which runs under the function GET.OBJ.FROM.USER, which gets TEXTSTREAM and TEXTOBJ as arguments. They can be (and are) used freely to record state or other desired info. The image objects supplied by this subsystem are 'Eval`d Form' (i.e., the original behavior of ^O), 'Screen Snap' (equivalent to right-buttoning in the background while holding the SHIFT key down), etc." ) (FILESLOAD (SYSLOAD) TEDIT IMAGEOBJ) (RPAQQ DocObjectsMenu NIL) (RPAQQ DocObjectsConfirmEditMenu NIL) (RPAQ? DocObjectsMenuCommands NIL) (RPAQ? DocObjectsMenuFont (FONTCREATE '(MODERN 12 BOLD))) (* ;; "The hook into GET.OBJ.FROM.USER") (DEFINEQ (DOCOBJ-ACQUIRE-OBJECT [LAMBDA NIL (* ; "Edited 15-Oct-87 16:27 by Koomen") (* ;;; "This function is invoked by TEdit's GET.OBJ.FROM.USER (cf. the Library file IMAGEOBJ) after (CHANGENAME (QUOTE GET.OBJ.FROM.USER) (QUOTE PROMPTFOREVALED) (QUOTE DOCOBJ-ACQUIRE-OBJECT))") (* ;;; "When adding more items to the DocObjectsMenuCommands, do (SETQ DocObjectsMenu)") (DECLARE (GLOBALVARS DocObjectsMenu DocObjectsMenuCommands DocObjectsMenuFont)) (if (NOT (type? MENU DocObjectsMenu)) then (SETQ DocObjectsMenu (create MENU TITLE _ "Select object type: " CENTERFLG _ T ITEMS _ DocObjectsMenuCommands MENUFONT _ DocObjectsMenuFont))) (MENU DocObjectsMenu]) (DOCOBJ-INIT [LAMBDA NIL (* ;  "Edited 8-Oct-87 21:32 by Koomen") (* ;;; "This function changes the behavior of standard TEdit such that ^O will invoke the DocObjects system; an entry to invoke the DocObjects system is also added to TEdit's middle button menu.") (DECLARE (GLOBALVARS TEDIT.DEFAULT.MENU)) (CHANGENAME 'GET.OBJ.FROM.USER 'PROMPTFOREVALED ' DOCOBJ-ACQUIRE-OBJECT) (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU '(Object (FUNCTION DOCOBJ-TEDIT-MENU-ENTRY) "Insert a Document Object"]) (DOCOBJ-TEDIT-MENU-ENTRY [LAMBDA (TEXTSTREAM) (* ;  "Edited 8-Oct-87 21:31 by Koomen") (* ;;; "This is the entry point into the DocObjects system from TEdit's middle button menu. GET.OBJ.FROM.USER used to call PROMPTFOREVALED but DocObjects changes this into a call to DOCOBJ-ACQUIRE-OBJECT.") (GET.OBJ.FROM.USER TEXTSTREAM (TEXTOBJ TEXTSTREAM]) (DOCOBJ-GET-LOOKS [LAMBDA (TEXTOBJ CH#ORCHARLOOKS) (* Koomen " 4-Feb-87 23:37") (* * Adapted from {ERIS}TEDITLOOKS.;30 dated  "15-Oct-85 16:51:10" to return looks itself, rather  than a proplist.)  (* jds "10-Jul-85 16:02") (* Return a PLIST of  character looks) (PROG ((TEXTOBJ (TEXTOBJ TEXTOBJ)) LOOKS FONT NLOOKS) [COND ((type? CHARLOOKS CH#ORCHARLOOKS) (* He handed us a  CHARLOOKS. Unparse it for  him.) (SETQ LOOKS CH#ORCHARLOOKS)) ((ZEROP (fetch TEXTLEN of TEXTOBJ)) (* There's no text in the document.  Use the extant caret looks.) (SETQ LOOKS (fetch CARETLOOKS of TEXTOBJ))) [(FIXP CH#ORCHARLOOKS) (* He gave us a CH# to geth the looks of.  Grab it.) (SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ) CH#ORCHARLOOKS) (fetch PCTB of TEXTOBJ] [(type? SELECTION CH#ORCHARLOOKS) (* Get the looks of the  selected text) (SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ) (fetch (SELECTION CH#) of CH#ORCHARLOOKS)) (fetch PCTB of TEXTOBJ] ((NULL CH#ORCHARLOOKS) (* Get the looks of the  selected text) (SETQ LOOKS (fetch PLOOKS of (\CHTOPC (IMIN (fetch TEXTLEN of TEXTOBJ) (fetch (SELECTION CH#) of (fetch SEL of TEXTOBJ))) (fetch PCTB of TEXTOBJ] (RETURN LOOKS) (* * Now break the looks apart into a PROPLIST) (SETQ NLOOKS (\TEDIT.UNPARSE.CHARLOOKS.LIST LOOKS)) (RETURN NLOOKS]) (DOCOBJ-REGISTER-OBJECT [LAMBDA (OBJECT) (* ; "Edited 23-Oct-87 14:48 by Koomen") (* ;; "The following ensures that all DocObjects get a chance to do whatever they want to before and after hardcopying. Each DocObject can associate a BEFOREHARDCOPYFN and/or an AFTERHARDCOPYFN with the ImageObj representing the DocObject") (DECLARE (SPECVARS TEXTOBJ)) (if OBJECT then (TEXTPROP TEXTOBJ 'BEFOREHARDCOPYFN (FUNCTION DOCOBJ-BEFOREHARDCOPYFN)) (TEXTPROP TEXTOBJ 'AFTERHARDCOPYFN (FUNCTION DOCOBJ-AFTERHARDCOPYFN)) OBJECT]) (DOCOBJ-STRING-IMAGEBOX [LAMBDA (STRING IMAGESTREAM) (* Koomen " 9-Feb-87 17:22") (DECLARE (SPECVARS CHNO TEXTOBJ)) (PROG (LOOKS CLOFFSET FONT DEVICE HEIGHT DESCENT) (SETQ LOOKS (DOCOBJ-GET-LOOKS TEXTOBJ CHNO)) (SETQ CLOFFSET (fetch (CHARLOOKS CLOFFSET) of LOOKS)) (SETQ FONT (fetch (CHARLOOKS CLFONT) of LOOKS)) (if (NEQ (FONTPROP FONT 'DEVICE) (SETQ DEVICE (IMAGESTREAMTYPE IMAGESTREAM))) then (SETQ FONT (FONTCOPY FONT 'DEVICE DEVICE))) (SETQ HEIGHT (FONTHEIGHT FONT)) (SETQ DESCENT (FONTPROP FONT 'DESCENT)) (RETURN (create IMAGEBOX XSIZE _ (STRINGWIDTH STRING FONT) YSIZE _ (IPLUS HEIGHT (IABS CLOFFSET)) YDESC _ (IDIFFERENCE DESCENT CLOFFSET) XKERN _ 0]) (DOCOBJ-WAIT-MOUSE [LAMBDA (STREAM) (* ;  "Edited 8-Oct-87 23:46 by Koomen") (while (NOT (MOUSESTATE UP)) bind (REGION _ (DSPCLIPPINGREGION NIL STREAM)) do (if (NOT (INSIDEP REGION (LASTMOUSEX STREAM) (LASTMOUSEY STREAM))) then (RETURN NIL)) finally (RETURN T]) (DOCOBJ-INVOKE-IMAGEOBJFN [LAMBDA (CH# PIECE PC# IMAGEOBJFNNAME) (* ; "Edited 15-Oct-87 23:35 by Koomen") (* ;; "If PIECE is an IMAGEOBJ, invoke the function associated with the ImageObj property IMAGEOBJFNNAME on the IMAGEOBJ and the character position where the IMAGEOBJ is located. ") (PROG (IMAGEOBJ IMAGEOBJFN) (if (NOT (type? PIECE PIECE)) then (RETURN)) (SETQ IMAGEOBJ (fetch POBJ of PIECE)) (if (NOT (IMAGEOBJP IMAGEOBJ)) then (RETURN)) (SETQ IMAGEOBJFN (IMAGEOBJPROP IMAGEOBJ IMAGEOBJFNNAME)) (if (AND IMAGEOBJFN (DEFINEDP IMAGEOBJFN)) then (APPLY* IMAGEOBJFN IMAGEOBJ CH# PIECE PC#]) (DOCOBJ-BEFOREHARDCOPYFN [LAMBDA (TEXTSTREAM TEXTOBJ) (* ;  "Edited 25-May-93 13:07 by sybalsky:mv:envos") (* ;; "Bug in TEDIT.FORMAT.HARDCOPY!!! This function is called with the arguments TEXTSTREAM and TEXTOBJ, but TEXTSTREAM is undefined!") (* ;; "*DOCOBJ-FORMS* is used to enable insertion and deletion of pieces. DocObjects can postpone insertion or deletion by added appropriate forms to *DOCOBJ-FORMS*. Can't do it while under TEDIT.MAPPIECES as the pointers get screwed up. ") (DECLARE (SPECVARS *DOCOBJ-FORMS*)) (LET ((TEXTSTREAM (TEXTSTREAM TEXTOBJ)) (*DOCOBJ-FORMS*)) (TEXTPROP TEXTSTREAM 'DOCOBJ-VIRGINP (NOT (TEDIT.STREAMCHANGEDP TEXTSTREAM))) (* ;; "After hardcopy, TEXTSTREAM is reset if this flag is T") (do (SETQ *DOCOBJ-FORMS*) (TEDIT.MAPPIECES TEXTOBJ (FUNCTION DOCOBJ-INVOKE-IMAGEOBJFN) 'BEFOREHARDCOPYFN) [WITHOUT-UPDATES TEXTOBJ (FETCH (TEXTOBJ SCRATCHSEL) OF TEXTOBJ) (for FRM in *DOCOBJ-FORMS* do (APPLY (CAR FRM) (CDR FRM] repeatwhile *DOCOBJ-FORMS*]) (DOCOBJ-AFTERHARDCOPYFN [LAMBDA (TEXTSTREAM TEXTOBJ) (* ;  "Edited 25-May-93 13:08 by sybalsky:mv:envos") (* ;; "Bug in TEDIT.FORMAT.HARDCOPY!!! This function is called with the arguments TEXTSTREAM and TEXTOBJ, but TEXTSTREAM is undefined, and TEXTOBJ is NIL!") (DECLARE (SPECVARS *DOCOBJ-FORMS*)) (LET ((*DOCOBJ-FORMS*)) (do (SETQ *DOCOBJ-FORMS*) (TEDIT.MAPPIECES TEXTOBJ (FUNCTION DOCOBJ-INVOKE-IMAGEOBJFN) 'AFTERHARDCOPYFN) [WITHOUT-UPDATES TEXTOBJ (fetch (TEXTOBJ SCRATCHSEL) of TEXTOBJ) (for FRM in *DOCOBJ-FORMS* do (APPLY (CAR FRM) (CDR FRM] repeatwhile *DOCOBJ-FORMS*) (COND ((TEXTPROP TEXTSTREAM 'DOCOBJ-VIRGINP) (TEDIT.STREAMCHANGEDP TEXTSTREAM T]) ) (* ;; "Eval'd Form") (DEFINEQ (DOCOBJ-ACQUIRE-EVALED-OBJECT [LAMBDA NIL (* Koomen "30-Sep-86 02:08") (* * This is the original function called under  GET.OBJ.FROM.USER * *) (PROMPTFOREVALED "Form to eval: "]) ) (ADDTOVAR DocObjectsMenuCommands ("Eval'd Form" (DOCOBJ-ACQUIRE-EVALED-OBJECT) "Insert the value of a form to be typed in")) (* ;; "Screen Snap") (DEFINEQ (DOCOBJ-ACQUIRE-SNAPPED-OBJECT [LAMBDA NIL (* Koomen "26-Sep-86 16:55") (GETREGION]) ) (ADDTOVAR DocObjectsMenuCommands ("Screen Snap" (DOCOBJ-ACQUIRE-SNAPPED-OBJECT) "Insert a snap from the screen")) (* ;; "Time Stamp") (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD DOCOBJ-TIMESTAMP (IDATE DATESTR FORMAT)) ) ) (FILESLOAD (SYSLOAD) DATEFORMAT-EDITOR) (DEFINEQ (DOCOBJ-EDIT-TIMESTAMP [LAMBDA (TIMESTAMP) (* Koomen " 4-Feb-87 14:08") (PROG [(FORMAT (EDIT-DATEFORMAT (fetch (DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP] (if FORMAT then (replace (DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP with FORMAT) (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with NIL) (RETURN TIMESTAMP]) (DOCOBJ-MAKE-TIMESTAMP [LAMBDA NIL (* Koomen " 4-Feb-87 13:54") (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS DocObjectsTimeStampFormat)) (IMAGEOBJCREATE (create DOCOBJ-TIMESTAMP IDATE _ (IDATE) FORMAT _ DocObjectsTimeStampFormat) DOCOBJ-TIMESTAMP-IMAGEFNS]) (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS [LAMBDA NIL (* ;  "Edited 8-Oct-87 22:53 by Koomen") (LET ((DISPLAYFN (FUNCTION DOCOBJ-TIMESTAMP-DISPLAYFN)) (IMAGEBOXFN (FUNCTION DOCOBJ-TIMESTAMP-IMAGEBOXFN)) (PUTFN (FUNCTION DOCOBJ-TIMESTAMP-PUTFN)) (GETFN (FUNCTION DOCOBJ-TIMESTAMP-GETFN)) (COPYFN (FUNCTION DOCOBJ-TIMESTAMP-COPYFN)) (BUTTONEVENTINFN (FUNCTION DOCOBJ-TIMESTAMP-BUTTONEVENTINFN)) (COPYBUTTONEVENTINFN (FUNCTION NILL)) (WHENMOVEDFN (FUNCTION NILL)) (WHENINSERTEDFN (FUNCTION NILL)) (WHENDELETEDFN (FUNCTION NILL)) (WHENCOPIEDFN (FUNCTION NILL)) (WHENOPERATEDONFN (FUNCTION NILL)) (PREPRINTFN (FUNCTION DOCOBJ-TIMESTAMP-PREPRINTFN))) (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN PREPRINTFN]) (DOCOBJ-TIMESTAMP-BUTTONEVENTINFN [LAMBDA (IMAGEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON) (* ;  "Edited 8-Oct-87 23:43 by Koomen") (if (AND (EQ BUTTON 'MIDDLE) (DOCOBJ-WAIT-MOUSE WINDOWSTREAM)) then (ALLOW.BUTTON.EVENTS) (if (DOCOBJ-EDIT-TIMESTAMP (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM)) then 'CHANGED]) (DOCOBJ-TIMESTAMP-COPYFN [LAMBDA (IMAGEOBJ SOURCEHOSTSTREAM TARGETHOSTSTREAM) (* Koomen "31-Jan-87 00:30") (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS)) (IMAGEOBJCREATE (COPYALL (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM)) DOCOBJ-TIMESTAMP-IMAGEFNS]) (DOCOBJ-TIMESTAMP-DISPLAYFN [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM) (* Koomen " 4-Feb-87 14:11") (PRINTOUT IMAGESTREAM (DOCOBJ-TIMESTAMP-TO-STRING (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM]) (DOCOBJ-TIMESTAMP-GETFN [LAMBDA (FILESTREAM) (* Koomen "31-Jan-87 00:19") (DECLARE (GLOBALVARS DOCOBJ-TIMESTAMP-IMAGEFNS)) (IMAGEOBJCREATE (READ FILESTREAM) DOCOBJ-TIMESTAMP-IMAGEFNS]) (DOCOBJ-TIMESTAMP-IMAGEBOXFN [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN) (* Koomen " 9-Feb-87 17:13") (LET* ((TIMESTAMP (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM)) (TIMESTRING (DOCOBJ-TIMESTAMP-TO-STRING TIMESTAMP))) (DOCOBJ-STRING-IMAGEBOX TIMESTRING IMAGESTREAM]) (DOCOBJ-TIMESTAMP-PREPRINTFN [LAMBDA (IMAGEOBJ) (* ;  "Edited 8-Oct-87 22:29 by Koomen") (DOCOBJ-TIMESTAMP-TO-STRING (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM]) (DOCOBJ-TIMESTAMP-PUTFN [LAMBDA (IMAGEOBJ FILESTREAM) (* Koomen " 4-Feb-87 14:08") (PROG [(TIMESTAMP (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM] (replace (DOCOBJ-TIMESTAMP IDATE) of TIMESTAMP with (IDATE)) (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with NIL) (PRINT TIMESTAMP FILESTREAM]) (DOCOBJ-TIMESTAMP-TO-STRING [LAMBDA (TIMESTAMP) (* Koomen " 4-Feb-87 14:12") (OR (STRINGP (fetch (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP)) (replace (DOCOBJ-TIMESTAMP DATESTR) of TIMESTAMP with (GDATE (fetch (DOCOBJ-TIMESTAMP IDATE) of TIMESTAMP) (fetch (DOCOBJ-TIMESTAMP FORMAT) of TIMESTAMP]) ) (RPAQ? DocObjectsTimeStampFormat ) (RPAQ? DOCOBJ-TIMESTAMP-IMAGEFNS (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS)) (ADDTOVAR DocObjectsMenuCommands ("Time Stamp" (DOCOBJ-MAKE-TIMESTAMP) "Date & time this document is PUT")) (* ;; "File Stamp") (DEFINEQ (DOCOBJ-MAKE-FILESTAMP [LAMBDA NIL (* ;  "Edited 8-Oct-87 22:55 by Koomen") (DECLARE (SPECVARS TEXTOBJ) (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS)) (IMAGEOBJCREATE (DOCOBJ-FILESTAMP-NEW-FULLNAME TEXTOBJ) DOCOBJ-FILESTAMP-IMAGEFNS]) (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS [LAMBDA NIL (* ;  "Edited 8-Oct-87 22:54 by Koomen") (LET ((DISPLAYFN (FUNCTION DOCOBJ-FILESTAMP-DISPLAYFN)) (IMAGEBOXFN (FUNCTION DOCOBJ-FILESTAMP-IMAGEBOXFN)) (PUTFN (FUNCTION DOCOBJ-FILESTAMP-PUTFN)) (GETFN (FUNCTION DOCOBJ-FILESTAMP-GETFN)) (COPYFN (FUNCTION DOCOBJ-FILESTAMP-COPYFN)) (BUTTONEVENTINFN (FUNCTION NILL)) (COPYBUTTONEVENTINFN (FUNCTION NILL)) (WHENMOVEDFN (FUNCTION NILL)) (WHENINSERTEDFN (FUNCTION NILL)) (WHENDELETEDFN (FUNCTION NILL)) (WHENCOPIEDFN (FUNCTION NILL)) (WHENOPERATEDONFN (FUNCTION NILL)) (PREPRINTFN (FUNCTION DOCOBJ-FILESTAMP-PREPRINTFN))) (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN PREPRINTFN]) (DOCOBJ-FILESTAMP-COPYFN [LAMBDA (IMAGEOBJ SOURCEHOSTSTREAM TARGETHOSTSTREAM) (* Koomen "31-Jan-87 04:10") (DECLARE (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS)) (IMAGEOBJCREATE (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM) DOCOBJ-FILESTAMP-IMAGEFNS]) (DOCOBJ-FILESTAMP-DISPLAYFN [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM) (* ;  "Edited 8-Oct-87 22:56 by Koomen") (PRINTOUT IMAGESTREAM (DOCOBJ-FILESTAMP-GET-FULLNAME IMAGEOBJ]) (DOCOBJ-FILESTAMP-GETFN [LAMBDA (FILESTREAM) (* ;  "Edited 8-Oct-87 22:58 by Koomen") (DECLARE (GLOBALVARS DOCOBJ-FILESTAMP-IMAGEFNS)) (LET ((FULLNAME (READ FILESTREAM))) (IMAGEOBJCREATE (AND FULLNAME (MKSTRING FULLNAME)) DOCOBJ-FILESTAMP-IMAGEFNS]) (DOCOBJ-FILESTAMP-IMAGEBOXFN [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN) (* ;  "Edited 8-Oct-87 22:59 by Koomen") (LET ((FULLNAME (DOCOBJ-FILESTAMP-GET-FULLNAME IMAGEOBJ))) (DOCOBJ-STRING-IMAGEBOX FULLNAME IMAGESTREAM]) (DOCOBJ-FILESTAMP-GET-FULLNAME [LAMBDA (IMAGEOBJ NODEFAULTFLG) (* ;  "Edited 8-Oct-87 22:59 by Koomen") (PROG [(FULLNAME (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM] (RETURN (OR (if FULLNAME then (if (LITATOM FULLNAME) then (MKSTRING FULLNAME) elseif (STRINGP FULLNAME) then (COPYALL FULLNAME))) (if (NOT NODEFAULTFLG) then "-- not yet filed --"]) (DOCOBJ-FILESTAMP-NEW-FULLNAME [LAMBDA (TEXTOBJ) (* ;  "Edited 8-Oct-87 22:52 by Koomen") (PROG ((FULLNAME (FULLNAME TEXTOBJ))) (RETURN (if FULLNAME then (if (LITATOM FULLNAME) then (MKSTRING FULLNAME) elseif (STRINGP FULLNAME) then (COPYALL FULLNAME]) (DOCOBJ-FILESTAMP-PREPRINTFN [LAMBDA (IMAGEOBJ) (* ;  "Edited 8-Oct-87 22:56 by Koomen") (DOCOBJ-FILESTAMP-GET-FULLNAME IMAGEOBJ T]) (DOCOBJ-FILESTAMP-PUTFN [LAMBDA (IMAGEOBJ FILESTREAM) (* ;  "Edited 8-Oct-87 22:39 by Koomen") (PROG [(FULLNAME (MKSTRING (FULLNAME FILESTREAM] (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM FULLNAME) (PRINT FULLNAME FILESTREAM]) ) (RPAQ? DOCOBJ-FILESTAMP-IMAGEFNS (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS)) (ADDTOVAR DocObjectsMenuCommands ("File Stamp" (DOCOBJ-MAKE-FILESTAMP) "Name of file to which this document was last PUT.")) (* ;; "Horizontal Rule") (FILESLOAD (SYSLOAD) HRULE READNUMBER) (DEFINEQ (DOCOBJ-MAKE-HRULE [LAMBDA NIL (* Koomen " 4-Feb-87 16:12") (HRULE.CREATE (bind WIDTH for I from 1 while (AND (SETQ WIDTH (DOCOBJ-HRULE-GET-WIDTH (ODDP I) (EQ I 1))) (GREATERP WIDTH 0)) collect WIDTH]) (DOCOBJ-EDIT-HRULE [LAMBDA (IMAGEOBJ) (* Koomen " 4-Feb-87 15:45") (PROG [NEWWIDTH (OLDWIDTH (MKLIST (IMAGEOBJPROP IMAGEOBJ 'RULE.WIDTH] (SETQ NEWWIDTH (COPYALL OLDWIDTH)) (if (AND (NLSETQ (EDITE NEWWIDTH)) (NOT (EQUAL NEWWIDTH OLDWIDTH))) then (IMAGEOBJPROP IMAGEOBJ 'RULE.WIDTH NEWWIDTH) (RETURN IMAGEOBJ]) (DOCOBJ-HRULE-INIT [LAMBDA NIL (* Koomen " 4-Feb-87 16:13") (* * provide HRULE editing * *) (DECLARE (GLOBALVARS HRULE.IMAGEFNS)) (replace (IMAGEFNS BUTTONEVENTINFN) of HRULE.IMAGEFNS with (FUNCTION DOCOBJ-HRULE-BUTTONEVENTINFN)) NIL]) (DOCOBJ-HRULE-GET-WIDTH [LAMBDA (RULE? FIRST?) (* ;  "Edited 24-May-93 23:35 by sybalsky:mv:envos") (DECLARE (GLOBALVARS DOCOBJ-HRULE-BLANK-PAD DOCOBJ-HRULE-RULE-PAD LASTMOUSEX LASTMOUSEY)) [COND ((NULL DOCOBJ-HRULE-RULE-PAD) (SETQ DOCOBJ-HRULE-RULE-PAD (CREATE.NUMBERPAD.READER "Rule width: " NIL NIL NIL T T)) (SETQ DOCOBJ-HRULE-BLANK-PAD (CREATE.NUMBERPAD.READER "Blank space: " NIL NIL NIL T T] (COND (FIRST? (MOVEW DOCOBJ-HRULE-RULE-PAD LASTMOUSEX LASTMOUSEY) (MOVEW DOCOBJ-HRULE-BLANK-PAD LASTMOUSEX LASTMOUSEY))) (NUMBERPAD.READ (COND (RULE? DOCOBJ-HRULE-RULE-PAD) (T DOCOBJ-HRULE-BLANK-PAD)) T]) (DOCOBJ-HRULE-BUTTONEVENTINFN [LAMBDA (IMAGEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON) (* ;  "Edited 8-Oct-87 23:43 by Koomen") (if (AND (EQ BUTTON 'MIDDLE) (DOCOBJ-WAIT-MOUSE WINDOWSTREAM)) then (ALLOW.BUTTON.EVENTS) (if (DOCOBJ-EDIT-HRULE IMAGEOBJ) then 'CHANGED]) ) (RPAQQ DOCOBJ-HRULE-RULE-PAD NIL) (RPAQQ DOCOBJ-HRULE-BLANK-PAD NIL) (ADDTOVAR DocObjectsMenuCommands ("Horizontal Rule" (DOCOBJ-MAKE-HRULE) "One or more horizontal rules")) (DOCOBJ-HRULE-INIT) (* ;; "INCLUDE") (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD INCLOBJ (FILENAME ENABLEDP)) ) ) (DEFINEQ (DOCOBJ-MAKE-INCLUDE [LAMBDA NIL (* ; "Edited 15-Oct-87 14:54 by Koomen") (DECLARE (SPECVARS TEXTOBJ)) (PROG ((SUBFILE (TEDIT.GETINPUT TEXTOBJ "Enter file name: "))) (if SUBFILE then (RETURN (DOCOBJ-INCLUDE-CREATE-OBJ SUBFILE)) else (TEDIT.PROMPTPRINT TEXTOBJ "... aborted."]) (DOCOBJ-MAKE-INCLUDE-IMAGEFNS [LAMBDA NIL (* ; "Edited 23-Oct-87 00:20 by Koomen") (LET ((DISPLAYFN (FUNCTION DOCOBJ-INCLUDE-DISPLAYFN)) (IMAGEBOXFN (FUNCTION DOCOBJ-INCLUDE-IMAGEBOXFN)) (PUTFN (FUNCTION DOCOBJ-INCLUDE-PUTFN)) (GETFN (FUNCTION DOCOBJ-INCLUDE-GETFN)) (COPYFN (FUNCTION DOCOBJ-INCLUDE-COPYFN)) (BUTTONEVENTINFN (FUNCTION DOCOBJ-INCLUDE-BUTTONEVENTINFN)) (COPYBUTTONEVENTINFN (FUNCTION NILL)) (WHENMOVEDFN (FUNCTION NILL)) (WHENINSERTEDFN (FUNCTION NILL)) (WHENDELETEDFN (FUNCTION NILL)) (WHENCOPIEDFN (FUNCTION NILL)) (WHENOPERATEDONFN (FUNCTION NILL)) (PREPRINTFN (FUNCTION DOCOBJ-INCLUDE-PREPRINTFN))) (IMAGEFNSCREATE DISPLAYFN IMAGEBOXFN PUTFN GETFN COPYFN BUTTONEVENTINFN COPYBUTTONEVENTINFN WHENMOVEDFN WHENINSERTEDFN WHENDELETEDFN WHENCOPIEDFN WHENOPERATEDONFN PREPRINTFN]) (DOCOBJ-INCLUDE-CREATE-OBJ [LAMBDA (INCLOBJ) (* ; "Edited 23-Oct-87 14:06 by Koomen") (DECLARE (GLOBALVARS DOCOBJ-INCLUDE-IMAGEFNS)) (PROG (IMAGEOBJ) [if INCLOBJ then (if (NLISTP INCLOBJ) then (* ;; "Just a file name") (SETQ INCLOBJ (create INCLOBJ FILENAME _ (MKSTRING INCLOBJ) ENABLEDP _ T] (SETQ IMAGEOBJ (IMAGEOBJCREATE INCLOBJ DOCOBJ-INCLUDE-IMAGEFNS)) (DOCOBJ-INCLUDE-RESET-OBJ IMAGEOBJ) (DOCOBJ-REGISTER-OBJECT IMAGEOBJ) (RETURN IMAGEOBJ]) (DOCOBJ-INCLUDE-EDIT [LAMBDA (INCLOBJ) (* ; "Edited 9-May-2018 11:09 by rmk:") (* ; "Edited 9-May-2018 10:35 by rmk:") (* ;  "Edited 26-Oct-87 19:57 by Koomen") (DECLARE (SPECVARS TEXTOBJ)) (SELECTQ [MENU (OR DOCOBJ-INCLUDE-EDITMENU (SETQ DOCOBJ-INCLUDE-EDITMENU (create MENU TITLE _ "Edit Include" ITEMS _ '(("New File" 'NEW.FILE "Include a different file") ("Edit File" 'EDIT.FILE "Edit the included file") ("Enable" 'ENABLE "Include the file during hardcopy" ) ("Disable" 'DISABLE "Do not include the file during hardcopy" )) CENTERFLG _ T MENUOFFSET _ '(-1 . 30) CHANGEOFFSETFLG _ 'Y] (NEW.FILE (LET [(NEWNAME (TEDIT.GETINPUT TEXTOBJ "Enter new file name: " (fetch (INCLOBJ FILENAME) of INCLOBJ] (if [AND NEWNAME (SETQ NEWNAME (MKSTRING NEWNAME)) (NOT (EQUAL NEWNAME (fetch (INCLOBJ FILENAME) of INCLOBJ] then (replace (INCLOBJ FILENAME) of INCLOBJ with NEWNAME) T))) (EDIT.FILE (for W in (OPENWINDOWS) bind [FULLNAME _ (OR [FINDFILE (fetch (INCLOBJ FILENAME) of INCLOBJ ) T (CONS (PACKFILENAME.STRING 'HOST (FILENAMEFIELD (FETCH TXTFILE OF TEXTOBJ) 'HOST) 'DIRECTORY (FILENAMEFIELD (FETCH TXTFILE OF TEXTOBJ) 'DIRECTORY] (INFILEP (fetch (INCLOBJ FILENAME) of INCLOBJ] first (if (NULL FULLNAME) then (TEDIT.PROMPTPRINT TEXTOBJ "Can't find " T) (TEDIT.PROMPTPRINT TEXTOBJ (fetch (INCLOBJ FILENAME) of INCLOBJ)) (RETURN)) when (SETQ W (DOCOBJ-INCLUDE-EDIT-WINDOWP FULLNAME W)) do (TOTOPW W) (GIVE.TTY.PROCESS W) (RETURN) finally (TEDIT (MKATOM FULLNAME)))) (ENABLE (if (NOT (fetch (INCLOBJ ENABLEDP) of INCLOBJ)) then (replace (INCLOBJ ENABLEDP) of INCLOBJ with T) T)) (DISABLE (if (fetch (INCLOBJ ENABLEDP) of INCLOBJ) then (replace (INCLOBJ ENABLEDP) of INCLOBJ with NIL) T)) NIL]) (DOCOBJ-INCLUDE-EDIT-WINDOWP [LAMBDA (FILENAME WINDOW) (* ; "Edited 26-Oct-87 19:53 by Koomen") (if (WINDOWP WINDOW) then (OR (LET (TEXTOBJ TXTFILE) (if (AND (SETQ TEXTOBJ (WINDOWPROP WINDOW 'TEXTOBJ)) (type? TEXTOBJ TEXTOBJ) (SETQ TXTFILE (fetch (TEXTOBJ TXTFILE) of TEXTOBJ)) (STREAMP TXTFILE) (SETQ TXTFILE (FULLNAME TXTFILE)) (OR (STRINGP TXTFILE) (LITATOM TXTFILE)) (STRING-EQUAL FILENAME TXTFILE)) then WINDOW)) (DOCOBJ-INCLUDE-EDIT-WINDOWP FILENAME (WINDOWPROP WINDOW 'ICONFOR]) (DOCOBJ-INCLUDE-RESET-OBJ [LAMBDA (IMAGEOBJ) (* ; "Edited 23-Oct-87 14:09 by Koomen") (DECLARE (GLOBALVARS DOCOBJ-INCLUDE-IMAGEFNS)) (PROG (INCLOBJ FNAME) (if (SETQ INCLOBJ (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM)) then (SETQ FNAME (fetch (INCLOBJ FILENAME) of INCLOBJ)) (IMAGEOBJPROP IMAGEOBJ 'INCLDISPLAYSTRING (CONCAT "@Include[" FNAME "]")) (IMAGEOBJPROP IMAGEOBJ 'DONTINCLDISPLAYSTRING (CONCAT "@DoNotInclude[" FNAME "]")) ) (IMAGEOBJPROP IMAGEOBJ 'BEFOREHARDCOPYFN (FUNCTION DOCOBJ-INCLUDE-BEFOREHARDCOPYFN)) (IMAGEOBJPROP IMAGEOBJ 'AFTERHARDCOPYFN (FUNCTION DOCOBJ-INCLUDE-AFTERHARDCOPYFN]) ) (DEFINEQ (DOCOBJ-INCLUDE-AFTERHARDCOPYFN [LAMBDA (IMAGEOBJ CH#) (* ;  "Edited 3-Jun-93 12:42 by sybalsky:mv:envos") (DECLARE (SPECVARS TEXTSTREAM)) (COND ((IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM) (* ;; "Just record current position, let endmarker do the rest") (IMAGEOBJPROP IMAGEOBJ 'INCLSTARTPOS (ADD1 CH#))) (T (* ;; "Hit an end marker") (PROG (HEADOBJ STARTPOS) (SETQ HEADOBJ (IMAGEOBJPROP IMAGEOBJ 'INCLIMAGEOBJ)) (SETQ STARTPOS (IMAGEOBJPROP HEADOBJ 'INCLSTARTPOS)) (IMAGEOBJPROP HEADOBJ 'INCLUDEDP NIL) (push *DOCOBJ-FORMS* `(DOCOBJ-INCLUDE-CLEANUPFN ,TEXTSTREAM ,STARTPOS ,(ADD1 (IDIFFERENCE CH# STARTPOS]) (DOCOBJ-INCLUDE-BEFOREHARDCOPYFN [LAMBDA (IMAGEOBJ CH#) (* ; "Edited 9-May-2018 11:08 by rmk:") (* ; "Edited 9-May-2018 09:50 by rmk:") (* ; "Edited 9-May-2018 09:20 by rmk:") (* ;  "Edited 1-Jun-93 10:56 by sybalsky:mv:envos") (DECLARE (SPECVARS *DOCOBJ-FORMS* TEXTOBJ)) (* ;; "RMK: Changed to default to file in same directory as the including file. ") (LET [(INCLOBJ (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM] (COND ([AND INCLOBJ (fetch (INCLOBJ ENABLEDP) of INCLOBJ) (NOT (IMAGEOBJPROP IMAGEOBJ 'INCLUDEDP] (* ;; "We're under MAP.PIECES -- dangerous to insert here, so postpone") (push *DOCOBJ-FORMS* (LIST [FUNCTION (LAMBDA (STARTPOS INCLFILE IMAGEOBJ ENDOBJ WINDOWS) (DECLARE (SPECVARS TEXTSTREAM)) (COND (WINDOWS (TEDIT.PROMPTPRINT TEXTSTREAM "Including " T) (TEDIT.PROMPTPRINT TEXTSTREAM INCLFILE) (TEDIT.PROMPTPRINT TEXTSTREAM "...")) (T (PROMPTPRINT "[TEdit hardcopy: including " INCLFILE "...]"))) (WITHOUT-UPDATES (TEXTOBJ TEXTSTREAM) (fetch (TEXTOBJ SCRATCHSEL) of (TEXTOBJ TEXTSTREAM)) (TEDIT.SETSEL TEXTSTREAM STARTPOS 0 'RIGHT) (* ;; "Force paragraph boundary, so that the first paragraph of the included document doesn't inherit the paralooks of the paragraph containing the @Include.") (TEDIT.INSERT TEXTSTREAM " ") (TEDIT.PARALOOKS TEXTSTREAM '(NEWPAGEAFTER NIL NEWPAGEBEFORE NIL LINELEADING 0 POSTPARALEADING 0 PARALEADING 0)) (* ;;  "For space efficiency, tell TEdit to assume that the file will exist as long as we need it.") (TEDIT.INCLUDE TEXTSTREAM (OR [FINDFILE INCLFILE T (CONS (PACKFILENAME.STRING 'HOST (FILENAMEFIELD (FETCH TXTFILE OF (TEXTOBJ TEXTSTREAM )) 'HOST) 'DIRECTORY (FILENAMEFIELD (FETCH TXTFILE OF (TEXTOBJ TEXTSTREAM )) 'DIRECTORY] INCLFILE) NIL NIL T) (TEDIT.INSERT.OBJECT ENDOBJ TEXTSTREAM) (IMAGEOBJPROP ENDOBJ 'INCLIMAGEOBJ IMAGEOBJ) (IMAGEOBJPROP IMAGEOBJ 'INCLUDEDP T)) (COND (WINDOWS (TEDIT.PROMPTPRINT TEXTSTREAM " done.")) (T (PROMPTPRINT "[TEdit hardcopy: including " INCLFILE "... done.]"] (ADD1 CH#) (fetch (INCLOBJ FILENAME) of INCLOBJ) IMAGEOBJ (DOCOBJ-INCLUDE-CREATE-OBJ) (fetch (TEXTOBJ \WINDOW) of TEXTOBJ]) (DOCOBJ-INCLUDE-CLEANUPFN [LAMBDA (TEXTSTREAM STARTPOS LEN) (* ;  "Edited 3-Jun-93 12:43 by sybalsky:mv:envos") (* ;; "Do the cleanup of removing an included file's pieces (and closing it) after hardcopying with inclusions.") (LET* ((SEL (TEDIT.SETSEL TEXTSTREAM STARTPOS LEN)) (PCS (TEDIT.SELECTED.PIECES (TEXTOBJ TEXTSTREAM) SEL))) (for PC in PCS when (AND (fetch (PIECE PFILE) of PC) (OPENP (fetch (PIECE PFILE) of PC))) do (CLOSEF (fetch (PIECE PFILE) of PC))) (TEDIT.DELETE TEXTSTREAM STARTPOS LEN) (BLOCK]) (DOCOBJ-INCLUDE-BUTTONEVENTINFN [LAMBDA (IMAGEOBJ WINDOWSTREAM SELECTION RELX RELY WINDOW HOSTSTREAM BUTTON) (* ; "Edited 23-Oct-87 00:46 by Koomen") (if (AND (EQ BUTTON 'MIDDLE) (DOCOBJ-WAIT-MOUSE WINDOWSTREAM)) then (ALLOW.BUTTON.EVENTS) (if (DOCOBJ-INCLUDE-EDIT (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM)) then (DOCOBJ-INCLUDE-RESET-OBJ IMAGEOBJ) 'CHANGED]) (DOCOBJ-INCLUDE-COPYFN [LAMBDA (IMAGEOBJ SOURCEHOSTSTREAM TARGETHOSTSTREAM) (* ; "Edited 23-Oct-87 00:13 by Koomen") (DOCOBJ-INCLUDE-CREATE-OBJ (COPYALL (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM]) (DOCOBJ-INCLUDE-DISPLAYFN [LAMBDA (IMAGEOBJ IMAGESTREAM IMAGESTREAMTYPE HOSTSTREAM) (* ; "Edited 23-Oct-87 14:42 by Koomen") (PROG [(INCLOBJ (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM] (if [AND INCLOBJ (OR (EQ IMAGESTREAMTYPE 'DISPLAY) (NOT (fetch (INCLOBJ ENABLEDP) of INCLOBJ] then (printout IMAGESTREAM (IMAGEOBJPROP IMAGEOBJ (if (fetch (INCLOBJ ENABLEDP) of INCLOBJ) then 'INCLDISPLAYSTRING else 'DONTINCLDISPLAYSTRING]) (DOCOBJ-INCLUDE-GETFN [LAMBDA (FILESTREAM) (* ; "Edited 26-Oct-87 22:00 by Koomen") (LET ((INCLOBJ (READ FILESTREAM))) (if (NLISTP INCLOBJ) then (* ;; "Version 1: Just filename as string") (* ;; "Version 2: List whose CAR is filename") (SETQ INCLOBJ (create INCLOBJ FILENAME _ INCLOBJ))) (if (NLISTP (CDR INCLOBJ)) then (* ;; "Version 3: List whose CADR is ENABLEDP flag") (NCONC1 INCLOBJ T)) (DOCOBJ-INCLUDE-CREATE-OBJ INCLOBJ]) (DOCOBJ-INCLUDE-IMAGEBOXFN [LAMBDA (IMAGEOBJ IMAGESTREAM CURRENTX RIGHTMARGIN) (* ; "Edited 23-Oct-87 14:41 by Koomen") (OR (LET [(INCLOBJ (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM] (if [AND INCLOBJ (OR (EQ (IMAGESTREAMTYPE IMAGESTREAM) 'DISPLAY) (NOT (fetch (INCLOBJ ENABLEDP) of INCLOBJ] then (DOCOBJ-STRING-IMAGEBOX (IMAGEOBJPROP IMAGEOBJ (if (fetch (INCLOBJ ENABLEDP) of INCLOBJ) then 'INCLDISPLAYSTRING else 'DONTINCLDISPLAYSTRING)) IMAGESTREAM))) (create IMAGEBOX XSIZE _ 0 YSIZE _ 0 YDESC _ 0 XKERN _ 0]) (DOCOBJ-INCLUDE-PREPRINTFN [LAMBDA (IMAGEOBJ) (* ; "Edited 23-Oct-87 14:19 by Koomen") (fetch (INCLOBJ FILENAME) of (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM]) (DOCOBJ-INCLUDE-PUTFN [LAMBDA (IMAGEOBJ FILESTREAM) (* ; "Edited 15-Oct-87 17:17 by Koomen") (PRINT (IMAGEOBJPROP IMAGEOBJ 'OBJECTDATUM) FILESTREAM]) ) (RPAQ? DOCOBJ-INCLUDE-EDITMENU ) (RPAQ? DOCOBJ-INCLUDE-IMAGEFNS (DOCOBJ-MAKE-INCLUDE-IMAGEFNS)) (ADDTOVAR DocObjectsMenuCommands ("Include" (DOCOBJ-MAKE-INCLUDE) "Include another document right here when hardcopying")) (DECLARE%: DONTEVAL@LOAD DOCOPY (DOCOBJ-INIT) ) (DECLARE%: EVAL@LOAD DONTCOPY (PUTPROPS DOC-OBJECTS FILETYPE :TCOMPL) (PUTPROPS DOC-OBJECTS MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10)) ) (PUTPROPS DOC-OBJECTS COPYRIGHT ("Johannes A. G. M. Koomen" 1986 1987 1993 2018)) (DECLARE%: DONTCOPY (FILEMAP (NIL (7690 17683 (DOCOBJ-ACQUIRE-OBJECT 7700 . 8574) (DOCOBJ-INIT 8576 . 9204) ( DOCOBJ-TEDIT-MENU-ENTRY 9206 . 9628) (DOCOBJ-GET-LOOKS 9630 . 12365) (DOCOBJ-REGISTER-OBJECT 12367 . 13021) (DOCOBJ-STRING-IMAGEBOX 13023 . 13971) (DOCOBJ-WAIT-MOUSE 13973 . 14433) ( DOCOBJ-INVOKE-IMAGEOBJFN 14435 . 15219) (DOCOBJ-BEFOREHARDCOPYFN 15221 . 16614) ( DOCOBJ-AFTERHARDCOPYFN 16616 . 17681)) (17713 17980 (DOCOBJ-ACQUIRE-EVALED-OBJECT 17723 . 17978)) ( 18184 18326 (DOCOBJ-ACQUIRE-SNAPPED-OBJECT 18194 . 18324)) (18669 23465 (DOCOBJ-EDIT-TIMESTAMP 18679 . 19208) (DOCOBJ-MAKE-TIMESTAMP 19210 . 19621) (DOCOBJ-MAKE-TIMESTAMP-IMAGEFNS 19623 . 20693) ( DOCOBJ-TIMESTAMP-BUTTONEVENTINFN 20695 . 21226) (DOCOBJ-TIMESTAMP-COPYFN 21228 . 21553) ( DOCOBJ-TIMESTAMP-DISPLAYFN 21555 . 21848) (DOCOBJ-TIMESTAMP-GETFN 21850 . 22090) ( DOCOBJ-TIMESTAMP-IMAGEBOXFN 22092 . 22448) (DOCOBJ-TIMESTAMP-PREPRINTFN 22450 . 22681) ( DOCOBJ-TIMESTAMP-PUTFN 22683 . 23052) (DOCOBJ-TIMESTAMP-TO-STRING 23054 . 23463)) (23763 28070 ( DOCOBJ-MAKE-FILESTAMP 23773 . 24114) (DOCOBJ-MAKE-FILESTAMP-IMAGEFNS 24116 . 25158) ( DOCOBJ-FILESTAMP-COPYFN 25160 . 25475) (DOCOBJ-FILESTAMP-DISPLAYFN 25477 . 25765) ( DOCOBJ-FILESTAMP-GETFN 25767 . 26120) (DOCOBJ-FILESTAMP-IMAGEBOXFN 26122 . 26460) ( DOCOBJ-FILESTAMP-GET-FULLNAME 26462 . 27080) (DOCOBJ-FILESTAMP-NEW-FULLNAME 27082 . 27555) ( DOCOBJ-FILESTAMP-PREPRINTFN 27557 . 27766) (DOCOBJ-FILESTAMP-PUTFN 27768 . 28068)) (28397 30894 ( DOCOBJ-MAKE-HRULE 28407 . 28821) (DOCOBJ-EDIT-HRULE 28823 . 29295) (DOCOBJ-HRULE-INIT 29297 . 29629) ( DOCOBJ-HRULE-GET-WIDTH 29631 . 30442) (DOCOBJ-HRULE-BUTTONEVENTINFN 30444 . 30892)) (31282 39731 ( DOCOBJ-MAKE-INCLUDE 31292 . 31693) (DOCOBJ-MAKE-INCLUDE-IMAGEFNS 31695 . 32700) ( DOCOBJ-INCLUDE-CREATE-OBJ 32702 . 33491) (DOCOBJ-INCLUDE-EDIT 33493 . 38092) ( DOCOBJ-INCLUDE-EDIT-WINDOWP 38094 . 38956) (DOCOBJ-INCLUDE-RESET-OBJ 38958 . 39729)) (39732 49830 ( DOCOBJ-INCLUDE-AFTERHARDCOPYFN 39742 . 40626) (DOCOBJ-INCLUDE-BEFOREHARDCOPYFN 40628 . 45403) ( DOCOBJ-INCLUDE-CLEANUPFN 45405 . 46172) (DOCOBJ-INCLUDE-BUTTONEVENTINFN 46174 . 46708) ( DOCOBJ-INCLUDE-COPYFN 46710 . 46928) (DOCOBJ-INCLUDE-DISPLAYFN 46930 . 47662) (DOCOBJ-INCLUDE-GETFN 47664 . 48387) (DOCOBJ-INCLUDE-IMAGEBOXFN 48389 . 49398) (DOCOBJ-INCLUDE-PREPRINTFN 49400 . 49619) ( DOCOBJ-INCLUDE-PUTFN 49621 . 49828))))) STOP \ No newline at end of file diff --git a/lispusers/DOC-OBJECTS.TEDIT b/lispusers/DOC-OBJECTS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..ce0ad6cef8cc8f9e79cd700203fc93dcdfc1ffc5 GIT binary patch literal 10114 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 S#uJ(;4gBO6&hI|^%fA4F3dyVh literal 0 HcmV?d00001 diff --git a/lispusers/DONZ b/lispusers/DONZ new file mode 100644 index 00000000..d22c54e3 --- /dev/null +++ b/lispusers/DONZ @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "29-Mar-88 13:10:37" {ERINYES}LYRIC>DONZ.;2 23060 previous date%: " 1-Jun-86 13:49:39" {ERINYES}LYRIC>DONZ.;1) (* " Copyright (c) 1985, 1986, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DONZCOMS) (RPAQQ DONZCOMS ((VARS DONZ.BUBBLE.BITMAP DONZ.BUBBLE.BITMAP.SMALL DONZ.BUBBLE.SHADOW DONZ.BUBBLE.SHADOW.SMALL DONZ.TEST.MESSAGE.ALIST DONZ.DELAY) (FNS SCREENBLEEDER DONZ.COMPUTE.BUBBLE.REGION DONZ.GETMESSAGE DONZ.ISA.CALENDAR.ICON DONZ.ISA.CHAT.ICON DONZ.ISA.CLOCK.WINDOW DONZ.ISA.FCACHE.ICON DONZ.ISA.FILEBROWSER.ICON DONZ.ISA.INSPECTOR.ICON DONZ.ISA.MAIL.BROWSER DONZ.ISA.SKETCH.ICON DONZ.ISA.TEDIT.ICON DONZ.MESSAGE DONZ.RUN DONZ.TRY.WINDOW) (P (ADD.PROCESS '(DONZ.RUN))))) (RPAQQ DONZ.BUBBLE.BITMAP #*(175 75)@@@@@@@@@@@@COOOOOOOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@@@@@@@@@@GOOOOON@@@@@@@@@@@@@@@@@@GOOOOL@@@@@@@@@@@@COH@@@@@@@@@@@@@@@@@@@@@@@@@@GOOH@@@@@@@@@@AOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GO@@@@@@@@@@ON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CL@@@@@@@@CO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AO@@@@@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AO@@@@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GL@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GH@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CH@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHF@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@D@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@C@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@L@@@F@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@F@@@G@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C@@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AH@@AH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AL@@@L@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@G@@@CH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOHC@@@@O@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@COOOONAH@@@GO@@@@@@@@@@@@@@OOO@@@@@@@@@@@@@AON@@AOIH@@@AON@@@@@@@@@@@AOOOOO@@@@@@@@@@@OON@@@@CNL@@@@AOOO@@@@@@@COOOL@COOO@@@@@@OOOOL@@@@@@GL@@@@@AOOOOOOOOOOON@@@@@OOOOOOOOOOO@@@@@@@@AL@@@@@@@@OOOOOOOL@@@@@@@@AOOOOOON@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B ) (RPAQQ DONZ.BUBBLE.BITMAP.SMALL #*(150 65)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ) (RPAQQ DONZ.BUBBLE.SHADOW #*(175 75)@@@@@@@@@@@@@@@COOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@@@@@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOH@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@COL@@@@@GOOOOOOOOOOOOOL@COOOOOOOOOOOOOL@@@@@@GL@@@@@@GOOOOOOOOOON@@@@@OOOOOOOOOOO@@@@@@@@AL@@@@@@@@COOOOOOL@@@@@@@@AOOOOOON@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B ) (RPAQQ DONZ.BUBBLE.SHADOW.SMALL #*(175 75)@@@@@@@@@@@@@@@COOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@@@@@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO@@@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@AOOH@@@@GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOON@@@@COL@@@@@GOOOOOOOOOOOOOL@COOOOOOOOOOOOOL@@@@@@GL@@@@@@GOOOOOOOOOON@@@@@OOOOOOOOOOO@@@@@@@@AL@@@@@@@@COOOOOOL@@@@@@@@AOOOOOON@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B ) (RPAQQ DONZ.TEST.MESSAGE.ALIST ((DONZ.ISA.CLOCK.WINDOW (Here's the time,) (Don't loose track of the time,) (It's good to have the correct time,) (Synchronize with me,) (Time is important, isn't it,) (Time is of the essence,) (I've always got time for you,) (Of course, Digital readouts are good too,) (It's time for a change,)) (DONZ.ISA.MAIL.BROWSER (Some nice notes in here,) (Don't forget the ZIP code,) (Fan mail from some flounder,) (Notes to your random friends,) (Another "Dear Don" letter just arrived,) (Perfumed Electronic Message in here,) (We worship you,) (A package for you,) (Postage due,) (It could be your mother,) (This one's in a plain brown wrapper,)) (DONZ.ISA.CALENDAR.ICON (I'll bet you have a date tonight,) (I can tell you what month it is,) (Lots of weekends this month,) (Life passes quickly,) (I've misplaced your schedule,) (Maybe you should schedule more time with Mom,)) (DONZ.ISA.TEDIT.ICON (I'd better be saved,) (Better check my spelling) (The world needs another stupid paper,) (OOPS.. just lost the results section,) (My Weekly Reader would love this,) (I've had to change a few remarks,) (Submit this to JIR,) (A pencil might be faster,)) (DONZ.ISA.SKETCH.ICON (Look me over,) (I wish I had your shape,) (Twiddle my bits,) (Great models in here,) (Another Picasso in the works,) (Play with my texture,) (Have you found that Crayon yet,) (I'm pretty neat,)) (DONZ.ISA.INSPECTOR.ICON (Do some work,) (Set some values,) (Inspect me,)) (DONZ.ISA.FCACHE.ICON (Money in the data bank,) (I'm the father of our country,) (Isn't this a clever icon,) (Never tell a lie,)) (DONZ.ISA.FILEBROWSER.ICON (Some good files in here,) (Pull me out,) (Don't drop any on the floor,)) (DONZ.ISA.CHAT.ICON (Help, I'm trapped in an ethernet,) (Mr. Computer calling,) (There are users in here,)))) (RPAQQ DONZ.DELAY 15000) (DEFINEQ (SCREENBLEEDER (LAMBDA NIL (* Jeff.Shrager "20-Dec-85 15:02") (do (BITBLT (SCREENBITMAP) (SETQ L (RAND 0 1000)) (SETQ B (RAND 0 800)) (SCREENBITMAP) (IDIFFERENCE L (RAND 1 3)) (IDIFFERENCE B (RAND 1 3)) (RAND 25 50) (RAND 25 50) 'INPUT 'REPLACE) (DISMISS)))) (DONZ.COMPUTE.BUBBLE.REGION (LAMBDA (WR) (* walt%: "26-Feb-86 12:34") (* Jeff.Shrager "20-Dec-85 16:55") (CONS (IDIFFERENCE (CAR WR) (BITMAPWIDTH DONZ.BUBBLE.BITMAP)) (IPLUS (CADR WR) (CADDDR WR))))) (DONZ.GETMESSAGE (LAMBDA (W) (* walt%: " 7-Mar-86 16:46") (* walt%: "25-Feb-86 16:30") (OR (for S in DONZ.TEST.MESSAGE.ALIST bind (MSG _ NIL) until MSG do (COND ((APPLY* (CAR S) (WINDOWPROP W 'ICONFOR)) (SETQ MSG (CAR (NTH (CDR S) (RAND 1 (LENGTH (CDR S))))))) ((APPLY* (CAR S) W) (SETQ MSG (CAR (NTH (CDR S) (RAND 1 (LENGTH (CDR S)))))))) finally (RETURN MSG)) (CAR (NTH '((Open me first,) (I'm getting bored,) (Party in here. Check it out,) (Let me out of here,) (I'm suffocating in here,) (I think I'm still shrinking,) (I need a flashlight,) (Look at me expand,) (I get VERY big,) (I'm beginning to think you've forgotten me,)) (RAND 1 10)))))) (DONZ.ISA.CALENDAR.ICON (LAMBDA (W) (* walt%: " 7-Mar-86 16:48") (EQ 'CALMONTHRBF (WINDOWPROP W 'RIGHTBUTTONFN)))) (DONZ.ISA.CHAT.ICON (LAMBDA (W) (* Jeff.Shrager "31-May-86 02:22") (EQ 'CHAT.RESHAPEWINDOW (WINDOWPROP W 'RESHAPEFN)))) (DONZ.ISA.CLOCK.WINDOW (LAMBDA (W) (* walt%: " 6-Mar-86 11:19") (OR (EQ 'BICLOCKRSFN (WINDOWPROP W 'RESHAPEFN)) (EQ 'CROCK.RESHAPEFN (WINDOWPROP W 'RESHAPEFN))))) (DONZ.ISA.FCACHE.ICON (LAMBDA (W) (* Jeff.Shrager "31-May-86 02:12") (EQUAL "File cache" (SUBSTRING (WINDOWPROP W 'TITLE) 1 10)))) (DONZ.ISA.FILEBROWSER.ICON (LAMBDA (W) (* Jeff.Shrager "31-May-86 02:14") (EQ 'FB.SCROLLFN (WINDOWPROP W 'SCROLLFN)))) (DONZ.ISA.INSPECTOR.ICON (LAMBDA (W) (* Jeff.Shrager "20-Dec-85 17:01") (EQ 'INSPECTW.REPAINTFN (WINDOWPROP W 'REPAINTFN)))) (DONZ.ISA.MAIL.BROWSER (LAMBDA (W) (* Jeff.Shrager "20-Dec-85 16:16") (EQ 'LAB.BUTTONEVENTFN (WINDOWPROP W 'RIGHTBUTTONFN)))) (DONZ.ISA.SKETCH.ICON (LAMBDA (W) (* Jeff.Shrager "20-Dec-85 16:59") (EQ 'SKETCHW.REPAINTFN (WINDOWPROP W 'REPAINTFN)))) (DONZ.ISA.TEDIT.ICON (LAMBDA (W) (* walt%: " 7-Mar-86 16:27") (* Jeff.Shrager "20-Dec-85 16:25") (EQ '\TEDIT.BUTTONEVENTFN (WINDOWPROP W 'BUTTONEVENTFN)))) (DONZ.MESSAGE (LAMBDA (W MSG) (* Jeff.Shrager " 1-Jun-86 13:49") (LET ((BUBBLE (ICONW DONZ.BUBBLE.BITMAP DONZ.BUBBLE.SHADOW (DONZ.COMPUTE.BUBBLE.REGION (WINDOWPROP W 'REGION)))) (BUBBLEPRINT (ICONW DONZ.BUBBLE.BITMAP.SMALL DONZ.BUBBLE.SHADOW.SMALL (DONZ.COMPUTE.BUBBLE.REGION (APPEND (LIST (IPLUS (CAR (WINDOWPROP W 'REGION)) 5) (IPLUS 3 (CADR (WINDOWPROP W 'REGION)))) (CDDR (WINDOWPROP W 'REGION))))))) (MOVETO 13 56 BUBBLEPRINT) (PRINTOUT BUBBLEPRINT T 1 .PARA 1 0 (APPEND MSG (LIST (CONCAT FIRSTNAME ".")))) (DISMISS 3000) (CLOSEW BUBBLE) (CLOSEW BUBBLEPRINT)))) (DONZ.RUN (LAMBDA NIL (* Jeff.Shrager "21-Dec-85 21:31") (PROG NIL LOOP (DONZ.TRY.WINDOW (CAR (NTH (OPENWINDOWS) (RAND 1 (LENGTH (OPENWINDOWS)))))) (DISMISS DONZ.DELAY) (GO LOOP)))) (DONZ.TRY.WINDOW (LAMBDA (W) (* walt%: " 7-Mar-86 16:43") (* walt%: "25-Feb-86 16:31") (OR (AND (WINDOWPROP W 'ICONFOR) (DONZ.MESSAGE W (DONZ.GETMESSAGE W))) (AND (OR (EQ 'BICLOCKRSFN (WINDOWPROP W 'RESHAPEFN)) (EQ 'CROCK.RESHAPEFN (WINDOWPROP W 'RESHAPEFN))) (DONZ.MESSAGE W (DONZ.GETMESSAGE W)))))) ) (ADD.PROCESS '(DONZ.RUN)) (PUTPROPS DONZ COPYRIGHT ("Xerox Corporation" 1985 1986 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (17495 22948 (SCREENBLEEDER 17505 . 17959) (DONZ.COMPUTE.BUBBLE.REGION 17961 . 18317) ( DONZ.GETMESSAGE 18319 . 19476) (DONZ.ISA.CALENDAR.ICON 19478 . 19645) (DONZ.ISA.CHAT.ICON 19647 . 19819) (DONZ.ISA.CLOCK.WINDOW 19821 . 20044) (DONZ.ISA.FCACHE.ICON 20046 . 20260) ( DONZ.ISA.FILEBROWSER.ICON 20262 . 20433) (DONZ.ISA.INSPECTOR.ICON 20435 . 20612) ( DONZ.ISA.MAIL.BROWSER 20614 . 20792) (DONZ.ISA.SKETCH.ICON 20794 . 20967) (DONZ.ISA.TEDIT.ICON 20969 . 21238) (DONZ.MESSAGE 21240 . 22170) (DONZ.RUN 22172 . 22479) (DONZ.TRY.WINDOW 22481 . 22946))))) STOP \ No newline at end of file diff --git a/lispusers/DONZ.TEDIT b/lispusers/DONZ.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..4d44e76810143fe07d95f7fc3a39cf9c4e280577 GIT binary patch literal 4994 zcmeHJ-EQ015tg0oZqrl+T5N%~=*84sAksomZN+iCzN#Y82^)#>iqtyUJBmD#PEGL$ z{IQ~-Pq5eREA*l-P@wk(_Eq{8{boqYik)t;LD8!kHqA3<&is7y%^a%uZ`c1Y>4W~r z`MTbz*N^MYyhP-MLcl049UrsH|Ep-HL|I#0BUL#(X$S|=u6syM4Z+nf>o zUd?9YE)stZHIaBgz{oN~- zm^ba-XxOZu>qw<%#DTSoXE^iIh>Ca5>f2tuuhJmVt4y2ttUfS)h;U_}(#%h?lzf`{ z!PPu5c^uLzF@Z``YKYD8#A(ucp@Rhlex9n7HYQKV?u{ImGDA}pn5CivY$Y@+b3bSk zc`Az757cqq&nR2yl$OemQ(Bum3MpL~9RY<1TZ(3ROlC%*P6KnTk`1uQ)66XO+bY^K z!8}xv4}es*Rw^bx$n-VvH?WG+95TU8Xkx`6Hu|^ml4kcqZYaNGX-NLa*1sQ6I zToWI%Web3qCMolC#gUsQ*0u!o2NH83HkZ|%8MVblmd_WKy_LV3<0`HQmR*9I2A7wPn zg`h3GWYw8JfObImS|R_!D!2)fRzXw-G-Ojn>P?^&cN9{n_}><$MjD2si9E~o+C$5A zyU(q5cVN3793UH}y-Aj5^#=_wWqQPXnRev)xZQ3y>+6L=2FgeG@fH&TVeFpERGQ6V zTBh?OesuUzoMory4uC4+4A5wTTec9|`pG=!*>oo6J|A{%=ktmjYYnBM>7{EKeD>|9 zso`;_LIE0V(!iSMmX0w>;y|^;nv9*wn6QpR7Aq2tdc(}k403cvo*XGRxs}*<5qr9j zK@qAzhiJ5gf|-Qij=Mr4yJ0hM@hRJ^6gD_8W;!xoz*B^<*kPiwJc-F;3ywWtItv9? z3Fid2((c^TCCEh>psgHC$!iI8Sn%9xcf2IxLnG|7!A;=MffXRu}ljYQ!>Vi@lckV`%11WX*$l8 zQ!Sb=G>9bS`*mvOc`73m-~&OCvpBWC)lE zyeVcME*6!nb&4*HV-w^iPuulwypaoTVFda)a4CkCN%S1WDP6{XkZmgKviz z%qT&ye9Xe0!4qbKtJthjjJe_gl=8jq$5%4l$0ns7W@GU+RQQq4D=8YLfZw8_zEbqk zf9og31<0e?!3T- z==_{qYhd-f3q<0{`eHotAh7zyE(d&cNax+5J$OySQQsOnH2TUK4{WD2;EnB<7L$z4 zO&n-!_pDbJUB|UY4vnqnlRK(m0WTzIcJh>7E1gGD%ddQ4A` zkLgKg_pE2V^5h@~!75*z(D9QKIypQn%r|jzTVqlBua-*q^5O7*2iP2V=d?q|AXVps z(K-fVH%R{yx=`V zEkA(CU-{<0cmMzZ literal 0 HcmV?d00001 diff --git a/lispusers/DORADOCOLOR b/lispusers/DORADOCOLOR new file mode 100644 index 00000000..5da89c9a --- /dev/null +++ b/lispusers/DORADOCOLOR @@ -0,0 +1 @@ +(FILECREATED "24-Feb-86 12:32:26" {ERIS}LIBRARY>DORADOCOLOR.;27 15311 changes to: (VARS DORADOCOLORCOMS) previous date: "15-Feb-86 16:46:20" {ERIS}LIBRARY>DORADOCOLOR.;26) (* Copyright (c) 1985, 1900, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT DORADOCOLORCOMS) (RPAQQ DORADOCOLORCOMS ((* * DORADOCOLOR -- Dorado machine dependent color display fns -- By Richard Burton, Herb Jellinek, and Kelly Roach.) (DECLARE: DONTCOPY (RECORDS MonitorCB ChannelCB ColorCB ColorEntry) (CONSTANTS (DORADO\COLORSCREENWIDTH 640) (DORADO\COLORSCREENHEIGHT 480) (DORADOCOLORPAGES 602) (pplOffset 255) (MCBPtr 268) (MCBSeal 65326) (MCBLow 160) (MCBSize 8) (AFlagsMask 4) (ChCBLow 168) (ChCBSize 8) (ColCBLow 176) (ColCBSize 16) (CMapPages 8))) (* * \DORADOCOLOR.LEFTMARGIN should be set to 80 for small CONRACs, 56 for large CONRACs, and 40 for most other monitors. *) (INITVARS (\DORADOCOLOR.LEFTMARGIN 80) (\DORADOCOLOR.ATABLEIMAGE NIL) (DORADOCOLOR.BITSPERPIXEL 8)) (GLOBALVARS \DORADOCOLOR.ATABLEIMAGE \DORADOCOLOR.LEFTMARGIN DORADOCOLOR.BITSPERPIXEL) (FNS \RGB.TO.DORADO.RGB \DORADOCOLOR.LOOKATA) (FNS \DORADOCOLOR.INIT \DORADOCOLOR.STARTCOLOR \DORADOCOLOR.STOPCOLOR \DORADOCOLOR.EVENTFN \DORADOCOLOR.SENDCOLORMAPENTRY) (FNS \DORADOCOLOR.COLORLEVEL \DORADOCOLOR.SETONECOLOR) (FILES COLOR) (DECLARE: DONTEVAL@LOAD DOCOPY (P (\DORADOCOLOR.INIT))))) (* * DORADOCOLOR -- Dorado machine dependent color display fns -- By Richard Burton, Herb Jellinek, and Kelly Roach.) (DECLARE: DONTCOPY [DECLARE: EVAL@COMPILE (BLOCKRECORD MonitorCB ((Seal WORD) (Flags WORD) (ACB WORD) (NIL WORD) (colorCB WORD))) (BLOCKRECORD ChannelCB ((NIL WORD) (wordsPerLine WORD) (bitmapLo WORD) (bitmapHi WORD) (linesPerField WORD) (pixelsPerLine WORD) (leftMargin WORD) (scan WORD))) (BLOCKRECORD ColorCB ((ATableLo WORD) (ATableHi WORD) (NIL 6 WORD) (VBtoVS BYTE) (VStoVS BYTE) (VStoVB WORD) (VisibleLines WORD) (X WORD) (W BYTE) (A BYTE) (BtoA WORD) (clockm BITS 12) (clockd BITS 4) (NIL WORD))) (BLOCKRECORD ColorEntry ((NIL BITS 4) (RedLo BITS 4) (Blue BYTE) (NIL BITS 4) (Green BITS 8) (RedHi BITS 4))) ] (DECLARE: EVAL@COMPILE (RPAQQ DORADO\COLORSCREENWIDTH 640) (RPAQQ DORADO\COLORSCREENHEIGHT 480) (RPAQQ DORADOCOLORPAGES 602) (RPAQQ pplOffset 255) (RPAQQ MCBPtr 268) (RPAQQ MCBSeal 65326) (RPAQQ MCBLow 160) (RPAQQ MCBSize 8) (RPAQQ AFlagsMask 4) (RPAQQ ChCBLow 168) (RPAQQ ChCBSize 8) (RPAQQ ColCBLow 176) (RPAQQ ColCBSize 16) (RPAQQ CMapPages 8) (CONSTANTS (DORADO\COLORSCREENWIDTH 640) (DORADO\COLORSCREENHEIGHT 480) (DORADOCOLORPAGES 602) (pplOffset 255) (MCBPtr 268) (MCBSeal 65326) (MCBLow 160) (MCBSize 8) (AFlagsMask 4) (ChCBLow 168) (ChCBSize 8) (ColCBLow 176) (ColCBSize 16) (CMapPages 8)) ) ) (* * \DORADOCOLOR.LEFTMARGIN should be set to 80 for small CONRACs, 56 for large CONRACs, and 40 for most other monitors. *) (RPAQ? \DORADOCOLOR.LEFTMARGIN 80) (RPAQ? \DORADOCOLOR.ATABLEIMAGE NIL) (RPAQ? DORADOCOLOR.BITSPERPIXEL 8) (DECLARE: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \DORADOCOLOR.ATABLEIMAGE \DORADOCOLOR.LEFTMARGIN DORADOCOLOR.BITSPERPIXEL) ) (DEFINEQ (\RGB.TO.DORADO.RGB (LAMBDA (RGB ColorEntryBox) (* kbr: " 5-Jul-85 15:08") (PROG (ColorEntry) (SETQ ColorEntry (OR ColorEntryBox (\ALLOCBLOCK 1))) (replace (ColorEntry Blue) of ColorEntry with (fetch (RGB BLUE) of RGB)) (replace (ColorEntry Green) of ColorEntry with (fetch (RGB GREEN) of RGB)) (replace (ColorEntry RedLo) of ColorEntry with (LOGAND (fetch (RGB RED) of RGB) 15)) (replace (ColorEntry RedHi) of ColorEntry with (LRSH (fetch (RGB RED) of RGB) 4)) (RETURN ColorEntry)))) (\DORADOCOLOR.LOOKATA (LAMBDA (MCB) (* kbr: " 5-Jul-85 16:04") (replace (MonitorCB Flags) of MCB with (LOGOR AFlagsMask (fetch (MonitorCB Flags) of MCB))) (while (EQ AFlagsMask (LOGAND AFlagsMask (fetch (MonitorCB Flags) of MCB))) do (* wait for microcode to notice) (BLOCK)))) ) (DEFINEQ (\DORADOCOLOR.INIT (LAMBDA NIL (* kbr: "15-Feb-86 13:01") (DECLARE (GLOBALVARS \DORADOCOLORWSOPS \DORADOCOLORINFO)) (SETQ \DORADOCOLORWSOPS (create WSOPS STARTBOARD _(FUNCTION NILL) STARTCOLOR _(FUNCTION \DORADOCOLOR.STARTCOLOR) STOPCOLOR _(FUNCTION \DORADOCOLOR.STOPCOLOR) EVENTFN _(FUNCTION \DORADOCOLOR.EVENTFN) SENDCOLORMAPENTRY _(FUNCTION \DORADOCOLOR.SENDCOLORMAPENTRY) SENDPAGE _(FUNCTION NILL) PILOTBITBLT _(FUNCTION \DISPLAY.PILOTBITBLT))) (SETQ \DORADOCOLORINFO (create DISPLAYINFO DITYPE _(QUOTE DORADOCOLOR) DIWIDTH _ DORADO\COLORSCREENWIDTH DIHEIGHT _ DORADO\COLORSCREENHEIGHT DIBITSPERPIXEL _ 8 DIWSOPS _ \DORADOCOLORWSOPS)) (\DEFINEDISPLAYINFO \DORADOCOLORINFO))) (\DORADOCOLOR.STARTCOLOR (LAMBDA (FDEV) (* kbr: "21-Aug-85 15:55") (DECLARE (GLOBALVARS \DORADOCOLOR.LEFTMARGIN DORADOCOLOR.BITSPERPIXEL)) (PROG (DISPLAYSTATE MCB AC CB) (COND ((EQ (MACHINETYPE) (QUOTE DORADO)) (SETQ DISPLAYSTATE (fetch (FDEV DEVICEINFO) of FDEV)) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE STARTCOLOR)) (MOVD (QUOTE \DISPLAY.PILOTBITBLT) (QUOTE \SOFTCURSORPILOTBITBLT)) (\LOCKFN (QUOTE \SOFTCURSORPILOTBITBLT)) (SETQ MCB (EMADDRESS MCBLow)) (SETQ AC (EMADDRESS ChCBLow)) (SETQ CB (EMADDRESS ColCBLow)) (\ZEROWORDS MCB (\ADDBASE MCB MCBSize)) (\ZEROWORDS AC (\ADDBASE AC ChCBSize)) (\ZEROWORDS CB (\ADDBASE CB ColCBSize)) (* Set up color control block) (OR \DORADOCOLOR.ATABLEIMAGE (SETQ \DORADOCOLOR.ATABLEIMAGE (\ALLOCBLOCK (ITIMES CMapPages 128) NIL 128))) (\TEMPLOCKPAGES \DORADOCOLOR.ATABLEIMAGE CMapPages) (replace (ColorCB ATableHi) of CB with (\HILOC \DORADOCOLOR.ATABLEIMAGE)) (* Reverse pointer) (replace (ColorCB ATableLo) of CB with (\LOLOC \DORADOCOLOR.ATABLEIMAGE)) (replace (ColorCB VBtoVS) of CB with 3) (replace (ColorCB VStoVS) of CB with 3) (replace (ColorCB VStoVB) of CB with 16) (replace (ColorCB VisibleLines) of CB with 240) (replace (ColorCB X) of CB with 379) (replace (ColorCB W) of CB with 6) (replace (ColorCB A) of CB with 35) (replace (ColorCB BtoA) of CB with 18) (replace (ColorCB clockm) of CB with 88) (replace (ColorCB clockd) of CB with 12) (* set up channel control block) (replace (ChannelCB wordsPerLine) of AC with (FOLDHI (ITIMES DORADO\COLORSCREENWIDTH DORADOCOLOR.BITSPERPIXEL) BITSPERWORD)) (SETQ ColorScreenBitMapBase (fetch (BITMAP BITMAPBASE) of ColorScreenBitMap)) (\TEMPLOCKPAGES ColorScreenBitMapBase DORADOCOLORPAGES) (replace (ChannelCB bitmapHi) of AC with (\HILOC ColorScreenBitMapBase)) (replace (ChannelCB bitmapLo) of AC with (\LOLOC ColorScreenBitMapBase)) (replace (ChannelCB linesPerField) of AC with (IQUOTIENT DORADO\COLORSCREENHEIGHT 2)) (replace (ChannelCB pixelsPerLine) of AC with (IPLUS DORADO\COLORSCREENWIDTH pplOffset)) (replace (ChannelCB leftMargin) of AC with \DORADOCOLOR.LEFTMARGIN) (replace (ChannelCB scan) of AC with (SELECTQ DORADOCOLOR.BITSPERPIXEL (4 (* Magic constants = 164B) 116) (8 (* Magic constants = 170B) 120) (\ILLEGAL.ARG DORADOCOLOR.BITSPERPIXEL))) (replace (MonitorCB Seal) of MCB with MCBSeal) (replace (MonitorCB Flags) of MCB with 60) (replace (MonitorCB ACB) of MCB with ChCBLow) (* Wyatt used an empty A bitmap to establish scan mode. Why? We dont) (replace (MonitorCB colorCB) of MCB with ColCBLow) (EMPUTBASE MCBPtr MCBLow) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE ON))))))) (\DORADOCOLOR.STOPCOLOR (LAMBDA (FDEV) (* kbr: "21-Aug-85 15:56") (PROG (DISPLAYSTATE MCB) (SETQ DISPLAYSTATE (fetch (FDEV DEVICEINFO) of FDEV)) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE STOPCOLOR)) (SETQ MCB (EMADDRESS MCBLow)) (replace (MonitorCB ACB) of MCB with 0) (\ZEROWORDS \DORADOCOLOR.ATABLEIMAGE (\ADDBASE \DORADOCOLOR.ATABLEIMAGE 32)) (* Black) (\DORADOCOLOR.LOOKATA MCB) (EMPUTBASE MCBPtr 0) (\TEMPUNLOCKPAGES \DORADOCOLOR.ATABLEIMAGE CMapPages) (\TEMPUNLOCKPAGES (fetch (BITMAP BITMAPBASE) of ColorScreenBitMap) DORADOCOLORPAGES) (replace (DISPLAYSTATE ONOFF) of DISPLAYSTATE with (QUOTE OFF))))) (\DORADOCOLOR.EVENTFN (LAMBDA (FDEV EVENT) (* kbr: "24-Aug-85 16:55") (COND ((EQ (fetch (DISPLAYSTATE ONOFF) of (fetch (FDEV DEVICEINFO) of FDEV)) (QUOTE ON)) (SELECTQ EVENT ((BEFORELOGOUT BEFORESYSOUT BEFOREMAKESYS) (* turn off display since we may awake on different  machine) (COLORDISPLAY (QUOTE OFF))) (AFTERSAVEVM (* Rekick the color microcode. *) (\DORADOCOLOR.STARTCOLOR \COLORDISPLAYFDEV) (SCREENCOLORMAP (SCREENCOLORMAP))) NIL))))) (\DORADOCOLOR.SENDCOLORMAPENTRY (LAMBDA (FDEV COLOR# RGB) (* kbr: " 5-Jul-85 15:06") (PROG (ScratchColorEntry J) (SETQ ScratchColorEntry (\RGB.TO.DORADO.RGB (LIST 0 0 0))) (OR \DORADOCOLOR.ATABLEIMAGE (SHOULDNT)) (SETQ J (ITIMES COLOR# 8)) (\RGB.TO.DORADO.RGB RGB ScratchColorEntry) (\PUTBASE \DORADOCOLOR.ATABLEIMAGE J (\GETBASE ScratchColorEntry 0)) (\PUTBASE \DORADOCOLOR.ATABLEIMAGE (ADD1 J) (\GETBASE ScratchColorEntry 1)) (\DORADOCOLOR.LOOKATA (EMADDRESS MCBLow))))) ) (DEFINEQ (\DORADOCOLOR.COLORLEVEL (LAMBDA (DISPLAY COLOR# PRIMARYCOLOR NEWLEVEL) (* kbr: " 5-Jul-85 15:23") (PROG (REALCOLOR# COLORMAP ColorEntry) (SETQ REALCOLOR# (COLORNUMBERP COLOR#)) (SETQ COLORMAP (SCREENCOLORMAP NIL DISPLAY)) (SETQ ColorEntry (COLORMAPENTRY COLORMAP REALCOLOR#)) (PROG1 (\GENERIC.COLORLEVEL COLORMAP REALCOLOR# PRIMARYCOLOR NEWLEVEL) (* destructively modifies ColorEntry entry of COLORMAP  to have correct level of PRIMARYCOLOR) (\DORADOCOLOR.SETONECOLOR ColorEntry REALCOLOR#))))) (\DORADOCOLOR.SETONECOLOR (LAMBDA (RGBTRIPLE COLOR#) (* kbr: " 5-Jul-85 15:24") (PROG (DORADOFORMATCOLORCELL J) (OR \DORADOCOLOR.ATABLEIMAGE (SHOULDNT)) (SETQ DORADOFORMATCOLORCELL (\RGB.TO.DORADO.RGB RGBTRIPLE)) (SETQ J (LLSH COLOR# (IDIFFERENCE 11 DORADOCOLOR.BITSPERPIXEL))) (\PUTBASE \DORADOCOLOR.ATABLEIMAGE J (\GETBASE DORADOFORMATCOLORCELL 0)) (\PUTBASE \DORADOCOLOR.ATABLEIMAGE (ADD1 J) (\GETBASE DORADOFORMATCOLORCELL 1)) (\DORADOCOLOR.LOOKATA (EMADDRESS MCBLow))))) ) (FILESLOAD COLOR) (DECLARE: DONTEVAL@LOAD DOCOPY (\DORADOCOLOR.INIT) ) (PUTPROPS DORADOCOLOR COPYRIGHT ("Xerox Corporation" 1985 1900 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (5142 6333 (\RGB.TO.DORADO.RGB 5152 . 5872) (\DORADOCOLOR.LOOKATA 5874 . 6331)) (6334 13812 (\DORADOCOLOR.INIT 6344 . 7610) (\DORADOCOLOR.STARTCOLOR 7612 . 11482) (\DORADOCOLOR.STOPCOLOR 11484 . 12431) (\DORADOCOLOR.EVENTFN 12433 . 13153) (\DORADOCOLOR.SENDCOLORMAPENTRY 13155 . 13810)) ( 13813 15147 (\DORADOCOLOR.COLORLEVEL 13823 . 14500) (\DORADOCOLOR.SETONECOLOR 14502 . 15145))))) STOP \ No newline at end of file diff --git a/lispusers/DPUPFTPPATCH b/lispusers/DPUPFTPPATCH new file mode 100644 index 00000000..1f02c588 --- /dev/null +++ b/lispusers/DPUPFTPPATCH @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 8-Sep-87 11:48:32" {DSK}MATT>DPUPFTPPATCH.;6 5640 changes to%: (FNS \FTP.NEGOTIATED.CONNECTION.SOCKET) previous date%: "24-Jul-87 12:29:41" {DSK}MATT>DPUPFTPPATCH.;5) (* " Copyright (c) 1987 by Matt Heffron & XEROX Corporation. All rights reserved. ") (PRETTYCOMPRINT DPUPFTPPATCHCOMS) (RPAQQ DPUPFTPPATCHCOMS ((DECLARE%: DOCOPY FIRST (FILES DPUPFTP)) (FNS \FTP.NEGOTIATED.CONNECTION.SOCKET \FTP.OPEN.CONNECTION) (INITVARS (*FTP.NEGOTIATED.CONNECTION.HOSTS* NIL)) (GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*) (CONSTANTS (\PT.NEGOTIATED.CONNECTION 128) (\PUPSOCKET.NEGOTIATED.CONNECTION 63)) (DECLARE%: DONTCOPY (FILES (LOADCOMP) DPUPFTP)) (PROP (FILETYPE MAKEFILE-ENVIRONMENT) DPUPFTPPATCH))) (DECLARE%: DOCOPY FIRST (FILESLOAD DPUPFTP) ) (DEFINEQ (\FTP.NEGOTIATED.CONNECTION.SOCKET [LAMBDA (PORT) (DECLARE (GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*)) (* ; "Edited 8-Sep-87 11:46 by Matt Heffron") (if (ZEROP (CDR PORT)) then [CONS (CAR PORT) (COND ((EQ (CDR PORT) 0) \PUPSOCKET.FTP) (T (CDR PORT] (if (MEMB (CAR PORT) *FTP.NEGOTIATED.CONNECTION.HOSTS*) then (LET ((PUP (ALLOCATE.PUP)) RESULT.FTP.SOCKET NEGOTIATIONSOCKET) (CLEARPUP PUP) (SETQ NEGOTIATIONSOCKET (SETUPPUP PUP (CAR PORT) \PUPSOCKET.NEGOTIATED.CONNECTION \PT.NEGOTIATED.CONNECTION NIL NIL 'FREE)) (SENDPUP NEGOTIATIONSOCKET PUP) (SETQ PUP (GETPUP NEGOTIATIONSOCKET 10000)) (if PUP then (SETQ RESULT.FTP.SOCKET (fetch PUPSOURCESOCKET of PUP)) (RELEASE.PUP PUP) else (* ;; "Timed-out, just do it the old-fashoned way.") (SETQ RESULT.FTP.SOCKET \PUPSOCKET.FTP)) (CONS (CAR PORT) RESULT.FTP.SOCKET)) else (* ;; "This is not talking to a known FTP negotiated connection host. So use the standard \PUPSOCKET.FTP.") (CONS (CAR PORT) \PUPSOCKET.FTP)) else (* ;; "If they specified an explicit SOCKET in the PORT (i.e. in the HOST argument to \FTP.OPEN.CONNECTION), just return that PORT.") PORT]) (\FTP.OPEN.CONNECTION [LAMBDA (HOST ECHOSTREAM FAILURESTRING) (* ; "Edited 21-Jul-87 18:45 by Matt Heffron") (LET ((PORT (BESTPUPADDRESS HOST PROMPTWINDOW)) INSTREAM) (if [AND PORT (SETQ INSTREAM (OPENBSPSTREAM (\FTP.NEGOTIATED.CONNECTION.SOCKET PORT) NIL (FUNCTION \FTP.ERRORHANDLER) NIL NIL (FUNCTION \FTP.WHENCLOSED) (OR FAILURESTRING "Can't open FTP connection"] then (if (TYPENAMEP INSTREAM 'STREAM) then (SETQ INSTREAM (create FTPCONNECTION FTPIN _ INSTREAM FTPOUT _ (BSPOUTPUTSTREAM INSTREAM) FTPHOST _ [\CANONICAL.HOSTNAME (COND ((LITATOM HOST) HOST) (T (ETHERHOSTNAME PORT] FTPBUSY _ T)) (if (\FTP.SENDVERSION INSTREAM ECHOSTREAM) then (push \FTPCONNECTIONS INSTREAM) INSTREAM else (CLOSEBSPSTREAM (fetch FTPIN of INSTREAM))) else INSTREAM]) ) (RPAQ? *FTP.NEGOTIATED.CONNECTION.HOSTS* NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS *FTP.NEGOTIATED.CONNECTION.HOSTS*) ) (DECLARE%: EVAL@COMPILE (RPAQQ \PT.NEGOTIATED.CONNECTION 128) (RPAQQ \PUPSOCKET.NEGOTIATED.CONNECTION 63) (CONSTANTS (\PT.NEGOTIATED.CONNECTION 128) (\PUPSOCKET.NEGOTIATED.CONNECTION 63)) ) (DECLARE%: DONTCOPY (FILESLOAD (LOADCOMP) DPUPFTP) ) (PUTPROPS DPUPFTPPATCH FILETYPE :TCOMPL) (PUTPROPS DPUPFTPPATCH MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (PUTPROPS DPUPFTPPATCH COPYRIGHT ("Matt Heffron & XEROX Corporation" 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1140 4993 (\FTP.NEGOTIATED.CONNECTION.SOCKET 1150 . 3246) (\FTP.OPEN.CONNECTION 3248 . 4991))))) STOP \ No newline at end of file diff --git a/lispusers/DSPSCALE b/lispusers/DSPSCALE new file mode 100644 index 00000000..68ab32c6 --- /dev/null +++ b/lispusers/DSPSCALE @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "19-Jul-88 13:36:39" |{MCS:MCS:STANFORD}DSPSCALE.;10| 55021 changes to%: (FNS \TRANSLATE.SCALED CHARWIDTH! CHARWIDTHY! FONTPROP! STRINGWIDTH! INITSCALEDIMAGESTREAM \FILLPOLYGON.SCALED DSPSCALE.DASHING OPENIMAGESTREAM.SCALED \BACKCOLOR.SCALED \BITBLT.SCALED \BLTSHADE.SCALED \BOTTOMMARGIN.SCALED \BOUT.SCALED \CHARSET.SCALED \CHARWIDTH.SCALED \CHARWIDTHY.SCALED \CLIPPINGREGION.SCALED \CLOSEFN.SCALED \COLOR.SCALED \DEFAULTSTATE.SCALED \DRAWARC.SCALED \DRAWCIRCLE.SCALED \DRAWCURVE.SCALED \DRAWELLIPSE.SCALED \DRAWLINE.SCALED \DRAWPOINT.SCALED \DRAWPOLYGON.SCALED \FILLCIRCLE.SCALED \FONT.SCALED \LEFTMARGIN.SCALED \LINEFEED.SCALED \MOVETO.SCALED \NEWPAGE.SCALED \OPERATION.SCALED \POPSTATE.SCALED \PUSHSTATE.SCALED \RESET.SCALED \RIGHTMARGIN.SCALED \ROTATE.SCALED \SCALE.SCALED \SCALEDBITBLT.SCALED \SPACEFACTOR.SCALED \STRINGWIDTH.SCALED \TERPRI.SCALED \TOPMARGIN.SCALED \XPOSITION.SCALED \YPOSITION.SCALED \OUTCHAR.SCALED CENTERPRINTINREGION! CURSORPOSITION! BITBLT! BITMAPBIT! BLTSHADE! DSPBACKUP! DSPBOTTOMMARGIN! DSPCLIPPINGREGION! DRAWBETWEEN! DRAWARC! DRAWCIRCLE! DRAWCURVE! DRAWELLIPSE! DRAWLINE! DRAWPOINT! DRAWPOLYGON! DRAWTO! FILLCIRCLE! FILLPOLYGON! DSPLEFTMARGIN! DSPLINEFEED! GETPOSITION! MOVETO! MOVETOUPPERLEFT! DSPRIGHTMARGIN! DSPSCALE! RELDRAWTO! RELMOVETO! SCALEDBITBLT! STRINGREGION! DSPSPACEFACTOR! DSPTRANSLATE! DSPTOPMARGIN! DSPUNITS! DSPXOFFSET! DSPXPOSITION! DSPYOFFSET! DSPYPOSITION! DSPSCALE.BRUSH DSPSCALE.POINTS DSPSCALE.REGION DSPSCALE.NUMBER DSPSCALE.POSITION DSPSCALE.XPOSITION DSPSCALE.YPOSITION DSPSCALE.WIDTH DSPUNSCALE.REGION DSPUNSCALE.POSITION DSPUNSCALE.NUMBER DSPUNSCALE.CHARACTER ) (VARS DSPSCALECOMS) previous date%: "19-Jul-88 10:00:47" |{MCS:MCS:STANFORD}DSPSCALE.;6|) (* " Copyright (c) 1985, 1986, 1987, 1988 by Stanford University. All rights reserved. ") (PRETTYCOMPRINT DSPSCALECOMS) (RPAQQ DSPSCALECOMS ((LOCALVARS . T) (* * SCALED ImageStream ImageOp Functions) (FNS INITSCALEDIMAGESTREAM OPENIMAGESTREAM.SCALED) (FNS \BACKCOLOR.SCALED \BITBLT.SCALED \BLTSHADE.SCALED \BOTTOMMARGIN.SCALED \BOUT.SCALED \CHARSET.SCALED \CHARWIDTH.SCALED \CHARWIDTHY.SCALED \CLIPPINGREGION.SCALED \CLOSEFN.SCALED \COLOR.SCALED \DEFAULTSTATE.SCALED \DRAWARC.SCALED \DRAWCIRCLE.SCALED \DRAWCURVE.SCALED \DRAWELLIPSE.SCALED \DRAWLINE.SCALED \DRAWPOINT.SCALED \DRAWPOLYGON.SCALED \FILLCIRCLE.SCALED \FILLPOLYGON.SCALED \FONT.SCALED \LEFTMARGIN.SCALED \LINEFEED.SCALED \MOVETO.SCALED \NEWPAGE.SCALED \OPERATION.SCALED \POPSTATE.SCALED \PUSHSTATE.SCALED \RESET.SCALED \RIGHTMARGIN.SCALED \ROTATE.SCALED \SCALE.SCALED \SCALEDBITBLT.SCALED \SPACEFACTOR.SCALED \STRINGWIDTH.SCALED \TERPRI.SCALED \TOPMARGIN.SCALED \TRANSLATE.SCALED \XPOSITION.SCALED \YPOSITION.SCALED \OUTCHAR.SCALED) (* * Self Scaling DSP* Functions) (FNS CENTERPRINTINREGION! CHARWIDTH! CHARWIDTHY! CURSORPOSITION! BITBLT! BITMAPBIT! BLTSHADE! DSPBACKUP! DSPBOTTOMMARGIN! DSPCLIPPINGREGION! DRAWBETWEEN! DRAWARC! DRAWCIRCLE! DRAWCURVE! DRAWELLIPSE! DRAWLINE! DRAWPOINT! DRAWPOLYGON! DRAWTO! FILLCIRCLE! FILLPOLYGON! FONTPROP! DSPLEFTMARGIN! DSPLINEFEED! GETPOSITION! MOVETO! MOVETOUPPERLEFT! DSPRIGHTMARGIN! DSPSCALE! RELDRAWTO! RELMOVETO! SCALEDBITBLT! STRINGREGION! STRINGWIDTH! DSPSPACEFACTOR! DSPTRANSLATE! DSPTOPMARGIN! DSPUNITS! DSPXOFFSET! DSPXPOSITION! DSPYOFFSET! DSPYPOSITION!) (* * Low Level Scaling Functions) (FNS DSPSCALE.BRUSH DSPSCALE.DASHING DSPSCALE.POINTS DSPSCALE.REGION DSPSCALE.NUMBER DSPSCALE.POSITION DSPSCALE.XPOSITION DSPSCALE.YPOSITION DSPSCALE.WIDTH DSPUNSCALE.REGION DSPUNSCALE.POSITION DSPUNSCALE.NUMBER DSPUNSCALE.CHARACTER) (MACROS DSPUNSCALE.XPOSITION DSPUNSCALE.YPOSITION) (* * etc.) (DECLARE%: DONTCOPY (RECORDS SCALEDIMAGEDATA CONVERT)) [ADDVARS (IMAGESTREAMTYPES (SCALED (OPENSTREAM OPENIMAGESTREAM.SCALED] (INITVARS \SCALEDIMAGEOPS \NULLFDEV) (GLOBALVARS \SCALEDIMAGEOPS \NULLFDEV) [INITVARS (DSPSCALE.SCRATCHBRUSH '(ROUND 1 NIL)) (DSPSCALE.SCRATCHREGION (create REGION)) (DSPSCALE.SCRATCHPOSITION (create POSITION)) (DSPSCALE.SCRATCHLIST (to 10 collect)) (DSPSCALE.SCRATCHDASHING (to 10 collect)) (DSPSCALE.SCRATCHPOINTS (to 10 collect (create POSITION] (GLOBALVARS DSPSCALE.SCRATCHBRUSH DSPSCALE.SCRATCHREGION DSPSCALE.SCRATCHPOSITION DSPSCALE.SCRATCHLIST DSPSCALE.SCRATCHDASHING DSPSCALE.SCRATCHPOINTS) (P (MOVD? 'DSPUNITS! 'DSPUNITS) (INITSCALEDIMAGESTREAM)))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (LOCALVARS . T) ) (* * SCALED ImageStream ImageOp Functions) (DEFINEQ (INITSCALEDIMAGESTREAM [LAMBDA NIL (* ; "Edited 19-Jul-88 10:59 by cdl") (DECLARE (GLOBALVARS \DISPLAYIMAGEOPS)) [if (NULL \NULLFDEV) then (SETQ \NULLFDEV (create FDEV CLOSEFILE _ (FUNCTION NILL] (SETQ \SCALEDIMAGEOPS (create IMAGEOPS IMAGETYPE _ 'SCALED IMCLOSEFN _ (FUNCTION \CLOSEFN.SCALED) IMXPOSITION _ (FUNCTION \XPOSITION.SCALED) IMYPOSITION _ (FUNCTION \YPOSITION.SCALED) IMFONT _ (FUNCTION \FONT.SCALED) IMLEFTMARGIN _ (FUNCTION \LEFTMARGIN.SCALED) IMRIGHTMARGIN _ (FUNCTION \RIGHTMARGIN.SCALED) IMLINEFEED _ (FUNCTION \LINEFEED.SCALED) IMDRAWLINE _ (FUNCTION \DRAWLINE.SCALED) IMDRAWCURVE _ (FUNCTION \DRAWCURVE.SCALED) IMDRAWCIRCLE _ (FUNCTION \DRAWCIRCLE.SCALED) IMDRAWELLIPSE _ (FUNCTION \DRAWELLIPSE.SCALED) IMFILLCIRCLE _ (FUNCTION \FILLCIRCLE.SCALED) IMBLTSHADE _ (FUNCTION \BLTSHADE.SCALED) IMBITBLT _ (FUNCTION \BITBLT.SCALED) IMNEWPAGE _ (FUNCTION \NEWPAGE.SCALED) IMMOVETO _ (FUNCTION \MOVETO.SCALED) IMSCALE _ (FUNCTION \SCALE.SCALED) IMTERPRI _ (FUNCTION \TERPRI.SCALED) IMTOPMARGIN _ (FUNCTION \TOPMARGIN.SCALED) IMBOTTOMMARGIN _ (FUNCTION \BOTTOMMARGIN.SCALED) IMSPACEFACTOR _ (FUNCTION \SPACEFACTOR.SCALED) IMFONTCREATE _ 'DISPLAY IMOPERATION _ (FUNCTION \OPERATION.SCALED) IMCOLOR _ (FUNCTION \COLOR.SCALED) IMSTRINGWIDTH _ (FUNCTION \STRINGWIDTH.SCALED) IMCHARWIDTH _ (FUNCTION \CHARWIDTH.SCALED) IMCHARWIDTHY _ (FUNCTION \CHARWIDTHY.SCALED) IMBACKCOLOR _ (FUNCTION \BACKCOLOR.SCALED) IMCLIPPINGREGION _ (FUNCTION \CLIPPINGREGION.SCALED) IMRESET _ (FUNCTION \RESET.SCALED) IMDRAWPOLYGON _ (FUNCTION \DRAWPOLYGON.SCALED) IMFILLPOLYGON _ (FUNCTION \FILLPOLYGON.SCALED) IMSCALEDBITBLT _ (FUNCTION \SCALEDBITBLT.SCALED) IMCHARSET _ (FUNCTION \CHARSET.SCALED) IMROTATE _ (FUNCTION \ROTATE.SCALED) IMDRAWARC _ (FUNCTION \DRAWARC.SCALED) IMTRANSLATE _ (FUNCTION \TRANSLATE.SCALED) IMPUSHSTATE _ (FUNCTION \PUSHSTATE.SCALED) IMPOPSTATE _ (FUNCTION \POPSTATE.SCALED) IMDEFAULTSTATE _ (FUNCTION \DEFAULTSTATE.SCALED) IMDRAWPOINT _ (FUNCTION \DRAWPOINT.SCALED]) (OPENIMAGESTREAM.SCALED [LAMBDA (IMAGESTREAM OPTIONS) (* cdl "26-Jan-87 09:23") (* DECLARATIONS%: (RECORD PAIR  (KEY VALUE))) (LET (STREAM SCALE) [SETQ OPTIONS (for PAIR on OPTIONS by (CDDR PAIR) when (with PAIR PAIR (SELECTQ KEY (SCALE (SETQ SCALE VALUE) NIL) T)) join (with PAIR PAIR (LIST KEY VALUE] (with STREAM (SETQ STREAM (create STREAM IMAGEDATA _ (create SCALEDIMAGEDATA IMAGESTREAM _ IMAGESTREAM) IMAGEOPS _ (create IMAGEOPS IMFONTCREATE _ (with IMAGEOPS (fetch (STREAM IMAGEOPS) of IMAGESTREAM) IMFONTCREATE) reusing \SCALEDIMAGEOPS) OUTCHARFN _ (FUNCTION \OUTCHAR.SCALED) ACCESS _ 'OUTPUT DEVICE _ \NULLFDEV)) (SETQ STRMBOUTFN (FUNCTION \BOUT.SCALED))) (if SCALE then (DSPSCALE! SCALE IMAGESTREAM)) STREAM]) ) (DEFINEQ (\BACKCOLOR.SCALED [LAMBDA (STREAM COLOR) (* cdl "26-Jan-87 09:04") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMBACKCOLOR IMAGESTREAM IMAGESTREAM COLOR]) (\BITBLT.SCALED [LAMBDA (SOURCEBITMAP SOURCELEFT SOURCEBOTTOM STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION) (* cdl "26-Jan-87 10:37") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (BITBLT SOURCEBITMAP SOURCELEFT SOURCEBOTTOM IMAGESTREAM (DSPSCALE.XPOSITION DESTINATIONLEFT IMAGESTREAM) (DSPSCALE.YPOSITION DESTINATIONBOTTOM IMAGESTREAM) WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE (DSPSCALE.REGION CLIPPINGREGION IMAGESTREAM]) (\BLTSHADE.SCALED [LAMBDA (TEXTURE STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* cdl "26-Jan-87 10:05") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMBLTSHADE IMAGESTREAM TEXTURE IMAGESTREAM (DSPSCALE.XPOSITION DESTINATIONLEFT IMAGESTREAM) (DSPSCALE.YPOSITION DESTINATIONBOTTOM IMAGESTREAM) (DSPSCALE.NUMBER WIDTH IMAGESTREAM) (DSPSCALE.NUMBER HEIGHT IMAGESTREAM) OPERATION (DSPSCALE.REGION CLIPPINGREGION IMAGESTREAM]) (\BOTTOMMARGIN.SCALED [LAMBDA (STREAM YPOSITION) (* cdl "26-Jan-87 08:55") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.YPOSITION (IMAGEOP 'IMBOTTOMMARGIN IMAGESTREAM IMAGESTREAM (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION IMAGESTREAM))) IMAGESTREAM]) (\BOUT.SCALED [LAMBDA (STREAM BYTE) (* cdl "26-Jan-87 08:49") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (BOUT IMAGESTREAM BYTE]) (\CHARSET.SCALED [LAMBDA (STREAM CHARACTERSET) (* cdl "26-Jan-87 08:49") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMCHARSET IMAGESTREAM IMAGESTREAM CHARACTERSET]) (\CHARWIDTH.SCALED [LAMBDA (STREAM CHARCODE) (* cdl "26-Jan-87 09:50") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.CHARACTER (IMAGEOP 'IMCHARWIDTH IMAGESTREAM IMAGESTREAM CHARCODE) (DSPFONT NIL IMAGESTREAM) IMAGESTREAM]) (\CHARWIDTHY.SCALED [LAMBDA (STREAM CHARCODE) (* cdl "26-Jan-87 10:17") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.CHARACTER (IMAGEOP 'IMCHARWIDTHY IMAGESTREAM IMAGESTREAM CHARCODE) (DSPFONT NIL IMAGESTREAM) IMAGESTREAM]) (\CLIPPINGREGION.SCALED [LAMBDA (STREAM REGION) (* cdl "26-Jan-87 09:48") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.REGION (IMAGEOP 'IMCLIPPINGREGION IMAGESTREAM IMAGESTREAM (if REGION then (DSPSCALE.REGION REGION IMAGESTREAM))) IMAGESTREAM]) (\CLOSEFN.SCALED [LAMBDA (STREAM) (* cdl "26-Jan-87 08:49") (with STREAM STREAM (PROG1 (CLOSEF (with SCALEDIMAGEDATA IMAGEDATA IMAGESTREAM)) (SETQ IMAGEDATA NIL]) (\COLOR.SCALED [LAMBDA (STREAM COLOR) (* cdl "26-Jan-87 08:57") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMCOLOR IMAGESTREAM IMAGESTREAM COLOR]) (\DEFAULTSTATE.SCALED [LAMBDA (STREAM) (* ; "Edited 19-Jul-88 08:34 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDEFAULTSTATE IMAGESTREAM IMAGESTREAM]) (\DRAWARC.SCALED [LAMBDA (STREAM CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING) (* ; "Edited 14-Sep-87 14:30 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWARC IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION CENTERX IMAGESTREAM) (DSPSCALE.YPOSITION CENTERY IMAGESTREAM) (DSPSCALE.NUMBER RADIUS IMAGESTREAM) STARTANGLE NDEGREES (DSPSCALE.BRUSH BRUSH IMAGESTREAM) (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\DRAWCIRCLE.SCALED [LAMBDA (STREAM CENTERX CENTERY RADIUS BRUSH DASHING) (* cdl "26-Jan-87 09:03") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWCIRCLE IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION CENTERX IMAGESTREAM ) (DSPSCALE.YPOSITION CENTERY IMAGESTREAM) (DSPSCALE.NUMBER RADIUS IMAGESTREAM) (DSPSCALE.BRUSH BRUSH IMAGESTREAM) (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\DRAWCURVE.SCALED [LAMBDA (STREAM KNOTS CLOSED BRUSH DASHING) (* cdl "26-Jan-87 09:36") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWCURVE IMAGESTREAM IMAGESTREAM (DSPSCALE.POINTS KNOTS IMAGESTREAM) CLOSED (DSPSCALE.BRUSH BRUSH IMAGESTREAM) (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\DRAWELLIPSE.SCALED [LAMBDA (STREAM CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING) (* cdl "26-Jan-87 09:26") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWELLIPSE IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION CENTERX IMAGESTREAM) (DSPSCALE.YPOSITION CENTERY IMAGESTREAM) (DSPSCALE.NUMBER SEMIMINORRADIUS IMAGESTREAM) (DSPSCALE.NUMBER SEMIMAJORRADIUS IMAGESTREAM) ORIENTATION (DSPSCALE.BRUSH BRUSH IMAGESTREAM) (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\DRAWLINE.SCALED [LAMBDA (STREAM X1 Y1 X2 Y2 WIDTH OPERATION COLOR DASHING) (* cdl "26-Jan-87 09:41") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWLINE IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION X1 IMAGESTREAM) (DSPSCALE.YPOSITION Y1 IMAGESTREAM) (DSPSCALE.XPOSITION X2 IMAGESTREAM) (DSPSCALE.YPOSITION Y2 IMAGESTREAM) (DSPSCALE.WIDTH WIDTH IMAGESTREAM) OPERATION COLOR (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\DRAWPOINT.SCALED [LAMBDA (STREAM X Y BRUSH OPERATION) (* ; "Edited 14-Sep-87 14:30 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWPOINT IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION X IMAGESTREAM) (DSPSCALE.YPOSITION Y IMAGESTREAM) (DSPSCALE.BRUSH BRUSH IMAGESTREAM) OPERATION]) (\DRAWPOLYGON.SCALED [LAMBDA (STREAM KNOTS CLOSED BRUSH DASHING) (* cdl "26-Jan-87 09:37") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMDRAWPOLYGON IMAGESTREAM IMAGESTREAM (DSPSCALE.POINTS KNOTS IMAGESTREAM) CLOSED (DSPSCALE.BRUSH BRUSH IMAGESTREAM) (DSPSCALE.DASHING DASHING IMAGESTREAM]) (\FILLCIRCLE.SCALED [LAMBDA (STREAM CENTERX CENTERY RADIUS TEXTURE) (* cdl "26-Jan-87 08:59") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMFILLCIRCLE IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION CENTERX IMAGESTREAM ) (DSPSCALE.YPOSITION CENTERY IMAGESTREAM) (DSPSCALE.NUMBER RADIUS IMAGESTREAM) TEXTURE]) (\FILLPOLYGON.SCALED [LAMBDA (STREAM KNOTS TEXTURE OPERATION WINDNUMBER) (* ; "Edited 19-Jul-88 10:30 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMFILLPOLYGON IMAGESTREAM IMAGESTREAM (DSPSCALE.POINTS KNOTS IMAGESTREAM) TEXTURE OPERATION WINDNUMBER]) (\FONT.SCALED [LAMBDA (STREAM FONT) (* cdl "26-Jan-87 09:13") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMFONT IMAGESTREAM IMAGESTREAM FONT]) (\LEFTMARGIN.SCALED [LAMBDA (STREAM XPOSITION) (* cdl "26-Jan-87 08:50") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.XPOSITION (IMAGEOP 'IMLEFTMARGIN IMAGESTREAM IMAGESTREAM (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION IMAGESTREAM))) IMAGESTREAM]) (\LINEFEED.SCALED [LAMBDA (STREAM DELTAY) (* cdl "26-Jan-87 09:28") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.NUMBER (IMAGEOP 'IMLINEFEED IMAGESTREAM IMAGESTREAM (if DELTAY then (DSPSCALE.NUMBER DELTAY IMAGESTREAM))) IMAGESTREAM]) (\MOVETO.SCALED [LAMBDA (STREAM X Y) (* cdl "26-Jan-87 09:30") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMMOVETO IMAGESTREAM IMAGESTREAM (DSPSCALE.XPOSITION X IMAGESTREAM) (DSPSCALE.YPOSITION Y IMAGESTREAM]) (\NEWPAGE.SCALED [LAMBDA (STREAM) (* cdl "26-Jan-87 09:10") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMNEWPAGE IMAGESTREAM IMAGESTREAM]) (\OPERATION.SCALED [LAMBDA (STREAM OPERATION) (* cdl "26-Jan-87 08:50") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMOPERATION IMAGESTREAM IMAGESTREAM OPERATION]) (\POPSTATE.SCALED [LAMBDA (STREAM) (* ; "Edited 19-Jul-88 08:32 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMPOPSTATE IMAGESTREAM IMAGESTREAM]) (\PUSHSTATE.SCALED [LAMBDA (STREAM) (* ; "Edited 19-Jul-88 08:31 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMPUSHSTATE IMAGESTREAM IMAGESTREAM]) (\RESET.SCALED [LAMBDA (STREAM) (* cdl "26-Jan-87 09:09") (with STREAM STREAM (SETQ CHARPOSITION 0) (with SCALEDIMAGEDATA IMAGEDATA (IMAGEOP 'IMRESET IMAGESTREAM IMAGESTREAM]) (\RIGHTMARGIN.SCALED [LAMBDA (STREAM XPOSITION) (* cdl "26-Jan-87 08:50") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.XPOSITION (IMAGEOP 'IMRIGHTMARGIN IMAGESTREAM IMAGESTREAM (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION IMAGESTREAM))) IMAGESTREAM]) (\ROTATE.SCALED [LAMBDA (STREAM ROTATION) (* ; "Edited 14-Sep-87 14:22 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (IMAGEOP 'IMROTATE IMAGESTREAM IMAGESTREAM ROTATION]) (\SCALE.SCALED [LAMBDA (STREAM SCALE) (* cdl "26-Jan-87 09:34") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (if SCALE then (DSPSCALE! SCALE IMAGESTREAM) else (IMAGEOP 'IMSCALE IMAGESTREAM IMAGESTREAM]) (\SCALEDBITBLT.SCALED [LAMBDA (SOURCEBITMAP SOURCELEFT SOURCEBOTTOM STREAM DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION SCALE) (* cdl "26-Jan-87 10:38") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (SCALEDBITBLT SOURCEBITMAP SOURCELEFT SOURCEBOTTOM IMAGESTREAM (DSPSCALE.XPOSITION DESTINATIONLEFT IMAGESTREAM) (DSPSCALE.YPOSITION DESTINATIONBOTTOM IMAGESTREAM) WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE (DSPSCALE.REGION CLIPPINGREGION IMAGESTREAM) SCALE]) (\SPACEFACTOR.SCALED [LAMBDA (STREAM FACTOR) (* cdl "26-Jan-87 09:46") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.NUMBER (IMAGEOP 'IMSPACEFACTOR IMAGESTREAM IMAGESTREAM (if FACTOR then (DSPSCALE.NUMBER FACTOR IMAGESTREAM))) IMAGESTREAM]) (\STRINGWIDTH.SCALED [LAMBDA (STREAM STRING RDTBL) (* cdl "26-Jan-87 09:45") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.CHARACTER (IMAGEOP 'IMSTRINGWIDTH IMAGESTREAM IMAGESTREAM STRING RDTBL) (DSPFONT NIL IMAGESTREAM) IMAGESTREAM]) (\TERPRI.SCALED [LAMBDA (STREAM) (* cdl "26-Jan-87 09:06") (with STREAM STREAM (SETQ CHARPOSITION 0) (with SCALEDIMAGEDATA IMAGEDATA (IMAGEOP 'IMTERPRI IMAGESTREAM IMAGESTREAM]) (\TOPMARGIN.SCALED [LAMBDA (STREAM YPOSITION) (* cdl "26-Jan-87 08:54") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.YPOSITION (IMAGEOP 'IMTOPMARGIN IMAGESTREAM IMAGESTREAM (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION IMAGESTREAM))) IMAGESTREAM]) (\TRANSLATE.SCALED [LAMBDA (STREAM Tx Ty) (* ; "Edited 19-Jul-88 13:32 by cdl") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (STREAMPROP IMAGESTREAM 'TRANSLATE (CREATEPOSITION (DSPSCALE.NUMBER Tx STREAM) (DSPSCALE.NUMBER Ty STREAM]) (\XPOSITION.SCALED [LAMBDA (STREAM XPOSITION) (* cdl "26-Jan-87 08:51") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.XPOSITION (IMAGEOP 'IMXPOSITION IMAGESTREAM IMAGESTREAM (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION IMAGESTREAM))) IMAGESTREAM]) (\YPOSITION.SCALED [LAMBDA (STREAM YPOSITION) (* cdl "26-Jan-87 08:51") (with SCALEDIMAGEDATA (with STREAM STREAM IMAGEDATA) (DSPUNSCALE.YPOSITION (IMAGEOP 'IMYPOSITION IMAGESTREAM IMAGESTREAM (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION IMAGESTREAM))) IMAGESTREAM]) (\OUTCHAR.SCALED [LAMBDA (STREAM CHARCODE) (* cdl "26-Jan-87 10:20") [if (EQ CHARCODE (CHARCODE EOL)) then (with STREAM STREAM (SETQ CHARPOSITION 0)) else (freplace CHARPOSITION of STREAM with (\LOLOC (\ADDBASE (ffetch CHARPOSITION of STREAM) 1] (BOUT STREAM CHARCODE]) ) (* * Self Scaling DSP* Functions) (DEFINEQ (CENTERPRINTINREGION! [LAMBDA (EXP REGION STREAM) (* cdl "29-Jul-85 12:09") (CENTERPRINTINREGION EXP (if REGION then (DSPSCALE.REGION REGION STREAM)) STREAM]) (CHARWIDTH! [LAMBDA (CHARCODE FONT STREAM) (* ; "Edited 19-Jul-88 13:16 by cdl") (DSPUNSCALE.CHARACTER (CHARWIDTH CHARCODE FONT) FONT (OR STREAM (IMAGESTREAMP FONT]) (CHARWIDTHY! [LAMBDA (CHARCODE FONT STREAM) (* ; "Edited 19-Jul-88 13:16 by cdl") (DSPUNSCALE.CHARACTER (CHARWIDTHY CHARCODE FONT) FONT (OR STREAM (IMAGESTREAMP FONT]) (CURSORPOSITION! [LAMBDA (NEWPOSITION STREAM OLDPOSITION) (* cdl "30-Oct-85 08:15") (DSPUNSCALE.POSITION (CURSORPOSITION (if NEWPOSITION then (DSPSCALE.POSITION NEWPOSITION STREAM OLDPOSITION)) STREAM OLDPOSITION) STREAM OLDPOSITION]) (BITBLT! [LAMBDA (SOURCE SOURCELEFT SOURCEBOTTOM DESTINATION DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION) (* cdl "29-Jul-85 12:09") (BITBLT SOURCE SOURCELEFT SOURCEBOTTOM DESTINATION (DSPSCALE.XPOSITION DESTINATIONLEFT DESTINATION) (DSPSCALE.YPOSITION DESTINATIONBOTTOM DESTINATION) WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE (DSPSCALE.REGION CLIPPINGREGION DESTINATION]) (BITMAPBIT! [LAMBDA (STREAM X Y NEWVALUE) (* cdl "29-Jul-85 12:01") (BITMAPBIT STREAM (DSPSCALE.XPOSITION X STREAM) (DSPSCALE.YPOSITION Y STREAM) NEWVALUE]) (BLTSHADE! [LAMBDA (TEXTURE DESTINATION DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* cdl "29-Jul-85 12:02") (BLTSHADE TEXTURE DESTINATION (DSPSCALE.XPOSITION DESTINATIONLEFT DESTINATION) (DSPSCALE.YPOSITION DESTINATIONBOTTOM DESTINATION) (DSPSCALE.NUMBER WIDTH DESTINATION) (DSPSCALE.NUMBER HEIGHT DESTINATION) OPERATION (DSPSCALE.REGION CLIPPINGREGION DESTINATION]) (DSPBACKUP! [LAMBDA (WIDTH DISPLAYSTREAM) (* cdl "29-Jul-85 12:02") (DSPBACKUP (if WIDTH then (DSPSCALE.XPOSITION WIDTH DISPLAYSTREAM)) DISPLAYSTREAM]) (DSPBOTTOMMARGIN! [LAMBDA (YPOSITION STREAM) (* cdl "29-Jul-85 12:02") (DSPUNSCALE.YPOSITION (DSPBOTTOMMARGIN (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION STREAM)) STREAM) STREAM]) (DSPCLIPPINGREGION! [LAMBDA (REGION STREAM) (* cdl "29-Jul-85 08:41") (DSPUNSCALE.REGION (DSPCLIPPINGREGION (if REGION then (DSPSCALE.REGION REGION STREAM)) STREAM) STREAM]) (DRAWBETWEEN! [LAMBDA (PT1 PT2 WIDTH OPERATION STREAM COLOR DASHING) (* cdl "29-Oct-85 15:30") (DRAWBETWEEN (DSPSCALE.POSITION PT1 STREAM (CAR DSPSCALE.SCRATCHPOINTS)) (DSPSCALE.POSITION PT2 STREAM (CADR DSPSCALE.SCRATCHPOINTS)) (DSPSCALE.WIDTH WIDTH STREAM) OPERATION STREAM COLOR (DSPSCALE.DASHING DASHING STREAM]) (DRAWARC! [LAMBDA (CENTERX CENTERY RADIUS STARTANGLE NDEGREES BRUSH DASHING STREAM) (* ; "Edited 14-Sep-87 14:34 by cdl") (DRAWARC (DSPSCALE.XPOSITION CENTERX STREAM) (DSPSCALE.YPOSITION CENTERY STREAM) (DSPSCALE.NUMBER RADIUS STREAM) STARTANGLE NDEGREES (DSPSCALE.BRUSH BRUSH STREAM) (DSPSCALE.DASHING DASHING STREAM) STREAM]) (DRAWCIRCLE! [LAMBDA (CENTERX CENTERY RADIUS BRUSH DASHING STREAM) (* cdl "29-Jul-85 12:03") (DRAWCIRCLE (DSPSCALE.XPOSITION CENTERX STREAM) (DSPSCALE.YPOSITION CENTERY STREAM) (DSPSCALE.NUMBER RADIUS STREAM) (DSPSCALE.BRUSH BRUSH STREAM) (DSPSCALE.DASHING DASHING STREAM) STREAM]) (DRAWCURVE! [LAMBDA (KNOTS CLOSED BRUSH DASHING STREAM) (* cdl "29-Jul-85 10:04") (DRAWCURVE (DSPSCALE.POINTS KNOTS STREAM) CLOSED (DSPSCALE.BRUSH BRUSH STREAM) (DSPSCALE.DASHING DASHING STREAM) STREAM]) (DRAWELLIPSE! [LAMBDA (CENTERX CENTERY SEMIMINORRADIUS SEMIMAJORRADIUS ORIENTATION BRUSH DASHING STREAM) (* cdl "29-Jul-85 12:03") (DRAWELLIPSE (DSPSCALE.XPOSITION CENTERX STREAM) (DSPSCALE.YPOSITION CENTERY STREAM) (DSPSCALE.NUMBER SEMIMINORRADIUS STREAM) (DSPSCALE.NUMBER SEMIMAJORRADIUS STREAM) ORIENTATION (DSPSCALE.BRUSH BRUSH STREAM) (DSPSCALE.DASHING DASHING STREAM) STREAM]) (DRAWLINE! [LAMBDA (X1 Y1 X2 Y2 WIDTH OPERATION STREAM COLOR DASHING) (* cdl "29-Oct-85 15:28") (DRAWLINE (DSPSCALE.XPOSITION X1 STREAM) (DSPSCALE.YPOSITION Y1 STREAM) (DSPSCALE.XPOSITION X2 STREAM) (DSPSCALE.YPOSITION Y2 STREAM) (DSPSCALE.WIDTH WIDTH STREAM) OPERATION STREAM COLOR (DSPSCALE.DASHING DASHING STREAM]) (DRAWPOINT! [LAMBDA (X Y BRUSH STREAM OPERATION) (* ; "Edited 14-Sep-87 14:36 by cdl") (DRAWPOINT (DSPSCALE.XPOSITION X STREAM) (DSPSCALE.YPOSITION Y STREAM) (DSPSCALE.BRUSH BRUSH STREAM) STREAM OPERATION]) (DRAWPOLYGON! [LAMBDA (POINTS CLOSED BRUSH DASHING STREAM) (* cdl "29-Jul-85 10:05") (DRAWPOLYGON (DSPSCALE.POINTS POINTS STREAM) CLOSED (DSPSCALE.BRUSH BRUSH STREAM) (DSPSCALE.DASHING DASHING STREAM) STREAM]) (DRAWTO! [LAMBDA (X Y WIDTH OPERATION STREAM COLOR DASHING) (* cdl "29-Oct-85 15:31") (DRAWTO (DSPSCALE.XPOSITION X STREAM) (DSPSCALE.YPOSITION Y STREAM) (DSPSCALE.WIDTH WIDTH STREAM) OPERATION STREAM COLOR (DSPSCALE.DASHING DASHING STREAM]) (FILLCIRCLE! [LAMBDA (CENTERX CENTERY RADIUS TEXTURE STREAM) (* cdl " 7-Feb-86 15:02") (FILLCIRCLE (DSPSCALE.XPOSITION CENTERX STREAM) (DSPSCALE.YPOSITION CENTERY STREAM) (DSPSCALE.NUMBER RADIUS STREAM) TEXTURE STREAM]) (FILLPOLYGON! [LAMBDA (KNOTS TEXTURE STREAM) (* cdl "30-Oct-85 07:44") (FILLPOLYGON (DSPSCALE.POINTS KNOTS STREAM) TEXTURE STREAM]) (FONTPROP! [LAMBDA (FONT PROP STREAM) (* ; "Edited 19-Jul-88 13:18 by cdl") (SELECTQ PROP ((ASCENT DESCENT HEIGHT) (DSPUNSCALE.CHARACTER (FONTPROP FONT PROP) FONT (OR STREAM (IMAGESTREAMP FONT)))) (FONTPROP FONT PROP]) (DSPLEFTMARGIN! [LAMBDA (XPOSITION STREAM) (* cdl "29-Jul-85 12:05") (DSPUNSCALE.XPOSITION (DSPLEFTMARGIN (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION STREAM)) STREAM) STREAM]) (DSPLINEFEED! [LAMBDA (DELTAY STREAM) (* cdl "29-Jul-85 11:11") (DSPUNSCALE.NUMBER (DSPLINEFEED (if DELTAY then (DSPSCALE.NUMBER DELTAY STREAM)) STREAM) STREAM]) (GETPOSITION! [LAMBDA (STREAM CURSOR) (* cdl "30-Oct-85 08:03") (DSPUNSCALE.POSITION (GETPOSITION STREAM CURSOR) STREAM]) (MOVETO! [LAMBDA (X Y STREAM) (* cdl "29-Jul-85 12:06") (MOVETO (DSPSCALE.XPOSITION X STREAM) (DSPSCALE.YPOSITION Y STREAM) STREAM]) (MOVETOUPPERLEFT! [LAMBDA (WINDOW REGION) (* cdl "29-Jul-85 12:10") (MOVETOUPPERLEFT WINDOW (if REGION then (DSPSCALE.REGION REGION WINDOW]) (DSPRIGHTMARGIN! [LAMBDA (XPOSITION STREAM) (* cdl "16-Oct-85 16:11") (DSPUNSCALE.XPOSITION (DSPRIGHTMARGIN (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION STREAM)) STREAM) STREAM]) (DSPSCALE! [LAMBDA (SCALE STREAM) (* cdl "23-Apr-86 09:40") (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) (PROG1 (OR (STREAMPROP STREAM 'SCALE) (DSPSCALE NIL STREAM)) [if SCALE then (STREAMPROP STREAM 'SCALE SCALE) (STREAMPROP STREAM 'SCALED T) (LET [(RATIO (STREAMPROP STREAM 'RATIO] [if (NULL RATIO) then (STREAMPROP STREAM 'RATIO (SETQ RATIO (create CONVERT SOURCE _ 1] (with CONVERT RATIO (SETQ DESTINATION (TIMES SCALE (DSPSCALE NIL STREAM])]) (RELDRAWTO! [LAMBDA (DX DY WIDTH OPERATION STREAM COLOR DASHING) (* cdl "29-Oct-85 15:31") (RELDRAWTO (DSPSCALE.NUMBER DX STREAM) (DSPSCALE.NUMBER DY STREAM) (DSPSCALE.WIDTH WIDTH STREAM) OPERATION STREAM COLOR (DSPSCALE.DASHING DASHING STREAM]) (RELMOVETO! [LAMBDA (DX DY STREAM) (* cdl "30-Oct-85 07:43") (RELMOVETO (DSPSCALE.NUMBER DX STREAM) (DSPSCALE.NUMBER DY STREAM) STREAM]) (SCALEDBITBLT! [LAMBDA (SOURCE SOURCELEFT SOURCEBOTTOM DESTINATION DESTINATIONLEFT DESTINATIONBOTTOM WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE CLIPPINGREGION SCALE) (* cdl "29-Jul-85 12:13") (SCALEDBITBLT SOURCELEFT SOURCEBOTTOM DESTINATION (DSPSCALE.XPOSITION DESTINATIONLEFT DESTINATION) (DSPSCALE.YPOSITION DESTINATIONBOTTOM DESTINATION) WIDTH HEIGHT SOURCETYPE OPERATION TEXTURE (DSPSCALE.REGION CLIPPINGREGION DESTINATION) SCALE]) (STRINGREGION! [LAMBDA (STR STREAM PRIN2FLG RDTBL) (* cdl " 2-May-86 14:05") (LET ((REGION (STRINGREGION STR STREAM PRIN2FLG RDTBL))) (DSPUNSCALE.REGION REGION STREAM REGION]) (STRINGWIDTH! [LAMBDA (STR FONT FLG RDTBL STREAM) (* ; "Edited 19-Jul-88 13:18 by cdl") (DSPUNSCALE.CHARACTER (STRINGWIDTH STR FONT FLG RDTBL) FONT (OR STREAM (IMAGESTREAMP FONT]) (DSPSPACEFACTOR! [LAMBDA (FACTOR STREAM) (* cdl "29-Jul-85 11:12") (DSPUNSCALE.NUMBER (DSPSPACEFACTOR (if FACTOR then (DSPSCALE.NUMBER FACTOR STREAM)) STREAM) STREAM]) (DSPTRANSLATE! [LAMBDA (Tx.OR.POSITION Ty.OR.STREAM STREAM.OR.NIL) (* ; "Edited 19-Jul-88 09:03 by cdl") (if (POSITIONP Tx.OR.POSITION) then (* Koto Compatibility) (STREAMPROP (GETSTREAM Ty.OR.STREAM) 'TRANSLATE Tx.OR.POSITION) else (STREAMPROP (GETSTREAM STREAM.OR.NIL) 'TRANSLATE (CREATEPOSITION Tx.OR.POSITION Ty.OR.STREAM]) (DSPTOPMARGIN! [LAMBDA (YPOSITION STREAM) (* cdl "29-Jul-85 12:00") (DSPUNSCALE.YPOSITION (DSPTOPMARGIN (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION STREAM)) STREAM) STREAM]) (DSPUNITS! [LAMBDA (UNITS STREAM) (* cdl "23-Apr-86 09:40") (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) (PROG1 (STREAMPROP STREAM 'UNITS) [if UNITS then (STREAMPROP STREAM 'UNITS UNITS) (STREAMPROP STREAM 'SCALED T) (LET [(RATIO (STREAMPROP STREAM 'RATIO] [if (NULL RATIO) then (STREAMPROP STREAM 'RATIO (SETQ RATIO (create CONVERT DESTINATION _ 1] (with CONVERT RATIO (SETQ SOURCE UNITS])]) (DSPXOFFSET! [LAMBDA (XOFFSET DISPLAYSTREAM) (* cdl "29-Jul-85 11:12") (DSPUNSCALE.NUMBER (DSPXOFFSET (if XOFFSET then (DSPSCALE.NUMBER XOFFSET DISPLAYSTREAM)) DISPLAYSTREAM) DISPLAYSTREAM]) (DSPXPOSITION! [LAMBDA (XPOSITION STREAM) (* cdl "29-Jul-85 12:00") (DSPUNSCALE.XPOSITION (DSPXPOSITION (if XPOSITION then (DSPSCALE.XPOSITION XPOSITION STREAM)) STREAM) STREAM]) (DSPYOFFSET! [LAMBDA (YOFFSET DISPLAYSTREAM) (* cdl "29-Jul-85 11:59") (DSPUNSCALE.NUMBER (DSPYOFFSET (if YOFFSET then (DSPSCALE.NUMBER YOFFSET DISPLAYSTREAM)) DISPLAYSTREAM) DISPLAYSTREAM]) (DSPYPOSITION! [LAMBDA (YPOSITION STREAM) (* cdl "29-Jul-85 11:59") (DSPUNSCALE.YPOSITION (DSPYPOSITION (if YPOSITION then (DSPSCALE.YPOSITION YPOSITION STREAM)) STREAM) STREAM]) ) (* * Low Level Scaling Functions) (DEFINEQ (DSPSCALE.BRUSH [LAMBDA (BRUSH STREAM) (* cdl "29-Oct-85 15:29") (if (NULL BRUSH) then (create BRUSH BRUSHSHAPE _ 'ROUND BRUSHSIZE _ (DSPSCALE.WIDTH 1 STREAM) smashing DSPSCALE.SCRATCHBRUSH) elseif (LISTP BRUSH) then (with BRUSH BRUSH (create BRUSH BRUSHCOLOR _ BRUSHCOLOR BRUSHSHAPE _ BRUSHSHAPE BRUSHSIZE _ (DSPSCALE.WIDTH BRUSHSIZE STREAM) smashing DSPSCALE.SCRATCHBRUSH)) elseif (NUMBERP BRUSH) then (DSPSCALE.WIDTH BRUSH STREAM) else BRUSH]) (DSPSCALE.DASHING [LAMBDA (DASHING STREAM) (* ; "Edited 19-Jul-88 10:21 by cdl") (if (LISTP DASHING) then [SCRATCHLIST DSPSCALE.SCRATCHDASHING (for WIDTH in DASHING do (ADDTOSCRATCHLIST (DSPSCALE.WIDTH WIDTH STREAM] elseif (NUMBERP DASHING) then (DSPSCALE.WIDTH DASHING STREAM) else DASHING]) (DSPSCALE.POINTS [LAMBDA (KNOTS STREAM) (* ; "Edited 19-Jul-88 09:52 by cdl") (SCRATCHLIST DSPSCALE.SCRATCHLIST (bind (KNOTSLST _ DSPSCALE.SCRATCHPOINTS) for KNOT in KNOTS do (ADDTOSCRATCHLIST (DSPSCALE.POSITION KNOT STREAM (if KNOTSLST then (pop KNOTSLST) else (push DSPSCALE.SCRATCHPOINTS (create POSITION) ) (CAR DSPSCALE.SCRATCHPOINTS]) (DSPSCALE.REGION [LAMBDA (REGION STREAM SMASH) (* cdl "28-Oct-85 09:00") (if (type? REGION REGION) then (with REGION REGION (create REGION LEFT _ (DSPSCALE.XPOSITION LEFT STREAM) BOTTOM _ (DSPSCALE.YPOSITION BOTTOM STREAM) WIDTH _ (DSPSCALE.NUMBER WIDTH STREAM) HEIGHT _ (DSPSCALE.NUMBER HEIGHT STREAM) smashing (OR SMASH DSPSCALE.SCRATCHREGION))) else REGION]) (DSPSCALE.NUMBER [LAMBDA (VALUE STREAM) (* cdl "23-Apr-86 09:10") (if (NUMBERP VALUE) then (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) (if [FLOATP (SETQ VALUE (if (GETSTREAMPROP STREAM 'SCALED) then (with CONVERT (GETSTREAMPROP STREAM 'RATIO) (QUOTIENT (TIMES VALUE DESTINATION) SOURCE)) else (TIMES (IMAGEOP 'IMSCALE STREAM STREAM) VALUE] then (FIXR VALUE) else VALUE) else VALUE]) (DSPSCALE.POSITION [LAMBDA (POSITION STREAM SMASH) (* cdl "29-Jul-85 11:57") (with POSITION POSITION (create POSITION XCOORD _ (DSPSCALE.XPOSITION XCOORD STREAM) YCOORD _ (DSPSCALE.YPOSITION YCOORD STREAM) smashing (OR SMASH DSPSCALE.SCRATCHPOSITION]) (DSPSCALE.XPOSITION [LAMBDA (VALUE STREAM) (* cdl " 1-Nov-85 08:47") (if (NUMBERP VALUE) then (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) [LET [(TRANSLATE (GETSTREAMPROP STREAM 'TRANSLATE] (if TRANSLATE then (with POSITION TRANSLATE (add VALUE XCOORD] (DSPSCALE.NUMBER VALUE STREAM) else VALUE]) (DSPSCALE.YPOSITION [LAMBDA (VALUE STREAM) (* cdl " 1-Nov-85 08:47") (if (NUMBERP VALUE) then (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) [LET [(TRANSLATE (GETSTREAMPROP STREAM 'TRANSLATE] (if TRANSLATE then (with POSITION TRANSLATE (add VALUE YCOORD] (DSPSCALE.NUMBER VALUE STREAM) else VALUE]) (DSPSCALE.WIDTH [LAMBDA (WIDTH STREAM) (* cdl "29-Oct-85 15:27") (if (ZEROP (SETQ WIDTH (DSPSCALE.NUMBER WIDTH STREAM))) then 1 else WIDTH]) (DSPUNSCALE.REGION [LAMBDA (REGION STREAM SMASH) (* cdl " 2-May-86 14:04") (if (type? REGION REGION) then (with REGION REGION (create REGION LEFT _ (DSPUNSCALE.XPOSITION LEFT STREAM) BOTTOM _ (DSPUNSCALE.YPOSITION BOTTOM STREAM) WIDTH _ (DSPUNSCALE.NUMBER WIDTH STREAM) HEIGHT _ (DSPUNSCALE.NUMBER HEIGHT STREAM) smashing (OR SMASH DSPSCALE.SCRATCHREGION))) else REGION]) (DSPUNSCALE.POSITION [LAMBDA (POSITION STREAM SMASH) (* cdl "17-Sep-85 14:21") (with POSITION POSITION (create POSITION XCOORD _ (DSPUNSCALE.XPOSITION XCOORD STREAM) YCOORD _ (DSPUNSCALE.YPOSITION YCOORD STREAM) smashing (OR SMASH DSPSCALE.SCRATCHPOSITION]) (DSPUNSCALE.NUMBER [LAMBDA (VALUE STREAM OFFSET) (* cdl "27-Jan-87 11:32") (if (NUMBERP VALUE) then (if (NOT (type? STREAM STREAM)) then (SETQ STREAM (GETSTREAM STREAM))) [SETQ VALUE (if (GETSTREAMPROP STREAM 'SCALED) then (with CONVERT (GETSTREAMPROP STREAM 'RATIO) (QUOTIENT (TIMES VALUE SOURCE) DESTINATION)) else (QUOTIENT VALUE (IMAGEOP 'IMSCALE STREAM STREAM] [if OFFSET then (LET [(TRANSLATE (GETSTREAMPROP STREAM 'TRANSLATE] (if TRANSLATE then (with POSITION TRANSLATE (SELECTQ OFFSET (X (SETQ VALUE (DIFFERENCE VALUE XCOORD))) (Y (SETQ VALUE (DIFFERENCE VALUE YCOORD))) NIL] (if (FLOATP VALUE) then (FIXR VALUE) else VALUE) else VALUE]) (DSPUNSCALE.CHARACTER [LAMBDA (WIDTH FONT STREAM) (* cdl "23-Apr-86 09:11") (LET (CONVERT VALUE) (if (NUMBERP WIDTH) then (if [FLOATP (SETQ VALUE (if (AND STREAM (OR (type? STREAM STREAM) (SETQ STREAM (GETSTREAM STREAM))) (GETSTREAMPROP STREAM 'SCALED)) then (with CONVERT (GETSTREAMPROP STREAM 'RATIO) (QUOTIENT (TIMES WIDTH SOURCE) DESTINATION)) else (QUOTIENT WIDTH (OR (with FONTDESCRIPTOR FONT FONTSCALE) (IMAGEOP 'IMSCALE STREAM STREAM] then (FIXR VALUE) else VALUE) else WIDTH]) ) (DECLARE%: EVAL@COMPILE [PUTPROPS DSPUNSCALE.XPOSITION MACRO ((VALUE STREAM) (DSPUNSCALE.NUMBER VALUE STREAM 'X] [PUTPROPS DSPUNSCALE.YPOSITION MACRO ((VALUE STREAM) (DSPUNSCALE.NUMBER VALUE STREAM 'Y] ) (* * etc.) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD SCALEDIMAGEDATA (IMAGESTREAM)) (RECORD CONVERT (SOURCE . DESTINATION)) ) ) (ADDTOVAR IMAGESTREAMTYPES (SCALED (OPENSTREAM OPENIMAGESTREAM.SCALED))) (RPAQ? \SCALEDIMAGEOPS NIL) (RPAQ? \NULLFDEV NIL) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \SCALEDIMAGEOPS \NULLFDEV) ) (RPAQ? DSPSCALE.SCRATCHBRUSH '(ROUND 1 NIL)) (RPAQ? DSPSCALE.SCRATCHREGION (create REGION)) (RPAQ? DSPSCALE.SCRATCHPOSITION (create POSITION)) (RPAQ? DSPSCALE.SCRATCHLIST (to 10 collect)) (RPAQ? DSPSCALE.SCRATCHDASHING (to 10 collect)) (RPAQ? DSPSCALE.SCRATCHPOINTS (to 10 collect (create POSITION))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DSPSCALE.SCRATCHBRUSH DSPSCALE.SCRATCHREGION DSPSCALE.SCRATCHPOSITION DSPSCALE.SCRATCHLIST DSPSCALE.SCRATCHDASHING DSPSCALE.SCRATCHPOINTS) ) (MOVD? 'DSPUNITS! 'DSPUNITS) (INITSCALEDIMAGESTREAM) (PUTPROPS DSPSCALE COPYRIGHT ("Stanford University" 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5589 11142 (INITSCALEDIMAGESTREAM 5599 . 9099) (OPENIMAGESTREAM.SCALED 9101 . 11140)) ( 11143 28693 (\BACKCOLOR.SCALED 11153 . 11396) (\BITBLT.SCALED 11398 . 12265) (\BLTSHADE.SCALED 12267 . 13022) (\BOTTOMMARGIN.SCALED 13024 . 13479) (\BOUT.SCALED 13481 . 13690) (\CHARSET.SCALED 13692 . 13938) (\CHARWIDTH.SCALED 13940 . 14287) (\CHARWIDTHY.SCALED 14289 . 14638) (\CLIPPINGREGION.SCALED 14640 . 15093) (\CLOSEFN.SCALED 15095 . 15356) (\COLOR.SCALED 15358 . 15593) (\DEFAULTSTATE.SCALED 15595 . 15850) (\DRAWARC.SCALED 15852 . 16481) (\DRAWCIRCLE.SCALED 16483 . 17072) (\DRAWCURVE.SCALED 17074 . 17493) (\DRAWELLIPSE.SCALED 17495 . 18291) (\DRAWLINE.SCALED 18293 . 18940) (\DRAWPOINT.SCALED 18942 . 19372) (\DRAWPOLYGON.SCALED 19374 . 19797) (\FILLCIRCLE.SCALED 19799 . 20297) ( \FILLPOLYGON.SCALED 20299 . 20639) (\FONT.SCALED 20641 . 20873) (\LEFTMARGIN.SCALED 20875 . 21326) ( \LINEFEED.SCALED 21328 . 21769) (\MOVETO.SCALED 21771 . 22097) (\NEWPAGE.SCALED 22099 . 22332) ( \OPERATION.SCALED 22334 . 22581) (\POPSTATE.SCALED 22583 . 22830) (\PUSHSTATE.SCALED 22832 . 23081) ( \RESET.SCALED 23083 . 23333) (\RIGHTMARGIN.SCALED 23335 . 23788) (\ROTATE.SCALED 23790 . 24042) ( \SCALE.SCALED 24044 . 24367) (\SCALEDBITBLT.SCALED 24369 . 25278) (\SPACEFACTOR.SCALED 25280 . 25727) (\STRINGWIDTH.SCALED 25729 . 26084) (\TERPRI.SCALED 26086 . 26338) (\TOPMARGIN.SCALED 26340 . 26789) ( \TRANSLATE.SCALED 26791 . 27161) (\XPOSITION.SCALED 27163 . 27612) (\YPOSITION.SCALED 27614 . 28063) ( \OUTCHAR.SCALED 28065 . 28691)) (28734 43771 (CENTERPRINTINREGION! 28744 . 29003) (CHARWIDTH! 29005 . 29238) (CHARWIDTHY! 29240 . 29475) (CURSORPOSITION! 29477 . 29921) (BITBLT! 29923 . 30533) (BITMAPBIT! 30535 . 30764) (BLTSHADE! 30766 . 31298) (DSPBACKUP! 31300 . 31536) (DSPBOTTOMMARGIN! 31538 . 31871) (DSPCLIPPINGREGION! 31873 . 32206) (DRAWBETWEEN! 32208 . 32591) (DRAWARC! 32593 . 33074) (DRAWCIRCLE! 33076 . 33451) (DRAWCURVE! 33453 . 33741) (DRAWELLIPSE! 33743 . 34305) (DRAWLINE! 34307 . 34782) ( DRAWPOINT! 34784 . 35071) (DRAWPOLYGON! 35073 . 35366) (DRAWTO! 35368 . 35680) (FILLCIRCLE! 35682 . 35971) (FILLPOLYGON! 35973 . 36161) (FONTPROP! 36163 . 36501) (DSPLEFTMARGIN! 36503 . 36830) ( DSPLINEFEED! 36832 . 37147) (GETPOSITION! 37149 . 37334) (MOVETO! 37336 . 37550) (MOVETOUPPERLEFT! 37552 . 37785) (DSPRIGHTMARGIN! 37787 . 38117) (DSPSCALE! 38119 . 38915) (RELDRAWTO! 38917 . 39231) ( RELMOVETO! 39233 . 39449) (SCALEDBITBLT! 39451 . 40089) (STRINGREGION! 40091 . 40316) (STRINGWIDTH! 40318 . 40560) (DSPSPACEFACTOR! 40562 . 40886) (DSPTRANSLATE! 40888 . 41389) (DSPTOPMARGIN! 41391 . 41715) (DSPUNITS! 41717 . 42443) (DSPXOFFSET! 42445 . 42780) (DSPXPOSITION! 42782 . 43106) ( DSPYOFFSET! 43108 . 43443) (DSPYPOSITION! 43445 . 43769)) (43812 53676 (DSPSCALE.BRUSH 43822 . 44648) (DSPSCALE.DASHING 44650 . 45198) (DSPSCALE.POINTS 45200 . 46255) (DSPSCALE.REGION 46257 . 46955) ( DSPSCALE.NUMBER 46957 . 47912) (DSPSCALE.POSITION 47914 . 48339) (DSPSCALE.XPOSITION 48341 . 48862) ( DSPSCALE.YPOSITION 48864 . 49385) (DSPSCALE.WIDTH 49387 . 49607) (DSPUNSCALE.REGION 49609 . 50309) ( DSPUNSCALE.POSITION 50311 . 50734) (DSPUNSCALE.NUMBER 50736 . 52070) (DSPUNSCALE.CHARACTER 52072 . 53674))))) STOP \ No newline at end of file diff --git a/lispusers/DSPSCALE.TEDIT b/lispusers/DSPSCALE.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..591b206c996b2c6db90f00af4ffaf8a14343df15 GIT binary patch literal 10181 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 literal 0 HcmV?d00001 diff --git a/lispusers/DUMPER b/lispusers/DUMPER new file mode 100644 index 00000000..b8bb895a --- /dev/null +++ b/lispusers/DUMPER @@ -0,0 +1 @@ +(FILECREATED "25-Mar-86 13:22:34" {LOGOS:AFB:SIP}LISP>DUMPER.;10 8672 changes to: (FNS DUMP.DUMP DUMP.DIRECTORY DUMP DUMP.LOG.FILENAME DUMP.NEW.FILENAME DUMP.DIRECTORIES) (VARS DUMPERCOMS) previous date: "24-Mar-86 21:40:40" {LOGOS:AFB:SIP}LISP>DUMPER.;7) (* Copyright (c) 1986, 1901 by Speech Input Project, Univ. of Edinburgh. All rights reserved.) (PRETTYCOMPRINT DUMPERCOMS) (RPAQQ DUMPERCOMS ((FNS DUMP DUMP.DUMP DUMP.NEW.FILENAME DUMP.DIRECTORIES DUMP.DIRECTORY DUMP.GENERATE.NEWERTHAN DUMP.NVERSIONS) (INITVARS (DUMP.IGNORE.DIRS '(FONTS CLEARINGHOUSE SYSTEMFILES DESKTOPS)) (DUMP.IGNORE.SPECS '(*.DCOM;* *.SYSOUT;*)) (DUMP.DIRECTORY.SEPARATOR "\")))) (DEFINEQ (DUMP [LAMBDA (HOST TO.DIRECTORY LOG.FILE NEWERTHAN NVERSIONS) (* drc: "25-Mar-86 12:43") (* * Will dump all files on NS file server HOST which are newer than NEWERTHAN, a date string, with a maximum of  NVERSIONS of a particular file being dumped to TO.DIRECTORY. If NEWERTHAN is NIL than all versions written since  (GDATE 0) will be dumped. If NVERSIONS is NIL then all versions will be dumped. A log file will be written to a  file w/ name specified by DUMP.LOG.FILENAME. Returns the log file name.) (DECLARE (GLOBALVARS DUMP.IGNORE.SPECS)) (RESETLST (LET ((IDATE (if NEWERTHAN then (IDATE NEWERTHAN) else 0)) (FILTERS (MAPCAR DUMP.IGNORE.SPECS (FUNCTION DIRECTORY.MATCH.SETUP))) LOG FILES) (* do a little arg checking) (OR (FIXP IDATE) (ERROR NEWERTHAN "ARG NOT A DATE STRING")) (OR (STRPOS ":" (MKSTRING HOST)) (ERROR HOST "NOT AN NS HOST")) (SETQ LOG (OPENSTREAM LOG.FILE 'OUTPUT 'NEW)) (RESETSAVE NIL (LIST 'CLOSEF? LOG)) (printout LOG "Dump of server " HOST " on " (DATE) " to " TO.DIRECTORY "." T "Dumping " (OR NVERSIONS "all") " versions of each file written since " (GDATE IDATE) "." T) (printout LOG "Not dumping files on directories :") (for DIR in DUMP.IGNORE.DIRS do (PRINTOUT LOG " " DIR)) (printout LOG T "Not dumping files which match :") (for SPEC in DUMP.IGNORE.SPECS do (PRINTOUT LOG " " SPEC)) (printout LOG T T) (* actually do the dump.) (for DIR in (DUMP.DIRECTORIES HOST) bind FILES do (PRINTOUT T DIR) (SETQ FILES (DUMP.DIRECTORY HOST DIR IDATE NVERSIONS FILTERS LOG)) (printout T "(" (FLENGTH FILES) ")") (DUMP.DUMP FILES TO.DIRECTORY LOG) (PRINTOUT T "OK" T)) (printout LOG T (DATE) " Done with backups." T) (CLOSEF LOG]) (DUMP.DUMP [LAMBDA (FILES TO.DIR LOG) (* drc: "25-Mar-86 13:02") (* * Will copy all files in FILES to TO.DIR, renaming files as specified by DUMP.NEW.FILENAME. Each file copied is recorded in LOG, a stream opened for output.) (for FILE in FILES as N from 1 bind VALUE NEWNAME do (SETQ N9]AME (DUMP.NEW.FILENAME FILE TO.DIR)) (SETQ VALUE (NLSETQ (COPYFILE FILE NEWNAME))) (if (LISTP VALUE) then (* file dumped successfully) (PRINTOUT T (if (ZEROP (REMAINDER N 10)) then N else ".")) (printout LOG FILE T) else (* error occurred) (LET ((ERROR (ERRORN))) (PRINTOUT T (ERRORSTRING (CAR ERROR)) " " (CADR ERROR) T FILE " Not dumped." T) (PRINTOUT LOG (ERRORSTRING (CAR ERROR)) " " (CADR ERROR) T FILE " Not dumped." T]) (DUMP.NEW.FILENAME [LAMBDA (FILE TO.DIR) (* drc: "25-Mar-86 12:00") (* * Replaces >'s in the DIRECTORY field of file with DUMP.DIRECTORY.SEPARATOR.) (DECLARE (GLOBALVARS DUMP.DIRECTORY.SEPARATOR)) (LET ((FILEFIELDS (UNPACKFILENAME FILE))) (PACKFILENAME 'NAME (CONCAT [CONCATLIST (DSUBST DUMP.DIRECTORY.SEPARATOR '> (UNPACK (LISTGET FILEFIELDS 'DIRECTORY] DUMP.DIRECTORY.SEPARATOR (LISTGET FILEFIELDS 'NAME)) 'EXTENSION (LISTGET FILEFIELDS 'EXTENSION) 'VERSION NIL 'BODY TO.DIRECTORY]) (DUMP.DIRECTORIES [LAMBDA (HOST) (* drc: "25-Mar-86 12:05") (* * Returns a list of the names of all the top-level directories on NS host HOST except those on DUMP.IGNORE.DIRS) (DECLARE (GLOBALVARS DUMP.IGNORE.DIRS)) (LET [(DIRS (MAPCAR (DIRECTORY (PACKFILENAME 'HOST HOST 'DIRECTORY '*)) (FUNCTION (LAMBDA (SPEC) (* DIRECTORY of {host:}<*> returns a list of  {host:}<*>.;1) (MKATOM (U-CASE (FILENAMEFIELD SPEC 'DIRECTORY] (for DIR in DUMP.IGNORE.DIRS do (DREMOVE (MKATOM (U-CASE DIR)) DIRS)) DIRS]) (DUMP.DIRECTORY [LAMBDA (HOST DIR IDATE NVERSIONS FILTERS LOG) (* drc: "25-Mar-86 13:03") (* * Return all the files on DIR newer than IDATE, an IDATE, with no more than NVERSIONS of any particular file. NIL versions means all. Files which match a filter on FILTERS (generated from by mapping DIRECTORY.MATCH.SETUP over DUMP.IGNORE.SPECS) are removed.) (LET* ((SPEC (PACKFILENAME 'HOST HOST 'DIRECTORY DIR 'BODY '*.*;*)) (VALUE (NLSETQ (DUMP.GENERATE.NEWERTHAN SPEC IDATE))) (FILES (if (LISTP VALUE) then (CAR VALUE) else (LET ((ERROR (ERRORN))) (PRINTOUT T (ERRORSTRING (CAR ERROR)) " " (CADR ERROR) T SPEC " Not dumped." T) (PRINTOUT LOG (ERRORSTRING (CAR ERROR)) " " (CADR ERROR) T SPEC " Not dumped." T)) NIL))) (for FILE in (if NVERSIONS then (DUMP.NVERSIONS FILES NVERSIONS) else FILES) when (for FILTER in FILTERS never (DIRECTORY.MATCH FILTER FILE)) collect FILE]) (DUMP.GENERATE.NEWERTHAN [LAMBDA (SPEC IDATE) (* drc: "21-Mar-86 22:05") (RESETLST (* collect all the files in filespec SPEC newerthan  IDATE) (bind FILE [GEN _(\GENERATEFILES SPEC '(WRITEDATE) '(RESETLST SORT)] eachtime (SETQ FILE (\GENERATENEXTFILE GEN)) when (GEQ (IDATE (\GENERATEFILEINFO GEN 'WRITEDATE)) IDATE) collect FILE until (NOT FILE]) (DUMP.NVERSIONS [LAMBDA (FILES N) (* drc: " 1-Jan-01 00:36") (* assumes FILES is sorted, with low versions first) (DREVERSE (for TAIL on (DREVERSE FILES) bind FILE LASTFILE FILEFIELDS LASTFIELDS (M _ 1) eachtime (* Have to reverse list to get high versions first.) (SETQ LASTFILE FILE) (SETQ FILE (CAR TAIL)) (SETQ LASTFIELDS FILEFIELDS) (SETQ FILEFIELDS (UNPACKFILENAME FILE)) (* only collect the first N of a particular file) (if [AND (EQ (LISTGET FILEFIELDS 'NAME) (LISTGET LASTFIELDS 'NAME)) (EQ (LISTGET FILEFIELDS 'EXTENSION) (LISTGET LASTFIELDS 'EXTENSION)) (EQ (LISTGET FILEFIELDS 'DIRECTORY) (LISTGET LASTFIELDS 'DIRECTORY] then (SETQ M (ADD1 M)) else (SETQ M 1)) when (LEQ M N) collect FILE]) ) (RPAQ? DUMP.IGNORE.DIRS '(FONTS CLEARINGHOUSE SYSTEMFILES DESKTOPS)) (RPAQ? DUMP.IGNORE.SPECS '(*.DCOM;* *.SYSOUT;*)) (RPAQ? DUMP.DIRECTORY.SEPARATOR "\") (PUTPROPS DUMPER COPYRIGHT ("Speech Input Project, Univ. of Edinburgh" 1986 1901)) (DECLARE: DONTCOPY (FILEMAP (NIL (744 8397 (DUMP 754 . 2934) (DUMP.DUMP 2936 . 4062) (DUMP.NEW.FILENAME 4064 . 4735) ( DUMP.DIRECTORIES 4737 . 5478) (DUMP.DIRECTORY 5480 . 6683) (DUMP.GENERATE.NEWERTHAN 6685 . 7234) ( DUMP.NVERSIONS 7236 . 8395))))) STOP \ No newline at end of file diff --git a/lispusers/DUMPLOAD b/lispusers/DUMPLOAD new file mode 100644 index 00000000..95286b50 --- /dev/null +++ b/lispusers/DUMPLOAD @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 7-Jan-88 15:36:10" "{ERINYES}Lyric>DUMPLOAD.;4" 5124 changes to%: (FNS \DUMP.COPY \DUMP.PURGE DUMPREAD) (VARS DUMPLOADCOMS) (PROPS (DUMPREAD ARGNAMES)) previous date%: " 4-Dec-83 17:53:41" {ERINYES}KOTO>LISPUSERS>DUMPLOAD.;1) (* " Copyright (c) 1983, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT DUMPLOADCOMS) (RPAQQ DUMPLOADCOMS ((FNS DUMPREAD \DUMP.PARSEDATE \DUMP.PARSENAME \DUMP.COPY \DUMP.PURGE) (DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS * DUMPTYPES)) (PROP ARGNAMES DUMPREAD) (PROP FILETYPE DUMPLOAD) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA DUMPREAD)))) ) (DEFINEQ (DUMPREAD (CL:LAMBDA (FILE &KEY ((:COPY-TO COPYFLG) T) ((:ASK ASKFLG)) ((:PRINT PRINTFLG) T) ((:DATES DATEFLG) T) (COLLECT NIL COLLECTP)) (* ; "Edited 7-Jan-88 14:28 by bvm:") (LET (STREAM OUTSTREAM) (CL:UNWIND-PROTECT (PROG ((*UPPER-CASE-FILE-NAMES* NIL) (*STANDARD-OUTPUT* (GETSTREAM T (QUOTE OUTPUT))) SEEFLG RESULT NAME CREATIONDATE KEYWORD TYPE) (IF (NULL COPYFLG) ELSEIF (EQ COPYFLG T) THEN (SETQ SEEFLG T) (SETQ ASKFLG T) (SETQ COPYFLG NIL) ELSEIF (NOT COLLECTP) THEN (SETQ COLLECT T)) (SETQ KEYWORD (COND (SEEFLG (SETQ OUTSTREAM (GETSTREAM T (QUOTE OUTPUT))) "See") (COPYFLG "Copy") (T (SETQ ASKFLG NIL)))) (SETQ STREAM (OPENSTREAM FILE (QUOTE INPUT) (QUOTE OLD) (QUOTE ((SEQUENTIAL T))))) LP (SETQ TYPE (BIN STREAM)) TYPELP (SELECTC TYPE (\DUMP.END (* ; "End of file, return accumulated names, if we've been collecting") (RETURN RESULT)) (\DUMP.NAME (SETQ NAME (\DUMP.PARSENAME STREAM))) (\DUMP.DATE (SETQ CREATIONDATE (\DUMP.PARSEDATE STREAM)) (* ; "Date is in alto format") (SETQ CREATIONDATE (AND (OR DATEFLG COPYFLG) (GDATE (ALTO.TO.LISP.DATE CREATIONDATE) (DATEFORMAT TIME.ZONE))))) (\DUMP.ERROR (ERROR "Error block encountered in dump file" (FULLNAME STREAM))) (\DUMP.DATA (COND ((COND ((NULL NAME) (printout T "[Skipping nameless data...]" T) NIL) (ASKFLG (CL:Y-OR-N-P "~A ~A~@[ [~A]~]? " KEYWORD NAME CREATIONDATE)) (T (COND (PRINTFLG (CL:FORMAT T "~A~@[ [~A]~]" NAME CREATIONDATE) (COND (SEEFLG (printout T (QUOTE %:) T)) (COPYFLG (printout T " -> ")) (T (TERPRI T))))) T)) (SETQ TYPE (COND (SEEFLG (PROG1 (\DUMP.COPY STREAM OUTSTREAM T) (COND (PRINTFLG (printout T .TAB0 0 T))))) (COPYFLG (SETQ OUTSTREAM (OPENSTREAM (PACKFILENAME.STRING (QUOTE DIRECTORY) COPYFLG (QUOTE BODY) NAME) (QUOTE OUTPUT) NIL NIL (BQUOTE ((SEQUENTIAL T) (CREATIONDATE (\, CREATIONDATE)))))) (PROG1 (\DUMP.COPY STREAM OUTSTREAM) (SETQ NAME (CLOSEF OUTSTREAM)) (SETQ OUTSTREAM NIL) (COND (PRINTFLG (printout T NAME T))))) (T (\DUMP.PURGE STREAM)))) (COND (COLLECT (push RESULT NAME)))) (T (SETQ TYPE (\DUMP.PURGE STREAM)))) (SETQ NAME (SETQ CREATIONDATE NIL)) (GO TYPELP)) (ERROR "Bad Block Type in dump file" (FULLNAME STREAM))) (GO LP)) (* ;; "Be sure to clean up this stream on the way out") (IF (AND OUTSTREAM (NEQ COPYFLG T)) THEN (* ; "Flush partially written copy") (DELFILE (CLOSEF OUTSTREAM))) (AND STREAM (CLOSEF STREAM))))) ) (\DUMP.PARSEDATE (LAMBDA (INSTREAM) (* bvm%: " 2-Dec-83 18:22") (PROG1 (\MAKENUMBER (\WIN INSTREAM) (\WIN INSTREAM)) (BIN INSTREAM) (* ; "Ignore two bytes") (BIN INSTREAM))) ) (\DUMP.PARSENAME (LAMBDA (INSTREAM) (* bvm%: " 2-Dec-83 18:26") (BIN INSTREAM) (* ; "Skip two bytes") (BIN INSTREAM) (PROG ((CHARS (bind CH until (EQ 0 (SETQ CH (BIN INSTREAM))) collect CH)) RESULT) (SETQ RESULT (ALLOCSTRING (LENGTH CHARS))) (for CH in CHARS as I from 1 do (RPLCHARCODE RESULT I CH)) (RETURN RESULT))) ) (\DUMP.COPY (LAMBDA (INSTREAM OUTSTREAM TTYP) (* ; "Edited 7-Jan-88 15:15 by bvm:") (* ;; "Copy data blocks byte-by-byte from INSTREAM to OUTSTREAM. Return the type of the next block. TTYP is true if OUTSTREAM is the terminal.") (bind TYPE do (COPYBYTES INSTREAM OUTSTREAM (PROG1 (\WIN INSTREAM) (* ; "Length in bytes. Now skip checksum") (BIN INSTREAM) (BIN INSTREAM))) repeatwhile (EQ (SETQ TYPE (BIN INSTREAM)) \DUMP.DATA) finally (RETURN TYPE))) ) (\DUMP.PURGE (LAMBDA (STREAM) (* ; "Edited 7-Jan-88 15:31 by bvm:") (do (SETFILEPTR STREAM (+ (PROG1 (\WIN STREAM) (* ; "Second word is checksum, which ignore") (BIN STREAM) (BIN STREAM)) (GETFILEPTR STREAM))) repeatwhile (EQ (SETQ $$VAL (BIN STREAM)) \DUMP.DATA))) ) ) (DECLARE%: EVAL@COMPILE DONTCOPY (RPAQQ DUMPTYPES ((\DUMP.DATE 251) (\DUMP.END 252) (\DUMP.ERROR 253) (\DUMP.DATA 254) (\DUMP.NAME 255)) ) (DECLARE%: EVAL@COMPILE (RPAQQ \DUMP.DATE 251) (RPAQQ \DUMP.END 252) (RPAQQ \DUMP.ERROR 253) (RPAQQ \DUMP.DATA 254) (RPAQQ \DUMP.NAME 255) (CONSTANTS (\DUMP.DATE 251) (\DUMP.END 252) (\DUMP.ERROR 253) (\DUMP.DATA 254) (\DUMP.NAME 255)) ) ) (PUTPROPS DUMPREAD ARGNAMES (FILE &KEY :ASK :COPY-TO :DATES :PRINT :COLLECT)) (PUTPROPS DUMPLOAD FILETYPE :COMPILE-FILE) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA DUMPREAD) ) (PUTPROPS DUMPLOAD COPYRIGHT ("Xerox Corporation" 1983 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (767 4355 (DUMPREAD 777 . 3111) (\DUMP.PARSEDATE 3113 . 3292) (\DUMP.PARSENAME 3294 . 3618) (\DUMP.COPY 3620 . 4079) (\DUMP.PURGE 4081 . 4353))))) STOP \ No newline at end of file diff --git a/lispusers/Debugger-Context.TEdit b/lispusers/Debugger-Context.TEdit new file mode 100644 index 0000000000000000000000000000000000000000..4c5cf265735a400e3ce9cb59f393e6821c074592 GIT binary patch literal 3587 zcmeHI+j84f6jj``LkSuN=rBC)DG#-W)Wohy()Iz|Saw7mD=0Qe>F{tY9or(dPS7Qe zdE$}jC-DXS4}OHTk1X4{0S^oeGib)r(Y~Fv*Iq|Hv0Ufme#3gvYqc!*@t)J^S|?qz zYMM3EteECC4{Y$fm^~xfmrOw~9qU@6B#Bn z7I8w-4-)B<3aOqBQy3~wHmUM-cc*OHVG=1n^^!n^=J7~|X%MLi z^$~Xpn~DHaj8lqbf#yBTMgg#A_9}Hkbz!gGy6Hocs&_pCxCJd~C;v^D0h=GcxBJyb}W@WP% zV{j0Mj0VD!*JOzr%zvyKS?~z`O@IYfmV+1!z@0{vM?As+FHgH{!f^j}LyHbuvgT0Y zd-F&pT<6Aa*qoPy0z+R-vx#9>&8S3E!aIc)!~|W2|_dn*vdgu zIib*lrkPNj#T9PONn-6QY!R&zxHvG^h|?X1Dj{zq!r`L4KF%xcJlEQt@Ruiu;}jA` z4sQZd7EsV0J`k}g;|sQ&`bw3*pA<60uPg1(S>R7b*I?2kGfPW9@bkHb?i13n@-zy>`v36V%@F3 zu=h%I)UCT+yVK&JPpML(;udYucBM)?Ppf##aD3#wXW{S1wHhVb z+poKG&r$Eta*y_0`>=~bNA`CXRko;EKd{@c=)h@MZik$2Ew^oVEOMGnAaL!MmecF% zw_XPkOJCbLw8*tuy>{KDW6N&scj>@t*u8@iH68b$4(u!K0B~ieMo+e>y1R=jdp4^s^PcH<$qY6s3}Cq(`~AKu}#}sTUq%MG8Y`{ zp#KVm0AAg#QVqkdu5|oATQ>^s-(jm%(x>^ZanJaiS8H#L4LsKGtYf|Qc1?RP-`2YN zz0CK&5S}F$=g}YFxn8)F8E?23jW@=dwOzpZYjIp+y#TPcTn)AZrM|8-wZX?~u0~^H z<*a7Wm+tF8^s(^{K1c_4r`|T+U3ecD_p<0a^Mg*=ff{j-TYF^xSN zUBTezA3<1>HpiYP{u%aL6S?`%@LSM_ff!oVIW5exPG^s%Joms*;B&IbW$*iJ;84Ev z^EEH?6pqkqUOZU!aOfmA=oxXyZ@FcW^vgBNN4X{6@rP9dSJ8^OamSxmLjmF5BV+rg GUw;QZ;Z|e- literal 0 HcmV?d00001 diff --git a/lispusers/DocumentationTemplate.TEdit b/lispusers/DocumentationTemplate.TEdit new file mode 100644 index 0000000000000000000000000000000000000000..18308426bc1b849a185fd78fc4b0189bd227ff56 GIT binary patch literal 15425 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.;6| 16468 changes to%: (FNS EDITBACKGROUND EDITBG.BUTTONFN) (VARS EDITBGCOMS) previous date%: " 9-Sep-87 09:18:10" |{MCS:MCS:STANFORD}EDITBG.;4|) (* " Copyright (c) 1984, 1985, 1986, 1987, 1988 by Stanford University. All rights reserved. ") (PRETTYCOMPRINT EDITBGCOMS) (RPAQQ EDITBGCOMS ((FNS EDITBACKGROUND EDITBG.BUTTONFN) (RECORDS EDITBG.RECORD EDITBG.DATA) (CONSTANTS (EDITBG.PIXELSIZE 16)) (ALISTS (BackgroundMenuCommands EditBG)) (VARS (BackgroundMenu)) [INITVARS [EDITBG.SHADEREC (create EDITBG.RECORD REGION _ (CREATEREGION 2 2 (LLSH EDITBG.PIXELSIZE 2) (LLSH EDITBG.PIXELSIZE 2)) GRIDSPEC _ (CREATEREGION 2 2 EDITBG.PIXELSIZE EDITBG.PIXELSIZE) BITWIDTH _ 4 BITHEIGHT _ 4 DSPREGION _ (CREATEREGION EDITBG.PIXELSIZE (TIMES EDITBG.PIXELSIZE 6) (TIMES EDITBG.PIXELSIZE 11) (LLSH EDITBG.PIXELSIZE 1)) NUMBEREGION _ (CREATEREGION WBorder (PLUS (LLSH EDITBG.PIXELSIZE 2) WBorder) (DIFFERENCE (LLSH EDITBG.PIXELSIZE 2) WBorder) (FONTPROP DEFAULTFONT 'HEIGHT] [EDITBG.BORDERREC (create EDITBG.RECORD REGION _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5) 2) 2 (LLSH EDITBG.PIXELSIZE 3) (LLSH EDITBG.PIXELSIZE 2)) GRIDSPEC _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5) 2) 2 EDITBG.PIXELSIZE (LLSH EDITBG.PIXELSIZE 1)) BITWIDTH _ 8 BITHEIGHT _ 2 DSPREGION _ (CREATEREGION 1 (ADD1 (TIMES EDITBG.PIXELSIZE 5)) (PLUS (TIMES EDITBG.PIXELSIZE 13) 2) (SUB1 (LLSH EDITBG.PIXELSIZE 2))) NUMBEREGION _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5 ) WBorder) (PLUS (LLSH EDITBG.PIXELSIZE 2) WBorder) (DIFFERENCE (LLSH EDITBG.PIXELSIZE 3) WBorder) (FONTPROP DEFAULTFONT 'HEIGHT] (EDITBG.BUTTONREGION (CREATEREGION (PLUS 2 (LLSH EDITBG.PIXELSIZE 2)) (PLUS 2 (LLSH EDITBG.PIXELSIZE 2)) (SUB1 EDITBG.PIXELSIZE) (SUB1 EDITBG.PIXELSIZE] (GLOBALVARS EDITBG.BUTTONREGION EDITBG.BORDERREC EDITBG.SHADEREC EDITBG.PIXELSIZE))) (DEFINEQ (EDITBACKGROUND [LAMBDA NIL (* ; "Edited 12-Jul-88 09:05 by cdl") (DECLARE (GLOBALVARS WBorder)) (LET ((WINDOW (CREATEW (GETBOXREGION (WIDTHIFWINDOW (CONSTANT (PLUS (TIMES EDITBG.PIXELSIZE 13) WBorder))) (HEIGHTIFWINDOW (CONSTANT (TIMES EDITBG.PIXELSIZE 9)) T)) "Background Texture Edit Tool"))) (for RECORD in (LIST EDITBG.SHADEREC EDITBG.BORDERREC) do (with EDITBG.RECORD RECORD (with REGION REGION (WBOX (CREATEREGION (DIFFERENCE LEFT (QUOTIENT WBorder 2)) (DIFFERENCE BOTTOM (QUOTIENT WBorder 2)) (PLUS WIDTH WBorder) (PLUS HEIGHT WBorder)) NIL NIL WINDOW)) (GRID GRIDSPEC BITWIDTH BITHEIGHT 'POINT WINDOW) (CENTERPRINTINREGION 0 NUMBEREGION WINDOW))) (WBOX EDITBG.BUTTONREGION NIL NIL WINDOW) (WINDOWPROP WINDOW 'BUTTONEVENTFN (FUNCTION EDITBG.BUTTONFN)) (WINDOWPROP WINDOW 'EDITBG.DATA (create EDITBG.DATA)) WINDOW]) (EDITBG.BUTTONFN [LAMBDA (WINDOW) (* ; "Edited 12-Jul-88 08:38 by cdl") (PROG ((DATA (WINDOWPROP WINDOW 'EDITBG.DATA)) POSITION SHADE LEFTFLG PIXEL BIT GRIDX GRIDY RECORD NEWSHADE) (until (MOUSESTATE UP) do (SETQ POSITION (CURSORPOSITION NIL WINDOW POSITION)) (if (INSIDEP EDITBG.BUTTONREGION POSITION) then (DSPFILL EDITBG.BUTTONREGION BLACKSHADE 'INVERT WINDOW) (with EDITBG.DATA DATA (CHANGEBACKGROUND INTERIOR) (CHANGEBACKGROUNDBORDER EXTERIOR)) (DSPFILL EDITBG.BUTTONREGION BLACKSHADE 'INVERT WINDOW) (RETURN)) (if (INSIDEP (fetch (EDITBG.RECORD REGION) of EDITBG.SHADEREC) POSITION) then (SETQ RECORD EDITBG.SHADEREC) (SETQ SHADE (with EDITBG.DATA DATA INTERIOR)) elseif (INSIDEP (fetch (EDITBG.RECORD REGION) of EDITBG.BORDERREC) POSITION) then (SETQ RECORD EDITBG.BORDERREC) (SETQ SHADE (with EDITBG.DATA DATA EXTERIOR)) else (SETQ RECORD NIL)) (if RECORD then (SETQ LEFTFLG (LASTMOUSESTATE LEFT)) [with EDITBG.RECORD RECORD (with POSITION POSITION (SETQ GRIDX (GRIDXCOORD XCOORD GRIDSPEC)) (SETQ GRIDY (GRIDYCOORD YCOORD GRIDSPEC))) (SHADEGRIDBOX GRIDX GRIDY (if LEFTFLG then GRAYSHADE else WHITESHADE) NIL GRIDSPEC 'POINT WINDOW) [SETQ PIXEL (LLSH 1 (PLUS (TIMES GRIDY BITWIDTH) (SUB1 BITWIDTH) (MINUS GRIDX] [SETQ NEWSHADE (if LEFTFLG then (LOGOR SHADE PIXEL) else (LOGAND SHADE (LOGNOT PIXEL] (if (NEQ SHADE NEWSHADE) then (SETQ SHADE NEWSHADE) (DSPFILL NUMBEREGION WHITESHADE 'REPLACE WINDOW) (CENTERPRINTINREGION SHADE NUMBEREGION WINDOW) (with EDITBG.DATA DATA (if (EQ RECORD EDITBG.BORDERREC) then (SETQ BIT (if LEFTFLG then 1 else 0)) (SETQ GRIDY (LLSH GRIDY 1)) (for X from GRIDX to (PLUS GRIDX 8) by 8 do (for Y from GRIDY to (ADD1 GRIDY) do (BITMAPBIT BITMAP X Y BIT))) (DSPFILL DSPREGION BITMAP NIL WINDOW) (SETQ EXTERIOR SHADE) else (SETQ INTERIOR SHADE] (DSPFILL (fetch (EDITBG.RECORD DSPREGION) of EDITBG.SHADEREC) (with EDITBG.DATA DATA INTERIOR) NIL WINDOW)) (BLOCK]) ) (DECLARE%: EVAL@COMPILE (RECORD EDITBG.RECORD (REGION GRIDSPEC BITWIDTH DSPREGION NUMBEREGION BITHEIGHT)) (RECORD EDITBG.DATA (BITMAP INTERIOR EXTERIOR) BITMAP _ (BITMAPCREATE 16 4) INTERIOR _ 0 EXTERIOR _ 0) ) (DECLARE%: EVAL@COMPILE (RPAQQ EDITBG.PIXELSIZE 16) (CONSTANTS (EDITBG.PIXELSIZE 16)) ) (ADDTOVAR BackgroundMenuCommands (EditBG '(EDITBACKGROUND) "Opens a Background Texture Edit Tool")) (RPAQQ BackgroundMenu NIL) (RPAQ? EDITBG.SHADEREC [create EDITBG.RECORD REGION _ (CREATEREGION 2 2 (LLSH EDITBG.PIXELSIZE 2) (LLSH EDITBG.PIXELSIZE 2)) GRIDSPEC _ (CREATEREGION 2 2 EDITBG.PIXELSIZE EDITBG.PIXELSIZE) BITWIDTH _ 4 BITHEIGHT _ 4 DSPREGION _ (CREATEREGION EDITBG.PIXELSIZE (TIMES EDITBG.PIXELSIZE 6) (TIMES EDITBG.PIXELSIZE 11) (LLSH EDITBG.PIXELSIZE 1)) NUMBEREGION _ (CREATEREGION WBorder (PLUS (LLSH EDITBG.PIXELSIZE 2) WBorder) (DIFFERENCE (LLSH EDITBG.PIXELSIZE 2) WBorder) (FONTPROP DEFAULTFONT 'HEIGHT]) (RPAQ? EDITBG.BORDERREC [create EDITBG.RECORD REGION _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5) 2) 2 (LLSH EDITBG.PIXELSIZE 3) (LLSH EDITBG.PIXELSIZE 2)) GRIDSPEC _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5) 2) 2 EDITBG.PIXELSIZE (LLSH EDITBG.PIXELSIZE 1)) BITWIDTH _ 8 BITHEIGHT _ 2 DSPREGION _ (CREATEREGION 1 (ADD1 (TIMES EDITBG.PIXELSIZE 5)) (PLUS (TIMES EDITBG.PIXELSIZE 13) 2) (SUB1 (LLSH EDITBG.PIXELSIZE 2))) NUMBEREGION _ (CREATEREGION (PLUS (TIMES EDITBG.PIXELSIZE 5) WBorder) (PLUS (LLSH EDITBG.PIXELSIZE 2) WBorder) (DIFFERENCE (LLSH EDITBG.PIXELSIZE 3) WBorder) (FONTPROP DEFAULTFONT 'HEIGHT]) (RPAQ? EDITBG.BUTTONREGION (CREATEREGION (PLUS 2 (LLSH EDITBG.PIXELSIZE 2)) (PLUS 2 (LLSH EDITBG.PIXELSIZE 2)) (SUB1 EDITBG.PIXELSIZE) (SUB1 EDITBG.PIXELSIZE))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EDITBG.BUTTONREGION EDITBG.BORDERREC EDITBG.SHADEREC EDITBG.PIXELSIZE) ) (PUTPROPS EDITBG COPYRIGHT ("Stanford University" 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5943 11841 (EDITBACKGROUND 5953 . 7731) (EDITBG.BUTTONFN 7733 . 11839))))) STOP \ No newline at end of file diff --git a/lispusers/EDITBG.TEDIT b/lispusers/EDITBG.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..521283d101582610a680a41622e7776860bbc641 GIT binary patch literal 15150 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.;2 42108 changes to: (FNS COPYFONT) previous date: " 7-Feb-86 11:05:47" {ERIS}EDITFONT.;1) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT EDITFONTCOMS) (RPAQQ EDITFONTCOMS ((* EDITFONT -- By Kelly Roach. Need to LOAD EXPORTS.ALL and LOADFROM FONT in order to compile this file. *) (CONSTANTS (BITSPERWORD 16) (BYTESPERWORD 2) (MAXCODE 255) (DUMMYINDEX 256)) (INITVARS (EF.MENU NIL) (EF.TITLEMENU NIL)) (RECORDS CHARITEM) (FNS EF.INIT EF.EDIT EF.PROMPT EF.MESSAGE EF.CLOSEFN EF.CHARITEMS EF.BUTTONEVENTFN EF.WHENSELECTEDFN EF.EDITBM EF.MIDDLEBUTTONFN EF.CHANGESIZE EF.DELETE EF.ENTER EF.REPLACE EF.SAVE EF.BLANK COPYFONT READSTRIKEFONTFILE WRITESTRIKEFONTFILE) (FNS BLANKFONTCREATE EDITFONT) (P (EF.INIT)))) (* EDITFONT -- By Kelly Roach. Need to LOAD EXPORTS.ALL and LOADFROM FONT in order to compile this file. *) (DECLARE: EVAL@COMPILE (RPAQQ BITSPERWORD 16) (RPAQQ BYTESPERWORD 2) (RPAQQ MAXCODE 255) (RPAQQ DUMMYINDEX 256) (CONSTANTS (BITSPERWORD 16) (BYTESPERWORD 2) (MAXCODE 255) (DUMMYINDEX 256)) ) (RPAQ? EF.MENU NIL) (RPAQ? EF.TITLEMENU NIL) [DECLARE: EVAL@COMPILE (RECORD CHARITEM (BITMAP (CHARCODE DUMMYFLG))) ] (DEFINEQ (EF.INIT (LAMBDA NIL (* kbr: "21-Oct-85 15:50") (PROG NIL (SETQ EF.MENU (create MENU ITEMS _(QUOTE ((CHANGESIZE (QUOTE EF.CHANGESIZE) "Change size of character.") (DELETE (QUOTE (QUOTE EF.DELETE)) "Delete character.") (EDITBM (QUOTE (QUOTE EF.EDITBM)) "Edit character.") (REPLACE (QUOTE (QUOTE EF.REPLACE)) "Prompt for bitmap to replace character."))))) (SETQ EF.TITLEMENU (create MENU ITEMS _(QUOTE ((SAVE (QUOTE EF.SAVE) "Save EDITFONT's work back into font.")))))) )) (EF.EDIT (LAMBDA (FONT FROMCHAR8CODE TOCHAR8CODE CHARSET) (* kbr: "21-Oct-85 15:35") (* Edit FONT. *) (COND ((NULL FROMCHAR8CODE) (SETQ FROMCHAR8CODE 0))) (COND ((NULL TOCHAR8CODE) (SETQ TOCHAR8CODE 255))) (COND ((NULL CHARSET) (SETQ CHARSET 0))) (PROG (CHARITEMS MENU TITLE HEIGHT WIDTH REGION POS WINDOW) (COND ((FONTP FONT) (SETQ CHARITEMS (EF.CHARITEMS FONT FROMCHAR8CODE TOCHAR8CODE CHARSET)) (SETQ MENU (create MENU MENUFONT _ FONT CENTERFLG _ T MENUCOLUMNS _ 16 ITEMS _ CHARITEMS WHENSELECTEDFN _(FUNCTION EF.WHENSELECTEDFN))) (SETQ TITLE (PACK* (FONTPROP FONT (QUOTE FAMILY)) (FONTPROP FONT (QUOTE SIZE)) (PACKC (for ATOM in (FONTPROP FONT (QUOTE FACE)) collect (CHCON1 ATOM))))) (SETQ HEIGHT (HEIGHTIFWINDOW (fetch (MENU IMAGEHEIGHT) of MENU) T)) (SETQ WIDTH (WIDTHIFWINDOW (fetch (MENU IMAGEWIDTH) of MENU))) (SETQ POS (GETBOXPOSITION WIDTH HEIGHT)) (SETQ REGION (create REGION LEFT _(fetch (POSITION XCOORD) of POS) BOTTOM _(fetch (POSITION YCOORD) of POS) WIDTH _ WIDTH HEIGHT _ HEIGHT)) (SETQ WINDOW (CREATEW REGION TITLE)) (WINDOWPROP WINDOW (QUOTE CHARITEMS) CHARITEMS) (ADDMENU MENU WINDOW (create POSITION XCOORD _ 0 YCOORD _ 0)) (WINDOWPROP WINDOW (QUOTE BUTTONEVENTFN) (QUOTE EF.BUTTONEVENTFN))) (T (ERROR "Can't edit " FONT)))))) (EF.PROMPT (LAMBDA (STRING WINDOW) (* kbr: "16-Oct-85 22:48") (PROG (PROMPTW ANSWER) (SETQ PROMPTW (GETPROMPTWINDOW WINDOW)) (CLEARW PROMPTW) (PRIN1 STRING PROMPTW) (PRIN1 " " PROMPTW) (SETQ ANSWER (RESETLST (RESETSAVE (TTYDISPLAYSTREAM PROMPTW)) (RESETSAVE (TTY.PROCESS (THIS.PROCESS))) (TTYINREAD PROMPTW))) (TERPRI PROMPTW) (SETQ ANSWER (EVAL ANSWER)) (RETURN ANSWER)))) (EF.MESSAGE (LAMBDA (STRING WINDOW) (* kbr: "16-Oct-85 22:50") (PROG (PROMPTW) (SETQ PROMPTW (GETPROMPTWINDOW WINDOW)) (PRIN1 STRING PROMPTW)))) (EF.CLOSEFN (LAMBDA (WINDOW) (* kbr: "15-Dec-84 15:20") (* Close EF Window. *) (PROG NIL (COND ((EQ (ASKUSER "Close Editfont Window?") (QUOTE N)) (RETURN (QUOTE DON'T)))) (CLOSEW WINDOW) (* Break circularity. *) (WINDOWPROP WINDOW (QUOTE MENU) NIL)))) (EF.CHARITEMS (LAMBDA (FONT FROMCHAR8CODE TOCHAR8CODE CHARSET) (* kbr: "16-Oct-85 23:11") (* Get CHARITEMS for FONT. *) (PROG (FROMCHARCODE TOCHARCODE OFFSETS DUMMYOFFSET DUMMYBITMAP OFFSET BITMAP CHARITEM CHARITEMS) (* Get DUMMY CHARITEM *) (* Interlisp assuming 256 is dummy is dumb now because of NS chars. Maybe Kaplan and Nuyens will fix. *) (SETQ DUMMYBITMAP (GETCHARBITMAP 256 FONT)) (SETQ CHARITEM (create CHARITEM BITMAP _ DUMMYBITMAP CHARCODE _ DUMMYINDEX DUMMYFLG _ T)) (push CHARITEMS CHARITEM) (* Get ordinairy CHARITEMs. *) (SETQ FROMCHARCODE (IPLUS (ITIMES 256 CHARSET) FROMCHAR8CODE)) (SETQ TOCHARCODE (IPLUS (ITIMES 256 CHARSET) TOCHAR8CODE)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of (\GETCHARSETINFO CHARSET FONT))) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS DUMMYINDEX)) (for I from TOCHARCODE to FROMCHARCODE by -1 do (SETQ OFFSET (\FGETOFFSET OFFSETS I)) (COND ((EQ OFFSET DUMMYOFFSET) (SETQ CHARITEM (create CHARITEM BITMAP _ DUMMYBITMAP CHARCODE _ I DUMMYFLG _ T))) (T (SETQ BITMAP (GETCHARBITMAP I FONT)) (SETQ CHARITEM (create CHARITEM BITMAP _ BITMAP CHARCODE _ I DUMMYFLG _ NIL)))) (push CHARITEMS CHARITEM)) (* OKEY DOKEY *) (RETURN CHARITEMS)))) (EF.BUTTONEVENTFN (LAMBDA (WINDOW) (* kbr: "16-Oct-85 22:19") (PROG (COMMAND) (COND ((INSIDEP (DSPCLIPPINGREGION NIL WINDOW) (LASTMOUSEX WINDOW) (LASTMOUSEY WINDOW)) (MENUBUTTONFN WINDOW)) ((SETQ COMMAND (MENU EF.TITLEMENU)) (APPLY* COMMAND WINDOW)))))) (EF.WHENSELECTEDFN (LAMBDA (CHARITEM MENU KEY) (* kbr: "16-Oct-85 22:26") (PROG NIL (COND (CHARITEM (SELECTQ KEY (LEFT (EF.EDITBM CHARITEM MENU)) (MIDDLE (EF.MIDDLEBUTTONFN CHARITEM MENU)) (* Do nothing. *))))))) (EF.EDITBM (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (PROG (BITMAP CHARCODE DUMMYFLG) (RESETLST (RESETSAVE (SHADEITEM CHARITEM MENU BLACKSHADE) (BQUOTE (SHADEITEM (\, CHARITEM) (\, MENU) (\, WHITESHADE)))) (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (COND ((AND (NOT (IEQP (fetch (CHARITEM CHARCODE) of CHARITEM) DUMMYINDEX)) (fetch (CHARITEM DUMMYFLG) of CHARITEM)) (* Undummify this CHARITEM. *) (SETQ BITMAP (COPYALL BITMAP)) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with BITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)))) (EDITBM BITMAP)) (* Update MENU image. SHADEITEM's side effects above suffice if we only changed one menu item. (I.e. we edited an ordinairy CHARITEM.) *) (COND ((IEQP (fetch (CHARITEM CHARCODE) of CHARITEM) DUMMYINDEX) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))))) (EF.MIDDLEBUTTONFN (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (PROG (COMMAND) (SETQ COMMAND (MENU EF.MENU)) (COND (COMMAND (APPLY* COMMAND CHARITEM MENU)))))) (EF.CHANGESIZE (LAMBDA (CHARITEM MENU) (* kbr: "16-Oct-85 23:03") (* Change height & width of CHARITEM's BITMAP *) (PROG (HEIGHT WIDTH NEWBITMAP WINDOW) (SETQ WINDOW (WFROMMENU MENU)) (SETQ HEIGHT (EF.PROMPT "New height?" WINDOW)) (COND ((NULL HEIGHT) (EF.MESSAGE "Aborted." WINDOW) (RETURN))) (SETQ HEIGHT (EVAL HEIGHT)) (SETQ WIDTH (EF.PROMPT "New width?" WINDOW)) (COND ((NULL WIDTH) (EF.MESSAGE "Aborted." WINDOW) (RETURN))) (SETQ WIDTH (EVAL WIDTH)) (SETQ NEWBITMAP (BITMAPCREATE WIDTH HEIGHT)) (BITBLT (fetch (CHARITEM BITMAP) of CHARITEM) NIL NIL NEWBITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with NEWBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))) (EF.DELETE (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (* Turn CHARITEM into dummy charitem. *) (PROG (WINDOW CHARITEMS DUMMYBITMAP) (SETQ WINDOW (WFROMMENU MENU)) (SETQ CHARITEMS (WINDOWPROP WINDOW (QUOTE CHARITEMS))) (SETQ DUMMYBITMAP (fetch (CHARITEM BITMAP) of (CAR (LAST CHARITEMS)))) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with DUMMYBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with T)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))))) (EF.ENTER (LAMBDA (CHARITEM MENU) (* kbr: "15-Dec-84 15:20") (* Enter BITMAP of CHARITEM. *) (PROG (NEWBITMAP) (SETQ NEWBITMAP (EF.PROMPT "Enter new bitmap (evaluated):")) (COND ((NULL NEWBITMAP) (printout T "Aborted." T)) ((type? BITMAP NEWBITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with NEWBITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))) (T (LISPERROR "ILLEGAL ARG" NEWBITMAP)))))) (EF.REPLACE (LAMBDA (CHARITEM MENU) (* kbr: "16-Oct-85 23:04") (* Replace BITMAP of CHARITEM. *) (PROG (BITMAP WINDOW) (SETQ WINDOW (WFROMMENU MENU)) (SETQ BITMAP (EF.PROMPT "New bitmap?" WINDOW)) (COND ((NULL BITMAP) (EF.MESSAGE "Aborted." WINDOW)) ((type? BITMAP BITMAP) (UNINTERRUPTABLY (replace (CHARITEM BITMAP) of CHARITEM with BITMAP) (replace (CHARITEM DUMMYFLG) of CHARITEM with NIL)) (UPDATE/MENU/IMAGE MENU) (REDISPLAYW (WFROMMENU MENU))) (T (LISPERROR "ILLEGAL ARG" BITMAP)))))) (EF.SAVE (LAMBDA (WINDOW) (* kbr: "21-Oct-85 15:39") (* Save EDITFONT changes to FONT. *) (PROG (CHARITEMS FONT CB CBWIDTH CBHEIGHT WIDTHS OFFSETS HEIGHT WIDTH DUMMYOFFSET OFFSET BITMAP FIRSTCHAR LASTCHAR CHARSET CSINFO) (SETQ CHARITEMS (WINDOWPROP WINDOW (QUOTE CHARITEMS))) (SETQ FONT (WINDOWPROP WINDOW (QUOTE FONT))) (* New allocations. *) (SETQ CBWIDTH 0) (SETQ CBHEIGHT 0) (for I from 0 to DUMMYINDEX as CHARITEM in CHARITEMS when (OR (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM)) (IEQP I DUMMYINDEX)) do (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (SETQ CBWIDTH (IPLUS CBWIDTH (fetch (BITMAP BITMAPWIDTH ) of BITMAP))) (SETQ CBHEIGHT (IMAX CBHEIGHT (fetch (BITMAP BITMAPHEIGHT ) of BITMAP)))) (SETQ CSINFO (create CHARSETINFO CHARSETASCENT _(fetch (FONTDESCRIPTOR \SFAscent) of FONT) CHARSETDESCENT _(fetch (FONTDESCRIPTOR \SFDescent) of FONT))) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (* Store new info in allocations. *) (SETQ OFFSET 0) (SETQ DUMMYOFFSET (IDIFFERENCE CBWIDTH (fetch (BITMAP BITMAPWIDTH) of (fetch (CHARITEM BITMAP) of (CAR (LAST CHARITEMS)))))) (SETQ CB (BITMAPCREATE CBWIDTH CBHEIGHT)) (for I from 0 to DUMMYINDEX as CHARITEM in CHARITEMS do (SETQ BITMAP (fetch (CHARITEM BITMAP) of CHARITEM)) (SETQ WIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP)) (SETQ HEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) (\FSETWIDTH WIDTHS I WIDTH) (COND ((AND (fetch (CHARITEM DUMMYFLG) of CHARITEM) (NOT (IEQP I DUMMYINDEX))) (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (T (\FSETOFFSET OFFSETS I OFFSET) (BITBLT BITMAP 0 0 CB OFFSET 0 WIDTH HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (SETQ OFFSET (IPLUS OFFSET WIDTH))))) (* FIRSTCHAR & LASTCHAR. (I wonder what you're suppose to do if there aren't any chars?) *) (SETQ FIRSTCHAR (\CHAR8CODE (fetch (CHARITEM CHARCODE) of (for CHARITEM in CHARITEMS thereis (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM))) ))) (SETQ LASTCHAR (\CHAR8CODE (fetch (CHARITEM CHARCODE) of (for CHARITEM in (REVERSE CHARITEMS) thereis (NOT (fetch (CHARITEM DUMMYFLG) of CHARITEM)))) )) (SETQ CHARSET (\CHARSET (fetch (CHARITEM CHARCODE) of (CAR CHARITEMS)))) (* Store new info. *) (UNINTERRUPTABLY (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with CB) (replace (CHARSETINFO WIDTHS) of CSINFO with WIDTHS) (replace (CHARSETINFO OFFSETS) of CSINFO with OFFSETS) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with WIDTHS)) (* OKEY DOKEY. *) ))) (EF.BLANK (LAMBDA (FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH) (* kbr: "21-Oct-85 15:25") (PROG (FONT CSINFO WIDTHS DUMMYWIDTH OFFSETS DUMMYOFFSET CB CBWIDTH CBHEIGHT) (SETQ FAMILY (U-CASE FAMILY)) (COND ((NOT (FIXP SIZE)) (LISPERROR "ILLEGAL ARG" SIZE))) (SETQ FACE (\FONTFACE FACE)) (COND ((NOT (SMALLP FIRSTCHAR)) (LISPERROR "ILLEGAL ARG" FIRSTCHAR))) (COND ((NOT (SMALLP LASTCHAR)) (LISPERROR "ILLEGAL ARG" LASTCHAR))) (COND ((NOT (SMALLP ASCENT)) (LISPERROR "ILLEGAL ARG" ASCENT))) (COND ((NOT (SMALLP DESCENT)) (LISPERROR "ILLEGAL ARG" DESCENT))) (COND ((NOT (OR (FIXP WIDTH) (AND (LISTP WIDTH) (NOT (for W in WIDTH thereis (NOT (FIXP W)))) (IEQP (LENGTH WIDTH) (IPLUS LASTCHAR (IMINUS FIRSTCHAR) 1 1))))) (LISPERROR "ILLEGAL ARG" WIDTH))) (* WIDTHS. *) (SETQ CSINFO (create CHARSETINFO CHARSETASCENT _ ASCENT CHARSETDESCENT _ DESCENT)) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (COND ((LISTP WIDTH) (SETQ DUMMYWIDTH (CAR (LAST WIDTH))) (for I from 0 to (SUB1 FIRSTCHAR) do (\FSETWIDTH WIDTHS I DUMMYWIDTH)) (for I from FIRSTCHAR to LASTCHAR as W in WIDTH do (\FSETWIDTH WIDTHS I W)) (for I from (ADD1 LASTCHAR) to DUMMYINDEX do (\FSETWIDTH WIDTHS I DUMMYWIDTH))) (T (for I from 0 to DUMMYINDEX do (\FSETWIDTH WIDTHS I WIDTH)))) (* OFFSETS. *) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (for I from FIRSTCHAR to (ADD1 LASTCHAR) do (\FSETOFFSET OFFSETS (ADD1 I) (IPLUS (\FGETOFFSET OFFSETS I) (\FGETWIDTH WIDTHS I)))) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS (ADD1 LASTCHAR))) (for I from 0 to (SUB1 FIRSTCHAR) do (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (for I from (ADD1 LASTCHAR) to DUMMYINDEX do (\FSETOFFSET OFFSETS I DUMMYOFFSET)) (* Characterbitmap CB. *) (SETQ CBHEIGHT (IPLUS ASCENT DESCENT)) (SETQ CBWIDTH (IPLUS (\FGETOFFSET OFFSETS DUMMYINDEX) (\FGETWIDTH WIDTHS DUMMYINDEX))) (SETQ CB (BITMAPCREATE CBWIDTH CBHEIGHT)) (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with CB) (* FONT. *) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) of CSINFO)) (SETQ FONT (create FONTDESCRIPTOR FONTDEVICE _(QUOTE DISPLAY) FONTFAMILY _ FAMILY FONTSIZE _ SIZE FONTFACE _ FACE \SFAscent _ 0 \SFDescent _ 0 \SFHeight _ 0 ROTATION _ 0 FONTDEVICESPEC _(LIST FAMILY SIZE FACE 0 (QUOTE DISPLAY)))) (replace (FONTDESCRIPTOR \SFAscent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFAscent) of FONT) (fetch (CHARSETINFO CHARSETASCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFDescent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFDescent) of FONT) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFHeight) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFHeight) of FONT) (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT) 0 CSINFO) (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) (RETURN FONT)))) (COPYFONT (LAMBDA (FONT) (* jds "26-Aug-86 16:01") (PROG (NEWFONT NEWCHARSETVECTOR OLDCHARSETVECTOR NEWCSINFO OLDCSINFO) (SETQ NEWFONT (create FONTDESCRIPTOR using FONT)) (SETQ NEWCHARSETVECTOR (\ALLOCBLOCK (ADD1 \MAXCHARSET) T)) (SETQ OLDCHARSETVECTOR (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT)) (for CHARSET from 0 to \MAXCHARSET do (SETQ OLDCSINFO (\GETBASEPTR OLDCHARSETVECTOR (UNFOLD CHARSET 2))) (COND (OLDCSINFO (SETQ NEWCSINFO (create CHARSETINFO CHARSETASCENT _ (fetch (CHARSETINFO CHARSETASCENT) of OLDCSINFO) CHARSETDESCENT _ (fetch (CHARSETINFO CHARSETDESCENT) of OLDCSINFO) CHARSETBITMAP _ (COPYALL (fetch (CHARSETINFO CHARSETBITMAP) of OLDCSINFO)))) (\BLT (fetch (CHARSETINFO WIDTHS) of NEWCSINFO) (fetch (CHARSETINFO WIDTHS) of OLDCSINFO) (ADD1 DUMMYINDEX)) (\BLT (fetch (CHARSETINFO OFFSETS) of NEWCSINFO) (fetch (CHARSETINFO OFFSETS) of OLDCSINFO) (ADD1 DUMMYINDEX)) (replace (CHARSETINFO IMAGEWIDTHS) of NEWCSINFO with (fetch (CHARSETINFO WIDTHS) of NEWCSINFO)) (\RPLPTR NEWCHARSETVECTOR (UNFOLD CHARSET 2) NEWCSINFO)))) (RETURN NEWFONT)))) (READSTRIKEFONTFILE (LAMBDA (FAMILY SIZE FACE FILE FONT CHARSET) (* kbr: "14-Oct-85 11:16") (* Very similar to \READSTRIKEFONTFILE of SOURCES>FONT. Returns fontdescriptor FONT. *) (PROG (STRM CSINFO NUMBCODES RW BITMAP OFFSETS FIRSTCHAR LASTCHAR HEIGHT WIDTHS) (* This part imitates \READSTRIKEFONTFILE *) (SETQ STRM (OPENSTREAM FILE (QUOTE INPUT) (QUOTE OLD))) (SETQ CSINFO (create CHARSETINFO)) (\WIN STRM) (SETQ FIRSTCHAR (\WIN STRM)) (* minimum ascii code) (SETQ LASTCHAR (\WIN STRM)) (* maximum ascii code) (\WIN STRM) (* MaxWidth which isn't used by anyone.) (\WIN STRM) (* number of words in this StrikeBody) (replace (CHARSETINFO CHARSETASCENT) of CSINFO with (\WIN STRM))(* ascent in scan lines (=FBBdy+FBBoy)) (replace (CHARSETINFO CHARSETDESCENT) of CSINFO with (\WIN STRM)) (* descent in scan-lines (=FBBoy)) (\WIN STRM) (* offset in bits (<0 for kerning, else 0, =FBBox)) (SETQ RW (\WIN STRM)) (* raster width of bitmap) (* height of bitmap) (SETQ HEIGHT (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (SETQ BITMAP (BITMAPCREATE (UNFOLD RW BITSPERWORD) HEIGHT)) (\BINS STRM (fetch (BITMAP BITMAPBASE) of BITMAP) 0 (UNFOLD (ITIMES RW HEIGHT) BYTESPERWORD)) (* read bits into bitmap) (replace (CHARSETINFO CHARSETBITMAP) of CSINFO with BITMAP) (SETQ NUMBCODES (IPLUS (IDIFFERENCE LASTCHAR FIRSTCHAR) 3)) (* SETQ OFFSETS (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (* initialise the offsets to 0) (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETOFFSET OFFSETS I 0)) (* AIN OFFSETS FIRSTCHAR NUMBCODES STRM) (for I from FIRSTCHAR as J from 1 to NUMBCODES do (\FSETOFFSET OFFSETS I (\WIN STRM))) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (for I from 0 to (IPLUS \MAXTHINCHAR 2) do (\FSETWIDTH WIDTHS I 0)) (* replace WIDTHS of CSINFO with (ARRAY (IPLUS \MAXCHAR 3) (QUOTE SMALLPOSP) 0 0)) (\FONTRESETCHARWIDTHS CSINFO FIRSTCHAR LASTCHAR) (replace (CHARSETINFO IMAGEWIDTHS) of CSINFO with (fetch (CHARSETINFO WIDTHS) of CSINFO)) (CLOSEF STRM) (* This part imitates \CREATEDISPLAYFONT *) (COND ((NULL CHARSET) (SETQ CHARSET 0))) (COND ((NULL FONT) (SETQ FONT (create FONTDESCRIPTOR FONTDEVICE _(QUOTE DISPLAY) FONTFAMILY _ FAMILY FONTSIZE _ SIZE FONTFACE _ FACE \SFAscent _ 0 \SFDescent _ 0 \SFHeight _ 0 ROTATION _ 0 FONTDEVICESPEC _(LIST FAMILY SIZE FACE 0 (QUOTE DISPLAY)))))) (* This part imitates \CREATECHARSET. *) (replace (FONTDESCRIPTOR \SFAscent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFAscent) of FONT) (fetch (CHARSETINFO CHARSETASCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFDescent) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFDescent) of FONT) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO))) (replace (FONTDESCRIPTOR \SFHeight) of FONT with (IMAX (fetch (FONTDESCRIPTOR \SFHeight) of FONT) (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (\SETCHARSETINFO (fetch (FONTDESCRIPTOR FONTCHARSETVECTOR) of FONT) CHARSET CSINFO) (replace (FONTDESCRIPTOR FONTAVGCHARWIDTH) of FONT with (\AVGCHARWIDTH FONT)) (RETURN FONT)))) (WRITESTRIKEFONTFILE (LAMBDA (FONT CHARSET FILE) (* kbr: "21-Oct-85 15:08") (* Write strike FILE using info in FONT. *) (PROG (STREAM CSINFO FIRSTCHAR LASTCHAR WIDTH MAXWIDTH LENGTH RASTERWIDTH DUMMYCHAR DUMMYOFFSET OFFSET PREVIOUSOFFSET WIDTH CODE) (COND ((NOT (FONTP FONT)) (LISPERROR "ILLEGAL ARG" FONT))) (COND ((NULL CHARSET) (SETQ CHARSET 0)) ((NOT (AND (IGEQ CHARSET 0) (ILESSP CHARSET \MAXCHARSET))) (LISPERROR "ILLEGAL ARG" CHARSET))) (SETQ CSINFO (\GETCHARSETINFO CHARSET FONT T)) (COND ((NULL CSINFO) (ERROR "Couldn't find charset " CHARSET))) (SETQ WIDTHS (fetch (CHARSETINFO WIDTHS) of CSINFO)) (SETQ OFFSETS (fetch (CHARSETINFO OFFSETS) of CSINFO)) (SETQ DUMMYOFFSET (\FGETOFFSET OFFSETS DUMMYINDEX)) (SETQ FIRSTCHAR (for I from 0 to MAXCODE thereis (NOT (EQ (\FGETOFFSET OFFSETS I) DUMMYOFFSET)))) (SETQ LASTCHAR (for I from MAXCODE to 0 by -1 thereis (NOT (EQ (\FGETOFFSET OFFSETS I) DUMMYOFFSET)))) (SETQ DUMMYCHAR (ADD1 LASTCHAR)) (SETQ STREAM (OPENSTREAM FILE (QUOTE OUTPUT) (QUOTE NEW) (QUOTE ((TYPE BINARY))))) (* STRIKE HEADER. *) (\WOUT STREAM 32768) (\WOUT STREAM FIRSTCHAR) (\WOUT STREAM LASTCHAR) (SETQ MAXWIDTH 0) (for I from 0 to DUMMYINDEX do (SETQ MAXWIDTH (IMAX MAXWIDTH (\FGETWIDTH WIDTHS I)))) (\WOUT STREAM MAXWIDTH) (* STRIKE BODY. *) (* Length. *) (SETQ RASTERWIDTH (fetch (BITMAP BITMAPRASTERWIDTH) of (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO))) (SETQ LENGTH (IPLUS 8 (IDIFFERENCE LASTCHAR FIRSTCHAR) (ITIMES (fetch (FONTDESCRIPTOR \SFHeight) of FONT) RASTERWIDTH))) (\WOUT STREAM LENGTH) (* Ascent, Descent, Xoffset (no longer used) and Rasterwidth. *) (\WOUT STREAM (fetch (CHARSETINFO CHARSETASCENT) of CSINFO)) (\WOUT STREAM (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)) (\WOUT STREAM 0) (\WOUT STREAM RASTERWIDTH) (* Bitmap. *) (\BOUTS STREAM (fetch (BITMAP BITMAPBASE) of (fetch (CHARSETINFO CHARSETBITMAP) of CSINFO)) 0 (ITIMES 2 RASTERWIDTH (IPLUS (fetch (CHARSETINFO CHARSETASCENT) of CSINFO) (fetch (CHARSETINFO CHARSETDESCENT) of CSINFO)))) (* Offsets. *) (SETQ CODE 0) (\WOUT STREAM CODE) (for I from FIRSTCHAR to DUMMYCHAR do (SETQ OFFSET (\FGETOFFSET OFFSETS I)) (SETQ WIDTH (\FGETWIDTH WIDTHS I)) (COND ((AND (IEQP OFFSET DUMMYOFFSET) (NOT (IEQP I DUMMYCHAR))) (* CODE stays the same. *) ) (T (SETQ CODE (IPLUS CODE WIDTH)))) (\WOUT STREAM CODE)) (CLOSEF STREAM)))) ) (DEFINEQ (BLANKFONTCREATE (LAMBDA (FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH) (* mjs "27-Mar-85 14:48") (EF.BLANK FAMILY SIZE FACE FIRSTCHAR LASTCHAR ASCENT DESCENT WIDTH))) (EDITFONT (LAMBDA (FONT FROMCHARCODE TOCHARCODE) (* mjs "27-Mar-85 14:48") (EF.EDIT FONT FROMCHARCODE TOCHARCODE))) ) (EF.INIT) (PUTPROPS EDITFONT COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (1490 41501 (EF.INIT 1500 . 2609) (EF.EDIT 2611 . 4889) (EF.PROMPT 4891 . 5533) ( EF.MESSAGE 5535 . 5828) (EF.CLOSEFN 5830 . 6579) (EF.CHARITEMS 6581 . 9239) (EF.BUTTONEVENTFN 9241 . 9736) (EF.WHENSELECTEDFN 9738 . 10300) (EF.EDITBM 10302 . 12192) (EF.MIDDLEBUTTONFN 12194 . 12522) ( EF.CHANGESIZE 12524 . 13795) (EF.DELETE 13797 . 14715) (EF.ENTER 14717 . 15618) (EF.REPLACE 15620 . 16549) (EF.SAVE 16551 . 21425) (EF.BLANK 21427 . 26773) (COPYFONT 26775 . 29227) (READSTRIKEFONTFILE 29229 . 36752) (WRITESTRIKEFONTFILE 36754 . 41499)) (41502 42014 (BLANKFONTCREATE 41512 . 41779) ( EDITFONT 41781 . 42012))))) STOP \ No newline at end of file diff --git a/lispusers/EDITKEYS b/lispusers/EDITKEYS new file mode 100644 index 00000000..3044b468 --- /dev/null +++ b/lispusers/EDITKEYS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP") (FILECREATED " 9-Feb-87 21:28:31" {ERIS}LYRIC>EDITKEYS.;2 5949 previous date%: " 5-Nov-85 15:37:40" {ERIS}LYRIC>EDITKEYS.;1) (* " Copyright (c) 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT EDITKEYSCOMS) (RPAQQ EDITKEYSCOMS ((VARS KEY.TEMPLATE) (FNS BUILDFNKEYS KEY.BITMAP) (P (* could have (STRIKEOUT)) (BUILDFNKEYS '((BOLD BOLD) (ITALICS ITALICS) (UNDERLINE (UNDER- LINE)) (SUPERSCRIPT (SUPER/ SUB)) (LARGER (LARGER SMALLER)) (DEFAULTS DEFAULTS) (CASE CASE) (CENTER JUSTIFY) (AGAIN REDO) (HELP HELP)) '(Function Keys) 1)))) (RPAQQ KEY.TEMPLATE #*(78 48)OOOOOOOOOOOOOOOOOOOLON@@@@@@@@@@@@@@@AOLO@@@@@@@@@@@@@@@@@CLO@@@@@@@@@@@@@@@@@CLMH@@@@@@@@@@@@@@@@DLNLGOOOOOOOOOOOOOOHHLMFL@@@@@@@@@@@@@@M@LJK@@@@@@@@@@@@@@@B@DMF@@@@@@@@@@@@@@@A@DJN@@@@@@@@@@@@@@@AHDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMD@@@@@@@@@@@@@@@@HDJL@@@@@@@@@@@@@@@@HDMF@@@@@@@@@@@@@@@AHDJJ@@@@@@@@@@@@@@@A@DMG@@@@@@@@@@@@@@@B@DNEL@@@@@@@@@@@@@@O@LLIGOOOOOOOOOOOOOOMHLOBBJJJJJJJJJJJJJJJLLNDEEEEEEEEEEEEEEEEGLOHJJJJJJJJJJJJJJJJKLOLEEEEEEEEEEEEEEEEOLOOOOOOOOOOOOOOOOOOOL ) (DEFINEQ (BUILDFNKEYS [LAMBDA (KEYS TITLE NROWS) (* lmm " 5-Nov-85 15:35") (SHRINKW (ADDMENU [create MENU ITEMS _ [for KEY in KEYS collect (LIST (KEY.BITMAP (CADR KEY)) (LET [(KEYN (OR (SMALLP (CAR KEY)) (\KEYNAMETONUMBER (CAR KEY] (for LST in (LIST \DOVEKEYACTIONS \DLIONKEYACTIONS \ORIGKEYACTIONS) do (AND [SETQ $$VAL (for KEY in LST when (EQ (OR (SMALLP (CAR KEY)) (\KEYNAMETONUMBER (CAR KEY))) KEYN) do (RETURN (CADR KEY] (RETURN (LIST (OR (SMALLP (CAR $$VAL)) (CHARCODE.DECODE (CAR $$VAL))) (OR (SMALLP (CADR $$VAL)) (CHARCODE.DECODE (CADR $$VAL] TITLE _ (SUBSTRING TITLE 2 -2) MENUROWS _ NROWS WHENSELECTEDFN _ (FUNCTION (LAMBDA (X) (BKSYSCHARCODE (if (SHIFTDOWNP 'SHIFT) then (CADR (CADR X)) else (CAR (CADR X] NIL (create POSITION XCOORD _ (PLUS (DIFFERENCE (QUOTIENT SCREENWIDTH 2) (QUOTIENT (TIMES (BITMAPWIDTH KEY.TEMPLATE) (LENGTH KEYS)) 2)) (TIMES 2 WBorder)) YCOORD _ 0)) (KEY.BITMAP TITLE) '(0 . 0]) (KEY.BITMAP [LAMBDA (X) (* lmm " 5-Nov-85 14:04") (PROG ((BITMAP (BITMAPCOPY KEY.TEMPLATE)) DS QUARTER REGION) (SETQ DS (DSPCREATE BITMAP)) (DSPFONT MENUFONT DS) (COND ((LISTP X) (* this is supposed to have two labels, one on top of the other) (SETQ QUARTER (IQUOTIENT (BITMAPHEIGHT BITMAP) 4)) (CENTERPRINTINREGION (CADR X) (SETQ REGION (create REGION LEFT _ 0 BOTTOM _ QUARTER WIDTH _ (BITMAPWIDTH BITMAP) HEIGHT _ QUARTER)) DS) (replace BOTTOM of REGION with (ITIMES 2 QUARTER)) (CENTERPRINTINREGION (CAR X) REGION DS)) (T (CENTERPRINTINREGION X (create REGION LEFT _ 0 BOTTOM _ 0 WIDTH _ (BITMAPWIDTH BITMAP) HEIGHT _ (BITMAPHEIGHT BITMAP)) DS))) (RETURN BITMAP]) ) (* could have (STRIKEOUT)) (BUILDFNKEYS '((BOLD BOLD) (ITALICS ITALICS) (UNDERLINE (UNDER- LINE)) (SUPERSCRIPT (SUPER/ SUB)) (LARGER (LARGER SMALLER)) (DEFAULTS DEFAULTS) (CASE CASE) (CENTER JUSTIFY) (AGAIN REDO) (HELP HELP)) '(Function Keys) 1) (PUTPROPS EDITKEYS COPYRIGHT ("Xerox Corporation" 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2077 5483 (BUILDFNKEYS 2087 . 4099) (KEY.BITMAP 4101 . 5481))))) STOP \ No newline at end of file diff --git a/lispusers/EDITKEYS.TEDIT b/lispusers/EDITKEYS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..32ed4d68b3896719ca7ba6a299a6c46bfb1b3243 GIT binary patch literal 3774 zcmeHJPj4GV6d${Z?T}icRS`Wt84znJvSPs;@0#6plK=-c_SjzP>_)qr zw&B9PH%@#7R5+9q6(=r8`5gTO<$`hxZ)Ruhq=XibphD^>+5OFL-oJUz@7c`%@$N4{ zv_M;$vqg99Vy#%L7mL+mampY@X8q_EfbNFj5p>+h^J5l*lA_9i`{51?gZq_!uwS04 z!a*3^^#&{g7a|rzFoe=17APyiNGibT~fK9x>2c=qF zZj@no==Wp3=QA!UHQLvJ$Rcev;IgWw*%;xP!t2qqpn z|kjIEQ>!;wIaF~XV0%VvP=dW9 z?1Rxrv?+ev_XF%XP$q1MZ5_hCHyBJ(cJDBb1HX)|7h&^@?!YE{Hv(@Tn^N>I12!D8 zz8DF@1-Hvv2s;+LDUAZ#9B0Ca`7Ctf#8Tw$Gw6@q(CzaP)DO^ui((iPI+@BwXibp3 z$16B77(_9*kvM>8>|x}5o`B-ULNfNyGPjf54Si2=W*r{j1aLz zTB>fETQ(>k_tX|Nso_wIw#v}lR4sX8_qgw-rF9)Nq#3t0TU*yDnC&*$RHsd+i;*~D z-?dB!3EE0ddBD|WXsaDf--V9ZqLu;XZEES7Aq_Z|wnfceqTVx5VtPh*x~gGorU4e+ z=;^8jwr+Ombhk~ljZFtS_?6V_@W7~*dhXfO64~L|vz=WG7f~70W_46d&mZ!JiK(vD zpfdh!&~f9lGNPMNvW&xw#7U z8>_IoyquUXqvl05=JFNLse{EpkyrJ*sD7fJqG&6tuZs3RX}XtJv~pR@)_IaAHI6dJ zhzQAEnnRp9PJWvSkqaJ6oI{N(_?pXJxzLL@MuXB-a%7h0TguO%El-y{p0RKHCft*Me3ooLMCOWc5$Pm~+2B!KS( zGd<#h3-~XC$P%udMWMw_tEbb-26fs-=E5MPDPDfA!Y%!`iu@8Hb{;c#&WY!RFiWb8 zJym>B?0>4rGrPo{r&-|HJv~d{LH04`^YVJfT>mJ^=gMD7D4NQAan=-XV^KW>^Y_Wy HU;gwv%_aRo literal 0 HcmV?d00001 diff --git a/lispusers/EMACS b/lispusers/EMACS new file mode 100644 index 00000000..4b9abe8a --- /dev/null +++ b/lispusers/EMACS @@ -0,0 +1 @@ +(FILECREATED "27-Jul-86 17:26:37" {ERIS}LISPCORE>EMACS.;7 102965 changes to: (FNS EMACS.OPERATE) previous date: "12-Jul-86 16:55:09" {ERIS}LISPCORE>EMACS.;6) (* Copyright (c) 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT EMACSCOMS) (RPAQQ EMACSCOMS ((* EMACS -- By Kelly Roach *) (COMS (* EMACS *) (INITVARS (BytesPerPage 512) (EMACS.COMMANDS NIL) (EMACS.MCOMMANDS NIL) (EMACS.XCOMMANDS NIL) (EMACS.LIST '((1 EMACS.GOTO.BOL) (2 EMACS.BACK.BYTE) (4 EMACS.FWD.DELETE.BYTE) (5 EMACS.GOTO.EOL) (6 EMACS.FWD.BYTE) (9 EMACS.TAB) (11 EMACS.KILL.LINE) (12 EMACS.REDISPLAY) (14 EMACS.NEXT.LINE) (16 EMACS.PREVIOUS.LINE) (17 EMACS.QUOTE.BYTE) (19 EMACS.SEARCH) (20 EMACS.TRANSPOSE.BYTES) (22 EMACS.NEXT.SCREENFULL) (24 EMACS.CX) (26 EMACS.CZ) (41 EMACS.RPAREN) (93 EMACS.RBRACKET) (125 EMACS.RBRACE) (127 EMACS.BACK.DELETE.BYTE))) (EMACS.MLIST '((1 EMACS.GOTO.BOD) (2 EMACS.SAFE.BACK.SEXPR) (5 EMACS.GOTO.EOD) (6 EMACS.FWD.SEXPR) (11 EMACS.KILL.SEXPR) (60 EMACS.GOTO.BOF) (62 EMACS.GOTO.EOF) (66 EMACS.BACK.WORD) (68 EMACS.FWD.DELETE.WORD) (69 EMACS.EDIT) (70 EMACS.FWD.WORD) (71 EMACS.GRIND) (52 EMACS.SNARF) (86 EMACS.PREVIOUS.SCREENFULL) (94 EMACS.JOIN.LINES) (127 EMACS.BACK.DELETE.WORD))) (EMACS.XLIST '((22 EMACS.CXCV) (23 EMACS.CXCW) (26 EMACS.CXCZ))) (\BQUOTE.LEVEL 0)) (RECORDS EMACSSTREAM) (FNS EMACS.INIT EMACS.INIT.BACKGROUND DEDITEmacs EMACS.INIT.COMMANDS EMACS.COMMAND EMACS.OPERATE EMACS.GETKEY EMACS EMACS.PROCESS EMACS.TEDIT1 EMACS.WINDOW EMACS.SETFILEPTR EMACS.GETCARETPTR EMACS.SETCARETPTR EMACS.SHOWCARET EMACS.BOL EMACS.EOL EMACS.DELETE.BYTES EMACS.BOFP EMACS.EOFP EMACS.CCHAR EMACS.PEEKBIN EMACS.FBYTE EMACS.FWORD EMACS.BYTEP EMACS.FSKIP EMACS.FSKIPTO EMACS.BBYTE EMACS.BCHAR EMACS.BPEEKCHAR EMACS.BWORD EMACS.BSKIP EMACS.BSKIPTO EMACS.SET.EOF EMACS.GOTO.BOL EMACS.BACK.BYTE EMACS.FWD.DELETE.BYTE EMACS.GOTO.EOL EMACS.FWD.BYTE EMACS.KILL.LINE EMACS.DELETE.CHARS EMACS.REDISPLAY EMACS.NEXT.LINE EMACS.PREVIOUS.LINE EMACS.QUOTE.BYTE EMACS.SEARCH EMACS.TRANSPOSE.BYTES EMACS.NEXT.SCREENFULL EMACS.CXCV EMACS.CXCW EMACS.CXCZ EMACS.FWD.SEXPR EMACS.BACK.DELETE.BYTE EMACS.GOTO.BOD EMACS.BOD EMACS.GOTO.EOD EMACS.EOD EMACS.KILL.SEXPR EMACS.GOTO.BOF EMACS.GOTO.EOF EMACS.BACK.WORD EMACS.FWD.DELETE.WORD EMACS.EDIT EMACS.FWD.WORD EMACS.GRIND EMACS.SNARF EMACS.MT EMACS.PREVIOUS.SCREENFULL EMACS.JOIN.LINES EMACS.BACK.DELETE.WORD NEW.TEDIT.SELECT.LINE.SCANNER) (FNS \TEDIT1 \TEDIT.COMMAND.LOOP)) (COMS (* BALANCE *) (PROPS (ACCESSFNS EMACS.TAB) (DATATYPE EMACS.TAB) (DEFEXPR EMACS.TAB) (DEFFEXPR EMACS.TAB) (DEFVAR EMACS.TAB) (DO EMACS.TAB) (FOR EMACS.TAB) (LAMBDA EMACS.TAB) (PROG EMACS.TAB) (RECORD EMACS.TAB) (SELECT EMACS.TAB) (SELECTQ EMACS.TAB) (UNTIL EMACS.TAB) (WHILE EMACS.TAB)) (INITVARS (EMACS.DELIMS NIL) (EMACS.SDELIMS NIL) (EMACS.LDELIMS NIL) (EMACS.RDELIMS NIL) (EMACS.SCACHE NIL) (EMACS.BCACHE NIL) (EMACS.SYNTAX NIL) (EMACS.CR 1) (EMACS.WS 2) (EMACS.SD 4) (EMACS.NONCR 8) (EMACS.NONWS 16) (EMACS.NONSD 32) (EMACS.BQ 64) (EMACS.ALPHA 128) (EMACS.BD 256) (EMACS.SPACE 512)) (FNS EMACS.DELIMS EMACS.CR EMACS.RPAREN EMACS.RBRACKET EMACS.RBRACE EMACS.RANGLE EMACS.SDELIM.COMMAND EMACS.LDELIM.COMMAND EMACS.RDELIM.COMMAND EMACS.SDELIM EMACS.LDELIM EMACS.RDELIM EMACS.OPEN.STRING EMACS.CLOSE.STRING EMACS.OPEN.BALANCE EMACS.CLOSE.BALANCE EMACS.FLUSH.CACHE EMACS.SCACHE EMACS.BCACHE EMACS.SAFE.BACK.SEXPRS EMACS.SAFE.BACK.SEXPR EMACS.BACK.SEXPR EMACS.BACK.WORD EMACS.BACK.SKIPSEPRS EMACS.BACK.ESCAPEDP EMACS.TAB EMACS.TAB.INDENT EMACS.INIT.SYNTAX)) (DECLARE: DONTEVAL@LOAD DOCOPY (P (EMACS.INIT) (MOVD? 'TEDIT.SELECT.LINE.SCANNER ' OLD.TEDIT.SELECT.LINE.SCANNER) (MOVD 'NEW.TEDIT.SELECT.LINE.SCANNER ' TEDIT.SELECT.LINE.SCANNER) (MOVD 'EMACS 'TEDIT))))) (* EMACS -- By Kelly Roach *) (* EMACS *) (RPAQ? BytesPerPage 512) (RPAQ? EMACS.COMMANDS NIL) (RPAQ? EMACS.MCOMMANDS NIL) (RPAQ? EMACS.XCOMMANDS NIL) (RPAQ? EMACS.LIST '((1 EMACS.GOTO.BOL) (2 EMACS.BACK.BYTE) (4 EMACS.FWD.DELETE.BYTE) (5 EMACS.GOTO.EOL) (6 EMACS.FWD.BYTE) (9 EMACS.TAB) (11 EMACS.KILL.LINE) (12 EMACS.REDISPLAY) (14 EMACS.NEXT.LINE) (16 EMACS.PREVIOUS.LINE) (17 EMACS.QUOTE.BYTE) (19 EMACS.SEARCH) (20 EMACS.TRANSPOSE.BYTES) (22 EMACS.NEXT.SCREENFULL) (24 EMACS.CX) (26 EMACS.CZ) (41 EMACS.RPAREN) (93 EMACS.RBRACKET) (125 EMACS.RBRACE) (127 EMACS.BACK.DELETE.BYTE))) (RPAQ? EMACS.MLIST '((1 EMACS.GOTO.BOD) (2 EMACS.SAFE.BACK.SEXPR) (5 EMACS.GOTO.EOD) (6 EMACS.FWD.SEXPR) (11 EMACS.KILL.SEXPR) (60 EMACS.GOTO.BOF) (62 EMACS.GOTO.EOF) (66 EMACS.BACK.WORD) (68 EMACS.FWD.DELETE.WORD) (69 EMACS.EDIT) (70 EMACS.FWD.WORD) (71 EMACS.GRIND) (52 EMACS.SNARF) (86 EMACS.PREVIOUS.SCREENFULL) (94 EMACS.JOIN.LINES) (127 EMACS.BACK.DELETE.WORD))) (RPAQ? EMACS.XLIST '((22 EMACS.CXCV) (23 EMACS.CXCW) (26 EMACS.CXCZ))) (RPAQ? \BQUOTE.LEVEL 0) [DECLARE: EVAL@COMPILE (ACCESSFNS EMACSSTREAM ((TEXTOBJ (fetch (STREAM F3) of DATUM)) (WINDOW (fetch (TEXTOBJ SELWINDOW) of (fetch (EMACSSTREAM TEXTOBJ) of DATUM))) (SELECTION (fetch (TEXTOBJ SEL) of (fetch (EMACSSTREAM TEXTOBJ) of DATUM))) (CARETPTR (EMACS.GETCARETPTR DATUM)) (FILEPTR (GETFILEPTR DATUM)) (DIRTY (fetch (TEXTOBJ \DIRTY) of (fetch (EMACSSTREAM TEXTOBJ) of DATUM))) (BCACHE (EMACS.BCACHE DATUM)) (SCACHE (EMACS.SCACHE DATUM)))) ] (DEFINEQ (EMACS.INIT (LAMBDA NIL (* kbr: "12-Jul-86 16:54") (* Initializes EMACS.  *) (PROG NIL (SETQ TEDIT.INTERRUPTS (QUOTE ((7 HELP)))) (SETQ EMACS.READTABLE (COPYREADTABLE FILERDTBL)) (EMACS.INIT.COMMANDS) (EMACS.INIT.SYNTAX) (EMACS.INIT.BACKGROUND) (ADDTOVAR *DEDIT-MENU-COMMANDS* (Emacs DEDITEmacs)) (CHANGECCODE (QUOTE NILL) (QUOTE TTYDISPLAYSTREAM) (QUOTE \TEDIT.COMMAND.LOOP))))) (EMACS.INIT.BACKGROUND (LAMBDA NIL (* kbr: "24-Jul-85 16:36") (* Fix up BackgroundMenu. *) (PROG NIL (SETQ BackgroundMenuCommands (FOR BUCKET IN BackgroundMenuCommands WHEN (NOT (EQ (CAR BUCKET) (QUOTE TEdit))) COLLECT BUCKET)) (ADDTOVAR BackgroundMenuCommands (EMACS (QUOTE (EMACS)) "Opens an Edit Window.")) (SETQ BackgroundMenu NIL) (* BackgroundMenu recreated by WINDOW package next time user buttons background. *) ))) (DEDITEmacs (LAMBDA NIL (* kbr: "24-Jul-85 16:36") (* Fn to let DEDIT call EMACS on DEDIT top selection. *) (PROG (EXPR) (CURSOR T) (SETQ EXPR (CAR (TOPSELECTION))) (SETQ EXPR (READ (EMACS (MKSTRING EXPR) NIL T) EMACS.READTABLE)) (DEDITZAPCAR (TOPSELECTION) EXPR)))) (EMACS.INIT.COMMANDS (LAMBDA NIL (* kbr: "24-Jul-85 16:36") (* Initialize TEDIT.READTABLE. *) (PROG NIL (SETQ EMACS.COMMANDS (ARRAY 128 (QUOTE POINTER) NIL 0)) (SETQ EMACS.MCOMMANDS (ARRAY 128 (QUOTE POINTER) NIL 0)) (SETQ EMACS.XCOMMANDS (ARRAY 128 (QUOTE POINTER) NIL 0)) (FOR BUCKET IN EMACS.LIST DO (SETA EMACS.COMMANDS (CAR BUCKET) (CADR BUCKET))) (FOR BUCKET IN EMACS.MLIST DO (SETA EMACS.MCOMMANDS (CAR BUCKET) (CADR BUCKET))) (FOR BUCKET IN EMACS.XLIST DO (SETA EMACS.XCOMMANDS (CAR BUCKET) (CADR BUCKET))) (FOR I FROM 0 TO 255 DO (TEDIT.SETFUNCTION I (EMACS.COMMAND I) TEDIT.READTABLE))))) (EMACS.COMMAND (LAMBDA (I) (* kbr: "24-Jul-85 16:36") (BQUOTE (LAMBDA (STREAM) (EMACS.OPERATE (\, I) STREAM))))) (EMACS.OPERATE (LAMBDA (STREAM) (* kbr: "27-Jul-86 17:26") (* Accept token from user *) (PROG (TEXTOBJ I N FN PTR CH) (TTYDISPLAYSTREAM (fetch (EMACSSTREAM WINDOW) of STREAM)) (SETQ TEXTOBJ (fetch (EMACSSTREAM TEXTOBJ) of STREAM)) (while (\SYSBUFP) do (* Handle user type-in) (SETQ I (\GETKEY)) (SETFILEPTR STREAM (fetch (EMACSSTREAM CARETPTR) of STREAM)) (SETQ N 1) (while (EQ I (CHARCODE ^U)) do (SETQ N (ITIMES 4 N)) (SETQ I (\GETKEY))) (SELCHARQ I ((ESC ^Z) (SETQ FN (ELT EMACS.MCOMMANDS (\GETKEY)))) (^X (SETQ FN (ELT EMACS.XCOMMANDS (\GETKEY)))) (COND ((ILESSP I 128) (SETQ FN (ELT EMACS.COMMANDS I))) ((ILESSP I 256) (SETQ FN (ELT EMACS.MCOMMANDS (IDIFFERENCE I 128)))))) (COND ((NULL FN) (* Insert char I N times. *) (* Handle blue pending delete, if there is one.) (TEDIT.DO.BLUEPENDINGDELETE SEL TEXTOBJ) (SETQ PTR (GETFILEPTR STREAM)) (COND ((AND (NOT (ZEROP PTR)) (EQ (\BACKPEEKBIN STREAM) (CHARCODE CR)) (NOT (MEMB I (CHARCODE (SP TAB))))) (* Start of a def *) (EMACS.FLUSH.CACHE))) (COND ((IEQP N 1) (TEDIT.\INSERT I SEL TEXTOBJ)) (T (SETQ CH (MKSTRING (CHARACTER I))) (TEDIT.INSERT STREAM (ALLOCSTRING N CH)))) (SETFILEPTR STREAM (IPLUS PTR N))) (T (for J from 1 to N do (APPLY* FN STREAM)) (COND ((AND (ILESSP I 256) (NOT (BITTEST (ELT EMACS.SYNTAX I) (LOGOR EMACS.CR EMACS.SD EMACS.BD)))) (EMACS.FLUSH.CACHE)))))) (EMACS.SHOWCARET STREAM)))) (EMACS.GETKEY (LAMBDA NIL (* kbr: "24-Jul-85 16:36") (PROG (CODE) (CARET (QUOTE OFF)) (SETQ CODE (\GETKEY)) (CARET T) (RETURN CODE)))) (EMACS (LAMBDA (TEXT WINDOW DONTSPAWN PROPS) (* kbr: "24-Jul-85 16:36") (PROG (PROCESS) (* Get TEXT. *) (COND ((AND (NOT (NULL TEXT)) (LITATOM TEXT)) (SETQ TEXT (OPENFILE TEXT (QUOTE INPUT) (QUOTE OLD))))) (* Get WINDOW. *) (COND ((NULL WINDOW) (SETQ WINDOW (EMACS.WINDOW DONTSPAWN PROPS)))) (COND (DONTSPAWN (* Don't spawn a process. *) (RETURN (EMACS.TEDIT1 TEXT WINDOW T PROPS))) (T (* Spawn a process. *) (SETQ PROCESS (ADD.PROCESS (BQUOTE (EMACS.PROCESS (QUOTE (\, TEXT)) (QUOTE (\, WINDOW)) (QUOTE (\, PROPS)))) (QUOTE EMACS) (QUOTE NO))) (TTY.PROCESS PROCESS) (RETURN PROCESS)))))) (EMACS.PROCESS (LAMBDA (TEXT WINDOW PROPS) (* kbr: "24-Jul-85 16:36") (PROG NIL (WINDOWPROP WINDOW (QUOTE PROCESS) (THIS.PROCESS)) (RETURN (EMACS.TEDIT1 TEXT WINDOW NIL PROPS))))) (EMACS.TEDIT1 (LAMBDA (TEXT WINDOW UNSPAWNED PROPS) (* kbr: "24-Jul-85 16:36") (PROG (ANSWER) (RESETLST (RESETSAVE (TTYDISPLAYSTREAM WINDOW)) (RESETSAVE NIL (LIST (QUOTE INPUT) (INFILE T))) (RESETSAVE NIL (LIST (QUOTE OUTPUT) (OUTFILE T))) (SETQ ANSWER (\TEDIT1 TEXT WINDOW UNSPAWNED PROPS))) (RETURN ANSWER)))) (EMACS.WINDOW (LAMBDA (DONTSPAWN PROPS) (* kbr: "24-Jul-85 16:36") (PROG (WINDOW) (COND ((AND DONTSPAWN TEDIT.DEFAULT.WINDOW) (SETQ WINDOW TEDIT.DEFAULT.WINDOW)) (T (SETQ WINDOW (TEDIT.CREATEW "Indicate region for EMACS")))) (WINDOWPROP WINDOW (QUOTE TEDIT.PROPS) PROPS) (RETURN WINDOW)))) (EMACS.SETFILEPTR (LAMBDA (STREAM PTR) (* kbr: "24-Jul-85 16:36") (* Patch around bug in TEDIT SETFILEPTR. *) (PROG NIL (COND ((IGREATERP (GETEOFPTR STREAM) 0) (SETFILEPTR STREAM PTR) (SETFILEPTR STREAM PTR)))))) (EMACS.GETCARETPTR (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (PROG (SELECTION ANSWER) (SETQ SELECTION (fetch (EMACSSTREAM SELECTION) of STREAM)) (SETQ ANSWER (SELECTQ (fetch (SELECTION POINT) of SELECTION) (LEFT (SUB1 (fetch (SELECTION CH#) of SELECTION))) (RIGHT (fetch (SELECTION CHLIM) of SELECTION)) (SHOULDNT))) (RETURN ANSWER)))) (EMACS.SETCARETPTR (LAMBDA (STREAM PTR) (* kbr: "24-Jul-85 16:36") (* Move caret to new filepos. *) (PROG (EOF) (SETQ EOF (GETEOFPTR STREAM)) (SETQ PTR (IMIN (IMAX PTR 0) EOF)) (TEDIT.SETSEL STREAM (ADD1 PTR) 0 (QUOTE LEFT)) (EMACS.SETFILEPTR STREAM PTR)))) (EMACS.SHOWCARET (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.SETCARETPTR STREAM PTR) (TEDIT.NORMALIZECARET (fetch (EMACSSTREAM TEXTOBJ) of STREAM)) (EMACS.SETFILEPTR STREAM PTR)))) (EMACS.BOL (LAMBDA (STREAM PTR) (* kbr: "24-Jul-85 16:36") (* Beginning of line wrt filepos PTR. *) (PROG (OLDPTR BOL) (SETQ OLDPTR (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM PTR) (EMACS.BSKIP STREAM EMACS.NONCR) (SETQ BOL (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM OLDPTR) (RETURN BOL)))) (EMACS.EOL (LAMBDA (STREAM PTR) (* kbr: "24-Jul-85 16:36") (* End of line wrt filepos PTR. *) (PROG (OLDPTR EOL) (SETQ OLDPTR (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM PTR) (EMACS.FSKIP STREAM EMACS.NONCR) (SETQ EOL (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM OLDPTR) (RETURN EOL)))) (EMACS.DELETE.BYTES (LAMBDA (STREAM PTR1 PTR2) (* kbr: "19-Feb-85 15:11") (* Delete between PTR1 & PTR2 inclusive. *) (PROG (PTR LENGTH) (SETQ PTR (GETFILEPTR STREAM)) (SETQ PTR1 (IMAX 0 PTR1)) (SETQ PTR2 (IMIN (GETEOFPTR STREAM) PTR2)) (SETQ LENGTH (IPLUS PTR2 (IMINUS PTR1) 1)) (TEDIT.DELETE STREAM (ADD1 PTR1) LENGTH) (COND ((ILEQ PTR PTR1) (EMACS.SETFILEPTR STREAM PTR)) ((ILEQ PTR PTR2) (EMACS.SETFILEPTR STREAM PTR1)) (T (EMACS.SETFILEPTR STREAM (IDIFFERENCE PTR LENGTH))))))) (EMACS.BOFP (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (ZEROP (GETFILEPTR STREAM)))) (EMACS.EOFP (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (IEQP (GETFILEPTR STREAM) (GETEOFPTR STREAM)))) (EMACS.CCHAR (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Caret char. Char being pointed at by caret. *) (PROG (ANSWER) (SETQ ANSWER (\BIN STREAM)) (\BACKBIN STREAM) (RETURN ANSWER)))) (EMACS.PEEKBIN (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (PROG (PTR ANSWER) (SETQ PTR (GETFILEPTR STREAM)) (SETQ ANSWER (\BIN STREAM)) (EMACS.SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.FBYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:11") (* Forward a char. *) (COND ((NOT (EMACS.EOFP STREAM)) (\BIN STREAM))))) (EMACS.FWORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Forward a word. *) (PROG NIL (EMACS.FSKIP STREAM EMACS.WS) (EMACS.FSKIP STREAM EMACS.NONWS)))) (EMACS.BYTEP (LAMBDA (N) (* kbr: "24-Jul-85 16:38") (AND (SMALLP N) (ILESSP N 256) N))) (EMACS.FSKIP (LAMBDA (STREAM CLASS LIMIT) (* kbr: "24-Jul-85 16:36") (* Skip chars in CLASS. *) (COND ((NULL LIMIT) (SETQ LIMIT (GETEOFPTR STREAM)))) (PROG NIL (while (AND (ILESSP (GETFILEPTR STREAM) LIMIT) (BITTEST (ELT EMACS.SYNTAX (OR (EMACS.BYTEP (EMACS.PEEKBIN STREAM)) 256)) CLASS)) do (\BIN STREAM))))) (EMACS.FSKIPTO (LAMBDA (STREAM CLASS) (* kbr: "24-Jul-85 16:36") (* Skip chars in CLASS. *) (PROG NIL (WHILE (AND (NOT (EMACS.EOFP STREAM)) (NOT (BITTEST (ELT EMACS.SYNTAX (OR (EMACS.BYTEP (\BIN STREAM)) 256)) CLASS))) DO (* Continue reading. *))))) (EMACS.BBYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Backward a byte. *) (COND ((NOT (EMACS.BOFP STREAM)) (\BACKBIN STREAM))))) (EMACS.BCHAR (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Backward a char. *) (PROG NIL (COND ((NOT (EMACS.BOFP STREAM)) (\BACKBIN STREAM)))))) (EMACS.BPEEKCHAR (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Backwards peek at char. *) (PROG (PTR BYTE) (SETQ PTR (GETFILEPTR STREAM)) (SETQ BYTE (EMACS.BCHAR STREAM)) (SETFILEPTR STREAM PTR) (RETURN BYTE)))) (EMACS.BWORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Backward a word. *) (PROG NIL (EMACS.BSKIP STREAM EMACS.WS) (EMACS.BSKIP STREAM EMACS.NONWS)))) (EMACS.BSKIP (LAMBDA (STREAM CLASS LIMIT) (* kbr: "24-Jul-85 16:36") (* Skip chars in CLASS. *) (COND ((NULL LIMIT) (SETQ LIMIT 0))) (PROG NIL (while (AND (IGREATERP (GETFILEPTR STREAM) LIMIT) (BITTEST (ELT EMACS.SYNTAX (OR (EMACS.BYTEP (\BACKPEEKBIN STREAM)) 256)) CLASS)) do (\BACKBIN STREAM))))) (EMACS.BSKIPTO (LAMBDA (STREAM CLASS) (* kbr: "24-Jul-85 16:36") (* Skip chars in CLASS. *) (PROG NIL (WHILE (AND (NOT (EMACS.BOFP STREAM)) (NOT (BITTEST (ELT EMACS.SYNTAX (OR (EMACS.BYTEP (\BACKBIN STREAM)) 256)) CLASS))) DO (* Continue reading. *))))) (EMACS.SET.EOF (LAMBDA (STREAM PTR) (* kbr: "19-Feb-85 15:12") (* Temporarily reset eof of STREAM. *) (PROG NIL (replace (STREAM EPAGE) of STREAM with (LRSH PTR 8)) (replace (STREAM EOFFSET) of STREAM with (LOGAND PTR 255)) (replace (TEXTOBJ TEXTLEN) of (fetch (EMACSSTREAM TEXTOBJ) of STREAM) with PTR)))) (EMACS.GOTO.BOL (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to beginning of line. *) (PROG NIL (EMACS.BSKIP STREAM EMACS.NONCR)))) (EMACS.BACK.BYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Go back a byte. *) (PROG NIL (EMACS.BBYTE STREAM)))) (EMACS.FWD.DELETE.BYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Delete byte. *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.DELETE.BYTES STREAM PTR PTR)))) (EMACS.GOTO.EOL (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to end of line. *) (PROG NIL (EMACS.FSKIP STREAM EMACS.NONCR)))) (EMACS.FWD.BYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Go forward a byte. *) (PROG NIL (EMACS.FBYTE STREAM)))) (EMACS.KILL.LINE (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Delete a line. *) (PROG (PTR EOL) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.FSKIP STREAM EMACS.NONCR) (SETQ EOL (GETFILEPTR STREAM)) (COND ((IGREATERP EOL PTR) (EMACS.DELETE.CHARS STREAM PTR (SUB1 EOL))) ((ILESSP EOL (GETEOFPTR STREAM)) (EMACS.DELETE.CHARS STREAM EOL EOL))) (EMACS.SETFILEPTR STREAM PTR)))) (EMACS.DELETE.CHARS (LAMBDA (STREAM PTR1 PTR2) (* kbr: "18-Jun-86 23:23") (* Delete between PTR1 & PTR2 inclusive. *) (PROG (PTR LENGTH) (SETQ PTR (GETFILEPTR STREAM)) (SETQ PTR1 (IMAX 0 PTR1)) (SETQ PTR2 (IMIN (GETEOFPTR STREAM) PTR2)) (SETQ LENGTH (IPLUS PTR2 (IMINUS PTR1) 1)) (TEDIT.DELETE STREAM (ADD1 PTR1) LENGTH) (COND ((ILEQ PTR PTR1) (SETFILEPTR STREAM PTR)) ((ILEQ PTR PTR2) (SETFILEPTR STREAM PTR1)) (T (SETFILEPTR STREAM (IDIFFERENCE PTR LENGTH))))))) (EMACS.REDISPLAY (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Redisplay EMACS screen. *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (REDISPLAYW (fetch (EMACSSTREAM WINDOW) of STREAM)) (EMACS.SETFILEPTR STREAM PTR)))) (EMACS.NEXT.LINE (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go down a line. *) (PROG (PTR BOL EOL NBOL NEOL OFFSET) (SETQ PTR (GETFILEPTR STREAM)) (SETQ BOL (EMACS.BOL STREAM PTR)) (* First char on line is at OFFSET = 0.0 *) (SETQ OFFSET (IPLUS PTR (IMINUS BOL))) (SETQ EOL (EMACS.EOL STREAM PTR)) (SETQ NBOL (ADD1 EOL)) (COND ((ILEQ (GETEOFPTR STREAM) NBOL) (EMACS.SETFILEPTR STREAM (GETEOFPTR STREAM))) (T (SETQ NEOL (EMACS.EOL STREAM NBOL)) (SETQ OFFSET (IMIN OFFSET (IDIFFERENCE NEOL NBOL))) (EMACS.SETFILEPTR STREAM (IPLUS NBOL OFFSET))))))) (EMACS.PREVIOUS.LINE (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go up a line. *) (PROG (PTR BOL PBOL PEOL OFFSET) (SETQ PTR (GETFILEPTR STREAM)) (SETQ BOL (EMACS.BOL STREAM PTR)) (* First char on line is at OFFSET = 0.0 *) (SETQ OFFSET (IPLUS PTR (IMINUS BOL))) (SETQ PEOL (SUB1 BOL)) (COND ((IGEQ 0 PEOL) (EMACS.SETFILEPTR STREAM 0)) (T (SETQ PBOL (EMACS.BOL STREAM PEOL)) (SETQ OFFSET (IMIN OFFSET (IDIFFERENCE PEOL PBOL))) (EMACS.SETFILEPTR STREAM (IPLUS PBOL OFFSET))))))) (EMACS.QUOTE.BYTE (LAMBDA (STREAM) (* kbr: "18-Jun-86 22:59") (* Quote next byte. *) (PROG (PTR CH) (* TBW: Fix use TEDIT's use of terminal table. *) (SETQ PTR (GETFILEPTR STREAM)) (SETQ CH (\GETKEY)) (TEDIT.INSERT STREAM CH (ADD1 PTR)) (EMACS.SETFILEPTR STREAM (ADD1 PTR))))) (EMACS.SEARCH (LAMBDA (STREAM) (* kbr: "18-Jun-86 23:12") (* Case sensitive search, with "*" and "#" wildcards  *) (PROG (PTR TEXTOBJ W OFILE SEL CH) (SETQ PTR (GETFILEPTR STREAM)) (SETQ TEXTOBJ (fetch (EMACSSTREAM TEXTOBJ) of STREAM)) (SETQ W (fetch (EMACSSTREAM WINDOW) of STREAM)) (ERSETQ (RESETLST (RESETSAVE (\TEDIT.MARKACTIVE TEXTOBJ) (QUOTE (AND (\TEDIT.MARKINACTIVE OLDVALUE)))) (replace (TEXTOBJ EDITOPACTIVE) of TEXTOBJ with (QUOTE Find)) (SETQ OFILE (WINDOWPROP W (QUOTE TEDIT.LAST.FIND.STRING))) (SETQ OFILE (TEDIT.GETINPUT STREAM "Text to find: " OFILE (CHARCODE (EOL LF ESC ^S)))) (COND (OFILE (WINDOWPROP W (QUOTE TEDIT.LAST.FIND.STRING) OFILE) (SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ)) (\SHOWSEL SEL NIL NIL) (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) (SETQ CH (TEDIT.FIND TEXTOBJ (MKSTRING OFILE) NIL NIL T))) (COND (CH (* We found the target text.) (* Set up SELECTION to be the found text) (replace (SELECTION CH#) of SEL with (CAR CH)) (replace (SELECTION CHLIM) of SEL with (CADR CH)) (replace (SELECTION DCH) of SEL with (ADD1 (IDIFFERENCE (CADR CH) (CAR CH)))) (replace (SELECTION POINT) of SEL with (QUOTE RIGHT)) (TEDIT.RESET.EXTEND.PENDING.DELETE SEL) (* And never pending a deletion.) (\FIXSEL SEL TEXTOBJ) (TEDIT.NORMALIZECARET TEXTOBJ) (\SHOWSEL SEL NIL T) (EMACS.SETFILEPTR STREAM (EMACS.GETCARETPTR STREAM)) (* And get it into the window *) ) (T (FRESHLINE PROMPTWINDOW) (printout PROMPTWINDOW "String '" OFILE "' not found." T) (\SHOWSEL SEL NIL T) (EMACS.SETFILEPTR STREAM PTR))))) (replace (TEXTOBJ \INSERTNEXTCH) of TEXTOBJ with -1)))))) (EMACS.TRANSPOSE.BYTES (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Transpose bytes. *) (PROG (PTR CODE CH) (COND ((OR (EMACS.BOFP STREAM) (EMACS.EOFP STREAM)) (RETURN))) (SETQ PTR (GETFILEPTR STREAM)) (SETQ CODE (\BIN STREAM)) (COND ((NUMBERP CODE) (SETQ CH (MKSTRING (CHARACTER CODE)))) (T (* IMAGEOBJ *) (SETQ CH CODE))) (EMACS.DELETE.BYTES STREAM PTR PTR) (EMACS.SETFILEPTR STREAM (SUB1 PTR)) (TEDIT.INSERT STREAM CH PTR) (EMACS.SETFILEPTR STREAM (ADD1 PTR))))) (EMACS.NEXT.SCREENFULL (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Forward one screenfull. *) (PROG (WINDOW DELTAX DELTAY) (SETQ WINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (SETQ DELTAX 0) (SETQ DELTAY (IDIFFERENCE (WINDOWPROP WINDOW (QUOTE HEIGHT)) (FONTPROP (DSPFONT NIL WINDOW) (QUOTE HEIGHT)))) (replace (TEXTOBJ EDITOPACTIVE) of (fetch (EMACSSTREAM TEXTOBJ) of STREAM) with NIL) (\TEDIT.SCROLLFN WINDOW DELTAX DELTAY)))) (EMACS.CXCV (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Visit a file. *) (PROG (FILE) (SETQ FILE (TEDIT.GETINPUT (fetch (EMACSSTREAM TEXTOBJ) of STREAM) "File to GET:")) (COND ((NULL FILE) (RETURN))) (COND ((fetch (EMACSSTREAM DIRTY) of STREAM) (EMACS.CXCW STREAM))) (TEDIT.GET (fetch (EMACSSTREAM TEXTOBJ) of STREAM) FILE) (EMACS.SETFILEPTR STREAM 0)))) (EMACS.CXCW (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Write buffer out to file. *) (PROG NIL (TEDIT.PUT (fetch (EMACSSTREAM TEXTOBJ) of STREAM))))) (EMACS.CXCZ (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Eval FORM in front of caret in lisp EXEC process. *) (PROG (FORM) (SETQ FORM (READ STREAM EMACS.READTABLE)) (PROCESS.EVAL (QUOTE EXEC) FORM)))) (EMACS.FWD.SEXPR (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go forward a sexpr. *) (PROG NIL (RESETLST (* Accept uncaught BQUOTE commas. *) (RESETSAVE \BQUOTELEVEL (IQUOTIENT MAX.FIXP 2)) (READ STREAM EMACS.READTABLE))))) (EMACS.BACK.DELETE.BYTE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Delete byte in backwards direction. *) (* TBW: Delete selection if there is a selection. *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.DELETE.BYTES STREAM (SUB1 PTR) (SUB1 PTR))))) (EMACS.GOTO.BOD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to top of definition. *) (PROG (CODE) (* Find non-WS immediately preceded by CR. *) (EMACS.BCHAR STREAM) (DO (COND ((EMACS.BOFP STREAM) (RETURN))) (EMACS.BSKIP STREAM EMACS.NONCR) (COND ((BITTEST (ELT EMACS.SYNTAX (EMACS.CCHAR STREAM)) EMACS.NONWS) (RETURN))) (EMACS.BCHAR STREAM))))) (EMACS.BOD (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Determine top of definition. *) (PROG (PTR ANSWER) (SETQ PTR (GETFILEPTR STREAM)) (* Find lparen preceded by CR. *) (EMACS.BSKIP STREAM EMACS.CR) (DO (COND ((EMACS.BOFP STREAM) (RETURN))) (EMACS.BSKIP STREAM EMACS.NONCR) (COND ((EMACS.BOFP STREAM) (RETURN))) (COND ((OR (EMACS.BOFP STREAM) (EQ (\PEEKBIN STREAM) (CHARCODE "("))) (RETURN))) (EMACS.BBYTE STREAM)) (SETQ ANSWER (GETFILEPTR STREAM)) (SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.GOTO.EOD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to top of next definition. *) (PROG (CODE) (* Find non-WS immediately preceded by CR. *) (EMACS.FCHAR STREAM) (DO (COND ((EMACS.EOFP STREAM) (RETURN))) (EMACS.FSKIP STREAM EMACS.NONCR) (EMACS.FCHAR STREAM) (COND ((BITTEST (ELT EMACS.SYNTAX (EMACS.CCHAR STREAM)) EMACS.NONWS) (RETURN))))))) (EMACS.EOD (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:12") (* Determine top of next definition. *) (PROG (PTR ANSWER) (SETQ PTR (GETFILEPTR STREAM)) (* Find two CRs. *) (EMACS.FSKIP STREAM EMACS.CR) (DO (COND ((EMACS.EOFP STREAM) (RETURN))) (EMACS.FSKIP STREAM EMACS.NONCR) (COND ((EMACS.EOFP STREAM) (RETURN))) (EMACS.FBYTE STREAM) (COND ((OR (EMACS.EOFP STREAM) (EQ (\PEEKBIN STREAM) (CHARCODE CR))) (\BACKBIN STREAM) (RETURN)))) (SETQ ANSWER (GETFILEPTR STREAM)) (SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.KILL.SEXPR (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Delete expression. *) (PROG (PTR1 PTR2) (SETQ PTR1 (GETFILEPTR STREAM)) (READ STREAM EMACS.READTABLE) (SETQ PTR2 (GETFILEPTR STREAM)) (EMACS.DELETE.CHARS STREAM PTR1 (SUB1 PTR2)) (EMACS.SETFILEPTR STREAM PTR1)))) (EMACS.GOTO.BOF (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to beginning of file. *) (PROG NIL (EMACS.SETFILEPTR STREAM 0)))) (EMACS.GOTO.EOF (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Go to end of file. *) (PROG NIL (EMACS.SETFILEPTR STREAM (GETEOFPTR STREAM))))) (EMACS.BACK.WORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Backward a word. *) (PROG NIL (EMACS.BWORD STREAM)))) (EMACS.FWD.DELETE.WORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Delete word. *) (PROG (PTR1 PTR2) (SETQ PTR1 (GETFILEPTR STREAM)) (EMACS.FSKIP STREAM EMACS.WS) (EMACS.FSKIP STREAM EMACS.NONWS) (SETQ PTR2 (GETFILEPTR STREAM)) (EMACS.DELETE.CHARS STREAM PTR1 (SUB1 PTR2)) (EMACS.SETFILEPTR STREAM PTR1)))) (EMACS.EDIT (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* DEDIT expression. *) (PROG (EXPR PTR1 PTR2) (SKIPSEPRS STREAM) (SETQ PTR1 (GETFILEPTR STREAM)) (SETQ EXPR (READ STREAM EMACS.READTABLE)) (SETQ PTR2 (GETFILEPTR STREAM)) (EMACS.DELETE.CHARS STREAM PTR1 (SUB1 PTR2)) (SETQ EXPR (EDITE EXPR)) (PRINTDEF EXPR NIL NIL NIL NIL STREAM)))) (EMACS.FWD.WORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Forward a word. *) (PROG NIL (EMACS.FWORD STREAM)))) (EMACS.GRIND (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Grind expression. *) (PROG (EXPR PTR1 PTR2) (SKIPSEPRS STREAM) (SETQ PTR1 (GETFILEPTR STREAM)) (SETQ EXPR (READ STREAM EMACS.READTABLE)) (SETQ PTR2 (GETFILEPTR STREAM)) (EMACS.DELETE.CHARS STREAM PTR1 (SUB1 PTR2)) (PRINTDEF EXPR NIL NIL NIL NIL STREAM)))) (EMACS.SNARF (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Snarf expression from DEDIT window. *) (PROG (EXPR) (SETQ EXPR (CAR (TOPSELECTION))) (PRINTDEF EXPR NIL NIL NIL NIL STREAM)))) (EMACS.MT (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Transpose words. *) (PROG (PTR BPTR1 BPTR2 FPTR1 FPTR2) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.BSKIP STREAM EMACS.WS) (SETQ BPTR2 (GETFILEPTR STREAM)) (EMACS.BWORD) (SETQ BPTR1 (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM PTR) (EMACS.FSKIP STREAM EMACS.WS) (SETQ FPTR1 (GETFILEPTR STREAM)) (EMACS.FWORD STREAM) (SETQ FPTR2 (GETFILEPTR STREAM)) (* How do I move? *) ))) (EMACS.PREVIOUS.SCREENFULL (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Backwards a screenfull. *) (PROG (WINDOW DELTAX DELTAY) (SETQ WINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (SETQ DELTAX 0) (SETQ DELTAY (IDIFFERENCE (FONTPROP (DSPFONT NIL WINDOW) (QUOTE HEIGHT)) (WINDOWPROP WINDOW (QUOTE HEIGHT)))) (replace (TEXTOBJ EDITOPACTIVE) of (fetch (EMACSSTREAM TEXTOBJ) of STREAM) with NIL) (\TEDIT.SCROLLFN WINDOW DELTAX DELTAY)))) (EMACS.JOIN.LINES (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Move current line up *) (PROG (PTR BOL EOL PBOL PEOL PTR1 PTR2) (SETQ PTR (GETFILEPTR STREAM)) (SETQ BOL (EMACS.BOL STREAM PTR)) (SETQ EOL (EMACS.EOL STREAM PTR)) (COND ((ZEROP BOL) (RETURN))) (SETQ PEOL (SUB1 BOL)) (SETQ PBOL (EMACS.BOL STREAM PEOL)) (EMACS.SETFILEPTR STREAM BOL) (EMACS.BSKIP STREAM EMACS.WS) (SETQ PTR1 (IMAX (GETFILEPTR STREAM) PBOL)) (EMACS.SETFILEPTR STREAM BOL) (EMACS.FSKIP STREAM EMACS.WS) (SETQ PTR2 (IMIN (GETFILEPTR STREAM) (ADD1 EOL))) (EMACS.SETFILEPTR STREAM PTR1) (EMACS.DELETE.CHARS STREAM PTR1 (SUB1 PTR2)) (\BOUT STREAM (CHARCODE SP)) (EMACS.SETFILEPTR STREAM (ADD1 PTR1))))) (EMACS.BACK.DELETE.WORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Delete backward a word. *) (PROG (PTR1 PTR2) (SETQ PTR1 (GETFILEPTR STREAM)) (EMACS.BWORD STREAM) (SETQ PTR2 (GETFILEPTR STREAM)) (EMACS.DELETE.CHARS STREAM PTR2 (SUB1 PTR1))))) (NEW.TEDIT.SELECT.LINE.SCANNER (LAMBDA (X Y TEXTOBJ LINE.LIST REGION WORDSELFLG SELOPERATION WINDOW) (* kbr: "24-Jul-85 16:49") (PROG (SELECTION PTR) (SETQ SELECTION (OLD.TEDIT.SELECT.LINE.SCANNER X Y TEXTOBJ LINE.LIST REGION WORDSELFLG SELOPERATION WINDOW)) (COND ((EQ (TYPENAME SELECTION) (QUOTE SELECTION)) (replace (SELECTION POINT) of SELECTION with (QUOTE LEFT)) (EMACS.SETFILEPTR (fetch (TEXTOBJ STREAMHINT) of TEXTOBJ) (SUB1 (fetch (SELECTION CH#) of SELECTION))))) (EMACS.FLUSH.CACHE) (RETURN SELECTION)))) ) (DEFINEQ (\TEDIT1 (LAMBDA (TEXT WINDOW UNSPAWNED PROPS) (* kbr: "11-Jun-86 23:06") (* Does the actual editing work, and  re-coercion or process kill when done.  Called by TEDIT directly, or  ADD.PROCESSed by it.) (SETQ TEXT (OPENTEXTSTREAM TEXT WINDOW NIL NIL PROPS)) (* Open the text for editing) (\TEDIT.COMMAND.LOOP TEXT) (* Run the editing engine) (CLOSEW WINDOW) (replace \WINDOW of (fetch (TEXTSTREAM TEXTOBJ) of TEXT) with NIL) (AND (TEXTPROP (fetch (TEXTSTREAM TEXTOBJ) of TEXT) (QUOTE AFTERQUITFN)) (APPLY* (TEXTPROP (fetch (TEXTSTREAM TEXTOBJ) of TEXT) (QUOTE AFTERQUITFN)) WINDOW TEXT)) (* Apply any post-window-close  (and post-QUIT) function) (COND (UNSPAWNED (* We're not a distinct process: Send  back the edited text in some suitable  form) (COND ((NEQ (fetch EDITFINISHEDFLG of (fetch (TEXTSTREAM TEXTOBJ) of TEXT)) T) (PROG1 (fetch EDITFINISHEDFLG of (fetch (TEXTSTREAM TEXTOBJ) of TEXT)) (replace EDITFINISHEDFLG of (fetch (TEXTSTREAM TEXTOBJ) of TEXT) with NIL))) ((STRINGP (fetch TXTFILE of (fetch (TEXTSTREAM TEXTOBJ) of TEXT))) (COERCETEXTOBJ (fetch (TEXTSTREAM TEXTOBJ) of TEXT) (QUOTE STRINGP))) (T TEXT)))))) (\TEDIT.COMMAND.LOOP (LAMBDA (STREAM RTBL) (* kbr: " 9-Jul-86 18:03") (* Main command loop for the TEDIT  editor. Includes keyboard polling and  command dispatch) (PROG (TEXTOBJ ISCRSTRING SEL WINDOW LINES IPASSSTRING TTYWINDOW) (COND ((type? STREAM STREAM) (SETQ TEXTOBJ (fetch (TEXTSTREAM TEXTOBJ) of STREAM))) ((type? TEXTOBJ STREAM) (SETQ TEXTOBJ STREAM) (SETQ STREAM (TEXTSTREAM TEXTOBJ))) (T (HELP))) (SETQ ISCRSTRING (ALLOCSTRING \SCRATCHLEN " ")) (SETQ SEL (fetch (TEXTOBJ SEL) of TEXTOBJ)) (SETQ WINDOW (fetch (TEXTOBJ \WINDOW) of TEXTOBJ)) (SETQ LINES (fetch (TEXTOBJ LINES) of TEXTOBJ)) (SETQ IPASSSTRING (SUBSTRING ISCRSTRING 1)) (* Used inside \INSERT\TTY\BUFFER) (SETQ RTBL (OR RTBL (fetch (TEXTOBJ TXTRTBL) of TEXTOBJ) TEDIT.READTABLE)) (* Used to derive command characters  from type-in) (for WW inside WINDOW do (WINDOWPROP WW (QUOTE PROCESS) (THIS.PROCESS))) (* And the window to this process) (while (NOT (TTY.PROCESSP)) do (* Wait until we really have the TTY  before proceeding.) (DISMISS 250)) (TTYDISPLAYSTREAM (fetch (EMACSSTREAM WINDOW) of STREAM)) (RESETLST (RESETSAVE (\TEDIT.COMMAND.RESET.SETUP (LIST TEXTOBJ WINDOW) T)) (PROG (CH FN TCH DIRTY BLANKSEEN INSCH# CRSEEN TLEN CHNO READSA TERMSA TEDITSA TEDITFNHASH LOOPFN CHARFN COMMANDFN) (SETQ DIRTY NIL) (SETQ BLANKSEEN NIL) (SETQ CRSEEN NIL) (SETQ READSA (fetch (READTABLEP READSA) of #CURRENTRDTBL#)) (SETQ TERMSA (OR (fetch (TEXTOBJ TXTTERMSA) of TEXTOBJ) \PRIMTERMSA)) (SETQ TEDITSA (fetch (READTABLEP READSA) of RTBL)) (SETQ TEDITFNHASH (fetch (READTABLEP READMACRODEFS) of RTBL)) (SETQ LOOPFN (TEXTPROP TEXTOBJ (QUOTE LOOPFN))) (SETQ CHARFN (TEXTPROP TEXTOBJ (QUOTE CHARFN))) (while (NOT (fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ)) do (ERSETQ (PROGN (\WAITFORSYSBUFP 25) (* Await type-in or mouse action) (while (OR TEDIT.SELPENDING (fetch (TEXTOBJ EDITOPACTIVE) of TEXTOBJ)) do (* Don't do anything while he's  selecting or one of the lock-out ops  is active.) (COND ((EQ TEDIT.SELPENDING TEXTOBJ) (* (OR (EQ TEDIT.SELPENDING TEXTOBJ)  (fetch TCUP of (fetch CARET of TEXTOBJ)))) (* If this TEdit is the one being  selected in, or the caret is  explicitly visible, flash it) (TEDIT.FLASHCARET (fetch (TEXTOBJ CARET) of TEXTOBJ)) )) (BLOCK)) (COND ((fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ)) (T (COND ((fetch (TEXTOBJ TXTNEEDSUPDATE) of TEXTOBJ) (* We got here somehow with the window  not in sync with the text.  Run an update.) (\SHOWSEL SEL NIL NIL) (TEDIT.UPDATE.SCREEN TEXTOBJ NIL T) (\FIXSEL SEL TEXTOBJ) (\SHOWSEL SEL NIL T))) (TEDIT.FLASHCARET (fetch (TEXTOBJ CARET) of TEXTOBJ)) (* Flash the caret periodically  (BUT not while we're here only to  cleanup and quit.)) (replace (TEXTOBJ EDITOPACTIVE) of TEXTOBJ with T) (* Before starting to work, note that  we're doing something.) (* Process any pending selections) (ERSETQ (COND (TEDIT.COPY.PENDING (* Have to copy the shifted SEL to  caret.) (SETQ TEDIT.COPY.PENDING NIL) (\COPYSEL TEDIT.SHIFTEDSELECTION (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ)) (TEDIT.COPY (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ) (fetch (TEXTOBJ SEL) of TEXTOBJ)) (replace (SELECTION SET) of TEDIT.SHIFTEDSELECTION with NIL) (replace (SELECTION L1) of TEDIT.SHIFTEDSELECTION with NIL) (replace (SELECTION LN) of TEDIT.SHIFTEDSELECTION with NIL) (\COPYSEL TEDIT.SHIFTEDSELECTION (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ))) (TEDIT.COPYLOOKS.PENDING (* Have to copy the shifted SEL to  caret.) (SETQ TEDIT.COPYLOOKS.PENDING NIL) (\COPYSEL TEDIT.COPYLOOKSSELECTION (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ)) (COND ((EQ (QUOTE PARA) (fetch (SELECTION SELKIND) of (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ))) (* copy the paragraph looks, since the  source selection type was paragraph) (TEDIT.COPY.PARALOOKS TEXTOBJ (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ) (fetch (TEXTOBJ SEL) of TEXTOBJ))) (T (* copy the character looks) (TEDIT.COPY.LOOKS TEXTOBJ (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ) (fetch (TEXTOBJ SEL) of TEXTOBJ)))) (\SHOWSEL (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ) NIL NIL) (replace (SELECTION SET) of TEDIT.COPYLOOKSSELECTION with NIL) (replace (SELECTION L1) of TEDIT.COPYLOOKSSELECTION with NIL) (replace (SELECTION LN) of TEDIT.COPYLOOKSSELECTION with NIL) (\COPYSEL TEDIT.COPYLOOKSSELECTION (fetch (TEXTOBJ SHIFTEDSEL) of TEXTOBJ))) (TEDIT.MOVE.PENDING (* Have to move the ctrl-shift SEL to  caret.) (SETQ TEDIT.MOVE.PENDING NIL) (\COPYSEL TEDIT.MOVESELECTION (fetch (TEXTOBJ MOVESEL) of TEXTOBJ)) (TEDIT.DO.BLUEPENDINGDELETE SEL TEXTOBJ ) (TEDIT.MOVE (fetch (TEXTOBJ MOVESEL) of TEXTOBJ) (fetch (TEXTOBJ SEL) of TEXTOBJ)) (replace (SELECTION SET) of TEDIT.MOVESELECTION with NIL) (replace (SELECTION L1) of TEDIT.MOVESELECTION with NIL) (replace (SELECTION LN) of TEDIT.MOVESELECTION with NIL) (\COPYSEL TEDIT.MOVESELECTION (fetch (TEXTOBJ MOVESEL) of TEXTOBJ))) (TEDIT.DEL.PENDING (* Delete the current selection.) (SETQ TEDIT.DEL.PENDING NIL) (* Above all, reset the demand flag  first) (COND ((fetch (SELECTION SET) of TEDIT.DELETESELECTION ) (* Only try the deletion if he really  set the selection.) (\SHOWSEL (fetch (TEXTOBJ DELETESEL) of TEXTOBJ) NIL NIL) (* Turn off the selection highlights) (\SHOWSEL (fetch (TEXTOBJ SEL) of TEXTOBJ) NIL NIL) (replace (SELECTION SET) of (fetch (TEXTOBJ DELETESEL) of TEXTOBJ) with NIL) (\COPYSEL TEDIT.DELETESELECTION (fetch (TEXTOBJ SEL) of TEXTOBJ)) (\TEDIT.SET.SEL.LOOKS (fetch (TEXTOBJ SEL) of TEXTOBJ) (QUOTE NORMAL)) (* Grab the selection we're to use) (\TEDIT.DELETE (fetch (TEXTOBJ SEL) of TEXTOBJ) (fetch (SELECTION \TEXTOBJ) of (fetch (TEXTOBJ SEL) of TEXTOBJ)) NIL) (replace (SELECTION L1) of TEDIT.DELETESELECTION with NIL) (replace (SELECTION LN) of TEDIT.DELETESELECTION with NIL)))))) (UNINTERRUPTABLY (replace (STRINGP OFFST) of ISCRSTRING with 0) (replace (STRINGP LENGTH) of ISCRSTRING with \SCRATCHLEN )) (COND ((\SYSBUFP) (ERSETQ (EMACS.OPERATE STREAM)))))) (replace (TEXTOBJ EDITOPACTIVE) of TEXTOBJ with NIL))) (replace (TEXTOBJ EDITOPACTIVE) of TEXTOBJ with NIL))))))) ) (* BALANCE *) (PUTPROPS ACCESSFNS EMACS.TAB 2) (PUTPROPS DATATYPE EMACS.TAB 2) (PUTPROPS DEFEXPR EMACS.TAB 2) (PUTPROPS DEFFEXPR EMACS.TAB 2) (PUTPROPS DEFVAR EMACS.TAB 2) (PUTPROPS DO EMACS.TAB 1) (PUTPROPS FOR EMACS.TAB 1) (PUTPROPS LAMBDA EMACS.TAB 2) (PUTPROPS PROG EMACS.TAB 2) (PUTPROPS RECORD EMACS.TAB 2) (PUTPROPS SELECT EMACS.TAB 2) (PUTPROPS SELECTQ EMACS.TAB 2) (PUTPROPS UNTIL EMACS.TAB 1) (PUTPROPS WHILE EMACS.TAB 1) (RPAQ? EMACS.DELIMS NIL) (RPAQ? EMACS.SDELIMS NIL) (RPAQ? EMACS.LDELIMS NIL) (RPAQ? EMACS.RDELIMS NIL) (RPAQ? EMACS.SCACHE NIL) (RPAQ? EMACS.BCACHE NIL) (RPAQ? EMACS.SYNTAX NIL) (RPAQ? EMACS.CR 1) (RPAQ? EMACS.WS 2) (RPAQ? EMACS.SD 4) (RPAQ? EMACS.NONCR 8) (RPAQ? EMACS.NONWS 16) (RPAQ? EMACS.NONSD 32) (RPAQ? EMACS.BQ 64) (RPAQ? EMACS.ALPHA 128) (RPAQ? EMACS.BD 256) (RPAQ? EMACS.SPACE 512) (DEFINEQ (EMACS.DELIMS (LAMBDA (LCHARCODE RCHARCODE) (* kbr: "19-Feb-85 15:13") (* Make LCHARCODE & RCHARCODE into delimiters. If LCHARCODE = RCHARCODE, then string style. Otherwise paren style. *) (PROG (BUCKET) (SETQ BUCKET (CONS LCHARCODE RCHARCODE)) (COND ((MEMBER BUCKET EMACS.DELIMS) (* Already there. *) (RETURN))) (PUSH EMACS.DELIMS BUCKET) (COND ((IEQP LCHARCODE RCHARCODE) (SETSYNTAX LCHARCODE (QUOTE STRINGDELIM) EMACS.READTABLE) (SETA EMACS.SYNTAX LCHARCODE (LOGOR EMACS.NONWS EMACS.NONCR EMACS.SD)) (SETA EMACS.COMMANDS LCHARCODE (EMACS.SDELIM.COMMAND (MKSTRING (CHARACTER LCHARCODE)))) (PUSH EMACS.SDELIMS LCHARCODE)) (T (SETSYNTAX LCHARCODE (QUOTE LEFTPAREN) EMACS.READTABLE) (SETSYNTAX RCHARCODE (QUOTE RIGHTPAREN) EMACS.READTABLE) (FOR I IN (LIST LCHARCODE RCHARCODE) DO (SETA EMACS.SYNTAX I (LOGOR EMACS.NONCR EMACS.NONWS EMACS.NONSD EMACS.BD))) (SETA EMACS.COMMANDS LCHARCODE (EMACS.LDELIM.COMMAND (MKSTRING (CHARACTER LCHARCODE)))) (SETA EMACS.COMMANDS RCHARCODE (EMACS.RDELIM.COMMAND (MKSTRING (CHARACTER RCHARCODE)))) (PUSH EMACS.LDELIMS LCHARCODE) (PUSH EMACS.RDELIMS RCHARCODE)))))) (EMACS.CR (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM (CHARACTER (CHARCODE CR))) (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((NOT (EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE))) (FLASHWINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (EMACS.SETCARETPTR STREAM EMACS.SCACHE) (DISMISS 1000) (EMACS.SETCARETPTR STREAM (ADD1 PTR)) (SETQ EMACS.SCACHE (QUOTE OUTSIDE)) (SETQ EMACS.BCACHE NIL)))))) (EMACS.RPAREN (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM ")") (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.CLOSE.BALANCE STREAM)))))) (EMACS.RBRACKET (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM "]") (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.CLOSE.BALANCE STREAM)))))) (EMACS.RBRACE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM "}") (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.CLOSE.BALANCE STREAM)))))) (EMACS.RANGLE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM ">") (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.CLOSE.BALANCE STREAM)))))) (EMACS.SDELIM.COMMAND (LAMBDA (SDELIM) (* kbr: "19-Feb-85 15:14") (* Return sdelim fn to be inserted in EMACS.COMMANDS. SDELIM = 1 letter string. *) (PROG (ANSWER) (SETQ ANSWER (\BQUOTE (LAMBDA (STREAM) (EMACS.SDELIM (\COMMA SDELIM) STREAM)))) (RETURN ANSWER)))) (EMACS.LDELIM.COMMAND (LAMBDA (LDELIM) (* kbr: "19-Feb-85 15:14") (* Return LDELIM fn to be inserted in EMACS.COMMANDS. LDELIM = 1 letter string. *) (PROG (ANSWER) (SETQ ANSWER (\BQUOTE (LAMBDA (STREAM) (EMACS.LDELIM (\COMMA LDELIM) STREAM)))) (RETURN ANSWER)))) (EMACS.RDELIM.COMMAND (LAMBDA (RDELIM) (* kbr: "19-Feb-85 15:14") (* Return RDELIM fn to be inserted in EMACS.COMMANDS. RDELIM = 1 letter string. *) (PROG (ANSWER) (SETQ ANSWER (\BQUOTE (LAMBDA (STREAM) (EMACS.RDELIM (\COMMA RDELIM) STREAM)))) (RETURN ANSWER)))) (EMACS.SDELIM (LAMBDA (SDELIM STREAM) (* kbr: "19-Feb-85 15:14") (* Insert string delimiter SDELIM & update caches. SDELIM = 1 letter string *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM SDELIM) (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EMACS.BACK.ESCAPEDP STREAM) (RETURN))) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.OPEN.STRING STREAM)) (T (EMACS.CLOSE.STRING STREAM)))))) (EMACS.LDELIM (LAMBDA (LDELIM STREAM) (* kbr: "19-Feb-85 15:14") (* Insert LDELIM & update caches. LDELIM = 1 letter string *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM LDELIM) (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EMACS.BACK.ESCAPEDP STREAM) (RETURN))) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.OPEN.BALANCE STREAM)))))) (EMACS.RDELIM (LAMBDA (RDELIM STREAM) (* kbr: "19-Feb-85 15:14") (* Insert RDELIM & update caches. RDELIM = 1 letter string *) (PROG (PTR) (SETQ PTR (GETFILEPTR STREAM)) (TEDIT.INSERT STREAM RDELIM) (EMACS.SETFILEPTR STREAM (ADD1 PTR)) (COND ((EMACS.BACK.ESCAPEDP STREAM) (RETURN))) (COND ((EQ (EMACS.SCACHE STREAM) (QUOTE OUTSIDE)) (EMACS.CLOSE.BALANCE STREAM)))))) (EMACS.OPEN.STRING (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (LPTR) (* We should be 1 char after left delim. *) (SETQ LPTR (SUB1 (GETFILEPTR STREAM))) (SETQ EMACS.SCACHE LPTR)))) (EMACS.CLOSE.STRING (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (LPTR RPTR LDELIM RDELIM MATCHED) (* We should be 1 char after right delim. *) (SETQ EMACS.SCACHE (QUOTE OUTSIDE)) (SETQ RPTR (SUB1 (GETFILEPTR STREAM))) (EMACS.SETFILEPTR STREAM RPTR) (SETQ RDELIM (\PEEKBIN STREAM)) (EMACS.BSKIP STREAM EMACS.NONSD) (EMACS.BBYTE STREAM) (SETQ LPTR (GETFILEPTR STREAM)) (SETQ LDELIM (\PEEKBIN STREAM)) (SETQ MATCHED (IEQP LDELIM RDELIM)) (COND (MATCHED (EMACS.SETCARETPTR STREAM LPTR) (DISMISS 200)) (T (FLASHWINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (EMACS.SETCARETPTR STREAM LPTR) (DISMISS 1000))) (EMACS.SETCARETPTR STREAM (ADD1 RPTR)) (EMACS.SETFILEPTR STREAM (ADD1 RPTR))))) (EMACS.OPEN.BALANCE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (LPTR) (* We should be 1 char after left delim. *) (SETQ LPTR (SUB1 (GETFILEPTR STREAM))) (COND ((NUMBERP EMACS.BCACHE) (* We were at top level. *) (SETQ EMACS.BCACHE (LIST LPTR))) (T (push EMACS.BCACHE LPTR)))))) (EMACS.CLOSE.BALANCE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (PTR LPTR RPTR LDELIM RDELIM BALANCED) (* LPTR & RPTR point at balancing delims *) (SETQ PTR (GETFILEPTR STREAM)) (SETQ RPTR (SUB1 PTR)) (EMACS.SETFILEPTR STREAM RPTR) (SETQ RDELIM (\PEEKBIN STREAM)) (EMACS.BCACHE STREAM) (SETQ BALANCED (NOT (NUMBERP EMACS.BCACHE))) (COND (BALANCED (SETQ LPTR (CAR EMACS.BCACHE)) (EMACS.SETFILEPTR STREAM LPTR) (SETQ LDELIM (\PEEKBIN STREAM)) (EMACS.SETCARETPTR STREAM LPTR) (COND ((IEQP (CDR (ASSOC LDELIM EMACS.DELIMS)) RDELIM) (* Correct match *) (DISMISS 200)) (T (* Flash incorrect match. *) (FLASHWINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (DISMISS 1000))) (pop EMACS.BCACHE)) (T (* Flash beginning of non-list def. *) (EMACS.SETCARETPTR STREAM EMACS.BCACHE) (FLASHWINDOW (fetch (EMACSSTREAM WINDOW) of STREAM)) (DISMISS 1000))) (EMACS.SETCARETPTR STREAM PTR) (EMACS.SETFILEPTR STREAM PTR)))) (EMACS.FLUSH.CACHE (LAMBDA NIL (* kbr: "19-Feb-85 15:14") (* Lose cached info about string & paren balancing. *) (PROG NIL (* Hopefully we can change things so that not all  commands flush all of cache. *) (SETQ EMACS.SCACHE NIL) (SETQ EMACS.BCACHE NIL)))) (EMACS.SCACHE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Return or OUTSIDE, computing if necessary. *) (PROG (PTR ANSWER) (COND (EMACS.SCACHE (RETURN EMACS.SCACHE))) (* Recompute. *) (SETQ PTR (GETFILEPTR STREAM)) (EMACS.SETFILEPTR STREAM (EMACS.BOL STREAM PTR)) (SETQ ANSWER (QUOTE OUTSIDE)) (while (ILESSP (GETFILEPTR STREAM) PTR) do (* Find opening. *) (EMACS.FSKIP STREAM EMACS.NONSD PTR) (EMACS.FBYTE STREAM) (COND ((IGEQ (GETFILEPTR STREAM) PTR) (RETURN))) (SETQ ANSWER (GETFILEPTR STREAM)) (* Find closing. *) (EMACS.FSKIP STREAM EMACS.NONSD PTR) (EMACS.FBYTE STREAM) (COND ((IGEQ (GETFILEPTR STREAM) PTR) (RETURN))) (SETQ ANSWER (QUOTE OUTSIDE))) (* Store ANSWER, restore fileptr, & return *) (SETQ EMACS.SCACHE ANSWER) (EMACS.SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.BCACHE (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Return ( ... ) or OUTSIDE *) (PROG (PTR SCACHE ANSWER) (COND (EMACS.BCACHE (RETURN EMACS.BCACHE))) (* Recompute. *) (SETQ PTR (GETFILEPTR STREAM)) (SETQ SCACHE (EMACS.SCACHE STREAM)) (COND ((NOT (EQ SCACHE (QUOTE OUTSIDE))) (* Move off string. *) (EMACS.SETFILEPTR STREAM SCACHE) (COND ((OR (EMACS.BOFP STREAM) (IEQP (\BACKPEEKBIN STREAM) (CHARCODE CR))) (* A string def! *) (SETQ ANSWER SCACHE) (GO EXIT))))) (COND ((NULL (EMACS.SAFE.BACK.SEXPRS STREAM)) (* Unsuccessful read = unbalanced parens. Treat as if top level. *) (SETQ ANSWER (GETFILEPTR STREAM))) ((OR (ZEROP (GETFILEPTR STREAM)) (IEQP (\BACKPEEKBIN STREAM) (CHARCODE CR))) (* Top level. *) (SETQ ANSWER (GETFILEPTR STREAM))) (T (* Opening delim present. *) (SETQ ANSWER (LIST (SUB1 (GETFILEPTR STREAM)))))) EXIT(EMACS.SETFILEPTR STREAM PTR) (SETQ EMACS.BCACHE ANSWER) (RETURN ANSWER)))) (EMACS.SAFE.BACK.SEXPRS (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Backwards read sexprs up to but not including opening delim. Return T if successful backwards read. Otherwise NIL & leave fileptr near failure point. *) (PROG (ANSWER) (DO (EMACS.BACK.SKIPSEPRS STREAM) (COND ((OR (ZEROP (GETFILEPTR STREAM)) (IEQP (\BACKPEEKBIN STREAM) (CHARCODE CR)) (AND (FMEMB (\BACKPEEKBIN STREAM) EMACS.LDELIMS) (NOT (EMACS.BACK.ESCAPEDP STREAM)))) (* Up against delimiter. *) (SETQ ANSWER T) (RETURN)) ((NULL (NLSETQ (EMACS.BACK.SEXPR STREAM))) (* Error reading backwards. *) (FLASHWINDOW STREAM) (RETURN)))) (RETURN ANSWER)))) (EMACS.SAFE.BACK.SEXPR (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Return T if successful backwards read. Otherwise NIL & leave fileptr near failure point. *) (PROG NIL (COND ((NULL (NLSETQ (EMACS.BACK.SEXPR STREAM))) (* Error reading backwards. *) (FLASHWINDOW STREAM) (RETURN NIL))) (RETURN T)))) (EMACS.BACK.SEXPR (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (PROG (RDELIM LDELIM) (EMACS.BACK.SKIPSEPRS STREAM) (COND ((EMACS.BOFP STREAM) (ERROR!)) ((EMACS.BACK.ESCAPEDP STREAM) (* Atom *) (EMACS.BACK.WORD STREAM) (RETURN))) (SETQ RDELIM (\BACKPEEKBIN STREAM)) (SETQ LDELIM (for BUCKET in EMACS.DELIMS when (IEQP (CDR BUCKET) RDELIM) do (RETURN (CAR BUCKET)))) (COND ((NULL LDELIM) (* Atom *) (EMACS.BACK.WORD STREAM)) ((IEQP LDELIM RDELIM) (* String delimiters *) (\BACKBIN STREAM) (WHILE (AND (NOT (EMACS.BOFP STREAM)) (OR (NOT (IEQP (\BACKPEEKBIN STREAM) LDELIM)) (EMACS.BACK.ESCAPEDP STREAM))) DO (\BACKBIN STREAM)) (COND ((EMACS.BOFP STREAM) (ERROR!))) (\BACKBIN STREAM)) (T (* Left Right delimters *) (\BACKBIN STREAM) (do (EMACS.BACK.SKIPSEPRS STREAM) (COND ((EMACS.BOFP STREAM) (ERROR!)) ((AND (FMEMB (\BACKPEEKBIN STREAM) EMACS.LDELIMS) (NOT (EMACS.BACK.ESCAPEDP STREAM))) (RETURN))) (EMACS.BACK.SEXPR STREAM) (COND ((OR (EMACS.BOFP STREAM) (IEQP (\BACKPEEKBIN STREAM) (CHARCODE CR))) (* At top of definition in middle of read. *) (ERROR!)))) (\BACKBIN STREAM) (EMACS.BSKIP STREAM EMACS.BQ)))))) (EMACS.BACK.WORD (LAMBDA (STREAM) (* kbr: "24-Jul-85 16:36") (* Backward a word. *) (PROG NIL (EMACS.BWORD STREAM)))) (EMACS.BACK.SKIPSEPRS (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Backwards SKIPSEPRS. *) (PROG (SA CH SNX) (SETQ SA (fetch (READTABLEP READSA) of EMACS.READTABLE)) (COND ((EMACS.BOFP STREAM) (RETURN))) (SETQ CH (\BACKPEEKBIN STREAM)) (SETQ SNX (\GETBASEBYTE SA CH)) (COND ((NOT (EQ SNX SEPRCHAR.RC)) (RETURN))) (\BACKBIN STREAM) (do (COND ((EMACS.BOFP STREAM) (RETURN))) (SETQ CH (\BACKPEEKBIN STREAM)) (SETQ SNX (\GETBASEBYTE SA CH)) (COND ((EQ SNX SEPRCHAR.RC) (\BACKBIN STREAM)) ((EQ SNX ESCAPE.RC) (\BIN STREAM) (COND ((NOT (EMACS.BACK.ESCAPEDP STREAM)) (\BACKBIN STREAM))) (RETURN)) (T (RETURN))))))) (EMACS.BACK.ESCAPEDP (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Is the previous byte escaped? *) (PROG (PTR SA CH SNX ANSWER) (* T if previous byte preceded by odd number of %%'s. *) (SETQ PTR (GETFILEPTR STREAM)) (COND ((ILEQ PTR 1) (RETURN NIL))) (SETQ SA (fetch (READTABLEP READSA) of EMACS.READTABLE)) (\BACKBIN STREAM) (do (SETQ CH (\BACKBIN STREAM)) (SETQ SNX (\GETBASEBYTE SA CH)) (COND ((EQ SNX ESCAPE.RC) (SETQ ANSWER (NOT ANSWER))) (T (RETURN))) (COND ((EMACS.BOFP STREAM) (RETURN)))) (SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.TAB (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Lisp indent. *) (PROG (PTR BOL EOL CODE INDENT OFFSET TABFLG) (* INDENT = how much we want to indent. OFFSET = how many chars to nonws. TABFLG = any tabs present at beginning of line. *) (SETQ PTR (GETFILEPTR STREAM)) (SETQ INDENT (EMACS.TAB.INDENT STREAM)) (SETQ BOL (EMACS.BOL STREAM PTR)) (* Calc OFFSET. *) (SETQ EOL (EMACS.EOL STREAM PTR)) (EMACS.SETFILEPTR STREAM BOL) (SETQ OFFSET 0) (for I from BOL to (SUB1 EOL) do (SETQ CODE (\BIN STREAM)) (COND ((EQUAL CODE (CHARCODE TAB)) (SETQ TABFLG T))) (COND ((NOT (BITTEST (ELT EMACS.SYNTAX (OR (NUMBERP CODE) 256)) EMACS.WS)) (RETURN))) (SETQ OFFSET (ADD1 OFFSET))) (* Insert and/or delete whitespace. *) (COND (TABFLG (EMACS.DELETE.BYTES STREAM BOL (IPLUS BOL OFFSET -1)) (COND ((NOT (ZEROP INDENT)) (TEDIT.INSERT STREAM (ALLOCSTRING INDENT " ") (ADD1 BOL))))) ((IEQP OFFSET INDENT) (* Do nothing. *) ) ((IGREATERP OFFSET INDENT) (EMACS.DELETE.BYTES STREAM BOL (IPLUS BOL (IDIFFERENCE OFFSET INDENT) -1))) ((ILESSP OFFSET INDENT) (TEDIT.INSERT STREAM (ALLOCSTRING (IDIFFERENCE INDENT OFFSET) " ") (ADD1 BOL))) (T (SHOULDNT))) (* Reposition fileptr. *) (COND ((ILEQ PTR (IPLUS BOL OFFSET)) (EMACS.SETFILEPTR STREAM (IPLUS BOL INDENT))) (T (EMACS.SETFILEPTR STREAM (IPLUS PTR (IDIFFERENCE INDENT OFFSET)))))))) (EMACS.TAB.INDENT (LAMBDA (STREAM) (* kbr: "19-Feb-85 15:14") (* Amount to indent for Lisp indent. *) (PROG (PTR BOD SISTER1PTR SISTER2PTR LDELIMFLG SISTER1 SISTERPTR OFFSET BOL ANSWER) (SETQ PTR (GETFILEPTR STREAM)) (* SETQ BOD (EMACS.BOD STREAM PTR)) (SETQ BOD 0) (EMACS.SETFILEPTR STREAM (EMACS.BOL STREAM PTR)) (EMACS.BSKIP STREAM EMACS.WS BOD) (* Get SISTER1PTR, SISTER2PTR, & LDELIMFLG *) (do (EMACS.BSKIP STREAM EMACS.SPACE) (COND ((ILEQ (GETFILEPTR STREAM) BOD) (RETURN))) (COND ((AND (FMEMB (\BACKPEEKBIN STREAM) EMACS.LDELIMS) (NOT (EMACS.BACK.ESCAPEDP STREAM))) (SETQ LDELIMFLG T) (RETURN))) (EMACS.SAFE.BACK.SEXPR STREAM) (SETQ SISTER2PTR SISTER1PTR) (SETQ SISTER1PTR (GETFILEPTR STREAM))) (* Get SISTER1. *) (COND (SISTER1PTR (EMACS.SETFILEPTR STREAM SISTER1PTR) (SETQ SISTER1 (RATOM STREAM)))) (* Get SISTERPTR & OFFSET. *) (SETQ SISTERPTR (OR SISTER1PTR (GETFILEPTR STREAM))) (COND ((AND SISTER1 (LITATOM SISTER1)) (SETQ OFFSET (GETPROP SISTER1 (QUOTE EMACS.TAB))))) (COND (OFFSET (SETQ OFFSET (SUB1 OFFSET))) ((NULL SISTER1) (SETQ OFFSET 1)) ((NULL LDELIMFLG) (SETQ OFFSET 0)) ((NULL SISTER2PTR) (SETQ OFFSET 0)) (T (SETQ SISTERPTR SISTER2PTR) (SETQ OFFSET 0))) (* Get ANSWER. *) (SETQ BOL (EMACS.BOL STREAM SISTERPTR)) (EMACS.SETFILEPTR STREAM BOL) (SETQ ANSWER OFFSET) (for I from BOL to (SUB1 SISTERPTR) do (COND ((IEQP (\BIN STREAM) (CHARCODE TAB)) (SETQ ANSWER (IPLUS ANSWER 8))) (T (SETQ ANSWER (ADD1 ANSWER))))) EXIT(EMACS.SETFILEPTR STREAM PTR) (RETURN ANSWER)))) (EMACS.INIT.SYNTAX (LAMBDA NIL (* kbr: "19-Feb-85 15:14") (PROG NIL (* "Character" 256 is used to handle IMAGEOBJs. *) (SETQ EMACS.SYNTAX (ARRAY 257 (QUOTE WORD) 0 0)) (FOR I FROM 0 TO 256 DO (SETA EMACS.SYNTAX I (LOGOR EMACS.NONCR EMACS.NONWS EMACS.NONSD EMACS.ALPHA))) (FOR I IN (CHARCODE (TAB LF SP)) DO (SETA EMACS.SYNTAX I (LOGOR EMACS.WS EMACS.NONCR EMACS.NONSD EMACS.SPACE))) (SETA EMACS.SYNTAX (CHARCODE CR) (LOGOR EMACS.WS EMACS.CR EMACS.NONSD)) (FOR I IN (QUOTE (39 44 64 96)) DO (SETA EMACS.SYNTAX I (LOGOR EMACS.NONWS EMACS.NONCR EMACS.NONSD EMACS.BQ EMACS.ALPHA))) (SETQ EMACS.DELIMS NIL) (SETQ EMACS.SDELIMS NIL) (SETQ EMACS.LDELIMS NIL) (SETQ EMACS.RDELIMS NIL) (EMACS.DELIMS (CHARCODE "(") (CHARCODE ")")) (EMACS.DELIMS (CHARCODE "[") (CHARCODE "]")) (EMACS.DELIMS (CHARCODE "{") (CHARCODE "}")) (EMACS.DELIMS 34 34)))) ) (DECLARE: DONTEVAL@LOAD DOCOPY (EMACS.INIT) (MOVD? 'TEDIT.SELECT.LINE.SCANNER 'OLD.TEDIT.SELECT.LINE.SCANNER) (MOVD 'NEW.TEDIT.SELECT.LINE.SCANNER 'TEDIT.SELECT.LINE.SCANNER) (MOVD 'EMACS 'TEDIT) ) (PUTPROPS EMACS COPYRIGHT ("Xerox Corporation" 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (9473 52815 (EMACS.INIT 9483 . 10172) (EMACS.INIT.BACKGROUND 10174 . 10893) (DEDITEmacs 10895 . 11408) (EMACS.INIT.COMMANDS 11410 . 12431) (EMACS.COMMAND 12433 . 12629) (EMACS.OPERATE 12631 . 15717) (EMACS.GETKEY 15719 . 15982) (EMACS 15984 . 17010) (EMACS.PROCESS 17012 . 17288) ( EMACS.TEDIT1 17290 . 17746) (EMACS.WINDOW 17748 . 18175) (EMACS.SETFILEPTR 18177 . 18578) ( EMACS.GETCARETPTR 18580 . 19075) (EMACS.SETCARETPTR 19077 . 19692) (EMACS.SHOWCARET 19694 . 20060) ( EMACS.BOL 20062 . 20647) (EMACS.EOL 20649 . 21228) (EMACS.DELETE.BYTES 21230 . 22211) (EMACS.BOFP 22213 . 22362) (EMACS.EOFP 22364 . 22538) (EMACS.CCHAR 22540 . 22913) (EMACS.PEEKBIN 22915 . 23232) ( EMACS.FBYTE 23234 . 23507) (EMACS.FWORD 23509 . 23816) (EMACS.BYTEP 23818 . 23982) (EMACS.FSKIP 23984 . 24527) (EMACS.FSKIPTO 24529 . 25027) (EMACS.BBYTE 25029 . 25307) (EMACS.BCHAR 25309 . 25617) ( EMACS.BPEEKCHAR 25619 . 26020) (EMACS.BWORD 26022 . 26330) (EMACS.BSKIP 26332 . 26856) (EMACS.BSKIPTO 26858 . 27360) (EMACS.SET.EOF 27362 . 27891) (EMACS.GOTO.BOL 27893 . 28168) (EMACS.BACK.BYTE 28170 . 28425) (EMACS.FWD.DELETE.BYTE 28427 . 28751) (EMACS.GOTO.EOL 28753 . 29022) (EMACS.FWD.BYTE 29024 . 29281) (EMACS.KILL.LINE 29283 . 29939) (EMACS.DELETE.CHARS 29941 . 30904) (EMACS.REDISPLAY 30906 . 31309) (EMACS.NEXT.LINE 31311 . 32266) (EMACS.PREVIOUS.LINE 32268 . 33102) (EMACS.QUOTE.BYTE 33104 . 33694) (EMACS.SEARCH 33696 . 38017) (EMACS.TRANSPOSE.BYTES 38019 . 38951) (EMACS.NEXT.SCREENFULL 38953 . 39650) (EMACS.CXCV 39652 . 40382) (EMACS.CXCW 40384 . 40699) (EMACS.CXCZ 40701 . 41083) ( EMACS.FWD.SEXPR 41085 . 41534) (EMACS.BACK.DELETE.BYTE 41536 . 42065) (EMACS.GOTO.BOD 42067 . 42708) ( EMACS.BOD 42710 . 43596) (EMACS.GOTO.EOD 43598 . 44260) (EMACS.EOD 44262 . 45148) (EMACS.KILL.SEXPR 45150 . 45640) (EMACS.GOTO.BOF 45642 . 45979) (EMACS.GOTO.EOF 45981 . 46268) (EMACS.BACK.WORD 46270 . 46526) (EMACS.FWD.DELETE.WORD 46528 . 47066) (EMACS.EDIT 47068 . 47650) (EMACS.FWD.WORD 47652 . 47906) (EMACS.GRIND 47908 . 48448) (EMACS.SNARF 48450 . 48813) (EMACS.MT 48815 . 49569) ( EMACS.PREVIOUS.SCREENFULL 49571 . 50272) (EMACS.JOIN.LINES 50274 . 51483) (EMACS.BACK.DELETE.WORD 51485 . 51926) (NEW.TEDIT.SELECT.LINE.SCANNER 51928 . 52813)) (52816 73467 (\TEDIT1 52826 . 54975) ( \TEDIT.COMMAND.LOOP 54977 . 73465)) (74455 102685 (EMACS.DELIMS 74465 . 76054) (EMACS.CR 76056 . 76838 ) (EMACS.RPAREN 76840 . 77286) (EMACS.RBRACKET 77288 . 77736) (EMACS.RBRACE 77738 . 78184) ( EMACS.RANGLE 78186 . 78632) (EMACS.SDELIM.COMMAND 78634 . 79085) (EMACS.LDELIM.COMMAND 79087 . 79538) (EMACS.RDELIM.COMMAND 79540 . 79991) (EMACS.SDELIM 79993 . 80800) (EMACS.LDELIM 80802 . 81543) ( EMACS.RDELIM 81545 . 82287) (EMACS.OPEN.STRING 82289 . 82635) (EMACS.CLOSE.STRING 82637 . 83809) ( EMACS.OPEN.BALANCE 83811 . 84316) (EMACS.CLOSE.BALANCE 84318 . 86090) (EMACS.FLUSH.CACHE 86092 . 86605 ) (EMACS.SCACHE 86607 . 88255) (EMACS.BCACHE 88257 . 90050) (EMACS.SAFE.BACK.SEXPRS 90052 . 90992) ( EMACS.SAFE.BACK.SEXPR 90994 . 91529) (EMACS.BACK.SEXPR 91531 . 93407) (EMACS.BACK.WORD 93409 . 93665) (EMACS.BACK.SKIPSEPRS 93667 . 94698) (EMACS.BACK.ESCAPEDP 94700 . 95631) (EMACS.TAB 95633 . 98287) ( EMACS.TAB.INDENT 98289 . 101361) (EMACS.INIT.SYNTAX 101363 . 102683))))) STOP \ No newline at end of file diff --git a/lispusers/ENDNOTE b/lispusers/ENDNOTE new file mode 100644 index 00000000..b952fe4e --- /dev/null +++ b/lispusers/ENDNOTE @@ -0,0 +1 @@ +(FILECREATED "18-Feb-87 15:43:31" {SUMEX-AIM}PS:ENDNOTE.;4 15652 changes to: (FNS NOTE.BUTTONEVENTINFN) previous date: "18-Feb-87 10:11:49" {SUMEX-AIM}PS:ENDNOTE.;6) (* Copyright (c) 1987 by Leland Stanford Junior University. All rights reserved.) (PRETTYCOMPRINT ENDNOTECOMS) (RPAQQ ENDNOTECOMS ((* Developed under support from NIH grant RR-00785.) (* Written by Frank Gilmurray and Sami Shaio.) (FNS ADD.ENDNOTE INSERT.ENDNOTES INSERT.ENDNOTES.TEXT DELETE.ENDNOTES NOTESREGIONP SET.ENDNOTE.STYLE MAP.ENDNOTE.LOOKS GET.ENDNOTE.FONTS) (FNS ENDNOTEP NOTE.PUTFN NOTE.GETFN NOTE.BUTTONEVENTINFN) (RECORDS ENDNOTEFONTS) (* * Allow user to edit Endnote text in another TEdit window.) (FNS AUX.TEDIT AUX.TEDIT.AFTERQUITFN AUX.TEDIT.TITLEMENUFN) (* * Delimit text between two markers known as REGION MARKERS.) (FNS REGMARKOBJ REGMARKOBJP REGMARK.DISPLAYFN REGMARK.IMAGEBOXFN REGMARK.PUTFN REGMARK.GETFN REGMARK.BUTTONEVENTINFN) (RECORDS REGMARKOBJ))) (* Developed under support from NIH grant RR-00785.) (* Written by Frank Gilmurray and Sami Shaio.) (DEFINEQ (ADD.ENDNOTE (LAMBDA (STREAM WINDOW) (* fsg "17-Feb-87 10:47") (* * Insert an ENDNOTE ImageObject as a superscript. Displayed as a number when updated.) (LET ((NOBJ (NUMBEROBJ 'NOTE))) (TEDIT.INSERT.OBJECT NOBJ STREAM) (COND ((UPDATE? WINDOW) (UPDATE.NUMBEROBJS WINDOW 'ENDNOTEP)) (T NIL)) (replace (NUMBEROBJ NUMBER.TEXT) of (fetch OBJECTDATUM of NOBJ) with (TEDIT.GETINPUT STREAM "Endnote text:")) (TEDIT.PROMPTPRINT STREAM "" T)))) (INSERT.ENDNOTES (LAMBDA (STREAM WINDOW) (* fsg "18-Feb-87 09:38") (* * Inserts text of endnotes at the end of the TEdit document. The text is inserted between two Region marking  imageobjs.) (LET* ((TEXTOBJ (TEXTOBJ STREAM)) (LIST.OF.ENDNOTES (TSP.LIST.OF.OBJECTS TEXTOBJ 'ENDNOTEP)) (CARETPOSITION (fetch CH# of (TEDIT.GETSEL STREAM)))) (DELETE.ENDNOTES STREAM) (COND (LIST.OF.ENDNOTES (TEDIT.PROMPTPRINT STREAM "Inserting notes at the end of the document..." T) (TEDIT.INSERT.OBJECT (REGMARKOBJ 'ENDNOTES 'Endnotes-START) STREAM (ADD1 (fetch TEXTLEN of TEXTOBJ))) (TEDIT.LOOKS STREAM '(PROTECTED ON) (fetch TEXTLEN of TEXTOBJ) 1) (TEDIT.INSERT STREAM (CONCAT (CHARACTER (CHARCODE EOL)) "Notes" (CHARACTER (CHARCODE EOL))) (ADD1 (fetch TEXTLEN of TEXTOBJ)) (fetch (ENDNOTEFONTS TITLE.FONT) of (GET.ENDNOTE.FONTS WINDOW)) T) (INSERT.ENDNOTES.TEXT STREAM TEXTOBJ LIST.OF.ENDNOTES) (TEDIT.INSERT.OBJECT (REGMARKOBJ 'ENDNOTES 'Endnotes-END) STREAM (ADD1 (fetch TEXTLEN of TEXTOBJ))) (TEDIT.LOOKS STREAM '(PROTECTED ON) (fetch TEXTLEN of TEXTOBJ) 1) (TEDIT.PROMPTPRINT STREAM "done") (TEDIT.NORMALIZECARET TEXTOBJ (TEDIT.SETSEL STREAM CARETPOSITION 1)) ) (T NIL))))) (INSERT.ENDNOTES.TEXT (LAMBDA (STREAM TEXTOBJ LIST.OF.ENDNOTES) (* fsg " 7-Jan-87 14:31") (* * Here to print the text of each endnote.) (LET ((TEXTLOOKS (fetch (ENDNOTEFONTS TEXT.FONT) of (GET.ENDNOTE.FONTS WINDOW)))) (for ENDNOTEOBJ in LIST.OF.ENDNOTES do (LET ((NUMSTRING (MKSTRING (fetch (NUMBEROBJ NUMSTRING) of (fetch OBJECTDATUM of (CAR ENDNOTEOBJ))))) (TEXT (fetch (NUMBEROBJ NUMBER.TEXT) of (fetch OBJECTDATUM of (CAR ENDNOTEOBJ))))) (TEDIT.INSERT STREAM NUMSTRING (ADD1 (fetch TEXTLEN of TEXTOBJ)) TEXTLOOKS T) (TEDIT.INSERT STREAM (CONCAT " " TEXT (CHARACTER (CHARCODE EOL))) (ADD1 (fetch TEXTLEN of TEXTOBJ)) TEXTLOOKS T)))))) (DELETE.ENDNOTES (LAMBDA (STREAM) (* fsg "18-Feb-87 09:11") (* * Delete the Endnotes, i.e. delete the start/end REGMARK ImageObjects and all the text between them.) (LET* ((TEXTOBJ (TEXTOBJ STREAM)) (NOTEMARKER.LIST (TSP.LIST.OF.OBJECTS TEXTOBJ 'NOTESREGIONP)) (NOTES.START (CADAR NOTEMARKER.LIST)) (NOTES.END (CADADR NOTEMARKER.LIST))) (AND NOTEMARKER.LIST (TEDIT.DELETE STREAM NOTES.START (IDIFFERENCE (ADD1 NOTES.END) NOTES.START)))))) (NOTESREGIONP (LAMBDA (IMOBJ) (* fsg "26-Jan-87 09:41") (AND (REGMARKOBJP IMOBJ) (EQ (fetch REGION.USE of (fetch OBJECTDATUM of IMOBJ)) 'ENDNOTES)))) (SET.ENDNOTE.STYLE (LAMBDA (STREAM WINDOW) (* fsg " 9-Jan-87 09:18") (* * Set the font of the ENDNOTE number, title, or text.) (LET ((NOTE.FONTS (GET.ENDNOTE.FONTS WINDOW)) (NOTE.TYPE (MENU (create MENU TITLE _ "ENDNOTE Fonts" CENTERFLG _ T ITEMS _ '(Number Title Text)))) OLD.FONT NEW.FONT) (AND NOTE.TYPE (PROGN (SETQ OLD.FONT (SELECTQ NOTE.TYPE (Number (fetch (ENDNOTEFONTS NUMBER.FONT) of NOTE.FONTS)) (Title (fetch (ENDNOTEFONTS TITLE.FONT) of NOTE.FONTS)) (Text (fetch (ENDNOTEFONTS TEXT.FONT) of NOTE.FONTS)) NIL)) (TEDIT.PROMPTPRINT STREAM (CONCAT "Change Endnote " NOTE.TYPE " font " (LIST (ABBREVIATE.FONT OLD.FONT)) " to...") T) (SETQ NEW.FONT (FONTCREATE (GET.TSP.FONT WINDOW OLD.FONT))) (COND ((NEQ OLD.FONT NEW.FONT) (SELECTQ NOTE.TYPE (Number (replace (ENDNOTEFONTS NUMBER.FONT) of NOTE.FONTS with NEW.FONT)) (Title (replace (ENDNOTEFONTS TITLE.FONT) of NOTE.FONTS with NEW.FONT)) (Text (replace (ENDNOTEFONTS TEXT.FONT) of NOTE.FONTS with NEW.FONT)) NIL) (AND (EQ NOTE.TYPE 'Number) (MAP.ENDNOTE.LOOKS STREAM NEW.FONT))) (T NIL)) (TEDIT.PROMPTPRINT STREAM "" T)))))) (MAP.ENDNOTE.LOOKS (LAMBDA (STREAM NUMBERFONT) (* fsg " 9-Jan-87 09:09") (* * Here to update the ENDNOTE looks. Only the ENDNOTE superscript numbers are updated.) (LET ((LIST.OF.NOTES (TSP.LIST.OF.OBJECTS (TEXTOBJ STREAM) 'ENDNOTEP))) (AND LIST.OF.NOTES (PROGN (TEDIT.PROMPTPRINT STREAM "Updating ENDNOTE Number looks..." T) (for NOTE/CH# in LIST.OF.NOTES do (TEDIT.LOOKS STREAM NUMBERFONT (CADR NOTE/CH#) 1)) (TEDIT.PROMPTPRINT STREAM "done.")))))) (GET.ENDNOTE.FONTS (LAMBDA (WINDOW) (* fsg " 5-Jan-87 10:40") (* * Setup the default ENDNOTE fonts for number, title, and text.) (OR (WINDOWPROP WINDOW 'ENDNOTE.FONTS) (PROGN (WINDOWPROP WINDOW 'ENDNOTE.FONTS (create ENDNOTEFONTS NUMBER.FONT _ GP.DefaultFont TITLE.FONT _ GP.DefaultFont TEXT.FONT _ GP.DefaultFont)) (WINDOWPROP WINDOW 'ENDNOTE.FONTS))))) ) (DEFINEQ (ENDNOTEP (LAMBDA (IMOBJ) (* ss: " 2-Jul-85 16:51") (AND (NUMBEROBJP IMOBJ) (EQ (fetch USE of (fetch OBJECTDATUM of IMOBJ)) 'NOTE)))) (NOTE.PUTFN (LAMBDA (NUMBEROBJ STREAM WINDOW) (* fsg "28-Jan-87 13:48") (* * Used to put a numberobj that is functioning as an endnote.) (replace (NUMBEROBJ FONT) of (fetch OBJECTDATUM of NUMBEROBJ) with (for NOTEFONT in (GET.ENDNOTE.FONTS WINDOW) collect (LIST.FONT.PROPS NOTEFONT) )) (PRIN4 (LIST 'Endnote (IMAGEOBJPROP NUMBEROBJ 'TAG) (fetch OBJECTDATUM of NUMBEROBJ)) STREAM))) (NOTE.GETFN (LAMBDA (NEWOBJ USE/TEXT WINDOW) (* fsg " 8-Jan-87 10:19") (* * Used to get a numberobj that is functioning as an endnote.) (WINDOWPROP WINDOW 'ENDNOTE.FONTS (for NOTEFONT in (fetch (NUMBEROBJ FONT) of USE/TEXT) collect (FONTCREATE NOTEFONT))) (replace (NUMBEROBJ FONT) of USE/TEXT with NIL) (replace OBJECTDATUM of NEWOBJ with USE/TEXT) NEWOBJ)) (NOTE.BUTTONEVENTINFN (LAMBDA (NUMBEROBJ STREAM) (* fsg "18-Feb-87 11:16") (* * Bring up another TEdit window where user can edit the text of an Endnote.) (MENU (create MENU TITLE _ 'Endnotes% Menu CENTERFLG _ T ITEMS _ '((Edit% Endnote (AUX.TEDIT NUMBEROBJ (CONCAT "Endnote #" (fetch NUMSTRING of (fetch OBJECTDATUM of NUMBEROBJ))) STREAM)) (Tag% Endnote (XREF.TAG.OBJECT NUMBEROBJ STREAM))))))) ) [DECLARE: EVAL@COMPILE (RECORD ENDNOTEFONTS (NUMBER.FONT TITLE.FONT TEXT.FONT)) ] (* * Allow user to edit Endnote text in another TEdit window.) (DEFINEQ (AUX.TEDIT (LAMBDA (IMOBJ TITLE STREAM) (* fsg "20-Jan-87 15:46") (* * Open a TEdit window where the user can view/edit the text of the selected Endnote.) (LET* ((MAINWINDOW (\TEDIT.MAINW STREAM)) (AUXWINDOW (CREATEW (WINDOWPROP MAINWINDOW 'AUXW.REGION) TITLE))) (WINDOWPROP AUXWINDOW 'MAIN.WINDOW MAINWINDOW) (WINDOWPROP AUXWINDOW 'NOTE.IMAGEOBJ IMOBJ) (TEDIT (MKSTRING (fetch (NUMBEROBJ NUMBER.TEXT) of (fetch OBJECTDATUM of IMOBJ))) AUXWINDOW NIL '(AFTERQUITFN AUX.TEDIT.AFTERQUITFN TITLEMENUFN AUX.TEDIT.TITLEMENUFN))))) (AUX.TEDIT.AFTERQUITFN (LAMBDA (AUXWINDOW) (* fsg "20-Jan-87 15:56") (* * Here AFTER user finished with Endnote TEdit process.) (LET ((MAINWINDOW (WINDOWPROP AUXWINDOW 'MAIN.WINDOW))) (WINDOWPROP MAINWINDOW 'AUXW.REGION (WINDOWPROP AUXWINDOW 'REGION)) (GIVE.TTY.PROCESS MAINWINDOW) (TEDIT.NORMALIZECARET (TEXTOBJ MAINWINDOW))))) (AUX.TEDIT.TITLEMENUFN (LAMBDA (AUXWINDOW) (* fsg "20-Jan-87 15:49") (* * Here when left or middle button hit in title bar.) (LET ((ITEM (MENU (create MENU CENTERFLG _ T ITEMS _ '(Save% Changes Abort% Changes))))) (AND ITEM (PROGN (SELECTQ ITEM (Save% Changes (replace (NUMBEROBJ NUMBER.TEXT) of (fetch OBJECTDATUM of (WINDOWPROP AUXWINDOW 'NOTE.IMAGEOBJ)) with (COERCETEXTOBJ (TEXTSTREAM AUXWINDOW) 'STRINGP))) NIL) (TEDIT.QUIT (TEXTSTREAM AUXWINDOW))))))) ) (* * Delimit text between two markers known as REGION MARKERS.) (DEFINEQ (REGMARKOBJ (LAMBDA (USE MARKING) (* ss: "15-Jul-85 11:54") (LET ((NEWOBJ (IMAGEOBJCREATE (create REGMARKOBJ REGION.USE _ USE MARKING _ MARKING) (IMAGEFNSCREATE (FUNCTION REGMARK.DISPLAYFN) (FUNCTION REGMARK.IMAGEBOXFN) (FUNCTION REGMARK.PUTFN) (FUNCTION REGMARK.GETFN) (FUNCTION NILL) (FUNCTION REGMARK.BUTTONEVENTINFN) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL))))) (IMAGEOBJPROP NEWOBJ 'TYPE 'REGMARKOBJ) NEWOBJ))) (REGMARKOBJP (LAMBDA (IMOBJ) (* ss: "12-Jul-85 15:04") (AND IMOBJ (EQ (IMAGEOBJPROP IMOBJ 'TYPE) 'REGMARKOBJ)))) (REGMARK.DISPLAYFN (LAMBDA (OBJ STREAM) (* fsg "18-Feb-87 09:18") (* * REGMARK is just a marker, it doesn't actually display anything.) NIL)) (REGMARK.IMAGEBOXFN (LAMBDA (OBJ STREAM CURRENTX RIGHTMARGIN) (* fsg "17-Feb-87 10:22") (* * REGMARK is just a marker, it doesn't actually display anything.) (create IMAGEBOX XSIZE _ 0 YSIZE _ 0 YDESC _ 0 XKERN _ 0))) (REGMARK.PUTFN (LAMBDA (MARKOBJ STREAM) (* fsg "28-Jan-87 14:10") (PRIN2 (LIST 'Region (IMAGEOBJPROP MARKOBJ 'TAG) (LIST (fetch REGION.USE of (fetch OBJECTDATUM of MARKOBJ)) (fetch MARKING of (fetch OBJECTDATUM of MARKOBJ)))) STREAM))) (REGMARK.GETFN (LAMBDA (STREAM) (* fsg "28-Jan-87 16:06") (OR (WINDOWPROP (PROCESSPROP (THIS.PROCESS) 'WINDOW) 'IMAGEOBJ.MENUW) (TSP.FMMENU (TEXTSTREAM (PROCESSPROP (THIS.PROCESS) 'WINDOW)))) (LET* ((REGMARK.ARGS (CDR (READ STREAM))) (NEWOBJ (APPLY 'REGMARKOBJ (CADR REGMARK.ARGS)))) (IMAGEOBJPROP NEWOBJ 'TAG (CAR REGMARK.ARGS)) NEWOBJ))) (REGMARK.BUTTONEVENTINFN (LAMBDA (MARKOBJ STREAM) (* fsg "18-Feb-87 10:07") (* * This function is never called because the REGMARK ImageObjects are protected after they are inserted and  anything protected can't be selected.) (AND (MOUSESTATE MIDDLE) (LET ((MARKDATUM (fetch OBJECTDATUM of MARKOBJ))) (TEDIT.PROMPTPRINT STREAM (CONCAT "Region used for " (fetch REGION.USE of MARKDATUM) (COND ((fetch MARKING of MARKDATUM) (CONCAT ", Marker is " (fetch MARKING of MARKDATUM))) (T ""))) T))))) ) [DECLARE: EVAL@COMPILE (RECORD REGMARKOBJ (REGION.USE MARKING)) ] (PUTPROPS ENDNOTE COPYRIGHT ("Leland Stanford Junior University" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (1240 8234 (ADD.ENDNOTE 1252 . 1873) (INSERT.ENDNOTES 1877 . 3628) (INSERT.ENDNOTES.TEXT 3632 . 4538) (DELETE.ENDNOTES 4542 . 5135) (NOTESREGIONP 5139 . 5384) (SET.ENDNOTE.STYLE 5388 . 7086) (MAP.ENDNOTE.LOOKS 7090 . 7727) (GET.ENDNOTE.FONTS 7731 . 8231)) (8236 10115 (ENDNOTEP 8248 . 8477) ( NOTE.PUTFN 8481 . 9034) (NOTE.GETFN 9038 . 9547) (NOTE.BUTTONEVENTINFN 9551 . 10112)) (10280 12228 ( AUX.TEDIT 10292 . 11019) (AUX.TEDIT.AFTERQUITFN 11023 . 11495) (AUX.TEDIT.TITLEMENUFN 11499 . 12225)) (12302 15479 (REGMARKOBJ 12314 . 13131) (REGMARKOBJP 13135 . 13328) (REGMARK.DISPLAYFN 13332 . 13548) (REGMARK.IMAGEBOXFN 13552 . 13859) (REGMARK.PUTFN 13863 . 14228) (REGMARK.GETFN 14232 . 14759) ( REGMARK.BUTTONEVENTINFN 14763 . 15476))))) STOP \ No newline at end of file diff --git a/lispusers/EQUATIONEXAMPLES.TEDIT b/lispusers/EQUATIONEXAMPLES.TEDIT new file mode 100644 index 00000000..b971a11e --- /dev/null +++ b/lispusers/EQUATIONEXAMPLES.TEDIT @@ -0,0 +1,10 @@ +enˇvĹos EQUATION EDITOR EXAMPLES 2 2 4 1 4 1 EQUATION EDITOR EXAMPLES 1 4 By: Tad Hogg(Hogg.pa@Xerox.com) DESCRIPTION These are some examples of text formatted using the Equation Editor (contained in the file EQUATIONS). Examples: fraction: a = fraction ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "2x+5")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "23"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) sum: s = sum ( ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "i=1")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "m")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "i"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) = fraction ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "m (m+1)")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "2"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) integral: integral ( ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "1")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x dx"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) = 0.5 sub/superscripts: sub/superscripts ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "H")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "m")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " ")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " "))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) = 24 = sub/superscripts ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "X")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "i")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "23")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "KL")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "j"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) root: root ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x + 34y + z")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " "))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) maximum: max/min ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "max")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "x in S")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "f(x)"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) limit: max/min ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "lim")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "x") ( (MATH 8 (MEDIUM REGULAR REGULAR)) "_") ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "f(x)"))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix: a = matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "11")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "12")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "13")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "21")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "22")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "23"))) (rows 2 columns 3 enclosureKind NIL enclosureSide NIL numPieces 6 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "1")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 3 columns 1 enclosureKind NIL enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) = matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "12")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "22"))) (rows 2 columns 1 enclosureKind NIL enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) A = matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "23x+2")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "4")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "-6")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "8x+4")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "1")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x"))) (rows 3 columns 3 enclosureKind NIL enclosureSide NIL numPieces 9 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind parentheses enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#52,162130) + matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind parentheses enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu NIL) + ... + matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind parentheses enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu NIL) = sub/superscripts ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "2")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " ")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " ")) ( ( (TIMESROMAN 8 (MEDIUM REGULAR REGULAR)) " "))) (fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) group ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n"))) (enclosureKind bars enclosureSide NIL fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) group ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n"))) (enclosureKind braces enclosureSide NIL fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) group ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n"))) (enclosureKind brackets enclosureSide NIL fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) group ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n"))) (enclosureKind parentheses enclosureSide NIL fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) group ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n"))) (enclosureKind angles enclosureSide NIL fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind bars enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#47,157614) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind braces enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#47,157670) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind NIL enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind parentheses enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#62,53260) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "n")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "0"))) (rows 2 columns 1 enclosureKind angles enclosureSide NIL numPieces 2 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#52,142000) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "y")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "z"))) (rows 3 columns 1 enclosureKind bars enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#52,142054) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "y")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "z"))) (rows 3 columns 1 enclosureKind braces enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#74,115260) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "y")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "z"))) (rows 3 columns 1 enclosureKind NIL enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR))) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "y")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "z"))) (rows 3 columns 1 enclosureKind parentheses enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#62,53054) matrix ( ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "x")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "y")) ( ( (TIMESROMAN 10 (MEDIUM REGULAR REGULAR)) "z"))) (rows 3 columns 1 enclosureKind angles enclosureSide NIL numPieces 3 fontSpec (GACHA 10 (MEDIUM REGULAR REGULAR)) rowMenu {MENU}#62,53000) (LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC "" "") STARTINGPAGE# 85) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC "" "")) (174 42 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE NIL . LETTER) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO NIL) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))-ČT,ŠŠ8,ŠŠ8HČČ PAGEHEADING RUNNINGHEAD,Č2ŠŠ8 42ŠŠ8Č@ČČ PAGEHEADINGBOO CLASSICCLASSICCLASSICMODERN MODERNMODERN +?1(DEFAULTFONT 1 (GACHA 10) (GACHA 8) (TERMINAL 8)) + HELVETICA + HELVETICA + HRULE.GETFNMODERN + HRULE.GETFN HELVETICA +  HRULE.GETFN HELVETICA + HRULE.GETFN  HRULE.GETFNMODERN + HRULE.GETFNMODERN + HRULE.GETFNMODERN  HRULE.GETFNMODERN    f    ŠEQIO.Get ÖEQIO.GetŤEQIO.Get ÜEQIO.Get KEQIO.GetMEQIO.Get ŞEQIO.Get ăEQIO.Get <EQIO.Get ÂEQIO.GetEQIO.GetćEQIO.GetfEQIO.GetEQIO.GetřEQIO.Get řEQIO.GetKEQIO.Get‘EQIO.Get“EQIO.Get•EQIO.Get˜EQIO.Get“EQIO.GetţEQIO.GetEQIO.GetäEQIO.GetEQIO.GetEQIO.Get4EQIO.Get6EQIO.GetEQIO.Get:EQIO.Get5EQIO.Get"hźzş \ No newline at end of file diff --git a/lispusers/EQUATIONFORMS b/lispusers/EQUATIONFORMS new file mode 100644 index 00000000..650c646c --- /dev/null +++ b/lispusers/EQUATIONFORMS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "18-Apr-88 14:00:00" {ERINYES}LYRIC>EQUATIONFORMS.;2 102911 changes to%: (VARS EQUATIONFORMSCOMS) (FNS EQ.SumGroup EQ.IntegralGroup EQ.MakeNSItem) previous date%: "30-Apr-87 10:52:34" |{IE:PARC:XEROX}LYRIC>LISPUSERS>EQUATIONFORMS.;1|) (* " Copyright (c) 1986, 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT EQUATIONFORMSCOMS) (RPAQQ EQUATIONFORMSCOMS [ (* ;;; "ATTACHEDBOX module: Part 1 of 5") (* ;  "Utility functions to manipulate attached regions") (* ;; "These functions use two sets of coords: global coords in which positions are given w.r.t. the lower left corner of a box, and side coords in which positions are given w.r.t. a particular side of the box. For the side coords, the origin is at the point on the side closest to the l.l. corner of the box, the x-axis points along the side toward the other end, and the y-axis points away from the box region") (FNS AB.RealPosition AB.PointPos AB.SidePosition AB.PlaceRegion AB.AdjustToLL AB.OppositeSide AB.RegionToBox AB.BoxToRegion AB.RelativePos AB.BiggerRegion AB.Check AB.PositionRegion AB.Position2Regions) (* ;;; "EQGROUP module: Part 2 of 5") (* ; "group equation functions") (FNS EQ.Group EQ.GroupCreate EQ.Make.group) (* ; "set up data definitions") [P (EQIO.AddType 'group 'EQ.Group 1 '(objectProps (enclosureKind NIL enclosureSide NIL) pieceNames ("item") wholeEditFn EQ.EnclosureEdit initialPropFn EQ.GroupCreate] (* ;;; "specific enclosure data") (RECORDS EQ.EnclosureData) (FNS EQ.AddEnclosure EQ.GetEnclosureData) (* ; "set up data for enclosures") (P (EQ.AddEnclosure 'angles (FUNCTION EQ.angles) "< angle brackets >") (EQ.AddEnclosure 'bars (FUNCTION EQ.bars) "| bars |") (EQ.AddEnclosure 'braces (FUNCTION EQ.braces) "{ braces }") (EQ.AddEnclosure 'brackets (FUNCTION EQ.brackets) "[ brackets ]") (EQ.AddEnclosure 'parentheses (FUNCTION EQ.parentheses) "( parentheses )") (EQIO.TypeProp 'group 'defaultEnclosure 'brackets)) (* ;;; "general enclosure functions") (FNS EQ.enclosure EQ.EnclosureCreate EQ.EnclosureEdit EQ.EnclosureKind EQ.EnclosureSide) (* ;;; "enclosure form functions") (FNS EQ.angles EQ.bars EQ.braces EQ.brackets EQ.parentheses EQ.enclosureForm EQ.enclosureWidth) (* ;;; "enclosure drawing functions") (FNS EQ.DrawAngles EQ.DrawBars EQ.DrawBraces EQ.DrawBrackets EQ.DrawParentheses) (* ;;; "EQMATRIX module: Part 3 of 5") (* ; "matrix equation functions") (FNS EQ.Matrix EQ.Make.matrix EQ.layout EQ.MatrixAdd EQ.MatrixChanged EQ.MatrixCreate EQ.MatrixDelete EQ.MatrixEdit EQ.MatrixGetMenu EQ.MatrixSelect) (INITVARS (EQ.Matrix.MaxPieces 100)) (GLOBALVARS EQ.Matrix.MaxPieces) [P (EQIO.AddType 'matrix 'EQ.Matrix 1 '(objectProps (rows 1 columns 1 enclosureKind NIL enclosureSide NIL) variable? T wholeEditFn EQ.MatrixEdit specialSelectFn EQ.MatrixSelect initialPropFn EQ.MatrixCreate changeFn EQ.MatrixChanged] (* ;;; "EQNFORMS module: Part 4 of 5") (* ; "fraction") (FNS EQ.Fraction EQ.Make.fraction) (* ;;; "sum group") (FNS EQ.SumGroup EQ.Make.sum EQ.Make.product EQ.Make.union EQ.Make.intersection) (* ;;; "integral group") (FNS EQ.IntegralGroup EQ.Make.integral EQ.Make.lineIntegral) (* ;;; "super- and sub- scripts") (FNS EQ.Script EQ.Make.sub/superscripts) (* ;;; "max/min/limit etc") (FNS EQ.MaxMin EQ.Make.max/min) (* ;;; "utilities") (FNS EQ.StreamSize EQ.UseNS? EQ.MakeNSItem) (GLOBALVARS EQ.UseNSChars EQ.NSChars) (* ;  "EQ.UseNSChars = NIL to use press fonts for display") [INITVARS EQ.UseNSChars (EQ.NSChars '(SUM ((CLASSIC 24) 9814) PRODUCT ((CLASSIC 24) 9811) SUM ((MODERN 30) 61306) PRODUCT ((MODERN 30) 61307) INTERSECTION ((MODERN 30) 61270) UNION ((MODERN 30) 61271) INTEGRAL ((MODERN 30) 61301) LINEINTEGRAL ((MODERN 30) 61302] [P [EQIO.AddType 'fraction 'EQ.Fraction 2 '(pieceNames ("numerator" "denominator"] [EQIO.AddType 'sum 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "summand"] [EQIO.AddType 'product 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "factor"] [EQIO.AddType 'union 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "set"] [EQIO.AddType 'intersection 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "set"] [EQIO.AddType 'integral 'EQ.IntegralGroup 3 '(initialData (-2 -2 0) pieceNames ("lower limit" "upper limit" "integrand"] (EQIO.AddType 'lineIntegral 'EQ.IntegralGroup 3 '(initialData (-2 -2 0) pieceNames ("lower limit" "upper limit" "integrand") menuLabel "line integral")) [EQIO.AddType 'sub/superscripts 'EQ.Script 5 '(initialData (0 -1 -1 -1 -1) pieceNames ("main value" "right subscript" "right superscript" "left subscript" "left superscript"] (EQIO.AddType 'max/min 'EQ.MaxMin 3 '(initialData (0 -2 0) pieceNames ("function" "index" "value") menuLabel "max min limit"] (* ;;; "EQROOT module: Part 5 of 5") (FNS EQ.Root EQ.Make.root) (FNS EQ.DrawRadicalSign) (P (EQIO.AddType 'root 'EQ.Root 2 '(pieceNames ("radicand" "index") initialData (0 -1]) (* ;;; "ATTACHEDBOX module: Part 1 of 5") (* ; "Utility functions to manipulate attached regions") (* ;; "These functions use two sets of coords: global coords in which positions are given w.r.t. the lower left corner of a box, and side coords in which positions are given w.r.t. a particular side of the box. For the side coords, the origin is at the point on the side closest to the l.l. corner of the box, the x-axis points along the side toward the other end, and the y-axis points away from the box region" ) (DEFINEQ (AB.RealPosition [LAMBDA (pos box side) (* THH " 8-May-85 11:31") (* returns position of pt. relative to l.l.  corner of box given position relative to specified side of box) (SELECTQ side ((top bottom) [create POSITION XCOORD _ (fetch XCOORD of pos) YCOORD _ (COND ((EQ side 'top) (PLUS (fetch YSIZE of box) (fetch YCOORD of pos))) (T (MINUS (fetch YCOORD of pos]) ((left right) [create POSITION YCOORD _ (fetch XCOORD of pos) XCOORD _ (COND ((EQ side 'right) (PLUS (fetch XSIZE of box) (fetch YCOORD of pos))) (T (MINUS (fetch YCOORD of pos]) NIL]) (AB.PointPos [LAMBDA (box side pt) (* THH " 8-May-85 11:34") (* returns position of pt relative to side --  pt is an atom specifying relative position along the side) (PROG [(horizSide (OR (EQ side 'top) (EQ side 'bottom] (RETURN (create POSITION XCOORD _ (SELECTQ pt (low (* lower end of side) 0) (display (* display pt of side) (COND (horizSide 0) (T (fetch YDESC of box)))) (center (* center of side) (IQUOTIENT (COND (horizSide (fetch XSIZE of box)) (T (fetch YSIZE of box))) 2)) (high (* upper end of side) (COND (horizSide (fetch XSIZE of box)) (T (fetch YSIZE of box)))) NIL) YCOORD _ 0]) (AB.SidePosition [LAMBDA (pos box side) (* THH " 8-May-85 11:32") (* returns position of pt rel. to side given position rel.  to l.l. corner of box) (SELECTQ side ((top bottom) [create POSITION XCOORD _ (fetch XCOORD of pos) YCOORD _ (COND ((EQ side 'top) (DIFFERENCE (fetch YCOORD of pos) (fetch YSIZE of box))) (T (MINUS (fetch YCOORD of pos]) ((left right) [create POSITION XCOORD _ (fetch YCOORD of pos) YCOORD _ (COND ((EQ side 'right) (DIFFERENCE (fetch XCOORD of pos) (fetch XSIZE of box))) (T (MINUS (fetch XCOORD of pos]) NIL]) (AB.PlaceRegion [LAMBDA (mainBox side mainPt addBox addPt gap shift) (* THH "10-May-85 16:51") (* returns placed region relative to l.l.  corner of main box when addBox is placed as specified) (PROG ((posMainPt (AB.PointPos mainBox side mainPt)) (opposite (AB.OppositeSide side)) posAddPt posSide) (SETQ posAddPt (create POSITION XCOORD _ (PLUS (fetch XCOORD of posMainPt) shift) YCOORD _ (PLUS (fetch YCOORD of posMainPt) gap))) (SETQ posSide (AB.PointPos addBox opposite addPt)) (replace XCOORD of posSide with (DIFFERENCE (fetch XCOORD of posAddPt) (fetch XCOORD of posSide))) (replace YCOORD of posSide with (fetch YCOORD of posAddPt)) (SETQ posSide (AB.AdjustToLL (AB.RealPosition posSide mainBox side) addBox side)) (RETURN (create REGION LEFT _ (fetch XCOORD of posSide) BOTTOM _ (fetch YCOORD of posSide) WIDTH _ (fetch XSIZE of addBox) HEIGHT _ (fetch YSIZE of addBox]) (AB.AdjustToLL [LAMBDA (pos addBox side) (* THH "10-May-85 14:58") (* gets position of l.l. corner of addBox w.r.t.  l.l of main box given pos of side opposite side of main box) (SELECTQ side ((top right) NIL) (left (replace XCOORD of pos with (DIFFERENCE (fetch XCOORD of pos) (fetch XSIZE of addBox)))) (bottom (replace YCOORD of pos with (DIFFERENCE (fetch YCOORD of pos) (fetch YSIZE of addBox)))) NIL) pos]) (AB.OppositeSide [LAMBDA (side) (* THH " 8-May-85 14:11") (SELECTQ side (top 'bottom) (bottom 'top) (left 'right) (right 'left) NIL]) (AB.RegionToBox [LAMBDA (region displayYPos) (* thh%: "13-May-85 10:16") (* returns image box corresponding to region whose y display position, relative  to (0,0) is given by displayYPos) (COND ((NOT displayYPos) (SETQ displayYPos 0))) (create IMAGEBOX XSIZE _ (fetch WIDTH of region) YSIZE _ (fetch HEIGHT of region) YDESC _ (DIFFERENCE displayYPos (fetch BOTTOM of region)) XKERN _ 0]) (AB.BoxToRegion [LAMBDA (box cornerXPos cornerYPos) (* thh%: "13-May-85 09:54") (* returns region corresponding to image box whose l.l.  corner is positioned at cornerXPos, cornerYPos --  if cornerYPos is NIL then cornerXPos should be a position) [COND ((NOT cornerYPos) (SETQ cornerYPos (fetch YCOORD of cornerXPos)) (SETQ cornerXPos (fetch XCOORD of cornerXPos] (create REGION LEFT _ cornerXPos BOTTOM _ cornerYPos WIDTH _ (fetch XSIZE of box) HEIGHT _ (fetch YSIZE of box]) (AB.RelativePos [LAMBDA (region bigRegion yShift) (* thh%: "13-May-85 10:27") (* returns relative position of l.l. of region w.r.t.  l.l. of bigRegion) (create POSITION XCOORD _ (DIFFERENCE (fetch LEFT of region) (fetch LEFT of bigRegion)) YCOORD _ (PLUS (DIFFERENCE (fetch BOTTOM of region) (fetch BOTTOM of bigRegion)) yShift]) (AB.BiggerRegion [LAMBDA (region extra) (* THH "23-May-85 14:03") (* creates a region that has extra  space all around) (* extra should be nonnegative) (COND ((OR (NOT extra) (ZEROP extra)) region) (T (create REGION LEFT _ (DIFFERENCE (fetch LEFT of region) extra) BOTTOM _ (DIFFERENCE (fetch BOTTOM of region) extra) WIDTH _ (PLUS (fetch WIDTH of region) (TIMES 2 extra)) HEIGHT _ (PLUS (fetch HEIGHT of region) (TIMES 2 extra]) (AB.Check [LAMBDA (region regionList side clear) (* THH "23-May-85 14:02") (* moves region away from side if it overlaps any regions in regionList) (COND ((NOT clear) (SETQ clear 0))) [COND ((GREATERP clear 0) (SETQ regionList (for r in regionList collect (AB.BiggerRegion r clear] (* must go through list repeatedly since moving region could cause it to  overlap previous regions) [repeatwhile overlap bind overlap do (SETQ overlap NIL) (for r in regionList do (COND ((REGIONSINTERSECTP region r) (SETQ overlap T) (SELECTQ side (top (replace BOTTOM of region with (PLUS (fetch BOTTOM of r) (fetch HEIGHT of r)))) (bottom (replace BOTTOM of region with (DIFFERENCE (fetch BOTTOM of r) (fetch HEIGHT of region)))) (left (replace LEFT of region with (DIFFERENCE (fetch LEFT of r) (fetch WIDTH of region)))) (right (replace LEFT of region with (PLUS (fetch LEFT of r) (fetch WIDTH of r)))) (SHOULDNT] region]) (AB.PositionRegion [LAMBDA (mainBox addedRegions side mainPt addBox addPt gap shift clear) (* thh%: " 9-Jan-86 10:00") (* positions addBox next to side of mainBox so that addPt on the added box is  at the specified relative position to the mainPt on the main box, then moves  addBox away from mainBox if necessary to avoid being within distance clear of  added regions on other sides as specified in addedRegions.  Returns (region newAddedRegions) where region is region of added box w.r.t.  l.l. corner of mainBox and newAddedRegions includes this new box to prevent  future additions from overlapping it) (PROG ((place (AB.Check (AB.PlaceRegion mainBox side mainPt addBox addPt gap shift) addedRegions side clear))) (RETURN (CONS place addedRegions]) (AB.Position2Regions [LAMBDA (mainBox addedRegions side highBox highPt lowBox lowPt highGap lowGap highShift lowShift clear) (* thh%: " 9-Jan-86 10:00") (* positions highBox and lowBox next to side on mainBox --  moves the boxes apart if they are closer than clear apart, and moves them away  from mainBox if they overlap previous regions as specfied by addedRegions) (* returns (highRegion lowRegion newAddedRegions) where regions are w.r.t.  l.l. corner of mainBox and newAddedRegions includes the added regions) (PROG (placeHigh placeLow) (SETQ placeHigh (AB.PlaceRegion mainBox side 'high highBox highPt highGap highShift)) (SETQ placeLow (AB.PlaceRegion mainBox side 'low lowBox lowPt lowGap lowShift)) (COND ((NOT clear) (SETQ clear 0))) [COND ((REGIONSINTERSECTP placeHigh (AB.BiggerRegion placeLow clear)) (* move regions apart) (PROG (shift totalSize) (* if the two added regions overlap  then separate them) (SELECTQ side ((top bottom) (SETQ shift (DIFFERENCE (PLUS (fetch LEFT of placeLow) (fetch WIDTH of placeLow) clear) (fetch LEFT of placeHigh))) [COND ((GREATERP shift 0) (SETQ totalSize (PLUS (fetch WIDTH of placeLow) (fetch WIDTH of placeHigh))) [add (fetch LEFT of placeLow) (MINUS (FIX (PLUS 0.5 (FQUOTIENT (TIMES shift (fetch WIDTH of placeLow)) totalSize] (add (fetch LEFT of placeHigh) (FIX (PLUS 0.5 (FQUOTIENT (TIMES shift (fetch WIDTH of placeHigh)) totalSize]) ((left right) (SETQ shift (DIFFERENCE (PLUS (fetch BOTTOM of placeLow) (fetch HEIGHT of placeLow) clear) (fetch BOTTOM of placeHigh))) [COND ((GREATERP shift 0) (SETQ totalSize (PLUS (fetch HEIGHT of placeLow) (fetch HEIGHT of placeHigh))) [add (fetch BOTTOM of placeLow) (MINUS (FIX (PLUS 0.5 (FQUOTIENT (TIMES shift (fetch HEIGHT of placeLow)) totalSize] (add (fetch BOTTOM of placeHigh) (FIX (PLUS 0.5 (FQUOTIENT (TIMES shift (fetch HEIGHT of placeHigh)) totalSize]) (SHOULDNT] (SETQ placeLow (AB.Check placeLow addedRegions side clear)) (SETQ placeHigh (AB.Check placeHigh addedRegions side clear)) (RETURN (CONS placeHigh (CONS placeLow addedRegions]) ) (* ;;; "EQGROUP module: Part 2 of 5") (* ; "group equation functions") (DEFINEQ (EQ.Group [LAMBDA (eqnObj imageStream draw?) (* THH "12-Jul-85 08:24") (* form function for group --  one argument with enclosure) (LET ((innerBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) enclose pos) (SETQ enclose (EQ.enclosure innerBox eqnObj imageStream draw?)) (SETQ pos (CDR enclose)) (add (fetch YCOORD of pos) (fetch YDESC of innerBox)) (EQIO.MakeSpec (CAR enclose) (LIST (EQIO.MakeDataSpec pos]) (EQ.GroupCreate [LAMBDA NIL (* thh%: " 1-Jul-85 14:57") (EQ.EnclosureCreate T]) (EQ.Make.group [LAMBDA (data enclosureKind enclosureSide fontSpec) (* thh%: " 9-Jan-86 10:24") (EQN.Make 'group (LIST data) fontSpec (LIST 'enclosureKind enclosureKind 'enclosureSide enclosureSide]) ) (* ; "set up data definitions") (EQIO.AddType 'group 'EQ.Group 1 '(objectProps (enclosureKind NIL enclosureSide NIL) pieceNames ("item") wholeEditFn EQ.EnclosureEdit initialPropFn EQ.GroupCreate)) (* ;;; "specific enclosure data") (DECLARE%: EVAL@COMPILE (RECORD EQ.EnclosureData (formFn label)) ) (DEFINEQ (EQ.AddEnclosure [LAMBDA (kind formFn label) (* THH "12-Jul-85 08:18") (* adds data for new form of enclosure) (LET ((enclosures (EQIO.TypeProp 'group 'enclosures)) (newValue (create EQ.EnclosureData formFn _ formFn label _ label))) [COND (enclosures (LISTPUT enclosures kind newValue)) (T (SETQ enclosures (LIST kind newValue] (EQIO.TypeProp 'group 'enclosures enclosures) (EQIO.TypeProp 'group 'kindMenu NIL]) (EQ.GetEnclosureData [LAMBDA (kind) (* THH "12-Jul-85 08:19") (LISTGET (EQIO.TypeProp 'group 'enclosures) kind]) ) (* ; "set up data for enclosures") (EQ.AddEnclosure 'angles (FUNCTION EQ.angles) "< angle brackets >") (EQ.AddEnclosure 'bars (FUNCTION EQ.bars) "| bars |") (EQ.AddEnclosure 'braces (FUNCTION EQ.braces) "{ braces }") (EQ.AddEnclosure 'brackets (FUNCTION EQ.brackets) "[ brackets ]") (EQ.AddEnclosure 'parentheses (FUNCTION EQ.parentheses) "( parentheses )") (EQIO.TypeProp 'group 'defaultEnclosure 'brackets) (* ;;; "general enclosure functions") (DEFINEQ (EQ.enclosure [LAMBDA (innerBox eqnObj imageStream draw?) (* THH "12-Jul-85 08:32") (* returns (outerBox . pos) where outerBox is box with enclosures and pos is  position of l.l. corner of inner box wrt l.l.  corner of outer box) (* if draw? is non-NIL, draws the  enclosures) (LET [[kind (OR (EQIO.EqnProperty eqnObj 'enclosureKind) (EQIO.TypeProp 'group 'defaultEnclosure] (which (EQIO.EqnProperty eqnObj 'enclosureSide] (COND ([NOT (OR (EQ which 'left) (EQ which 'right] (SETQ which NIL))) (LET [(formFn (fetch (EQ.EnclosureData formFn) of (EQ.GetEnclosureData kind] (COND (formFn (* note%: use of kind arg allows same formFn to be used for different  enclosures) (APPLY* formFn innerBox imageStream draw? which kind)) (T (* no enclosure so outer box is same as inner box) (CONS innerBox (create POSITION XCOORD _ 0 YCOORD _ 0]) (EQ.EnclosureCreate [LAMBDA (getWhich?) (* thh%: " 1-Jul-85 14:46") (* returns prop list describing  desired enclosure) (* if getWhich? is non-NIL also asks for side specification for enclosure) (LET ((kind (EQ.EnclosureKind)) which) (COND (getWhich? (SETQ which (EQ.EnclosureSide)) (LIST 'enclosureKind kind 'enclosureSide which)) (T (LIST 'enclosureKind kind]) (EQ.EnclosureEdit [LAMBDA (eqnObj) (* thh%: " 1-Jul-85 14:55") (* allows type of enclosure to be  changed) (* returns non-NIL if object changed) (LET ((editMenu (EQIO.TypeProp 'group 'editMenu)) newValue) (COND ((NOT (type? MENU editMenu)) [SETQ editMenu (create MENU CENTERFLG _ T TITLE _ "change what?" ITEMS _ '(("symbol" 'kind) ("which side" 'side] (EQIO.TypeProp 'group 'editMenu editMenu))) (SELECTQ (MENU editMenu) (kind (COND ((SETQ newValue (EQ.EnclosureKind)) (EQIO.EqnProperty eqnObj 'enclosureKind newValue) T) (T NIL))) (side (COND ((SETQ newValue (EQ.EnclosureSide)) (EQIO.EqnProperty eqnObj 'enclosureSide newValue) T) (T NIL))) NIL]) (EQ.EnclosureKind [LAMBDA NIL (* THH "12-Jul-85 08:39") (* gets desired kind of enclosure) (LET [(kindMenu (EQIO.TypeProp 'group 'kindMenu] (COND ((NOT (type? MENU kindMenu)) (SETQ kindMenu (create MENU CENTERFLG _ T ITEMS _ [LET [(enclosures (EQIO.TypeProp 'group 'enclosures] (while enclosures bind kind data collect (SETQ kind (CAR enclosures)) (SETQ data (CADR enclosures)) (SETQ enclosures (CDDR enclosures)) (LIST (fetch (EQ.EnclosureData label) of data) (KWOTE kind] TITLE _ "enclosures")) (EQIO.TypeProp 'group 'kindMenu kindMenu))) (MENU kindMenu]) (EQ.EnclosureSide [LAMBDA NIL (* thh%: " 1-Jul-85 14:48") (* gets desired side for enclosure) (LET [(whichMenu (EQIO.TypeProp 'group 'whichMenu] (COND ((NOT (type? MENU whichMenu)) (SETQ whichMenu (create MENU ITEMS _ '(left right both) TITLE _ "Which side?")) (EQIO.TypeProp 'group 'whichMenu whichMenu))) (MENU whichMenu]) ) (* ;;; "enclosure form functions") (DEFINEQ (EQ.angles [LAMBDA (innerBox imageStream draw? which) (* ; "Edited 21-Apr-87 09:00 by thh:") (LET ((size (EQ.StreamSize imageStream)) Hgap Hex Vgap Vex width height descent spacing overlap) (SETQ Hex size) (SETQ Vgap size) (SETQ Vex Hex) (SETQ height (PLUS (fetch YSIZE of innerBox) (TIMES 2 Vgap))) (SETQ width (EQ.enclosureWidth size height)) (SETQ Hgap (MAX (TIMES 3 size) (IQUOTIENT height 5))) [SETQ spacing (PLUS (fetch XSIZE of innerBox) (TIMES 2 (PLUS Hgap width] (SETQ descent (PLUS (fetch YDESC of innerBox) Vgap)) (SETQ overlap (MAX (TIMES 2 size) (IQUOTIENT (PLUS Hgap width) 2))) (* * draw angle brackets if requested) (COND (draw? (EQ.DrawAngles height descent spacing Hex width overlap imageStream which))) (* * determine outer box and position of inner box) (EQ.enclosureForm spacing Hex height Vex descent width NIL Hgap Vgap]) (EQ.bars [LAMBDA (innerBox imageStream draw? which) (* ; "Edited 21-Apr-87 09:00 by thh:") (LET ((size (EQ.StreamSize imageStream)) Hgap Hex Vgap Vex width height descent spacing) (SETQ Hgap (TIMES 2 size)) (SETQ Hex size) (SETQ Vgap Hgap) (SETQ Vex Hex) (SETQ height (PLUS (fetch YSIZE of innerBox) (TIMES 2 Vgap))) (SETQ width (EQ.enclosureWidth size height)) [SETQ spacing (PLUS (fetch XSIZE of innerBox) (TIMES 2 (PLUS Hgap width] (SETQ descent (PLUS (fetch YDESC of innerBox) Vgap)) (* * draw bars if requested) (COND (draw? (EQ.DrawBars height descent spacing Hex width imageStream which))) (* * determine outer box and position of inner box) (EQ.enclosureForm spacing Hex height Vex descent width NIL Hgap Vgap]) (EQ.braces [LAMBDA (innerBox imageStream draw? which) (* ; "Edited 21-Apr-87 09:01 by thh:") (LET ((size (EQ.StreamSize imageStream)) Hgap Hex Vgap Vex width height descent spacing overlap point space extra) (SETQ Vgap (TIMES 3 size)) (SETQ Hex size) (SETQ Vex Hex) (SETQ height (PLUS (fetch YSIZE of innerBox) (TIMES 2 Vgap))) (SETQ width (EQ.enclosureWidth size height)) (add height (TIMES 2 width)) (SETQ descent (PLUS (fetch YDESC of innerBox) Vgap width)) (SETQ Hgap (MAX (TIMES 4 size) (IQUOTIENT height 5))) [SETQ spacing (PLUS (fetch XSIZE of innerBox) (TIMES 2 (PLUS Hgap width] (SETQ overlap (PLUS Hgap width)) (SETQ point (PLUS size (IQUOTIENT overlap 2))) (SETQ space (IQUOTIENT overlap 2)) (SETQ extra space) (* * draw braces if requested) (COND (draw? (EQ.DrawBraces height descent spacing Hex width overlap extra point space imageStream which))) (* * determine outer box and position of inner box) (EQ.enclosureForm spacing Hex height Vex descent width T Hgap Vgap]) (EQ.brackets [LAMBDA (innerBox imageStream draw? which) (* ; "Edited 21-Apr-87 09:02 by thh:") (LET ((size (EQ.StreamSize imageStream)) Hgap Hex Vgap Vex width height descent spacing overlap) (SETQ Hgap (TIMES 3 size)) (SETQ Hex size) (SETQ Vgap Hgap) (SETQ Vex Hex) (SETQ height (PLUS (fetch YSIZE of innerBox) (TIMES 2 Vgap))) (SETQ width (EQ.enclosureWidth size height)) (add height (TIMES 2 width)) [SETQ spacing (PLUS (fetch XSIZE of innerBox) (TIMES 2 (PLUS Hgap width] (SETQ descent (PLUS (fetch YDESC of innerBox) Vgap width)) (SETQ overlap (MAX (TIMES 3 size) (PLUS Hgap width))) (* * draw brackets if requested) (COND (draw? (EQ.DrawBrackets height descent spacing Hex width overlap imageStream which))) (* * determine outer box and position of inner box) (EQ.enclosureForm spacing Hex height Vex descent width T Hgap Vgap]) (EQ.parentheses [LAMBDA (innerBox imageStream draw? which) (* ; "Edited 21-Apr-87 09:03 by thh:") (LET ((size (EQ.StreamSize imageStream)) Hgap Hex Vgap Vex width height descent spacing overlap) (SETQ Vgap (TIMES 2 size)) (SETQ Hex size) (SETQ Vex Hex) (SETQ height (PLUS (fetch YSIZE of innerBox) (TIMES 2 Vgap))) (SETQ width (EQ.enclosureWidth size height)) (add height (TIMES 2 width)) (SETQ descent (PLUS (fetch YDESC of innerBox) Vgap width)) (SETQ Hgap (MAX (TIMES 2 size) (IQUOTIENT height 8))) [SETQ spacing (PLUS (fetch XSIZE of innerBox) (TIMES 2 (PLUS Hgap width] (SETQ overlap (MAX (TIMES 3 size) (IQUOTIENT (PLUS Hgap width) 2))) (* * draw braces if requested) (COND (draw? (EQ.DrawParentheses height descent spacing Hex width overlap imageStream which))) (* * determine outer box and position of inner box) (EQ.enclosureForm spacing Hex height Vex descent width T Hgap Vgap]) (EQ.enclosureForm [LAMBDA (spacing Hex height Vex descent width verticalWidth? Hgap Vgap) (* ; "Edited 21-Apr-87 08:59 by thh:") (* computes outer box and position of inner box from parameters --  verticalWidth? non-NIL means enclosure wraps under the box) (CONS (create IMAGEBOX XSIZE _ (PLUS spacing (TIMES 2 Hex)) YSIZE _ (PLUS height (TIMES 2 Vex)) YDESC _ (PLUS descent Vex) XKERN _ 0) (create POSITION XCOORD _ (PLUS Hgap width Hex) YCOORD _ (PLUS Vgap (COND (verticalWidth? width) (T 0)) Vex]) (EQ.enclosureWidth [LAMBDA (size height) (* THH "16-Jul-85 09:15") (MAX size (IQUOTIENT height 100]) ) (* ;;; "enclosure drawing functions") (DEFINEQ (EQ.DrawAngles [LAMBDA (height descent spacing xShift width overlap imageStream which) (* thh%: "19-Aug-85 09:49") (* draws specified angle brackets on  imageStream) (LET ((halfWidth (IQUOTIENT width 2)) (halfWidth1 (IQUOTIENT (SUB1 width) 2)) (lowerX (PLUS (DSPXPOSITION NIL imageStream) xShift)) (lowerY (DIFFERENCE (DSPYPOSITION NIL imageStream) descent)) top middle left right) (SETQ top (PLUS lowerY (SUB1 height))) (SETQ middle (PLUS lowerY (IQUOTIENT (SUB1 height) 2))) (* * left angle bracket) (COND ((NOT (EQ which 'right)) (SETQ left (PLUS lowerX overlap halfWidth)) (DRAWLINE left lowerY (PLUS lowerX halfWidth) middle width NIL imageStream) (DRAWLINE (PLUS lowerX halfWidth) middle left top width NIL imageStream))) (* * right angle bracket) (COND ((NOT (EQ which 'left)) [SETQ right (PLUS lowerX (SUB1 spacing) (MINUS (PLUS overlap halfWidth1] (DRAWLINE right lowerY (PLUS lowerX (SUB1 spacing) (MINUS halfWidth1)) middle width NIL imageStream) (DRAWLINE (PLUS lowerX (SUB1 spacing) (MINUS halfWidth1)) middle right top width NIL imageStream]) (EQ.DrawBars [LAMBDA (height descent spacing xShift width imageStream which) (* thh%: "19-Aug-85 09:53") (* draws specified vertical bar on  imageStream) (PROG ((halfWidth (IQUOTIENT width 2)) (halfWidth1 (IQUOTIENT (SUB1 width) 2)) (lowerX (PLUS (DSPXPOSITION NIL imageStream) xShift)) (lowerY (DIFFERENCE (DSPYPOSITION NIL imageStream) descent))) (* * left bar) (COND ((NOT (EQ which 'right)) (MOVETO (PLUS lowerX halfWidth1) lowerY imageStream) (RELDRAWTO 0 (SUB1 height) width NIL imageStream))) (* * right bar) (COND ((NOT (EQ which 'left)) (MOVETO (DIFFERENCE (PLUS lowerX spacing) halfWidth) lowerY imageStream) (RELDRAWTO 0 (SUB1 height) width NIL imageStream]) (EQ.DrawBraces [LAMBDA (height descent spacing xShift width overlap extra point space imageStream which) (* THH "16-Jul-85 09:20") (* draws specified brace on  imageStream) (LET ((halfWidth (IQUOTIENT width 2)) (halfWidth1 (IQUOTIENT (SUB1 width) 2)) (lowerX (PLUS (DSPXPOSITION NIL imageStream) xShift)) (lowerY (DIFFERENCE (DSPYPOSITION NIL imageStream) descent)) top middle left1 left2 right1 right2) (SETQ top (PLUS lowerY (SUB1 height))) (SETQ middle (PLUS lowerY (IQUOTIENT (SUB1 height) 2))) (* * left brace) (COND ((NOT (EQ which 'right)) (SETQ left1 (PLUS lowerX (SUB1 overlap))) (SETQ left2 (PLUS lowerX (SUB1 point))) (DRAWCURVE (LIST (create POSITION XCOORD _ left1 YCOORD _ lowerY) (create POSITION XCOORD _ left2 YCOORD _ (PLUS lowerY extra)) (create POSITION XCOORD _ left2 YCOORD _ (DIFFERENCE middle (SUB1 space))) (create POSITION XCOORD _ lowerX YCOORD _ middle)) NIL width NIL imageStream) (DRAWCURVE (LIST (create POSITION XCOORD _ lowerX YCOORD _ middle) (create POSITION XCOORD _ left2 YCOORD _ (PLUS middle (SUB1 space))) (create POSITION XCOORD _ left2 YCOORD _ (DIFFERENCE top extra)) (create POSITION XCOORD _ left1 YCOORD _ top)) NIL width NIL imageStream))) (* * right brace) (COND ((NOT (EQ which 'left)) [SETQ right1 (PLUS lowerX (SUB1 spacing) (MINUS (SUB1 overlap] [SETQ right2 (PLUS lowerX (SUB1 spacing) (MINUS (SUB1 point] (DRAWCURVE (LIST (create POSITION XCOORD _ right1 YCOORD _ lowerY) (create POSITION XCOORD _ right2 YCOORD _ (PLUS lowerY extra)) (create POSITION XCOORD _ right2 YCOORD _ (DIFFERENCE middle (SUB1 space))) (create POSITION XCOORD _ (PLUS lowerX (SUB1 spacing)) YCOORD _ middle)) NIL width NIL imageStream) (DRAWCURVE (LIST (create POSITION XCOORD _ (PLUS lowerX (SUB1 spacing)) YCOORD _ middle) (create POSITION XCOORD _ right2 YCOORD _ (PLUS middle (SUB1 space))) (create POSITION XCOORD _ right2 YCOORD _ (DIFFERENCE top extra)) (create POSITION XCOORD _ right1 YCOORD _ top)) NIL width NIL imageStream]) (EQ.DrawBrackets [LAMBDA (height descent spacing xShift width overlap imageStream which) (* THH "12-Jul-85 09:06") (* draws specified bracket on  imageStream) (PROG ((halfWidth (IQUOTIENT width 2)) (halfWidth1 (IQUOTIENT (SUB1 width) 2)) (lowerX (PLUS (DSPXPOSITION NIL imageStream) xShift)) (lowerY (DIFFERENCE (DSPYPOSITION NIL imageStream) descent))) (* * left bracket) (COND ((NOT (EQ which 'right)) (MOVETO (PLUS lowerX halfWidth1) lowerY imageStream) (RELDRAWTO 0 (SUB1 height) width NIL imageStream) (RELMOVETO 0 (MINUS halfWidth) imageStream) (RELDRAWTO overlap 0 width NIL imageStream) (MOVETO (PLUS lowerX (SUB1 width)) (PLUS lowerY halfWidth1) imageStream) (RELDRAWTO overlap 0 width NIL imageStream))) (* * right bracket) (COND ((NOT (EQ which 'left)) (MOVETO (DIFFERENCE (PLUS lowerX spacing) (PLUS overlap width)) (PLUS lowerY halfWidth1) imageStream) (RELDRAWTO overlap 0 width NIL imageStream) (RELMOVETO halfWidth1 (MINUS halfWidth1) imageStream) (RELDRAWTO 0 (SUB1 height) width NIL imageStream) (RELMOVETO 0 (MINUS halfWidth) imageStream) (RELDRAWTO (MINUS overlap) 0 width NIL imageStream]) (EQ.DrawParentheses [LAMBDA (height descent spacing xShift width overlap imageStream which) (* THH "12-Jul-85 09:06") (* draws specified parenthesis on  imageStream) (LET ((halfWidth (IQUOTIENT width 2)) (halfWidth1 (IQUOTIENT (SUB1 width) 2)) (lowerX (PLUS (DSPXPOSITION NIL imageStream) xShift)) (lowerY (DIFFERENCE (DSPYPOSITION NIL imageStream) descent)) top middle left right) (SETQ top (PLUS lowerY (SUB1 height))) (SETQ middle (PLUS lowerY (IQUOTIENT (SUB1 height) 2))) (* * left parenthesis) (COND ((NOT (EQ which 'right)) (SETQ left (PLUS lowerX overlap halfWidth)) (DRAWCURVE (LIST (create POSITION XCOORD _ left YCOORD _ lowerY) (create POSITION XCOORD _ (PLUS lowerX halfWidth) YCOORD _ middle) (create POSITION XCOORD _ left YCOORD _ top)) NIL width NIL imageStream))) (* * right parenthesis) (COND ((NOT (EQ which 'left)) [SETQ right (PLUS lowerX (SUB1 spacing) (MINUS (PLUS overlap halfWidth1] (DRAWCURVE (LIST (create POSITION XCOORD _ right YCOORD _ lowerY) (create POSITION XCOORD _ (PLUS lowerX (SUB1 spacing) (MINUS halfWidth1)) YCOORD _ middle) (create POSITION XCOORD _ right YCOORD _ top)) NIL width NIL imageStream]) ) (* ;;; "EQMATRIX module: Part 3 of 5") (* ; "matrix equation functions") (DEFINEQ (EQ.Matrix [LAMBDA (eqnObj imageStream draw?) (* THH "12-Jul-85 09:50") (* form function for matrix) (* this equation form allows a variable number of parts arranged and stored in  rows) (LET ((layout (EQ.layout eqnObj imageStream)) enclose specs) (SETQ enclose (EQ.enclosure (EQIO.GetBox layout) eqnObj imageStream draw?)) (* * enclose of form (outerBox . pos) --  must now shift positions of individual pieces in layout  (assumes no selection region in layout --  it would also need to be shifted)) (SETQ specs (EQIO.GetDataSpecList layout)) (for dataSpec in specs bind pos (xShift _ (fetch (POSITION XCOORD) of (CDR enclose))) (yShift _ (fetch (POSITION YCOORD) of (CDR enclose))) do (SETQ pos (EQIO.GetDataPosition dataSpec)) (add (fetch (POSITION XCOORD) of pos) xShift) (add (fetch (POSITION YCOORD) of pos) yShift)) (EQIO.MakeSpec (CAR enclose) specs]) (EQ.Make.matrix [LAMBDA (rows columns dataList enclosureKind enclosureSide fontSpec) (* thh%: " 9-Jan-86 10:23") (* * may want to call initial prop fn???) (LET ((numPieces (TIMES rows columns))) (EQN.Make 'matrix dataList fontSpec (LIST 'numPieces numPieces 'rows rows 'columns columns 'enclosureKind enclosureKind 'enclosureSide enclosureSide]) (EQ.layout [LAMBDA (eqnObj imageStream) (* THH "12-Jul-85 10:26") (* form function for table of parts) (* this equation form allows a variable number of parts arranged and stored in  rows) (* layout defined by rowGap -- distance between rows, colGap --  distance between columns, shift -- distance of center above baseline) (LET ((size (EQ.StreamSize imageStream)) (columns (EQIO.EqnProperty eqnObj 'columns)) (rows (EQIO.EqnProperty eqnObj 'rows)) (fontSpec (FONTCREATE (COND ((EQIO.EqnProperty eqnObj 'fontSpec)) (T DEFAULTFONT)) NIL NIL NIL imageStream)) layoutBox boxList colData rowData colGap rowGap shift) (* * set quantities that define layout) (SETQ shift (IQUOTIENT (FONTPROP fontSpec 'ASCENT) 2)) (SETQ colGap (STRINGWIDTH " " fontSpec)) (SETQ rowGap colGap) (* * determine overall box) [COND ((OR (ILEQ columns 0) (ILEQ rows 0)) (SETQ layoutBox (create IMAGEBOX XSIZE _ 0 YSIZE _ 0))) (T (SETQ boxList (for piece in (EQIO.EqnDataList eqnObj) collect (FS.Box piece imageStream))) (SETQ colData (ARRAY columns 'FIXP 0)) (SETQ rowData (ARRAY rows)) (for row from 1 to rows bind (boxes _ boxList) rAscent rDesc do (SETQ rAscent 0) (SETQ rDesc 0) [for col from 1 to columns bind b do (SETQ b (CAR boxes)) (SETQ boxes (CDR boxes)) [SETQ rAscent (MAX rAscent (DIFFERENCE (fetch YSIZE of b) (fetch YDESC of b] (SETQ rDesc (MAX rDesc (fetch YDESC of b))) (SETA colData col (MAX (ELT colData col) (fetch XSIZE of b] (SETA rowData row (CONS (PLUS rAscent rDesc) rDesc))) (SETQ layoutBox (create IMAGEBOX XSIZE _ (PLUS (for col from 1 to columns sum (ELT colData col)) (TIMES (SUB1 columns) colGap)) YSIZE _ (PLUS (for row from 1 to rows sum (CAR (ELT rowData row))) (TIMES (SUB1 rows) rowGap] (replace YDESC of layoutBox with (DIFFERENCE (IQUOTIENT (fetch YSIZE of layoutBox) 2) shift)) (replace XKERN of layoutBox with 0) (* * return overall box and individual positions of all the parts) (LET [(xLow 0) (yHigh (fetch YSIZE of layoutBox)) (colPos (ARRAY columns 'FIXP] (* (xLow,yHigh) is position of upper left corner of block of matrix parts) [COND ((IGREATERP columns 0) (* set colPos to horizontal position of left edge of each column) (SETA colPos 1 xLow) (for col from 2 to columns do (SETA colPos col (PLUS (ELT colPos (SUB1 col)) colGap (ELT colData (SUB1 col] (EQIO.MakeSpec layoutBox (COND [(AND (IGREATERP columns 0) (IGREATERP rows 0)) (for row from 1 to rows bind rowValue (boxes _ boxList) (rowPos _ (PLUS yHigh rowGap)) join [SETQ rowPos (DIFFERENCE rowPos (PLUS rowGap (CAR (SETQ rowValue (ELT rowData row] (* rowPos is vertical position of  bottom of row) (for col from 1 to columns bind b collect (SETQ b (CAR boxes)) (SETQ boxes (CDR boxes)) (EQIO.MakeDataSpec (create POSITION XCOORD _ (PLUS (ELT colPos col) (IQUOTIENT (DIFFERENCE (ELT colData col) (fetch XSIZE of b)) 2)) YCOORD _ (PLUS rowPos (CDR rowValue] (T (* no pieces in this layout) NIL]) (EQ.MatrixAdd [LAMBDA (eqnObj which place window) (* thh%: " 3-Jun-85 10:19") (* adds new row/column to matrix) (* currently copies lists when adding new data instead of modifying the  original lists) (PROG ((rows (EQIO.EqnProperty eqnObj 'rows)) (columns (EQIO.EqnProperty eqnObj 'columns)) (dataList (EQIO.EqnDataList eqnObj)) newData tempData firstPiece continueFlg) (SELECTQ which (row (SETQ newData (EQN.DefaultData (EQIO.EqnType eqnObj) (EQIO.EqnProperty eqnObj 'fontSpec) columns)) (* insert newData after the  place*columns piece) (SETQ tempData (for d in dataList as i from 1 to (TIMES place columns) collect (SETQ dataList (CDR dataList)) d)) (EQIO.SetDataList eqnObj (APPEND tempData newData dataList)) (add rows 1) (EQIO.EqnProperty eqnObj 'rows rows) (SETQ firstPiece (ADD1 (TIMES columns place))) [SETQ continueFlg (CONS 1 (TIMES columns (ADD1 place]) (column (SETQ newData (EQN.DefaultData (EQIO.EqnType eqnObj) (EQIO.EqnProperty eqnObj 'fontSpec) rows)) [EQIO.SetDataList eqnObj (for i from 1 to rows bind newD join (SETQ newD (CAR newData)) (SETQ newData (CDR newData)) (APPEND (for j from 1 to place bind d collect (SETQ d (CAR dataList)) (SETQ dataList (CDR dataList)) d) (LIST newD) (for j from (ADD1 place) to columns bind d collect (SETQ d (CAR dataList)) (SETQ dataList (CDR dataList)) d] (add columns 1) (EQIO.EqnProperty eqnObj 'columns columns) (SETQ firstPiece (ADD1 place)) (SETQ continueFlg (LIST columns))) (ERROR "EQ.MatrixAdd: invalid arg for which = " which)) (EQIO.NumPieces eqnObj (TIMES rows columns)) (EQN.StartEdit eqnObj window firstPiece continueFlg 'PENDINGDEL]) (EQ.MatrixChanged [LAMBDA (eqnObj) (* thh%: "31-May-85 14:21") (* called when number of pieces in  matrix changed) (EQIO.EqnProperty eqnObj 'rowMenu NIL) (EQIO.EqnProperty eqnObj 'colMenu NIL]) (EQ.MatrixCreate [LAMBDA NIL (* THH "12-Jul-85 10:04") (* allows user to specify initial number of rows and columns in a new matrix) (LET (rows columns numPieces retry) (repeatwhile (GREATERP numPieces EQ.Matrix.MaxPieces) do (COND (retry (CLRPROMPT) (PROMPTPRINT "Too many matrix elements: " numPieces " [max allowed is " EQ.Matrix.MaxPieces "]"))) (SETQ rows (MAX (RNUMBER "How many rows for matrix?") 0)) (SETQ columns (MAX (RNUMBER "How many columns for matrix?") 0)) (SETQ numPieces (TIMES rows columns)) (SETQ retry T)) (LIST 'numPieces numPieces 'rows rows 'columns columns]) (EQ.MatrixDelete [LAMBDA (eqnObj which place) (* thh%: " 3-Jun-85 11:56") (* deletes row/column from matrix) (COND ((IGREATERP place 0) (PROG ((rows (EQIO.EqnProperty eqnObj 'rows)) (columns (EQIO.EqnProperty eqnObj 'columns)) (dataList (EQIO.EqnDataList eqnObj))) (SELECTQ which (row [EQIO.SetDataList eqnObj (for d in dataList as i from 1 bind (start _ (TIMES (SUB1 place) columns)) (stop _ (TIMES place columns)) collect d unless (AND (IGREATERP i start) (ILEQ i stop] (add rows -1) (EQIO.EqnProperty eqnObj 'rows rows)) (column (EQIO.SetDataList eqnObj (for d in dataList bind (j _ 0) eachtime (COND ((IGEQ j columns) (SETQ j 0))) (add j 1) collect d unless (IEQP j place))) (add columns -1) (EQIO.EqnProperty eqnObj 'columns columns)) (ERROR "EQ.MatrixDelete: invalid arg for which = " which)) (EQIO.NumPieces eqnObj (TIMES rows columns]) (EQ.MatrixEdit [LAMBDA (eqnObj window button) (* THH "12-Jul-85 10:08") (* adds and removes rows and columns  from matrix) (* returns non-NIL if eqnObj modified) (COND [(EQ (EQIO.EqnType eqnObj) 'matrix) (LET ((editMenu (EQIO.TypeProp 'matrix 'editMenu)) action place) (COND ((NOT (type? MENU editMenu)) [SETQ editMenu (create MENU CENTERFLG _ T ITEMS _ '(("add before col" 'beforeCol) ("add before row" 'beforeRow) ("add after col" 'afterCol) ("add after row" 'afterRow) ("DELETE column" 'delCol) ("DELETE row" 'delRow) ("[change enclosure]" 'enclosure] (EQIO.TypeProp 'matrix 'editMenu editMenu))) (SETQ action (MENU editMenu)) (COND ((EQ action 'enclosure) (EQ.EnclosureEdit eqnObj)) (T (* edit layout) (SETQ place (SELECTQ action ((beforeCol afterCol delCol) (COND [(IGREATERP (EQIO.EqnProperty eqnObj 'columns) 0) (MENU (EQ.MatrixGetMenu eqnObj 'column] ((EQ action 'beforeCol) 1) (T 0))) ((beforeRow afterRow delRow) (COND [(IGREATERP (EQIO.EqnProperty eqnObj 'rows) 0) (MENU (EQ.MatrixGetMenu eqnObj 'row] ((EQ action 'beforeRow) 1) (T 0))) NIL)) (COND (place [COND ((EQ action 'beforeCol) (add place -1) (SETQ action 'afterCol)) ((EQ action 'beforeRow) (add place -1) (SETQ action 'afterRow] (SELECTQ action (afterCol (EQ.MatrixAdd eqnObj 'column place window) T) (afterRow (EQ.MatrixAdd eqnObj 'row place window) T) (delCol (EQ.MatrixDelete eqnObj 'column place) T) (delRow (EQ.MatrixDelete eqnObj 'row place) T) NIL] (T (* eqnObj not a matrix) NIL]) (EQ.MatrixGetMenu [LAMBDA (eqnObj which) (* thh%: " 3-Jun-85 09:35") (* gets menu for eqnObj, which is either row or column) (SELECTQ which (row (PROG [(rowMenu (EQIO.EqnProperty eqnObj 'rowMenu] (COND ((NOT (type? MENU rowMenu)) (SETQ rowMenu (create MENU TITLE _ "row #" ITEMS _ (for i from 1 to (EQIO.EqnProperty eqnObj 'rows) collect i))) (EQIO.EqnProperty eqnObj 'rowMenu rowMenu))) (RETURN rowMenu))) (column (PROG [(colMenu (EQIO.EqnProperty eqnObj 'colMenu] (COND ((NOT (type? MENU colMenu)) (SETQ colMenu (create MENU TITLE _ "col #" MENUROWS _ 1 ITEMS _ (for i from 1 to (EQIO.EqnProperty eqnObj 'columns) collect i))) (EQIO.EqnProperty eqnObj 'colMenu colMenu))) (RETURN colMenu))) NIL]) (EQ.MatrixSelect [LAMBDA (eqnObj) (* thh%: " 3-Jun-85 09:20") (* selects piece to edit by row and  column number) (COND [(EQ (EQIO.EqnType eqnObj) 'matrix) (PROG (row col) (COND ((IGREATERP (EQIO.NumPieces eqnObj) 0) [SETQ row (MENU (EQ.MatrixGetMenu eqnObj 'row] (COND (row [SETQ col (MENU (EQ.MatrixGetMenu eqnObj 'column] (COND (col (RETURN (PLUS (TIMES (EQIO.EqnProperty eqnObj 'columns) (SUB1 row)) col] (T (* eqnObj is not a matrix) NIL]) ) (RPAQ? EQ.Matrix.MaxPieces 100) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EQ.Matrix.MaxPieces) ) (EQIO.AddType 'matrix 'EQ.Matrix 1 '(objectProps (rows 1 columns 1 enclosureKind NIL enclosureSide NIL) variable? T wholeEditFn EQ.MatrixEdit specialSelectFn EQ.MatrixSelect initialPropFn EQ.MatrixCreate changeFn EQ.MatrixChanged)) (* ;;; "EQNFORMS module: Part 4 of 5") (* ; "fraction") (DEFINEQ (EQ.Fraction [LAMBDA (eqnObj imageStream draw?) (* THH "21-May-85 12:14") (* form function for fraction) (* fraction defined by shift -- distance of line above base, gap --  space above and below the line, width --  width of the line and extend -- extra length of line on either side) (* these parameters could be specified by props to allow user to change them) (PROG ((size (EQ.StreamSize imageStream)) shift gap width extend nBox dBox pos box pNumer pDenom) (SETQ shift (IQUOTIENT (FONTPROP (FONTCREATE (COND ((EQIO.EqnProperty eqnObj 'fontSpec)) (T DEFAULTFONT)) NIL NIL NIL imageStream) 'ASCENT) 2)) (SETQ gap size) (SETQ width size) (SETQ extend size) (SETQ nBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ dBox (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (SETQ pos (PLUS (fetch YSIZE of dBox) (TIMES 2 gap) width)) (* pos is distance from bottom of box to bottom of numerator) (SETQ box (create IMAGEBOX XSIZE _ (PLUS (MAX (fetch XSIZE of nBox) (fetch XSIZE of dBox)) (TIMES 2 extend)) YSIZE _ (PLUS (fetch YSIZE of nBox) pos) YDESC _ (PLUS gap (fetch YSIZE of dBox) (MINUS shift)) XKERN _ 0)) [SETQ pNumer (create POSITION XCOORD _ (IQUOTIENT (DIFFERENCE (fetch XSIZE of box) (fetch XSIZE of nBox)) 2) YCOORD _ (PLUS pos (fetch YDESC of nBox] (SETQ pDenom (create POSITION XCOORD _ (IQUOTIENT (DIFFERENCE (fetch XSIZE of box) (fetch XSIZE of dBox)) 2) YCOORD _ (fetch YDESC of dBox))) (COND (draw? (* note that original x,y pos not  preserved) (RELMOVETO 0 shift imageStream) (RELDRAWTO (fetch XSIZE of box) 0 width NIL imageStream))) [RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec pNumer (create REGION LEFT _ 0 BOTTOM _ pos WIDTH _ (fetch XSIZE of box) HEIGHT _ (fetch YSIZE of nBox))) (EQIO.MakeDataSpec pDenom (create REGION LEFT _ 0 BOTTOM _ 0 WIDTH _ (fetch XSIZE of box) HEIGHT _ (fetch YSIZE of dBox] (* selection region for numerator (denominator) is entire top  (bottom) half of fraction) ]) (EQ.Make.fraction [LAMBDA (numerator denominator fontSpec) (* thh%: " 9-Jan-86 10:14") (EQN.Make 'fraction (LIST numerator denominator) fontSpec]) ) (* ;;; "sum group") (DEFINEQ (EQ.SumGroup [LAMBDA (eqnObj imageStream draw?) (* ; "Edited 18-Apr-88 13:30 by thh:") (* ;  "form function for forms drawn like a summation") (* ;; "form defined by gap -- distance between symbol and index (below) and limits (above), and vGap -- distance between symbol and value") (PROG ((size (EQ.StreamSize imageStream)) [char (LIST (COND ((EQ.UseNS? imageStream) (EQ.MakeNSItem (EQIO.EqnType eqnObj))) (T (* ; "use press fonts") (FS.MakeItem '(Sigma 20) (SELECTQ (EQIO.EqnType eqnObj) (sum '"M") (product '"P") (union '"U") (intersection '"I") (SHOULDNT "eqn not a known sum group"] extraShift charBox indexBox limitBox valueBox indexRegion limitRegion valueRegion charRegion boxRegion box temp gap vGap) (SETQ gap size) (SETQ vGap (TIMES 2 size)) (* ;  "extraShift compensates for extra space around the NS chars") (SETQ extraShift (COND ((EQ.UseNS? imageStream) (TIMES 4 size)) (T 0))) (SETQ charBox (FS.Box char imageStream)) (SETQ indexBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ limitBox (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (SETQ valueBox (FS.Box (EQIO.EqnData eqnObj 3) imageStream)) (SETQ temp (AB.PositionRegion charBox NIL 'bottom 'center indexBox 'center (DIFFERENCE gap extraShift) 0 size)) (SETQ indexRegion (CAR temp)) (SETQ temp (AB.PositionRegion charBox temp 'top 'center limitBox 'center (TIMES -2 gap) 0 size)) (* ;  "-2*gap used instead of gap since symbol doesn't fill its box") (SETQ limitRegion (CAR temp)) (SETQ temp (AB.PositionRegion charBox temp 'right 'display valueBox 'display vGap extraShift size)) (SETQ valueRegion (CAR temp)) (SETQ charRegion (AB.BoxToRegion charBox 0 0)) (SETQ boxRegion (UNIONREGIONS charRegion indexRegion limitRegion valueRegion)) (SETQ box (AB.RegionToBox boxRegion (PLUS (fetch YDESC of charBox) extraShift))) (COND (draw? (* ;  "note that original x, y position not preserved") (RELMOVETO (MINUS (fetch LEFT of boxRegion)) (MINUS extraShift) imageStream) (FS.Display char imageStream))) (RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec (AB.RelativePos indexRegion boxRegion (fetch YDESC of indexBox))) (EQIO.MakeDataSpec (AB.RelativePos limitRegion boxRegion (fetch YDESC of limitBox))) (EQIO.MakeDataSpec (AB.RelativePos valueRegion boxRegion (fetch YDESC of valueBox]) (EQ.Make.sum [LAMBDA (lowerIndex upperLimit summand fontSpec) (* thh%: " 9-Jan-86 10:16") (EQN.Make 'sum (LIST lowerIndex upperLimit summand) fontSpec]) (EQ.Make.product [LAMBDA (lowerIndex upperLimit factor fontSpec) (* thh%: " 9-Jan-86 10:17") (EQN.Make 'product (LIST lowerIndex upperLimit factor) fontSpec]) (EQ.Make.union [LAMBDA (lowerIndex upperLimit set fontSpec) (* thh%: " 9-Jan-86 10:18") (EQN.Make 'union (LIST lowerIndex upperLimit set) fontSpec]) (EQ.Make.intersection [LAMBDA (lowerIndex upperLimit set fontSpec) (* thh%: " 9-Jan-86 10:18") (EQN.Make 'intersection (LIST lowerIndex upperLimit set) fontSpec]) ) (* ;;; "integral group") (DEFINEQ (EQ.IntegralGroup [LAMBDA (eqnObj imageStream draw?) (* ; "Edited 18-Apr-88 13:32 by thh:") (* ;  "form function for forms drawn like an integral") (* ;; "form defined by gap -- distance between symbol and limits and vGap -- distance between symbol and value") (PROG ((size (EQ.StreamSize imageStream)) [char (LIST (COND ((EQ.UseNS? imageStream) (EQ.MakeNSItem (EQIO.EqnType eqnObj))) (T (* ; "use press fonts") (FS.MakeItem '(Sigma 20) (SELECTQ (EQIO.EqnType eqnObj) (integral '"S") (lineIntegral '"C") (SHOULDNT "eqn not a known integral group"] charBox lowerBox upperBox valueBox lowerRegion upperRegion valueRegion charRegion boxRegion box temp gap vGap) (SETQ gap size) (SETQ vGap (TIMES 5 size)) (SETQ charBox (FS.Box char imageStream)) (SETQ lowerBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ upperBox (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (SETQ valueBox (FS.Box (EQIO.EqnData eqnObj 3) imageStream)) (SETQ temp (AB.Position2Regions charBox NIL 'right upperBox 'center lowerBox 'center (MINUS gap) (TIMES -6 gap) 0 0 size)) (* ;  "negative gaps since symbol doesn't fill its box") (SETQ upperRegion (CAR temp)) (SETQ lowerRegion (CADR temp)) (SETQ temp (AB.PositionRegion charBox temp 'right 'display valueBox 'display vGap 0 size)) (SETQ valueRegion (CAR temp)) (SETQ charRegion (AB.BoxToRegion charBox 0 0)) (SETQ boxRegion (UNIONREGIONS charRegion upperRegion lowerRegion valueRegion)) (SETQ box (AB.RegionToBox boxRegion (fetch YDESC of charBox))) (COND (draw? (* ;  "note that original x, y position not preserved") (RELMOVETO (MINUS (fetch LEFT of boxRegion)) 0 imageStream) (FS.Display char imageStream))) (RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec (AB.RelativePos lowerRegion boxRegion (fetch YDESC of lowerBox))) (EQIO.MakeDataSpec (AB.RelativePos upperRegion boxRegion (fetch YDESC of upperBox))) (EQIO.MakeDataSpec (AB.RelativePos valueRegion boxRegion (fetch YDESC of valueBox]) (EQ.Make.integral [LAMBDA (lowerLimit upperLimit integrand fontSpec) (* thh%: " 9-Jan-86 10:19") (EQN.Make 'integral (LIST lowerLimit upperLimit integrand) fontSpec]) (EQ.Make.lineIntegral [LAMBDA (lowerLimit upperLimit integrand fontSpec) (* thh%: " 9-Jan-86 10:20") (EQN.Make 'lineIntegral (LIST lowerLimit upperLimit integrand) fontSpec]) ) (* ;;; "super- and sub- scripts") (DEFINEQ (EQ.Script [LAMBDA (eqnObj imageStream draw?) (* THH "23-May-85 14:07") (* form function for forms with sub  and superscripts) (* form defined by gap -- horizontal distance between main symbol and  sub/superscripts, %, and shift -- vertical distance of centers of  sub/superscripts below/above corner of main symbol) (PROG ((size (EQ.StreamSize imageStream)) mainBox super1Box sub1Box super2Box sub2Box super1Region sub1Region super2Region sub2Region mainRegion boxRegion box temp gap shift) (SETQ gap size) (SETQ shift size) (SETQ mainBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ sub1Box (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (SETQ super1Box (FS.Box (EQIO.EqnData eqnObj 3) imageStream)) (SETQ sub2Box (FS.Box (EQIO.EqnData eqnObj 4) imageStream)) (SETQ super2Box (FS.Box (EQIO.EqnData eqnObj 5) imageStream)) (SETQ temp (AB.Position2Regions mainBox NIL 'right super1Box 'center sub1Box 'center gap gap shift (MINUS shift) size)) (SETQ super1Region (CAR temp)) (SETQ sub1Region (CADR temp)) (SETQ temp (AB.Position2Regions mainBox (CADDR temp) 'left super2Box 'center sub2Box 'center gap gap shift (MINUS shift) size)) (SETQ super2Region (CAR temp)) (SETQ sub2Region (CADR temp)) (SETQ mainRegion (AB.BoxToRegion mainBox 0 0)) (SETQ boxRegion (UNIONREGIONS mainRegion super1Region sub1Region super2Region sub2Region)) (SETQ box (AB.RegionToBox boxRegion (fetch YDESC of mainBox))) (* * this form has nothing extra to draw) (RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec (AB.RelativePos mainRegion boxRegion (fetch YDESC of mainBox))) (EQIO.MakeDataSpec (AB.RelativePos sub1Region boxRegion (fetch YDESC of sub1Box))) (EQIO.MakeDataSpec (AB.RelativePos super1Region boxRegion (fetch YDESC of super1Box))) (EQIO.MakeDataSpec (AB.RelativePos sub2Region boxRegion (fetch YDESC of sub2Box))) (EQIO.MakeDataSpec (AB.RelativePos super2Region boxRegion (fetch YDESC of super2Box]) (EQ.Make.sub/superscripts [LAMBDA (mainValue lowerRight upperRight lowerLeft upperLeft fontSpec) (* thh%: " 9-Jan-86 10:21") (EQN.Make 'sub/superscripts (LIST mainValue lowerRight upperRight lowerLeft upperLeft) fontSpec]) ) (* ;;; "max/min/limit etc") (DEFINEQ (EQ.MaxMin [LAMBDA (eqnObj imageStream draw?) (* thh%: " 9-Jan-86 10:02") (* form function for max/min/limit etc) (PROG ((size (EQ.StreamSize imageStream)) functionBox indexBox valueBox box functionRegion indexRegion valueRegion boxRegion gap vGap temp) (SETQ gap (TIMES 2 size)) (SETQ vGap size) (SETQ functionBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ indexBox (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (SETQ valueBox (FS.Box (EQIO.EqnData eqnObj 3) imageStream)) (SETQ temp (AB.PositionRegion functionBox NIL 'bottom 'center indexBox 'center vGap 0 size) ) (SETQ indexRegion (CAR temp)) (SETQ temp (AB.PositionRegion functionBox temp 'right 'display valueBox 'display gap 0 size )) (SETQ valueRegion (CAR temp)) (SETQ functionRegion (AB.BoxToRegion functionBox 0 0)) (SETQ boxRegion (UNIONREGIONS functionRegion indexRegion valueRegion)) (SETQ box (AB.RegionToBox boxRegion (fetch YDESC of functionBox))) (* * nothing extra to draw) (RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec (AB.RelativePos functionRegion boxRegion (fetch YDESC of functionBox))) (EQIO.MakeDataSpec (AB.RelativePos indexRegion boxRegion (fetch YDESC of indexBox))) (EQIO.MakeDataSpec (AB.RelativePos valueRegion boxRegion (fetch YDESC of valueBox]) (EQ.Make.max/min [LAMBDA (function index value fontSpec) (* thh%: " 9-Jan-86 10:21") (EQN.Make 'max/min (LIST function index value) fontSpec]) ) (* ;;; "utilities") (DEFINEQ (EQ.StreamSize [LAMBDA (imageStream) (* thh%: " 3-May-85 08:37") (* standard size factor for the stream) (MAX 1 (IQUOTIENT (STRINGWIDTH "A" (FONTCREATE DEFAULTFONT NIL NIL NIL imageStream)) 5]) (EQ.UseNS? [LAMBDA (imageStream) (* thh%: " 9-Jan-86 10:29") (* * returns non-NIL if NS characters should be used for special symbols on  imageStream) (SELECTQ (IMAGESTREAMTYPE imageStream) (DISPLAY EQ.UseNSChars) (PRESS NIL) (INTERPRESS T) EQ.UseNSChars]) (EQ.MakeNSItem [LAMBDA (type) (* ; "Edited 18-Apr-88 13:29 by thh:") (LET [(value (LISTGET EQ.NSChars (U-CASE type] (OR value (SHOULDNT "no display character for eqn")) (FS.MakeItem (CAR value) (MKSTRING (CHARACTER (CADR value]) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EQ.UseNSChars EQ.NSChars) ) (* ; "EQ.UseNSChars = NIL to use press fonts for display") (RPAQ? EQ.UseNSChars NIL) (RPAQ? EQ.NSChars '(SUM ((CLASSIC 24) 9814) PRODUCT ((CLASSIC 24) 9811) SUM ((MODERN 30) 61306) PRODUCT ((MODERN 30) 61307) INTERSECTION ((MODERN 30) 61270) UNION ((MODERN 30) 61271) INTEGRAL ((MODERN 30) 61301) LINEINTEGRAL ((MODERN 30) 61302))) [EQIO.AddType 'fraction 'EQ.Fraction 2 '(pieceNames ("numerator" "denominator"] [EQIO.AddType 'sum 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "summand"] [EQIO.AddType 'product 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "factor"] [EQIO.AddType 'union 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "set"] [EQIO.AddType 'intersection 'EQ.SumGroup 3 '(initialData (-2 -2 0) pieceNames ("index" "limit" "set"] [EQIO.AddType 'integral 'EQ.IntegralGroup 3 '(initialData (-2 -2 0) pieceNames ("lower limit" "upper limit" "integrand"] (EQIO.AddType 'lineIntegral 'EQ.IntegralGroup 3 '(initialData (-2 -2 0) pieceNames ("lower limit" "upper limit" "integrand") menuLabel "line integral")) [EQIO.AddType 'sub/superscripts 'EQ.Script 5 '(initialData (0 -1 -1 -1 -1) pieceNames ("main value" "right subscript" "right superscript" "left subscript" "left superscript"] (EQIO.AddType 'max/min 'EQ.MaxMin 3 '(initialData (0 -2 0) pieceNames ("function" "index" "value") menuLabel "max min limit")) (* ;;; "EQROOT module: Part 5 of 5") (DEFINEQ (EQ.Root [LAMBDA (eqnObj imageStream draw?) (* thh%: "18-Mar-86 14:47") (* form function for roots) (* layout defined by vGap -- extra vertical space on either side of radicand,  gap -- extra horizontal space on either side of radicand, ivGap --  vertical space between index and radical sign, igap --  extra horizontal extent of sign around index) (PROG ((size (EQ.StreamSize imageStream)) rBox iBox gap vGap ivGap igap baseLen barLen height rise desc toBottomLen toTopLen width box) (SETQ gap (TIMES 2 size)) (SETQ vGap (TIMES 2 size)) (SETQ ivGap size) (SETQ igap 0) (SETQ width size) (SETQ rBox (FS.Box (EQIO.EqnData eqnObj 1) imageStream)) (SETQ iBox (FS.Box (EQIO.EqnData eqnObj 2) imageStream)) (* * determine size of parts of radical sign and draw it if requested) [SETQ baseLen (MAX (TIMES 4 size) (PLUS (TIMES 2 igap) (fetch XSIZE of iBox] (SETQ barLen (PLUS (TIMES 2 gap) (fetch XSIZE of rBox))) (SETQ height (PLUS (TIMES 2 vGap) (fetch YSIZE of rBox) (QUOTIENT width 2))) (SETQ rise (QUOTIENT height 2)) (SETQ desc (PLUS (fetch YDESC of rBox) vGap)) (SETQ toBottomLen (TIMES 2 size)) (SETQ toTopLen (TIMES 4 toBottomLen)) (COND (draw? (EQ.DrawRadicalSign height rise desc baseLen toBottomLen toTopLen barLen width imageStream))) (* * get size and position values) (SETQ box (create IMAGEBOX XSIZE _ (PLUS baseLen toBottomLen toTopLen barLen) YSIZE _ (MAX (PLUS height (DIFFERENCE width (QUOTIENT width 2))) (PLUS rise ivGap (fetch YSIZE of iBox))) YDESC _ desc XKERN _ 0)) (RETURN (EQIO.MakeSpec box (LIST (EQIO.MakeDataSpec (create POSITION XCOORD _ (PLUS baseLen toBottomLen toTopLen gap) YCOORD _ desc)) (EQIO.MakeDataSpec (create POSITION XCOORD _ (QUOTIENT (DIFFERENCE baseLen (fetch XSIZE of iBox)) 2) YCOORD _ (PLUS rise ivGap (fetch YDESC of iBox]) (EQ.Make.root [LAMBDA (radicand index fontSpec) (* thh%: " 9-Jan-86 10:22") (EQN.Make 'root (LIST radicand index) fontSpec]) ) (DEFINEQ (EQ.DrawRadicalSign [LAMBDA (height rise desc baseLen toBottomLen toTopLen barLen width imageStream) (* thh%: "28-Jun-85 13:04") (* draws specified radical sign on  imageStream) (RELMOVETO 0 (DIFFERENCE rise desc) imageStream) (RELDRAWTO baseLen 0 width NIL imageStream) (RELDRAWTO toBottomLen (MINUS rise) (TIMES 2 width) NIL imageStream) (RELDRAWTO toTopLen height width NIL imageStream) (RELDRAWTO barLen 0 width NIL imageStream]) ) [EQIO.AddType 'root 'EQ.Root 2 '(pieceNames ("radicand" "index") initialData (0 -1] (PUTPROPS EQUATIONFORMS COPYRIGHT ("Xerox Corporation" 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (9792 26310 (AB.RealPosition 9802 . 10921) (AB.PointPos 10923 . 12559) (AB.SidePosition 12561 . 13668) (AB.PlaceRegion 13670 . 15155) (AB.AdjustToLL 15157 . 15865) (AB.OppositeSide 15867 . 16102) (AB.RegionToBox 16104 . 16670) (AB.BoxToRegion 16672 . 17348) (AB.RelativePos 17350 . 17905) ( AB.BiggerRegion 17907 . 18850) (AB.Check 18852 . 20854) (AB.PositionRegion 20856 . 21838) ( AB.Position2Regions 21840 . 26308)) (26398 27513 (EQ.Group 26408 . 27114) (EQ.GroupCreate 27116 . 27264) (EQ.Make.group 27266 . 27511)) (27957 28800 (EQ.AddEnclosure 27967 . 28611) ( EQ.GetEnclosureData 28613 . 28798)) (29325 34611 (EQ.enclosure 29335 . 30736) (EQ.EnclosureCreate 30738 . 31383) (EQ.EnclosureEdit 31385 . 32740) (EQ.EnclosureKind 32742 . 34017) (EQ.EnclosureSide 34019 . 34609)) (34655 41929 (EQ.angles 34665 . 35930) (EQ.bars 35932 . 36975) (EQ.braces 36977 . 38383) (EQ.brackets 38385 . 39593) (EQ.parentheses 39595 . 40918) (EQ.enclosureForm 40920 . 41770) ( EQ.enclosureWidth 41772 . 41927)) (41976 53697 (EQ.DrawAngles 41986 . 43783) (EQ.DrawBars 43785 . 45044) (EQ.DrawBraces 45046 . 49348) (EQ.DrawBrackets 49350 . 51309) (EQ.DrawParentheses 51311 . 53695 )) (53787 74449 (EQ.Matrix 53797 . 55143) (EQ.Make.matrix 55145 . 55707) (EQ.layout 55709 . 61973) ( EQ.MatrixAdd 61975 . 65003) (EQ.MatrixChanged 65005 . 65392) (EQ.MatrixCreate 65394 . 66306) ( EQ.MatrixDelete 66308 . 68147) (EQ.MatrixEdit 68149 . 71903) (EQ.MatrixGetMenu 71905 . 73433) ( EQ.MatrixSelect 73435 . 74447)) (75051 79348 (EQ.Fraction 75061 . 79151) (EQ.Make.fraction 79153 . 79346)) (79377 84351 (EQ.SumGroup 79387 . 83556) (EQ.Make.sum 83558 . 83749) (EQ.Make.product 83751 . 83949) (EQ.Make.union 83951 . 84142) (EQ.Make.intersection 84144 . 84349)) (84385 88224 ( EQ.IntegralGroup 84395 . 87804) (EQ.Make.integral 87806 . 88009) (EQ.Make.lineIntegral 88011 . 88222)) (88267 91812 (EQ.Script 88277 . 91496) (EQ.Make.sub/superscripts 91498 . 91810)) (91849 94162 ( EQ.MaxMin 91859 . 93968) (EQ.Make.max/min 93970 . 94160)) (94191 95245 (EQ.StreamSize 94201 . 94532) ( EQ.UseNS? 94534 . 94917) (EQ.MakeNSItem 94919 . 95243)) (98076 101949 (EQ.Root 98086 . 101767) ( EQ.Make.root 101769 . 101947)) (101950 102653 (EQ.DrawRadicalSign 101960 . 102651))))) STOP \ No newline at end of file diff --git a/lispusers/EQUATIONS b/lispusers/EQUATIONS new file mode 100644 index 00000000..5d96aeeb --- /dev/null +++ b/lispusers/EQUATIONS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 3-Mar-88 13:51:10" {ERINYES}LYRIC>EQUATIONS.;1 86057 changes to%: (FNS EQIO.Put EQIO.Get) previous date%: "27-May-87 11:20:49" |{IE:PARC:XEROX}LYRIC>LISPUSERS>EQUATIONS.;1|) (* " Copyright (c) 1986, 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT EQUATIONSCOMS) (RPAQQ EQUATIONSCOMS ( (* ;;; "EQUATION module: Part 1 of 3") (* ; "functions for image object") (FNS EQIO.CreateFns EQIO.Create EQIO.Imagebox EQIO.Display EQIO.ButtonEventIn EQIO.Copy EQIO.CopyList EQIO.Get EQIO.Put EQIO.WhenDeleted EQIO.SelectRegion EQIO.Selection EQIO.DefaultSelectFn EQIO.MakeSelectionMenu) (* ;;; "functions to handle individual equation props and data") (FNS EQIO.EqnType EQIO.EqnDataList EQIO.SetDataList EQIO.EqnData EQIO.EqnProperty EQIO.AllProps EQIO.Specify EQIO.GetInitialProps EQIO.NumPieces EQIO.NewStructure) (* ;;; "functions to handle equation specification info") (FNS EQIO.AddType EQIO.GetInfo EQIO.SetInfo EQIO.TypeProp EQIO.ResetTypeProps EQIO.IsDefined EQIO.GetBox EQIO.GetDataSpec EQIO.GetDataSpecList EQIO.GetDataPosition EQIO.GetDataSelectRegion EQIO.MakeSpec EQIO.MakeDataSpec) (* ;;; "variable specification") (GLOBALVARS EquationInfo EquationTypeMenu EquationImageFns UnknownEquationData EquationDefaultSelectFn) (VARS (EquationImageFns NIL)) (INITVARS EquationInfo (EquationDefaultSelectFn 'EQIO.DefaultSelectFn)) [P (TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU '(Equation 'EQN.Equation] (P (* ;  "needed to force the getfn to be recognized before any new eqns defined") (SETQ EquationImageFns (EQIO.CreateFns))) (VARS UnknownEquationData) (PROP ARGNAMES EQIO.TypeProp EQIO.NumPieces EQIO.AllProps EQIO.EqnProperty) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA EQN.ObjEditWindow EQN.ContinueFlg EQN.PieceNumber EQN.ResultObj EQN.ResultWindow EQN.EditWindow EQIO.TypeProp EQIO.NumPieces EQIO.AllProps EQIO.EqnProperty))) (* ;;; "EQUATIONEDIT module: Part 2 of 3") (* ; "functions to edit data pieces") (FNS EQN.AbortEdit EQN.StopEdit EQN.ContinueEdit EQN.FinishEdit EQN.MakeEditWindow EQN.SetUpEdit EQN.StartEdit EQN.StartNextEdit EQN.UpdateEdit EQN.DefaultData EQN.TypeMenu) (* ;;; "hooks to control behavior of equation subeditor") (FNS EQN.Equation EQN.NextPiece EQN.FinishEqn EQN.NoUpdateAbort EQN.PreventUpdate EQN.CharFn EQN.TEditSpecialChar EQN.SnuggleWindows EQN.SnuggleMainWindow) (* ;;; "functions to handle equation fonts") (FNS EQN.EquationFontNumber EQN.EquationFont EQN.GetEqnFont EQN.MakeFS) (* ;;; "utilities") (FNS EQN.AdjustWindow EQN.CheckWindowSize) (FNS EQN.SubEditorP EQN.WindowFromText EQN.EditWindow EQN.ResultWindow EQN.ResultObj EQN.PieceNumber EQN.ContinueFlg EQN.ValidEditWindow EQN.ObjEditWindow) (FNS EQN.Make) (GLOBALVARS EquationFontSpecs) (VARS EquationFontSpecs) (PROP ARGNAMES EQN.ObjEditWindow EQN.ContinueFlg EQN.PieceNumber EQN.ResultObj EQN.ResultWindow EQN.EditWindow) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA EQN.ObjEditWindow EQN.ContinueFlg EQN.PieceNumber EQN.ResultObj EQN.ResultWindow EQN.EditWindow))) (* ;;; "FORMATSTRING module: Part 3 of 3") (FNS FS.Box FS.Copy FS.Display FS.Get FS.Put FS.ItemFont FS.ItemValue FS.ItemShift FS.MakeItem FS.Extract FS.ExtractFont FS.ExtractShift FS.Insert FS.AllowedChar FS.RealStringP) (* ;;; "Now load EQUATIONFORMS") (FILES EQUATIONFORMS))) (* ;;; "EQUATION module: Part 1 of 3") (* ; "functions for image object") (DEFINEQ (EQIO.CreateFns [LAMBDA NIL (* thh%: " 5-Dec-85 10:50") (IMAGEFNSCREATE (FUNCTION EQIO.Display) (FUNCTION EQIO.Imagebox) (FUNCTION EQIO.Put) (FUNCTION EQIO.Get) (FUNCTION EQIO.Copy) (FUNCTION EQIO.ButtonEventIn) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION EQIO.WhenDeleted) (FUNCTION NILL) (FUNCTION NILL) (FUNCTION NILL]) (EQIO.Create [LAMBDA (kind dataList fontSpec objectProps) (* thh%: " 5-Dec-85 10:50") (* makes an equation image object of specified kind and data) (* fontSpec, if non-NIL, is used as fontSpec prop of eqn) (* objectProps specifies properties for this object --  if NIL then default props for this kind will be used) (PROG [(obj (IMAGEOBJCREATE (CONS kind dataList) (COND ((AND (BOUNDP 'EquationImageFns) (IMAGEFNSP EquationImageFns)) EquationImageFns) (T (SETQ EquationImageFns (EQIO.CreateFns] [COND ((NOT objectProps) (SETQ objectProps (COPYALL (EQIO.GetInfo kind 'objProps] (EQIO.AllProps obj objectProps) [COND (fontSpec (EQIO.EqnProperty obj 'fontSpec (COND ((NUMBERP fontSpec) (EQN.GetEqnFont fontSpec)) (T fontSpec] (RETURN obj]) (EQIO.Imagebox [LAMBDA (eqnObj imageStream) (* THH "21-May-85 12:13") (* determines size of equation) (PROG ((spec (EQIO.Specify eqnObj imageStream))) (RETURN (COND (spec (EQIO.GetBox spec)) (T (FS.Box UnknownEquationData imageStream]) (EQIO.Display [LAMBDA (eqnObj imageStream) (* thh%: "31-May-85 09:30") (* displays equation) (PROG [(curX (DSPXPOSITION NIL imageStream)) (curY (DSPYPOSITION NIL imageStream)) (spec (EQIO.Specify eqnObj imageStream T)) (invertPiece (PROG ((editWindow (EQN.ObjEditWindow eqnObj))) (RETURN (COND (editWindow (EQN.PieceNumber editWindow)) (T NIL] (COND [spec (for i from 1 to (EQIO.NumPieces eqnObj) bind data pos (desc _ (fetch YDESC of (EQIO.GetBox spec))) do (SETQ data (EQIO.EqnData eqnObj i)) (SETQ pos (EQIO.GetDataPosition (EQIO.GetDataSpec spec i))) (COND ((AND pos data) (MOVETO (PLUS curX (fetch XCOORD of pos)) (PLUS curY (fetch YCOORD of pos) (MINUS desc)) imageStream) (FS.Display data imageStream (EQ invertPiece i] (T (FS.Display UnknownEquationData imageStream invertPiece]) (EQIO.ButtonEventIn [LAMBDA (eqnObj windowStream selection relX relY window textStream button) (* thh%: "19-Mar-86 09:23") (* handles button press in equation) (PROG ((editWindow (EQN.EditWindow window)) [CHOICEMENU (CONSTANT (create MENU CENTERFLG _ T ITEMS _ '((Select 'SELECT "Select the image object") (Edit 'EDIT "Edit selected piece of the equation"] underEdit) [SETQ underEdit (AND editWindow (EQ eqnObj (EQN.ResultObj editWindow] (* non-NIL if eqnObj is currently  being edited) (RETURN (COND ((OR (KEYDOWNP 'RSHIFT) (KEYDOWNP 'LSHIFT) (KEYDOWNP 'CTRL)) (* note%: using COPYBUTTONEVENTIN fn instead of this test doesnt work since it  is never called) (COND (underEdit (* abort sub edit when obj specially selected in main window) (EQN.AbortEdit window) 'CHANGED) (T NIL))) (T (SPAWN.MOUSE) (OR (COND [(EQ button 'LEFT) (* check for direct selection of piece  within the equation) (AND (EQ (MENU CHOICEMENU) 'EDIT) (LET ((piece# (EQIO.Selection eqnObj windowStream relX relY))) (COND (piece# (EQN.StartEdit eqnObj window piece#) 'CHANGED) (T NIL] [(EQ button 'MIDDLE) (* use menu to allow selection of  piece to edit) (LET ((selectFn (EQIO.GetInfo (EQIO.EqnType eqnObj) 'specialSelectFn)) piece#) (COND ((NOT selectFn) (SETQ selectFn EquationDefaultSelectFn))) (COND ((AND selectFn (SETQ piece# (APPLY* selectFn eqnObj))) (EQN.StartEdit eqnObj window piece#) 'CHANGED) (T NIL] (T NIL)) (LET [(wholeEditFn (EQIO.GetInfo (EQIO.EqnType eqnObj) 'wholeEditFn] (* treat as top level selection and check for edits of global properties) (COND (underEdit (EQN.AbortEdit window))) (COND ((AND wholeEditFn (APPLY* wholeEditFn eqnObj window button)) 'CHANGED) (underEdit 'CHANGED) (T NIL]) (EQIO.Copy [LAMBDA (eqnObj) (* THH "12-Jul-85 10:40") (LET ((dataList (EQIO.EqnDataList eqnObj))) (EQIO.Create (COPY (EQIO.EqnType eqnObj)) (for data in dataList collect (FS.Copy data)) NIL (EQIO.CopyList (EQIO.AllProps eqnObj]) (EQIO.CopyList [LAMBDA (list) (* THH "12-Jul-85 10:44") (* copies list down to atoms or strings but sets anything else to NIL) (* datatype values set to NIL -- allows caching such data only) (COND ((OR (ATOM list) (STRINGP list)) list) ((LISTP list) (for item in list collect (EQIO.CopyList item))) (T (* set value to NIL) NIL]) (EQIO.Get [LAMBDA (fileStream) (* ; "Edited 3-Mar-88 13:45 by thh:") (* ;; "specify readtable for input") (LET ((*READTABLE* (FIND-READTABLE "INTERLISP"))) (PROG ((kind (READ fileStream)) (dataList (FS.Get fileStream))) (RETURN (EQIO.Create kind dataList NIL (READ fileStream]) (EQIO.Put [LAMBDA (eqnObj fileStream) (* ; "Edited 3-Mar-88 13:43 by thh:") (* ;; "specify readtable for output and eliminate all non-atom/string props which PRIN2 won't handle correctly") (LET ((*READTABLE* (FIND-READTABLE "INTERLISP"))) (PRIN2 (EQIO.EqnType eqnObj) fileStream) (FS.Put (EQIO.EqnDataList eqnObj) fileStream) (PRIN2 (EQIO.CopyList (EQIO.AllProps eqnObj)) fileStream]) (EQIO.WhenDeleted [LAMBDA (eqnObj window) (* thh%: "15-May-85 11:27") (* called when eqnObj is about to be deleted from edit window) (* abort any sub edit of this object) (PROG ((editWindow (EQN.ValidEditWindow (EQN.EditWindow window) eqnObj))) (COND (editWindow (EQN.AbortEdit window]) (EQIO.SelectRegion [LAMBDA (spec data piece# imageStream) (* THH "21-May-85 12:13") (* determines selection region for  piece in eqnObj) (PROG ((dataSpec (EQIO.GetDataSpec spec piece#))) (RETURN (COND ((EQIO.GetDataSelectRegion dataSpec)) [data (PROG ((dataBox (FS.Box data imageStream)) (pos (EQIO.GetDataPosition dataSpec))) (RETURN (create REGION LEFT _ (fetch XCOORD of pos) BOTTOM _ (DIFFERENCE (fetch YCOORD of pos) (fetch YDESC of dataBox)) WIDTH _ (fetch XSIZE of dataBox) HEIGHT _ (fetch YSIZE of dataBox] (T NIL]) (EQIO.Selection [LAMBDA (eqnObj imageStream relX relY) (* thh%: "31-May-85 09:31") (* returns piece number of data within which selection was made, if any) (* note%: if slection region for a piece is zero size, then cannot select that  piece) (* new TEdit%: relY is measured from baseline of object so must adjust since  eqn forms measure regions w.r.t. l.l. corner of box) (PROG ((spec (EQIO.Specify eqnObj imageStream)) piece#) (RETURN (COND [spec (add relY (fetch YDESC of (EQIO.GetBox spec))) (SETQ piece# (for i from 1 to (EQIO.NumPieces eqnObj) bind region do (SETQ region (EQIO.SelectRegion spec (EQIO.EqnData eqnObj i) i imageStream)) (COND ((AND region (INSIDEP region relX relY)) (RETURN i] (T (* unknown equation --  not able to select) NIL]) (EQIO.DefaultSelectFn [LAMBDA (eqnObj) (* thh%: "31-May-85 08:34") (* provides a menu-based selection of a part of the equation --  returns the piece# of the part selected or NIL if no part was selected) (* this is useful for selecting parts whose select region on the screen is zero  size) (PROG ((type (EQIO.EqnType eqnObj)) menu) [COND [(EQIO.GetInfo type 'variable?) (SETQ menu (EQIO.EqnProperty eqnObj 'selectionMenu)) (COND ((NOT (type? MENU menu)) (SETQ menu (EQIO.MakeSelectionMenu type (EQIO.NumPieces eqnObj))) (EQIO.EqnProperty eqnObj 'selectionMenu menu] (T (SETQ menu (EQIO.TypeProp type 'selectionMenu)) (COND ((NOT (type? MENU menu)) (SETQ menu (EQIO.MakeSelectionMenu type (EQIO.NumPieces eqnObj))) (EQIO.TypeProp type 'selectionMenu menu] (RETURN (COND (menu (MENU menu)) (T NIL]) (EQIO.MakeSelectionMenu [LAMBDA (type numPieces) (* thh%: "19-Mar-86 09:30") (* creates a selection menu for the specified type of equation) (* numPieces may be NIL if this is an unknown type of equation) (COND [(AND (FIXP numPieces) (IGREATERP numPieces 0)) (PROG [(pieceNames (EQIO.GetInfo type 'pieceNames] (RETURN (create MENU CENTERFLG _ T TITLE _ "Eqn piece?" ITEMS _ (for i from 1 to numPieces bind name collect (SETQ name (CAR pieceNames)) (COND (name (SETQ pieceNames (CDR pieceNames)) (LIST name i)) (T i] (T NIL]) ) (* ;;; "functions to handle individual equation props and data") (DEFINEQ (EQIO.EqnType [LAMBDA (eqnObj) (* THH " 2-May-85 12:59") (* returns type of equation) (CAR (IMAGEOBJPROP eqnObj 'OBJECTDATUM]) (EQIO.EqnDataList [LAMBDA (eqnObj) (* THH " 2-May-85 12:59") (* returns list of data pieces in the  equation) (CDR (IMAGEOBJPROP eqnObj 'OBJECTDATUM]) (EQIO.SetDataList [LAMBDA (eqnObj newDataList) (* thh%: " 3-Jun-85 08:34") (* replaces entire data list of eqn -- caller must make sure any props, e.g.  numPieces, are suitably adjusted) (IMAGEOBJPROP eqnObj 'OBJECTDATUM (CONS (EQIO.EqnType eqnObj) newDataList]) (EQIO.EqnData [LAMBDA (eqnObj piece#) (* THH " 2-May-85 13:52") (CAR (NTH (EQIO.EqnDataList eqnObj) piece#]) (EQIO.EqnProperty [LAMBDA eqn (* THH " 8-May-85 08:48") (* gets and sets individual eqn props) (* eqn is of form (eqnObj prop  {newValue})) (COND ((IEQP eqn 2) (LISTGET (IMAGEOBJPROP (ARG eqn 1) 'props) (ARG eqn 2))) ((IEQP eqn 3) (PROG [(props (IMAGEOBJPROP (ARG eqn 1) 'props] [COND (props (LISTPUT props (ARG eqn 2) (ARG eqn 3))) (T (SETQ props (LIST (ARG eqn 2) (ARG eqn 3] (IMAGEOBJPROP (ARG eqn 1) 'props props]) (EQIO.AllProps [LAMBDA eqn (* THH " 8-May-85 08:48") (* gets and sets all props for eqnObj) (* eqn is of form (eqnObj {newProps})) (COND ((IEQP eqn 1) (IMAGEOBJPROP (ARG eqn 1) 'props)) ((IEQP eqn 2) (IMAGEOBJPROP (ARG eqn 1) 'props (ARG eqn 2]) (EQIO.Specify [LAMBDA (eqnObj imageStream draw?) (* THH " 2-May-85 13:45") (* returns specification for equation on imageStream, and if draw? is not NIL,  draws the non-data parts of the equation) (PROG [(formFn (EQIO.GetInfo (EQIO.EqnType eqnObj) 'formFn] (RETURN (COND (formFn (APPLY* formFn eqnObj imageStream draw?)) (T NIL]) (EQIO.GetInitialProps [LAMBDA (type) (* thh%: "31-May-85 09:02") (* gets initial prop list to use when new equation of specified type is created) (PROG ([props (COPY (EQIO.GetInfo type 'objectProps] (initialPropFn (EQIO.GetInfo type 'initialPropFn)) newProps) [COND ((AND initialPropFn (SETQ newProps (APPLY* initialPropFn type))) (COND [props (repeatwhile newProps do (LISTPUT props (CAR newProps) (CADR newProps)) (SETQ newProps (CDDR newProps] (T (SETQ props newProps] (COND ([AND props (LISTGET props 'numPieces) (NOT (EQIO.GetInfo type 'variable?] (* this equation does not allow a variable number of pieces) (ERROR "EQIO.GetInitialProps: can't specify numPieces for fixed size eqn type = " type) )) (RETURN props]) (EQIO.NumPieces [LAMBDA eqn (* thh%: "31-Jul-85 08:49") (* gets or sets current number of parts for eqn --  args are (eqnObj {newValue})) (COND ((IGREATERP eqn 0) (PROG ((eqnObj (ARG eqn 1)) type value) (SETQ type (EQIO.EqnType eqnObj)) (RETURN (COND [(IEQP eqn 1) (COND ([AND (EQIO.GetInfo type 'variable?) (FIXP (SETQ value (EQIO.EqnProperty eqnObj 'numPieces] value) (T (* not variable or different number of  parts not specified) (EQIO.GetInfo type 'numPieces] ((EQIO.GetInfo type 'variable?) (EQIO.EqnProperty eqnObj 'numPieces (ARG eqn 2)) (EQIO.NewStructure eqnObj)) (T (ERROR "EQIO.NumPieces: equation has fixed # of parts, type = " type]) (EQIO.NewStructure [LAMBDA (eqnObj) (* thh%: " 3-Jun-85 09:21") (* called when eqn structure is changed --  e.g. different number of parts -- to reset any saved menus, etc.) (EQIO.EqnProperty eqnObj 'selectionMenu NIL) (PROG [(changeFn (EQIO.GetInfo (EQIO.EqnType eqnObj) 'changeFn] (COND (changeFn (APPLY* changeFn eqnObj]) ) (* ;;; "functions to handle equation specification info") (DEFINEQ (EQIO.AddType [LAMBDA (type formFn numPieces PROPS) (* THH " 1-Jul-85 08:37") (* creates info for new equation type) [PROG ((newValue (APPEND (LIST 'formFn formFn 'numPieces numPieces) PROPS))) (PUTPROP type 'equationInfo newValue) (COND ((NOT (MEMB type EquationInfo)) (push EquationInfo type] (EQIO.ResetTypeProps type]) (EQIO.GetInfo [LAMBDA (type info) (* thh%: "28-Jun-85 15:17") (* returns specified info for equation  type) (LISTGET (GETPROP type 'equationInfo) info]) (EQIO.SetInfo [LAMBDA (type info newValue) (* thh%: "28-Jun-85 15:38") (* allows setting particular equation info items for previously defined  equation types) (COND ((EQIO.IsDefined type) (LET [(spec (GETPROP type 'equationInfo] (COND (spec (LISTPUT spec info newValue) (PUTPROP type 'equationInfo spec) (EQIO.ResetTypeProps type) newValue) (T (ERROR "EQIO.SetInfo: warning -- no specifications for eqn type = " type]) (EQIO.TypeProp [LAMBDA type (* thh%: "31-May-85 09:11") (* associates properties with equation types --  e.g. can be used to store selection menus for equations with fixed number of  parts) (* args are (type prop {newValue})) (COND ((IEQP type 2) (LISTGET (GETPROP (ARG type 1) 'equationProps) (ARG type 2))) ((IEQP type 3) (PROG [(list (GETPROP (ARG type 1) 'equationProps] [COND (list (LISTPUT list (ARG type 2) (ARG type 3))) (T (SETQ list (LIST (ARG type 2) (ARG type 3] (PUTPROP (ARG type 1) 'equationProps list]) (EQIO.ResetTypeProps [LAMBDA (type) (* THH " 1-Jul-85 08:36") (* removes all props associated with this equation type --  called when type info redefined) (SETQ EquationTypeMenu NIL) (PUTPROP type 'equationProps NIL]) (EQIO.IsDefined [LAMBDA (type) (* thh%: "28-Jun-85 15:27") (* returns type if it is a currently defined equation type, else NIL) (COND ((MEMB type EquationInfo) type) (T NIL]) (EQIO.GetBox [LAMBDA (specification) (* THH " 2-May-85 13:22") (* gets image box) (CAR specification]) (EQIO.GetDataSpec [LAMBDA (specification piece#) (* THH " 2-May-85 13:26") (* gets data spec for corresponding  piece) (CAR (NTH specification (ADD1 piece#]) (EQIO.GetDataSpecList [LAMBDA (specification) (* THH "12-Jul-85 10:22") (CDR specification]) (EQIO.GetDataPosition [LAMBDA (dataSpec) (* THH " 2-May-85 13:26") (CAR dataSpec]) (EQIO.GetDataSelectRegion [LAMBDA (dataSpec) (* THH " 2-May-85 13:26") (CDR dataSpec]) (EQIO.MakeSpec [LAMBDA (box dataSpecList) (* THH " 2-May-85 13:26") (* constructs specification) (CONS box dataSpecList]) (EQIO.MakeDataSpec [LAMBDA (position selectRegion) (* THH " 2-May-85 13:26") (CONS position selectRegion]) ) (* ;;; "variable specification") (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EquationInfo EquationTypeMenu EquationImageFns UnknownEquationData EquationDefaultSelectFn) ) (RPAQQ EquationImageFns NIL) (RPAQ? EquationInfo NIL) (RPAQ? EquationDefaultSelectFn 'EQIO.DefaultSelectFn) [TEDIT.ADD.MENUITEM TEDIT.DEFAULT.MENU '(Equation 'EQN.Equation] (* ;  "needed to force the getfn to be recognized before any new eqns defined") (SETQ EquationImageFns (EQIO.CreateFns)) (RPAQQ UnknownEquationData (((Gacha 10) "[unknown equation]"))) (PUTPROPS EQIO.TypeProp ARGNAMES (NIL (type prop {newValue}) args)) (PUTPROPS EQIO.NumPieces ARGNAMES (NIL (eqnObj {newValue}) args)) (PUTPROPS EQIO.AllProps ARGNAMES (NIL (eqnObj {newValue}) args)) (PUTPROPS EQIO.EqnProperty ARGNAMES (NIL (eqnObj prop {newValue}) args)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA EQN.ObjEditWindow EQN.ContinueFlg EQN.PieceNumber EQN.ResultObj EQN.ResultWindow EQN.EditWindow EQIO.TypeProp EQIO.NumPieces EQIO.AllProps EQIO.EqnProperty) ) (* ;;; "EQUATIONEDIT module: Part 2 of 3") (* ; "functions to edit data pieces") (DEFINEQ (EQN.AbortEdit [LAMBDA (mainWindow) (* thh%: " 3-May-85 11:17") (* terminates any eqn edit without  allowing any continuation) (PROG ((editWindow (EQN.EditWindow mainWindow))) (COND ((WINDOWP editWindow) (EQN.ContinueFlg editWindow NIL) (EQN.StopEdit mainWindow]) (EQN.StopEdit [LAMBDA (mainWindow) (* thh%: " 3-May-85 10:31") (* terminates any eqn edit) (PROG ((editWindow (EQN.EditWindow mainWindow))) (COND ((WINDOWP editWindow) (EQN.FinishEdit editWindow) (TEDIT.QUIT (TEXTSTREAM editWindow)) (CLOSEW editWindow]) (EQN.ContinueEdit [LAMBDA (window) (* thh%: "28-Jun-85 14:14") (* called after sub edit quits to see if eqn edit should continue with next  piece) (* continueFlg is NIL to stop, T to continue incrementing by 1, FIXP to  increment by that amount once, (FIXP . end) to increment up/down to end  (end = NIL to contnue until no more)%, or a function to determine next piece  from current piece (NIL to end)) (* selection is pending delete for selections that continue beyond current  piece) [PROG [(process (WINDOWPROP (EQN.ResultWindow window) 'PROCESS] (* return TTY process to result window) (COND (process (TTY.PROCESS process] (PROG ((continueFlg (EQN.ContinueFlg window)) (newPiece# (EQN.PieceNumber window)) increment end) (COND ((COND ((EQ continueFlg T) (add newPiece# 1) T) ((NULL continueFlg) NIL) [(FIXP continueFlg) (* treat pieces as circular list) (LET [(oldPiece# newPiece#) (numPieces (EQIO.NumPieces (EQN.ResultObj window] (SETQ newPiece# (IMOD (PLUS oldPiece# continueFlg) numPieces)) (COND ((ZEROP newPiece#) (SETQ newPiece# numPieces))) (SETQ continueFlg NIL) (* this is a one-shot continuation so continueFlg for new edit to NIL) (NOT (IEQP newPiece# oldPiece#] ((LISTP continueFlg) (COND [(AND (FIXP (SETQ increment (CAR continueFlg))) (NOT (ZEROP increment)) (OR (FIXP (SETQ end (CDR continueFlg))) (NULL end))) (add newPiece# increment) (COND ((NULL end) (* always continue) T) ((MINUSP increment) (IGEQ newPiece# end)) (T (ILEQ newPiece# end] (T (* bad format list --  don't continue) NIL))) ((LITATOM continueFlg) (SETQ newPiece# (APPLY* continueFlg newPiece#)) (* continue if the function returned a  valid piece number) (FIXP newPiece#)) (T (ERROR "EQN.ContinueEdit: Invalid value for continueFlg = " continueFlg) NIL)) (* continue with edit of newPiece#) (* * continuation of edit requested -- start new edit) (EQN.StartNextEdit (EQN.ResultObj window) (EQN.ResultWindow window) newPiece# continueFlg (COND (continueFlg 'PENDINGDEL) (T NIL]) (EQN.FinishEdit [LAMBDA (window) (* thh%: " 5-Dec-85 11:06") (* returns edited data to calling  TEdit) (PROG ((mainWindow (EQN.ResultWindow window))) (EQN.ObjEditWindow (EQN.ResultObj window) NIL) (EQN.AbortEdit window) (* abort any sub edits) (EQN.UpdateEdit mainWindow (WINDOWPROP window 'NOUPDATE)) (EQN.EditWindow mainWindow NIL)) (* return T to allow TEdit to quit without user confirmation) T]) (EQN.MakeEditWindow [LAMBDA (mainWindow XSIZE YSIZE) (* thh%: " 6-Dec-85 11:34") (* creates window for subeditor) (LET ((editWindow (CREATEW (CREATEREGION 0 0 (fetch (REGION WIDTH) of (WINDOWPROP mainWindow 'REGION)) (PLUS 10 (HEIGHTIFWINDOW (TIMES 2 YSIZE) T))) "Eqn edit" NIL T))) (ATTACHWINDOW editWindow mainWindow 'BOTTOM 'LEFT 'LOCALCLOSE) (* note%: edit window is justified -- later may automatically reshape it as new  text is entered) (WINDOWADDPROP editWindow 'CLOSEFN 'DETACHWINDOW) (* edit window will be detached when  closed) (* * allow main and edit windows to be independently reshaped) (WINDOWDELPROP editWindow 'PASSTOMAINCOMS 'SHAPEW) (WINDOWADDPROP editWindow 'REJECTMAINCOMS 'SHAPEW) (* * make windows snuggle after reshape) (WINDOWADDPROP editWindow 'RESHAPEFN 'EQN.SnuggleWindows) (WINDOWADDPROP mainWindow 'RESHAPEFN 'EQN.SnuggleWindows) editWindow]) (EQN.SetUpEdit [LAMBDA (editWindow mainWindow eqnObj continueFlg piece#) (* thh%: " 5-Dec-85 10:59") (* sets up props for sub edit) (EQN.ResultWindow editWindow mainWindow) (EQN.ResultObj editWindow eqnObj) (EQN.ContinueFlg editWindow continueFlg) (EQN.PieceNumber editWindow piece#) [WINDOWPROP editWindow 'TEDIT.MENU.COMMANDS '(Find Looks Substitute Character% Looks (Equation 'EQN.Equation) (Exit 'Quit "exit from equation editor" (SUBITEMS (Next% Piece 'EQN.NextPiece) (Finish% Eqn 'EQN.FinishEqn) (Abort 'EQN.NoUpdateAbort "Terminates eqn editor without changing eqn." ] (EQN.ObjEditWindow eqnObj editWindow]) (EQN.StartEdit [LAMBDA (eqnObj mainWindow piece# continueFlg initialSEL) (* thh%: " 6-Dec-85 11:21") (* Starts edit of specified piece of eqnObj which is currently in TEdit  mainWindow. Starts new edit only if piece exists.) (* continueFlg determines action on  normal exit) (* initialSEL is initial selection or  char number) (EQN.AbortEdit mainWindow) (* abort any previous eqn edit) (COND ((AND (IGREATERP piece# 0) (ILEQ piece# (EQIO.NumPieces eqnObj))) (PROG ((data (EQIO.EqnData eqnObj piece#)) editWindow editStream box len) (SETQ box (FS.Box data (DECODE/WINDOW/OR/DISPLAYSTREAM mainWindow))) (SETQ editWindow (EQN.MakeEditWindow mainWindow (fetch XSIZE of box) (fetch YSIZE of box))) [TEDIT NIL editWindow NIL (APPEND '(QUITFN EQN.FinishEdit AFTERQUITFN EQN.ContinueEdit CHARFN EQN.CharFn) (LIST 'PROMPTWINDOW (OR (TEXTPROP (TEXTSTREAM mainWindow) 'PROMPTWINDOW) (GETPROMPTWINDOW mainWindow] (* sub edit uses same prompt window as  main editor) (EQN.SetUpEdit editWindow mainWindow eqnObj continueFlg piece#) (SETQ editStream (TEXTSTREAM editWindow)) (SETQ len (FS.Insert data editStream)) (COND ((EQ initialSEL 'PENDINGDEL) (TEDIT.SETSEL editStream 1 len 'RIGHT T)) ((FIXP initialSEL) (TEDIT.SETSEL editStream initialSEL 0 'RIGHT)) ((type? SELECTION initialSEL) (TEDIT.SETSEL editStream initialSEL))) (EQN.EditWindow mainWindow editWindow) [COND ((NOT (EQN.SubEditorP mainWindow)) (* this is a main edit window -- make sure sub edits are aborted when main edit  is done (don't call EQN.FinishEdit since want QUITFN to return NIL to allow  user to confirm quit at top level)) (TEXTPROP (TEXTSTREAM mainWindow) 'QUITFN 'EQN.AbortEdit] (* old TEdit version%:  (WINDOWPROP mainWindow  (QUOTE TEDIT.QUITFN)  (QUOTE EQN.FinishEdit))) ]) (EQN.StartNextEdit [LAMBDA (eqnObj mainWindow newPiece# continueFlg initialSEL) (* thh%: "29-May-85 10:10") (* if another piece of eqnObj exists, starts an edit of it) (EQN.StartEdit eqnObj mainWindow newPiece# continueFlg initialSEL) (* mark obj as changed to allow display indication of new piece being edited) (TEDIT.OBJECT.CHANGED (TEXTSTREAM mainWindow) eqnObj]) (EQN.UpdateEdit [LAMBDA (mainWindow noChangeFLG) (* thh%: " 6-Dec-85 09:52") (* updates sub edit in mainWindow) (* noChangeFLG non-NIL means main eqn not changed, but still must notify TEdit  obj is changed to update display, e.g. uninvert edited piece) (PROG ((editWindow (EQN.EditWindow mainWindow)) value datum eqnObj piece# ptr) (COND ((WINDOWP editWindow) (SETQ eqnObj (EQN.ResultObj editWindow)) [COND ((NOT noChangeFLG) (EQN.UpdateEdit editWindow) (* get updates of any sub edits) (SETQ piece# (EQN.PieceNumber editWindow)) (SETQ value (FS.Extract (TEXTSTREAM editWindow))) (SETQ datum (EQIO.EqnDataList eqnObj)) (SETQ ptr (NTH datum piece#)) (COND (ptr (RPLACA ptr value)) (T (* put value on end of datum) (EQIO.SetDataList eqnObj (NCONC1 datum value] (EQN.CheckWindowSize mainWindow eqnObj) (TEDIT.OBJECT.CHANGED (TEXTSTREAM mainWindow) eqnObj]) (EQN.DefaultData [LAMBDA (type fontSpec numPieces dataList) (* thh%: " 6-Dec-85 09:44") (* gets list of default data items to use for equation specified type) (* currently just a single item --  blank) (* if dataList is specified its values are used as the default data --  either directly if the item is a format string or with default font for the  piece if it is a string) [COND ((NOT numPieces) (SETQ numPieces (EQIO.GetInfo type 'numPieces] (PROG [(initialData (EQIO.GetInfo type 'initialData] (RETURN (COND ((AND initialData (LITATOM initialData)) (APPLY* initialData fontSpec type numPieces dataList)) (T (COND ((NLISTP initialData) (SETQ initialData NIL))) (PROG ((fontNumber (EQN.EquationFontNumber fontSpec))) (RETURN (COND [numPieces (for i from 1 to numPieces bind initial item collect (SETQ initial (pop initialData)) (SETQ item (pop dataList)) (* each piece of the equation consists of a single-item format string  (unless specified otherwise by value in dataList)) (COND ((AND item (LISTP item)) item) ((IMAGEOBJP item) (LIST item)) (T (LIST (FS.MakeItem [EQN.EquationFont (PLUS fontNumber (COND ((FIXP initial ) initial) (T 0] (COND (item (MKSTRING item)) (T " "] (T NIL]) (EQN.TypeMenu [LAMBDA NIL (* THH " 1-Jul-85 08:42") (* returns menu of equation types) (COND ((AND (BOUNDP 'EquationTypeMenu) (type? MENU EquationTypeMenu)) EquationTypeMenu) (T (* compute menu from EquationInfo) (SETQ EquationTypeMenu (create MENU ITEMS _ (SORT (for item in EquationInfo bind label collect (SETQ label (EQIO.GetInfo item 'menuLabel)) (COND (label (LIST label (KWOTE item))) (T item))) T) TITLE _ "Equation Types"]) ) (* ;;; "hooks to control behavior of equation subeditor") (DEFINEQ (EQN.Equation [LAMBDA (textStream) (* thh%: "31-May-85 08:58") (* allows insertion of an equation at current selection in textStream) (PROG ((type (MENU (EQN.TypeMenu))) currentFont window eqnObj props) (COND (type (SETQ currentFont (FS.ExtractFont textStream)) (SETQ window (EQN.WindowFromText textStream)) (SETQ props (EQIO.GetInitialProps type)) (SETQ eqnObj (EQIO.Create type (EQN.DefaultData type currentFont (LISTGET props 'numPieces)) currentFont props)) (EQN.CheckWindowSize window eqnObj) (TEDIT.INSERT.OBJECT eqnObj textStream) (EQN.StartEdit eqnObj window 1 T 'PENDINGDEL) (* must mark obj changed to allow display to indicate obj is being edited) (* TEDIT.OBJECT.CHANGED can not be called directly from EQN.StartEdit because  that fcn is called by the button fcn) (TEDIT.OBJECT.CHANGED textStream eqnObj]) (EQN.NextPiece [LAMBDA (textStream) (* thh%: "29-May-85 10:11") (* aborts edit and continues with next  piece of eqn) (PROG ((editWindow (EQN.WindowFromText textStream)) mainWindow) (SETQ mainWindow (EQN.ResultWindow editWindow)) (COND ((WINDOWP mainWindow) (EQN.ContinueFlg editWindow (COND ((EQN.ContinueFlg editWindow)) (T 1))) (EQN.StopEdit mainWindow]) (EQN.FinishEqn [LAMBDA (textStream) (* thh%: " 3-May-85 11:53") (* aborts edit without any  continuation) (PROG ((editWindow (EQN.WindowFromText textStream)) mainWindow) (SETQ mainWindow (EQN.ResultWindow editWindow)) (COND ((WINDOWP mainWindow) (EQN.AbortEdit mainWindow]) (EQN.NoUpdateAbort [LAMBDA (textStream) (* thh%: " 5-Dec-85 11:21") (* aborts equation editor without  updating eqn in main window) (EQN.PreventUpdate (EQN.WindowFromText textStream)) (EQN.FinishEqn textStream]) (EQN.PreventUpdate [LAMBDA (window) (* thh%: " 5-Dec-85 11:21") (* prevents any update of this or any  subeditors) (COND ((WINDOWP window) (WINDOWPROP window 'NOUPDATE T) (EQN.PreventUpdate (EQN.EditWindow window]) (EQN.CharFn [LAMBDA (textObj charcode) (* thh%: "19-Aug-85 08:31") (* prevents control chars from being  inserted into the document) (* allows any char that can be used in a format string and a few special  editing chars%: backspace & delete) (* allows NEXT syntax char to exit  from editor) (LET ((syntax (EQN.TEditSpecialChar textObj charcode))) (COND ((EQ syntax 'NEXT) (* next syntax key pressed -- see if this should quit eqn editor) (COND ((TEDIT.FIND (TEXTSTREAM textObj) ">>*<<" NIL NIL T) (* special char -- let TEdit advance  to next slot) T) (T (* force exit) (EQN.FinishEdit (EQN.WindowFromText textObj)) (* TEDIT.QUIT does not automatically  call the QUITFN) (TEDIT.QUIT (TEXTSTREAM textObj)) NIL))) (syntax (* special character) T) ((FS.AllowedChar charcode) (* this character can be in format  strings) T) (T (* don't allow this char to be  inserted) (FLASHWINDOW (EQN.WindowFromText textObj)) NIL]) (EQN.TEditSpecialChar [LAMBDA (textObj charcode) (* thh%: "16-Aug-85 09:35") (* if charcode is a control character for edit specified by textObj returns its  syntax class, else NIL) (* this may not correspond exactly to the procedure TEdit uses to determine  syntax of a character -- need to also check terminal table??) (LET ((table (OR (READTABLEP (TEXTPROP textObj 'READTABLE)) TEDIT.READTABLE)) syntax) (SETQ syntax (TEDIT.GETSYNTAX charcode table)) (COND ((EQ syntax 'NONE) (SETQ syntax NIL))) syntax]) (EQN.SnuggleWindows [LAMBDA (window) (* thh%: " 6-Dec-85 12:07") (* reshape fn for independently  reshapeable attached windows) (* * move attached windows) (REPOSITIONATTACHEDWINDOWS window) (* Does not work correctly when window itself has attached windows ??) (* * move main window) (EQN.SnuggleMainWindow window]) (EQN.SnuggleMainWindow [LAMBDA (window) (* thh%: " 6-Dec-85 11:44") (* moves all windows in main window  chain) (LET ((mainW (MAINWINDOW window)) region) (COND ((AND (WINDOWP mainW) (NOT (EQ mainW window))) (SETQ region (WINDOWREGION window)) (* position main window above window) (* note that MOVEW must be rejected by window so that moving main window wont  also move attached window) [RESETLST (RESETSAVE (WINDOWADDPROP window 'REJECTMAINCOMS 'MOVEW) `(WINDOWDELPROP %, window REJECTMAINCOMS MOVEW)) (MOVEW mainW (fetch (REGION LEFT) of region) (PLUS (fetch (REGION BOTTOM) of region) (fetch (REGION HEIGHT) of region] (EQN.SnuggleMainWindow mainW]) ) (* ;;; "functions to handle equation fonts") (DEFINEQ (EQN.EquationFontNumber [LAMBDA (fontSpec) (* thh%: "31-Jul-85 08:48") (* returns number of the font to use for normal size parts of the equation) (* fontSpec can be a number which then corresponds to the size of the font) (COND ((NOT fontSpec) (SETQ fontSpec DEFAULTFONT))) (PROG [(size (OR (NUMBERP fontSpec) (FONTPROP fontSpec 'SIZE] (RETURN (for i from 1 to (ARRAYSIZE EquationFontSpecs) smallest (ABS (DIFFERENCE (FONTPROP (ELT EquationFontSpecs i) 'SIZE) size]) (EQN.EquationFont [LAMBDA (n) (* thh%: " 5-Dec-85 11:26") (* returns equation font number n) (COPY (ELT EquationFontSpecs (MAX 1 (MIN (ARRAYSIZE EquationFontSpecs) n]) (EQN.GetEqnFont [LAMBDA (fontSpec) (* thh%: "31-Jul-85 08:52") (EQN.EquationFont (EQN.EquationFontNumber fontSpec]) (EQN.MakeFS [LAMBDA (item fontSpec) (* thh%: "31-Jul-85 08:58") (* constructs a single element format  string) (COND ((IMAGEOBJP item) (LIST item)) ((LISTP item) item) (T (LIST (FS.MakeItem fontSpec (MKSTRING item]) ) (* ;;; "utilities") (DEFINEQ (EQN.AdjustWindow [LAMBDA (editWindow dWidth dHeight) (* thh%: " 6-Dec-85 12:09") (* reshapes subeditor window to have  extra width and height) (PROG ((region (WINDOWPROP editWindow 'REGION)) (attachedWindows (ATTACHEDWINDOWS editWindow)) newHeight howAttached) (SETQ newHeight (MAX (HEIGHTIFWINDOW 10 T) (PLUS (fetch HEIGHT of region) dHeight))) (* want to shape this window only, not any attached windows --  depends on correctly setting props when edit windows created) (* SETQ howAttached (for window in  attachedWindows collect  (DETACHWINDOW window))) (SHAPEW editWindow (create REGION LEFT _ (fetch LEFT of region) BOTTOM _ (DIFFERENCE (fetch BOTTOM of region) (DIFFERENCE newHeight (fetch HEIGHT of region))) WIDTH _ (MAX (WIDTHIFWINDOW 10) (PLUS (fetch WIDTH of region) dWidth)) HEIGHT _ newHeight)) (* reattach the windows -- note that LOCALCLOSE is assumed for all windows) (* for window in attachedWindows as how in howAttached do  (ATTACHWINDOW window editWindow (CAR how)  (CDR how) (QUOTE LOCALCLOSE))) ]) (EQN.CheckWindowSize [LAMBDA (window eqnObj) (* thh%: "29-May-85 08:52") (* makes sure window can contain new obj --  currently only checks based on height of new obj, assuming YDESC not too large) (COND ((EQN.SubEditorP window) (* only adjust for subeditors  (They contain a single line of text)) (PROG ((box (APPLY* (IMAGEOBJPROP eqnObj 'IMAGEBOXFN) eqnObj (DECODE/WINDOW/OR/DISPLAYSTREAM window))) (height (WINDOWPROP window 'HEIGHT)) extraHeight) (SETQ extraHeight (DIFFERENCE (MIN 400 (TIMES 2 (fetch YSIZE of box))) height)) (* for now require window to be twice as high as object so don't have to check  YDESC -- should work for most cases) (COND ((IGREATERP extraHeight 0) (EQN.AdjustWindow window 0 extraHeight]) ) (DEFINEQ (EQN.SubEditorP [LAMBDA (window) (* thh%: "28-May-85 09:27") (* non-NIL if window has a eqn subeditor running in it) (EQN.ResultWindow window]) (EQN.WindowFromText [LAMBDA (textObjORStream) (* thh%: "28-Jun-85 14:32") (* gets window corresponding to a text  object or stream) (* note%: \WINDOW field actually is a list whose only element is the window) (LET [(w (fetch \WINDOW of (TEXTOBJ textObjORStream] (OR (WINDOWP w) (WINDOWP (CAR w)) (ERROR "EQN.WindowFromText: unable to find window for textobj/stream = " textObjORStream ]) (EQN.EditWindow [LAMBDA window (* thh%: " 3-May-85 08:55") (* returns or sets window of any sub  edit) (COND [(IEQP window 1) (PROG [(w (WINDOWPROP (ARG window 1) 'EditWindow] (* test for valid window) (RETURN (COND ((WINDOWP w) (COND ((AND (OPENWP w) (EQ (EQN.ResultWindow w) (ARG window 1))) w) (T (WINDOWPROP (ARG window 1) 'EditWindow NIL) NIL))) (T NIL] ((IEQP window 2) (WINDOWPROP (ARG window 1) 'EditWindow (ARG window 2))) (T NIL]) (EQN.ResultWindow [LAMBDA editWindow (* THH " 2-May-85 16:20") (* returns or sets main window for a  sub edit) (COND ((IEQP editWindow 1) (WINDOWPROP (ARG editWindow 1) 'ResultWindow)) ((IEQP editWindow 2) (WINDOWPROP (ARG editWindow 1) 'ResultWindow (ARG editWindow 2))) (T NIL]) (EQN.ResultObj [LAMBDA editWindow (* THH " 2-May-85 16:25") (* returns or sets object being edited) (COND ((IEQP editWindow 1) (WINDOWPROP (ARG editWindow 1) 'ResultObj)) ((IEQP editWindow 2) (WINDOWPROP (ARG editWindow 1) 'ResultObj (ARG editWindow 2))) (T NIL]) (EQN.PieceNumber [LAMBDA editWindow (* THH " 2-May-85 16:37") (* returns or sets number of piece  being edited) (COND ((IEQP editWindow 1) (WINDOWPROP (ARG editWindow 1) 'PieceNumber)) ((IEQP editWindow 2) (WINDOWPROP (ARG editWindow 1) 'PieceNumber (ARG editWindow 2))) (T NIL]) (EQN.ContinueFlg [LAMBDA editWindow (* THH " 2-May-85 16:25") (* returns or sets continuation flag) (* THH " 2-May-85 13:35") (COND ((IEQP editWindow 1) (WINDOWPROP (ARG editWindow 1) 'ContinueFlg)) ((IEQP editWindow 2) (WINDOWPROP (ARG editWindow 1) 'ContinueFlg (ARG editWindow 2))) (T NIL]) (EQN.ValidEditWindow [LAMBDA (editWindow eqnObj) (* THH " 8-May-85 09:44") (* returns editWindow if it is a window currently being used to edit eqnObj,  else NIL) (COND ((AND (WINDOWP editWindow) (OPENWP editWindow) (EQ (EQN.ResultObj editWindow) eqnObj)) editWindow) (T NIL]) (EQN.ObjEditWindow [LAMBDA eqn (* THH " 8-May-85 10:01") (* gets or sets edit window for eqnObj) (* eqn is of the form  (eqnObj {newEditWindow})) (PROG (editWindow eqnObj) (COND ((AND (IGREATERP eqn 0) (SETQ eqnObj (ARG eqn 1)) (IMAGEOBJP eqnObj)) (RETURN (COND ((IEQP eqn 1) (SETQ editWindow (IMAGEOBJPROP eqnObj 'editWindow)) (COND ((EQN.ValidEditWindow editWindow eqnObj)) (editWindow (* remove invalid edit window prop) (IMAGEOBJPROP eqnObj 'editWindow NIL) NIL) (T NIL))) ((IEQP eqn 2) (SETQ editWindow (EQN.ValidEditWindow (ARG eqn 2) eqnObj)) (IMAGEOBJPROP eqnObj 'editWindow editWindow]) ) (DEFINEQ (EQN.Make [LAMBDA (type dataList fontSpec PROPS) (* thh%: " 9-Jan-86 10:12") (* creates equation of specified type with given dataList --  for variable piece eqns PROPS should include numPieces) (COND ((EQIO.IsDefined type) (LET [(numPieces (LISTGET PROPS 'numPieces] (EQIO.Create type (EQN.DefaultData type fontSpec (COND ((EQIO.GetInfo type 'variable?) numPieces) (numPieces (ERROR "Can't specify numPieces for type = " type)) (T NIL)) dataList) fontSpec PROPS))) (T (ERROR "Unknown equation type = " type]) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EquationFontSpecs) ) (RPAQ EquationFontSpecs (READARRAY-FROM-LIST 3 (QUOTE POINTER) 1 (QUOTE ((TimesRoman 8) (TimesRoman 10 ) (TimesRoman 12) NIL)))) (PUTPROPS EQN.ObjEditWindow ARGNAMES (NIL (eqnObj {newEditWindow}) args)) (PUTPROPS EQN.ContinueFlg ARGNAMES (NIL (editWindow {continueFlg}) args)) (PUTPROPS EQN.PieceNumber ARGNAMES (NIL (editWindow {pieceNumber}) args)) (PUTPROPS EQN.ResultObj ARGNAMES (NIL (editWindow {resultObj}) args)) (PUTPROPS EQN.ResultWindow ARGNAMES (NIL (editWindow {resultWindow}) args)) (PUTPROPS EQN.EditWindow ARGNAMES (NIL (window {editWindow}) args)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA EQN.ObjEditWindow EQN.ContinueFlg EQN.PieceNumber EQN.ResultObj EQN.ResultWindow EQN.EditWindow) ) (* ;;; "FORMATSTRING module: Part 3 of 3") (DEFINEQ (FS.Box [LAMBDA (data imageStream) (* thh%: "27-May-87 10:02") (* determines box within which data will be displayed on imageStream --  data is a list whose elements are either image objs or lists of the form  (FontSpec String Shift)) (* added adjustment for shift -- assumes data still spans baseline) (for item in data bind (width _ 0) (ascent _ 0) (descent _ 0) (scale _ (DSPSCALE NIL imageStream)) do (PROG ((itemWidth 0) (itemAscent 0) (itemDescent 0) fullFont imageBox shift) [COND ((IMAGEOBJP item) (SETQ imageBox (APPLY* (IMAGEOBJPROP item 'IMAGEBOXFN) item imageStream)) (SETQ itemWidth (fetch XSIZE of imageBox)) (SETQ itemAscent (DIFFERENCE (fetch YSIZE of imageBox) (fetch YDESC of imageBox))) (SETQ itemDescent (fetch YDESC of imageBox))) ((FS.RealStringP item) (SETQ fullFont (FONTCREATE (FS.ItemFont item) NIL NIL NIL imageStream)) (SETQ shift (TIMES scale (FS.ItemShift item))) (SETQ itemWidth (STRINGWIDTH (FS.ItemValue item) fullFont)) [SETQ itemAscent (PLUS shift (FONTPROP fullFont 'ASCENT] (SETQ itemDescent (DIFFERENCE (FONTPROP fullFont 'DESCENT) shift] (add width itemWidth) (SETQ ascent (MAX ascent itemAscent)) (SETQ descent (MAX descent itemDescent))) finally (RETURN (create IMAGEBOX XSIZE _ width YSIZE _ (PLUS ascent descent) YDESC _ descent XKERN _ 0]) (FS.Copy [LAMBDA (data) (* THH "21-May-85 12:38") (* constructs a copy of data -- data is a list whose elements are either image  objs or lists of the form (FontSpec String)) (for item in data collect (COND ((IMAGEOBJP item) (* note%: COPYALL doesn't call imageobj copyfn so it can't be used here) (APPLY* (IMAGEOBJPROP item 'COPYFN) item)) (T (COPYALL item]) (FS.Display [LAMBDA (data imageStream invert?) (* thh%: "27-May-87 10:02") (* displays data on imageStream -- data is a list whose elements are either  image objs or lists of the form (FontSpec String Shift)) (* added shift) (PROG ((scale (DSPSCALE NIL imageStream)) xStart yStart) [COND (invert? (SETQ xStart (DSPXPOSITION NIL imageStream)) (SETQ yStart (DSPYPOSITION NIL imageStream] [for item in data do (COND ((IMAGEOBJP item) (PROG ((xPos (DSPXPOSITION NIL imageStream)) (yPos (DSPYPOSITION NIL imageStream))) (APPLY* (IMAGEOBJPROP item 'DISPLAYFN) item imageStream) (MOVETO (PLUS xPos (fetch XSIZE of (APPLY* (IMAGEOBJPROP item 'IMAGEBOXFN) item imageStream))) yPos imageStream))) ((FS.RealStringP item) (PROG [(oldFont (DSPFONT NIL imageStream)) (shift (TIMES scale (FS.ItemShift item] (DSPFONT (FS.ItemFont item) imageStream) (COND ((NOT (ZEROP shift)) (RELMOVETO 0 shift imageStream))) (PRIN1 (FS.ItemValue item) imageStream) (DSPFONT oldFont imageStream) (COND ((NOT (ZEROP shift)) (RELMOVETO 0 (MINUS shift) imageStream] (COND (invert? (PROG ((box (FS.Box data imageStream))) (DSPFILL (create REGION LEFT _ xStart BOTTOM _ (DIFFERENCE yStart (fetch YDESC of box)) WIDTH _ (fetch XSIZE of box) HEIGHT _ (fetch YSIZE of box)) BLACKSHADE 'INVERT imageStream]) (FS.Get [LAMBDA (fileStream) (* thh%: "13-Jun-85 09:17") (* reads data from fileStream -- data is a list whose elements are either image  objs or lists of the form (FontSpec String)) (* also reads a list of such data  items) (HREAD fileStream]) (FS.Put [LAMBDA (data fileStream) (* THH " 2-May-85 14:31") (* puts data on fileStream -- data is a list whose elements are either image  objs or lists of the form (FontSpec String)) (* also writes a list of such data  items) (HPRINT data fileStream]) (FS.ItemFont [LAMBDA (dataItem) (* thh%: "15-May-85 11:29") (* returns font spec of single data  item) (COND ((LISTP dataItem) (CAR dataItem)) (T NIL]) (FS.ItemValue [LAMBDA (dataItem) (* THH "21-May-85 12:28") (* returns string of single data item  or image object) (COND ((LISTP dataItem) (CADR dataItem)) ((IMAGEOBJP dataItem) dataItem]) (FS.ItemShift [LAMBDA (dataItem) (* thh%: "27-May-87 09:57") (* shift is number of points to move  up) (COND ((LISTP dataItem) (OR (CADDR dataItem) 0)) (T 0]) (FS.MakeItem [LAMBDA (fontSpec string shift) (* thh%: "27-May-87 09:48") (* makes data item from fontSpec and  string with shift) (COND ((AND shift (NOT (ZEROP shift))) (LIST fontSpec string shift)) (T (LIST fontSpec string]) (FS.Extract [LAMBDA (stream) (* thh%: "27-May-87 10:23") (* extracts data from TEdit stream) (SETFILEPTR stream 0) (* BIN gets imageObj or individual  characters) (PROG ((EOFptr (GETEOFPTR stream)) (CHcount 0) data result) [SETQ data (while (ILESSP CHcount EOFptr) collect (add CHcount 1) (CONS CHcount (BIN stream] (* data has (ch# . item)) (* now combine characters into strings  and get font information) [SETQ data (for item in data collect item unless (AND (NUMBERP (CDR item)) (NOT (FS.AllowedChar (CDR item] (* remove control characters, e.g.  CR, LF, tab...) [SETQ result (while data bind item fontSpec shift collect (SETQ item (CAR data)) (SETQ data (CDR data)) (* note that imageobjs are not copied so changes to returned obj will also  change original) (COND ((IMAGEOBJP (CDR item))) (T (SETQ fontSpec (FS.ExtractFont stream (CAR item))) (SETQ shift (FS.ExtractShift stream (CAR item))) (PROG ([string (MKSTRING (CHARACTER (CDR item] (nextItem (CAR data))) (while [AND nextItem (NOT (IMAGEOBJP (CDR nextItem))) (EQUAL fontSpec (FS.ExtractFont stream (CAR nextItem))) (EQUAL shift (FS.ExtractShift stream (CAR nextItem] do [SETQ string (CONCAT string (CHARACTER (CDR nextItem ] (SETQ data (CDR data)) (SETQ nextItem (CAR data))) (RETURN (FS.MakeItem fontSpec string shift] (RETURN (COND ((AND result (FS.RealStringP (CAR result))) (* first item is a string) result) (T (* preserve initial font by including a null string item at beginning of list) (* this item has zero shift) (CONS (FS.MakeItem (FS.ExtractFont stream (COND ((ZEROP EOFptr) NIL) (T 1))) "") result]) (FS.ExtractFont [LAMBDA (stream selOrCh#) (* thh%: "20-Feb-86 14:05") (* gets font spec for specified  selection) (PROG ((looks (TEDIT.GET.LOOKS stream selOrCh#))) (RETURN (LIST (LISTGET looks 'FAMILY) (LISTGET looks 'SIZE) (LIST (LISTGET looks 'WEIGHT) (LISTGET looks 'SLOPE) (LISTGET looks 'EXPANSION]) (FS.ExtractShift [LAMBDA (stream selOrCh#) (* thh%: "27-May-87 10:26") (* gets upward shift in points for  specified selection) (LET ((looks (TEDIT.GET.LOOKS stream selOrCh#)) shift) (COND ((SETQ shift (LISTGET looks 'SUPERSCRIPT)) shift) ((SETQ shift (LISTGET looks 'SUBSCRIPT)) (MINUS shift)) (T 0]) (FS.Insert [LAMBDA (data stream) (* thh%: "27-May-87 10:43") (* inserts data list into TEdit stream) (for item in data bind (length _ 0) shift do [COND ((IMAGEOBJP item) (add length 1) (TEDIT.INSERT.OBJECT item stream)) [(FS.RealStringP item) (add length (NCHARS (FS.ItemValue item))) (SETQ shift (FS.ItemShift item)) (COND [(ZEROP shift) (TEDIT.INSERT stream (FS.ItemValue item) NIL (FONTCREATE (FS.ItemFont item] [(MINUSP shift) (TEDIT.INSERT stream (FS.ItemValue item) NIL `(FONT ,(FS.ItemFont item) SUBSCRIPT ,(MINUS shift] (T (TEDIT.INSERT stream (FS.ItemValue item) NIL `(FONT ,(FS.ItemFont item) SUPERSCRIPT ,shift] (T (* null string -- preserve font info) (TEDIT.CARETLOOKS stream (FONTCREATE (FS.ItemFont item] finally (RETURN length]) (FS.AllowedChar [LAMBDA (charcode) (* thh%: "19-Aug-85 08:29") (* returns T if charcode can be included in format strings) (IGEQ charcode (CHARCODE " "]) (FS.RealStringP [LAMBDA (item nullOk) (* thh%: "31-Jul-85 08:11") (AND (LISTP item) (OR nullOk (NOT (EQUAL "" (FS.ItemValue item]) ) (* ;;; "Now load EQUATIONFORMS") (FILESLOAD EQUATIONFORMS) (PUTPROPS EQUATIONS COPYRIGHT ("Xerox Corporation" 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (4524 19553 (EQIO.CreateFns 4534 . 5067) (EQIO.Create 5069 . 6335) (EQIO.Imagebox 6337 . 6749) (EQIO.Display 6751 . 8362) (EQIO.ButtonEventIn 8364 . 12205) (EQIO.Copy 12207 . 12588) ( EQIO.CopyList 12590 . 13161) (EQIO.Get 13163 . 13571) (EQIO.Put 13573 . 14128) (EQIO.WhenDeleted 14130 . 14624) (EQIO.SelectRegion 14626 . 15773) (EQIO.Selection 15775 . 17279) (EQIO.DefaultSelectFn 17281 . 18519) (EQIO.MakeSelectionMenu 18521 . 19551)) (19627 25629 (EQIO.EqnType 19637 . 19888) ( EQIO.EqnDataList 19890 . 20230) (EQIO.SetDataList 20232 . 20629) (EQIO.EqnData 20631 . 20810) ( EQIO.EqnProperty 20812 . 21740) (EQIO.AllProps 21742 . 22257) (EQIO.Specify 22259 . 22756) ( EQIO.GetInitialProps 22758 . 23890) (EQIO.NumPieces 23892 . 25135) (EQIO.NewStructure 25137 . 25627)) (25696 30158 (EQIO.AddType 25706 . 26219) (EQIO.GetInfo 26221 . 26571) (EQIO.SetInfo 26573 . 27214) ( EQIO.TypeProp 27216 . 28162) (EQIO.ResetTypeProps 28164 . 28486) (EQIO.IsDefined 28488 . 28773) ( EQIO.GetBox 28775 . 28995) (EQIO.GetDataSpec 28997 . 29330) (EQIO.GetDataSpecList 29332 . 29477) ( EQIO.GetDataPosition 29479 . 29619) (EQIO.GetDataSelectRegion 29621 . 29765) (EQIO.MakeSpec 29767 . 30003) (EQIO.MakeDataSpec 30005 . 30156)) (31711 48815 (EQN.AbortEdit 31721 . 32233) (EQN.StopEdit 32235 . 32682) (EQN.ContinueEdit 32684 . 36336) (EQN.FinishEdit 36338 . 37071) (EQN.MakeEditWindow 37073 . 38492) (EQN.SetUpEdit 38494 . 39671) (EQN.StartEdit 39673 . 42974) (EQN.StartNextEdit 42976 . 43493) (EQN.UpdateEdit 43495 . 44892) (EQN.DefaultData 44894 . 47579) (EQN.TypeMenu 47581 . 48813)) ( 48882 56790 (EQN.Equation 48892 . 50151) (EQN.NextPiece 50153 . 50878) (EQN.FinishEqn 50880 . 51409) ( EQN.NoUpdateAbort 51411 . 51824) (EQN.PreventUpdate 51826 . 52261) (EQN.CharFn 52263 . 54348) ( EQN.TEditSpecialChar 54350 . 55069) (EQN.SnuggleWindows 55071 . 55662) (EQN.SnuggleMainWindow 55664 . 56788)) (56844 58583 (EQN.EquationFontNumber 56854 . 57613) (EQN.EquationFont 57615 . 57957) ( EQN.GetEqnFont 57959 . 58140) (EQN.MakeFS 58142 . 58581)) (58612 61753 (EQN.AdjustWindow 58622 . 60582 ) (EQN.CheckWindowSize 60584 . 61751)) (61754 67638 (EQN.SubEditorP 61764 . 61997) (EQN.WindowFromText 61999 . 62656) (EQN.EditWindow 62658 . 63736) (EQN.ResultWindow 63738 . 64288) (EQN.ResultObj 64290 . 64758) (EQN.PieceNumber 64760 . 65309) (EQN.ContinueFlg 65311 . 65874) (EQN.ValidEditWindow 65876 . 66310) (EQN.ObjEditWindow 66312 . 67636)) (67639 68756 (EQN.Make 67649 . 68754)) (69964 85899 ( FS.Box 69974 . 72220) (FS.Copy 72222 . 72862) (FS.Display 72864 . 75850) (FS.Get 75852 . 76321) ( FS.Put 76323 . 76794) (FS.ItemFont 76796 . 77157) (FS.ItemValue 77159 . 77565) (FS.ItemShift 77567 . 77947) (FS.MakeItem 77949 . 78371) (FS.Extract 78373 . 82297) (FS.ExtractFont 82299 . 82902) ( FS.ExtractShift 82904 . 83467) (FS.Insert 83469 . 85458) (FS.AllowedChar 85460 . 85697) ( FS.RealStringP 85699 . 85897))))) STOP \ No newline at end of file diff --git a/lispusers/EQUATIONS.TEDIT b/lispusers/EQUATIONS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..34813c02506f0e01976dde1d2f649dacc144269f GIT binary patch literal 10901 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 literal 0 HcmV?d00001 diff --git a/lispusers/ETHERBOOT b/lispusers/ETHERBOOT new file mode 100644 index 00000000..75565e1b --- /dev/null +++ b/lispusers/ETHERBOOT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "25-Sep-91 13:23:32" |{PELE:MV:ENVOS}MEDLEY>ETHERBOOT.;2| 15353 changes to%: (VARS ETHERBOOTCOMS) previous date%: "13-Jul-88 17:04:37" |{PELE:MV:ENVOS}MEDLEY>ETHERBOOT.;1|) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1991 by Stanford University. All rights reserved. ") (PRETTYCOMPRINT ETHERBOOTCOMS) (RPAQQ ETHERBOOTCOMS ( (* ;; "Lisp-based Ethernet Boot server, requires ETHERRECORDS and EXPORTS.ALL to compile") (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) ETHERRECORDS SPPDECLS)) (FNS ETHERBOOT SENDSIMPLEDATA SENDSPPDATA CACHE.BOOT.FILES) (VARS ETHERBOOTFILES BOOTREQUESTTYPES) (ADDVARS (BOOTFILEDIRECTORIES {CORE} {DSK}) (BOOTFILECACHETYPES DB GERM)) (INITVARS (BOOTFILECACHEDIRECTORY '{CORE})) (DECLARE%: DONTCOPY (RECORDS ETHERBOOTPACKET ETHERBOOTFILE BOOTREQUESTTYPE) (CONSTANTS (ETHERBOOTPACKETTYPE 9) (BOOTSERVERSOCKET 10) (SIMPLEREQUEST 1) (SIMPLEDATA 2) (SPPREQUEST 3))) (GLOBALVARS ETHERBOOTFILES BOOTREQUESTTYPES BOOTFILEDIRECTORIES BOOTFILECACHETYPES BOOTFILECACHEDIRECTORY))) (* ;; "Lisp-based Ethernet Boot server, requires ETHERRECORDS and EXPORTS.ALL to compile") (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD (LOADCOMP) ETHERRECORDS SPPDECLS) ) (DEFINEQ (ETHERBOOT [LAMBDA (LOGFILE) (* ; "Edited 13-Jul-88 17:03 by cdl") (DECLARE (SPECVARS . T)) (LET (XIP NSOCKET BOOTFILE BOOTSTREAM BOOTREQUESTTYPE FILENUMBER ETHERBOOTFILE) (DECLARE (SPECVARS . T)) (RESETLST [RESETSAVE NIL `(CLOSENSOCKET ,(SETQ NSOCKET (OPENNSOCKET BOOTSERVERSOCKET 'ACCEPT] [do (DISCARDXIPS NSOCKET) (if LOGFILE then (printout LOGFILE "Listening ..." T)) (RESETLST [RESETSAVE NIL `(RELEASE.XIP ,(SETQ XIP (GETXIP NSOCKET T] (if (SETQ BOOTREQUESTTYPE (FASSOC (with ETHERBOOTPACKET XIP ETHERBOOTREQUESTTYPE) BOOTREQUESTTYPES)) then (SETQ FILENUMBER (with ETHERBOOTPACKET XIP ETHERBOOTFILENUMBER)) (if [SETQ ETHERBOOTFILE (for BOOTFILE in ETHERBOOTFILES thereis (with ETHERBOOTFILE BOOTFILE (EQP BOOTFILENUMBER FILENUMBER] then (with ETHERBOOTFILE ETHERBOOTFILE (if LOGFILE then (printout LOGFILE (DATE) %, (with BOOTREQUESTTYPE BOOTREQUESTTYPE REQUESTDESCRIPTION) %, "Request for" %, BOOTFILEDESCRIPTION %, "from" %, (with XIP XIP XIPSOURCENSADDRESS) T)) (if (SETQ BOOTFILE (FINDFILE BOOTFILENAME NIL BOOTFILEDIRECTORIES)) then (RESETLST [RESETSAVE NIL `(CLOSEF? ,(SETQ BOOTSTREAM (OPENSTREAM BOOTFILE 'INPUT] (if LOGFILE then (printout LOGFILE "Opened" %, (FULLNAME BOOTSTREAM) T)) [NLSETQ (with XIP XIP (with BOOTREQUESTTYPE BOOTREQUESTTYPE (APPLY* REQUESTFN BOOTSTREAM XIP LOGFILE]) (if LOGFILE then (printout LOGFILE T "Closed" %, (FULLNAME BOOTSTREAM ) T)) elseif LOGFILE then (printout LOGFILE "Error, File Not Found:" %, BOOTFILENAME T))) elseif LOGFILE then (printout LOGFILE "Error, Unknown File Number:" %, FILENUMBER T)) elseif LOGFILE then (printout LOGFILE "Error, Unknown Request Type:" %, (with ETHERBOOTPACKET XIP ETHERBOOTREQUESTTYPE ) T)))])]) (SENDSIMPLEDATA [LAMBDA (BOOTSTREAM PACKET LOGFILE) (* ; "Edited 13-Jul-88 15:45 by cdl") (LET (SOCKET) (DECLARE (SPECVARS SOCKET)) (if LOGFILE then (printout LOGFILE "Packets")) (RESETLST [RESETSAVE NIL `(CLOSENSOCKET ,(SETQ SOCKET (OPENNSOCKET] (bind XIP (BYTECOUNT _ (GETFILEINFO BOOTSTREAM 'LENGTH)) for PACKETNUMBER to (ADD1 (GETFILEINFO BOOTSTREAM 'SIZE)) do (if LOGFILE then (printout LOGFILE %, PACKETNUMBER)) (SETQ XIP (with NSADDRESS (with XIP PACKET XIPSOURCENSADDRESS) (\FILLINXIP ETHERBOOTPACKETTYPE SOCKET NSHOSTNUMBER NSSOCKET NSNET))) (XIPAPPEND.WORD XIP SIMPLEDATA) (with ETHERBOOTPACKET PACKET (XIPAPPEND.WORD XIP ETHERBOOTBFNHI) (XIPAPPEND.WORD XIP ETHERBOOTBFNMID) (XIPAPPEND.WORD XIP ETHERBOOTBFNLOW)) (XIPAPPEND.WORD XIP PACKETNUMBER) (to BYTESPERPAGE as old BYTECOUNT by -1 until (ZEROP BYTECOUNT) do (XIPAPPEND.BYTE XIP (BIN BOOTSTREAM))) (SENDXIP SOCKET XIP) (BLOCK)))]) (SENDSPPDATA [LAMBDA (BOOTSTREAM PACKET LOGFILE) (* ; "Edited 13-Jul-88 16:56 by cdl") (DECLARE (SPECVARS . T)) (LET (INPUTSTREAM OUTPUTSTREAM) (DECLARE (SPECVARS . T)) (RESETLST [RESETSAVE NIL `(SPP.CLOSE ,(SETQ INPUTSTREAM (with NSADDRESS (with XIP PACKET XIPSOURCENSADDRESS ) (SPP.OPEN NSHOSTNUMBER NSSOCKET NIL NIL '(EOM.ON.FORCEOUTPUT T] (with SPPSTREAM (SETQ OUTPUTSTREAM (SPPOUTPUTSTREAM INPUTSTREAM)) (with SPPCON SPP.CONNECTION (* Switch to negotiated connection  id) (SETQ SPPDESTID (with ETHERBOOTPACKET PACKET ETHERBOOTSPPDESTID))) (* Send SYS packet to establish  (Dove fix)) (\SPP.SENDPKT SPP.CONNECTION (\SPP.SYSPKT SPP.CONNECTION 0))) (if LOGFILE then (printout LOGFILE "Packets")) (for PAGES to (SUB1 (GETFILEINFO BOOTSTREAM 'SIZE)) as COUNTER from 1 do (COPYBYTES BOOTSTREAM OUTPUTSTREAM BYTESPERPAGE) (FORCEOUTPUT OUTPUTSTREAM) (if LOGFILE then (if (GEQ COUNTER 10) then (SETQ COUNTER 0) (printout LOGFILE %, PAGES))) finally (COPYBYTES BOOTSTREAM OUTPUTSTREAM))) (if LOGFILE then (printout LOGFILE T "SPP Stream closed"]) (CACHE.BOOT.FILES [LAMBDA (TYPES) (* cdl "24-Sep-86 15:31") (bind FILE TOFILE for ETHERBOOTFILE in ETHERBOOTFILES do (with ETHERBOOTFILE ETHERBOOTFILE (if (AND (EQMEMB (U-CASE (FILENAMEFIELD BOOTFILENAME 'EXTENSION)) (OR TYPES BOOTFILECACHETYPES)) [NOT (INFILEP (SETQ TOFILE (PACKFILENAME 'NAME BOOTFILENAME 'DIRECTORY BOOTFILECACHEDIRECTORY ] (SETQ FILE (FINDFILE BOOTFILENAME NIL BOOTFILEDIRECTORIES))) then (COPYFILE FILE TOFILE) (PRINTOUT T FILE T]) ) (RPAQQ ETHERBOOTFILES (("Standard DLion Ethernet Initial Microcode" EtherInitial.db 2852126720) ("Standard DLion Diagnostic Microcode" MoonBoot.db 2852126728) ("Standard DLion Mesa Microcode" Mesa.db 2852126736) ("Standard DLion Germ" DLion.germ 2852126744) ("Standard DLion Boot File" SimpleNetExecDLion.boot 2852126752) ("Standard DLion Diagnostics Boot File" EIDiskDLion.boot 2852127232) ("Standard DLion Installer Boot File" InstallerNSDLion.boot 2852127234) ("Alternate DLion Ethernet Initial Microcode" EtherInitialAlt.db 2852126721) ("Alternate DLion Mesa Microcode" Mesa.db 2852126738) ("Alternate DLion Germ" DLion.germ 2852126746) ("Alternate DLion Boot File" InstallerNSDLion.boot 2852126754) ("Standard TriDLion Diagnostic Microcode" Moonboot.db 2852126729) ("Standard TriDLion Mesa Microcode" TridentRavenMesa.db 2852126737) ("Standard TriDLion Germ" TriDlion.germ 2852126745) ("Standard TriDLion Boot File" SimpleNetExecTriDlion.boot 2852126753) ("Alternate TriDLion Mesa Microcode" TridentRavenMesa.db 2852126739) ("Alternate TriDLion Germ" TriDlion.germ 2852126747) ("Alternate TriDLion Boot File" InstallerNSTriDlion.boot 2852126753) ("Standard Dove Ethernet Initial Microcode" EtherInitialDove.db 2852128768) ("Standard Dove Diagnostic Microcode" MoonRise.db 2852128776) ("Standard Dove Mesa Microcode" MesaDove.db 2852128784) ("Standard Dove Germ" Dove.germ 2852128792) ("Standard Dove Boot File" SimpleNetExecDove.boot 2852128800) ("Alternate Dove Ethernet Initial Microcode" EtherInitialDove.db 2852128769) ("Alternate Dove Diagnostic Microcode" MoonRise.db 2852128777) ("Alternate Dove Mesa Microcode" MesaDove.db 2852128785) ("Alternate Dove Germ" Dove.germ 2852128793) ("Alternate Dove Boot File" InstallerNSDove.boot 2852128801) ("Dove Simple Net Exec" SimpleNetExecDove.boot 2852128824) ("Dove Configuration Utility" SysConfigOfflineDove.boot 2852128825) ("Dove Installer" InstallerNSDove.boot 2852128826) ("Dove Diagnostics Utility" DiagDiskUtilDove.boot 2852128828) ("Dove Rigid Disk Diagnostics Utility" DiagRDDove.boot 2852128829) ("Dove Ethernet Diagnostics Utility" DiagEtherDove.boot 2852128830) ("Dove Keyboard & Display Diagnostics Utility" KDMDove.boot 2852128831))) (RPAQQ BOOTREQUESTTYPES ((1 Simple SENDSIMPLEDATA) (3 SPP SENDSPPDATA))) (ADDTOVAR BOOTFILEDIRECTORIES {CORE} {DSK}) (ADDTOVAR BOOTFILECACHETYPES DB GERM) (RPAQ? BOOTFILECACHEDIRECTORY '{CORE}) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (ACCESSFNS ETHERBOOTPACKET [(ETHERBOOTBASE (with XIP DATUM XIPCONTENTS)) (ETHERBOOTFILENUMBER (with ETHERBOOTPACKET DATUM (PLUS (LSH ETHERBOOTBFNHI 32) (LSH ETHERBOOTBFNMID 16) ETHERBOOTBFNLOW] (BLOCKRECORD ETHERBOOTBASE ((ETHERBOOTREQUESTTYPE WORD) (ETHERBOOTBFNHI WORD) (ETHERBOOTBFNMID WORD) (ETHERBOOTBFNLOW WORD) (ETHERBOOTSPPDESTID WORD)))) (RECORD ETHERBOOTFILE (BOOTFILEDESCRIPTION BOOTFILENAME BOOTFILENUMBER)) (RECORD BOOTREQUESTTYPE (REQUESTTYPE REQUESTDESCRIPTION REQUESTFN)) ) (DECLARE%: EVAL@COMPILE (RPAQQ ETHERBOOTPACKETTYPE 9) (RPAQQ BOOTSERVERSOCKET 10) (RPAQQ SIMPLEREQUEST 1) (RPAQQ SIMPLEDATA 2) (RPAQQ SPPREQUEST 3) (CONSTANTS (ETHERBOOTPACKETTYPE 9) (BOOTSERVERSOCKET 10) (SIMPLEREQUEST 1) (SIMPLEDATA 2) (SPPREQUEST 3)) ) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS ETHERBOOTFILES BOOTREQUESTTYPES BOOTFILEDIRECTORIES BOOTFILECACHETYPES BOOTFILECACHEDIRECTORY) ) (PUTPROPS ETHERBOOT COPYRIGHT ("Stanford University" 1985 1986 1987 1988 1991)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1585 11003 (ETHERBOOT 1595 . 6049) (SENDSIMPLEDATA 6051 . 7503) (SENDSPPDATA 7505 . 9712) (CACHE.BOOT.FILES 9714 . 11001))))) STOP \ No newline at end of file diff --git a/lispusers/ETHERBOOT.TEDIT b/lispusers/ETHERBOOT.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..12da0b7545b39a32d6c4e7d6813fe921057c0df5 GIT binary patch literal 8706 zcmeHL-ESLN6`!Qt?V7GZd@KSa#8r`48>MdIIEmXLRL7nqCXSt*ak^Wom6+Jq$td<* zGc#^#Rx9zq)4uT+@K+!to_ImpHy-#y_!G+SocZv4I3F#DC#=>PpL@>le4l&oNaruF z{;s@&-apWd-CnO>tQL#4VsWEbT#)bsq}}-wA)4o|?fGhYE?v>F94Sil{mh(AfrAw226f)!IBO3xFQ=l0-SSmUv}^h68Da%?LH zFwXFiaz#tMlAb6jpDg#!EeBsxD0o1BLo8@@XO3e#XILoV5pSeESt}l^BiHbZSelToIy&)rDPa__4VrY67NhhcSpiCzkE_ z(y^R@6jMZZENsX2ZOexP(7`$>YENM#VZt*uh9hYY*lAaanJ0&$eualoB?Dvee zZWdlrV_2tS2|H1R>?*ecv{6x7?%*6rL_blgsZfWuD+j)EQB;&r{~RSdMn|TtnkrNf zSwbSEsq#GgbUYWXoG4$GV~{zdBoq->M)!rB`fFj`jUoDR>5FF1(7zO4w9LaVDNJN= z*fy8;cq|;$iYvXTLW@GPD}Otao{wIE@dgl+(#dJCLN|G)z%^onsni2%=2IN0CD0i5WI9GL zB16}}hG34u$`OQ*>~a?Yd!VNCKr$@zgin+JqzUA*U1kkEm z*eapcoujTD57owTuuzIQmtv&ALV}3Ar7W{$>?QpOcau`BE>3N~EKX^}(7qgV&=wnv z204T!K||AOGTdMaJQ=#!Nu4!JtkDRQ3PUY6$BR1Do1J10@@Hs40JeFn#K>C9He*x* zPm0A-=>eTnhL$@Ntqzq+ys?Gy;wU<*JSYTvQMgbUo)!w#`c`$Ly1i3fFBfxAt;M#O z1SuRT>+h5 z78F}o`ub}*2rww#vC^&T5{QMro=C#!?UwCbBv3+_o$BT?nE2R`0x87gu9<)e5&$Il zgbXyoW0!o}Y(g-djtz1!3wNu0a3Zsk*C&Kim=#HeuyC#W+dEr<`*AJzU7Ld>7CA}P z5tSe%H0|@_R8nJ%yw_M7q6ZBNJsDSI)C-$C%VFXW5HKCdvt_xpTrL%dRAI(I*k28~j1X9r}q$+_S5>-&IuVW&oJD4E; zgXm?7fi%8l_%c<&2)B(N_r{{4SoZn=q6<<3EFZx{0WOIj1|R@fQF!#gb|7d!Sh7O^ zypjrkl@rd=P34U2vzZ$l#ZH1NG+~%?FIel1Mq}HNc_XUqHlxJGvi8(C%q!cURa$Wae1{v&m-* zhB=h;Q$=T$pOHn=u{FQKsKeILGNg@iIeov34~2-KOK@}mJI7T%I>32T3->HfEnZkW zVoNC5!Nn>#>EY%e&v5U-k-556#eJVYLJe?9uM`ivy-&LW_w3z{eqTlwKx@;Du4*#fc}vt3SPjs%Z4N zQ|h$Mz9^NB8~eKGwmSk($GTy*f31s--tX&%*z0xLy>@r6hnEjVW4GND4<6uOS(yEX z(QkM6N%p6rzEc*Zb+InCH>!fhAy8Q~f;AeQUhmKprB6;8Ez#7w0M}b((L87v;fi@e zx|>G(xDTLq_j%iFBLkwhwt}yidlTO1BW~XPtThz9;#Wr>ohA%@h&M`CnS5w9H z^6ufkCfHQ5v@LA$k3GSWd1Zi@68SrA5gWtA+v`m+}LK^%8)6qMkT;{-WJ zgGD*oGQJco?8cPrLN94wMH?gF^ho&uXYj>MNfdq{9QG`5FA!SA+WiCLq@!2%_5NOW zWvPK70#!R97y0{tDHz*+KQw^|*V(=ZT4;MDc$4i{3KBq#v`0}O!lNVs30V1kl0ck4 zOcE$A_9kHsf>tNBAI_i1lB_avXP{Rbnvf~W?JT$My5c|%Fl^4B9L}&uq2^F z9IOMz631?q@Hk80I!KB%vmEwork>eval-when-patch.\;1 30488 |changes| |to:| (vars eval-when-patchcoms) (fns addtocom delfromcom getdefcurrent importeval infilecom)) ; Copyright (c) 1987 by Xerox Corporation. All rights reserved. (prettycomprint eval-when-patchcoms) (rpaqq eval-when-patchcoms ((fns addtocom delfromcom getdefcurrent importeval infilecom))) (defineq (addtocom (lambda (com name type near listname) (* \; "Edited 2-May-87 19:04 by Pavel") (* \;  "tries to insert NAME into the prettycom COM; returns NIL if unsuccessful") (prog (tem) (cond ((and near (not (infilecoms? near type (list com)))) (return))) (cond ((setq tem (|fetch| add |of| (car com))) (return (cond ((or (null listname) (infilecoms? listname 'filevars (list com))) (and (setq tem (apply* tem com name type near)) (markaschanged comsname 'vars)) tem))))) (return (selectq (car com) (fns (and (eq type 'fns) (addtocom1 com name near listname))) ((vars initvars) (cond ((or (eq (car com) 'vars) near listname) (* \;  "Don't stick on INITVARS unless NEAR or LISTNAME says we should.") (selectq type (expressions (cond ((eq (car name) 'setq) (addtocom1 com (cdr name) near listname)))) (vars (addtocom1 com name near listname)) nil)))) (coms (addtocoms (cond ((eq (cadr com) '*) (cond ((litatom (caddr com)) (caddr com)) (t (return)))) (t (cdr com))) name type near listname)) (declare\: (and (or listname near) (addtocoms (cond ((eq (cadr com) '*) (cond ((litatom (caddr com)) (caddr com)) (t (return)))) (t (cdr com))) name type near listname))) (cl:eval-when (and (or listname near) (addtocoms (cond ((eq (cl:third com) '*) (cond ((litatom (cl:fourth com)) (cl:fourth com)) (t (return)))) (t (cddr com))) name type near listname))) ((prop ifprop) (selectq type (props (cond ((eq (cadr com) (cadr name)) (addtocom1 (cdr com) (car name) near listname)) ((and (eq (car name) (caddr com)) (null (cdddr com))) (/rplaca (cdr com) (union (mklist (cdr name)) (mklist (cadr com)))) (markaschanged comsname 'vars) t))) (macros (cond ((and (|for| prop |inside| (cadr com) |always| (eqmemb prop macroprops)) (|for| prop |in| macroprops |always| (or (eqmemb prop (cadr com)) (not (getprop name prop))))) (* |;;| "every property in the command is a macro prop and, either this is an IFPROP or else the MACROS are changed") (addtocom1 (cdr com) name near listname)))) nil)) ((props alists) (and (eq type (car com)) (addtocom1 com (/nconc1 (or (assoc (car name) (cond ((eq (cadr com) '*) (cond ((litatom (caddr com)) (and (or (null listname) (eq (caddr com) listname)) (gettopval (caddr com)))) (t (return)))) (t (cdr com)))) (list (car name))) (cadr name)) near listname))) (p (cond ((and (eq type 'expressions) (neq (car name) 'setq)) (addtocom1 com name near listname)))) (and (eq (car com) type) (addtocom1 com name near listname))))))) (delfromcom (lambda (com name type) (* \; "Edited 2-May-87 19:02 by Pavel") (* \; "Tries to delete NAME from COM") (prog (tem var new) (cond ((setq tem (|fetch| delete |of| (car com))) (and (setq tem (apply* tem com name type)) (markaschanged comsname 'vars)) (return tem))) (return (selectq (car com) ((declare\: coms) (delfromcoms (cond ((eq (cadr com) '*) (cond ((litatom (caddr com)) (caddr com)) (t (return)))) (t (cdr com))) name type)) ((cl:eval-when) (delfromcoms (cond ((eq (cl:third com) '*) (cond ((litatom (cl:fourth com)) (cl:fourth com)) (t (return)))) (t (cddr com))) name type)) ((alists props) (and (eq type (car com)) (cond ((eq (cadr com) '*) (cond ((and (litatom (setq var (caddr com))) (setq tem (assoc (car name) (gettopval var))) (neq (cdr tem) (setq tem (removeitem (cadr name) (cdr tem))))) (saveset var tem t 'noprint) t))) ((and (cdr (setq tem (assoc (car name) (cdr com)))) (neq (cdr tem) (setq new (removeitem (cadr name) (cdr tem))))) (/rplacd tem new) (markaschanged comsname 'vars) t)))) (blocks (* |;;| "Remove function name from blocks declarations. This isn't entirely correctly, since in removing the name from the block variables, it will hit homonyms in globalvars, specvars, etc.") (and (eq type 'fns) (|for| block |in| (infilecomtail com t) |do| (and (memb name block) (/dremove name block)) (|for| x |in| block |when| (and (listp x) (memb name (cdr x))) |do| (/rplacd x (remove name (cdr x))))))) ((prop ifprop) (selectq type (props (return (cond ((eq (cadr com) (cadr name)) (delfromcom1 (cdr com) (car name))) ((and (eqmemb (cadr name) (cadr com)) (null (cdr (setq tem (prettycom1 (cdr com))))) (eq (car tem) (car name))) (/rplaca (cdr com) (remove (cadr name) (mklist (cadr com)))) (markaschanged comsname 'vars) t)))) (cond ((|for| prop |inside| (cadr com) |always| (eq type (getprop prop 'proptype))) (delfromcom1 (cdr com) name))))) ((records initrecords sysrecords) (and (eq type 'records) (delfromcom1 com name))) (p (and (eq type 'expressions) (delfromcom1 com name))) ((vars initvars) (and (eq type 'vars) (delfromcom1 com name t))) (and (eq type (car com)) (delfromcom1 com name))))))) (getdefcurrent (lambda (name type options) (* \; "Edited 2-May-87 19:00 by Pavel") (* \;  "Gets the current definition--source=0") (let (def) (cond ((and (setq def (|fetch| getdef |of| type)) (neq def t)) (* |;;| "We assign T to types whose GETDEF is normally handled in the SELECTQ below but whose MACRO is to be defaulted to the PUTDEF/GETDEF in PRETTYCOM.") (or (neq (setq def (apply* def name type options)) (|fetch| nulldef |of| type)) (getdeferr name type options)) def) (t (or (neq (setq def (selectq type (fns (and (litatom name) (exprp (setq def (virginfn name))) def)) (vars (|if| (litatom name) |then| (gettopval name) |else| 'nobind)) ((fields records) (|if| (litatom name) |then| (setq def (selectq type (records (reclook name)) (mkprogn (fieldlook name)))) (|if| (eqmemb 'edit options) |then| (copy def) |else| def))) (files (* \;  "what is the `definition' of a file? -- I guess the COMS which say what it contains") (|if| (litatom name) |then| (|if| (setq def (getfiledef name)) |then| (updatefiles) (list (listp (gettopval (filecoms def))) (|fetch| tobedumped |of| (|fetch| fileprop |of| def)) (listp (|fetch| filedates |of| def)))))) (templates (|if| (and (litatom name) (setq def (gettemplate name))) |then| (list 'settemplate (kwote name) (kwote def)))) (macros (|if| (and (litatom name) (setq def (|for| x |on| (getproplist name) |by| (cddr x) |when| (fmemb (car x) macroprops) |join| (list (car x) (cadr x))))) |then| `(putprops ,name ,@def))) (expressions (listp name)) (props (and (listp name) (and (setq def (some (getproplist (car name)) (function (lambda (x) (eq x (cadr name)))) (function cddr))) (list 'putprops (car name) (cadr name) (cadr def))))) (filepkgcoms (and (litatom name) (prog ((com (filepkgcom name)) (typ (filepkgtype name))) (return (cond ((and com typ) (list (cons 'com com) (cons 'type typ))) (com (list (cons 'com com))) (typ (list (cons 'type typ)))))))) (filevars (cond ((and (litatom name) (listp (setq def (gettopval name))) (whereis name 'filevars)) def) (t 'nobind))) (let ((coms (list (makenewcom name type))) file) (cond ((not (setq def (getdefcom coms))) (with-reader-environment *old-interlisp-read-environment* (resetlst (resetsave prettyflg) (resetsave fontchangeflg) (resetsave (output (setq file (openstream '{nodircore} 'both)))) (prettydefcoms coms) (setfileptr file 0) (setq def (|for| x |in| (readfile file) |join| (selectq (car x) ((*) nil) (declare\: (|for| y |on| (cdr x) |unless| (selectq (car y) ((copywhen eval@loadwhen eval@compilewhen) (return (list y))) (fmemb (car y) declaretagslst)) |collect| (car y))) (cl:eval-when (cddr x)) (progn (cdr x)) (list x)))) (setq nocopy t))))) (mkprogn def)))) (|fetch| nulldef |of| type)) (getdeferr name type options)) def))))) (importeval (lambda (form returnflg) (* \; "Edited 2-May-87 18:57 by Pavel") (* |;;| "Ignore DONTEVAL@LOAD'S --- If RETURNFLG is on, return list of forms") (and (listp form) (selectq (car form) (declare\: (for z in (cdr form) join (importeval z returnflg))) (cl:eval-when (for z in (cddr form) join (importeval z returnflg))) (/declaredatatype (* \;  "Ignore datatype initializations -- we only need the record declaration itself") nil) (progn (* \; "default: eval and/or return it") (and (neq returnflg t) (eval form)) (and returnflg (list form))))))) (infilecom (lambda (com) (* \; "Edited 2-May-87 19:03 by Pavel") (cond ((nlistp com) (cond ((eq type 'vars) (infilecomsval com)))) ((eq (car com) commentflg) (* |;;|  "must be special case'd first so that (* * values) doesn't make it look like `values' is a variable") (* \;  "don't know why I should bother, but someone might want to know all of the comments on a file???") (cond ((eq type commentflg) (infilecomsval com t))) nil) (t (prog ((comname (car com)) (tail (cdr com)) cfn tem) (cond ((cond ((setq cfn (|fetch| (filepkgcom contents) |of| comname)) (setq tem (apply* cfn com (cond ((and (null onfiletype) (listp name)) (* \;  "call from WHEREIS of a name which is a list") (list name)) (t name)) type onfiletype))) ((setq cfn (|fetch| (filepkgcom prettytype) |of| comname)) (* \; "for compatability") (setq tem (apply* cfn com type name)))) (cond ((nlistp tem) (cond ((eq tem t) (cond ((or (eq name t) (null onfiletype)) (retfrom 'infilecoms? t)))))) (t (infilecomsvals tem)))) ((listp tail) (* |;;| "this SELECTQ handles the `exceptional cases' for the built in types. There is an explicit RETURN in the SELECTQ clause if the default is handled") (selectq comname ((prop ifprop) (setq tail (cdr tail))) nil) (cond ((eq (car tail) '*) (cond ((litatom (cadr tail)) (selectq type ((vars filevars) (infilecomsval (cadr tail))) nil)) ((and (listp (cadr tail)) (eq onfiletype 'update) (eq type 'vars) (eq (caadr tail) 'progn) (fmemb (car (last (cadr tail))) name)) (setq val (cons (cadr tail) val)))))) (selectq comname ((coms export) (infilecoms (infilecomtail com))) (cl:eval-when (infilecoms (infilecomtail (cdr com)))) (declare\: (* \; "skip over DECLARE: tags") (return (and (not (fmemb 'compilervars com)) (ifcdeclare (infilecomtail com) (eq type 'declare\:))))) (original (* \; "dont expand macros") (prog ((origflg t)) (infilecoms (infilecomtail com)))) ((prop ifprop) (* \;  "this currently does not handle `pseudo-types' of PROPNAMES") (selectq type (props (ifcpropscan (infilecomtail (cdr com)) (cadr com))) (macros (infilecomsmacro (infilecomtail (cdr com)) (cadr com))) nil)) (props (return (ifcprops com))) (macros (return (selectq type (props (ifcpropscan (infilecomtail com) macroprops)) (macros (infilecomsvals (infilecomtail com))) nil))) (alists (* \;  "sigh. This should probably also `coerce' when asking for LISPXMACROS, etc.") (return (selectq type (alists (infilepairs (infilecomtail com))) nil))) (p (return (selectq type ((expressions p) (infilecomsvals (infilecomtail com t) t)) (cond ((null onfiletype) (* \; "for WHEREIS and FILECOMSLST") (selectq type (i.s.oprs (ifcexprtype com 'i.s.opr)) (templates (ifcexprtype com 'settemplate)) nil)))))) ((addvars appendvars) (selectq type (vars (return (and (null onfiletype) (|for| x |in| (infilecomtail com t) |do| (infilecomsval (car x) t))))) (alists (return (|for| x |in| (infilecomtail com) |when| (eqmemb 'alist (getprop (car x) 'vartype)) |do| (|for| z |in| (cdr x) |do| (infilecomsval (list (car x) (car z)) t))))) (or (eq type comname) (return)))) ((vars initvars filevars uglyvars horriblevars constants array) (return (cond ((eq type 'expressions) (|for| x |in| (infilecomtail com) |when| (listp x) |do| (infilecomsval (cons 'setq x) t))) ((or (eq type 'vars) (eq type comname))(* \;  "either want all VARS, or else want all FILEVARS and this is a FILEVARS command") (|for| x |in| (infilecomtail com) |do| (cond ((listp x) (and (car x) (infilecomsval (car x) t))) (x (infilecomsval x (eq comname 'initvars))))))))) (defs (return (|for| x |in| (infilecomtail com) |when| (eq type (car x)) |do| (infilecomsvals (cdr x))))) (files (return)) nil) (* |;;| "Exceptional cases now handled. If TYPE matches (CAR COM) then scan the tail as usual. Else expand the com's MACRO, if it has one, unless there was a CONTENTS function") (cond ((eq comname type) (infilecomsvals (infilecomtail com))) ((and (or (null cfn) (and (eq cfn t) (null onfiletype))) (null origflg) (setq tem (|fetch| (filepkgcom macro) |of| comname))) (infilecoms (subpair (car tem) (infilecomtail com) (cdr tem)))))))))))) ) (putprops eval-when-patch copyright ("Xerox Corporation" 1987)) (declare\: dontcopy (filemap (nil (475 30395 (addtocom 485 . 7020) (delfromcom 7022 . 12896) (getdefcurrent 12898 . 19529) (importeval 19531 . 20542) (infilecom 20544 . 30393))))) stop \ No newline at end of file diff --git a/lispusers/EVALOBJ b/lispusers/EVALOBJ new file mode 100644 index 00000000..a15a5c09 --- /dev/null +++ b/lispusers/EVALOBJ @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "11-May-2018 08:22:13"  {DSK}kaplan>Local>medley3.5>lispcore>lispusers>EVALOBJ.;2 15206 changes to%: (VARS EVALOBJCOMS) previous date%: " 6-May-2000 09:24:45" {DSK}kaplan>Local>medley3.5>lispcore>lispusers>EVALOBJ.;1) (* ; " Copyright (c) 1997, 1998, 1999, 2000, 2018 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT EVALOBJCOMS) (RPAQQ EVALOBJCOMS [(FILES IMOBJAPPLICATION) (DECLARE%: DOEVAL@LOAD DONTCOPY (FILES EXPORTS.ALL)) (FNS EVALOBJ.BUTTONEVENTINFN EVALOBJ.DISPLAYFN EVALOBJ.IMAGEBOXFN EVALOBJ.COPYFN EVALOBJ.CREATE EVALOBJ.GETFN EVALOBJ.PUTFN) (FNS PARAMS TEXTSTREAMPARAM) [COMS (FNS EVALOBJ.DISMANTLEFN EVALOBJ.SELTOOBJ) (P (AND (GETD 'ADDTOIMOBJAPPLICATIONMENU) (ADDTOIMOBJAPPLICATIONMENU '(Eval% form 'EVALOBJ.SELTOOBJ "Converts current selection to an evaluation object" (SUBITEMS [|Eval at Create/Load| (FUNCTION (LAMBDA (TEXTSTREAM SELECTION) (EVALOBJ.SELTOOBJ TEXTSTREAM SELECTION 'CREATE/LOAD] (|Eval at Hardcopy| (FUNCTION (LAMBDA (TEXTSTREAM SELECTION) (EVALOBJ.SELTOOBJ TEXTSTREAM SELECTION 'HARDCOPY] [INITVARS (EVALOBJ.IMAGEFNS (IMAGEFNSCREATE 'EVALOBJ.DISPLAYFN 'EVALOBJ.IMAGEBOXFN 'EVALOBJ.PUTFN 'EVALOBJ.GETFN 'EVALOBJ.COPYFN 'EVALOBJ.BUTTONEVENTINFN NIL NIL NIL NIL NIL NIL '(LAMBDA (OBJ) ""] (GLOBALVARS EVALOBJ.IMAGEFNS) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA PARAMS) (NLAML) (LAMA]) (FILESLOAD IMOBJAPPLICATION) (DECLARE%: DOEVAL@LOAD DONTCOPY (FILESLOAD EXPORTS.ALL) ) (DEFINEQ (EVALOBJ.BUTTONEVENTINFN [LAMBDA (OBJ STREAM) (* ; "Edited 19-Aug-97 14:03 by rmk:") (* jtm%: " 5-Aug-88 15:40") (* ;  "the user has pressed a button inside the eval OBJ") (CL:WHEN [MENU (CREATE MENU ITEMS _ '((|Edit evaulation form| T " Opens a window to edit the evaluation form"] (* ;;; "SEDIT always forks a process. We hang in that process until it closes (CLOSE-ON-COMPLETION)") (ALLOW.BUTTON.EVENTS) [IMAGEOBJPROP OBJ 'OBJECTDATUM (LET ((*READTABLE* FILERDTBL)) (DECLARE (SPECVARS *READTABLE*)) (EDITE (COPY (IMAGEOBJPROP OBJ 'OBJECTDATUM)) NIL 'Evaluation% Form NIL NIL '(:CLOSE-ON-COMPLETION] (IMAGEOBJPROP OBJ 'EVALUATED NIL) 'CHANGED)]) (EVALOBJ.DISPLAYFN [LAMBDA (OBJ IMAGESTREAM) (* ; "Edited 19-Aug-97 13:46 by rmk:") (* fsg "17-Sep-87 11:14") (* ;; "Display an Eval imageobject. If the stream-type is display, then shows the form. Otherwise the stream-type is hardcopy and the form is executed.") (DECLARE (SPECVARS OBJ IMAGESTREAM) (USEDFREE TEXTSTREAM)) (SELECTQ (IMAGESTREAMTYPE IMAGESTREAM) (DISPLAY (LET ((FONT (DSPFONT '(TERMINAL 10) IMAGESTREAM))) (PRIN3 "{Eval: " IMAGESTREAM) (PRIN4 (IMAGEOBJPROP OBJ 'OBJECTDATUM) IMAGESTREAM) (PRIN3 "}" IMAGESTREAM) (DSPFONT FONT IMAGESTREAM))) (CL:WHEN (EQMEMB (IMAGEOBJPROP OBJ 'WHEN) '(NIL HARDCOPY)) (LET [(FORM/FN (IMAGEOBJPROP OBJ 'OBJECTDATUM] (IF (LITATOM FORM/FN) THEN (APPLY* FORM/FN IMAGESTREAM TEXTSTREAM OBJ) ELSE (EVAL FORM/FN))))]) (EVALOBJ.IMAGEBOXFN [LAMBDA (OBJ IMAGESTREAM CURRENTX RIGHTMARGIN) (* ; "Edited 19-Aug-97 13:43 by rmk:") (* ss%: "27-Jun-87 15:50") (* ;; "Return the ImageBox for an EVALOBJ. Evaluates a CREATE/LOAD form that hasn't yet been evaluated (presumably came from the COPYFN).") (DECLARE (SPECVARS OBJ IMAGESTREAM CURRENTX RIGHTMARGIN) (USEDFREE TEXTSTREAM)) (CL:WHEN [AND (EQ (IMAGEOBJPROP OBJ 'WHEN) 'CREATE/LOAD) (NOT (IMAGEOBJPROP OBJ 'EVALUATED] (LET [(FORM/FN (IMAGEOBJPROP OBJ 'OBJECTDATUM] (IF (LITATOM FORM/FN) THEN (APPLY* FORM/FN IMAGESTREAM TEXTSTREAM OBJ) ELSE (EVAL FORM/FN)) (IMAGEOBJPROP OBJ 'EVALUATED T))) (SELECTQ (IMAGESTREAMTYPE IMAGESTREAM) (DISPLAY (LET [(FONT (FONTCREATE '(TERMINAL 10] (CREATE IMAGEBOX XSIZE _ (PLUS (STRINGWIDTH "{Eval: }" FONT) (STRINGWIDTH (IMAGEOBJPROP OBJ 'OBJECTDATUM) FONT T (FIND-READTABLE "INTERLISP"))) YSIZE _ (FONTPROP FONT 'HEIGHT) YDESC _ (FONTPROP FONT 'DESCENT) XKERN _ 0))) (CREATE IMAGEBOX XSIZE _ 0 YSIZE _ 0 YDESC _ 0 XKERN _ 0]) (EVALOBJ.COPYFN [LAMBDA (OBJ) (* ; "Edited 19-Aug-97 13:30 by rmk:") (EVALOBJ.CREATE (COPY (IMAGEOBJPROP OBJ 'OBJECTDATUM)) (IMAGEOBJPROP OBJ 'WHEN]) (EVALOBJ.CREATE [LAMBDA (FORM WHEN TEXTSTREAM) (* ; "Edited 6-May-2000 09:24 by rmk:") (DECLARE (SPECVARS TEXTSTREAM)) (* ;; "For EVAL at CREATE/LOAD. TEXTSTREAM is NIL on call from COPYFN, since the destination stream isn't known. The object is not marked as evaluated, so that the imagebox fn will do it the first time it is displayed/printed. Hopefully it won't be copied to place where it isn't initially displayed--that's the best we can do. ") (IF (AND FORM (OR (LISTP FORM) (LITATOM FORM))) THEN (LET ((OBJ (IMAGEOBJCREATE FORM EVALOBJ.IMAGEFNS))) (IMAGEOBJPROP OBJ 'DISMANTLEFN (FUNCTION EVALOBJ.DISMANTLEFN)) (IMAGEOBJPROP OBJ 'TEDIT-TO-TEX-FN (FUNCTION TRUE)) (IMAGEOBJPROP OBJ 'WHEN WHEN) (CL:WHEN (AND TEXTSTREAM (EQ WHEN 'CREATE/LOAD)) (IF (LITATOM FORM) THEN (* ;;  "NIL is image stream. It should be an error if a CREATE/LOAD form accesses an image stream!") (APPLY* FORM NIL TEXTSTREAM OBJ) ELSE (EVAL FORM)) (IMAGEOBJPROP OBJ 'EVALUATED T)) OBJ) ELSE (ERROR!]) (EVALOBJ.GETFN [LAMBDA (FILESTREAM TEXTSTREAM) (* ; "Edited 19-Aug-97 13:25 by rmk:") (LET ((DATA (HREAD FILESTREAM)) FORM WHEN) (IF (LITATOM (CAR (LISTP DATA))) THEN (SETQ FORM DATA) ELSE (SETQ FORM (CAR DATA)) (SETQ WHEN (CADR DATA))) (EVALOBJ.CREATE FORM WHEN TEXTSTREAM]) (EVALOBJ.PUTFN [LAMBDA (OBJ STREAM) (* ; "Edited 19-Aug-97 13:28 by rmk:") (* ;; "Put a description of an eval object into the file.") (HPRINT (LIST (IMAGEOBJPROP OBJ 'OBJECTDATUM) (IMAGEOBJPROP OBJ 'WHEN)) STREAM]) ) (DEFINEQ (PARAMS [NLAMBDA PARAMS (* ; "Edited 7-Nov-97 08:41 by rmk:") (DECLARE (USEDFREE TEXTSTREAM)) (* ;; "Each P is either") (* ;; " a list of the form (name value), in which case value becomes the (new) value of parameter name;") (* ;;  " a list of the form (name v1 v2 ...) in which case it is treated as (name (v1 v2 ...))") (* ;; " a list of the form (name), in which case the value for name (even NIL) is removed)") (* ;; " a litatom, in which case it is treated as a list (atom T).") (* ;; "The form (name) is different from (name NIL)--the disinction allows the client to distinguish between no value (hence use a default) and a value of NIL.") (FOR P PCELL [PROP _ (APPEND (STREAMPROP TEXTSTREAM 'PARAMETERS] IN PARAMS DO (IF (LISTP P) THEN [IF (CDDR P) THEN (SETQ P (LIST (CAR P) (CDR P] ELSEIF (LITATOM P) THEN (SETQ P (LIST P T)) ELSE (PROMPTPRINT P " is not a valid text parameter")) (SETQ PCELL (ASSOC (CAR P) PROP)) (IF (CDR P) THEN [IF PCELL THEN (RPLACA (CDR PCELL) (CADR P)) ELSE (PUSH PROP (LIST (CAR P) (CADR P] ELSEIF PCELL THEN (SETQ PROP (DREMOVE PCELL PROP))) FINALLY (STREAMPROP TEXTSTREAM 'PARAMETERS PROP) (RETURN PROP]) (TEXTSTREAMPARAM [LAMBDA (PARAMNAME DEFAULTVALUE) (DECLARE (USEDFREE TEXTSTREAM)) (* ; "Edited 3-Aug-98 13:48 by rmk:") (* ;; "Returns the value of the parameter PARAMNAME on a higher-bound TEXTSTREAM, or DEFAULTVALUE if the parameter is not set.") (IF (AND (BOUNDP 'TEXTSTREAM) (STREAMP TEXTSTREAM)) THEN (LET [(PCELL (ASSOC PARAMNAME (STREAMPROP TEXTSTREAM 'PARAMETERS] (IF PCELL THEN (CADR PCELL) ELSE DEFAULTVALUE)) ELSE DEFAULTVALUE]) ) (DEFINEQ (EVALOBJ.DISMANTLEFN [LAMBDA (TEXTSTREAM OBJ CHAR#) (* ; "Edited 27-Jan-97 18:03 by rmk:") (SETFILEPTR TEXTSTREAM (SUB1 CHAR#)) (RESETLST (RESETSAVE %#RPARS) (PRINTOUT TEXTSTREAM 2 .PPV (IMAGEOBJPROP OBJ 'OBJECTDATUM)))]) (EVALOBJ.SELTOOBJ [LAMBDA (TEXTSTREAM SELECTION WHEN) (* ; "Edited 19-Aug-97 13:23 by rmk:") (IF (COLLECTIMOBJSINSEL TEXTSTREAM SELECTION) THEN (TEDIT.PROMPTPRINT TEXTSTREAM "Evaluation form can't contain image object" T) ELSE (* ; "Pack on ]]] to avoid eof errors") (LET ((OBJ (EVALOBJ.CREATE (READ (OPENSTRINGSTREAM (CONCAT (TEDIT.SEL.AS.STRING TEXTSTREAM SELECTION) "]]]]]")) (FIND-READTABLE "INTERLISP")) WHEN TEXTSTREAM))) (REPLACESELWITHOBJ OBJ TEXTSTREAM SELECTION]) ) [AND (GETD 'ADDTOIMOBJAPPLICATIONMENU) (ADDTOIMOBJAPPLICATIONMENU '(Eval% form 'EVALOBJ.SELTOOBJ "Converts current selection to an evaluation object" (SUBITEMS [|Eval at Create/Load| (FUNCTION (LAMBDA ( TEXTSTREAM SELECTION ) (  EVALOBJ.SELTOOBJ TEXTSTREAM SELECTION 'CREATE/LOAD] (|Eval at Hardcopy| (FUNCTION (LAMBDA (TEXTSTREAM SELECTION) (EVALOBJ.SELTOOBJ TEXTSTREAM SELECTION 'HARDCOPY] (RPAQ? EVALOBJ.IMAGEFNS [IMAGEFNSCREATE 'EVALOBJ.DISPLAYFN 'EVALOBJ.IMAGEBOXFN 'EVALOBJ.PUTFN 'EVALOBJ.GETFN 'EVALOBJ.COPYFN 'EVALOBJ.BUTTONEVENTINFN NIL NIL NIL NIL NIL NIL '(LAMBDA (OBJ) ""]) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS EVALOBJ.IMAGEFNS) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA PARAMS) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (PUTPROPS EVALOBJ COPYRIGHT ("Xerox Corporation" 1997 1998 1999 2000 2018)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3038 9319 (EVALOBJ.BUTTONEVENTINFN 3048 . 4241) (EVALOBJ.DISPLAYFN 4243 . 5418) ( EVALOBJ.IMAGEBOXFN 5420 . 6963) (EVALOBJ.COPYFN 6965 . 7188) (EVALOBJ.CREATE 7190 . 8606) ( EVALOBJ.GETFN 8608 . 9009) (EVALOBJ.PUTFN 9011 . 9317)) (9320 11885 (PARAMS 9330 . 11261) ( TEXTSTREAMPARAM 11263 . 11883)) (11886 13031 (EVALOBJ.DISMANTLEFN 11896 . 12179) (EVALOBJ.SELTOOBJ 12181 . 13029))))) STOP \ No newline at end of file diff --git a/lispusers/EXAMPLES.LGC b/lispusers/EXAMPLES.LGC new file mode 100644 index 00000000..8219d452 --- /dev/null +++ b/lispusers/EXAMPLES.LGC @@ -0,0 +1 @@ +EXAMPLES 3 NOTMEMBER (SA LAMBDA (X Y) (NOT (MEMBER X Y))) SA-MEMBER (SA LAMBDA (X Y) (MEMBER X Y)) PRINT-INFO (SA LAMBDA (FROM TO) (PROGN (FORMAT T "Current room is ~A, enter now room ~A~%%" FROM TO) T)) 9 SEARCH (((SEARCH ?FROM ?TO) :- (LOGIC-ASSERT GOAL (((GOAL ?TO))) EXAMPLES) (EXPLORE ?FROM ?TO (?FROM)) (GOAL ?TO))) GOAL (((GOAL G))) PHONE (((PHONE G))) NOT (((NOT ?X) :- (WFF ?X) ! (FAIL)) ((NOT ?X))) LOGIC-MEMBER (((LOGIC-MEMBER ?A (?A . ?B)) :- !) ((LOGIC-MEMBER ?A (?B . ?C)) :- (LOGIC-MEMBER ?A ?C))) DOOR (((DOOR A B)) ((DOOR A N)) ((DOOR B M)) ((DOOR B C)) ((DOOR M I)) ((DOOR C D)) ((DOOR D E)) ((DOOR E F)) ((DOOR F H)) ((DOOR H L)) ((DOOR L G))) APPEND (((APPEND NIL ?Q ?Q)) ((APPEND (?A . ?B) ?C (?A . ?D)) :- (APPEND ?B ?C ?D))) IS-THERE-DOOR (((IS-THERE-DOOR ?A ?B) :- (DOOR ?A ?B)) ((IS-THERE-DOOR ?A ?B) :- (DOOR ?B ?A))) EXPLORE (((EXPLORE ?X ?X ?START-LIST)) ((EXPLORE ?X ?Y ?START-LIST) :- (IS-THERE-DOOR ?X ?Z) (NOTMEMBER ?Z ?START-LIST) (PRINT-INFO ?X ?Z) (EXPLORE ?Z ?Y (?Z . ?START-LIST)))) \ No newline at end of file diff --git a/lispusers/EYECON b/lispusers/EYECON new file mode 100644 index 00000000..2c144bc2 --- /dev/null +++ b/lispusers/EYECON @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) (FILECREATED "24-Oct-88 21:40:18" {ERIS}LISP>EYECON.\;18 21796 |changes| |to:| (VARS EYECONCOMS EYECON.CONTROL.POINTS) (FNS EYECON.TRACK EYECON.FIND.POINT) |previous| |date:| "24-Oct-88 21:32:12" {ERIS}LISP>EYECON.\;17) ; Copyright (c) 1988 by ENVOS Corporation. All rights reserved. (PRETTYCOMPRINT EYECONCOMS) (RPAQQ EYECONCOMS ((CONSTANTS EYECON.PUPIL.SIZE EYECON.LEFT.CENTER EYECON.RIGHT.CENTER EYECON.HEIGHT.OFFSET EYECON.RIGHT.WINK EYECON.WINK.WIDTH) (VARS EYECON.PUPIL EYECON.MASK EYECON.OPEN EYECON.CLOSED EYECON.ICON EYECON.ICON.MASK EYECON.LEFT EYECON.BOTTOM) (FNS EYECON EYECON.DIE EYECON.DRAW.PUPIL EYECON.FIND.POINT EYECON.ICON EYECON.OPEN EYECON.TRACK EYECON.WINK) (* |;;| "Check screen size and compute appropriate scale factor") (* |;;| "All computations are scaled to keep them in smallp range") (VARS EYECON.SCALE.FACTOR EYECON.CONTROL.POINTS) (P (BIND (MINSF _ 256) (RANGE _ (MAX SCREENHEIGHT SCREENWIDTH)) FIRST (SETQ EYECON.SCALE.FACTOR 0) WHILE (ILESSP MINSF RANGE) DO (ADD EYECON.SCALE.FACTOR 1) (SETQ MINSF (LLSH MINSF 1))) (SETQ EYECON.SLOPE.LIST (FOR P IN (CDR EYECON.CONTROL.POINTS) COLLECT (IQUOTIENT (LSH (CDR P) 8) (CAR P)))) (PUSH EYECON.SLOPE.LIST (IPLUS (CAR EYECON.SLOPE.LIST) 1))))) (DECLARE\: EVAL@COMPILE (RPAQQ EYECON.PUPIL.SIZE 10) (RPAQQ EYECON.LEFT.CENTER 37) (RPAQQ EYECON.RIGHT.CENTER 97) (RPAQQ EYECON.HEIGHT.OFFSET 12) (RPAQQ EYECON.RIGHT.WINK 82) (RPAQQ EYECON.WINK.WIDTH 50) (CONSTANTS EYECON.PUPIL.SIZE EYECON.LEFT.CENTER EYECON.RIGHT.CENTER EYECON.HEIGHT.OFFSET EYECON.RIGHT.WINK EYECON.WINK.WIDTH) ) (RPAQQ EYECON.PUPIL #*(10 10)AN@@CO@@GOH@OOL@OCL@OCL@OOL@GOH@CO@@AN@@) (RPAQQ EYECON.MASK #*(133 45)OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOON@@AOOOOOOOOOOON@@AOOOOOOOH@@OOOOOOO@@@@OOOOOOOOOOOL@@@COOOOOOH@@OOOOOON@@@@GOOOOOOOOOOH@@@AOOOOOOH@@OOOOOOH@@@@COOOOOOOOOO@@@@@GOOOOOH@@OOOOOOH@@@@COOOOOOOOOO@@@@@GOOOOOH@@OOOOOO@@@@@AOOOOOOOOON@@@@@COOOOOH@@OOOOOO@@@@@@OOOOOOOOOL@@@@@COOOOOH@@OOOOON@@@@@@OOOOOOOOOL@@@@@AOOOOOH@@OOOOOO@@@@@@OOOOOOOOOL@@@@@COOOOOH@@OOOOOOH@@@@@OOOOOOOOOL@@@@@GOOOOOH@@OOOOOOL@@@@@OOOOOOOOOL@@@@@OOOOOOH@@OOOOOON@@@@AOOOOOOOOON@@@@AOOOOOOH@@OOOOOOO@@@@COOOOOOOOOO@@@@COOOOOOH@@OOOOOOOH@@@OOOOOOOOOOOL@@@GOOOOOOH@@OOOOOOOO@@OOOOOOOOOOOOOL@COOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOH@@ ) (RPAQQ EYECON.OPEN #*(133 45)E@@@@EOONJI@@@BC@CA@@@BEEOONH@@@BH@@HD@@AAGOOD@@EAD@C@@JBH@@KOOJB@@@H@@@B@HAEGFOOOMA@@@JAAD@@BBOOOMKJJ@DA@@@D@@@DJOGMONDAADE@BHJB@IONOKMDH@@@H@@I@AEGNIDKKOBJ@MJ@AFLAECOGDJEOJJ@B@@@HA@JMJJKEGODA@@DKDH@B@KOJKEEFMDB@@@@JLEOOM@DEKGOLJA@@@BADOOKFHHBOONHM@@@EBAGOHJAEEOOM@@DEHH@BOONJJADGOJABH@@JIGOH@@@@BEGOME@HDBJOOJI@@@@@GOJE@@@DJEOKD@@@AEKON@@DH@AOOFJ@@@@KGNIDH@@KJOH@@D@B@@DOFJJBAEEKLH@A@@H@@GMG@@@NKGJH@@@HABBON@KDKDAOMAB@D@@@EGKEH@@KGOD@@@@B@@ACML@C@@NOB@@A@@@@@KOK@@@NMFJD@@@@DA@KNIEJFJEODB@H@@@@IEJMH@@KGI@@@@@@ADBEEHB@A@FJI@J@@@@@@BGK@@@NOJD@@@BBB@HBOJI@BEGM@DAAA@@@@IGMH@@MJJH@@@DMKOEM@E@A@BHBNKOFLH@@@EEFH@@NOJB@@DICGDJEEAJHEFBJIDKKBDH@AAGMH@@IFDHBBAGOMOGMB@H@@DABOKNOOJAA@DIJ@@@KFJHH@BKOOFMDDEFAAJHHJMKOOE@@DEEK@@@EE@@@BOJJDHIJIII@BFFEFDDIEGM@@@BJH@@DJFJ@DJNMMECFJDEJFHIEKBJNMMDHAEIDH@@JJH@BAGAOOD@@EJ@@@AFH@@KONCJA@@EE@@@EDJJ@EJMGOBJJJDDLLHIEEECOJMFHAEDJH@@BA@DJIOOOOOI@A@B@A@B@BGOOOONEDHBA@@@EDJIABKOOOOBBKJBAAAGEACOOOOEBBEDJH@@H@EGGONN@@EOHD@@HD@@HGNH@AMOOKJH@@@@JDAMEOO@@@BMDABD@@IB@JM@@@CONJN@I@@@I@EGOON@@@@CAB@JDIDABC@@@@AOOOJHB@@@BDAMOOH@@@@CJ@HDC@HDAG@@@@@GONN@I@@@D@EGOOH@@@@BMDA@DHB@JM@@@@@GOOJH@H@@B@AOOO@@@@@AMDBDJDI@JN@@@@@COON@A@@@HHBBEO@@@@@@GA@DHDHBCH@@@@@CNIA@D@@@H@DJON@@@@@@ODE@C@BHKL@@@@@AOMDH@@@@B@@@@C@@@@@@@H@@@@@@D@@@@@@C@@@@A@@@H@ABEOH@@@@@J@DIABDHAD@@@@@GNIB@@@@@BD@@@@H@@@@@@D@C@C@@H@@@@@@D@@@@I@@@H@@AAFJ@@@@ABAF@@@AJAB@@@@AEJB@@@@@@B@D@@BI@@@@B@@IADJBD@A@@@@BE@@@HA@@@HH@@H@D@@@DHHHB@@@A@DDDH@@@H@D@@D@@@H@H@@E@E@@@@@A@JAADB@@@@@BHBH@@D@@@@E@@@@@B@EAAB@@EA@BBH@ABBBHA@@@@@BH@@HD@@@DH@@@@@H@@DDHH@@D@@@@@DH@@@H@@@B@@@@@@J@DD@@@H@@@@D@@@HHAD@@@@@A@@@D@@@@@@@D@@DAABBDIABB@H@@H@@@@@@@H@@ ) (RPAQQ EYECON.CLOSED #*(133 45)E@@@@EOONJI@@@@@@@@@@@BEEOONH@@@BH@@HD@@AAGOOD@@EA@@@@@DFH@@KOOJB@@@H@@@B@HAEGFOOOMA@@@@@@@@@BBOOOMKJJ@DA@@@D@@@DJOGMONDAA@@@@@DF@IONOKMDH@@@H@@I@AEGNIDKKOBJ@@@@@@@AECOGDJEOJJ@B@@@HA@JMJJKEGODA@@@@@@@F@KOJKEEFMDB@@@@JLDOOM@DEKGOLJ@@@@@BHOOKFHHBOOLHM@@@EBAOOHJAEEOOM@@@@@@@FOONJJADGONABH@@JIGOH@@@@BEGOM@@@@@EOOJI@@@@@GOJE@@@DJEOKD@@@AEKON@@@@@COOFJ@@@@KGNIDH@@KJOH@@D@B@@DOF@@@@@CGLH@A@@H@@GMG@@@NKGJH@@@HABBON@@@@@COMAB@D@@@EGKEH@@KGOD@@@@B@@ACM@@@@@EOB@@A@@@@@KOK@@@NMFJD@@@@DA@KN@@@@@CODB@H@@@@IEJMH@@KGI@@@@@@ADBEE@@@@@EFI@J@@@@@@BGK@@@NOJD@@@BBB@HBO@@@@@GI@DAAA@@@@IGMH@@MJJH@@@DMKOEM@@@@@@@FNKOFLH@@@EEFH@@NOJB@@DICGDJEE@@@@@EFIDKKBDH@AAGMH@@IFDHBBAGOMOGMB@@@@@BFOKNOOJAA@DIJ@@@KFJHH@BOOOFMDD@@@@@A@JMKOOM@@DEEK@@@EE@@@BGNJDHIJI@@@@@DIFDDIEOI@@@BJH@@DJFJ@DNNNBCCFJ@@@@@BIKCAAMMLHAEIDH@@JJH@BAOI@@@@@E@@@@@E@@@@@BGNA@@EE@@@EDJJ@IF@HJHHJJ@@@@@BIDDEDDAJDAEDJH@@BA@@JKHJ@CBA@A@@@@@D@BAC@ADGED@BA@@@EDHBAEBAG@DJBK@@@@@FIADHCJABJA@DJH@@H@E@FLIDH@@DHD@@@@@A@DH@@DJDMHBH@@@@JD@ICD@IBBM@DA@@@@@D@HBMABD@KBD@I@@@I@EBMAE@@H@BIB@@@@@BFE@@D@BJBMBHB@@@BDJMDJ@JBBB@B@@@@@@@A@AAAADADJMDI@@@D@BJO@H@@@@BHD@@@@@A@E@@@@@DCME@@H@@B@AGNL@HHHHHAD@@@@@AF@DDDDD@MOJ@A@@@HH@JOK@@@@@B@A@@@@@D@A@@@@@CGMD@D@@@H@EEONBBBBB@MD@@@@@AFLAAAAAAONJH@@@@BDDFBOL@D@HB@D@@@@@A@A@D@H@OMAHHI@@@H@@@MGJHIDA@JJ@@@@@BIDB@JDEGJL@@@@@@BD@@@GOBBBDACD@@@@@AGB@IAACOH@@@I@@@H@@DAENIEEABNM@@@@@EIMBBJJENJ@H@@@@@B@D@DCONLJDDOD@@@@@AGLHIDMOO@H@HA@@@HH@@@AONMKCKHH@@@@@@HGGCFMON@@@@D@@@H@H@A@GOGGONN@@@@@@@AMOOKKOHB@@D@@@@E@@@@ECOMMMMI@@@@@@@FFNNNOOBH@@@BH@@HD@@@B@OOMOFB@@@@@@@AAKNOOLA@@@@H@@@B@@@@H@BKKNJH@@@@@@@@EEOGE@@D@@@A@@@D@@@@@HCDKEDAA@@@@@DF@JKDK@D@@@@@H@@ ) (RPAQQ EYECON.ICON #*(30 18)@@COO@@@@COOOO@@@ON@AOL@AN@GHAN@CHAON@G@G@COO@CHN@COO@ALL@GLOH@LL@GHGH@LL@GHGH@LL@GLOH@LN@COO@ALG@COO@CHCHAON@G@AN@GHAN@@ON@AOL@@COOOO@@@@COO@@@ ) (RPAQQ EYECON.ICON.MASK #*(30 18)@@COO@@@@COOOO@@@OOOOOL@AOOOOON@COOOOOO@GOOOOOOHOOOOOOOLOOOOOOOLOOOOOOOLOOOOOOOLOOOOOOOLOOOOOOOLGOOOOOOHCOOOOOO@AOOOOON@@OOOOOL@@COOOO@@@@COO@@@ ) (RPAQQ EYECON.LEFT 200) (RPAQQ EYECON.BOTTOM 200) (DEFINEQ (EYECON (LAMBDA (EW) (* \; "Edited 8-Oct-88 23:02 by jrb:") (BITBLT EYECON.OPEN NIL NIL EW) (EYECON.DRAW.PUPIL EYECON.PUPIL EW EYECON.LEFT.CENTER EYECON.HEIGHT.OFFSET) (EYECON.DRAW.PUPIL EYECON.PUPIL EW EYECON.RIGHT.CENTER EYECON.HEIGHT.OFFSET) (WINDOWPROP EW 'PROCESS (ADD.PROCESS `(EYECON.TRACK ',EW))))) (EYECON.DIE (LAMBDA (EW) (* \; "Edited 2-Oct-88 20:00 by jrb:") (DEL.PROCESS (WINDOWPROP EW 'PROCESS)))) (EYECON.DRAW.PUPIL (LAMBDA (PM WINDOW DX DY MASK?) (* \; "Edited 9-Oct-88 16:22 by jrb:") (* |;;| "Draw the pupil") (LET* ((EYECON.PUPIL.OFFSET (IQUOTIENT EYECON.PUPIL.SIZE 2)) (BDX (IDIFFERENCE DX EYECON.PUPIL.OFFSET)) (BDY (IDIFFERENCE DY EYECON.PUPIL.OFFSET))) (|if| MASK? |then| (BITBLT EYECON.PUPIL NIL NIL PM) (BITBLT EYECON.MASK BDX BDY PM 0 0 EYECON.PUPIL.SIZE EYECON.PUPIL.SIZE 'INPUT 'ERASE) (BITBLT PM NIL NIL WINDOW BDX BDY NIL NIL 'INPUT 'PAINT) |else| (BITBLT PM NIL NIL WINDOW BDX BDY NIL NIL 'INPUT 'INVERT))))) (EYECON.FIND.POINT (LAMBDA (DX DY) (* \; "Edited 24-Oct-88 21:13 by jrb:") (SETQ DX (IABS DX)) (SETQ DY (IABS DY)) (* \; "Edited 24-Oct-88 20:34 by jrb:") (LET ((SLOPE (IF (EQ DX 0) THEN (CAR EYECON.SLOPE.LIST) ELSE (IQUOTIENT (LSH DY 8) DX)))) (FOR S IN EYECON.SLOPE.LIST AS P IN EYECON.CONTROL.POINTS WHEN (ILEQ S SLOPE) DO (RETURN P))))) (EYECON.ICON (LAMBDA (EW OLDICON) (* \; "Edited 8-Oct-88 21:37 by jrb:") (LET ((EP (WINDOWPROP EW 'PROCESS))) (IF EP THEN (DEL.PROCESS EP) (WINDOWPROP EW 'PROCESS NIL)) (OR OLDICON (ICONW EYECON.ICON EYECON.ICON.MASK))))) (EYECON.OPEN (LAMBDA (LEFT BOTTOM) (* \; "Edited 8-Oct-88 23:01 by jrb:") (LET ((EW (CREATEW (|create| REGION WIDTH _ (BITMAPWIDTH EYECON.OPEN) HEIGHT _ (BITMAPHEIGHT EYECON.OPEN) LEFT _ (OR LEFT EYECON.LEFT) BOTTOM _ (OR BOTTOM EYECON.BOTTOM)) NIL 4))) (OPENW EW) (WINDOWPROP EW 'CLOSEFN 'EYECON.DIE) (WINDOWPROP EW 'RESHAPEFN 'DON\'T) (WINDOWPROP EW 'ICONFN 'EYECON.ICON) (WINDOWPROP EW 'EXPANDFN 'EYECON) (EYECON EW)))) (EYECON.TRACK (LAMBDA (EW) (* \; "Edited 24-Oct-88 21:02 by jrb:") (* |;;| "Bind lots of variables") (LET (EWR (ELX 0) (ERX 0) (EY 0) OLDLX OLDLY OLDLB (LEFTLID T) (RIGHTLID T) (ELPX 0) (ERPX 0) (ELPY 0) (ERPY 0) (ELPMASK (BITMAPCOPY EYECON.PUPIL)) (ERPMASK (BITMAPCOPY EYECON.PUPIL)) (OLPX 0) (ORPX 0) (OLPY 0) (ORPY 0) ELDX ERDX EDY CP) (WHILE T DO (BLOCK) (* |;;| "Refresh our knowledge of where the window is if it's been moved (relying on the hack that the region windowprop gets changed when windows get moved)") (IF (NOT (EQ EWR (WINDOWPROP EW 'REGION))) THEN (SETQ EWR (WINDOWPROP EW 'REGION)) (SETQ ERX (SETQ ELX (FETCH (REGION LEFT) OF EWR))) (SETQ EY (IPLUS (FETCH (REGION BOTTOM) OF EWR) EYECON.HEIGHT.OFFSET)) (ADD ELX EYECON.LEFT.CENTER) (ADD ERX EYECON.RIGHT.CENTER) (* |;;|  "Clobber OLDLX so we'll fix the pupils for sure after moving the window") (SETQ OLDLX NIL)) (* |;;| "See if mouse has changed and mung eyes") (IF (OR (NOT (EQ OLDLX LASTMOUSEX)) (NOT (EQ OLDLY LASTMOUSEY)) (NOT (EQ OLDLB LASTMOUSEBUTTONS))) THEN (SETQ OLDLX LASTMOUSEX) (SETQ OLDLY LASTMOUSEY) (SETQ OLDLB LASTMOUSEBUTTONS) (* |;;|  "first check the button state, as we can skip some stuff if eyes are closed") (|if| (NOT (EQ 0 (LOGAND 1 OLDLB))) |then| (* \; "Both are closed") (|if| LEFTLID |then| (* \; "Closing left now") (EYECON.WINK EYECON.CLOSED 0 EW) (SETQ LEFTLID NIL)) (|if| RIGHTLID |then| (* \; "Closing right now") (EYECON.WINK EYECON.CLOSED EYECON.RIGHT.WINK EW) (SETQ RIGHTLID NIL)) |else| (|if| (EQ 0 (LOGAND 4 OLDLB)) |then| (* \; "Left is open") (|if| (NOT LEFTLID) |then| (* \; "Opening it now") (EYECON.WINK EYECON.OPEN 0 EW) (SETQ LEFTLID 'NOW)) |else| (|if| LEFTLID |then| (* \; "Closing left now") (EYECON.WINK EYECON.CLOSED 0 EW) (SETQ LEFTLID NIL))) (|if| (EQ 0 (LOGAND 2 OLDLB)) |then| (* \; "Right is open") (|if| (NOT RIGHTLID) |then| (* \; "Opening it now") (EYECON.WINK EYECON.OPEN EYECON.RIGHT.WINK EW) (SETQ RIGHTLID 'NOW)) |else| (|if| RIGHTLID |then| (* \; "Closing right now") (EYECON.WINK EYECON.CLOSED EYECON.RIGHT.WINK EW) (SETQ RIGHTLID NIL)))) (SETQ ELDX (IDIFFERENCE OLDLX ELX)) (SETQ ERDX (IDIFFERENCE OLDLX ERX)) (SETQ EDY (IDIFFERENCE OLDLY EY)) (* |;;| "See if we need to scale and do so") (IF (OR (IGREATERP (IABS OLDLX) 255) (IGREATERP (IABS OLDLY) 255)) THEN (SETQ ELDX (RSH ELDX EYECON.SCALE.FACTOR)) (SETQ ERDX (RSH ERDX EYECON.SCALE.FACTOR)) (SETQ EDY (RSH EDY EYECON.SCALE.FACTOR))) (* |;;| "find out where on the magic circle the pupils need to land") (|if| LEFTLID |then| (SETQ CP (EYECON.FIND.POINT ELDX EDY)) (IF (ILESSP ELDX 0) THEN (SETQ ELPX (IMINUS (CAR CP))) ELSE (SETQ ELPX (CAR CP))) (IF (ILESSP EDY 0) THEN (SETQ ELPY (IMINUS (CDR CP))) ELSE (SETQ ELPY (CDR CP))) (IF (OR (EQ LEFTLID 'NOW) (NOT (EQ ELPX OLPX)) (NOT (EQ ELPY OLPY))) THEN (|if| (EQ LEFTLID 'NOW) |then| (SETQ LEFTLID T) |else| (EYECON.DRAW.PUPIL ELPMASK EW (IPLUS EYECON.LEFT.CENTER OLPX ) (IPLUS EYECON.HEIGHT.OFFSET OLPY))) (SETQ OLPX ELPX) (SETQ OLPY ELPY) (EYECON.DRAW.PUPIL ELPMASK EW (IPLUS EYECON.LEFT.CENTER ELPX) (IPLUS EYECON.HEIGHT.OFFSET ELPY) T))) (|if| RIGHTLID |then| (SETQ CP (EYECON.FIND.POINT ERDX EDY)) (IF (ILESSP ERDX 0) THEN (SETQ ERPX (IMINUS (CAR CP))) ELSE (SETQ ERPX (CAR CP))) (IF (ILESSP EDY 0) THEN (SETQ ERPY (IMINUS (CDR CP))) ELSE (SETQ ERPY (CDR CP))) (IF (OR (EQ RIGHTLID 'NOW) (NOT (EQ ORPX ERPX)) (NOT (EQ ORPY ERPY))) THEN (|if| (EQ RIGHTLID 'NOW) |then| (SETQ RIGHTLID T) |else| (EYECON.DRAW.PUPIL ERPMASK EW (IPLUS EYECON.RIGHT.CENTER ORPX) (IPLUS EYECON.HEIGHT.OFFSET ORPY))) (SETQ ORPX ERPX) (SETQ ORPY ERPY) (EYECON.DRAW.PUPIL ERPMASK EW (IPLUS EYECON.RIGHT.CENTER ERPX) (IPLUS EYECON.HEIGHT.OFFSET ERPY) T)))))))) (EYECON.WINK (LAMBDA (SOURCE LEFT WINDOW) (* \; "Edited 8-Oct-88 23:23 by jrb:") (BITBLT SOURCE LEFT 0 WINDOW LEFT 0 EYECON.WINK.WIDTH (BITMAPHEIGHT EYECON.OPEN)))) ) (* |;;| "Check screen size and compute appropriate scale factor") (* |;;| "All computations are scaled to keep them in smallp range") (RPAQQ EYECON.SCALE.FACTOR 3) (RPAQQ EYECON.CONTROL.POINTS ((0 . 4) (1 . 4) (2 . 4) (3 . 4) (4 . 3) (5 . 3) (6 . 2) (7 . 1) (7 . 0))) (BIND (MINSF _ 256) (RANGE _ (MAX SCREENHEIGHT SCREENWIDTH)) FIRST (SETQ EYECON.SCALE.FACTOR 0) WHILE (ILESSP MINSF RANGE) DO (ADD EYECON.SCALE.FACTOR 1) (SETQ MINSF (LLSH MINSF 1))) (SETQ EYECON.SLOPE.LIST (FOR P IN (CDR EYECON.CONTROL.POINTS) COLLECT (IQUOTIENT (LSH (CDR P) 8) (CAR P)))) (PUSH EYECON.SLOPE.LIST (IPLUS (CAR EYECON.SLOPE.LIST) 1)) (PUTPROPS EYECON COPYRIGHT ("ENVOS Corporation" 1988)) (DECLARE\: DONTCOPY (FILEMAP (NIL (7709 20550 (EYECON 7719 . 8110) (EYECON.DIE 8112 . 8277) (EYECON.DRAW.PUPIL 8279 . 9022 ) (EYECON.FIND.POINT 9024 . 9602) (EYECON.ICON 9604 . 9936) (EYECON.OPEN 9938 . 10615) (EYECON.TRACK 10617 . 20337) (EYECON.WINK 20339 . 20548))))) STOP \ No newline at end of file diff --git a/lispusers/EquationEditorPrgmersGuide.TEDIT b/lispusers/EquationEditorPrgmersGuide.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..837abf110c2e2eae3456d677c13e0ff51b6de0e6 GIT binary patch literal 30564 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 literal 0 HcmV?d00001 diff --git a/lispusers/ExtendedVmem-Lisp.run b/lispusers/ExtendedVmem-Lisp.run new file mode 100644 index 0000000000000000000000000000000000000000..62029f1855f617d753b45a94740600e7878eb21b GIT binary patch literal 90266 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 literal 0 HcmV?d00001 diff --git a/lispusers/FASTEDITBM b/lispusers/FASTEDITBM new file mode 100644 index 00000000..3724e793 --- /dev/null +++ b/lispusers/FASTEDITBM @@ -0,0 +1 @@ +(FILECREATED "16-Nov-87 17:15:41" {ERINYES}KOTO>FASTEDITBM.;3 68144 changes to: (FNS EXPANDBITMAP) (VARS FASTEDITBMCOMS) previous date: " 4-Sep-87 15:58:23" {ERINYES}KOTO>FASTEDITBM.;2) (* Copyright (c) 1987 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT FASTEDITBMCOMS) (RPAQQ FASTEDITBMCOMS ((DECLARE: DONTCOPY (MACROS UPDATE/BM/DISPLAY)) (P (SETQ EDITBMMENU NIL)) (FNS GRID) (FNS EDITBM EDITBMCLOSEFN TILEAREA EDITBMBUTTONFN EDITBMSCROLLFN \EDITBM/PUTUP/DISPLAY EDITBMRESHAPEFN EDITBMREPAINTFN.NEW EDITBMREPAINTFN RESETGRID.NEW) (FNS SCALEBM BLTPATTERN BLTPATTERN.REPLACEDISPLAY) (FNS EXPANDBITMAP EXPANDBM))) (DECLARE: DONTCOPY (DECLARE: EVAL@COMPILE [PUTPROPS UPDATE/BM/DISPLAY MACRO ((BM W) (BITBLT BM (WINDOWPROP W (QUOTE DXOFFSET)) (WINDOWPROP W (QUOTE DYOFFSET)) W 0 (WINDOWPROP W (QUOTE BMDISPLAYBOTTOM)) (WINDOWPROP W (QUOTE BMDISPLAYWIDTH)) 1000 NIL (QUOTE REPLACE] ) ) (SETQ EDITBMMENU NIL) (DEFINEQ (GRID [LAMBDA (GRIDSPEC WIDTH HEIGHT BORDER DS GRIDSHADE) (* N.H.Briggs " 4-Sep-87 15:39") (* ; "draws a grid") (PROG ((X0 (fetch (REGION LEFT) of GRIDSPEC)) (Y0 (fetch (REGION BOTTOM) of GRIDSPEC)) (SQWIDTH (fetch (REGION WIDTH) of GRIDSPEC)) (SQHEIGHT (fetch (REGION HEIGHT) of GRIDSPEC)) (GRIDSHADE (COND ((TEXTUREP GRIDSHADE)) (T BLACKSHADE))) LINELENGTH TWICEBORDER MAXIMUMCOLOR TOTALHEIGHT GRIDBM TEMPBM) (SETQ TOTALHEIGHT (ITIMES HEIGHT SQHEIGHT)) (COND ((OR (ZEROP BORDER) (NULL BORDER)) (* ; "don't draw anything.") (RETURN)) [(NUMBERP BORDER) (SETQ TWICEBORDER (ITIMES BORDER 2)) (PROGN (* ;;   "draw vertical lines use BITBLT so that we don't have to correct for the width of the line since line drawing will put the coordinate in the middle." ) (BLTSHADE GRIDSHADE DS X0 Y0 BORDER TOTALHEIGHT (QUOTE REPLACE)) (for X from (IDIFFERENCE (IPLUS X0 SQWIDTH) BORDER) to (IDIFFERENCE (IPLUS X0 (ITIMES (SUB1 WIDTH) SQWIDTH)) BORDER) by SQWIDTH do (BLTSHADE GRIDSHADE DS X Y0 TWICEBORDER TOTALHEIGHT (QUOTE REPLACE))) (BLTSHADE GRIDSHADE DS (IDIFFERENCE (IPLUS X0 (ITIMES WIDTH SQWIDTH)) BORDER) Y0 BORDER TOTALHEIGHT (QUOTE REPLACE))) (PROGN (* ; "draw horizontal lines") (BLTSHADE GRIDSHADE DS X0 Y0 (SETQ LINELENGTH (ITIMES WIDTH SQWIDTH)) BORDER (QUOTE REPLACE)) (for Y from (IDIFFERENCE (IPLUS Y0 SQHEIGHT) BORDER) to (IDIFFERENCE (IPLUS Y0 (ITIMES (SUB1 HEIGHT) SQHEIGHT)) BORDER) by SQHEIGHT do (BLTSHADE GRIDSHADE DS X0 Y LINELENGTH TWICEBORDER (QUOTE REPLACE))) (BLTSHADE GRIDSHADE DS X0 (IDIFFERENCE (IPLUS Y0 TOTALHEIGHT) BORDER) LINELENGTH BORDER (QUOTE REPLACE] [(EQ BORDER (QUOTE POINT)) (* ; "put a point in the lower left corner of each box") (if (WINDOWP DS) then (SETQ TEMPBM (WINDOWPROP DS (QUOTE TEMPBM))) (SETQ GRIDBM (WINDOWPROP DS (QUOTE GRIDBM))) (if (NOT GRIDBM) then (SETQ GRIDBM (BITMAPCREATE SQWIDTH SQHEIGHT)) (WINDOWPROP DS (QUOTE GRIDBM) GRIDBM)) (BLTSHADE WHITESHADE GRIDBM 0 0) (* ; "Clear temporary bitmap.") (BLTSHADE BLACKSHADE GRIDBM 0 0 1 1 (QUOTE REPLACE)) (* ; "Put spot down.") (* ; "Fill up temporary bitmap.") (BLTPATTERN GRIDBM 0 0 SQWIDTH SQHEIGHT DS X0 Y0 (ITIMES WIDTH SQWIDTH) (ITIMES HEIGHT SQHEIGHT) (QUOTE PAINT) TEMPBM) else [SETQ MAXIMUMCOLOR (SUB1 (EXPT 2 (BITSPERPIXEL (DSPDESTINATION NIL DS] (* ;; "Crufty slow original code.") (for X from X0 to (IPLUS X0 (ITIMES WIDTH SQWIDTH)) by SQWIDTH do (for Y from Y0 to (IPLUS Y0 TOTALHEIGHT) by SQHEIGHT do (BITMAPBIT DS X Y MAXIMUMCOLOR] (T (\ILLEGAL.ARG BORDER]) ) (DEFINEQ (EDITBM [LAMBDA (BMSPEC) (* N.H.Briggs " 4-Sep-87 15:39") (* ;;; "A simple bitmap editor.") (* ;;   "The edit part of the display is from 0 to MAXGRIDWIDTH in width and from 0 to MAXGRIDHEIGHT in height. The commands and display area for the bitmap being edited are above the edit region." ) (DECLARE (GLOBALVARS SCREENWIDTH SCREENHEIGHT)) (PROG (BMW BMWINTERIOR BMWWIDTH BMWHEIGHT WIDTH HEIGHT BM CR ORIGBM GRIDSQUARE BPP ORIGBPP ORIGWIDTH) (* ;   "set ORIGBM to the input bitmap if any and BM to a copy of it for editting.") [COND ((OR (EQ BMSPEC CursorBitMap) (AND (EQ BMSPEC (QUOTE CursorBitMap)) (SETQ BMSPEC CursorBitMap))) (* ;   "editing cursor, save old value and make changes to the original.") (SETQ ORIGBM (BITMAPCOPY CursorBitMap)) (SETQ BM CursorBitMap)) [(BITMAPP BMSPEC) (SETQ BM (BITMAPCOPY (SETQ ORIGBM BMSPEC] [(LITATOM BMSPEC) (COND ([BITMAPP (SETQ ORIGBM (EVALV BMSPEC (QUOTE EDITBM] (* ; "use value.") (SETQ BM (BITMAPCOPY ORIGBM))) (T (SETQ ORIGBM NIL) (SETQ BM (\READBMDIMENSIONS] ((REGIONP BMSPEC) (* ;   "if BMSPEC is a region, treat it as a region of the screen.") [SETQ BM (BITMAPCREATE (fetch (REGION WIDTH) of BMSPEC) (fetch (REGION HEIGHT) of BMSPEC) (BITSPERPIXEL (SCREENBITMAP] (* ; "note that bm has initial bits in it.") (SETQ ORIGBM BMSPEC) (BITBLT (SCREENBITMAP) (fetch (REGION LEFT) of BMSPEC) (fetch (REGION BOTTOM) of BMSPEC) BM 0 0 NIL NIL (QUOTE INPUT) (QUOTE REPLACE))) ((WINDOWP BMSPEC) (SETQ ORIGBM BMSPEC) (* ;;   "FS: Seems too big below, why not ClipRegion's Width & Height? That's all that's used...") (SETQ BM (BITMAPCREATE (WINDOWPROP BMSPEC (QUOTE WIDTH)) (WINDOWPROP BMSPEC (QUOTE HEIGHT)) (BITSPERPIXEL BMSPEC))) (* ; "open the window and bring it to the top.") (TOTOPW BMSPEC) (SETQ CR (DSPCLIPPINGREGION NIL BMSPEC)) (BITBLT BMSPEC (fetch (REGION LEFT) of CR) (fetch (REGION BOTTOM) of CR) BM 0 0 (fetch (REGION WIDTH) of CR) (fetch (REGION HEIGHT) of CR))) (T (* ; "otherwise create a bitmap") (SETQ BM (\READBMDIMENSIONS] (if (OR (EQ (BITMAPHEIGHT BM) 0) (EQ (BITMAPWIDTH BM) 0)) then (ERROR "Can't edit a bitmap with no bits in it." BMSPEC)) (SETQ BPP (BITSPERPIXEL (SCREENBITMAP))) (SETQ ORIGBPP (fetch (BITMAP BITMAPBITSPERPIXEL) of BM)) [COND ((NOT (EQ BPP ORIGBPP)) (* ;;   "save the actual number of bits per pixel and set it to BPP in the bitmap being edited so that it can be BITBLT ed on the screen." ) (SETQ ORIGWIDTH (fetch (BITMAP BITMAPWIDTH) of BM)) (replace (BITMAP BITMAPBITSPERPIXEL) of BM with BPP) (SETQ WIDTH (IQUOTIENT (ITIMES ORIGBPP ORIGWIDTH) BPP)) (replace (BITMAP BITMAPWIDTH) of BM with WIDTH)) (T (SETQ WIDTH (fetch (BITMAP BITMAPWIDTH) of BM] (SETQ HEIGHT (fetch (BITMAP BITMAPHEIGHT) of BM)) (* ;;   "Calculate a default window size. Start by calculating the grid size from the bitmap size.") (SETQ GRIDSQUARE (IMAX (IMIN (IQUOTIENT (IDIFFERENCE (IQUOTIENT (ITIMES SCREENWIDTH 2) 3) GRIDTHICKNESS) WIDTH) (IQUOTIENT (IDIFFERENCE (IQUOTIENT (ITIMES SCREENHEIGHT 2) 3) (ITIMES GRIDTHICKNESS 2)) (ADD1 HEIGHT)) NORMALGRIDSQUARE) MINGRIDSQUARE)) (SETQ BMWWIDTH (IMIN (IPLUS (ITIMES GRIDSQUARE WIDTH) GRIDTHICKNESS) (IQUOTIENT (ITIMES SCREENWIDTH 2) 3))) (SETQ BMWHEIGHT (IMIN (IPLUS (ITIMES HEIGHT (ADD1 GRIDSQUARE)) (ITIMES GRIDTHICKNESS 2) 1) (IQUOTIENT (ITIMES SCREENHEIGHT 2) 3))) (SETQ BMW (CREATEW (GETBOXREGION (WIDTHIFWINDOW BMWWIDTH) (HEIGHTIFWINDOW BMWHEIGHT T) NIL NIL NIL "Indicate the position for the Bitmap Edit window.") "Bitmap Editor")) (WINDOWPROP BMW (QUOTE BM) BM) (WINDOWPROP BMW (QUOTE SCROLLFN) (FUNCTION EDITBMSCROLLFN)) (WINDOWPROP BMW (QUOTE RESHAPEFN) (FUNCTION EDITBMRESHAPEFN)) (WINDOWPROP BMW (QUOTE REPAINTFN) (FUNCTION EDITBMREPAINTFN)) (WINDOWPROP BMW (QUOTE BUTTONEVENTFN) (FUNCTION EDITBMBUTTONFN)) (WINDOWPROP BMW (QUOTE CLOSEFN) (FUNCTION EDITBMCLOSEFN)) (WINDOWPROP BMW (QUOTE XOFFSET) 0) (WINDOWPROP BMW (QUOTE YOFFSET) 0) (WINDOWPROP BMW (QUOTE DXOFFSET) 0) (WINDOWPROP BMW (QUOTE DYOFFSET) 0) (WINDOWPROP BMW (QUOTE ORIGINALBITMAP) ORIGBM) (WINDOWPROP BMW (QUOTE FINISHEDFLG) NIL) (WINDOWPROP BMW (QUOTE COLOR) (SUB1 (EXPT 2 BPP))) (WINDOWPROP BMW (QUOTE GRIDON) T) (* ;  "call reshapefn to initialize the display and values") (EDITBMRESHAPEFN BMW NIL NIL NIL (NOT ORIGBM)) (* ;   "start a mouse process in case this process is the mouse process.") (SPAWN.MOUSE) (while (NOT (WINDOWPROP BMW (QUOTE FINISHEDFLG))) do (DISMISS 500)) (* ; "remove the closefn before closing the window.") (WINDOWPROP BMW (QUOTE CLOSEFN) NIL) (CLOSEW BMW) (COND ((NOT (EQ ORIGBPP BPP)) (replace (BITMAP BITMAPBITSPERPIXEL) of BM with ORIGBPP) (replace (BITMAP BITMAPWIDTH) of BM with ORIGWIDTH))) (RETURN (COND ((EQ T (WINDOWPROP BMW (QUOTE FINISHEDFLG))) (* ;   "editor exited via ok, stuff contents into original bitmap.") (COND ((EQ BMSPEC CursorBitMap) (* ; "editting happened in original, leave it alone.") CursorBitMap) ((REGIONP ORIGBM) (* ; "put it back into the screen.") (BITBLT BM 0 0 (SCREENBITMAP) (fetch (REGION LEFT) of ORIGBM) (fetch (REGION BOTTOM) of ORIGBM) (fetch (REGION WIDTH) of ORIGBM) (fetch (REGION HEIGHT) of ORIGBM) (QUOTE INPUT) (QUOTE REPLACE)) BM) ((WINDOWP ORIGBM) (* ; "put it back into the window") (BITBLT BM 0 0 ORIGBM (fetch (REGION LEFT) of CR) (fetch (REGION BOTTOM) of CR) (fetch (REGION WIDTH) of CR) (fetch (REGION HEIGHT) of CR) (QUOTE INPUT) (QUOTE REPLACE)) BM) (ORIGBM (BITBLT BM 0 0 ORIGBM 0 0 WIDTH HEIGHT) [COND ((AND BMSPEC (LITATOM BMSPEC)) (* ;   "if spec was an atom without a bm value, set it. in the environment above EDITBM.") (MARKASCHANGED BMSPEC (QUOTE VARS)) (STKEVAL (QUOTE EDITBM) (LIST (QUOTE SETQQ) BMSPEC BM] ORIGBM) (T BM))) (T (* ;  "error exit, if cursor return it to original value.") (COND ((EQ BMSPEC CursorBitMap) (BITBLT ORIGBM NIL NIL CursorBitMap))) (ERROR!]) (EDITBMCLOSEFN [LAMBDA (BMW) (* ; "Edited 27-Aug-87 21:26 by FS") (* ;;   "the close function for a bitmap edit window. For now do what a STOP would have done.") (* ;;   "FS: Assuming this window won't be reused, flush the temporary bm.") (WINDOWPROP BMW (QUOTE TEMPBM) NIL) (WINDOWPROP BMW (QUOTE GRIDBM) NIL) (WINDOWPROP BMW (QUOTE FINISHEDFLG) (QUOTE KILL]) (TILEAREA [LAMBDA (LFT BTM WDTH HGHT SRCBM WIN) (* ; "Edited 27-Aug-87 21:20 by FS") (* ;;   "lays tiles out in an area of a window. This function only provided for backwards compatibility.") (BLTPATTERN.REPLACEDISPLAY SRCBM 0 0 (BITMAPWIDTH SRCBM) (BITMAPHEIGHT SRCBM) WIN LFT BTM WDTH HGHT]) (EDITBMBUTTONFN [LAMBDA (W) (* N.H.Briggs " 4-Sep-87 15:30") (* ;; "inner function of bitmap editor.") (DECLARE (GLOBALVARS \CURRENTCURSOR)) (PROG (GRIDX0 GRIDY0 BITMAPWIDTH BITMAPHEIGHT NEWGRIDSIZE PAINTW ORIGBM GRIDSPEC GRIDINTERIOR BM BITSWIDE BITSHIGH WREGION XOFFSET YOFFSET DXOFFSET DYOFFSET DISPLAYREGION EXTENT BITSPERPIXEL CURSORBM) (SETQ GRIDSPEC (WINDOWPROP W (QUOTE GRIDSPEC))) (SETQ GRIDINTERIOR (WINDOWPROP W (QUOTE GRIDINTERIOR))) (SETQ BM (WINDOWPROP W (QUOTE BM))) (SETQ BITSWIDE (WINDOWPROP W (QUOTE BITSWIDE))) (SETQ BITSHIGH (WINDOWPROP W (QUOTE BITSHIGH))) (SETQ WREGION (WINDOWPROP W (QUOTE REGION))) (SETQ XOFFSET (WINDOWPROP W (QUOTE XOFFSET))) (SETQ YOFFSET (WINDOWPROP W (QUOTE YOFFSET))) (SETQ DXOFFSET (WINDOWPROP W (QUOTE DXOFFSET))) (SETQ DYOFFSET (WINDOWPROP W (QUOTE DYOFFSET))) (SETQ DISPLAYREGION (WINDOWPROP W (QUOTE DISPLAYREGION))) (SETQ EXTENT (WINDOWPROP W (QUOTE EXTENT))) (SETQ GRIDX0 (fetch (REGION LEFT) of GRIDSPEC)) (SETQ GRIDY0 (fetch (REGION BOTTOM) of GRIDSPEC)) (SETQ BITMAPWIDTH (fetch (BITMAP BITMAPWIDTH) of BM)) (SETQ BITMAPHEIGHT (fetch (BITMAP BITMAPHEIGHT) of BM)) (SETQ BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of BM)) (SETQ COLOR (WINDOWPROP W (QUOTE COLOR))) (* ;;  "mark the region of the bitmap that is being editted." ) (COND ((INSIDE? GRIDINTERIOR (LASTMOUSEX W) (LASTMOUSEY W)) (* ;; "if cursor is inside, shade it.") (\SHADEBITS BM GRIDSPEC GRIDINTERIOR W BITSWIDE BITSHIGH COLOR)) ((INSIDE? DISPLAYREGION (LASTMOUSEX W) (LASTMOUSEY W)) (* ;;  "Run the menu foe re-windowing into the whole bitmap") (SELECTQ [MENU (COND ((type? MENU EDITBMWINDOWMENU) EDITBMWINDOWMENU) ((SETQ EDITBMWINDOWMENU (create MENU ITEMS _ (QUOTE ((Move (QUOTE Move) "Selects a different part of the bitmap to edit."))) CENTERFLG _ T] (Move (* ;  "move the editing window's location on the bitmap.") (PROG (POS) [SETQ POS (GETBOXPOSITION BITSWIDE BITSHIGH [IPLUS 4 (fetch (REGION LEFT) of WREGION) (DIFFERENCE XOFFSET (WINDOWPROP W (QUOTE DXOFFSET] (IPLUS (WINDOWPROP W (QUOTE BMDISPLAYBOTTOM)) (DIFFERENCE YOFFSET (WINDOWPROP W (QUOTE DYOFFSET)) ) 4 (fetch (REGION BOTTOM) of WREGION] [WINDOWPROP W (QUOTE XOFFSET) (SETQ XOFFSET (IMIN (IDIFFERENCE BITMAPWIDTH BITSWIDE) (IMAX [IPLUS (WINDOWPROP W (QUOTE DXOFFSET)) (DIFFERENCE (fetch (POSITION XCOORD) of POS) (IPLUS 4 (fetch (REGION LEFT) of WREGION] 0] [WINDOWPROP W (QUOTE YOFFSET) (SETQ YOFFSET (IMAX 0 (IMIN (DIFFERENCE BITMAPHEIGHT BITSHIGH) (DIFFERENCE (IPLUS (WINDOWPROP W (QUOTE DYOFFSET)) (DIFFERENCE (fetch (POSITION YCOORD) of POS) (IPLUS (fetch (REGION BOTTOM) of WREGION) 4))) (WINDOWPROP W (QUOTE BMDISPLAYBOTTOM] (replace (REGION LEFT) of EXTENT with (IMINUS (QUOTIENT (TIMES XOFFSET (fetch (REGION WIDTH) of EXTENT)) BITMAPWIDTH))) (replace (REGION BOTTOM) of EXTENT with (IMINUS (QUOTIENT (TIMES YOFFSET (fetch (REGION HEIGHT) of EXTENT)) BITMAPHEIGHT))) [COND ([OR (ILESSP XOFFSET DXOFFSET) (ILESSP YOFFSET DYOFFSET) [IGREATERP (IPLUS XOFFSET BITSWIDE) (IPLUS DXOFFSET (WINDOWPROP W (QUOTE BMDISPLAYWIDTH] (IGREATERP (IPLUS YOFFSET BITSHIGH) (IPLUS DYOFFSET (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT] (* ;;   "Adjust the display region left lower corner so the selected region is near the center.") [WINDOWPROP W (QUOTE DXOFFSET) (SETQ DXOFFSET (IMAX 0 (IMIN (DIFFERENCE (fetch (BITMAP BITMAPWIDTH) of BM) (WINDOWPROP W (QUOTE BMDISPLAYWIDTH))) (DIFFERENCE (IPLUS XOFFSET (LRSH BITSWIDE 1)) (LRSH (WINDOWPROP W (QUOTE BMDISPLAYWIDTH) ) 1] (WINDOWPROP W (QUOTE DYOFFSET) (SETQ DYOFFSET (IMAX 0 (IMIN (DIFFERENCE (fetch (BITMAP BITMAPHEIGHT) of BM) (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT))) (DIFFERENCE (IPLUS YOFFSET (LRSH BITSHIGH 1)) (LRSH (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT)) 1] (* DSPFILL GRIDINTERIOR WHITESHADE  (QUOTE REPLACE) W) (UPDATE/BM/DISPLAY BM W) (* ;;   "FS: More useless code: (COND ((WINDOWPROP W 'GRIDON) (GRID GRIDSPEC BITSWIDE BITSHIGH 'POINT W)))") (RESETGRID.NEW BM GRIDSPEC BITSWIDE BITSHIGH 0 0 W T))) NIL)) ((LASTMOUSESTATE LEFT) (UPDATE/BM/DISPLAY/SELECTED/REGION W) (SETQ CURSORBM (BITMAPCREATE 16 16 (BITSPERPIXEL BM))) (BITBLT BM NIL NIL CURSORBM) [RESETFORM [CURSOR (CURSORCREATE CURSORBM (fetch (CURSOR CURSORHOTSPOTX) of (CURSOR)) (fetch (CURSOR CURSORHOTSPOTY) of (CURSOR] (until (MOUSESTATE (NOT LEFT] (UPDATE/BM/DISPLAY/SELECTED/REGION W)) (T (* ;;   "the region being editted is inverted while the menu is active. Each command must make sure that it is recomplemented." ) (UPDATE/BM/DISPLAY/SELECTED/REGION W) (SELECTQ [MENU (COND ((type? MENU EDITBMMENU) EDITBMMENU) (T (SETQ EDITBMMENU (create MENU ITEMS _ [APPEND (COND [(COLORDISPLAYP) (QUOTE ((Color (QUOTE Color) "Choose color to set bits with"] (T NIL)) (QUOTE ((Paint (QUOTE Paint) "Calls the window PAINT command on the bitmap.") (ShowAsTile (QUOTE ShowAsTile) "tiles the upper part of the edit window with the bitmap.") (Grid% On/Off (QUOTE GridOnOff) "Grid On/Off Switch") (GridSize_ (QUOTE GridSize_) "Allows setting of the size of a bit in the edit area.") (Reset (QUOTE Reset) "Sets the bitmap back to the state at the start of this edit session.") (Clear (QUOTE Clear) "Sets the entire bitmap to 0") (Cursor_ (QUOTE Cursor_) "Puts the bitmap into the cursor and exits the editor.") (OK (QUOTE OK) "Leaves the edit session.") (Abort (QUOTE Abort) "Restores the bitmap to its original values and leaves the editor."] CENTERFLG _ T] (OK (WINDOWPROP W (QUOTE FINISHEDFLG) T)) (Abort (WINDOWPROP W (QUOTE FINISHEDFLG) (QUOTE KILL))) [Reset (* ;;   "allow the user to choose between everything or just visible part. This also give the user a chance to change their mind." ) (COND ((SELECTQ (\EDITBMHOWMUCH BM BITSWIDE BITSHIGH "RESET how much?") (VISIBLE [COND [(SETQ ORIGBM (WINDOWPROP W (QUOTE ORIGINALBITMAP))) (COND ((REGIONP ORIGBM) (BITBLT (SCREENBITMAP) (IPLUS XOFFSET (fetch (REGION LEFT) of ORIGBM)) (IPLUS YOFFSET (fetch (REGION BOTTOM) of ORIGBM)) BM XOFFSET YOFFSET BITSWIDE BITSHIGH (QUOTE INPUT) (QUOTE REPLACE))) (T (BITBLT ORIGBM XOFFSET YOFFSET BM XOFFSET YOFFSET BITSWIDE BITSHIGH] (T (BLTSHADE WHITESHADE BM XOFFSET YOFFSET BITSWIDE BITSHIGH (QUOTE REPLACE] T) (WHOLE [COND [(SETQ ORIGBM (WINDOWPROP W (QUOTE ORIGINALBITMAP))) (COND ((REGIONP ORIGBM) (BITBLT (SCREENBITMAP) (fetch (REGION LEFT) of ORIGBM) (fetch (REGION BOTTOM) of ORIGBM) BM)) (T (BITBLT ORIGBM NIL NIL BM] (T (BLTSHADE WHITESHADE BM NIL NIL NIL NIL (QUOTE REPLACE] T) (PROGN (UPDATE/BM/DISPLAY/SELECTED/REGION W) NIL)) (\EDITBM/PUTUP/DISPLAY W BM GRIDSPEC GRIDINTERIOR BITSWIDE BITSHIGH] [Clear (* ;;   "allow the user to choose between everything or just visible part. This also give the user a chance to change their mind." ) (COND ((SELECTQ (\EDITBMHOWMUCH BM BITSWIDE BITSHIGH "CLEAR how much?") (VISIBLE (BLTSHADE WHITESHADE BM XOFFSET YOFFSET BITSWIDE BITSHIGH (QUOTE REPLACE)) T) (WHOLE (\CLEARBM BM) T) (PROGN (UPDATE/BM/DISPLAY/SELECTED/REGION W) NIL)) (DSPFILL GRIDINTERIOR WHITESHADE (QUOTE REPLACE) W) (COND ((WINDOWPROP W (QUOTE GRIDON)) (GRID GRIDSPEC BITSWIDE BITSHIGH (QUOTE POINT) W))) (UPDATE/BM/DISPLAY BM W] (GridOnOff (COND ((NOT (WINDOWPROP W (QUOTE GRIDON))) (* ; "Turn Grid On") (WINDOWPROP W (QUOTE GRIDON) T) (GRID GRIDSPEC BITSWIDE BITSHIGH (QUOTE POINT) W) (* ;;   "FS: The update here was unnecessary. (UPDATE/BM/DISPLAY BM W)") NIL) (T (* ; "Turn off grid") (WINDOWPROP W (QUOTE GRIDON) NIL) (* DSPFILL (create REGION LEFT _ 0 BOTTOM _ 0 WIDTH _ (ADD1 (fetch (REGION WIDTH) of GRIDINTERIOR)) HEIGHT _  (ADD1 (fetch (REGION HEIGHT) of GRIDINTERIOR))) WHITESHADE (QUOTE REPLACE) W) (RESETGRID.NEW BM GRIDSPEC BITSWIDE BITSHIGH 0 0 W T) (* ;;   "FS: The update here was unnecessary. (UPDATE/BM/DISPLAY BM W)") NIL))) [GridSize_ (* ;  "sets the grid square size and calls the reshapefn.") (COND ([SETQ NEWGRIDSIZE (NUMBERP (MENU (COND ((TYPENAMEP GRIDSIZEMENU (QUOTE MENU)) GRIDSIZEMENU) (T (SETQ GRIDSIZEMENU (create MENU ITEMS _ (QUOTE (3 4 5 6 7 8 12 16 20 24 28 32) ) MENUROWS _ 4] (WINDOWPROP W (QUOTE GRIDSQUARE) NEWGRIDSIZE) (EDITBMRESHAPEFN W] (ShowAsTile (* ;   "tiles the upper part of the window with the bitmap so the user can see what it would be as a shade.") (UPDATE/SHADE/DISPLAY BM W)) [Paint (* ;   "call the window paint command on the contents of the bitmap.") [SETQ PAINTW (CREATEW (create REGION LEFT _ (IQUOTIENT (DIFFERENCE SCREENWIDTH BITMAPWIDTH) 2) BOTTOM _ (IQUOTIENT (DIFFERENCE SCREENHEIGHT BITMAPHEIGHT) 2) WIDTH _ (WIDTHIFWINDOW BITMAPWIDTH) HEIGHT _ (HEIGHTIFWINDOW BITMAPHEIGHT NIL] (OPENW PAINTW) (BITBLT BM 0 0 PAINTW) (PAINTW PAINTW) (COND ((MENU (create MENU ITEMS _ (QUOTE ((YES T "Will put the newly painted bits back in the bitmap being editted.") (NO NIL "Will discard the painted bits, not changing the bitmap being editted."))) TITLE _ "Put change into bitmap?" CENTERFLG _ T)) (BITBLT PAINTW 0 0 BM) (CLOSEW PAINTW) (* ; "set PAINTW so that space can be reclaimed") (SETQ PAINTW) (\EDITBM/PUTUP/DISPLAY W BM GRIDSPEC GRIDINTERIOR BITSWIDE BITSHIGH] (Cursor_ (* ;   "Stuffs lower left part of image into the cursor and sets the hotspot.") (READHOTSPOT BM GRIDSPEC GRIDINTERIOR W) (WINDOWPROP W (QUOTE FINISHEDFLG) T)) (Color (WINDOWPROP W (QUOTE COLOR) (OR (MENU (COLORMENU BITSPERPIXEL)) COLOR))) (UPDATE/BM/DISPLAY/SELECTED/REGION W]) (EDITBMSCROLLFN [LAMBDA (W DX DY) (* ; "Edited 31-Aug-87 13:29 by FS") (* ; "Do scrolling for the bitmap editor.") (PROG (GRIDSPEC REG WHEIGHT WWIDTH (DXGRID 0) (DYGRID 0) EXTENT EXTENTWIDTH EXTENTHEIGHT GILEFT GIBOTTOM GIHEIGHT GWIDTH GHEIGHT GRIDINTERIOR EBMXLIMIT EBMYLIMIT EBMXOFFSET EBMYOFFSET BM BITMAPWIDTH BITMAPHEIGHT BITSWIDE BITSHIGH DXOFFSET DYOFFSET) (SETQ GRIDSPEC (WINDOWPROP W (QUOTE GRIDSPEC))) (SETQ REG (WINDOWPROP W (QUOTE REGION))) (SETQ WHEIGHT (WINDOWPROP W (QUOTE HEIGHT))) (SETQ WWIDTH (WINDOWPROP W (QUOTE WIDTH))) (SETQ GRIDINTERIOR (WINDOWPROP W (QUOTE GRIDINTERIOR))) (SETQ EBMXOFFSET (WINDOWPROP W (QUOTE XOFFSET))) (SETQ EBMYOFFSET (WINDOWPROP W (QUOTE YOFFSET))) (SETQ BM (WINDOWPROP W (QUOTE BM))) (SETQ BITMAPWIDTH (fetch BITMAPWIDTH of BM)) (SETQ BITMAPHEIGHT (fetch BITMAPHEIGHT of BM)) (SETQ BITSWIDE (WINDOWPROP W (QUOTE BITSWIDE))) (SETQ BITSHIGH (WINDOWPROP W (QUOTE BITSHIGH))) (SETQ DXOFFSET (WINDOWPROP W (QUOTE DXOFFSET))) (SETQ DYOFFSET (WINDOWPROP W (QUOTE DYOFFSET))) (SETQ EBMXLIMIT (IPLUS EBMXOFFSET BITSWIDE)) (SETQ EBMYLIMIT (IPLUS EBMYOFFSET BITSHIGH)) (COND (GRIDSPEC (SETQ GILEFT (fetch (REGION LEFT) of GRIDINTERIOR)) (SETQ GIBOTTOM (fetch (REGION BOTTOM) of GRIDINTERIOR)) (SETQ GIHEIGHT (fetch (REGION HEIGHT) of GRIDINTERIOR)) (SETQ GWIDTH (fetch (REGION WIDTH) of GRIDSPEC)) (SETQ GHEIGHT (fetch (REGION HEIGHT) of GRIDSPEC)) (SETQ EXTENT (WINDOWPROP W (QUOTE EXTENT))) (SETQ EXTENTWIDTH (fetch (REGION WIDTH) of EXTENT)) (SETQ EXTENTHEIGHT (fetch (REGION HEIGHT) of EXTENT)) (* ; "Make a horizontal adjustment") (COND ((FLOATP DX) (* ; "Horizontal thumbing") [WINDOWPROP W (QUOTE XOFFSET) (SETQ EBMXOFFSET (FIX (TIMES (IDIFFERENCE BITMAPWIDTH BITSWIDE) DX] (replace (REGION LEFT) of EXTENT with (IMINUS (QUOTIENT (TIMES EBMXOFFSET EXTENTWIDTH) BITMAPWIDTH))) (* BLTSHADE WHITESHADE W GILEFT GIBOTTOM SCREENWIDTH  SCREENHEIGHT (QUOTE REPLACE) GRIDINTERIOR) (RESETGRID.NEW BM GRIDSPEC BITSWIDE BITSHIGH 0 0 W T)) ((ILESSP DX 0) (* ; "moving to the left.") (* ; "determine how many grid points to move.") (SETQ DXGRID (IMIN (GRIDXCOORD (IMINUS DX) GRIDSPEC) (IDIFFERENCE BITMAPWIDTH EBMXLIMIT))) (COND ((NOT (IGREATERP DXGRID 0)) (* ; "right edge is at the right margin") (RETURN))) (WINDOWPROP W (QUOTE XOFFSET) (SETQ EBMXOFFSET (IPLUS EBMXOFFSET DXGRID))) (* ; "update EXTENT bar") (replace (REGION LEFT) of EXTENT with (IMAX (IMINUS (QUOTIENT (TIMES EBMXOFFSET EXTENTWIDTH) BITMAPWIDTH)) (IMINUS EXTENTWIDTH))) (* ; "move image to the left.") (BITBLT W (IPLUS GILEFT (TIMES DXGRID GWIDTH)) GIBOTTOM W GILEFT GIBOTTOM SCREENWIDTH SCREENHEIGHT (QUOTE INPUT) (QUOTE REPLACE) NIL GRIDINTERIOR) (* ; "clear the newly exposed area.") (BLTSHADE WHITESHADE W (IPLUS GILEFT (TIMES (IDIFFERENCE BITSWIDE DXGRID) GWIDTH)) GIBOTTOM SCREENWIDTH SCREENHEIGHT (QUOTE REPLACE) GRIDINTERIOR) (RESETGRID.NEW BM GRIDSPEC DXGRID BITSHIGH (IDIFFERENCE BITSWIDE DXGRID) 0 W)) ((ILESSP 0 DX) (* ;  "determine how many grid point to the left to move.") (SETQ DXGRID (IMIN EBMXOFFSET (GRIDXCOORD DX GRIDSPEC))) (COND ((NOT (IGREATERP DXGRID 0)) (* ; "left edge is at the left margin") (RETURN))) (WINDOWPROP W (QUOTE XOFFSET) (SETQ EBMXOFFSET (IDIFFERENCE EBMXOFFSET DXGRID))) (* ; "update REGION bar") (replace (REGION LEFT) of EXTENT with (IMIN (IMINUS (IQUOTIENT (TIMES EBMXOFFSET EXTENTWIDTH) BITMAPWIDTH)) 0)) (* ; "move image to the right.") (BITBLT W GILEFT GIBOTTOM W (IPLUS GILEFT (TIMES DXGRID GWIDTH)) GIBOTTOM SCREENWIDTH SCREENHEIGHT (QUOTE INPUT) (QUOTE REPLACE) NIL GRIDINTERIOR) (* ; "clear the newly exposed area.") (BLTSHADE WHITESHADE W GILEFT GIBOTTOM (TIMES DXGRID GWIDTH) GIHEIGHT (QUOTE REPLACE)) (RESETGRID.NEW BM GRIDSPEC DXGRID BITSHIGH 0 0 W))) (* ; "Make a vertical adjustment") (COND ((FLOATP DY) (* ; "Vertical Thumbing") [WINDOWPROP W (QUOTE YOFFSET) (SETQ EBMYOFFSET (FIX (TIMES (IDIFFERENCE BITMAPHEIGHT BITSHIGH) (FDIFFERENCE 1.0 DY] (* ; "set EXTENT bar") (replace (REGION BOTTOM) of EXTENT with (IMINUS (QUOTIENT (TIMES EBMYOFFSET EXTENTHEIGHT) BITMAPHEIGHT))) (* ; "Clear Window") (* BLTSHADE WHITESHADE W GILEFT GIBOTTOM SCREENWIDTH  SCREENHEIGHT (QUOTE REPLACE) GRIDINTERIOR) (* ; "Repaint the image using grid function") (RESETGRID.NEW BM GRIDSPEC BITSWIDE BITSHIGH 0 0 W T)) ((ILESSP DY 0) (* ; "determine how many squares to move down.") (SETQ DYGRID (IMIN (IDIFFERENCE (fetch (BITMAP BITMAPHEIGHT) of BM) EBMYLIMIT) (GRIDYCOORD (IMIN GIHEIGHT (IMINUS DY)) GRIDSPEC))) (COND ((NOT (IGREATERP DYGRID 0)) (* ; "top edge is at the top margin") (RETURN))) (WINDOWPROP W (QUOTE YOFFSET) (SETQ EBMYOFFSET (IPLUS EBMYOFFSET DYGRID))) (replace (REGION BOTTOM) of EXTENT with (IMAX (IMINUS (QUOTIENT (TIMES EBMYOFFSET EXTENTHEIGHT) BITMAPHEIGHT)) (IMINUS EXTENTHEIGHT))) (BITBLT W GILEFT (IPLUS GIBOTTOM (ITIMES DYGRID GHEIGHT)) W GILEFT GIBOTTOM SCREENWIDTH SCREENHEIGHT (QUOTE INPUT) (QUOTE REPLACE) NIL GRIDINTERIOR) (* BLTSHADE WHITESHADE W GILEFT  (IPLUS GIBOTTOM (ITIMES (IDIFFERENCE BITSHIGH DYGRID)  GHEIGHT)) SCREENWIDTH SCREENHEIGHT  (QUOTE REPLACE) GRIDINTERIOR) (RESETGRID.NEW BM GRIDSPEC BITSWIDE DYGRID 0 (IDIFFERENCE BITSHIGH DYGRID) W T)) ((ILESSP 0 DY) (* ;  "moving up; determine how may grid squares to move.") (SETQ DYGRID (IMIN EBMYOFFSET (GRIDYCOORD (IMIN GIHEIGHT DY) GRIDSPEC))) (COND ((NOT (IGREATERP DYGRID 0)) (* ; "bottom edge is at the bottom margin") (RETURN))) (WINDOWPROP W (QUOTE YOFFSET) (SETQ EBMYOFFSET (IDIFFERENCE EBMYOFFSET DYGRID))) (replace (REGION BOTTOM) of EXTENT with (IMIN (IMINUS (QUOTIENT (TIMES EBMYOFFSET EXTENTHEIGHT) BITMAPHEIGHT)) 0)) (BITBLT W GILEFT GIBOTTOM W GILEFT (IPLUS GIBOTTOM (ITIMES DYGRID GHEIGHT)) SCREENWIDTH SCREENHEIGHT (QUOTE INPUT) (QUOTE REPLACE) NIL GRIDINTERIOR) (* BLTSHADE WHITESHADE W GILEFT GIBOTTOM  (fetch (REGION WIDTH) of GRIDINTERIOR)  (ITIMES DYGRID GHEIGHT) (QUOTE REPLACE)) (RESETGRID.NEW BM GRIDSPEC BITSWIDE DYGRID 0 0 W T))) (* ;;   "This call to GRID is unnecessary as the grid dots get filled in earlier.") (* ;;   "(COND ((WINDOWPROP W 'GRIDON) (GRID GRIDSPEC BITSWIDE BITSHIGH 'POINT W)))") [COND ([OR (ILESSP EBMXOFFSET DXOFFSET) (ILESSP EBMYOFFSET DYOFFSET) [IGREATERP (IPLUS EBMXOFFSET BITSWIDE) (IPLUS DXOFFSET (WINDOWPROP W (QUOTE BMDISPLAYWIDTH] (IGREATERP (IPLUS EBMYOFFSET BITSHIGH) (IPLUS DYOFFSET (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT] (* ;   "Adjust the display region left lower corner so the selected region is near the center.") [WINDOWPROP W (QUOTE DXOFFSET) (SETQ DXOFFSET (IMAX 0 (IMIN (IDIFFERENCE (fetch (BITMAP BITMAPWIDTH) of BM) (WINDOWPROP W (QUOTE BMDISPLAYWIDTH))) (IDIFFERENCE (IPLUS EBMXOFFSET (LRSH BITSWIDE 1)) (LRSH (WINDOWPROP W (QUOTE BMDISPLAYWIDTH)) 1] (WINDOWPROP W (QUOTE DYOFFSET) (SETQ DYOFFSET (IMAX 0 (IMIN (IDIFFERENCE (fetch (BITMAP BITMAPHEIGHT) of BM) (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT))) (IDIFFERENCE (IPLUS EBMYOFFSET (LRSH BITSHIGH 1)) (LRSH (WINDOWPROP W (QUOTE BMDISPLAYHEIGHT)) 1] (UPDATE/BM/DISPLAY BM W]) (\EDITBM/PUTUP/DISPLAY [LAMBDA (WINDOW BM GRIDSPEC GRIDINTERIOR BITSWIDE BITSHIGH) (* ; "Edited 31-Aug-87 13:05 by FS") (* initializes the display for the bitmap editor.) (* DSPFILL GRIDINTERIOR WHITESHADE  (QUOTE REPLACE) WINDOW) (* COND ((WINDOWPROP WINDOW  (QUOTE GRIDON)) (GRID GRIDSPEC BITSWIDE BITSHIGH  (QUOTE POINT) WINDOW))) (RESETGRID.NEW BM GRIDSPEC BITSWIDE BITSHIGH 0 0 WINDOW T) (UPDATE/BM/DISPLAY BM WINDOW]) (EDITBMRESHAPEFN [LAMBDA (BMEDITWINDOW OLDIMAGE OLDREGION OLDSCREENREGION ZEROBMFLG) (* ; "Edited 31-Aug-87 12:41 by FS") (* ;;   "allows the bitmap edit window to be reshaped to enlarge the editting area. This is also called to set up the image during initialization." ) (PROG (BMWINTERIORWIDTH BMWINTERIORHEIGHT EDITAREABITWIDTH EDITAREABITHEIGHT GRIDSQUARE GRIDINTERIOR BITMAPWIDTH BMDISPLAYWIDTH BMDISPLAYBOTTOM BMDISPLAYHEIGHT BITMAPHEIGHT (BM (WINDOWPROP BMEDITWINDOW (QUOTE BM))) MINCOMMANDAREAWIDTH EXTENTWIDTH EXTENTHEIGHT) (SETQ MINCOMMANDAREAWIDTH 30) (SETQ BITMAPWIDTH (fetch (BITMAP BITMAPWIDTH) of BM)) (SETQ BITMAPHEIGHT (fetch (BITMAP BITMAPHEIGHT) of BM)) (SETQ BMWINTERIORWIDTH (WINDOWPROP BMEDITWINDOW (QUOTE WIDTH))) (* ;;   "leave room at the top for the full size display area. But not more than half of the window.") (SETQ BMWINTERIORHEIGHT (IMAX (IDIFFERENCE (WINDOWPROP BMEDITWINDOW (QUOTE HEIGHT)) (IPLUS BITMAPHEIGHT GRIDTHICKNESS)) (IQUOTIENT (WINDOWPROP BMEDITWINDOW (QUOTE HEIGHT) ) 2))) (* ;;   "if the user hasn't set it, determine the grid size as the largest size which fits the interior but not larger than NORMALGRIDSQUARE nor smaller than MINGRIDSQUARE. If GRIDSQUARE was specified, reset it to NIL so that if reshaped it will be recalculated." ) (SETQ GRIDSQUARE (OR (WINDOWPROP BMEDITWINDOW (QUOTE GRIDSQUARE) NIL) (IMAX (IMIN (IQUOTIENT BMWINTERIORWIDTH BITMAPWIDTH) (IQUOTIENT BMWINTERIORHEIGHT BITMAPHEIGHT) NORMALGRIDSQUARE) MINGRIDSQUARE))) (* ;  "calculate how many bits will be displayed at once.") (SETQ EDITAREABITWIDTH (IMIN (IQUOTIENT BMWINTERIORWIDTH GRIDSQUARE) BITMAPWIDTH)) (WINDOWPROP BMEDITWINDOW (QUOTE BITSWIDE) EDITAREABITWIDTH) (SETQ EDITAREABITHEIGHT (IMIN (IQUOTIENT BMWINTERIORHEIGHT GRIDSQUARE) BITMAPHEIGHT)) (* ;   "calculate offset of display and command regions at the top of the window.") (WINDOWPROP BMEDITWINDOW (QUOTE BITSHIGH) EDITAREABITHEIGHT) (SETQ BMDISPLAYBOTTOM (IPLUS (ITIMES GRIDSQUARE EDITAREABITHEIGHT) GRIDTHICKNESS)) (SETQ BMDISPLAYWIDTH (IMIN BITMAPWIDTH (IDIFFERENCE BMWINTERIORWIDTH MINCOMMANDAREAWIDTH))) (* ;;   "put the offset --- the lower left coordinate --- in the same place unless the new shape allows more to be shown past the upper right corner." ) (WINDOWPROP BMEDITWINDOW (QUOTE XOFFSET) (IMIN (WINDOWPROP BMEDITWINDOW (QUOTE XOFFSET)) (IDIFFERENCE BITMAPWIDTH EDITAREABITWIDTH))) (WINDOWPROP BMEDITWINDOW (QUOTE YOFFSET) (IMIN (WINDOWPROP BMEDITWINDOW (QUOTE YOFFSET)) (IDIFFERENCE BITMAPHEIGHT EDITAREABITHEIGHT))) (* ; "Center edit square") (SETQ GRIDINTERIOR (create REGION LEFT _ (IQUOTIENT (IDIFFERENCE BMWINTERIORWIDTH (ITIMES EDITAREABITWIDTH GRIDSQUARE)) 2) BOTTOM _ (IQUOTIENT (IDIFFERENCE BMDISPLAYBOTTOM (ITIMES EDITAREABITHEIGHT GRIDSQUARE)) 2) WIDTH _ (ITIMES EDITAREABITWIDTH GRIDSQUARE) HEIGHT _ (ITIMES EDITAREABITHEIGHT GRIDSQUARE))) (WINDOWPROP BMEDITWINDOW (QUOTE GRIDINTERIOR) GRIDINTERIOR) (WINDOWPROP BMEDITWINDOW (QUOTE BMDISPLAYBOTTOM) BMDISPLAYBOTTOM) (WINDOWPROP BMEDITWINDOW (QUOTE BMDISPLAYWIDTH) BMDISPLAYWIDTH) (WINDOWPROP BMEDITWINDOW (QUOTE BMDISPLAYHEIGHT) (SETQ BMDISPLAYHEIGHT (IDIFFERENCE (WINDOWPROP BMEDITWINDOW (QUOTE HEIGHT)) BMDISPLAYBOTTOM))) (WINDOWPROP BMEDITWINDOW (QUOTE DISPLAYREGION) (create REGION LEFT _ 0 BOTTOM _ BMDISPLAYBOTTOM WIDTH _ BMDISPLAYWIDTH HEIGHT _ BMDISPLAYHEIGHT)) (WINDOWPROP BMEDITWINDOW (QUOTE GRIDSPEC) (create REGION LEFT _ (fetch (REGION LEFT) of GRIDINTERIOR) BOTTOM _ (fetch (REGION BOTTOM) of GRIDINTERIOR) WIDTH _ GRIDSQUARE HEIGHT _ GRIDSQUARE)) (SETQ EXTENTHEIGHT (QUOTIENT (TIMES BITMAPHEIGHT (WINDOWPROP BMEDITWINDOW (QUOTE HEIGHT))) EDITAREABITHEIGHT)) [SETQ EXTENTWIDTH (IDIFFERENCE (QUOTIENT (TIMES BITMAPWIDTH BMWINTERIORWIDTH) EDITAREABITWIDTH) (WINDOWPROP BMEDITWINDOW (QUOTE BORDER] (WINDOWPROP BMEDITWINDOW (QUOTE EXTENT) (CREATEREGION (MINUS (QUOTIENT (TIMES (WINDOWPROP BMEDITWINDOW (QUOTE XOFFSET)) EXTENTWIDTH) BITMAPWIDTH)) (MINUS (QUOTIENT (TIMES (WINDOWPROP BMEDITWINDOW (QUOTE YOFFSET)) EXTENTHEIGHT) BITMAPHEIGHT)) EXTENTWIDTH EXTENTHEIGHT)) (EDITBMREPAINTFN BMEDITWINDOW NIL ZEROBMFLG]) (EDITBMREPAINTFN.NEW [LAMBDA (WIN REGION ZEROBM) (* ; "Edited 27-Aug-87 22:02 by FS") (* ;;   "Stub in case I missed a call to this guy. Take out later.") (EDITBMREPAINTFN WIN REGION ZEROBM]) (EDITBMREPAINTFN [LAMBDA (WIN REGION ZEROBM) (* N.H.Briggs " 4-Sep-87 15:07") (* ;;   "redisplays a bitmap editting window If ZEROBM is non-NIL, it doesn't bother to display the bits.") (PROG [(GRIDSPEC (WINDOWPROP WIN (QUOTE GRIDSPEC))) (EDITAREABITWIDTH (WINDOWPROP WIN (QUOTE BITSWIDE))) (EDITAREABITHEIGHT (WINDOWPROP WIN (QUOTE BITSHIGH))) (BM (WINDOWPROP WIN (QUOTE BM] (CLEARW WIN) (* ;   "gray the area above the edit grid that is not bitmap display area.") (BLTSHADE NOTINUSEGRAY WIN (PLUS (WINDOWPROP WIN (QUOTE BMDISPLAYWIDTH)) GRIDTHICKNESS) (WINDOWPROP WIN (QUOTE BMDISPLAYBOTTOM))) (* ;; "put in the display of the full sized bitmap.") (UPDATE/BM/DISPLAY BM WIN) (* ;;   "FS: Now that RESETGRID displays the grid, don't need the call to GRID.") (* ;;   "(COND ((WINDOWPROP WIN 'GRIDON) (GRID GRIDSPEC EDITAREABITWIDTH EDITAREABITHEIGHT 'POINT WIN)))") (if ZEROBM then (if (WINDOWPROP WIN (QUOTE GRIDON)) then (GRID GRIDSPEC EDITAREABITWIDTH EDITAREABITHEIGHT (QUOTE POINT) WIN)) else (RESETGRID.NEW BM GRIDSPEC EDITAREABITWIDTH EDITAREABITHEIGHT 0 0 WIN]) (RESETGRID.NEW [LAMBDA (BM GRIDSPEC WIDTH HEIGHT ORIGX ORIGY WINDOW DOCLEARFLG) (* N.H.Briggs " 4-Sep-87 15:08") (* ;;   "Copies the contents of a bitmap into the edit display grid of window. ORIGX & Y are used to offest into both bitmap and destination window." ) (LET (XOFFSET YOFFSET MAXX MAXY SHADE XSCALE YSCALE TEMPBM) (SETQ XSCALE (fetch (REGION WIDTH) of GRIDSPEC)) (SETQ YSCALE (fetch (REGION HEIGHT) of GRIDSPEC)) (if (NULL ORIGX) then (SETQ ORIGX 0)) (if (NULL ORIGY) then (SETQ ORIGY 0)) (SETQ XOFFSET (WINDOWPROP WINDOW (QUOTE XOFFSET))) (SETQ YOFFSET (WINDOWPROP WINDOW (QUOTE YOFFSET))) (SETQ MAXX (IPLUS ORIGX WIDTH -1)) (SETQ MAXY (IPLUS ORIGY HEIGHT -1)) (* ;; "Build & cache a temporary bitmap.") (SETQ TEMPBM (WINDOWPROP WINDOW (QUOTE TEMPBM))) (if (NOT TEMPBM) then (SETQ TEMPBM (BITMAPCREATE (BITMAPWIDTH WINDOW) (BITMAPHEIGHT BM))) (WINDOWPROP WINDOW (QUOTE TEMPBM) TEMPBM)) (* ;;   "Use SCALEBM. Bitmap destination must be empty (white).") (if DOCLEARFLG then (BLTSHADE WHITESHADE WINDOW (LEFTOFGRIDCOORD ORIGX GRIDSPEC) (BOTTOMOFGRIDCOORD ORIGY GRIDSPEC) (TIMES WIDTH XSCALE) (TIMES HEIGHT YSCALE) (QUOTE REPLACE))) (SCALEBM BM (PLUS ORIGX XOFFSET) (PLUS ORIGY YOFFSET) WINDOW (LEFTOFGRIDCOORD ORIGX GRIDSPEC) (BOTTOMOFGRIDCOORD ORIGY GRIDSPEC) WIDTH HEIGHT XSCALE YSCALE TEMPBM) (* ;; "Shade the pixels correctly.") (BLTSHADE DARKBITSHADE WINDOW (LEFTOFGRIDCOORD ORIGX GRIDSPEC) (BOTTOMOFGRIDCOORD ORIGY GRIDSPEC) (TIMES WIDTH XSCALE) (TIMES HEIGHT YSCALE) (QUOTE ERASE)) (* ;; "Add grid") (if (WINDOWPROP WINDOW (QUOTE GRIDON)) then (if (OR (NEQ ORIGX (CAR GRIDSPEC)) (NEQ ORIGY (CADR GRIDSPEC))) then (SETQ GRIDSPEC (COPYALL GRIDSPEC)) (replace (REGION LEFT) of GRIDSPEC with (LEFTOFGRIDCOORD ORIGX GRIDSPEC)) (replace (REGION BOTTOM) of GRIDSPEC with (BOTTOMOFGRIDCOORD ORIGY GRIDSPEC))) (GRID GRIDSPEC WIDTH HEIGHT (QUOTE POINT) WINDOW]) ) (DEFINEQ (SCALEBM [LAMBDA (SRCEBM SRCEX SRCEY DESTBM DESTX DESTY SRCEWIDTH SRCEHEIGHT XSCALE YSCALE TEMPBM) (* N.H.Briggs " 4-Sep-87 15:48") (* ;;   "Magnify a bitmap as per EDITBM. Use smearing algorithm.") (LET ((DESTWIDTH (BITMAPWIDTH DESTBM)) (DESTHEIGHT (if (WINDOWP DESTBM) then (WINDOWPROP DESTBM (QUOTE HEIGHT)) else (BITMAPHEIGHT DESTBM))) XSTEPS YSTEPS POWER) (* ;; "Check parameters, apply defaults") (if (NUMBERP SRCEWIDTH) else (SETQ SRCEWIDTH (BITMAPWIDTH SRCEBM))) (if (NUMBERP SRCEHEIGHT) else (SETQ SRCEHEIGHT (BITMAPHEIGHT SRCEBM))) (* ;;  "Save effort by considering min of srce and dest.") (SETQ DESTWIDTH (MIN DESTWIDTH (TIMES SRCEWIDTH XSCALE))) (SETQ DESTHEIGHT (MIN DESTHEIGHT (TIMES SRCEHEIGHT YSCALE))) (SETQ SRCEWIDTH (MIN SRCEWIDTH (IQUOTIENT DESTWIDTH XSCALE))) (SETQ SRCEHEIGHT (MIN SRCEHEIGHT (IQUOTIENT DESTHEIGHT YSCALE))) (if TEMPBM then (BLTSHADE WHITESHADE TEMPBM) else (SETQ TEMPBM (BITMAPCREATE DESTWIDTH SRCEHEIGHT))) (* ;;   "CALL EXPANDBM twice, once for each direction, because we have a spare bitmap which makes it run faster than a single call to EXPANDBM would (I think)." ) (* ;; "") (* ;; "Do X Direction Smearing.") (* ;; "============") (EXPANDBM SRCEBM SRCEX SRCEY SRCEWIDTH SRCEHEIGHT TEMPBM 0 0 DESTWIDTH SRCEHEIGHT XSCALE 1 XSCALE 1) (* ;; "") (* ;; "Do Y Direction Smearing.") (* ;; "============") (EXPANDBM TEMPBM 0 0 DESTWIDTH SRCEHEIGHT DESTBM DESTX DESTY DESTWIDTH DESTHEIGHT 1 YSCALE 1 YSCALE) (* ;; "") (* ;;  "Return the temporary bitmap for recycling purposes.") TEMPBM]) (BLTPATTERN [LAMBDA (SRCE SX SY SW SH DEST DX DY DW DH OPER TEMPBM) (* N.H.Briggs " 4-Sep-87 15:10") (* ;;   "Fills region of Destination with tiles of Source region, using operation. If Temporary bitmap is provided, use it for optimal performance." ) (PROG (W H RX RW) (if (NULL SW) then (SETQ SW (BITMAPWIDTH SRCE))) (if (NULL SH) then (SETQ SH (BITMAPHEIGHT SRCE))) (* ;; "") (* ;; "Fill columns ") (* ;; "") [if TEMPBM then (* ;;   "Temporary bitmap is only useful if larger than source.") (if [AND (GREATERP (BITMAPWIDTH TEMPBM) (MIN SW (BITMAPWIDTH SRCE))) (GREATERP (BITMAPHEIGHT TEMPBM) (MIN SH (BITMAPHEIGHT SRCE] then (BLTPATTERN.REPLACEDISPLAY SRCE SX SY SW SH TEMPBM 0 0 (BITMAPWIDTH TEMPBM) (BITMAPHEIGHT TEMPBM)) (* ;;   "Allow code to fall through using TEMPBM as source area.") (SETQ SRCE TEMPBM) (SETQ SX 0) (SETQ SY 0) (SETQ SW (ITIMES SW (IQUOTIENT (BITMAPWIDTH TEMPBM) SW))) (SETQ SH (ITIMES SH (IQUOTIENT (BITMAPHEIGHT TEMPBM) SH] (if (AND (EQ OPER (QUOTE REPLACE)) (OR (BITMAPP DEST) (WINDOWP DEST))) then (BLTPATTERN.REPLACEDISPLAY SRCE SX SY SW SH DEST DX DY DW DH) (RETURN)) (* ;;   "Even if operation is REPLACE, don't know if destination is inexpensively readable (e.g. Interpress stream. SO, this is the general case here." ) (while (GREATERP DH 0) do (SETQ H (MIN SH DH)) (* ;; "") (SETQ RW DW) (SETQ RX DX) (* ;; "") (* ;; "Fill rows") (* ;; "") (while (GREATERP RW 0) do (SETQ W (MIN SW RW)) (BITBLT SRCE SX SY DEST RX DY W H NIL OPER) (SETQ RW (DIFFERENCE RW W)) (SETQ RX (PLUS RX W))) (* ;; "") (SETQ DH (DIFFERENCE DH H)) (SETQ DY (PLUS DY H]) (BLTPATTERN.REPLACEDISPLAY [LAMBDA (SRCE SX SY SW SH DEST DX DY DW DH) (* N.H.Briggs " 4-Sep-87 15:11") (* ;;   "This routine only replaces the destination with the source, and assumes the destination itself can be easily read from and blt'ed to." ) (* ;;   "Put initial bitmap into destination. Source should not be within destination area, otherwise it will be overwritten." ) (LET (RX RY RW RH W H) (* ; "R's are remaining area.") (SETQ W (MIN SW DW)) (SETQ H (MIN SH DH)) (BLTSHADE WHITESHADE DEST DX DY W H (QUOTE REPLACE)) (BITBLT SRCE SX SY DEST DX DY W H NIL (QUOTE REPLACE)) (SETQ RX (PLUS DX W)) (SETQ RW (DIFFERENCE DW W)) (* ;; "Now power up until width is full.") (while (GREATERP RW 0) do (SETQ W (MIN SW RW)) (BITBLT DEST DX DY DEST RX DY W H NIL (QUOTE REPLACE)) (SETQ RW (DIFFERENCE RW W)) (* ; "Reduce remaining width") (SETQ RX (PLUS RX W)) (* ; "Set next starting position") (SETQ SW (PLUS SW SW)) (* ; "Can now use 2x area.")) (* ;; "") (SETQ RY (PLUS DY H)) (SETQ RH (DIFFERENCE DH H)) (SETQ SH H) (SETQ W DW) (* ;; "Now power up until height is full.") (while (GREATERP RH 0) do (SETQ H (MIN SH RH)) (BITBLT DEST DX DY DEST DX RY W H NIL (QUOTE REPLACE)) (SETQ RH (DIFFERENCE RH H)) (* ; "Reduce remaining width") (SETQ RY (PLUS RY H)) (* ; "Set next starting position") (SETQ SH (PLUS SH SH)) (* ; "Can now use 2x area.")]) ) (DEFINEQ (EXPANDBITMAP [LAMBDA (BITMAP WIDTHFACTOR HEIGHTFACTOR) (* N.H.Briggs "16-Nov-87 17:10") (* ;;   "Returns a new bitmap which is WidthFactor and HeightFactor bigger.") (* ;;   "FS: This slow piece of code has been replaced with a much faster, general one, EXPAND.l ") (LET (WIDTH HEIGHT BITSPERPIXEL NEWWIDTH NEWHEIGHT NEWX NEWY NEWBITMAP) (OR WIDTHFACTOR (SETQ WIDTHFACTOR 1)) (OR HEIGHTFACTOR (SETQ HEIGHTFACTOR 1)) (SETQ HEIGHT (fetch (BITMAP BITMAPHEIGHT) of BITMAP)) (SETQ WIDTH (fetch (BITMAP BITMAPWIDTH) of BITMAP)) (SETQ BITSPERPIXEL (fetch (BITMAP BITMAPBITSPERPIXEL) of BITMAP)) (SETQ NEWWIDTH (ITIMES WIDTHFACTOR WIDTH)) (SETQ NEWHEIGHT (ITIMES HEIGHTFACTOR HEIGHT)) (SETQ NEWBITMAP (BITMAPCREATE NEWWIDTH NEWHEIGHT BITSPERPIXEL)) (* ;; "OLD code commented out here.") (* LET NIL (* Expand in x-direction. *) (SETQ NEWX 0) (for X from 0 to (SUB1 WIDTH) do (for I from 1 to WIDTHFACTOR do (BITBLT BITMAP X 0 NEWBITMAP NEWX 0 1 HEIGHT (QUOTE INPUT) (QUOTE REPLACE)) (add NEWX 1)))  (* Expand in y-direction. *) (SETQ NEWY (SUB1 NEWHEIGHT)) (for Y from (SUB1 HEIGHT) to 0 by -1 do  (for I from 1 to HEIGHTFACTOR do (BITBLT NEWBITMAP 0 Y NEWBITMAP 0 NEWY NEWWIDTH 1 (QUOTE INPUT)  (QUOTE REPLACE)) (add NEWY -1)))) (EXPANDBM BITMAP 0 0 WIDTH HEIGHT NEWBITMAP 0 0 NEWWIDTH NEWHEIGHT WIDTHFACTOR HEIGHTFACTOR WIDTHFACTOR HEIGHTFACTOR) NEWBITMAP]) (EXPANDBM [LAMBDA (SRCEBM SRCEX SRCEY SRCEW SRCEH DESTBM DESTX DESTY DESTW DESTH XSCALE YSCALE XSPACE YSPACE) (* N.H.Briggs " 4-Sep-87 15:18") (* ;;   "Expands a region of SrceBM by X&Y scale into a region of DestBM, spaced Xspace by YSpace apart (space must be larger than scale). SrceBM cannot be the same bitmap as DestBM. The entire region inside DestBM is cleared." ) (PROG (XSTEPS YSTEPS POWER) (* ;; "Check parameters, apply defaults") (if (NUMBERP SRCEX) else (SETQ SRCEX 0)) (if (NUMBERP SRCEY) else (SETQ SRCEY 0)) (if (NUMBERP SRCEW) else (SETQ SRCEW (BITMAPWIDTH SRCEBM))) (if (NUMBERP SRCEH) else (SETQ SRCEH (BITMAPHEIGHT SRCEBM))) (if (NUMBERP DESTX) else (SETQ SRCEX 0)) (if (NUMBERP DESTY) else (SETQ SRCEY 0)) (* ;;  "Save effort by considering min of srce and dest.") [SETQ DESTW (IMIN DESTW (TIMES SRCEW (IMAX XSCALE XSPACE] [SETQ DESTH (IMIN DESTH (TIMES SRCEH (IMAX YSCALE YSPACE] [SETQ SRCEW (IMIN SRCEW (PLUS 1 (IQUOTIENT DESTW (IMAX XSCALE XSPACE] [SETQ SRCEH (IMIN SRCEH (PLUS 1 (IQUOTIENT DESTH (IMAX YSCALE YSPACE] (BLTSHADE WHITESHADE DESTBM DESTX DESTY DESTW DESTH) (if (AND (EQP XSPACE 1) (EQP YSPACE 1)) then (BITBLT SRCEBM SRCEX SRCEY DESTBM DESTX DESTY SRCEW SRCEH) (RETURN DESTBM)) (* ;; "") (* ;; "Do X Direction Smearing.") (* ;; "============") (* ;;   "Spread out bitmap by spacefactor. Start from far side to avoid overwrite (if srce = dest)") (if (EQP XSPACE 1) then (* ;;   "Don't fill destination, instead use srce in YSmear loop.") (* ;;   "(BITBLT SRCEBM SRCEX SRCEY DESTBM DESTX DESTY SRCEW SRCEH)") else (* ;;   "Spread out bitmap by spacefactor. Start from far side to avoid overwrite (if srce = dest)") (for I from (SUB1 SRCEW) to 0 by -1 do (BITBLT SRCEBM (PLUS SRCEX I) SRCEY DESTBM (PLUS DESTX (TIMES I XSPACE)) DESTY 1 SRCEH))) (* ;;   "Now smear by scalefactor. Each step smears out a power of two. LSH is in ucode.") [if (EQP XSCALE 1) else (SETQ POWER 1) (while (ILEQ POWER (LSH XSCALE -1)) do (* ;;   "In the X direction, only need to blt SRCEH bits high, and must shorten W to remain within DESTW") (BITBLT DESTBM DESTX DESTY DESTBM (PLUS DESTX POWER) DESTY (DIFFERENCE DESTW POWER) SRCEH NIL (QUOTE PAINT)) (SETQ POWER (PLUS POWER POWER))) (* ;; "Clean up for non power of two.") (if (ZEROP (DIFFERENCE XSCALE POWER)) else (BITBLT DESTBM DESTX DESTY DESTBM (PLUS DESTX (DIFFERENCE XSCALE POWER)) DESTY (DIFFERENCE DESTW (DIFFERENCE XSCALE POWER)) SRCEH NIL (QUOTE PAINT] (* ;; "") (* ;; "Do Y Direction Smearing.") (* ;; "============") (* ;;   "Spread out bitmap by spacefactor. Start from far side to avoid overwrite (if srce = dest)") [if (EQP YSPACE 1) else (if (EQP XSPACE 1) then (* ;;   "Didn't need to paint in destination, so can avoid second loop by blting from SRCBM instead of DESTBM.") (for J from (SUB1 SRCEH) to 0 by -1 do (BITBLT SRCEBM SRCEX (PLUS SRCEY J) DESTBM DESTX (PLUS DESTY (TIMES J YSPACE)) DESTW 1)) else (for J from (SUB1 SRCEH) to 0 by -1 do (BITBLT DESTBM DESTX (PLUS DESTY J) DESTBM DESTX (PLUS DESTY (TIMES J YSPACE)) DESTW 1)) (* ;;   "Since we reused DESTBM, parts of the dest have bits in them but shouldn't. So, clear them.") (for J from 0 to SRCEH by YSPACE do (BLTSHADE WHITESHADE DESTBM DESTX (PLUS DESTY J 1) DESTW (SUB1 YSPACE] (* ;;   "Now smear correctly. Each step smears out a power of two. LSH is in ucode.") [if (EQP YSCALE 1) else (SETQ POWER 1) (while (ILEQ POWER (LSH YSCALE -1)) do (BITBLT DESTBM DESTX DESTY DESTBM DESTX (PLUS DESTY POWER) DESTW (DIFFERENCE DESTH POWER) NIL (QUOTE PAINT)) (SETQ POWER (PLUS POWER POWER))) (* ;; "Clean up for non power of two.") (if (ZEROP (DIFFERENCE YSCALE POWER)) else (BITBLT DESTBM DESTX DESTY DESTBM DESTX (PLUS DESTY (DIFFERENCE YSCALE POWER)) DESTW DESTH NIL (QUOTE PAINT] (* ;; "") (* ;;  "Return the temporary bitmap for recycling purposes.") DESTBM]) ) (PUTPROPS FASTEDITBM COPYRIGHT ("Xerox Corporation" 1987)) (DECLARE: DONTCOPY (FILEMAP (NIL (1041 4849 (GRID 1051 . 4847)) (4850 52348 (EDITBM 4860 . 13712) (EDITBMCLOSEFN 13714 . 14345) (TILEAREA 14347 . 14779) (EDITBMBUTTONFN 14781 . 29731) (EDITBMSCROLLFN 29733 . 40923) ( \EDITBM/PUTUP/DISPLAY 40925 . 41674) (EDITBMRESHAPEFN 41676 . 47657) (EDITBMREPAINTFN.NEW 47659 . 47983) (EDITBMREPAINTFN 47985 . 49598) (RESETGRID.NEW 49600 . 52346)) (52349 59854 (SCALEBM 52359 . 54995) (BLTPATTERN 54997 . 57709) (BLTPATTERN.REPLACEDISPLAY 57711 . 59852)) (59855 68063 ( EXPANDBITMAP 59865 . 61694) (EXPANDBM 61696 . 68061))))) STOP \ No newline at end of file diff --git a/lispusers/FILECACHE-FIX b/lispusers/FILECACHE-FIX new file mode 100644 index 00000000..18ccf223 --- /dev/null +++ b/lispusers/FILECACHE-FIX @@ -0,0 +1 @@ +(FILECREATED " 4-Aug-86 12:54:12" {PHYLUM}FILECACHE>FILECACHE-FIX.;1 692 changes to: (VARS FILECACHE-FIXCOMS) (FNS \New-FLUSHRIGHT) (ADVICE TAB-IN-FLUSHRIGHT)) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT FILECACHE-FIXCOMS) (RPAQQ FILECACHE-FIXCOMS ((* * A patch for the FILECACHE, v 5.2) (ADVISE TAB-IN-FLUSHRIGHT))) (* * A patch for the FILECACHE, v 5.2) (PUTPROPS TAB-IN-FLUSHRIGHT READVICE [(FLUSHRIGHT . TAB) (BEFORE NIL (COND ((GEQ POS 1000000) (SETQ POS 0]) (READVISE TAB-IN-FLUSHRIGHT) (PUTPROPS FILECACHE-FIX COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/FILENAMES b/lispusers/FILENAMES new file mode 100644 index 00000000..79b31804 --- /dev/null +++ b/lispusers/FILENAMES @@ -0,0 +1 @@ +(FILECREATED "12-Mar-85 14:02:50" {ERIS}LIBRARY>FILENAMES.;1 18342 changes to: (VARS FILENAMESCOMS)) (* Copyright (c) 1985 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT FILENAMESCOMS) (RPAQQ FILENAMESCOMS ((FNS REPACKFILENAME.STRING REPACKFILENAME.STRING.D REPACKFILENAME.STRING.LISPM REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.UNIX))) (DEFINEQ (REPACKFILENAME.STRING [LAMBDA (NAME FOROSTYPE) (* edited: "12-Mar-85 13:51") (LET ((NAMELST (UNPACKFILENAME.STRING NAME))) (SELECTQ FOROSTYPE (UNIX (REPACKFILENAME.STRING.UNIX NAMELST)) ((TOPS20 TOPS-20) (REPACKFILENAME.STRING.TOPS20 NAMELST)) ((LISPM 3600 SYMBOLICS) (REPACKFILENAME.STRING.LISPM NAMELST)) ((D IFS) (REPACKFILENAME.STRING.D NAMELST)) NAME]) (REPACKFILENAME.STRING.D [LAMBDA N (* ejs: " 9-Mar-85 16:02") (* * Convert file names to native format) (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.D) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error checking of fields) (REPACKFILENAME.STRING.D VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) [HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP] [DIRECTORY (* DIRECTORY really is treated as  {Host}device:) (for X on (UNPACKFILENAME.STRING VAL NIL T) by (CDDR X) do (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] [(DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP] (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (: (LIST DEVICE)) (LIST DEVICE (QUOTE :] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE %.] (RPLCHARCODE DIRECTORY C (CHARCODE >] (LIST "<" DIRECTORY ">"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T (QUOTE %.))) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST (QUOTE ;) VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST (QUOTE ;) (SUBSTRING VERSION 2 -1))) (LIST (QUOTE ;) VERSION]) (REPACKFILENAME.STRING.LISPM [LAMBDA N (* ejs: "23-Feb-85 17:19") (* * Can you believe this???) (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.LISPM) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error checking of fields) (REPACKFILENAME.STRING.LISPM VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) [HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP] [DIRECTORY (* DIRECTORY really is treated as  {Host}device:) (for X on (UNPACKFILENAME.STRING VAL NIL T) by (CDDR X) do (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] [(DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP] (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (: (LIST DEVICE)) (LIST DEVICE (QUOTE :] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE %.] (RPLCHARCODE DIRECTORY C (CHARCODE >] (LIST ">" DIRECTORY ">"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T (QUOTE %.))) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST (QUOTE %.) VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST (QUOTE %.) (SUBSTRING VERSION 2 -1))) (LIST (QUOTE %.) VERSION]) (REPACKFILENAME.STRING.TOPS20 [LAMBDA N (* ejs: "23-Feb-85 17:20") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.TOPS20) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION TEMPORARY PROTECTION ACCOUNT PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION TEMPORARY PROTECTION ACCOUNT)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error checking of fields) (REPACKFILENAME.STRING.TOPS20 VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) [HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP] [DIRECTORY (* DIRECTORY really is treated as  {Host}device:) (for X on (UNPACKFILENAME.STRING VAL NIL T) by (CDDR X) do (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] [(DEVICE HOST NAME EXTENSION VERSION TEMPORARY) (OR (EVALV VAR) (SET VAR (OR VAL BLIP] (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (SELECTQ TEMPORARY [(T S ;S) (* hack for Interlisp-D!) (OR HOST DEVICE (PROGN (SETQ HOST (QUOTE CORE)) (SETQ TEMPORARY] NIL) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (: (LIST DEVICE)) (LIST DEVICE (QUOTE :] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE DIRECTORY C (CHARCODE %.] (LIST "<" DIRECTORY ">"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T (QUOTE %.))) (OR EXTENSION BLIP))) [AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST (QUOTE %.) VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST (QUOTE %.) (SUBSTRING VERSION 2 -1))) (LIST (QUOTE %.) VERSION] (AND TEMPORARY (NEQ TEMPORARY BLIP) (LIST (QUOTE ;) (SELECTQ TEMPORARY ((S ;S) (QUOTE S)) T]) (REPACKFILENAME.STRING.UNIX [LAMBDA N (* ejs: "23-Feb-85 17:20") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.UNIX) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error checking of fields) (REPACKFILENAME.STRING.UNIX VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) [HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP] [DIRECTORY (* DIRECTORY really is treated as  {Host}device:) (for X on (UNPACKFILENAME.STRING VAL NIL T) by (CDDR X) do (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] [(DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP] (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) (AND DEVICE (NEQ DEVICE BLIP) (LIST "/" DEVICE)) (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE %.] (RPLCHARCODE DIRECTORY C (CHARCODE /] (LIST "/" DIRECTORY "/")) (LIST "/" DIRECTORY "/")) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((OR (AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) (OR (NULL EXTENSION) (EQ EXTENSION BLIP) (STREQUAL EXTENSION ""))) BLIP) (T (QUOTE %.))) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST (QUOTE ;) VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST (QUOTE ;) (SUBSTRING VERSION 2 -1))) (LIST (QUOTE ;) VERSION]) ) (PRETTYCOMPRINT FILENAMESCOMS) (RPAQQ FILENAMESCOMS [(FNS REPACKFILENAME.STRING REPACKFILENAME.STRING.D REPACKFILENAME.STRING.LISPM REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.UNIX) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA REPACKFILENAME.STRING.UNIX REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.LISPM REPACKFILENAME.STRING.D]) (DECLARE: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA REPACKFILENAME.STRING.UNIX REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.LISPM REPACKFILENAME.STRING.D) ) (PUTPROPS FILENAMES COPYRIGHT ("Xerox Corporation" 1985)) (DECLARE: DONTCOPY (FILEMAP (NIL (399 17562 (REPACKFILENAME.STRING 409 . 894) (REPACKFILENAME.STRING.D 896 . 4912) ( REPACKFILENAME.STRING.LISPM 4914 . 8979) (REPACKFILENAME.STRING.TOPS20 8981 . 13473) ( REPACKFILENAME.STRING.UNIX 13475 . 17560))))) STOP \ No newline at end of file diff --git a/lispusers/FILEWATCH b/lispusers/FILEWATCH new file mode 100644 index 00000000..339ed340 --- /dev/null +++ b/lispusers/FILEWATCH @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP" BASE 10) (FILECREATED "20-Oct-89 17:00:03" {ICE}LISPUSERS>MEDLEY>FILEWATCH.;2 63422 changes to%: (VARS FILEWATCHCOMS) (FNS FILEWATCH FW-CLOSE-CMD FW-INIT-MENUS) previous date%: "19-Oct-87 12:36:56" {ICE}LISPUSERS>MEDLEY>FILEWATCH.;1) (* " Copyright (c) 1986, 1987, 1989 by Johannes A. G. M. Koomen. All rights reserved. ") (PRETTYCOMPRINT FILEWATCHCOMS) (RPAQQ FILEWATCHCOMS [(PROP MAKEFILE-ENVIRONMENT FILEWATCH) (* ;;; "FILEWATCH is a facility for keeping an eye on the status of open files. It maintains a display containing the names of open files and their file pointer positions including a percentage bar.") (* ;;; "Interface") (FNS FILEWATCH FILEWATCHPROP) (* ;;; "Implementation") (COMS (DECLARE%: DONTCOPY (RECORDS FW-OFD)) (INITRECORDS FW-OFD)) (FNS FW-ADJUST-PLACEMENT FW-ADJUST-REGION FW-AFTERMOVEFN FW-BUTTONEVENTFN FW-CHANGE-ANCHOR FW-CHANGE-JUSTIFICATION FW-CHANGE-POSITION FW-CLOSE-CMD FW-CLOSE-OLD-OFD-WINDOWS FW-CLOSEFN FW-CREATE-OFD FW-CREATE-OFD-LIST FW-CREATE-OFD-WINDOWS FW-CREATEW FW-FILTERED-FILE? FW-FORGET-CMD FW-INIT FW-INIT-MENUS FW-INIT-PROPS FW-INTERACT FW-LOOP FW-MOVE-OFD-WINDOWS FW-MOVEW FW-OFD-EXISTS? FW-OPENP FW-PERCENTAGE FW-RE-INIT FW-RECALL-CMD FW-REPAINTFN FW-RESET FW-RESIZE-OFD FW-SHAPEW FW-SORT-FN FW-UPDATE-OFD-WINDOW FW-UPDATE-OFD-WINDOWS FW-WIPE) [DECLARE%: DONTCOPY DONTEVAL@LOAD EVAL@COMPILE (* FILES (SOURCE FROM LISPUSERS) SYSEDIT) (P [OR (HASDEF 'FDEV 'RECORDS 'CURRENT) (EVAL (SYSRECLOOK1 'FDEV] (OR (HASDEF 'STREAM 'RECORDS 'CURRENT) (EVAL (SYSRECLOOK1 'STREAM] [INITVARS (FW-OFDList NIL) (FW-OpenP-ScratchList (CONS)) [FW-Commands (COPY '(FORGET FORGET-MANY RECALL RECALL-MANY CLOSE CLOSE-MANY MOVE SET-ANCHOR SET-POSITION SET-JUSTIFICATION QUIT] (FW-Properties (COPY `(FONT (GACHA 8) ALL-FILES? T POSITION ,(CREATEPOSITION SCREENWIDTH 0) ANCHOR BOTTOM-RIGHT SHADE ,GRAYSHADE INTERVAL 1000] (P (FW-INIT-MENUS)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA FILEWATCHPROP]) (PUTPROPS FILEWATCH MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10)) (* ;;; "FILEWATCH is a facility for keeping an eye on the status of open files. It maintains a display containing the names of open files and their file pointer positions including a percentage bar." ) (* ;;; "Interface") (DEFINEQ (FILEWATCH [LAMBDA (COMMAND) (* ; "Edited 20-Oct-89 16:43 by koomen") (DECLARE (GLOBALVARS FW-Running?)) (PROG [(FW-PROC (FIND.PROCESS 'FileWatcher] (if (OR (NOT (PROCESSP FW-PROC)) (PROCESS.FINISHEDP FW-PROC)) then (SETQ FW-PROC NIL)) (SELECTQ (SELECTQ [if (OR (LITATOM COMMAND) (STRINGP COMMAND)) then (SETQ COMMAND (MKATOM (U-CASE COMMAND] (ON (if (NULL FW-PROC) then 'ON)) ((OFF QUIT) (if FW-PROC then (SETQ COMMAND 'OFF))) (MENU (SETQ COMMAND NIL) 'MENU) (if (OR COMMAND FW-PROC) then 'MENU else 'ON)) (ON (SETQ FW-PROC (ADD.PROCESS (LIST (FUNCTION FW-LOOP)) 'NAME 'FileWatcher 'RESTARTABLE 'HARDRESET))) (OFF (SETQ FW-PROC (SETQ FW-Running? NIL))) (MENU (if (NULL FW-PROC) then (FILEWATCH 'ON) (BLOCK)) (FW-INTERACT NIL COMMAND)) NIL) (RETURN FW-PROC]) (FILEWATCHPROP [LAMBDA FILEWATCH#ARGS (* Koomen "12-Jan-87 21:31") (DECLARE (GLOBALVARS FW-Properties FW-ReInit?)) (if (EQ FILEWATCH#ARGS 1) then (LET ((PROPNAME (ARG FILEWATCH#ARGS 1))) (LISTGET FW-Properties PROPNAME)) elseif (EQ FILEWATCH#ARGS 2) then (LET* ((PROPNAME (ARG FILEWATCH#ARGS 1)) (PROPVALUE (ARG FILEWATCH#ARGS 2)) (OLDPROPVALUE (LISTGET FW-Properties PROPNAME))) (if (NOT (EQUAL PROPVALUE OLDPROPVALUE)) then (LISTPUT FW-Properties PROPNAME PROPVALUE) (SETQ FW-ReInit? T)) OLDPROPVALUE) else (ERROR "FILEWATCH: Expecting 1 or 2 args -- " FILEWATCH#ARGS]) ) (* ;;; "Implementation") (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (DATATYPE FW-OFD (FILESTREAM FULLNAME NAMEWIDTH LEFT BOTTOM WIDTH HEIGHT OFDLEFT OFDBOTTOM OFDWIDTH OFDHEIGHT OFDWINDOW OFDSTREAM OFDSTATUS CURPOS EOFPOS PCTPOS CURPOSXOFFSET EOFPOSXOFFSET PCTPOSXOFFSET ACCESSXOFFSET PCTREGION READING? WRITING? RANDOM?)) ) (/DECLAREDATATYPE 'FW-OFD '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((FW-OFD 0 POINTER) (FW-OFD 2 POINTER) (FW-OFD 4 POINTER) (FW-OFD 6 POINTER) (FW-OFD 8 POINTER) (FW-OFD 10 POINTER) (FW-OFD 12 POINTER) (FW-OFD 14 POINTER) (FW-OFD 16 POINTER) (FW-OFD 18 POINTER) (FW-OFD 20 POINTER) (FW-OFD 22 POINTER) (FW-OFD 24 POINTER) (FW-OFD 26 POINTER) (FW-OFD 28 POINTER) (FW-OFD 30 POINTER) (FW-OFD 32 POINTER) (FW-OFD 34 POINTER) (FW-OFD 36 POINTER) (FW-OFD 38 POINTER) (FW-OFD 40 POINTER) (FW-OFD 42 POINTER) (FW-OFD 44 POINTER) (FW-OFD 46 POINTER) (FW-OFD 48 POINTER)) '50) ) (/DECLAREDATATYPE 'FW-OFD '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER) '((FW-OFD 0 POINTER) (FW-OFD 2 POINTER) (FW-OFD 4 POINTER) (FW-OFD 6 POINTER) (FW-OFD 8 POINTER) (FW-OFD 10 POINTER) (FW-OFD 12 POINTER) (FW-OFD 14 POINTER) (FW-OFD 16 POINTER) (FW-OFD 18 POINTER) (FW-OFD 20 POINTER) (FW-OFD 22 POINTER) (FW-OFD 24 POINTER) (FW-OFD 26 POINTER) (FW-OFD 28 POINTER) (FW-OFD 30 POINTER) (FW-OFD 32 POINTER) (FW-OFD 34 POINTER) (FW-OFD 36 POINTER) (FW-OFD 38 POINTER) (FW-OFD 40 POINTER) (FW-OFD 42 POINTER) (FW-OFD 44 POINTER) (FW-OFD 46 POINTER) (FW-OFD 48 POINTER)) '50) (DEFINEQ (FW-ADJUST-PLACEMENT [LAMBDA (OFDLIST) (* Koomen "12-Jan-87 21:19") (* * Recursively (post-order) position each window, so that the first element  ends up on top of the display. Note that, for downward-growing lists, the  sorter actually forces reverse sort.) (DECLARE (GLOBALVARS FW-WindowBottom FW-WindowBottomDelta)) (if OFDLIST then (FW-ADJUST-PLACEMENT (CDR OFDLIST)) (PROG ((OFD (CAR OFDLIST))) (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) ((NEW CURRENT) (replace (FW-OFD BOTTOM) of OFD with FW-WindowBottom) (if (OR (NEQ (fetch (FW-OFD OFDWIDTH) of OFD) (fetch (FW-OFD WIDTH) of OFD)) (NEQ (fetch (FW-OFD OFDHEIGHT) of OFD) (fetch (FW-OFD HEIGHT) of OFD))) then (FW-SHAPEW OFD) (replace (FW-OFD OFDSTATUS) of OFD with 'NEW) elseif (OR (NEQ (fetch (FW-OFD LEFT) of OFD) (fetch (FW-OFD OFDLEFT) of OFD)) (NEQ (fetch (FW-OFD BOTTOM) of OFD) (fetch (FW-OFD OFDBOTTOM) of OFD))) then (FW-MOVEW OFD)) (SETQ FW-WindowBottom (IPLUS FW-WindowBottom FW-WindowBottomDelta))) (FORGOTTEN) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD]) (FW-ADJUST-REGION [LAMBDA NIL (* Koomen "12-Jan-87 21:29") (DECLARE (GLOBALVARS FW-Anchor FW-Justified? FW-OFDList FW-Position FW-WindowBottom FW-WindowBottomDelta FW-WindowHeight WBorder)) [if FW-Justified? then (* Recompute maximum name field  width) (PROG (NAMEWIDTH (MAXNAMEWIDTH 0)) [for OFD in FW-OFDList do (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) ((NEW CURRENT) (SETQ NAMEWIDTH (fetch (FW-OFD NAMEWIDTH) of OFD)) (if (IGREATERP NAMEWIDTH MAXNAMEWIDTH) then (SETQ MAXNAMEWIDTH NAMEWIDTH))) (FORGOTTEN) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS ) of OFD] (for OFD in FW-OFDList do (FW-RESIZE-OFD OFD MAXNAMEWIDTH] (SETQ FW-WindowBottom (fetch (POSITION YCOORD) of FW-Position)) (SETQ FW-WindowBottomDelta (IDIFFERENCE FW-WindowHeight (IQUOTIENT WBorder 2))) (SELECTQ FW-Anchor ((TOP-LEFT TOP-RIGHT) (SETQ FW-WindowBottom (IDIFFERENCE FW-WindowBottom FW-WindowHeight)) (SETQ FW-WindowBottomDelta (IMINUS FW-WindowBottomDelta))) ((BOTTOM-LEFT BOTTOM-RIGHT)) (ERROR "Unsupported anchor spec: " FW-Anchor]) (FW-AFTERMOVEFN [LAMBDA (W) (* ; "Edited 30-Sep-87 11:53 by Koomen") (* ;; "[30-Sep-87] Added FW-Dormant? flag: If moving a FileWatch window causes the FileWatch anchor position to move off the screen, then go to sleep. This is to accomodate the Rooms package.") (DECLARE (GLOBALVARS FW-Dormant? FW-OFDList SCREENHEIGHT SCREENWIDTH)) (SETQ FW-Dormant? NIL) (if (NEQ 'FileWatcher (PROCESS.NAME (THIS.PROCESS))) then (for OFD in FW-OFDList when (EQ W (fetch (FW-OFD OFDWINDOW) of OFD)) bind REGION DELTAX DELTAY OLDPOS NEWX NEWY do (SETQ OLDPOS (FILEWATCHPROP 'POSITION)) (SETQ REGION (WINDOWREGION W)) (SETQ DELTAX (IDIFFERENCE (fetch (REGION LEFT) of REGION) (fetch (FW-OFD OFDLEFT) of OFD))) (SETQ NEWX (IPLUS DELTAX (fetch (POSITION XCOORD) of OLDPOS))) (SETQ DELTAY (IDIFFERENCE (fetch (REGION BOTTOM) of REGION) (fetch (FW-OFD OFDBOTTOM) of OFD))) (SETQ NEWY (IPLUS DELTAY (fetch (POSITION YCOORD) of OLDPOS))) (if (OR (ILESSP NEWX 0) (IGREATERP NEWX SCREENWIDTH) (ILESSP NEWY 0) (IGREATERP NEWY SCREENHEIGHT)) then (SETQ FW-Dormant? T) else (FILEWATCHPROP 'POSITION (create POSITION XCOORD _ NEWX YCOORD _ NEWY))) (RETURN]) (FW-BUTTONEVENTFN [LAMBDA (W) (* Koomen "16-Apr-87 15:28") (DECLARE (GLOBALVARS LASTMOUSEBUTTONS)) (if (MOUSESTATE (ONLY RIGHT)) then (FW-INTERACT W) elseif (MOUSESTATE (ONLY MIDDLE)) then (FW-MOVE-OFD-WINDOWS 'POSITION) elseif (MOUSESTATE (ONLY LEFT)) then (FW-REPAINTFN W)) NIL]) (FW-CHANGE-ANCHOR [LAMBDA NIL (* Koomen "16-Apr-87 15:55") (DECLARE (GLOBALVARS PROMPTWINDOW)) (PROG [NEWANCHOR (OLDANCHOR (FILEWATCHPROP 'ANCHOR] (CLRPROMPT) (printout PROMPTWINDOW "Current anchor is " OLDANCHOR T T) (printout PROMPTWINDOW "Indicate new anchor: ") [SETQ NEWANCHOR (MENU (create MENU CENTERFLG _ T TITLE _ "Anchor: " ITEMS _ '(("Top Left" 'TOP-LEFT) ("Top Right" 'TOP-RIGHT) ("Bottom Left" 'BOTTOM-LEFT) ("Bottom Right" 'BOTTOM-RIGHT] (if (AND NEWANCHOR (NEQ NEWANCHOR OLDANCHOR)) then (FILEWATCHPROP 'ANCHOR NEWANCHOR]) (FW-CHANGE-JUSTIFICATION [LAMBDA NIL (* Koomen "16-Apr-87 15:55") (DECLARE (GLOBALVARS PROMPTWINDOW)) (PROG [NEWJUST? (OLDJUST? (FILEWATCHPROP 'JUSTIFIED?] (CLRPROMPT) (printout PROMPTWINDOW "Window justification is " OLDJUST? T T) (SETQ NEWJUST? (MOUSECONFIRM "Turn justification on?")) (if (NEQ NEWJUST? OLDJUST?) then (FILEWATCHPROP 'JUSTIFIED? NEWJUST?]) (FW-CHANGE-POSITION [LAMBDA NIL (* Koomen "16-Apr-87 15:48") (DECLARE (GLOBALVARS FW-OFDList PROMPTWINDOW)) (PROG ((OLDPOS (FILEWATCHPROP 'POSITION)) NEWPOS BOX R) (for OFD in FW-OFDList when (EQ (fetch (FW-OFD OFDSTATUS) of OFD) 'CURRENT) do (SETQ R (WINDOWREGION (fetch (FW-OFD OFDWINDOW) of OFD))) (SETQ BOX (if BOX then (UNIONREGIONS BOX R) else R))) (if BOX then (SETQ NEWPOS (GETBOXPOSITION (fetch (REGION WIDTH) of BOX) (fetch (REGION HEIGHT) of BOX) (fetch (REGION LEFT) of BOX) (fetch (REGION BOTTOM) of BOX))) (* ;; "Now translate since anchor may not have been bottom-left") [SETQ NEWPOS (create POSITION XCOORD _ (IPLUS (fetch (POSITION XCOORD) of OLDPOS) (IDIFFERENCE (fetch (POSITION XCOORD) of NEWPOS) (fetch (REGION LEFT) of BOX))) YCOORD _ (IPLUS (fetch (POSITION YCOORD) of OLDPOS) (IDIFFERENCE (fetch (POSITION YCOORD) of NEWPOS) (fetch (REGION BOTTOM) of BOX] else (CLRPROMPT) (printout PROMPTWINDOW "Current position is " OLDPOS T T) (printout PROMPTWINDOW "Indicate new position: ") (SETQ NEWPOS (GETPOSITION))) (if (NOT (EQUAL NEWPOS OLDPOS)) then (FILEWATCHPROP 'POSITION NEWPOS]) (FW-CLOSE-CMD [LAMBDA (W MANY?) (* ; "Edited 20-Oct-89 16:38 by koomen") (DECLARE (GLOBALVARS FW-OFDList)) (if (AND W (NOT MANY?)) then (for OFD in FW-OFDList bind STREAM when (EQ (fetch (FW-OFD OFDWINDOW) of OFD) W) do (SETQ STREAM (fetch (FW-OFD FILESTREAM) of OFD)) (if (NOT (OPENP STREAM)) then (* ;;  "The process owning the stream beat us to it!") elseif (NOT (fetch (STREAM USERCLOSEABLE) of STREAM)) then (PROMPTPRINT "FileWatch: stream not user closable.") elseif (MOUSECONFIRM (CONCAT "Closing " STREAM)) then (CLOSEF? STREAM)) (RETURN)) else (bind OPEN-STREAMS STREAM-TO-CLOSE do (SETQ OPEN-STREAMS (FW-OPENP)) (if (NULL OPEN-STREAMS) then (if (NULL STREAM-TO-CLOSE) then (* ;; "First time around, and no appropriate files") (PROMPTPRINT "FileWatch: no open files.")) (RETURN)) (SETQ OPEN-STREAMS (for STREAM in OPEN-STREAMS when (fetch (STREAM USERCLOSEABLE) of STREAM) collect STREAM)) (if (NULL OPEN-STREAMS) then (if (NULL STREAM-TO-CLOSE) then (* ;; "First time around, and no appropriate files") (PROMPTPRINT "FileWatch: no user closable files.")) (RETURN)) (SETQ STREAM-TO-CLOSE (MENU (create MENU TITLE _ "Select stream to close: " ITEMS _ OPEN-STREAMS))) (if (NULL STREAM-TO-CLOSE) then (RETURN)) (CLOSEF? STREAM-TO-CLOSE) (BLOCK) (* ; "Give FileWatch a chance") (if (NOT MANY?) then (RETURN]) (FW-CLOSE-OLD-OFD-WINDOWS [LAMBDA NIL (* Koomen " 1-Oct-86 23:48") (DECLARE (GLOBALVARS FW-OFDList)) (for OFD in FW-OFDList do (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) (OLD (CLOSEW (fetch (FW-OFD OFDWINDOW) of OFD))) ((NEW CURRENT FORGOTTEN)) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD]) (FW-CLOSEFN [LAMBDA (W) (* Koomen " 2-Oct-86 00:17") (DECLARE (GLOBALVARS FW-OFDList FW-OpenFiles FW-Reset?)) (if (NEQ (PROCESS.NAME (THIS.PROCESS)) 'FileWatcher) then (for OFD in FW-OFDList when (EQ W (fetch (FW-OFD OFDWINDOW) of OFD)) do (replace (FW-OFD OFDSTATUS) of OFD with 'FORGOTTEN) (RETURN)) (* Force recomputing OFDList) (push FW-OpenFiles T) (SETQ FW-Reset? T]) (FW-CREATE-OFD [LAMBDA (FULLNAME FILESTREAM) (* ; "Edited 22-Sep-87 13:04 by Koomen") (DECLARE (GLOBALVARS FW-Font)) (FW-RESIZE-OFD (create FW-OFD FILESTREAM _ FILESTREAM FULLNAME _ FULLNAME NAMEWIDTH _ (STRINGWIDTH FULLNAME FW-Font) EOFPOS _ (if (RANDACCESSP FILESTREAM) then (GETEOFPTR FILESTREAM) else (GETFILEINFO FILESTREAM 'LENGTH)) READING? _ (if (OPENP FILESTREAM 'INPUT) then T) WRITING? _ (if (OPENP FILESTREAM 'OUTPUT) then T) RANDOM? _ (if (RANDACCESSP FILESTREAM) then T) OFDSTATUS _ 'NEW]) (FW-CREATE-OFD-LIST [LAMBDA NIL (* ; "Edited 22-Sep-87 13:34 by Koomen") (DECLARE (GLOBALVARS FW-OFDList FW-OpenFiles FW-SortFn)) (for FILESTREAM in FW-OpenFiles bind FULLNAME eachtime (SETQ FULLNAME (FULLNAME FILESTREAM)) unless (OR (FW-FILTERED-FILE? FULLNAME) (FW-OFD-EXISTS? FULLNAME FILESTREAM)) do (push FW-OFDList (FW-CREATE-OFD FULLNAME FILESTREAM))) [SETQ FW-OFDList (for OFD in FW-OFDList join (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) ((NEW CURRENT FORGOTTEN) (LIST OFD)) (OLD (CLOSEW (fetch (FW-OFD OFDWINDOW) of OFD)) NIL) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD] (if (AND FW-OFDList FW-SortFn) then (SETQ FW-OFDList (SORT FW-OFDList (FUNCTION FW-SORT-FN]) (FW-CREATE-OFD-WINDOWS [LAMBDA NIL (* Koomen "16-Apr-87 15:29") (DECLARE (GLOBALVARS FW-Font FW-OFDList)) (FW-ADJUST-REGION) (for OFD in FW-OFDList bind OFDWINDOW OFDSTREAM unless (fetch (FW-OFD OFDWINDOW ) of OFD) do (SETQ OFDWINDOW (FW-CREATEW OFD)) (SETQ OFDSTREAM (WINDOWPROP OFDWINDOW 'DSP)) (replace (FW-OFD OFDSTREAM) of OFD with OFDSTREAM) (DSPFONT FW-Font OFDSTREAM) (WINDOWPROP OFDWINDOW 'RIGHTBUTTONFN (FUNCTION FW-BUTTONEVENTFN)) (WINDOWPROP OFDWINDOW 'BUTTONEVENTFN (FUNCTION FW-BUTTONEVENTFN)) (WINDOWPROP OFDWINDOW 'REPAINTFN (FUNCTION FW-REPAINTFN)) (WINDOWPROP OFDWINDOW 'RESHAPEFN (FUNCTION NILL)) (WINDOWPROP OFDWINDOW 'CLOSEFN (FUNCTION FW-CLOSEFN)) (WINDOWPROP OFDWINDOW 'AFTERMOVEFN (FUNCTION FW-AFTERMOVEFN))) (FW-ADJUST-PLACEMENT FW-OFDList]) (FW-CREATEW [LAMBDA (OFD) (* Koomen "29-Sep-86 23:16") (replace (FW-OFD OFDWINDOW) of OFD with (CREATEW (create REGION LEFT _ (replace (FW-OFD OFDLEFT ) of OFD with (fetch (FW-OFD LEFT) of OFD)) BOTTOM _ (replace (FW-OFD OFDBOTTOM) of OFD with (fetch (FW-OFD BOTTOM) of OFD)) WIDTH _ (replace (FW-OFD OFDWIDTH ) of OFD with (fetch (FW-OFD WIDTH) of OFD)) HEIGHT _ (replace (FW-OFD OFDHEIGHT) of OFD with (fetch (FW-OFD HEIGHT) of OFD))) NIL NIL T]) (FW-FILTERED-FILE? [LAMBDA (FULLNAME) (* ; "Edited 22-Sep-87 13:31 by Koomen") (DECLARE (GLOBALVARS FW-Filters)) (* ;; "filters are precompiled for matching. Note that the system function DIRECTORY.MATCH.SETUP has stripped off the host, so we have to match it seperatedly.") (for FILTER in FW-Filters thereis (AND (DIRECTORY.MATCH (CDR FILTER) FULLNAME) (DIRECTORY.MATCH (CAR FILTER) (FILENAMEFIELD FULLNAME 'HOST]) (FW-FORGET-CMD [LAMBDA (W MANY?) (* Koomen "27-May-87 15:27") (DECLARE (GLOBALVARS FW-OFDList)) (if (AND W (NOT MANY?)) then (CLOSEW W) else (PROG (CURRENT-OFDS FORGET-OFD) (SETQ CURRENT-OFDS (for OFD in FW-OFDList when (EQ (fetch (FW-OFD OFDSTATUS) of OFD) 'CURRENT) collect OFD)) (if (NULL CURRENT-OFDS) then (PROMPTPRINT "FileWatch: no current files.") (RETURN)) FORGET-ANOTHER [SETQ FORGET-OFD (MENU (create MENU TITLE _ "Select file to forget: " ITEMS _ (for OFD in CURRENT-OFDS collect (LIST (fetch (FW-OFD FULLNAME) of OFD) (KWOTE OFD] (if (NULL FORGET-OFD) then (RETURN)) (CLOSEW (fetch (FW-OFD OFDWINDOW) of FORGET-OFD)) (if (AND MANY? (SETQ CURRENT-OFDS (REMOVE FORGET-OFD CURRENT-OFDS))) then (GO FORGET-ANOTHER]) (FW-INIT [LAMBDA NIL (* ; "Edited 30-Sep-87 11:53 by Koomen") (DECLARE (GLOBALVARS FW-Dormant? FW-Running?)) (* * Clean up possible left-overs from a previously killed FileWatch process,  then initialize the world) (FW-WIPE) (FW-RE-INIT) (FW-RESET) (SETQ FW-Dormant? NIL) (SETQ FW-Running? T]) (FW-INIT-MENUS [LAMBDA NIL (* ; "Edited 20-Oct-89 16:57 by koomen") (DECLARE (GLOBALVARS BackgroundMenu BackgroundMenuCommands FW-Commands FW-InteractMenu)) (* * When changing the list of control menu items, do  (SETQ FW-InteractMenu)) (PROG [(ITEMS '(("Forget File" 'FORGET "Stop watching this file" (SUBITEMS ("Forget Many Files" 'FORGET-MANY "Stop watching several files" ))) ("Recall File" 'RECALL "Start watching a forgotten file again" (SUBITEMS ("Recall Many Files" 'RECALL-MANY "Start watching several forgotten files again"))) ("" NIL "No-op") ("Close File" 'CLOSE "Close this file (user beware!)" (SUBITEMS ("Close Many Files" 'CLOSE-MANY "Close several files"))) ("" NIL "No-op") ("Move Display" 'MOVE "Change the display orientation specs" (SUBITEMS ("Set Anchor" 'SET-ANCHOR "Corner of the display to be anchored" ) ("Set Position" 'SET-POSITION "Position of display (relative to anchor)") ("Set Justification" 'SET-JUSTIFICATION "Windows to be shrunk or grown depending on maximum filename width" ))) ("Quit File Watcher" 'QUIT ""] [if (NOT (type? MENU FW-InteractMenu)) then (SETQ FW-InteractMenu (create MENU TITLE _ "FileWatch:" CENTERFLG _ T MENUOFFSET _ (CONS -1 58) CHANGEOFFSETFLG _ 'Y ITEMS _ (COPY ITEMS] (if (NULL (CDDDR (FASSOC 'FileWatch BackgroundMenuCommands))) then (* ;; "Not there, or no subitems (older version)") (for C in FW-Commands do (SETQ ITEMS (SUBST `'(FILEWATCH ',C) `',C ITEMS))) [push BackgroundMenuCommands (COPY `(FileWatch '(FILEWATCH 'ON) "Display and continuously update list of open files and and the location of their file pointers" (SUBITEMS ,@ITEMS] (SETQ BackgroundMenu]) (FW-INIT-PROPS [LAMBDA NIL (* ; "Edited 22-Sep-87 14:30 by Koomen") (DECLARE (GLOBALVARS FW-AllFiles? FW-Anchor FW-Filters FW-Font FW-Interval FW-Justified? FW-Position FW-Properties FW-Shade FW-SortFn)) [SETQ FW-AllFiles? (NOT (NULL (LISTGET FW-Properties 'ALL-FILES?] (SETQ FW-Anchor (OR [CAR (MEMB (LISTGET FW-Properties 'ANCHOR) '(TOP-LEFT TOP-RIGHT BOTTOM-LEFT BOTTOM-RIGHT] 'BOTTOM-LEFT)) (* ;; "precompile filters for matching. Note that the system function DIRECTORY.MATCH.SETUP strips off the host, so we have to match it seperatedly.") (SETQ FW-Filters (for FILTER inside (LISTGET FW-Properties 'FILTERS) join (if (OR (STRINGP FILTER) (LITATOM FILTER)) then (SETQ FILTER (DIRECTORY.FILL.PATTERN FILTER)) (LIST (CONS (DIRECTORY.MATCH.SETUP (OR (FILENAMEFIELD FILTER 'HOST) "*")) (DIRECTORY.MATCH.SETUP FILTER))) else (printout PROMPTWINDOW 0 "FileWatch: filter not a string or symbol: " T FILTER " ignored." T) NIL))) [SETQ FW-Font (FONTCREATE (LISTGET FW-Properties 'FONT] [SETQ FW-Interval (FIXP (LISTGET FW-Properties 'INTERVAL] [SETQ FW-Justified? (NOT (NULL (LISTGET FW-Properties 'JUSTIFIED?] (SETQ FW-Position (OR (POSITIONP (LISTGET FW-Properties 'POSITION)) (create POSITION XCOORD _ 0 YCOORD _ 0))) (LET ((X (fetch (POSITION XCOORD) of FW-Position)) (Y (fetch (POSITION YCOORD) of FW-Position)) (W SCREENWIDTH) (H SCREENHEIGHT) (XMIN 100) (XMAX (IDIFFERENCE SCREENWIDTH 100)) (YMIN 100) (YMAX (IDIFFERENCE SCREENHEIGHT 100))) (SELECTQ FW-Anchor (TOP-LEFT (if (IGEQ X XMAX) then (SETQ X XMAX)) (if (ILEQ Y YMIN) then (SETQ Y YMIN))) (TOP-RIGHT (if (ILEQ X XMIN) then (SETQ X XMIN)) (if (ILEQ Y YMIN) then (SETQ Y YMIN))) (BOTTOM-LEFT (if (IGEQ X XMAX) then (SETQ X XMAX)) (if (IGEQ Y YMAX) then (SETQ Y YMAX))) (BOTTOM-RIGHT (if (ILEQ X XMIN) then (SETQ X XMIN)) (if (IGEQ Y YMAX) then (SETQ Y YMAX))) (SHOULDNT)) (SETQ FW-Position (create POSITION XCOORD _ X YCOORD _ Y))) [SETQ FW-Shade (SMALLP (LISTGET FW-Properties 'SHADE] (SETQ FW-SortFn (LET [(FN (LISTGET FW-Properties 'SORTFN] (if (AND (LITATOM FN) (GETD FN)) then FN]) (FW-INTERACT [LAMBDA (W MENUCMD) (* Koomen "15-May-87 01:03") (DECLARE (GLOBALVARS FW-InteractMenu FW-Running?)) (SELECTQ (OR MENUCMD (SETQ MENUCMD (MENU FW-InteractMenu))) (NIL NIL) (FORGET (FW-FORGET-CMD W)) (FORGET-MANY (FW-FORGET-CMD W T)) (RECALL (FW-RECALL-CMD)) (RECALL-MANY (FW-RECALL-CMD T)) (CLOSE (FW-CLOSE-CMD W)) (CLOSE-MANY (FW-CLOSE-CMD W T)) (MOVE (FW-MOVE-OFD-WINDOWS)) (SET-ANCHOR (FW-MOVE-OFD-WINDOWS 'ANCHOR)) (SET-POSITION (FW-MOVE-OFD-WINDOWS 'POSITION)) (SET-JUSTIFICATION (FW-MOVE-OFD-WINDOWS 'JUSTIFIED?)) (QUIT (SETQ FW-Running? NIL)) (PROMPTPRINT "Unrecognized FileWatch Control Menu command: " MENUCMD]) (FW-LOOP [LAMBDA NIL (* ; "Edited 30-Sep-87 11:53 by Koomen") (DECLARE (GLOBALVARS FW-Dormant? FW-Interval FW-OpenFiles FW-ReInit? FW-Reset? FW-Running?)) (bind OPENFILES first (FW-INIT) while FW-Running? do (if (NOT FW-Dormant?) then (SETQ OPENFILES (FW-OPENP)) (if (OR FW-Reset? FW-ReInit? (NOT (EQUAL OPENFILES FW-OpenFiles))) then (if FW-ReInit? then (FW-RE-INIT)) (FW-RESET) (if (SETQ FW-OpenFiles (APPEND OPENFILES)) then (FW-CREATE-OFD-LIST) (FW-CREATE-OFD-WINDOWS) else (FW-CLOSE-OLD-OFD-WINDOWS)) (SETQ FW-ReInit?)) (FW-UPDATE-OFD-WINDOWS)) (BLOCK FW-Interval) finally (FW-WIPE]) (FW-MOVE-OFD-WINDOWS [LAMBDA (WHAT) (* Koomen "16-Apr-87 15:55") (if (OR (NULL WHAT) (EQ WHAT 'ANCHOR)) then (FW-CHANGE-ANCHOR)) (if (OR (NULL WHAT) (EQ WHAT 'POSITION)) then (FW-CHANGE-POSITION)) (if (OR (NULL WHAT) (EQ WHAT 'JUSTIFIED?)) then (FW-CHANGE-JUSTIFICATION]) (FW-MOVEW [LAMBDA (OFD) (* Koomen "29-Sep-86 23:10") (MOVEW (fetch (FW-OFD OFDWINDOW) of OFD) (replace (FW-OFD OFDLEFT) of OFD with (fetch (FW-OFD LEFT) of OFD)) (replace (FW-OFD OFDBOTTOM) of OFD with (fetch (FW-OFD BOTTOM) of OFD]) (FW-OFD-EXISTS? [LAMBDA (FULLNAME FILESTREAM) (* ; "Edited 22-Sep-87 13:27 by Koomen") (DECLARE (GLOBALVARS FW-OFDList FW-ReInit?)) (for OFD in FW-OFDList when (AND (EQ (fetch (FW-OFD FULLNAME) of OFD) FULLNAME) (EQ (fetch (FW-OFD FILESTREAM) of OFD) FILESTREAM) (EQ (fetch (FW-OFD READING?) of OFD) (if (OPENP FILESTREAM 'INPUT) then T)) (EQ (fetch (FW-OFD WRITING?) of OFD) (if (OPENP FILESTREAM 'OUTPUT) then T))) do (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) (OLD (replace (FW-OFD OFDSTATUS) of OFD with (if FW-ReInit? then 'NEW else 'CURRENT)) (RETURN T)) ((NEW CURRENT FORGOTTEN) (RETURN T)) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD]) (FW-OPENP [LAMBDA NIL (* ; "Edited 22-Sep-87 11:32 by Koomen") (* ;; "Computes the list of currently open files (actually, streams). If the globalvar FW-AllFiles? is non-NIL, streams with flag USERVISIBLE=NIL are included as well.") (* ;;  "Note: Uses a scratchlist, so be sure to copy result if you need it across calls to FW-OPENP") (DECLARE (GLOBALVARS FW-AllFiles? FW-OpenP-ScratchList \FILEDEVICES)) (SCRATCHLIST FW-OpenP-ScratchList (for FD in \FILEDEVICES bind OPENPFN do (SETQ OPENPFN (fetch (FDEV OPENP) of FD)) (if (EQ OPENPFN '\GENERIC.OPENP) then (for S in (fetch (FDEV OPENFILELST) of FD) when (OR FW-AllFiles? (fetch (STREAM USERVISIBLE) of S)) do (ADDTOSCRATCHLIST S)) else (for FNAME in (APPLY* OPENPFN NIL NIL FD) do (ADDTOSCRATCHLIST (\GETSTREAM FNAME]) (FW-PERCENTAGE [LAMBDA (X Y) (* ; "Edited 30-Sep-87 01:00 by Koomen") (if (IGEQ X Y) then 100 elseif (IGREATERP X 0) then (IQUOTIENT (ITIMES X 100) Y) else 0]) (FW-RE-INIT [LAMBDA NIL (* ; "Edited 22-Sep-87 13:05 by Koomen") (* * Called from FW-INIT, or from FW-LOOP because a prop has changed.) (DECLARE (GLOBALVARS FW-AccessTab FW-AccessWidth FW-CurPosTab FW-EofPosTab FW-FieldWidth FW-Font FW-OFDList FW-PercentHeight FW-PercentTab FW-PercentWidth FW-SeprWidth FW-WindowBottom FW-WindowHeight FW-WindowNoNameWidth WBorder)) (FW-INIT-PROPS) (SETQ FW-SeprWidth (STRINGWIDTH "AA" FW-Font)) (SETQ FW-AccessWidth (IMAX (STRINGWIDTH "b " FW-Font) (STRINGWIDTH "r " FW-Font) (STRINGWIDTH "w " FW-Font))) (SETQ FW-FieldWidth (STRINGWIDTH "99999999" FW-Font)) (SETQ FW-PercentWidth (ITIMES 2 FW-FieldWidth)) [SETQ FW-PercentHeight (IDIFFERENCE (FONTHEIGHT FW-Font) (ITIMES 2 (ADD1 (FONTPROP FW-Font 'DESCENT] (SETQ FW-CurPosTab FW-SeprWidth) (SETQ FW-EofPosTab (IPLUS FW-CurPosTab FW-FieldWidth FW-SeprWidth)) (SETQ FW-PercentTab (IPLUS FW-EofPosTab FW-FieldWidth FW-SeprWidth)) (SETQ FW-AccessTab (IPLUS FW-PercentTab FW-FieldWidth FW-PercentWidth FW-SeprWidth)) (SETQ FW-WindowNoNameWidth (WIDTHIFWINDOW (IPLUS FW-AccessTab FW-AccessWidth) WBorder)) (SETQ FW-WindowBottom 0) (SETQ FW-WindowHeight (HEIGHTIFWINDOW (FONTHEIGHT FW-Font) NIL WBorder)) (for OFD in FW-OFDList do (DSPFONT FW-Font (fetch (FW-OFD OFDSTREAM) of OFD)) (replace (FW-OFD NAMEWIDTH) of OFD with (STRINGWIDTH (fetch (FW-OFD FULLNAME) of OFD) FW-Font)) (FW-RESIZE-OFD OFD]) (FW-RECALL-CMD [LAMBDA (MANY?) (* Koomen "14-May-87 23:46") (DECLARE (GLOBALVARS FW-OFDList FW-Reset?)) (PROG (FORGOTTEN-OFDS RECALL-OFD) (SETQ FORGOTTEN-OFDS (for OFD in FW-OFDList when (EQ (fetch (FW-OFD OFDSTATUS ) of OFD) 'FORGOTTEN) collect OFD)) (if (NULL FORGOTTEN-OFDS) then (PROMPTPRINT "FileWatch: no forgotten files.") (RETURN)) RECALL-ANOTHER [SETQ RECALL-OFD (MENU (create MENU TITLE _ "Select file to recall: " CENTERFLG _ T ITEMS _ (for OFD in FORGOTTEN-OFDS collect (LIST (fetch (FW-OFD FULLNAME) of OFD) (KWOTE OFD] (if (NULL RECALL-OFD) then (RETURN)) (replace (FW-OFD OFDSTATUS) of RECALL-OFD with (if (OPENP (fetch (FW-OFD FULLNAME) of RECALL-OFD)) then (FW-UPDATE-OFD-WINDOW RECALL-OFD T) 'CURRENT else (PROMPTPRINT "FileWatch: file has been closed.") 'OLD)) (SETQ FW-Reset? T) (if (AND MANY? (SETQ FORGOTTEN-OFDS (REMOVE RECALL-OFD FORGOTTEN-OFDS))) then (GO RECALL-ANOTHER]) (FW-REPAINTFN [LAMBDA (W) (* Koomen "25-Sep-86 00:44") (DECLARE (GLOBALVARS FW-OFDList)) (for OFD in FW-OFDList when (EQ W (fetch (FW-OFD OFDWINDOW) of OFD)) do (if (OPENP (fetch (FW-OFD OFDSTREAM) of OFD)) then (FW-UPDATE-OFD-WINDOW OFD T)) (RETURN]) (FW-RESET [LAMBDA NIL (* Koomen "29-Sep-86 23:20") (DECLARE (GLOBALVARS FW-OFDList)) (for OFD in FW-OFDList do (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) (CURRENT (replace (FW-OFD OFDSTATUS) of OFD with 'OLD)) ((OLD FORGOTTEN)) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD]) (FW-RESIZE-OFD [LAMBDA (OFD MAXNAMEWIDTH) (* ; "Edited 22-Sep-87 12:56 by Koomen") (* * If MAXNAMEWIDTH=NIL, uses OFD's own NAMEWIDTH) (DECLARE (GLOBALVARS FW-AccessTab FW-Anchor FW-CurPosTab FW-EofPosTab FW-PercentHeight FW-PercentTab FW-PercentWidth FW-Position FW-WindowBottom FW-WindowHeight FW-WindowNoNameWidth)) (PROG [(NAMEWIDTH (OR MAXNAMEWIDTH (fetch (FW-OFD NAMEWIDTH) of OFD] (replace (FW-OFD WIDTH) of OFD with (IPLUS FW-WindowNoNameWidth NAMEWIDTH)) (replace (FW-OFD HEIGHT) of OFD with FW-WindowHeight) (replace (FW-OFD LEFT) of OFD with (SELECTQ FW-Anchor ((TOP-LEFT BOTTOM-LEFT) (fetch (POSITION XCOORD) of FW-Position)) ((TOP-RIGHT BOTTOM-RIGHT) (IDIFFERENCE (fetch (POSITION XCOORD) of FW-Position) (fetch (FW-OFD WIDTH) of OFD))) (ERROR "Unsupported anchor spec: " FW-Anchor))) (replace (FW-OFD BOTTOM) of OFD with FW-WindowBottom) (replace (FW-OFD CURPOSXOFFSET) of OFD with (IPLUS FW-CurPosTab NAMEWIDTH)) (replace (FW-OFD EOFPOSXOFFSET) of OFD with (IPLUS FW-EofPosTab NAMEWIDTH)) (replace (FW-OFD PCTPOSXOFFSET) of OFD with (IPLUS FW-PercentTab NAMEWIDTH)) (replace (FW-OFD ACCESSXOFFSET) of OFD with (IPLUS FW-AccessTab NAMEWIDTH)) (replace (FW-OFD PCTREGION) of OFD with (create REGION LEFT _ NIL BOTTOM _ NIL WIDTH _ FW-PercentWidth HEIGHT _ FW-PercentHeight)) (RETURN OFD]) (FW-SHAPEW [LAMBDA (OFD) (* Koomen "29-Sep-86 23:09") (SHAPEW (fetch (FW-OFD OFDWINDOW) of OFD) (create REGION LEFT _ (replace (FW-OFD OFDLEFT) of OFD with (fetch (FW-OFD LEFT) of OFD)) BOTTOM _ (replace (FW-OFD OFDBOTTOM) of OFD with (fetch (FW-OFD BOTTOM) of OFD)) WIDTH _ (replace (FW-OFD OFDWIDTH) of OFD with (fetch (FW-OFD WIDTH) of OFD)) HEIGHT _ (replace (FW-OFD OFDHEIGHT) of OFD with (fetch (FW-OFD HEIGHT) of OFD]) (FW-SORT-FN [LAMBDA (OFD1 OFD2) (* Koomen "24-Sep-86 23:24") (DECLARE (GLOBALVARS FW-Anchor FW-SortFn)) (SELECTQ FW-Anchor ((TOP-LEFT TOP-RIGHT) (* growing downwards *) (APPLY* FW-SortFn (fetch (FW-OFD FULLNAME) of OFD2) (fetch (FW-OFD FULLNAME) of OFD1))) ((BOTTOM-LEFT BOTTOM-RIGHT) (* growing upwards *) (APPLY* FW-SortFn (fetch (FW-OFD FULLNAME) of OFD1) (fetch (FW-OFD FULLNAME) of OFD2))) (ERROR "Unsupported anchor spec: " FW-Anchor]) (FW-UPDATE-OFD-WINDOW [LAMBDA (OFD NEW?) (* ; "Edited 22-Sep-87 12:43 by Koomen") (DECLARE (GLOBALVARS FW-PercentHeight FW-PercentWidth FW-Shade)) (PROG ((OFDSTREAM (fetch (FW-OFD OFDSTREAM) of OFD)) (FILESTREAM (fetch (FW-OFD FILESTREAM) of OFD)) (OLDCURPOS (fetch (FW-OFD CURPOS) of OFD)) (OLDEOFPOS (fetch (FW-OFD EOFPOS) of OFD)) (OLDPCTPOS (fetch (FW-OFD PCTPOS) of OFD)) (PCTREGION (fetch (FW-OFD PCTREGION) of OFD)) (BOXBORDER 1) NEWCURPOS NEWEOFPOS NEWPCTPOS X Y) (if (NOT (OPENP FILESTREAM)) then (* * May just have created some windows, in which case there may have been a  BLOCK underneath during which this file was closed, so make sure file is still  open) (RETURN)) (SETQ NEWCURPOS (GETFILEPTR FILESTREAM)) (SETQ NEWEOFPOS (if (NOT (fetch (FW-OFD WRITING?) of OFD)) then OLDEOFPOS elseif (NOT (fetch (FW-OFD RANDOM?) of OFD)) then NEWCURPOS else (GETEOFPTR FILESTREAM))) (if (AND (FIXP NEWCURPOS) (FIXP NEWEOFPOS)) then (if (ILESSP NEWEOFPOS NEWCURPOS) then (SETQ NEWEOFPOS NEWCURPOS)) elseif (FIXP NEWCURPOS) then (SETQ NEWEOFPOS NEWCURPOS) elseif (FIXP NEWEOFPOS) then (SETQ NEWCURPOS NEWEOFPOS) else (SETQ NEWCURPOS (SETQ NEWEOFPOS 0))) (SETQ NEWPCTPOS (FW-PERCENTAGE NEWCURPOS NEWEOFPOS)) (if NEW? then (DSPRESET OFDSTREAM) (printout OFDSTREAM (fetch (FW-OFD FULLNAME) of OFD)) (DSPXPOSITION (fetch (FW-OFD ACCESSXOFFSET) of OFD) OFDSTREAM) (printout OFDSTREAM (LET ((R (fetch (FW-OFD READING?) of OFD)) (W (fetch (FW-OFD WRITING?) of OFD))) (if (AND R W) then "b" elseif R then "r" elseif W then "w" else "*"))) (replace (FW-OFD OFDSTATUS) of OFD with 'CURRENT)) (if (OR NEW? (NOT (EQUAL NEWCURPOS OLDCURPOS))) then (DSPXPOSITION (fetch (FW-OFD CURPOSXOFFSET) of OFD) OFDSTREAM) (printout OFDSTREAM |.I8| NEWCURPOS) (replace (FW-OFD CURPOS) of OFD with NEWCURPOS)) (if (OR NEW? (NOT (EQUAL NEWEOFPOS OLDEOFPOS))) then (DSPXPOSITION (fetch (FW-OFD EOFPOSXOFFSET) of OFD) OFDSTREAM) (printout OFDSTREAM |.I8| NEWEOFPOS) (replace (FW-OFD EOFPOS) of OFD with NEWEOFPOS)) (if (OR NEW? (NOT (EQUAL NEWPCTPOS OLDPCTPOS))) then (DSPXPOSITION (fetch (FW-OFD PCTPOSXOFFSET) of OFD) OFDSTREAM) (printout OFDSTREAM |.I5| NEWPCTPOS) (printout OFDSTREAM " %% ") [SETQ X (OR (fetch (REGION LEFT) of PCTREGION) (replace (REGION LEFT) of PCTREGION with (IPLUS BOXBORDER (DSPXPOSITION NIL OFDSTREAM] [SETQ Y (OR (fetch (REGION BOTTOM) of PCTREGION) (replace (REGION BOTTOM) of PCTREGION with (ADD1 (DSPYPOSITION NIL OFDSTREAM] (if (OR NEW? (ILESSP NEWPCTPOS (OR OLDPCTPOS 100))) then (GRAYBOXAREA X Y FW-PercentWidth FW-PercentHeight BOXBORDER BLACKSHADE OFDSTREAM)) (replace (REGION WIDTH) of PCTREGION with (IQUOTIENT (ITIMES NEWPCTPOS FW-PercentWidth ) 100)) (DSPFILL PCTREGION FW-Shade NIL OFDSTREAM) (replace (FW-OFD PCTPOS) of OFD with NEWPCTPOS]) (FW-UPDATE-OFD-WINDOWS [LAMBDA NIL (* Koomen " 9-Oct-86 17:18") (DECLARE (GLOBALVARS FW-OFDList)) (for OFD in FW-OFDList do (SELECTQ (fetch (FW-OFD OFDSTATUS) of OFD) (NEW (FW-UPDATE-OFD-WINDOW OFD T)) (CURRENT (FW-UPDATE-OFD-WINDOW OFD)) ((OLD FORGOTTEN)) (SHOULDNT (CONS "Unexpected OFDSTATUS : " (fetch (FW-OFD OFDSTATUS) of OFD]) (FW-WIPE [LAMBDA NIL (* Koomen "15-May-87 01:49") (DECLARE (GLOBALVARS FW-AllFiles? FW-Anchor FW-CurPosTab FW-EofPosTab FW-FieldWidth FW-Filters FW-Font FW-FullNameWidth FW-Interval FW-Justified? FW-OFDList FW-OpenFiles FW-PercentHeight FW-PercentTab FW-PercentWidth FW-Position FW-ReInit? FW-Reset? FW-Running? FW-SeprWidth FW-Shade FW-SortFn FW-WindowBottom FW-WindowBottomDelta FW-WindowHeight FW-WindowNoNameWidth)) (* * Clean up possible left-overs, then set all private vars to NIL) (for OFD in FW-OFDList do (CLOSEW (fetch (FW-OFD OFDWINDOW) of OFD))) (SETQ FW-AllFiles?) (SETQ FW-Anchor) (SETQ FW-CurPosTab) (SETQ FW-EofPosTab) (SETQ FW-FieldWidth) (SETQ FW-Filters) (SETQ FW-Font) (SETQ FW-FullNameWidth) (SETQ FW-Interval) (SETQ FW-Justified?) (SETQ FW-OFDList) (SETQ FW-OpenFiles) (SETQ FW-PercentHeight) (SETQ FW-PercentWidth) (SETQ FW-PercentTab) (SETQ FW-Position) (SETQ FW-ReInit?) (SETQ FW-Reset?) (SETQ FW-Running?) (SETQ FW-SeprWidth) (SETQ FW-Shade) (SETQ FW-SortFn) (SETQ FW-WindowBottom) (SETQ FW-WindowBottomDelta) (SETQ FW-WindowHeight) (SETQ FW-WindowNoNameWidth]) ) (DECLARE%: DONTCOPY DONTEVAL@LOAD EVAL@COMPILE [OR (HASDEF 'FDEV 'RECORDS 'CURRENT) (EVAL (SYSRECLOOK1 'FDEV] [OR (HASDEF 'STREAM 'RECORDS 'CURRENT) (EVAL (SYSRECLOOK1 'STREAM] ) (RPAQ? FW-OFDList NIL) (RPAQ? FW-OpenP-ScratchList (CONS)) (RPAQ? FW-Commands (COPY '(FORGET FORGET-MANY RECALL RECALL-MANY CLOSE CLOSE-MANY MOVE SET-ANCHOR SET-POSITION SET-JUSTIFICATION QUIT))) (RPAQ? FW-Properties (COPY `(FONT (GACHA 8) ALL-FILES? T POSITION ,(CREATEPOSITION SCREENWIDTH 0) ANCHOR BOTTOM-RIGHT SHADE ,GRAYSHADE INTERVAL 1000))) (FW-INIT-MENUS) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA FILEWATCHPROP) ) (PUTPROPS FILEWATCH COPYRIGHT ("Johannes A. G. M. Koomen" 1986 1987 1989)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3178 5622 (FILEWATCH 3188 . 4757) (FILEWATCHPROP 4759 . 5620)) (8016 62486 ( FW-ADJUST-PLACEMENT 8026 . 10093) (FW-ADJUST-REGION 10095 . 12049) (FW-AFTERMOVEFN 12051 . 14076) ( FW-BUTTONEVENTFN 14078 . 14504) (FW-CHANGE-ANCHOR 14506 . 15460) (FW-CHANGE-JUSTIFICATION 15462 . 15959) (FW-CHANGE-POSITION 15961 . 18279) (FW-CLOSE-CMD 18281 . 21446) (FW-CLOSE-OLD-OFD-WINDOWS 21448 . 22228) (FW-CLOSEFN 22230 . 22914) (FW-CREATE-OFD 22916 . 23971) (FW-CREATE-OFD-LIST 23973 . 25490) (FW-CREATE-OFD-WINDOWS 25492 . 26775) (FW-CREATEW 26777 . 29749) (FW-FILTERED-FILE? 29751 . 30429) ( FW-FORGET-CMD 30431 . 32080) (FW-INIT 32082 . 32497) (FW-INIT-MENUS 32499 . 35781) (FW-INIT-PROPS 35783 . 39386) (FW-INTERACT 39388 . 40238) (FW-LOOP 40240 . 41363) (FW-MOVE-OFD-WINDOWS 41365 . 41810) (FW-MOVEW 41812 . 42240) (FW-OFD-EXISTS? 42242 . 43870) (FW-OPENP 43872 . 45128) (FW-PERCENTAGE 45130 . 45419) (FW-RE-INIT 45421 . 47543) (FW-RECALL-CMD 47545 . 49616) (FW-REPAINTFN 49618 . 50020) ( FW-RESET 50022 . 50758) (FW-RESIZE-OFD 50760 . 53318) (FW-SHAPEW 53320 . 54550) (FW-SORT-FN 54552 . 55240) (FW-UPDATE-OFD-WINDOW 55242 . 60335) (FW-UPDATE-OFD-WINDOWS 60337 . 61086) (FW-WIPE 61088 . 62484))))) STOP \ No newline at end of file diff --git a/lispusers/FILEWATCH.TEDIT b/lispusers/FILEWATCH.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a4270c79dc8dc75e5b70c73829e3e400bc923ce4 GIT binary patch literal 10388 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 q(=hZcLISPUSERS>FILLREGION.;5 20221 changes to%: (FNS FILL.KERNEL FILL.REGION) (VARS FILLREGIONCOMS) (FUNCTIONS psetf) (MACROS POP.TASK) previous date%: "15-Mar-85 03:07:57" {ERINYES}LISPUSERS>FILLREGION.;1) (* " Copyright (c) 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT FILLREGIONCOMS) (RPAQQ FILLREGIONCOMS [(DECLARE%: EVAL@COMPILE DONTCOPY (FILES PSETF) (MACROS ADD.TASK CIRCLE.ABOUT DEC.X DEC.Y FINISH.ORIENTATION INC.X INC.Y NEXT.POINT.ON.CURVE POP.TASK RIGHT.BIT SEARCH SEARCH.AND.FILL SET.BIT TEST.BIT WANT.TO.EXTEND) (RECORDS TASK)) (FNS * \FILLREGION.FNS) (FUNCTIONS psetf) (BLOCKS * (LIST (APPEND '(FILLREGION) \FILLREGION.FNS '((ENTRIES AUTO.FILL FILL.REGION) (GLOBALVARS BITMASKARRAY) (LOCALVARS . T]) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD PSETF) (DECLARE%: EVAL@COMPILE [PUTPROPS ADD.TASK MACRO ((STARTW STARTM) (if FREELIST then (create TASK W _ STARTW M _ STARTM smashing (PROG1 (CAR FREELIST) (psetf FREELIST (CDR FREELIST) (CDR FREELIST) AGENDA AGENDA FREELIST))) else (push AGENDA (create TASK W _ STARTW M _ STARTM] [PUTPROPS CIRCLE.ABOUT MACRO ((START.W START.M) (first (SETQ CIRCLE.WORD START.W) (SETQ CIRCLE.MASK START.M) (NEXT.POINT.ON.CURVE CIRCLE.WORD CIRCLE.MASK 6 CIRCLE.THIS.DIR) (SETQ CIRCLE.EXTEND NIL) eachtime (SETQ CIRCLE.PREV.W CIRCLE.WORD) (SETQ CIRCLE.PREV.M CIRCLE.MASK) (NEXT.POINT.ON.CURVE CIRCLE.WORD CIRCLE.MASK CIRCLE.THIS.DIR CIRCLE.NEXT.DIR) (if (WANT.TO.EXTEND CIRCLE.THIS.DIR CIRCLE.NEXT.DIR) then (if (NOT CIRCLE.EXTEND) then (SETQ CIRCLE.EXTEND T) (ADD.TASK CIRCLE.PREV.W CIRCLE.PREV.M)) else (SETQ CIRCLE.EXTEND NIL)) (SET.BIT DEST.BASE CIRCLE.PREV.W CIRCLE.PREV.M) until (AND (EQ CIRCLE.PREV.W START.W) (EQ CIRCLE.PREV.M START.M) (FINISH.ORIENTATION CIRCLE.THIS.DIR CIRCLE.NEXT.DIR)) do (SETQ CIRCLE.THIS.DIR CIRCLE.NEXT.DIR] [PUTPROPS DEC.X MACRO ((WORD MASK) (SETQ MASK (if (EQ MASK (CONSTANT (MASK.1'S 15 1))) then (add WORD -1) 1 else (LLSH MASK 1] (PUTPROPS DEC.Y MACRO ((WORD MASK) (add WORD RASTERWIDTH))) [PUTPROPS FINISH.ORIENTATION MACRO ((THIS.DIR NEXT.DIR) (IGEQ THIS.DIR (LOGXOR NEXT.DIR 4] [PUTPROPS INC.X MACRO ((WORD MASK) (SETQ MASK (if (EQ MASK 1) then (add WORD 1) (CONSTANT (MASK.1'S 15 1)) else (LRSH MASK 1] [PUTPROPS INC.Y MACRO ((WORD MASK) (SETQ WORD (IDIFFERENCE WORD RASTERWIDTH] [PUTPROPS NEXT.POINT.ON.CURVE MACRO ((WORD MASK DIN DOUT) (PROG NIL [if (IGEQ DIN 5) then (if (EQ DIN 7) then (* DIN = 7) (INC.Y WORD MASK) (GO L6) else (* DIN = 5 or 6) (INC.X WORD MASK) (GO L4)) else (if (IGEQ DIN 3) then (* DIN = 3 or 4) (DEC.Y WORD MASK) (GO L2) else (if (NEQ DIN 0) then (* DIN = 1 or 2) (DEC.X WORD MASK) (GO L0) else (* DIN = 0) (INC.Y WORD MASK) (GO L6] L0 (DEC.Y WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 0) (RETURN)) (INC.X WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 1) (RETURN)) L2 (INC.X WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 2) (RETURN)) (INC.Y WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 3) (RETURN)) L4 (INC.Y WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 4) (RETURN)) (DEC.X WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 5) (RETURN)) L6 (DEC.X WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 6) (RETURN)) (DEC.Y WORD MASK) (if (NEQ 0 (TEST.BIT SRCE.BASE WORD MASK)) then (SETQ DOUT 7) (RETURN)) (GO L0] [PUTPROPS POP.TASK MACRO (NIL (PROG1 (CAR AGENDA) (CL:PSETF AGENDA (CDR AGENDA) (CDR AGENDA) FREELIST FREELIST AGENDA] [PUTPROPS RIGHT.BIT MACRO ((X) (LOGAND X (IMINUS X] [PUTPROPS SEARCH MACRO ((WORD MASK) (PROGN (SETQ SEARCH.BITS (\GETBASE SRCE.BASE WORD)) (for old WORD first (if (NEQ MASK 1) then (if (NEQ [SETQ SEARCH.BITS (LOGAND SEARCH.BITS (LOGNOT (SUB1 MASK] 0) then (SETQ MASK (RIGHT.BIT SEARCH.BITS)) (RETURN) else (add WORD -1))) when (NEQ (SETQ SEARCH.BITS (\GETBASE SRCE.BASE WORD)) 0) do (SETQ MASK (RIGHT.BIT SEARCH.BITS)) (RETURN) by (SUB1 WORD] [PUTPROPS SEARCH.AND.FILL MACRO ((WORD MASK) (PROGN (SETQ SEARCH.BITS (\GETBASE SRCE.BASE WORD)) (for old WORD first [if (NEQ MASK 1) then [SETQ SEARCH.MASKEDBITS (LOGAND SEARCH.BITS (SETQ SEARCH.EXTENDEDMASK (LOGXOR (SUB1 MASK) (CONSTANT (MASK.1'S 0 16] (if (NEQ SEARCH.MASKEDBITS 0) then [\PUTBASE DEST.BASE WORD (LOGOR (SETQ FILL.BITS (\GETBASE DEST.BASE WORD) ) (LOGAND SEARCH.EXTENDEDMASK (SUB1 (SETQ MASK (RIGHT.BIT SEARCH.MASKEDBITS ] (RETURN (LOGAND FILL.BITS MASK)) else (\PUTBASE DEST.BASE WORD (LOGOR (\GETBASE DEST.BASE WORD) SEARCH.EXTENDEDMASK)) (SETQ WORD (SUB1 WORD] when (NEQ (SETQ SEARCH.BITS (\GETBASE SRCE.BASE WORD)) 0) do [\PUTBASE DEST.BASE WORD (LOGOR (SETQ FILL.BITS (\GETBASE DEST.BASE WORD)) (SUB1 (SETQ MASK (RIGHT.BIT SEARCH.BITS] (RETURN (LOGAND FILL.BITS MASK)) by (PROGN (\PUTBASE DEST.BASE WORD (CONSTANT (MASK.1'S 0 16))) (SUB1 WORD] [PUTPROPS SET.BIT MACRO ((BASE WORD MASK) (change (fetch (BITMAPWORD BITS) of (\ADDBASE BASE WORD)) (LOGOR DATUM MASK] (PUTPROPS TEST.BIT MACRO ((BASE WORD MASK) (LOGAND (\GETBASE BASE WORD) MASK))) (PUTPROPS WANT.TO.EXTEND MACRO ((THIS.DIR NEXT.DIR) (IGREATERP (LOGAND (IDIFFERENCE THIS.DIR 3) 7) NEXT.DIR))) ) (DECLARE%: EVAL@COMPILE (RECORD TASK (W . M)) ) ) (RPAQQ \FILLREGION.FNS (AUTO.FILL FILL.KERNEL FILL.REGION REMOVE.SINGLE.POINTS)) (DEFINEQ (AUTO.FILL [LAMBDA (SHADE) (* JWogulis "28-Feb-85 09:03") (PROG ((W (WHICHW))) (GETMOUSESTATE) (RETURN (FILL.REGION W (CONS (LASTMOUSEX W) (LASTMOUSEY W)) SHADE]) (FILL.KERNEL [LAMBDA (SRCE.BASE DEST.BASE WORDNUM BITMASK RASTERWIDTH) (* mgb%: "15-Mar-85 01:54") (* * Appalling PROG structure instead of CLISP is to permit only one expansion  of CIRCLE.ABOUT macro) (PROG (TASK.W TASK.M AGENDA FREELIST TASK CIRCLE.PREV.W CIRCLE.PREV.M CIRCLE.WORD CIRCLE.MASK CIRCLE.THIS.DIR CIRCLE.NEXT.DIR CIRCLE.EXTEND SEARCH.BITS SEARCH.EXTENDEDMASK SEARCH.MASKEDBITS FILL.BITS KERNEL.WORD KERNEL.MASK KERNEL.THIS.DIR KERNEL.NEXT.DIR INITIALIZED) (SETQ KERNEL.WORD WORDNUM) (SETQ KERNEL.MASK BITMASK) (INC.X KERNEL.WORD KERNEL.MASK) (SEARCH KERNEL.WORD KERNEL.MASK) (GO DO.CIRCLE) TASK.LOOP (if (NULL AGENDA) then (RETURN)) (SETQ TASK (POP.TASK)) (SETQ TASK.W (fetch (TASK W) of TASK)) (SETQ TASK.M (fetch (TASK M) of TASK)) (SETQ KERNEL.NEXT.DIR 2) SEED.LOOP (SETQ KERNEL.THIS.DIR KERNEL.NEXT.DIR) (SETQ KERNEL.WORD TASK.W) (SETQ KERNEL.MASK TASK.M) (NEXT.POINT.ON.CURVE TASK.W TASK.M KERNEL.THIS.DIR KERNEL.NEXT.DIR) (if [NOT (AND (WANT.TO.EXTEND KERNEL.THIS.DIR KERNEL.NEXT.DIR) (PROGN (DEC.X KERNEL.WORD KERNEL.MASK) (EQ 0 (TEST.BIT DEST.BASE KERNEL.WORD KERNEL.MASK] then (GO TASK.LOOP)) (if (NEQ 0 (SEARCH.AND.FILL KERNEL.WORD KERNEL.MASK)) then (GO SEED.LOOP)) DO.CIRCLE (CIRCLE.ABOUT KERNEL.WORD KERNEL.MASK) (if INITIALIZED then (GO SEED.LOOP) else (SETQ INITIALIZED T) (GO TASK.LOOP]) (FILL.REGION [LAMBDA (WINDOW.OR.BM INTERIOR.POS SHADE) (* mgb%: "15-Mar-85 01:51") (* * This function has been "optimised" for performance.  Any resemblance to structured programming is purely coincidental.) [PROG ((X (CAR INTERIOR.POS)) (Y (CDR INTERIOR.POS)) WIDTH HEIGHT SRCE.BM SRCE.BASE DEST.BM DEST.BASE INVERTFLG? RASTERWIDTH TEMP.SHADE) (if (WINDOWP WINDOW.OR.BM) then (SETQ WIDTH (WINDOWPROP WINDOW.OR.BM 'WIDTH)) (SETQ HEIGHT (WINDOWPROP WINDOW.OR.BM 'HEIGHT)) elseif (BITMAPP WINDOW.OR.BM) then (SETQ WIDTH (BITMAPWIDTH WINDOW.OR.BM)) (SETQ HEIGHT (BITMAPHEIGHT WINDOW.OR.BM)) else (RETURN (ERROR "Must be either window or bitmap:" WINDOW.OR.BM))) (if (OR (LESSP X 0) (LESSP Y 0) (IGEQ X WIDTH) (IGEQ Y HEIGHT)) then (RETURN (ERROR "Outside of the window or bitmap:" INTERIOR.POS))) (add WIDTH 2) (add HEIGHT 2) (SETQ SRCE.BM (BITMAPCREATE WIDTH HEIGHT)) (SETQ DEST.BM (BITMAPCREATE WIDTH HEIGHT)) (SETQ INVERTFLG? (NEQ 0 (BITMAPBIT WINDOW.OR.BM X Y))) (* Above%: INVERTFLG? is T if we start on a black pixel instead of a white one.  XPOS will be the x position of the bitmap that is the first point on the edge  of the figure to be filled.) (SETQ SRCE.BASE (ffetch BITMAPBASE of SRCE.BM)) (SETQ RASTERWIDTH (ffetch BITMAPRASTERWIDTH of SRCE.BM)) (SETQ DEST.BASE (ffetch BITMAPBASE of DEST.BM)) (BITBLT WINDOW.OR.BM 0 0 SRCE.BM 1 1 NIL NIL (if INVERTFLG? then 'INVERT)) (* This will remove all the points in the window that have no one adjacent.  This is a special case and be dealt with more easily at thislevel than in the  program.) (REMOVE.SINGLE.POINTS SRCE.BM DEST.BM) (BITBLT DEST.BM 0 0 SRCE.BM 0 0 NIL NIL 'INPUT 'ERASE) (* NOW DO SOMETHING REALLY UGLY. Here we put a 1 bit border around the whole  window (which has been enlarged to hold it) so that we never run off the edge  and the window gets filled up. This also makes the fast versions of BITMAPBIT  fast, i.e. no checking for within the boundaries.) (BITBLT NIL NIL NIL SRCE.BM 0 0 1 NIL 'TEXTURE NIL 65535) (BITBLT NIL NIL NIL SRCE.BM 0 0 NIL 1 'TEXTURE NIL 65535) (BITBLT NIL NIL NIL SRCE.BM 0 (SUB1 HEIGHT) NIL 1 'TEXTURE NIL 65535) (BITBLT NIL NIL NIL SRCE.BM (SUB1 WIDTH) 0 1 NIL 'TEXTURE NIL 65535) (FILL.KERNEL SRCE.BASE DEST.BASE (IPLUS (LRSH X 4) (ITIMES (SUB1 (IDIFFERENCE HEIGHT (ADD1 Y))) RASTERWIDTH)) (ELT BITMASKARRAY (LOGAND X 15)) RASTERWIDTH) (BITBLT DEST.BM 1 1 WINDOW.OR.BM 0 0 NIL NIL 'MERGE (if INVERTFLG? then 'ERASE else 'PAINT) (if (NOT INVERTFLG?) then SHADE elseif (BITMAPP SHADE) then (SETQ TEMP.SHADE (BITMAPCREATE (BITMAPWIDTH SHADE) (BITMAPHEIGHT SHADE))) (BITBLT SHADE NIL NIL TEMP.SHADE NIL NIL NIL NIL 'INVERT) TEMP.SHADE else (LOGNOT SHADE] WINDOW.OR.BM]) (REMOVE.SINGLE.POINTS [LAMBDA (BITMAP RESULT.BM) (* edited%: " 8-Mar-85 01:22") (BITBLT BITMAP 0 0 RESULT.BM) (for X from -1 to 1 do (for Y from -1 to 1 do (if (NOT (AND (EQ 0 X) (EQ 0 Y))) then (BITBLT BITMAP X Y RESULT.BM 0 0 NIL NIL 'INPUT 'ERASE]) ) (DEFMACRO psetf (&BODY XCL-USER::BODY) (CL:APPEND (LIST 'CL:PSETF) XCL-USER::BODY)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (BLOCK%: FILLREGION AUTO.FILL FILL.KERNEL FILL.REGION REMOVE.SINGLE.POINTS (ENTRIES AUTO.FILL FILL.REGION) (GLOBALVARS BITMASKARRAY) (LOCALVARS . T)) ) (PUTPROPS FILLREGION COPYRIGHT ("Xerox Corporation" 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (13174 19700 (AUTO.FILL 13184 . 13495) (FILL.KERNEL 13497 . 15318) (FILL.REGION 15320 . 19281) (REMOVE.SINGLE.POINTS 19283 . 19698))))) STOP \ No newline at end of file diff --git a/lispusers/FILLREGION.TEDIT b/lispusers/FILLREGION.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..d7c4b6706e7b785aa53cbd1a7f607373eb963a6e GIT binary patch literal 11080 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 M*mv3b-~HqN0uBEhX8-^I literal 0 HcmV?d00001 diff --git a/lispusers/FIND-CITATION b/lispusers/FIND-CITATION new file mode 100644 index 00000000..ea4c7022 --- /dev/null +++ b/lispusers/FIND-CITATION @@ -0,0 +1 @@ +(FILECREATED "25-Nov-86 13:31:13" {PHYLUM}LISP>FIND-CITATION.;8 7942 changes to: (VARS FIND-CITATIONCOMS) previous date: "20-Nov-86 13:22:36" {PHYLUM}LISP>FIND-CITATION.;6) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT FIND-CITATIONCOMS) (RPAQQ FIND-CITATIONCOMS ((INITVARS (*citation-files* (QUOTE ({PHYLUM}DOC>BIBLIOGRAPHY.TEDIT))) (*citation-icon-pos* (CREATEPOSITION 920 600)) (*citation-region* (CREATEREGION 269 239 523 185))) (VARS *citation-mask* *citationbm*) (FNS CitationLookup) (FILES LOOKUPINFILES) (P (CitationLookup)))) (RPAQ? *citation-files* (QUOTE ({PHYLUM}DOC>BIBLIOGRAPHY.TEDIT))) (RPAQ? *citation-icon-pos* (CREATEPOSITION 920 600)) (RPAQ? *citation-region* (CREATEREGION 269 239 523 185)) (RPAQ *citation-mask* (READBITMAP)) (100 106 "H@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@OOOOOOOOOOOOOOOO@@@@@@@@@@" "@@OOOOOOOOOOOOOOOOH@@@@@@@@@" "@@OOOOOOOOOOOOOOOON@@@@@@@@@" "@@OOOOOOOOOOOOOOOOOH@@@@@@@@" "@@OOOOOOOOOOOOOOOOON@@@@@@@@" "@@OOOOOOOOOOOOOOOOOO@@@@@@@@" "@@OOOOOOOOOOOOOOOOOOL@@@@@@@" "@@OOOOOOOOOOOOOOOOOOO@@@@@@@" "@@OOOOOOOOOOOOOOOOOOOL@@@@@@" "@@OOOOOOOOOOOOOOOOOOOOH@@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@OOOOOOOOOOOOOOOOOOOOON@@@@" "@@GOOOOOOOOOOOOOOOOOOOON@@@@" "@@GOOOOOOOOOOOOOOOOOOOON@@@@" "@@COOOOOOOOOOOOOOOOOOOON@@@@" "@@AOOOOOOOOOOOOOOOOOOOON@@@@" "@@@OOOOOOOOOOOOOOOOOOOON@@@@" "@@@GOOOOOOOOOOOOOOOOOOON@@@@" "@@@COOOOOOOOOOOOOOOOOOON@@@@" "@@@AOOOOOOOOOOOOOOOOOOON@@@@" "@@@@OOOOOOOOOOOOOOOOOOON@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@" "@@@@@@@@@@@@@@@@@@@@@@@@@@@@") (RPAQ *citationbm* (READBITMAP)) (100 106 "OOOOOOOOOOOOOOOOOOOOOOOOO@@@" "OOOOOOOOOOOOOOOOOOOOOOOOO@@@" "L@@@@@@@@@@@@@@@@@@@@@@@C@@@" "L@@@@@@@@@@@@@@@@@@@@@@@C@@@" "LMKFFMKFFMKFFMKFFMKFFMKFC@@@" "LFOOOOOOOOOOOOOOOOOOKFNMC@@@" "LKOOOOOOOOOOOOOOOOONMKGFC@@@" "LFOOOOOOOOOOOOOOOOOOKFMKC@@@" "LMO@AA@@CH@@@H@H@@@GFMJMC@@@" "LKOOOOOOOOOOOOOOOOOOMKGFC@@@" "LFOH@MJH@@F@@@@@@@B@OFMKC@@@" "LMOOOOOOOOOOOHGOOOOOOMJMC@@@" "LKMO@@@@@F@@@OL@@C@@@OOFC@@@" "LKLOOOOOOOOOOOOOOOOOOOOOC@@@" "LMLGOOOOOOOOOOOOOOOOOOONC@@@" "LFLAOOOOOOOOOOOOOOOOOOOOC@@@" "LKL@CN@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@OCGNA@OMINGCCH@OC@@@" "LKL@@N@AIKAHCHCAKCGCFD@OC@@@" "LML@@N@AHCAHCHCAKCGKG@@NC@@@" "LFL@@N@AHCAHFLCAKCGKCH@OC@@@" "LKL@@N@AHCAHFLCAKCFOAL@OC@@@" "LML@@N@AIKAHONCAKCFODL@NC@@@" "LFL@@N@@OCAHLFCAINFGCH@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LJL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LEL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKL@@N@@@@@@@@@@@@@@@@@NC@@@" "LFL@@N@@@@@@@@@@@@@@@@@OC@@@" "LML@@N@@@@@@@@@@@@@@@@@OC@@@" "LKN@@N@@@@@@@@@@@@@@@@@NC@@@" "LKG@@N@@@@@@@@@@@@@@@@@OC@@@" "LMOH@N@@@@@@@@@@@@@@@@@NC@@@" "LFON@N@@@@@@@@@@@@@@@@@OC@@@" "LKEOHN@@@@@@@@@@@@@@@@@OC@@@" "LMKGOOOOOOOOOOOOOOOOOOONC@@@" "LFNMOOOOOOOOOOOOOOOOOOOOC@@@" "LKEKOOOOOOOOOOOOOOOOOOOOC@@@" "LMKFFMKFFMKFFMKFFMKFFMKFC@@@" "LFNMKFNMKFNMKFNMKFNMKFNMC@@@" "L@@@@@@@@@@@@@@@@@@@@@@@C@@@" "L@@@@@@@@@@@@@@@@@@@@@@@C@@@" "OOOOOOOOOOOOOOOOOOOOOOOOO@@@" "OOOOOOOOOOOOOOOOOOOOOOOOO@@@") (DEFINEQ (CitationLookup [LAMBDA NIL (* dgb:  "19-Nov-86 18:27") (MakeLookupWindow *citation-files* (QUOTE Citation% Lookup) *citation-region* *citationbm* *citation-mask* *citation-icon-pos*]) ) (FILESLOAD LOOKUPINFILES) (CitationLookup) (PUTPROPS FIND-CITATION COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (7531 7815 (CitationLookup 7541 . 7813))))) STOP \ No newline at end of file diff --git a/lispusers/FINGER b/lispusers/FINGER new file mode 100644 index 00000000..e5fd18bf --- /dev/null +++ b/lispusers/FINGER @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "15-Sep-88 10:44:56" |{EG:PARC:XEROX}LISP>USERS>FINGER.;5| 30905 changes to%: (FNS FINGER SEND.FINGER.REQUEST REFINGER FINGER.CONTAINS? FINGER.SETUP.WINDOW FINGER.MENU.SELECTED FINGER.SETUP.MENU \FINGER.PRINTFN STRING.NOT.NUMERIC FINGER.SERVER WAIT.FOR.FINGER.PACKET END.FINGER BACKGROUND.FINGER.SERVER TRACE.FINGER) (VARS FINGERCOMS) (FUNCTIONS NETS.WITHIN) previous date%: "14-Sep-88 18:05:53" |{EG:PARC:XEROX}LISP>USERS>FINGER.;4|) (* " Copyright (c) 1985, 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT FINGERCOMS) (RPAQQ FINGERCOMS ( (* ;; "Modified 6-April-87 by smL to interface to TALK; 14-Sep-88 to work in Medley") (P (IF (BOUNDP 'FINGER.WINDOW) THEN (END.FINGER))) (FNS FINGER REFINGER FINGER.CONTAINS? SEND.FINGER.REQUEST STRING.NOT.NUMERIC) (FUNCTIONS NETS.WITHIN) (INITVARS (FINGER.TIMEOUT 1000) (FINGER.NET.HOPS 2) (FINGER.BASE.DATE (IDATE "14-Mar-84 00:00:00")) (FINGER.CROWD NIL) (FINGER.INFINITY.MINUTES 90) (FINGER.CAPABILITIES '(TALK (AND (GETD 'TALK) (NOT TALK.GAG) (FIND.PROCESS 'COURIER.LISTENER) T) IDLING \IDLING SYSTEM 'Lisp))) (* ;; "Tablebrowser and window stuff") (FNS FINGER.SETUP.WINDOW FINGER.MENU.SELECTED FINGER.SETUP.MENU \FINGER.PRINTFN) (FILES ICONW TABLEBROWSER) (BITMAPS FINGER.ICON.BITMAP FINGER.ICON.MASK FINGER.INFINITY.BITMAP) (VARS (FINGER.MENU)) (INITVARS (FINGER.ICON.POSITION (CREATE POSITION XCOORD _ 900 YCOORD _ 500)) (FINGER.ICON (ICONW FINGER.ICON.BITMAP FINGER.ICON.MASK FINGER.ICON.POSITION T)) (FINGER.DISPLAY.WIDTH 290) (FINGER.DISPLAY.HEIGHT 140) (FINGER.DISPLAY.POSITION (CREATE POSITION XCOORD _ (IDIFFERENCE SCREENWIDTH FINGER.DISPLAY.WIDTH) YCOORD _ 0))) (* ;; "Responding to finger requests on the net") (FNS FINGER.SERVER WAIT.FOR.FINGER.PACKET END.FINGER BACKGROUND.FINGER.SERVER) (* ;; "Ether info") (CONSTANTS (FINGER.SERVER.SOCKET# 199) (\XIPT.FINGERRESPONSE 20) (\XIPT.FINGERREQUEST 21)) (ALISTS (XIPTYPES \XIPT.FINGERRESPONSE \XIPT.FINGERREQUEST)) (FNS TRACE.FINGER) (* ;; "Start up Finger") (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (P (FINGER.SERVER) (FINGER))) (* ;; "Compiler stuff") (DECLARE%: EVAL@LOAD DONTCOPY (P (LOADCOMP 'LLNS)) (FILES TABLEBROWSERDECLS) (RECORDS FINGER.HOST) (GLOBALVARS FINGER.TIMEOUT FINGER.NET.HOPS FINGER.BASE.DATE FINGER.INFINITY.MINUTES FINGER.ICON.POSITION FINGER.ICON FINGER.ICON.BITMAP FINGER.ICON.MASK FINGER.INFINITY.BITMAP FINGER.DISPLAY.WIDTH FINGER.DISPLAY.HEIGHT FINGER.DISPLAY.POSITION)) (* ;; "hints to the file manager") (PROP MAKEFILE-ENVIRONMENT FINGER))) (* ;; "Modified 6-April-87 by smL to interface to TALK; 14-Sep-88 to work in Medley") (IF (BOUNDP 'FINGER.WINDOW) THEN (END.FINGER)) (DEFINEQ (FINGER (LAMBDA (WHO HOST HOPS ICON?) (* ; "Edited 15-Sep-88 10:43 by smL") (LET ((USERS (CL:SORT (SEND.FINGER.REQUEST (OR HOPS FINGER.NET.HOPS)) #'(CL:LAMBDA (USER1 USER2) (CL:STRING< (FETCH (FINGER.HOST USERNAME) OF USER1) (FETCH (FINGER.HOST USERNAME) OF USER2))))) (WHOM (OR WHO FINGER.CROWD))) (if (OR (NOT (BOUNDP 'FINGER.BROWSER)) (NOT (BOUNDP 'FINGER.WINDOW))) then (FINGER.SETUP.WINDOW ICON?)) (if ICON? then (* ;; "if the icon? is true then just set up the window without opening it or sending a request") (if (NOT (OPENWP FINGER.ICON)) then (TOTOPW FINGER.ICON)) else (WINDOWPROP FINGER.WINDOW 'TITLE (CONCAT "Finger Display at " (SUBSTRING (DATE) 11 15))) (TB.REPLACE.ITEMS FINGER.BROWSER) (for P in USERS when (COND ((AND WHOM HOST) (OR (FINGER.CONTAINS? (CADR P) WHOM) (FINGER.CONTAINS? (CAR P) HOST))) (WHOM (FINGER.CONTAINS? (CADR P) WHOM)) (HOST (FINGER.CONTAINS? (CAR P) HOST)) (T T)) do (TB.INSERT.ITEM FINGER.BROWSER (create TABLEITEM TIDATA _ P TIUNDELETABLE _ T TIUNSELECTABLE _ (NOT (LISTGET (fetch CAPABILITIES of P) 'TALK))))) (TB.REDISPLAY.ITEMS FINGER.BROWSER))))) (REFINGER (LAMBDA (W) (* ; "Edited 14-Sep-88 18:03 by smL") (* ;; "dummy fun to call finger w/ no args, so can use as redisplayfn, etc.") (FINGER))) (FINGER.CONTAINS? (LAMBDA (ELEMENT L) (* ; "Edited 14-Sep-88 18:03 by smL") (* ;; "returns non-nil if element is list or is contained in list. case-insensitive compare used") (COND ((TYPENAMEP L 'LISTP) (MEMB (U-CASE ELEMENT) (for X in L collect (U-CASE X)))) (T (EQ (U-CASE ELEMENT) (U-CASE L)))))) (SEND.FINGER.REQUEST (LAMBDA (NET.HOPS) (* ; "Edited 15-Sep-88 10:44 by smL") (LET (FINGER.PACKET FINGER.USER.SOCKET NETS RESPONSES UNIQUERESULTS) (RESETLST (RESETSAVE NIL (LIST 'CLOSENSOCKET (SETQ FINGER.USER.SOCKET (OPENNSOCKET)))) (* ;; "Allocate a socket to send on") (SETQ NETS (NETS.WITHIN NET.HOPS)) (* ;; "send this to every one on the net in question TWICE") (for NET in (APPEND NETS NETS) do (* ;; "Get the xip") (SETQ FINGER.PACKET (ALLOCATE.XIP)) (\FILLINXIP \XIPT.FINGERREQUEST FINGER.USER.SOCKET BROADCASTNSHOSTNUMBER FINGER.SERVER.SOCKET# NET \XIPOVLEN FINGER.PACKET) (SENDXIP FINGER.USER.SOCKET FINGER.PACKET) (RELEASE.XIP FINGER.PACKET) (BLOCK)) (SETQ RESPONSES (for P in (bind PACKET while (SETQ PACKET (GETXIP FINGER.USER.SOCKET FINGER.TIMEOUT)) collect PACKET) bind PACKET.STREAM DATA collect (SETQ PACKET.STREAM (OPENSTRINGSTREAM (\GETBASESTRING (fetch XIPCONTENTS of P) 0 (IDIFFERENCE (fetch XIPLENGTH of P) \XIPOVLEN)))) (SETQ DATA (CAR (NLSETQ (READ PACKET.STREAM)))) (CLOSEF? PACKET.STREAM) (* ;; "don't die on old finger packets when the user was not logged in") (if (NUMBERP (CADR DATA)) then (SETQ DATA (CONS (CAR DATA) (CONS "[none]" (CDR DATA))))) DATA)) (* ;; "The responses are not necessarily eq for the same machine") (for DATALIST in RESPONSES when (AND DATALIST (NOT (SASSOC (CAR DATALIST) UNIQUERESULTS))) do (SETQ UNIQUERESULTS (CONS DATALIST UNIQUERESULTS))) UNIQUERESULTS)))) (STRING.NOT.NUMERIC (LAMBDA (S) (* edited%: " 3-Aug-84 10:21") (AND (STRPOSL (CONSTANT (MAKEBITTABLE (CHCON "0123456789") T)) S) S))) ) (CL:DEFUN NETS.WITHIN (HOPS) (DECLARE (GLOBAL \NS.ROUTING.TABLE)) (LET ((NETS NIL)) (\MAP.ROUTING.TABLE \NS.ROUTING.TABLE #'(CL:LAMBDA (ENTRY) (CL:WHEN (<= (fetch (ROUTING RTHOPCOUNT) of ENTRY) HOPS) (CL:SETQ NETS (CONS (fetch (ROUTING RTNET# ) of ENTRY) NETS))))) NETS)) (RPAQ? FINGER.TIMEOUT 1000) (RPAQ? FINGER.NET.HOPS 2) (RPAQ? FINGER.BASE.DATE (IDATE "14-Mar-84 00:00:00")) (RPAQ? FINGER.CROWD NIL) (RPAQ? FINGER.INFINITY.MINUTES 90) (RPAQ? FINGER.CAPABILITIES '(TALK (AND (GETD 'TALK) (NOT TALK.GAG) (FIND.PROCESS 'COURIER.LISTENER) T) IDLING \IDLING SYSTEM 'Lisp)) (* ;; "Tablebrowser and window stuff") (DEFINEQ (FINGER.SETUP.WINDOW (LAMBDA (ICON?) (* ; "Edited 14-Sep-88 18:04 by smL") (SETQ FINGER.WINDOW (CREATEW (CREATEREGION (fetch XCOORD of FINGER.DISPLAY.POSITION) (fetch YCOORD of FINGER.DISPLAY.POSITION) FINGER.DISPLAY.WIDTH (HEIGHTIFWINDOW FINGER.DISPLAY.HEIGHT T)) "Finger Display Window" NIL NIL)) (SETQ FINGER.BROWSER (TB.MAKE.BROWSER NIL FINGER.WINDOW '(PRINTFN \FINGER.PRINTFN))) (WINDOWPROP FINGER.WINDOW 'ICON FINGER.ICON) (WINDOWPROP FINGER.WINDOW 'SCROLLEXTENTUSE (CONS 'LIMIT 'LIMIT)) (WINDOWADDPROP FINGER.WINDOW 'EXPANDFN 'REFINGER) (WINDOWADDPROP FINGER.WINDOW 'CLOSEFN '(LAMBDA NIL (SETQ FINGER.WINDOW 'NOBIND))) (* ; "REFINGER is a dummy fn to call FINGER with no arguments.") (WINDOWADDPROP FINGER.WINDOW 'RESHAPEFN 'REFINGER) (FINGER.SETUP.MENU FINGER.WINDOW FINGER.BROWSER) (LET ((FINGER.PROMPT.WINDOW (GETPROMPTWINDOW FINGER.WINDOW 1 (FONTCREATE 'HELVETICA 10)))) (WINDOWPROP FINGER.PROMPT.WINDOW 'MINSIZE (CONS 0 (fetch (REGION HEIGHT) of (WINDOWPROP FINGER.PROMPT.WINDOW 'REGION)))) (WINDOWPROP FINGER.PROMPT.WINDOW 'MAXSIZE (CONS 64000 (fetch (REGION HEIGHT) of (WINDOWPROP FINGER.PROMPT.WINDOW 'REGION)))) (LINELENGTH MAX.SMALLP FINGER.PROMPT.WINDOW)) (if ICON? then (SHRINKW FINGER.WINDOW NIL FINGER.ICON.POSITION) else (* ; "shouldn't need to open this, but for the moment, one has to") (OPENW FINGER.ICON) (MOVEW FINGER.ICON FINGER.ICON.POSITION) (CLOSEW FINGER.ICON)))) (FINGER.MENU.SELECTED (LAMBDA (ITEM MENU MOUSE) (* ; "Edited 14-Sep-88 18:04 by smL") (if ITEM then (LET* ((browser (GETMENUPROP MENU 'TB)) (promptwindow (GETPROMPTWINDOW (TB.WINDOW browser)))) (DECLARE%: (SPECVARS promptwindow)) (ALLOW.BUTTON.EVENTS) (SHADEITEM ITEM MENU MENUSELECTSHADE) (SELECTQ (CAR ITEM) (Update (FINGER)) (Talk (if (GETD 'TALK) then (TB.MAP.SELECTED.ITEMS browser (FUNCTION (LAMBDA (browser item) (DECLARE%: (SPECVARS promptwindow)) (LET ((host (fetch TIDATA of item)) talkresult) (if (NOT (NULL (LISTGET (fetch CAPABILITIES of host) 'TALK))) then (printout promptwindow T "Trying to talk to " (fetch USERNAME of host) "...") (SETQ talkresult (TALK (fetch (FINGER.HOST NSHOSTNUMBER) of host))) (SELECTQ talkresult (T (printout promptwindow T "Talking to " (fetch USERNAME of host) ".")) (NIL (printout promptwindow T "Talk to " (fetch USERNAME of host) " aborted.")) (printout promptwindow T talkresult)) else (printout promptwindow T (fetch USERNAME of host) " on " (fetch HOSTNAME of host) " is not running TALK."))))) (FUNCTION (LAMBDA (browser) (DECLARE%: (SPECVARS promptwindow)) (printout promptwindow T "No hosts selected to TALK to.")))) else (printout promptwindow T "Can't -- TALK is not loaded"))) NIL) (SHADEITEM ITEM MENU WHITESHADE))))) (FINGER.SETUP.MENU (LAMBDA (WINDOW TABLE.BROWSER) (* ; "Edited 14-Sep-88 18:04 by smL") (SETQ FINGER.MENU (create MENU ITEMS _ '((Update NIL "Will update the finger display.") (Talk NIL "Open a TALK connection to the selected people")) WHENSELECTEDFN _ 'FINGER.MENU.SELECTED CENTERFLG _ T MENUOUTLINESIZE _ (IDIFFERENCE WBorder 3) MENUFONT _ (FONTCREATE '(HELVETICA 8 BOLD)))) (ATTACHMENU FINGER.MENU WINDOW) (PUTMENUPROP FINGER.MENU 'TB TABLE.BROWSER))) (\FINGER.PRINTFN (LAMBDA (browser item window) (* ; "Edited 14-Sep-88 18:04 by smL") (NLSETQ (LET* ((FINGER.HOST (fetch TIDATA of item)) (IDLE (fetch IDLE of FINGER.HOST)) (INFINITE.IDLE NIL)) (* ; "seconds of idle time") (if (IGEQ (IQUOTIENT IDLE 60) FINGER.INFINITY.MINUTES) then (SETQ INFINITE.IDLE T) else (SETQ IDLE (SUBSTRING (GDATE (IPLUS FINGER.BASE.DATE IDLE)) 11 15))) (printout window (if (LISTGET (fetch CAPABILITIES of FINGER.HOST) 'TALK) then "+" else " ") (fetch USERNAME of FINGER.HOST) 15 (L-CASE (fetch HOSTNAME of FINGER.HOST) T) 30) (if INFINITE.IDLE then (BITBLT FINGER.INFINITY.BITMAP NIL NIL window (DSPXPOSITION NIL window) (DSPYPOSITION NIL window)) (DSPXPOSITION (IPLUS (BITMAPWIDTH FINGER.INFINITY.BITMAP) (DSPXPOSITION NIL window)) window) else (PRIN1 IDLE window)))))) ) (FILESLOAD ICONW TABLEBROWSER) (RPAQQ FINGER.ICON.BITMAP #*(71 48)@@@@@@@O@@@@@@@@@@@@@@@@@@AOL@@@@@@@@@@@@@@@@@AHN@@@@@@@@@@@@@@@@@AHG@@@@@@@@@@@@@@@@@AHG@@@@@@@@@@@@@@@@@AHC@@@@@@@@@@@@@@@@@CHAH@@@@@@@@@@@@@@@@CHAH@@@@@@@@@@@@@@@@G@AH@@@@@@@@@@@@@@@@OBAH@@@@@@@@@@@@@@@ALCKH@@@@@@@@@@@@@@@CL@C@@@@@@@@@@@@@@@@GH@G@@@@@@AO@@@@@@@@O@@N@@@@@GOOL@@@@@@CN@AL@@@AOOO@N@@@@@@OH@AH@@OOON@@F@@@@@AN@@CKOOOO@@H@F@@@@@GL@@COOOH@@@L@F@@@@@OH@@CN@@@B@@DCN@@@@AN@@@@@@@@C@@GOL@@@@CL@@@@@@@@A@GON@@@@@CH@@B@@@@@COON@@@@@@O@@@B@@@@COON@@@@@OON@@@F@@@@CO@@@@@@@OOH@@@L@@@@GOH@@@@@@L@@@@AH@@@GLCH@@@@@@F@@@@B@@AOL@AH@@@@@@F@@@@D@AO@@@AH@@@@@@F@@@AHDB@@@@AH@@@@@@F@@@G@LDN@@@G@@@@@@@G@@CL@HIC@@GN@@@@@@@C@@F@@HIN@OLGH@@@@@@C@@@@@HL@O@@AH@@@@@@C@@@@@HGOH@@AH@@@@@@C@@@@A@@LD@@AH@@@@@@C@@@@A@AIJ@@G@@@@@@@C@@@@C@AJF@OO@@@@@@@C@@@@B@@IHGHCH@@@@@@C@@@@F@@LCL@AH@@@@@@C@@@@D@@GL@@AH@@@@@@C@@@@D@@@IN@AH@@@@@@C@@@@D@@ABB@GH@@@@@@C@CO@@@@AKLAN@@@@@@@CAOOL@@@@HAOL@@@@@@@CONAO@@@@OOOH@@@@@@@CO@@GO@AOOO@@@@@@@@@@@@@COOOOL@@@@@@@@@@@@@@@AOO@@@@@@@@@@@@ ) (RPAQQ FINGER.ICON.MASK #*(71 48)@@@@@@@O@@@@@@@@@@@@@@@@@@AOL@@@@@@@@@@@@@@@@@AON@@@@@@@@@@@@@@@@@AOO@@@@@@@@@@@@@@@@@AOO@@@@@@@@@@@@@@@@@AOO@@@@@@@@@@@@@@@@@COOH@@@@@@@@@@@@@@@@COOH@@@@@@@@@@@@@@@@GOOH@@@@@@@@@@@@@@@@OOOH@@@@@@@@@@@@@@@AOOOH@@@@@@@@@@@@@@@COOO@@@@@@@@@@@@@@@@GOOO@@@@@@AO@@@@@@@@OOON@@@@@GOOL@@@@@@COOOL@@@AOOOON@@@@@@OOOOH@@OOOOOON@@@@@AOOOOKOOOOOOOON@@@@@GOOOOOOOOOOOOON@@@@@OOOOOOOOOOOOOON@@@@AOOOOOOOOOOOOOOL@@@@COOOOOOOOOOOOON@@@@@COOOOOOOOOOOON@@@@@@OOOOOOOOOOOON@@@@@OOOOOOOOOOOOO@@@@@@@OOOOOOOOOOOOOH@@@@@@OOOOOOOOOOOOOH@@@@@@GOOOOOOOOOOOOH@@@@@@GOOOOOOOOOOOOH@@@@@@GOOOOOOOOOOOOH@@@@@@GOOOOOOOOOOOO@@@@@@@GOOOOOOOOOOON@@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOO@@@@@@@COOOOOOOOOOOO@@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOOOH@@@@@@COOOOOOOOOOON@@@@@@@COOOOOOOOOOOL@@@@@@@CONAOOOOOOOOH@@@@@@@CO@@GOOOOOO@@@@@@@@@@@@@COOOOL@@@@@@@@@@@@@@@AOO@@@@@@@@@@@@ ) (RPAQQ FINGER.INFINITY.BITMAP #*(20 10)@@@@@@@@@@@@@@@@CL@O@@@@GNCOH@@@LCG@L@@@LAN@L@@@LAL@L@@@LCN@L@@@GOCAH@@@CLAO@@@@) (RPAQQ FINGER.MENU NIL) (RPAQ? FINGER.ICON.POSITION (CREATE POSITION XCOORD _ 900 YCOORD _ 500)) (RPAQ? FINGER.ICON (ICONW FINGER.ICON.BITMAP FINGER.ICON.MASK FINGER.ICON.POSITION T)) (RPAQ? FINGER.DISPLAY.WIDTH 290) (RPAQ? FINGER.DISPLAY.HEIGHT 140) (RPAQ? FINGER.DISPLAY.POSITION (CREATE POSITION XCOORD _ (IDIFFERENCE SCREENWIDTH FINGER.DISPLAY.WIDTH) YCOORD _ 0)) (* ;; "Responding to finger requests on the net") (DEFINEQ (FINGER.SERVER (LAMBDA NIL (* ; "Edited 7-Apr-87 15:04 by Briggs") (* ;;; "spawn the process which will wait for finger requests, ensuring that there is only one finger server process.") (DEL.PROCESS (FIND.PROCESS 'Finger% Server)) (while (FIND.PROCESS 'Finger% Server) do (BLOCK)) (* ; "wait for the process to really die") (ADD.PROCESS '(WAIT.FOR.FINGER.PACKET) 'NAME 'Finger% Server 'RESTARTABLE 'HARDRESET) NIL)) (WAIT.FOR.FINGER.PACKET (LAMBDA NIL (* N.H.Briggs " 7-Apr-87 23:39") (* ;; "this function wakes up each time a finger request packet is received, it then sends back etherhostname (or address if no (pup) nameserver) ,the username, and the time since the last keyboard or mouse action.") (LET ((FINGER.SERVER.SOCKET)) (RESETLST (SETQ FINGER.SERVER.SOCKET (OPENNSOCKET FINGER.SERVER.SOCKET# 'ACCEPT)) (RESETSAVE NIL (LIST 'CLOSENSOCKET FINGER.SERVER.SOCKET T)) (DISCARDXIPS FINGER.SERVER.SOCKET) (while T do (AWAIT.EVENT (NSOCKETEVENT FINGER.SERVER.SOCKET)) (NLSETQ (PROG (RESPONSE.XIP DATA IDLETIME) (SETQ RESPONSE.XIP (GETXIP FINGER.SERVER.SOCKET)) (if (OR (NOT RESPONSE.XIP) (NEQ (fetch XIPTYPE of RESPONSE.XIP) \XIPT.FINGERREQUEST)) then (* ; "false alarm, go back to sleep") (RETURN)) (* ;; "format of response is a string containing a list of the data elements") (replace XIPLENGTH of RESPONSE.XIP with \XIPOVLEN) (SETQ IDLETIME (IDIFFERENCE (IDATE) (ALTO.TO.LISP.DATE \LASTUSERACTION))) (SETQ DATA (MKSTRING (create FINGER.HOST HOSTNAME _ (OR (STRING.NOT.NUMERIC (ETHERHOSTNAME NIL T)) (PORTSTRING (ETHERHOSTNUMBER))) USERNAME _ (if (STRING-EQUAL (USERNAME NIL NIL T) "") then "[none]" else (USERNAME NIL NIL T)) IDLE _ IDLETIME NSHOSTNUMBER _ \MY.NSADDRESS CAPABILITIES _ (for CAPABILITY on FINGER.CAPABILITIES by (CDDR CAPABILITY) join (LIST (CAR CAPABILITY) (EVAL (CADR CAPABILITY)))) ) T)) (XIPAPPEND.STRING RESPONSE.XIP DATA) (SWAPXIPADDRESSES RESPONSE.XIP) (* ;; "now have to set the correct source since original dest was nsbroadcastnumber") (replace XIPTYPE of RESPONSE.XIP with \XIPT.FINGERRESPONSE) (replace XIPSOURCEHOST of RESPONSE.XIP with \MY.NSHOSTNUMBER) (replace XIPSOURCENET of RESPONSE.XIP with 0) (replace XIPSOURCESOCKET of RESPONSE.XIP with FINGER.SERVER.SOCKET#) (SENDXIP FINGER.SERVER.SOCKET# RESPONSE.XIP)))))))) (END.FINGER (LAMBDA NIL (* ; "Edited 7-Apr-87 14:52 by Briggs") (DEL.PROCESS (FIND.PROCESS 'Finger% Server)) (if (BOUNDP 'FINGER.ICON) then (if (WINDOWP FINGER.ICON) then (CLOSEW FINGER.ICON))) (if (BOUNDP 'FINGER.WINDOW) then (if (WINDOWP FINGER.WINDOW) then (CLOSEW FINGER.WINDOW)) (SETQ FINGER.WINDOW 'NOBIND)) (if (BOUNDP 'FINGER.BROWSER) then (SETQ FINGER.BROWSER 'NOBIND)) NIL)) (BACKGROUND.FINGER.SERVER (LAMBDA NIL (* N.H.Briggs "15-Apr-87 18:44") (* ;; "this function wakes up each time a finger request packet is received, it then sends back etherhostname (or address if no (pup) nameserver) ,the username, and the time since the last keyboard or mouse action.") (SETQ FINGER.SERVER.SOCKET (OPENNSOCKET FINGER.SERVER.SOCKET# 'ACCEPT)) (AWAIT.EVENT (NSOCKETEVENT FINGER.SERVER.SOCKET) 20) (NLSETQ (PROG (RESPONSE.XIP DATA IDLETIME) (SETQ RESPONSE.XIP (GETXIP FINGER.SERVER.SOCKET)) (if (OR (NOT RESPONSE.XIP) (NEQ (fetch XIPTYPE of RESPONSE.XIP) \XIPT.FINGERREQUEST)) then (* ; "false alarm, go back to sleep") (RETURN)) (* ;; "format of response is a string containing a list of the data elements") (replace XIPLENGTH of RESPONSE.XIP with \XIPOVLEN) (SETQ IDLETIME (IDIFFERENCE (IDATE) (ALTO.TO.LISP.DATE \LASTUSERACTION))) (SETQ DATA (MKSTRING (create FINGER.HOST HOSTNAME _ (OR (STRING.NOT.NUMERIC (ETHERHOSTNAME NIL T)) (PORTSTRING (ETHERHOSTNUMBER))) USERNAME _ (if (STRING-EQUAL (USERNAME NIL NIL T) "") then "[none]" else (USERNAME NIL NIL T)) IDLE _ IDLETIME NSHOSTNUMBER _ \MY.NSADDRESS CAPABILITIES _ (for CAPABILITY on FINGER.CAPABILITIES by (CDDR CAPABILITY) join (LIST (CAR CAPABILITY) (EVAL (CADR CAPABILITY)))) ) T)) (XIPAPPEND.STRING RESPONSE.XIP DATA) (SWAPXIPADDRESSES RESPONSE.XIP) (* ;; "now have to set the correct source since original dest was nsbroadcastnumber") (replace XIPTYPE of RESPONSE.XIP with \XIPT.FINGERRESPONSE) (replace XIPSOURCEHOST of RESPONSE.XIP with \MY.NSHOSTNUMBER) (replace XIPSOURCENET of RESPONSE.XIP with 0) (replace XIPSOURCESOCKET of RESPONSE.XIP with FINGER.SERVER.SOCKET#) (SENDXIP FINGER.SERVER.SOCKET# RESPONSE.XIP))))) ) (* ;; "Ether info") (DECLARE%: EVAL@COMPILE (RPAQQ FINGER.SERVER.SOCKET# 199) (RPAQQ \XIPT.FINGERRESPONSE 20) (RPAQQ \XIPT.FINGERREQUEST 21) (CONSTANTS (FINGER.SERVER.SOCKET# 199) (\XIPT.FINGERRESPONSE 20) (\XIPT.FINGERREQUEST 21)) ) (ADDTOVAR XIPTYPES (\XIPT.FINGERRESPONSE 20) (\XIPT.FINGERREQUEST 21)) (DEFINEQ (TRACE.FINGER (LAMBDA NIL (* smL " 6-Apr-87 17:17") (SETQ XIPONLYTYPES (LIST \XIPT.FINGERREQUEST \XIPT.FINGERRESPONSE)) (XIPTRACE T))) ) (* ;; "Start up Finger") (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE DOCOPY (FINGER.SERVER) (FINGER) ) (* ;; "Compiler stuff") (DECLARE%: EVAL@LOAD DONTCOPY (LOADCOMP 'LLNS) (FILESLOAD TABLEBROWSERDECLS) (DECLARE%: EVAL@COMPILE (RECORD FINGER.HOST (HOSTNAME USERNAME IDLE NSHOSTNUMBER CAPABILITIES)) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS FINGER.TIMEOUT FINGER.NET.HOPS FINGER.BASE.DATE FINGER.INFINITY.MINUTES FINGER.ICON.POSITION FINGER.ICON FINGER.ICON.BITMAP FINGER.ICON.MASK FINGER.INFINITY.BITMAP FINGER.DISPLAY.WIDTH FINGER.DISPLAY.HEIGHT FINGER.DISPLAY.POSITION) ) ) (* ;; "hints to the file manager") (PUTPROPS FINGER MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (PUTPROPS FINGER COPYRIGHT ("Xerox Corporation" 1985 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3811 9845 (FINGER 3821 . 6008) (REFINGER 6010 . 6217) (FINGER.CONTAINS? 6219 . 6625) ( SEND.FINGER.REQUEST 6627 . 9595) (STRING.NOT.NUMERIC 9597 . 9843)) (11149 18743 (FINGER.SETUP.WINDOW 11159 . 13381) (FINGER.MENU.SELECTED 13383 . 16560) (FINGER.SETUP.MENU 16562 . 17242) (\FINGER.PRINTFN 17244 . 18741)) (21438 29521 (FINGER.SERVER 21448 . 22044) (WAIT.FOR.FINGER.PACKET 22046 . 25945) ( END.FINGER 25947 . 26471) (BACKGROUND.FINGER.SERVER 26473 . 29519)) (29871 30074 (TRACE.FINGER 29881 . 30072))))) STOP \ No newline at end of file diff --git a/lispusers/FINGER.TEDIT b/lispusers/FINGER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..943c216de447873d2f99e88369417339fbb7d89b GIT binary patch literal 6149 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 Qq=DZ}B!$1S{wIIANDRE>FM-CREATOR.;12 173736 changes to%: (VARS FM-CREATORCOMS) previous date%: "18-Aug-88 14:11:30" {DSK}ANDRE>FM-CREATOR.;11) (* " Copyright (c) 1988 by Rank Xerox France. Author Andre BLAVIER. All rights reserved. ") (PRETTYCOMPRINT FM-CREATORCOMS) (RPAQQ FM-CREATORCOMS ((PROP MAKEFILE-ENVIRONMENT FM-CREATOR) (* * FMC items record) (RECORDS FMC-ITEM) (* * FMC creation functions) (FNS FMC-CREATE FMC-INSTALL.IP.WINDOW FMC-INSTALL.GP.WINDOW FMC-CREATE.SHADE.MENU FMC-CREATE.SHADE.ITEM) (* * FMC windows functions) (FNS FMC-BUTTONEVENTFN FMC-CLOSEFN FMC-COPYBUTTONEVENTFN FMC-COPYINSERTFN FMC-CURSORMOVEDFN FMC-CURSOROUTFN FMC-EXPANDFN FMC-ICONFN FMC-SHRINKFN FMC-WINDOWENTRYFN) (* * FMC macros) (FUNCTIONS FM-GET.ITEM.LABEL FM-GET.ITEM.STATE FMC-CLEAR.REGION FMC-GET.ITEM FMC-GROUP? FMC-MARK.AS.CHANGED FMC-PUT.ITEM GET.REGION.BOTTOM GET.REGION.HEIGHT GET.REGION.LEFT GET.REGION.WIDTH NULLSTR PUT.REGION.BOTTOM PUT.REGION.HEIGHT PUT.REGION.LEFT PUT.REGION.WIDTH) (* * Right menu functions) (FNS FMC-FIXRIGHTMENU FMC-DORIGHTSELECTION) (* * Selection functions) (FNS FMC-SELECT.ITEM FMC-SELECT.LIST FMC-SELECT.LIST.ITEM FMC-SELECTALL FMC-GET.SELECTION FMC-DESELECT FMC-DESELECT.ITEM FMC-DESELECT.LIST FMC-DESELECT.LIST.ITEM) (* * Property windows functions) (FNS FMC-APPLY FMC-SHOW.ITEM FMC-SHOW.GROUP FMC-NEWITEM FMC-UPDATE.ITEM FMC-UPDATE.GROUP FMC-GET.LABEL FMC-CHOOSE.ITEM.BOXSHADE FMC-CHOOSE.ITEM.BG FMC-GET.MENUPROPS FMC-GET.INITSTATE FMC-EDIT.FN FMC-LINKS) (* * Property windows descriptions) (VARS FMC-IP-DESC FMC-GP-DESC) (* * Creating bitmaps) (FNS FMC-MAKEBITMAP FMC-COMPOUND.BITMAP FMC-SNAPBM) (* * Moving items) (FNS FMC-MOVE.SELECTION FMC-MOVE.BITMAP FMC-TRACK.NEW.ITEM FMC-UPDATE.BM.POSITION FMC-UPDATE.REGION) (* * Shaping items) (FNS FMC-COMPUTE.SHAPE.REGS FMC-SHAPE FMC-BOX.NEWREGIONFN FMC-NOBOX.NEWREGIONFN) (* * Redrawing items) (FNS FMC-REDRAW FMC-REDRAW.ITEM) (* * Deleting and undeleting items) (FNS FMC-DELETE FMC-UNDELETE) (* * GROUPing and UNGROUPing) (FNS FMC-GROUP FMC-UNGROUP) (* * Align and Center functions) (FNS FMC-ALIGN FMC-HCENTER FMC-VCENTER FMC-REL.MOVE) (* * File saving and loading) (FNS FMC-GET FMC-GET.ONE.OBJECT FMC-PUT FMC-PUT.OBJECT) (* * Creating a summary) (FNS FMC-EDIT.INFO FMC-EDIT.INFO.ITEM) (* * Hardcopy functions) (FNS FMC-HARDCOPY FMC-HARDCOPY.ITEM) (* * Creating the desription list) (FNS FMC-COMPUTE FMC-COMPUTE.OBJECT) (* * Miscellaneous) (FNS FMC-CREATE.ITEM.FROM.LIST FMC-DRAW.BOX FMC-CHOOSE.WINDOW.BG FMC-DISPLAY.GRID FMC-SET.GRIDSIZE FMC-FONT->LIST FMC-LIST->FONT FMC-SORT.ITEM.LIST FMC-IMPORT FMC-PROMPTPRINT) (* * Icon stuff) [COMS (BITMAPS FMC-ICON FMC-ICON.MASK) (INITVARS (FMC-ICON.TEMPLATE (create TITLEDICON ICON _ FMC-ICON MASK _ FMC-ICON.MASK TITLEREG _ (CREATEREGION 2 2 70 28] (* *) (COMS (P [OR (SASSOC 'FMCreator BackgroundMenuCommands) (NCONC1 BackgroundMenuCommands '(FMCreator '(FMC-CREATE) "Opens a Free Menu Creator window for use" ] (SETQ BackgroundMenu NIL))) (CURSORS MOVINGCURSOR))) (PUTPROPS FM-CREATOR MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (* * FMC items record) (DECLARE%: EVAL@COMPILE (RECORD FMC-ITEM (TYPE LABEL FONT ID COLLECTION DESELECT MESSAGE INITSTATE BOX BOXSHADE BACKGROUND LINKS OBJECTLIST MENU CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN REGION BITMAP XBMOFFSET YBMOFFSET INFINITEWIDTH USERDATA) XBMOFFSET _ 0 YBMOFFSET _ 0) ) (* * FMC creation functions) (DEFINEQ (FMC-CREATE [LAMBDA NIL (* ; "Edited 18-Aug-88 12:21 by A.BLAVIER") (* ;; "Create a Free-Menu Creator window.") (LET ((Window (CREATEW (LIST LASTMOUSEX LASTMOUSEY 400 200) "Free Menu Creator" 4 T)) (RightMenu (create MENU ITEMS _ `((Redraw 'REDRAW "Redraw the FMC window") [Grid 'GRID "Grid" (SUBITEMS ("No Grid" 'NOGRID) (Size 'SIZE "Specify a grid size" (SUBITEMS 2 3 4 5 6 7 8 9 10)) ("Display Grid" 'DISPLAYGRID) ("Remove Grid Display" 'REMOVEGRIDDISPLAY] ("Delete" 'DELETE "Delete selected item(s)" (SUBITEMS ("Forget save list" 'FORGET.SAVE.LIST "Forget the list of deleted items" ))) ("Undelete" 'UNDELETE.LAST "Undelete last item" (SUBITEMS (Last 'UNDELETE.LAST "Undelete last item") (All 'UNDELETE.ALL "Undelete all deleted item(s)") (List 'UNDELETE.LIST "Undelete one item"))) (Group 'GROUP "Group the selected items") (Ungroup 'UNGROUP "Ungroup the selection") [Align 'ALIGN "Align selected items" (SUBITEMS ("Left sides" 'ALIGNLEFT) ("Right sides" 'ALIGNRIGHT) ("Tops" 'ALIGNTOP) ("Bottoms" 'ALIGNBOTTOM] [Center 'CENTER "Center items" (SUBITEMS (Horizontally 'HCENTER) (Vertically 'VCENTER] ("Select All" 'SELECTALL "Select all the items") ("Background" 'WBACKGROUND "Set the window's background") ("Summary" 'SUMMARY "Create a summary of the items") (Import 'IMPORT "Import items from a Free Menu") (Compute 'COMPUTE "Create the Free Menu description") (Get 'GET "Get items from a file") (Put 'PUT "Put items onto a file") ("Fixed Menu" 'FIXRIGHTMENU "Attach Right Menu")) CENTERFLG _ T)) FMC.PROMPTWINDOW) (PRINTOUT PROMPTWINDOW "FREE MENU CREATOR" T "Copyright (c) 1988 by Rank Xerox France. Author Andre BLAVIER") (SETCURSOR WAITINGCURSOR) (PUTMENUPROP RightMenu 'FMC.WINDOW Window) (* ;; "Initialize window properties") (WINDOWPROP Window 'WINDOWENTRYFN (FUNCTION FMC-WINDOWENTRYFN)) (WINDOWPROP Window 'BUTTONEVENTFN (FUNCTION FMC-BUTTONEVENTFN)) (WINDOWPROP Window 'RIGHTBUTTONFN (FUNCTION FMC-BUTTONEVENTFN)) (WINDOWPROP Window 'CURSORMOVEDFN (FUNCTION FMC-CURSORMOVEDFN)) (WINDOWPROP Window 'CURSOROUTFN (FUNCTION FMC-CURSOROUTFN)) (WINDOWPROP Window 'REPAINTFN (FUNCTION FMC-REDRAW)) (WINDOWPROP Window 'RESHAPEFN (LIST (FUNCTION REPOSITIONATTACHEDWINDOWS) (FUNCTION FMC-REDRAW))) (WINDOWPROP Window 'HARDCOPYFN (FUNCTION FMC-HARDCOPY)) (WINDOWPROP Window 'COPYBUTTONEVENTFN (FUNCTION FMC-COPYBUTTONEVENTFN)) (WINDOWPROP Window 'COPYINSERTFN (FUNCTION FMC-COPYINSERTFN)) (WINDOWPROP Window 'CLOSEFN (FUNCTION FMC-CLOSEFN)) (WINDOWPROP Window 'SHRINKFN (FUNCTION FMC-SHRINKFN)) (WINDOWPROP Window 'ICONFN (FUNCTION FMC-ICONFN)) (WINDOWPROP Window 'EXPANDFN (FUNCTION FMC-EXPANDFN)) (WINDOWPROP Window 'RIGHTMENU RightMenu) (WINDOWPROP Window 'FMC.CHANGED NIL) (* ;  "this flag will be set when any item changing occurs - it is checked before window closing") (* ;; "Create a prompt window") (SETQ FMC.PROMPTWINDOW (CREATEW [CREATEREGION 0 0 100 (HEIGHTIFWINDOW (FONTPROP (DEFAULTFONT 'DISPLAY) 'HEIGHT] NIL NIL T)) (WINDOWPROP FMC.PROMPTWINDOW 'PAGEFULLFN (FUNCTION NILL)) [WINDOWPROP FMC.PROMPTWINDOW 'MAXSIZE (CONS MAX.SMALLP (GET.REGION.HEIGHT (WINDOWPROP FMC.PROMPTWINDOW 'REGION] (DSPSCROLL 'ON FMC.PROMPTWINDOW) (ATTACHWINDOW FMC.PROMPTWINDOW Window 'TOP) (WINDOWPROP FMC.PROMPTWINDOW 'PASSTOMAINCOMS '(MOVEW SHAPEW SHRINKW BURYW)) (WINDOWPROP Window 'FMC.PROMPTWINDOW FMC.PROMPTWINDOW) (* ;; "") (MOVEW Window) (* ;; "Create and attach the Item and Group Properties windows") (SETCURSOR WAITINGCURSOR) (WINDOWPROP Window 'FMC.IP.WINDOW (FMC-INSTALL.IP.WINDOW Window)) (WINDOWPROP Window 'FMC.GP.WINDOW (FMC-INSTALL.GP.WINDOW Window)) (* ;; "Spawn a process") (ADD.PROCESS `(PROGN (TTYDISPLAYSTREAM ,Window) (UNTIL (WINDOWPROP ,Window 'CANCLOSE) DO (BLOCK))) 'NAME 'FMCreator 'WINDOW Window) (* ;; "") (SETCURSOR DEFAULTCURSOR]) (FMC-INSTALL.IP.WINDOW [LAMBDA (WINDOW) (* ; "Edited 16-Aug-88 14:17 by A.BLAVIER") (* ;; "Create and attach the Item Properties window") (PROG ((FMC.IP.Window (FREEMENU FMC-IP-DESC "ITEM PROPERTIES")) (DefaultFont (DEFAULTFONT 'DISPLAY)) FontList ShadeMenu BlackBitmap WhiteBitmap) (* ;; "Initialize Font to DEFAULTFONT") (SETQ FontList (FMC-FONT->LIST DefaultFont)) (FM.CHANGESTATE 'FAMILY (CAR FontList) FMC.IP.Window) (FM.CHANGESTATE 'SIZE (CADR FontList) FMC.IP.Window) (FM.CHANGESTATE 'FACE (CADDR FontList) FMC.IP.Window) (* ;; "the LABEL and MESSAGE edit fields are initially empty") (FM.CHANGELABEL 'LABELLINK "" FMC.IP.Window) (FM.CHANGELABEL 'MESSAGELINK "" FMC.IP.Window) (* ;; "Create the shade menu") (SETQ ShadeMenu (FMC-CREATE.SHADE.MENU)) (SETQ BlackBitmap (CAAR (fetch (MENU ITEMS) of ShadeMenu))) (* ;  "the blackshade bitmap is the first menu item") [SETQ WhiteBitmap (CAAR (NTH (fetch (MENU ITEMS) of ShadeMenu) (SUB1 (LENGTH (fetch (MENU ITEMS) of ShadeMenu] (* ;  "the whiteshade BM is the one before last ") (FM.CHANGESTATE 'BOXSHADE BlackBitmap FMC.IP.Window) (FM.CHANGESTATE 'BACKGROUND WhiteBitmap FMC.IP.Window) (* ;; "initialize window properties") (WINDOWPROP FMC.IP.Window 'SHADE.MENU ShadeMenu) (WINDOWPROP FMC.IP.Window 'FMC.ITEM.BOXSHADE BLACKSHADE) (WINDOWPROP FMC.IP.Window 'FMC.ITEM.BACKGROUND WHITESHADE) [for PROP in '(CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN) do (WINDOWPROP FMC.IP.Window (PACK* 'FMC.ITEM. PROP) '(FUNCTION NILL] (WINDOWPROP FMC.IP.Window 'FMC.ITEM.MENUPROPS '(NIL)) (* ;; "attach the IP window") (ATTACHWINDOW FMC.IP.Window WINDOW 'TOP 'LEFT) (WINDOWPROP FMC.IP.Window 'MAIN.WINDOW WINDOW) (WINDOWPROP FMC.IP.Window 'RESHAPEFN 'DON'T) (RETURN FMC.IP.Window]) (FMC-INSTALL.GP.WINDOW [LAMBDA (WINDOW) (* ; "Edited 16-Aug-88 14:19 by A.BLAVIER") (* ;; "Create and attach the Group Properties window") (PROG ((FMC.GP.Window (FREEMENU FMC-GP-DESC "GROUP PROPERTIES")) (FMC.IP.Window (WINDOWPROP WINDOW 'FMC.IP.WINDOW)) ShadeMenu BlackBitmap WhiteBitmap) (* ;; "see comments of FMC-INSTALL.IP.WINDOW") (SETQ ShadeMenu (WINDOWPROP FMC.IP.Window 'SHADE.MENU)) (SETQ BlackBitmap (CAAR (fetch (MENU ITEMS) of ShadeMenu))) [SETQ WhiteBitmap (CAAR (NTH (fetch (MENU ITEMS) of ShadeMenu) (SUB1 (LENGTH (fetch (MENU ITEMS) of ShadeMenu] (FM.CHANGESTATE 'BOXSHADE BlackBitmap FMC.GP.Window) (FM.CHANGESTATE 'BACKGROUND WhiteBitmap FMC.GP.Window) (WINDOWPROP FMC.GP.Window 'FMC.ITEM.BOXSHADE BLACKSHADE) (WINDOWPROP FMC.GP.Window 'FMC.ITEM.BACKGROUND WHITESHADE) (WINDOWPROP FMC.GP.Window 'SHADE.MENU ShadeMenu) (ATTACHWINDOW FMC.GP.Window FMC.IP.Window 'RIGHT 'BOTTOM) (WINDOWPROP FMC.GP.Window 'MAIN.WINDOW WINDOW) (WINDOWPROP FMC.GP.Window 'RESHAPEFN 'DON'T) (RETURN FMC.GP.Window]) (FMC-CREATE.SHADE.MENU [LAMBDA NIL (* ; "Edited 16-Aug-88 14:21 by A.BLAVIER") (* ;; "Create a shade menu built out of the bitmaps corresponding to Shades.") (LET ((Shades '(65535 43605 38505 52224 61713 5160 32768 0)) ShadeItems) (SETQ ShadeItems (for s in Shades collect (FMC-CREATE.SHADE.ITEM s))) [NCONC1 ShadeItems '("OTHER" (CADADR (FMC-CREATE.SHADE.ITEM (EDITSHADE] (create MENU ITEMS _ ShadeItems ITEMWIDTH _ 60 CENTERFLG _ T TITLE _ "SHADE"]) (FMC-CREATE.SHADE.ITEM [LAMBDA (SHADE) (* ; "Edited 16-Aug-88 14:24 by A.BLAVIER") (* ;; "Compute a shade menu item of the form : (BITMAP (BITMAP . SHADE))") (PROG (Bitmap Stream bm) (SETQ Bitmap (BITMAPCREATE 60 12)) (SETQ Stream (DSPCREATE Bitmap)) (DSPFILL '(0 0 59 12) SHADE 'REPLACE Stream) (DRAWLINE 0 0 0 11 1 'REPLACE Stream) (DRAWLINE 0 11 59 11 1 'REPLACE Stream) (DRAWLINE 59 11 59 0 1 'REPLACE Stream) (DRAWLINE 59 0 0 0 1 'REPLACE Stream) (SETQ bm (BITMAPCOPY Bitmap)) (RETURN (LIST bm (KWOTE (CONS bm SHADE]) ) (* * FMC windows functions) (DEFINEQ (FMC-BUTTONEVENTFN [LAMBDA (WINDOW) (* ; "Edited 16-Aug-88 14:33 by A.BLAVIER") (* ;; "This is the BUTTONEVENTFN attached to FMC windows.") (* ;; "In any case bring the window to top") (TOTOPW WINDOW) (LET ((SelectedItem (WINDOWPROP WINDOW 'SELECTED.ITEM)) (SelectionList (WINDOWPROP WINDOW 'SELECTION.LIST)) Item Timer Reg) (* ;; "") (* ;; "Deal with RIGHT button : pops up either FMC right menu or standard window menu") (if (LASTMOUSESTATE RIGHT) then (if [OR (WINDOWPROP WINDOW 'FIXEDRIGHTMENU) (IGREATERP (fetch (POSITION YCOORD) of (CURSORPOSITION NIL WINDOW)) (WINDOWPROP WINDOW 'HEIGHT] then (DOWINDOWCOM WINDOW) else (FMC-DORIGHTSELECTION (MENU (WINDOWPROP WINDOW 'RIGHTMENU)) WINDOW))) (* ;; "") (* ;; "Deal with LEFT Button") [if [AND (MOUSESTATE (AND LEFT (NOT MIDDLE))) (ILESSP (fetch (POSITION YCOORD) of (CURSORPOSITION NIL WINDOW)) (WINDOWPROP WINDOW 'HEIGHT] then (if [SETQ Item (for i in (WINDOWPROP WINDOW 'ITEMLIST) thereis (INSIDEP (FMC-GET.ITEM i REGION) (CURSORPOSITION NIL WINDOW] then (* ;; "user clicked inside an Item") [if (SHIFTDOWNP 'META) then (* ;; "user Meta-clicked") (if (NOT (FMEMB Item SelectionList)) then (* ;; "if Item is not yet part of a multiple selection add it to the selection") (WINDOWADDPROP WINDOW 'SELECTION.LIST Item) (FMC-SELECT.LIST.ITEM Item WINDOW) (if SelectedItem then (* ;; "Item was the unique selection : make it the only item of a multiple selection") (WINDOWADDPROP WINDOW 'SELECTION.LIST SelectedItem T) (FMC-DESELECT.ITEM WINDOW) (FMC-SELECT.LIST.ITEM SelectedItem WINDOW)) else (* ;; "remove Item from the multiple selection") (FMC-DESELECT.LIST.ITEM Item WINDOW)) else (COND ((EQUAL Item SelectedItem) (* ;  "Item is the unique selected item : move it") (FMC-MOVE.SELECTION WINDOW 'UNIQUE) (FMC-COMPUTE.SHAPE.REGS WINDOW)) ((FMEMB Item SelectionList) (* ;  "Item is a member of a multiple selection : move the selection") (FMC-MOVE.SELECTION WINDOW 'MULTIPLE)) (T (* ;  "Item is not yet selected : make it the unique selection") (FMC-DESELECT WINDOW) (SETQ Timer (SETUPTIMER 20000 NIL 'TICKS 'TICKS)) (WINDOWPROP WINDOW 'SELECTED.ITEM Item) (FMC-SELECT.ITEM WINDOW) [until (OR (MOUSESTATE (NOT LEFT)) (TIMEREXPIRED? Timer 'TICKS] (if (MOUSESTATE LEFT) then (FMC-MOVE.SELECTION WINDOW 'UNIQUE)) (FMC-COMPUTE.SHAPE.REGS WINDOW] else (* ;; "user clicked outside any item") (if (SHIFTDOWNP 'META) then (* ;; "if Meta : select items inside a ghost region") (FMC-GET.SELECTION WINDOW) else (* ;; "remove any selection") (FMC-DESELECT WINDOW] (* ;; "") (* ;; "Deal with MIDDLE Button") [if [AND (MOUSESTATE (AND MIDDLE (NOT LEFT))) (ILESSP (fetch (POSITION YCOORD) of (CURSORPOSITION NIL WINDOW)) (WINDOWPROP WINDOW 'HEIGHT] then (if [SETQ Item (for i in (WINDOWPROP WINDOW 'ITEMLIST) thereis (INSIDEP (FMC-GET.ITEM i REGION) (CURSORPOSITION NIL WINDOW] then (* ;; "user clicked inside an Item") (if (EQUAL Item SelectedItem) then (* ;; "shape the Item") (if [SETQ Reg (for reg in (WINDOWPROP WINDOW 'SHAPE.REGS) thereis (INSIDEP (CAR reg) (CURSORPOSITION NIL WINDOW] then (SETCURSOR (CADDDR Reg)) (APPLY (CADR Reg) (LIST (CADDR Reg) WINDOW))) else (SETCURSOR DEFAULTCURSOR] (* ;; "") (* ;; "The following statement handles the case where the user released the left button in a selected item : adjust the cursor appropriately") (if (MOUSESTATE (AND (NOT LEFT) (NOT MIDDLE) (NOT RIGHT))) then (FMC-CURSORMOVEDFN WINDOW]) (FMC-CLOSEFN [LAMBDA (W) (* ; "Edited 17-Aug-88 10:23 by A.BLAVIER") (* ;; "Attempt to close a FMC window.") (* ;; "Check the FMC.CHANGED property") (if [AND (WINDOWPROP W 'FMC.CHANGED) (NOT (MOUSECONFIRM "Warning ! Not saved yet. LEFT to quit anyway" "" (WINDOWPROP W 'FMC.PROMPTWINDOW] then 'DON'T else (* ;;  "if OK then set the CANCLOSE prop, which is continually checked by the process's main loop") (WINDOWPROP W 'CANCLOSE T]) (FMC-COPYBUTTONEVENTFN [LAMBDA (W) (* ; "Edited 16-Aug-88 14:39 by A.BLAVIER") (* ;; "Copy selected item(s) to another FMC window.") (* ;;  "Check that the destination window (the window that currently has the TTY) is a FMC window") (if (WINDOWPROP (PROCESSPROP (TTY.PROCESS) 'WINDOW) 'FMC.PROMPTWINDOW) then (* ;; "pass a list of the form : (FROM-FMC (selected items ...))") (COPYINSERT (LIST 'FROM-FMC (COND [(WINDOWPROP W 'SELECTED.ITEM) (LIST (COPYALL (WINDOWPROP W 'SELECTED.ITEM] ((WINDOWPROP W 'SELECTION.LIST) (COPYALL (WINDOWPROP W 'SELECTION.LIST]) (FMC-COPYINSERTFN [LAMBDA (OBJ WINDOW) (* ; "Edited 16-Aug-88 14:44 by A.BLAVIER") (* ;; "User is trying to insert some OBJect into the FMC window, using the COPY key.") (COND ((IMAGEOBJP OBJ) (* ;; "if OBJect is an IMAGEOBJ -> make LABEL be its bitmap") (LET (ImageBox Bitmap Stream) (SETQ ImageBox (APPLY (IMAGEOBJPROP OBJ 'IMAGEBOXFN) (LIST OBJ WINDOW))) (SETQ Bitmap (BITMAPCREATE (fetch (IMAGEBOX XSIZE) of ImageBox) (fetch (IMAGEBOX YSIZE) of ImageBox))) (SETQ Stream (DSPCREATE Bitmap)) (APPLY (IMAGEOBJPROP OBJ 'DISPLAYFN) (LIST OBJ Stream 'DISPLAY)) (FM.CHANGELABEL 'LABELLINK Bitmap (WINDOWPROP WINDOW 'FMC.IP.WINDOW) T))) ((EQ (CAR OBJ) 'FROM-FMC) (* ;; " if OBJect is a list of FMC item(s) (coming from another FMC window) -> add them to the window's ITEMLIST") (for item in (CADR OBJ) do (FMC-REDRAW.ITEM item WINDOW) (WINDOWADDPROP WINDOW 'ITEMLIST item)) (if (WINDOWPROP WINDOW 'SELECTED.ITEM) then (FMC-DESELECT.ITEM WINDOW)) (if (WINDOWPROP WINDOW 'SELECTION.LIST) then (FMC-DESELECT.LIST WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST (CADR OBJ)) (FMC-SELECT.LIST WINDOW) (FMC-MARK.AS.CHANGED WINDOW]) (FMC-CURSORMOVEDFN [LAMBDA (WINDOW) (* ; "Edited 16-Aug-88 15:30 by A.BLAVIER") (* ;;  "If the cursor is inside a selected item make it the MOVINGCURSOR, else make it the DEFAULTCURSOR.") (LET (Item) (COND ((AND (SETQ Item (WINDOWPROP WINDOW 'SELECTED.ITEM)) (INSIDEP (FMC-GET.ITEM Item REGION) (CURSORPOSITION NIL WINDOW))) (SETCURSOR MOVINGCURSOR)) ((for i in (WINDOWPROP WINDOW 'SELECTION.LIST) thereis (INSIDEP (FMC-GET.ITEM i REGION) (CURSORPOSITION NIL WINDOW) )) (SETCURSOR MOVINGCURSOR)) (T (SETCURSOR DEFAULTCURSOR]) (FMC-CURSOROUTFN [LAMBDA (W) (* ; "Edited 16-Aug-88 14:06 by A.BLAVIER") (SETCURSOR DEFAULTCURSOR]) (FMC-EXPANDFN [LAMBDA (W) (* ; "Edited 16-Aug-88 15:44 by A.BLAVIER") (if (WINDOWPROP W 'PROCESS) then (* ;; "grab the TTY") (TTY.PROCESS (WINDOWPROP W 'PROCESS]) (FMC-ICONFN [LAMBDA (W) (* ; "Edited 16-Aug-88 15:42 by A.BLAVIER") (* ;; "Return a titled icon when shrinking a FMC window.") (* ;; "This function is extracted from the TEdit ICONFN.") (PROG [(Icon (WINDOWPROP W 'ICON)) (IconTitle (WINDOWPROP W 'FMC.ICON.TITLE)) (WindowTitle (WINDOWPROP W 'TITLE] [COND ((OR (AND IconTitle (EQUAL IconTitle WindowTitle)) (AND (NOT IconTitle) Icon)) NIL) (Icon (WINDOWPROP W 'FMC.ICON.TITLE (SETQ IconTitle WindowTitle)) (ICONTITLE IconTitle NIL NIL Icon)) (T (WINDOWPROP W 'FMC.ICON.TITLE (SETQ IconTitle WindowTitle)) (WINDOWPROP W 'ICON (TITLEDICONW FMC-ICON.TEMPLATE IconTitle '(HELVETICA 8 STANDARD) NIL T NIL 'FILE] (RETURN (WINDOWPROP W 'ICON]) (FMC-SHRINKFN [LAMBDA (W) (* ; "Edited 16-Aug-88 15:45 by A.BLAVIER") (if (AND (EQ (WINDOWPROP W 'PROCESS) (TTY.PROCESS))) then (* ;; "abandon the TTY") (TTY.PROCESS T]) (FMC-WINDOWENTRYFN [LAMBDA (W) (* ; "Edited 17-Aug-88 10:24 by A.BLAVIER") (* ;; "Grab the TTY when the mouse clicks in the window, and process the BUTTONEVENTFN.") (if [AND [NOT (OR (SHIFTDOWNP 'SHIFT) (SHIFTDOWNP 'META) (KEYDOWNP 'MOVE) (KEYDOWNP 'COPY] (PROCESSP (WINDOWPROP W 'PROCESS] then (TTY.PROCESS (WINDOWPROP W 'PROCESS)) (FMC-BUTTONEVENTFN W]) ) (* * FMC macros) (DEFMACRO FM-GET.ITEM.LABEL (ID.OR.LABEL WINDOW) (LIST 'FM.ITEMPROP (LIST 'FM.GETITEM ID.OR.LABEL NIL WINDOW) ''LABEL)) (DEFMACRO FM-GET.ITEM.STATE (ID.OR.LABEL WINDOW) (LIST 'FM.ITEMPROP (LIST 'FM.GETITEM ID.OR.LABEL NIL WINDOW) ''STATE)) (DEFMACRO FMC-CLEAR.REGION (REGION WINDOW) (LIST 'DSPFILL REGION 'WHITESHADE ''REPLACE WINDOW)) (DEFMACRO FMC-GET.ITEM (ITEM FIELD) (LIST 'fetch `(FMC-ITEM ,FIELD) 'of ITEM)) (DEFMACRO FMC-GROUP? (OBJECT) (LIST 'EQ `(FMC-GET.ITEM ,OBJECT TYPE) ''GROUP)) (DEFMACRO FMC-MARK.AS.CHANGED (W) (LIST 'WINDOWPROP W ''FMC.CHANGED T)) (DEFMACRO FMC-PUT.ITEM (ITEM FIELD VALUE) (LIST 'replace `(FMC-ITEM ,FIELD) 'of ITEM 'with VALUE)) (DEFMACRO GET.REGION.BOTTOM (REGION) (LIST 'fetch '(REGION BOTTOM) 'of REGION)) (DEFMACRO GET.REGION.HEIGHT (REGION) (LIST 'fetch '(REGION HEIGHT) 'of REGION)) (DEFMACRO GET.REGION.LEFT (REGION) (LIST 'fetch '(REGION LEFT) 'of REGION)) (DEFMACRO GET.REGION.WIDTH (REGION) (LIST 'fetch '(REGION WIDTH) 'of REGION)) (DEFMACRO NULLSTR (STR) (LIST 'STREQUAL STR "")) (DEFMACRO PUT.REGION.BOTTOM (REGION VALUE) (LIST 'replace '(REGION BOTTOM) 'of REGION 'with VALUE)) (DEFMACRO PUT.REGION.HEIGHT (REGION VALUE) (LIST 'replace '(REGION HEIGHT) 'of REGION 'with VALUE)) (DEFMACRO PUT.REGION.LEFT (REGION VALUE) (LIST 'replace '(REGION LEFT) 'of REGION 'with VALUE)) (DEFMACRO PUT.REGION.WIDTH (REGION VALUE) (LIST 'replace '(REGION WIDTH) 'of REGION 'with VALUE)) (* * Right menu functions) (DEFINEQ (FMC-FIXRIGHTMENU [LAMBDA (WINDOW) (* ; "Edited 25-Jul-88 11:16 by A.BLAVIER") (* ;; " Fix the right menu if not yet attached.") (COND ((NOT (WINDOWPROP WINDOW 'FIXEDRIGHTMENU)) (replace (MENU WHENSELECTEDFN) of (WINDOWPROP WINDOW 'RIGHTMENU) with (FUNCTION FMC-DORIGHTSELECTION)) (LET [(MenuWindow (ATTACHMENU (WINDOWPROP WINDOW 'RIGHTMENU) WINDOW 'RIGHT 'TOP] (WINDOWPROP MenuWindow 'ATTACHEDTO WINDOW) (* ;; "Don't pass CLOSEW to the main window !") (WINDOWPROP MenuWindow 'PASSTOMAINCOMS '(MOVEW SHAPEW SHRINKW BURYW)) [WINDOWPROP MenuWindow 'CLOSEFN (FUNCTION (LAMBDA (MW) (WINDOWPROP (WINDOWPROP MW 'ATTACHEDTO) 'FIXEDRIGHTMENU NIL) (replace (MENU WHENSELECTEDFN) of (WINDOWPROP (WINDOWPROP MW 'ATTACHEDTO) 'RIGHTMENU) with (FUNCTION DEFAULTWHENSELECTEDFN)) (DETACHWINDOW MW] (WINDOWPROP WINDOW 'FIXEDRIGHTMENU MenuWindow]) (FMC-DORIGHTSELECTION [LAMBDA (ITEM MENU.OR.WINDOW BUTTON) (* ; "Edited 17-Aug-88 10:38 by A.BLAVIER") (* ;; "Handles right menu selection either pop-up or fixed.") (LET ([WINDOW (if (WINDOWP MENU.OR.WINDOW) then MENU.OR.WINDOW else (GETMENUPROP MENU.OR.WINDOW 'FMC.WINDOW] (Selection (if (LISTP ITEM) then (EVAL (CADR ITEM)) else ITEM))) (SELECTQ Selection (FIXRIGHTMENU (FMC-FIXRIGHTMENU WINDOW)) (REDRAW (FMC-REDRAW WINDOW)) (GRID (if (WINDOWPROP WINDOW 'GRIDSIZE) then (FMC-PROMPTPRINT (CONCAT "Grid size is " (WINDOWPROP WINDOW 'GRIDSIZE)) WINDOW) else (FMC-PROMPTPRINT "No grid" WINDOW))) ((NOGRID 2 3 4 5 6 7 8 9 10) (FMC-SET.GRIDSIZE Selection WINDOW)) (DISPLAYGRID (FMC-DISPLAY.GRID WINDOW)) (REMOVEGRIDDISPLAY (if (WINDOWPROP WINDOW 'DISPLAYGRID) then (WINDOWPROP WINDOW 'DISPLAYGRID NIL) (FMC-REDRAW WINDOW))) (DELETE (FMC-DELETE WINDOW)) (FORGET.SAVE.LIST (WINDOWPROP WINDOW 'DELETED.ITEMS NIL)) (UNDELETE.LAST (FMC-UNDELETE 'LAST WINDOW)) (UNDELETE.ALL (FMC-UNDELETE 'ALL WINDOW)) (UNDELETE.LIST (FMC-UNDELETE 'LIST WINDOW)) (GROUP (FMC-GROUP WINDOW)) (UNGROUP (FMC-UNGROUP WINDOW)) ((ALIGNLEFT ALIGNRIGHT ALIGNTOP ALIGNBOTTOM) (FMC-ALIGN Selection WINDOW)) (HCENTER (FMC-HCENTER WINDOW)) (VCENTER (FMC-VCENTER WINDOW)) (SELECTALL (FMC-SELECTALL WINDOW)) (WBACKGROUND (FMC-CHOOSE.WINDOW.BG WINDOW)) (SUMMARY (FMC-EDIT.INFO WINDOW)) (IMPORT (FMC-IMPORT WINDOW)) (COMPUTE (FMC-COMPUTE WINDOW)) (GET (FMC-GET WINDOW)) (PUT (FMC-PUT WINDOW)) NIL]) ) (* * Selection functions) (DEFINEQ (FMC-SELECT.ITEM [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 10:50 by A.BLAVIER") (* ;; "Highlight the unique selected item of WINDOW.") (LET ((Item (WINDOWPROP WINDOW 'SELECTED.ITEM)) Reg RLeft RBottom RRight RTop) (SETQ Reg (FMC-GET.ITEM Item REGION)) (SETQ RLeft (IDIFFERENCE (GET.REGION.LEFT Reg) 2)) (SETQ RBottom (IDIFFERENCE (GET.REGION.BOTTOM Reg) 2)) (SETQ RRight (IPLUS (fetch (REGION RIGHT) of Reg) 2)) (SETQ RTop (IPLUS (fetch (REGION TOP) of Reg) 2)) (* ;; "") (DRAWLINE RLeft RBottom RRight RBottom 1 'REPLACE WINDOW NIL '(1 1)) (DRAWLINE RRight RBottom RRight RTop 1 'REPLACE WINDOW NIL '(1 1)) (DRAWLINE RRight RTop RLeft RTop 1 'REPLACE WINDOW NIL '(1 1)) (DRAWLINE RLeft RTop RLeft RBottom 1 'REPLACE WINDOW NIL '(1 1)) (FMC-COMPUTE.SHAPE.REGS WINDOW]) (FMC-SELECT.LIST [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 11:00 by A.BLAVIER") (* ;; "Highlight all the items of a multiple selection.") (for item in (WINDOWPROP WINDOW 'SELECTION.LIST) do (FMC-SELECT.LIST.ITEM item WINDOW]) (FMC-SELECT.LIST.ITEM [LAMBDA (ITEM WINDOW) (* ; "Edited 17-Aug-88 10:56 by A.BLAVIER") (* ;; "Highlight ITEM, member of the selection list, as a part of a multiple selection.") (LET* ((Reg (FMC-GET.ITEM ITEM REGION)) RLeft RBottom RRight RTop) (SETQ RLeft (IDIFFERENCE (GET.REGION.LEFT Reg) 2)) (SETQ RBottom (IDIFFERENCE (GET.REGION.BOTTOM Reg) 2)) (SETQ RRight (IPLUS (fetch (REGION RIGHT) of Reg) 2)) (SETQ RTop (IPLUS (fetch (REGION TOP) of Reg) 2)) (* ;; "") (DRAWLINE RLeft RBottom RRight RBottom 1 'REPLACE WINDOW NIL '(1 3)) (DRAWLINE RRight RBottom RRight RTop 1 'REPLACE WINDOW NIL '(1 3)) (DRAWLINE RRight RTop RLeft RTop 1 'REPLACE WINDOW NIL '(1 3)) (DRAWLINE RLeft RTop RLeft RBottom 1 'REPLACE WINDOW NIL '(1 3]) (FMC-SELECTALL [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 10:58 by A.BLAVIER") (* ;; "Select all the items of WINDOW.") (if (WINDOWPROP WINDOW 'SELECTED.ITEM) then (FMC-DESELECT.ITEM WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST (WINDOWPROP WINDOW 'ITEMLIST)) (FMC-SELECT.LIST WINDOW]) (FMC-GET.SELECTION [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 11:23 by A.BLAVIER") (* ;; "META + LEFT Button outside any item --> let the user select a region and add the enclosed items to the selection list.") (LET ((SelectedItem (WINDOWPROP WINDOW 'SELECTED.ITEM)) (SelectionRegion (GETREGION)) (WLeft (IPLUS (GET.REGION.LEFT (WINDOWPROP WINDOW 'REGION)) 3)) (WBottom (IPLUS (GET.REGION.BOTTOM (WINDOWPROP WINDOW 'REGION)) 3))) (* ;; "convert SelectionRegion from Screen to Window coordinates") (PUT.REGION.LEFT SelectionRegion (IDIFFERENCE (GET.REGION.LEFT SelectionRegion) WLeft)) (PUT.REGION.BOTTOM SelectionRegion (IDIFFERENCE (GET.REGION.BOTTOM SelectionRegion) WBottom)) (for item in (WINDOWPROP WINDOW 'ITEMLIST) do (if (SUBREGIONP SelectionRegion (FMC-GET.ITEM item REGION)) then (WINDOWADDPROP WINDOW 'SELECTION.LIST item) (FMC-SELECT.LIST.ITEM item WINDOW) (if SelectedItem then (* ;; "if there was a unique selection then add it to the multiple selection") (WINDOWADDPROP WINDOW 'SELECTION.LIST SelectedItem T) (FMC-DESELECT.ITEM WINDOW) (FMC-SELECT.LIST.ITEM SelectedItem WINDOW) (SETQ SelectedItem NIL]) (FMC-DESELECT [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 11:24 by A.BLAVIER") (* ;; "Lowlight any selection.") (if (WINDOWPROP WINDOW 'SELECTED.ITEM) then (FMC-DESELECT.ITEM WINDOW)) (if (WINDOWPROP WINDOW 'SELECTION.LIST) then (FMC-DESELECT.LIST WINDOW]) (FMC-DESELECT.ITEM [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 11:25 by A.BLAVIER") (* ;; "Lowlight the unique selected item of WINDOW.") (LET ((Item (WINDOWPROP WINDOW 'SELECTED.ITEM)) Region Rleft Rbottom Rright Rtop) (SETQ Region (FMC-GET.ITEM Item REGION)) (SETQ Rleft (IDIFFERENCE (GET.REGION.LEFT Region) 2)) (SETQ Rbottom (IDIFFERENCE (GET.REGION.BOTTOM Region) 2)) (SETQ Rright (IPLUS (fetch (REGION RIGHT) of Region) 2)) (SETQ Rtop (IPLUS (fetch (REGION TOP) of Region) 2)) (* ;; "") (DRAWLINE Rleft Rbottom Rright Rbottom 1 'ERASE WINDOW) (DRAWLINE Rright Rbottom Rright Rtop 1 'ERASE WINDOW) (DRAWLINE Rright Rtop Rleft Rtop 1 'ERASE WINDOW) (DRAWLINE Rleft Rtop Rleft Rbottom 1 'ERASE WINDOW) (WINDOWPROP WINDOW 'SELECTED.ITEM NIL]) (FMC-DESELECT.LIST [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 11:25 by A.BLAVIER") (* ;; "Lowlight all the items of a multiple selection.") (for item in (WINDOWPROP WINDOW 'SELECTION.LIST) do (FMC-DESELECT.LIST.ITEM item WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST NIL]) (FMC-DESELECT.LIST.ITEM [LAMBDA (ITEM WINDOW) (* ; "Edited 17-Aug-88 11:29 by A.BLAVIER") (* ;; "Lowlight one item, member of a multiple selection.") (LET ((Reg (fetch (FMC-ITEM REGION) of ITEM)) RLeft RBottom RRight RTop) (SETQ RLeft (IDIFFERENCE (GET.REGION.LEFT Reg) 2)) (SETQ RBottom (IDIFFERENCE (GET.REGION.BOTTOM Reg) 2)) (SETQ RRight (IPLUS (fetch (REGION RIGHT) of Reg) 2)) (SETQ RTop (IPLUS (fetch (REGION TOP) of Reg) 2)) (* ;; "") (DRAWLINE RLeft RBottom RRight RBottom 1 'ERASE WINDOW) (DRAWLINE RRight RBottom RRight RTop 1 'ERASE WINDOW) (DRAWLINE RRight RTop RLeft RTop 1 'ERASE WINDOW) (DRAWLINE RLeft RTop RLeft RBottom 1 'ERASE WINDOW) (WINDOWDELPROP WINDOW 'SELECTION.LIST ITEM]) ) (* * Property windows functions) (DEFINEQ (FMC-APPLY [LAMBDA (ITEM PROP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 11:51 by A.BLAVIER") (* ;; "User clicked in the APPLY item of the Item or Group Properties Free Menu : apply property(ies) to selected item(s).") (LET ((MainWindow (WINDOWPROP PROP.WINDOW 'MAIN.WINDOW)) (Prop T) Unique? ItemList) (* ;; "") (SETQ Unique? (WINDOWPROP MainWindow 'SELECTED.ITEM)) [if Unique? then (WINDOWPROP MainWindow 'SELECTION.LIST (LIST (WINDOWPROP MainWindow 'SELECTED.ITEM] (SETQ ItemList (WINDOWPROP MainWindow 'SELECTION.LIST)) (* ;; "") (if (STREQUAL (WINDOWPROP PROP.WINDOW 'TITLE) "ITEM PROPERTIES") then (* ;; "Request comes from the ITEM Properties window") (* ;; "Check that no GROUP is in the selection") [if (for i in ItemList thereis (FMC-GROUP? i)) then (FMC-PROMPTPRINT "Can't apply to GROUPs" MainWindow) else [if (IGREATERP (LENGTH ItemList) 1) then (* ;; "if there is more than one selected item then apply only ONE property to each item") (SETQ Prop (MENU (create MENU ITEMS _ '(TYPE LABEL BOX BOXSHADE BACKGROUND FONT CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN) TITLE _ "Apply which Property ?"] (if Prop then (FMC-DESELECT.LIST MainWindow) (for item in ItemList do (DSPFILL (FMC-GET.ITEM item REGION) WHITESHADE 'REPLACE MainWindow) (if Unique? then (FMC-UPDATE.ITEM item 'ALL PROP.WINDOW) else (FMC-UPDATE.ITEM item Prop PROP.WINDOW)) (FMC-REDRAW.ITEM item MainWindow)) (if Unique? then (WINDOWPROP MainWindow 'SELECTED.ITEM (CAR ItemList)) (WINDOWPROP MainWindow 'SELECTION.LIST NIL) (FMC-SELECT.ITEM MainWindow) else (WINDOWPROP MainWindow 'SELECTION.LIST ItemList) (FMC-SELECT.LIST MainWindow] else (* ;; "Request comes from the GROUP Properties window") (* ;; "Check that the selection is unique and that it's a GROUP") (if (AND (EQP (LENGTH ItemList) 1) (FMC-GROUP? (CAR ItemList))) then (FMC-DESELECT.LIST MainWindow) (DSPFILL (FMC-GET.ITEM (CAR ItemList) REGION) WHITESHADE 'REPLACE MainWindow) (FMC-UPDATE.GROUP (CAR ItemList) PROP.WINDOW) (FMC-REDRAW.ITEM (CAR ItemList) MainWindow) (WINDOWPROP MainWindow 'SELECTED.ITEM (CAR ItemList)) (WINDOWPROP MainWindow 'SELECTION.LIST NIL) (FMC-SELECT.ITEM MainWindow) else (if [AND (IGREATERP (LENGTH ItemList) 0) (NOT (FMC-GROUP? (CAR ItemList] then (FMC-PROMPTPRINT "Can't apply to simple ITEMs" MainWindow]) (FMC-SHOW.ITEM [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 11:47 by A.BLAVIER") (* ;; "User clicked in the SHOW item of the Item Properties Free Menu : update the Free Menu according to the first selected item.") (LET ((MainWindow (WINDOWPROP IP.WINDOW 'MAIN.WINDOW)) Item ItemBox ItemFont) [SETQ Item (OR (WINDOWPROP MainWindow 'SELECTED.ITEM) (CAR (WINDOWPROP MainWindow 'SELECTION.LIST] (SETQ ItemBox (FMC-GET.ITEM Item BOX)) (SETQ ItemFont (FMC-GET.ITEM Item FONT)) (if Item then (if (FMC-GROUP? Item) then (FMC-PROMPTPRINT "Can't show GROUPs" MainWindow) else (FM.CHANGESTATE 'TYPE (FMC-GET.ITEM Item TYPE) IP.WINDOW) (FM.CHANGELABEL 'LABELLINK (FMC-GET.ITEM Item LABEL) IP.WINDOW) (FM.CHANGELABEL 'IDLINK (FMC-GET.ITEM Item ID) IP.WINDOW) (FM.CHANGESTATE 'BOX (if ItemBox then ItemBox else 0) IP.WINDOW) (FM.CHANGESTATE 'BOXSHADE [CAR (CADADR (FMC-CREATE.SHADE.ITEM (FMC-GET.ITEM Item BOXSHADE ] IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.BOXSHADE (FMC-GET.ITEM Item BOXSHADE)) (FM.CHANGESTATE 'BACKGROUND [CAR (CADADR (FMC-CREATE.SHADE.ITEM ( FMC-GET.ITEM Item BACKGROUND] IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.BACKGROUND (FMC-GET.ITEM Item BACKGROUND)) (FM.CHANGESTATE 'FAMILY (CAR ItemFont) IP.WINDOW) (FM.CHANGESTATE 'SIZE (CADR ItemFont) IP.WINDOW) (FM.CHANGESTATE 'FACE (CADDR ItemFont) IP.WINDOW) (FM.CHANGELABEL 'MESSAGELINK (FMC-GET.ITEM Item MESSAGE) IP.WINDOW) (for prop in '(CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN) bind Def do (SETQ Def (SELECTQ prop ((CHANGESTATE) (FMC-GET.ITEM Item CHANGESTATE)) ((SELECTEDFN) (FMC-GET.ITEM Item SELECTEDFN)) ((DOWNFN) (FMC-GET.ITEM Item DOWNFN)) ((HELDFN) (FMC-GET.ITEM Item HELDFN)) ((MOVEDFN) (FMC-GET.ITEM Item MOVEDFN)) T)) (FM.CHANGESTATE prop (if (ATOM Def) then (MKATOM (LIST 'FUNCTION Def)) else (MKATOM Def)) IP.WINDOW) (WINDOWPROP IP.WINDOW (PACK* 'FMC.ITEM. prop) (if (ATOM Def) then (LIST 'FUNCTION Def) else Def))) (FM.CHANGESTATE 'INFINITEWIDTH (FMC-GET.ITEM Item INFINITEWIDTH) IP.WINDOW) (FM.CHANGESTATE 'MENU (MKATOM (FMC-GET.ITEM Item MENU)) IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS (FMC-GET.ITEM Item MENU)) (FM.CHANGESTATE 'LINKS (MKATOM (FMC-GET.ITEM Item LINKS)) IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.LINKS (FMC-GET.ITEM Item LINKS)) (FM.CHANGESTATE 'INITSTATE (FMC-GET.ITEM Item INITSTATE) IP.WINDOW]) (FMC-SHOW.GROUP [LAMBDA (GPW.ITEM GP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 11:52 by A.BLAVIER") (* ;; "User clicked in the SHOW item of the Group Properties Free Menu : update the Free Menu according to the unique selected item.") (LET ((MainWindow (WINDOWPROP GP.WINDOW 'MAIN.WINDOW)) Item) (SETQ Item (WINDOWPROP MainWindow 'SELECTED.ITEM)) (if Item then (if (FMC-GROUP? Item) then (FM.CHANGELABEL 'IDLINK (FMC-GET.ITEM Item ID) GP.WINDOW) (FM.CHANGELABEL 'COLLECTIONLINK (if (FMC-GET.ITEM Item COLLECTION) then (FMC-GET.ITEM Item COLLECTION) else "") GP.WINDOW) (FM.CHANGESTATE 'DESELECT (FMC-GET.ITEM Item DESELECT) GP.WINDOW) (FM.CHANGESTATE 'BOX (FMC-GET.ITEM Item BOX) GP.WINDOW) (FM.CHANGESTATE 'BOXSHADE [CAR (CADADR (FMC-CREATE.SHADE.ITEM ( FMC-GET.ITEM Item BOXSHADE] GP.WINDOW) (WINDOWPROP GP.WINDOW 'FMC.ITEM.BOXSHADE (FMC-GET.ITEM Item BOXSHADE)) (FM.CHANGESTATE 'BACKGROUND [CAR (CADADR (FMC-CREATE.SHADE.ITEM (FMC-GET.ITEM Item BACKGROUND] GP.WINDOW) (WINDOWPROP GP.WINDOW 'FMC.ITEM.BACKGROUND (FMC-GET.ITEM Item BACKGROUND)) else (FMC-PROMPTPRINT "Can't show simple items" MainWindow]) (FMC-NEWITEM [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:00 by A.BLAVIER") (* ;; "User clicked in the NEW item of the Item Properties window : create a new FMC item.") (LET ((MainWindow (WINDOWPROP IP.WINDOW 'MAIN.WINDOW)) (NewItem (create FMC-ITEM))) (* ;; "set this new item's properties according to the IP window") (FMC-UPDATE.ITEM NewItem 'ALL IP.WINDOW) (* ;; "if the cursor is currently outside the main window, move it inside") (if (NOT (INSIDEP (DSPCLIPPINGREGION NIL MainWindow) (CURSORPOSITION NIL MainWindow))) then (CURSORPOSITION '(5 . 5) MainWindow)) (* ;; "remove any previous selection") (if (WINDOWPROP MainWindow 'SELECTED.ITEM) then (FMC-DESELECT.ITEM MainWindow)) (if (WINDOWPROP MainWindow 'SELECTION.LIST) then (FMC-DESELECT.LIST MainWindow)) (* ;; "let the user place the item where he wants") (FMC-TRACK.NEW.ITEM NewItem MainWindow) (WINDOWADDPROP MainWindow 'ITEMLIST NewItem) (* ;; "make the new item the unique selection") (WINDOWPROP MainWindow 'SELECTED.ITEM NewItem) (FMC-REDRAW.ITEM NewItem MainWindow) (FMC-SELECT.ITEM MainWindow) (FMC-COMPUTE.SHAPE.REGS MainWindow]) (FMC-UPDATE.ITEM [LAMBDA (ITEM PROP IP.WINDOW) (* ; "Edited 11-Aug-88 14:29 by A.BLAVIER") (* ;; "Update ITEM's fields according to the Item Properties Free Menu.") (* ;; "PROP is either ALL or one of LABEL, BOX, BOXSHADE, BACKGROUND, FONT, CHANGESTATE, SELECTEDFN, DOWNFN, HELDFN, MOVEDFN ") (LET (ItemLabel ItemBox ItemBitmap) (FMC-MARK.AS.CHANGED (WINDOWPROP IP.WINDOW 'MAIN.WINDOW)) (* ;; "update LABEL") (if (FMEMB PROP '(ALL LABEL)) then (SETQ ItemLabel (FM-GET.ITEM.LABEL 'LABELLINK IP.WINDOW)) (if (NULLSTR ItemLabel) then (SETQ ItemLabel "*NOLABEL*")) (FMC-PUT.ITEM ITEM LABEL ItemLabel) else (SETQ ItemLabel (FMC-GET.ITEM ITEM LABEL))) (* ;; "update BACKGROUND") [if (FMEMB PROP '(ALL BACKGROUND)) then (FMC-PUT.ITEM ITEM BACKGROUND (WINDOWPROP IP.WINDOW 'FMC.ITEM.BACKGROUND] (* ;; "update BOX if required. Anyway keep the value of BOX : we'll need it later") (if (FMEMB PROP '(ALL BOX)) then (SETQ ItemBox (FM-GET.ITEM.STATE 'BOX IP.WINDOW)) (if (EQP ItemBox 0) then (SETQ ItemBox NIL)) (FMC-PUT.ITEM ITEM BOX ItemBox) else (SETQ ItemBox (FMC-GET.ITEM ITEM BOX))) (* ;; "update BOXSHADE") (if (FMEMB PROP '(ALL BOXSHADE)) then (FMC-PUT.ITEM ITEM BOXSHADE (if ItemBox then (WINDOWPROP IP.WINDOW 'FMC.ITEM.BOXSHADE) else NIL))) (* ;; "update TYPE") (if (FMEMB PROP '(ALL TYPE)) then (FMC-PUT.ITEM ITEM TYPE (FM-GET.ITEM.STATE 'TYPE IP.WINDOW))) (* ;; "update FONT") [if (FMEMB PROP '(ALL FONT)) then (FMC-PUT.ITEM ITEM FONT (LIST (FM-GET.ITEM.STATE 'FAMILY IP.WINDOW) (FM-GET.ITEM.STATE 'SIZE IP.WINDOW) (FM-GET.ITEM.STATE 'FACE IP.WINDOW] (* ;; "update CHANGESTATE, SELECTEDFN, DOWNFN, HELDFN, MOVEDFN") (SELECTQ PROP ((ALL) (FMC-PUT.ITEM ITEM CHANGESTATE (WINDOWPROP IP.WINDOW 'FMC.ITEM.CHANGESTATE)) (FMC-PUT.ITEM ITEM SELECTEDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.SELECTEDFN)) (FMC-PUT.ITEM ITEM DOWNFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.DOWNFN)) (FMC-PUT.ITEM ITEM HELDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.HELDFN)) (FMC-PUT.ITEM ITEM MOVEDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.MOVEDFN))) ((CHANGESTATE) (FMC-PUT.ITEM ITEM CHANGESTATE (WINDOWPROP IP.WINDOW 'FMC.ITEM.CHANGESTATE))) ((SELECTEDFN) (FMC-PUT.ITEM ITEM SELECTEDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.SELECTEDFN))) ((DOWNFN) (FMC-PUT.ITEM ITEM DOWNFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.DOWNFN))) ((HELDFN) (FMC-PUT.ITEM ITEM HELDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.HELDFN))) ((MOVEDFN) (FMC-PUT.ITEM ITEM MOVEDFN (WINDOWPROP IP.WINDOW 'FMC.ITEM.MOVEDFN))) T) (* ;; "update ID, MESSAGE, MENU, LINKS, INITSTATE, INFINITEWIDTH") (if (EQ PROP 'ALL) then [FMC-PUT.ITEM ITEM ID (if (NULLSTR (FM-GET.ITEM.LABEL 'IDLINK IP.WINDOW)) then NIL else (MKATOM (FM-GET.ITEM.LABEL 'IDLINK IP.WINDOW] (FMC-PUT.ITEM ITEM MESSAGE (FM-GET.ITEM.LABEL 'MESSAGELINK IP.WINDOW)) (FMC-PUT.ITEM ITEM MENU (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS)) (FMC-PUT.ITEM ITEM LINKS (WINDOWPROP IP.WINDOW 'FMC.ITEM.LINKS)) (FMC-PUT.ITEM ITEM INITSTATE (FM-GET.ITEM.STATE 'INITSTATE IP.WINDOW)) (FMC-PUT.ITEM ITEM INFINITEWIDTH (FM-GET.ITEM.STATE 'INFINITEWIDTH IP.WINDOW))) (* ;; "recompute the bitmap") [SETQ ItemBitmap (FMC-MAKEBITMAP ItemLabel (FMC-LIST->FONT (FMC-GET.ITEM ITEM FONT] (FMC-PUT.ITEM ITEM BITMAP ItemBitmap) (* ;; "if ITEM has no region yet, then it's a new item --> create the region") [if (NOT (FMC-GET.ITEM ITEM REGION)) then (FMC-PUT.ITEM ITEM REGION (CREATEREGION 5 5 (BITMAPWIDTH ItemBitmap) (BITMAPHEIGHT ItemBitmap] (* ;; "update XBMOFFSET and YBMOFFSET") (if (NOT ItemBox) then (FMC-PUT.ITEM ITEM XBMOFFSET 0) (FMC-PUT.ITEM ITEM YBMOFFSET 0)) (if (AND ItemBox (EQP (FMC-GET.ITEM ITEM YBMOFFSET) 0)) then (FMC-PUT.ITEM ITEM XBMOFFSET 2) (FMC-PUT.ITEM ITEM YBMOFFSET 2)) (* ;; "update REGION according to BITMAP and BOXSPACE") (FMC-PUT.ITEM ITEM REGION (CREATEREGION (GET.REGION.LEFT (FMC-GET.ITEM ITEM REGION)) (GET.REGION.BOTTOM (FMC-GET.ITEM ITEM REGION)) (IPLUS (BITMAPWIDTH ItemBitmap) (FMC-GET.ITEM ITEM XBMOFFSET) (FMC-GET.ITEM ITEM XBMOFFSET)) (IPLUS (BITMAPHEIGHT ItemBitmap) (FMC-GET.ITEM ITEM YBMOFFSET) (FMC-GET.ITEM ITEM YBMOFFSET]) (FMC-UPDATE.GROUP [LAMBDA (GROUP GP.WINDOW) (* ; "Edited 11-Aug-88 16:45 by A.BLAVIER") (* ;; "Update GROUP's fields according to the Group Properties Free Menu.") (FMC-MARK.AS.CHANGED (WINDOWPROP GP.WINDOW 'MAIN.WINDOW)) (* ;; "update ID") [FMC-PUT.ITEM GROUP ID (if (NULLSTR (FM-GET.ITEM.LABEL 'IDLINK GP.WINDOW)) then NIL else (MKATOM (FM-GET.ITEM.LABEL 'IDLINK GP.WINDOW] (* ;; "update COLLECTION. Check that all the subitems are NWAY.") [if (NULLSTR (FM-GET.ITEM.LABEL 'COLLECTIONLINK GP.WINDOW)) then (FMC-PUT.ITEM GROUP COLLECTION NIL) else (if (for i in (FMC-GET.ITEM GROUP OBJECTLIST) thereis (NEQ (FMC-GET.ITEM i TYPE) 'NWAY)) then (FMC-PROMPTPRINT "All items in GROUP should be NWAY" (WINDOWPROP GP.WINDOW 'MAIN.WINDOW)) else (FMC-PUT.ITEM GROUP COLLECTION (MKATOM (FM-GET.ITEM.LABEL 'COLLECTIONLINK GP.WINDOW ] (* ;; "update DESELECT") (FMC-PUT.ITEM GROUP DESELECT (FM-GET.ITEM.STATE 'DESELECT GP.WINDOW)) (* ;; "update BOX") (FMC-PUT.ITEM GROUP BOX (FM-GET.ITEM.STATE 'BOX GP.WINDOW)) (* ;; "update BOXSHADE") (FMC-PUT.ITEM GROUP BOXSHADE (WINDOWPROP GP.WINDOW 'FMC.ITEM.BOXSHADE)) (* ;; "update BACKGROUND") (FMC-PUT.ITEM GROUP BACKGROUND (WINDOWPROP GP.WINDOW 'FMC.ITEM.BACKGROUND]) (FMC-GET.LABEL [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:08 by A.BLAVIER") (* ;; "User clicked in the LABEL item of the IP window.") (COND ((EQUAL BUTTON '(LEFT)) (* ;; "he LEFT buttoned : edit the field") (FM.EDITITEM 'LABELLINK IP.WINDOW)) ((EQUAL BUTTON '(MIDDLE)) (* ;; "he MIDDLE buttoned : grab a bitmap from screen and set LABEL to it") (FM.CHANGELABEL 'LABELLINK (FMC-SNAPBM) IP.WINDOW T)) ((EQUAL BUTTON '(RIGHT)) (* ;; "he RIGHT buttoned : edit the field, clearing it first") (FM.EDITITEM 'LABELLINK IP.WINDOW T]) (FMC-CHOOSE.ITEM.BOXSHADE [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:10 by A.BLAVIER") (* ;; "User clicked in the BOXSHADE item of the Item or Group Prop window : let him choose a shade from a menu.") (LET ((ShadeMenu (WINDOWPROP IP.WINDOW 'SHADE.MENU)) Shade) (SETQ Shade (MENU ShadeMenu)) (if Shade then (FM.CHANGESTATE 'BOXSHADE (CAR Shade) IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.BOXSHADE (CDR Shade]) (FMC-CHOOSE.ITEM.BG [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:12 by A.BLAVIER") (* ;; "User clicked in the BACKGROUND item of the Item or Group Prop window : let him choose a background from a menu.") (LET ((ShadeMenu (WINDOWPROP IP.WINDOW 'SHADE.MENU)) Shade) (SETQ Shade (MENU ShadeMenu)) (if Shade then (FM.CHANGESTATE 'BACKGROUND (CAR Shade) IP.WINDOW) (WINDOWPROP IP.WINDOW 'FMC.ITEM.BACKGROUND (CDR Shade]) (FMC-GET.MENUPROPS [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:15 by A.BLAVIER") (* ;; "User clicked in the MENU button of the IP window : edit an EXPR where CAR is a list of menu items, CADR a font description list, CADDR a title for the menu.") (LET (Expr) [if (CAR (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS)) then [SETQ Expr (EDITE (COPYALL (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS] else (SETQ Expr (EDITE (COPYALL '(("ITEMS") "[FONT]" "[TITLE]"] (* ;; "a FM label can't be a list, so make it an atom") (FM.CHANGESTATE 'MENU (MKATOM Expr) IP.WINDOW) (* ;; "but keep the list in mind") (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS Expr]) (FMC-GET.INITSTATE [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 12:28 by A.BLAVIER") (* ;; "User clicked in the INITSTATE button of the IP window.") (LET ((MainWindow (WINDOWPROP IP.WINDOW 'MAIN.WINDOW)) (ItemType (FM-GET.ITEM.STATE 'TYPE IP.WINDOW)) (MenuProps (WINDOWPROP IP.WINDOW 'FMC.ITEM.MENUPROPS)) InitstateMenuItems Choice PromptWindow) (* ;; "The INITSTATE property is relevant only for TOGGLE, 3STATE and STATE items.") (if (FMEMB ItemType '(TOGGLE 3STATE STATE)) then (* ;;  "pop up a menu with the possible values for the INITSTATE, depending on the item type") (SETQ InitstateMenuItems (SELECTQ ItemType (TOGGLE '("NIL" T)) (3STATE '(OFF "NIL" T)) (STATE (if (CAR MenuProps) then (APPEND '("NIL" T) (CAR MenuProps) '(OTHER)) else '("NIL" T OTHER))) T)) (SETQ Choice (MENU (create MENU ITEMS _ InitstateMenuItems))) (* ;; "nothing is appropriate : let him specify a value") [if (EQ Choice 'OTHER) then (SETQ PromptWindow (WINDOWPROP MainWindow 'FMC.PROMPTWINDOW)) (DSPRESET PromptWindow) (TTY.PROCESS (THIS.PROCESS)) (SETQ Choice (PROMPTFORWORD "INITSTATE :" NIL "Type in an unevaluated expression" PromptWindow NIL NIL (CHARCODE (EOL ESCAPE LF TAB] else (SETQ Choice NIL) (FM.CHANGESTATE 'INITSTATE Choice IP.WINDOW)) (if Choice then (if (STREQUAL Choice "NIL") then (SETQ Choice NIL)) (FM.CHANGESTATE 'INITSTATE Choice IP.WINDOW]) (FMC-EDIT.FN [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 13:36 by A.BLAVIER") (* ;; "User wants to specify a function property : open a SEdit window.") (* ;; "Expr should be of the form (FUNCTION FNname) or a LAMDA expression") (LET ((Prop (FM.ITEMPROP IPW.ITEM 'ID)) Expr) [SETQ Expr (EDITE (COPYALL (WINDOWPROP IP.WINDOW (PACK* 'FMC.ITEM. Prop] (FM.CHANGESTATE Prop (MKATOM Expr) IP.WINDOW) (WINDOWPROP IP.WINDOW (PACK* 'FMC.ITEM. Prop) Expr]) (FMC-LINKS [LAMBDA (IPW.ITEM IP.WINDOW BUTTON) (* ; "Edited 17-Aug-88 13:44 by A.BLAVIER") (* ;; "User clicked in the LINKS button of the IP window : let him add or remove a link.") (LET ((MainWindow (WINDOWPROP IP.WINDOW 'MAIN.WINDOW)) [LinkMenu (create MENU ITEMS _ '(("Add Link" 'ADD) ("Remove Link" 'REMOVE] Item Id Link) (SELECTQ (MENU LinkMenu) (ADD (FMC-PROMPTPRINT "Click on the item you want to link to" MainWindow) (until (MOUSESTATE LEFT)) (if [SETQ Item (for i in (WINDOWPROP MainWindow 'ITEMLIST) thereis (INSIDEP (FMC-GET.ITEM i REGION) (CURSORPOSITION NIL MainWindow] then (SETQ Id (FMC-GET.ITEM Item ID)) (if Id then (SETQ Link (LIST (FMC-GET.ITEM Item TYPE) (MKATOM Id))) (WINDOWPROP IP.WINDOW 'FMC.ITEM.LINKS Link) (FM.CHANGESTATE 'LINKS (MKATOM Link) IP.WINDOW) else (FMC-PROMPTPRINT "This item has no ID - can't link" MainWindow))) (while (MOUSESTATE LEFT))) (REMOVE (WINDOWPROP IP.WINDOW 'FMC.ITEM.LINKS '(NIL)) (FM.CHANGESTATE 'LINKS "(NIL)" IP.WINDOW)) T]) ) (* * Property windows descriptions) (RPAQQ FMC-IP-DESC ((PROPS FORMAT EXPLICIT) (LABEL APPLY TYPE MOMENTARY LEFT 0 BOTTOM 195 BOX 1 BOXSHADE 65535 BOXSPACE 1 FONT (MODERN 14 BOLDITALIC) SELECTEDFN FMC-APPLY) (LABEL SHOW TYPE MOMENTARY LEFT 49 BOTTOM 195 BOX 1 BOXSHADE 65535 BOXSPACE 1 FONT (MODERN 14 BOLDITALIC) SELECTEDFN FMC-SHOW.ITEM) (LABEL NEW TYPE MOMENTARY LEFT 111 BOTTOM 195 BOX 1 BOXSHADE 65535 BOXSPACE 1 FONT (MODERN 14 BOLDITALIC) SELECTEDFN FMC-NEWITEM) (LABEL TYPE TYPE STATE LEFT -1 BOTTOM 178 FONT (MODERN 12 BOLD) MENUITEMS (MOMENTARY TOGGLE 3STATE STATE NWAY EDIT NUMBER EDITSTART DISPLAY) LINKS (DISPLAY TYPELINK) INITSTATE MOMENTARY) (LABEL MOMENTARY TYPE DISPLAY LEFT 31 BOTTOM 177 ID TYPELINK FONT (MODERN 12 STANDARD)) (LABEL LABEL TYPE MOMENTARY LEFT 113 BOTTOM 178 FONT (MODERN 12 BOLD) SELECTEDFN FMC-GET.LABEL LINKS (EDIT LABELLINK)) (LABEL "" TYPE EDIT LEFT 151 BOTTOM 177 ID LABELLINK FONT (MODERN 12 STANDARD) INITSTATE "IIIIMMMMMMMMMMMMMMM") (LABEL ID TYPE EDITSTART LEFT -1 BOTTOM 162 FONT (MODERN 12 BOLD) LINKS (EDIT IDLINK)) (LABEL "" TYPE EDIT LEFT 14 BOTTOM 161 ID IDLINK FONT (MODERN 12 STANDARD) INITSTATE "") (LABEL FONT TYPE DISPLAY LEFT -1 BOTTOM 146 FONT (MODERN 12 ITALIC)) (LABEL FAMILY TYPE STATE LEFT 32 BOTTOM 146 ID FAMILY FONT (MODERN 12 BOLD) MENUITEMS (CLASSIC MODERN TERMINAL TITAN GACHA HELVETICA TIMESROMAN) LINKS (DISPLAY FAMILYLINK) INITSTATE GACHA) (LABEL GACHA TYPE DISPLAY LEFT 77 BOTTOM 145 ID FAMILYLINK FONT (MODERN 12 STANDARD)) (LABEL SIZE TYPE STATE LEFT 161 BOTTOM 146 ID SIZE FONT (MODERN 12 BOLD) MENUITEMS (6 7 8 9 10 11 12 14 18 24 30 36) LINKS (DISPLAY SIZELINK) INITSTATE 12) (LABEL 10 TYPE DISPLAY LEFT 191 BOTTOM 145 ID SIZELINK FONT (MODERN 12 STANDARD)) (LABEL FACE TYPE STATE LEFT 210 BOTTOM 146 ID FACE FONT (MODERN 12 BOLD) MENUITEMS (REGULAR ITALIC BOLD BOLDITALIC) LINKS (DISPLAY FACELINK) INITSTATE BOLDITALIC) (LABEL REGULAR TYPE DISPLAY LEFT 241 BOTTOM 145 ID FACELINK FONT (MODERN 12 STANDARD) ) (LABEL BOX TYPE STATE LEFT -1 BOTTOM 130 FONT (MODERN 12 BOLD) MENUITEMS (0 1 2 3 4 5 6 7 8 9 10) LINKS (DISPLAY BOXLINK) INITSTATE 0) (LABEL 0 TYPE DISPLAY LEFT 26 BOTTOM 129 ID BOXLINK FONT (MODERN 12 STANDARD)) (LABEL BOXSHADE TYPE STATE LEFT 40 BOTTOM 130 FONT (MODERN 12 BOLD) SELECTEDFN FMC-CHOOSE.ITEM.BOXSHADE LINKS (DISPLAY BOXSHADELINK)) (LABEL "" TYPE DISPLAY LEFT 107 BOTTOM 130 ID BOXSHADELINK FONT (MODERN 12 STANDARD) MAXWIDTH 60) (LABEL BACKGROUND TYPE STATE LEFT 176 BOTTOM 130 ID BACKGROUND FONT (MODERN 12 BOLD) SELECTEDFN FMC-CHOOSE.ITEM.BG LINKS (DISPLAY BACKGROUNDLINK)) (LABEL "" TYPE DISPLAY LEFT 262 BOTTOM 130 ID BACKGROUNDLINK FONT (MODERN 12 STANDARD) MAXWIDTH 60) (LABEL MENU TYPE STATE LEFT -1 BOTTOM 114 FONT (MODERN 12 BOLD) SELECTEDFN FMC-GET.MENUPROPS LINKS (DISPLAY MENULINK) INITSTATE "(NIL)") (LABEL "(NIL)" TYPE DISPLAY LEFT 39 BOTTOM 113 ID MENULINK FONT (MODERN 12 STANDARD)) (LABEL INITSTATE TYPE STATE LEFT 195 BOTTOM 114 ID INITSTATE FONT (MODERN 12 BOLD) SELECTEDFN FMC-GET.INITSTATE LINKS (DISPLAY INITSTATELINK)) (LABEL "#NOLABEL#" TYPE DISPLAY LEFT 257 BOTTOM 113 ID INITSTATELINK FONT (MODERN 12 STANDARD)) (LABEL CHANGESTATE TYPE STATE LEFT -1 BOTTOM 98 ID CHANGESTATE FONT (MODERN 12 BOLD) SELECTEDFN FMC-EDIT.FN LINKS (DISPLAY CHANGESTATELINK) INITSTATE "(FUNCTION NILL)") (LABEL "(FUNCTION NILL)" TYPE DISPLAY LEFT 89 BOTTOM 97 ID CHANGESTATELINK FONT (MODERN 12 STANDARD)) (LABEL SELECTEDFN TYPE STATE LEFT -1 BOTTOM 81 ID SELECTEDFN FONT (MODERN 12 BOLD) SELECTEDFN FMC-EDIT.FN LINKS (DISPLAY SELECTEDFNLINK) INITSTATE "(FUNCTION NILL)") (LABEL "(FUNCTION NILL)" TYPE DISPLAY LEFT 75 BOTTOM 80 ID SELECTEDFNLINK FONT (MODERN 12 STANDARD)) (LABEL "DOWNFN" TYPE STATE LEFT -1 BOTTOM 65 ID DOWNFN FONT (MODERN 12 BOLD) SELECTEDFN FMC-EDIT.FN LINKS (DISPLAY DOWNFNLINK) INITSTATE "(FUNCTION NILL)") (LABEL "(FUNCTION NILL)" TYPE DISPLAY LEFT 57 BOTTOM 64 ID DOWNFNLINK FONT (MODERN 12 STANDARD)) (LABEL "HELDFN" TYPE STATE LEFT -1 BOTTOM 49 ID HELDFN FONT (MODERN 12 BOLD) SELECTEDFN FMC-EDIT.FN LINKS (DISPLAY HELDFNLINK) INITSTATE "(FUNCTION NILL)") (LABEL "(FUNCTION NILL)" TYPE DISPLAY LEFT 49 BOTTOM 48 ID HELDFNLINK FONT (MODERN 12 STANDARD)) (LABEL "MOVEDFN" TYPE STATE LEFT -1 BOTTOM 33 ID MOVEDFN FONT (MODERN 12 BOLD) SELECTEDFN FMC-EDIT.FN LINKS (DISPLAY MOVEDFNLINK) INITSTATE "(FUNCTION NILL)") (LABEL "(FUNCTION NILL)" TYPE DISPLAY LEFT 62 BOTTOM 32 ID MOVEDFNLINK FONT (MODERN 12 STANDARD)) (LABEL LINKS TYPE STATE LEFT -1 BOTTOM 16 FONT (MODERN 12 BOLD) SELECTEDFN FMC-LINKS LINKS (DISPLAY LINKSLINK) INITSTATE "(NIL)") (LABEL "(NIL)" TYPE DISPLAY LEFT 36 BOTTOM 15 ID LINKSLINK FONT (MODERN 12 STANDARD)) (LABEL "INFINITEWIDTH" TYPE TOGGLE LEFT 239 BOTTOM 16 ID INFINITEWIDTH FONT (MODERN 12 BOLD)) (LABEL MESSAGE TYPE EDITSTART LEFT -1 BOTTOM 0 FONT (MODERN 12 BOLD) LINKS (EDIT MESSAGELINK)) (LABEL "" TYPE EDIT LEFT 61 BOTTOM -1 ID MESSAGELINK FONT (MODERN 12 STANDARD) INITSTATE "MMMMMMMMMMMMMMMMMMMMMMMM"))) (RPAQQ FMC-GP-DESC ((PROPS FORMAT EXPLICIT) (LABEL APPLY TYPE MOMENTARY LEFT 0 BOTTOM 106 BOX 1 BOXSHADE 65535 BOXSPACE 1 FONT (MODERN 14 BOLDITALIC) SELECTEDFN FMC-APPLY) (LABEL SHOW TYPE MOMENTARY LEFT 49 BOTTOM 106 BOX 1 BOXSHADE 65535 BOXSPACE 1 FONT (MODERN 14 BOLDITALIC) SELECTEDFN FMC-SHOW.GROUP) (LABEL "ID" TYPE EDITSTART LEFT 0 BOTTOM 83 FONT (MODERN 12 BOLD) LINKS (EDIT IDLINK)) (LABEL "" TYPE EDIT LEFT 17 BOTTOM 82 ID IDLINK FONT (MODERN 12 STANDARD)) (LABEL "COLLECTION" TYPE EDITSTART LEFT 0 BOTTOM 67 FONT (MODERN 12 BOLD) LINKS (EDIT COLLECTIONLINK)) (LABEL "" TYPE EDIT LEFT 75 BOTTOM 66 ID COLLECTIONLINK FONT (MODERN 12 STANDARD) ) (LABEL "DESELECT" ID DESELECT TYPE TOGGLE LEFT 0 BOTTOM 50 FONT (MODERN 12 BOLD)) (LABEL BOX TYPE STATE LEFT 0 BOTTOM 33 FONT (MODERN 12 BOLD) MENUITEMS (1 2 3 4 5 6 7 8 9 10) LINKS (DISPLAY BOXLINK) INITSTATE 1) (LABEL 1 TYPE DISPLAY LEFT 27 BOTTOM 32 ID BOXLINK FONT (MODERN 12 STANDARD)) (LABEL BOXSHADE TYPE STATE LEFT 0 BOTTOM 16 FONT (MODERN 12 BOLD) SELECTEDFN FMC-CHOOSE.ITEM.BOXSHADE LINKS (DISPLAY BOXSHADELINK)) (LABEL "" TYPE DISPLAY LEFT 86 BOTTOM 16 ID BOXSHADELINK FONT (MODERN 12 STANDARD ) MAXWIDTH 60) (LABEL BACKGROUND TYPE STATE LEFT 0 BOTTOM 0 ID BACKGROUND FONT (MODERN 12 BOLD) SELECTEDFN FMC-CHOOSE.ITEM.BG LINKS (DISPLAY BACKGROUNDLINK)) (LABEL "" TYPE DISPLAY LEFT 86 BOTTOM 0 ID BACKGROUNDLINK FONT (MODERN 12 STANDARD) MAXWIDTH 60))) (* * Creating bitmaps) (DEFINEQ (FMC-MAKEBITMAP [LAMBDA (LABEL FONT) (* ; "Edited 17-Aug-88 13:50 by A.BLAVIER") (* ;; " Create the bitmap representing LABEL in font FONT.") (PROG (Bitmap Stream) (if (BITMAPP LABEL) then (RETURN LABEL) else [SETQ Bitmap (BITMAPCREATE (STRINGWIDTH LABEL FONT) (FONTPROP FONT 'HEIGHT] (SETQ Stream (DSPCREATE Bitmap)) (DSPFONT FONT Stream) (MOVETO 0 (FONTPROP FONT 'DESCENT) Stream) (PRIN1 LABEL Stream) (RETURN Bitmap]) (FMC-COMPOUND.BITMAP [LAMBDA (COMPOUND.REGION ITEM.LIST) (* ; "Edited 17-Aug-88 13:48 by A.BLAVIER") (* ;; "Create a bitmap composed of the bitmaps from ITEM.LIST") (PROG ((CompoundBitmap (BITMAPCREATE (GET.REGION.WIDTH COMPOUND.REGION) (GET.REGION.HEIGHT COMPOUND.REGION))) Stream) (SETQ Stream (DSPCREATE CompoundBitmap)) [for item in ITEM.LIST do (BITBLT (FMC-GET.ITEM item BITMAP) 0 0 Stream (IPLUS (FMC-GET.ITEM item XBMOFFSET) (IDIFFERENCE (GET.REGION.LEFT (FMC-GET.ITEM item REGION) ) (GET.REGION.LEFT COMPOUND.REGION) )) (IPLUS (FMC-GET.ITEM item YBMOFFSET) (IDIFFERENCE (GET.REGION.BOTTOM (FMC-GET.ITEM item REGION)) (GET.REGION.BOTTOM COMPOUND.REGION] (RETURN CompoundBitmap]) (FMC-SNAPBM [LAMBDA NIL (* ; "Edited 17-Aug-88 13:51 by A.BLAVIER") (* ;; "Extract a bitmap from the SCREENBITMAP") (PROG ((Region (GETREGION)) SnapBM) (SETQ SnapBM (BITMAPCREATE (GET.REGION.WIDTH Region) (GET.REGION.HEIGHT Region))) (BITBLT (SCREENBITMAP) (GET.REGION.LEFT Region) (GET.REGION.BOTTOM Region) SnapBM) (RETURN SnapBM]) ) (* * Moving items) (DEFINEQ (FMC-MOVE.SELECTION [LAMBDA (WINDOW UNIQUE.OR.MULTIPLE) (* ; "Edited 17-Aug-88 14:38 by A.BLAVIER") (* ;; "Move the selection, either unique item or selection list.") (LET (ItemList CompoundRegion CompoundBitmap Stream NewPos CorrX CorrY Left Bottom Width Height Right Top) (FMC-MARK.AS.CHANGED WINDOW) [if (EQ UNIQUE.OR.MULTIPLE 'UNIQUE) then (WINDOWPROP WINDOW 'SELECTION.LIST (LIST (WINDOWPROP WINDOW 'SELECTED.ITEM] (SETQ ItemList (WINDOWPROP WINDOW 'SELECTION.LIST)) (FMC-DESELECT.LIST WINDOW) (* ;; "compute the enclosing region") [SETQ CompoundRegion (APPLY 'UNIONREGIONS (for item in ItemList collect (FMC-GET.ITEM item REGION] (* ;; "compute the associated bitmap") (SETQ CompoundBitmap (FMC-COMPOUND.BITMAP CompoundRegion ItemList)) (SETQ Stream (DSPCREATE CompoundBitmap)) (* ;; "surround the moving region") (SETQ Left (GET.REGION.LEFT CompoundRegion)) (SETQ Bottom (GET.REGION.BOTTOM CompoundRegion)) (SETQ Width (IDIFFERENCE (GET.REGION.WIDTH CompoundRegion) 1)) (SETQ Height (IDIFFERENCE (GET.REGION.HEIGHT CompoundRegion) 1)) (SETQ Right (fetch (REGION RIGHT) of CompoundRegion)) (SETQ Top (fetch (REGION TOP) of CompoundRegion)) (DRAWLINE Left Bottom Right Bottom 1 'REPLACE WINDOW NIL '(2 2)) (DRAWLINE Right Bottom Right Top 1 'REPLACE WINDOW NIL '(2 2)) (DRAWLINE Right Top Left Top 1 'REPLACE WINDOW NIL '(2 2)) (DRAWLINE Left Top Left Bottom 1 'REPLACE WINDOW NIL '(2 2)) (DRAWLINE 0 0 Width 0 1 'REPLACE Stream NIL '(2 2)) (DRAWLINE Width 0 Width Height 1 'REPLACE Stream NIL '(2 2)) (DRAWLINE Width Height 0 Height 1 'REPLACE Stream NIL '(2 2)) (DRAWLINE 0 Height 0 0 1 'REPLACE Stream NIL '(2 2)) (* ;; "") (* ;; "let the user move the region") (SETQ NewPos (FMC-MOVE.BITMAP CompoundBitmap (GET.REGION.LEFT CompoundRegion) (GET.REGION.BOTTOM CompoundRegion) WINDOW)) (* ;; "") (SETQ CorrX (IDIFFERENCE (fetch (POSITION XCOORD) of NewPos) (GET.REGION.LEFT CompoundRegion))) (SETQ CorrY (IDIFFERENCE (fetch (POSITION YCOORD) of NewPos) (GET.REGION.BOTTOM CompoundRegion))) (SETQ Left (fetch (POSITION XCOORD) of NewPos)) (SETQ Bottom (fetch (POSITION YCOORD) of NewPos)) (add Right CorrX) (add Top CorrY) (* ;; "remove the surrounding rectangle") (DRAWLINE Left Bottom Right Bottom 1 'ERASE WINDOW) (DRAWLINE Right Bottom Right Top 1 'ERASE WINDOW) (DRAWLINE Right Top Left Top 1 'ERASE WINDOW) (DRAWLINE Left Top Left Bottom 1 'ERASE WINDOW) (* ;; "update items' regions") (for item in ItemList do (FMC-UPDATE.REGION item CorrX CorrY WINDOW) (if (FMC-GROUP? item) then (FMC-REDRAW.ITEM item WINDOW))) (if (EQ UNIQUE.OR.MULTIPLE 'UNIQUE) then (WINDOWPROP WINDOW 'SELECTED.ITEM (CAR ItemList)) (WINDOWPROP WINDOW 'SELECTION.LIST NIL) (FMC-SELECT.ITEM WINDOW) else (WINDOWPROP WINDOW 'SELECTION.LIST ItemList) (FMC-SELECT.LIST WINDOW]) (FMC-MOVE.BITMAP [LAMBDA (BITMAP BM.X BM.Y WINDOW) (* ; "Edited 17-Aug-88 14:06 by A.BLAVIER") (PROG ((CorrX (IQUOTIENT (BITMAPWIDTH BITMAP) 2)) (CorrY (IQUOTIENT (BITMAPHEIGHT BITMAP) 2)) (Grid (WINDOWPROP WINDOW 'GRIDSIZE)) GridOldX GridOldY (GridNewX BM.X) (GridNewY BM.Y) OldX OldY (NewX BM.X) (NewY BM.Y) NewPos) (* ;; "Performs bitmap moving under the cursor, starting at (BM.X BM.Y). Returns the new position of the bitmap.") (* ;; "") (* ;; "Set the cursor position in the center of the item's region") (CURSORPOSITION (create POSITION XCOORD _ (IPLUS BM.X CorrX) YCOORD _ (IPLUS BM.Y CorrY)) WINDOW) (* ;; "Redraw the item without the selection box") (BITBLT BITMAP 0 0 WINDOW BM.X BM.Y NIL NIL 'INPUT 'REPLACE) (* ;; "") (SETCURSOR MOVINGCURSOR) (SETQ OldX (IPLUS BM.X CorrX)) (SETQ OldY (IPLUS BM.Y CorrY)) (SETQ GridOldX BM.X) (SETQ GridOldY BM.Y) (* ;; "Track the mouse") [if Grid then (* ;; "constrain movement along the grid") (while (MOUSESTATE LEFT) do (SETQ NewX (LASTMOUSEX WINDOW)) (SETQ NewY (LASTMOUSEY WINDOW)) (if (OR (NOT (EQP OldX NewX)) (NOT (EQP OldY NewY))) then (SETQ GridNewX (ITIMES (IQUOTIENT (IDIFFERENCE NewX CorrX) Grid) Grid)) (SETQ GridNewY (ITIMES (IQUOTIENT (IDIFFERENCE NewY CorrY) Grid) Grid)) (BITBLT BITMAP 0 0 WINDOW GridOldX GridOldY NIL NIL 'INPUT 'INVERT) (BITBLT BITMAP 0 0 WINDOW GridNewX GridNewY NIL NIL 'INPUT 'INVERT) (SETQ GridOldX GridNewX) (SETQ GridOldY GridNewY) (SETQ OldX NewX) (SETQ OldY NewY))) (SETQ NewPos (create POSITION XCOORD _ GridNewX YCOORD _ GridNewY)) else (* ;; "move freely") (while (MOUSESTATE LEFT) do (SETQ NewX (LASTMOUSEX WINDOW)) (SETQ NewY (LASTMOUSEY WINDOW)) (if (OR (NOT (EQP OldX NewX)) (NOT (EQP OldY NewY))) then (BITBLT BITMAP 0 0 WINDOW (IDIFFERENCE OldX CorrX) (IDIFFERENCE OldY CorrY) NIL NIL 'INPUT 'INVERT) (BITBLT BITMAP 0 0 WINDOW (IDIFFERENCE NewX CorrX) (IDIFFERENCE NewY CorrY) NIL NIL 'INPUT 'INVERT)) (SETQ OldX NewX) (SETQ OldY NewY)) (SETQ NewPos (create POSITION XCOORD _ (IDIFFERENCE NewX CorrX) YCOORD _ (IDIFFERENCE NewY CorrY] (SETCURSOR DEFAULTCURSOR) (RETURN NewPos]) (FMC-TRACK.NEW.ITEM [LAMBDA (ITEM WINDOW) (* ; "Edited 17-Aug-88 14:45 by A.BLAVIER") (* ;; "Move a newly created item") (LET ((ItemBitmap (FMC-GET.ITEM ITEM BITMAP)) (ItemRegion (FMC-GET.ITEM ITEM REGION)) (OldX (LASTMOUSEX WINDOW)) (OldY (LASTMOUSEY WINDOW)) NewX NewY) (BITBLT ItemBitmap 0 0 WINDOW (LASTMOUSEX WINDOW) (LASTMOUSEY WINDOW)) (until (MOUSESTATE LEFT) do (SETQ NewX (LASTMOUSEX WINDOW)) (SETQ NewY (LASTMOUSEY WINDOW)) (if (OR (NOT (EQP OldX NewX)) (NOT (EQP OldY NewY))) then (BITBLT ItemBitmap 0 0 WINDOW OldX OldY NIL NIL 'INPUT 'INVERT) (BITBLT ItemBitmap 0 0 WINDOW NewX NewY NIL NIL 'INPUT 'INVERT)) (SETQ OldX NewX) (SETQ OldY NewY)) (PUT.REGION.LEFT ItemRegion NewX) (PUT.REGION.BOTTOM ItemRegion NewY]) (FMC-UPDATE.BM.POSITION [LAMBDA (ITEM WINDOW) (* ; "Edited 9-Aug-88 17:17 by A.BLAVIER") (* ;; "Update X and Y offset of an item's bitmap within it's box region.") (LET ((Bitmap (FMC-GET.ITEM ITEM BITMAP)) (Region (FMC-GET.ITEM ITEM REGION)) X) (if (FMC-GET.ITEM ITEM BOX) then (SETQ X (IDIFFERENCE (IQUOTIENT (GET.REGION.WIDTH Region) 2) (IQUOTIENT (BITMAPWIDTH Bitmap) 2))) (FMC-PUT.ITEM ITEM XBMOFFSET X) (FMC-PUT.ITEM ITEM YBMOFFSET X]) (FMC-UPDATE.REGION [LAMBDA (OBJECT DELTAX DELTAY WINDOW) (* ; "Edited 17-Aug-88 14:50 by A.BLAVIER") (* ;; "This function is called by FMC-MOVE.SELECTION and by itself to update all items'regions moved by the user.") (LET ((Reg (FMC-GET.ITEM OBJECT REGION)) (Box (FMC-GET.ITEM OBJECT BOX)) (ObjectList (FMC-GET.ITEM OBJECT OBJECTLIST))) (PUT.REGION.LEFT Reg (IPLUS (GET.REGION.LEFT Reg) DELTAX)) (PUT.REGION.BOTTOM Reg (IPLUS (GET.REGION.BOTTOM Reg) DELTAY)) (DSPFILL Reg (FMC-GET.ITEM OBJECT BACKGROUND) 'PAINT WINDOW) (if Box then (FMC-DRAW.BOX OBJECT Box (FMC-GET.ITEM OBJECT BOXSHADE) WINDOW)) (if (FMC-GROUP? OBJECT) then (for obj in ObjectList do (FMC-UPDATE.REGION obj DELTAX DELTAY WINDOW]) ) (* * Shaping items) (DEFINEQ (FMC-COMPUTE.SHAPE.REGS [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:11 by A.BLAVIER") (* ;; "Compute the shaping regions of the selected item.") (LET ((Item (WINDOWPROP WINDOW 'SELECTED.ITEM)) Region Rleft Rbottom Rwidth Rheight HalfHeight HalfWidth Reg1 Reg2 Reg3 Reg4) (SETQ Region (FMC-GET.ITEM Item REGION)) (SETQ Rleft (GET.REGION.LEFT Region)) (SETQ Rbottom (GET.REGION.BOTTOM Region)) (SETQ Rwidth (GET.REGION.WIDTH Region)) (SETQ Rheight (GET.REGION.HEIGHT Region)) (SETQ HalfHeight (IQUOTIENT Rheight 2)) (SETQ HalfWidth (IQUOTIENT Rwidth 2)) (* ;; "") (if (FMC-GET.ITEM Item BOX) then (SETQ Reg1 (LIST (CREATEREGION Rleft (IPLUS Rbottom HalfHeight) HalfWidth HalfHeight) (FUNCTION FMC-SHAPE) 'TOPLEFT UpperLeftCursor)) (SETQ Reg2 (LIST (CREATEREGION (IPLUS Rleft HalfWidth) (IPLUS Rbottom HalfHeight) HalfWidth HalfHeight) (FUNCTION FMC-SHAPE) 'TOPRIGHT UpperRightCursor)) (SETQ Reg3 (LIST (CREATEREGION (IPLUS Rleft HalfWidth) Rbottom HalfWidth HalfHeight) (FUNCTION FMC-SHAPE) 'BOTTOMRIGHT LowerRightCursor)) (SETQ Reg4 (LIST (CREATEREGION Rleft Rbottom HalfWidth HalfHeight) (FUNCTION FMC-SHAPE) 'BOTTOMLEFT LowerLeftCursor)) (WINDOWPROP WINDOW 'SHAPE.REGS (LIST Reg1 Reg2 Reg3 Reg4)) else (SETQ Reg1 (LIST (CREATEREGION Rleft Rbottom Rwidth Rheight) (FUNCTION FMC-SHAPE) NIL LowerRightCursor)) (WINDOWPROP WINDOW 'SHAPE.REGS (LIST Reg1]) (FMC-SHAPE [LAMBDA (WHERE WINDOW) (* ; "Edited 17-Aug-88 16:40 by A.BLAVIER") (* ;; "Reshape an item (simple item or group, boxed or not).") (LET ((Item (WINDOWPROP WINDOW 'SELECTED.ITEM)) Box Region RLeft RBottom RRight RTop WLeft WBottom SC.Region SC.RLeft SC.RBottom SC.RRight SC.RTop NewRegion MinWidth MinHeight CorrX CorrY) (FMC-MARK.AS.CHANGED WINDOW) (SETQ Box (FMC-GET.ITEM Item BOX)) (SETQ Region (FMC-GET.ITEM Item REGION)) (SETQ RLeft (GET.REGION.LEFT Region)) (SETQ RBottom (GET.REGION.BOTTOM Region)) (SETQ RRight (fetch (REGION PRIGHT) of Region)) (SETQ RTop (fetch (REGION PTOP) of Region)) (SETQ WLeft (IPLUS (GET.REGION.LEFT (WINDOWPROP WINDOW 'REGION)) 3)) (SETQ WBottom (IPLUS (GET.REGION.BOTTOM (WINDOWPROP WINDOW 'REGION)) 3)) (* ;; "SC stands for Screen Coordinates") (SETQ SC.RLeft (IPLUS WLeft RLeft)) (SETQ SC.RBottom (IPLUS WBottom RBottom)) (SETQ SC.RRight (IPLUS WLeft RRight)) (SETQ SC.RTop (IPLUS WBottom RTop)) (SETQ SC.Region (CREATEREGION SC.RLeft SC.RBottom (GET.REGION.WIDTH Region) (GET.REGION.HEIGHT Region))) (* ;; "compute the minimum size the item should be") (SETQ MinWidth (IPLUS (BITMAPWIDTH (FMC-GET.ITEM Item BITMAP)) (if Box then (IPLUS Box 3) else 0))) (SETQ MinHeight (IPLUS (BITMAPHEIGHT (FMC-GET.ITEM Item BITMAP)) (if Box then (IPLUS Box 3) else 0))) (FMC-DESELECT.ITEM WINDOW) (* ;; "shape the item") (SETQ NewRegion (if (NOT Box) then (GETREGION MinWidth MinHeight SC.Region (FUNCTION FMC-NOBOX.NEWREGIONFN) SC.RBottom (LIST SC.RLeft SC.RTop SC.RRight SC.RBottom)) else (SELECTQ WHERE (TOPLEFT (GETREGION MinWidth MinHeight SC.Region (FUNCTION FMC-BOX.NEWREGIONFN) (LIST SC.RLeft SC.RTop WHERE) (LIST SC.RRight SC.RBottom SC.RLeft SC.RTop))) (TOPRIGHT (GETREGION MinWidth MinHeight SC.Region (FUNCTION FMC-BOX.NEWREGIONFN) (LIST SC.RRight SC.RTop WHERE) (LIST SC.RLeft SC.RBottom SC.RRight SC.RTop))) (BOTTOMRIGHT (GETREGION MinWidth MinHeight SC.Region (FUNCTION FMC-BOX.NEWREGIONFN) (LIST SC.RRight SC.RBottom WHERE) (LIST SC.RLeft SC.RTop SC.RRight SC.RBottom))) (BOTTOMLEFT (GETREGION MinWidth MinHeight SC.Region (FUNCTION FMC-BOX.NEWREGIONFN) (LIST SC.RLeft SC.RBottom WHERE) (LIST SC.RRight SC.RTop SC.RLeft SC.RBottom))) NIL))) (FMC-CLEAR.REGION Region WINDOW) (* ;; "update it's region and bitmap position") (FMC-PUT.ITEM Item REGION (CREATEREGION (IDIFFERENCE (GET.REGION.LEFT NewRegion) WLeft) (IDIFFERENCE (GET.REGION.BOTTOM NewRegion) WBottom) (GET.REGION.WIDTH NewRegion) (GET.REGION.HEIGHT NewRegion))) (FMC-UPDATE.BM.POSITION Item WINDOW) (* ;; "if item is a group we'll have to move its items according to the new shape") (if (FMC-GROUP? Item) then (* ;; "CorrX and CorrY are correction factors needed to move the items appropriately") (SELECTQ WHERE (TOPLEFT (SETQ CorrX (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (GET.REGION.LEFT NewRegion) WLeft) RLeft) 2)) (SETQ CorrY (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (fetch (REGION PTOP) of NewRegion) WBottom) RTop) 2))) (TOPRIGHT (SETQ CorrX (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (fetch (REGION PRIGHT) of NewRegion) WLeft) RRight) 2)) (SETQ CorrY (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (fetch (REGION PTOP) of NewRegion) WBottom) RTop) 2))) (BOTTOMRIGHT (SETQ CorrX (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (fetch (REGION PRIGHT) of NewRegion) WLeft) RRight) 2)) (SETQ CorrY (IQUOTIENT (IDIFFERENCE (IDIFFERENCE ( GET.REGION.BOTTOM NewRegion) WBottom) RBottom) 2))) (BOTTOMLEFT (SETQ CorrX (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (GET.REGION.LEFT NewRegion) WLeft) RLeft) 2)) (SETQ CorrY (IQUOTIENT (IDIFFERENCE (IDIFFERENCE (GET.REGION.BOTTOM NewRegion) WBottom) RBottom) 2))) T) (for object in (FMC-GET.ITEM Item OBJECTLIST) do (FMC-UPDATE.REGION object CorrX CorrY WINDOW))) (* ;; "") (FMC-REDRAW.ITEM Item WINDOW) (WINDOWPROP WINDOW 'SELECTED.ITEM Item) (FMC-SELECT.ITEM WINDOW]) (FMC-BOX.NEWREGIONFN [LAMBDA (FIXEDPOINT MOVINGPOINT X.Y.WHERE) (* ; "Edited 17-Aug-88 16:44 by A.BLAVIER") (* ;; "Constrain box shaping so that BOXSPACE is the same horizontally and vertically.") (* ;; "This is applied to simple boxed items or to groups") (PROG ((AnchorX (CAR X.Y.WHERE)) (AnchorY (CADR X.Y.WHERE)) (WHERE (CADDR X.Y.WHERE)) (MovingX (fetch (POSITION XCOORD) of MOVINGPOINT)) (MovingY (fetch (POSITION YCOORD) of MOVINGPOINT)) DeltaX DeltaY) (if (NULL MOVINGPOINT) then (RETURN FIXEDPOINT) else (SELECTQ WHERE ((BOTTOMLEFT TOPRIGHT) (SETQ DeltaX (IDIFFERENCE MovingX AnchorX)) (SETQ DeltaY (IDIFFERENCE MovingY AnchorY)) [RETURN (CONS (IPLUS AnchorX (IMIN DeltaX DeltaY)) (IPLUS AnchorY (IMIN DeltaX DeltaY]) ((TOPLEFT BOTTOMRIGHT) (SETQ DeltaX (IDIFFERENCE MovingX AnchorX)) (SETQ DeltaY (IDIFFERENCE AnchorY MovingY)) [RETURN (CONS (IPLUS AnchorX (IMIN DeltaX DeltaY)) (IDIFFERENCE AnchorY (IMIN DeltaX DeltaY]) NIL]) (FMC-NOBOX.NEWREGIONFN [LAMBDA (FIXEDPOINT MOVINGPOINT Y) (* ; "Edited 9-Aug-88 17:15 by A.BLAVIER") (* ;; "Constrain item shaping so that only its width can get changed.") (* ;; "This is applied only to non-boxed items.") (if (NULL MOVINGPOINT) then FIXEDPOINT else (CONS (CAR MOVINGPOINT) Y]) ) (* * Redrawing items) (DEFINEQ (FMC-REDRAW [LAMBDA (WINDOW REGION) (* ; "Edited 22-Jul-88 17:41 by A.BLAVIER") (* ;; "Redraw the entire FMC window") (DSPFILL NIL (WINDOWPROP WINDOW 'FMC.BACKGROUND) 'REPLACE WINDOW) (for ITEM in (WINDOWPROP WINDOW 'ITEMLIST) do (FMC-REDRAW.ITEM ITEM WINDOW)) (if (WINDOWPROP WINDOW 'SELECTED.ITEM) then (FMC-SELECT.ITEM WINDOW)) (if (WINDOWPROP WINDOW 'SELECTION.LIST) then (FMC-SELECT.LIST WINDOW)) (if (WINDOWPROP WINDOW 'DISPLAYGRID) then (FMC-DISPLAY.GRID WINDOW]) (FMC-REDRAW.ITEM [LAMBDA (ITEM WINDOW) (* ; "Edited 17-Aug-88 16:46 by A.BLAVIER") (* ;; "Redraw one item (simple item or group).") (LET ((Bitmap (FMC-GET.ITEM ITEM BITMAP)) (Region (FMC-GET.ITEM ITEM REGION)) (ObjectList (FMC-GET.ITEM ITEM OBJECTLIST)) (Background (FMC-GET.ITEM ITEM BACKGROUND)) (Box (FMC-GET.ITEM ITEM BOX)) (BoxShade (FMC-GET.ITEM ITEM BOXSHADE)) RLeft RBottom) (DSPFILL Region Background 'REPLACE WINDOW) (if Box then (FMC-DRAW.BOX ITEM Box BoxShade WINDOW)) (* ;; "if ITEM is a group recursively call this function for each of its subitems") (if (FMC-GROUP? ITEM) then (for OBJECT in ObjectList do (FMC-REDRAW.ITEM OBJECT WINDOW)) else (SETQ RLeft (GET.REGION.LEFT Region)) (SETQ RBottom (GET.REGION.BOTTOM Region)) (BITBLT Bitmap 0 0 WINDOW (IPLUS RLeft (FMC-GET.ITEM ITEM XBMOFFSET)) (IPLUS RBottom (FMC-GET.ITEM ITEM YBMOFFSET)) NIL NIL 'INPUT 'PAINT]) ) (* * Deleting and undeleting items) (DEFINEQ (FMC-DELETE [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:47 by A.BLAVIER") (* ;; "Delete selected item(s). Save them in a list so they can get undeleted.") (LET ((Unique? (WINDOWPROP WINDOW 'SELECTED.ITEM)) ItemList) [if Unique? then (WINDOWPROP WINDOW 'SELECTION.LIST (LIST (WINDOWPROP WINDOW 'SELECTED.ITEM] (SETQ ItemList (WINDOWPROP WINDOW 'SELECTION.LIST)) (if ItemList then (FMC-DESELECT.LIST WINDOW) (for ITEM in ItemList do (DSPFILL (FMC-GET.ITEM ITEM REGION) WHITESHADE 'REPLACE WINDOW) (WINDOWDELPROP WINDOW 'ITEMLIST ITEM) (WINDOWADDPROP WINDOW 'DELETED.ITEMS ITEM T)) (FMC-PROMPTPRINT (CONCAT (LENGTH ItemList) " item(s) deleted") WINDOW) (WINDOWPROP WINDOW 'SELECTED.ITEM NIL) (WINDOWPROP WINDOW 'SELECTION.LIST NIL) (FMC-MARK.AS.CHANGED WINDOW) else (FMC-PROMPTPRINT "Nothing to Delete" WINDOW]) (FMC-UNDELETE [LAMBDA (WHAT WINDOW) (* ; "Edited 28-Jul-88 17:56 by A.BLAVIER") (* ;; "Undelete deleted items : the saved list works as a LIFO structure.") (LET ((DeletedItems (WINDOWPROP WINDOW 'DELETED.ITEMS)) UndeletedItems) (if DeletedItems then (SELECTQ WHAT (LAST (SETQ UndeletedItems (LIST (CAR DeletedItems)))) (ALL (SETQ UndeletedItems DeletedItems)) (LIST [SETQ UndeletedItems (LIST (MENU (create MENU ITEMS _ (for ITEM in DeletedItems collect (LIST (CONCAT (FMC-GET.ITEM ITEM TYPE) " - " (FMC-GET.ITEM ITEM LABEL)) (KWOTE ITEM]) NIL) (if (CAR UndeletedItems) then (for ITEM in UndeletedItems do (FMC-REDRAW.ITEM ITEM WINDOW) (WINDOWDELPROP WINDOW 'DELETED.ITEMS ITEM) (WINDOWADDPROP WINDOW 'ITEMLIST ITEM)) (FMC-PROMPTPRINT (CONCAT (LENGTH UndeletedItems) " items(s) undeleted") WINDOW) (FMC-MARK.AS.CHANGED WINDOW) else (FMC-PROMPTPRINT "Nothing Undeleted" WINDOW)) else (FMC-PROMPTPRINT "Nothing to Undelete" WINDOW]) ) (* * GROUPing and UNGROUPing) (DEFINEQ (FMC-GROUP [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:50 by A.BLAVIER") (* ;; "Group a multiple selection.") (LET ((ObjectList (WINDOWPROP WINDOW 'SELECTION.LIST)) Group GroupRegion GroupBitmap) (if (IGREATERP (LENGTH ObjectList) 1) then (FMC-MARK.AS.CHANGED WINDOW) (FMC-DESELECT WINDOW) (* ;; "remove items from the ITEMLIST") (for object in ObjectList do (WINDOWDELPROP WINDOW 'ITEMLIST object)) (* ;;  "a group is an FMC-ITEM whose TYPE is GROUP and whose OBJECTLIST is a list of items (or groups)") (SETQ Group (create FMC-ITEM)) (FMC-PUT.ITEM Group TYPE 'GROUP) (FMC-PUT.ITEM Group OBJECTLIST ObjectList) (* ;; "the group's region is the union region of its items") [SETQ GroupRegion (APPLY 'UNIONREGIONS (for OBJECT in ObjectList collect (FMC-GET.ITEM OBJECT REGION] (FMC-PUT.ITEM Group REGION (CREATEREGION (IDIFFERENCE (GET.REGION.LEFT GroupRegion) 2) (IDIFFERENCE (GET.REGION.BOTTOM GroupRegion) 2) (IPLUS (GET.REGION.WIDTH GroupRegion) 4) (IPLUS (GET.REGION.HEIGHT GroupRegion) 4))) (* ;; "the group's bitmap is the compound of its items' bitmaps") (SETQ GroupBitmap (FMC-COMPOUND.BITMAP GroupRegion ObjectList)) (FMC-PUT.ITEM Group BITMAP GroupBitmap) (FMC-PUT.ITEM Group LABEL GroupBitmap) (* ;; "default boxing is black 1 pixel thick") (FMC-PUT.ITEM Group BOX 1) (FMC-PUT.ITEM Group BOXSHADE 65535) (FMC-PUT.ITEM Group XBMOFFSET 2) (FMC-PUT.ITEM Group YBMOFFSET 2) (* ;; "") (FMC-REDRAW.ITEM Group WINDOW) (WINDOWADDPROP WINDOW 'ITEMLIST Group) (WINDOWPROP WINDOW 'SELECTED.ITEM Group) (FMC-SELECT.ITEM WINDOW]) (FMC-UNGROUP [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:50 by A.BLAVIER") (* ;; "Unpack a group.") (* ;; "For safety, this function works only on a unique selection") (LET ((Group (WINDOWPROP WINDOW 'SELECTED.ITEM)) ObjectList) (SETQ ObjectList (FMC-GET.ITEM Group OBJECTLIST)) (if (AND Group (FMC-GROUP? Group)) then (FMC-MARK.AS.CHANGED WINDOW) (WINDOWDELPROP WINDOW 'ITEMLIST Group) (FMC-DESELECT.ITEM WINDOW) (FMC-CLEAR.REGION (FMC-GET.ITEM Group REGION) WINDOW) (for OBJECT in ObjectList do (WINDOWADDPROP WINDOW 'ITEMLIST OBJECT) (WINDOWADDPROP WINDOW 'SELECTION.LIST OBJECT) (FMC-REDRAW.ITEM OBJECT WINDOW)) (FMC-SELECT.LIST WINDOW]) ) (* * Align and Center functions) (DEFINEQ (FMC-ALIGN [LAMBDA (ALIGN.TYPE WINDOW) (* ; "Edited 17-Aug-88 16:51 by A.BLAVIER") (* ;; "Align items of a multiple selection.") (* ;; "Reference is the first selected item, that is : the first item won't get moved.") (LET ((ItemList (WINDOWPROP WINDOW 'SELECTION.LIST)) RefEdge RegionOfRefItem) (FMC-MARK.AS.CHANGED WINDOW) (if (IGREATERP (LENGTH ItemList) 1) then (FMC-DESELECT.LIST WINDOW) (SETQ RegionOfRefItem (FMC-GET.ITEM (CAR ItemList) REGION)) (SETQ RefEdge (SELECTQ ALIGN.TYPE (ALIGNLEFT (GET.REGION.LEFT RegionOfRefItem)) (ALIGNBOTTOM (GET.REGION.BOTTOM RegionOfRefItem)) (ALIGNTOP (IPLUS (GET.REGION.BOTTOM RegionOfRefItem) (GET.REGION.HEIGHT RegionOfRefItem))) (ALIGNRIGHT (IPLUS (GET.REGION.LEFT RegionOfRefItem) (GET.REGION.WIDTH RegionOfRefItem))) T)) (for item in (CDR ItemList) bind region deltaX deltaY do (SETQ region (FMC-GET.ITEM item REGION)) (SETQ deltaX 0) (SETQ deltaY 0) (FMC-CLEAR.REGION region WINDOW) (SELECTQ ALIGN.TYPE (ALIGNLEFT (SETQ deltaX (IDIFFERENCE RefEdge (GET.REGION.LEFT region))) (PUT.REGION.LEFT region RefEdge)) (ALIGNBOTTOM (SETQ deltaY (IDIFFERENCE RefEdge (GET.REGION.BOTTOM region) )) (PUT.REGION.BOTTOM region RefEdge)) (ALIGNTOP (SETQ deltaY (IDIFFERENCE RefEdge (fetch (REGION PTOP) of region))) (PUT.REGION.BOTTOM region (IDIFFERENCE RefEdge ( GET.REGION.HEIGHT region)))) (ALIGNRIGHT (SETQ deltaX (IDIFFERENCE RefEdge (fetch (REGION PRIGHT) of region))) (PUT.REGION.LEFT region (IDIFFERENCE RefEdge ( GET.REGION.WIDTH region)))) T) (if (FMC-GROUP? item) then (* ;; "if item is a group its subitems have to moved proportionnally") (FMC-REL.MOVE item deltaX deltaY)) (FMC-REDRAW.ITEM item WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST ItemList) (FMC-SELECT.LIST WINDOW]) (FMC-HCENTER [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:52 by A.BLAVIER") (* ;; "Center items of a multiple selection horizontally.") (* ;; " Reference is the first selected item.") (LET ((ItemList (WINDOWPROP WINDOW 'SELECTION.LIST)) HPos RegionOfRefItem) (FMC-MARK.AS.CHANGED WINDOW) (if (IGREATERP (LENGTH ItemList) 1) then (FMC-DESELECT.LIST WINDOW) (SETQ RegionOfRefItem (FMC-GET.ITEM (CAR ItemList) REGION)) (SETQ HPos (IPLUS (GET.REGION.LEFT RegionOfRefItem) (IQUOTIENT (GET.REGION.WIDTH RegionOfRefItem) 2))) (for item in (CDR ItemList) bind region deltaX do (SETQ region (FMC-GET.ITEM item REGION)) (FMC-CLEAR.REGION region WINDOW) (SETQ deltaX (GET.REGION.LEFT region)) (PUT.REGION.LEFT region (IDIFFERENCE (GET.REGION.LEFT region) (IDIFFERENCE (IPLUS (GET.REGION.LEFT region) (IQUOTIENT ( GET.REGION.WIDTH region) 2)) HPos))) (SETQ deltaX (IDIFFERENCE (GET.REGION.LEFT region) deltaX)) (if (FMC-GROUP? item) then (* ;; "if item is a group its subitems have to be moved proportionnally") (FMC-REL.MOVE item deltaX 0)) (FMC-REDRAW.ITEM item WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST ItemList) (FMC-SELECT.LIST WINDOW]) (FMC-VCENTER [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:53 by A.BLAVIER") (* ;; "Center items vertically.") (* ;; "Reference is the first selected item.") (LET ((ItemList (WINDOWPROP WINDOW 'SELECTION.LIST)) VPos RegionOfRefItem) (FMC-MARK.AS.CHANGED WINDOW) (if (IGREATERP (LENGTH ItemList) 1) then (FMC-DESELECT.LIST WINDOW) (SETQ RegionOfRefItem (FMC-GET.ITEM (CAR ItemList) REGION)) (SETQ VPos (IPLUS (GET.REGION.BOTTOM RegionOfRefItem) (IQUOTIENT (GET.REGION.HEIGHT RegionOfRefItem) 2))) (for item in (CDR ItemList) bind region deltaY do (SETQ region (FMC-GET.ITEM item REGION)) (FMC-CLEAR.REGION region WINDOW) (SETQ deltaY (GET.REGION.BOTTOM region)) (PUT.REGION.BOTTOM region (IDIFFERENCE (GET.REGION.BOTTOM region) (IDIFFERENCE (IPLUS (GET.REGION.BOTTOM region) (IQUOTIENT ( GET.REGION.HEIGHT region) 2)) VPos))) (SETQ deltaY (IDIFFERENCE (GET.REGION.BOTTOM region) deltaY)) (if (FMC-GROUP? item) then (* ;; "if item is a group its subitems have to be moved proportionnally") (FMC-REL.MOVE item 0 deltaY)) (FMC-REDRAW.ITEM item WINDOW)) (WINDOWPROP WINDOW 'SELECTION.LIST ItemList) (FMC-SELECT.LIST WINDOW]) (FMC-REL.MOVE [LAMBDA (GROUP DELTAX DELTAY) (* ; "Edited 3-Aug-88 16:27 by A.BLAVIER") (* ;;  "Move the items of a group when the group itself has been moved by a Center or Align operation.") (LET ((ObjectList (FMC-GET.ITEM GROUP OBJECTLIST))) (for item in ObjectList bind Region do (SETQ Region (FMC-GET.ITEM item REGION)) (PUT.REGION.LEFT Region (IPLUS (GET.REGION.LEFT Region) DELTAX)) (PUT.REGION.BOTTOM Region (IPLUS (GET.REGION.BOTTOM Region) DELTAY)) (if (FMC-GROUP? item) then (FMC-REL.MOVE item DELTAX DELTAY]) ) (* * File saving and loading) (DEFINEQ (FMC-GET [LAMBDA (WINDOW) (* ; "Edited 18-Aug-88 11:48 by A.BLAVIER") (* ;; "Read item(s) from a FMC file and add them to the window.") (LET ((PromptWindow (WINDOWPROP WINDOW 'FMC.PROMPTWINDOW)) FileName Stream Expr Item) (FMC-PROMPTPRINT "" WINDOW) (* ;; "input the file name") [SETQ FileName (PROMPTFORWORD "File to GET :" FileName NIL PromptWindow NIL NIL (CHARCODE (EOL ESCAPE LF TAB] (if FileName then (* ;; "check that FileName exists") (if (FINDFILE FileName) then (RESETLST (SETQ Stream (OPENSTREAM FileName 'INPUT)) (RESETSAVE (CURSOR WAITINGCURSOR)) (RESETSAVE NIL (LIST 'CLOSEF Stream)) (* ;; "check that the file is actually a FMC file") (if (NEQ (READ Stream) 'FreeMenuCreator-ItemList) then (FMC-PROMPTPRINT "Not a Free Menu Creator file" WINDOW) else (FMC-DESELECT WINDOW) (FMC-PROMPTPRINT (CONCAT "GETting file " (FULLNAME Stream) "...") WINDOW) (* ;; "read the items in") (until (EQ (SETQ Item (FMC-GET.ONE.OBJECT Stream)) 'STOP) do (WINDOWADDPROP WINDOW 'ITEMLIST Item) (WINDOWADDPROP WINDOW 'SELECTION.LIST Item)) (FMC-REDRAW WINDOW) (FMC-PROMPTPRINT (CONCAT "GETting file " (FULLNAME Stream) "...done") WINDOW))) (* ;; "if the window was not (file)named yet, change it's title") (if (NOT (WINDOWPROP WINDOW 'FILENAME)) then (WINDOWPROP WINDOW 'FILENAME FileName) (WINDOWPROP WINDOW 'TITLE FileName)) (FMC-MARK.AS.CHANGED WINDOW) else (FMC-PROMPTPRINT (CONCAT "Couldn't find file " FileName) WINDOW)) else (FMC-PROMPTPRINT "GET aborted" WINDOW]) (FMC-GET.ONE.OBJECT [LAMBDA (STREAM) (* ; "Edited 12-Aug-88 11:33 by A.BLAVIER") (* ;; "Read in one item from STREAM") (PROG (Expr Item Bitmap CompoundRegion ObjectListSize) (SETQ Expr (READ STREAM)) (SETQ ObjectListSize (CAR (NTH Expr 13))) (if (NEQ Expr 'STOP) then (SETQ Item (FMC-CREATE.ITEM.FROM.LIST Expr)) (FMC-PUT.ITEM Item OBJECTLIST NIL) [COND ((NEQ (CAR Expr) 'GROUP) (* ;;  "if it's not a group read its bitmap if any. If none compute it from its label and font") [if (EQ (CADR Expr) '**BITMAP**) then (SETQ Bitmap (HREAD STREAM)) (FMC-PUT.ITEM Item LABEL Bitmap) else (SETQ Bitmap (FMC-MAKEBITMAP (CADR Expr) (CADDR Expr] (FMC-PUT.ITEM Item BITMAP Bitmap)) (T (* ;; "it's a group : read its items and build the OBJECTLIST") (FMC-PUT.ITEM Item OBJECTLIST (for i from 1 to ObjectListSize collect (FMC-GET.ONE.OBJECT STREAM))) (* ;; "compute its bitmap") [SETQ CompoundRegion (APPLY 'UNIONREGIONS (for i in (FMC-GET.ITEM Item OBJECTLIST) collect (FMC-GET.ITEM i REGION] (FMC-PUT.ITEM Item BITMAP (FMC-COMPOUND.BITMAP CompoundRegion (FMC-GET.ITEM Item OBJECTLIST))) (FMC-PUT.ITEM Item LABEL (FMC-GET.ITEM Item BITMAP] (RETURN Item) else (RETURN 'STOP]) (FMC-PUT [LAMBDA (WINDOW) (* ; "Edited 12-Aug-88 13:35 by A.BLAVIER") (* ;; "Save the contents of WINDOW onto a file.") (LET ((PromptWindow (WINDOWPROP WINDOW 'FMC.PROMPTWINDOW)) (ItemList (WINDOWPROP WINDOW 'ITEMLIST)) (FileName (WINDOWPROP WINDOW 'FILENAME)) Stream) (if ItemList then (FMC-PROMPTPRINT "" WINDOW) (* ;; "input the file name") [SETQ FileName (PROMPTFORWORD "File to PUT to :" FileName NIL PromptWindow NIL NIL (CHARCODE (EOL ESCAPE LF TAB] (if FileName then (RESETLST (SETQ Stream (OPENSTREAM FileName 'OUTPUT)) (RESETSAVE (CURSOR WAITINGCURSOR)) (RESETSAVE NIL (LIST 'CLOSEF Stream)) (FMC-PROMPTPRINT (CONCAT "PUTting file " (FULLNAME Stream) "...") WINDOW) (* ;; "write the FMC header") (PRINTOUT Stream 'FreeMenuCreator-ItemList T) (* ;; "write the items") (for item in ItemList do (FMC-PUT.OBJECT item Stream)) (PRINTOUT Stream 'STOP) (FMC-PROMPTPRINT (CONCAT "PUTting file " (FULLNAME Stream) "...done") WINDOW)) (* ;; "change the window title") (WINDOWPROP WINDOW 'FILENAME FileName) (WINDOWPROP WINDOW 'TITLE FileName) (WINDOWPROP WINDOW 'FMC.CHANGED NIL) else (FMC-PROMPTPRINT "PUT aborted" WINDOW]) (FMC-PUT.OBJECT [LAMBDA (ITEM STREAM) (* ; "Edited 12-Aug-88 10:33 by A.BLAVIER") (* ;; "write one item on STREAM") (LET ((ObjectList (FMC-GET.ITEM ITEM OBJECTLIST)) (Label (FMC-GET.ITEM ITEM LABEL)) (Message (FMC-GET.ITEM ITEM MESSAGE))) (PRINTOUT STREAM (LIST (FMC-GET.ITEM ITEM TYPE) (if (BITMAPP Label) then "**BITMAP**" else (CONCAT '%" Label '%")) (FMC-GET.ITEM ITEM FONT) (FMC-GET.ITEM ITEM ID) (FMC-GET.ITEM ITEM COLLECTION) (FMC-GET.ITEM ITEM DESELECT) (if Message then (CONCAT '%" Message '%") else (CONCAT '%" '%")) (FMC-GET.ITEM ITEM INITSTATE) (FMC-GET.ITEM ITEM BOX) (FMC-GET.ITEM ITEM BOXSHADE) (FMC-GET.ITEM ITEM BACKGROUND) (FMC-GET.ITEM ITEM LINKS) (LENGTH ObjectList) (FMC-GET.ITEM ITEM MENU) (FMC-GET.ITEM ITEM CHANGESTATE) (FMC-GET.ITEM ITEM SELECTEDFN) (FMC-GET.ITEM ITEM DOWNFN) (FMC-GET.ITEM ITEM HELDFN) (FMC-GET.ITEM ITEM MOVEDFN) (FMC-GET.ITEM ITEM REGION) NIL (FMC-GET.ITEM ITEM XBMOFFSET) (FMC-GET.ITEM ITEM YBMOFFSET) (FMC-GET.ITEM ITEM INFINITEWIDTH) (FMC-GET.ITEM ITEM USERDATA)) T) (if (AND (BITMAPP Label) (NOT (FMC-GROUP? ITEM))) then (HPRINT Label STREAM T T)) (if (FMC-GROUP? ITEM) then (* ;; "ITEM is a group : write its subitems") (for object in ObjectList do (FMC-PUT.OBJECT object STREAM]) ) (* * Creating a summary) (DEFINEQ (FMC-EDIT.INFO [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 16:57 by A.BLAVIER") (* ;; "Create a %"dead%" TEdit window, listing a summary of the items.") (LET ((ItemList (WINDOWPROP WINDOW 'ITEMLIST)) Stream TEdWindow) (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) (SETQ Stream (OPENTEXTSTREAM "")) (RESETSAVE NIL (LIST 'CLOSEF Stream)) (FMC-PROMPTPRINT "Creating summary ..." WINDOW) (SETCURSOR WAITINGCURSOR) (FMC-SORT.ITEM.LIST ItemList) (* ;; "") (PRINTOUT Stream .FONT '(MODERN 14 BOLD) "- Free Menu Creator Summary -" T T) (PRINTOUT Stream .FONT '(MODERN 10 REGULAR) (DATE) T T) (for item in ItemList do (FMC-EDIT.INFO.ITEM item Stream 0)) (TEDIT.PARALOOKS Stream '(QUAD CENTERED) 1 2) (SETCURSOR DEFAULTCURSOR) (FMC-PROMPTPRINT "Creating summary ... done" WINDOW) (SETQ TEdWindow (CREATEW NIL "FMC Items Summary")) (OPENTEXTSTREAM Stream TEdWindow]) (FMC-EDIT.INFO.ITEM [LAMBDA (ITEM STREAM SPACES) (* ; "Edited 8-Aug-88 17:00 by A.BLAVIER") (* ;; "This function is called by FMC-EDIT.INFO (and by itself). Writes on STREAM interesting item properties.") (LET ((ID (FMC-GET.ITEM ITEM ID)) (LABEL (FMC-GET.ITEM ITEM LABEL)) (TYPE (FMC-GET.ITEM ITEM TYPE)) (FONT (FMC-GET.ITEM ITEM FONT)) (CHANGESTATE (FMC-GET.ITEM ITEM CHANGESTATE)) (SELECTEDFN (FMC-GET.ITEM ITEM SELECTEDFN)) (DOWNFN (FMC-GET.ITEM ITEM DOWNFN)) (HELDFN (FMC-GET.ITEM ITEM HELDFN)) (MOVEDFN (FMC-GET.ITEM ITEM MOVEDFN)) (MENU (FMC-GET.ITEM ITEM MENU)) (INITSTATE (FMC-GET.ITEM ITEM INITSTATE)) (LINKS (FMC-GET.ITEM ITEM LINKS)) (INFINITEWIDTH (FMC-GET.ITEM ITEM INFINITEWIDTH)) (MESSAGE (FMC-GET.ITEM ITEM MESSAGE)) (OBJECTLIST (FMC-GET.ITEM ITEM OBJECTLIST))) (if (FMC-GROUP? ITEM) then (PRINTOUT STREAM .SP SPACES .FONT '(MODERN 12 BOLD) "GROUP - " .FONT '(MODERN 10 BOLDITALIC) " ID : " .FONT '(MODERN 10 REGULAR) ID T) (for OBJECT in (FMC-SORT.ITEM.LIST OBJECTLIST) do (FMC-EDIT.INFO.ITEM OBJECT STREAM (IPLUS SPACES 5))) else (PRINTOUT STREAM .SP SPACES .FONT '(MODERN 10 BOLD) "ITEM - " .FONT '(MODERN 10 BOLDITALIC) " ID : " .FONT '(MODERN 10 REGULAR) ID .FONT '(MODERN 10 BOLDITALIC) " - LABEL : " .FONT '(MODERN 10 REGULAR) LABEL T .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "TYPE : " .FONT '(MODERN 10 REGULAR) TYPE T) (if [NOT (FMEMB TYPE '(DISPLAY EDIT NUMBER] then (if (EQ TYPE 'STATE) then (if [NOT (EQUAL MENU '(NIL] then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "MENU : " .FONT '(MODERN 10 REGULAR) MENU T)) (if [NOT (EQUAL CHANGESTATE '(FUNCTION NILL] then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "CHANGESTATE : " .FONT '(MODERN 10 REGULAR) CHANGESTATE T))) (for prop in '(SELECTEDFN DOWNFN HELDFN MOVEDFN) bind Def do (SETQ Def (EVAL prop)) (if [NOT (EQUAL Def '(FUNCTION NILL] then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) (CONCAT prop " : ") .FONT '(MODERN 10 REGULAR) Def T))) (if INITSTATE then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "INITSTATE : " .FONT '(MODERN 10 REGULAR) INITSTATE T)) (if LINKS then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "LINKS : " .FONT '(MODERN 10 REGULAR) LINKS T))) (if (FMEMB TYPE '(EDIT NUMBER)) then (PRINTOUT STREAM .SP SPACES .SP 5 .FONT '(MODERN 10 BOLDITALIC) "INFINITEWIDTH : " .FONT '(MODERN 10 REGULAR) INFINITEWIDTH T]) ) (* * Hardcopy functions) (DEFINEQ (FMC-HARDCOPY [LAMBDA (WINDOW STREAM) (* ; "Edited 17-Aug-88 17:01 by A.BLAVIER") (* ;; "Make a centered hardcopy of the contents of the FMC window.") (LET ((ItemList (WINDOWPROP WINDOW 'ITEMLIST)) (PageScale (DSPSCALE NIL STREAM)) (Xmin 5000) (Xmax 0) (Ymin 5000) (Ymax 0) PageWidth PageHeight FMCWidth FMCHeight Xoffset Yoffset 2points 5points 10points) (FMC-PROMPTPRINT "Formatting for print ..." WINDOW) (* ; "compute X and Y offsets") (for item in ItemList bind (region left bottom right top) do (SETQ region (FMC-GET.ITEM item REGION)) (SETQ left (GET.REGION.LEFT region)) (SETQ bottom (GET.REGION.BOTTOM region)) (SETQ right (fetch (REGION RIGHT) of region)) (SETQ top (fetch (REGION TOP) of region)) (if (ILESSP left Xmin) then (SETQ Xmin left)) (if (ILESSP bottom Ymin) then (SETQ Ymin bottom)) (if (IGREATERP right Xmax) then (SETQ Xmax right)) (if (IGREATERP top Ymax) then (SETQ Ymax top))) (SETQ PageWidth (FIX (TIMES 8.27 72 PageScale))) (SETQ PageHeight (FIX (TIMES 11.69 72 PageScale))) (SETQ FMCWidth (ITIMES PageScale (IDIFFERENCE Xmax Xmin))) (SETQ FMCHeight (ITIMES PageScale (IDIFFERENCE Ymax Ymin))) (SETQ Xoffset (IQUOTIENT (IDIFFERENCE PageWidth FMCWidth) 2)) (if (ILESSP Xoffset 0) then (SETQ Xoffset 0)) (SETQ Yoffset (IQUOTIENT (IDIFFERENCE PageHeight FMCHeight) 2)) (SETQ 2points (ITIMES PageScale 2)) (SETQ 5points (ITIMES PageScale 5)) (SETQ 10points (ITIMES PageScale 10)) (if (ILESSP Yoffset 0) then (SETQ Yoffset 0)) (* ;; "draw a rectangle around the items") (DRAWLINE (IDIFFERENCE Xoffset 5points) (IDIFFERENCE Yoffset 5points) (IPLUS Xoffset FMCWidth 5points) (IDIFFERENCE Yoffset 5points) 2points 'REPLACE STREAM) (RELDRAWTO 0 (IPLUS FMCHeight 10points) 2points 'REPLACE STREAM) (RELDRAWTO (MINUS (IPLUS FMCWidth 10points)) 0 2points 'REPLACE STREAM) (RELDRAWTO 0 (MINUS (IPLUS FMCHeight 10points)) 2points 'REPLACE STREAM) (* ;; "adjust X and Y offsets so that the lower left item gets printed in the lower left corner of the area") (SETQ Xoffset (IDIFFERENCE Xoffset (ITIMES PageScale Xmin))) (SETQ Yoffset (IDIFFERENCE Yoffset (ITIMES PageScale Ymin))) (* ;; "draw the items") (for item in ItemList do (FMC-HARDCOPY.ITEM item STREAM Xoffset Yoffset)) (FMC-PROMPTPRINT (CONCAT "Formatting for print ... " " done") WINDOW]) (FMC-HARDCOPY.ITEM [LAMBDA (ITEM STREAM XOFFSET YOFFSET) (* ; "Edited 17-Aug-88 17:12 by A.BLAVIER") (* ;; "Recursive function initially called by FMC-HARDCOPY.") (LET ((Label (FMC-GET.ITEM ITEM LABEL)) (Font (FMC-GET.ITEM ITEM FONT)) (Bitmap (FMC-GET.ITEM ITEM BITMAP)) (Region (FMC-GET.ITEM ITEM REGION)) (Box (FMC-GET.ITEM ITEM BOX)) (BoxShade (FMC-GET.ITEM ITEM BOXSHADE)) (ObjectList (FMC-GET.ITEM ITEM OBJECTLIST)) (PageScale (DSPSCALE NIL STREAM)) RLeft RBottom RWidth RHeight RRight RTop) [SETQ RLeft (IPLUS XOFFSET (ITIMES PageScale (GET.REGION.LEFT Region] [SETQ RBottom (IPLUS YOFFSET (ITIMES PageScale (GET.REGION.BOTTOM Region] (SETQ RWidth (ITIMES PageScale (GET.REGION.WIDTH Region))) (SETQ RHeight (ITIMES PageScale (GET.REGION.HEIGHT Region))) (SETQ RRight (IPLUS RLeft RWidth)) (SETQ RTop (IPLUS RBottom RHeight)) (SETQ Region (CREATEREGION RLeft RBottom RWidth RHeight)) (DSPFILL Region (FMC-GET.ITEM ITEM BACKGROUND) 'REPLACE STREAM) (if Box then (SETQ Box (ITIMES PageScale Box)) (DSPFILL (CREATEREGION RLeft RBottom Box RHeight) BoxShade 'REPLACE STREAM) (DSPFILL (CREATEREGION RLeft (IDIFFERENCE RTop Box) RWidth Box) BoxShade 'REPLACE STREAM) (DSPFILL (CREATEREGION (IDIFFERENCE RRight Box) RBottom Box RHeight) BoxShade 'REPLACE STREAM) (DSPFILL (CREATEREGION RLeft RBottom RWidth Box) BoxShade 'REPLACE STREAM)) (if (FMC-GROUP? ITEM) then (for object in ObjectList do (FMC-HARDCOPY.ITEM object STREAM XOFFSET YOFFSET)) else (if (BITMAPP Label) then [BITBLT Bitmap 0 0 STREAM (IPLUS RLeft (ITIMES PageScale (FMC-GET.ITEM ITEM XBMOFFSET))) (IPLUS RBottom (ITIMES PageScale (FMC-GET.ITEM ITEM YBMOFFSET] else (MOVETO (IPLUS RLeft (ITIMES PageScale (FMC-GET.ITEM ITEM XBMOFFSET))) [IPLUS RBottom (ITIMES PageScale (FMC-GET.ITEM ITEM YBMOFFSET)) (ITIMES PageScale (FONTPROP Font 'DESCENT] STREAM) (PRINTOUT STREAM .FONT Font Label]) ) (* * Creating the desription list) (DEFINEQ (FMC-COMPUTE [LAMBDA (WINDOW) (* ; "Edited 12-Aug-88 13:49 by A.BLAVIER") (* ;; "Compute a description list suitable for the FREEMENU function.") (* ;; "Store the list in the global variable FM-DESCRIPTION.") (* ;; "Create and open a real Free Menu window built out of the description.") (LET ((Background (WINDOWPROP WINDOW 'FMC.BACKGROUND)) Description FM-WINDOW) (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) (FMC-PROMPTPRINT "COMPUTING ... " WINDOW) (* ;; "build the description list") (SETQ Description '(PROPS FORMAT EXPLICIT)) [if (AND Background (NOT (EQP Background 0))) then (SETQ Description (APPEND Description `(BACKGROUND ,Background] [SETQ Description (CONS Description (for object in (FMC-SORT.ITEM.LIST (WINDOWPROP WINDOW 'ITEMLIST)) collect (FMC-COMPUTE.OBJECT object] (SETQ FM-DESCRIPTION Description) (* ;; "create the Free Menu") (SETQ FM-WINDOW (FREEMENU Description)) (FMC-PROMPTPRINT "COMPUTING ... DONE" WINDOW)) (MOVEW FM-WINDOW (GETBOXPOSITION (WINDOWPROP FM-WINDOW 'WIDTH) (WINDOWPROP FM-WINDOW 'HEIGHT) (IDIFFERENCE (CAR (WINDOWPROP WINDOW 'REGION)) 0) (IDIFFERENCE (CADR (WINDOWPROP WINDOW 'REGION)) 0))) (OPENW FM-WINDOW) (TOTOPW FM-WINDOW]) (FMC-COMPUTE.OBJECT [LAMBDA (OBJECT COLLECTIONID DESELECT) (* ; "Edited 11-Aug-88 16:55 by A.BLAVIER") (* ;; "This recursive function computes the description sublist of OBJECT [Group or Item]") (PROG (Region Type Label Id Box Boxshade Font CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN Menu Links Initstate Background InfiniteWidth ObjectList TmpLst) (SETQ Region (FMC-GET.ITEM OBJECT REGION)) (SETQ Type (FMC-GET.ITEM OBJECT TYPE)) (SETQ Label (if (STREQUAL (FMC-GET.ITEM OBJECT LABEL) "*NOLABEL*") then "" else (FMC-GET.ITEM OBJECT LABEL))) (SETQ Id (FMC-GET.ITEM OBJECT ID)) (if (FMC-GROUP? OBJECT) then (SETQ Collection (FMC-GET.ITEM OBJECT COLLECTION))) (SETQ Box (FMC-GET.ITEM OBJECT BOX)) (SETQ Boxshade (FMC-GET.ITEM OBJECT BOXSHADE)) (SETQ Font (FMC-GET.ITEM OBJECT FONT)) (SETQ CHANGESTATE (FMC-GET.ITEM OBJECT CHANGESTATE)) (SETQ SELECTEDFN (FMC-GET.ITEM OBJECT SELECTEDFN)) (SETQ DOWNFN (FMC-GET.ITEM OBJECT DOWNFN)) (SETQ HELDFN (FMC-GET.ITEM OBJECT HELDFN)) (SETQ MOVEDFN (FMC-GET.ITEM OBJECT MOVEDFN)) (SETQ Menu (FMC-GET.ITEM OBJECT MENU)) (SETQ Links (FMC-GET.ITEM OBJECT LINKS)) (SETQ Initstate (FMC-GET.ITEM OBJECT INITSTATE)) (SETQ Background (FMC-GET.ITEM OBJECT BACKGROUND)) (SETQ InfiniteWidth (FMC-GET.ITEM OBJECT INFINITEWIDTH)) (SETQ ObjectList (FMC-GET.ITEM OBJECT OBJECTLIST)) (if (FMC-GROUP? OBJECT) then (* ;; "it's a group : compute the header") [SETQ TmpLst `(PROPS ID ,Id LEFT ,(GET.REGION.LEFT Region) BOTTOM ,(GET.REGION.BOTTOM Region) BOX ,Box BOXSHADE ,Boxshade BOXSPACE ,(IDIFFERENCE (FMC-GET.ITEM OBJECT YBMOFFSET) Box] [if (AND Background (NOT (EQP Background 0))) then (SETQ TmpLst (APPEND TmpLst `(BACKGROUND ,Background] (SETQ TmpLst (CONS 'GROUP (LIST TmpLst))) (* ;; "and recursively build it's description") (FMC-SORT.ITEM.LIST ObjectList) (NCONC1 TmpLst (FMC-COMPUTE.OBJECT (CAR ObjectList) Collection (FMC-GET.ITEM OBJECT DESELECT))) (for item in (CDR ObjectList) do (NCONC1 TmpLst (FMC-COMPUTE.OBJECT item Collection))) else (* ;;  "it's a simple item : do the exhausting task of building a property list-format description") (SETQ TmpLst (LIST 'LABEL Label 'TYPE Type 'LEFT (GET.REGION.LEFT Region) 'BOTTOM (GET.REGION.BOTTOM Region))) (if Id then (LISTPUT TmpLst 'ID Id)) [if (EQ Type 'NWAY) then (LISTPUT TmpLst 'COLLECTION COLLECTIONID) (if DESELECT then (LISTPUT TmpLst 'NWAYPROPS '(DESELECT T] (if Box then (LISTPUT TmpLst 'BOX Box) (LISTPUT TmpLst 'BOXSHADE Boxshade) (LISTPUT TmpLst 'BOXSPACE (IDIFFERENCE (FMC-GET.ITEM OBJECT YBMOFFSET) Box))) (if Font then (LISTPUT TmpLst 'FONT Font)) [if (AND [NOT (EQUAL CHANGESTATE '(FUNCTION NILL] (LISTP CHANGESTATE)) then (LISTPUT TmpLst 'CHANGESTATE (if (EQUAL (CAR CHANGESTATE) 'LAMBDA) then CHANGESTATE else (CADR CHANGESTATE] [for prop in '(CHANGESTATE SELECTEDFN DOWNFN HELDFN MOVEDFN) bind Def do (SETQ Def (EVAL prop)) (if [NOT (EQUAL Def '(FUNCTION NILL] then (LISTPUT TmpLst prop (if (EQUAL (CAR Def) 'LAMBDA) then Def else (CADR Def] [if (CAR Menu) then (LISTPUT TmpLst 'MENUITEMS (CAR Menu)) (if (CADR Menu) then (LISTPUT TmpLst 'MENUFONT (CADR Menu))) (if (CADDR Menu) then (LISTPUT TmpLst 'MENUTITLE (CADDR Menu] (if (CAR Links) then (LISTPUT TmpLst 'LINKS Links)) (if Initstate then (LISTPUT TmpLst 'INITSTATE Initstate)) (if (OR [AND [NOT (FMEMB Type '(EDIT NUMBER] (NOT Box) (NOT (EQUAL (GET.REGION.WIDTH Region) (BITMAPWIDTH (FMC-GET.ITEM OBJECT BITMAP] (AND (FMEMB Type '(EDIT NUMBER)) (NOT InfiniteWidth))) then (LISTPUT TmpLst 'MAXWIDTH (GET.REGION.WIDTH Region))) (if (AND Background (NOT (EQP Background 0))) then (LISTPUT TmpLst 'BACKGROUND Background))) (RETURN TmpLst]) ) (* * Miscellaneous) (DEFINEQ (FMC-CREATE.ITEM.FROM.LIST [LAMBDA (L) (* ; "Edited 12-Aug-88 11:21 by A.BLAVIER") (* ;; "Given a list as those saved in a FMC file, create a new item.") (create FMC-ITEM TYPE _ (CAR (NTH L 1)) LABEL _ (CAR (NTH L 2)) FONT _ (CAR (NTH L 3)) ID _ (CAR (NTH L 4)) COLLECTION _ (CAR (NTH L 5)) DESELECT _ (CAR (NTH L 6)) MESSAGE _ (CAR (NTH L 7)) INITSTATE _ (CAR (NTH L 8)) BOX _ (CAR (NTH L 9)) BOXSHADE _ (CAR (NTH L 10)) BACKGROUND _ (CAR (NTH L 11)) LINKS _ (CAR (NTH L 12)) OBJECTLIST _ (CAR (NTH L 13)) MENU _ (CAR (NTH L 14)) CHANGESTATE _ (CAR (NTH L 15)) SELECTEDFN _ (CAR (NTH L 16)) DOWNFN _ (CAR (NTH L 17)) HELDFN _ (CAR (NTH L 18)) MOVEDFN _ (CAR (NTH L 19)) REGION _ (CAR (NTH L 20)) BITMAP _ (CAR (NTH L 21)) XBMOFFSET _ (CAR (NTH L 22)) YBMOFFSET _ (CAR (NTH L 23)) INFINITEWIDTH _ (CAR (NTH L 24)) USERDATA _ (CAR (NTH L 25]) (FMC-DRAW.BOX [LAMBDA (ITEM BOX BOXSHADE WINDOW) (* ; "Edited 17-Aug-88 17:38 by A.BLAVIER") (* ;; "Draw a BOX wide box around the item with BOXSHADE.") (LET ((Region (FMC-GET.ITEM ITEM REGION)) RLeft RBottom RWidth RHeight RRight RTop) (SETQ RLeft (GET.REGION.LEFT Region)) (SETQ RBottom (GET.REGION.BOTTOM Region)) (SETQ RWidth (GET.REGION.WIDTH Region)) (SETQ RHeight (GET.REGION.HEIGHT Region)) (SETQ RRight (fetch (REGION PRIGHT) of Region)) (SETQ RTop (fetch (REGION PTOP) of Region)) (if BOX then (DSPFILL (CREATEREGION RLeft RBottom BOX RHeight) BOXSHADE 'REPLACE WINDOW) (DSPFILL (CREATEREGION RLeft (IDIFFERENCE RTop BOX) RWidth BOX) BOXSHADE 'REPLACE WINDOW) (DSPFILL (CREATEREGION (IDIFFERENCE RRight BOX) RBottom BOX RHeight) BOXSHADE 'REPLACE WINDOW) (DSPFILL (CREATEREGION RLeft RBottom RWidth BOX) BOXSHADE 'REPLACE WINDOW]) (FMC-CHOOSE.WINDOW.BG [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 17:39 by A.BLAVIER") (* ;; "Choose a background shade for the FMC window.") (LET ((ShadeMenu (WINDOWPROP (WINDOWPROP WINDOW 'FMC.IP.WINDOW) 'SHADE.MENU)) Shade) (SETQ Shade (MENU ShadeMenu)) (if Shade then (WINDOWPROP WINDOW 'FMC.BACKGROUND (CDR Shade)) (FMC-REDRAW WINDOW]) (FMC-DISPLAY.GRID [LAMBDA (WINDOW) (* ; "Edited 17-Aug-88 17:40 by A.BLAVIER") (LET [(Size (WINDOWPROP WINDOW 'GRIDSIZE] [if (AND Size (IGREATERP Size 2)) then (for y from 0 to (WINDOWPROP WINDOW 'HEIGHT) by Size do (DRAWLINE 0 y (WINDOWPROP WINDOW 'WIDTH) y 1 'REPLACE WINDOW NIL (LIST 1 (SUB1 Size] (WINDOWPROP WINDOW 'DISPLAYGRID T]) (FMC-SET.GRIDSIZE [LAMBDA (SIZE WINDOW) (* ; "Edited 22-Jun-88 13:47 by A.BLAVIER") (if (EQ SIZE 'NOGRID) then (WINDOWPROP WINDOW 'GRIDSIZE NIL) (FMC-PROMPTPRINT "No grid" WINDOW) (if (WINDOWPROP WINDOW 'DISPLAYGRID) then (FMC-REDRAW WINDOW)) (WINDOWPROP WINDOW 'DISPLAYGRID NIL) else (FMC-PROMPTPRINT (CONCAT "Grid size is " SIZE) WINDOW) (if (NOT (EQP (WINDOWPROP WINDOW 'GRIDSIZE) SIZE)) then (WINDOWPROP WINDOW 'GRIDSIZE SIZE) (if (WINDOWPROP WINDOW 'DISPLAYGRID) then (FMC-REDRAW WINDOW]) (FMC-FONT->LIST [LAMBDA (FONT) (* ; "Edited 17-Aug-88 17:42 by A.BLAVIER") (* ;; "Compute a Font description list based on a Font Descriptor.") (LET [(Face (FONTPROP FONT 'FACE] (LIST (FONTPROP FONT 'FAMILY) (FONTPROP FONT 'SIZE) (COND ((EQUAL Face '(MEDIUM REGULAR REGULAR)) 'STANDARD) ((EQUAL Face '(MEDIUM ITALIC REGULAR)) 'ITALIC) ((EQUAL Face '(BOLD REGULAR REGULAR)) 'BOLD) ((EQUAL Face '(BOLD ITALIC REGULAR)) 'BOLDITALIC]) (FMC-LIST->FONT [LAMBDA (FONT.LIST) (* ; "Edited 17-Aug-88 17:42 by A.BLAVIER") (* ;; "Compute a Font Descriptor based on a Font description list.") (FONTCREATE (CAR FONT.LIST) (CADR FONT.LIST) (CADDR FONT.LIST) 0 'DISPLAY]) (FMC-SORT.ITEM.LIST [LAMBDA (LIST) (* ; "Edited 17-Aug-88 17:43 by A.BLAVIER") (* ;;  "Sort items by order of appearance in the window from top to bottom and from left to right.") (SORT LIST (FUNCTION (LAMBDA (ITEMA ITEMB) (LET [(LEFTA (GET.REGION.LEFT (FMC-GET.ITEM ITEMA REGION))) (LEFTB (GET.REGION.LEFT (FMC-GET.ITEM ITEMB REGION))) (TOPA (fetch (REGION TOP) of (FMC-GET.ITEM ITEMA REGION))) (TOPB (fetch (REGION TOP) of (FMC-GET.ITEM ITEMB REGION))) (BOTTOMA (GET.REGION.BOTTOM (FMC-GET.ITEM ITEMA REGION))) (BOTTOMB (GET.REGION.BOTTOM (FMC-GET.ITEM ITEMB REGION] (OR (> BOTTOMA TOPB) (AND (< LEFTA LEFTB) (< BOTTOMB TOPA]) (FMC-IMPORT [LAMBDA (WINDOW) (* ; "Edited 12-Aug-88 10:42 by A.BLAVIER") (* ;; "Import items from a Free Menu.") (LET (FM.WINDOW FM.ITEMS) (FMC-PROMPTPRINT "Click on the Free Menu you want to import from" WINDOW) (while (MOUSESTATE (NOT LEFT))) (SETQ FM.WINDOW (WHICHW)) (SETQ FM.ITEMS (WINDOWPROP FM.WINDOW 'FM.ITEMS)) (if (NOT FM.ITEMS) then (FMC-PROMPTPRINT "This is not a Free Menu" WINDOW) else (INVERTW FM.WINDOW) (FMC-PROMPTPRINT "Importing items ..." WINDOW) (FMC-DESELECT WINDOW) (for ITEM in FM.ITEMS bind NEW.ITEM label message links userData menuProps changeState selectedFn downFn heldFn movedFn do (SETQ label (fetch FM.LABEL of ITEM)) (SETQ message (fetch FM.MESSAGE of ITEM)) (SETQ links (fetch FM.LINKS of ITEM)) (SETQ userData (fetch FM.USERDATA of ITEM)) (SETQ changeState (LISTGET userData 'CHANGESTATE)) (SETQ selectedFn (fetch FM.SELECTEDFN of ITEM)) (SETQ downFn (fetch FM.DOWNFN of ITEM)) (SETQ heldFn (fetch FM.HELDFN of ITEM)) (SETQ movedFn (fetch FM.MOVEDFN of ITEM)) [SETQ NEW.ITEM (COPYALL (FMC-CREATE.ITEM.FROM.LIST (LIST (fetch FM.TYPE of ITEM) (if (OR (STREQUAL label "") (NULL label)) then "*NOLABEL*" else label) (FMC-FONT->LIST (fetch FM.FONT of ITEM)) (fetch FM.ID of ITEM) NIL NIL (if (OR (STREQUAL message "Will select this item when you release the button." ) (STREQUAL message "Will let you select a value from a pop up menu." ) (STREQUAL message "Will toggle this item when you release the button." )) then "" else message) (fetch FM.INITSTATE of ITEM) NIL 0 0 (if (CAR links) then (LIST (CAR links) (fetch FM.ID of (CADR links))) else '(NIL)) NIL (if (LISTGET userData 'MENUITEMS) then [SETQ menuProps (LIST (LISTGET userData 'MENUITEMS] [if (LISTGET userData 'MENUFONT) then (NCONC1 menuProps (LISTGET userData 'MENUFONT] [if (LISTGET userData 'MENUTITLE) then (if (NOT (CDR menuProps)) then (NCONC1 menuProps NIL)) (NCONC1 menuProps (LISTGET userData 'MENUTITLE] menuProps else '(NIL)) (if changeState then (if (ATOM changeState) then (LIST 'FUNCTION changeState) else changeState) else '(FUNCTION NILL)) (if (ATOM selectedFn) then (LIST 'FUNCTION selectedFn) else selectedFn) (if (ATOM downFn) then (LIST 'FUNCTION downFn) else downFn) (if (ATOM heldFn) then (LIST 'FUNCTION heldFn) else heldFn) (if (ATOM movedFn) then (LIST 'FUNCTION movedFn) else movedFn) (fetch FM.REGION of ITEM) (FMC-MAKEBITMAP (if (OR (STREQUAL label "") (NULL label)) then "*NOLABEL*" else label) (fetch FM.FONT of ITEM)) 0 0 (LISTGET userData 'INFINITEWIDTH) NIL] [if (OR (STREQUAL label "") (NULL label)) then (PUT.REGION.WIDTH (FMC-GET.ITEM NEW.ITEM REGION) (BITMAPWIDTH (FMC-GET.ITEM NEW.ITEM BITMAP))) (PUT.REGION.HEIGHT (FMC-GET.ITEM NEW.ITEM REGION) (BITMAPHEIGHT (FMC-GET.ITEM NEW.ITEM BITMAP] [if (LISTGET userData 'BOX) then (FMC-PUT.ITEM NEW.ITEM BOX (LISTGET userData 'BOX)) (FMC-PUT.ITEM NEW.ITEM BOXSHADE (LISTGET userData 'BOXSHADE)) (FMC-PUT.ITEM NEW.ITEM XBMOFFSET (LISTGET userData 'BOXOFFSET)) (FMC-PUT.ITEM NEW.ITEM YBMOFFSET (LISTGET userData 'BOXOFFSET] (WINDOWADDPROP WINDOW 'ITEMLIST NEW.ITEM) (WINDOWADDPROP WINDOW 'SELECTION.LIST NEW.ITEM) (FMC-REDRAW.ITEM NEW.ITEM WINDOW)) (INVERTW FM.WINDOW) (FMC-PROMPTPRINT "Importing items ... DONE" WINDOW) (FMC-SELECT.LIST WINDOW) (FMC-MARK.AS.CHANGED WINDOW]) (FMC-PROMPTPRINT [LAMBDA (STR WINDOW) (* ; "Edited 17-Aug-88 17:44 by A.BLAVIER") (* ;; "Print a message in the FMC prompt window.") (LET [(PromptWindow (WINDOWPROP WINDOW 'FMC.PROMPTWINDOW] (DSPRESET PromptWindow) (PRINTOUT PromptWindow T STR) (FLASHWINDOW PromptWindow 1]) ) (* * Icon stuff) (RPAQQ FMC-ICON #*(76 94)@@@@@@@@AO@@@@@@@@@@@@@@@@@@COH@@@@@@@@@@@@@@@@@GOL@@@@@@@@@@@@@@@@@OON@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@@OON@@@@@@@@@@@@@@@@@GOL@@@@@@@@@@@@@@@@@COH@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOON@@@@@@@@@@@@@OOOOOON@@@@@@@@@@@@AOOOOOOO@@@@@@@@@@@@AOOOOOOO@@@@@@@@@@@@CO@FOKHOH@@@@@@@@@@@COGNGCGGH@@@@@@@@@@@GOGNJKGOL@@@@@@@@@@@GOGNMKGOL@@@@@@@@@@@OOANOKGON@@@@@@@@@@@OOGNOKGON@@@@@@@@@@AOOGNOKGOO@@@@@@@@@@AOOGNOKGGO@@@@@@@@@@COOGNOKHOOH@@@@@@@@@COOOOOOOOOH@@@@@@AOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOL@@@AH@AOL@@@@@AOL@AL@@@C@@@OL@@@@@GON@@L@@@CCONONGOH@AOON@@L@@@CB@@GO@@H@COOL@@L@@@CBOOGOCLH@OOO@@@N@@@FDH@COHDHCOOL@@@F@@@FDOOKOILHOOOH@@@F@@@FD@@AOL@HOON@@@@F@@@FD@@AOL@HGOH@@@@G@@@LIOOLONLHGN@@@@@C@@@LI@@BONDHCH@@@@@C@@@LJ@@BGODHB@@@@@@C@@@LKOONGO@H@@@@@@@CH@AI@@@@COHH@@@@@@@AH@AI@@@@AO@H@@@@@@@AH@AIOOOOMLOH@@@@@@@AH@C@@@@@@@@@@@@@@@@AH@C@@@@@@@@@@@@@@@@@L@C@@@@@@@@@@@@@@@@@L@CCOOOOOHGOOLCOOO@@L@FB@@@@@HD@@DB@@A@@L@FB@@@@@HD@@DB@@A@@F@FD@@@@A@D@@DB@@@H@F@FD@@@@A@D@@DB@@@H@F@LGOOOOO@GOOLCOOOH@F@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@L@@@@@@@@@@@@@@@@@C@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@ ) (RPAQQ FMC-ICON.MASK #*(76 94)@@@@@@@@AO@@@@@@@@@@@@@@@@@@COH@@@@@@@@@@@@@@@@@GOL@@@@@@@@@@@@@@@@@OON@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@AOOO@@@@@@@@@@@@@@@@@OON@@@@@@@@@@@@@@@@@GOL@@@@@@@@@@@@@@@@@COH@@@@@@@@@@@@@@@@@AO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOON@@@@@@@@@@@@@OOOOOON@@@@@@@@@@@@AOOOOOOO@@@@@@@@@@@@AOOOOOOO@@@@@@@@@@@@COOOOOOOH@@@@@@@@@@@COOOOOOOH@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@OOOOOOOON@@@@@@@@@@@OOOOOOOON@@@@@@@@@@AOOOOOOOOO@@@@@@@@@@AOOOOOOOOO@@@@@@@@@@COOOOOOOOOH@@@@@@@@@COOOOOOOOOH@@@@@@AOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOL@@@AOOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOON@@@GOOOOOOOOOOOOOOON@@@GOOOOOOOOOOOOOOON@@@GOOOOOOOOOOOOOOON@@@GOOOOOOOOOOOOOOOO@@@OOOOOOOOOOOOOOOOO@@@OOOOOOOOOOOOOOOOO@@@OOOOOOOOOOOOOOOOO@@@OOOOOOOOOOOOOOOOOH@AOOOOOOOOOOOOOOOOOH@AOOOOOOOOOOOOOOOOOH@AOOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOH@COOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOL@COOOOOOOOOOOOOOOOOL@GOOOOOOOOOOOOOOOOOL@GOOOOOOOOOOOOOOOOON@GOOOOOOOOOOOOOOOOON@GOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@OOOOOOOOOOOOOOOOOOO@ ) (RPAQ? FMC-ICON.TEMPLATE (create TITLEDICON ICON _ FMC-ICON MASK _ FMC-ICON.MASK TITLEREG _ (CREATEREGION 2 2 70 28))) (* *) [OR (SASSOC 'FMCreator BackgroundMenuCommands) (NCONC1 BackgroundMenuCommands '(FMCreator '(FMC-CREATE) "Opens a Free Menu Creator window for use"] (SETQ BackgroundMenu NIL) (RPAQ MOVINGCURSOR (CURSORCREATE (QUOTE #*(16 16)@@@@@A@@@CH@@ED@@A@@@A@@BA@HD@@DOLGND@@DBA@H@A@@@A@@@ED@@CH@@A@@ ) (QUOTE NIL) 7 7)) (PUTPROPS FM-CREATOR COPYRIGHT ("Rank Xerox France. Author Andre BLAVIER" 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (4362 15980 (FMC-CREATE 4372 . 10712) (FMC-INSTALL.IP.WINDOW 10714 . 13291) ( FMC-INSTALL.GP.WINDOW 13293 . 14616) (FMC-CREATE.SHADE.MENU 14618 . 15281) (FMC-CREATE.SHADE.ITEM 15283 . 15978)) (16015 29619 (FMC-BUTTONEVENTFN 16025 . 23020) (FMC-CLOSEFN 23022 . 23823) ( FMC-COPYBUTTONEVENTFN 23825 . 24785) (FMC-COPYINSERTFN 24787 . 26407) (FMC-CURSORMOVEDFN 26409 . 27296 ) (FMC-CURSOROUTFN 27298 . 27459) (FMC-EXPANDFN 27461 . 27741) (FMC-ICONFN 27743 . 28755) ( FMC-SHRINKFN 28757 . 29061) (FMC-WINDOWENTRYFN 29063 . 29617)) (31454 35400 (FMC-FIXRIGHTMENU 31464 . 33117) (FMC-DORIGHTSELECTION 33119 . 35398)) (35433 42932 (FMC-SELECT.ITEM 35443 . 36551) ( FMC-SELECT.LIST 36553 . 36874) (FMC-SELECT.LIST.ITEM 36876 . 37932) (FMC-SELECTALL 37934 . 38328) ( FMC-GET.SELECTION 38330 . 40066) (FMC-DESELECT 40068 . 40446) (FMC-DESELECT.ITEM 40448 . 41526) ( FMC-DESELECT.LIST 41528 . 41897) (FMC-DESELECT.LIST.ITEM 41899 . 42930)) (42972 71259 (FMC-APPLY 42982 . 47323) (FMC-SHOW.ITEM 47325 . 52244) (FMC-SHOW.GROUP 52246 . 54394) (FMC-NEWITEM 54396 . 55927) ( FMC-UPDATE.ITEM 55929 . 61952) (FMC-UPDATE.GROUP 61954 . 63772) (FMC-GET.LABEL 63774 . 64522) ( FMC-CHOOSE.ITEM.BOXSHADE 64524 . 65106) (FMC-CHOOSE.ITEM.BG 65108 . 65695) (FMC-GET.MENUPROPS 65697 . 66591) (FMC-GET.INITSTATE 66593 . 68971) (FMC-EDIT.FN 68973 . 69590) (FMC-LINKS 69592 . 71257)) (81842 84551 (FMC-MAKEBITMAP 81852 . 82544) (FMC-COMPOUND.BITMAP 82546 . 84005) (FMC-SNAPBM 84007 . 84549)) (84577 95636 (FMC-MOVE.SELECTION 84587 . 88458) (FMC-MOVE.BITMAP 88460 . 92852) (FMC-TRACK.NEW.ITEM 92854 . 93904) (FMC-UPDATE.BM.POSITION 93906 . 94629) (FMC-UPDATE.REGION 94631 . 95634)) (95663 108537 (FMC-COMPUTE.SHAPE.REGS 95673 . 97851) (FMC-SHAPE 97853 . 106662) (FMC-BOX.NEWREGIONFN 106664 . 108106) (FMC-NOBOX.NEWREGIONFN 108108 . 108535)) (108566 110451 (FMC-REDRAW 108576 . 109224) ( FMC-REDRAW.ITEM 109226 . 110449)) (110494 113925 (FMC-DELETE 110504 . 111854) (FMC-UNDELETE 111856 . 113923)) (113962 117670 (FMC-GROUP 113972 . 116637) (FMC-UNGROUP 116639 . 117668)) (117710 127034 ( FMC-ALIGN 117720 . 121191) (FMC-HCENTER 121193 . 123497) (FMC-VCENTER 123499 . 125877) (FMC-REL.MOVE 125879 . 127032)) (127071 136665 (FMC-GET 127081 . 129946) (FMC-GET.ONE.OBJECT 129948 . 132185) ( FMC-PUT 132187 . 134238) (FMC-PUT.OBJECT 134240 . 136663)) (136697 141636 (FMC-EDIT.INFO 136707 . 137943) (FMC-EDIT.INFO.ITEM 137945 . 141634)) (141668 147722 (FMC-HARDCOPY 141678 . 144920) ( FMC-HARDCOPY.ITEM 144922 . 147720)) (147764 155916 (FMC-COMPUTE 147774 . 149790) (FMC-COMPUTE.OBJECT 149792 . 155914)) (155943 169254 (FMC-CREATE.ITEM.FROM.LIST 155953 . 157160) (FMC-DRAW.BOX 157162 . 158498) (FMC-CHOOSE.WINDOW.BG 158500 . 159017) (FMC-DISPLAY.GRID 159019 . 159523) (FMC-SET.GRIDSIZE 159525 . 160305) (FMC-FONT->LIST 160307 . 161008) (FMC-LIST->FONT 161010 . 161357) (FMC-SORT.ITEM.LIST 161359 . 162401) (FMC-IMPORT 162403 . 168871) (FMC-PROMPTPRINT 168873 . 169252))))) STOP \ No newline at end of file diff --git a/lispusers/FM-CREATOR.TEDIT b/lispusers/FM-CREATOR.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..118a68e08930653659d76daa4d0deb449d6696c7 GIT binary patch literal 88255 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.;7 10151 changes to%: (VARS FONTDECLSCOMS) previous date%: "25-Sep-87 22:24:36" {DSK}FONTDECLS.;6) (PRETTYCOMPRINT FONTDECLSCOMS) (RPAQQ FONTDECLSCOMS ((PROP MAKEFILE-ENVIRONMENT FONTDECLS) (RECORDS FONTDESCRIPTOR CHARSETINFO) (CONSTANTS WORDSPERCELL \MAXCHARSET \MAXTHINCHAR) (MACROS FOLDHI UNFOLD \CREATECSINFOELEMENT \CREATEFONTCHARSETVECTOR \FGETIMAGEWIDTH \FGETOFFSET \FGETWIDTH \FSETIMAGEWIDTH \FSETOFFSET \FSETWIDTH \GETCHARSETINFO \SETCHARSETINFO))) (PUTPROPS FONTDECLS MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP" :BASE 10)) (DECLARE%: EVAL@COMPILE (DATATYPE FONTDESCRIPTOR ((FONTDEVICE POINTER) (\SFObsolete1 POINTER) (* WAS CHARACTERBITMAP) (* Bitmap containing the character  images, indexed by \SFOffsets) (FONTFAMILY POINTER) (FONTSIZE POINTER) (FONTFACE POINTER) (\SFObsolete2 POINTER) (* Was \SFWidths) (* The advance-width of each character, an array indexed by charcode.  Usually the same as the imagewidth, but can differ for accents, kerns kerns.  This is what should be used for stringwidth calculations.) (\SFObsolete3 POINTER) (* WAS \SFOffsets) (* Offset of each character into the image bitmap;  X value of left edge) (\SFObsolete4 POINTER) (* Was \SFWidthsY) (\SFObsolete5 WORD) (* WAS FIRSTCHAR) (* Charcode of the first character that exists in the font) (\SFObsolete6 WORD) (* WAS LASTCHAR) (* Charcode of the last character that exists in the font) (\SFAscent WORD) (\SFDescent WORD) (\SFHeight WORD) (ROTATION WORD) (FBBOX SIGNEDWORD) (FBBOY SIGNEDWORD) (FBBDX SIGNEDWORD) (FBBDY SIGNEDWORD) (\SFFACECODE BITS 8) (\SFLKerns POINTER) (\SFRWidths POINTER) (FONTDEVICESPEC POINTER) (* Holds the spec by which the font is known to the printing device, if  coercion has been done) (OTHERDEVICEFONTPROPS POINTER) (* For individual devices to hang  special information) (FONTSCALE POINTER) (FONTAVGCHARWIDTH WORD) (* Set in FONTCREATE, used to fix up the linelength when DSPFONT is called) (FONTIMAGEWIDTHS POINTER) (* This is the image width, as opposed to the advanced width;  initial hack for accents, kerning. Fields is referenced by FONTCREATE.) (FONTCHARSETVECTOR POINTER) (* A 256-pointer block, with one pointer per "character set" --each group of  256 character codes. Each pointer is either NIL if there's no info for that  charset, or is a CHARSETINFO, containing widths, char bitmap, etc for the  characters in that charset.) (FONTEXTRAFIELD2 POINTER)) FONTCHARSETVECTOR _ (\CREATEFONTCHARSETVECTOR)) (DATATYPE CHARSETINFO (WIDTHS (* The advance-width of each character, an array indexed by charcode.  Usually the same as the imagewidth, but can differ for accents, kerns kerns.  This is what should be used for stringwidth calculations.) OFFSETS (* Offset of each character into the image bitmap;  X value of left edge) IMAGEWIDTHS (* imagewidths is not automagically allocated since it is not always needed) CHARSETBITMAP (* Bitmap containing the character  images, indexed by OFFSETS) YWIDTHS (CHARSETASCENT WORD) (* Max ascent for all characters in  this CHARSET) (CHARSETDESCENT WORD) (* Max descent for all characters in  this CHARSET) ) WIDTHS _ (\CREATECSINFOELEMENT) OFFSETS _ (\CREATECSINFOELEMENT)) ) (/DECLAREDATATYPE 'FONTDESCRIPTOR '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER WORD WORD WORD WORD WORD WORD SIGNEDWORD SIGNEDWORD SIGNEDWORD SIGNEDWORD (BITS 8) POINTER POINTER POINTER POINTER POINTER WORD POINTER POINTER POINTER) '((FONTDESCRIPTOR 0 POINTER) (FONTDESCRIPTOR 2 POINTER) (FONTDESCRIPTOR 4 POINTER) (FONTDESCRIPTOR 6 POINTER) (FONTDESCRIPTOR 8 POINTER) (FONTDESCRIPTOR 10 POINTER) (FONTDESCRIPTOR 12 POINTER) (FONTDESCRIPTOR 14 POINTER) (FONTDESCRIPTOR 16 (BITS . 15)) (FONTDESCRIPTOR 17 (BITS . 15)) (FONTDESCRIPTOR 18 (BITS . 15)) (FONTDESCRIPTOR 19 (BITS . 15)) (FONTDESCRIPTOR 20 (BITS . 15)) (FONTDESCRIPTOR 21 (BITS . 15)) (FONTDESCRIPTOR 22 (SIGNEDBITS . 15)) (FONTDESCRIPTOR 23 (SIGNEDBITS . 15)) (FONTDESCRIPTOR 24 (SIGNEDBITS . 15)) (FONTDESCRIPTOR 25 (SIGNEDBITS . 15)) (FONTDESCRIPTOR 14 (BITS . 7)) (FONTDESCRIPTOR 26 POINTER) (FONTDESCRIPTOR 28 POINTER) (FONTDESCRIPTOR 30 POINTER) (FONTDESCRIPTOR 32 POINTER) (FONTDESCRIPTOR 34 POINTER) (FONTDESCRIPTOR 36 (BITS . 15)) (FONTDESCRIPTOR 38 POINTER) (FONTDESCRIPTOR 40 POINTER) (FONTDESCRIPTOR 42 POINTER)) '44) (/DECLAREDATATYPE 'CHARSETINFO '(POINTER POINTER POINTER POINTER POINTER WORD WORD) '((CHARSETINFO 0 POINTER) (CHARSETINFO 2 POINTER) (CHARSETINFO 4 POINTER) (CHARSETINFO 6 POINTER) (CHARSETINFO 8 POINTER) (CHARSETINFO 10 (BITS . 15)) (CHARSETINFO 11 (BITS . 15))) '12) (DECLARE%: EVAL@COMPILE (RPAQQ WORDSPERCELL 2) (RPAQQ \MAXCHARSET 255) (RPAQQ \MAXTHINCHAR 255) (CONSTANTS WORDSPERCELL \MAXCHARSET \MAXTHINCHAR) ) (DECLARE%: EVAL@COMPILE [PUTPROPS FOLDHI MACRO (X (PROG [(FORM (CAR X)) (DIVISOR (CAR (CONSTANTEXPRESSIONP (CADR X] (OR (AND DIVISOR (POWEROFTWOP DIVISOR)) (\ILLEGAL.ARG (CADR X))) (RETURN (LIST 'LRSH (LIST 'IPLUS FORM (SUB1 DIVISOR)) (SUB1 (INTEGERLENGTH DIVISOR] [PUTPROPS UNFOLD MACRO (X (PROG [(FORM (CAR X)) (DIVISOR (CAR (CONSTANTEXPRESSIONP (CADR X] (OR (AND DIVISOR (POWEROFTWOP DIVISOR)) (\ILLEGAL.ARG (CADR X))) (RETURN (LIST 'LLSH FORM (SUB1 (INTEGERLENGTH DIVISOR] [PUTPROPS \CREATECSINFOELEMENT MACRO (NIL (\ALLOCBLOCK (FOLDHI (IPLUS \MAXTHINCHAR 3) WORDSPERCELL] (PUTPROPS \CREATEFONTCHARSETVECTOR MACRO (NIL (* Allocates a block for the character set records) (\ALLOCBLOCK (ADD1 \MAXCHARSET) T))) (PUTPROPS \FGETIMAGEWIDTH MACRO ((IMAGEWIDTHSBLOCK CHAR8CODE) (\GETBASE IMAGEWIDTHSBLOCK CHAR8CODE))) (PUTPROPS \FGETOFFSET DMACRO ((OFFSETSBLOCK CHAR8CODE) (\GETBASE OFFSETSBLOCK CHAR8CODE))) (PUTPROPS \FGETWIDTH DMACRO ((WIDTHSBLOCK CHAR8CODE) (\GETBASE WIDTHSBLOCK CHAR8CODE))) (PUTPROPS \FSETIMAGEWIDTH DMACRO ((WIDTHSBLOCK INDEX WIDTH) (\PUTBASE WIDTHSBLOCK INDEX WIDTH))) (PUTPROPS \FSETOFFSET DMACRO ((OFFSETSBLOCK CHAR8CODE OFFSET) (\PUTBASE OFFSETSBLOCK CHAR8CODE OFFSET))) (PUTPROPS \FSETWIDTH DMACRO ((WIDTHSBLOCK INDEX WIDTH) (\PUTBASE WIDTHSBLOCK INDEX WIDTH))) [PUTPROPS \GETCHARSETINFO MACRO ((CHARSET FONTDESC NOSLUG?) (* * fetches the charsetinfo for charset CHARSET in fontdescriptor FONTDESC. If NIL, then creates the required charset.) (* * NOSLUG? means don't create an empty (slug) csinfo if the charset is not found, just return NIL) (OR (\GETBASEPTR (ffetch FONTCHARSETVECTOR of FONTDESC) (UNFOLD CHARSET 2)) (\CREATECHARSET CHARSET FONTDESC NOSLUG?] (PUTPROPS \SETCHARSETINFO MACRO ((CHARSETVECTOR CHARSET CSINFO) (\RPLPTR CHARSETVECTOR (UNFOLD CHARSET 2) CSINFO))) ) (DECLARE%: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/FONTSAMPLER b/lispusers/FONTSAMPLER new file mode 100644 index 00000000..d23542e4 --- /dev/null +++ b/lispusers/FONTSAMPLER @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED "29-Apr-87 22:43:49" {ERIS}LYRIC>FONTSAMPLER.;4 7992 changes to%: (FNS FontSample) previous date%: "29-Apr-87 22:41:24" {ERIS}KOTO>FONTSAMPLER.;6) (* " Copyright (c) 1985, 1987 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT FONTSAMPLERCOMS) (RPAQQ FONTSAMPLERCOMS ((FNS FontSample FontSampleFaked FontTable) [VARS (*INTERESTING-CHARSETS* '(0 33 34 38 39 238 239 240 241] (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) FONT)))) (DEFINEQ (FontSample [LAMBDA (Fonts CharacterSets Printer StreamType) (* edited%: "29-Apr-87 22:03") (LET* [[TitleFont (FONTCREATE NIL 12 'MRR 0 (OR StreamType (PRINTERTYPE Printer] (FontList (if (LISTP Fonts) else (CONS Fonts))) [Stream (OPENIMAGESTREAM Printer StreamType (LIST 'FONTS (CONS TitleFont FontList] (InchesToPrinterUnits (FTIMES 72.0 (DSPSCALE NIL Stream))) (LastFont (CAR (LAST FontList))) [CharacterSets (if (LISTP CharacterSets) then CharacterSets else (LIST (OR CharacterSets 0] (LastCharacterSet (CAR (LAST CharacterSets] (DSPRIGHTMARGIN (fetch (REGION WIDTH) of (DSPCLIPPINGREGION NIL Stream)) Stream) (for Font in FontList do (for CharacterSet in CharacterSets do (FontTable Font CharacterSet Stream (OR (NEQ Font LastFont) (NEQ CharacterSet LastCharacterSet )) TitleFont InchesToPrinterUnits)) finally (CLOSEF Stream]) (FontSampleFaked [LAMBDA (FontAsList Printer StreamType) (* N.H.Briggs "27-Apr-87 18:12") (LET* [[TitleFont (FONTCREATE NIL 12 'MRR 0 (OR StreamType (PRINTERTYPE Printer] (Font) [Stream (OPENIMAGESTREAM Printer StreamType (LIST 'FONTS (LIST TitleFont] (InchesToPrinterUnits (FTIMES 72.0 (DSPSCALE NIL Stream] [SETQ Font (NCREATE 'FONTDESCRIPTOR (DEFAULTFONT (OR StreamType (PRINTERTYPE Printer] (replace FONTFAMILY of Font with (CAR FontAsList)) (replace FONTSIZE of Font with (CADR FontAsList)) (replace FONTFACE of Font with (\FONTFACE (CADDR FontAsList))) (FontTable Font '(0) Stream NIL TitleFont InchesToPrinterUnits) (CLOSEF Stream]) (FontTable [LAMBDA (Font CharacterSet Stream FormFeed TitleFont InchesToPrinterUnits) (* edited%: "29-Apr-87 22:36") (LET* ((Family (FONTPROP Font 'FAMILY)) (Face (FONTPROP Font 'FACE)) (Size (FONTPROP Font 'SIZE)) (Title (CONCAT " " Size "pt " (L-CASE Family T) " " (L-CASE Face T) " Character set "))) (printout T Title |.I0.8| CharacterSet "Q") (RESETLST (RESETSAVE (RADIX 8)) (for XPosition from (TIMES 0.65 InchesToPrinterUnits) by (TIMES 0.45 InchesToPrinterUnits ) as Counter from 0 to 15 bind (YPosition _ (TIMES 9.5 InchesToPrinterUnits)) do (MOVETO XPosition YPosition Stream) (PRIN1 Counter Stream)) (for YPosition from (TIMES 9 InchesToPrinterUnits) by (TIMES -0.5 InchesToPrinterUnits) as Counter from 0 to 240 by 16 bind (XPosition _ (TIMES 0.25 InchesToPrinterUnits )) do (MOVETO XPosition YPosition Stream) (PRIN1 Counter Stream))) (DRAWLINE (TIMES 0.25 InchesToPrinterUnits) (TIMES 9.25 InchesToPrinterUnits) (TIMES 8.0 InchesToPrinterUnits) (TIMES 9.25 InchesToPrinterUnits) (DSPSCALE NIL Stream) 'PAINT Stream) (DRAWLINE (TIMES 0.6 InchesToPrinterUnits) (TIMES 9.7 InchesToPrinterUnits) (TIMES 0.6 InchesToPrinterUnits) (TIMES 1.25 InchesToPrinterUnits) (DSPSCALE NIL Stream) 'PAINT Stream) (DSPFONT Font Stream) (for YPosition from (TIMES 9 InchesToPrinterUnits) by (TIMES -0.5 InchesToPrinterUnits) as YCounter from 0 to 15 bind (CharacterCode _ 0) do (for XPosition from (TIMES 0.75 InchesToPrinterUnits) by (TIMES 0.45 InchesToPrinterUnits) as XCounter from 0 to 15 do (MOVETO XPosition YPosition Stream) (if (AND (NEQ CharacterCode (CHARCODE FF)) (if (MEMB (IMAGESTREAMTYPE Stream) '(DISPLAY INTERPRESS)) then (OR (AND (IGREATERP CharacterCode 31) (ILESSP CharacterCode 127)) (AND (IGREATERP CharacterCode 160) (ILESSP CharacterCode 255))) else T)) then (PRINTCCODE (IPLUS (ITIMES CharacterSet 256) CharacterCode) Stream)) (SETQ CharacterCode (ADD1 CharacterCode))) (printout T ".")) (MOVETO (FTIMES 0.75 InchesToPrinterUnits) (FTIMES 0.75 InchesToPrinterUnits) Stream) (DSPFONT TitleFont Stream) (printout Stream Title |.I0.8| CharacterSet) (DSPYPOSITION (PLUS (DSPYPOSITION NIL Stream) (TIMES -0.4 (FONTHEIGHT TitleFont))) Stream) (printout Stream "8") [if (EQ (FILENAMEFIELD (FULLNAME Stream) 'HOST) 'LPT) then (MOVETO (FTIMES 0.75 InchesToPrinterUnits) (FTIMES 0.5 InchesToPrinterUnits) Stream) (printout Stream " on " (L-CASE (OR (FILENAMEFIELD (FULLNAME Stream) 'DEVICE) (FILENAMEFIELD (FULLNAME Stream) 'NAME)) T) ", " (GDATE NIL (DATEFORMAT NO.TIME SPACES] (if FormFeed then (DSPNEWPAGE Stream)) (printout T " done." T]) ) (RPAQQ *INTERESTING-CHARSETS* (0 33 34 38 39 238 239 240 241)) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD (LOADCOMP) FONT) ) (PUTPROPS FONTSAMPLER COPYRIGHT ("Xerox Corporation" 1985 1987)) (DECLARE%: DONTCOPY (FILEMAP (NIL (689 7765 (FontSample 699 . 2154) (FontSampleFaked 2156 . 2965) (FontTable 2967 . 7763)) ))) STOP \ No newline at end of file diff --git a/lispusers/FONTSAMPLER.TEDIT b/lispusers/FONTSAMPLER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..367db6690f38ce65e959cf6d0e84005306168557 GIT binary patch literal 4921 zcmeHJ&2HP+6~1d9xAB!i*-#csW;b zPLa%VQj;)O6G~!gFVZlggX3M=KRr2aSWe)%-C-xNTnCDZYF=p}$FJp7(IQRWgcFsK zq^o5-&O_L_o`vHXU58ObN@ihnLsJ#2ROX5@IbTG0&6LVBO0MW8S*CO)-{6HX=qibs z9^a)SvN%_1tMTrg5Ir#zj_8O$Si;507matq=t0#l%oCq8>da&+$58Xx*`P2%ex52h z4{jE!x&4=38S`Ho9Z++fM?FRalv0k|IWR(=<1`$hTBDo0)J2}8M%FA{BLmh7=Uk&q zdt4PkYcFJ$h4FM1m5e8~$S6<99hi>QZ=aif;F;}yi%QdTc|#*bDuja+WoI)eX)Qnw zg$(wes%#nMTxUsRiGIK?cd-MDf!QR;Ns2% zjQ1bd1^{NN&>lr^RCW)N!Q7 za+zTnuiljs+MCm zOO_F~4H7Awskgcrw`fY`H8|^&oPYs@&#E#*n{SVv>rLm9-i{vf^XO)$R>#j;HG-?gXCV{XNVA zpf>>rCH)BS)zBBlsB&H)unxhZ13O0PzmA2QmUH2=W zjIW37E_F;EXS3U+&PCfRIsTAcbUbSiz>wv=s;(3q9(!`lKhsBd0jxD};-y3;zjRuir*_3J$8Ve|$*Kj_Baz z1g~ZxWL%i-E=pL`sQeMUV$Vaz0fR}rI5 z3iC~9-q$~tZGw3(re#aVq5$|d{*pn@npsOTs*wl7Tkr5RYAw)pW%_|`y4 z+Y~jU_sMZ_@vO;lX^Q7Pd+5T?#g^@!yW*FXkbZCK=0E21Ha@!h3FORMACRO.\;10 20832 IL:|changes| IL:|to:| (IL:FUNCTIONS SDC-FOR XCL-USER::SELECTC ISOPRP FROMTOTEST) (IL:VARS IL:FORMACROCOMS) (IL:PROPS (AS FORWORD) (THEREIS FORWORD) (BY FORWORD) (FROM FORWORD) (IN FORWORD) (ON FORWORD) (TO FORWORD) (JOIN FORWORD)) IL:|previous| IL:|date:| "21-Sep-87 17:07:45" IL:{DSK}FORMACRO.\;9) ; Copyright (c) 1987 by System Development Corp.. All rights reserved. (IL:PRETTYCOMPRINT IL:FORMACROCOMS) (IL:RPAQQ IL:FORMACROCOMS ((IL:P (EXPORT 'FOR)) (IL:FUNCTIONS EVLIST FOR FROMTOTEST ISOPRP SDC-FOR XCL-USER::SELECTC TESTFOR) (IL:PROP FORWORD ALWAYS AS BIND BY COLLECT COUNT DO EACHTIME FINALLY FIRST FROM IN INSIDE JOIN LARGEST MAX MIN NEVER ON REPEATWHILE REPEATUNTIL SMALLEST SUM TO THEREIS UNION UNLESS UNTIL WHEN WHILE) (IL:PROP IL:MAKEFILE-ENVIRONMENT IL:FORMACRO) (IL:EDITHIST IL:FORMACRO))) (EXPORT 'FOR) (DEFUN EVLIST (L) (NREVERSE (MAPCAR #'EVAL L))) (DEFMACRO FOR (&BODY X) (SDC-FOR X)) (DEFUN FROMTOTEST (IV FROM TO BY BYVAR TOVAR) (LET ((BYVAL (SYMBOL-VALUE BY))) (IF (CONSTANTP BYVAL) (IF (AND (NUMBERP FROM) (NUMBERP TO) (< TO FROM) (= BYVAL 1)) (PROGN (IL:* IL:\;  "BY was probably a default +1 so silently force to -1 before the incrementer gets expanded") (SET BY -1) `(IF (< ,IV ,TO) (GO $$OUT))) `(IF (,(IF (MINUSP BYVAL) '< '>) ,IV ,(IF (CONSTANTP TO) TO TOVAR)) (GO $$OUT))) `(IF (AND ,BYVAR (OR (= 0 ,BYVAR) (IF (MINUSP ,BYVAR) (< ,IV ,(IF (CONSTANTP TO) TO TOVAR)) (> ,IV ,(IF (CONSTANTP TO) TO TOVAR))))) (GO $$OUT))))) (DEFUN ISOPRP (X) (IF (SYMBOLP X) (GET (INTERN (STRING-UPCASE X) "USER") 'FORWORD))) (DEFUN SDC-FOR (X) (DECLARE (SPECIAL X)) (PROG (VARLIST IV IV1 IOV INITS EACHS PRETESTS BODYS POSTTESTS UPDATES FINALS OP (INCCNT 0) $$INC0 $$INC1 $$INC2 $$INC3 $$INC4 $$INC5 $$INC6 $$INCVAR0 $$INCVAR1 $$INCVAR2 $$INCVAR3 $$INCVAR4 $$INCVAR5 $$INCVAR6 $$INIT0 $$INIT1 $$INIT2 $$INIT3 $$INIT4 $$INIT5 $$INIT6 $$END0 $$END1 $$END2 $$END3 $$END4 $$END5 $$END6) (DECLARE (SPECIAL VARLIST IV IV1 IOV INITS EACHS PRETESTS BODYS POSTTESTS UPDATES FINALS INCCNT $$INC0 $$INC1 $$INC2 $$INC3 $$INC4 $$INC5 $$INC6 $$INCVAR0 $$INCVAR1 $$INCVAR2 $$INCVAR3 $$INCVAR4 $$INCVAR5 $$INCVAR6 $$INIT0 $$INIT1 $$INIT2 $$INIT3 $$INIT4 $$INIT5 $$INIT6 $$END0 $$END1 $$END2 $$END3 $$END4 $$END5 $$END6)) (PUSH '$$VAL VARLIST) (COND ((CONSP (CAR X)) (COND ((CONSP (CAAR X)) (IL:* IL:\;  "(FOR ((VAR \"...\") \"...\") \"...\")") (SETQ IOV (SETQ IV1 (SETQ IV (CAAAR X))))) (T (IL:* IL:\;  "(FOR (VAR \"...\") \"...\")") (SETQ IV1 (SETQ IV (CAAR X))))) (SETQ VARLIST (NCONC (REVERSE (CAR X)) VARLIST)) (SETQ X (CDR X))) ((AND (SYMBOLP (CAR X)) (NOT (ISOPRP (CAR X)))) (IL:* IL:\; "(FOR VAR \"...\")") (SETQ IOV (SETQ IV1 (SETQ IV (CAR X)))) (PUSH (LIST (CAR X) 1) VARLIST) (SETQ X (CDR X))) (T (IL:* IL:\; "E.G. (FOR DO \"...\")") (SETQ IOV (SETQ IV1 (SETQ IV '$$ITER))) (PUSH '($$ITER 1) VARLIST))) TOP (IF (NULL X) (RETURN `(PROG ,(NREVERSE VARLIST) ,@(EVLIST INITS) $$LP ,@(EVLIST EACHS) ,@(EVLIST PRETESTS) ,@(EVLIST BODYS) $$ITERATE ,@(EVLIST POSTTESTS) ,@(EVLIST UPDATES) (GO $$LP) $$OUT ,@(EVLIST FINALS) (RETURN $$VAL)))) (COND ((SETQ OP (ISOPRP (CAR X))) (EVAL OP) (COND ((AND (CDDR X) (NOT (ISOPRP (CADDR X))) (NOT (EQL 'DO (INTERN (STRING-UPCASE (CAR X)) "USER")))) (PRINT (LIST "Warning, no implicit PROGN in Unisys FOR macro:" X) T))) (SETQ X (CDDR X))) (T (PUSH (LIST 'QUOTE (CAR X)) BODYS) (SETQ X (CDR X)))) (GO TOP))) (DEFMACRO XCL-USER::SELECTC (XCL-USER::SELECTOR &REST XCL-USER::CASES) `(CASE ,XCL-USER::SELECTOR ,@(FOR CASE XCL-USER::ON XCL-USER::CASES XCL-USER::WHILE (CDR CASE) XCL-USER::COLLECT (CONS (EVAL (CAAR CASE)) (CDAR CASE))) (OTHERWISE ,(CAR (LAST XCL-USER::CASES))))) (DEFMACRO TESTFOR (L . BODY) (PROG (X) (SETQ X (SDC-FOR (CONS L BODY))) (TERPRI) (WRITE X :PRETTY T) (TERPRI) (RETURN X))) (IL:PUTPROPS ALWAYS FORWORD (PROGN (PUSH ''(SETQ $$VAL T) INITS) (PUSH (LIST 'QUOTE `(COND ((NULL ,(CADR X)) (SETQ $$VAL NIL) (GO $$OUT)))) BODYS))) (IL:PUTPROPS AS FORWORD (PROGN (INCF INCCNT) (SETQ IOV (SETQ IV (CADR X))) (OR IV1 (SETQ IV1 IV)) (PUSH (LIST IV 1) VARLIST))) (IL:PUTPROPS BIND FORWORD (IF (CONSP (CADR X)) (SETQ VARLIST (APPEND (REVERSE (CADR X)) VARLIST)) (PUSH (CADR X) VARLIST))) (IL:PUTPROPS BY FORWORD (LET ((INCAMT (INTERN (CONCATENATE 'STRING "$$INC" (PRINC-TO-STRING INCCNT)) "USER"))) (COND ((NUMBERP (CADR X)) (SET INCAMT (CADR X))) (T (SET INCAMT (SUBST IOV IV (CADR X))) (LET ((BYVAR (GENSYM))) (PUSH BYVAR VARLIST) (SET (INTERN (CONCATENATE 'STRING "$$INCVAR" ( PRINC-TO-STRING INCCNT)) "USER") BYVAR)))))) (IL:PUTPROPS COLLECT FORWORD (PROGN (PUSH (LIST 'QUOTE `(SETQ $$VAL (CONS ,(CADR X) $$VAL))) BODYS) (PUSH ''(SETQ $$VAL (NREVERSE $$VAL)) FINALS))) (IL:PUTPROPS COUNT FORWORD (PROGN (PUSH ''(SETQ $$VAL 0) INITS) (PUSH (LIST 'QUOTE `(IF ,(CADR X) (SETQ $$VAL (1+ $$VAL)))) BODYS))) (IL:PUTPROPS DO FORWORD (IF (NULL (ISOPRP (CADR X))) (PUSH (LIST 'QUOTE (CADR X)) BODYS) (SETQ X (CONS 'X X)))) (IL:PUTPROPS EACHTIME FORWORD (PUSH (LIST 'QUOTE (CADR X)) EACHS)) (IL:PUTPROPS FINALLY FORWORD (PUSH (LIST 'QUOTE (CADR X)) FINALS)) (IL:PUTPROPS FIRST FORWORD (PUSH (LIST 'QUOTE (CADR X)) INITS)) (IL:PUTPROPS FROM FORWORD (LET ((INCREM (INTERN (CONCATENATE 'STRING "$$INC" (PRINC-TO-STRING INCCNT)) "USER"))) (IF (EQL IV (CADR (CADAR INITS))) (RPLACA (CDDR (CADAR INITS)) (CADR X)) (PUSH `'(SETQ ,IV ,(CADR X)) INITS)) (SET (INTERN (CONCATENATE 'STRING "$$INIT" (PRINC-TO-STRING INCCNT)) "USER") (CADR X)) (OR (SYMBOL-VALUE INCREM) (SET INCREM 1)) (OR (EQL IV (CADR (CADDAR UPDATES))) (PUSH `(LIST 'INCF ',IV (IF (CONSTANTP ,INCREM) ,INCREM (LIST 'SETQ ,(INTERN (CONCATENATE 'STRING "$$INCVAR" ( PRINC-TO-STRING INCCNT)) "USER") ,INCREM))) UPDATES)))) (IL:PUTPROPS IN FORWORD (PROG (INCEXPR) (SETQ IOV (GENSYM)) (SETQ INCEXPR (INTERN (CONCATENATE 'STRING "$$INC" (PRINC-TO-STRING INCCNT)) "USER")) (SET INCEXPR (LIST 'CDR IOV)) (PUSH (LIST IOV (CADR X)) VARLIST) (PUSH (LIST 'QUOTE `(IF (NOT ,IOV) (GO $$OUT) (SETQ ,IV (CAR ,IOV)))) EACHS) (PUSH `(LIST 'SETQ ,(LIST 'QUOTE IOV) ,INCEXPR) UPDATES))) (IL:PUTPROPS INSIDE FORWORD (PROGN (SETQ IOV (GENSYM)) (PUSH (LIST IOV (CADR X)) VARLIST) (PUSH (LIST 'QUOTE `(COND ((NULL ,IOV) (GO $$OUT)) ((NOT (CONSP ,IOV)) (SETQ ,IV ,IOV) (SETQ ,IOV NIL)) (T (SETQ ,IV (CAR ,IOV)) (SETQ ,IOV (CDR ,IOV))))) EACHS))) (IL:PUTPROPS JOIN FORWORD (PROGN (PUSH (LIST 'QUOTE `(SETQ $$VAL (NCONC (NREVERSE ,(CADR X)) $$VAL))) BODYS) (PUSH ''(SETQ $$VAL (NREVERSE $$VAL)) FINALS))) (IL:PUTPROPS LARGEST FORWORD (PROGN (PUSH '$$EXTREME VARLIST) (PUSH (LIST 'QUOTE `(COND ((OR (NULL $$EXTREME) (> ,(CADR X) $$EXTREME)) (SETQ $$EXTREME ,(CADR X)) (SETQ $$VAL ,IV)))) BODYS))) (IL:PUTPROPS MAX FORWORD (PUSH (LIST 'QUOTE `(IF (NULL $$VAL) (SETQ $$VAL ,(CADR X)) (SETQ $$VAL (MAX $$VAL ,(CADR X))))) BODYS)) (IL:PUTPROPS MIN FORWORD (PUSH (LIST 'QUOTE `(IF (NULL $$VAL) (SETQ $$VAL ,(CADR X)) (SETQ $$VAL (MIN $$VAL ,(CADR X))))) BODYS)) (IL:PUTPROPS NEVER FORWORD (PROGN (PUSH ''(SETQ $$VAL T) INITS) (PUSH (LIST 'QUOTE `(COND (,(CADR X) (SETQ $$VAL NIL) (GO $$OUT)))) BODYS))) (IL:PUTPROPS ON FORWORD (PROG (INCEXPR) (SETQ INCEXPR (INTERN (CONCATENATE 'STRING "$$INC" (PRINC-TO-STRING (INCF INCCNT))) "USER")) (SET INCEXPR (LIST 'CDR IOV)) (COND ((EQL IV (CAAR VARLIST)) (RPLACA (CDAR VARLIST) (CADR X))) (T (PUSH (LIST 'QUOTE `(SETQ ,IV ,(CADR X))) INITS))) (PUSH `(LIST 'SETQ ,(LIST 'QUOTE IV) ,INCEXPR) UPDATES) (PUSH (LIST 'QUOTE `(IF (NOT ,IV) (GO $$OUT))) PRETESTS))) (IL:PUTPROPS REPEATWHILE FORWORD (PUSH (LIST 'QUOTE `(IF (NOT ,(CADR X)) (GO $$OUT))) POSTTESTS)) (IL:PUTPROPS REPEATUNTIL FORWORD (IF (NUMBERP (CADR X)) (PUSH (LIST 'QUOTE `(IF (> ,IV ,(CADR X)) (GO $$OUT))) POSTTESTS) (PUSH (LIST 'QUOTE `(IF ,(CADR X) (GO $$OUT))) POSTTESTS))) (IL:PUTPROPS SMALLEST FORWORD (PROGN (PUSH '$$EXTREME VARLIST) (PUSH (LIST 'QUOTE `(COND ((OR (NULL $$EXTREME) (< ,(CADR X) $$EXTREME)) (SETQ $$EXTREME ,(CADR X)) (SETQ $$VAL ,IV)))) BODYS))) (IL:PUTPROPS SUM FORWORD (PROGN (PUSH ''(SETQ $$VAL 0) INITS) (PUSH (LIST 'QUOTE `(SETQ $$VAL (+ ,(CADR X) $$VAL))) BODYS))) (IL:PUTPROPS TO FORWORD (LET (LIMIT (INITAMT (INTERN (CONCATENATE 'STRING "$$INIT" (PRINC-TO-STRING INCCNT)) "USER")) (INCREM (INTERN (CONCATENATE 'STRING "$$INC" (PRINC-TO-STRING INCCNT)) "USER")) (BYVAR (INTERN (CONCATENATE 'STRING "$$INCVAR" (PRINC-TO-STRING INCCNT)) "USER")) (END (INTERN (CONCATENATE 'STRING "$$END" (PRINC-TO-STRING INCCNT )) "USER"))) (OR (EQL IV (CADR (CADAR INITS))) (PUSH `'(SETQ ,IV 1) INITS)) (OR (SYMBOL-VALUE INCREM) (SET INCREM 1)) (OR (CONSTANTP (CADR X)) (PUSH (LIST (SETQ LIMIT (GENSYM)) (CADR X)) VARLIST)) (OR (SYMBOL-VALUE INITAMT) (SET INITAMT 1)) (OR (EQL IV (CADR (CADDAR UPDATES))) (PUSH `(LIST 'INCF ',IV (IF (CONSTANTP ,INCREM) ,INCREM (LIST 'SETQ ,BYVAR ,INCREM))) UPDATES)) (SET END (CADR X)) (PUSH (LIST 'FROMTOTEST `',IV INITAMT END `',INCREM BYVAR `',LIMIT) PRETESTS))) (IL:PUTPROPS THEREIS FORWORD (PROGN (PUSH (LIST 'QUOTE `(COND (,(CADR X) (SETQ $$VAL (OR ,IV1 T)) (GO $$OUT)))) BODYS))) (IL:PUTPROPS UNION FORWORD (PUSH (LIST 'QUOTE `(SETQ $$VAL (UNION ,(CADR X) $$VAL))) BODYS)) (IL:PUTPROPS UNLESS FORWORD (PUSH (LIST 'QUOTE `(IF ,(CADR X) (GO $$ITERATE))) PRETESTS)) (IL:PUTPROPS UNTIL FORWORD (IF (NUMBERP (CADR X)) (PUSH (LIST 'QUOTE `(IF (> ,IV ,(CADR X)) (GO $$OUT))) PRETESTS) (PUSH (LIST 'QUOTE `(IF ,(CADR X) (GO $$OUT))) PRETESTS))) (IL:PUTPROPS WHEN FORWORD (PUSH (LIST 'QUOTE `(IF (NOT ,(CADR X)) (GO $$ITERATE))) PRETESTS)) (IL:PUTPROPS WHILE FORWORD (PUSH (LIST 'QUOTE `(IF (NOT ,(CADR X)) (GO $$OUT))) PRETESTS)) (IL:PUTPROPS IL:FORMACRO IL:MAKEFILE-ENVIRONMENT (:PACKAGE "USER" :READTABLE "XCL")) (IL:DECLARE\: IL:DONTCOPY (IL:ADDTOVAR IL:EDITHISTALIST ) ) (IL:PUTPROPS IL:FORMACRO IL:COPYRIGHT ("System Development Corp." 1987)) (IL:DECLARE\: IL:DONTCOPY (IL:FILEMAP (NIL))) IL:STOP \ No newline at end of file diff --git a/lispusers/FTPSERVER-MULTI-CONNECTIONS.TEDIT b/lispusers/FTPSERVER-MULTI-CONNECTIONS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b7c3dfd883d674f78b8ec14baef77b3da513ea10 GIT binary patch literal 5304 zcmeHL&2HP+6{elckDF@IVy5k)1rBCrK@A+ib{xkE+M={{Z4seJ4N2L_bh@CWE1NJy zsw8DceS~?T0^JvwWuKsZgznm9`kl)kQI2PlZl)+OLL^_Fdw#z2opaA6BI7?_|24_B zj{Tu0+*9E`9E>dAeAsntTXcQXvAxz_tF_;1?Y3ICm8hwOeP|smpAij$Jg2^#PSYeN z{YZ2>eQ|v3I`;2G*D^XIuiFv5QM={JKQ6*lX3wbhyuDfu4Zqu`Af8ZfI2uAj30kJ@ zyH0PUu(kZlFr#@ez6vfR>A^T(1W~l4fX2ye9)&X*=RvxJMwn7EC7Onj%-SShBvbNc>PNxR->&GFgD^EC=XZ<#ruJ3&~zh>)Gc(+_A-p2phs^m;;&5$CVvSpUb89RS_Kj`N&N^aVn)~Vr|#*rnw*1Ke| z_4|`3IS(Q_4bm_;kK`YU=D#i<3vyIZ!O!=W4k}}!U_~*|CjmtviUcNbX6Z7)I$q4q z(PhxoJ;iZ2=0mz&cGk**iB*nN1L$4D<>BG^@MQFQuJAnibupw~zt;Zw*=vn!TP|&5 zAb#6!(=N1wy>Y8oJlA?oe z_#6}mB~O=Oe8Ck+<`4!k_ex_R(2+N!EXPTjDF&ut3XaB?a(q>^p_F{;I9!QckqBy& zxCZhr4YRFACtPKT3Y4jd7tl;*8Ba?f!-E^X=xTkDaYkIvd^wl&)zH8D ztdag3+TA;Bvjf)7lJOM|>sMHNPWQR^cC&*=?Q)z{NtY*+#vm$3NrK877g&v})r?h% zVos)LMCf4%PlB|W5Vxd^WlHlj86*87Lr_{EESO4VzDO~z74rr1qH`;zit2M4`{1o| z1ur#)Xa_Wbnxhv91vkNxRA;cu23(koqa>3PHQq5&`M5;j7}o-bMurk&xzkqjwQ9OW zRyJmV6UHUICCGx8^*FdZO7G1g@T|nCUF$JGvK^m!dAHU=5vD;HsgA`3K2LB<--M`3 zOuIX%A+p8w$`ZwAEN|A~ZnHS1Td??|L7o%9JL7HUEtVHa9-;>(O$y7S0ew|>Y?e3P z`gte4h7iW%051c4(~@3~?=}h);#zlBq;BD42?b3non$LwZ zD$GYVH0nL^VrbYN-nhsWCnF2jj%PVTQ9qpt^Q7<7K=jPffPo3Oiaf%7q}XBhJpU!& zV$}w1?f@@wZ}J9WcAxCiqXXJIJj9=Np|AIa(F2+25zf zdrezkyzrHwDj`&!9?<^d13K8*Dcs{;ytBrv-zh5%l^^PNSN&8ye<&Ib;s4R0``;C< z-Bz>pJ#9;S$g7QSv=8{t=6xk!|Jm^C=SRG%l-}~B+w2!q9@Shc)XLhxp77Cl%TZO- z$y?mGtiXaz>^%uT(zf1w&H1`~&@hIOTFpQtPPRVXIH^t>JRG+i>swtJ2_6q9XMw33rz2 a`B5b)s-O6sIJPGz(8Z_W7AU;YDz`Tp?$ literal 0 HcmV?d00001 diff --git a/lispusers/FTPSERVERPATCH b/lispusers/FTPSERVERPATCH new file mode 100644 index 00000000..9abf9875 --- /dev/null +++ b/lispusers/FTPSERVERPATCH @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (FILECREATED " 9-Sep-88 19:06:08" {DSK}MEDLEY-SOURCES>FTPSERVERPATCH.;4 18581 changes to%: (FNS \SFTP.OPENFILE.FROM.PLIST) (MACROS .IFDESIRED.) previous date%: " 7-Sep-88 16:59:13" {DSK}MEDLEY-SOURCES>FTPSERVERPATCH.;2) (* " Copyright (c) 1987, 1988 by Matt Heffron & XEROX Corporation. All rights reserved. ") (PRETTYCOMPRINT FTPSERVERPATCHCOMS) (RPAQQ FTPSERVERPATCHCOMS ((DECLARE%: DOCOPY FIRST (FILES FTPSERVER)) (FNS FTPSERVER NEGOTIATED-FTPSERVER \FTPSERVER.TOP \NEGOTIATED-FTPSERVER.TOP \SFTP.COMMANDLOOP \SFTP.OPENFILE.FROM.PLIST \SFTP.PLIST.FROM.FILE \SFTP.WHENCLOSED) (CONSTANTS (\PUPSOCKET.NEGOTIATED.CONNECTION 63)) (DECLARE%: DONTCOPY (MACROS .IFDESIRED.) (FILES (LOADCOMP) DPUPFTP BSP)) (PROP (FILETYPE MAKEFILE-ENVIRONMENT) FTPSERVERPATCH))) (DECLARE%: DOCOPY FIRST (FILESLOAD FTPSERVER) ) (DEFINEQ (FTPSERVER [LAMBDA (FTPDEBUG) (* ; "Edited 24-Jul-87 12:36 by Matt Heffron") (* ;; "Start the process that listens for the requests for Negotiated sockets") (ADD.PROCESS (LIST (FUNCTION \FTPSERVER.TOP) (KWOTE FTPDEBUG)) 'NAME 'FTPSERVER 'RESTARTABLE 'HARDRESET) (* ;; "Then start a FTP server on the STANDARD socket.") (NEGOTIATED-FTPSERVER \PUPSOCKET.FTP]) (NEGOTIATED-FTPSERVER [LAMBDA (SOCKET#) (* ; "Edited 22-Jul-87 11:56 by Matt Heffron") (if (NOT (FIXP SOCKET#)) then (SETQ SOCKET# \PUPSOCKET.FTP)) (ADD.PROCESS (LIST (FUNCTION \NEGOTIATED-FTPSERVER.TOP) SOCKET#) 'NAME 'NEGOTIATED-FTPSERVER 'RESTARTABLE 'HARDRESET]) (\FTPSERVER.TOP [LAMBDA (FTPDEBUG) (DECLARE (SPECVARS FTPDEBUGLOG)) (* ; "Edited 22-Jul-87 11:55 by Matt Heffron") (LET (SOCKET PUP NEWFTPSOCKET) (COND (FTPDEBUG [COND ((OR (EQ FTPDEBUG T) (LISTP FTPDEBUG)) (SETQ FTPDEBUGLOG (GETSTREAM (CREATEW (LISTP FTPDEBUG) "FTP Server traffic") 'OUTPUT)) (WINDOWPROP FTPDEBUGLOG 'PAGEFULLFN (FUNCTION NILL)) (DSPSCROLL 'ON FTPDEBUGLOG) (DSPFONT '(GACHA 8) FTPDEBUGLOG)) (T (SETQ FTPDEBUGLOG (GETSTREAM FTPDEBUG 'OUTPUT] (printout FTPDEBUGLOG "FTP Server started at " (DATE) T T) (RESETSAVE FTPDEBUGFLG T))) (SETQ SOCKET (OPENPUPSOCKET \PUPSOCKET.NEGOTIATED.CONNECTION 'ACCEPT)) (do (SETQ PUP (GETPUP SOCKET T)) (SWAPPUPPORTS PUP) (SETQ NEWFTPSOCKET (PUPSOCKETNUMBER (OPENPUPSOCKET))) (NEGOTIATED-FTPSERVER NEWFTPSOCKET) (replace PUPSOURCESOCKET of PUP with NEWFTPSOCKET) (SENDPUP SOCKET PUP]) (\NEGOTIATED-FTPSERVER.TOP [LAMBDA (SOCKET#) (DECLARE (SPECVARS FTPDEBUGLOG)) (* ; "Edited 22-Jul-87 13:19 by Matt Heffron") (LET (SOCKET INSTREAM EVENT SAVER) (if FTPDEBUGLOG then (printout FTPDEBUGLOG "Negotiated FTP Server started at " (DATE) " on Socket #" (OCTALSTRING SOCKET#) T T)) (RESETSAVE NIL (SETQ SAVER (LIST [FUNCTION (LAMBDA (SOC) (AND SOC (CLOSERTPSOCKET SOC 0] NIL))) (do (SETQ SOCKET (OPENRTPSOCKET NIL '(SERVER RETURN) (OPENPUPSOCKET SOCKET# T) NIL)) (RPLACA (CDR SAVER) SOCKET) (SETQ EVENT (fetch RTPEVENT of SOCKET)) (until (EQ (fetch RTPSTATE of SOCKET) \STATE.OPEN) do (AWAIT.EVENT EVENT)) [COND ((SETQ INSTREAM (CREATEBSPSTREAM SOCKET NIL (FUNCTION \SFTP.ERRORHANDLER) (IMIN \FTP.IDLE.TIMEOUT MAX.SMALLP) (FUNCTION \SFTP.TIMEOUTFN) (FUNCTION \SFTP.WHENCLOSED))) (if FTPDEBUGLOG then (PUTSTREAMPROP INSTREAM 'FTP.DEBUG.PREFIX (CONCAT "[" (OCTALSTRING SOCKET#) "] "))) (if (NEQ SOCKET# \PUPSOCKET.FTP) then (PUTSTREAMPROP INSTREAM 'FTP.SERVER.PROCESS (THIS.PROCESS))) (NLSETQ (RESETLST [RESETSAVE NIL (if (EQ SOCKET# \PUPSOCKET.FTP) then `(CLOSEBSPSTREAM ,INSTREAM 0) else `(PROGN (CLOSEBSPSTREAM ,INSTREAM 0) (DEL.PROCESS ,(THIS.PROCESS] (* ;; "(RPLACA (CDR SAVER) NIL)") (if FTPDEBUGLOG then (printout FTPDEBUGLOG T "[" (OCTALSTRING SOCKET#) "] Connection open with " (PORTSTRING (fetch FRNPORT of SOCKET) (\MAKENUMBER (fetch FRNSOCKETHI of SOCKET) (fetch FRNSOCKETLO of SOCKET))) T)) (\SFTP.COMMANDLOOP INSTREAM (BSPOUTPUTSTREAM INSTREAM] repeatwhile (EQ SOCKET# \PUPSOCKET.FTP]) (\SFTP.COMMANDLOOP [LAMBDA (INS OUTS) (DECLARE (SPECVARS FTPDEBUGLOG)) (* ; "Edited 7-Sep-88 16:50 by Matt Heffron") (LET ((*UPPER-CASE-FILE-NAMES* NIL) MARK) (DECLARE (SPECVARS *UPPER-CASE-FILE-NAMES*)) (* ;  "We certainly don't need anything to be upper-case symbols.") (repeatwhile (SELECTC (SETQ MARK (FTPGETMARK INS)) ((MARK# VERSION) (\SFTP.VERSION INS OUTS)) ((MARK# RETRIEVE) (\SFTP.RETRIEVE INS OUTS)) ((MARK# NEW-STORE) (\SFTP.STORE INS OUTS)) ((MARK# STORE) (\SFTP.STORE INS OUTS T)) ((MARK# NEW-ENUMERATE) (\SFTP.ENUMERATE INS OUTS T)) ((MARK# ENUMERATE) (\SFTP.ENUMERATE INS OUTS)) ((MARK# DELETE) (\SFTP.DELETE INS OUTS)) ((MARK# EOC) T) ((MARK# COMMENT) (OR (\FTP.FLUSH.TO.EOC INS FTPDEBUGLOG) (\SFTP.PROTOCOL.ERROR INS OUTS))) ((LIST (MARK# YES) (MARK# NO) (MARK# HERE-IS-PLIST) (MARK# HERE-IS-FILE)) (\SFTP.PROTOCOL.ERROR INS OUTS)) (0 (* ; "timed out") NIL) (PROGN (FTPPUTMARK OUTS (MARK# NO)) (FTPPUTCODE OUTS \NO.UNIMPLEMENTED) (PRIN3 "Unimplemented command " OUTS) (PRIN3 (MKSTRING MARK) OUTS) (.EOC. OUTS) T]) (\SFTP.OPENFILE.FROM.PLIST [LAMBDA (PLIST ACCESS OUTS DESIREDPROPS RECOG) (* ; "Edited 9-Sep-88 19:04 by Matt Heffron") (* ;  "Opens file from user's PLIST, or answers NO and returns NIL") (LET (FILENAME PIECES MYPLIST VALUE HIGHESTVERSIONP) (for PAIR in PLIST do (SETQ VALUE (CADR PAIR)) (SELECTQ (CAR PAIR) (SERVER-FILENAME (SETQ PIECES (UNPACKFILENAME.STRING VALUE))) ((DEVICE DIRECTORY VERSION) (push PIECES (CAR PAIR) VALUE)) (NAME-BODY (push PIECES 'BODY VALUE)) (TYPE [push MYPLIST (LIST 'TYPE (MKATOM (U-CASE VALUE]) ((CREATION-DATE CREATIONDATE) (push MYPLIST (LIST 'CREATIONDATE VALUE))) ((END-OF-LINE-CONVENTION EOLCONVENTION EOC) [push MYPLIST (LIST 'EOLCONVENTION (MKATOM (U-CASE VALUE]) (SIZE (push MYPLIST (LIST 'LENGTH (MKATOM VALUE)))) NIL)) (for TAIL on PIECES by (CDDR TAIL) do (* ;  "Process some parts. Done here rather than above so that SERVER-FILENAME works easily.") (SELECTQ (CAR TAIL) (DEVICE (* ; "Fake host") (RPLACA TAIL 'HOST) [COND ((EQ (NTHCHARCODE (CADR TAIL) -1) (CHARCODE %:)) (* ;  "Device specified with trailing colon--strip it") (RPLACA (CDR TAIL) (SUBSTRING (CADR TAIL) 1 -2]) (VERSION [if (if (STRING.EQUAL (SETQ VALUE (CADR TAIL)) "H") then (SETQ RECOG 'OLD) (SETQ HIGHESTVERSIONP T) elseif (STRING.EQUAL VALUE "L") then (SETQ RECOG 'OLDEST)) then (* ; "Remove VERSION attribute.") (if (EQ TAIL PIECES) then (SETQ PIECES (CDDR TAIL)) else (RPLACD (NLEFT PIECES 1 TAIL) (CDDR TAIL]) NIL)) [SETQ FILENAME (PACKFILENAME.STRING `(,.PIECES HOST ,FTPSERVER.DEFAULT.HOST ,@(if (EQ ACCESS 'ENUMERATE) then (* ;  "Need to default extension to * before possibly packing on a version.") '(EXTENSION *] (CL:MULTIPLE-VALUE-BIND (RESULT C) [IGNORE-ERRORS (SELECTQ ACCESS (ENUMERATE (SETQ FILENAME (DIRECTORY.FILL.PATTERN FILENAME NIL (if HIGHESTVERSIONP then "" else "*"))) [CONS FILENAME (\GENERATEFILES FILENAME DESIREDPROPS '(RESETLST SORT)]) (DELETE (FULLNAME FILENAME RECOG)) (OPENSTREAM FILENAME ACCESS RECOG NIL (CONS '(SEQUENTIAL T) MYPLIST] (COND (RESULT) (T (* ; "On failure, write error value and return NIL. C could be NIL if FULLNAME didn't find the file, in which case the error will be FILE NOT FOUND.") (\SFTP.MARK.ERROR OUTS C) (.EOC. OUTS) NIL]) (\SFTP.PLIST.FROM.FILE [LAMBDA (FILE NEW DESIREDPROPS FILEOPENP GENERATOR) (* ; "Edited 7-Sep-88 16:40 by Matt Heffron") (* ;; "Generates a PLIST from FILE. NEW is true if file is being written anew DESIREDPROPS may restrict what we send") (PROG ([PIECES (UNPACKFILENAME.STRING (COND ((type? STREAM FILE) (FULLNAME FILE)) (T FILE] INFOFN INFOHANDLE HOST DIR NAME EXT VERSION AUTHOR TYPE PLIST) (COND (GENERATOR (SETQ INFOFN (FUNCTION \GENERATEFILEINFO)) (SETQ INFOHANDLE GENERATOR)) (T (SETQ INFOFN (FUNCTION GETFILEINFO)) (SETQ INFOHANDLE FILE))) (for TAIL on PIECES by (CDDR TAIL) do (SELECTQ (CAR TAIL) (HOST [COND ((STRING-EQUAL (CADR TAIL) FTPSERVER.DEFAULT.HOST) (RPLACA (CDR TAIL))) (T (SETQ HOST (CADR TAIL]) (DIRECTORY (SETQ DIR (CADR TAIL))) (NAME (SETQ NAME (CADR TAIL))) (EXTENSION (SETQ EXT (CADR TAIL))) (VERSION (SETQ VERSION (CADR TAIL))) NIL)) [SETQ PLIST (NCONC (.IFDESIRED. SERVER-FILENAME (PACKFILENAME.STRING PIECES)) (.IFDESIRED. NAME-BODY (COND (EXT (CONCAT NAME "." EXT)) (T NAME))) (.IFDESIRED. VERSION VERSION) (.IFDESIRED. END-OF-LINE-CONVENTION 'CR) (AND DIR (.IFDESIRED. DIRECTORY DIR)) (AND HOST (.IFDESIRED. DEVICE HOST] [COND ((NOT NEW) (SETQ PLIST (NCONC PLIST [.IFDESIRED. TYPE (SETQ TYPE (OR (CL:FUNCALL INFOFN INFOHANDLE 'TYPE) (\GETFILETYPE FILE FILEOPENP] (AND (EQ TYPE 'BINARY) (LIST (LIST 'BYTE-SIZE 8))) (.IFDESIRED. CREATION-DATE (CL:FUNCALL INFOFN INFOHANDLE 'CREATIONDATE)) (.IFDESIRED. WRITE-DATE (CL:FUNCALL INFOFN INFOHANDLE 'WRITEDATE)) (.IFDESIRED. READ-DATE (CL:FUNCALL INFOFN INFOHANDLE 'READDATE)) (.IFDESIRED. SIZE (CL:FUNCALL INFOFN INFOHANDLE 'LENGTH)) (.IFDESIRED. AUTHOR (CL:FUNCALL INFOFN INFOHANDLE 'AUTHOR] (RETURN PLIST]) (\SFTP.WHENCLOSED [LAMBDA (STREAM) (DECLARE (SPECVARS FTPDEBUGLOG)) (* ; "Edited 7-Sep-88 16:51 by Matt Heffron") (LET [(SERVERPROC (GETSTREAMPROP STREAM 'FTP.SERVER.PROCESS] (if FTPDEBUGLOG then (printout FTPDEBUGLOG T (GETSTREAMPROP STREAM 'FTP.DEBUG.PREFIX) "Connection closed" T)) (if SERVERPROC then (* ; "Was: (DEL.PROCESS SERVERPROC)") (PROCESS.EVAL SERVERPROC '(ERROR!]) ) (DECLARE%: EVAL@COMPILE (RPAQQ \PUPSOCKET.NEGOTIATED.CONNECTION 63) (CONSTANTS (\PUPSOCKET.NEGOTIATED.CONNECTION 63)) ) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE [PUTPROPS .IFDESIRED. MACRO ((PROP . LISTFORM) (AND (OR (NULL DESIREDPROPS) (FMEMB 'PROP DESIREDPROPS)) (PROG ((PROPVAL . LISTFORM)) (RETURN (AND PROPVAL (LIST (LIST 'PROP PROPVAL] ) (FILESLOAD (LOADCOMP) DPUPFTP BSP) ) (PUTPROPS FTPSERVERPATCH FILETYPE :TCOMPL) (PUTPROPS FTPSERVERPATCH MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (PUTPROPS FTPSERVERPATCH COPYRIGHT ("Matt Heffron & XEROX Corporation" 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1262 17784 (FTPSERVER 1272 . 1807) (NEGOTIATED-FTPSERVER 1809 . 2215) (\FTPSERVER.TOP 2217 . 3577) (\NEGOTIATED-FTPSERVER.TOP 3579 . 6442) (\SFTP.COMMANDLOOP 6444 . 8761) ( \SFTP.OPENFILE.FROM.PLIST 8763 . 14134) (\SFTP.PLIST.FROM.FILE 14136 . 17215) (\SFTP.WHENCLOSED 17217 . 17782))))) STOP \ No newline at end of file diff --git a/lispusers/FileCacheMsgWindow b/lispusers/FileCacheMsgWindow new file mode 100644 index 00000000..a8f03f3d --- /dev/null +++ b/lispusers/FileCacheMsgWindow @@ -0,0 +1 @@ +(FILECREATED " 2-May-86 18:58:43" {PHYLUM}FILECACHE>FILECACHEMSGWINDOW.;5 5430 changes to: (VARS FILECACHEMSGWINDOWCOMS) previous date: " 5-Mar-86 12:54:06" {PHYLUM}FILECACHE>FILECACHEMSGWINDOW.;4) (* Copyright (c) 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT FILECACHEMSGWINDOWCOMS) (RPAQQ FILECACHEMSGWINDOWCOMS ((* * Give the FileCacher a seperate window and Icon) (FILES FILECACHE (FROM LISPUSERS) ICONW) (BITMAPS FileCacheMessageIcon FileCacheMessageIconMask) [INITVARS (FILE-CACHE-MESSAGE-STREAM-REGION (with REGION (WINDOWPROP PROMPTWINDOW (QUOTE REGION)) (CREATEREGION (PLUS LEFT WIDTH) BOTTOM WIDTH HEIGHT))) (FILE-CACHE-MESSAGE-STREAM-ICON-POSITION (with REGION FILE-CACHE-MESSAGE-STREAM-REGION (create POSITION XCOORD _ LEFT YCOORD _ (MIN BOTTOM (DIFFERENCE SCREENHEIGHT (BITMAPHEIGHT FileCacheMessageIcon] (VARS (*FILE-CACHE-MESSAGE-STREAM* (CREATEW FILE-CACHE-MESSAGE-STREAM-REGION "FileCache message window" 2))) (P (DSPTEXTURE BLACKSHADE *FILE-CACHE-MESSAGE-STREAM*) (DSPOPERATION (QUOTE INVERT) *FILE-CACHE-MESSAGE-STREAM*) (DSPSCROLL (QUOTE ON) *FILE-CACHE-MESSAGE-STREAM*) (DSPRESET *FILE-CACHE-MESSAGE-STREAM*) (WINDOWPROP *FILE-CACHE-MESSAGE-STREAM* (QUOTE ICON) (TITLEDICONW (create TITLEDICON ICON _ FileCacheMessageIcon MASK _ FileCacheMessageIconMask TITLEREG _ (QUOTE (12 15 40 40))) "File cache msgs" NIL FILE-CACHE-MESSAGE-STREAM-ICON-POSITION T)) (SHRINKW *FILE-CACHE-MESSAGE-STREAM*)))) (* * Give the FileCacher a seperate window and Icon) (FILESLOAD FILECACHE (FROM LISPUSERS) ICONW) (RPAQ FileCacheMessageIcon (READBITMAP)) (62 61 "AOOOOOOOOOOOOON@" "AH@@@@@@@@@@@FA@" "C@@@@@@@@@@@@D@H" "B@@@@@@@@@@@@L@H" "B@@@@@@@@@@@@H@D" "B@@@@@@@@@@@@H@D" "B@@@@@@@@@@@@H@D" "B@@@@@@@@@@@@D@H" "C@@@@@@@@@@@@DDH" "A@@@@@@@@@@@@CG@" "AH@@@@@@@@@@@@H@" "@H@@@@@@@@@@@@H@" "@H@@@@@@@@@@@@D@" "@L@@@@@@@@@@@@D@" "@L@@@@@@@@@@@@D@" "@D@@@@@@@@@@@@D@" "@F@@@@@@@@@@@@D@" "@B@@@@@@@@@@@@D@" "@B@@@@@@@@@@@@D@" "@C@@@@@@@@@@@@D@" "@C@@@@@@@@@@@@D@" "@A@@@@@@@@@@@@D@" "@A@@@@@@@@@@@@D@" "@A@@@@@@@@@@@@D@" "@AH@@@@@@@@@@@F@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@H@@@@@@@@@@@B@" "@@L@@@@@@@@@@@C@" "@@L@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@D@@@@@@@@@@@A@" "@@L@@@@@@@@@@@A@" "@@H@@@@@@@@@@@A@" "@@H@@@@@@@@@@@A@" "@@H@@@@@@@@@@@A@" "@OOOOOOOOOOOO@A@" "AH@@@@@@@@@@GLA@" "F@@@@@@@@@@@LFA@" "D@@@@@@@@@@AHBC@" "L@@@@@@@@@@A@FB@" "H@@@@@@@@@@A@LF@" "H@@@@@@@@@@AOHD@" "H@@@@@@@@@@AH@D@" "L@@@@@@@@@@@H@H@" "L@@@@@@@@@@@LA@@" "N@@@@@@@@@@@GF@@" "CH@@@@@@@@@@AL@@" "@OOOOOOOOOOOOH@@") (RPAQ FileCacheMessageIconMask (READBITMAP)) (62 61 "AOOOOOOOOOOOOON@" "AOOOOOOOOOOOOOO@" "COOOOOOOOOOOOOOH" "COOOOOOOOOOOOOOH" "COOOOOOOOOOOOOOL" "COOOOOOOOOOOOOOL" "COOOOOOOOOOOOOOL" "COOOOOOOOOOOOOOH" "COOOOOOOOOOOOOOH" "AOOOOOOOOOOOOOO@" "AOOOOOOOOOOOOOH@" "@OOOOOOOOOOOOOH@" "@OOOOOOOOOOOOOL@" "@OOOOOOOOOOOOOL@" "@OOOOOOOOOOOOOL@" "@GOOOOOOOOOOOOL@" "@GOOOOOOOOOOOOL@" "@COOOOOOOOOOOOL@" "@COOOOOOOOOOOOL@" "@COOOOOOOOOOOOL@" "@COOOOOOOOOOOOL@" "@AOOOOOOOOOOOOL@" "@AOOOOOOOOOOOOL@" "@AOOOOOOOOOOOOL@" "@AOOOOOOOOOOOON@" "@AOOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOON@" "@@OOOOOOOOOOOOO@" "@@OOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@GOOOOOOOOOOOO@" "@@OOOOOOOOOOOOO@" "@@OOOOOOOOOOOOO@" "@@OOOOOOOOOOOOO@" "@@OOOOOOOOOOOOO@" "@OOOOOOOOOOOOOO@" "AOOOOOOOOOOOOOO@" "GOOOOOOOOOOOOOO@" "GOOOOOOOOOOOOOO@" "OOOOOOOOOOOOOON@" "OOOOOOOOOOOOOON@" "OOOOOOOOOOOOOOL@" "OOOOOOOOOOOOOOL@" "OOOOOOOOOOOOOOH@" "OOOOOOOOOOOOOO@@" "OOOOOOOOOOOOON@@" "COOOOOOOOOOOOL@@" "@OOOOOOOOOOOOH@@") (RPAQ? FILE-CACHE-MESSAGE-STREAM-REGION (with REGION (WINDOWPROP PROMPTWINDOW (QUOTE REGION)) (CREATEREGION (PLUS LEFT WIDTH) BOTTOM WIDTH HEIGHT))) (RPAQ? FILE-CACHE-MESSAGE-STREAM-ICON-POSITION [with REGION FILE-CACHE-MESSAGE-STREAM-REGION (create POSITION XCOORD _ LEFT YCOORD _ (MIN BOTTOM (DIFFERENCE SCREENHEIGHT (BITMAPHEIGHT FileCacheMessageIcon]) (RPAQ *FILE-CACHE-MESSAGE-STREAM* (CREATEW FILE-CACHE-MESSAGE-STREAM-REGION "FileCache message window" 2)) (DSPTEXTURE BLACKSHADE *FILE-CACHE-MESSAGE-STREAM*) (DSPOPERATION (QUOTE INVERT) *FILE-CACHE-MESSAGE-STREAM*) (DSPSCROLL (QUOTE ON) *FILE-CACHE-MESSAGE-STREAM*) (DSPRESET *FILE-CACHE-MESSAGE-STREAM*) (WINDOWPROP *FILE-CACHE-MESSAGE-STREAM* (QUOTE ICON) (TITLEDICONW (create TITLEDICON ICON _ FileCacheMessageIcon MASK _ FileCacheMessageIconMask TITLEREG _ (QUOTE (12 15 40 40))) "File cache msgs" NIL FILE-CACHE-MESSAGE-STREAM-ICON-POSITION T)) (SHRINKW *FILE-CACHE-MESSAGE-STREAM*) (PUTPROPS FILECACHEMSGWINDOW COPYRIGHT ("Xerox Corporation" 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.LC1-SF b/lispusers/GACHAE.LC1-SF new file mode 100644 index 00000000..79c03e55 --- /dev/null +++ b/lispusers/GACHAE.LC1-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 141Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 14:22:31) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((93 182) (93 182) (143 182)) NIL ((-12.5 0 0 0 75. 0 ) (25. 0 75. 0 -75. 0 )) NATURAL) (19 ((143 182) (147 197) (170 215) (225 221) (290 213) (309 194) (287 165) (191 156) (122 142) (100 128) (85 110) (75 78) (81 46) (96 25) (118 9) (153 -4) (199 -8) (247 -2) (313 14)) NIL ((0.804730058 13.568931 0 0 19.171619 8.5864067 ) (10.390539 17.862133 19.171619 8.5864067 18.1419029 -24.932033 ) (38.63311 13.9825229 37.313522 -16.3456268 -13.7392387 1.14173698 ) (69.07701 -1.79223466 23.574283 -15.2038898 -95.184936 8.36507798 ) (45.058822 -12.813585 -71.610656 -6.83881188 58.47901 -16.602043 ) (2.68767023 -27.953422 -13.131645 -23.440856 -108.73107 64.043106 ) (-64.809524 -19.372722 -121.8627 40.602249 178.4453 -59.570404 ) (-97.44955 -8.5556755 56.58264 -18.968154 0.949485779 24.238521 ) (-40.39218 -15.404567 57.532127 5.27036858 -62.243286 -7.38368893 ) (-13.981699 -13.826044 -4.7111616 -2.11332083 8.02367784 -18.703762 ) (-14.6810188 -25.291248 3.31251764 -20.817085 18.148567 22.19876 ) (-2.29421711 -35.008949 21.461086 1.38167786 -14.617956 13.908697 ) (11.857891 -26.672924 6.8431301 15.290376 -1.67673778 -11.8335666 ) (17.862651 -17.299331 5.16639233 3.45680857 9.3249073 -2.57442284 ) (27.691497 -15.1297359 14.4913 0.882385612 0.377099991 10.1312599 ) (42.371345 -9.1817188 14.8684 11.013647 -22.833305 -1.95062256 ) (45.823097 0.856617928 -7.9649067 9.0630245 36.956123 3.67121887 ) (56.336258 11.7552509 28.991222 12.734243 -28.991222 -12.734243 )) NATURAL) (5 ((313 14) (329 6) (358 -1) (378 0) (397 2)) NIL ((11.8928566 -7.7142849 0 0 24.642856 -1.71428537 ) (24.214283 -8.5714283 24.642856 -1.71428537 -45.214279 14.571426 ) (26.249996 -2.99999952 -20.571426 12.857141 24.214283 -14.571426 ) (17.785713 2.5714283 3.6428566 -1.71428561 -3.6428566 1.71428561 )) NATURAL) (2 ((397 2) (397 36)) NIL ((0 34. 0 0 0 0 )) NATURAL) (4 ((397 36) (378 36) (361 41) (355 51)) NIL ((-18.799999 -1. 0 0 -1.19999981 6. ) (-19.399997 2. -1.19999981 6. 17.999996 0 ) (-11.599998 8. 16.799999 6. -16.799999 -6. )) NATURAL) (2 ((355 51) (355 185)) NIL ((0 134. 0 0 0 0 )) NATURAL) (6 ((355 185) (348 212) (328 232) (304 245) (271 252) (229 256)) NIL ((-3.67464113 28.473682 0 0 -19.952152 -8.84210397 ) (-13.6507168 24.052627 -19.952152 -8.84210397 21.760761 2.21052551 ) (-22.722484 16.315788 1.80861187 -6.63157845 -13.090906 0 ) (-27.459327 9.6842098 -11.282295 -6.63157845 0.602870941 3.78947353 ) (-38.440185 4.94736767 -10.679424 -2.84210491 10.679424 2.84210491 )) NATURAL) (6 ((229 256) (177 253) (135 241) (115 228) (99 209) (93 182)) NIL ((-53.12918 -0.583732248 0 0 6.77511979 -14.497606 ) (-49.741623 -7.83253575 6.77511979 -14.497606 26.1244 18.488033 ) (-29.904304 -13.086122 32.89952 3.99043036 -39.27272 -11.454544 ) (-16.641147 -14.822965 -6.37320519 -7.46411515 22.966503 -2.66985512 ) (-11.531099 -23.622009 16.5932998 -10.13397 -16.5932998 10.13397 )) NATURAL)) ((11 ((308 127) (235 123) (180 115) (142 101) (127 74) (139 46) (174 32) (223 30) (290 45) (308 80) (308 127)) NIL ((-76.935379 -3.13017798 0 0 23.612281 -5.21893215 ) (-65.129226 -5.73964405 23.612281 -5.21893215 -10.061409 2.09466267 ) (-46.54766 -9.91124536 13.5508728 -3.12426949 10.63335 -15.159719 ) (-27.68011 -20.615371 24.184223 -18.2839889 3.5280075 16.544212 ) (-1.73188519 -30.627254 27.71223 -1.73977589 -0.745380402 20.982864 ) (25.607654 -21.875595 26.96685 19.243091 -24.546482 -10.4756908 ) (40.30126 -7.87034989 2.42036581 8.76740075 44.931312 8.9199009 ) (65.187286 5.35700226 47.351684 17.687301 -131.1788 4.79608155 ) (46.949569 25.442344 -83.827118 22.483383 77.783889 -10.1042308 ) (2.0144062 42.87361 -6.04321957 12.379152 6.04321957 -12.379152 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 142Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 14:29:14) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((73 337) (73 337) (73 0)) NIL ((0 84.25 0 0 0 -505.5 ) (0 -168.5 0 -505.5 0 505.5 )) NATURAL) (2 ((73 0) (122 0)) NIL ((49. 0 0 0 0 0 )) NATURAL) (2 ((122 0) (122 19)) NIL ((0 19. 0 0 0 0 )) NATURAL) (19 ((122 19) (145 7) (186 -3) (223 -6) (274 -2) (306 10) (330 24) (346 42) (358 66) (367 124) (358 182) (346 206) (330 224) (306 238) (274 250) (223 254) (186 251) (145 241) (122 229)) NIL ((17.530986 -12.1277828 0 0 32.814079 0.766703606 ) (33.938026 -11.74443 32.814079 0.766703606 -56.070419 8.166481 ) (38.716896 -6.89448739 -23.25634 8.93318559 59.467628 -3.43263149 ) (45.194366 0.322382927 36.211288 5.50055409 -73.800094 5.56404019 ) (44.505607 8.60495759 -37.588813 11.064594 37.732772 -12.823528 ) (25.783184 13.2577877 0.143964797 -1.75893473 -11.131006 9.73007585 ) (20.361644 16.363891 -10.987041 7.97114278 6.79124547 -14.0967788 ) (12.770227 17.286644 -4.195796 -6.12563706 7.96602345 58.657035 ) (12.5574417 40.489532 3.77022743 52.531402 -32.655334 -52.531402 ) (-3.20374965E-7 66.755233 -28.885112 0 32.655334 -52.531402 ) (-12.5574417 40.489524 3.77022743 -52.531402 -7.96602345 58.657035 ) (-12.770227 17.286644 -4.195796 6.12563706 -6.79124547 -14.0967788 ) (-20.361644 16.363891 -10.987041 -7.97114278 11.131006 9.73007585 ) (-25.783184 13.2577858 0.143965035 1.75893426 -37.732772 -12.823528 ) (-44.505607 8.60495568 -37.588813 -11.064594 73.800094 5.56404019 ) (-45.194366 0.322382271 36.211288 -5.50055409 -59.467628 -3.43263149 ) (-38.716896 -6.89448739 -23.25634 -8.93318559 56.070419 8.166481 ) (-33.938026 -11.74443 32.814079 -0.766703487 -32.814079 0.766703487 )) NATURAL) (2 ((122 229) (122 337)) NIL ((0 108. 0 0 0 0 )) NATURAL) (2 ((122 337) (73 337)) NIL ((-49. 0 0 0 0 0 )) NATURAL)) ((11 ((315 124) (312 86) (300 53) (275 34) (240 28) (220 28) (200 28) (165 34) (140 53) (128 86) (125 124)) NIL ((-1.25837326 -38.552482 0 0 -10.44976 3.31491756 ) (-6.48325349 -36.895027 -10.44976 3.31491756 -1.75119591 13.425411 ) (-17.808612 -26.8674 -12.200956 16.740329 -6.54545403 -3.01657295 ) (-33.282295 -11.6353588 -18.74641 13.7237568 45.933013 -7.35911656 ) (-29.062198 -1.59116006 27.186603 6.36464024 -27.186603 -9.5469589 ) (-15.4688987 0 0 -3.18232012 -27.186603 9.5469589 ) (-29.062198 1.5911603 -27.186603 6.36464024 45.933013 7.35911656 ) (-33.282295 11.6353588 18.74641 13.7237568 -6.54545403 3.01657295 ) (-17.808609 26.8674 12.200956 16.740329 -1.75119781 -13.425413 ) (-6.48325253 36.895027 10.4497585 3.3149166 -10.4497585 -3.3149166 )) NATURAL) (11 ((125 124) (128 162) (140 195) (165 214) (200 220) (220 220) (240 220) (275 214) (300 195) (312 162) (315 124)) NIL ((1.25837326 38.552482 0 0 10.44976 -3.31491756 ) (6.48325349 36.895027 10.44976 -3.31491756 1.75119591 -13.425411 ) (17.808612 26.8674 12.200956 -16.740329 6.54545403 3.01657295 ) (33.282295 11.6353588 18.74641 -13.7237568 -45.933013 7.35911656 ) (29.062198 1.59116006 -27.186603 -6.36464024 27.186603 9.5469589 ) (15.4688987 0 0 3.18232012 27.186603 -9.5469589 ) (29.062198 -1.5911603 27.186603 -6.36464024 -45.933013 -7.35911656 ) (33.282295 -11.6353588 -18.74641 -13.7237568 6.54545403 -3.01657295 ) (17.808609 -26.8674 -12.200956 -16.740329 1.75119781 13.425413 ) (6.48325253 -36.895027 -10.4497585 -3.3149166 10.4497585 3.3149166 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 143Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 7:26:59) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((24 ((379 184) (360 219) (330 239) (291 250) (247 253) (199 250) (165 243) (128 229) (105 209) (87 184) (76 148) (73 124) (76 100) (86 64) (103 37) (124 19) (163 3) (199 -4) (247 -7) (291 -2) (330 9) (358 30) (370 49) (379 74)) NIL ((-16.644897 38.499534 0 0 -14.1306038 -20.997219 ) (-23.710201 28.000923 -14.1306038 -20.997219 4.65302277 14.9861088 ) (-35.514289 14.496757 -9.477581 -6.0111103 7.51851369 -2.94722366 ) (-41.232612 7.01203538 -1.95906663 -8.95833398 -10.727083 2.80278683 ) (-48.55522 -0.544904828 -12.686151 -6.15554715 41.389816 3.73607063 ) (-40.546463 -4.83241654 28.70367 -2.41947651 -46.832206 -5.74706936 ) (-35.258895 -10.125427 -18.128536 -8.16654588 43.939003 1.25220871 ) (-31.41793 -17.665866 25.810466 -6.91433716 -26.923797 6.73823167 ) (-19.069366 -21.21109 -1.11333346 -0.176105380 9.75619889 -22.205131 ) (-15.3045978 -32.48976 8.64286614 -22.381237 -0.101001739 46.08229 ) (-6.71223355 -31.829849 8.5418644 23.701057 -3.35219002 -24.124053 ) (0.153535515 -20.190822 5.18967438 -0.422999382 1.50976372 -21.586059 ) (6.09809209 -31.406852 6.6994381 -22.009059 3.31313324 38.468307 ) (14.4540958 -34.181755 10.012571 16.459247 -14.762298 -6.28718758 ) (17.0855179 -20.8661 -4.74972725 10.17206 37.73606 -13.319557 ) (31.203823 -17.35382 32.986335 -3.14749718 -52.181953 17.565422 ) (38.099174 -11.718605 -19.195617 14.4179268 44.99176 -14.942138 ) (41.399444 -4.7717495 25.796146 -0.524212718 -37.78511 12.203134 ) (48.30303 0.805606008 -11.9889679 11.6789226 10.148691 -9.8704033 ) (41.388412 7.5493269 -1.84027552 1.80851817 -8.8096504 15.278482 ) (35.14331 16.997085 -10.649927 17.087001 -10.910089 -27.243534 ) (19.038337 20.462322 -21.560016 -10.156534 22.450019 21.695667 ) (8.703331 21.153621 0.890004874 11.539133 -0.890004874 -11.539133 )) NATURAL) (2 ((379 74) (329 74)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (20 ((329 74) (329 64) (322 47) (298 35) (268 30) (243 29) (218 30) (176 36) (153 48) (135 71) (124 124) (135 177) (153 200) (176 212) (218 218) (243 219) (268 218) (298 213) (322 201) (329 184)) NIL ((0.788245917 -7.8808317 0 0 -4.72947598 -12.7150058 ) (-1.57649183 -14.238334 -4.72947598 -12.7150058 -18.352619 21.575031 ) (-15.4822788 -16.165821 -23.082096 8.8600273 18.139965 -1.58513355 ) (-29.494392 -8.09836198 -4.94212914 7.27489377 11.792747 -3.23450184 ) (-28.540145 -2.4407196 6.85061837 4.04039192 0.689037323 -3.47685623 ) (-21.345008 -0.138755947 7.53965569 0.563535691 -44.548889 5.14192868 ) (-36.079803 2.99574423 -37.009239 5.70546437 75.50656 0.909141541 ) (-35.335762 9.15577889 38.497322 6.6146059 -41.47737 -2.77849531 ) (-17.577129 14.3811378 -2.98005152 3.83611059 6.4029312 40.204834 ) (-17.3557129 38.319664 3.4228797 44.040947 27.865646 -44.040847 ) (-8.89971852E-6 60.340187 31.288528 9.19930607E-5 -27.865531 -44.041404 ) (17.355751 38.319572 3.42299652 -44.041313 -6.40351487 40.206466 ) (17.576992 14.381498 -2.98051882 -3.83484268 41.47959 -2.78447056 ) (35.336265 9.15442086 38.499076 -6.61931325 -75.514846 0.931411744 ) (36.077919 3.00081348 -37.015777 -5.6879015 44.57981 5.05882263 ) (21.352046 -0.157676696 7.56403638 -0.629078388 -0.804404259 -3.16670466 ) (28.513881 -2.37010717 6.7596321 -3.79578304 -11.3621997 -4.39200688 ) (29.592414 -8.3618946 -4.60256768 -8.1877899 -19.746788 2.73473835 ) (15.116451 -15.1823158 -24.349357 -5.45305157 24.349357 5.45305157 )) NATURAL) (2 ((329 184) (379 184)) NIL ((50. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 144Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 7:36:21) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((367 337) (367 337) (367 0)) NIL ((0 84.25 0 0 0 -505.5 ) (0 -168.5 0 -505.5 0 505.5 )) NATURAL) (2 ((367 0) (319 0)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (2 ((319 0) (319 19)) NIL ((0 19. 0 0 0 0 )) NATURAL) (19 ((319 19) (288 7) (255 -1) (217 -6) (166 -2) (134 9) (111 24) (94 42) (82 66) (73 124) (82 182) (94 206) (111 224) (134 239) (166 250) (217 254) (255 249) (288 241) (319 229)) NIL ((-30.485801 -12.997631 0 0 -3.08518171 5.9857931 ) (-32.028389 -10.004734 -3.08518171 5.9857931 3.42590904 -5.92896652 ) (-33.400619 -6.98342515 0.340727687 0.0568262711 -28.618454 11.7300739 ) (-47.369117 -1.06156063 -28.277729 11.786901 63.04792 -4.99134064 ) (-44.122886 8.22966958 34.770195 6.79556084 -31.573257 -3.76470709 ) (-25.13932 13.142877 3.19693613 3.03085375 3.24512148 2.05016756 ) (-20.319824 17.198814 6.4420576 5.0810213 0.592772484 -10.4359607 ) (-13.5813789 17.061855 7.0348301 -5.3549404 -11.616209 57.69367 ) (-12.354654 40.553749 -4.58137989 52.338737 33.872062 -52.338737 ) (7.97212123E-7 66.723114 29.290687 -2.04428988E-6 -33.872062 -52.33872 ) (12.354654 40.553749 -4.58137989 -52.338729 11.616209 57.693664 ) (13.5813789 17.061855 7.03482915 5.3549385 -0.592770577 -10.4359588 ) (20.319824 17.198814 6.44205857 -5.08102036 -3.24512196 2.05016661 ) (25.13932 13.142877 3.1969366 -3.03085375 31.573257 -3.76470709 ) (44.122886 8.22966958 34.770195 -6.79556084 -63.04792 -4.99134064 ) (47.369117 -1.06156182 -28.277729 -11.786901 28.618454 11.7300739 ) (33.400619 -6.98342515 0.340728342 -0.0568258986 -3.42591 -5.92896652 ) (32.028389 -10.004734 -3.08518171 -5.9857931 3.08518171 5.9857931 )) NATURAL) (2 ((319 229) (319 337)) NIL ((0 108. 0 0 0 0 )) NATURAL) (2 ((319 337) (367 337)) NIL ((48. 0 0 0 0 0 )) NATURAL)) ((21 ((125 124) (128 86) (140 53) (166 34) (195 28) (220 25) (248 28) (275 34) (300 53) (312 86) (315 124) (312 162) (300 195) (275 214) (240 220) (220 221) (200 220) (166 214) (140 195) (128 162) (125 124)) NIL ((1.51067447 -38.577346 0 0 8.93595315 3.46408939 ) (5.97865105 -36.845298 8.93595315 3.46408939 9.32023049 12.679552 ) (19.574718 -27.041435 18.256183 16.143642 -16.216877 -0.182313919 ) (29.722465 -10.9889488 2.03930521 15.961328 -10.452711 -17.950286 ) (26.535415 -4.0027647 -8.41340638 -1.98896122 16.027721 11.9834747 ) (26.135868 1.15633010E-5 7.6143179 9.99451448 -11.658184 -11.983612 ) (27.921096 4.00271988 -4.04386616 -1.98909831 6.60501576 17.950973 ) (27.179737 10.989109 2.5611496 15.9618759 -20.761878 0.179710388 ) (19.359943 27.04084 -18.200729 16.141586 10.4425125 -12.669805 ) (6.38047219 36.847518 -7.75821686 3.47177982 2.99181557 -3.50048733 ) (0.118163108 38.569053 -4.76640129 -0.0287075825 -4.40977478 -3.32824135 ) (-6.85312558 36.876228 -9.17617608 -3.35694933 -3.35271454 -13.186544 ) (-17.705661 26.926006 -12.5288906 -16.543495 -6.17935753 2.07443428 ) (-33.324226 11.419729 -18.708248 -14.4690609 46.070129 10.8888015 ) (-28.997413 2.39507007 27.36188 -3.58025837 -28.10115 2.3703537 ) (-15.686109 -1.16033479E-5 -0.739272595 -1.20990467 -23.665515 -2.37021637 ) (-28.25814 -2.3950243 -24.404789 -3.58012104 38.763206 -10.889488 ) (-33.281318 -11.419889 14.358423 -14.46961 0.612663269 -2.07182503 ) (-18.616565 -26.92541 14.971086 -16.541435 -5.21385956 13.176794 ) (-6.25240899 -36.878448 9.75722695 -3.36464119 -9.75722695 3.36464119 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 145Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 7:44:36) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((10 ((114 106) (121 71) (140 47) (162 36) (198 28) (232 26) (262 30) (290 38) (310 55) (317 74)) NIL ((3.72561359 -37.048507 0 0 19.646316 12.291084 ) (13.5487728 -30.902969 19.646316 12.291084 -26.23159 4.54457855 ) (20.079292 -16.3395958 -6.5852747 16.8356628 31.280056 -18.469402 ) (29.134048 -8.738636 24.694782 -1.63374018 -32.88864 9.3330364 ) (37.384506 -5.70585728 -8.1938591 7.69929696 4.27451039 -0.862744332 ) (31.327903 1.56206679 -3.91934872 6.8365526 3.79060364 -5.88205815 ) (29.303859 5.4575901 -0.128744781 0.954493762 -7.43692494 12.390974 ) (25.456649 12.6075706 -7.56567 13.345468 -10.0429077 -13.681835 ) (12.8695259 19.112121 -17.608577 -0.336367309 17.608577 0.336367309 )) NATURAL) (2 ((317 74) (367 74)) NIL ((50. 0 0 0 0 0 )) NATURAL) (26 ((367 74) (358 49) (346 30) (318 9) (279 -2) (235 -7) (187 -4) (151 3) (120 17) (92 38) (74 63) (64 90) (61 124) (64 148) (75 184) (92 210) (116 229) (153 245) (188 252) (235 253) (276 248) (315 237) (345 217) (365 189) (375 153) (376 106)) NIL ((-9.14956666 -26.922843 0 0 0.897400857 11.5370788 ) (-8.7008648 -21.154304 0.897400857 11.5370788 -22.487003 -21.685394 ) (-19.046966 -20.459922 -21.589603 -10.148315 11.0506248 27.204502 ) (-35.111259 -17.005985 -10.5389785 17.056186 8.28450204 -15.132629 ) (-41.507988 -7.51611615 -2.25447607 1.92355561 -8.18863679 9.3260288 ) (-47.85678 -0.929544092 -10.443113 11.249586 30.470039 -10.1714935 ) (-43.064872 5.23429489 20.026927 1.07809257 -17.691524 7.3599491 ) (-31.883708 9.99236299 2.33540249 8.4380417 -1.70394110 -1.26830482 ) (-30.400276 17.796249 0.631461263 7.16973687 12.5072899 -2.28672886 ) (-23.51517 23.822624 13.138752 4.883008 -6.32522488 -7.5847759 ) (-13.53903 24.913242 6.8135271 -2.7017684 0.793606759 20.625831 ) (-6.3286991 32.52439 7.60713387 17.924064 -2.84920406 -44.918556 ) (-0.146167755 27.989177 4.7579298 -26.994491 4.60321713 57.048393 ) (6.91337014 29.518886 9.3611469 30.053905 -3.56366348 -51.275047 ) (14.492685 33.935264 5.79748345 -21.221145 -2.34856748 16.051834 ) (19.115882 20.740036 3.44891596 -5.16931153 18.957935 5.067708 ) (32.043769 18.1045799 22.406852 -0.101603269 -37.483184 -12.32267 ) (35.70903 11.84164 -15.0763359 -12.424274 40.974823 8.22297288 ) (41.1201 3.52885342 25.89849 -4.20130062 -42.416122 -2.56921959 ) (45.81053 -1.957057 -16.517631 -6.7705202 20.689662 2.05390358 ) (39.637733 -7.7006254 4.17203236 -4.71661663 -16.342529 -5.64639378 ) (35.638504 -15.24044 -12.1704979 -10.36301 2.68045235 2.53167534 ) (24.808235 -24.337612 -9.49004556 -7.83133507 -0.379274368 1.51969146 ) (15.128551 -31.409103 -9.8693199 -6.3116436 -1.16334915 -8.610445 ) (4.67755604 -42.02597 -11.032669 -14.922088 11.032669 14.922088 )) NATURAL) (2 ((376 106) (114 106)) NIL ((-262. 0 0 0 0 0 )) NATURAL)) ((13 ((111 148) (115 173) (128 195) (142 206) (164 215) (199 220) (219 221) (239 220) (273 215) (296 206) (309 195) (323 173) (327 148)) NIL ((1.59247875 25.037006 0 0 14.445127 -0.222058296 ) (8.8150425 24.925979 14.445127 -0.222058296 -18.225643 -16.889705 ) (14.147348 16.259063 -3.78051567 -17.111766 10.4574489 19.780899 ) (15.595558 9.03774835 6.67693425 2.66913366 18.395839 -8.23390008 ) (31.470413 7.58993245 25.072776 -5.56476689 -54.040817 1.15470123 ) (29.522777 2.60251617 -28.968044 -4.41006565 29.767448 3.61509848 ) (15.438461 -1.19209289E-7 0.799406291 -0.794966818 24.971008 -3.61509848 ) (28.723369 -2.60251665 25.770416 -4.41006565 -45.65148 -1.15470123 ) (31.668045 -7.58993245 -19.881069 -5.56476689 7.63492776 8.23390008 ) (15.60444 -9.03774835 -12.246141 2.66913366 21.111778 -19.780899 ) (13.914188 -16.259067 8.8656368 -17.111766 -26.082042 16.889705 ) (9.73880197 -24.925979 -17.216407 -0.222057551 17.216407 0.222057551 )) NATURAL) (2 ((327 148) (111 148)) NIL ((-216. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 146Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 7:51:03) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((156 0) (156 210)) NIL ((0 210. 0 0 0 0 )) NATURAL) (2 ((156 210) (60 210)) NIL ((-96. 0 0 0 0 0 )) NATURAL) (2 ((60 210) (60 246)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((60 246) (156 246)) NIL ((96. 0 0 0 0 0 )) NATURAL) (2 ((156 246) (156 292)) NIL ((0 46. 0 0 0 0 )) NATURAL) (10 ((156 292) (165 316) (189 333) (215 341) (243 345) (278 346) (315 342) (348 331) (369 315) (378 292)) NIL ((5.11860848 25.295597 0 0 23.288345 -7.7735853 ) (16.762779 21.408802 23.288345 -7.7735853 -26.441726 -3.1320734 ) (26.83026 12.069181 -3.15338469 -10.9056587 4.47857857 8.3018837 ) (25.916164 5.31446457 1.32519412 -2.60377359 8.5274124 -0.0754714012 ) (31.505065 2.67295551 9.8526077 -2.67924499 -8.58823396 -1.99999904 ) (37.063552 -1.00628972 1.26437258 -4.67924404 -4.17447186 -3.92452908 ) (36.240692 -7.64779854 -2.9100995 -8.6037731 -10.713871 5.69811249 ) (27.973655 -13.402515 -13.6239719 -2.90566063 -0.970033646 -6.86792374 ) (13.8646679 -19.742137 -14.594005 -9.77358438 14.594005 9.77358438 )) NATURAL) (2 ((378 292) (378 272)) NIL ((0 -20. 0 0 0 0 )) NATURAL) (2 ((378 272) (337 272)) NIL ((-41. 0 0 0 0 0 )) NATURAL) (8 ((337 272) (331 295) (319 305) (300 311) (273 313) (245 310) (219 299) (209 283)) NIL ((-4.74338722 26.25661 0 0 -7.53967667 -19.539676 ) (-8.51322557 16.48677 -7.53967667 -19.539676 1.69838524 19.698383 ) (-15.203708 6.79628945 -5.84129143 0.158708185 -5.25386429 -5.25386334 ) (-23.671932 4.32806492 -11.0951557 -5.0951557 13.3170719 1.31707239 ) (-28.10855 -0.108553722 2.22191667 -3.77808333 -6.01442719 -6.01442719 ) (-28.893848 -6.89385033 -3.7925105 -9.792511 28.74063 4.74063969 ) (-18.31604 -14.3160419 24.948123 -5.0518713 -24.948123 5.0518713 )) NATURAL) (2 ((209 283) (209 246)) NIL ((0 -37. 0 0 0 0 )) NATURAL) (2 ((209 246) (313 246)) NIL ((104. 0 0 0 0 0 )) NATURAL) (2 ((313 246) (313 210)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((313 210) (209 210)) NIL ((-104. 0 0 0 0 0 )) NATURAL) (2 ((209 210) (209 0)) NIL ((0 -210. 0 0 0 0 )) NATURAL) (2 ((209 0) (156 0)) NIL ((-53. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 147Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:11:15) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((11 ((367 -36) (360 -58) (339 -81) (316 -96) (276 -109) (223 -113) (171 -109) (130 -96) (106 -81) (87 -58) (79 -36)) NIL ((-3.1312089 -21.157455 0 0 -23.212745 -5.05524826 ) (-14.737581 -23.685081 -23.212745 -5.05524826 32.063728 19.276241 ) (-21.91846 -19.102207 8.85098649 14.220993 -33.042182 -18.04972 ) (-29.588569 -13.906076 -24.1912 -3.82872963 10.105022 16.922653 ) (-48.727256 -9.27347947 -14.0861778 13.093923 16.622085 -7.6408863 ) (-54.502388 6.37024641E-7 2.53591108 5.45303726 7.4066181 7.6408844 ) (-48.263168 9.27347947 9.94252969 13.0939216 13.751432 -16.922649 ) (-31.444919 13.906076 23.693962 -3.82872915 -26.412349 18.04972 ) (-20.957134 19.102207 -2.71838999 14.220993 19.897983 -19.276241 ) (-13.726532 23.685081 17.1795959 -5.05524826 -17.1795959 5.05524826 )) NATURAL) (2 ((79 -36) (134 -36)) NIL ((55. 0 0 0 0 0 )) NATURAL) (8 ((134 -36) (157 -66) (188 -78) (215 -81) (238 -81) (278 -72) (310 -53) (319 -26)) NIL ((20.736858 -34.19924 0 0 13.578838 25.195465 ) (27.526279 -21.601509 13.578838 25.195465 -19.894191 -17.977325 ) (31.15802 -5.39470959 -6.3153553 7.21813775 -6.00206185 -7.28615475 ) (21.841632 -1.81964922 -12.317417 -0.0680177510 43.902435 11.121948 ) (31.475437 3.67330837 31.585022 11.053932 -43.607688 -1.20164871 ) (41.256607 14.126417 -12.0226726 9.85228349 -19.471656 -0.315355301 ) (19.498107 23.821022 -31.49433 9.53692819 31.49433 -9.53692819 )) NATURAL) (2 ((319 -26) (319 19)) NIL ((0 45. 0 0 0 0 )) NATURAL) (19 ((319 19) (294 10) (255 -1) (217 -6) (166 -2) (134 9) (111 24) (94 42) (78 78) (73 124) (77 160) (88 196) (111 224) (134 239) (166 250) (217 254) (263 249) (297 238) (319 229)) NIL ((-20.838954 -8.1762371 0 0 -24.966262 -4.94256687 ) (-33.322082 -10.6475219 -24.966262 -4.94256687 40.83132 12.712835 ) (-37.872688 -9.2336712 15.865064 7.77026845 -48.359054 2.09122372 ) (-46.187156 -0.417790532 -32.493995 9.86149217 68.604934 -3.07773304 ) (-44.378677 7.9048357 36.110939 6.7837591 -34.060707 -1.78029155 ) (-25.298099 13.798448 2.05022669 5.00346756 7.6379194 -7.8010969 ) (-19.428913 14.901367 9.6881466 -2.79762983 -14.490961 26.984676 ) (-16.986244 25.596077 -4.80281449 24.187049 20.325923 -10.1376247 ) (-11.6260967 44.714317 15.523111 14.049425 -6.81274796 -34.43418 ) (0.490640223 41.546646 8.7103634 -20.384758 -5.07493115 27.874359 ) (6.66353799 35.099075 3.63543177 7.489604 15.112472 -17.0632629 ) (17.855205 34.057045 18.747905 -9.5736599 -25.374961 -7.62130547 ) (23.91563 20.672733 -6.62705899 -17.194965 14.387386 17.548488 ) (24.482265 12.252012 7.7603283 0.353523433 21.825416 -8.572649 ) (43.155304 8.31921006 29.585746 -8.21912576 -41.68907 -1.25789261 ) (51.896514 -0.528861285 -12.1033249 -9.47701837 0.930879594 1.60422325 ) (40.258628 -9.20376779 -11.172445 -7.8727951 -4.0344429 12.8409939 ) (27.068962 -10.656065 -15.206888 4.96819878 15.206888 -4.96819878 )) NATURAL) (2 ((319 229) (319 246)) NIL ((0 17. 0 0 0 0 )) NATURAL) (2 ((319 246) (367 246)) NIL ((48. 0 0 0 0 0 )) NATURAL) (2 ((367 246) (367 -36)) NIL ((0 -282. 0 0 0 0 )) NATURAL)) ((11 ((315 124) (312 86) (300 53) (275 34) (240 28) (220 26) (200 28) (166 34) (140 53) (128 86) (125 124)) NIL ((-1.25777840 -38.569053 0 0 -10.453329 3.41436482 ) (-6.4844427 -36.861877 -10.453329 3.41436482 -1.73335266 12.9281749 ) (-17.804447 -26.983425 -12.1866817 16.34254 -6.61325646 -1.12707138 ) (-33.29776 -11.204418 -18.799938 15.215469 46.186386 -14.419889 ) (-29.004505 -3.1988945 27.386447 0.795579792 -28.1323 4.80662918 ) (-15.6842098 4.17232513E-7 -0.745856881 5.60220909 -23.657165 -4.80662918 ) (-28.258647 3.19889498 -24.403022 0.795579315 38.76097 14.419889 ) (-33.28118 11.20442 14.357952 15.215469 0.613256455 1.12706756 ) (-18.6166 26.983425 14.971208 16.3425369 -5.21401215 -12.928171 ) (-6.2523985 36.861877 9.7571964 3.41436482 -9.7571964 -3.41436482 )) NATURAL) (11 ((125 124) (128 162) (140 195) (166 214) (200 220) (220 222) (240 220) (275 214) (300 195) (312 162) (315 124)) NIL ((1.37380051 38.569053 0 0 9.7571964 -3.41436482 ) (6.2523985 36.861877 9.7571964 -3.41436482 5.21401596 -12.9281749 ) (18.616603 26.983425 14.971212 -16.34254 -0.613260269 1.12707138 ) (33.28118 11.204418 14.357952 -15.215469 -38.76097 14.419889 ) (28.258647 3.1988945 -24.403022 -0.795579792 23.657165 -4.80662918 ) (15.6842098 -4.17232513E-7 -0.745855928 -5.60220909 28.1323 4.80662918 ) (29.004505 -3.19889498 27.386447 -0.795579315 -46.186386 -14.419889 ) (33.29776 -11.20442 -18.799942 -15.215469 6.61326218 -1.12706756 ) (17.804447 -26.983425 -12.1866798 -16.3425369 1.73335075 12.928171 ) (6.4844427 -36.861877 -10.453329 -3.41436482 10.453329 3.41436482 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 150Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:17:17) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((81 0) (81 0) (81 337)) NIL ((0 -84.25 0 0 0 505.5 ) (0 168.5 0 505.5 0 -505.5 )) NATURAL) (2 ((81 337) (132 337)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((132 337) (132 221)) NIL ((0 -116. 0 0 0 0 )) NATURAL) (11 ((132 221) (159 239) (190 249) (215 254) (244 256) (273 253) (301 245) (321 236) (336 224) (348 208) (355 187)) NIL ((25.419338 19.823307 0 0 9.48395349 -10.939859 ) (30.161315 14.353378 9.48395349 -10.939859 -23.419769 6.69930363 ) (27.935386 6.76317025 -13.9358158 -4.24055577 24.195125 2.14264202 ) (26.097133 3.59393549 10.2593097 -2.09791374 -13.3607387 -3.26987267 ) (29.676075 -0.138914734 -3.10142994 -5.3677864 5.24783802 -1.06315231 ) (29.198562 -6.03827763 2.14640856 -6.4309387 -13.630613 7.5224819 ) (24.529663 -8.7079754 -11.484205 1.09154343 7.27461815 -5.02677727 ) (16.6827659 -10.1298198 -4.2095871 -3.93523455 2.53214359 0.584630490 ) (13.739254 -13.772739 -1.67744326 -3.35060406 -5.40319538 -3.31174469 ) (9.3602123 -18.779216 -7.08063889 -6.66234875 7.08063889 6.66234875 )) NATURAL) (2 ((355 187) (357 0)) NIL ((2. -187. 0 0 0 0 )) NATURAL) (2 ((357 0) (308 0)) NIL ((-49. 0 0 0 0 0 )) NATURAL) (2 ((308 0) (308 166)) NIL ((0 166. 0 0 0 0 )) NATURAL) (9 ((308 166) (302 195) (283 213) (255 220) (232 221) (202 218) (168 211) (142 191) (132 166)) NIL ((-3.2881074 31.25368 0 0 -16.271354 -13.5220909 ) (-11.423784 24.492633 -16.271354 -13.5220909 3.35677528 1.61045646 ) (-26.01675 11.775772 -12.914579 -11.911634 26.844253 7.08026505 ) (-25.5092 3.40427065 13.929674 -4.8313694 -26.733795 0.0684823990 ) (-24.946426 -1.39285707 -12.8041229 -4.762887 8.09094239 4.64580345 ) (-33.705078 -3.83284283 -4.71318054 -0.117083445 12.370027 -18.651691 ) (-32.233245 -13.275772 7.65684796 -18.7687759 14.4289398 15.9609699 ) (-17.361927 -24.064064 22.085788 -2.80780554 -22.085788 2.80780554 )) NATURAL) (2 ((132 166) (132 0)) NIL ((0 -166. 0 0 0 0 )) NATURAL) (2 ((132 0) (81 0)) NIL ((-51. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 151Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:21:40) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((254 210) (254 0)) NIL ((0 -210. 0 0 0 0 )) NATURAL) (2 ((254 0) (304 0)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((304 0) (304 246)) NIL ((0 246. 0 0 0 0 )) NATURAL) (2 ((304 246) (115 246)) NIL ((-189. 0 0 0 0 0 )) NATURAL) (2 ((115 246) (115 210)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((115 210) (254 210)) NIL ((139. 0 0 0 0 0 )) NATURAL)) ((13 ((236 313) (240 329) (251 339) (275 345) (299 339) (310 329) (314 313) (310 297) (299 287) (275 281) (251 287) (240 297) (236 313)) NIL ((2.99777937 17.538459 0 0 6.01332379 -9.2307682 ) (6.00444127 12.9230766 6.01332379 -9.2307682 11.93338 10.1538429 ) (17.984455 8.7692299 17.946704 0.923076273 -17.7468529 -19.384609 ) (27.057731 -6.96629285E-7 0.199850619 -18.461536 -18.945957 19.384613 ) (17.784599 -8.7692299 -18.746109 0.923076988 15.530712 -10.1538448 ) (6.80384827 -12.9230766 -3.21539688 -9.2307682 -7.17690278 9.2307682 ) (-7.15255737E-7 -17.538459 -10.3922996 0 7.17690278 9.2307682 ) (-6.80384827 -12.9230747 -3.2153964 9.2307682 -15.5307159 -10.1538448 ) (-17.784603 -8.7692299 -18.746112 -0.923076749 18.945961 19.384613 ) (-27.057731 6.96629285E-7 0.199851840 18.461536 17.7468529 -19.384613 ) (-17.984455 8.7692299 17.946704 -0.923076988 -11.93338 10.1538448 ) (-6.00444127 12.9230766 6.01332379 9.2307682 -6.01332379 -9.2307682 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 152Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:27:59) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((275 -33) (275 210)) NIL ((0 243. 0 0 0 0 )) NATURAL) (2 ((275 210) (136 210)) NIL ((-139. 0 0 0 0 0 )) NATURAL) (2 ((136 210) (136 246)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((136 246) (325 246)) NIL ((189. 0 0 0 0 0 )) NATURAL) (2 ((325 246) (325 -32)) NIL ((0 -278. 0 0 0 0 )) NATURAL) (13 ((325 -32) (321 -50) (312 -67) (298 -83) (279 -97) (250 -107) (193 -113) (136 -107) (108 -97) (88 -83) (75 -67) (66 -50) (61 -34)) NIL ((-2.93862963 -18.215393 0 0 -6.36822224 1.29237032 ) (-6.12274075 -17.569206 -6.36822224 1.29237032 1.84111404 -0.461851597 ) (-11.5704059 -16.5077629 -4.52710819 0.830518723 -0.996235848 0.555036068 ) (-16.59563 -15.3997268 -5.52334404 1.38555479 2.14382934 4.2417059 ) (-21.047061 -11.89332 -3.37951469 5.62726116 -37.579078 -5.52186203 ) (-43.216117 -9.02698899 -40.958595 0.105398297 40.172508 17.845745 ) (-64.088455 0.00128283351 -0.786086679 17.951145 44.889015 -17.861129 ) (-42.43003 9.021862 44.102935 0.0900126547 -45.728599 5.5987873 ) (-21.191398 11.911268 -1.62566781 5.6888008 12.0254 -4.5340147 ) (-16.804367 15.333061 10.3997326 1.15478539 -8.37299348 0.537271738 ) (-10.591131 16.756481 2.02673769 1.69205713 3.466578 -3.6150713 ) (-6.83110524 16.641002 5.4933157 -1.92301416 -5.4933157 1.92301416 )) NATURAL) (2 ((61 -34) (111 -33)) NIL ((50. 1. 0 0 0 0 )) NATURAL) (9 ((111 -33) (120 -56) (145 -71) (170 -75) (193 -77) (216 -75) (241 -71) (266 -56) (275 -33)) NIL ((4.75 -24.371131 0 0 25.5 8.2268028 ) (17.5 -20.257728 25.5 8.2268028 -31.5 6.86598015 ) (27.249996 -8.59793664 -6. 15.0927829 4.5 -17.690719 ) (23.499996 -2.35051536 -1.49999976 -2.59793806 1.49999952 9.8969059 ) (22.75 -1.58324837E-7 -6.38824957E-8 7.29896927 1.5 -9.8969059 ) (23.5 2.35051536 1.5 -2.59793758 4.49999905 17.690715 ) (27.249996 8.59793855 5.99999905 15.092781 -31.499992 -6.86597634 ) (17.499996 20.257728 -25.499996 8.22680474 25.499996 -8.22680474 )) NATURAL)) ((13 ((296 345) (272 339) (261 329) (257 313) (261 297) (272 287) (296 281) (320 287) (331 297) (335 313) (331 329) (320 339) (296 345)) NIL ((-27.115383 -5.32938576 0 0 18.692306 -4.02368546 ) (-17.7692299 -7.34122849 18.692306 -4.02368546 -15.461536 -3.88156986 ) (-6.80769158 -13.305698 3.23076916 -7.9052553 7.15384579 7.549963 ) (2.38418579E-7 -17.43597 10.3846149 -0.355292022 -7.15384579 9.681715 ) (6.80769253 -12.950405 3.23076868 9.32642365 15.461536 -10.2768306 ) (17.7692299 -8.76239778 18.692306 -0.950407744 -18.692306 19.425609 ) (27.115383 -2.57045030E-7 0 18.475204 -18.692306 -19.425609 ) (17.7692299 8.76239778 -18.692306 -0.950407386 15.461538 10.2768306 ) (6.80769158 12.950407 -3.2307682 9.32642365 -7.15384675 -9.681715 ) (-2.38418579E-7 17.43597 -10.3846149 -0.355291724 7.15384579 -7.549963 ) (-6.80769253 13.305698 -3.23076868 -7.9052553 -15.461536 3.88156986 ) (-17.7692299 7.34122849 -18.692306 -4.02368546 18.692306 4.02368546 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 153Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:32:02) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((73 0) (73 337)) NIL ((0 337. 0 0 0 0 )) NATURAL) (2 ((73 337) (120 337)) NIL ((47. 0 0 0 0 0 )) NATURAL) (2 ((120 337) (120 157)) NIL ((0 -180. 0 0 0 0 )) NATURAL) (2 ((120 157) (165 157)) NIL ((45. 0 0 0 0 0 )) NATURAL) (2 ((165 157) (293 246)) NIL ((128. 89. 0 0 0 0 )) NATURAL) (2 ((293 246) (360 246)) NIL ((67. 0 0 0 0 0 )) NATURAL) (2 ((360 246) (199 136)) NIL ((-161. -110. 0 0 0 0 )) NATURAL) (2 ((199 136) (405 0)) NIL ((206. -136. 0 0 0 0 )) NATURAL) (2 ((405 0) (333 0)) NIL ((-72. 0 0 0 0 0 )) NATURAL) (2 ((333 0) (165 110)) NIL ((-168. 110. 0 0 0 0 )) NATURAL) (2 ((165 110) (120 110)) NIL ((-45. 0 0 0 0 0 )) NATURAL) (2 ((120 110) (120 0)) NIL ((0 -110. 0 0 0 0 )) NATURAL) (2 ((120 0) (73 0)) NIL ((-47. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 154Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:32:50) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((232 0) (232 301)) NIL ((0 301. 0 0 0 0 )) NATURAL) (2 ((232 301) (94 301)) NIL ((-138. 0 0 0 0 0 )) NATURAL) (2 ((94 301) (94 337)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((94 337) (283 337)) NIL ((189. 0 0 0 0 0 )) NATURAL) (2 ((283 337) (283 0)) NIL ((0 -337. 0 0 0 0 )) NATURAL) (2 ((283 0) (232 0)) NIL ((-51. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 155Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 8:39:05) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((31 0) (31 246)) NIL ((0 246. 0 0 0 0 )) NATURAL) (2 ((31 246) (78 246)) NIL ((47. 0 0 0 0 0 )) NATURAL) (2 ((78 246) (78 227)) NIL ((0 -19. 0 0 0 0 )) NATURAL) (9 ((78 227) (88 237) (100 244) (117 250) (153 254) (178 254) (205 250) (225 244) (241 232)) NIL ((9.3958931 10.755245 0 0 3.62463093 -4.53147984 ) (11.20821 8.48950578 3.62463093 -4.53147984 -6.1231556 4.65740013 ) (11.771263 6.286726 -2.49852466 0.125920355 38.867988 -2.09812164 ) (28.706737 5.36358547 36.369468 -1.97220134 -65.348846 -2.26491165 ) (32.401779 2.2589283 -28.979377 -4.237113 42.52742 -0.842230797 ) (24.686119 -2.39930057 13.548048 -5.0793438 -26.76086 5.63383484 ) (24.853736 -4.661726 -13.212812 0.554491878 10.516016 -9.6931133 ) (16.898929 -8.95379258 -2.69679642 -9.13862229 2.69679642 9.13862229 )) NATURAL) (10 ((241 232) (256 241) (274 248) (294 253) (322 255) (358 250) (381 242) (394 231) (403 220) (409 200)) NIL ((14.241657 9.41674615 0 0 4.5500555 -2.50048065 ) (16.516681 8.1665058 4.5500555 -2.50048065 -4.75027752 0.502404452 ) (18.6916 5.91722679 -0.200222254 -1.9980762 8.4510555 0.490862370 ) (22.716903 4.16458225 8.2508335 -1.50721383 6.94605637 -8.46585084 ) (34.440765 -1.57555818 15.1968898 -9.9730663 -36.235282 9.37254716 ) (31.520011 -6.86235047 -21.038398 -0.600517631 11.995113 -5.02434349 ) (16.4791679 -9.9750385 -9.04328538 -5.6248617 6.25482846 10.7248249 ) (10.563299 -10.2374878 -2.78845692 5.09996319 -1.01442861 -19.87495 ) (7.2676277 -15.075002 -3.80288553 -14.77499 3.80288553 14.77499 )) NATURAL) (2 ((409 200) (409 0)) NIL ((0 -200. 0 0 0 0 )) NATURAL) (2 ((409 0) (359 0)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((359 0) (359 190)) NIL ((0 190. 0 0 0 0 )) NATURAL) (9 ((359 190) (355 206) (341 215) (319 219) (294 219) (271 214) (258 205) (252 190) (250 174)) NIL ((-1.83845734 17.571243 0 0 -12.969255 -9.42746545 ) (-8.32308579 12.857509 -12.969255 -9.42746545 4.84628105 5.1373329 ) (-18.869197 5.99871063 -8.1229744 -4.29013253 5.58413029 0.878129960 ) (-24.200107 2.14764309 -2.53884363 -3.41200256 2.81719446 -2.64985275 ) (-25.330356 -2.58928585 0.278350830 -6.0618553 13.147089 3.72128105 ) (-18.478458 -6.79050065 13.4254398 -2.34057426 -7.40555764 -6.23527337 ) (-8.75579835 -12.2487106 6.0198822 -8.5758476 -1.52485275 9.21980859 ) (-3.49834299 -16.214653 4.49502945 0.643961907 -4.49502945 -0.643961907 )) NATURAL) (2 ((250 174) (250 0)) NIL ((0 -174. 0 0 0 0 )) NATURAL) (2 ((250 0) (201 0)) NIL ((-49. 0 0 0 0 0 )) NATURAL) (2 ((201 0) (201 190)) NIL ((0 190. 0 0 0 0 )) NATURAL) (10 ((201 190) (197 206) (183 215) (161 219) (142 220) (122 218) (99 214) (86 205) (80 190) (78 174)) NIL ((-1.95049953 17.560386 0 0 -12.2970028 -9.3623371 ) (-8.09900094 12.879219 -12.2970028 -9.3623371 1.48501777 4.81169033 ) (-19.653495 5.92272759 -10.811985 -4.55064678 18.356933 2.11557484 ) (-21.287014 2.42986774 7.54494954 -2.43507194 -8.9127617 -1.27399206 ) (-18.198444 -0.642200113 -1.36781311 -3.709064 -6.70588303 2.98039245 ) (-22.9192 -2.86106777 -8.07369615 -0.728671313 23.736293 -4.64757633 ) (-19.124748 -5.91352749 15.662597 -5.37624836 -10.23929 -2.39008522 ) (-8.58179666 -12.484817 5.42330647 -7.76633359 -0.779133797 8.20791627 ) (-3.54805756 -16.1471939 4.64417267 0.441583455 -4.64417267 -0.441583455 )) NATURAL) (2 ((78 174) (78 0)) NIL ((0 -174. 0 0 0 0 )) NATURAL) (2 ((78 0) (31 0)) NIL ((-47. 0 0 0 0 0 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.LC2-SF b/lispusers/GACHAE.LC2-SF new file mode 100644 index 00000000..2b113cd5 --- /dev/null +++ b/lispusers/GACHAE.LC2-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 156Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:03:06) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((81 0) (81 0) (81 246)) NIL ((0 -61.5 0 0 0 369. ) (0 123. 0 369. 0 -369. )) NATURAL) (2 ((81 246) (132 246)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((132 246) (132 231)) NIL ((0 -15. 0 0 0 0 )) NATURAL) (12 ((132 231) (146 239) (165 247) (188 252) (219 255) (244 255) (273 253) (301 245) (321 236) (336 224) (348 208) (355 187)) NIL ((12.757387 7.8082018 0 0 7.45567608 1.15078807 ) (16.4852218 8.3835945 7.45567608 1.15078807 -7.2783804 -5.75393963 ) (20.301708 6.65741254 0.177295416 -4.60315228 15.657846 3.86497593 ) (28.30793 3.9867487 15.835142 -0.738176108 -31.353008 -3.705966 ) (28.466568 1.39558935 -15.517866 -4.44414234 25.754188 4.95888996 ) (25.825794 -0.569107771 10.236322 0.514747978 -11.6637478 -10.1295967 ) (30.230243 -5.11915779 -1.42742538 -9.6148491 -9.09919549 11.5594978 ) (24.253219 -8.95425797 -10.5266208 1.94464874 6.0605383 -6.10839368 ) (16.756866 -10.0638065 -4.46608258 -4.16374493 2.85703802 0.874077321 ) (13.719303 -13.790512 -1.60904455 -3.2896676 -5.48869324 -3.38791514 ) (9.36591149 -18.774135 -7.09773827 -6.67758275 7.09773827 6.67758275 )) NATURAL) (2 ((355 187) (357 0)) NIL ((2. -187. 0 0 0 0 )) NATURAL) (2 ((357 0) (308 0)) NIL ((-49. 0 0 0 0 0 )) NATURAL) (2 ((308 0) (308 176)) NIL ((0 176. 0 0 0 0 )) NATURAL) (11 ((308 176) (307 191) (295 205) (275 215) (247 219) (223 220) (197 219) (168 215) (149 205) (137 191) (132 176)) NIL ((1.54838872 15.082872 0 0 -15.2903328 -0.497237682 ) (-6.09677697 14.834253 -15.2903328 -0.497237682 10.4516639 -3.51381159 ) (-16.161277 12.5801086 -4.83866883 -4.01104927 -8.5163231 -3.44751453 ) (-25.258106 6.84530354 -13.3549919 -7.4585638 23.613628 5.30386734 ) (-26.806285 2.03867388 10.258636 -2.15469599 -13.938192 0.232043981 ) (-23.516746 -7.96280801E-8 -3.67955732 -1.922652 -3.86084795 -0.232043504 ) (-29.126728 -2.03867388 -7.54040528 -2.15469551 23.381584 -5.3038683 ) (-24.976337 -6.84530354 15.8411789 -7.4585638 -11.665493 3.44751453 ) (-14.9679069 -12.58011 4.17568493 -4.01104927 5.28039456 3.51381159 ) (-8.1520252 -14.834253 9.45607949 -0.497237623 -9.45607949 0.497237623 )) NATURAL) (2 ((132 176) (132 0)) NIL ((0 -176. 0 0 0 0 )) NATURAL) (2 ((132 0) (81 0)) NIL ((-51. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 157Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:07:04) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((29 ((220 253) (184 250) (150 243) (111 227) (90 209) (72 184) (61 148) (58 124) (61 100) (72 64) (90 39) (111 21) (148 3) (184 -4) (220 -7) (256 -4) (292 3) (330 21) (351 39) (369 64) (379 100) (382 124) (379 148) (369 184) (351 209) (330 227) (291 243) (256 250) (220 253)) NIL ((-37.23284 -2.5527296 0 0 7.3970537 -2.68362236 ) (-33.534309 -3.89454079 7.3970537 -2.68362236 -24.985267 -10.581888 ) (-38.629898 -11.869106 -17.5882149 -13.26551 50.544029 15.0111789 ) (-30.94609 -17.629028 32.955818 1.74566984 -39.190887 -7.4628372 ) (-17.58572 -19.614776 -6.23507023 -5.71716786 16.219528 -15.159822 ) (-15.711023 -32.911857 9.9844608 -20.876991 -1.68723678 44.102119 ) (-6.5701809 -31.737785 8.29722405 23.225132 -3.47058487 -23.24868 ) (-0.00824896433 -20.136993 4.82663918 -0.0235491991 3.56957626 -23.107383 ) (6.60317803 -31.714237 8.39621545 -23.130935 1.19228363 43.67823 ) (15.595535 -33.00605 9.58849908 20.547298 -14.338714 -13.6055526 ) (18.014675 -19.261531 -4.75021649 6.9417448 32.162574 -13.256025 ) (29.345752 -18.947799 27.412365 -6.31428147 -36.311607 24.629661 ) (38.60231 -12.94725 -8.8992462 18.31538 11.083864 -19.26263 ) (35.244995 -4.26318646 2.18461943 -0.947252036 -2.02385092 10.4208755 ) (36.417686 4.37721610E-7 0.160768091 9.47362519 -2.98846006 -10.420877 ) (35.084228 4.26318646 -2.82769203 -0.947252989 13.977691 19.262634 ) (39.245384 12.947252 11.1499996 18.3153839 -40.922302 -24.629665 ) (29.93423 18.947799 -29.772304 -6.31428147 35.711525 13.256027 ) (18.017688 19.261531 5.93922329 6.94174576 -17.923809 13.6055526 ) (14.995006 33.00605 -11.9845867 20.547298 5.98371315 -43.67823 ) (6.00227643 31.714233 -6.00087357 -23.130935 -0.0110425949 23.107383 ) (-0.00411796570 20.136993 -6.01191617 -0.0235481784 0.0604562759 23.24868 ) (-5.9858074 31.737785 -5.95145989 23.225132 -6.23077584 -44.102119 ) (-15.052654 32.91185 -12.1822357 -20.876987 18.86264 15.159818 ) (-17.803569 19.614776 6.68040753 -5.7171688 -39.219795 7.46283913 ) (-30.733062 17.629028 -32.53939 1.74567079 48.016555 -15.0111828 ) (-39.264167 11.869106 15.4771709 -13.265512 -20.846462 10.58189 ) (-34.210235 3.8945403 -5.36929226 -2.6836214 5.36929226 2.6836214 )) NATURAL)) ((21 ((244 28) (221 26) (196 28) (160 36) (138 47) (117 71) (106 124) (117 177) (138 201) (160 212) (196 220) (221 221) (244 220) (280 212) (303 201) (324 177) (334 124) (324 71) (303 47) (280 36) (244 28)) NIL ((-31.346866 -4.94781018 27.096454 7.89321995 -31.20816 -5.99279499 ) (-19.854492 -0.0509881154 -4.11170769 1.90042472 -18.537914 6.6046543 ) (-33.235153 5.1517639 -22.649623 8.50507928 51.359825 -8.4258213 ) (-30.204864 9.44393159 28.7102 0.0792564750 -36.90139 9.0986347 ) (-19.945362 14.0725078 -8.19119454 9.17789269 18.245773 32.031272 ) (-19.013671 39.266037 10.0545787 41.209167 17.918293 -41.223762 ) (5.46798110E-5 59.863327 27.972873 -0.0145962312 -17.918949 -41.136184 ) (19.01345 39.280632 10.0539245 -41.150787 -18.242496 31.768524 ) (19.946128 14.014112 -8.18857194 -9.38226129 36.88893 10.062099 ) (30.202026 9.6629028 28.700363 0.679839969 -51.313247 -12.016935 ) (33.245758 4.33427334 -22.612884 -11.337097 18.364067 14.005647 ) (19.81491 1.11246481E-6 -4.24881554 2.66855192 31.85696 -14.005661 ) (31.494579 -4.33427906 27.608146 -11.33711 -55.791923 12.0170059 ) (31.206764 -9.66288568 -28.183776 0.679895640 35.31073 -10.062366 ) (20.678356 -14.014175 7.1269579 -9.38247109 -19.451011 -31.767528 ) (18.079803 -39.28041 -12.3240547 -41.15 -11.506668 41.132476 ) (0.00241565704 -59.864166 -23.830722 -0.0175195671 11.477674 41.237594 ) (-18.0894699 -39.262886 -12.353048 41.220077 19.59597 -32.08287 ) (-20.644531 -14.084251 7.24292184 9.1372032 -35.861557 -8.9060955 ) (-31.332393 -9.4000969 -28.618637 0.231106251 57.850273 7.70726395 )) PSEUDOCYCLIC)))) ((FAMILY gacha) (CHARACTER 160Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:12:38) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((73 246) (73 -98)) NIL ((0 -344. 0 0 0 0 )) NATURAL) (2 ((73 -98) (122 -98)) NIL ((49. 0 0 0 0 0 )) NATURAL) (2 ((122 -98) (122 19)) NIL ((0 117. 0 0 0 0 )) NATURAL) (19 ((122 19) (152 6) (186 -2) (223 -6) (274 -2) (306 10) (330 24) (346 42) (358 66) (367 124) (358 182) (346 206) (330 224) (306 238) (274 250) (223 254) (186 250) (149 241) (122 229)) NIL ((28.78485 -14.1662578 0 0 7.29088879 6.99755765 ) (32.43029 -10.6674785 7.29088879 6.99755765 -12.4544449 -4.9877901 ) (33.493957 -6.1638174 -5.1635561 2.00976705 36.526893 6.95360566 ) (46.593849 -0.677247048 31.363338 8.96337319 -67.653137 1.17336273 ) (44.130615 8.87280656 -36.28981 10.1367359 36.0857 -11.6470565 ) (25.883659 13.186014 -0.204107195 -1.51032066 -10.689651 9.4148655 ) (20.334728 16.383125 -10.8937587 7.90454579 6.67289925 -14.012405 ) (12.777418 17.281471 -4.22085953 -6.10786057 7.9980583 58.63475 ) (12.5555877 40.490989 3.77719927 52.526893 -32.66513 -52.526634 ) (2.22682952E-4 66.75456 -28.887935 2.57580541E-4 32.662468 -52.528175 ) (-12.556476 40.49073 3.77453518 -52.527923 -7.98474026 58.639366 ) (-12.7743129 17.282493 -4.21020508 6.11144925 -6.72350693 -14.029323 ) (-20.346271 16.37928 -10.933712 -7.91787434 10.8787708 9.4779205 ) (-25.840599 13.2003688 -0.0549402982 1.56004619 -36.791572 -11.8823547 ) (-44.291328 8.81923677 -36.846519 -10.322309 70.28755 2.05150032 ) (-45.99407 -0.477321923 33.441032 -8.27080918 -46.358634 3.67635918 ) (-35.73236 -6.9099512 -12.917608 -4.59445 31.147007 1.24306249 ) (-33.076461 -10.8828697 18.2294 -3.3513875 -18.2294 3.3513875 )) NATURAL) (2 ((122 229) (122 246)) NIL ((0 17. 0 0 0 0 )) NATURAL) (2 ((122 246) (73 246)) NIL ((-49. 0 0 0 0 0 )) NATURAL)) ((11 ((121 124) (124 162) (136 195) (162 214) (196 220) (222 222) (244 220) (279 214) (304 195) (316 162) (319 124)) NIL ((1.40951395 38.569053 0 0 9.54291535 -3.41436482 ) (6.1809721 36.861877 9.54291535 -3.41436482 6.28541756 -12.9281749 ) (18.866596 26.983425 15.8283329 -16.34254 -4.68458176 1.12707138 ) (32.352638 11.204418 11.143751 -15.215469 -23.547092 14.419889 ) (31.722843 3.1988945 -12.403341 -0.795579792 2.87295532 -4.80662918 ) (20.755977 -4.17232513E-7 -9.53038598 -5.60220909 36.055267 4.80662918 ) (29.25323 -3.19889498 26.524887 -0.795579315 -45.094047 -14.419889 ) (33.231086 -11.20442 -18.569164 -15.215469 6.32094384 -1.12706756 ) (17.822395 -26.983425 -12.24822 -16.3425369 1.81027794 12.928171 ) (6.47931386 -36.861877 -10.437942 -3.41436482 10.437942 3.41436482 )) NATURAL) (11 ((319 124) (316 86) (304 53) (279 34) (244 28) (222 26) (196 28) (162 34) (136 53) (124 86) (121 124)) NIL ((-1.26034259 -38.569053 0 0 -10.437944 3.41436482 ) (-6.4793148 -36.861877 -10.437944 3.41436482 -1.81027794 12.9281749 ) (-17.822395 -26.983425 -12.248222 16.34254 -6.32094193 -1.12707138 ) (-33.231086 -11.204418 -18.569164 15.215469 45.094047 -14.419889 ) (-29.25323 -3.1988945 26.524887 0.795579792 -36.055267 4.80662918 ) (-20.755977 4.17232513E-7 -9.53038598 5.60220909 -2.87295532 -4.80662918 ) (-31.722843 3.19889498 -12.403341 0.795579315 23.547092 14.419889 ) (-32.352638 11.20442 11.143753 15.215469 4.68457794 1.12706756 ) (-18.866596 26.983425 15.828331 16.3425369 -6.28541566 -12.928171 ) (-6.18097115 36.861877 9.54291535 3.41436482 -9.54291535 -3.41436482 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 161Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:19:54) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((367 -98) (319 -98)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (2 ((319 -98) (319 19)) NIL ((0 117. 0 0 0 0 )) NATURAL) (19 ((319 19) (288 7) (255 -1) (217 -6) (166 -2) (134 9) (111 24) (94 42) (82 66) (73 124) (82 182) (94 206) (111 224) (134 239) (166 250) (217 254) (255 250) (292 241) (319 229)) NIL ((-30.485801 -12.997631 0 0 -3.08518171 5.9857931 ) (-32.028389 -10.004734 -3.08518171 5.9857931 3.42590904 -5.92896652 ) (-33.400619 -6.98342515 0.340727687 0.0568262711 -28.618454 11.7300739 ) (-47.369117 -1.06156039 -28.277729 11.786901 63.04792 -4.99134159 ) (-44.122886 8.22966958 34.770195 6.79555989 -31.57326 -3.76470089 ) (-25.13932 13.142879 3.19693089 3.03085899 3.24514675 2.05014229 ) (-20.319816 17.19881 6.44207764 5.08100128 0.592679024 -10.435867 ) (-13.5813999 17.061878 7.03475667 -5.35486698 -11.6158619 57.693328 ) (-12.354574 40.553672 -4.58110619 52.338462 33.870765 -52.337432 ) (-2.96272337E-4 66.723404 29.289665 0.00102418940 -33.867218 -52.34358 ) (12.3557586 40.552642 -4.5775528 -52.342559 11.5981006 57.711776 ) (13.577257 17.065979 7.0205488 5.36921883 -0.525197029 -10.503532 ) (20.335208 17.183429 6.4953518 -5.13431454 -3.49731016 2.30235624 ) (25.081905 13.200292 2.99804163 -2.83195829 32.514434 -4.7058897 ) (44.337165 8.0153904 35.51248 -7.53784848 -66.560455 -1.47879696 ) (46.56941 -0.261858106 -31.047985 -9.01664544 41.727447 4.62108517 ) (36.385154 -6.9679613 10.679462 -4.39556027 -28.349323 0.994450570 ) (32.889953 -10.8662967 -17.66986 -3.4011097 17.66986 3.4011097 )) NATURAL) (2 ((319 229) (319 246)) NIL ((0 17. 0 0 0 0 )) NATURAL) (2 ((319 246) (367 246)) NIL ((48. 0 0 0 0 0 )) NATURAL) (2 ((367 246) (367 -98)) NIL ((0 -344. 0 0 0 0 )) NATURAL)) ((11 ((319 124) (316 162) (304 195) (279 214) (244 220) (220 222) (196 220) (162 214) (136 195) (124 162) (121 124)) NIL ((-1.27691745 38.569053 0 0 -10.338495 -3.41436482 ) (-6.44616604 36.861877 -10.338495 -3.41436482 -2.307518 -12.9281749 ) (-17.938419 26.983425 -12.646013 -16.34254 -4.43143654 1.12707138 ) (-32.800148 11.204418 -17.077449 -15.215469 38.03327 14.419889 ) (-30.860965 3.1988945 20.955825 -0.795579792 -21.701679 -4.80662918 ) (-20.755977 -4.17232513E-7 -0.745855928 -5.60220909 -17.226543 4.80662918 ) (-30.115108 -3.19889498 -17.9724 -0.795579315 30.607864 -14.419889 ) (-32.783577 -11.20442 12.6354656 -15.215469 2.79507446 -1.12706756 ) (-18.750572 -26.983425 15.43054 -16.3425369 -5.78817559 12.928171 ) (-6.21412087 -36.861877 9.6423645 -3.41436482 -9.6423645 3.41436482 )) NATURAL) (11 ((121 124) (124 86) (136 53) (162 34) (196 28) (220 26) (244 28) (279 34) (304 53) (316 86) (319 124)) NIL ((1.39293909 -38.569053 0 0 9.6423645 3.41436482 ) (6.21412087 -36.861877 9.6423645 3.41436482 5.78817749 12.9281749 ) (18.750572 -26.983425 15.430542 16.34254 -2.79507828 -1.12707138 ) (32.783577 -11.204418 12.6354637 15.215469 -30.607864 -14.419889 ) (30.115108 -3.1988945 -17.9724 0.795579792 17.226543 4.80662918 ) (20.755977 4.17232513E-7 -0.745855928 5.60220909 21.701679 -4.80662918 ) (30.860965 3.19889498 20.955825 0.795579315 -38.03327 14.419889 ) (32.800148 11.20442 -17.077449 15.215469 4.43143654 1.12706756 ) (17.938419 26.983425 -12.646013 16.3425369 2.3075161 -12.928171 ) (6.44616509 36.861877 -10.338497 3.41436482 10.338497 -3.41436482 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 162Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:24:15) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((94 0) (94 0) (94 246)) NIL ((0 -61.5 0 0 0 369. ) (0 123. 0 369. 0 -369. )) NATURAL) (2 ((94 246) (146 246)) NIL ((52. 0 0 0 0 0 )) NATURAL) (2 ((146 246) (146 231)) NIL ((0 -15. 0 0 0 0 )) NATURAL) (11 ((146 231) (172 241) (200 250) (226 254) (258 256) (286 253) (315 245) (334 236) (349 224) (361 208) (369 187)) NIL ((25.179721 9.92842675 0 0 4.92166043 0.429432392 ) (27.640552 10.1431427 4.92166043 0.429432392 -12.608301 -8.14716149 ) (26.25806 6.49899483 -7.6866417 -7.71772957 21.51155 8.15921594 ) (29.327194 2.8608737 13.824909 0.441486776 -25.4379 -6.48970318 ) (30.43315 0.0575087815 -11.612993 -6.04821683 20.240062 -0.200402260 ) (28.940189 -6.090909 8.62707139 -6.24861909 -25.522361 7.29131127 ) (24.806079 -8.69387246 -16.89529 1.04269218 15.849386 -4.96484089 ) (15.835481 -10.1336 -1.04590392 -3.92214918 -1.87518859 0.568055630 ) (13.851984 -13.7717228 -2.9210925 -3.35409355 -2.34863329 -3.30738258 ) (9.7565746 -18.779506 -5.2697258 -6.66147614 5.2697258 6.66147614 )) NATURAL) (2 ((369 187) (370 169)) NIL ((1. -18. 0 0 0 0 )) NATURAL) (2 ((370 169) (321 169)) NIL ((-49. 0 0 0 0 0 )) NATURAL) (10 ((321 169) (319 191) (307 205) (288 215) (259 220) (235 221) (209 219) (178 212) (155 193) (146 160)) NIL ((0.395535767 23.935108 0 0 -14.3732147 -11.6106548 ) (-6.79107094 18.129779 -14.3732147 -11.6106548 11.8660736 10.053274 ) (-15.2312488 11.545763 -2.50714111 -1.55738067 -15.091079 -4.60244179 ) (-25.283931 7.68716145 -17.59822 -6.15982247 30.498256 2.35649347 ) (-27.633022 2.70558596 12.9000358 -3.80332899 -16.901958 1.1764698 ) (-23.183967 -0.509507895 -4.00192356 -2.62685919 -4.89041806 -1.06237459 ) (-29.631099 -3.66755486 -8.8923416 -3.68923378 18.46363 -8.9269695 ) (-29.291626 -11.820274 9.57129098 -12.616203 9.03588296 -5.22974015 ) (-15.20239 -27.051349 18.6071739 -17.845943 -18.6071739 17.845943 )) NATURAL) (2 ((146 160) (146 0)) NIL ((0 -160. 0 0 0 0 )) NATURAL) (2 ((146 0) (94 0)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 163Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:34:01) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((25 ((351 186) (346 202) (336 220) (306 238) (265 250) (223 254) (183 252) (148 246) (120 234) (106 222) (94 204) (90 183) (96 165) (121 142) (175 120) (226 103) (277 85) (295 58) (281 32) (238 25) (210 26) (171 31) (138 42) (122 59) (117 73)) NIL ((-4.89096356 15.5457267 0 0 -0.654214859 2.72563505 ) (-5.21807099 16.908542 -0.654214859 2.72563505 -26.728923 -1.62817669 ) (-19.236747 18.820091 -27.38314 1.09745836 17.569915 -8.21292687 ) (-37.83493 15.811084 -9.8132229 -7.11546899 10.4492588 -1.52011108 ) (-42.423522 7.9355602 0.636036754 -8.63558007 0.633041024 2.29337406 ) (-41.470962 0.446667433 1.26907777 -6.342206 5.0185728 4.34661293 ) (-37.692596 -3.72223234 6.28765107 -1.99559283 -2.70733642 -7.67982579 ) (-32.758613 -9.55773736 3.58031464 -9.67541886 17.810775 14.372688 ) (-20.272914 -12.046812 21.39109 4.69726944 -26.535766 -13.81093 ) (-12.1497097 -14.2550087 -5.1446762 -9.1136608 16.3322868 4.87103844 ) (-9.1282406 -20.933151 11.187612 -4.24262238 -2.79339218 12.326774 ) (0.662676096 -19.012386 8.39422036 8.0841522 6.8412819 -18.178138 ) (12.477537 -20.017303 15.235502 -10.0939865 29.428268 12.385782 ) (42.427177 -23.918396 44.663772 2.2917962 -64.554397 4.63500405 ) (54.81375 -19.309097 -19.890628 6.92680073 36.789367 -6.92580319 ) (53.3178 -15.845199 16.8987388 9.97102587E-4 -64.603057 -12.9317836 ) (37.915008 -22.310096 -47.704322 -12.930788 23.622894 10.6529445 ) (2.02213144 -29.914409 -24.081428 -2.27784204 -23.888504 30.319995 ) (-34.003547 -17.032253 -47.969932 28.042156 89.931106 -23.932937 ) (-37.007927 -0.956568003 41.961174 4.10921669 -71.835937 -0.588241577 ) (-30.964725 2.85852814 -29.874763 3.52097511 41.412643 2.28590584 ) (-40.133163 7.52245618 11.5378837 5.80688095 8.1853447 3.44461632 ) (-24.502605 15.051645 19.723228 9.25149728 -8.15403558 -16.064369 ) (-8.8563976 16.2709579 11.5691928 -6.81287385 -11.5691928 6.81287385 )) NATURAL) (2 ((117 73) (72 73)) NIL ((-45. 0 0 0 0 0 )) NATURAL) (24 ((72 73) (85 42) (112 15) (144 1) (183 -7) (222 -8) (261 -7) (296 0) (325 13) (349 37) (355 66) (348 95) (330 114) (292 131) (238 148) (187 165) (151 184) (156 213) (188 221) (213 223) (241 221) (277 214) (297 202) (303 186)) NIL ((9.47211839 -31.218654 0 0 21.167285 1.31194877 ) (20.055763 -30.562683 21.167285 1.31194877 -21.836437 17.440254 ) (30.304828 -20.530601 -0.669154763 18.752204 12.1784839 -17.072986 ) (35.724914 -10.3148918 11.5093307 1.67921805 -14.877496 8.8516998 ) (39.795494 -4.20982266 -3.3681674 10.530918 5.33150673 -12.3338146 ) (39.093078 0.154187590 1.96334004 -1.80289674 -6.4485321 10.483564 ) (37.832153 3.59307385 -4.4851923 8.68066789 -3.53737736 -5.60044766 ) (31.578277 9.47351838 -8.02256967 3.08022022 8.59804345 11.918224 ) (27.854728 18.512851 0.575473786 14.998445 -24.854797 -12.0724487 ) (16.0028 27.47507 -24.279323 2.9259963 12.821157 0.371571064 ) (-1.86594367 30.586853 -11.458166 3.29756737 3.57016087 -19.413829 ) (-11.539028 24.177501 -7.88800526 -16.116264 -15.101804 17.28376 ) (-26.977935 16.703121 -22.98981 1.16749811 2.83706665 -1.72122335 ) (-48.549217 17.0100059 -20.152744 -0.553725243 27.753543 1.6011281 ) (-54.825187 17.256843 7.6008024 1.04740286 0.148731231 -4.68328858 ) (-47.150016 15.962604 7.74953366 -3.63588619 43.651519 29.132022 ) (-17.574722 26.89273 51.401054 25.496139 -18.754821 -63.84481 ) (24.448917 20.466461 32.646232 -38.34867 -52.632209 40.247222 ) (30.779045 2.24140549 -19.985977 1.89855599 25.283653 -7.1441021 ) (23.434894 0.567910671 5.297678 -5.24554634 11.497587 0.329174995 ) (34.48136 -4.51304817 16.795265 -4.91637135 -41.274002 -0.172595977 ) (30.639629 -9.51571656 -24.478736 -5.08896733 9.598423 0.361209869 ) (10.9601039 -14.4240799 -14.8803138 -4.72775746 14.8803138 4.72775746 )) NATURAL) (2 ((303 186) (351 186)) NIL ((48. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 164Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:41:54) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((215 316) (169 316)) NIL ((-46. 0 0 0 0 0 )) NATURAL) (2 ((169 316) (169 246)) NIL ((0 -70. 0 0 0 0 )) NATURAL) (2 ((169 246) (73 246)) NIL ((-96. 0 0 0 0 0 )) NATURAL) (2 ((73 246) (73 210)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((73 210) (169 210)) NIL ((96. 0 0 0 0 0 )) NATURAL) (2 ((169 210) (169 60)) NIL ((0 -150. 0 0 0 0 )) NATURAL) (11 ((169 60) (175 39) (189 20) (205 7) (229 -3) (268 -9) (316 -6) (346 3) (367 20) (381 38) (388 69)) NIL ((3.90507937 -21.153274 0 0 12.5695228 0.919651986 ) (10.18984 -20.693447 12.5695228 0.919651986 -14.847616 7.40174008 ) (15.335556 -16.072925 -2.27809334 8.32139207 10.8209438 -6.526618 ) (18.467933 -11.014843 8.5428505 1.79477358 7.56383896 0.704737187 ) (30.792705 -8.86770059 16.106689 2.49951076 0.923694611 9.7076702 ) (47.361244 -1.51435375 17.030384 12.2071819 -47.258613 -9.53542138 ) (40.762313 5.92511654 -30.228233 2.67175913 26.110794 10.434017 ) (23.589481 13.8138847 -4.1174364 13.1057777 -3.1845789 -20.200649 ) (17.879753 16.8193359 -7.3020153 -7.09487343 -1.37248039 28.368587 ) (9.89149858 23.90876 -8.6744957 21.273715 8.6744957 -21.273715 )) NATURAL) (2 ((388 69) (340 69)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (8 ((340 69) (337 47) (325 33) (303 27) (272 25) (245 29) (222 40) (215 60)) NIL ((-1.11267614 -23.621776 0 0 -11.323942 9.73067666 ) (-6.7746477 -18.756439 -11.323942 9.73067666 2.61971664 -0.653385163 ) (-16.78873 -9.35245515 -8.70422555 9.0772915 -5.1549282 -7.1171398 ) (-28.070419 -3.83373404 -13.8591537 1.96015119 23.999996 5.12195015 ) (-29.929576 0.687392831 10.140844 7.0821018 -12.8450699 -1.37066269 ) (-26.211265 7.08416367 -2.70422554 5.71143914 27.380279 6.3607006 ) (-15.225351 15.975952 24.676055 12.0721397 -24.676055 -12.0721397 )) NATURAL) (2 ((215 60) (215 210)) NIL ((0 150. 0 0 0 0 )) NATURAL) (2 ((215 210) (334 210)) NIL ((119. 0 0 0 0 0 )) NATURAL) (2 ((334 210) (334 246)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((334 246) (215 246)) NIL ((-119. 0 0 0 0 0 )) NATURAL) (2 ((215 246) (215 316)) NIL ((0 70. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 165Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:50:36) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((3 ((367 0) (367 0) (367 246)) NIL ((0 -61.5 0 0 0 369. ) (0 123. 0 369. 0 -369. )) NATURAL) (2 ((367 246) (316 246)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (2 ((316 246) (316 90)) NIL ((0 -156. 0 0 0 0 )) NATURAL) (9 ((316 90) (308 59) (278 39) (243 30) (222 29) (196 29) (161 33) (132 49) (123 90)) NIL ((-2.74641037 -33.309829 0 0 -31.521537 13.858984 ) (-18.507179 -26.380336 -31.521537 13.858984 25.607692 -3.29491997 ) (-37.224868 -14.1688137 -5.91384316 10.564064 31.090755 -0.679307938 ) (-27.593334 -3.94440317 25.176914 9.8847561 -35.970726 -11.987848 ) (-20.401783 -0.0535713807 -10.7938156 -2.10309267 -1.20783996 6.63070584 ) (-31.799518 1.1586895 -12.001655 4.52761364 16.802093 3.46502209 ) (-35.400123 7.41881467 4.80043888 7.9926357 23.99945 27.5092 ) (-18.599964 29.166053 28.799892 35.501838 -28.799892 -35.501838 )) NATURAL) (2 ((123 90) (123 246)) NIL ((0 156. 0 0 0 0 )) NATURAL) (2 ((123 246) (75 246)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (2 ((75 246) (76 59)) NIL ((1. -187. 0 0 0 0 )) NATURAL) (11 ((76 59) (82 35) (96 18) (114 5) (141 -4) (175 -8) (204 -9) (235 -6) (258 -1) (277 7) (316 23)) NIL ((4.01473713 -25.642467 0 0 11.911575 9.85482026 ) (9.9705238 -20.715057 11.911575 9.85482026 -11.5578765 -7.27410126 ) (16.1031608 -14.497289 0.353697181 2.58071852 10.3199367 1.24158621 ) (21.616828 -11.295776 10.673635 3.82230473 0.278120041 2.30775452 ) (32.429519 -6.31959534 10.951755 6.13005925 -23.432415 -4.47259999 ) (31.665069 -2.42583704 -12.480661 1.65745854 21.451553 3.5826478 ) (29.910186 1.02294540 8.97089387 5.24010659 -20.373809 -3.85799217 ) (28.694175 4.3340559 -11.4029178 1.38211417 0.0436954498 -0.150678157 ) (17.313106 5.640831 -11.359222 1.23143601 44.199028 10.4607029 ) (28.053398 12.102619 32.839805 11.6921405 -32.839805 -11.6921405 )) NATURAL) (2 ((316 23) (316 0)) NIL ((0 -23. 0 0 0 0 )) NATURAL) (2 ((316 0) (367 0)) NIL ((51. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 166Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:55:45) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((55 246) (195 0)) NIL ((140. -246. 0 0 0 0 )) NATURAL) (2 ((195 0) (242 0)) NIL ((47. 0 0 0 0 0 )) NATURAL) (2 ((242 0) (382 246)) NIL ((140. 246. 0 0 0 0 )) NATURAL) (2 ((382 246) (328 246)) NIL ((-54. 0 0 0 0 0 )) NATURAL) (2 ((328 246) (219 41)) NIL ((-109. -205. 0 0 0 0 )) NATURAL) (2 ((219 41) (110 246)) NIL ((-109. 205. 0 0 0 0 )) NATURAL) (2 ((110 246) (55 246)) NIL ((-55. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 167Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 9:57:51) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((25 246) (124 0)) NIL ((99. -246. 0 0 0 0 )) NATURAL) (2 ((124 0) (175 0)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((175 0) (219 146)) NIL ((44. 146. 0 0 0 0 )) NATURAL) (2 ((219 146) (262 0)) NIL ((43. -146. 0 0 0 0 )) NATURAL) (2 ((262 0) (313 0)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((313 0) (412 246)) NIL ((99. 246. 0 0 0 0 )) NATURAL) (2 ((412 246) (361 246)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (2 ((361 246) (286 62)) NIL ((-75. -184. 0 0 0 0 )) NATURAL) (2 ((286 62) (237 246)) NIL ((-49. 184. 0 0 0 0 )) NATURAL) (2 ((237 246) (201 246)) NIL ((-36. 0 0 0 0 0 )) NATURAL) (2 ((201 246) (151 62)) NIL ((-50. -184. 0 0 0 0 )) NATURAL) (2 ((151 62) (77 246)) NIL ((-74. 184. 0 0 0 0 )) NATURAL) (2 ((77 246) (25 246)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 170Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 10:01:04) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((76 246) (190 139)) NIL ((114. -107. 0 0 0 0 )) NATURAL) (2 ((190 139) (43 0)) NIL ((-147. -139. 0 0 0 0 )) NATURAL) (2 ((43 0) (98 0)) NIL ((55. 0 0 0 0 0 )) NATURAL) (2 ((98 0) (219 109)) NIL ((121. 109. 0 0 0 0 )) NATURAL) (2 ((219 109) (340 0)) NIL ((121. -109. 0 0 0 0 )) NATURAL) (2 ((340 0) (394 0)) NIL ((54. 0 0 0 0 0 )) NATURAL) (2 ((394 0) (248 139)) NIL ((-146. 139. 0 0 0 0 )) NATURAL) (2 ((248 139) (361 246)) NIL ((113. 107. 0 0 0 0 )) NATURAL) (2 ((361 246) (305 246)) NIL ((-56. 0 0 0 0 0 )) NATURAL) (2 ((305 246) (219 164)) NIL ((-86. -82. 0 0 0 0 )) NATURAL) (2 ((219 164) (132 246)) NIL ((-87. 82. 0 0 0 0 )) NATURAL) (2 ((132 246) (76 246)) NIL ((-56. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 171Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 10:03:58) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((67 246) (207 3)) NIL ((140. -243. 0 0 0 0 )) NATURAL) (8 ((207 3) (204 -28) (182 -55) (154 -65) (130 -67) (105 -63) (78 -50) (65 -25)) NIL ((1.58570909 -30.982479 0 0 -27.514255 -0.105117797 ) (-12.171417 -31.035038 -27.514255 -0.105117797 23.571277 24.525589 ) (-27.900032 -18.877357 -3.94297457 24.420471 11.2291298 -19.997249 ) (-26.228443 -4.455513 7.2861557 4.42322159 -8.4878044 1.4634161 ) (-23.186187 0.699416161 -1.20164919 5.88663769 -7.27790929 2.14358997 ) (-28.026794 7.65785027 -8.47955895 8.03022767 31.599445 7.9622154 ) (-20.706626 19.669185 23.119888 15.992443 -23.119888 -15.992443 )) NATURAL) (2 ((65 -25) (18 -25)) NIL ((-47. 0 0 0 0 0 )) NATURAL) (9 ((18 -25) (33 -57) (60 -81) (88 -95) (138 -101) (195 -91) (232 -69) (253 -38) (274 3)) NIL ((11.490978 -33.511222 0 0 21.054122 9.0673771 ) (22.018039 -28.977539 21.054122 9.0673771 -33.270614 2.66310882 ) (26.436855 -18.578605 -12.2164936 11.7304859 46.028343 -7.71980954 ) (37.234535 -10.7080249 33.81185 4.01067639 -24.842777 16.216125 ) (58.625 1.41071462 8.96907235 20.226802 -36.65721 -9.1446972 ) (49.265457 17.065166 -27.688144 11.0821056 9.47165299 -3.63733387 ) (26.31314 26.328605 -18.216491 7.44477177 22.770614 5.69403363 ) (19.481956 36.620391 4.55412293 13.138805 -4.55412293 -13.138805 )) NATURAL) (2 ((274 3) (394 246)) NIL ((120. 243. 0 0 0 0 )) NATURAL) (2 ((394 246) (340 246)) NIL ((-54. 0 0 0 0 0 )) NATURAL) (2 ((340 246) (241 37)) NIL ((-99. -209. 0 0 0 0 )) NATURAL) (2 ((241 37) (122 246)) NIL ((-119. 209. 0 0 0 0 )) NATURAL) (2 ((122 246) (67 246)) NIL ((-55. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 172Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 10:05:23) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((81 246) (369 246)) NIL ((288. 0 0 0 0 0 )) NATURAL) (2 ((369 246) (369 212)) NIL ((0 -34. 0 0 0 0 )) NATURAL) (2 ((369 212) (140 36)) NIL ((-229. -176. 0 0 0 0 )) NATURAL) (2 ((140 36) (378 36)) NIL ((238. 0 0 0 0 0 )) NATURAL) (2 ((378 36) (378 0)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((378 0) (63 0)) NIL ((-315. 0 0 0 0 0 )) NATURAL) (2 ((63 0) (63 34)) NIL ((0 34. 0 0 0 0 )) NATURAL) (2 ((63 34) (292 210)) NIL ((229. 176. 0 0 0 0 )) NATURAL) (2 ((292 210) (81 210)) NIL ((-211. 0 0 0 0 0 )) NATURAL) (2 ((81 210) (81 246)) NIL ((0 36. 0 0 0 0 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.NUM-SF b/lispusers/GACHAE.NUM-SF new file mode 100644 index 00000000..af6370f4 --- /dev/null +++ b/lispusers/GACHAE.NUM-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 60Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 11:56:36) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((29 ((220 -2) (177 2) (142 13) (115 28) (97 49) (87 72) (78 108) (72 169) (78 230) (87 266) (97 289) (115 310) (142 325) (177 336) (220 340) (264 336) (298 325) (325 308) (343 289) (354 266) (363 230) (369 169) (363 108) (354 72) (343 49) (325 28) (298 13) (264 2) (220 -2)) NIL ((-44.70249 2.2971487 0 0 10.2149925 10.2171058 ) (-39.595 7.4057026 10.2149925 10.2171058 -3.07496834 -9.08553506 ) (-30.917491 13.0800399 7.14002419 1.13156938 2.08488273 8.12504388 ) (-22.735023 18.274131 9.2249069 9.25661469 0.735431671 -11.4146518 ) (-13.1424007 21.823421 9.9603386 -2.15803718 -11.0266018 13.533569 ) (-8.695364 26.43217 -1.06626343 11.375532 1.37097907 23.280372 ) (-9.07613755 49.44789 0.304715693 34.655906 17.542682 -34.655075 ) (-7.94418156E-5 66.776245 17.8474 8.27937503E-4 -17.541725 -34.660041 ) (9.07645799 49.447059 0.305675328 -34.659217 -1.37578034 23.295288 ) (8.69424249 26.435485 -1.07010507 -11.3639278 11.044849 13.478868 ) (13.146564 21.810989 9.9747448 2.11494064 -0.803623200 -11.210775 ) (22.719497 18.320545 9.1711216 -9.09583474 -1.83035755 7.36423016 ) (30.97544 12.906824 7.34076405 -1.73160457 2.12505627 -6.24614144 ) (39.37873 8.0521488 9.4658203 -7.977746 -6.6698742 -0.379662514 ) (45.509613 -0.115427330 2.79594612 -8.3574085 -17.445552 1.76478958 ) (39.582786 -7.59044076 -14.649606 -6.59261895 10.452091 -0.679496765 ) (30.159225 -14.522808 -4.19751454 -7.2721157 -6.3628168 6.95319844 ) (22.7803 -18.318321 -10.560331 -0.318916559 2.99917793 -3.13330078 ) (13.7195587 -20.203891 -7.5611534 -3.45221758 6.3660984 -6.4199934 ) (9.34145547 -26.866107 -1.19505500 -9.87221147 1.53642988 -25.186718 ) (8.91461564 -49.331672 0.341374993 -35.058929 -18.5118179 35.166854 ) (7.89556652E-5 -66.807174 -18.170444 0.107930347 18.510856 34.519271 ) (-8.91493608 -49.439598 0.340415239 34.627204 -1.53162884 -23.243984 ) (-9.34033395 -26.434387 -1.19121360 11.3832206 -6.38434506 -13.5433178 ) (-13.723722 -21.822826 -7.57555867 -2.1600976 -2.93098736 11.4172649 ) (-22.764774 -18.274292 -10.506546 9.2571678 6.10829259 -8.12574578 ) (-30.217174 -13.079996 -4.39825344 1.13142156 -9.5021801 9.08572198 ) (-39.366516 -7.40571404 -13.900434 10.217144 13.900434 -10.217144 )) NATURAL)) ((15 ((117 169) (117 139) (120 107) (126 75) (143 52) (165 38) (195 29) (220 28) (245 29) (275 38) (298 52) (314 75) (320 107) (323 139) (323 169)) NIL ((-0.787026048 -29.594802 0 0 4.72215653 -2.43117809 ) (1.57405233 -30.81039 4.72215653 -2.43117809 -5.61078453 0.155890941 ) (3.49081659 -33.16362 -0.888628126 -2.27528715 17.720981 13.807613 ) (11.4626827 -28.535102 16.832355 11.5323276 -17.2731628 -1.38635635 ) (19.658454 -17.695949 -0.440809131 10.145971 15.371683 -8.2621956 ) (26.903488 -11.6810779 14.9308757 1.88377571 -26.213573 10.435146 ) (28.727577 -4.57973004 -11.2826976 12.318922 11.482616 -15.478382 ) (23.186187 1.59256160E-7 0.199920326 -3.15946055 10.283096 15.47838 ) (28.527656 4.57973004 10.4830169 12.31892 -22.615001 -10.435144 ) (27.70317 11.6810779 -12.1319866 1.88377547 8.17691995 8.2621975 ) (19.659645 17.695953 -3.95506573 10.145973 -10.0926818 1.38635444 ) (10.658237 28.535102 -14.047748 11.5323276 14.193815 -13.807615 ) (3.70739698 33.16362 0.146066695 -2.27528763 -4.68258286 -0.155889988 ) (1.51217198 30.81039 -4.53651619 -2.43117761 4.53651619 2.43117761 )) NATURAL) (15 ((323 169) (323 199) (320 231) (314 263) (298 286) (275 300) (245 309) (220 310) (195 309) (165 300) (143 286) (126 263) (120 231) (117 199) (117 169)) NIL ((0.756085992 29.594802 0 0 -4.53651619 2.43117809 ) (-1.51217222 30.81039 -4.53651619 2.43117809 4.6825819 -0.155890941 ) (-3.70739698 33.16362 0.146066278 2.27528715 -14.193813 -13.807613 ) (-10.658239 28.535102 -14.047748 -11.5323276 10.0926818 1.38635635 ) (-19.659645 17.695949 -3.95506573 -10.145971 -8.17691995 8.2621956 ) (-27.70317 11.6810779 -12.1319866 -1.88377571 22.615001 -10.435146 ) (-28.527656 4.57973004 10.4830169 -12.318922 -10.283094 15.478382 ) (-23.186187 -1.59256160E-7 0.199920833 3.15946055 -11.48262 -15.47838 ) (-28.727577 -4.57973004 -11.2826995 -12.31892 26.213577 10.435144 ) (-26.903488 -11.6810779 14.930877 -1.88377547 -15.3716869 -8.2621975 ) (-19.658454 -17.695953 -0.440809786 -10.145973 17.273166 -1.38635444 ) (-11.4626808 -28.535102 16.832359 -11.5323276 -17.720985 13.807615 ) (-3.49081612 -33.16362 -0.888629199 2.27528763 5.61078549 0.155889988 ) (-1.57405209 -30.81039 4.72215653 2.43117761 -4.72215653 -2.43117761 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 61Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 11:58:51) (MADE-FROM gachan.cu 0 140 10 925) (SPLINES ((3 ((124 0) (124 0) (367 0)) NIL ((-60.75 0 0 0 364.5 0 ) (121.5 0 364.5 0 -364.5 0 )) NATURAL) (2 ((367 0) (367 36)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((367 36) (273 36)) NIL ((-94. 0 0 0 0 0 )) NATURAL) (2 ((273 36) (273 337)) NIL ((0 301. 0 0 0 0 )) NATURAL) (2 ((273 337) (210 337)) NIL ((-63. 0 0 0 0 0 )) NATURAL) (2 ((210 337) (78 246)) NIL ((-132. -91. 0 0 0 0 )) NATURAL) (2 ((78 246) (134 246)) NIL ((56. 0 0 0 0 0 )) NATURAL) (2 ((134 246) (220 303)) NIL ((86. 57. 0 0 0 0 )) NATURAL) (2 ((220 303) (220 36)) NIL ((0 -267. 0 0 0 0 )) NATURAL) (2 ((220 36) (124 36)) NIL ((-96. 0 0 0 0 0 )) NATURAL) (2 ((124 36) (124 0)) NIL ((0 -36. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 62Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:24:12) (MADE-FROM gachan.cu 0 140 10 925) (SPLINES ((3 ((367 0) (367 0) (73 0)) NIL ((73.5 0 0 0 -441. 0 ) (-147. 0 -441. 0 441. 0 )) NATURAL) (2 ((73 0) (73 50)) NIL ((0 50. 0 0 0 0 )) NATURAL) (17 ((73 50) (78 70) (90 89) (123 114) (152 134) (189 159) (230 186) (269 212) (303 239) (306 270) (290 291) (260 301) (216 305) (179 301) (155 293) (137 280) (130 264)) NIL ((4.74380017 20.817619 0 0 1.53719520 -4.90571976 ) (5.51239777 18.364757 1.53719520 -4.90571976 34.314018 18.528598 ) (24.206604 22.723339 35.851219 13.622879 -54.793289 -27.208679 ) (32.66117 22.741878 -18.942073 -13.5858 34.85916 24.306118 ) (31.148681 21.309139 15.917087 10.7203178 -12.643362 -10.0157985 ) (40.744087 27.021556 3.27372408 0.704518795 -8.28570748 -2.24291372 ) (39.874954 26.604618 -5.01198483 -1.53839493 9.78619767 0.987456680 ) (39.756073 25.559951 4.77421379 -0.550938249 -48.859077 10.293085 ) (20.100742 30.155559 -44.084869 9.74214746 29.650135 -24.159797 ) (-9.1590557 27.817802 -14.434732 -14.417652 2.25853729 2.34612083 ) (-22.464519 14.573211 -12.176195 -12.071531 -8.6842861 8.77531434 ) (-38.982856 6.8893385 -20.860481 -3.29621697 32.478599 -7.44738007 ) (-43.604034 -0.130568802 11.61812 -10.743597 4.7698803 9.014204 ) (-29.600975 -6.36706353 16.388 -1.729393 -15.558134 -4.60943508 ) (-20.992042 -10.4011745 0.829866291 -6.33882809 15.462663 3.42353535 ) (-12.430843 -15.028234 16.29253 -2.91529274 -16.29253 2.91529274 )) NATURAL) (2 ((130 264) (130 239)) NIL ((0 -25. 0 0 0 0 )) NATURAL) (2 ((130 239) (82 239)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (2 ((82 239) (82 269)) NIL ((0 30. 0 0 0 0 )) NATURAL) (20 ((82 269) (90 291) (105 308) (129 322) (159 331) (216 338) (273 332) (307 320) (331 305) (348 282) (354 247) (341 216) (312 189) (282 167) (246 143) (211 120) (181 101) (149 81) (131 65) (125 43)) NIL ((6.78662205 23.226146 0 0 7.2802677 -7.356884 ) (10.4267559 19.547702 7.2802677 -7.356884 5.5986595 6.78442288 ) (20.506351 15.58303 12.878927 -0.572460413 -17.6749038 -7.78081227 ) (24.547828 11.1201629 -4.79597855 -8.3532734 47.100959 12.3388309 ) (43.30233 8.936306 42.304985 3.9855585 -44.728965 -23.574516 ) (63.242828 1.13460397 -2.42398405 -19.588958 -30.185062 15.959251 ) (45.72631 -10.4747276 -32.609046 -3.62970686 27.469234 1.73749709 ) (26.851886 -13.235687 -5.1398096 -1.89220977 -1.69189834 -4.90924263 ) (20.866127 -17.582519 -6.83170796 -6.80145264 -2.70164585 -12.100521 ) (12.6835956 -30.434234 -9.5333538 -18.901973 -11.501516 29.311332 ) (-2.60051441 -34.680542 -21.03487 10.4093589 0.707698822 -9.14481927 ) (-23.281532 -28.843593 -20.327171 1.26453852 26.670726 7.2679472 ) (-30.273342 -23.945079 6.3435564 8.53248597 -17.390609 -13.926967 ) (-32.62509 -22.376079 -11.047054 -5.39448166 12.891712 6.4399252 ) (-37.226287 -24.550598 1.84465909 1.04544425 7.82375527 6.1672592 ) (-31.469749 -20.421524 9.66841508 7.2127037 -20.186737 -13.108963 ) (-31.894702 -19.763301 -10.5183239 -5.8962593 30.923206 16.2685928 ) (-26.951423 -17.5252609 20.404884 10.372335 -7.50610734 -21.965419 ) (-10.299591 -18.135635 12.898777 -11.593084 -12.898777 11.593084 )) NATURAL) (2 ((125 43) (367 43)) NIL ((242. 0 0 0 0 0 )) NATURAL) (2 ((367 43) (367 0)) NIL ((0 -43. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 63Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:24:51) (MADE-FROM gachan.cu 0 140 10 925) (SPLINES ((2 ((61 99) (111 99)) NIL ((50. 0 0 0 0 0 )) NATURAL) (16 ((111 99) (111 75) (126 51) (153 39) (188 35) (213 34) (238 35) (272 39) (299 48) (319 70) (323 97) (317 126) (304 143) (281 155) (251 161) (226 161)) NIL ((-3.35919046 -23.278705 0 0 20.155143 -4.32776165 ) (6.71838284 -25.442585 20.155143 -4.32776165 -10.775732 21.638805 ) (21.48566 -18.950939 9.3794117 17.311046 4.94778824 -10.2274837 ) (33.338966 -6.7536373 14.3271999 7.0835619 -33.01541 -4.72886086 ) (31.158458 -2.03450584 -18.688217 2.35470104 19.11388 -0.857067586 ) (22.027183 -0.108338594 0.425663412 1.49763345 16.559894 2.15713119 ) (30.732795 2.4678607 16.985561 3.65476465 -31.353477 -1.77145815 ) (32.041618 5.2368965 -14.367916 1.8833065 12.854017 16.928699 ) (24.100711 15.584554 -1.51389813 18.812007 -20.062587 -17.943359 ) (12.555519 25.42488 -21.576488 0.868646980 13.396343 6.8447523 ) (-2.32279682 29.715908 -8.18014527 7.71339989 2.47721863 -27.435646 ) (-9.2643337 23.711479 -5.70292664 -19.722248 -5.30521584 18.89785 ) (-17.619869 13.438158 -11.008142 -0.824397088 0.743648529 -6.1557617 ) (-28.256187 9.53587915 -10.2644939 -6.9801588 20.330616 -0.274801254 ) (-28.355373 2.4183197 10.0661239 -7.25496007 -10.0661239 7.25496007 )) NATURAL) (2 ((226 161) (166 161)) NIL ((-60. 0 0 0 0 0 )) NATURAL) (3 ((166 161) (166 197) (166 197)) NIL ((0 45. 0 0 0 -54. ) (0 18. 0 -54. 0 54. )) NATURAL) (2 ((166 197) (216 197)) NIL ((50. 0 0 0 0 0 )) NATURAL) (15 ((216 197) (241 197) (269 204) (289 217) (298 235) (301 260) (290 283) (268 297) (232 303) (210 303) (187 303) (149 297) (133 286) (125 272) (125 252)) NIL ((23.819458 -1.50491333 0 0 7.08323479 9.02947999 ) (27.361076 3.00982666 7.08323479 9.02947999 -17.416175 -3.14740086 ) (25.736225 10.4656067 -10.332941 5.88207913 -3.4185276 -2.43987894 ) (13.694019 15.127746 -13.751468 3.44220018 13.090288 6.9069147 ) (6.48769475 22.023403 -0.661179662 10.349115 -18.9426269 -13.187776 ) (-3.64480162 25.778629 -19.603809 -2.83866167 14.6802387 -8.1558056 ) (-15.908493 18.862064 -4.92357064 -10.9944687 -21.778327 3.8110094 ) (-31.721229 9.7731018 -26.7019 -7.18345929 54.43308 -1.08823299 ) (-31.206584 2.0455246 27.731185 -8.27169229 -27.954029 12.541927 ) (-17.452415 0.0447963029 -0.222843975 4.27023506 -32.616958 -13.079483 ) (-33.983741 -2.22471094 -32.839805 -8.80924798 74.42189 3.77601147 ) (-29.612598 -9.1459522 41.582084 -5.0332365 -43.07064 3.97543287 ) (-9.56583596 -12.191473 -1.48855781 -1.05780363 13.8606968 -7.6777439 ) (-4.12404633 -17.08815 12.3721389 -8.735548 -12.3721389 8.735548 )) NATURAL) (2 ((125 252) (82 252)) NIL ((-43. 0 0 0 0 0 )) NATURAL) (2 ((82 252) (82 277)) NIL ((0 25. 0 0 0 0 )) NATURAL) (15 ((82 277) (91 294) (108 310) (132 323) (163 332) (213 337) (259 333) (295 323) (321 307) (339 284) (346 254) (342 230) (331 210) (312 190) (294 179)) NIL ((7.3249216 17.1195678 0 0 10.0504665 -0.717417956 ) (12.3501548 16.76086 10.0504665 -0.717417956 -2.25233459 -2.41290998 ) (21.274452 14.836986 7.79813195 -3.13032818 -7.04112816 -1.63093948 ) (25.55202 10.8911876 0.757003189 -4.76126766 30.41685 2.93666792 ) (41.517448 7.59825516 31.173854 -1.8245995 -42.626266 -10.115734 ) (51.378166 0.715788484 -11.452417 -11.940334 2.08823204 7.5262718 ) (40.969863 -7.4614105 -9.36418534 -4.4140625 -1.72665214 -1.98934936 ) (30.742355 -12.8701477 -11.090837 -6.40341187 4.81837368 0.431121826 ) (22.060703 -19.057998 -6.2724638 -5.97229004 -5.5468378 -5.73513413 ) (13.014822 -27.897853 -11.8193016 -11.707424 -0.631027222 22.50941 ) (0.880005479 -28.35057 -12.4503288 10.8019886 8.07095338 -6.3025217 ) (-7.53484727 -20.699844 -4.37937546 4.4994669 -7.65279008 -9.29932405 ) (-15.740617 -20.85004 -12.032165 -4.79985714 16.5402069 19.499816 ) (-19.502677 -15.899986 4.50804138 14.699962 -4.50804138 -14.699962 )) NATURAL) (15 ((294 179) (331 161) (354 138) (364 115) (367 90) (360 61) (339 32) (316 16) (279 3) (216 -2) (159 1) (117 12) (90 28) (72 50) (63 71)) NIL ((39.920318 -16.637714 0 0 -17.5219269 -8.17371179 ) (31.159355 -20.724571 -17.5219269 -8.17371179 3.60964584 10.8685646 ) (15.442251 -23.464 -13.912281 2.6948533 9.08333589 -5.30055332 ) (6.07163716 -23.419422 -4.82894516 -2.60570001 -3.94299126 -1.66635275 ) (-0.728803635 -26.858299 -8.7719364 -4.27205277 -11.3113689 -0.0340318680 ) (-15.156425 -31.147369 -20.083305 -4.30608464 25.188472 25.802475 ) (-22.645492 -22.552211 5.10516835 21.496391 -17.442531 -25.17588 ) (-26.261592 -13.643764 -12.337366 -3.679492 -27.41833 14.9010658 ) (-52.308128 -9.8727226 -39.755699 11.2215747 55.115875 -4.42838192 ) (-64.505874 -0.865339280 15.360178 6.79319287 -1.04520416 2.81245708 ) (-49.668304 7.3340826 14.3149738 9.60564996 3.0649395 -6.82144929 ) (-33.820861 13.5290088 17.379913 2.78420067 -11.2145576 6.4733448 ) (-22.048225 19.549881 6.16535569 9.25754548 5.79330445 -13.0719318 ) (-12.986219 22.271461 11.95866 -3.81438637 -11.95866 3.81438637 )) NATURAL) (2 ((63 71) (61 99)) NIL ((-2. 28. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 64Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:27:37) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((2 ((287 0) (334 0)) NIL ((47. 0 0 0 0 0 )) NATURAL) (2 ((334 0) (334 84)) NIL ((0 84. 0 0 0 0 )) NATURAL) (2 ((334 84) (388 84)) NIL ((54. 0 0 0 0 0 )) NATURAL) (2 ((388 84) (388 127)) NIL ((0 43. 0 0 0 0 )) NATURAL) (2 ((388 127) (334 127)) NIL ((-54. 0 0 0 0 0 )) NATURAL) (2 ((334 127) (334 337)) NIL ((0 210. 0 0 0 0 )) NATURAL) (2 ((334 337) (287 337)) NIL ((-47. 0 0 0 0 0 )) NATURAL) (2 ((287 337) (61 112)) NIL ((-226. -225. 0 0 0 0 )) NATURAL) (2 ((61 112) (61 84)) NIL ((0 -28. 0 0 0 0 )) NATURAL) (2 ((61 84) (287 84)) NIL ((226. 0 0 0 0 0 )) NATURAL) (2 ((287 84) (287 0)) NIL ((0 -84. 0 0 0 0 )) NATURAL)) ((2 ((287 127) (132 127)) NIL ((-155. 0 0 0 0 0 )) NATURAL) (2 ((132 127) (287 285)) NIL ((155. 158. 0 0 0 0 )) NATURAL) (2 ((287 285) (287 127)) NIL ((0 -158. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 65Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:33:57) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((2 ((63 99) (113 99)) NIL ((50. 0 0 0 0 0 )) NATURAL) (11 ((113 99) (117 71) (128 55) (149 41) (187 33) (212 31) (238 32) (276 39) (300 56) (317 84) (322 112)) NIL ((2.45260906 -31.158916 0 0 9.2843437 18.953514 ) (7.09478188 -21.682159 9.2843437 18.953514 -4.42172432 -22.76757 ) (14.168264 -14.112432 4.8626194 -3.81405783 26.402553 12.1167736 ) (32.232162 -11.868103 31.265174 8.3027172 -59.188507 -1.69952965 ) (33.903076 -4.41515064 -27.923336 6.60318757 30.351509 -5.31865692 ) (21.155502 -0.471291602 2.42817497 1.28452992 21.782455 4.97415924 ) (34.474899 3.30031872 24.210632 6.25868989 -51.48133 3.42201805 ) (32.944862 11.2700176 -27.270702 9.6807079 28.14289 5.33776856 ) (19.745609 23.619609 0.872188688 15.018476 -19.090236 -18.773094 ) (11.072681 29.251537 -18.218048 -3.7546196 18.218048 3.7546196 )) NATURAL) (12 ((322 112) (319 136) (310 159) (298 174) (278 186) (250 191) (229 192) (203 191) (167 185) (146 173) (134 159) (125 141)) NIL ((-1.50521779 23.720333 0 0 -8.96869279 1.67799902 ) (-5.9895649 24.55933 -8.96869279 1.67799902 8.8434677 -14.389993 ) (-10.5365219 19.042331 -0.125223279 -12.711996 -8.4051876 13.8819828 ) (-14.8643398 13.2713279 -8.53041268 1.16998744 -5.22271347 -11.137939 ) (-26.00611 8.87234689 -13.753126 -9.9679527 29.296043 6.669775 ) (-25.111213 2.23928118 15.542919 -3.29817772 -21.961471 2.45884323 ) (-20.54903 0.170525491 -6.4185524 -0.839334369 -13.450157 -4.50514984 ) (-33.692657 -2.92138386 -19.868709 -5.34448433 45.762107 -2.43824291 ) (-30.680313 -9.48498918 25.893402 -7.78272725 -19.598308 8.2581215 ) (-14.586067 -13.138656 6.29509164 0.475394309 -3.36886454 -6.59424306 ) (-9.97540856 -15.960382 2.92622709 -6.1188488 -2.92622709 6.1188488 )) NATURAL) (3 ((125 141) (73 141) (73 141)) NIL ((-65. 0 0 0 78. 0 ) (-26. 0 78. 0 -78. 0 )) NATURAL) (2 ((73 141) (108 337)) NIL ((35. 196. 0 0 0 0 )) NATURAL) (2 ((108 337) (334 337)) NIL ((226. 0 0 0 0 0 )) NATURAL) (2 ((334 337) (334 295)) NIL ((0 -42. 0 0 0 0 )) NATURAL) (2 ((334 295) (153 295)) NIL ((-181. 0 0 0 0 0 )) NATURAL) (2 ((153 295) (137 202)) NIL ((-16. -93. 0 0 0 0 )) NATURAL) (22 ((137 202) (170 217) (202 224) (237 227) (280 222) (312 211) (337 193) (352 175) (363 153) (367 122) (363 86) (351 57) (325 29) (295 12) (259 2) (208 -2) (160 4) (120 17) (94 34) (76 54) (67 73) (63 99)) NIL ((33.278953 16.989254 0 0 -1.6737628 -11.935539 ) (32.442077 11.021486 -1.6737628 -11.935539 2.36881447 11.677698 ) (31.95272 4.9247961 0.695052028 -0.257840454 16.198501 -10.775257 ) (40.747024 -0.720674277 16.893554 -11.033098 -37.162834 7.42333985 ) (39.059166 -8.0421009 -20.269279 -3.6097579 18.4528389 -6.9181099 ) (28.016304 -15.110916 -1.816437 -10.527868 -12.6485328 14.249101 ) (19.875598 -18.514232 -14.464971 3.72123432 14.141298 -8.07830239 ) (12.481279 -18.832149 -0.323671937 -4.35706902 -7.91666699 -5.9358902 ) (8.19927407 -26.157165 -8.24033929 -10.292959 -0.474626541 1.82187271 ) (-0.278379440 -35.539184 -8.7149658 -8.4710865 3.8151741 22.648395 ) (-7.0857582 -32.686073 -4.89979172 14.1773109 -14.786075 -20.415466 ) (-19.378585 -28.716499 -19.685867 -6.2381563 19.329124 23.013469 ) (-29.39989 -23.447917 -0.356739759 16.775314 -2.53043222 -11.6384296 ) (-31.021846 -12.491817 -2.88717222 5.13688374 -21.207397 -0.459736824 ) (-44.512718 -7.58480263 -24.09457 4.6771469 33.36003 7.47737885 ) (-51.927269 0.831033350 9.26546289 12.1545257 -4.23274899 -5.4497776 ) (-44.778183 10.2606697 5.03271389 6.70474816 13.570957 -3.67826986 ) (-32.959983 15.126283 18.603672 3.02647829 -14.051084 2.16285753 ) (-21.381855 19.234191 4.55258656 5.18933583 6.63338948 -10.9731578 ) (-13.512575 18.936946 11.185976 -5.783823 -6.4824705 17.729778 ) (-5.56783486 22.018013 4.7035055 11.945955 -4.7035055 -11.945955 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 66Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:40:25) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((11 ((314 260) (306 281) (287 297) (251 308) (210 307) (174 303) (144 291) (125 271) (117 255) (113 235) (110 192)) NIL ((-6.15634823 22.203887 0 0 -11.0619106 -7.2233467 ) (-11.687303 18.592216 -11.0619106 -7.2233467 -10.6904468 6.11673546 ) (-28.094436 14.427236 -21.752357 -1.10661101 17.823703 -17.243595 ) (-40.934944 4.6988287 -3.92865229 -18.350208 11.39562 20.857646 ) (-39.165779 -3.2225542 7.4669695 2.50744152 -3.40619659 -12.186998 ) (-33.401908 -6.80861188 4.0607729 -9.6795578 8.2291622 -2.10965156 ) (-25.226558 -17.542995 12.289936 -11.789209 0.489543915 20.625602 ) (-12.6918487 -19.019401 12.7794799 8.83639527 -10.1873417 -8.39276696 ) (-5.00603962 -14.3793907 2.59213829 0.443627298 -1.74017286 -35.054527 ) (-3.283988 -31.463031 0.851965309 -34.6109 -0.851965309 34.6109 )) NATURAL) (33 ((110 192) (143 210) (181 220) (232 225) (279 222) (310 213) (337 199) (357 180) (370 153) (376 124) (373 91) (363 60) (334 29) (289 8) (226 -1) (174 6) (135 20) (105 40) (87 60) (70 98) (64 164) (69 221) (76 252) (91 283) (111 306) (139 323) (177 335) (235 338) (279 333) (309 323) (331 309) (351 286) (357 260)) NIL ((32.591583 19.91341 0 0 2.45046902 -11.480478 ) (33.816818 14.173172 2.45046902 -11.480478 17.7476539 9.40239717 ) (45.141113 7.39389229 20.198123 -2.07808113 -25.441089 -8.12911416 ) (52.61869 1.25125384 -5.24296665 -10.207195 -17.983284 5.1140623 ) (38.384079 -6.39890957 -23.226253 -5.09313298 25.374244 -0.327138901 ) (27.844951 -11.6556129 2.14799404 -5.42027188 -11.5137119 2.19449425 ) (24.236091 -15.978637 -9.36571885 -3.22577763 2.68060589 -8.45083619 ) (16.210674 -23.429832 -6.68511296 -11.6766147 0.791287423 13.608858 ) (9.9212036 -28.30202 -5.89382553 1.93224478 -5.8457508 -9.9846058 ) (1.10450172 -31.362079 -11.739576 -8.05236245 10.5917167 14.3295707 ) (-5.33921623 -32.249656 -1.14785862 6.27720929 -24.521122 -11.333683 ) (-18.747634 -31.639289 -25.668983 -5.05647373 15.4927768 19.005157 ) (-36.670234 -27.19318 -10.1762066 13.948686 -19.449962 -4.68696213 ) (-56.571426 -15.587976 -29.62617 9.26172448 50.307067 11.742685 ) (-61.044059 -0.454907894 20.6809 21.004409 -7.77833939 -18.283779 ) (-44.252327 11.4076118 12.902561 2.72062778 -7.19371319 7.39244557 ) (-34.946617 17.824459 5.708848 10.113073 12.55319 -17.285995 ) (-22.961177 19.294536 18.262039 -7.17292214 -25.019046 25.751537 ) (-17.20866 24.997383 -6.7570076 18.578617 21.522995 22.279834 ) (-13.20417 54.71591 14.765987 40.85845 -1.07293892 -54.870864 ) (1.02534771 68.13893 13.693048 -14.0124149 -17.231231 -24.796375 ) (6.10277939 41.728324 -3.53818369 -38.808792 15.997869 52.056388 ) (10.5635299 28.94773 12.459686 13.2476 -10.760248 -27.429206 ) (17.643093 28.480728 1.69943738 -14.181606 9.04312516 9.6604328 ) (23.864093 19.129337 10.742563 -4.52117348 -7.412261 0.787478924 ) (30.900527 15.001905 3.33030224 -3.73369455 32.605918 -6.81034947 ) (50.53379 7.86303425 35.936225 -10.544044 -63.011444 2.45392418 ) (54.964294 -1.45404815 -27.075222 -8.0901203 15.439876 2.99464989 ) (35.609008 -8.04684258 -11.635345 -5.09547043 1.25195694 3.56747198 ) (24.599643 -11.3585777 -10.3833885 -1.52799845 15.5522918 -11.264534 ) (21.992401 -18.51884 5.16890335 -12.7925338 -27.461128 11.490667 ) (13.43074 -25.566043 -22.292224 -1.30186629 22.292224 1.30186629 )) NATURAL) (2 ((357 260) (314 260)) NIL ((-43. 0 0 0 0 0 )) NATURAL)) ((21 ((113 119) (121 149) (140 172) (164 185) (208 192) (228 194) (248 192) (291 185) (314 170) (327 147) (333 117) (330 86) (315 57) (290 40) (249 33) (229 31) (209 33) (163 42) (134 61) (119 84) (113 119)) NIL ((4.91333866 31.251632 0 0 18.519966 -7.5098009 ) (14.173322 27.49673 18.519966 -7.5098009 -26.599842 -4.45099545 ) (19.393367 17.761432 -8.07987596 -11.960796 51.879409 7.3137846 ) (37.253196 9.45752908 43.799537 -4.64701176 -90.917816 -0.804142953 ) (35.593818 4.4084463 -47.118286 -5.4511547 47.791908 1.90278578 ) (12.371492 -0.0913158953 0.673623085 -3.54836893 43.750167 -0.806997777 ) (34.920204 -4.04318428 44.423797 -4.3553667 -84.792617 -4.6747942 ) (36.947685 -10.7359466 -40.36882 -9.0301609 37.420303 1.50617122 ) (15.289024 -19.013023 -2.94851398 -7.52398968 -4.88860703 -1.34988689 ) (9.8962059 -27.211956 -7.837121 -8.87387658 0.134121895 9.8933773 ) (2.12614632 -31.139144 -7.7029991 1.01950121 -7.64788056 -2.22362852 ) (-9.40079309 -31.231456 -15.350879 -1.20412731 12.457403 17.0011329 ) (-18.522972 -23.935016 -2.893476 15.797006 -30.181732 -5.78090859 ) (-36.507316 -11.028463 -33.07521 10.016098 72.26953 -5.87750626 ) (-33.44776 -3.95111895 39.19432 4.13859177 -36.896385 -0.709060669 ) (-12.701635 -0.167057514 2.29793119 3.4295311 -50.683975 2.71375179 ) (-35.745689 4.61934948 -48.386047 6.1432829 83.632309 7.85405255 ) (-42.315582 14.689657 35.24626 13.997335 -25.845264 -16.129955 ) (-19.991954 20.622013 9.40099526 -2.13262224 1.7487545 20.665775 ) (-9.71658326 28.82228 11.1497497 18.533153 -11.1497497 -18.533153 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 67Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:42:36) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((3 ((82 337) (82 337) (82 295)) NIL ((0 10.5 0 0 0 -63. ) (0 -21. 0 -63. 0 63. )) NATURAL) (2 ((82 295) (317 295)) NIL ((235. 0 0 0 0 0 )) NATURAL) (2 ((317 295) (140 0)) NIL ((-177. -295. 0 0 0 0 )) NATURAL) (2 ((140 0) (207 0)) NIL ((67. 0 0 0 0 0 )) NATURAL) (2 ((207 0) (367 307)) NIL ((160. 307. 0 0 0 0 )) NATURAL) (2 ((367 307) (367 337)) NIL ((0 30. 0 0 0 0 )) NATURAL) (2 ((367 337) (82 337)) NIL ((-285. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 70Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:49:46) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((19 ((291 180) (315 191) (336 207) (351 232) (354 260) (345 290) (324 313) (298 326) (259 336) (219 340) (178 336) (139 326) (114 313) (93 290) (84 260) (87 232) (102 207) (123 191) (147 180)) NIL ((24.558052 10.265171 0 0 -3.34833002 4.4089651 ) (22.883888 12.469654 -3.34833002 4.4089651 -1.25834989 7.95517254 ) (18.906383 20.856205 -4.60667992 12.3641376 -9.61826898 -12.229656 ) (9.49056817 27.105514 -14.2249489 0.134480089 3.73142815 4.96345997 ) (-2.86866617 29.721725 -10.4935207 5.09794045 -5.3074398 -13.624183 ) (-16.015907 28.007572 -15.80096 -8.5262432 17.498333 -4.46672058 ) (-23.067699 17.247966 1.69737339 -12.9929638 -22.685901 13.4910698 ) (-32.713279 11.0005397 -20.988529 0.498106360 25.245277 -7.49756528 ) (-41.07917 7.74986458 4.25675106 -6.99945927 -6.2952261 -1.50080967 ) (-39.97003 -4.76837158E-7 -2.03847551 -8.50026895 -0.0643725395 1.50080967 ) (-42.040695 -7.74986458 -2.10284805 -6.99945927 24.552715 7.49756528 ) (-31.867183 -11.0005397 22.449867 0.498106659 -26.146499 -13.4910717 ) (-22.490562 -17.24797 -3.69663239 -12.9929657 20.03329 4.46672249 ) (-16.170547 -28.007572 16.336658 -8.5262432 -5.98667336 13.624183 ) (-2.82722759 -29.721725 10.349985 5.09794045 3.91341019 -4.96346092 ) (9.47946359 -27.105514 14.263395 0.134479522 -9.6669674 12.22966 ) (18.909374 -20.856205 4.59642697 12.364139 -1.24553394 -7.9551754 ) (22.883033 -12.469654 3.35089302 4.40896416 -3.35089302 -4.40896416 )) NATURAL) (21 ((147 180) (117 170) (87 154) (69 134) (60 100) (67 60) (88 34) (114 18) (139 9) (169 2) (219 -2) (268 2) (298 9) (324 18) (349 34) (370 60) (378 100) (369 134) (351 154) (321 170) (291 180)) NIL ((-29.24649 -8.45737458 0 0 -4.52104187 -9.25575067 ) (-31.50701 -13.0852489 -4.52104187 -9.25575067 22.605209 10.278753 ) (-24.725448 -17.201622 18.084167 1.02300405 -13.899799 -19.859268 ) (-13.5911808 -26.108253 4.18436814 -18.836265 14.993984 9.15831948 ) (-1.90981889 -40.365356 19.178352 -9.6779461 -4.07614327 31.225994 ) (15.230461 -34.430305 15.102209 21.548049 -10.6893997 -14.062305 ) (24.987968 -19.91341 4.41280842 7.4857435 -7.16625214 1.02323055 ) (25.817649 -11.9160499 -2.75344372 8.50897409 3.3544116 -8.03062058 ) (24.741413 -7.42238618 0.600968123 0.478352726 29.7486 1.09926128 ) (40.216682 -6.3944025 30.34957 1.57761407 -32.348823 9.63357545 ) (54.391838 7.15255737E-7 -1.99925756 11.211191 -26.353275 -9.63357736 ) (39.215942 6.3944025 -28.352535 1.57761335 29.761928 -1.09926057 ) (25.744373 7.42238618 1.40939593 0.478352666 -2.69444275 8.03062058 ) (25.806549 11.9160499 -1.28504705 8.50897409 -0.984160424 -1.02323150 ) (24.029418 19.91341 -2.26920748 7.48574258 -11.3689117 14.062307 ) (16.075756 34.430305 -13.63812 21.548049 -7.5401821 -31.225994 ) (-1.3324542 40.365356 -21.178302 -9.6779461 17.529632 -9.15831567 ) (-13.745939 26.108249 -3.64866877 -18.836261 -14.57835 19.859264 ) (-24.683784 17.201622 -18.22702 1.02300405 22.783775 -10.278753 ) (-31.518917 13.0852489 4.55675507 -9.25575067 -4.55675507 9.25575067 )) NATURAL)) ((9 ((131 253) (135 224) (156 204) (194 196) (221 194) (244 196) (281 204) (302 224) (307 253)) NIL ((0.832658768 -30.649482 0 0 19.004047 9.8969059 ) (10.334684 -25.701026 19.004047 9.8969059 6.97975159 4.51546479 ) (32.828605 -13.54639 25.983799 14.41237 -46.923042 -9.9587631 ) (35.350875 -4.1134014 -20.939247 4.45360756 12.712442 -0.680411816 ) (20.767856 1.59256160E-7 -8.22680474 3.77319574 38.073265 0.680411816 ) (31.577686 4.11340237 29.846466 4.45360756 -57.005523 9.9587612 ) (32.921386 13.546392 -27.159057 14.4123687 9.94882585 -4.51546097 ) (10.7367439 25.70103 -17.210231 9.8969078 17.210231 -9.8969078 )) NATURAL) (9 ((307 253) (298 283) (274 300) (244 307) (221 309) (194 307) (164 300) (140 283) (131 253)) NIL ((-5.5618553 32.845359 0 0 -20.628864 -17.072162 ) (-15.876289 24.309276 -20.628864 -17.072162 13.144329 7.36082268 ) (-29.932987 10.917524 -7.4845352 -9.71133996 22.051544 5.6288662 ) (-26.39175 4.02061749 14.5670089 -4.08247376 -23.350509 0.123711586 ) (-23.5 -3.18512320E-7 -8.78350259 -3.95876217 5.3505125 -0.123711586 ) (-29.608245 -4.02061844 -3.4329896 -4.08247376 7.94845296 -5.6288662 ) (-29.067009 -10.917526 4.51546383 -9.71133996 16.855667 -7.36082268 ) (-16.12371 -24.309276 21.371131 -17.072162 -21.371131 17.072162 )) NATURAL)) ((11 ((105 98) (113 128) (132 147) (155 158) (194 164) (220 165) (244 164) (283 158) (305 147) (325 128) (332 98)) NIL ((4.97496033 32.444747 0 0 18.150238 -14.668506 ) (14.050081 25.110496 18.150238 -14.668506 -24.751201 7.34253979 ) (19.824714 14.113258 -6.6009655 -7.32596684 38.854583 3.2983427 ) (32.651046 8.4364624 32.253624 -4.02762413 -58.667167 -2.53591156 ) (35.571083 3.14088345 -26.413543 -6.5635357 21.814094 6.84530354 ) (20.06459 -7.96280801E-8 -4.59944725 0.281768083 37.410774 -6.84530354 ) (34.170532 -3.14088392 32.811332 -6.5635357 -69.457214 2.53591251 ) (32.25325 -8.4364643 -36.645889 -4.02762318 48.41812 -3.2983427 ) (19.816429 -14.113258 11.7722377 -7.32596589 -34.215293 -7.34254265 ) (14.481018 -25.110496 -22.443058 -14.668508 22.443058 14.668508 )) NATURAL) (11 ((332 98) (326 69) (302 47) (275 36) (244 31) (220 29) (194 31) (162 36) (135 47) (111 69) (105 98)) NIL ((-1.27926373 -30.190605 0 0 -28.324417 7.14364625 ) (-15.441473 -26.618782 -28.324417 7.14364625 33.622093 6.2817669 ) (-26.954841 -16.334251 5.29768086 13.425413 -16.163986 -8.2707176 ) (-29.739154 -7.04419804 -10.866306 5.1546955 25.033847 -3.19889402 ) (-28.088535 -3.48895025 14.167543 1.95580148 -17.971408 3.06629705 ) (-22.906696 3.18512320E-7 -3.80386734 5.02209854 -7.1482048 -3.06629753 ) (-30.284668 3.48895025 -10.952072 1.95580101 22.564231 3.19889545 ) (-29.954624 7.044199 11.6121616 5.15469647 -17.1087379 8.2707157 ) (-26.896831 16.334251 -5.4965763 13.425413 33.870712 -6.2817669 ) (-15.4580459 26.618782 28.374141 7.14364625 -28.374141 -7.14364625 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 71Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 12:58:42) (MADE-FROM gachan.cu 0 140 0 0) (SPLINES ((2 ((118 77) (75 77)) NIL ((-43. 0 0 0 0 0 )) NATURAL) (32 ((75 77) (81 51) (100 28) (123 14) (153 4) (196 -1) (255 2) (294 13) (321 31) (340 54) (355 85) (363 116) (367 173) (364 239) (351 277) (333 297) (303 317) (264 331) (205 338) (142 329) (97 308) (67 277) (55 246) (54 213) (60 184) (75 157) (109 130) (153 115) (199 112) (260 118) (302 131) (322 145)) NIL ((2.70768738 -26.21757 0 0 19.753875 1.30543661 ) (12.584625 -25.564853 19.753875 1.30543661 -20.769386 11.472816 ) (21.953807 -18.523006 -1.01551056 12.778253 9.32367517 -11.1967029 ) (25.600135 -11.343107 8.3081646 1.58154917 1.47467994 3.31399965 ) (34.645637 -8.10455705 9.78284455 4.89554882 20.77761 3.94070339 ) (54.81729 -1.23865676 30.560455 8.8362522 -66.585128 -1.07681560 ) (52.085174 7.0591879 -36.024673 7.7594366 29.562927 0.366560936 ) (30.841968 15.001905 -6.46174336 8.12599755 -3.66660023 -6.3894329 ) (22.546924 19.933185 -10.1283435 1.73656463 9.1034622 13.191175 ) (16.970314 28.265338 -1.02488088 14.92774 -8.7472496 -28.375263 ) (11.5718078 29.005447 -9.77213098 -13.447525 7.88553906 52.309883 ) (5.7424469 41.712867 -1.88659143 38.862358 -4.79491043 -24.864299 ) (1.45840072 68.143066 -6.68150235 13.998058 -6.70589734 -54.852653 ) (-8.5760498 54.714805 -13.3873996 -40.854599 13.6184997 22.274959 ) (-15.154197 24.997684 0.231101900 -18.579639 -17.768104 25.752807 ) (-23.807151 19.294448 -17.537006 7.17316819 15.4539318 -17.286197 ) (-33.617187 17.824516 -2.08307314 -10.113031 -26.047618 7.3919878 ) (-48.724075 11.407478 -28.130695 -2.72104311 22.736557 -18.2817459 ) (-65.48648 -0.454440713 -5.39413643 -21.002792 31.101375 11.7350216 ) (-55.329933 -15.589721 25.70724 -9.26777078 -15.14208 -4.65834809 ) (-37.193733 -27.186668 10.5651607 -13.9261188 11.466947 18.898368 ) (-20.895099 -31.6636 22.032108 4.97225094 -12.725717 -10.9351349 ) (-5.2258501 -32.158912 9.30639077 -5.9628849 -2.5640707 12.842174 ) (2.7985053 -31.700714 6.74232007 6.87928963 -1.01799202 -4.43356228 ) (9.03182984 -27.038208 5.72432804 2.44572735 18.636032 -7.1079273 ) (24.074176 -28.146442 24.360363 -4.66219998 -13.526155 20.865268 ) (41.671463 -22.376003 10.8342075 16.203071 -18.53141 -4.35317803 ) (43.239959 -8.34952165 -7.69720364 11.849893 39.651802 -3.45254517 ) (55.368667 1.77409935 31.954605 8.3973484 -62.075828 0.163358688 ) (56.285354 10.253126 -30.121227 8.5607071 4.65153504 -9.20088388 ) (28.489894 14.213392 -25.469692 -0.640176893 25.469692 0.640176893 )) NATURAL) (12 ((322 145) (319 102) (314 82) (307 66) (287 46) (262 36) (226 33) (196 33) (162 36) (141 44) (126 58) (118 77)) NIL ((-2.36525059 -48.755897 0 0 -3.80849552 34.535408 ) (-4.26949787 -31.488193 -3.80849552 34.535408 7.0424776 -34.67704 ) (-4.55675507 -14.291311 3.23398209 -0.141639173 -24.361415 -9.8272133 ) (-13.5034828 -19.346557 -21.127433 -9.968853 24.403202 25.985908 ) (-22.429313 -16.322452 3.27577066 16.017055 -25.251411 -10.1164398 ) (-31.77925 -5.36361695 -21.975643 5.90061569 40.602447 -3.52014017 ) (-33.453666 -1.22307181 18.626808 2.38047552 -35.158393 0.197004795 ) (-32.406059 1.25590610 -16.531585 2.57748031 40.031112 2.73212242 ) (-28.922084 5.19944763 23.49953 5.30960274 -22.966072 0.874502183 ) (-16.90559 10.946302 0.533458472 6.1841049 9.83317567 -0.230131149 ) (-11.455543 17.0153389 10.366634 5.95397377 -10.366634 -5.95397377 )) NATURAL)) ((11 ((323 220) (316 188) (295 164) (268 150) (226 145) (202 143) (179 145) (138 152) (115 166) (99 190) (93 220)) NIL ((-3.30784607 -33.58744 0 0 -22.152923 9.52467538 ) (-14.3843078 -28.825103 -22.152923 9.52467538 26.764621 0.376617432 ) (-23.154918 -19.112121 4.61169815 9.9012928 -36.905563 0.968858719 ) (-36.996009 -8.72639848 -32.293869 10.870151 66.857666 -10.252054 ) (-35.861038 -2.98227548 34.563797 0.618097306 -32.525123 4.039361 ) (-17.559806 -0.344497323 2.03867292 4.6574583 -38.757156 0.0946092606 ) (-34.899719 4.36026573 -36.71849 4.75206757 73.553787 1.58220005 ) (-34.841308 9.90343286 36.835304 6.3342676 -39.458053 5.57659245 ) (-17.735031 19.025997 -2.62274933 11.91086 18.278434 -5.88857556 ) (-11.218561 27.992569 15.655687 6.0222845 -15.655687 -6.0222845 )) NATURAL) (11 ((93 220) (95 251) (111 280) (140 297) (180 307) (204 308) (227 306) (274 295) (302 276) (317 253) (323 220)) NIL ((-1.10016107 30.764175 0 0 18.600967 1.4149456 ) (8.2003212 31.471645 18.600967 1.4149456 -9.00483705 -19.074726 ) (22.29887 23.349227 9.59613038 -17.659782 11.4183807 14.883974 ) (37.604187 13.131431 21.014511 -2.7758069 -48.668686 -10.4611778 ) (34.284355 5.12503529 -27.654178 -13.236986 21.256389 14.9607429 ) (17.258373 -0.631578923 -6.39778805 1.72375726 53.64311 -13.3817978 ) (37.68215 -5.59872055 47.24533 -11.658041 -85.8289 2.5664463 ) (42.01303 -15.973539 -38.583572 -9.0915947 31.672523 9.1160202 ) (19.26572 -20.507122 -6.91104603 0.0244256891 -4.86119175 -15.0305309 ) (9.924078 -27.997962 -11.7722377 -15.006105 11.7722377 15.006105 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.S1-SF b/lispusers/GACHAE.S1-SF new file mode 100644 index 00000000..8a13afa8 --- /dev/null +++ b/lispusers/GACHAE.S1-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 40Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 13-SEP-77 15:50:28) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES)) ((FAMILY gacha) (CHARACTER 30Q) (FACE M R E) (WIDTH 0 0) (FIDUCIAL 480 480) (VERSION 0 13-SEP-77 15:52:00) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((3 ((0 -112) (0 -112) (441 -112)) NIL ((-110.25 0 0 0 661.5 0 ) (220.5 0 661.5 0 -661.5 0 )) NATURAL) (2 ((441 -112) (441 -76)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((441 -76) (0 -76)) NIL ((-441. 0 0 0 0 0 )) NATURAL) (2 ((0 -76) (0 -112)) NIL ((0 -36. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 41Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 13:12:55) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((13 ((219 -4) (231 -3) (251 9) (261 29) (251 49) (231 61) (219 62) (207 61) (187 49) (177 29) (187 9) (207 -3) (219 -4)) NIL ((9.72938157 0.167401611 -0.927834511 -5.42605019 16.407211 21.273738 ) (17.005153 5.3782215 15.479379 15.84769 -28.469066 -7.81240464 ) (18.249996 17.319709 -12.9896869 8.03528596 -10.530931 -8.02412416 ) (-0.00515493005 21.342933 -23.520618 0.0111602712 10.5927848 -8.09108735 ) (-18.229381 17.3085479 -12.927833 -8.07992745 28.15979 -7.61152077 ) (-17.077316 5.42286206 15.231958 -15.691448 -15.231958 20.53717 ) (-9.46133996 0 -5.11072471E-7 4.8457241 -15.231954 -20.53717 ) (-17.07732 -5.42286206 -15.231956 -15.691448 28.15979 7.61152077 ) (-18.229377 -17.3085479 12.927833 -8.07992745 10.592781 8.09108735 ) (-0.00515333563 -21.342933 23.520614 0.0111602917 -10.5309238 8.02412416 ) (18.25 -17.319709 12.9896908 8.03528596 -28.46907 7.81240464 ) (17.005153 -5.3782215 -15.479381 15.84769 16.407215 -21.273738 )) PSEUDOCYCLIC)))) ((FAMILY gacha) (CHARACTER 42Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 13:18:48) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((8 ((137 197) (130 223) (122 248) (115 273) (112 296) (114 313) (126 331) (147 338)) NIL ((-6.72208787 26.270351 0 0 -1.66746807 -1.62212276 ) (-7.55582238 25.459289 -1.66746807 -1.62212276 2.33734083 2.1106143 ) (-8.05461885 24.892475 0.669872761 0.488491952 4.31810379 -0.820336819 ) (-5.2256956 24.970798 4.98797703 -0.331844926 -1.60975694 -10.8292656 ) (-1.04259658 19.224319 3.37822008 -11.1611118 8.12091828 20.137405 ) (6.39608384 18.131912 11.4991397 8.97629548 -0.873926163 -27.720367 ) (17.458259 13.248024 10.6252136 -18.7440719 -10.6252136 18.7440719 )) NATURAL) (8 ((147 338) (168 331) (180 313) (182 296) (179 273) (172 248) (164 223) (157 197)) NIL ((22.770866 -3.875988 0 0 -10.6252136 -18.7440719 ) (17.458259 -13.248024 -10.6252136 -18.7440719 -0.873926163 27.720367 ) (6.39608288 -18.131912 -11.4991397 8.97629548 8.12091828 -20.137409 ) (-1.04259729 -19.224319 -3.37822008 -11.1611137 -1.60975599 10.829267 ) (-5.2256956 -24.970798 -4.98797608 -0.331844509 4.31810284 0.820336342 ) (-8.05461885 -24.892475 -0.669872761 0.488491833 2.33734083 -2.1106143 ) (-7.55582238 -25.459289 1.66746831 -1.62212276 -1.66746831 1.62212276 )) NATURAL) (2 ((157 197) (137 197)) NIL ((-20. 0 0 0 0 0 )) NATURAL)) ((2 ((302 197) (282 197)) NIL ((-20. 0 0 0 0 0 )) NATURAL) (8 ((282 197) (275 223) (267 248) (260 273) (257 296) (259 313) (271 331) (292 338)) NIL ((-6.72208787 26.270351 0 0 -1.66746807 -1.62212276 ) (-7.55582238 25.459289 -1.66746807 -1.62212276 2.33734083 2.1106143 ) (-8.05461885 24.892475 0.669872761 0.488491952 4.31810379 -0.820336819 ) (-5.2256956 24.970798 4.98797703 -0.331844926 -1.60975694 -10.8292656 ) (-1.04259658 19.224319 3.37822008 -11.1611118 8.12091828 20.137405 ) (6.39608384 18.131912 11.4991397 8.97629548 -0.873926163 -27.720367 ) (17.458259 13.248024 10.6252136 -18.7440719 -10.6252136 18.7440719 )) NATURAL) (8 ((292 338) (313 331) (325 313) (327 296) (324 273) (317 248) (309 223) (302 197)) NIL ((22.770866 -3.875988 0 0 -10.6252136 -18.7440719 ) (17.458259 -13.248024 -10.6252136 -18.7440719 -0.873926163 27.720367 ) (6.39608288 -18.131912 -11.4991397 8.97629548 8.12091828 -20.137409 ) (-1.04259729 -19.224319 -3.37822008 -11.1611137 -1.60975599 10.829267 ) (-5.2256956 -24.970798 -4.98797608 -0.331844509 4.31810284 0.820336342 ) (-8.05461885 -24.892475 -0.669872761 0.488491833 2.33734083 -2.1106143 ) (-7.55582238 -25.459289 1.66746831 -1.62212276 -1.66746831 1.62212276 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 43Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 13:21:04) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((39 0) (90 0)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((90 0) (144 113)) NIL ((54. 113. 0 0 0 0 )) NATURAL) (2 ((144 113) (246 113)) NIL ((102. 0 0 0 0 0 )) NATURAL) (2 ((246 113) (192 0)) NIL ((-54. -113. 0 0 0 0 )) NATURAL) (2 ((192 0) (243 0)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((243 0) (297 113)) NIL ((54. 113. 0 0 0 0 )) NATURAL) (2 ((297 113) (393 113)) NIL ((96. 0 0 0 0 0 )) NATURAL) (2 ((393 113) (393 148)) NIL ((0 35. 0 0 0 0 )) NATURAL) (2 ((393 148) (313 148)) NIL ((-80. 0 0 0 0 0 )) NATURAL) (2 ((313 148) (337 198)) NIL ((24. 50. 0 0 0 0 )) NATURAL) (2 ((337 198) (415 198)) NIL ((78. 0 0 0 0 0 )) NATURAL) (2 ((415 198) (417 232)) NIL ((2. 34. 0 0 0 0 )) NATURAL) (2 ((417 232) (354 232)) NIL ((-63. 0 0 0 0 0 )) NATURAL) (2 ((354 232) (405 337)) NIL ((51. 105. 0 0 0 0 )) NATURAL) (2 ((405 337) (354 337)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (2 ((354 337) (303 232)) NIL ((-51. -105. 0 0 0 0 )) NATURAL) (2 ((303 232) (201 232)) NIL ((-102. 0 0 0 0 0 )) NATURAL) (2 ((201 232) (252 337)) NIL ((51. 105. 0 0 0 0 )) NATURAL) (2 ((252 337) (201 337)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (2 ((201 337) (150 232)) NIL ((-51. -105. 0 0 0 0 )) NATURAL) (2 ((150 232) (54 232)) NIL ((-96. 0 0 0 0 0 )) NATURAL) (2 ((54 232) (54 197)) NIL ((0 -35. 0 0 0 0 )) NATURAL) (2 ((54 197) (133 197)) NIL ((79. 0 0 0 0 0 )) NATURAL) (2 ((133 197) (109 147)) NIL ((-24. -50. 0 0 0 0 )) NATURAL) (2 ((109 147) (31 147)) NIL ((-78. 0 0 0 0 0 )) NATURAL) (2 ((31 147) (30 113)) NIL ((-1. -34. 0 0 0 0 )) NATURAL) (2 ((30 113) (93 113)) NIL ((63. 0 0 0 0 0 )) NATURAL) (2 ((93 113) (39 0)) NIL ((-54. -113. 0 0 0 0 )) NATURAL)) ((2 ((184 197) (160 147)) NIL ((-24. -50. 0 0 0 0 )) NATURAL) (2 ((160 147) (262 147)) NIL ((102. 0 0 0 0 0 )) NATURAL) (2 ((262 147) (286 197)) NIL ((24. 50. 0 0 0 0 )) NATURAL) (2 ((286 197) (184 197)) NIL ((-102. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 46Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 14:35:37) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((4 ((107 270) (123 246) (161 212) (174 202)) NIL ((8.46666719 -19.733333 0 0 45.199996 -25.599998 ) (31.066665 -32.533332 45.199996 -25.599998 -93.999984 67.999984 ) (29.266662 -24.133331 -48.799995 42.399993 48.799995 -42.399993 )) NATURAL) (13 ((174 202) (197 214) (222 228) (247 246) (259 270) (253 289) (235 303) (205 308) (182 310) (158 308) (131 303) (113 289) (107 270)) NIL ((22.63285 11.613859 0 0 2.202878 2.31683636 ) (23.73429 12.7722778 2.202878 2.31683636 0.985608578 0.415817738 ) (26.429973 15.2970237 3.18848658 2.73265409 -18.145309 8.01989175 ) (20.545803 22.039623 -14.956825 10.752546 -6.4043541 -20.495391 ) (2.38680172 22.544475 -21.361179 -9.74284555 13.7627258 7.9616804 ) (-12.0930137 16.7824669 -7.5984535 -1.78116488 -12.646549 -11.3513279 ) (-26.014743 9.3256397 -20.245002 -13.1324939 36.82347 13.4436359 ) (-27.848007 2.91496467 16.578468 0.311142981 -20.647338 -6.42321969 ) (-21.593212 0.0144983027 -4.0688715 -6.11207677 -2.23410892 6.24923993 ) (-26.779136 -2.97295809 -6.30298043 0.137163698 17.583774 -12.57374 ) (-24.290229 -9.1226635 11.280794 -12.4365768 3.8990078 8.04572106 ) (-11.0599327 -17.53638 15.1798019 -4.39085484 -15.1798019 4.39085484 )) NATURAL)) ((15 ((129 183) (72 242) (61 280) (73 309) (97 326) (132 339) (183 344) (234 339) (268 326) (291 309) (302 280) (294 242) (270 214) (238 196) (200 177)) NIL ((-67.869125 64.199096 0 0 65.214828 -31.194587 ) (-35.261718 48.601799 65.214828 -31.194587 -50.074157 29.972938 ) (4.91602898 32.393684 15.1406707 -1.22164702 -2.91818809 -16.697174 ) (18.597606 22.823448 12.2224827 -17.918823 -4.25308895 18.815761 ) (28.693542 14.312507 7.96939374 0.896939040 13.930542 -10.56587 ) (43.628204 9.92650987 21.899936 -9.66893197 -21.469078 -0.552272797 ) (54.7936 -0.0185569115 0.430855572 -10.2212047 -24.054214 0.774955750 ) (43.197349 -9.85228349 -23.623359 -9.446249 15.6859588 9.4524574 ) (27.416969 -14.5723037 -7.93739987 0.00620953180 -2.68962955 -14.584795 ) (18.134754 -21.858493 -10.627029 -14.578586 -10.927448 0.886726380 ) (2.04400062 -35.993713 -21.554477 -13.69186 4.39942932 29.03789 ) (-17.31076 -35.166626 -17.155048 15.346033 11.329729 -3.0383091 ) (-28.800945 -21.339752 -5.82531929 12.307724 -1.71835041 -16.884651 ) (-35.485443 -17.474353 -7.5436697 -4.57693005 7.5436697 4.57693005 )) NATURAL) (2 ((200 177) (318 80)) NIL ((118. -97. 0 0 0 0 )) NATURAL) (6 ((318 80) (335 99) (346 114) (356 130) (368 156) (372 178)) NIL ((18.459327 19.933013 0 0 -8.75597955 -5.5980854 ) (14.0813389 17.133968 -8.75597955 -5.5980854 7.77990246 3.99043036 ) (9.21531106 13.531099 -0.976076246 -1.60765481 7.63636208 19.63636 ) (12.057415 21.741626 6.66028596 18.028705 -20.325355 -28.53588 ) (8.5550232 25.502391 -13.665069 -10.507175 13.665069 10.507175 )) NATURAL) (2 ((372 178) (421 178)) NIL ((49. 0 0 0 0 0 )) NATURAL) (6 ((421 178) (412 145) (396 115) (373 85) (361 74) (346 59)) NIL ((-7.85167409 -34.186599 0 0 -6.88995267 7.1196165 ) (-11.2966499 -30.626792 -6.88995267 7.1196165 -7.5502367 -17.598083 ) (-21.961719 -32.306213 -14.440189 -10.4784679 37.090904 45.27272 ) (-17.856456 -20.148323 22.650714 34.794258 -32.813392 -49.49282 ) (-11.61244 -10.100477 -10.1626777 -14.698564 10.1626777 14.698564 )) NATURAL) (2 ((346 59) (424 0)) NIL ((78. -59. 0 0 0 0 )) NATURAL) (2 ((424 0) (352 0)) NIL ((-72. 0 0 0 0 0 )) NATURAL) (2 ((352 0) (309 32)) NIL ((-43. 32. 0 0 0 0 )) NATURAL) (12 ((309 32) (270 11) (228 -2) (163 -8) (105 0) (63 18) (37 45) (28 84) (40 124) (64 150) (94 168) (129 183)) NIL ((-39.917266 -22.867206 0 0 5.50363159 11.2032489 ) (-37.16545 -17.265583 5.50363159 11.2032489 -45.518158 -8.0162468 ) (-54.420906 -10.070457 -40.014526 3.18700123 56.569015 14.861742 ) (-66.150909 0.547416330 16.554489 18.048744 -0.757925034 -9.4307308 ) (-49.975395 13.880794 15.796564 8.61801339 0.462682724 -1.13881588 ) (-33.947486 21.929401 16.2592468 7.4791975 -1.09281921 7.98599148 ) (-18.234645 33.401596 15.166427 15.4651889 9.90859605 -12.805143 ) (1.88607931 42.46421 25.075023 2.66004515 -14.5415477 -22.765411 ) (19.690326 33.741546 10.5334758 -20.105369 -5.74240303 13.866802 ) (27.3526 20.56958 4.79107285 -6.23856736 1.51115894 3.29820967 ) (32.899253 15.9801178 6.30223179 -2.94035768 -6.30223179 2.94035768 )) NATURAL)) ((10 ((277 52) (243 38) (192 25) (147 26) (111 37) (86 53) (72 82) (81 112) (105 133) (150 157)) NIL ((-29.138164 -13.446022 0 0 -29.170993 -3.32386208 ) (-43.723663 -15.107954 -29.170993 -3.32386208 43.854972 22.619308 ) (-50.96717 -7.12215996 14.683979 19.295448 -8.2489071 -9.15338517 ) (-40.407638 7.59659577 6.43507195 10.142063 7.14065743 -10.0057678 ) (-30.40224 12.735775 13.575729 0.136293560 -8.3137245 19.176464 ) (-20.983375 22.460304 5.26200485 19.312759 26.114242 -18.700103 ) (-2.66424894 32.423004 31.376247 0.612653733 -24.143245 -16.376026 ) (16.640373 24.847648 7.23299885 -15.763374 22.458747 24.204216 ) (35.102745 21.186382 29.691749 8.44084359 -29.691749 -8.44084359 )) NATURAL) (2 ((150 157) (277 52)) NIL ((127. -105. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 47Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 14:38:09) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((8 ((210 197) (203 223) (195 248) (188 273) (185 296) (187 313) (199 331) (220 338)) NIL ((-6.72208787 26.270351 0 0 -1.66746807 -1.62212276 ) (-7.55582238 25.459289 -1.66746807 -1.62212276 2.33734083 2.1106143 ) (-8.05461885 24.892475 0.669872761 0.488491952 4.31810379 -0.820336819 ) (-5.2256956 24.970798 4.98797703 -0.331844926 -1.60975694 -10.8292656 ) (-1.04259658 19.224319 3.37822008 -11.1611118 8.12091828 20.137405 ) (6.39608384 18.131912 11.4991397 8.97629548 -0.873926163 -27.720367 ) (17.458259 13.248024 10.6252136 -18.7440719 -10.6252136 18.7440719 )) NATURAL) (8 ((220 338) (241 331) (253 313) (255 296) (252 273) (245 248) (237 223) (230 197)) NIL ((22.770866 -3.875988 0 0 -10.6252136 -18.7440719 ) (17.458259 -13.248024 -10.6252136 -18.7440719 -0.873926163 27.720367 ) (6.39608288 -18.131912 -11.4991397 8.97629548 8.12091828 -20.137409 ) (-1.04259729 -19.224319 -3.37822008 -11.1611137 -1.60975599 10.829267 ) (-5.2256956 -24.970798 -4.98797608 -0.331844509 4.31810284 0.820336342 ) (-8.05461885 -24.892475 -0.669872761 0.488491833 2.33734083 -2.1106143 ) (-7.55582238 -25.459289 1.66746831 -1.62212276 -1.66746831 1.62212276 )) NATURAL) (2 ((230 197) (210 197)) NIL ((-20. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 50Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 14:40:32) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((304 350) (256 350)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (11 ((256 350) (226 328) (190 291) (160 250) (140 202) (127 121) (139 40) (161 -8) (190 -49) (226 -86) (256 -108)) NIL ((-28.149116 -18.291866 0 0 -11.105289 -22.248802 ) (-33.701759 -29.416267 -11.105289 -22.248802 19.526447 21.244014 ) (-35.043823 -41.04306 8.42115785 -1.00478410 4.99949837 3.2727251 ) (-24.12292 -40.411483 13.420656 2.267941 -15.5244369 -52.334915 ) (-18.464481 -64.311004 -2.10378218 -50.066978 39.098243 50.066978 ) (-1.01913643 -89.34448 36.994468 0 -32.868583 50.066978 ) (19.541038 -64.310989 4.1258812 50.066978 2.37611484 -52.334915 ) (24.854976 -40.411476 6.50199605 -2.26794243 5.3641386 3.27272701 ) (34.039039 -41.04306 11.8661346 1.00478482 -23.832664 21.244014 ) (33.988838 -29.416267 -11.9665317 22.248802 11.9665317 -22.248802 )) NATURAL) (2 ((256 -108) (304 -108)) NIL ((48. 0 0 0 0 0 )) NATURAL) (11 ((304 -108) (274 -86) (238 -49) (210 -8) (187 40) (175 121) (189 202) (208 250) (238 291) (274 328) (304 350)) NIL ((-27.892368 18.291866 0 0 -12.6457729 22.248802 ) (-34.215255 29.416267 -12.6457729 22.248802 27.22887 -21.244014 ) (-33.246589 41.04306 14.583097 1.00478410 -12.269714 -3.2727251 ) (-24.798355 40.411483 2.3133831 -2.267941 3.84998512 52.334915 ) (-20.559978 64.311004 6.16336823 50.066978 32.869773 -50.066978 ) (2.03827906 89.34448 39.033142 0 -45.3291 -50.066978 ) (18.406868 64.310989 -6.29596043 -50.066978 22.446659 52.334915 ) (23.334239 40.411476 16.150699 2.26794243 -8.45755387 -3.27272701 ) (35.256164 41.04306 7.69314576 -1.00478482 -18.616432 -21.244014 ) (33.64109 29.416267 -10.923286 -22.248802 10.923286 22.248802 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 51Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 14:42:07) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((11 ((126 350) (156 328) (192 291) (222 250) (241 202) (255 121) (243 40) (220 -8) (192 -49) (156 -86) (126 -108)) NIL ((28.17945 -18.291866 0 0 10.923286 -22.248802 ) (33.64109 -29.416267 10.923286 -22.248802 -18.616432 21.244014 ) (35.256164 -41.04306 -7.69314576 -1.00478410 -8.45755769 3.2727251 ) (23.334239 -40.411483 -16.150703 2.267941 22.446666 -52.334915 ) (18.406868 -64.311004 6.29596425 -50.066978 -45.329109 50.066978 ) (2.03827715 -89.34448 -39.033149 0 32.86978 50.066978 ) (-20.559978 -64.310989 -6.16336537 50.066978 3.84998179 -52.334915 ) (-24.798355 -40.411476 -2.31338358 -2.26794243 -12.269712 3.27272701 ) (-33.246589 -41.04306 -14.583097 1.00478482 27.22887 21.244014 ) (-34.215255 -29.416267 12.6457748 22.248802 -12.6457748 -22.248802 )) NATURAL) (2 ((126 -108) (174 -108)) NIL ((48. 0 0 0 0 0 )) NATURAL) (11 ((174 -108) (204 -86) (240 -49) (269 -8) (291 40) (303 121) (290 202) (270 250) (240 291) (204 328) (174 350)) NIL ((28.005577 18.291866 0 0 11.9665336 22.248802 ) (33.988838 29.416267 11.9665336 22.248802 -23.832668 -21.244014 ) (34.039039 41.04306 -11.8661346 1.00478410 5.36413956 -3.2727251 ) (24.854976 40.411483 -6.50199509 -2.267941 2.37611198 52.334915 ) (19.541038 64.311004 -4.1258831 50.066978 -32.868583 -50.066978 ) (-1.01914072 89.34448 -36.994468 0 39.098243 -50.066978 ) (-18.464481 64.310989 2.10378218 -50.066978 -15.5244369 52.334915 ) (-24.12292 40.411476 -13.420656 2.26794243 4.99949837 -3.27272701 ) (-35.043823 41.04306 -8.42115785 -1.00478482 19.526447 -21.244014 ) (-33.701759 29.416267 11.105289 -22.248802 -11.105289 22.248802 )) NATURAL) (2 ((174 350) (126 350)) NIL ((-48. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 52Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 14:50:44) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((49 ((225 98) (205 106) (196 133) (202 169) (218 201) (186 185) (159 162) (132 150) (105 157) (93 184) (111 202) (144 209) (203 218) (144 227) (111 234) (93 252) (105 279) (132 286) (159 274) (186 251) (218 235) (202 267) (196 303) (205 330) (225 338) (245 330) (254 303) (248 267) (232 235) (264 251) (291 274) (318 286) (345 279) (357 252) (339 234) (306 227) (247 218) (306 209) (339 202) (357 184) (345 157) (318 150) (291 162) (264 185) (232 201) (248 169) (254 133) (245 106) (225 98)) NIL ((-22.53239 0.0906766206 0.746076346 11.4537448 12.9561367 13.094705 ) (-15.308248 18.091774 13.702213 24.54845 -3.25714302 -20.196006 ) (-3.23460579 32.54222 10.44507 4.3524437 24.072422 7.68932534 ) (19.246673 40.739326 34.517494 12.041769 -123.0325 -88.561279 ) (-7.7521 8.50045587 -88.515045 -76.519516 120.0577 82.5558 ) (-36.238273 -26.741153 31.542694 6.03629685 -39.198417 4.33803749 ) (-24.294792 -18.535835 -7.65572835 10.374334 6.73594475 8.09202767 ) (-28.582546 -4.11548805 -0.919782878 18.466362 12.254642 11.293846 ) (-23.375007 19.997795 11.3348598 29.760208 34.245483 -47.267402 ) (5.08259297 26.124298 45.580345 -17.507198 -59.236595 3.77578545 ) (21.044639 10.504995 -13.65625 -13.7314129 112.70089 20.164264 ) (63.738838 6.85571576 99.044647 6.43285275 -325.5669 -6.43285275 ) (5.08129596E-6 10.0721416 -226.5223 0 325.5669 -6.43285275 ) (-63.738838 6.8557148 99.044647 -6.43285275 -112.70089 20.164264 ) (-21.044639 10.504995 -13.6562519 13.7314129 59.2366 3.77578545 ) (-5.0825901 26.124301 45.580352 17.507198 -34.245513 -47.26741 ) (23.375003 19.997791 11.3348369 -29.760215 -12.254545 11.293884 ) (28.582569 -4.11548043 -0.919708253 -18.466331 -6.7362957 8.0918808 ) (24.294712 -18.535869 -7.65600396 -10.3744506 39.199722 4.33859158 ) (36.23857 -26.741024 31.543724 -6.0358591 -120.0626 82.55374 ) (7.75098897 8.49999238 -88.51889 76.51788 123.0507 -88.5536 ) (-19.24253 40.741066 34.531845 -12.0357227 -24.140338 7.6607275 ) (3.21914434 32.535705 10.391504 -4.37499523 3.51062012 -20.08929 ) (15.365957 18.116069 13.902124 -24.464286 -13.902124 12.69643 ) (22.31702 0 -5.11072471E-7 -11.7678566 -13.90212 -12.69643 ) (15.365957 -18.116069 -13.902122 -24.464286 3.5106144 20.089286 ) (3.21914196 -32.535713 -10.391508 -4.37499714 -24.140327 -7.6607256 ) (-19.24253 -40.741066 -34.531837 -12.0357227 123.0507 88.5536 ) (7.75099564 -8.49998284 88.518875 76.51788 -120.06259 -82.55374 ) (36.23857 26.741027 -31.543724 -6.035861 39.199722 -4.33858967 ) (24.294712 18.535869 7.6560049 -10.3744506 -6.73629666 -8.0918808 ) (28.582569 4.11547947 0.919708014 -18.466331 -12.254543 -11.293884 ) (23.375003 -19.997791 -11.3348369 -29.760215 -34.245513 47.26741 ) (-5.08259106 -26.124298 -45.580352 17.507198 59.2366 -3.77578545 ) (-21.044643 -10.504995 13.6562538 13.7314129 -112.70089 -20.164264 ) (-63.738838 -6.85571576 -99.044647 -6.43285275 325.5669 6.43285275 ) (-5.08129596E-6 -10.0721416 226.5223 0 -325.5669 6.43285275 ) (63.738838 -6.8557148 -99.044647 6.43285275 112.70089 -20.164264 ) (21.044639 -10.504995 13.65625 -13.7314129 -59.236595 -3.77578545 ) (5.08259106 -26.124298 -45.580345 -17.507198 34.245483 47.267402 ) (-23.375011 -19.997795 -11.334856 29.760204 12.2546367 -11.293842 ) (-28.582546 4.11548996 0.919782162 18.466362 6.7359457 -8.09202767 ) (-24.294792 18.535839 7.65572835 10.374334 -39.198417 -4.33804226 ) (-36.238273 26.741149 -31.542694 6.03629208 120.0577 -82.555786 ) (-7.75209904 -8.50045968 88.515045 -76.5195 -123.0325 88.56126 ) (19.246673 -40.739326 -34.517494 12.041765 24.072422 -7.6893215 ) (-3.2346077 -32.54222 -10.44507 4.3524437 -3.25714302 20.196006 ) (-15.308248 -18.091774 -13.702213 24.54845 12.9561367 -13.094705 )) PSEUDOCYCLIC)))) ((FAMILY gacha) (CHARACTER 53Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:00:01) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((195 28) (245 28)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((245 28) (245 143)) NIL ((0 115. 0 0 0 0 )) NATURAL) (2 ((245 143) (360 143)) NIL ((115. 0 0 0 0 0 )) NATURAL) (2 ((360 143) (360 193)) NIL ((0 50. 0 0 0 0 )) NATURAL) (2 ((360 193) (245 193)) NIL ((-115. 0 0 0 0 0 )) NATURAL) (2 ((245 193) (245 308)) NIL ((0 115. 0 0 0 0 )) NATURAL) (2 ((245 308) (195 308)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((195 308) (195 193)) NIL ((0 -115. 0 0 0 0 )) NATURAL) (2 ((195 193) (80 193)) NIL ((-115. 0 0 0 0 0 )) NATURAL) (2 ((80 193) (80 143)) NIL ((0 -50. 0 0 0 0 )) NATURAL) (2 ((80 143) (195 143)) NIL ((115. 0 0 0 0 0 )) NATURAL) (2 ((195 143) (195 28)) NIL ((0 -115. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 54Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:04:46) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((20 ((218 -3) (205 -3) (185 9) (175 29) (181 49) (195 61) (213 66) (241 61) (255 50) (263 29) (259 -9) (247 -32) (234 -44) (215 -53) (186 -57) (170 -49) (177 -36) (195 -31) (215 -21) (218 -3)) NIL ((-10.673479 -2.67581272 0 0 -13.959116 16.054878 ) (-17.653038 5.3516264 -13.959116 16.054878 27.795578 -8.27439309 ) (-17.714363 17.269306 13.8364639 7.7804842 4.77679062 -6.95730019 ) (-1.48950290 21.57114 18.613254 0.823183776 -10.902744 -11.896402 ) (11.672378 16.446121 7.7105093 -11.073219 -9.1658039 6.54291535 ) (14.7999859 8.6443615 -1.4552958 -4.53030396 23.565967 -8.275259 ) (25.127674 -0.0235718079 22.110672 -12.8055629 -49.09806 8.5581188 ) (22.689312 -8.55007554 -26.987392 -4.2474432 28.826297 -1.95721721 ) (10.115068 -13.7761268 1.83890605 -6.2046604 -18.207134 -24.729248 ) (2.8504076 -32.345413 -16.3682289 -30.93391 8.00223924 58.874214 ) (-9.51670075 -33.842216 -8.36598969 27.940307 10.198177 -18.767623 ) (-12.7836017 -15.2857189 1.83218932 9.1726837 -6.7949562 -7.80373 ) (-14.34889 -10.0149 -4.9627676 1.3689537 -13.0183487 1.98254585 ) (-25.820835 -7.65467358 -17.981117 3.35149956 34.868362 11.8735466 ) (-26.367767 1.63359928 16.887249 15.225046 11.544872 -7.47673417 ) (-3.70808268 13.120277 28.43212 7.748312 -21.047866 -23.966606 ) (14.2001037 8.8852844 7.3842535 -16.218296 0.646611214 25.343174 ) (21.907661 5.3385763 8.0308647 9.12487985 -35.538574 0.593898773 ) (12.169237 14.760406 -27.507713 9.7187786 27.507713 -9.7187786 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 55Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:07:38) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((320 193) (120 193)) NIL ((-200. 0 0 0 0 0 )) NATURAL) (2 ((120 193) (120 143)) NIL ((0 -50. 0 0 0 0 )) NATURAL) (2 ((120 143) (320 143)) NIL ((200. 0 0 0 0 0 )) NATURAL) (2 ((320 143) (320 193)) NIL ((0 50. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 56Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:10:01) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((13 ((218 63) (231 61) (251 49) (261 29) (251 9) (231 -3) (218 -5) (205 -3) (185 9) (175 29) (185 49) (205 61) (218 63)) NIL ((10.989046 -0.181750595 -0.894697548 1.09114074 14.749813 -14.182918 ) (17.469253 -6.18206978 13.8551159 -13.0917778 -26.380886 4.36775208 ) (18.133926 -17.089969 -12.52577 -8.7240257 -11.226255 8.71190835 ) (-0.00497087091 -21.458042 -23.752025 -0.0121169965 11.285902 8.78460885 ) (-18.114044 -17.077854 -12.466123 8.77249337 26.082653 4.14965058 ) (-17.538841 -6.2305355 13.616529 12.9221439 -13.616529 -13.3832149 ) (-10.730577 9.96515154E-8 0 -0.461072266 -13.616529 13.3832149 ) (-17.538841 6.23053647 -13.616529 12.9221439 26.082653 -4.14965058 ) (-18.114044 17.077854 12.466123 8.77249337 11.285898 -8.78460885 ) (-0.00496927649 21.458042 23.752021 -0.0121165085 -11.2262497 -8.71190835 ) (18.133926 17.089969 12.525772 -8.7240257 -26.380889 -4.36775208 ) (17.469253 6.18206883 -13.8551178 -13.0917778 14.749815 14.182918 )) PSEUDOCYCLIC)))) ((FAMILY gacha) (CHARACTER 57Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:11:04) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((73 0) (321 337)) NIL ((248. 337. 0 0 0 0 )) NATURAL) (2 ((321 337) (369 337)) NIL ((48. 0 0 0 0 0 )) NATURAL) (2 ((369 337) (121 0)) NIL ((-248. -337. 0 0 0 0 )) NATURAL) (2 ((121 0) (73 0)) NIL ((-48. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 73Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:15:21) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((13 ((219 232) (206 230) (186 218) (176 198) (186 178) (206 166) (219 164) (232 166) (252 178) (262 198) (252 218) (232 230) (219 232)) NIL ((-10.989046 -0.181750595 0.894697548 1.09114074 -14.749813 -14.182918 ) (-17.469253 -6.18206978 -13.8551159 -13.0917778 26.380886 4.36775208 ) (-18.133926 -17.089969 12.52577 -8.7240257 11.226255 8.71190835 ) (0.00497087091 -21.458042 23.752025 -0.0121169965 -11.285902 8.78460885 ) (18.114044 -17.077854 12.466123 8.77249337 -26.082653 4.14965058 ) (17.538841 -6.2305355 -13.616529 12.9221439 13.616529 -13.3832149 ) (10.730577 9.96515154E-8 0 -0.461072266 13.616529 13.3832149 ) (17.538841 6.23053647 13.616529 12.9221439 -26.082653 -4.14965058 ) (18.114044 17.077854 -12.466123 8.77249337 -11.285898 -8.78460885 ) (0.00496927649 21.458042 -23.752021 -0.0121165085 11.2262497 -8.71190835 ) (-18.133926 17.089969 -12.525772 -8.7240257 26.380889 -4.36775208 ) (-17.469253 6.18206883 13.8551178 -13.0917778 -14.749815 14.182918 )) PSEUDOCYCLIC)) ((20 ((218 -3) (215 -21) (195 -31) (177 -36) (170 -49) (186 -57) (215 -53) (234 -44) (247 -32) (259 -9) (263 29) (255 50) (241 61) (213 66) (195 61) (181 49) (175 29) (185 9) (205 -3) (218 -3)) NIL ((1.58461880 -19.619796 0 0 -27.507713 9.7187805 ) (-12.169239 -14.760406 -27.507713 9.7187805 35.538574 -0.593902588 ) (-21.907661 -5.3385763 8.0308647 9.1248779 -0.646611214 -25.343174 ) (-14.2001037 -8.88528634 7.3842535 -16.218296 21.047866 23.966606 ) (3.70808458 -13.120277 28.43212 7.748312 -11.544872 7.47673417 ) (26.367767 -1.63359856 16.887249 15.225046 -34.86837 -11.8735466 ) (25.820831 7.65467358 -17.981121 3.35149956 13.018354 -1.98254537 ) (14.34889 10.0149 -4.9627657 1.36895418 6.7949543 7.80372716 ) (12.7836017 15.2857208 1.8321886 9.1726818 -10.198175 18.767623 ) (9.51670075 33.842208 -8.36598779 27.940307 -8.00224114 -58.874214 ) (-2.85040808 32.345413 -16.3682289 -30.93391 18.207134 24.729248 ) (-10.115068 13.7761268 1.83890652 -6.20466138 -28.826297 1.95721817 ) (-22.689312 8.5500736 -26.987392 -4.2474432 49.09806 -8.5581188 ) (-25.127674 0.0235716477 22.110672 -12.8055629 -23.565967 8.275259 ) (-14.7999859 -8.6443615 -1.45529556 -4.53030396 9.1658039 -6.54291535 ) (-11.672378 -16.446121 7.7105093 -11.073219 10.902744 11.896402 ) (1.48950433 -21.57114 18.613254 0.823183776 -4.77679062 6.95730019 ) (17.714363 -17.269306 13.8364639 7.7804842 -27.795578 8.27439309 ) (17.653038 -5.35162544 -13.959116 16.054878 13.959116 -16.054878 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 72Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 20-SEP-77 15:16:21) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((7 ((219 164) (206 166) (186 178) (176 198) (186 218) (206 230) (219 232)) NIL ((-10.730768 -0.133333206 0 0 -13.615383 12.799999 ) (-17.538459 6.2666664 -13.615383 12.799999 26.076919 -4. ) (-18.115383 17.066665 12.461538 8.79999925 11.3076915 -8.79999925 ) (6.37024641E-7 21.466663 23.769229 0 -11.307693 -8.79999925 ) (18.115383 17.066665 12.461536 -8.79999925 -26.076919 -4. ) (17.538459 6.2666664 -13.615383 -12.799999 13.615383 12.799999 )) NATURAL) (7 ((219 232) (232 230) (252 218) (262 198) (252 178) (232 166) (219 164)) NIL ((10.730768 0.133333206 0 0 13.615383 -12.799999 ) (17.538459 -6.2666664 13.615383 -12.799999 -26.076919 4. ) (18.115383 -17.066665 -12.461538 -8.79999925 -11.3076915 8.79999925 ) (-6.37024641E-7 -21.466663 -23.769229 0 11.307693 8.79999925 ) (-18.115383 -17.066665 -12.461536 8.79999925 26.076919 4. ) (-17.538459 -6.2666664 13.615383 12.799999 -13.615383 -12.799999 )) NATURAL)) ((7 ((219 -3) (206 -1) (186 11) (176 31) (186 51) (206 63) (219 65)) NIL ((-10.730768 -0.133333206 0 0 -13.615383 12.799999 ) (-17.538459 6.2666664 -13.615383 12.799999 26.076919 -4. ) (-18.115383 17.066665 12.461538 8.79999925 11.3076915 -8.79999925 ) (6.37024641E-7 21.466663 23.769229 0 -11.307693 -8.79999925 ) (18.115383 17.066665 12.461536 -8.79999925 -26.076919 -4. ) (17.538459 6.2666664 -13.615383 -12.799999 13.615383 12.799999 )) NATURAL) (7 ((219 65) (232 63) (252 51) (262 31) (252 11) (232 -1) (219 -3)) NIL ((10.730768 0.133333206 0 0 13.615383 -12.799999 ) (17.538459 -6.2666664 13.615383 -12.799999 -26.076919 4. ) (18.115383 -17.066665 -12.461538 -8.79999925 -11.3076915 8.79999925 ) (-6.37024641E-7 -21.466663 -23.769229 0 11.307693 8.79999925 ) (-18.115383 -17.066665 -12.461536 8.79999925 26.076919 4. ) (-17.538459 -6.2666664 13.615383 12.799999 -13.615383 -12.799999 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 45Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 8:31:26) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((17 ((118 338) (159 333) (186 321) (201 303) (207 277) (201 251) (186 233) (159 221) (118 216) (78 221) (51 233) (36 251) (30 277) (36 303) (51 321) (78 333) (118 338)) NIL ((43.632125 -0.0974335671 1.31016326 -11.476913 -19.723274 5.01534176 ) (35.08065 -9.0666752 -18.413112 -6.4615717 6.75541115 1.78477382 ) (20.045242 -14.63586 -11.657701 -4.67679787 4.70163059 -6.1544361 ) (10.7383575 -22.389877 -6.9560709 -10.8312339 -7.56193638 10.832973 ) (0.00131877139 -27.804622 -14.518007 0.00173969077 7.5461092 10.8225345 ) (-10.743633 -22.391616 -6.97189809 10.8242759 -4.62250042 -6.1231203 ) (-20.026783 -14.6289 -11.594398 4.70115566 -7.05610657 1.66994285 ) (-35.14923 -9.09277345 -18.650505 6.3710985 20.846931 5.4433527 ) (-43.376274 0 2.19642639 11.814451 13.668373 -5.44335366 ) (-34.345657 9.09277345 15.864799 6.37109757 -3.52042198 -1.66994095 ) (-20.241073 14.6289 12.344377 4.70115662 -5.5866909 6.12311745 ) (-10.6900406 22.391616 6.7576866 10.824274 7.8671856 -10.8225326 ) (0.00123898312 27.804622 14.624872 0.00174020207 -7.8820505 -10.832975 ) (10.685085 22.389877 6.7428217 -10.8312358 5.6610155 6.154438 ) (20.258415 14.63586 12.403837 -4.67679787 3.23799324 -1.78477382 ) (34.281242 9.0666752 15.64183 -6.4615717 -12.6129837 -5.01534176 )) PSEUDOCYCLIC)) ((13 ((318 25) (342 29) (364 43) (370 61) (364 79) (342 93) (318 96) (294 93) (272 79) (266 61) (272 43) (294 29) (318 25)) NIL ((24.01675 0.0585110932 -1.65684819 5.3434658 4.87002945 7.618536 ) (24.794918 9.21124459 3.2131815 12.9620018 -26.409057 -10.1534767 ) (14.803571 17.096508 -23.195877 2.80852413 16.766201 -3.00462341 ) (-0.00920486450 18.402717 -6.42967606 -0.196099460 -16.655742 -1.82802653 ) (-14.766752 17.292606 -23.085418 -2.02412605 25.856773 -13.683267 ) (-24.923782 8.42684747 2.77135515 -15.707393 -2.77135515 14.56109 ) (-23.538105 -8.00937414E-8 -1.27768117E-7 -1.14630294 -2.7713542 -14.56109 ) (-24.923782 -8.42684747 -2.77135467 -15.707393 25.856773 13.6832657 ) (-14.766752 -17.292606 23.085418 -2.02412653 -16.655742 1.82802701 ) (-0.00920422748 -18.402717 6.42967606 -0.196099311 16.766197 3.00462294 ) (14.803571 -17.096508 23.195873 2.80852365 -26.409053 10.1534767 ) (24.794918 -9.21124459 -3.21318102 12.9620018 4.8700285 -7.61853696 )) PSEUDOCYCLIC)) ((2 ((324 337) (73 0)) NIL ((-251. -337. 0 0 0 0 )) NATURAL) (3 ((73 0) (73 0) (118 0)) NIL ((-11.25 0 0 0 67.5 0 ) (22.5 0 67.5 0 -67.5 0 )) NATURAL) (2 ((118 0) (369 337)) NIL ((251. 337. 0 0 0 0 )) NATURAL) (2 ((369 337) (324 337)) NIL ((-45. 0 0 0 0 0 )) NATURAL)) ((17 ((319 122) (360 117) (387 105) (402 87) (408 61) (402 35) (387 17) (360 5) (319 0) (279 5) (252 17) (237 35) (231 61) (237 87) (252 105) (279 117) (319 122)) NIL ((43.632125 -0.0974335671 1.31016326 -11.476913 -19.723274 5.01534176 ) (35.08065 -9.0666752 -18.413112 -6.4615717 6.75541115 1.78477382 ) (20.045242 -14.63586 -11.657701 -4.67679787 4.70163059 -6.1544361 ) (10.7383575 -22.389877 -6.9560709 -10.8312339 -7.56193638 10.832973 ) (0.00131877139 -27.804622 -14.518007 0.00173969077 7.5461092 10.8225345 ) (-10.743633 -22.391616 -6.97189809 10.8242759 -4.62250042 -6.1231203 ) (-20.026783 -14.6289 -11.594398 4.70115566 -7.05610657 1.66994285 ) (-35.14923 -9.09277345 -18.650505 6.3710985 20.846931 5.4433527 ) (-43.376274 0 2.19642639 11.814451 13.668373 -5.44335366 ) (-34.345657 9.09277345 15.864799 6.37109757 -3.52042198 -1.66994095 ) (-20.241073 14.6289 12.344377 4.70115662 -5.5866909 6.12311745 ) (-10.6900406 22.391616 6.7576866 10.824274 7.8671856 -10.8225326 ) (0.00123898312 27.804622 14.624872 0.00174020207 -7.8820505 -10.832975 ) (10.685085 22.389877 6.7428217 -10.8312358 5.6610155 6.154438 ) (20.258415 14.63586 12.403837 -4.67679787 3.23799324 -1.78477382 ) (34.281242 9.0666752 15.64183 -6.4615717 -12.6129837 -5.01534176 )) PSEUDOCYCLIC)) ((13 ((118 312) (142 309) (164 295) (170 277) (164 259) (142 245) (118 241) (94 245) (72 259) (66 277) (72 295) (94 309) (118 312)) NIL ((23.538459 -0.330866456 0 0 2.76922989 -16.014801 ) (24.923076 -8.33826829 2.76922989 -16.014801 -25.846149 14.074016 ) (14.769228 -17.316059 -23.076919 -1.94078445 16.615379 1.71872663 ) (-6.37024641E-7 -18.39748 -6.4615383 -0.222057670 -16.615379 3.0510726 ) (-14.7692318 -17.094001 -23.076919 2.82901525 25.846149 10.0769786 ) (-24.923076 -9.22649766 2.76923036 12.905994 -2.76922989 -7.35899258 ) (-23.538459 3.18512320E-7 2.55536235E-7 5.54700184 -2.76923132 7.35899258 ) (-24.923076 9.22649766 -2.76923132 12.905994 25.846153 -10.0769786 ) (-14.7692299 17.094001 23.076923 2.82901478 -16.6153869 -3.05107212 ) (6.37024641E-7 18.39748 6.4615364 -0.222057640 16.6153869 -1.71872687 ) (14.7692299 17.316059 23.076923 -1.94078469 -25.846153 -14.074014 ) (24.923076 8.33826638 -2.76923084 -16.014801 2.76923084 16.014801 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 44Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 9:30:26) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((236 364) (236 344)) NIL ((0 -20. 0 0 0 0 )) NATURAL) (7 ((236 344) (277 339) (309 330) (331 320) (348 309) (363 291) (367 260)) NIL ((42.793586 -4. 0 0 -10.7615375 -6. ) (37.412818 -7. -10.7615375 -6. -0.192308426 6. ) (26.555126 -9.9999981 -10.9538459 6.81195899E-8 5.5307703 -3.23568030E-7 ) (18.366664 -10. -5.42307568 -2.55448469E-7 8.0692272 -5.9999981 ) (16.978202 -13. 2.6461525 -5.99999905 -19.807685 -12. ) (9.72051049 -25. -17.161533 -18. 17.161533 18. )) NATURAL) (2 ((367 260) (329 260)) NIL ((-38. 0 0 0 0 0 )) NATURAL) (6 ((329 260) (324 280) (312 294) (288 305) (261 312) (236 316)) NIL ((-3.91866016 21.454544 0 0 -6.488039 -8.72727204 ) (-7.16267968 17.090908 -6.488039 -8.72727204 -9.5598049 7.63636208 ) (-18.430622 12.181818 -16.0478439 -1.09090924 14.727268 -3.81818056 ) (-27.11483 9.1818161 -1.32057404 -4.90909004 4.65071678 1.63636303 ) (-26.110046 5.090909 3.33014345 -3.27272701 -3.33014345 3.27272701 )) NATURAL) (2 ((236 316) (236 197)) NIL ((0 -119. 0 0 0 0 )) NATURAL) (11 ((236 197) (280 187) (313 177) (342 161) (366 136) (376 92) (370 55) (346 27) (313 9) (274 -1) (236 -6)) NIL ((46.700439 -10.36273 0 0 -16.202648 2.17638588 ) (38.599113 -9.27453805 -16.202648 2.17638588 15.013242 -10.881929 ) (29.903087 -12.5391159 -1.18940448 -8.7055435 -1.85032797 5.3513317 ) (27.78852 -18.568992 -3.03973246 -3.35421133 -13.6119308 -28.523391 ) (17.942817 -36.184898 -16.651664 -31.877605 2.29807663 48.74224 ) (2.44018984 -43.691383 -14.353588 16.864639 -7.58037568 -10.4455948 ) (-15.703586 -32.049545 -21.933963 6.41904355 16.023418 5.0401411 ) (-29.625843 -23.110427 -5.9105444 11.4591846 -2.51330852 -3.71496868 ) (-36.793037 -13.508728 -8.4238529 7.74421597 12.0298156 -2.18027019 ) (-39.20198 -6.8546486 3.60596323 5.56394577 -3.60596323 -5.56394577 )) NATURAL) (2 ((236 -6) (236 -35)) NIL ((0 -29. 0 0 0 0 )) NATURAL) (2 ((236 -35) (192 -35)) NIL ((-44. 0 0 0 0 0 )) NATURAL) (2 ((192 -35) (192 -6)) NIL ((0 29. 0 0 0 0 )) NATURAL) (6 ((192 -6) (141 -4) (99 8) (75 23) (55 49) (46 85)) NIL ((-52.143539 -0.626794100 0 0 6.8612442 15.760765 ) (-48.712913 7.2535877 6.8612442 15.760765 19.693779 -18.803825 ) (-32.004783 13.61244 26.555023 -3.04306173 -31.63636 17.45454 ) (-21.26794 19.296649 -5.08133984 14.4114818 22.851673 -3.0143528 ) (-14.9234447 32.20095 17.770336 11.397129 -17.770336 -11.397129 )) NATURAL) (2 ((46 85) (90 85)) NIL ((44. 0 0 0 0 0 )) NATURAL) (6 ((90 85) (93 69) (103 49) (127 33) (162 25) (192 22)) NIL ((1.89473676 -14.770334 0 0 6.63157845 -7.37798978 ) (5.21052647 -18.459327 6.63157845 -7.37798978 8.84210588 12.8899498 ) (16.2631569 -19.392341 15.473684 5.51196099 -1.90734863E-6 3.81818199 ) (31.736839 -11.9712906 15.473682 9.33014298 -26.842102 -4.16267872 ) (33.789466 -4.72248745 -11.3684196 5.16746426 11.3684196 -5.16746426 )) NATURAL) (2 ((192 22) (192 159)) NIL ((0 137. 0 0 0 0 )) NATURAL) (11 ((192 159) (151 173) (118 185) (93 197) (70 219) (61 263) (73 296) (94 315) (124 331) (160 341) (192 344)) NIL ((-42.561904 14.467121 0 0 9.37145997 -2.80273056 ) (-37.876174 13.0657558 9.37145997 -2.80273056 1.14269447 2.01365328 ) (-27.933368 11.2698516 10.514154 -0.789076925 -13.9422378 6.74811555 ) (-24.390335 13.854833 -3.4280839 5.95903874 18.626262 30.993877 ) (-18.505283 35.310806 15.198179 36.952919 11.437181 -58.72363 ) (2.41148281 42.901908 26.63536 -21.770717 -22.374977 5.900671 ) (17.859352 24.081527 4.26038075 -15.870046 6.06273175 17.120952 ) (25.1511 16.771957 10.323112 1.25090599 -1.87594414 -8.38448144 ) (34.536239 13.830625 8.44716836 -7.13357545 -16.5589599 -1.5830307 ) (34.703926 5.90553475 -8.1117916 -8.71660615 8.1117916 8.71660615 )) NATURAL) (2 ((192 344) (192 364)) NIL ((0 20. 0 0 0 0 )) NATURAL) (2 ((192 364) (236 364)) NIL ((44. 0 0 0 0 0 )) NATURAL)) ((2 ((192 316) (192 212)) NIL ((0 -104. 0 0 0 0 )) NATURAL) (9 ((192 212) (160 221) (133 229) (109 243) (103 266) (115 290) (134 304) (161 312) (192 316)) NIL ((-33.384933 9.54270936 0 0 8.3096447 -3.25625897 ) (-29.230114 7.9145794 8.3096447 -3.25625897 -11.548229 10.2812957 ) (-26.694583 9.79896928 -3.238585 7.0250368 25.883277 4.13107395 ) (-16.991527 18.889541 22.644695 11.1561107 -1.98490143 -8.8055935 ) (4.66071415 25.642856 20.659793 2.35051584 -17.943664 -16.908687 ) (16.348674 19.539024 2.71612644 -14.558174 7.75957204 10.440353 ) (22.944587 10.2010288 10.475698 -4.11781979 -7.09462357 -0.852724076 ) (29.872974 5.65684796 3.3810749 -4.97054386 -3.3810749 4.97054386 )) NATURAL)) ((10 ((236 143) (268 135) (301 125) (326 111) (339 86) (333 61) (313 41) (286 31) (262 26) (236 23)) NIL ((31.306991 -7.5433216 0 0 4.15804672 -2.74006653 ) (33.386009 -8.91335488 4.15804672 -2.74006653 -14.790233 1.70033264 ) (30.148944 -10.803255 -10.6321869 -1.03973388 1.00288772 -16.061264 ) (20.018199 -19.873619 -9.62929917 -17.1009979 -13.221313 20.544723 ) (3.77824688 -26.702255 -22.850612 3.44372892 9.88235665 -0.117646694 ) (-14.131187 -23.317348 -12.968256 3.32608223 3.69189644 9.92585755 ) (-25.253494 -15.028337 -9.27635957 13.2519397 17.350055 -9.58579064 ) (-25.854827 -6.56929303 8.07369615 3.66614914 -13.092119 -1.58268642 ) (-24.32719 -3.69448757 -5.01842404 2.08346271 5.01842404 -2.08346271 )) NATURAL) (2 ((236 23) (236 143)) NIL ((0 120. 0 0 0 0 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.S2-SF b/lispusers/GACHAE.S2-SF new file mode 100644 index 00000000..e293c5ed --- /dev/null +++ b/lispusers/GACHAE.S2-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 74Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:22:05) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((60 169) (312 0)) NIL ((252. -169. 0 0 0 0 )) NATURAL) (2 ((312 0) (372 0)) NIL ((60. 0 0 0 0 0 )) NATURAL) (2 ((372 0) (120 169)) NIL ((-252. 169. 0 0 0 0 )) NATURAL) (2 ((120 169) (370 337)) NIL ((250. 168. 0 0 0 0 )) NATURAL) (2 ((370 337) (310 337)) NIL ((-60. 0 0 0 0 0 )) NATURAL) (2 ((310 337) (60 169)) NIL ((-250. -168. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 75Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:22:46) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((82 148) (82 148)) NIL ((0 0 0 0 0 0 )) NATURAL)) ((2 ((82 148) (357 148)) NIL ((275. 0 0 0 0 0 )) NATURAL) (2 ((357 148) (357 108)) NIL ((0 -40. 0 0 0 0 )) NATURAL) (2 ((357 108) (82 108)) NIL ((-275. 0 0 0 0 0 )) NATURAL) (2 ((82 108) (82 148)) NIL ((0 40. 0 0 0 0 )) NATURAL)) ((2 ((82 190) (357 190)) NIL ((275. 0 0 0 0 0 )) NATURAL) (2 ((357 190) (357 230)) NIL ((0 40. 0 0 0 0 )) NATURAL) (2 ((357 230) (82 230)) NIL ((-275. 0 0 0 0 0 )) NATURAL) (2 ((82 230) (82 190)) NIL ((0 -40. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 76Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:24:09) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((2 ((370 169) (118 0)) NIL ((-252. -169. 0 0 0 0 )) NATURAL) (2 ((118 0) (58 0)) NIL ((-60. 0 0 0 0 0 )) NATURAL) (2 ((58 0) (310 169)) NIL ((252. 169. 0 0 0 0 )) NATURAL) (2 ((310 169) (60 337)) NIL ((-250. 168. 0 0 0 0 )) NATURAL) (2 ((60 337) (120 337)) NIL ((60. 0 0 0 0 0 )) NATURAL) (2 ((120 337) (370 169)) NIL ((250. -168. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 77Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:35:10) (MADE-FROM gacha.cu 0 140 0 0) (SPLINES ((13 ((248 24) (243 6) (228 -9) (204 -14) (180 -9) (165 6) (160 24) (165 42) (180 57) (204 62) (228 57) (243 42) (248 24)) NIL ((-2.93116188 -18.230766 0 0 -12.4130268 1.38461542 ) (-9.13767625 -17.538459 -12.4130268 1.38461542 2.06513786 11.076921 ) (-20.518135 -10.615383 -10.3478889 12.461538 10.152477 -3.69230843 ) (-25.789783 3.18512320E-7 -0.195410430 8.7692299 11.3249416 3.69230843 ) (-20.322723 10.615383 11.1295318 12.461538 -1.45225525 -11.076921 ) (-9.91931916 17.538459 9.6772766 1.38461518 0.484085083 -1.38461518 ) (3.18512320E-7 18.230766 10.1613617 -1.91652190E-7 -0.484086990 -1.38461423 ) (9.91931916 17.538459 9.6772747 -1.38461446 1.45225715 -11.076923 ) (20.322723 10.615383 11.1295318 -12.461538 -11.3249416 3.69230843 ) (25.789783 -3.18512320E-7 -0.195410639 -8.7692299 -10.152477 -3.69230843 ) (20.518131 -10.615383 -10.3478889 -12.461538 -2.06513786 11.076921 ) (9.13767434 -17.538459 -12.4130268 -1.38461518 12.4130268 1.38461518 )) NATURAL)) ((18 ((76 258) (82 281) (100 310) (141 337) (184 345) (222 347) (265 344) (301 336) (330 322) (351 301) (358 272) (351 242) (325 219) (291 200) (256 185) (234 163) (230 120) (230 82)) NIL ((4.36275196 21.588817 0 0 9.8234863 8.46708489 ) (9.27449418 25.82236 9.8234863 8.46708489 22.882568 -6.33543015 ) (30.539264 31.12173 32.706054 2.13165474 -35.353759 -31.125358 ) (45.568435 17.690704 -2.64770508 -28.993705 -7.4675293 28.836875 ) (39.186965 3.11543942 -10.115234 -0.156827688 23.223876 -6.22215367 ) (40.68367 -0.152465343 13.108642 -6.3789816 -25.427978 2.05173683 ) (41.078323 -5.505579 -12.3193378 -4.32724476 6.48805333 -1.9847908 ) (32.003013 -10.825218 -5.83128453 -6.31203557 -0.524238587 -0.112575531 ) (25.909606 -17.193542 -6.3555231 -6.4246111 -10.391092 -3.56490803 ) (14.358539 -25.400604 -16.746616 -9.9895191 6.0886116 8.3722038 ) (0.656227112 -31.20402 -10.6580047 -1.61731481 -13.963348 12.0760917 ) (-16.983448 -26.78329 -24.621353 10.458778 19.764766 -8.6765785 ) (-31.722419 -20.662803 -4.85658455 1.78219914 0.904281617 4.63022518 ) (-36.12686 -16.56549 -3.95230293 6.41242505 18.618099 -9.8443241 ) (-30.770114 -15.075229 14.665796 -3.43189907 8.6233196 -31.252922 ) (-11.7926578 -34.13359 23.289115 -34.684822 -23.111393 50.856025 ) (-0.0592400506 -43.390396 0.177720159 16.171203 -0.177720159 -16.171203 )) NATURAL) (2 ((230 82) (178 82)) NIL ((-52. 0 0 0 0 0 )) NATURAL) (9 ((178 82) (176 130) (179 173) (191 195) (215 207) (241 217) (277 231) (300 247) (306 274)) NIL ((-2.93114853 48.008277 0 0 5.58689213 -0.0497055054 ) (-0.137702286 47.983429 5.58689213 -0.0497055054 2.06553745 -29.751472 ) (6.4819584 33.057983 7.65242959 -29.801178 10.150957 23.055595 ) (19.209865 14.7846088 17.803386 -6.74558068 -24.669364 3.52908611 ) (24.678569 9.8035698 -6.86597825 -3.21649456 28.526504 10.828054 ) (32.075843 12.001104 21.660526 7.6115608 -41.43666 -10.8413086 ) (33.018035 14.1920089 -19.776138 -3.2297492 -0.779823304 20.537181 ) (12.8519859 21.230854 -20.555961 17.307434 20.555961 -17.307434 )) NATURAL) (8 ((306 274) (300 293) (276 312) (234 318) (202 317) (155 308) (133 281) (128 258)) NIL ((-2.76743364 18.186187 0 0 -19.395397 4.88285733 ) (-12.4651317 20.627616 -19.395397 4.88285733 -11.023014 -24.414283 ) (-37.372032 13.303329 -30.41841 -19.531429 63.487457 14.774301 ) (-36.046714 1.15905142 33.069046 -4.7571268 -74.926818 1.31707191 ) (-40.441085 -2.9395399 -41.85778 -3.44005489 86.219848 -26.042594 ) (-39.188934 -19.40089 44.362075 -29.48265 -29.952594 42.853309 ) (-9.8031597 -27.456886 14.409479 13.3706627 -14.409479 -13.3706627 )) NATURAL) (2 ((128 258) (76 258)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 100Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:41:59) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((25 ((274 84) (315 89) (349 101) (378 127) (388 169) (382 261) (346 310) (312 329) (274 340) (222 346) (169 340) (132 329) (97 310) (61 261) (49 169) (61 77) (99 29) (132 9) (169 -2) (222 -8) (273 -1) (312 10) (339 25) (357 40) (372 65)) NIL ((42.841934 4.12846947 0 0 -11.051645 5.22917843 ) (37.316116 6.74305916 -11.051645 5.22917843 13.25823 15.8541069 ) (32.893585 19.899292 2.2065854 21.083286 -29.98128 -26.645618 ) (20.109527 27.659767 -27.774696 -5.562335 22.666904 102.72837 ) (3.66828489 73.461624 -5.10779095 97.166046 -42.686332 -180.2678 ) (-22.782672 80.49371 -47.794128 -83.101837 64.07843 60.343216 ) (-38.537582 27.563484 16.284305 -22.758621 -21.627391 16.8949508 ) (-33.066978 13.252338 -5.3430872 -5.8636694 -13.568861 4.07696724 ) (-45.194496 9.42715455 -18.911949 -1.78670144 15.902847 -15.202821 ) (-56.15502 0.0390407219 -3.00910091 -16.9895248 27.957454 14.734329 ) (-45.185394 -9.5833187 24.948356 -2.25519466 -25.732685 -1.7344985 ) (-33.103378 -12.7057628 -0.784330249 -3.98969317 -9.0267067 -25.796333 ) (-38.401062 -29.593627 -9.81103707 -29.786029 43.839515 -27.080135 ) (-26.292339 -72.91972 34.02848 -56.866165 -16.33139 56.116867 ) (-0.429553986 -101.7274 17.69709 -0.749291659 21.486053 60.612625 ) (28.010566 -72.170425 39.183143 59.863334 -57.61283 -34.567375 ) (38.38729 -29.590789 -18.429687 25.295959 22.96529 -18.343135 ) (31.440254 -13.466398 4.53560543 6.95282174 19.751655 -6.06007004 ) (45.851684 -9.5436115 24.287262 0.892751694 -29.971923 18.583416 ) (55.152984 0.640850663 -5.68466473 19.476169 -7.86394025 -20.273609 ) (45.536346 9.98021318 -13.5486049 -0.797443152 1.42769622 8.51104165 ) (32.70159 13.438291 -12.1209087 7.71360016 2.15315056 -13.770559 ) (21.65726 14.266613 -9.96775819 -6.0569601 7.9596977 22.571197 ) (15.669353 19.49525 -2.00806045 16.51424 2.00806045 -16.51424 )) NATURAL) (2 ((372 65) (326 65)) NIL ((-46. 0 0 0 0 0 )) NATURAL) (13 ((326 65) (310 43) (285 30) (260 22) (223 17) (194 19) (167 25) (140 37) (120 53) (103 82) (98 111) (96 143) (95 169)) NIL ((-13.31982 -24.077533 0 0 -16.0810699 12.4652157 ) (-21.360355 -17.8449249 -16.0810699 12.4652157 26.405349 -8.32608224 ) (-24.23875 -9.5427513 10.3242817 4.1391325 -35.540336 -3.16088247 ) (-31.684639 -6.98406029 -25.21606 0.978249670 43.756027 8.96961595 ) (-35.022682 -1.52100181 18.53997 9.94786645 -19.483806 -8.7175865 ) (-26.224617 4.0680704 -0.943838716 1.23027920 -1.82078004 7.90073395 ) (-28.078846 9.24871636 -2.76461887 9.13101388 14.766931 -10.885349 ) (-23.459995 12.937055 12.0023136 -1.75433612 -15.246952 23.640663 ) (-19.081157 23.003051 -3.24463844 21.886329 22.220874 -29.677307 ) (-11.2153568 30.050727 18.976238 -7.79098035 -19.636566 17.068573 ) (-2.05740309 30.794033 -0.660330892 9.2775936 2.32541323 -20.596992 ) (-1.55502748 29.773132 1.66508269 -11.3193988 -1.66508269 11.3193988 )) NATURAL) (9 ((95 169) (96 195) (98 227) (103 256) (120 285) (140 301) (167 313) (194 319) (223 321)) NIL ((0.722201824 24.113586 0 0 1.66678905 11.318481 ) (1.55559635 29.772827 1.66678905 11.318481 -2.33394575 -20.592411 ) (2.05541229 30.7951 -0.667156935 -9.2739315 19.668994 17.051174 ) (11.222753 30.046756 19.001838 7.7772455 -22.34204 -29.612293 ) (19.053569 23.017852 -3.34020567 -21.835048 15.699186 23.398006 ) (23.562957 12.881811 12.358982 1.56295967 -16.454708 -9.97974778 ) (27.694583 9.454895 -4.09572888 -8.4167881 8.11966134 4.52098465 ) (27.658687 3.29860067 4.02393246 -3.89580298 -4.02393246 3.89580298 )) NATURAL) (7 ((223 321) (252 319) (279 313) (306 301) (326 285) (343 256) (348 227)) NIL ((29.670509 -1.34871792 0 0 -4.02307606 -3.90769243 ) (27.658973 -3.30256414 -4.02307606 -3.90769243 8.11538316 -4.46153736 ) (27.693588 -9.44102479 4.09230709 -8.36923028 -16.438457 9.7538433 ) (23.566665 -12.933332 -12.346153 1.38461446 15.63846 -22.55384 ) (19.039741 -22.825641 3.29230738 -21.169227 -22.115379 26.461532 ) (11.2743568 -30.764099 -18.823074 5.2923069 18.823074 -5.2923069 )) NATURAL) (12 ((348 227) (324 241) (300 250) (262 253) (217 242) (192 227) (174 204) (166 168) (181 124) (204 103) (231 91) (274 84)) NIL ((-24.775428 15.165264 0 0 4.6525793 -6.99158669 ) (-22.449138 11.6694698 4.6525793 -6.99158669 -23.262893 4.95793438 ) (-29.428009 7.1568508 -18.610317 -2.0336523 4.3990097 -18.8401489 ) (-45.83882 -4.2968769 -14.211307 -20.873802 47.666854 22.402671 ) (-36.216697 -13.969343 33.45555 1.52886963 -33.066444 -10.770544 ) (-19.294372 -17.825744 0.389100015 -9.2416744 6.59894753 -3.32049179 ) (-15.605798 -28.727664 6.9880476 -12.562166 24.670658 -5.9474926 ) (3.71757555 -44.26358 31.658706 -18.509658 -27.281574 57.110458 ) (21.735492 -34.218002 4.37713242 38.600799 -5.54436779 -36.494346 ) (23.340442 -13.8643818 -1.16723537 2.10645246 25.459041 4.86693383 ) (34.902725 -9.32446099 24.291809 6.97338677 -24.291809 -6.97338677 )) NATURAL)) ((21 ((203 170) (205 183) (211 201) (225 217) (249 226) (270 229) (291 226) (315 217) (329 201) (335 183) (337 170) (335 157) (329 139) (315 123) (291 114) (270 111) (249 114) (225 123) (211 139) (205 157) (203 170)) NIL ((1.29664564 11.627071 0 0 4.2201252 8.2375679 ) (3.40670824 15.745855 4.2201252 8.2375679 2.89937305 -11.187843 ) (9.076519 18.389499 7.11949826 -2.95027637 8.18238069 -5.48618603 ) (20.287208 12.6961307 15.3018799 -8.4364624 -23.628898 3.13259506 ) (23.774639 5.82596588 -8.32702066 -5.30386734 8.33322335 -1.04419803 ) (19.614231 -3.18512320E-7 0.00620389823 -6.34806538 8.29599954 1.04419803 ) (23.768432 -5.82596684 8.30220414 -5.30386734 -23.517223 -3.13259506 ) (20.312023 -12.6961326 -15.215021 -8.4364624 7.772912 5.48618603 ) (8.98345948 -18.389499 -7.4421091 -2.9502759 4.42556858 11.187843 ) (3.75413466 -15.745855 -3.01654005 8.2375679 -1.47518968 -8.2375679 ) (-8.00937414E-8 -11.627071 -4.49172974 0 1.47518968 -8.2375679 ) (-3.75413513 -15.745855 -3.01654005 -8.2375679 -4.42556763 11.187843 ) (-8.98345948 -18.389499 -7.44210816 2.95027685 -7.77291489 5.48618508 ) (-20.312023 -12.6961307 -15.215023 8.4364624 23.517227 -3.13259506 ) (-23.768432 -5.82596588 8.30220414 5.30386734 -8.29599954 1.04419803 ) (-19.614231 1.59256160E-7 0.00620390940 6.34806538 -8.33322335 -1.04419708 ) (-23.774639 5.82596684 -8.32702066 5.3038683 23.628898 3.1325941 ) (-20.287208 12.6961326 15.3018779 8.4364624 -8.18237878 -5.48618603 ) (-9.076519 18.389499 7.11949826 2.9502759 -2.89937305 -11.187843 ) (-3.40670824 15.745855 4.2201252 -8.2375679 -4.2201252 8.2375679 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 133Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:43:08) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((346 351) (94 351)) NIL ((-252. 0 0 0 0 0 )) NATURAL) (2 ((94 351) (94 -112)) NIL ((0 -463. 0 0 0 0 )) NATURAL) (2 ((94 -112) (346 -112)) NIL ((252. 0 0 0 0 0 )) NATURAL) (2 ((346 -112) (346 -76)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((346 -76) (141 -76)) NIL ((-205. 0 0 0 0 0 )) NATURAL) (2 ((141 -76) (141 315)) NIL ((0 391. 0 0 0 0 )) NATURAL) (2 ((141 315) (346 315)) NIL ((205. 0 0 0 0 0 )) NATURAL) (2 ((346 315) (346 351)) NIL ((0 36. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 134Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:44:28) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((117 337) (370 0)) NIL ((253. -337. 0 0 0 0 )) NATURAL) (2 ((370 0) (322 0)) NIL ((-48. 0 0 0 0 0 )) NATURAL) (2 ((322 0) (69 337)) NIL ((-253. 337. 0 0 0 0 )) NATURAL) (2 ((69 337) (117 337)) NIL ((48. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 135Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:45:24) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((346 351) (94 351)) NIL ((-252. 0 0 0 0 0 )) NATURAL) (2 ((94 351) (94 315)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((94 315) (299 315)) NIL ((205. 0 0 0 0 0 )) NATURAL) (2 ((299 315) (299 -76)) NIL ((0 -391. 0 0 0 0 )) NATURAL) (2 ((299 -76) (94 -76)) NIL ((-205. 0 0 0 0 0 )) NATURAL) (2 ((94 -76) (94 -112)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((94 -112) (346 -112)) NIL ((252. 0 0 0 0 0 )) NATURAL) (2 ((346 -112) (346 351)) NIL ((0 463. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 136Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:48:17) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((219 302) (71 183)) NIL ((-148. -119. 0 0 0 0 )) NATURAL) (2 ((71 183) (121 183)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((121 183) (198 239)) NIL ((77. 56. 0 0 0 0 )) NATURAL) (2 ((198 239) (198 42)) NIL ((0 -197. 0 0 0 0 )) NATURAL) (2 ((198 42) (240 42)) NIL ((42. 0 0 0 0 0 )) NATURAL) (2 ((240 42) (240 239)) NIL ((0 197. 0 0 0 0 )) NATURAL) (2 ((240 239) (316 183)) NIL ((76. -56. 0 0 0 0 )) NATURAL) (2 ((316 183) (366 183)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((366 183) (219 302)) NIL ((-147. 119. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 137Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:49:20) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((22 169) (198 285)) NIL ((176. 116. 0 0 0 0 )) NATURAL) (2 ((198 285) (198 233)) NIL ((0 -52. 0 0 0 0 )) NATURAL) (2 ((198 233) (130 191)) NIL ((-68. -42. 0 0 0 0 )) NATURAL) (2 ((130 191) (411 191)) NIL ((281. 0 0 0 0 0 )) NATURAL) (2 ((411 191) (411 147)) NIL ((0 -44. 0 0 0 0 )) NATURAL) (2 ((411 147) (130 147)) NIL ((-281. 0 0 0 0 0 )) NATURAL) (2 ((130 147) (198 105)) NIL ((68. -42. 0 0 0 0 )) NATURAL) (2 ((198 105) (198 53)) NIL ((0 -52. 0 0 0 0 )) NATURAL) (2 ((198 53) (22 169)) NIL ((-176. 116. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 173Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:53:08) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((7 ((313 351) (284 348) (250 338) (224 326) (205 311) (191 293) (182 259)) NIL ((-27.201278 -1.20512819 0 0 -10.7923069 -10.7692299 ) (-32.597435 -6.5897436 -10.7923069 -10.7692299 23.961536 11.846151 ) (-31.408973 -11.4358959 13.169229 1.07692265 -7.0538454 -6.61538315 ) (-21.766666 -13.666666 6.1153841 -5.53846073 -1.74615383 8.61538316 ) (-16.5243568 -14.897436 4.36923027 3.07692337 2.03846168 -27.846153 ) (-11.1358966 -25.743587 6.40769196 -24.769229 -6.40769196 24.769229 )) NATURAL) (2 ((182 259) (182 179)) NIL ((0 -80. 0 0 0 0 )) NATURAL) (6 ((182 179) (176 162) (154 142) (130 133) (103 128) (79 126)) NIL ((-1.78468942 -15.4688987 0 0 -25.291862 -9.18660165 ) (-14.430622 -20.062198 -25.291862 -9.18660165 30.459323 27.93301 ) (-24.49282 -15.282295 5.1674633 18.74641 -12.545452 -18.545452 ) (-25.598083 -5.80861187 -7.37798978 0.200957238 13.722486 4.24880219 ) (-26.11483 -3.483253 6.34449769 4.44975949 -6.34449769 -4.44975949 )) NATURAL) (2 ((79 126) (79 106)) NIL ((0 -20. 0 0 0 0 )) NATURAL) (6 ((79 106) (103 104) (130 99) (154 90) (176 70) (182 53)) NIL ((22.942581 -1.25837326 0 0 6.34449673 -4.44976044 ) (26.11483 -3.48325348 6.34449673 -4.44976044 -13.722486 4.24880314 ) (25.598083 -5.80861187 -7.37798978 -0.200957209 12.545454 -18.545452 ) (24.49282 -15.282297 5.16746426 -18.74641 -30.459327 27.933013 ) (14.430622 -20.062198 -25.291866 9.18660356 25.291866 -9.18660356 )) NATURAL) (2 ((182 53) (182 -27)) NIL ((0 -80. 0 0 0 0 )) NATURAL) (7 ((182 -27) (191 -61) (205 -79) (224 -94) (250 -106) (284 -116) (313 -119)) NIL ((7.9320507 -38.128204 0 0 6.40769196 24.769229 ) (11.1358966 -25.743587 6.40769196 24.769229 -2.03846168 -27.846149 ) (16.5243568 -14.897434 4.36923027 -3.07692242 1.74615478 8.61538316 ) (21.766666 -13.666666 6.11538506 5.53846073 7.05384446 -6.61538315 ) (31.408973 -11.4358959 13.169229 -1.07692289 -23.961536 11.846151 ) (32.597435 -6.58974267 -10.7923069 10.7692299 10.7923069 -10.7692299 )) NATURAL) (2 ((313 -119) (332 -119)) NIL ((19. 0 0 0 0 0 )) NATURAL) (2 ((332 -119) (332 -83)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((332 -83) (307 -83)) NIL ((-25. 0 0 0 0 0 )) NATURAL) (5 ((307 -83) (276 -78) (255 -69) (237 -54) (229 -29)) NIL ((-33.642852 4.17857075 0 0 15.857141 4.92857075 ) (-25.714283 6.6428566 15.857141 4.92857075 -19.285709 -0.642856598 ) (-19.5 11.25 -3.42857075 4.28571415 19.285709 9.6428566 ) (-13.285713 20.357139 15.857141 13.9285717 -15.857141 -13.9285717 )) NATURAL) (2 ((229 -29) (229 41)) NIL ((0 70. 0 0 0 0 )) NATURAL) (6 ((229 41) (223 63) (210 84) (195 96) (180 106) (157 116)) NIL ((-4.30622006 21.660285 0 0 -10.1626777 2.03827715 ) (-9.3875599 22.679424 -10.1626777 2.03827715 8.81339456 -16.191383 ) (-15.143539 16.622005 -1.34928202 -14.153108 4.90909004 14.72727 ) (-14.038276 9.8325348 3.55980825 0.574162603 -16.449756 -0.717703223 ) (-18.703346 10.0478458 -12.8899517 -0.143540680 12.8899517 0.143540680 )) NATURAL) (6 ((157 116) (180 126) (195 136) (210 148) (223 169) (229 191)) NIL ((25.148323 9.9760761 0 0 -12.8899517 0.143540561 ) (18.703346 10.0478458 -12.8899517 0.143540561 16.449756 -0.717702747 ) (14.038276 9.8325348 3.55980825 -0.574162245 -4.90909004 14.72727 ) (15.143539 16.622009 -1.3492825 14.153108 -8.81339456 -16.191383 ) (9.38755799 22.679424 -10.1626777 -2.03827715 10.1626777 2.03827715 )) NATURAL) (2 ((229 191) (229 261)) NIL ((0 70. 0 0 0 0 )) NATURAL) (5 ((229 261) (237 286) (255 301) (276 310) (307 315)) NIL ((5.35714245 27.321426 0 0 15.857141 -13.9285698 ) (13.285713 20.357139 15.857141 -13.9285698 -19.285709 9.6428547 ) (19.5 11.249998 -3.42857075 -4.28571415 19.285709 -0.642856598 ) (25.714283 6.6428566 15.857141 -4.92857075 -15.857141 4.92857075 )) NATURAL) (2 ((307 315) (332 315)) NIL ((25. 0 0 0 0 0 )) NATURAL) (2 ((332 315) (332 351)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((332 351) (313 351)) NIL ((-19. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 174Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:54:25) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((195 351) (195 -112)) NIL ((0 -463. 0 0 0 0 )) NATURAL) (2 ((195 -112) (246 -112)) NIL ((51. 0 0 0 0 0 )) NATURAL) (2 ((246 -112) (246 351)) NIL ((0 463. 0 0 0 0 )) NATURAL) (2 ((246 351) (195 351)) NIL ((-51. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 175Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 7:58:20) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((139 351) (158 351)) NIL ((19. 0 0 0 0 0 )) NATURAL) (7 ((158 351) (187 348) (221 338) (247 326) (266 311) (280 293) (289 259)) NIL ((27.201278 -1.20512819 0 0 10.7923069 -10.7692299 ) (32.597435 -6.5897436 10.7923069 -10.7692299 -23.961536 11.846151 ) (31.408973 -11.4358959 -13.169229 1.07692265 7.0538454 -6.61538315 ) (21.766666 -13.666666 -6.1153841 -5.53846073 1.74615383 8.61538316 ) (16.5243568 -14.897436 -4.36923027 3.07692337 -2.03846168 -27.846153 ) (11.1358966 -25.743587 -6.40769196 -24.769229 6.40769196 24.769229 )) NATURAL) (2 ((289 259) (289 179)) NIL ((0 -80. 0 0 0 0 )) NATURAL) (6 ((289 179) (295 162) (317 142) (341 133) (368 128) (392 126)) NIL ((1.78468942 -15.4688987 0 0 25.291862 -9.18660165 ) (14.430622 -20.062198 25.291862 -9.18660165 -30.459323 27.93301 ) (24.49282 -15.282295 -5.1674633 18.74641 12.545452 -18.545452 ) (25.598083 -5.80861187 7.37798978 0.200957238 -13.722486 4.24880219 ) (26.11483 -3.483253 -6.34449769 4.44975949 6.34449769 -4.44975949 )) NATURAL) (2 ((392 126) (392 106)) NIL ((0 -20. 0 0 0 0 )) NATURAL) (6 ((392 106) (368 104) (341 99) (317 90) (295 70) (289 53)) NIL ((-22.942581 -1.25837326 0 0 -6.34449673 -4.44976044 ) (-26.11483 -3.48325348 -6.34449673 -4.44976044 13.722486 4.24880314 ) (-25.598083 -5.80861187 7.37798978 -0.200957209 -12.545454 -18.545452 ) (-24.49282 -15.282297 -5.16746426 -18.74641 30.459327 27.933013 ) (-14.430622 -20.062198 25.291866 9.18660356 -25.291866 -9.18660356 )) NATURAL) (2 ((289 53) (289 -27)) NIL ((0 -80. 0 0 0 0 )) NATURAL) (7 ((289 -27) (280 -61) (266 -79) (247 -94) (221 -106) (187 -116) (158 -119)) NIL ((-7.9320507 -38.128204 0 0 -6.40769196 24.769229 ) (-11.1358966 -25.743587 -6.40769196 24.769229 2.03846168 -27.846149 ) (-16.5243568 -14.897434 -4.36923027 -3.07692242 -1.74615478 8.61538316 ) (-21.766666 -13.666666 -6.11538506 5.53846073 -7.05384446 -6.61538315 ) (-31.408973 -11.4358959 -13.169229 -1.07692289 23.961536 11.846151 ) (-32.597435 -6.58974267 10.7923069 10.7692299 -10.7923069 -10.7692299 )) NATURAL) (2 ((158 -119) (139 -119)) NIL ((-19. 0 0 0 0 0 )) NATURAL) (2 ((139 -119) (139 -83)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((139 -83) (164 -83)) NIL ((25. 0 0 0 0 0 )) NATURAL) (5 ((164 -83) (195 -78) (216 -69) (234 -54) (242 -29)) NIL ((33.642852 4.17857075 0 0 -15.857141 4.92857075 ) (25.714283 6.6428566 -15.857141 4.92857075 19.285709 -0.642856598 ) (19.5 11.25 3.42857075 4.28571415 -19.285709 9.6428566 ) (13.285713 20.357139 -15.857141 13.9285717 15.857141 -13.9285717 )) NATURAL) (2 ((242 -29) (242 41)) NIL ((0 70. 0 0 0 0 )) NATURAL) (6 ((242 41) (248 63) (261 84) (276 96) (291 106) (314 116)) NIL ((4.30622006 21.660285 0 0 10.1626777 2.03827715 ) (9.3875599 22.679424 10.1626777 2.03827715 -8.81339456 -16.191383 ) (15.143539 16.622005 1.34928202 -14.153108 -4.90909004 14.72727 ) (14.038276 9.8325348 -3.55980825 0.574162603 16.449756 -0.717703223 ) (18.703346 10.0478458 12.8899517 -0.143540680 -12.8899517 0.143540680 )) NATURAL) (6 ((314 116) (291 126) (276 136) (261 148) (248 169) (242 191)) NIL ((-25.148323 9.9760761 0 0 12.8899517 0.143540561 ) (-18.703346 10.0478458 12.8899517 0.143540561 -16.449756 -0.717702747 ) (-14.038276 9.8325348 -3.55980825 -0.574162245 4.90909004 14.72727 ) (-15.143539 16.622009 1.3492825 14.153108 8.81339456 -16.191383 ) (-9.38755799 22.679424 10.1626777 -2.03827715 -10.1626777 2.03827715 )) NATURAL) (2 ((242 191) (242 261)) NIL ((0 70. 0 0 0 0 )) NATURAL) (5 ((242 261) (234 286) (216 301) (195 310) (164 315)) NIL ((-5.35714245 27.321426 0 0 -15.857141 -13.9285698 ) (-13.285713 20.357139 -15.857141 -13.9285698 19.285709 9.6428547 ) (-19.5 11.249998 3.42857075 -4.28571415 -19.285709 -0.642856598 ) (-25.714283 6.6428566 -15.857141 -4.92857075 15.857141 4.92857075 )) NATURAL) (2 ((164 315) (139 315)) NIL ((-25. 0 0 0 0 0 )) NATURAL) (2 ((139 315) (139 351)) NIL ((0 36. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 176Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 8:03:50) (MADE-FROM gachalc.cu 0 140 0 0) (SPLINES ((2 ((70 84) (30 84)) NIL ((-40. 0 0 0 0 0 )) NATURAL) (13 ((30 84) (39 111) (55 131) (76 147) (106 158) (144 161) (184 156) (222 142) (249 131) (286 122) (327 124) (356 145) (366 161)) NIL ((7.34924794 28.65084 0 0 9.9045086 -9.9050579 ) (12.301502 23.69831 9.9045086 -9.9050579 -7.5225458 7.52529336 ) (18.444736 17.5559 2.3819623 -2.37976408 8.18567658 -2.19611978 ) (24.91954 14.078077 10.56764 -4.57588387 -1.22017288 -4.7408142 ) (34.87709 7.1317854 9.3474674 -9.31669808 -9.30498506 3.15938091 ) (39.572067 -0.605221987 0.0424815491 -6.15731717 2.44012308 -7.8967161 ) (40.83461 -10.710897 2.48260498 -14.054033 -24.455505 22.427482 ) (31.089466 -13.551187 -21.9729 8.37345124 41.381904 -9.8132267 ) (29.807518 -10.0843486 19.409004 -1.43977689 -15.07213 10.8254299 ) (41.680458 -6.1114111 4.33687306 9.38565446 -17.093372 20.511505 ) (37.470642 13.5299949 -12.7565 29.897159 -12.5543709 -44.871444 ) (18.436954 20.991428 -25.31087 -14.9742908 25.31087 14.9742908 )) NATURAL) (2 ((366 161) (406 161)) NIL ((40. 0 0 0 0 0 )) NATURAL) (7 ((406 161) (397 134) (381 114) (360 98) (330 87) (292 84) (252 89)) NIL ((-7.3487177 -28.653842 0 0 -9.90769197 9.9230766 ) (-12.3025627 -23.692306 -9.90769197 9.9230766 7.53846074 -7.6153841 ) (-18.441024 -17.576919 -2.36923075 2.30769205 -8.24615098 2.5384612 ) (-24.93333 -13.999998 -10.615383 4.84615326 1.44615364 3.46153832 ) (-34.825637 -7.42307664 -9.1692295 8.30769158 8.4615364 1.61538505 ) (-39.764099 1.69230771 -0.707692385 9.9230766 0.707692385 -9.9230766 )) NATURAL) (7 ((252 89) (214 103) (187 114) (150 123) (109 121) (80 100) (70 84)) NIL ((-41.551277 14.767948 0 0 21.307689 -4.60769177 ) (-30.897434 12.4641018 21.307689 -4.60769177 -40.538452 5.03846073 ) (-29.858974 10.3756408 -19.230766 0.430769324 14.846151 -9.546154 ) (-41.666664 6.03333283 -4.38461495 -9.11538507 17.1538429 -20.853843 ) (-37.474357 -13.508974 12.7692299 -29.96923 12.5384597 44.961532 ) (-18.435894 -20.997432 25.307689 14.992307 -25.307689 -14.992307 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.UC1-SF b/lispusers/GACHAE.UC1-SF new file mode 100644 index 00000000..9cc43ef0 --- /dev/null +++ b/lispusers/GACHAE.UC1-SF @@ -0,0 +1 @@ + ((FAMILY gacha) (CHARACTER 101Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 10:14:09) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((25 0) (157 337)) NIL ((132. 337. 0 0 0 0 )) NATURAL) (2 ((157 337) (280 337)) NIL ((123. 0 0 0 0 0 )) NATURAL) (2 ((280 337) (412 0)) NIL ((132. -337. 0 0 0 0 )) NATURAL) (2 ((412 0) (359 0)) NIL ((-53. 0 0 0 0 0 )) NATURAL) (2 ((359 0) (321 98)) NIL ((-38. 98. 0 0 0 0 )) NATURAL) (2 ((321 98) (116 98)) NIL ((-205. 0 0 0 0 0 )) NATURAL) (2 ((116 98) (78 0)) NIL ((-38. -98. 0 0 0 0 )) NATURAL) (2 ((78 0) (25 0)) NIL ((-53. 0 0 0 0 0 )) NATURAL)) ((2 ((305 141) (132 141)) NIL ((-173. 0 0 0 0 0 )) NATURAL) (2 ((132 141) (194 301)) NIL ((62. 160. 0 0 0 0 )) NATURAL) (2 ((194 301) (243 301)) NIL ((49. 0 0 0 0 0 )) NATURAL) (2 ((243 301) (305 141)) NIL ((62. -160. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 102Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 10:21:33) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((60 337) (60 337) (60 0)) NIL ((0 84.25 0 0 0 -505.5 ) (0 -168.5 0 -505.5 0 505.5 )) NATURAL) (2 ((60 0) (225 0)) NIL ((165. 0 0 0 0 0 )) NATURAL) (11 ((225 0) (268 5) (307 15) (340 32) (364 59) (376 97) (370 132) (355 154) (339 167) (312 178) (283 185)) NIL ((43.77365 4.02735329 0 0 -4.64191437 5.83587933 ) (41.45269 6.94529343 -4.64191437 5.83587933 -0.790425301 0.820601464 ) (36.415565 13.191473 -5.43233967 6.6564808 -4.19638348 2.88171577 ) (28.885032 21.28881 -9.62872315 9.53819657 -0.424039841 5.65253067 ) (19.044288 33.653274 -10.052763 15.190727 -12.107458 -19.491832 ) (2.9377985 39.098083 -22.160221 -4.3011055 12.85387 -11.6851997 ) (-12.795486 28.954376 -9.3063507 -15.986305 14.691978 6.2326393 ) (-14.7558479 16.084388 5.3856287 -9.7536659 -23.621791 10.754642 ) (-21.181118 11.7080478 -18.236164 1.00097775 19.795204 -7.25122166 ) (-29.51968 9.08341409 1.5590415 -6.25024415 -1.5590415 6.25024415 )) NATURAL) (12 ((283 185) (318 199) (336 212) (349 227) (358 254) (352 287) (338 306) (319 319) (297 328) (279 332) (256 335) (225 337)) NIL ((39.205406 14.229002 0 0 -25.232437 -1.37401437 ) (26.589183 13.541994 -25.232437 -1.37401437 24.162193 0.870072127 ) (13.437845 12.6030159 -1.07024192 -0.503942251 0.583649278 15.893724 ) (12.6594276 20.045936 -0.486592591 15.3897838 -20.496791 -4.44498253 ) (1.924438 33.213226 -20.983387 10.944801 15.403532 -34.113792 ) (-11.357181 27.101131 -5.579854 -23.16899 0.882661820 20.900169 ) (-16.495704 14.3822269 -4.69719219 -2.26882028 -0.934181214 -1.48690176 ) (-21.659988 11.369955 -5.6313734 -3.75572205 14.854061 -2.9525671 ) (-19.86433 6.13794995 9.22268868 -6.70828915 -16.4820709 7.29716588 ) (-18.882679 3.07824373 -7.25938416 0.588877082 -2.9257679 -2.2360959 ) (-27.604946 2.54907274 -10.185152 -1.64721918 10.185152 1.64721918 )) NATURAL) (2 ((225 337) (60 337)) NIL ((-165. 0 0 0 0 0 )) NATURAL)) ((6 ((236 168) (269 163) (292 153) (304 143) (314 128) (319 101)) NIL ((34.904304 -3.62200928 0 0 -11.4258365 -8.26794244 ) (29.191387 -7.7559805 -11.4258365 -8.26794244 -2.87081337 11.339712 ) (16.330143 -10.3540668 -14.2966499 3.07177019 16.909088 -7.090909 ) (10.488037 -10.827751 2.6124401 -4.01913929 -10.7655506 -12.976072 ) (7.71770287 -21.334926 -8.1531105 -16.995212 8.1531105 16.995212 )) NATURAL) (6 ((319 101) (316 75) (304 57) (287 45) (268 39) (236 36)) NIL ((-0.971291781 -27.813396 0 0 -12.1722488 10.8803825 ) (-7.05741597 -22.373203 -12.1722488 10.8803825 6.8612442 -6.40191365 ) (-15.799041 -14.693779 -5.31100464 4.4784689 8.72727204 2.72727203 ) (-16.74641 -8.8516731 3.4162674 7.20574093 -23.770332 -4.5071764 ) (-25.215309 -3.89952135 -20.354064 2.69856453 20.354064 -2.69856453 )) NATURAL) (3 ((236 36) (211 36) (113 36)) NIL ((-6.75 0 0 0 -109.5 0 ) (-61.5 0 -109.5 0 109.5 0 )) NATURAL) (2 ((113 36) (113 168)) NIL ((0 132. 0 0 0 0 )) NATURAL) (2 ((113 168) (236 168)) NIL ((123. 0 0 0 0 0 )) NATURAL)) ((2 ((113 204) (113 302)) NIL ((0 98. 0 0 0 0 )) NATURAL) (2 ((113 302) (220 302)) NIL ((107. 0 0 0 0 0 )) NATURAL) (2 ((220 302) (245 302)) NIL ((25. 0 0 0 0 0 )) NATURAL) (5 ((245 302) (266 299) (291 291) (305 274) (308 253)) NIL ((19.339283 -2.23214292 0 0 9.9642849 -4.60714245 ) (24.321426 -4.53571415 9.9642849 -4.60714245 -25.821426 -6.96428586 ) (21.374996 -12.625 -15.857141 -11.571428 3.3214283 8.4642849 ) (7.17857075 -19.964283 -12.535713 -3.10714245 12.535713 3.10714245 )) NATURAL) (5 ((308 253) (303 231) (290 217) (266 208) (245 204)) NIL ((-3.6964283 -23.875 0 0 -7.82142926 11.25 ) (-7.60714245 -18.25 -7.82142926 11.25 -8.89285279 -8.25 ) (-19.875 -11.124998 -16.714283 3. 25.392852 3.74999905 ) (-23.892856 -6.24999905 8.6785698 6.74999905 -8.6785698 -6.74999905 )) NATURAL) (2 ((245 204) (220 204)) NIL ((-25. 0 0 0 0 0 )) NATURAL) (2 ((220 204) (113 204)) NIL ((-107. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 103Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 11:50:25) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((25 ((378 260) (370 287) (352 310) (318 332) (271 343) (229 345) (186 342) (141 330) (109 310) (85 285) (69 260) (60 236) (49 169) (60 102) (69 78) (85 53) (109 28) (141 8) (186 -4) (229 -7) (271 -5) (318 6) (352 28) (370 51) (378 78)) NIL ((-6.19386483 28.169479 0 0 -10.836809 -7.01689053 ) (-11.61227 24.661033 -10.836809 -7.01689053 -5.8159504 11.0844516 ) (-25.357055 23.18637 -16.652759 4.0675621 -1.89938736 -19.320919 ) (-42.95951 17.593471 -18.5521469 -15.2533588 31.413505 6.199234 ) (-45.8049 5.43973065 12.8613586 -9.05412484 -15.754644 6.5239849 ) (-40.82086 -0.352400899 -2.8932867 -2.53013944 -4.39492512 -8.29517556 ) (-45.911613 -7.03012753 -7.2882118 -10.825315 27.334346 2.65671539 ) (-39.532653 -16.527084 20.046134 -8.16860009 -14.942476 3.6683216 ) (-26.957756 -22.861526 5.10365868 -4.50027848 2.43556595 0.669996739 ) (-20.636314 -27.026805 7.5392246 -3.83028174 5.20021248 23.651683 ) (-10.4969825 -19.031242 12.739437 19.821403 -29.236415 -89.27673 ) (-12.375753 -43.848213 -16.496978 -69.455337 57.74546 69.45532 ) (3.18139791E-6 -78.57588 41.24848 -4.08857977E-6 -57.74546 69.45535 ) (12.375753 -43.848213 -16.496982 69.45535 29.236419 -89.27676 ) (10.4969825 -19.031242 12.739439 -19.821411 -5.20021439 23.651691 ) (20.636314 -27.026805 7.5392246 3.83028364 -2.43556785 0.669993878 ) (26.957756 -22.861522 5.10365677 4.50027752 14.942482 3.66832447 ) (39.532653 -16.527084 20.046138 8.168602 -27.33435 2.65670967 ) (45.911613 -7.03012658 -7.28821374 10.8253116 4.39492703 -8.29516984 ) (40.82086 -0.352400601 -2.89328623 2.5301404 15.754644 6.52398205 ) (45.8049 5.4397316 12.8613586 9.0541229 -31.413505 6.19923783 ) (42.959503 17.593471 -18.5521469 15.2533607 1.89938736 -19.320922 ) (25.357051 23.18637 -16.652759 -4.0675621 5.8159504 11.0844516 ) (11.612268 24.661033 -10.836809 7.01689053 10.836809 -7.01689053 )) NATURAL) (2 ((378 78) (326 78)) NIL ((-52. 0 0 0 0 0 )) NATURAL) (14 ((326 78) (320 55) (309 40) (286 28) (256 24) (230 23) (199 26) (177 32) (150 46) (132 64) (116 90) (106 120) (102 142) (101 169)) NIL ((-5.3555641 -25.071785 0 0 -3.86661339 12.4307289 ) (-7.2888708 -18.856422 -3.86661339 12.4307289 -10.666933 -14.153646 ) (-16.4889488 -13.5025177 -14.533546 -1.72291755 4.53435135 14.1838588 ) (-28.755321 -8.13350488 -9.9991951 12.460941 22.529521 -12.5817928 ) (-27.489753 -1.9634602 12.5303287 -0.120852127 -28.652446 6.14331818 ) (-29.285652 0.987347246 -16.1221199 6.02246667 38.080276 -5.99148369 ) (-26.36763 4.01407147 21.95816 0.0309827476 -39.668693 11.822618 ) (-24.243816 9.95636369 -17.710533 11.853601 36.594505 -11.298988 ) (-23.657093 16.160469 18.883976 0.554612279 -22.709346 9.37333489 ) (-16.127792 21.401752 -3.82537174 9.927948 12.2428798 -2.19436264 ) (-13.831724 30.232517 8.41750909 7.73358536 -2.26217842 -24.595874 ) (-6.5453043 25.668167 6.15533066 -16.862289 -3.1941638 28.577858 ) (-1.98705554 23.094806 2.96116686 11.71557 -2.96116686 -11.71557 )) NATURAL) (14 ((101 169) (102 196) (106 218) (116 248) (132 274) (150 292) (177 306) (199 312) (230 315) (256 314) (286 310) (309 298) (321 284) (326 260)) NIL ((0.506471396 28.95259 0 0 2.96117163 -11.7155666 ) (1.98705721 23.09481 2.96117163 -11.7155666 3.19414091 28.577835 ) (6.54529954 25.668159 6.15531254 16.86227 2.2622652 -24.595783 ) (13.831745 30.232536 8.41757775 -7.73351479 -12.243206 -2.1946907 ) (16.1277199 21.401676 -3.82562828 -9.9282055 22.710559 9.37454988 ) (23.657371 16.160743 18.884933 -0.553655625 -36.599037 -11.303514 ) (24.242786 9.9553318 -17.714103 -11.85717 39.685585 11.8395099 ) (26.371479 4.01791764 21.971485 -0.0176593437 -38.143325 -6.0545311 ) (29.271297 0.972992898 -16.171844 -6.07219124 28.887744 6.37861539 ) (27.543323 -1.90989017 12.7159 0.306424796 -23.407657 -13.45993 ) (28.555393 -8.33343125 -10.691759 -13.153507 -1.25710296 17.461109 ) (17.235084 -12.7563839 -11.948862 4.30760193 4.43607807 -20.384502 ) (7.504261 -18.641033 -7.512784 -16.0769 7.512784 16.0769 )) NATURAL) (2 ((326 260) (378 260)) NIL ((52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 105Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:00:54) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((82 337) (82 337) (82 0)) NIL ((0 84.25 0 0 0 -505.5 ) (0 -168.5 0 -505.5 0 505.5 )) NATURAL) (2 ((82 0) (369 0)) NIL ((287. 0 0 0 0 0 )) NATURAL) (2 ((369 0) (369 36)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((369 36) (134 36)) NIL ((-235. 0 0 0 0 0 )) NATURAL) (2 ((134 36) (134 161)) NIL ((0 125. 0 0 0 0 )) NATURAL) (2 ((134 161) (315 161)) NIL ((181. 0 0 0 0 0 )) NATURAL) (2 ((315 161) (315 197)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((315 197) (134 197)) NIL ((-181. 0 0 0 0 0 )) NATURAL) (2 ((134 197) (134 301)) NIL ((0 104. 0 0 0 0 )) NATURAL) (2 ((134 301) (355 301)) NIL ((221. 0 0 0 0 0 )) NATURAL) (2 ((355 301) (355 337)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((355 337) (82 337)) NIL ((-273. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 106Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:01:55) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((328 197) (328 161)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((328 161) (147 161)) NIL ((-181. 0 0 0 0 0 )) NATURAL) (2 ((147 161) (147 0)) NIL ((0 -161. 0 0 0 0 )) NATURAL) (2 ((147 0) (96 0)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (3 ((96 0) (96 337) (96 337)) NIL ((0 421.25 0 0 0 -505.5 ) (0 168.5 0 -505.5 0 505.5 )) NATURAL) (2 ((96 337) (369 337)) NIL ((273. 0 0 0 0 0 )) NATURAL) (2 ((369 337) (369 301)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((369 301) (147 301)) NIL ((-222. 0 0 0 0 0 )) NATURAL) (2 ((147 301) (147 197)) NIL ((0 -104. 0 0 0 0 )) NATURAL) (2 ((147 197) (328 197)) NIL ((181. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 107Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:14:10) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((354 0) (388 0)) NIL ((34. 0 0 0 0 0 )) NATURAL) (2 ((388 0) (388 169)) NIL ((0 169. 0 0 0 0 )) NATURAL) (2 ((388 169) (208 169)) NIL ((-180. 0 0 0 0 0 )) NATURAL) (2 ((208 169) (208 134)) NIL ((0 -35. 0 0 0 0 )) NATURAL) (2 ((208 134) (336 134)) NIL ((128. 0 0 0 0 0 )) NATURAL) (8 ((336 134) (336 109) (330 76) (314 51) (285 33) (249 24) (224 22) (199 26)) NIL ((1.08862924 -22.377876 0 0 -6.53177548 -15.732736 ) (-2.17725849 -30.244243 -6.53177548 -15.732736 -3.34112072 30.663684 ) (-10.3795948 -30.645137 -9.8728962 14.93095 -4.1037426 -10.922018 ) (-22.304363 -21.175193 -13.9766388 4.00893116 1.75609588 7.0243902 ) (-35.402954 -13.6540699 -12.2205429 11.033321 33.079353 -5.17554093 ) (-31.083816 -5.20851898 20.85881 5.85778046 -26.073513 1.67777347 ) (-23.261764 1.48814869 -5.2147026 7.53555394 5.2147026 -7.53555394 )) NATURAL) (23 ((199 26) (177 32) (150 46) (131 63) (114 88) (104 118) (100 141) (99 169) (101 196) (104 218) (114 250) (129 277) (148 294) (173 306) (199 312) (230 315) (259 314) (289 309) (309 299) (320 286) (325 270) (325 270) (326 260)) NIL ((-20.09576 3.9550767 0 0 -11.425428 12.2695389 ) (-25.808475 10.0898456 -11.425428 12.2695389 27.127147 -13.347694 ) (-23.67033 15.685537 15.701719 -1.07815694 -19.083168 11.121244 ) (-17.5101928 20.168003 -3.38144875 10.0430889 13.205524 -1.13729667 ) (-14.288881 29.642444 9.8240757 8.90579225 -3.73893929 -24.572052 ) (-6.3342743 26.26221 6.0851364 -15.666261 -4.24976254 27.425514 ) (-2.37401914 24.308708 1.83537364 11.759254 2.73799419 -13.130014 ) (0.830351830 29.502952 4.57336807 -1.37075996 -6.7022152 -10.9054546 ) (2.0526123 22.679466 -2.12884712 -12.2762146 12.070867 32.75183 ) (5.959198 26.77917 9.9420204 20.475616 -5.58125305 -30.101875 ) (13.1105919 32.203842 4.36076737 -9.62625886 -1.74585771 -2.3443203 ) (16.59843 21.405426 2.61490965 -11.970579 6.564682 9.4791603 ) (22.495681 14.1744289 9.17959214 -2.49141884 -12.5128708 -5.57232285 ) (25.418838 8.89684678 -3.3332796 -8.06374169 13.4868049 6.81013394 ) (28.82896 4.23817349 10.153526 -1.25360703 -17.4343529 -3.668221 ) (30.265308 1.15045547 -7.2808275 -4.92182827 14.250612 1.86275148 ) (30.109787 -2.83999729 6.9697857 -3.05907679 -21.5681 -3.78278589 ) (26.295524 -7.7904663 -14.598314 -6.84186268 6.02178765 7.26839066 ) (14.708103 -10.9981346 -8.57652665 0.426528394 3.48095322 -13.290775 ) (7.8720541 -17.216991 -5.09557343 -12.864248 -1.94560623 45.894706 ) (1.80367732 -7.13388539 -7.04117966 33.030464 10.3014736 -56.288078 ) (-0.0867649615 -2.24746179 3.26029491 -23.257614 -3.26029491 23.257614 )) NATURAL) (2 ((326 260) (378 260)) NIL ((52. 0 0 0 0 0 )) NATURAL) (25 ((378 260) (370 287) (352 310) (318 332) (271 343) (229 345) (186 342) (144 331) (109 310) (85 285) (69 260) (60 236) (53 209) (49 169) (52 127) (64 83) (83 52) (108 28) (141 9) (183 -3) (229 -7) (271 -1) (300 9) (326 26) (344 49)) NIL ((-6.1920843 28.170055 0 0 -10.84749 -7.02033616 ) (-11.615829 24.659885 -10.84749 -7.02033616 -5.76254845 11.1016826 ) (-25.344593 23.190391 -16.610038 4.08134747 -2.10231399 -19.386398 ) (-43.00579 17.578537 -18.712352 -15.305053 32.171806 6.44392205 ) (-45.632232 5.4954462 13.459455 -8.86113168 -18.584922 5.6107149 ) (-41.46524 -0.560327769 -5.12547016 -3.25041676 6.16789437 -4.88678265 ) (-43.506767 -6.25413609 1.0424242 -8.1371994 5.9133482 -4.06358147 ) (-39.507667 -16.423126 6.9557724 -12.2007808 6.17871476 9.14110566 ) (-29.462539 -24.053352 13.134487 -3.05967522 -6.62821198 3.49915838 ) (-19.642158 -25.363449 6.50627518 0.439483404 2.33413124 0.862258196 ) (-11.9688167 -24.492836 8.8404064 1.3017416 -8.708313 -0.948191763 ) (-7.48256779 -23.665191 0.132091939 0.353549778 2.49913216 -21.069484 ) (-6.10090924 -33.846382 2.63122415 -20.715938 4.71178627 25.226146 ) (-1.11379099 -41.949249 7.3430109 4.51021099 2.65371418 -13.835115 ) (7.556077 -44.356597 9.99672509 -9.3249054 -3.32663918 30.114315 ) (15.889482 -38.624343 6.6700859 20.789409 -1.34715652 -16.622142 ) (21.88599 -26.146007 5.32292938 4.16726685 2.71526527 0.374253273 ) (28.56655 -21.791614 8.03819467 4.54152012 2.48609352 3.12512875 ) (37.847793 -15.687528 10.524288 7.66664887 -6.6596422 -0.874764443 ) (45.042259 -8.4582615 3.86464596 6.7918844 -5.84751797 6.3739252 ) (45.983146 1.52058458 -1.98287248 13.165809 -17.950279 -12.620937 ) (35.02513 8.37592507 -19.933155 0.544872284 23.648662 8.10982705 ) (26.916309 12.9757118 3.71550894 8.6546993 -16.644382 -1.81837463 ) (22.309623 20.721221 -12.9288768 6.8363247 12.9288768 -6.8363247 )) NATURAL) (2 ((344 49) (354 0)) NIL ((10. -49. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 110Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:14:57) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((61 0) (61 337)) NIL ((0 337. 0 0 0 0 )) NATURAL) (2 ((61 337) (113 337)) NIL ((52. 0 0 0 0 0 )) NATURAL) (2 ((113 337) (113 197)) NIL ((0 -140. 0 0 0 0 )) NATURAL) (2 ((113 197) (326 197)) NIL ((213. 0 0 0 0 0 )) NATURAL) (2 ((326 197) (326 337)) NIL ((0 140. 0 0 0 0 )) NATURAL) (2 ((326 337) (378 337)) NIL ((52. 0 0 0 0 0 )) NATURAL) (2 ((378 337) (378 0)) NIL ((0 -337. 0 0 0 0 )) NATURAL) (2 ((378 0) (326 0)) NIL ((-52. 0 0 0 0 0 )) NATURAL) (2 ((326 0) (326 161)) NIL ((0 161. 0 0 0 0 )) NATURAL) (2 ((326 161) (113 161)) NIL ((-213. 0 0 0 0 0 )) NATURAL) (2 ((113 161) (113 0)) NIL ((0 -161. 0 0 0 0 )) NATURAL) (2 ((113 0) (61 0)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 111Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:21:10) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((194 35) (94 35)) NIL ((-100. 0 0 0 0 0 )) NATURAL) (2 ((94 35) (94 0)) NIL ((0 -35. 0 0 0 0 )) NATURAL) (2 ((94 0) (346 0)) NIL ((252. 0 0 0 0 0 )) NATURAL) (2 ((346 0) (346 35)) NIL ((0 35. 0 0 0 0 )) NATURAL) (2 ((346 35) (245 35)) NIL ((-101. 0 0 0 0 0 )) NATURAL) (2 ((245 35) (245 302)) NIL ((0 267. 0 0 0 0 )) NATURAL) (2 ((245 302) (346 302)) NIL ((101. 0 0 0 0 0 )) NATURAL) (2 ((346 302) (346 337)) NIL ((0 35. 0 0 0 0 )) NATURAL) (2 ((346 337) (94 337)) NIL ((-252. 0 0 0 0 0 )) NATURAL) (2 ((94 337) (94 302)) NIL ((0 -35. 0 0 0 0 )) NATURAL) (2 ((94 302) (194 302)) NIL ((100. 0 0 0 0 0 )) NATURAL) (2 ((194 302) (194 35)) NIL ((0 -267. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 112Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:24:11) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((13 ((367 83) (358 56) (342 35) (318 18) (286 5) (249 -4) (213 -7) (177 -4) (139 5) (108 18) (84 35) (67 56) (58 83)) NIL ((-7.5716381 -28.383419 0 0 -8.57017137 8.30051805 ) (-11.8567238 -24.233158 -8.57017137 8.30051805 0.850863457 -5.50259018 ) (-20.001464 -18.683937 -7.7193079 2.79792738 -0.833287240 1.70984411 ) (-28.137416 -15.0310878 -8.55259515 4.50777149 2.48228836 -1.33678722 ) (-35.448867 -11.191709 -6.07030678 3.17098427 8.90413095 3.63730621 ) (-37.067108 -6.20207215 2.83382416 6.80829049 -2.09881306 -1.21243572 ) (-35.282692 0 0.735010863 5.59585476 -6.50887776 1.21243572 ) (-37.802116 6.20207215 -5.7738676 6.80829049 16.1343269 -3.63730621 ) (-35.508819 11.191709 10.360462 3.17098427 -4.02844429 1.33678722 ) (-27.162582 15.0310878 6.3320179 4.50777149 -0.0205554962 -1.70984459 ) (-20.840839 18.683937 6.3114624 2.7979269 4.11067009 5.50259114 ) (-12.4740429 24.233158 10.422132 8.30051805 -10.422132 -8.30051805 )) NATURAL) (2 ((58 83) (58 125)) NIL ((0 42. 0 0 0 0 )) NATURAL) (2 ((58 125) (108 125)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((108 125) (108 83)) NIL ((0 -42. 0 0 0 0 )) NATURAL) (11 ((108 83) (117 61) (134 46) (156 37) (185 31) (214 29) (241 31) (269 37) (291 46) (308 61) (317 83)) NIL ((7.0843725 -23.486187 0 0 11.493761 8.9171257 ) (12.831253 -19.027622 11.493761 8.9171257 -9.4688053 -2.58563423 ) (19.59061 -11.4033146 2.02495432 6.33149148 8.381464 -4.5745859 ) (25.806297 -7.3591156 10.4064197 1.75690555 -12.057056 2.88397884 ) (30.184188 -4.1602211 -1.65063834 4.6408844 -2.15322876 -0.961326600 ) (27.456935 1.59256160E-7 -3.80386734 3.6795578 8.66997529 0.961325646 ) (27.988056 4.1602211 4.86610794 4.64088345 -14.526672 -2.88397694 ) (25.590827 7.3591156 -9.6605644 1.75690627 7.43671513 4.574584 ) (19.64862 11.4033146 -2.22384882 6.3314905 -9.22018624 2.58563518 ) (12.814678 19.027622 -11.444036 8.9171257 11.444036 -8.9171257 )) NATURAL) (2 ((317 83) (317 301)) NIL ((0 218. 0 0 0 0 )) NATURAL) (2 ((317 301) (187 301)) NIL ((-130. 0 0 0 0 0 )) NATURAL) (2 ((187 301) (187 337)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((187 337) (367 337)) NIL ((180. 0 0 0 0 0 )) NATURAL) (2 ((367 337) (367 83)) NIL ((0 -254. 0 0 0 0 )) NATURAL)))) ((FAMILY GACHA) (CHARACTER 113Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:28:21) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((73 0) (73 0) (73 337)) NIL ((0 -84.25 0 0 0 505.5 ) (0 168.5 0 505.5 0 -505.5 )) NATURAL) (2 ((73 337) (120 337)) NIL ((47. 0 0 0 0 0 )) NATURAL) (2 ((120 337) (120 191)) NIL ((0 -146. 0 0 0 0 )) NATURAL) (2 ((120 191) (175 191)) NIL ((55. 0 0 0 0 0 )) NATURAL) (2 ((175 191) (320 338)) NIL ((145. 147. 0 0 0 0 )) NATURAL) (2 ((320 338) (373 338)) NIL ((53. 0 0 0 0 0 )) NATURAL) (2 ((373 338) (214 176)) NIL ((-159. -162. 0 0 0 0 )) NATURAL) (2 ((214 176) (418 0)) NIL ((204. -176. 0 0 0 0 )) NATURAL) (2 ((418 0) (347 0)) NIL ((-71. 0 0 0 0 0 )) NATURAL) (2 ((347 0) (170 155)) NIL ((-177. 155. 0 0 0 0 )) NATURAL) (2 ((170 155) (120 155)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((120 155) (120 0)) NIL ((0 -155. 0 0 0 0 )) NATURAL) (2 ((120 0) (73 0)) NIL ((-47. 0 0 0 0 0 )) NATURAL)))) ((FAMILY GACHA) (CHARACTER 114Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:29:42) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((82 337) (82 0)) NIL ((0 -337. 0 0 0 0 )) NATURAL) (2 ((82 0) (390 0)) NIL ((308. 0 0 0 0 0 )) NATURAL) (2 ((390 0) (390 36)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((390 36) (134 36)) NIL ((-256. 0 0 0 0 0 )) NATURAL) (2 ((134 36) (134 337)) NIL ((0 301. 0 0 0 0 )) NATURAL) (2 ((134 337) (82 337)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY GACHA) (CHARACTER 115Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:34:46) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((40 0) (40 337)) NIL ((0 337. 0 0 0 0 )) NATURAL) (2 ((40 337) (102 337)) NIL ((62. 0 0 0 0 0 )) NATURAL) (2 ((102 337) (219 80)) NIL ((117. -257. 0 0 0 0 )) NATURAL) (2 ((219 80) (335 337)) NIL ((116. 257. 0 0 0 0 )) NATURAL) (2 ((335 337) (397 337)) NIL ((62. 0 0 0 0 0 )) NATURAL) (2 ((397 337) (397 0)) NIL ((0 -337. 0 0 0 0 )) NATURAL) (2 ((397 0) (346 0)) NIL ((-51. 0 0 0 0 0 )) NATURAL) (2 ((346 0) (346 260)) NIL ((0 260. 0 0 0 0 )) NATURAL) (2 ((346 260) (219 -8)) NIL ((-127. -268. 0 0 0 0 )) NATURAL) (2 ((219 -8) (92 260)) NIL ((-127. 268. 0 0 0 0 )) NATURAL) (2 ((92 260) (92 0)) NIL ((0 -260. 0 0 0 0 )) NATURAL) (2 ((92 0) (40 0)) NIL ((-52. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 104Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 21-SEP-77 13:35:12) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((51 0) (51 0) (51 337)) NIL ((0 -84.25 0 0 0 505.5 ) (0 168.5 0 505.5 0 -505.5 )) NATURAL) (2 ((51 337) (231 337)) NIL ((180. 0 0 0 0 0 )) NATURAL) (13 ((231 337) (280 330) (322 313) (352 291) (373 264) (388 220) (393 169) (388 118) (373 74) (352 47) (322 25) (280 8) (231 0)) NIL ((50.16728 -4.66153813 0 0 -7.0037012 -14.030771 ) (46.665428 -11.6769237 -7.0037012 -14.030771 -6.98149396 10.153858 ) (36.170982 -20.630764 -13.985195 -3.87691164 4.92968178 3.4153304 ) (24.650627 -22.80001 -9.05551339 -0.461581111 5.26276684 -23.815181 ) (18.226497 -35.169181 -3.79274607 -24.276763 -7.9807539 19.845397 ) (10.4433746 -49.523246 -11.7735 -4.4313631 2.66025162 4.43358326 ) (-3.18512320E-7 -51.737815 -9.1132488 0.00222035451 -2.66025162 4.42026043 ) (-10.4433746 -49.525467 -11.7735 4.42248154 7.98075486 19.885368 ) (-18.226497 -35.1603 -3.79274559 24.307849 -5.26276779 -23.961738 ) (-24.650627 -22.83332 -9.05551339 0.346110821 -4.92968178 3.96159315 ) (-36.170982 -20.506412 -13.985195 4.30770397 6.9814949 8.1153679 ) (-46.665428 -12.1410236 -7.00370026 12.4230728 7.00370026 -12.4230728 )) NATURAL) (2 ((231 0) (51 0)) NIL ((-180. 0 0 0 0 0 )) NATURAL)) ((2 ((101 301) (225 301)) NIL ((124. 0 0 0 0 0 )) NATURAL) (15 ((225 301) (250 300) (278 295) (298 286) (314 273) (331 245) (340 208) (343 169) (340 130) (331 93) (314 65) (298 52) (278 43) (250 38) (225 37)) NIL ((23.713207 -0.204053551 0 0 7.72074509 -4.77567864 ) (27.573581 -2.59189272 7.72074509 -4.77567864 -20.603725 -0.121606826 ) (24.992462 -7.42837525 -12.882982 -4.89728546 8.6941681 5.2621088 ) (16.456562 -9.69460679 -4.18881417 0.364823341 9.82705308 -20.926826 ) (17.181274 -19.793197 5.6382389 -20.562004 -18.00238 12.4452057 ) (13.818325 -34.132598 -12.364141 -8.1167984 8.1824684 7.145998 ) (5.54541779 -38.676399 -4.18167305 -0.970800281 -2.72749042 0.970800281 ) (1.58324837E-7 -39.161796 -6.90916348 3.19420294E-8 2.72748947 0.970800043 ) (-5.54541779 -38.676399 -4.181674 0.970800162 -8.1824665 7.145998 ) (-13.818325 -34.132598 -12.364141 8.1167984 18.002376 12.4452057 ) (-17.181274 -19.793193 5.63823796 20.562004 -9.82705117 -20.926826 ) (-16.456562 -9.69460488 -4.1888132 -0.364823401 -8.6941681 5.2621088 ) (-24.992462 -7.4283743 -12.882982 4.89728546 20.603725 -0.121606826 ) (-27.573581 -2.59189272 7.72074509 4.77567864 -7.72074509 -4.77567864 )) NATURAL) (2 ((225 37) (101 36)) NIL ((-124. -1. 0 0 0 0 )) NATURAL) (2 ((101 36) (101 301)) NIL ((0 265. 0 0 0 0 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GACHAE.UC2-SF b/lispusers/GACHAE.UC2-SF new file mode 100644 index 00000000..56a9f2bd --- /dev/null +++ b/lispusers/GACHAE.UC2-SF @@ -0,0 +1 @@ + ((FAMILY GACHA) (CHARACTER 116Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:42:48) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((61 0) (61 0) (111 0)) NIL ((-12.5 0 0 0 75. 0 ) (25. 0 75. 0 -75. 0 )) NATURAL) (2 ((111 0) (111 295)) NIL ((0 295. 0 0 0 0 )) NATURAL) (2 ((111 295) (312 0)) NIL ((201. -295. 0 0 0 0 )) NATURAL) (2 ((312 0) (376 0)) NIL ((64. 0 0 0 0 0 )) NATURAL) (2 ((376 0) (376 337)) NIL ((0 337. 0 0 0 0 )) NATURAL) (2 ((376 337) (326 337)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((326 337) (326 42)) NIL ((0 -295. 0 0 0 0 )) NATURAL) (2 ((326 42) (125 337)) NIL ((-201. 295. 0 0 0 0 )) NATURAL) (2 ((125 337) (61 337)) NIL ((-64. 0 0 0 0 0 )) NATURAL) (2 ((61 337) (61 0)) NIL ((0 -337. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 117Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 12:52:08) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((29 ((222 22) (257 25) (286 34) (316 51) (334 75) (346 105) (351 140) (353 169) (351 198) (346 233) (334 263) (316 287) (286 304) (255 313) (222 316) (189 313) (158 304) (128 287) (110 263) (98 233) (93 198) (91 169) (93 140) (98 105) (110 75) (128 51) (158 34) (187 25) (222 22)) NIL ((36.888336 1.854002 0 0 -11.3300247 6.875988 ) (31.223323 5.291996 -11.3300247 6.875988 20.650123 1.62005996 ) (30.21836 12.978014 9.32010079 8.49604798 -29.270477 -1.35623073 ) (24.90322 20.795944 -19.950378 7.13981724 18.431793 -2.19513702 ) (14.168741 26.838195 -1.51858186 4.9446802 -8.456707 4.13677883 ) (8.42180444 33.851265 -9.9752903 9.08145906 9.3950348 -20.351982 ) (3.14403296 32.756729 -0.580255032 -11.270523 -5.1234331 11.271158 ) (0.00206090975 27.121788 -5.70368862 6.36285287E-4 5.09869957 11.2673397 ) (-3.15227747 32.756095 -0.604988218 11.2679767 -9.2713661 -20.340518 ) (-8.39294816 33.853813 -9.8763561 -9.0725422 7.98676587 4.09474373 ) (-14.2759208 26.82864 -1.88958955 -4.97779846 -16.675693 -2.03846168 ) (-24.50336 20.831611 -18.565284 -7.01626015 22.716026 -1.94089889 ) (-31.710632 12.844902 4.15074253 -8.95715905 -8.18842698 3.80206299 ) (-31.654102 5.78877354 -4.0376854 -5.15509606 4.0376854 -1.26735592 ) (-33.672943 1.58324837E-7 0 -6.42245198 4.0376854 1.26735496 ) (-31.654102 -5.78877449 4.0376854 -5.155097 -8.18842698 -3.80206204 ) (-31.710632 -12.844902 -4.15074253 -8.95715905 22.716026 1.94089889 ) (-24.503356 -20.831611 18.565284 -7.01626015 -16.675693 2.03846168 ) (-14.2759208 -26.82864 1.88958955 -4.97779846 7.98676396 -4.09474564 ) (-8.39294816 -33.853813 9.8763542 -9.0725441 -9.2713642 20.340518 ) (-3.15227747 -32.756095 0.604989052 11.2679767 5.09869957 -11.2673397 ) (0.00206130743 -27.121788 5.70368862 6.36285287E-4 -5.1234331 -11.271158 ) (3.14403296 -32.756729 0.580254913 -11.270523 9.3950348 20.351982 ) (8.42180444 -33.851265 9.9752903 9.08146096 -8.456707 -4.13678074 ) (14.168741 -26.838195 1.51858258 4.9446802 18.431793 2.19513607 ) (24.90322 -20.795944 19.950378 7.13981629 -29.270477 1.35623169 ) (30.21836 -12.978012 -9.32010079 8.49604798 20.650123 -1.62006092 ) (31.223323 -5.29199505 11.3300247 6.87598706 -11.3300247 -6.87598706 )) NATURAL)) ((29 ((42 169) (47 117) (61 78) (80 48) (102 28) (133 10) (180 -3) (222 -7) (264 -3) (311 10) (342 28) (364 48) (383 78) (397 117) (402 169) (397 221) (383 260) (364 290) (342 310) (311 328) (264 341) (222 345) (180 341) (133 328) (102 310) (80 290) (61 260) (47 221) (42 169)) NIL ((0.0957953036 -55.136116 9.7570095 0.390455067 0.154199600 17.645336 ) (9.92990495 -45.922988 9.9112091 18.035793 -5.3130598 -12.5694408 ) (17.184581 -34.171913 4.5981493 5.46635247 -2.90195894 8.63244058 ) (20.331752 -24.389339 1.69619012 14.098793 4.92089939 -15.960325 ) (24.488395 -18.27071 6.61709023 -1.86153316 19.218349 7.20887089 ) (40.71466 -16.527809 25.835441 5.34733773 -39.794303 5.12484169 ) (46.652946 -8.6180496 -13.958868 10.472179 13.9589 -3.70823574 ) (39.67353 1.14440918E-5 3.27086381E-5 6.76394368 13.958702 3.70810032 ) (46.652915 8.61800576 13.958736 10.472044 -39.793716 -5.12416935 ) (40.71479 16.527965 -25.834983 5.34787464 19.216178 -7.21142007 ) (24.487899 18.27013 -6.61880208 -1.86354613 4.92899609 15.969852 ) (20.333595 24.39151 -1.68980574 14.106308 -2.93216896 -8.66798974 ) (17.1777038 34.163818 -4.62197495 5.4383173 -5.20031739 12.7020969 ) (9.9555721 45.953193 -9.8222923 18.140415 -0.266559601 -18.140411 ) (-6.37024641E-7 55.023399 -10.0888519 1.02214494E-6 0.266559601 -18.140419 ) (-9.9555721 45.953186 -9.8222923 -18.140419 5.20031739 12.7021007 ) (-17.1777038 34.163818 -4.62197495 -5.4383173 2.93216944 -8.6679878 ) (-20.333595 24.39151 -1.68980551 -14.106306 -4.92899609 15.96985 ) (-24.487899 18.27013 -6.61880208 1.86354565 -19.216178 -7.21142007 ) (-40.71479 16.527965 -25.834983 -5.34787464 39.793716 -5.12416935 ) (-46.652915 8.61800386 13.958738 -10.472044 -13.958704 3.70809937 ) (-39.67353 1.11255794E-5 3.27086381E-5 -6.76394463 -13.9589 -3.70823288 ) (-46.652946 -8.6180496 -13.958868 -10.472177 39.794303 5.12483883 ) (-40.71466 -16.527809 25.835441 -5.34733868 -19.218349 7.20887185 ) (-24.488391 -18.27071 6.61709119 1.86153364 -4.9209013 -15.960327 ) (-20.331752 -24.389339 1.6961894 -14.0987949 2.90196085 8.63244248 ) (-17.184581 -34.171913 4.59815026 -5.4663515 5.31305886 -12.5694408 ) (-9.929903 -45.922988 9.9112091 -18.035793 -0.154199600 17.645336 )) PSEUDOCYCLIC)))) ((FAMILY gacha) (CHARACTER 120Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:02:12) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((81 0) (81 0) (81 337)) NIL ((0 -84.25 0 0 0 505.5 ) (0 168.5 0 505.5 0 -505.5 )) NATURAL) (2 ((81 337) (261 337)) NIL ((180. 0 0 0 0 0 )) NATURAL) (13 ((261 337) (287 336) (318 331) (346 318) (363 300) (375 272) (381 236) (375 200) (363 172) (346 154) (318 141) (287 136) (261 135)) NIL ((24.635082 -0.447435856 0 0 8.18948937 -3.31538487 ) (28.729827 -2.10512829 8.18948937 -3.31538487 -10.9474468 -7.42307568 ) (31.445594 -9.13205148 -2.75795746 -10.7384605 -12.399702 9.0076904 ) (22.487785 -15.3666668 -15.157659 -1.73076916 12.5462589 -10.6076908 ) (13.603256 -22.401279 -2.61139917 -12.3384609 -1.78534364 3.42307854 ) (10.099184 -33.028198 -4.39674282 -8.9153824 -11.404884 8.91538049 ) (-1.60187482E-7 -37.485893 -15.801628 -5.11072471E-7 11.404884 8.9153843 ) (-10.099184 -33.028198 -4.39674282 8.9153843 1.78534364 3.42307472 ) (-13.603256 -22.401279 -2.61139917 12.338459 -12.5462589 -10.6076889 ) (-22.487785 -15.3666649 -15.157659 1.73077011 12.399702 9.0076885 ) (-31.445594 -9.13204957 -2.7579565 10.7384586 10.947443 -7.42307377 ) (-28.729827 -2.10512829 8.18948747 3.31538487 -8.18948747 -3.31538487 )) NATURAL) (2 ((261 135) (134 135)) NIL ((-127. 0 0 0 0 0 )) NATURAL) (2 ((134 135) (134 0)) NIL ((0 -135. 0 0 0 0 )) NATURAL) (2 ((134 0) (81 0)) NIL ((-53. 0 0 0 0 0 )) NATURAL)) ((9 ((261 301) (283 299) (306 293) (323 270) (329 238) (323 206) (306 183) (283 177) (261 175)) NIL ((21.463916 -1.98214268 0 0 3.21649456 -0.107143402 ) (23.072162 -2.03571415 3.21649456 -0.107143402 -10.0824737 -23.464283 ) (21.247421 -13.875 -6.8659792 -23.571426 -4.88659764 15.964283 ) (11.9381427 -29.464283 -11.7525768 -7.60714245 -0.371133804 7.60714245 ) (-3.18512320E-7 -33.267852 -12.1237106 2.55529982E-7 0.371133804 7.60714055 ) (-11.9381446 -29.464283 -11.7525768 7.6071415 4.88659859 15.9642849 ) (-21.247421 -13.874998 -6.86597825 23.571426 10.0824718 -23.464283 ) (-23.072162 -2.03571415 3.21649504 0.107142448 -3.21649504 -0.107142448 )) NATURAL) (2 ((261 175) (134 175)) NIL ((-127. 0 0 0 0 0 )) NATURAL) (2 ((134 175) (134 301)) NIL ((0 126. 0 0 0 0 )) NATURAL) (2 ((134 301) (261 301)) NIL ((127. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 121Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:08:33) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((29 ((222 22) (187 25) (158 34) (128 51) (110 75) (98 105) (93 140) (91 169) (93 198) (98 233) (110 263) (128 287) (158 304) (189 313) (222 316) (255 313) (286 304) (316 287) (334 263) (346 233) (351 198) (353 169) (351 140) (346 105) (334 75) (316 51) (286 34) (257 25) (222 22)) NIL ((-36.888336 1.854002 0 0 11.3300247 6.875988 ) (-31.223323 5.291996 11.3300247 6.875988 -20.650123 1.62005996 ) (-30.21836 12.978014 -9.32010079 8.49604798 29.270477 -1.35623073 ) (-24.90322 20.795944 19.950378 7.13981724 -18.431793 -2.19513702 ) (-14.168741 26.838195 1.51858186 4.9446802 8.456707 4.13677883 ) (-8.42180444 33.851265 9.9752903 9.08145906 -9.3950348 -20.351982 ) (-3.14403296 32.756729 0.580255032 -11.270523 5.1234331 11.271158 ) (-0.00206090975 27.121788 5.70368862 6.36285287E-4 -5.09869957 11.2673397 ) (3.15227747 32.756095 0.604988218 11.2679767 9.2713661 -20.340518 ) (8.39294816 33.853813 9.8763561 -9.0725422 -7.98676587 4.09474373 ) (14.2759208 26.82864 1.88958955 -4.97779846 16.675693 -2.03846168 ) (24.50336 20.831611 18.565284 -7.01626015 -22.716026 -1.94089889 ) (31.710632 12.844902 -4.15074253 -8.95715905 8.18842698 3.80206299 ) (31.654102 5.78877354 4.0376854 -5.15509606 -4.0376854 -1.26735592 ) (33.672943 1.58324837E-7 0 -6.42245198 -4.0376854 1.26735496 ) (31.654102 -5.78877449 -4.0376854 -5.155097 8.18842698 -3.80206204 ) (31.710632 -12.844902 4.15074253 -8.95715905 -22.716026 1.94089889 ) (24.503356 -20.831611 -18.565284 -7.01626015 16.675693 2.03846168 ) (14.2759208 -26.82864 -1.88958955 -4.97779846 -7.98676396 -4.09474564 ) (8.39294816 -33.853813 -9.8763542 -9.0725441 9.2713642 20.340518 ) (3.15227747 -32.756095 -0.604989052 11.2679767 -5.09869957 -11.2673397 ) (-0.00206130743 -27.121788 -5.70368862 6.36285287E-4 5.1234331 -11.271158 ) (-3.14403296 -32.756729 -0.580254913 -11.270523 -9.3950348 20.351982 ) (-8.42180444 -33.851265 -9.9752903 9.08146096 8.456707 -4.13678074 ) (-14.168741 -26.838195 -1.51858258 4.9446802 -18.431793 2.19513607 ) (-24.90322 -20.795944 -19.950378 7.13981629 29.270477 1.35623169 ) (-30.21836 -12.978012 9.32010079 8.49604798 -20.650123 -1.62006092 ) (-31.223323 -5.29199505 -11.3300247 6.87598706 11.3300247 -6.87598706 )) NATURAL)) ((2 ((264 -3) (256 -5)) NIL ((-8. -2. 0 0 0 0 )) NATURAL) (5 ((256 -5) (255 -17) (261 -29) (273 -34) (285 -34)) NIL ((-2.4464283 -11.5892849 0 0 8.6785698 -2.46428537 ) (1.89285755 -12.821428 8.6785698 -2.46428537 -1.39285564 12.321426 ) (9.875 -9.1249981 7.28571416 9.8571415 -9.1071415 -4.82142735 ) (12.607141 -1.67857122 -1.8214283 5.03571415 1.8214283 -5.03571415 )) NATURAL) (2 ((285 -34) (367 -34)) NIL ((82. 0 0 0 0 0 )) NATURAL) (2 ((367 -34) (367 -69)) NIL ((0 -35. 0 0 0 0 )) NATURAL) (2 ((367 -69) (262 -69)) NIL ((-105. 0 0 0 0 0 )) NATURAL) (6 ((262 -69) (243 -66) (225 -58) (213 -44) (208 -22) (208 -4)) NIL ((-18.947364 1.91866016 0 0 -0.315789461 6.48803807 ) (-19.105262 5.16267872 -0.315789461 6.48803807 7.57894707 -2.44019127 ) (-15.631578 10.430622 7.26315785 4.0478468 -9.53674316E-7 9.27272416 ) (-8.36841966 19.11483 7.2631569 13.3205719 -1.57894706 -22.650714 ) (-1.89473653 21.110046 5.68420983 -9.33014298 -5.68420983 9.33014298 )) NATURAL) (2 ((208 -4) (180 -3)) NIL ((-28. 1. 0 0 0 0 )) NATURAL) (27 ((180 -3) (133 10) (102 28) (80 48) (61 78) (47 117) (42 169) (47 221) (61 260) (80 290) (102 310) (133 328) (180 341) (222 345) (264 341) (311 328) (342 310) (364 290) (383 260) (397 221) (402 169) (397 117) (383 78) (364 48) (342 28) (311 10) (264 -3)) NIL ((-50.682457 11.6410236 0 0 22.094749 8.15385057 ) (-39.635078 15.7179489 22.094749 8.15385057 -14.4737549 -10.7692546 ) (-24.777206 18.487171 7.62099457 -2.61540413 -6.19972516 16.923168 ) (-20.256076 24.333354 1.4212687 14.3077659 3.27266073 -8.92342759 ) (-17.1984749 34.179405 4.69392967 5.38433743 5.10908127 12.7705459 ) (-9.95000649 45.949012 9.80301095 18.154884 0.291007995 -18.15876 ) (-0.00149090960 55.02452 10.0940189 -0.00387597363 -0.273111343 -18.135498 ) (9.95597268 45.952888 9.8209076 -18.139377 -5.19856167 12.7007808 ) (17.177597 34.163902 4.62234593 -5.43859673 -2.93264007 -8.66763497 ) (20.333625 24.391487 1.68970585 -14.1062317 4.92912293 15.969757 ) (24.487892 18.2701339 6.61882878 1.86352634 19.216144 -7.2113981 ) (40.714798 16.527961 25.834976 -5.34787178 -39.793716 -5.12416458 ) (46.652908 8.61800767 -13.958744 -10.472036 13.958744 3.7080555 ) (39.673538 -6.37024641E-7 0 -6.76398087 13.958744 -3.70805359 ) (46.652908 -8.61800958 13.958744 -10.472034 -39.793716 5.12416172 ) (40.71479 -16.527961 -25.834976 -5.34787274 19.216144 7.21139908 ) (24.487892 -18.2701339 -6.61882878 1.86352634 4.92912197 -15.969757 ) (20.333625 -24.391487 -1.68970608 -14.1062317 -2.93264055 8.66763497 ) (17.177597 -34.163902 -4.62234688 -5.43859577 -5.1985607 -12.7007808 ) (9.95597077 -45.952888 -9.8209076 -18.139377 -0.273111343 18.135498 ) (-0.00149186514 -55.02452 -10.0940189 -0.00387699622 0.291007995 18.15876 ) (-9.95000649 -45.949012 -9.80301095 18.154884 5.10908127 -12.7705478 ) (-17.198478 -34.179405 -4.69392967 5.38433647 3.2726612 8.9234295 ) (-20.256076 -24.33335 -1.42126846 14.3077659 -6.19972706 -16.923168 ) (-24.777206 -18.487171 -7.6209955 -2.6154046 -14.4737529 10.7692546 ) (-39.635078 -15.7179489 -22.094749 8.15385057 22.094749 -8.15385057 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 122Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:19:31) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((3 ((73 0) (73 0) (73 337)) NIL ((0 -84.25 0 0 0 505.5 ) (0 168.5 0 505.5 0 -505.5 )) NATURAL) (2 ((73 337) (244 337)) NIL ((171. 0 0 0 0 0 )) NATURAL) (7 ((244 337) (280 335) (316 328) (345 311) (362 286) (367 255) (367 242)) NIL ((35.673072 -1.27820491 0 0 1.96153855 -4.33076954 ) (36.653839 -3.44358969 1.96153855 -4.33076954 -9.80769158 -8.34615136 ) (33.711532 -11.947435 -7.8461542 -12.6769218 -4.73076725 7.71538354 ) (23.499996 -20.766666 -12.576921 -4.9615383 -1.26923179 -10.5153846 ) (10.2884597 -30.985897 -13.846153 -15.476923 9.80769158 46.346145 ) (1.34615373 -23.289741 -4.03846169 30.869228 4.03846169 -30.869228 )) NATURAL) (6 ((367 242) (367 229) (362 198) (345 173) (316 156) (292 151)) NIL ((0.732057333 -7.84210587 0 0 -4.39234448 -30.947364 ) (-1.46411466 -23.315788 -4.39234448 -30.947364 -8.03827668 46.73683 ) (-9.875597 -30.894733 -12.430622 15.789472 -5.45454407 -11.999998 ) (-25.033493 -21.105262 -17.885166 3.78947306 29.856456 13.2631569 ) (-27.990428 -10.6842098 11.9712906 17.052631 -11.9712906 -17.052631 )) NATURAL) (2 ((292 151) (360 0)) NIL ((68. -151. 0 0 0 0 )) NATURAL) (2 ((360 0) (305 0)) NIL ((-55. 0 0 0 0 0 )) NATURAL) (2 ((305 0) (239 147)) NIL ((-66. 147. 0 0 0 0 )) NATURAL) (2 ((239 147) (120 147)) NIL ((-119. 0 0 0 0 0 )) NATURAL) (2 ((120 147) (120 0)) NIL ((0 -147. 0 0 0 0 )) NATURAL) (2 ((120 0) (73 0)) NIL ((-47. 0 0 0 0 0 )) NATURAL)) ((2 ((120 183) (120 301)) NIL ((0 118. 0 0 0 0 )) NATURAL) (2 ((120 301) (226 301)) NIL ((106. 0 0 0 0 0 )) NATURAL) (6 ((226 301) (272 299) (293 292) (307 280) (313 265) (315 242)) NIL ((52.330139 -1. 0 0 -37.980857 -6. ) (33.339706 -4. -37.980857 -6. 39.904296 0 ) (15.311004 -10. 1.92344451 -6. -13.63636 6. ) (10.416267 -13. -11.712917 0 8.6411457 -12. ) (3.0239234 -19. -3.07177019 -12. 3.07177019 12. )) NATURAL) (6 ((315 242) (313 219) (307 204) (293 192) (272 185) (226 183)) NIL ((-1.48803806 -24.999996 0 0 -3.07177067 11.999998 ) (-3.0239234 -18.999996 -3.07177067 11.999998 -8.6411457 -11.999996 ) (-10.416267 -12.999998 -11.712917 2.54313135E-7 13.636358 5.9999981 ) (-15.311004 -9.9999981 1.92344212 5.99999905 -39.904289 9.53674316E-7 ) (-33.339714 -4. -37.98085 6. 37.98085 -6. )) NATURAL) (2 ((226 183) (120 183)) NIL ((-106. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 123Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:39:15) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((370 259) (328 259)) NIL ((-42. 0 0 0 0 0 )) NATURAL) (19 ((328 259) (319 283) (296 300) (270 309) (220 313) (178 311) (154 307) (129 297) (113 280) (109 264) (115 239) (145 218) (182 212) (218 209) (273 203) (318 191) (350 172) (371 140) (378 88)) NIL ((-4.98698998 25.367855 0 0 -24.07806 -8.2071476 ) (-17.02602 21.264282 -24.07806 -8.2071476 36.390304 -0.964258195 ) (-22.908927 12.575006 12.312244 -9.1714058 -55.48316 6.06417847 ) (-38.338264 6.43568993 -43.17092 -3.10722733 59.54238 -5.29245758 ) (-51.737999 0.682233811 16.371463 -8.3996849 9.31360246 9.10564996 ) (-30.709728 -3.16462517 25.685066 0.705966711 -36.796806 -7.13014699 ) (-23.423069 -6.02373219 -11.1117458 -6.42418099 23.873664 -4.58506012 ) (-22.597984 -14.740444 12.761919 -11.009241 1.30215072 19.470386 ) (-9.1849899 -16.014488 14.0640697 8.4611473 -11.0822677 -25.296493 ) (-0.662053824 -20.201587 2.9818015 -16.835346 31.026916 21.71558 ) (17.833206 -26.179142 34.00872 4.88023567 -29.025417 16.434162 ) (37.329216 -13.081827 4.98330307 21.314399 -16.925239 -21.452232 ) (33.849899 -2.4935441 -11.941936 -0.137833327 48.72637 -2.62523365 ) (46.271156 -3.943995 36.784439 -2.76306724 -57.98026 -4.04682827 ) (54.06546 -8.73047639 -21.195827 -6.8098955 9.19470979 0.812546731 ) (37.466987 -15.134098 -12.0011177 -5.99734879 3.20141602 -5.20335579 ) (27.066577 -23.733127 -8.7997017 -11.2007045 -10.00037 -15.9991169 ) (13.266689 -42.933387 -18.800071 -27.199821 18.800071 27.199821 )) NATURAL) (11 ((378 88) (369 49) (349 23) (314 4) (273 -6) (214 -9) (151 -5) (106 7) (73 25) (46 52) (36 84)) NIL ((-7.0958252 -42.124916 0 0 -11.425045 18.749504 ) (-12.8083477 -32.75016 -11.425045 18.749504 -8.87477494 -15.74752 ) (-28.67078 -21.87442 -20.299819 3.00198221 22.924152 8.2405815 ) (-37.508522 -14.752147 2.62433576 11.242565 -28.821849 -5.2148094 ) (-49.295112 -6.11698628 -26.197517 6.02775574 20.363262 0.618652344 ) (-65.311004 0.220096260 -5.8342533 6.64640809 31.368785 2.74019813 ) (-55.46086 8.2366047 25.534534 9.3866062 -13.838428 -5.57944775 ) (-36.845535 14.833486 11.6961059 3.80715847 -12.015068 7.5775995 ) (-31.156967 22.429443 -0.318962395 11.384758 25.898704 -6.7309475 ) (-18.52658 30.448726 25.579742 4.6538105 -25.579742 -4.6538105 )) NATURAL) (2 ((36 84) (88 84)) NIL ((52. 0 0 0 0 0 )) NATURAL) (4 ((88 84) (103 56) (127 40) (166 28)) NIL ((13.599998 -30.93333 0 0 8.3999996 17.599998 ) (17.799999 -22.133331 8.3999996 17.599998 11.999998 -15.999998 ) (32.199997 -12.5333328 20.399997 1.5999999 -20.399997 -1.5999999 )) NATURAL) (25 ((166 28) (208 23) (248 25) (287 31) (320 57) (330 99) (322 135) (292 152) (248 159) (193 165) (140 174) (103 188) (75 209) (60 237) (57 264) (69 299) (91 320) (124 334) (165 343) (216 345) (261 343) (300 335) (336 316) (360 289) (370 259)) NIL ((42.478797 -6.88853169 0 0 -2.87278843 11.331192 ) (41.042396 -1.22293496 -2.87278843 11.331192 2.36394262 -14.6559658 ) (39.351585 2.78027391 -0.508845687 -3.32477379 -0.582982898 29.292675 ) (38.551246 14.1018409 -1.09182858 25.967903 -30.032005 -6.51475526 ) (22.443412 36.812362 -31.123836 19.453147 18.711029 -27.23365 ) (0.675090075 42.648689 -12.412805 -7.7805023 -14.812124 -16.550632 ) (-19.1437759 26.592868 -27.224929 -24.331134 16.53746 15.43618 ) (-38.099975 9.97982408 -10.6874675 -8.89495469 -3.3377304 8.805912 ) (-50.456306 5.48782635 -14.025198 -0.0890419930 14.813459 3.34016419 ) (-57.074775 7.06886674 0.788262964 3.25112248 22.083881 1.83342743 ) (-45.244567 11.2367038 22.872146 5.0845499 -19.14899 1.3261261 ) (-31.946922 16.984317 3.7231555 6.410676 12.512073 4.8620653 ) (-21.967727 25.826026 16.235229 11.272741 -6.89930726 -20.774387 ) (-9.1821537 26.711574 9.33592225 -9.50164796 9.0851593 30.235496 ) (4.69634819 32.327667 18.421081 20.733848 -11.4413375 -46.167587 ) (17.3967628 29.977726 6.97974396 -25.433738 6.68019105 22.434852 ) (27.716602 15.761413 13.659935 -2.9988861 -9.27941896 -1.57182884 ) (36.736824 11.976614 4.3805151 -4.57071495 12.4374847 -4.14753914 ) (47.336082 5.33212757 16.818 -8.7182541 -28.470516 6.1619911 ) (49.918823 -0.305130005 -11.652515 -2.55626249 5.4445772 -2.50043249 ) (40.988594 -4.1116085 -6.2079382 -5.05669499 6.69220734 -8.16025926 ) (38.126762 -13.248434 0.484269857 -13.216955 -14.213407 5.14147759 ) (31.504329 -23.894649 -13.729139 -8.0754776 -3.83857536 5.59434796 ) (15.855903 -29.172954 -17.567714 -2.48112965 17.567714 2.48112965 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 124Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:44:08) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((192 0) (192 301)) NIL ((0 301. 0 0 0 0 )) NATURAL) (2 ((192 301) (52 301)) NIL ((-140. 0 0 0 0 0 )) NATURAL) (2 ((52 301) (52 337)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((52 337) (388 337)) NIL ((336. 0 0 0 0 0 )) NATURAL) (2 ((388 337) (388 301)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((388 301) (254 301)) NIL ((-134. 0 0 0 0 0 )) NATURAL) (2 ((254 301) (254 0)) NIL ((0 -301. 0 0 0 0 )) NATURAL) (2 ((254 0) (192 0)) NIL ((-62. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 125Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:47:06) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((13 ((390 83) (381 56) (364 35) (340 18) (309 5) (271 -4) (220 -8) (169 -4) (132 5) (100 18) (76 35) (60 56) (51 83)) NIL ((-7.24374676 -28.381198 0 0 -10.5375175 8.2871933 ) (-12.512506 -24.237598 -10.5375175 8.2871933 4.6875944 -5.4359722 ) (-20.706226 -18.668392 -5.84992314 2.85122108 -2.21286487 1.45669841 ) (-27.662582 -15.088821 -8.062788 4.3079195 4.16386414 -0.390820980 ) (-33.643432 -10.9763126 -3.8989234 3.91709852 -14.4425907 0.106587886 ) (-44.763656 -7.00592137 -18.341514 4.0236864 17.606502 5.96446896 ) (-54.301918 6.37024641E-7 -0.735011101 9.98815537 22.016567 -5.9644699 ) (-44.02864 7.00592137 21.281559 4.02368546 -21.67279 -0.106587410 ) (-33.58348 10.9763126 -0.391231656 3.91709805 10.6745968 0.390821457 ) (-28.637413 15.088821 10.283365 4.3079195 -3.02559567 -1.45669794 ) (-19.866848 18.668392 7.25776959 2.85122156 1.42778682 5.43597126 ) (-11.895185 24.237602 8.6855564 8.2871933 -8.6855564 -8.2871933 )) NATURAL) (2 ((51 83) (51 337)) NIL ((0 254. 0 0 0 0 )) NATURAL) (2 ((51 337) (101 337)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((101 337) (101 83)) NIL ((0 -254. 0 0 0 0 )) NATURAL) (10 ((101 83) (110 61) (127 46) (149 37) (196 30) (245 30) (292 37) (314 46) (331 61) (340 83)) NIL ((6.73856164 -23.4566 0 0 13.568626 8.7396221 ) (13.5228748 -19.086792 13.568626 8.7396221 -19.843132 -1.69811344 ) (17.169933 -11.196226 -6.27450753 7.04150868 47.803909 -7.94716836 ) (34.797386 -8.1283016 41.529403 -0.905660153 -51.372535 9.4867897 ) (50.640518 -4.29056549 -9.8431358 8.58113099 19.686271 0 ) (50.640518 4.29056549 9.8431358 8.58113099 -51.372535 -9.4867897 ) (34.797378 8.1283016 -41.529403 -0.905660153 47.803909 7.94716836 ) (17.169933 11.196226 6.27450944 7.04150868 -19.843135 1.69811344 ) (13.5228748 19.086792 -13.568626 8.7396221 13.568626 -8.7396221 )) NATURAL) (2 ((340 83) (340 337)) NIL ((0 254. 0 0 0 0 )) NATURAL) (2 ((340 337) (390 337)) NIL ((50. 0 0 0 0 0 )) NATURAL) (2 ((390 337) (390 83)) NIL ((0 -254. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 126Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:51:38) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((21 337) (192 0)) NIL ((171. -337. 0 0 0 0 )) NATURAL) (2 ((192 0) (248 0)) NIL ((56. 0 0 0 0 0 )) NATURAL) (2 ((248 0) (420 337)) NIL ((172. 337. 0 0 0 0 )) NATURAL) (2 ((420 337) (370 337)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((370 337) (220 44)) NIL ((-150. -293. 0 0 0 0 )) NATURAL) (2 ((220 44) (71 337)) NIL ((-149. 293. 0 0 0 0 )) NATURAL) (2 ((71 337) (21 337)) NIL ((-50. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 127Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 13:57:20) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((24 337) (90 0)) NIL ((66. -337. 0 0 0 0 )) NATURAL) (2 ((90 0) (143 0)) NIL ((53. 0 0 0 0 0 )) NATURAL) (2 ((143 0) (221 288)) NIL ((78. 288. 0 0 0 0 )) NATURAL) (2 ((221 288) (298 0)) NIL ((77. -288. 0 0 0 0 )) NATURAL) (2 ((298 0) (351 0)) NIL ((53. 0 0 0 0 0 )) NATURAL) (2 ((351 0) (417 337)) NIL ((66. 337. 0 0 0 0 )) NATURAL) (2 ((417 337) (367 337)) NIL ((-50. 0 0 0 0 0 )) NATURAL) (2 ((367 337) (317 79)) NIL ((-50. -258. 0 0 0 0 )) NATURAL) (2 ((317 79) (247 337)) NIL ((-70. 258. 0 0 0 0 )) NATURAL) (2 ((247 337) (194 337)) NIL ((-53. 0 0 0 0 0 )) NATURAL) (2 ((194 337) (124 79)) NIL ((-70. -258. 0 0 0 0 )) NATURAL) (2 ((124 79) (74 337)) NIL ((-50. 258. 0 0 0 0 )) NATURAL) (2 ((74 337) (24 337)) NIL ((-50. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 130Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 14:06:06) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((49 0) (107 0)) NIL ((58. 0 0 0 0 0 )) NATURAL) (2 ((107 0) (219 142)) NIL ((112. 142. 0 0 0 0 )) NATURAL) (2 ((219 142) (331 0)) NIL ((112. -142. 0 0 0 0 )) NATURAL) (2 ((331 0) (389 0)) NIL ((58. 0 0 0 0 0 )) NATURAL) (2 ((389 0) (248 179)) NIL ((-141. 179. 0 0 0 0 )) NATURAL) (2 ((248 179) (372 337)) NIL ((124. 158. 0 0 0 0 )) NATURAL) (2 ((372 337) (314 337)) NIL ((-58. 0 0 0 0 0 )) NATURAL) (2 ((314 337) (219 216)) NIL ((-95. -121. 0 0 0 0 )) NATURAL) (2 ((219 216) (125 337)) NIL ((-94. 121. 0 0 0 0 )) NATURAL) (2 ((125 337) (66 337)) NIL ((-59. 0 0 0 0 0 )) NATURAL) (2 ((66 337) (189 179)) NIL ((123. -158. 0 0 0 0 )) NATURAL) (2 ((189 179) (49 0)) NIL ((-140. -179. 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 131Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 14:08:44) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((190 0) (190 154)) NIL ((0 154. 0 0 0 0 )) NATURAL) (2 ((190 154) (30 337)) NIL ((-160. 183. 0 0 0 0 )) NATURAL) (2 ((30 337) (91 337)) NIL ((61. 0 0 0 0 0 )) NATURAL) (2 ((91 337) (219 188)) NIL ((128. -149. 0 0 0 0 )) NATURAL) (2 ((219 188) (347 337)) NIL ((128. 149. 0 0 0 0 )) NATURAL) (2 ((347 337) (408 337)) NIL ((61. 0 0 0 0 0 )) NATURAL) (2 ((408 337) (247 154)) NIL ((-161. -183. 0 0 0 0 )) NATURAL) (2 ((247 154) (247 0)) NIL ((0 -154. 0 0 0 0 )) NATURAL) (2 ((247 0) (190 0)) NIL ((-57. 0 0 0 0 0 )) NATURAL)))) ((FAMILY gacha) (CHARACTER 132Q) (FACE M R E) (WIDTH 441 0) (FIDUCIAL 480 480) (VERSION 0 19-SEP-77 14:10:13) (MADE-FROM gachac.cu 0 140 0 0) (SPLINES ((2 ((72 337) (72 301)) NIL ((0 -36. 0 0 0 0 )) NATURAL) (2 ((72 301) (293 301)) NIL ((221. 0 0 0 0 0 )) NATURAL) (2 ((293 301) (61 29)) NIL ((-232. -272. 0 0 0 0 )) NATURAL) (2 ((61 29) (61 0)) NIL ((0 -29. 0 0 0 0 )) NATURAL) (2 ((61 0) (378 0)) NIL ((317. 0 0 0 0 0 )) NATURAL) (2 ((378 0) (378 36)) NIL ((0 36. 0 0 0 0 )) NATURAL) (2 ((378 36) (124 36)) NIL ((-254. 0 0 0 0 0 )) NATURAL) (2 ((124 36) (355 308)) NIL ((231. 272. 0 0 0 0 )) NATURAL) (2 ((355 308) (355 337)) NIL ((0 29. 0 0 0 0 )) NATURAL) (2 ((355 337) (72 337)) NIL ((-283. 0 0 0 0 0 )) NATURAL)))) STOP \ No newline at end of file diff --git a/lispusers/GENERIC-INIT b/lispusers/GENERIC-INIT new file mode 100644 index 00000000..e72b98e2 --- /dev/null +++ b/lispusers/GENERIC-INIT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "XCL") (filecreated "21-Sep-88 11:02:16" |{EG:PARC:XEROX}LISP>USERS>GENERIC-INIT.;108| 102770 |changes| |to:| (advice files? cl:compile makefile getpromptwindow) (vars rooms-init-commands mail-init-commands unix-init-commands loops-init-commands tedit-init-commands pcl-init-commands generic-initcoms who-line-commands display-control-init-commands chat-init-commands) (commands "MORE" "BREAK" "UNBREAK" "CALLS" "DESCRIBE" "EC" "EFF" "FILES?" "IC" "NOTICE" "MAKE" "SPY") (functions xcl-user::log-generic-init-user eval-at-greet notice make oam de file |PickOneAtRandom| atom-neighbors load-nova-fonts) |previous| |date:| "19-Sep-88 09:26:30" |{EG:PARC:XEROX}LISP>USERS>GENERIC-INIT.;107| ) ; Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. (prettycomprint generic-initcoms) (rpaqq generic-initcoms ((* |;;| "Macro to avoid problems when trying to maintain file.") (coms (p (cl:proclaim (quote (global *generic-init-loaded*)))) (initvars (*generic-init-loaded* nil)) (functions eval-at-greet)) (* |;;| "Silent loads") (coms (p (cl:proclaim (quote (global *load-silent* prettyheader)))) (initvars (*load-silent* nil)) (vars (\\original-load-verbose *load-verbose*) (\\original-prettyheader prettyheader) (*load-verbose* (if *load-silent* then nil else *load-verbose*)) (prettyheader (if *load-silent* then nil else prettyheader)))) (* |;;| "Environment setup") (coms * compute-directories-init-commands) (coms * env-tailoring-init-commands) (coms * patch-init-commands) (coms (* |;;| "Wants to be (COMS * FILECACHE-INIT-COMMANDS), but the FileCrasher doesn't exist in Lyric, yet. Probably never will.") (vars filecache-init-commands)) (coms * font-setup-init-commands) (declare\: eval@loadwhen (not *generic-init-loaded*) donteval@compile docopy (files (sysload from lispusers) loadmenuitems)) (* |;;| "Machine status") (coms * who-line-commands) (coms * vstats-init-commands) (* |;;| "Display control") (coms * screen-setup-init-commands) (coms * rooms-init-commands) (coms * change-background-init-commands) (coms * display-control-init-commands) (coms * idle-init-commands) (coms * clock-init-commands) (* |;;| "Programming stuff") (coms * programming-init-commands) (coms * old-utils-commands) (coms * wizard-init-commands) (coms * dinfo-init-commands) (coms * pcl-init-commands) (coms * loops-init-commands) (* |;;| "Documentation") (coms * tedit-init-commands) (coms * sketch-init-commands) (coms * notecards-init-commands) (* |;;| "Communication & Info") (coms * mail-init-commands) (coms * chat-init-commands) (coms * talk-init-commands) (coms * calendar-init-commands) (coms * printer-init-commands) (coms * db-init-commands) (coms * nfs-init-commands) (* |;;| "Files") (coms * file-watch-init-commands) (coms * file-server-init-commands) (coms * dirgrapher-init-commands) (coms * fb-init-commands) (coms * compare-files-init-commands) (* |;;| "Random stuff") (coms * unix-init-commands) (coms * demos-init-commands) (coms * games-init-commands) (* |;;| "Cleanup") (coms * background-menu-cleanup-init-commands) (coms * do-load-utilities-init-commands) (coms (* |;;| "Send the Tool Work's a message telling it about this user.") (functions xcl-user::log-generic-init-user) (initvars (\\cc-generic-init-msg t)) (p (eval-at-greet (cl:unless *generic-init-loaded* (xcl-user::log-generic-init-user))))) (vars (*load-verbose* \\original-load-verbose) (prettyheader \\original-prettyheader) (*generic-init-loaded* t)) (* |;;| "Make the FileManager happy") (declare\: dontcopy (prop makefile-environment generic-init)))) (* |;;| "Macro to avoid problems when trying to maintain file.") (cl:proclaim (quote (global *generic-init-loaded*))) (rpaq? *generic-init-loaded* nil) (defmacro eval-at-greet (&body forms) "Evaluate the forms only when loading the compiled file, and then only when greeting" (bquote (cl:eval-when (cl:load) (cl:unless (or *generic-init-loaded* (memb dfnflg (quote (prop allprop)))) (\\\,@ forms))))) (* |;;| "Silent loads") (cl:proclaim (quote (global *load-silent* prettyheader))) (rpaq? *load-silent* nil) (rpaq \\original-load-verbose *load-verbose*) (rpaq \\original-prettyheader prettyheader) (rpaq *load-verbose* (if *load-silent* then nil else *load-verbose*)) (rpaq prettyheader (if *load-silent* then nil else prettyheader)) (* |;;| "Environment setup") (rpaqq compute-directories-init-commands ((* |;;| "Who am I?") (declare\: donteval@compile (vars (|\\BasicUserName| (let* ((name (username)) (registry-pos (strpos "." name nil nil nil nil nil t))) (cond (registry-pos (substring name 1 (sub1 registry-pos))) (t name)))) (loginhost/dir (cond ((or (null loginhost/dir) (eq loginhost/dir (quote {dsk}))) (concat "{PHYLUM}<" |\\BasicUserName| ">LISP>")) (t loginhost/dir))))) (initvars (|\\UserHomeDirectory| (u-case (packfilename.string (quote host) (filenamefield loginhost/dir (quote host)) (quote directory) |\\BasicUserName|))) (tempdir (concat |\\UserHomeDirectory| "TEMP>")) (home-machine-name "") (private-lispusersdirectories nil) (*cache-directories* nil)))) (* |;;| "Who am I?") (declare\: donteval@compile (rpaq |\\BasicUserName| (let* ((name (username)) (registry-pos (strpos "." name nil nil nil nil nil t))) (cond (registry-pos (substring name 1 (sub1 registry-pos))) (t name)))) (rpaq loginhost/dir (cond ((or (null loginhost/dir) (eq loginhost/dir (quote {dsk}))) (concat "{PHYLUM}<" |\\BasicUserName| ">LISP>")) (t loginhost/dir))) ) (rpaq? |\\UserHomeDirectory| (u-case (packfilename.string (quote host) (filenamefield loginhost/dir (quote host)) (quote directory) |\\BasicUserName|))) (rpaq? tempdir (concat |\\UserHomeDirectory| "TEMP>")) (rpaq? home-machine-name "") (rpaq? private-lispusersdirectories nil) (rpaq? *cache-directories* nil) (rpaqq env-tailoring-init-commands ((* |;;;| " Misc environmental tailoring") (declare\: donteval@load donteval@compile (files (sysload noerror from lispusers) pagehold) (vars (|MaxValueLeftMargin| 512) (scrollbarwidth 20) (fixspelldefault (quote \n)) (\\ethertimeout 3000) (empress#sides 2) (*print-case* :downcase)) (* |;;| "FileManager defaults") (vars (cleanupoptions (quote (rc st))) (copyrightflg (quote default)) (recompiledefault (quote exprs)) (*default-cleanup-compiler* (quote cl:compile-file)) (*default-makefile-environment* (quote (:package "XCL-USER" :readtable "XCL" :base 10)))) (* |;;| "None of us here are system hackers") (vars (*original-give-and-take-directories* *give-and-take-directories*) (*give-and-take-directories* (cl:remove-if (cl:function (cl:lambda (file) (cl:member (cl:pathname-host file) (quote ("ERIS" "ERINYES")) :test (cl:function string-equal)))) *give-and-take-directories*))) (* |;;| "I don't like being told that I haven't listed files...") (advise files?) (* |;;| "Load up the extended vmem stuff") (p (eval-at-greet (cl:when (and (eq makesysname (quote :lyric)) (eq (machinetype) (quote dorado))) (filesload (sysload from lispusers) extendedvmem) (install-extended-virtual-memory)) (cl:when (cl:fboundp (quote describe-virtual-memory)) (describe-virtual-memory)))) (* |;;| "Check greetdates whenever I log back in") (addvars (afterlogoutforms (|for| greet-date |in| greetdates |bind| (today _ (date)) |when| (eql 1 (strpos (car greet-date) today nil nil nil nil (uppercasearray))) |do| (|printout| t t (cdr greet-date) t))))))) (* |;;;| " Misc environmental tailoring") (declare\: donteval@load donteval@compile (filesload (sysload noerror from lispusers) pagehold) (rpaqq |MaxValueLeftMargin| 512) (rpaqq scrollbarwidth 20) (rpaqq fixspelldefault \n) (rpaqq \\ethertimeout 3000) (rpaqq empress#sides 2) (rpaq *print-case* :downcase) (rpaqq cleanupoptions (rc st)) (rpaqq copyrightflg default) (rpaqq recompiledefault exprs) (rpaqq *default-cleanup-compiler* cl:compile-file) (rpaqq *default-makefile-environment* (:package "XCL-USER" :readtable "XCL" :base 10)) (rpaq *original-give-and-take-directories* *give-and-take-directories*) (rpaq *give-and-take-directories* (cl:remove-if (cl:function (cl:lambda (file) (cl:member (cl:pathname-host file) (quote ("ERIS" "ERINYES")) :test (cl:function string-equal)))) *give-and-take-directories*)) (xcl:reinstall-advice (quote files?) :before (quote ((:last (setq notlistedfiles nil))))) (readvise files?) (eval-at-greet (cl:when (and (eq makesysname (quote :lyric)) (eq (machinetype) (quote dorado))) (filesload (sysload from lispusers) extendedvmem) (install-extended-virtual-memory)) (cl:when (cl:fboundp (quote describe-virtual-memory)) (describe-virtual-memory))) (addtovar afterlogoutforms (|for| greet-date |in| greetdates |bind| (today _ (date)) |when| (eql 1 (strpos (car greet-date) today nil nil nil nil (uppercasearray))) |do| (|printout| t t (cdr greet-date) t))) ) (rpaqq patch-init-commands ((* |;;;| " Patches") (fns purge-file-advice purge-advice) (declare\: donteval@load donteval@compile (* |;;| "") (* |;;| "Start the Lyric-only stuff") (e (printout nil "(" .ppftl (quote (cl:when (eq makesysname :lyric))) t)) (* |;;| "Add NS fileserver random-access support") (initvars (*nsfiling-random-access* t)) (* |;;| "Fix some compiler bogosity") (advise cl:compile) (* |;;| "Add a few missing optimizers") (files (noerror from valueof (append private-lispusersdirectories lispusersdirectories)) base-optimizers) (* |;;| "The interpreted LET* function is busted") (p (/putd (quote let*) nil)) (* |;;| "The var \\BrushAList is broken in the loadup - it ends in (... . NOBIND) instead of (... . NIL)") (* \; "Some people have their system set up to be so paranoid that it is always checking vars to see if they are eq to NOBIND, and generating an error if they are. Since, in the last loop thru the list, the var is indeed bound to NOBIND, we got troubles. The following piece of code is structured in a convoluted way to get around this problem.") (vars (|\\BrushAList| (cl:do ((x |\\BrushAList| (cdr x)) (number-good-brushes 0 (cl:incf number-good-brushes)) (brushes nil) (number-brushes (length |\\BrushAList|))) ((= number-good-brushes number-brushes) (cl:nreverse brushes)) (cl:push (car x) brushes)))) (* |;;| "Advice saved in a file often gets duplicated. This tries to fix it.") (addvars (makefileforms (purge-file-advice file))) (advise makefile) (* |;;| "Fix the SEdit hang bug") (p (changename (quote |\\\\seditA0001|) (quote readp) (quote \\sysbufp))) (* |;;| "") (* |;;| "End the Lyric-only stuff") (e (printout nil " )" t))))) (* |;;;| " Patches") (defineq (purge-file-advice (lambda (file) (* \; "Edited 30-Oct-87 11:08 by smL") (|for| f |in| (filecomslst (rootfilename file) 'advice) |do| (purge-advice f)))) (purge-advice (lambda (fn) (* \; "Edited 30-Oct-87 11:07 by smL") (|if| (hasdef fn 'advice) |then| (putdef fn 'advice (let ((advice (getdef fn 'advice))) (intersection advice advice))) fn |else| nil))) ) (declare\: donteval@load donteval@compile (cl:when (eq makesysname :lyric) (rpaq? *nsfiling-random-access* t) (xcl:reinstall-advice (quote cl:compile) :around (quote ((:last (let (compiler::*input-stream*) (xcl:inner)))))) (readvise cl:compile) (filesload (noerror from valueof (append private-lispusersdirectories lispusersdirectories)) base-optimizers) (/putd (quote let*) nil) (rpaq |\\BrushAList| (cl:do ((x |\\BrushAList| (cdr x)) (number-good-brushes 0 (cl:incf number-good-brushes)) (brushes nil) (number-brushes (length |\\BrushAList|))) ((= number-good-brushes number-brushes) (cl:nreverse brushes)) (cl:push (car x) brushes))) (addtovar makefileforms (purge-file-advice file)) (xcl:reinstall-advice (quote makefile) :after (quote ((:last (purge-file-advice file)))) :around (quote ((:last (let ((prettyflg (and (not (memb (quote fast) options)) prettyflg))) (declare (cl:special prettyflg)) *)) (:last (let ((|ObjectAlwaysPPFlag| nil)) *))))) (readvise makefile) (changename (quote |\\\\seditA0001|) (quote readp) (quote \\sysbufp)) ) ) (* |;;| "Wants to be (COMS * FILECACHE-INIT-COMMANDS), but the FileCrasher doesn't exist in Lyric, yet. Probably never will." ) (rpaqq filecache-init-commands ((* |;;;| "File caching stuff") (files (from "{EG:}FileCache>") filecache) (declare\: donteval@load (p (|if| (boundp (quote fcache.version.number)) |then| (* |;;| "Set up some initial parameters") (|for| |propDescr| |in| (quote ((trust.cachelist t) (delay.delete t) (timetoverify 300) (io.block? t))) |do| (* \; "UNDOably, of course") (undosave (bquote (fcache.putprop (\\\, (car |propDescr|)) (\\\, (fcache.getprop (car |propDescr|)))))) (fcache.putprop (car |propDescr|) (cadr |propDescr|))) (* |;;| "Tell the fcache scavenger to ignore some files that I store on the cache partition") (/nconc (assoc (quote dorado) fcache.scavenge.ignore) (copy (quote (*.sysout updateloops.cm)))) (* |;;| "Treat any mail files as private files if I'm not on my normal machine") (|if| (not (string-equal home-machine-name (etherhostname))) |then| (|/push| private.files (quote *.mail)))))) (* |;;| "File cache msg window stuff") (initvars (file-cache-message-stream-region (|with| region (windowprop promptwindow (quote region)) (createregion left (difference bottom height) width height))) (file-cache-message-stream-icon-position (|with| region (windowprop promptwindow (quote region)) (|create| position xcoord _ (difference left 75) ycoord _ bottom)))) (declare\: donteval@load (p (|if| (boundp (quote fcache.version.number)) |then| (filesload (sysload noerror from lispusers) filecachemsgwindow) (* \; "UNDOably, of course") (undosave (bquote (dspfont (\\\, (dspfont (fontcreate (quote gacha) 8) *file-cache-message-stream*)) (\\\, *file-cache-message-stream*)))) (dspreset *file-cache-message-stream*) (shrinkw *file-cache-message-stream*)))))) (rpaqq font-setup-init-commands ((* |;;;| "Define printing/fonts the way people like. This includes setting prettyprinting fonts used by the editor and others, Lafite fonts, default flags controlling prettyprinting at the top level, ... This needs to be early, so other utils get the desired fonts.") (alists (fontdefs generic-init)) (initvars (\\font-profile-name (quote generic-init))) (declare\: donteval@load donteval@compile (p (eval-at-greet (fontset \\font-profile-name t) (cl:when (boundp (quote promptfont)) (undosave (bquote (dspfont (\\\, (dspfont promptfont promptwindow)) (\\\, promptwindow))))))) (advise getpromptwindow)))) (* |;;;| "Define printing/fonts the way people like. This includes setting prettyprinting fonts used by the editor and others, Lafite fonts, default flags controlling prettyprinting at the top level, ... This needs to be early, so other utils get the desired fonts." ) (addtovar fontdefs (generic-init (fontchangeflg . all) (filelinelength . 102) (commentlinelength 80 . 102) (lambdafontlinelength . 95) (firstcol . 60) (prettylcom . 25) (listfilestr . " ") (|ObjectDontPPFlag| . t) (sysprettyflg . t) (**comment**flg) (fontprofile (defaultfont 1 (gacha 10) (gacha 8) (terminal 8)) (boldfont 2 (helvetica 10 brr) (helvetica 8 brr) (modern 8 brr)) (littlefont 3 (helvetica 8) (helvetica 6 mir) (modern 6 mir)) (bigfont 4 (helvetica 12 brr) (helvetica 10 brr) (modern 10 brr)) (userfont boldfont) (commentfont littlefont) (lambdafont bigfont) (systemfont) (clispfont boldfont) (changefont) (prettycomfont boldfont) (tinyfont littlefont) (font1 defaultfont) (font2 boldfont) (font3 littlefont) (font4 bigfont) (font5 5 (helvetica 10 bir) (helvetica 8 bir) (modern 8 bir)) (font6 6 (helvetica 10 brr) (helvetica 8 brr) (modern 8 brr)) (font7 7 (gacha 12) (gacha 12) (terminal 12)) (font8 8 (cream 10) (cream 10) (modern 10 mir)) (font9 9 (cream 10 brr) (cream 10 brr) (modern 10 bir)) (font10 10 (cream 12) (cream 12) (modern 12 mir)) (font11 11 (timesroman 10) (timesroman 10) (classic 10)) (|\\WindowTitleFont| bigfont) (lafitetitlefont |\\WindowTitleFont|) (chat.font font7)))) (rpaq? \\font-profile-name (quote generic-init)) (declare\: donteval@load donteval@compile (eval-at-greet (fontset \\font-profile-name t) (cl:when (boundp (quote promptfont)) (undosave (bquote (dspfont (\\\, (dspfont promptfont promptwindow)) (\\\, promptwindow)))))) (xcl:reinstall-advice (quote getpromptwindow) :before (quote ((:last (cond ((and (null font) (boundp (quote promptfont))) (setq font promptfont))))))) (readvise getpromptwindow) ) (declare\: eval@loadwhen (not *generic-init-loaded*) donteval@compile docopy (filesload (sysload from lispusers) loadmenuitems) ) (* |;;| "Machine status") (rpaqq who-line-commands ((* |;;;| "Give us a Who-Line") (* |;;| "Load and start the who-line") (declare\: donteval@load donteval@compile (files (sysload from lispusers) who-line) (* |;;| "Define these now, instead of with an INITVARS, because (i) Who-Line might have been in the sysout, and (ii) you can't define the entries untill the Who-Line code is loaded.") (vars (*who-line-anchor* (quote (:justify :top))) (*who-line-display-names?* t) (*who-line-directories* (list |\\UserHomeDirectory|)) (*who-line-entries* (list *who-line-vmem-entry* *who-line-symbol-space-entry* *who-line-package-entry* *who-line-readtable-entry* *who-line-tty-proc-entry* *who-line-tty-state-entry* *who-line-directory-entry* *who-line-time-entry*))) (p (eval-at-greet (install-who-line-options) (cl:when (and (boundp (quote *who-line*)) (windowp *who-line*)) (undosave (bquote (closew (\\\, *who-line*)))))))))) (* |;;;| "Give us a Who-Line") (* |;;| "Load and start the who-line") (declare\: donteval@load donteval@compile (filesload (sysload from lispusers) who-line) (rpaqq *who-line-anchor* (:justify :top)) (rpaqq *who-line-display-names?* t) (rpaq *who-line-directories* (list |\\UserHomeDirectory|)) (rpaq *who-line-entries* (list *who-line-vmem-entry* *who-line-symbol-space-entry* *who-line-package-entry* *who-line-readtable-entry* *who-line-tty-proc-entry* *who-line-tty-state-entry* *who-line-directory-entry* *who-line-time-entry*)) (eval-at-greet (install-who-line-options) (cl:when (and (boundp (quote *who-line*)) (windowp *who-line*)) (undosave (bquote (closew (\\\, *who-line*)))))) ) (rpaqq vstats-init-commands ((* |;;;| "Storage stuff") (initvars (vstats.clock.interval 0) (vstats.mutil.interval nil) (vstats.position (createposition (difference screenwidth 147) 0))) (declare\: donteval@load donteval@compile (loadmenuitems "System-Aids" (((sysload from lispusers) "VStats") (let ((vstats-item (|for| item |in| |BackgroundMenuCommands| |thereis| (string-equal "VStats" (car item))))) (cl:when vstats-item (/dremove vstats-item |BackgroundMenuCommands|)))) (((sysload from lispusers) |Storage|) (showstorage (quote item))))))) (* |;;;| "Storage stuff") (rpaq? vstats.clock.interval 0) (rpaq? vstats.mutil.interval nil) (rpaq? vstats.position (createposition (difference screenwidth 147) 0)) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "System-Aids") (quote ((sysload from lispusers) "VStats")) (quote (let ((vstats-item (|for| item |in| |BackgroundMenuCommands| |thereis| (string-equal "VStats" (car item))))) (cl:when vstats-item (/dremove vstats-item |BackgroundMenuCommands|))))) (|AddLoadMenuItem| (quote "System-Aids") (quote ((sysload from lispusers) |Storage|)) (quote (showstorage (quote item)))) ) (* |;;| "Display control") (rpaqq screen-setup-init-commands ((* |;;;| "Screen layout stuff") (declare\: donteval@load donteval@compile (vars (windowtitleshade grayshade)) (* |;;| "Some interesting background shades") (files (sysload from "{FS8:PARC:XEROX}Lisp>Users>") "BITMAP-GALLERY" "GRANITE") (* |;;| "Rearrange the screen") (initvars (\\rearrange-screen (not (cl:member "ROOMS" *modules* :test (cl:function string-equal))))) (p (eval-at-greet (cl:when \\rearrange-screen (* |;;| "Change the background shade") (|GraniteBG|) (* |;;| "Fix up the prompt window") (undosave (bquote (dsptexture (\\\, (dsptexture 42405 promptwindow)) (\\\, promptwindow)))) (undosave (bquote (dspoperation (\\\, (dspoperation (quote replace) promptwindow)) (\\\, promptwindow)))) (undosave (bquote (windowprop (\\\, promptwindow) border (\\\, (windowprop promptwindow (quote border)))))) (windowprop promptwindow (quote border) 1) (undosave (bquote (windowprop (\\\, promptwindow) title (\\\, (windowprop promptwindow (quote title)))))) (windowprop promptwindow (quote title) nil) (clearw promptwindow) (* |;;| "Rearrange the screen a bit") (cl:when (openwp logow) (undosave (bquote (openw (\\\, logow)))) (closew logow)) (let* ((window-gap 2) (window-width (difference (quotient screenwidth 2) (plus window-gap window-gap)))) (undosave (bquote (shapew (\\\, promptwindow) (\\\, (windowprop promptwindow (quote region)))))) (shapew promptwindow (let ((height (heightifwindow (times 4 (fontprop (dspfont nil promptwindow) (quote height))) (windowprop promptwindow (quote title)) (windowprop promptwindow (quote border))))) (createregion window-gap (difference (|if| (and (boundp (quote *who-line*)) (windowp *who-line*)) |then| (difference screenheight (|fetch| (region height) |of| (windowprop *who-line* (quote region)))) |else| screenheight) (plus window-gap height)) window-width height))) (undosave (bquote (shapew (\\\, |\\TopLevelTtyWindow|) (\\\, (windowprop |\\TopLevelTtyWindow| (quote region)))))) (shapew |\\TopLevelTtyWindow| (let ((height (heightifwindow (times 17 (fontprop (dspfont nil |\\TopLevelTtyWindow|) (quote height))) (windowprop |\\TopLevelTtyWindow| (quote title)) (windowprop |\\TopLevelTtyWindow| (quote border))))) (createregion window-gap (difference (|fetch| (region bottom) |of| (windowprop promptwindow (quote region))) (plus window-gap height)) window-width height))))))) (* |;;| "Make the standard icon functions be cute") (initvars (\\load-grid-icons t) (enforce.icon.grid t)) (p (eval-at-greet (cl:when \\load-grid-icons (filesload (from lispusers) grid-icons)) (cl:when (and \\rearrange-screen (boundp (quote loaded-files-icon-window)) (windowp loaded-files-icon-window)) (movew loaded-files-icon-window 5 100))))))) (* |;;;| "Screen layout stuff") (declare\: donteval@load donteval@compile (rpaq windowtitleshade grayshade) (filesload (sysload from "{FS8:PARC:XEROX}Lisp>Users>") "BITMAP-GALLERY" "GRANITE") (rpaq? \\rearrange-screen (not (cl:member "ROOMS" *modules* :test (cl:function string-equal)))) (eval-at-greet (cl:when \\rearrange-screen (* |;;| "Change the background shade") (|GraniteBG|) (* |;;| "Fix up the prompt window") (undosave (bquote (dsptexture (\\\, (dsptexture 42405 promptwindow)) (\\\, promptwindow)))) (undosave (bquote (dspoperation (\\\, (dspoperation (quote replace) promptwindow)) (\\\, promptwindow)))) (undosave (bquote (windowprop (\\\, promptwindow) border (\\\, (windowprop promptwindow (quote border)))))) (windowprop promptwindow (quote border) 1) (undosave (bquote (windowprop (\\\, promptwindow) title (\\\, (windowprop promptwindow (quote title)))))) (windowprop promptwindow (quote title) nil) (clearw promptwindow) (* |;;| "Rearrange the screen a bit") (cl:when (openwp logow) (undosave (bquote (openw (\\\, logow)))) (closew logow)) (let* ((window-gap 2) (window-width (difference (quotient screenwidth 2) (plus window-gap window-gap)))) (undosave (bquote (shapew (\\\, promptwindow) (\\\, (windowprop promptwindow (quote region)))))) (shapew promptwindow (let ((height (heightifwindow (times 4 (fontprop (dspfont nil promptwindow) (quote height))) (windowprop promptwindow (quote title)) (windowprop promptwindow (quote border))))) (createregion window-gap (difference (|if| (and (boundp (quote *who-line*)) (windowp *who-line*)) |then| (difference screenheight (|fetch| (region height) |of| (windowprop *who-line* (quote region)))) |else| screenheight) (plus window-gap height)) window-width height))) (undosave (bquote (shapew (\\\, |\\TopLevelTtyWindow|) (\\\, (windowprop |\\TopLevelTtyWindow| (quote region)))))) (shapew |\\TopLevelTtyWindow| (let ((height (heightifwindow (times 17 (fontprop (dspfont nil |\\TopLevelTtyWindow|) (quote height))) (windowprop |\\TopLevelTtyWindow| (quote title)) (windowprop |\\TopLevelTtyWindow| (quote border))))) (createregion window-gap (difference (|fetch| (region bottom) |of| (windowprop promptwindow (quote region))) (plus window-gap height)) window-width height)))))) (rpaq? \\load-grid-icons t) (rpaq? enforce.icon.grid t) (eval-at-greet (cl:when \\load-grid-icons (filesload (from lispusers) grid-icons)) (cl:when (and \\rearrange-screen (boundp (quote loaded-files-icon-window)) (windowp loaded-files-icon-window)) (movew loaded-files-icon-window 5 100))) ) (rpaqq rooms-init-commands ((declare\: donteval@load donteval@compile (initvars (user-suite-directories (list (concat |\\UserHomeDirectory| "ROOMS>"))) (roomsdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>" "{Pogo:AISNorth:XEROX}Lyric>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Sources>" "{Pogo:AISNorth:XEROX}Medley>Sources>"))))) (roomsusersdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>Users>" "{Pogo:AISNorth:XEROX}Lyric>Users>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Users>" "{NB:PARC:XEROX}Lyric>Users>" "{Pogo:AISNorth:XEROX}Medley>Users>" "{Pogo:AISNorth:XEROX}Lyric>Users>")))))) (* \; "Force CL:EVAL instead of the default IL:EVAL, since IL:EVAL doesn't understand some things.") (loadmenuitems "Screen-Maintanance" (((sysload from rooms) "ROOMS") (cl:eval (quote (progn (set (cl:intern "*SUITE-DIRECTORIES*" "ROOMS") (append user-suite-directories (cl:eval (cl:intern "*SUITE-DIRECTORIES*" "ROOMS")))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from "{NB:PARC:Xerox}CURRENT>") "CLens-Rooms"))) (cl:dolist (utility (quote ("Rooms-Intro" "Rooms-Notes"))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from rooms) (\\\, utility))))) (cl:dolist (utility (bquote ("Background-Menu-Buttons" "Office.suite" "Touchy-Buttons" "Random-Window-Types" "Snuggle" "Notecards-Window-Types" (\\\,@ (if (not (cl:fboundp (quote lafite))) then nil elseif (not (cl:fboundp (quote \\lafite.getmailfolder))) then (quote ("New-Lafite-Window-Types")) else (quote ("Lafite-Window-Types")))) "Un-Hide-Tty" "Rooms-Videohax" (\\\,@ (if (eq makesysname :lyric) then nil else (quote ("WallPaper"))))))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from roomsusers) (\\\, utility))))))))))))) (declare\: donteval@load donteval@compile (rpaq? user-suite-directories (list (concat |\\UserHomeDirectory| "ROOMS>"))) (rpaq? roomsdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>" "{Pogo:AISNorth:XEROX}Lyric>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Sources>" "{Pogo:AISNorth:XEROX}Medley>Sources>"))))) (rpaq? roomsusersdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>Users>" "{Pogo:AISNorth:XEROX}Lyric>Users>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Users>" "{NB:PARC:XEROX}Lyric>Users>" "{Pogo:AISNorth:XEROX}Medley>Users>" "{Pogo:AISNorth:XEROX}Lyric>Users>"))))) (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from rooms) "ROOMS")) (quote (cl:eval (quote (progn (set (cl:intern "*SUITE-DIRECTORIES*" "ROOMS") (append user-suite-directories (cl:eval (cl:intern "*SUITE-DIRECTORIES*" "ROOMS")))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from "{NB:PARC:Xerox}CURRENT>") "CLens-Rooms"))) (cl:dolist (utility (quote ("Rooms-Intro" "Rooms-Notes"))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from rooms) (\\\, utility))))) (cl:dolist (utility (bquote ("Background-Menu-Buttons" "Office.suite" "Touchy-Buttons" "Random-Window-Types" "Snuggle" "Notecards-Window-Types" (\\\,@ (if (not (cl:fboundp (quote lafite))) then nil elseif (not (cl:fboundp (quote \\lafite.getmailfolder))) then (quote ("New-Lafite-Window-Types")) else (quote ("Lafite-Window-Types")))) "Un-Hide-Tty" "Rooms-Videohax" (\\\,@ (if (eq makesysname :lyric) then nil else (quote ("WallPaper"))))))) (|AddLoadMenuItem| "Rooms" (bquote ((sysload from roomsusers) (\\\, utility)))))))))) ) (rpaqq change-background-init-commands ((* |;;;| "Make it easy to change your background") (declare\: donteval@load donteval@compile (loadmenuitems nil (((sysload from lispusers) "BackgroundImages" "StarBG" (nil from "{PHYLUM}Faces>") "Dead") (|push| |BackgroundMenuCommands| (let ((bitmaps (quote (("Standard texture" . windowbackgroundshade) ("Gray shade" . grayshade) ("Light wall paper" . lightwallpaper) ("Medium wall paper" . wallpaper) ("Dark wall paper" . darkwallpaper) ("Waves" . wave-texture) ("Tweed" . xcl-user::*tweed-bm*) ("Chambray" . xcl-user::*chambray-bm*) ("Canvas" . xcl-user::*canvas-bm*) ("Corduroy" . xcl-user::*corduroy-bm*) ("Seersucker" . xcl-user::*seersucker-bm*) ("Burlap" . xcl-user::*burlap-bm*) ("Mesh" . mesh-texture)))) (images (background.files)) (menu-items (quote (("Stars" (quote (starbg)) "Fill the background with stars" (subitems ("ET go home" (quote (|SaucerOff|)) "Get rid of the saucer"))) ("Granite" (quote (|GraniteBG|)) "Fill the background with a pleasing, almost random shade") ("Dead" (changebackground (expandbitmap dead-bm 2 2)) "Put a Deadhead on the background"))))) (bquote ("Change background" (quote (changebackground)) "Change the background to the default texture" (subitems ("Random texture" (quote (let ((shade (|\\Pick-One-At-Random| (quote ((\\\,@ (|for| bm |in| bitmaps |collect| (|if| (cl:symbolp bm) |then| bm |else| (cdr bm)))) (\\\,@ (|for| item |in| menu-items |collect| (car item))) (\\\,@ images) "Rand"))))) (cond ((for item in menu-items thereis (and (cl:consp item) (stringp (car item)) (string-equal shade (car item))) finally (if $$val then (eval (cadr item))))) ((equal shade "Rand") (changebackground (rand 0 blackshade))) ((listp shade) (background.fetch (car shade) (cdr shade))) ((litatom shade) (changebackground (evalv shade))) (t (changebackground shade))))) "Change the background texture to a randomly selected shade") (\\\,@ (|for| bm |in| bitmaps |collect| (|if| (cl:symbolp bm) |then| (bquote ((\\\, bm) (changebackground (\\\, bm)))) |else| (bquote ((\\\, (car bm)) (changebackground (\\\, (cdr bm)))))))) (\\\,@ menu-items) (\\\,@ (|for| image |in| images |collect| (bquote ((\\\, (car image)) (quote (background.fetch (quote (\\\, (car image))) (quote (\\\, (cdr image))))))))))))))))))) (* |;;;| "Make it easy to change your background") (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "BackgroundImages" "StarBG" (nil from "{PHYLUM}Faces>") "Dead")) (quote (|push| |BackgroundMenuCommands| (let ((bitmaps (quote (("Standard texture" . windowbackgroundshade) ("Gray shade" . grayshade) ("Light wall paper" . lightwallpaper) ("Medium wall paper" . wallpaper) ("Dark wall paper" . darkwallpaper) ("Waves" . wave-texture) ("Tweed" . xcl-user::*tweed-bm*) ("Chambray" . xcl-user::*chambray-bm*) ("Canvas" . xcl-user::*canvas-bm*) ("Corduroy" . xcl-user::*corduroy-bm*) ("Seersucker" . xcl-user::*seersucker-bm*) ("Burlap" . xcl-user::*burlap-bm*) ("Mesh" . mesh-texture)))) (images (background.files)) (menu-items (quote (("Stars" (quote (starbg)) "Fill the background with stars" (subitems ("ET go home" (quote (|SaucerOff|)) "Get rid of the saucer"))) ("Granite" (quote (|GraniteBG|)) "Fill the background with a pleasing, almost random shade") ("Dead" (changebackground (expandbitmap dead-bm 2 2)) "Put a Deadhead on the background"))))) (bquote ("Change background" (quote (changebackground)) "Change the background to the default texture" (subitems ("Random texture" (quote (let ((shade (|\\Pick-One-At-Random| (quote ((\\\,@ (|for| bm |in| bitmaps |collect| (|if| (cl:symbolp bm) |then| bm |else| (cdr bm)))) (\\\,@ (|for| item |in| menu-items |collect| (car item))) (\\\,@ images) "Rand"))))) (cond ((for item in menu-items thereis (and (cl:consp item) (stringp (car item)) (string-equal shade (car item))) finally (if $$val then (eval (cadr item))))) ((equal shade "Rand") (changebackground (rand 0 blackshade))) ((listp shade) (background.fetch (car shade) (cdr shade))) ((litatom shade) (changebackground (evalv shade))) (t (changebackground shade))))) "Change the background texture to a randomly selected shade") (\\\,@ (|for| bm |in| bitmaps |collect| (|if| (cl:symbolp bm) |then| (bquote ((\\\, bm) (changebackground (\\\, bm)))) |else| (bquote ((\\\, (car bm)) (changebackground (\\\, (cdr bm)))))))) (\\\,@ menu-items) (\\\,@ (|for| image |in| images |collect| (bquote ((\\\, (car image)) (quote (background.fetch (quote (\\\, (car image))) (quote (\\\, (cdr image)))))))))))))))) ) (rpaqq display-control-init-commands ((declare\: donteval@load donteval@compile (loadmenuitems "Screen-Maintanance" (((sysload from lispusers) "WDWHacks")) (((sysload from lispusers) "Turbo-Windows")) (((sysload from lispusers) "Solid-Movew")) (((sysload from lispusers) "NSDisplaySizes")) (((sysload from lispusers) "SNAPW-ICON")))))) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from lispusers) "WDWHacks"))) (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from lispusers) "Turbo-Windows"))) (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from lispusers) "Solid-Movew"))) (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from lispusers) "NSDisplaySizes"))) (|AddLoadMenuItem| (quote "Screen-Maintanance") (quote ((sysload from lispusers) "SNAPW-ICON"))) ) (rpaqq idle-init-commands ((* |;;;| "The Idle package") (declare\: donteval@load donteval@compile (loadmenuitems "IdlePatterns" (((sysload from lispusers) "IdleHax")) (((sysload from lispusers) "IdleDrain") (/listput idle.profile (quote displayfn) (quote idle-drain))) (((sysload from lispusers) "ReadBrush")) (((sysload from "{PHYLUM}Andes>Users>") "Bouncing-Face")) (((sysload from lispusers) "StarBG") (/listput idle.profile (quote displayfn) (quote |Cosmos|))) (((sysload from lispusers) "Pac-Man-Idle") (/listput idle.profile (quote displayfn) (quote |Pac-Man-Idle|))) (((sysload from "{QV}Lisp>") "Idle-Cost")) (((sysload) "ScreenPaper") (/listput idle.profile (quote displayfn) (quote screenpaper))) (((sysload from private-lispusers) "Idle-Lyrics") (/listput idle.profile (quote displayfn) (quote xcl-user::idle-lyrics)))) (p (eval-at-greet (/listput idle.profile (quote forget) nil) (/listput idle.profile (quote allowed.logins) nil)))))) (* |;;;| "The Idle package") (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from lispusers) "IdleHax"))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from lispusers) "IdleDrain")) (quote (/listput idle.profile (quote displayfn) (quote idle-drain)))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from lispusers) "ReadBrush"))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from "{PHYLUM}Andes>Users>") "Bouncing-Face"))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from lispusers) "StarBG")) (quote (/listput idle.profile (quote displayfn) (quote |Cosmos|)))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from lispusers) "Pac-Man-Idle")) (quote (/listput idle.profile (quote displayfn) (quote |Pac-Man-Idle|)))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from "{QV}Lisp>") "Idle-Cost"))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload) "ScreenPaper")) (quote (/listput idle.profile (quote displayfn) (quote screenpaper)))) (|AddLoadMenuItem| (quote "IdlePatterns") (quote ((sysload from private-lispusers) "Idle-Lyrics")) (quote (/listput idle.profile (quote displayfn) (quote xcl-user::idle-lyrics)))) (eval-at-greet (/listput idle.profile (quote forget) nil) (/listput idle.profile (quote allowed.logins) nil)) ) (rpaqq clock-init-commands ((* |;;;| "Telling the time") (* |;;| "Standard clock is the Biclock, in the lower-left corner") (initvars (biclockinitialprops (quote (horizontal left vertical bottom size 95)))) (* |;;| "Optional clock is CROCK, also in the lower-left corner") (declare\: donteval@load donteval@compile (files (sysload noerror from lispusers) biclock) (loadmenuitems nil (((sysload from lispusers) "Crock") (cl:when (and (boundp (quote biclockwindow)) (windowp biclockwindow)) (closew biclockwindow))))))) (* |;;;| "Telling the time") (* |;;| "Standard clock is the Biclock, in the lower-left corner") (rpaq? biclockinitialprops (quote (horizontal left vertical bottom size 95))) (* |;;| "Optional clock is CROCK, also in the lower-left corner") (declare\: donteval@load donteval@compile (filesload (sysload noerror from lispusers) biclock) (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "Crock")) (quote (cl:when (and (boundp (quote biclockwindow)) (windowp biclockwindow)) (closew biclockwindow)))) ) (* |;;| "Programming stuff") (rpaqq programming-init-commands ((* |;;;| "Editing code") (functions notice) (* |;;| "Saving files") (functions make) (* |;;| "For testing optimizers") (functions oam) (* |;;| "Handy exec commands") (commands "BREAK" "UNBREAK" "CALLS" "DESCRIBE" "EC" "EFF" "FILES?" "IC" "NOTICE" "MAKE" "SPY") (* |;;| "never really worked - (loadmenuitems \"ProgrammingAids\" (((sysload from lispusers) \"Step-Command-Menu\")))") (* |;;| "") (* |;;| "SEDIT stuff") (declare\: donteval@load donteval@compile (p (eval-at-greet (* |;;| "Give us a META key if running on a Dorado") (selectq (machinetype) (dorado (metashift t)) nil) (* |;;| "Reset SEdit so it gets the correct fonts") (case makesysname (:lyric (sedit.reset)) (cl:otherwise (cl:funcall (cl:intern "RESET" (cl:find-package "SEDIT"))))) (* |;;| "Hacking SEdit so it uses better package/readtable defaults") (case makesysname (:lyric (filesload (sysload noerror from valueof (append private-lispusersdirectories lispusersdirectories)) "SEDIT-HACK")) (cl:otherwise (filesload (sysload from lispusers) "sedit-profile"))))) (* |;;| "Change the SEdit EXPAND behavior to expand definers in a reasonable way") (loadmenuitems "ProgrammingAids" (((sysload from valueof (append private-lispusersdirectories lispusersdirectories)) "SEdit-Definers"))) (* |;;| "The Eval&Insert hook") (loadmenuitems "ProgrammingAids" (((sysload from valueof (append private-lispusersdirectories lispusersdirectories)) "SEdit-Eval"))) (* |;;| "Exit/Compile hooks") (p (case makesysname (:lyric (|AddLoadMenuItem| "ProgrammingAids" (quote ((sysload from lispusers) "SEdit-Compile")))))) (* |;;| "TTY editor stuff") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "CL-TTYEdit")))) (declare\: donteval@load donteval@compile (* |;;| "Better WHEREIS facility") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "New-Where-Is"))) (* |;;| "Checking out lexical contexts in a break") (p (case makesysname (:lyric (|AddLoadMenuItem| "ProgrammingAids" (quote ((sysload from lispusers) "Debugger-Context")))))) (* |;;| "Save-Your-Ass") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "Checkpoint"))) (* |;;| "Spy button") (initvars (\spy.button.pos nil)) (loadmenuitems "ProgrammingAids" (((sysload from lispusers) spy) (spy.button \spy.button.pos))) (* |;;| "Graph calls") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "GraphCalls"))) (* |;;| "The Source Manager") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "Manager"))) (* |;;| "Better file listing tools") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "PP-Code-File")) (((sysload from lispusers) "PrettyFileIndex"))) (* |;;| "TEdit executive") (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "TExec"))) (* |;;| "Iteration packages") (loadmenuitems "ProgrammingAids" (((sysload from "{Phylum}rcw>") "OSS")))) (declare\: donteval@load donteval@compile (* |;;| "Moving between Xerox Lisp and the rest of the world") (p (|AddLoadMenuItem| "ProgrammingAids" (case makesysname (:lyric (quote ((sysload from lispusers) "Port-CLFile"))) (cl:otherwise (quote ((sysload from lispusers) "XCL-Bridge"))))))))) (* |;;;| "Editing code") (cl:defun notice (&rest files) "Notice a set of files, so things on them can be edited" (* |;;;| "Return 4 values: a list of all files that were noticed, a list of files that were already noticed, a list of files that weren't noticed because they weren't loaded, and a list of files that couldn't be found.") (cl:labels ((canonocal-filemanager-name (path) "Return the canonical FileManager name of a file" (cl:intern (cl:string-upcase (cl:pathname-name path)) (cl:find-package "IL"))) (find-source-file (file-name &optional (search-path-list directories)) "Return the full pathname of the source file" (or (* \; "In case we are given enough to find the file") (cl:probe-file file-name) (* \; "Check for the original source, in it's original location") (let ((original-source-file-name (cdr (cl:first (get (canonocal-filemanager-name (pathname file-name)) (quote filedates)))))) (cl:if original-source-file-name (cl:probe-file original-source-file-name) nil)) (* \; "As a last resort, check the list of directories") (cl:find-if (cl:function cl:probe-file) (cl:mapcar (cl:function (cl:lambda (dir) (cl:merge-pathnames file-name dir))) search-path-list)))) (file-noticed-p (path) "Has the file been noticed?" (cl:member (canonocal-filemanager-name path) filelst :test (quote eq))) (file-loaded-p (path) "Has the file been loaded?" (not (null (get (canonocal-filemanager-name path) (quote filedates))))) (notice-file (path) "Notice the file" (load path (quote prop)))) (let ((alread-noticed-files nil) (not-loaded-files nil) (noticed-files nil) (not-found-files nil)) (cl:mapc (cl:function (cl:lambda (file) (let ((pathname (find-source-file file))) (cond ((null pathname) (cl:push file not-found-files)) ((file-noticed-p pathname) (cl:push pathname alread-noticed-files)) ((file-loaded-p pathname) (loadfrom pathname nil (quote prop)) (cl:push pathname noticed-files)) (t (cl:push pathname not-loaded-files)))))) files) (cl:values noticed-files alread-noticed-files not-loaded-files not-found-files)))) (* |;;| "Saving files") (cl:defun make (files) (let ((files (or files (cl:remove-if-not (cl:function (cl:lambda (file-name) (cdr (get file-name (quote file))))) filelst))) (original-dir *default-pathname-defaults*) file-dir roopt-file) (cl:unwind-protect (cl:dolist (file files) (cl:setq roopt-file (cl:pathname-name file)) (cl:setq roopt-file (cl:typecase roopt-file (string (cl:intern (cl:string-upcase roopt-file) (cl:find-package "IL"))) (cl:symbol (cl:intern (cl:symbol-name roopt-file) (cl:find-package "IL"))))) (cndir (cl:if (get roopt-file (quote filedates)) (let ((file-dir (unpackfilename.string (cdr (cl:first (get roopt-file (quote filedates))))))) (packfilename.string (quote host) (cl:getf file-dir (quote host)) (quote device) (cl:getf file-dir (quote device)) (quote directory) (cl:getf file-dir (quote directory)))) original-dir)) (cl:when (cl:funcall (quote cleanup) roopt-file) (cl:load (packfilename.string (quote name) roopt-file (quote extension) "dfasl")))) (cndir original-dir)))) (* |;;| "For testing optimizers") (cl:defun oam (form) "Optimize and Macroexpand the form. For use as an SEdit mutator." (compiler:optimize-and-macroexpand-1 form (compiler:make-empty-env) (compiler:make-context))) (* |;;| "Handy exec commands") (defcommand "BREAK" (&rest fns) "Set a breakpoint on the named functions." (eval (bquote (break (\\\,@ fns))))) (defcommand "UNBREAK" (&rest fns) "Remove a breakpoint from the named functions." (eval (bquote (unbreak (\\\,@ fns))))) (defcommand "CALLS" (fn) "Print out information about what the function calls." (cond ((not (cl:fboundp fn)) (cl:format t "~%~S has no function definition" fn)) ((cl:macro-function fn) (cl:format t "~%~S is a macro" fn)) ((cl:special-form-p fn) (cl:format t "~%~S is a special-form" fn)) (t (destructuring-bind (calls binds uses-free uses-global) (calls fn) (cl:format t "~%--- ~S ---" fn) (let ((format-string "~%~A:~{ ~S~}")) (cl:when (not (null calls)) (cl:format t format-string "CALLS" calls)) (cl:when (not (null binds)) (cl:format t format-string "BINDS" binds)) (cl:when (not (null uses-free)) (cl:format t format-string "SPECIALS USED" uses-free)) (cl:when (not (null uses-global)) (cl:format t format-string "GLOBALS USED" uses-global)))))) (cl:values)) (defcommand "DESCRIBE" (&rest objects) "Describe the named objects." (cl:mapc (cl:function (cl:lambda (x) (cl:format t "~&-- ~A --" x) (cl:describe x))) objects) (cl:values)) (defcommand "EC" (form) "Evaluate a compiled version of the form" (cl:funcall (prog2 (cl:format t "~%Compiling...") (cl:compile nil (bquote (cl:lambda nil (\\\, form)))) (cl:format t "done.~%")))) (defcommand "EFF" (&rest patterns-commands) "Edit any uses of any of the patterns on any noticed file. Args are ..patterns - ..edit comands." (let* ((position (cl:position "-" patterns-commands :key (cl:function (lambda (pattern) (if (cl:symbolp pattern) then (cl:symbol-name pattern) else ""))) :test (cl:function string-equal))) (patterns (if (null position) then patterns-commands else (cl:butlast patterns-commands (- (length patterns-commands) position)))) (edit-commands (if position then (cl:subseq patterns-commands (1+ position)) else nil))) (case (cl:length patterns) (0 nil) (1 (editfromfile nil nil (cl:first patterns) edit-commands)) (cl:otherwise (editfromfile nil nil (bquote (*any* (\\\,@ patterns))) edit-commands)))) (cl:values)) (defcommand "FILES?" nil "Tell you about what source files need to be dumped." (files?) (cl:values)) (defcommand "IC" (fn) "Inspect the code for the function." (inspectcode (if (cl:symbolp fn) then (if (ccodep (getd fn)) then fn else (cl:compile nil (getd fn))) else (cl:compile nil (if (cl:member (car fn) (quote (cl:lambda lambda)) :test (cl:function eq)) then fn else (bquote (cl:lambda nil (\\\, fn))))))) (cl:values)) (defcommand "NOTICE" (&rest files) "Notice a set of files, so things on them can be edited" (cl:flet ((tell-user (files msg) (cl:when files (cl:format t "~%~A" msg) (cl:mapcar (cl:function (cl:lambda (path) (cl:format t "~%~5T~A" (cl:pathname-name path)))) files)))) (cl:multiple-value-bind (just-noticed previously-noticed not-loaded not-found) (cl:apply (cl:function notice) files) (tell-user just-noticed "Noticed files") (tell-user previously-noticed "Previously noticed files") (tell-user not-loaded "Not loaded, so not noticed files") (tell-user not-found "Could not find files")) (cl:values))) (defcommand "MAKE" (&rest files) "Save, recompile, and reload the files." (make files) (cl:values)) (defcommand "SPY" (form) (cl:unwind-protect (progn (spy.start) (prog1 (cl:eval form) (spy.end))) (spy.end) (spy.tree))) (* |;;| "never really worked - (loadmenuitems \"ProgrammingAids\" (((sysload from lispusers) \"Step-Command-Menu\")))" ) (* |;;| "") (* |;;| "SEDIT stuff") (declare\: donteval@load donteval@compile (eval-at-greet (* |;;| "Give us a META key if running on a Dorado") (selectq (machinetype) (dorado (metashift t)) nil) (* |;;| "Reset SEdit so it gets the correct fonts") (case makesysname (:lyric (sedit.reset)) (cl:otherwise (cl:funcall (cl:intern "RESET" (cl:find-package "SEDIT"))))) (* |;;| "Hacking SEdit so it uses better package/readtable defaults") (case makesysname (:lyric (filesload (sysload noerror from valueof (append private-lispusersdirectories lispusersdirectories)) "SEDIT-HACK")) (cl:otherwise (filesload (sysload from lispusers) "sedit-profile")))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from valueof (append private-lispusersdirectories lispusersdirectories)) "SEdit-Definers"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from valueof (append private-lispusersdirectories lispusersdirectories)) "SEdit-Eval"))) (case makesysname (:lyric (|AddLoadMenuItem| "ProgrammingAids" (quote ((sysload from lispusers) "SEdit-Compile"))))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "CL-TTYEdit"))) ) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "New-Where-Is"))) (case makesysname (:lyric (|AddLoadMenuItem| "ProgrammingAids" (quote ((sysload from lispusers) "Debugger-Context"))))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "Checkpoint"))) (rpaq? \spy.button.pos nil) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) spy)) (quote (spy.button \spy.button.pos))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "GraphCalls"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "Manager"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "PP-Code-File"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "PrettyFileIndex"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "TExec"))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from "{Phylum}rcw>") "OSS"))) ) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| "ProgrammingAids" (case makesysname (:lyric (quote ((sysload from lispusers) "Port-CLFile"))) (cl:otherwise (quote ((sysload from lispusers) "XCL-Bridge"))))) ) (rpaqq old-utils-commands ((* |;;| "Used to be in the seperate file UTILS.") (* |;;| "Making sure that breaks happen") (fns |DebugMode|) (* |;;| "Used to be in Loops") (fns selectw) (functions de file) (usermacros de ee fv) (* |;;| "Print out a doc file") (fns |PrintDocFile|) (* |;;| "Just what is says") (fns |\\Pick-One-At-Random|) (functions |PickOneAtRandom|) (* |;;| "Ways to quit a sysout") (fns |GoodNight| |NewLisp|) (* |;;| "Make the KEY3.CM file on the top partition put you back in you last used partition, and the KEY2.CM restart the vmem, assuming that KEY1.CM starts a fresh sysout") (fns |RememberLastPartition| |RememberLispState|) (declare\: donteval@load donteval@compile (addvars (beforelogoutforms (|RememberLispState|) (|RememberLastPartition|)))))) (* |;;| "Used to be in the seperate file UTILS.") (* |;;| "Making sure that breaks happen") (defineq (|DebugMode| (lambda (debug-on-p all-execs-p) (* \; "Edited 25-Jan-88 08:19 by smL") (|if| debug-on-p |then| (setq nlsetqgag nil) (setq helpflag break!) (|if| all-execs-p |then| (putassoc 'helpflag (list 'break!) *per-exec-variables*)) |else| (setq nlsetqgag t) (setq helpflag t) (|if| all-execs-p |then| (putassoc 'helpflag (list t) *per-exec-variables*))))) ) (* |;;| "Used to be in Loops") (defineq (selectw (lambda nil (* \; "Edited 15-Jan-88 09:17 by smL") (* |;;;| "Let the user select a window") (|first| (clrprompt) (|printout| promptwindow "Move mouse to desired window." t "Then press down the CTRL key or click mouse") |until| (or (keydownp 'ctrl) (not (mousestate up))) |do| nil |finally| (getmousestate) (clrprompt) (return (whichw))))) ) (defmacro de (|fn-name| |arg-list| &rest |body|) (* |;;;| "Shorthand for defineing functions") (bquote (defineq ((\\\, |fn-name|) (\\\, |arg-list|) (\\\,@ |body|))))) (defmacro file (|file-name| &rest |file-package-commands|) (* |;;;| "Allows one to create a file giving the commands explicitly e.g. - (FILE FOO (VARS * FUMVARS) (FNS * FNSLIST)) - will create FOOCOMS and make file FOO") (let ((|real-file-name| (u-case |file-name|))) (bquote (progn (\\\, (|if| (null |file-package-commands|) |then| nil |elseif| (and (litatom (car |file-package-commands|)) (null (cdr |file-package-commands|))) |then| (bquote (/setatomval (filecoms (quote (\\\, |real-file-name|))) (getatomval (quote (\\\, (car |file-package-commands|)))))) |else| (bquote (/setatomval (filecoms (quote (\\\, |real-file-name|))) (quote (\\\, |file-package-commands|)))))) (resetform (radix 10) (makefile (quote (\\\, |real-file-name|)))))))) (addtovar usermacros (fv nil (e (freevars (\## (orr (up 1) nil)) t))) (ee nil (e (cursor t) t) (e (windowprop ttyineditwindow (quote title) (concat "TtyInEdit of " type " " atm)) t) (coms (tted do.ee ee))) (ee (dummy) (e (cursor t) t) (e (windowprop ttyineditwindow (quote title) (concat "TtyInEdit of " type " " atm)) t) (coms (tted do.ee ee))) (de nil (comsq (bi 1 -1) (e (dedite (\## 1)) t) (bo 1)))) (addtovar editcomsa de ee) (addtovar editcomsl ee) (* |;;| "Print out a doc file") (defineq (|PrintDocFile| (lambda (utility-name print-server) (* \; "Edited 17-Mar-88 16:24 by smL") (* |;;;| "Print out the documentation file for the named package") (setq print-server (or print-server (car defaultprintinghost))) (cl:flet ((find-doc-source-file nil (or (findfile (packfilename 'name utility-name 'extension 'tedit) nil directories) (findfile (packfilename 'name utility-name 'extension 'ted) nil directories) (findfile (packfilename 'name utility-name 'extension 'txt) nil directories) (findfile (packfilename 'name utility-name 'extension 'doc) nil directories)))) (|if| (eq print-server t) |then| (let ((doc-file (find-doc-source-file))) (|if| doc-file |then| (tedit doc-file) |else| "No doc file found")) |elseif| print-server |then| (let ((doc-file (or (findfile (packfilename 'name utility-name 'extension (selectq (printertype print-server) ((press fullpress) 'press) (interpress 'ip) (help "Unknown printer type!"))) nil directories) (find-doc-source-file)))) (|if| doc-file |then| (add.process `(empress ',doc-file nil ',print-server)) (concat "Printing file " doc-file " on printer " print-server) |else| "No doc file found")) |else| "No printer specified")))) ) (* |;;| "Just what is says") (defineq (|\\Pick-One-At-Random| (lambda (|list|) (* \; "Edited 15-Jan-88 09:20 by smL") (* |;;;| "Return a random element of the list") (resetlst (resetsave (randset t) `(randset ,(randset))) (car (nth |list| (rand 1 (length |list|))))))) ) (defmacro |PickOneAtRandom| (&rest |elements|) (bquote (|\\Pick-One-At-Random| (quote (\\\, (mapcar |elements| (quote eval))))))) (* |;;| "Ways to quit a sysout") (defineq (|GoodNight| (lambda (|flag| |altoCommandString|) (* |smL| "20-Sep-85 14:43") (let ((|stream| (openstream '{dsk}rem.cm\;1 'output 'old/new))) (prin1 (or |altoCommandString| "Q") |stream|) (terpri |stream|) (closef |stream|)) (logout |flag|))) (|NewLisp| (lambda nil (* \; "Edited 15-Jan-88 09:20 by smL") (* |;;;| "Start up a new system, assuming that {DSK}KEY1.CM starts one up.") (|if| (mouseconfirm "Do you really want to start up a new system?") |then| (|GoodNight| t "@KEY1.CM")))) ) (* |;;| "Make the KEY3.CM file on the top partition put you back in you last used partition, and the KEY2.CM restart the vmem, assuming that KEY1.CM starts a fresh sysout" ) (defineq (|RememberLastPartition| (lambda nil (* \; "Edited 15-Jan-88 09:21 by smL") (* |;;;| "Sets up the KEY3 CM file in the last partition (19 or 5) to put you back in this partition.") (selectq (machinetype) (dorado (|for| |partitionNumber| |in| '(19 5) |bind| |stream| |key3File| |eachtime| (setq |key3File| (concat "{DSK" |partitionNumber| "}KEY3.CM;1")) (setq |stream| (car (nlsetq (getstream |key3File|)))) (and |stream| (closef? |stream|)) (setq |stream| (car (nlsetq (openstream |key3File| 'output 'old/new)))) |thereis| (streamp |stream|) |finally| (|if| (and (streamp |stream|) (openp |stream|)) |then| (|printout| |stream| "// " "This will set you back in your last used partition, " firstname t "// [last used " (date) "]" t "Par " (diskpartition) t) (closef |stream|)))) nil))) (|RememberLispState| (lambda nil (* \; "Edited 15-Jan-88 09:21 by smL") (* |;;;| "Make KEY2.CM restart this lisp if the logout was not FAST...") (nlsetq (|if| (and (stkpos 'logout) (eq (machinetype) 'dorado)) |then| (|if| (nlsetq (getstream '{dsk}key2.cm\;1)) |then| (closef? (getstream '{dsk}key2.cm\;1))) (resetlst (let ((logout-arg (stkarg 1 'logout)) (stream (openstream '{dsk}key2.cm\;1 'output 'old/new))) (resetsave nil (list (function closef?) stream)) (|printout| stream "// You did a (LOGOUT") (selectq logout-arg (nil nil) (|printout| stream " " logout-arg)) (|printout| stream ") last time [" (date) "], so this will ") (selectq logout-arg ((nil ?) (|printout| stream "restart your old")) (|printout| stream "start a new")) (|printout| stream " LISP, " firstname t) (selectq logout-arg ((nil ?) (|printout| stream "Lisp") (|if| (eqp (realmemorysize) 21845) |then| (|printout| stream " 52525/c"))) (|printout| stream "@KEY1.CM")) (|printout| stream t))))))) ) (declare\: donteval@load donteval@compile (addtovar beforelogoutforms (|RememberLispState|) (|RememberLastPartition|)) ) (rpaqq wizard-init-commands ((* |;;;| "Some tools for wizards, or people who occasionally think they are.") (* |;;| "Find out what other symbols were interned at about the same time as a given symbol. Useful to find out what file defined a symbol.") (functions atom-neighbors))) (* |;;;| "Some tools for wizards, or people who occasionally think they are.") (* |;;| "Find out what other symbols were interned at about the same time as a given symbol. Useful to find out what file defined a symbol." ) (cl:defun atom-neighbors (cl:symbol &optional (xcl-user::number-of-neighbors 8)) (cl:if (cl:symbolp cl:symbol) (let ((xcl-user::atom-number (\\loloc cl:symbol)) (xcl-user::neighbors (list cl:symbol))) (cl:dotimes (xcl-user::i xcl-user::number-of-neighbors) (cl:push (\\vag2 0 (+ xcl-user::atom-number 1 xcl-user::i)) xcl-user::neighbors)) (cl:setf xcl-user::neighbors (cl:nreverse xcl-user::neighbors)) (cl:dotimes (xcl-user::i xcl-user::number-of-neighbors) (cl:push (\\vag2 0 (- xcl-user::atom-number 1 xcl-user::i)) xcl-user::neighbors)) xcl-user::neighbors) "Not a symbol")) (rpaqq dinfo-init-commands ((* |;;| "Set up the on-line documentation") (declare\: donteval@load donteval@compile (vars (irm.host&dir (cond ((infilep "{DSK}HELPSYS>IRMTOP.TEDIT") "{DSK}HELPSYS>") ((and (boundp (quote irm.host&dir)) irm.host&dir) irm.host&dir) (t "{Pallas:AISNorth:XEROX}Lyric>LispUsers>IRM>"))) (dinfomodes (quote (graph)))) (initvars (irm.font (fontcreate (quote (helvetica 10)))) (irmwindowregion (let ((width (widthifwindow (cl:* 60 (stringwidth "w" irm.font))))) (createregion (- screenwidth width 5) 5 width (quotient screenheight 2))))) (loadmenuitems "ProgrammingAids" (((sysload from lispusers) "DInfo" "Helpsys") (dinfo (irm.get.dinfograph t) irmwindowregion)) (((sysload from lispusers) "LispNerd")))))) (* |;;| "Set up the on-line documentation") (declare\: donteval@load donteval@compile (rpaq irm.host&dir (cond ((infilep "{DSK}HELPSYS>IRMTOP.TEDIT") "{DSK}HELPSYS>") ((and (boundp (quote irm.host&dir)) irm.host&dir) irm.host&dir) (t "{Pallas:AISNorth:XEROX}Lyric>LispUsers>IRM>"))) (rpaqq dinfomodes (graph)) (rpaq? irm.font (fontcreate (quote (helvetica 10)))) (rpaq? irmwindowregion (let ((width (widthifwindow (cl:* 60 (stringwidth "w" irm.font))))) (createregion (- screenwidth width 5) 5 width (quotient screenheight 2)))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "DInfo" "Helpsys")) (quote (dinfo (irm.get.dinfograph t) irmwindowregion))) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((sysload from lispusers) "LispNerd"))) ) (rpaqq pcl-init-commands ((* |;;| "PCL fun and games") (initvars (pcldirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}LYRIC>" "{PHYLUM}LYRIC>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{pooh/n}pcl>medley>" "{NB:PARC:XEROX}MEDLEY>" "{PHYLUM}MEDLEY>")))))) (declare\: donteval@load donteval@compile (p (eval-at-greet (cl:unless (cl:find-package "PCL") (|AddLoadMenuItem| "Subsystems" (quote ((from pcl) "Load-PCL")) (quote (cl:when (eq makesysname :lyric) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((from pcl) "Clos-Browser")))))))))))) (* |;;| "PCL fun and games") (rpaq? pcldirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}LYRIC>" "{PHYLUM}LYRIC>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{pooh/n}pcl>medley>" "{NB:PARC:XEROX}MEDLEY>" "{PHYLUM}MEDLEY>"))))) (declare\: donteval@load donteval@compile (eval-at-greet (cl:unless (cl:find-package "PCL") (|AddLoadMenuItem| "Subsystems" (quote ((from pcl) "Load-PCL")) (quote (cl:when (eq makesysname :lyric) (|AddLoadMenuItem| (quote "ProgrammingAids") (quote ((from pcl) "Clos-Browser")))))))) ) (rpaqq loops-init-commands ((* |;;;| "Loops initialization") (initvars (loopsdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>Sources>" "{PHYLUM}Lyric>Sources>" "{POGO:AISNorth:XEROX}SYSTEM>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Sources>" "{PHYLUM}Medley>Sources>" "{POGO:AISNorth:XEROX}SYSTEM>"))))) (\\loops-init-form (quote (progn (filesload (from "{EG:PARC:XEROX}Loops>") initloops))))) (declare\: donteval@load donteval@compile (p (eval-at-greet (cond ((cl:member "LOOPS" *features* :test (cl:function string-equal)) (eval \\loops-init-form)) (t (|AddLoadMenuItem| "Subsystems" (quote ((from loops) "Loops")) \\loops-init-form)))))))) (* |;;;| "Loops initialization") (rpaq? loopsdirectories (case makesysname (:lyric (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Lyric>Sources>" "{PHYLUM}Lyric>Sources>" "{POGO:AISNorth:XEROX}SYSTEM>"))) (cl:otherwise (bquote ((\\\,@ *cache-directories*) "{NB:PARC:XEROX}Medley>Sources>" "{PHYLUM}Medley>Sources>" "{POGO:AISNorth:XEROX}SYSTEM>"))))) (rpaq? \\loops-init-form (quote (progn (filesload (from "{EG:PARC:XEROX}Loops>") initloops)))) (declare\: donteval@load donteval@compile (eval-at-greet (cond ((cl:member "LOOPS" *features* :test (cl:function string-equal)) (eval \\loops-init-form)) (t (|AddLoadMenuItem| "Subsystems" (quote ((from loops) "Loops")) \\loops-init-form)))) ) (* |;;| "Documentation") (rpaqq tedit-init-commands ((* |;;;| "TEDIT stuff") (functions load-nova-fonts) (declare\: donteval@load donteval@compile (vars (tedit.default.window (createw (let ((width (widthifwindow (times 80 (tedit.stringwidth "A")))) (height (heightifwindow (times 35 (fontprop defaultfont (quote height))) t))) (createregion (min 475 (- screenwidth (+ width 10))) (max 85 (- screenheight height 100)) width height)) "TEDIT window" nil t)) (* \; "Set up default tabs to be 8 spaces, so we can edit code files.") (tedit.default.props (bquote ((\\\,@ tedit.default.props) paralooks (tabs ((\\\, (times 8 (tedit.stringwidth "A"))))))))) (p (eval-at-greet (cl:when (getd (quote tedit)) (* |;;| "Make the ESC key REDO the previous TEdit operation") (undosave (bquote (tedit.setsyntax (\\\, (charcode esc)) (\\\, (tedit.getsyntax (charcode esc)))))) (tedit.setsyntax (charcode esc) (quote redo)) (* |;;| "Make TEdit close files when shrunk") (filesload (sysload from lispusers) tedit-close-on-shrink)))) (loadmenuitems "WritingAids" (((sysload from lispusers) "ProofReader")) (((sysload from lispusers) "TMAX")) (((sysload from lispusers) "DictTool")) (((sysload from lispusers) "TEditDoradoKeys")) (((sysload from lispusers) "EditKeys")) (((sysload from lispusers) "VirtualKeyboards") (let ((keyboard-file (findfile "Code.Keyboard" t private-lispusersdirectories))) (cl:when keyboard-file (vkbd.load-keyboard-file keyboard-file)))) (((sysload from lispusers) "KeyboardEditor")) (((sysload from lispusers) "Equations" "Sketch")) (((sysload from lispusers) "NovaFont") (load-nova-fonts))) (coms (initvars (docobjectsmenufont menufont)) (alists (imageobjgetfns docobj-filestamp-getfn docobj-timestamp-getfn docobj-include-getfn)) (loadmenuitems "WritingAids" (((sysload from lispusers) "Doc-Objects"))))))) (* |;;;| "TEDIT stuff") (cl:defun load-nova-fonts nil (let ((nova-font-host "Starfile Public:Parc:Xerox") (nova-fonts-to-load (quote ("VP Optima XSG Fonts>OptimaItalic" "VP Optima XSG Fonts>OptimaMedium"))) (nova-fonts-to-notice (quote ("Xerox Logo Fonts>XeroxLogo" "Xerox VP Quartz Fonts!2>QuartzBIR" "Xerox VP Quartz Fonts!2>QuartzBRR" "Xerox VP Quartz Fonts!2>QuartzMIR" "Xerox VP Quartz Fonts!2>QuartzMRR")))) (cl:flet ((find-nova-font (font) "Find the Novafont file" (cl:probe-file (cl:make-pathname :host nova-font-host :type "NovaFont" :defaults font)))) (cl:mapc (cl:function (cl:lambda (font) (let ((font-file (find-nova-font font))) (cl:when font-file (cl:format (getstream promptwindow (quote output)) "~%Loading Novafont ~A" (cl:pathname-name font-file)) (load-novafont-file font-file) (notice-novafont-file font-file))))) nova-fonts-to-load) (cl:mapc (cl:function (cl:lambda (font) (let ((font-file (find-nova-font font))) (cl:when font-file (cl:format (getstream promptwindow (quote output)) "~%Noticing Novafont ~A" (cl:pathname-name font-file)) (notice-novafont-file font-file))))) nova-fonts-to-notice))) (cl:mapc (cl:function (cl:lambda (item) (cl:pushnew item tedit.known.fonts :test (quote cl:equal)))) (quote (("XeroxLogo" (quote xeroxlogo)) ("Quartz" (quote quartz)) ("Optima" (quote optima)))))) (declare\: donteval@load donteval@compile (rpaq tedit.default.window (createw (let ((width (widthifwindow (times 80 (tedit.stringwidth "A")))) (height (heightifwindow (times 35 (fontprop defaultfont (quote height))) t))) (createregion (min 475 (- screenwidth (+ width 10))) (max 85 (- screenheight height 100)) width height)) "TEDIT window" nil t)) (rpaq tedit.default.props (bquote ((\\\,@ tedit.default.props) paralooks (tabs ((\\\, (times 8 (tedit.stringwidth "A")))))))) (eval-at-greet (cl:when (getd (quote tedit)) (* |;;| "Make the ESC key REDO the previous TEdit operation") (undosave (bquote (tedit.setsyntax (\\\, (charcode esc)) (\\\, (tedit.getsyntax (charcode esc)))))) (tedit.setsyntax (charcode esc) (quote redo)) (* |;;| "Make TEdit close files when shrunk") (filesload (sysload from lispusers) tedit-close-on-shrink))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "ProofReader"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "TMAX"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "DictTool"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "TEditDoradoKeys"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "EditKeys"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "VirtualKeyboards")) (quote (let ((keyboard-file (findfile "Code.Keyboard" t private-lispusersdirectories))) (cl:when keyboard-file (vkbd.load-keyboard-file keyboard-file))))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "KeyboardEditor"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "Equations" "Sketch"))) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "NovaFont")) (quote (load-nova-fonts))) (rpaq? docobjectsmenufont menufont) (addtovar imageobjgetfns (docobj-filestamp-getfn file doc-objects) (docobj-timestamp-getfn file doc-objects) (docobj-include-getfn file doc-objects)) (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "Doc-Objects"))) ) (rpaqq sketch-init-commands ((* |;;;| "SKETCH Stuff") (alists (imageobjgetfns skio.getfn skio.getfn.2)) (declare\: donteval@load donteval@compile (loadmenuitems "WritingAids" (((sysload from lispusers) "Sketch")))))) (* |;;;| "SKETCH Stuff") (addtovar imageobjgetfns (skio.getfn) (skio.getfn.2 file sketch)) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from lispusers) "Sketch"))) ) (rpaqq notecards-init-commands ((* |;;;| "NOTECARDS stuff") (initvars (|NC.NoteCardsIconPosition| (createposition 891 2)) (ncinitialglobalparams (quote (|ForceFiling| nil |MarkersInFileBoxes| nil |UseDeletedLinkIconIndicators| nil))) (notecardsdirectories (bquote ((\\\,@ *cache-directories*) "{QV}1.3L>" "{NB:PARC:XEROX}1.3L>")))) (declare\: donteval@load donteval@compile (loadmenuitems "WritingAids" (((sysload from notecards) "NoteCards") (|NoteCards| |NC.NoteCardsIconPosition|)))))) (* |;;;| "NOTECARDS stuff") (rpaq? |NC.NoteCardsIconPosition| (createposition 891 2)) (rpaq? ncinitialglobalparams (quote (|ForceFiling| nil |MarkersInFileBoxes| nil |UseDeletedLinkIconIndicators| nil))) (rpaq? notecardsdirectories (bquote ((\\\,@ *cache-directories*) "{QV}1.3L>" "{NB:PARC:XEROX}1.3L>"))) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "WritingAids") (quote ((sysload from notecards) "NoteCards")) (quote (|NoteCards| |NC.NoteCardsIconPosition|))) ) (* |;;| "Communication & Info") (rpaqq mail-init-commands ((* |;;;| "LAFITE stuff") (declare\: donteval@load donteval@compile (* |;;| "These have to be VARS instead of INITVARS since they come set to default values in the FULL sysout.") (vars (*new-lafite-p* (not (cl:fboundp (quote \\lafite.getmailfolder)))) (defaultmailfoldername (quote active.mail)) (lafitedefaulthost&dir (pack* |\\UserHomeDirectory| "MAIL>")) (lafitehardcopybatchflg t) (lafitemovetoconfirmflg (quote left)) (lafiteshowmodeflg (quote always)) (lafitebrowserregion (createregion 360 5 650 165)) (lafitedisplayregion (|with| region (windowprop |\\TopLevelTtyWindow| (quote region)) (createregion (max left scrollbarwidth) 175 (widthifwindow (min (quotient (times 2 screenwidth) 3) (times 85 (stringwidth "W" lafitedisplayfont)))) (difference bottom 175)))) (lafitestatuswindowposition (createposition 100 45)) (lafitemodedefault (or lafitemodedefault (quote gv)))) (* |;;| "In latest Lafite. Of course, it doesn't hurt to set them even if they aren't used.") (vars (lafite.dont.display.headers (quote ("Return-Path" "Redistributed" "Received" "Message-Id" "Comments" "Zippy-Says" "X-Mailer" "Organization" "References"))) (lafite.dont.forward.headers lafite.dont.display.headers) (lafite.dont.hardcopy.headers lafite.dont.display.headers)) (* |;;| "There are lots of optional mail utilities") (loadmenuitems "MailTools" (((sysload from lispusers) "LafiteTimedDelete")) (((sysload from lispusers) "LafiteFind")) (((sysload from lispusers) "Maintain")) (((sysload from lispusers) "NSMaintain")) (((sysload from lispusers) "MailScavenge")) (((sysload from lispusers) "Undigestify")) (((from lispusers) "Lafite-Indent")) (((sysload from lispusers) "MailShare")) (((sysload from "{QV}Lisp>") "LafiteFolderIcon")) (((sysload from "{ERIS}Sources>") "AppendMail"))) (p (eval-at-greet (cl:unless (not *new-lafite-p*) (|AddLoadMenuItem| "MailTools" (quote ((sysload from lispusers) "LafiteHighlight"))) (|AddLoadMenuItem| "MailTools" (quote ((sysload from "{PHYLUM}Lisp>") "Short-Lafite-Header"))))))) (* |;;| "") (* |;;| "Additional text at the start and end of a msg") (declare\: donteval@load donteval@compile (p (eval-at-greet (if *new-lafite-p* then (* |;;| "New Lafite running, set the appropriate vars.") (rpaq lafite.signature (or lafite.signature (concat (character (charcode eol)) (character (charcode eol)) "----- " (or (caddr (car initialslst)) "me") (character (charcode eol))))) (rpaq lafite.gv.from.field (or lafite.gv.from.field (concat (or (cadr (car initialslst)) "") " " (username nil nil t) " <" (cond ((cl:fboundp (quote fullusername)) (fullusername)) (t (username))) ">"))) else (* |;;| "Use the hack I wrote") (rpaq? lafitemsgtagstring (concat (character (charcode eol)) (character (charcode eol)) "----- " (or (caddr (car initialslst)) "me") (character (charcode eol)))) (rpaq? lafitemsgheaderstring (concat "From: " (or (cadr (car initialslst)) "") " " (username nil nil t) " <" (cond ((cl:fboundp (quote fullusername)) (fullusername)) (t (username))) ">" (character (charcode eol)))) (filesload (noerror from valueof (append private-lispusersdirectories lispusersdirectories)) "Tailor-Lafite-Msg"))))) (* |;;| "Private DL support") (initvars (lafitedldirectories nil)) (declare\: donteval@load donteval@compile (p (eval-at-greet (cl:unless *new-lafite-p* (|AddLoadMenuItem| "MailTools" (quote ((sysload from lispusers) "LafitePrivateDL"))))))) (* |;;| "Patches to Lafite to put the MOVE-TO folder first in the title.") (p (eval-at-greet (cl:when (and (cl:fboundp (quote lafite)) (not *new-lafite-p*)) (filesload (sysload noerror from "{Phylum}Lisp>") "LafiteTitlePatch") (changename (quote la.opentempfile) (quote dsk) (quote scratch)) (lafitemode (quote gv))))) (coms (* |;;;| "COMMON-LENS stuff") (initvars (\\use-lens? nil) (user::*lens-user-parameters* (bquote ((:default-host-and-dir lafitedefaulthost&dir) (:icon-pos (createposition 98 8)) (:mailweb-pos (createposition 194 7)) (:mailweb-icon-pos (createposition 194 7)) (:mailweb-font (fontcreate (quote (helvetica 8)))) (:feedback-p nil) (:filing-rule "Filing Rules") (:room-name (quote ("Mail"))))))) (vars (user::lens-loader-dir "{NB:PARC:Xerox}Current>")) (p (eval-at-greet (cond ((cl:member "Common-Lens" *modules* :test (cl:function string-equal)) (* \; "Common-Lens already loaded") (cl:funcall (cl:intern "LOAD-LENS-PATCHES" "CLENS"))) ((and \\use-lens? (not (null (cl:find-package "PCL")))) (* \; "Want to use Common-Lens, so load it now") (cl:load (cl:make-pathname :name "LOAD-CLENS" :defaults user::lens-loader-dir))) (t (* \; "Give the user the option of using it later") (|AddLoadMenuItem| "MailTools" (quote ((from valueof user::lens-loader-dir) "LOAD-CLENS")) (quote (ignore-errors (lafite (quote off)) (cl:funcall (cl:intern "COMMON-LENS" (cl:find-package "CLENS")) :on))))))))) (* |;;| "Turn on mailer (no, no, not Norman -- but he is easy to turn on. Or so I've heard.)") (initvars (\\turn-on-mailer (equal (etherhostnumber home-machine-name) (etherhostnumber)))) (p (eval-at-greet (cond ((not (getd (quote lafite))) (* \; "Don't turn on mail if it doesn't exist") nil) ((not \\turn-on-mailer) (* \; "Don't turn on if the user doesn't want to") nil) ((and \\use-lens? (not (null (cl:find-package "CLENS")))) (* \; "Use COMMON-LENS if it's here and the user wants it") (cl:funcall (cl:intern "COMMON-LENS" (cl:find-package "CLENS")) :on)) (t (* \; "Use Lafite") (lafite (quote on)))))))) (* |;;;| "LAFITE stuff") (declare\: donteval@load donteval@compile (rpaq *new-lafite-p* (not (cl:fboundp (quote \\lafite.getmailfolder)))) (rpaqq defaultmailfoldername active.mail) (rpaq lafitedefaulthost&dir (pack* |\\UserHomeDirectory| "MAIL>")) (rpaqq lafitehardcopybatchflg t) (rpaqq lafitemovetoconfirmflg left) (rpaqq lafiteshowmodeflg always) (rpaq lafitebrowserregion (createregion 360 5 650 165)) (rpaq lafitedisplayregion (|with| region (windowprop |\\TopLevelTtyWindow| (quote region)) (createregion (max left scrollbarwidth) 175 (widthifwindow (min (quotient (times 2 screenwidth) 3) (times 85 (stringwidth "W" lafitedisplayfont)))) (difference bottom 175)))) (rpaq lafitestatuswindowposition (createposition 100 45)) (rpaq lafitemodedefault (or lafitemodedefault (quote gv))) (rpaqq lafite.dont.display.headers ("Return-Path" "Redistributed" "Received" "Message-Id" "Comments" "Zippy-Says" "X-Mailer" "Organization" "References")) (rpaq lafite.dont.forward.headers lafite.dont.display.headers) (rpaq lafite.dont.hardcopy.headers lafite.dont.display.headers) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "LafiteTimedDelete"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "LafiteFind"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "Maintain"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "NSMaintain"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "MailScavenge"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "Undigestify"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((from lispusers) "Lafite-Indent"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from lispusers) "MailShare"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from "{QV}Lisp>") "LafiteFolderIcon"))) (|AddLoadMenuItem| (quote "MailTools") (quote ((sysload from "{ERIS}Sources>") "AppendMail"))) (eval-at-greet (cl:unless (not *new-lafite-p*) (|AddLoadMenuItem| "MailTools" (quote ((sysload from lispusers) "LafiteHighlight"))) (|AddLoadMenuItem| "MailTools" (quote ((sysload from "{PHYLUM}Lisp>") "Short-Lafite-Header"))))) ) (* |;;| "") (* |;;| "Additional text at the start and end of a msg") (declare\: donteval@load donteval@compile (eval-at-greet (if *new-lafite-p* then (* |;;| "New Lafite running, set the appropriate vars.") (rpaq lafite.signature (or lafite.signature (concat (character (charcode eol)) (character (charcode eol)) "----- " (or (caddr (car initialslst)) "me") (character (charcode eol))))) (rpaq lafite.gv.from.field (or lafite.gv.from.field (concat (or (cadr (car initialslst)) "") " " (username nil nil t) " <" (cond ((cl:fboundp (quote fullusername)) (fullusername)) (t (username))) ">"))) else (* |;;| "Use the hack I wrote") (rpaq? lafitemsgtagstring (concat (character (charcode eol)) (character (charcode eol)) "----- " (or (caddr (car initialslst)) "me") (character (charcode eol)))) (rpaq? lafitemsgheaderstring (concat "From: " (or (cadr (car initialslst)) "") " " (username nil nil t) " <" (cond ((cl:fboundp (quote fullusername)) (fullusername)) (t (username))) ">" (character (charcode eol)))) (filesload (noerror from valueof (append private-lispusersdirectories lispusersdirectories)) "Tailor-Lafite-Msg"))) ) (* |;;| "Private DL support") (rpaq? lafitedldirectories nil) (declare\: donteval@load donteval@compile (eval-at-greet (cl:unless *new-lafite-p* (|AddLoadMenuItem| "MailTools" (quote ((sysload from lispusers) "LafitePrivateDL"))))) ) (* |;;| "Patches to Lafite to put the MOVE-TO folder first in the title.") (eval-at-greet (cl:when (and (cl:fboundp (quote lafite)) (not *new-lafite-p*)) (filesload (sysload noerror from "{Phylum}Lisp>") "LafiteTitlePatch") (changename (quote la.opentempfile) (quote dsk) (quote scratch)) (lafitemode (quote gv)))) (* |;;;| "COMMON-LENS stuff") (rpaq? \\use-lens? nil) (rpaq? user::*lens-user-parameters* (bquote ((:default-host-and-dir lafitedefaulthost&dir) (:icon-pos (createposition 98 8)) (:mailweb-pos (createposition 194 7)) (:mailweb-icon-pos (createposition 194 7)) (:mailweb-font (fontcreate (quote (helvetica 8)))) (:feedback-p nil) (:filing-rule "Filing Rules") (:room-name (quote ("Mail")))))) (rpaq user::lens-loader-dir "{NB:PARC:Xerox}Current>") (eval-at-greet (cond ((cl:member "Common-Lens" *modules* :test (cl:function string-equal)) (* \; "Common-Lens already loaded") (cl:funcall (cl:intern "LOAD-LENS-PATCHES" "CLENS"))) ((and \\use-lens? (not (null (cl:find-package "PCL")))) (* \; "Want to use Common-Lens, so load it now") (cl:load (cl:make-pathname :name "LOAD-CLENS" :defaults user::lens-loader-dir))) (t (* \; "Give the user the option of using it later") (|AddLoadMenuItem| "MailTools" (quote ((from valueof user::lens-loader-dir) "LOAD-CLENS")) (quote (ignore-errors (lafite (quote off)) (cl:funcall (cl:intern "COMMON-LENS" (cl:find-package "CLENS")) :on))))))) (* |;;| "Turn on mailer (no, no, not Norman -- but he is easy to turn on. Or so I've heard.)") (rpaq? \\turn-on-mailer (equal (etherhostnumber home-machine-name) (etherhostnumber))) (eval-at-greet (cond ((not (getd (quote lafite))) (* \; "Don't turn on mail if it doesn't exist") nil) ((not \\turn-on-mailer) (* \; "Don't turn on if the user doesn't want to") nil) ((and \\use-lens? (not (null (cl:find-package "CLENS")))) (* \; "Use COMMON-LENS if it's here and the user wants it") (cl:funcall (cl:intern "COMMON-LENS" (cl:find-package "CLENS")) :on)) (t (* \; "Use Lafite") (lafite (quote on))))) (rpaqq chat-init-commands ((* |;;;| "CHAT stuff") (declare\: donteval@load donteval@compile (alists (networkloginfo lily symbolics)) (vars (chat.allhosts (sort (bquote (|IBID:PARC:XEROX| |PARC CHS:PARC:XEROX| erinyes eris phylum qv (\\\,@ (|for| host |in| defaultprintinghost |when| (eq (printertype host) (quote interpress)) |collect| host)))))) (closechatwindowflg t) (chat.window.size (let ((n-chars-wide 80) (n-chars-high 24)) (cons (min (quotient (times screenwidth 2) 3) (widthifwindow (times n-chars-wide (stringwidth "A" chat.font)))) (min (quotient (times screenheight 2) 3) (heightifwindow (times n-chars-high (fontprop chat.font (quote height))) t))))) (defaultchathost (filenamefield loginhost/dir (quote host)))) (loadmenuitems nil (((sysload from lispusers) "TCPChat")))))) (* |;;;| "CHAT stuff") (declare\: donteval@load donteval@compile (addtovar networkloginfo (lily (login "l" username cr password cr)) (symbolics (login))) (rpaq chat.allhosts (sort (bquote (|IBID:PARC:XEROX| |PARC CHS:PARC:XEROX| erinyes eris phylum qv (\\\,@ (|for| host |in| defaultprintinghost |when| (eq (printertype host) (quote interpress)) |collect| host)))))) (rpaqq closechatwindowflg t) (rpaq chat.window.size (let ((n-chars-wide 80) (n-chars-high 24)) (cons (min (quotient (times screenwidth 2) 3) (widthifwindow (times n-chars-wide (stringwidth "A" chat.font)))) (min (quotient (times screenheight 2) 3) (heightifwindow (times n-chars-high (fontprop chat.font (quote height))) t))))) (rpaq defaultchathost (filenamefield loginhost/dir (quote host))) (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "TCPChat"))) ) (rpaqq talk-init-commands ((* |;;| "Talk program initialization commands") (initvars (talk.default.region (createregion 575 0 500 500))) (declare\: donteval@load donteval@compile (loadmenuitems nil (((sysload from lispusers) "Talk")))) (declare\: donteval@load donteval@compile (loadmenuitems nil (((sysload compiled noerror from "{PHYLUM}Lisp>") fing) (fingw)))))) (* |;;| "Talk program initialization commands") (rpaq? talk.default.region (createregion 575 0 500 500)) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "Talk"))) ) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote nil) (quote ((sysload compiled noerror from "{PHYLUM}Lisp>") fing)) (quote (fingw))) ) (rpaqq calendar-init-commands ((* |;;;| "Calendar") (initvars (caldaydefaultregion (createregion 32 200 375 100)) (caldefaultalertdelta -10) (caldefaulthost&dir (concat |\\UserHomeDirectory| "CALENDAR>")) (calfont (fontcreate (quote (helvetica 18)))) (calupdateonshrinkflg t) (calkeepexpiredrems t)) (declare\: donteval@load donteval@compile (loadmenuitems nil (((sysload from lispusers) "Calendar") (progn (calloadfile "CalReminders") (let ((file (findfile "Calmanac88" t lispusersdirectories))) (cl:when file (calloadfile file))) (calendar (quote thisyear)))))))) (* |;;;| "Calendar") (rpaq? caldaydefaultregion (createregion 32 200 375 100)) (rpaq? caldefaultalertdelta -10) (rpaq? caldefaulthost&dir (concat |\\UserHomeDirectory| "CALENDAR>")) (rpaq? calfont (fontcreate (quote (helvetica 18)))) (rpaq? calupdateonshrinkflg t) (rpaq? calkeepexpiredrems t) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "Calendar")) (quote (progn (calloadfile "CalReminders") (let ((file (findfile "Calmanac88" t lispusersdirectories))) (cl:when file (calloadfile file))) (calendar (quote thisyear))))) ) (rpaqq printer-init-commands ((* |;;| "Printer menu") (initvars (printermenu.position (createposition (difference screenwidth 125) 5))) (loadmenuitems nil (((sysload from lispusers) "PrinterMenu") (printermenu))) (* |;;| "Hardcopying graphs") (loadmenuitems nil (((sysload from lispusers) "HGraph"))))) (* |;;| "Printer menu") (rpaq? printermenu.position (createposition (difference screenwidth 125) 5)) (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "PrinterMenu")) (quote (printermenu))) (* |;;| "Hardcopying graphs") (|AddLoadMenuItem| (quote nil) (quote ((sysload from lispusers) "HGraph"))) (rpaqq db-init-commands ((* |;;| "Information gathering database stuff") (initvars (|*Address-Book-Pos*| (createposition 19 181)) (|*Phone-Directory-Pos*| (createposition 19 181))) (addvars (phonelistfiles "{PHYLUM}ROLODEX.TEDIT")) (loadmenuitems nil (((from lispusers) "Phone-Directory")) (((from lispusers) "AddressBook"))) (* |;;| "Bibliographic lookup") (loadmenuitems "WritingAids" (((from lispusers) "Find-Citation"))))) (* |;;| "Information gathering database stuff") (rpaq? |*Address-Book-Pos*| (createposition 19 181)) (rpaq? |*Phone-Directory-Pos*| (createposition 19 181)) (addtovar phonelistfiles "{PHYLUM}ROLODEX.TEDIT") (|AddLoadMenuItem| (quote nil) (quote ((from lispusers) "Phone-Directory"))) (|AddLoadMenuItem| (quote nil) (quote ((from lispusers) "AddressBook"))) (* |;;| "Bibliographic lookup") (|AddLoadMenuItem| (quote "WritingAids") (quote ((from lispusers) "Find-Citation"))) (rpaqq nfs-init-commands ((* |;;| "Add NFS support") (loadmenuitems "FileAids" (((sysload from "{NB:PARC:XEROX}") "PARC-NFS"))))) (* |;;| "Add NFS support") (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from "{NB:PARC:XEROX}") "PARC-NFS"))) (* |;;| "Files") (rpaqq file-watch-init-commands ((* |;;;| "FileWatcher") (declare\: donteval@load donteval@compile (initvars (|FW-Properties| (bquote (font (gacha 8) all-files? nil position (\\\, (createposition screenwidth (cl:if (and (boundp (quote *who-line*)) (windowp *who-line*)) (difference screenheight (|fetch| (region height) |of| (windowprop *who-line* (quote region)))) screenheight))) anchor top-right shade (\\\, grayshade) interval 1000 filters ({dsk1}sysdir {core}<*>rolodex.* {core}<*>*phone*.txt))))) (loadmenuitems "FileAids" (((sysload from lispusers) "FileWatch") (filewatch)))))) (* |;;;| "FileWatcher") (declare\: donteval@load donteval@compile (rpaq? |FW-Properties| (bquote (font (gacha 8) all-files? nil position (\\\, (createposition screenwidth (cl:if (and (boundp (quote *who-line*)) (windowp *who-line*)) (difference screenheight (|fetch| (region height) |of| (windowprop *who-line* (quote region)))) screenheight))) anchor top-right shade (\\\, grayshade) interval 1000 filters ({dsk1}sysdir {core}<*>rolodex.* {core}<*>*phone*.txt)))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "FileWatch")) (quote (filewatch))) ) (rpaqq file-server-init-commands ((loadmenuitems "FileAids" (((sysload from lispusers) "NSProtection") (nsprotection))) (* |;;| "The ArchiveTool") (loadmenuitems "FileAids" (((sysload from lispusers) "ArchiveTool")) (((sysload from lispusers) "ArchiveBrowser")) (((sysload from lispusers) "NSAllocation"))))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "NSProtection")) (quote (nsprotection))) (* |;;| "The ArchiveTool") (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "ArchiveTool"))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "ArchiveBrowser"))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "NSAllocation"))) (rpaqq dirgrapher-init-commands ((* |;;| "DirGrapher") (initvars (dg.file-info-attributes fb.default.info) (dg.default-dir |\\UserHomeDirectory|) (dg.vertical-horizontal-option (quote horizontal)) (dg.background-directories (bquote ((\\\, dg.default-dir) "{NB:PARC:XEROX}" "{Phylum}" "{Pogo:AISNorth:XEROX}")))) (declare\: donteval@load donteval@compile (loadmenuitems "FileAids" (((sysload from lispusers) "DirGrapher")))))) (* |;;| "DirGrapher") (rpaq? dg.file-info-attributes fb.default.info) (rpaq? dg.default-dir |\\UserHomeDirectory|) (rpaq? dg.vertical-horizontal-option (quote horizontal)) (rpaq? dg.background-directories (bquote ((\\\, dg.default-dir) "{NB:PARC:XEROX}" "{Phylum}" "{Pogo:AISNorth:XEROX}"))) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "DirGrapher"))) ) (rpaqq fb-init-commands ((* |;;| "FileBrowser tailoring") (declare\: donteval@load donteval@compile (vars (fb.default.info (quote (size creationdate)))) (loadmenuitems "FileAids" (((sysload from lispusers) "Resize-FileBrowser")))))) (* |;;| "FileBrowser tailoring") (declare\: donteval@load donteval@compile (rpaqq fb.default.info (size creationdate)) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "Resize-FileBrowser"))) ) (rpaqq compare-files-init-commands ((* |;;| "Comparing files and the like") (loadmenuitems "FileAids" (((sysload from lispusers) "CompareDirectories")) (((sysload from lispusers) "CompareText")) (((sysload from lispusers) "CompareSources"))))) (* |;;| "Comparing files and the like") (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "CompareDirectories"))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "CompareText"))) (|AddLoadMenuItem| (quote "FileAids") (quote ((sysload from lispusers) "CompareSources"))) (* |;;| "Random stuff") (rpaqq unix-init-commands ((* |;;| "Some of UNIXish commands") (variables *unix-dir-stack*) (functions do-cd print-directory-stack) (commands "CD" "DIRS" "LS" "MORE" "POPD" "PUSHD" "PWD"))) (* |;;| "Some of UNIXish commands") (defglobalvar *unix-dir-stack* nil "The directory stack used in the exec commands PUSHD and friends.") (cl:defun do-cd (directory) (if (string-equal directory "..") then (let* ((current (directoryname t)) (parent (substring current 1 (strpos ">" current -2 nil nil nil nil t)))) (cndir parent)) else (cndir directory)) (directoryname t)) (cl:defun print-directory-stack nil (cl:format t "~%~A" (directoryname t)) (for dir in *unix-dir-stack* do (cl:format t " ~A" dir)) (cl:values)) (defcommand "CD" (&optional directory) "Connect to a directory" (do-cd directory) (setq *unix-dir-stack* nil) (cl:format t "~%~A" (directoryname t)) (cl:values)) (defcommand "DIRS" nil "Print out the directory stack used by PUSHD and friends." (print-directory-stack) (cl:values)) (defcommand "LS" (&optional (dirspec "*")) "List files matching the spec" (let ((filing.enumeration.depth 1)) (directory dirspec (quote (p)))) (cl:values)) (defcommand "MORE" (file) "Type the contents of a file" (cl:funcall (cl:function see) file) (cl:values)) (defcommand "POPD" (directory) "Connect to the previous directory" (if (null *unix-dir-stack*) then (cl:format t "~%popd: Directory stack empty.") else (do-cd (pop *unix-dir-stack*)) (print-directory-stack)) (cl:values)) (defcommand "PUSHD" (directory) "Connect to a directory, remember the current one on the directory stack." (cl:push (directoryname t) *unix-dir-stack*) (do-cd directory) (print-directory-stack) (cl:values)) (defcommand "PWD" nil "Print out the currently connected directory." (cl:format t "~%~A" (directoryname t)) (cl:values)) (rpaqq demos-init-commands ((* |;;;| "Giveing demos and the like") (initvars (|SlideFiles| (quote ("{PHYLUM}Talks>*.Tedit;")))) (declare\: donteval@load donteval@compile (loadmenuitems "Demos" (((sysload from lispusers) "SlideProjector")) (((sysload from lispusers) "Magnifier")) (((sysload from lispusers) "Big")) (((load from "{PHYLUM}") "Demo")))))) (* |;;;| "Giveing demos and the like") (rpaq? |SlideFiles| (quote ("{PHYLUM}Talks>*.Tedit;"))) (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "Demos") (quote ((sysload from lispusers) "SlideProjector"))) (|AddLoadMenuItem| (quote "Demos") (quote ((sysload from lispusers) "Magnifier"))) (|AddLoadMenuItem| (quote "Demos") (quote ((sysload from lispusers) "Big"))) (|AddLoadMenuItem| (quote "Demos") (quote ((load from "{PHYLUM}") "Demo"))) ) (rpaqq games-init-commands ((* |;;;| "R and R") (declare\: donteval@load donteval@compile (loadmenuitems "Games" (((from "{PHYLUM}Lisp>") "BlackBox")) (((from "{FS8:PARC:XEROX}Lisp>") "Go")) (((sysload from lispusers) "Qix") (add.process (quote (qix.grow)))) (((sysload from lispusers) "FaceInvader")) (((sysload from lispusers) "Donz")) (((sysload from lispusers) "Doctor")) (((sysload from lispusers) "Hanoi")) (((sysload from lispusers) "Life")) (((sysload from lispusers) "Solitare")) (((sysload from "{FS8:PARC:XEROX}Lisp>") "RandomWord")))))) (* |;;;| "R and R") (declare\: donteval@load donteval@compile (|AddLoadMenuItem| (quote "Games") (quote ((from "{PHYLUM}Lisp>") "BlackBox"))) (|AddLoadMenuItem| (quote "Games") (quote ((from "{FS8:PARC:XEROX}Lisp>") "Go"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Qix")) (quote (add.process (quote (qix.grow))))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "FaceInvader"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Donz"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Doctor"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Hanoi"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Life"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from lispusers) "Solitare"))) (|AddLoadMenuItem| (quote "Games") (quote ((sysload from "{FS8:PARC:XEROX}Lisp>") "RandomWord"))) ) (* |;;| "Cleanup") (rpaqq background-menu-cleanup-init-commands ((* |;;;| "Clean up the background menu") (functions move-background-item-under) (declare\: donteval@load donteval@compile (p (eval-at-greet (* |;;| "Put the HARDCOPY item under the SNAP command") (move-background-item-under "Hardcopy" "Snap") (* |;;| "Put the ArchiveTool under the FileBrowser") (move-background-item-under "ArchiveTool" "FileBrowser") (* |;;| "Add a menu item for loging out") (/nconc1 |BackgroundMenuCommands| (quote ("LOGOUT & Power-Off" (quote (and (mouseconfirm "Really (LOGOUT)?") (|GoodNight|))) "Logout of LISP" (subitems ("LOGOUT T & Power-Off" (quote (and (mouseconfirm "Really (LOGOUT T)?") (|GoodNight| t))) "Logout without saving VMem"))))) (* |;;| "Hide some system-level commands under a single top-level command") (or (for item in |BackgroundMenuCommands| thereis (string-equal "System" (car item))) (/nconc1 |BackgroundMenuCommands| (list "System" nil nil (list (quote subitems))))) (for label in (quote ("SaveVM" "Idle" "AR Edit" "DumpCache" "Set Directories" "LOGOUT & Power-Off")) do (move-background-item-under label "System")))) (* |;;| "Clear the background menu cache") (vars (|BackgroundMenu| nil))))) (* |;;;| "Clean up the background menu") (cl:defun move-background-item-under (label-to-move parent-label) (let ((item-to-move (for item in |BackgroundMenuCommands| thereis (string-equal label-to-move (car item)))) (parent-item (for item in |BackgroundMenuCommands| thereis (string-equal parent-label (car item))))) (cond ((or (null parent-item) (null item-to-move)) nil) ((null (cdddr parent-item)) (* \; "No subitems yet") (/nconc1 parent-item (bquote (subitems (\\\, item-to-move)))) (/dremove item-to-move |BackgroundMenuCommands|)) (t (* \; "Already has subitems ") (/nconc1 (cadddr parent-item) item-to-move) (/dremove item-to-move |BackgroundMenuCommands|))))) (declare\: donteval@load donteval@compile (eval-at-greet (* |;;| "Put the HARDCOPY item under the SNAP command") (move-background-item-under "Hardcopy" "Snap") (* |;;| "Put the ArchiveTool under the FileBrowser") (move-background-item-under "ArchiveTool" "FileBrowser") (* |;;| "Add a menu item for loging out") (/nconc1 |BackgroundMenuCommands| (quote ("LOGOUT & Power-Off" (quote (and (mouseconfirm "Really (LOGOUT)?") (|GoodNight|))) "Logout of LISP" (subitems ("LOGOUT T & Power-Off" (quote (and (mouseconfirm "Really (LOGOUT T)?") (|GoodNight| t))) "Logout without saving VMem"))))) (* |;;| "Hide some system-level commands under a single top-level command") (or (for item in |BackgroundMenuCommands| thereis (string-equal "System" (car item))) (/nconc1 |BackgroundMenuCommands| (list "System" nil nil (list (quote subitems))))) (for label in (quote ("SaveVM" "Idle" "AR Edit" "DumpCache" "Set Directories" "LOGOUT & Power-Off")) do (move-background-item-under label "System"))) (rpaqq |BackgroundMenu| nil) ) (rpaqq do-load-utilities-init-commands ((* |;;| "Load the users specified utilities") (initvars *load-utility-options* nil) (p (eval-at-greet (cl:unless *generic-init-loaded* (cl:mapc (cl:function (cl:lambda (utility) (|PickLoadUtilityItem| utility nil t))) *load-utility-options*)))))) (* |;;| "Load the users specified utilities") (rpaq? *load-utility-options* nil) (rpaq? nil nil) (eval-at-greet (cl:unless *generic-init-loaded* (cl:mapc (cl:function (cl:lambda (utility) (|PickLoadUtilityItem| utility nil t))) *load-utility-options*))) (* |;;| "Send the Tool Work's a message telling it about this user.") (cl:defun xcl-user::log-generic-init-user nil "If another person uses Generic-Init, let me know." (ignore-errors (let ((xcl-user::me "Lanning") (xcl-user::user (cl:if \\cc-generic-init-msg (username) ""))) (cond ((string-equal xcl-user::user xcl-user::me) (* |;;| "Don't bother if the user is me.") nil) ((not (cl:fboundp (quote lafite.sendmessage))) (* |;;| "Can't send message if LAFITE isn't loaded.") nil) (t (lafite.sendmessage (cl:format nil "Subject: ~A~%To: ~A~%Cc: ~A~@{~%~%~A~}" "Generic-Init" xcl-user::me xcl-user::user "This is to let you know that I am using Generic-Init (again)." "Thanks for making it available.")) (if (eq makesysname :medely) then (lafite.sendmessage (cl:format nil "Subject: ~A~%To: ~A~%From: ~A~@{~%~%~A~}" "!!!Stop using Generic-Init!!!" (username) "Generic-Init (lanning.pa)" "Welcome to Medley." "Did you know that Generic-Init is no longer supported in Medley?" "I thought not." "Instead, please start using VANILLA-INIT (another failure in the quest for a good name)." "You should edit your personal INIT file to reflect this change." "" "Have a nice day." "--smL")))))))) (rpaq? \\cc-generic-init-msg t) (eval-at-greet (cl:unless *generic-init-loaded* (xcl-user::log-generic-init-user))) (rpaq *load-verbose* \\original-load-verbose) (rpaq prettyheader \\original-prettyheader) (rpaqq *generic-init-loaded* t) (* |;;| "Make the FileManager happy") (declare\: dontcopy (putprops generic-init makefile-environment (:package "IL" :readtable "XCL")) ) (putprops generic-init copyright ("Xerox Corporation" 1987 1988)) (declare\: dontcopy (filemap (nil (10532 11096 (purge-file-advice 10542 . 10771) (purge-advice 10773 . 11094)) (50783 51349 (|DebugMode| 50793 . 51347)) (51385 51969 (selectw 51395 . 51967)) (53377 55868 (|PrintDocFile| 53387 . 55866)) (55902 56226 (|\\Pick-One-At-Random| 55912 . 56224)) (56395 57032 (|GoodNight| 56405 . 56722) (|NewLisp| 56724 . 57030)) (57212 60582 (|RememberLastPartition| 57222 . 58511) ( |RememberLispState| 58513 . 60580))))) stop \ No newline at end of file diff --git a/lispusers/GRAPHCALLS b/lispusers/GRAPHCALLS new file mode 100644 index 00000000..0018ef37 --- /dev/null +++ b/lispusers/GRAPHCALLS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "24-Aug-88 08:59:17" |{XDE:MCS:STANFORD}MEDLEY>GRAPHCALLS.;1| 59928 changes to%: (FNS GRAPHCALLS.BREAKIN GRAPHCALLS.WHEREIS) previous date%: "21-Jul-88 08:44:32" |{MCS:MCS:STANFORD}GRAPHCALLS.;36|) (* " Copyright (c) 1984, 1985, 1986, 1987, 1988 by Stanford University. All rights reserved. ") (PRETTYCOMPRINT GRAPHCALLSCOMS) (RPAQQ GRAPHCALLSCOMS [(* * GRAPHCALLS Dynamic Function Graphing) (LOCALVARS . T) (FNS GRAPHCALLS) (FNS GRAPHCALLS1 GRAPHCALLS.SEARCH GRAPHCALLS.ADVISE GRAPHCALLS.ADVISE1 GRAPHCALLS.BREAKIN GRAPHCALLS.LEFT GRAPHCALLS.MIDDLE GRAPHCALLS.COLLECT GRAPHCALLS.INSPECT.FRAME GRAPHCALLS.INSPECT GRAPHCALLS.INVERT.NODE GRAPHCALLS.FETCH GRAPHCALLS.STORE GRAPHCALLS.PRINT GRAPHCALLS.CLOSE GRAPHCALLS.GRAPH.CLOSEFN NO\ GRAPHCALLS.INSPECTCODE GRAPHCALLS.WHEREIS GRAPHCALLS.ARGLIST) [INITVARS GRAPHCALLS.INSPECTCODE.WINDOW (GRAPHCALLS.DEFAULT.OPTIONS '(:DELAY 500 :SUBFNDEFFLG T :SEARCHFN GRAPHCALLS.SEARCH :DEPTH 2 :LEFTBUTTONFN GRAPHCALLS.LEFT :MIDDLEBUTTONFN GRAPHCALLS.MIDDLE :INSPECTWIDTH 250 :INSPECTCODEWIDTH 400 :FONT (GACHA 8) :FORMAT (HORIZONTAL COMPACT REVERSE/DAUGHTERS] (PROP ARGNAMES GRAPHCALLS) (PROP MENU * GRAPHCALLS.MENUS) (INITVARS * GRAPHCALLS.MENUS) (GLOBALVARS * GRAPHCALLS.MENUS) (GLOBALVARS GRAPHCALLS.DEFAULT.OPTIONS GRAPHCALLS.INSPECTCODE.WINDOW) (RECORDS GRAPHCALLS.RECORD GRAPHCALLS.OPTIONS) (GLOBALVARS DEFAULT.GRAPH.NODEBORDER DEFAULT.GRAPH.NODEFONT DEFAULT.GRAPH.NODELABELSHADE) (BLOCKS (GRAPHCALLS (SPECVARS GRAPHCALLS.SEEN) (ENTRIES GRAPHCALLS) GRAPHCALLS GRAPHCALLS1 GRAPHCALLS.ADVISE GRAPHCALLS.ADVISE1) (GRAPHCALLS.INSPECT.FRAME (SPECVARS GRAPHCALLS.COLLECTED) (ENTRIES GRAPHCALLS.INSPECT.FRAME) GRAPHCALLS.INSPECT GRAPHCALLS.INSPECT.FRAME GRAPHCALLS.COLLECT)) (FILES (SYSLOAD FROM LISPUSERS) MSANALYZE GRAPHER) [P (for MENU in GRAPHCALLS.MENUS do (SET MENU (EVAL (GETPROP MENU 'MENU] (* * GRAPHCALLS Command Window) (FNS GRAPHCALLSW) (FNS GRAPHCALLSW.CLEAR GRAPHCALLSW.DOIT GRAPHCALLSW.FILTER GRAPHCALLSW.INCLUDE GRAPHCALLSW.PRINTFN) (INITVARS GRAPHCALLSW.WINDOW (GRAPHCALLSW.SCRATCHMENU (create MENU))) (VARS GRAPHCALLSW.MENUS) (PROP MENU * (PROGN GRAPHCALLSW.MENUS)) (GLOBALVARS GRAPHCALLSW.WINDOW GRAPHCALLSW.SCRATCHMENU GRAPHCALLSW.MENUS) (DECLARE%: DONTCOPY (RECORDS GRAPHCALLSW.MENUS.RECORD)) (ADDVARS (UNSAFE.TO.MODIFY.FNS ERROR ERRORX RAID RECLAIM \ALLOCBLOCK \MOVEBYTES \MP.ERROR \STOP.DRIBBLE?)) (ALISTS (BackgroundMenuCommands GraphCalls)) (VARS (BackgroundMenu)) (* * Multiple Selection Menus) (FNS MMENU MMENU.SELECTEDFN MMENU.MARKITEM MMENU.BOLDITEM) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA GRAPHCALLS]) (* * GRAPHCALLS Dynamic Function Graphing) (DECLARE%: DOEVAL@COMPILE DONTCOPY (LOCALVARS . T) ) (DEFINEQ (GRAPHCALLS [CL:LAMBDA (FN &REST OPTIONS &KEY DEPTH &ALLOW-OTHER-KEYS) (* ; "Edited 21-Jul-88 08:39 by cdl") (PROG (GRAPHNODES GRAPH GRAPHCALLS.SEEN) (DECLARE (SPECVARS GRAPHCALLS.SEEN)) (if OPTIONS then (for OPTION on GRAPHCALLS.DEFAULT.OPTIONS by (CDDR OPTION) unless (LISTGET OPTIONS (CAR OPTION)) do (LISTPUT OPTIONS (CAR OPTION) (CADR OPTION))) else (SETQ OPTIONS (COPY GRAPHCALLS.DEFAULT.OPTIONS))) (with GRAPHCALLS.OPTIONS OPTIONS (if (NULL (APPLY* :SEARCHFN FN)) then (RETURN)) (if :STREAM then (SETQ :FONT (DSPFONT NIL :STREAM))) (SETQ GRAPHNODES (GRAPHCALLS1 FN :DEPTH (FONTCOPY :FONT 'WEIGHT 'BOLD) OPTIONS)) (SETQ GRAPH (LAYOUTGRAPH GRAPHNODES (LIST FN) :FORMAT :FONT)) (if (OR (NULL :STREAM) (WINDOWP :STREAM)) then [if (OR :ADVISE :SHAPE) then (LET (GRAPHWIDTH GRAPHHEIGHT) (with REGION (GRAPHREGION GRAPH) (SETQ GRAPHWIDTH (WIDTHIFWINDOW (if (EQMEMB 'COUNT :ADVISE) then (PLUS WIDTH (STRINGWIDTH "00000" :FONT)) else WIDTH))) (SETQ GRAPHHEIGHT (HEIGHTIFWINDOW HEIGHT :ALLOWEDITFLG))) (if (WINDOWP :STREAM) then (with REGION (WINDOWPROP :STREAM 'REGION) (SHAPEW :STREAM (CREATEREGION LEFT BOTTOM GRAPHWIDTH GRAPHHEIGHT))) else (SETQ :STREAM (CREATEW (GETBOXREGION GRAPHWIDTH GRAPHHEIGHT] (SETQ :STREAM (SHOWGRAPH GRAPH :STREAM :LEFTBUTTONFN :MIDDLEBUTTONFN :TOPJUSTIFYFLG :ALLOWEDITFLG :COPYBUTTONEVENTFN)) (WINDOWPROP :STREAM 'CLOSEFN (FUNCTION GRAPHCALLS.GRAPH.CLOSEFN)) (SETQ :STREAM (WINDOWPROP :STREAM 'DSP)) else (DISPLAYGRAPH GRAPH :STREAM)) [if :ADVISE then (STREAMPROP :STREAM 'ADVISEDFNS (RESETFORM (CURSOR WAITINGCURSOR) (GRAPHCALLS.ADVISE GRAPHNODES FN (MKLIST :ADVISE) :STREAM] (STREAMPROP :STREAM 'OPTIONS OPTIONS) (RETURN :STREAM]) ) (DEFINEQ (GRAPHCALLS1 [LAMBDA (FN DEPTH LEAFFONT OPTIONS) (* ; "Edited 28-Jul-87 08:09 by cdl") (DECLARE (USEDFREE GRAPHCALLS.SEEN)) (PROG (GRAPHNODES GRAPHNODE) (push GRAPHCALLS.SEEN FN) [with GRAPHNODE [with GRAPHCALLS.OPTIONS OPTIONS (SETQ GRAPHNODE (create GRAPHNODE NODEID _ FN NODELABEL _ (if :NAMEFN then (APPLY* :NAMEFN FN OPTIONS) elseif :PRIN2FLG then (MKSTRING FN T) else FN] [with GRAPHCALLS.OPTIONS OPTIONS (if (NULL (SETQ TONODES (for SUBFN in (CAR (APPLY* :SEARCHFN FN OPTIONS)) when (OR (NULL :FILTER) (APPLY* :FILTER SUBFN)) collect SUBFN))) then (SETQ NODEFONT LEAFFONT) (RETURN (CONS GRAPHNODE] (if (ZEROP DEPTH) then (SETQ TONODES NIL) else (SETQ GRAPHNODES (for SUBFN in TONODES unless (FMEMB SUBFN GRAPHCALLS.SEEN) join (GRAPHCALLS1 SUBFN (SUB1 DEPTH) LEAFFONT OPTIONS] (RETURN (CONS GRAPHNODE GRAPHNODES]) (GRAPHCALLS.SEARCH [LAMBDA (FN OPTIONS) (* ; "Edited 21-Jul-88 07:31 by cdl") (if (FGETD FN) then (RESETLST [if (with GRAPHCALLS.OPTIONS OPTIONS :SUBFNDEFFLG) then (RESETSAVE (MOVD 'NILL '\SUBFNDEF) `(PUTD \SUBFNDEF ,(GETD '\SUBFNDEF] (CALLS FN))]) (GRAPHCALLS.ADVISE [LAMBDA (GRAPHNODES ROOTID FLAGS STREAM) (* ; "Edited 21-Jul-88 08:28 by cdl") (DECLARE (GLOBALVARS UNSAFE.TO.MODIFY.FNS)) (LET (ADVISED) (if (NOT (FMEMB ROOTID UNSAFE.TO.MODIFY.FNS)) then (push ADVISED (GRAPHCALLS.ADVISE1 ROOTID (GETNODEFROMID ROOTID GRAPHNODES) FLAGS STREAM))) [bind PARENT for GRAPHNODE in GRAPHNODES do (SETQ PARENT (with GRAPHNODE GRAPHNODE (if (LISTP NODEID) then (CAR NODEID) else NODEID))) (bind FN for TONODE in (with GRAPHNODE GRAPHNODE TONODES) when (AND (SETQ FN (if (LISTP TONODE) then (CAR TONODE) else TONODE)) (FGETD FN)) unless (FMEMB FN UNSAFE.TO.MODIFY.FNS) do (push ADVISED (GRAPHCALLS.ADVISE1 (LIST FN :IN PARENT) (GETNODEFROMID TONODE GRAPHNODES) FLAGS STREAM] ADVISED]) (GRAPHCALLS.ADVISE1 [LAMBDA (FN NODE FLAGS STREAM) (* ; "Edited 21-Jul-88 07:44 by cdl") [ADVISE FN 'AROUND NIL `(PROG2 (GRAPHCALLS.INVERT.NODE ,(KWOTE NODE) ,STREAM ,(KWOTE FLAGS) 'BEFORE) * (GRAPHCALLS.INVERT.NODE ,(KWOTE NODE) ,STREAM ,(KWOTE FLAGS) 'AFTER] (UNMARKASCHANGED FN 'ADVICE) FN]) (GRAPHCALLS.BREAKIN [LAMBDA (NODE WINDOW FN) (* ; "Edited 24-Aug-88 08:53 by cdl") (PROG [PARENT NODELST GRAPHNODEID (GRAPHNODES (fetch GRAPHNODES of (WINDOWPROP WINDOW 'GRAPH] (with GRAPHNODE NODE (if (NULL FROMNODES) then (RETURN)) (SETQ NODELST (for FROMNODE in FROMNODES collect (GETNODEFROMID FROMNODE GRAPHNODES))) (if (CDR NODELST) then (for NODE in NODELST do (FLIPNODE NODE WINDOW)) (GRAPHCALLS.PRINT "In the context of which node?") (SETQ PARENT (READ/NODE NODELST WINDOW)) (for NODE in NODELST do (FLIPNODE NODE WINDOW)) else (SETQ PARENT (CAR NODELST))) (if PARENT then (if (LISTP (SETQ GRAPHNODEID (fetch (GRAPHNODE NODEID) of PARENT))) then (SETQ GRAPHNODEID (CAR GRAPHNODEID))) (GRAPHCALLS.PRINT (APPLY* FN `(,NODELABEL :IN ,GRAPHNODEID]) (GRAPHCALLS.LEFT [LAMBDA (GRAPHNODE WINDOW) (DECLARE (SPECVARS GRAPHNODE WINDOW)) (* cdl "15-Oct-85 10:06") (LET [FN (STREAM (WINDOWPROP WINDOW 'DSP] (DECLARE (SPECVARS FN STREAM)) (if GRAPHNODE then (if (LISTP (SETQ FN (fetch (GRAPHNODE NODEID) of GRAPHNODE))) then (SETQ FN (CAR FN))) (MENU GRAPHCALLS.MENU) else (MENU GRAPHCALLS.BACKGROUND.MENU]) (GRAPHCALLS.MIDDLE [LAMBDA (GRAPHNODE WINDOW) (DECLARE (SPECVARS GRAPHNODE)) (* cdl "15-Oct-85 10:07") (LET (FN) (DECLARE (SPECVARS FN)) (if (AND GRAPHNODE GRAPHCALLSW.WINDOW) then (if (LISTP (SETQ FN (fetch (GRAPHNODE NODEID) of GRAPHNODE))) then (SETQ FN (CAR FN))) (MENU GRAPHCALLS.MIDDLE.MENU]) (GRAPHCALLS.COLLECT [LAMBDA (FN GRAPHNODES BACKFLG) (* ; "Edited 31-Mar-87 10:25 by cdl") (DECLARE (USEDFREE GRAPHCALLS.COLLECTED)) (LET [EXPANDCALLS CALLS (VARS (if (FGETD FN) then (VARS FN] [with GRAPHNODE (GETNODEFROMID FN GRAPHNODES) (SETQ EXPANDCALLS (for ID in (if BACKFLG then FROMNODES else TONODES) unless (FMEMB ID GRAPHCALLS.COLLECTED) collect (PROGN (push GRAPHCALLS.COLLECTED ID) ID] [if EXPANDCALLS then (for ID in EXPANDCALLS when (FGETD ID) do (SETQ CALLS (GRAPHCALLS.COLLECT ID GRAPHNODES BACKFLG)) (with GRAPHCALLS.RECORD VARS (SETQ FREEVARS (UNION FREEVARS (fetch (GRAPHCALLS.RECORD FREEVARS) of CALLS))) (SETQ GLOBALVARS (UNION GLOBALVARS (fetch ( GRAPHCALLS.RECORD GLOBALVARS) of CALLS] (replace (GRAPHCALLS.RECORD LOCALVARS) of VARS with NIL) VARS]) (GRAPHCALLS.INSPECT.FRAME [LAMBDA (FN WINDOW TREEFLG BACKFLG) (* cdl "10-Oct-85 17:41") (PROG (RECORD GRAPHCALLS.COLLECTED VARS) (DECLARE (SPECVARS GRAPHCALLS.COLLECTED)) (if (AND TREEFLG (OR BACKFLG (FGETD FN)) (SETQ RECORD (GRAPHCALLS.COLLECT FN (fetch GRAPHNODES of (WINDOWPROP WINDOW 'GRAPH)) BACKFLG)) (in RECORD thereis LISTP)) then (GRAPHCALLS.INSPECT RECORD WINDOW (CONCAT FN "'s " (if BACKFLG then "scope" else "tree"))) elseif (AND (NOT TREEFLG) (FGETD FN) (in (SETQ VARS (VARS FN)) thereis LISTP)) then (GRAPHCALLS.INSPECT VARS WINDOW FN) else (GRAPHCALLS.PRINT NIL "Nothing to INSPECT!"]) (GRAPHCALLS.INSPECT [LAMBDA (RECORD WINDOW LABEL) (* ; "Edited 1-Apr-87 08:21 by cdl") (PROG [INSPECTW INSPECTWS REGION (LINEHEIGHT (FONTPROP DEFAULTFONT 'HEIGHT] (SETQ REGION (CREATEREGION NIL NIL (WIDTHIFWINDOW (with GRAPHCALLS.OPTIONS GRAPHCALLS.DEFAULT.OPTIONS :INSPECTWIDTH)) (HEIGHTIFWINDOW (TIMES (LENGTH (in RECORD thereis LISTP)) LINEHEIGHT) T))) (with REGION (with REGION REGION (GETBOXREGION WIDTH HEIGHT)) (replace (REGION LEFT) of REGION with LEFT) (replace (REGION BOTTOM) of REGION with BOTTOM)) [SETQ INSPECTWS (for FIELD in [CONSTANT (REVERSE (RECORDFIELDNAMES 'GRAPHCALLS.RECORD] as VALUE in RECORD when VALUE collect (PROG1 (SETQ INSPECTW (INSPECTW.CREATE VALUE VALUE (FUNCTION GRAPHCALLS.FETCH) (FUNCTION GRAPHCALLS.STORE) NIL NIL NIL (if LABEL then (CONCAT FIELD " in " LABEL)) NIL (create REGION HEIGHT _ (HEIGHTIFWINDOW (ITIMES (LENGTH VALUE) LINEHEIGHT) T) BOTTOM _ (if INSPECTW then (fetch (REGION TOP) of (WINDOWPROP INSPECTW 'REGION)) else (fetch BOTTOM of REGION)) using REGION))) (WINDOWPROP INSPECTW 'CLOSEFN (FUNCTION GRAPHCALLS.CLOSE)) (WINDOWPROP INSPECTW 'GRAPHW WINDOW))] (if INSPECTWS then (WINDOWADDPROP WINDOW 'INSPECTWS INSPECTWS]) (GRAPHCALLS.INVERT.NODE [LAMBDA (NODE STREAM FLAGS WHEN) (* ; "Edited 28-Jul-87 15:48 by cdl") (if (FMEMB 'INVERT FLAGS) then (FLIPNODE NODE STREAM)) (SELECTQ WHEN (BEFORE (BLOCK (with GRAPHCALLS.OPTIONS GRAPHCALLS.DEFAULT.OPTIONS :DELAY))) (AFTER [if (FMEMB 'COUNT FLAGS) then (with GRAPHNODE NODE (MOVETO (PLUS (fetch XCOORD of NODEPOSITION ) (QUOTIENT NODEWIDTH 2)) (DIFFERENCE (PLUS (fetch YCOORD of NODEPOSITION) (FONTPROP NODEFONT 'DESCENT) 1) (QUOTIENT NODEHEIGHT 2)) STREAM) (DSPFONT NODEFONT STREAM) (printout STREAM %, (if (FIXP NODEBORDER) then (add NODEBORDER 1) else (SETQ NODEBORDER 1]) (SHOULDNT]) (GRAPHCALLS.FETCH [LAMBDA (OBJECT PROPERTY) (* cdl "21-Feb-84 14:17") (EVALV PROPERTY]) (GRAPHCALLS.STORE [LAMBDA (OBJECT PROPERTY NEWVALUE) (* cdl "28-Feb-84 10:09") (SET PROPERTY NEWVALUE]) (GRAPHCALLS.PRINT [LAMBDA (EXP ERROR) (* ; "Edited 28-Jul-87 16:07 by cdl") (DECLARE (GLOBALVARS PROMPTWINDOW)) (CLRPROMPT) (if EXP then (CENTERPRINTINREGION EXP NIL PROMPTWINDOW) elseif ERROR then (RINGBELLS) (CENTERPRINTINREGION ERROR NIL PROMPTWINDOW]) (GRAPHCALLS.CLOSE [LAMBDA (WINDOW) (* ; "Edited 31-Mar-87 10:15 by cdl") (PROG (INSPECTWS (GRAPHW (WINDOWPROP WINDOW 'GRAPHW NIL))) (SETQ INSPECTWS (for WINDOWLST in (WINDOWPROP GRAPHW 'INSPECTWS) thereis (FMEMB WINDOW WINDOWLST))) (for INSPECTW in INSPECTWS when (AND (OPENWP INSPECTW) (NEQ INSPECTW WINDOW)) do (WINDOWPROP INSPECTW 'CLOSEFN NIL) (WINDOWPROP INSPECTW 'GRAPHW NIL) (CLOSEW INSPECTW)) (WINDOWDELPROP GRAPHW 'INSPECTWS INSPECTWS]) (GRAPHCALLS.GRAPH.CLOSEFN [LAMBDA (WINDOW) (* cdl "27-Jun-85 15:13") (for INSPECTWS in (WINDOWPROP WINDOW 'INSPECTWS NIL) do (for INSPECTW in INSPECTWS when (OPENWP INSPECTW) do (WINDOWPROP INSPECTW 'CLOSEFN NIL) (WINDOWPROP INSPECTW 'GRAPHW NIL) (CLOSEW INSPECTW))) (LET ((FNS (STREAMPROP (WINDOWPROP WINDOW 'DSP) 'ADVISEDFNS NIL))) (if FNS then (APPLY (FUNCTION UNADVISE) FNS]) (NO\ [LAMBDA (FN) (* cdl " 6-Mar-84 14:47") (NEQ (NTHCHARCODE FN 1) (CHARCODE \]) (GRAPHCALLS.INSPECTCODE [LAMBDA (FN) (* ; "Edited 17-Sep-87 08:52 by cdl") (DECLARE (GLOBALVARS SCREENHEIGHT SCROLLBARWIDTH)) (LET ((TITLE (CONCAT FN " Code Window"))) (if (NOT (WINDOWP GRAPHCALLS.INSPECTCODE.WINDOW)) then (SETQ GRAPHCALLS.INSPECTCODE.WINDOW (CREATEW (GETBOXREGION (with GRAPHCALLS.OPTIONS GRAPHCALLS.DEFAULT.OPTIONS :INSPECTCODEWIDTH ) (DIFFERENCE SCREENHEIGHT SCROLLBARWIDTH)) TITLE)) else (WINDOWPROP GRAPHCALLS.INSPECTCODE.WINDOW 'TITLE TITLE) (DSPRESET GRAPHCALLS.INSPECTCODE.WINDOW)) (OR (INSPECTCODE FN GRAPHCALLS.INSPECTCODE.WINDOW) FN]) (GRAPHCALLS.WHEREIS [LAMBDA (FN OPTIONS) (* ; "Edited 24-Aug-88 08:57 by cdl") (LET ((FILES (for TYPE in '(FNS FUNCTIONS) join (WHEREIS FN TYPE T))) (LABEL (if (with GRAPHCALLS.OPTIONS OPTIONS :PRIN2FLG) then (MKSTRING FN T) else FN))) (if FILES then (CONS LABEL FILES) else LABEL]) (GRAPHCALLS.ARGLIST [LAMBDA (FN OPTIONS) (* ; "Edited 1-Apr-87 08:58 by cdl") (LET ((LABEL (if (with GRAPHCALLS.OPTIONS OPTIONS :PRIN2FLG) then (MKSTRING FN T) else FN))) (if (FGETD FN) then (CONS LABEL (SMARTARGLIST FN)) else LABEL]) ) (RPAQ? GRAPHCALLS.INSPECTCODE.WINDOW NIL) (RPAQ? GRAPHCALLS.DEFAULT.OPTIONS '(:DELAY 500 :SUBFNDEFFLG T :SEARCHFN GRAPHCALLS.SEARCH :DEPTH 2 :LEFTBUTTONFN GRAPHCALLS.LEFT :MIDDLEBUTTONFN GRAPHCALLS.MIDDLE :INSPECTWIDTH 250 :INSPECTCODEWIDTH 400 :FONT (GACHA 8) :FORMAT (HORIZONTAL COMPACT REVERSE/DAUGHTERS))) (PUTPROPS GRAPHCALLS ARGNAMES (NIL (FN &KEY :ADVISE :ALLOWEDITFLG :COPYBUTTONEVENTFN :DELAY :DEPTH :FILTER :FONT :FORMAT :INSPECTCODEWIDTH :INSPECTWIDTH :LEFTBUTTONFN :MIDDLEBUTTONFN :NAMEFN :PRIN2FLG :SEARCHFN :SHAPE :STREAM :SUBFNDEFFLG :TOPJUSTIFYFLG))) (RPAQQ GRAPHCALLS.MENUS (GRAPHCALLS.BACKGROUND.MENU GRAPHCALLS.MENU GRAPHCALLS.MIDDLE.MENU GRAPHCALLS.SOURCE.MENU)) (PUTPROPS GRAPHCALLS.BACKGROUND.MENU MENU [create MENU ITEMS _ '(("UNBREAK" (UNBREAK) "UnBreak everything.") ("RESET" (for GRAPHNODE in (fetch (GRAPH GRAPHNODES) of (WINDOWPROP WINDOW 'GRAPH)) when (with GRAPHNODE GRAPHNODE (FIXP NODEBORDER)) do (with GRAPHNODE GRAPHNODE (SETQ NODEBORDER NIL)) finally (REDISPLAYW WINDOW]) (PUTPROPS GRAPHCALLS.MENU MENU (create MENU ITEMS _ '[("?=" (PROG (ARGS) (GRAPHCALLS.PRINT [COND ((SETQ ARGS (NLSETQ (SMARTARGLIST FN T))) `(,FN ,@(CAR ARGS] "Args not availiable!")) "The function's argument list") ("HELP" (GRAPHCALLS.PRINT (NLSETQ (PROGN (IRM.LOOKUP FN) FN)) "Help not available!") "HelpSys information") ("FNTYP" (GRAPHCALLS.PRINT (FNTYP FN) "Fn's type not found") "Get the FNTYP of the function") ("WHERE" (GRAPHCALLS.PRINT (WHEREIS FN NIL T) "File not found!") "Do a WHEREIS on function") ("EDIT" (GRAPHCALLS.PRINT (NLSETQ (PROG1 (EDITDEF FN 'FNS) (TOTOPW WINDOW))) "Nothing to EDIT!") "Edit the function") ("TYPEIN" (BKSYSBUF FN T) "BKSYSBUF the function name") ("BREAK" (GRAPHCALLS.PRINT (APPLY* (FUNCTION BREAK) FN)) "Break this function" (SUBITEMS ("BREAKIN" (GRAPHCALLS.BREAKIN GRAPHNODE WINDOW (FUNCTION BREAK)) "Break this fn in another fn") ("UNBREAKIN" (GRAPHCALLS.BREAKIN GRAPHNODE WINDOW (FUNCTION UNBREAK)) "UnBreak this fn in another fn") ("UNBREAK" (GRAPHCALLS.PRINT (APPLY* (FUNCTION UNBREAK) FN)) "UnBreak this function") ("TRACE" (GRAPHCALLS.PRINT (APPLY* (FUNCTION TRACE) FN)) "Trace this function") ("TRACEIN" (GRAPHCALLS.BREAKIN GRAPHNODE WINDOW (FUNCTION TRACE)) "Trace this fn in another fn"))) ("CCODE" (GRAPHCALLS.PRINT (COND ((CCODEP FN) (GRAPHCALLS.INSPECTCODE FN))) "Not compiled code!") "Inspect this function's ccode") ("GRAPH" (GRAPHCALLS.PRINT [APPLY (FUNCTION GRAPHCALLS) `(,FN :STREAM NIL :DEPTH ,(with GRAPHCALLS.OPTIONS GRAPHCALLS.DEFAULT.OPTIONS :DEPTH) ,@(APPEND (STREAMPROP STREAM 'OPTIONS] "Nothing to graph!") "Graph this function's calls") ("FRAME" (GRAPHCALLS.INSPECT.FRAME FN WINDOW) "Inspect this function's vars" (SUBITEMS (">FRAME" (GRAPHCALLS.INSPECT.FRAME FN WINDOW T) "Inspect this sub-graph's freevars") (" " T))) (CLOSEW WINDOW)) "Enter a new function to be graphed, prompts for input.") (Include (GRAPHCALLSW.INCLUDE T) "Specify which functions (by file or function) to include (overide EXCLUDE)." ) (Exclude (GRAPHCALLSW.INCLUDE NIL) "Specify which functions (by file or function) to exclude from the graph." ) (Clear (GRAPHCALLSW.CLEAR) "Clear the current settings on the command window to the defaults." ) (,(MMENU.BOLDITEM "Graph" MENUFONT) (GRAPHCALLSW.DOIT) "Graph the function with the selected settings.")) TITLE _ "Command" CENTERFLG _ T)) (PUTPROPS GRAPHCALLSW.FILTER.MENU MENU (create MENU ITEMS _ '((WhereIs WHEREIS "Only graph functions that WHEREIS can locate." ) (FGetD FGETD "Only graph functions that are defined." ) (ExprP EXPRP "Only graph functions that are not compiled." ) (CCodeP CCODEP "Only graph functions that are compiled." ) (No\ NO\ "Only graph functions that do not have an initial slash in their name." )) TITLE _ "Filters" CENTERFLG _ T WHENSELECTEDFN _ (FUNCTION MMENU.SELECTEDFN))) (PUTPROPS GRAPHCALLSW.FLAGS.MENU MENU (create MENU ITEMS _ '((Invert (:ADVISE INVERT) "ADVISE the graphed functions to invert their node when called." ) (Count (:ADVISE COUNT) "ADVISE the graphed functions to keep a count of calls after their node." ) (Shape (:SHAPE T) "Shape the graph window to fit the graph." ) (Edit (:ALLOWEDITFLG T) "Make the graph editable by passing the ALLOWEDITFLG to SHOWGRAPH." ) (Prin2 (:PRIN2FLG T) "Display the package names.") ) TITLE _ "Flags" CENTERFLG _ T WHENSELECTEDFN _ (FUNCTION MMENU.SELECTEDFN))) (PUTPROPS GRAPHCALLSW.FORMAT.MENU MENU (create MENU ITEMS _ '((Lattice LATTICE "Specify the LATTICE format in LAYOUTGRAPH." ) (Reverse REVERSE "Specify the REVERSE format in LAYOUTGRAPH." ) (Vertical VERTICAL "Specify the VERTICAL format in LAYOUTGRAPH." ) (ArgList (:NAMEFN GRAPHCALLS.ARGLIST) "Use the function and its arguments as the node label." ) (WhereIs (:NAMEFN GRAPHCALLS.WHEREIS) "Use the function and the file(s) where it is found as the node label." )) TITLE _ "Format" CENTERFLG _ T WHENSELECTEDFN _ (FUNCTION MMENU.SELECTEDFN))) (PUTPROPS GRAPHCALLSW.DEPTH.MENU MENU (create MENU ITEMS _ '(0 1 2 3 4 5 6 7 8 9 10) TITLE _ "Depth" WHENSELECTEDFN _ (FUNCTION MMENU.MARKITEM) MENUUSERDATA _ `(VALUE ,(with GRAPHCALLS.OPTIONS GRAPHCALLS.DEFAULT.OPTIONS :DEPTH)) CENTERFLG _ T)) (PUTPROPS GRAPHCALLSW.DELAY.MENU MENU (create MENU ITEMS _ '(0 1 2 3 4 5 6 7 8 9 10) TITLE _ "Delay" WHENSELECTEDFN _ [FUNCTION (LAMBDA (ITEM MENU KEY) (MMENU.MARKITEM ITEM MENU KEY) (LISTPUT GRAPHCALLS.DEFAULT.OPTIONS :DELAY (TIMES 100 ITEM] MENUUSERDATA _ '(VALUE 5) CENTERFLG _ T)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS GRAPHCALLSW.WINDOW GRAPHCALLSW.SCRATCHMENU GRAPHCALLSW.MENUS) ) (DECLARE%: DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD GRAPHCALLSW.MENUS.RECORD (COMMANDMENU FILTERMENU FLAGSMENU FORMATMENU DEPTHMENU DELAYMENU )) ) ) (ADDTOVAR UNSAFE.TO.MODIFY.FNS ERROR ERRORX RAID RECLAIM \ALLOCBLOCK \MOVEBYTES \MP.ERROR \STOP.DRIBBLE?) (ADDTOVAR BackgroundMenuCommands (GraphCalls '(GRAPHCALLSW) "Open the GraphCalls Command Window")) (RPAQQ BackgroundMenu NIL) (* * Multiple Selection Menus) (DEFINEQ (MMENU [LAMBDA (MENU PRESELECT) (* ; "Edited 31-Mar-87 14:38 by cdl") (LET [(EVENT (GETMENUPROP MENU 'EVENT] [if (NULL EVENT) then (PUTMENUPROP MENU 'EVENT (SETQ EVENT (CREATE.EVENT 'MULTIMENU] (with MENU MENU (SETQ WHENSELECTEDFN (FUNCTION MMENU.SELECTEDFN))) (ADDMENU MENU) (for ITEM in PRESELECT do (DOSELECTEDITEM MENU ITEM)) (AWAIT.EVENT EVENT) (PROG1 (GETMENUPROP MENU 'VALUE) (PUTMENUPROP MENU 'VALUE NIL))]) (MMENU.SELECTEDFN [LAMBDA (ITEM MENU KEY) (* ; "Edited 21-Jul-88 07:51 by cdl") (LET [(VALUE (GETMENUPROP MENU 'VALUE] (SELECTQ ITEM (DONE (CLRPROMPT) (SETQ VALUE (for ITEM in VALUE collect (DEFAULTWHENSELECTEDFN ITEM MENU))) (DELETEMENU MENU T) (NOTIFY.EVENT (GETMENUPROP MENU 'EVENT))) (CLEAR (for ITEM in VALUE do (SHADEITEM ITEM MENU (CONSTANT WHITESHADE))) (SETQ VALUE NIL)) (if (MEMB ITEM VALUE) then (SHADEITEM ITEM MENU (CONSTANT WHITESHADE)) (SETQ VALUE (DREMOVE ITEM VALUE)) else (SHADEITEM ITEM MENU (CONSTANT BLACKSHADE)) (push VALUE ITEM))) (PUTMENUPROP MENU 'VALUE VALUE]) (MMENU.MARKITEM [LAMBDA (ITEM MENU KEY) (* ; "Edited 21-Jul-88 07:52 by cdl") [LET [(VALUE (GETMENUPROP MENU 'VALUE] (if VALUE then (SHADEITEM VALUE MENU (CONSTANT WHITESHADE] (PUTMENUPROP MENU 'VALUE ITEM) (SHADEITEM ITEM MENU (CONSTANT BLACKSHADE]) (MMENU.BOLDITEM [LAMBDA (STRING FONT) (* cdl "16-Oct-85 08:56") (LET [BITMAP STREAM (BOLDERFONT (FONTCOPY FONT 'WEIGHT 'BOLD] [SETQ STREAM (DSPCREATE (SETQ BITMAP (BITMAPCREATE (STRINGWIDTH STRING BOLDERFONT) (FONTPROP FONT 'HEIGHT] (DSPFONT BOLDERFONT STREAM) (DSPYPOSITION (FONTPROP FONT 'DESCENT) STREAM) (PRIN1 STRING STREAM) BITMAP]) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA GRAPHCALLS) ) (PUTPROPS GRAPHCALLS COPYRIGHT ("Stanford University" 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3731 7765 (GRAPHCALLS 3741 . 7763)) (7766 27104 (GRAPHCALLS1 7776 . 9788) ( GRAPHCALLS.SEARCH 9790 . 10226) (GRAPHCALLS.ADVISE 10228 . 11695) (GRAPHCALLS.ADVISE1 11697 . 12375) ( GRAPHCALLS.BREAKIN 12377 . 13892) (GRAPHCALLS.LEFT 13894 . 14399) (GRAPHCALLS.MIDDLE 14401 . 14847) ( GRAPHCALLS.COLLECT 14849 . 16769) (GRAPHCALLS.INSPECT.FRAME 16771 . 18057) (GRAPHCALLS.INSPECT 18059 . 20987) (GRAPHCALLS.INVERT.NODE 20989 . 22678) (GRAPHCALLS.FETCH 22680 . 22814) (GRAPHCALLS.STORE 22816 . 22957) (GRAPHCALLS.PRINT 22959 . 23331) (GRAPHCALLS.CLOSE 23333 . 24031) ( GRAPHCALLS.GRAPH.CLOSEFN 24033 . 24651) (NO\ 24653 . 24803) (GRAPHCALLS.INSPECTCODE 24805 . 26253) ( GRAPHCALLS.WHEREIS 26255 . 26712) (GRAPHCALLS.ARGLIST 26714 . 27102)) (35375 39533 (GRAPHCALLSW 35385 . 39531)) (39534 48781 (GRAPHCALLSW.CLEAR 39544 . 40456) (GRAPHCALLSW.DOIT 40458 . 43379) ( GRAPHCALLSW.FILTER 43381 . 44769) (GRAPHCALLSW.INCLUDE 44771 . 47892) (GRAPHCALLSW.PRINTFN 47894 . 48779)) (57293 59681 (MMENU 57303 . 57870) (MMENU.SELECTEDFN 57872 . 58835) (MMENU.MARKITEM 58837 . 59174) (MMENU.BOLDITEM 59176 . 59679))))) STOP \ No newline at end of file diff --git a/lispusers/GRAPHCALLS.TEDIT b/lispusers/GRAPHCALLS.TEDIT new file mode 100644 index 00000000..cc672127 --- /dev/null +++ b/lispusers/GRAPHCALLS.TEDIT @@ -0,0 +1,26 @@ +enˇvĹos GRAPHCALLS 2 4 1 GRAPHCALLS 1 4 By: Christopher Lane (Lane@Sumex-Aim.Stanford.Edu) Uses: GRAPHER, MSANALYZE (WHERE-IS & HELPSYS optional) GRAPHCALLS is an extended graphical interface to the Envos Lisp CALLS function. It is to CALLS what BROWSER is to SHOW PATHS in MASTERSCOPE. It allows fast graphing of the calling hierarchy of both interpreted and compiled code, whether or not the source is available (see the CALLS function in the MASTERSCOPE section of the Lisp Library Modules manual), allowing examination of both user and system functions. The sources of the functions do not have to be analyzed by MASTERSCOPE first. Additionally, buttoning a function on the graph brings up a menu of operations that can be done with the function, such as editing, inspecting, further graphing etc. (GRAPHCALLS FUNCTION &REST OPTIONS) [Function] Graphs the calling hierarchy of FUNCTION. Terminal nodes on the graph (those which call no other functions or are undefined) are printed in a bold version of the graph's font indicating that they cannot be graphed further: (( FIELDS ( SIDESFLG T) IDS 14 DATE \UNPACKDATE DAYTIME IMOD \DTSCAN \ISDST? \OUTDATE \LISPERROR NTH SUBSTRING NCHARS ALLOCSTRING \RPLRIGHT RPLSTRING FONTS 2 (GACHA 8) (GACHA 8 BRR) NODES ( (1 DATE (11 . 76) 1 NIL NIL (2 7 ) NIL) (2 \UNPACKDATE (80 . 111) 1 NIL NIL (3 4 5 6 ) (1 )) (3 DAYTIME (157 . 129) 1 NIL NIL NIL (2 )) (4 IMOD (150 . 117) 2 NIL NIL NIL (2 )) (5 \DTSCAN (157 . 105) 2 NIL NIL NIL (2 )) (6 \ISDST? (157 . 93) 1 NIL NIL NIL (2 )) (7 \OUTDATE (73 . 41) 1 NIL NIL (8 9 10 11 12 13 14 ) (1 )) (8 \LISPERROR (150 . 77) 1 NIL NIL NIL (7 )) (9 NTH (132 . 65) 2 NIL NIL NIL (7 )) (10 SUBSTRING (147 . 53) 1 NIL NIL NIL (7 )) (11 NCHARS (140 . 41) 1 NIL NIL NIL (7 )) (12 ALLOCSTRING (152 . 29) 1 NIL NIL NIL (7 )) (13 \RPLRIGHT (147 . 17) 2 NIL NIL NIL (7 )) (14 RPLSTRING (147 . 5) 1 NIL NIL NIL (7 )) )) 0 0 NIL The remainder of the) The remainder of the arguments, in keyword format, make up OPTIONS eg. (GRAPHCALLS 'DATE :FONT '(GACHA 10) :DEPTH 4 :FILTER 'FGETD) Options include: :STREAM An image stream to display the graph on. The options list is saved on the stream. :FILTER A predicate to apply to the functions when building the graph to test their eligibility to appear on the graph. The filter can be any defined function; the default is not to filter. Interesting filters include: WHEREIS Limits the tree to only functions the user as has loaded and prunes out system functions and SYSLOADed files. Quite useful. FGETD Limits the tree to only functions that are actually defined. Thus if you are perusing the tree for BITBLT and do not have and are not interested in the color code, FGETD will remove all of the undefined color bitmap functions. EXPRP Limits the tree to interpreted functions. Useful for graphing functions in the development stage. CCODEP Limits the tree to compiled functions. NO\ Keeps low level functions starting with \ (i.e. \OUTDATE) off of the graph. Useful for getting an overview of system functions and when advising system functions (as \'ed functions should probably not be advised). :DEPTH The calling hierarchy is graphed to depth levels (defaults to 2). :FORMAT Passed to LAYOUTGRAPH and can be any format specification (LATTICE, VERTICAL, REVERSE etc.); defaults to (HORIZONTAL COMPACT REVERSE/DAUGHTERS). In the forest format multiple instances of a function appear on the graph after every calling function and a boxed node indicates the function appears elsewhere on the graph, possibly graphed further. In the lattice format each function gets placed on the graph only once (particularly useful for dynamic graphing, described below), and boxed nodes indicate recursive functions calls. :SEARCHFN A function to use to generate the children of a given node. It should return a list whose first item is a list of the children, the other items in the list are ignore. Using this feature, it is possible to graph things other than functions. To graph what files load other files, supply a search function of (LAMBDA (FILE) (LIST (FILECOMSLST FILE 'FILES))) and a file name for the function argument. :ADVISE Advises the functions after they are graphed (see Dynamic Graphing below); recognized values are one or both of the following: INVERT Visually tracks a running program . COUNT Counts function calls in a running program. :DELAY The delay to use in advised graphs; defaults to 500 milliseconds. :NAMEFN A function to use to generate the node labels on the graph. :FONT The font to use to display the graph; defaults to (GACHA 8). :SHAPE A boolean that indicates if the window should be shaped to fit the graph; defaults to NIL. :PRIN2FLG A boolean that indicates to use PRIN2 when printing node labels, defaults to NIL. :SUBFNDEFFLG A boolean that enables graphing of compiler generated functions; defaults to T. :TOPJUSTIFYFLG Passed to SHOWGRAPH; defaults to NIL. :ALLOWEDITFLG Passed to SHOWGRAPH; defaults to NIL. GRAPH MENUS The menu that pops up when you left button a function on the graph contains the following items: ?= Print the arguments to the function, if available. HELP Calls HELPSYS on the function. FNTYP Print the function's FNTYP. WHERE Do a WHEREIS (with FILES = T) on the function. EDIT Calls the editor on the function if available for editing. TYPEIN BKSYSBUFs the name of the function into the typein buffer. BREAK Applies BREAK to the function. Its subitems are: BREAKIN Breaks the function only in the context of a particular calling function. In lattice format, if the function has more than one function calling it on the graph, the user is prompted to indicate the caller in which to break the function. UNBREAKIN Undoes BREAKIN. UNBREAK Applies UNBREAK to the function. TRACE Applies TRACE to the function. TRACEIN Traces the function only when called from inside a particular function, like BREAKIN above. Use UNBREAKIN to remove the trace, or else UNBREAK on the window menu. CCODE Calls INSPECTCODE on the function if it is compiled code. GRAPH Calls GRAPHCALLS to make a new graph starting with function, inherits the original graph's options. FRAME Inspect the local, free and global variables of the function. These are the last three lists of the CALLS function placed into INSPECT windows. Its subitems are: >FRAME Like FRAME but for all of the functions on the sub-tree starting at the selected node and only for FREEVARS and GLOBALVARS. FRAME but for all of the functions above the function in the graph, i.e. the FREEVARS and GLOBALVARS in the function's scope. Buttoning the graph outside a node give you a menu with these options: UNBREAK Does an (UNBREAK), unbreaking all broken functions. RESET Resets the counters for the COUNT option and redisplays the graph. DYNAMIC GRAPHING When the ADVISE option is specified with the value(s) of INVERT and/or COUNT, GRAPHCALLS will advise all of the functions on the graph (in the context of their parent) to invert their corresponding node on the graph (as well as delay some to allow it to be seen) and/or follow each function name by a count of the number of times it has been executed. In invert mode, a node remains inverted as long as control is inside its corresponding function and it returns to normal when the function is exited. The lattice format is best when using the invert feature. Closing the graph window UNADVISEs the functions on the graph. An example of this is (GRAPHCALLS 'DATE :ADVISE 'INVERT) and then evaluate (DATE). GRAPHCALLS will not graph or advise any function in the system list UNSAFE.TO.MODIFY.FNS when the advise option is used. Functions which are unsafe to advise should be added to this list. CAVEAT PROGRAMMER! This feature must be used with caution. As a rule, one should not do this to system functions, but only one's own, use WHEREIS as a filter for this. Advising system code indiscriminately will probably crash the machine unrecoverablely. You can, at some risk, interactively break and edit functions on the graph while the code is executing. Also, creating subgraphs of advised graphs will show the generated advice functions not the original functions called, as will creating new graphs of functions in advised graphs. You can create advised graphs of functions already graphed normally on the screen. COMMAND WINDOW )Ś˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€ţ˙˙ďří˙ř˙˙˙˙˙ý÷;˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€ý÷˙˙ď÷żí˙÷ż˙˙˙˙˙ý÷;˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€űţ˜ččďříÇďřtΙăŁĹ÷;hńpîď˙˙˙˙˙˙˙˙˙˙˙˙˙€űţWggo÷mťď÷ł6fݝšú×gnonď˙˙˙˙˙˙˙˙˙˙˙˙˙€ű†üoooümÇď÷ˇvîń˝˝ú×ooou_˙˙˙˙˙˙˙˙˙˙˙˙˙€űöóoooóműď÷ˇvîÍ˝˝ú×ooou_˙˙˙˙˙˙˙˙˙˙˙˙˙€ýć÷gowˇmť÷ˇˇvîÝ˝šýďono{ż˙˙˙˙˙˙˙˙˙˙˙˙˙€ţř¨ďxx­Çřxwvîâ˝Ĺýďoqpűż˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€Ŕ€Ŕ€Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ů€Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ů€Ď˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ů€Ď‡˙˙˙˙˙˙ßţŰ˙˙˙˙Ŕß˙˙˙ţ˙˙˙ý˙˙˙wř?ű˙ů€Ď{˙˙˙˙˙˙ßţ˙Ű˙˙˙˙ßß˙˙˙ţ˙˙˙˙ý˙{˙˙wűßű˙ů€Î˙‡Léž:<_ţţĐÇL˙ßÜx¸˙ţ˙”Ď}ÇF{î;Žé€Î˙{3fmŮ۟ţŰť+ż˙Áۡ7ţöS6í˙}ť;sťíŰvé€Î˙{wnďŰßţţۃ|˙ßŢ7¸˙ţţö÷w˙}ƒ{wťěÇY€Î˙{wněŰŰßţţŰżż˙ß١żţţö÷vm˙}ż{wťíű7Y€Ď{{wníŰ۟ţţŰť{ż˙ßۡ7ţţö÷ví˙{ť;wťÝŰwš€Ď‡‡wnî+Ü_ţţÜÇ|˙ßÜX¸˙ţ˙÷wÇG—¸>;‹š€Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š€Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţy€Č  €Č   €Č?  @"Ŕ 8 €Č0€ @  D €Č0fřóěóŕ—,á KˆŽ/Âçú8p D €Č>f͙›0Ľ‘5" LH‘5"Dˆ D €Č0f́›0ĽŸ!ń HE!r"@ř D €Č0f́›0Ľ! HE!’"@€ D €Č0f͙›0B‘!" HB!"Dˆ D €Č0>Ěđěó0BŽ á HB Âřéš8pŔ 8 €Č  €Č  €Č  €Č  €Č€ áđ> x‚€@  €Č€ ! „‚@Ŕ  €Č—$#Ł€砀!x„šâGYÄŔ x €Č˜‘$$d@Ä €!„„Ä‚H‘"j$D@  €Č$$'Ŕyň €!„„„‚Š>AÇÄ@  €Č$$$  €!„„„‚H + @$@  €Č‘$dd@! „„Œ„‚H„"B$D@  €ČŽ#ŁŁ€čáž xxt„bGAÄ@  €Č  €Č  €Č ˙˙˙˙ŕ €Č ˙˙˙˙ŕ €Čđř!ń"˙ţ?˙ŕ8 €Č€"  ˙ýß˙ŕD €Č#‰čŕâЀ"pâáÂ!Ĺú8q˙˙ß˙ŕ €ČáDI đŁP€!á‰""&˘D‰˙˙ß˙ŕ €Č„ đB râCä"@9˙˙?˙ŕ €Č„ B ’B"@É˙ţ˙˙ŕ €ČDIŁ" "‚$"D‰˙ý˙˙ŕ@ €Čň#ˆččŕůâ!ńęáÄ8u˙ü˙ŕ| €Č ˙˙˙˙ŕ €Č ˙˙˙˙ŕ €Č  €Č  €Čń<| ř €Ŕ 8 €Č B!B  € D €Č8°€@B éxBΐĎ  €Č"DĐ€@!#"B ń CQ$Ŕ  €Č>€€@!!>|  "Ä  €Č d€€@!! @  â$  €Č "D€B!!#"@  $ D €Čń:€<@ ř韑ĂŔ 8 €Č € €Č  €Č  €Č  €Č  ># Ŕ  €Č1€  !"# Ŕ  €Č0>qóŕ +#Á !-.#áŜ#„@ ( €Č3ś›0 $! !51Ł&˘$D@ ( €Č1°y›0 $ € >!! ˘ä>#„@ H €Č1°Ů›0¤ @ !!˘ Dŕ | €Č3°Ů›0d !! B$"$D@  €Č°}ó0#Ŕ !!>BÄ#„@  €Č€  €Č€  €Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü?˙˙˙ů€Ŕ?˙˙˙ů€Ŕŕ?˙Ă˙ů€Ŕ?˙ß˙ů€ŔŔ?˙‡˙ů€Ŕ ?˙ť˙ů€Ŕ ?˙ű˙ů€Ŕ ?˙ű˙ů€Ŕ ?˙ť˙ů€ŔŔ?˙Ç˙ů€Ŕ?˙˙˙ů€Ŕ?˙˙˙ů€Ŕ €Ŕ €ŔŔ 8 €Ŕ D €Ŕ @ €ŔŔ x €Ŕ D €Ŕ D €Ŕ D €ŔŔ 8 €Ŕ €Ŕ €Ŕ €Ŕ €Ŕŕ | €Ŕ  €Ŕ@  €Ŕ€  €Ŕ€  €Ŕ €Ŕ €Ŕ €Ŕ €Ŕ €Ŕ €Ŕ €ŔŔ 8 €Ŕ D €Ŕ D €ŔŔ 8 €Ŕ D €Ŕ D €Ŕ D €ŔŔ 8 €Ŕ €Ŕ €Ŕ €Ŕ €ŔŔ 8 €Ŕ D €Ŕ D €Ŕ D €Ŕŕ < €Ŕ  €Ŕ D €ŔŔ 8 €Ŕ €Ŕ €Ŕ €Ŕ €Ŕ8 C€ €Ŕ D Ä@ €Ŕ \ S Q( '  +` 5    0 < = 4đ " Ľ ; e Ś}…G 5 D  r " ˝ ď o° BMOBJ.GETFN3MODERN + + + + + Ů ­ 6 n p m EĆ{|€'v j yŤ ­ +4¸MU€GM-zş \ No newline at end of file diff --git a/lispusers/GRAPHGROUP.TEDIT b/lispusers/GRAPHGROUP.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..6f39abc4ff2360efa32fe365c9da4b6e016ac4e7 GIT binary patch literal 3630 zcmeHI(QX?>6y3OKQ3yr?fyxWgRS?uhiAjP<(!PKbubow$U9(=7l&TMt-LbvuddJ#X zH+3KQfc_6Jh!5!R@CTebYu8Rw!W#&QmEzsGbMKvV&$)MUZu{Q(Mkm%2>T8+ld(;)- zGclC9yk9QY%jLatxt)p0sGX_lgjcW~&mIuDarlgmvv@evR4LxIiTL4MX6i*PRO4#7 zr80`sTxO|AXsRWtG?~@P!AR0FB~6O+C{$@K;#AXMnud9-_zMY!GL@Og<8(-ZhKz*t zNL}(eMBSB!S5vY+c zk&H6i2}P2K3#=AM9+WF9fN=<@aK%`XlMYlb&!iYrN6geT_a+5$`^7}0k=rw_y1MbC zH81KZ*jz;8U@l?E2Fev(@HYySQLTI|L&22AIpYHXfJ!=1my~B9jLVPIWoi;!jugPY z#e~VaP4QqABvPd+-AUtQRe{SmNobNmDk!w-F3e$)rO{xJ4^;z5FKFw@7Su_AM@Dop zGceNW_yQoIgG@oa)DVBAKqpkx6)7@D@$)#EqOrEIju_I@EfTpoP{Lr^!H@vqgF@t?QW1qC6^GCkhvXv=G7%Z1 zM3>geS2e_*FrCA>R3R(~O+l5K$Sj`~n@BVk`Sx7EiO?F9Kuwm`bPYIJG!k_hkG+1- zv(LLeV0DW`TvH}PHB94|h!vT9KrPQdYXsYL?43JqdmC#Pt1~Y+wf*Kcb#1@rxs47! zx%yV)%;`LCB4tm?D?FX%si$=t;pu2G*&vN zP-tL8gOll%q0Es+Bc~pSFjv`ZKAGr*L<-Cw59cbkC(Mg%q)5Nr!nFsDlXzuokCIz4KsgNP=8HmkGipp&7F)yJ?Cee_IBqTjfQX9zDwRC+wVB8O5%zy$yD zw!!3so_I<|kgr!gc*FdQ<)mhG7@v`gE#`xNOzn$<`MrTZGcup^$Lh|*g~7At*X m`D0;WP#kP9z_;|(+dC#T|9r?hobFftSUK^|9qaJrZ+`-V;6$SU literal 0 HcmV?d00001 diff --git a/lispusers/GREP b/lispusers/GREP new file mode 100644 index 00000000..be516181 --- /dev/null +++ b/lispusers/GREP @@ -0,0 +1 @@ +(FILECREATED "14-May-86 08:04:43" {DSK}GREP.;1 2502 changes to: (FNS DOGREP) previous date: " 5-Mar-86 12:15:18" {DANTE}LISPUSERS>GREP.;1) (* Copyright (c) 1984, 1985, 1986 by Xerox Corporation. All rights reserved.) (PRETTYCOMPRINT GREPCOMS) (RPAQQ GREPCOMS ((FNS DOGREP GREP PHONE) (FILES BSEARCH) (INITVARS (PHONELISTFILES)))) (DEFINEQ (DOGREP [LAMBDA (STR FILES) (* Newman "14-May-86 08:04") (* * Originally coded by Larry Masinter.) (* * No longer permanently modifies the DSPFONT when DSPFONT is not the same as the DEFAULTFONT. -DVN "14-May-86 08:03:59") (if (LISTP FILES) then (for FILE in FILES do (DOGREP STRS FILE)) elseif (STRPOS "*" FILES) then (DOGREP STRS (DIRECTORY FILES NIL "*" "")) else (RESETLST (INFILE FILES) (RESETSAVE NIL (LIST (QUOTE CLOSEF?) (INPUT))) (RESETSAVE NIL (LIST (QUOTE DSPFONT) (DSPFONT))) (bind FOUND for STR inside STRS do (SETFILEPTR NIL 0) (bind POS while (SETQ POS (FFILEPOS STR NIL NIL NIL NIL NIL UPPERCASEARRAY)) do (OR FOUND (PROGN (PRINTOUT NIL T .FONT COMMENTFONT "(from " (INPUT) ")" .FONT DEFAULTFONT) (SETQ FOUND T))) (COPYCHARS NIL T (OR (BFILEPOS [CONSTANT (MKSTRING (CHARACTER (CHARCODE CR] (INPUT) 0 POS) 0) POS) (DSPFONT BOLDFONT) [COPYCHARS NIL T POS (SETQ POS (IPLUS POS (NCHARS STR] (DSPFONT DEFAULTFONT) (COPYCHARS NIL T POS (ADD1 (FILEPOS (CHARACTER (CHARCODE CR)) NIL POS]) (GREP (LAMBDA (STRS FILES) (* lmm " 1-Apr-85 15:27") (RESETLST (DOGREP STRS FILES)))) (PHONE [LAMBDA (NAME) (* lmm " 5-Mar-86 12:14") (GREP NAME (OR PHONELISTFILES (PROMPTFORWORD "Name of directory file: "]) ) (FILESLOAD BSEARCH) (RPAQ? PHONELISTFILES ) (PUTPROPS GREP COPYRIGHT ("Xerox Corporation" 1984 1985 1986)) (DECLARE: DONTCOPY (FILEMAP (NIL (392 2368 (DOGREP 402 . 2000) (GREP 2002 . 2091) (PHONE 2093 . 2366))))) STOP \ No newline at end of file diff --git a/lispusers/GREP.TEDIT b/lispusers/GREP.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..8312fdad10b697bc422b451916c6e1a82249594d GIT binary patch literal 3697 zcmeHJO>f&q5T#}3gLR0aZJP8rNP$)iY(XECOuI%~+LVUn{m@6EoQS+2~ZKVJMbOXQx*hDu#gG)1W? ziWuP=M+fJ709Fvk=P(G8FiLq0<-)3*2Hzg?c=oa~o}H+Q%YS|z#yr`B1CJSQyRVqG z?>e1P+czCsnT9`c=u&Q&9m6OJU+zJ|gLpjQ2^`O2NYXfro+S`Qa2!r~Qc=nR?fI?; zUDINoD*w=Z9*xs*7X7FQcbGts69H2MFb$KG^5@Aa84(1IvM!^tdBD3UBb{(~7QWz7 zo}-+oBx&I$5<0ganas{mG4NnK!HFY|iids2W)KA@d`WCOm`)SO)Y+;qR z93(i5!ZZw~;VXUw=?rYsszBLCbwez!h>AJ^mYk;uPYHE8!zPhIdIj)wGK;vVOGQ<> zSS0>3I60m2t-QSD??#T#fOS;J&0kErWA>b1_g&UQg|6W~piFbg75~szRpl(4PT>@L zmhLI#<9K!g|AhEWLshhz-jMfMbQF$fY5HIbx-mbJ8_n%nqp2yH)@aK6U0iyAAtnO# zTC1gK&0SsIcOUU6;z#EgbAxlap>6Nzil#Sq<^9399rN(ngi;nft)(<~n!EClAMrTh z(H1-mBDqoDu2<_wtLd^Aq`0lq$ypGloQQCrwA5=mnlfOX?9Ha*SL8nn;v;xik@fq~ z(DdzEy{0LKZ^%!A$&^PYJmhh{6kXrh)~Yof6h)$Iy-cl!a(QU<7ZXWSQG8P9#{;VZWlaev9>=%DZUsFUECgR zpLMb*DXvwaYYa^5DGZzrb8T=QGuJY4b9tVJXYh)QN zc$PC{^U)J#_WC{ySjQXI&klV-6g@=9ZVR+#3tH3_lA|K? zvL+M0lD8TmANqG$|3p7OGz~w(|ItVH-!)BD#o>BQx+yitT6-hipx62aKGxo>iRkiU z&7Y6!WaX676_hzay2!X{k_BT+dM&+P)1~X^+9<6r0+(0?mO>jPT*4JspJJ$8TyJUL zq~j+))}+k~XIh3{dT!AO^L&D@_v_2Bn*w{aK7>dc(k_gzWuGwU()&9+gb zMCnWJn?(ZYGwE8-z@OIwnFmT)-)Tgx7yA*DWCo3dXC9(_*YK8PdSInUVhKT;eRpKB zN{{(nd+oxq7IO1c1(CA+yF}U!LOXqcG&wo0lCWq=uDu|>Py0KGltAp~q6*{?yRL9h zr3IbDiP{$tD!n*DE;_^xA&00l=@Mk}2y(WAO1Ml(`W^3i-zX}ULs0Rd5Lx^uSmY

is!2p&z%*| Q*DD^O6d&tj$$a(a--iFEjQ{`u literal 0 HcmV?d00001 diff --git a/lispusers/GRID-ICONS b/lispusers/GRID-ICONS new file mode 100644 index 00000000..41af1f53 --- /dev/null +++ b/lispusers/GRID-ICONS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP") (FILECREATED "22-Nov-88 14:03:08" |{EG:PARC:XEROX}LISP>USERS>GRID-ICONS.;14| 27616 changes to%: (VARS GRID-ICONSCOMS) (FNS ICONW.MOVEFN LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN) previous date%: "29-Sep-88 13:43:56" |{EG:PARC:XEROX}LISP>USERS>GRID-ICONS.;13|) (* " Copyright (c) 1987, 1988 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT GRID-ICONSCOMS) (RPAQQ GRID-ICONSCOMS ((* ;;; "For laying out icons on a grid") (FNS ICONW.MOVEFN \ENSURE.ICON.GRID \TRIM-ICON-FILE-TITLE GRID-WINDOW) (INITVARS (ENFORCE.ICON.GRID NIL) (ENFORCE.ICON.REGIONS NIL) (ICON.SPACING (QUOTE (5 . 5))) (ICON.SIZE (QUOTE (85 . 85))) (GRID.OFFSET (QUOTE (0 . 0)))) (GLOBALVARS ENFORCE.ICON.GRID ICON.SPACING ICON.SIZE GRID.OFFSET) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (ADVISE ICONW TITLEDICONW)) (* ;;; "Defining some nice Viewpoint-ish icons") (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Redefine the Lafite folder icon, making them a bit smaller") (VARS MSGFOLDERICON MSGFOLDERMASK (MSGFOLDERTEMPLATE (create TITLEDICON ICON _ MSGFOLDERICON MASK _ MSGFOLDERMASK TITLEREG _ (CREATEREGION 5 2 65 35)))) (* ;; "And, for the new improved Lafite:") (VARS (LAFITE.FOLDER.ICON MSGFOLDERTEMPLATE))) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Redefine the Tedit icon, making it cuter and smaller") (P (if (GETD (QUOTE TEDIT)) then (ADVISE (QUOTE (TEXTSTREAM.TITLE IN \TEDIT.SHRINK.ICONCREATE)) (QUOTE AFTER) (QUOTE (SETQ !VALUE (\TRIM-ICON-FILE-TITLE !VALUE)))))) (VARS TEDIT.ICON TEDIT.MASK (TEDIT.TITLED.ICON.TEMPLATE (create TITLEDICON ICON _ TEDIT.ICON MASK _ TEDIT.MASK TITLEREG _ (CREATEREGION 5 2 50 30))))) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Redefine the SEdit icon, making it smaller and cuter") (VARS SEDITICON SEDITICONMASK) (P (SET (if (CL:FIND-PACKAGE "SEDIT") then (CL:INTERN "TITLED-ICON" (CL:FIND-PACKAGE "SEDIT")) else (QUOTE \\titled.icon)) (create TITLEDICON ICON _ SEDITICON MASK _ SEDITICONMASK TITLEREG _ (CREATEREGION 5 5 50 65))))) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Redefine the Sketch icon, making it cuter and smaller") (P (if (GETD (QUOTE SKETCH)) then (ADVISE (QUOTE (SKETCH.TITLE IN SK.SHRINK.ICONCREATE)) (QUOTE AFTER) (QUOTE (SETQ !VALUE (\TRIM-ICON-FILE-TITLE !VALUE)))))) (VARS SKETCH.ICON SKETCH.MASK (SKETCH.TITLED.ICON.TEMPLATE (create TITLEDICON ICON _ SKETCH.ICON MASK _ SKETCH.MASK TITLEREG _ (CREATEREGION 5 2 50 30))))) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Make SPY icons appear on the grid") (P (if (GETD (QUOTE SPY.BUTTON)) then (ADVISE (QUOTE SPY.BUTTON) (QUOTE AFTER) (QUOTE (GRID-WINDOW (OR !VALUE SPY.BUTTON))))))) (COMS (* ;; "Define a nice icon for accessing the list of loaded files") (FNS LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (VARS LOADED-FILES-ICON LOADED-FILES-ICON-MASK (LOADED-FILES-ICON-WINDOW (LET ((W (TITLEDICONW (create TITLEDICON ICON _ LOADED-FILES-ICON MASK _ LOADED-FILES-ICON-MASK TITLEREG _ (CREATEREGION 7 9 55 10)) "Lisp files" NIL (CREATEPOSITION 0 0) T (QUOTE BOTTOM)))) (WINDOWPROP W (QUOTE BUTTONEVENTFN) (QUOTE LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN)) W))))) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (* ;; "Define the standard icon, using the new Lyric feature") (VARS STANDARD-ICON STANDARD-ICON-MASK (DEFAULTTEXTICON (create TITLEDICON ICON _ STANDARD-ICON MASK _ STANDARD-ICON-MASK TITLEREG _ (CREATEREGION 5 5 50 60))) (DEFAULTICONFN (QUOTE TEXTICON)))) (* ;;; "") (* ;;; "Filemanager stuff") (DECLARE%: DONTCOPY (PROP MAKEFILE-ENVIRONMENT GRID-ICONS)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN))))) (* ;;; "For laying out icons on a grid") (DEFINEQ (ICONW.MOVEFN (LAMBDA (ICON POS) (* ; "Edited 26-Jan-88 09:34 by smL") (* ;;; "Make sure the icon gets moved on a grid") (LET ((ICON.WIDTH (fetch (REGION WIDTH) of (WINDOWPROP ICON (QUOTE REGION)))) (ICON.HEIGHT (fetch (REGION HEIGHT) of (WINDOWPROP ICON (QUOTE REGION))))) (COND ((OR (NOT ENFORCE.ICON.GRID) (WINDOWPROP ICON (QUOTE IGNORE.ICON.GRID))) POS) ((OR (GREATERP (fetch (POSITION XCOORD) of POS) SCREENWIDTH) (LESSP (PLUS (fetch (POSITION XCOORD) of POS) ICON.WIDTH) 0) (GREATERP (fetch (POSITION YCOORD) of POS) SCREENHEIGHT) (LESSP (PLUS (fetch (POSITION YCOORD) of POS) ICON.HEIGHT) 0)) (* ; "Must be a deliberate attempt to move the icon off the screen, since the end result isn't visible. In that case, let them move it.") POS) (T (* ; "Compute the grid location for the icon, being careful not to push the icon (accidentally) off the screen") (LET* ((ICON.CENTER.X (PLUS (fetch (POSITION XCOORD) of POS) (QUOTIENT ICON.WIDTH 2))) (ICON.CENTER.Y (PLUS (fetch (POSITION YCOORD) of POS) (QUOTIENT ICON.HEIGHT 2))) (GRID.X.SIZE (PLUS (CAR ICON.SIZE) (CAR ICON.SPACING))) (GRID.Y.SIZE (PLUS (CDR ICON.SIZE) (CDR ICON.SPACING))) (GRID.X.OFFSET (CAR GRID.OFFSET)) (GRID.Y.OFFSET (CDR GRID.OFFSET)) (ICON.GRID.X (MAX 0 (QUOTIENT (MIN (DIFFERENCE ICON.CENTER.X GRID.X.OFFSET) SCREENWIDTH) GRID.X.SIZE))) (ICON.GRID.Y (MAX 0 (QUOTIENT (MIN (DIFFERENCE ICON.CENTER.Y GRID.Y.OFFSET) SCREENHEIGHT) GRID.Y.SIZE)))) (if (OR (NULL ENFORCE.ICON.REGIONS) (for REGION in ENFORCE.ICON.REGIONS thereis (INSIDE? REGION ICON.CENTER.X ICON.CENTER.Y))) then (create POSITION XCOORD _ (PLUS (TIMES GRID.X.SIZE ICON.GRID.X) (QUOTIENT (CAR ICON.SPACING) 2) (QUOTIENT (DIFFERENCE (CAR ICON.SIZE) ICON.WIDTH) 2) GRID.X.OFFSET) YCOORD _ (PLUS (TIMES GRID.Y.SIZE ICON.GRID.Y) (QUOTIENT (CDR ICON.SPACING) 2) (QUOTIENT (DIFFERENCE (CDR ICON.SIZE) ICON.HEIGHT) 2) GRID.Y.OFFSET)) else POS)))))) ) (\ENSURE.ICON.GRID (LAMBDA (W) (* smL "17-Apr-87 15:43") (LET ((OPENP (OPENWP W))) (MOVEW W (ICONW.MOVEFN W (create POSITION XCOORD _ (fetch LEFT of (WINDOWPROP W 'REGION)) YCOORD _ (fetch BOTTOM of (WINDOWPROP W 'REGION))))) (if (NOT OPENP) then (CLOSEW W))))) (\TRIM-ICON-FILE-TITLE (LAMBDA (TITLE) (* ; "Edited 12-Jan-88 11:41 by smL") (if (AND TITLE (OR (STRINGP TITLE) (LITATOM TITLE))) then (PACKFILENAME.STRING 'NAME (FILENAMEFIELD TITLE 'NAME) 'EXTENSION (FILENAMEFIELD TITLE 'EXTENSION)) else TITLE))) (GRID-WINDOW (LAMBDA (W) (* ; "Edited 14-Sep-87 10:14 by smL") (COND ((WINDOWP W) (WINDOWADDPROP W 'MOVEFN 'ICONW.MOVEFN) (\ENSURE.ICON.GRID W))))) ) (RPAQ? ENFORCE.ICON.GRID NIL) (RPAQ? ENFORCE.ICON.REGIONS NIL) (RPAQ? ICON.SPACING (QUOTE (5 . 5))) (RPAQ? ICON.SIZE (QUOTE (85 . 85))) (RPAQ? GRID.OFFSET (QUOTE (0 . 0))) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS ENFORCE.ICON.GRID ICON.SPACING ICON.SIZE GRID.OFFSET) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (XCL:REINSTALL-ADVICE (QUOTE ICONW) :AFTER (QUOTE ((:LAST (GRID-WINDOW !VALUE))))) (XCL:REINSTALL-ADVICE (QUOTE TITLEDICONW) :AFTER (QUOTE ((:LAST (GRID-WINDOW !VALUE))))) (READVISE ICONW TITLEDICONW) ) (* ;;; "Defining some nice Viewpoint-ish icons") (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (RPAQQ MSGFOLDERICON #*(75 55)COOOON@@@@@@@@@@@@@@GOOOOO@@@@@@@@@@@@@@N@@@@CH@@@@@@@@@@@@@L@@@@AH@@@@@@@@@@@@@L@@@@AOOOOOOOOOOOOL@L@@@@AOOOOOOOOOOOOL@L@@@@@@@@@@@@@@@@@N@OOOOOOOOOOOOOOOOOON@L@@@@@@@@@@@@@@@@@F@LMJFG@@@@@@@@@@@ONF@LKNOJ@@@@@@@@@COHBF@L@@@@@@@@@@@@@@@HBF@LOFIJ@@@@@@@@@@@HBF@LCKGB@@@@@@@@@COHBF@L@@@@@@@@@@@@@@@HBF@LIMFJ@@@@@@@@@@@HBF@LMFMJ@@@@@@@@@COHBF@L@@@@@@@@@@@@@@@ONF@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@L@@@@@@@@@@@@@@@@@F@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@) (RPAQQ MSGFOLDERMASK #*(75 55)COOOON@@@@@@@@@@@@@@GOOOOO@@@@@@@@@@@@@@OOOOOOH@@@@@@@@@@@@@OOOOOOH@@@@@@@@@@@@@OOOOOOOOOOOOOOOOOOL@OOOOOOOOOOOOOOOOOOL@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@OOOOOOOOOOOOOOOOOON@) (RPAQ MSGFOLDERTEMPLATE (create TITLEDICON ICON _ MSGFOLDERICON MASK _ MSGFOLDERMASK TITLEREG _ (CREATEREGION 5 2 65 35))) (RPAQ LAFITE.FOLDER.ICON MSGFOLDERTEMPLATE) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (if (GETD (QUOTE TEDIT)) then (ADVISE (QUOTE (TEXTSTREAM.TITLE IN \TEDIT.SHRINK.ICONCREATE)) (QUOTE AFTER) (QUOTE (SETQ !VALUE (\TRIM-ICON-FILE-TITLE !VALUE))))) (RPAQQ TEDIT.ICON #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@L@@@@@@@@@@AL@@@L@@@@@@@@@@AF@@@L@@@@@@@@@@AC@@@L@@@@@@@@@@AAH@@L@@CNGOCOONA@L@@L@@CNGOCOONA@F@@L@@@@@@@@@@A@C@@L@@@@@@@@@@A@AH@L@@@@@@@@@@A@@L@L@@@@@@@@@@A@@F@L@@@@@@@@@@AOOO@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@OOMNOOOMOGKHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGKNOOOGOOGOOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LFOONOOKOOMOOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGNOOOL@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@OMOOOGOMOOOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGOOMNOOONMOOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGKOOOKNOONOOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGNOOOMOOKONOHC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@LGOMOOOGOOH@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQQ TEDIT.MASK #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOON@@@OOOOOOOOOOOOO@@@OOOOOOOOOOOOOH@@OOOOOOOOOOOOOL@@OOOOOOOOOOOOON@@OOOOOOOOOOOOOO@@OOOOOOOOOOOOOOH@OOOOOOOOOOOOOOL@OOOOOOOOOOOOOON@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQ TEDIT.TITLED.ICON.TEMPLATE (create TITLEDICON ICON _ TEDIT.ICON MASK _ TEDIT.MASK TITLEREG _ (CREATEREGION 5 2 50 30))) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (RPAQQ SEDITICON #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@L@@@@@@@@@@AL@@@L@@@@@@@@@@AF@@@LB@@@@@@@@@AC@@@LD@@@@@@@@@AAH@@LD@@@@@@@@@A@L@@LH@@@@@@@@@A@F@@LH@@@@@@@@@A@C@@LH@@@@@@@@@A@AH@LH@@@@@@@@@A@@L@LH@@@@@@@@@A@@F@LDDI@@@@@@@AOOO@LD@@@@@@@@@@@@C@LB@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@DC@L@@@@@@@@@@@@BC@L@@@@@@@@@@@@BC@L@@@@@@@@@@@@AC@L@@@@@@@@@@@@AC@L@@@@@@@@@@@@AC@L@@@@@@@@@@@@AC@L@@@@@@@@@@@@AC@L@@@@@@@@@@IBBC@L@@@@@@@@@@@@BC@L@@@@@@@@@@@@DC@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQQ SEDITICONMASK #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOON@@@OOOOOOOOOOOOO@@@OOOOOOOOOOOOOH@@OOOOOOOOOOOOOL@@OOOOOOOOOOOOON@@OOOOOOOOOOOOOO@@OOOOOOOOOOOOOOH@OOOOOOOOOOOOOOL@OOOOOOOOOOOOOON@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (SET (if (CL:FIND-PACKAGE "SEDIT") then (CL:INTERN "TITLED-ICON" (CL:FIND-PACKAGE "SEDIT")) else (QUOTE \\titled.icon)) (create TITLEDICON ICON _ SEDITICON MASK _ SEDITICONMASK TITLEREG _ (CREATEREGION 5 5 50 65))) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (if (GETD (QUOTE SKETCH)) then (ADVISE (QUOTE (SKETCH.TITLE IN SK.SHRINK.ICONCREATE)) (QUOTE AFTER) (QUOTE (SETQ !VALUE (\TRIM-ICON-FILE-TITLE !VALUE))))) (RPAQQ SKETCH.ICON #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@L@@@@@@@@@@AL@@@L@@@@@@@@@@AF@@@L@@@@@@@@@@AC@@@LAOOOOOOOH@AAH@@LA@@@@@@@H@A@L@@LA@@@H@@@H@A@F@@LA@L@H@@@H@A@C@@LA@B@NCBHH@A@AH@LA@N@IDI@H@A@@L@LAAB@IDI@H@A@@F@LA@N@NCBHH@AOOO@LA@@@@@@@H@@@@C@LAOOOOOOOH@@@@C@L@@@B@@@@@@@@@C@L@@@B@@@@@@@@@C@L@@@D@@@@@@@@@C@L@@@D@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@H@@@@@@@@@C@L@@@D@@@@@@@@@C@L@@@D@@@@@@@@@C@L@@@B@@@@AN@@@C@L@@@A@@@@FAH@@C@L@@@@H@@AH@F@@C@L@@@@F@DB@@A@@C@L@@@@ALBD@@@H@C@L@@@@@CMD@@@H@C@L@@@@@@CH@@@D@C@L@@@@@@FH@@@D@C@L@@@@@@I@@@@B@C@L@@@@@@A@@@@B@C@L@@@@@@A@@@@B@C@L@@@@@@A@@@@B@C@L@@@@@@@H@@@D@C@L@@@@@@@H@@@D@C@L@@@@@@@D@@@H@C@L@@@@@@@D@@@H@C@L@@@@@@@B@@A@@C@L@@@@@@@AH@F@@C@L@@@@@@@@FAH@@C@L@@@@@@@@AN@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQQ SKETCH.MASK #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOON@@@OOOOOOOOOOOOO@@@OOOOOOOOOOOOOH@@OOOOOOOOOOOOOL@@OOOOOOOOOOOOON@@OOOOOOOOOOOOOO@@OOOOOOOOOOOOOOH@OOOOOOOOOOOOOOL@OOOOOOOOOOOOOON@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQ SKETCH.TITLED.ICON.TEMPLATE (create TITLEDICON ICON _ SKETCH.ICON MASK _ SKETCH.MASK TITLEREG _ (CREATEREGION 5 2 50 30))) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (if (GETD (QUOTE SPY.BUTTON)) then (ADVISE (QUOTE SPY.BUTTON) (QUOTE AFTER) (QUOTE (GRID-WINDOW (OR !VALUE SPY.BUTTON))))) ) (* ;; "Define a nice icon for accessing the list of loaded files") (DEFINEQ (LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN (CL:LAMBDA (W) (* ; "Edited 22-Nov-88 13:57 by smL") (DECLARE (GLOBAL FILELST)) (LET ((NEW-FILE-ITEM "* New file *") (NOTICE-FILE-ITEM "* Sysloaded file *")) (CL:LABELS ((LOADED-FILES NIL "Return a sorted list of names of known loaded files" (SORT (COPY FILELST))) (HIDDEN-FILES NIL "Return a sorted list of names of hidden loaded files" (DECLARE (GLOBALVARS LOADEDFILELST)) (SORT (LDIFFERENCE (for FILE in LOADEDFILELST bind ROOT-NAME eachtime (SETQ ROOT-NAME (FILENAMEFIELD FILE (QUOTE NAME))) until (EQ ROOT-NAME (QUOTE INIT)) when (GET ROOT-NAME (QUOTE FILEDATES)) collect ROOT-NAME) FILELST))) (EDIT-FILECOMS (FILE-NAME) "Edit the filecoms of a file" (ED FILE-NAME (QUOTE (FILES :DONTWAIT :DISPLAY)))) (NOTICE-AND-EDIT-FILE (ITEM MENU BUTTON) "Notice a file and then edit its filecoms" (LET ((FILE (FILENAMEFIELD ITEM (QUOTE NAME)))) (COND ((NULL FILE) NIL) ((NULL (NLSETQ (LOAD FILE (QUOTE PROP)))) (PROMPTPRINT "Error attempting to Notice the file " FILE)) (T (EDIT-FILECOMS FILE))))) (PRINT-FILE-MENU-HELP (ITEM MENU BUTTON) (COND ((NULL ITEM) NIL) ((EQ ITEM NEW-FILE-ITEM) (PROMPTPRINT "Add a new file and edit its filecoms")) ((EQ ITEM NOTICE-FILE-ITEM) (PROMPTPRINT "Prompt for a sysloaded file, Notice its contents, and then edit its filecoms")) (T (PROMPTPRINT "Edit the filecoms of file " ITEM)))) (MENU-ITEM-SELECTED (ITEM MENU BUTTON) (COND ((NULL ITEM) NIL) ((EQ ITEM NEW-FILE-ITEM) (LET ((FILE-NAME (PROGN (CLEARW PROMPTWINDOW) (PROMPTFORWORD "Name of new file (CR to abort): " NIL NIL PROMPTWINDOW NIL T (LIST (CHARCODE EOL)))))) (if FILE-NAME then (SETQ FILE-NAME (U-CASE (MKATOM FILE-NAME))) (SET (FILECOMS FILE-NAME) (BQUOTE (((\, COMMENTFLG) ;;; (\, (CONCAT "New file"))) (DECLARE%: DONTCOPY (PROPS ((\, FILE-NAME) MAKEFILE-ENVIRONMENT) ((\, FILE-NAME) FILETYPE)))))) (PUTPROP FILE-NAME (QUOTE MAKEFILE-ENVIRONMENT) (CL:COPY-TREE *DEFAULT-MAKEFILE-ENVIRONMENT*)) (PUTPROP FILE-NAME (QUOTE FILETYPE) (SELECTQ *DEFAULT-CLEANUP-COMPILER* (TCOMPL :TCOMPL) (BCOMPL :BCOMPL) :COMPILE-FILE)) (ADDFILE FILE-NAME) (EDIT-FILECOMS FILE-NAME) else (PROMPTPRINT "No file added")))) ((EQ ITEM NOTICE-FILE-ITEM) (LET ((HIDDEN-FILES (HIDDEN-FILES))) (IF HIDDEN-FILES then (MENU (create MENU ITEMS _ HIDDEN-FILES TITLE _ "Notice which sysloaded file?" WHENHELDFN _ (CL:FUNCTION (LAMBDA (ITEM MENU BUTTON) (COND (ITEM (PROMPTPRINT "Load-PROP the file " ITEM " and then edit its COMS"))))) WHENSELECTEDFN _ (CL:FUNCTION NOTICE-AND-EDIT-FILE))) else (PROMPTPRINT "No hidden files")))) (T (EDIT-FILECOMS (FILENAMEFIELD ITEM (QUOTE NAME))))))) (COND ((MOUSESTATE LEFT) (MOVEW W)) ((MOUSESTATE MIDDLE) (MENU (create MENU ITEMS _ (BQUOTE ((\,. (LOADED-FILES)) (\, NEW-FILE-ITEM) (\, NOTICE-FILE-ITEM))) TITLE _ "Edit COMS of which file?" WHENHELDFN _ (CL:FUNCTION PRINT-FILE-MENU-HELP) WHENSELECTEDFN _ (CL:FUNCTION MENU-ITEM-SELECTED)))))))) ) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (RPAQQ LOADED-FILES-ICON #*(72 72)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOON@@@CL@@@@@@@@@@@@@AN@@@CHA@B@@@@@@@@@@@N@@@CHB@DCNDDG@@@@@@N@@@CHB@DB@FDHH@@@@@N@@@CHD@HB@FDHH@@@@@N@@@CHD@HCLEDF@@@@@@N@@@CHD@HB@EDA@@@@@@N@@@CHD@HB@DLHH@@@@@N@@@CHD@HB@DLHH@@@@@N@@@CHB@DB@DDG@D@HA@N@@@CHB@D@@@@@@@@@@@N@@@CHA@B@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CHAOOOOOOOO@@@@@N@@@CHAOOOOOOOO@@@@@N@@@CHAH@@@@@@C@@@@@N@@@CHAH@@@@@@C@@@@@N@@@CHAOOOOOOOO@@@@@N@@@CHAL@@@@@@G@@@@@N@@@CH@N@@@@@@N@@@@@N@@@CH@G@@@@@AL@@@@@N@@@CH@CH@@@@CH@@@@@N@@@CH@AL@@@@G@@@@@@N@@@CH@@N@@@@N@@@@@@N@@@CH@@G@@@AL@@@@@@N@@@CH@@CH@@CH@@@@@@N@@@CH@@AL@@G@@@@@@@N@@@CH@@@N@@N@@@@@@@N@@@CH@@@G@AL@@@@@@@N@@@CH@@@CHCH@@@@@@@N@@@CH@@@ALG@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@LF@@@@@@@@N@@@CH@@@@ON@@@@@@@@N@@@CH@@@@GL@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CH@@@@@@@@@@@@@@N@@@CL@@@@@@@@@@@@@AN@@@COOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOL@@@@OOOOOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) (RPAQQ LOADED-FILES-ICON-MASK #*(72 72)@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@OOOOOOOOOOOOOOOH@@@AOOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@COOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOL@@@@OOOOOOOOOOOOOOOH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@) (RPAQ LOADED-FILES-ICON-WINDOW (LET ((W (TITLEDICONW (create TITLEDICON ICON _ LOADED-FILES-ICON MASK _ LOADED-FILES-ICON-MASK TITLEREG _ (CREATEREGION 7 9 55 10)) "Lisp files" NIL (CREATEPOSITION 0 0) T (QUOTE BOTTOM)))) (WINDOWPROP W (QUOTE BUTTONEVENTFN) (QUOTE LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN)) W)) ) (DECLARE%: DONTEVAL@LOAD DONTEVAL@COMPILE (RPAQQ STANDARD-ICON #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@L@@@@@@@@@@AL@@@L@@@@@@@@@@AF@@@L@@@@@@@@@@AC@@@L@@@@@@@@@@AAH@@L@@@@@@@@@@A@L@@L@@@@@@@@@@A@F@@L@@@@@@@@@@A@C@@L@@@@@@@@@@A@AH@L@@@@@@@@@@A@@L@L@@@@@@@@@@A@@F@L@@@@@@@@@@AOOO@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@L@@@@@@@@@@@@@C@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQQ STANDARD-ICON-MASK #*(60 75)OOOOOOOOOOOO@@@@OOOOOOOOOOOOH@@@OOOOOOOOOOOOL@@@OOOOOOOOOOOON@@@OOOOOOOOOOOOO@@@OOOOOOOOOOOOOH@@OOOOOOOOOOOOOL@@OOOOOOOOOOOOON@@OOOOOOOOOOOOOO@@OOOOOOOOOOOOOOH@OOOOOOOOOOOOOOL@OOOOOOOOOOOOOON@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@OOOOOOOOOOOOOOO@) (RPAQ DEFAULTTEXTICON (create TITLEDICON ICON _ STANDARD-ICON MASK _ STANDARD-ICON-MASK TITLEREG _ (CREATEREGION 5 5 50 60))) (RPAQQ DEFAULTICONFN TEXTICON) ) (* ;;; "") (* ;;; "Filemanager stuff") (DECLARE%: DONTCOPY (PUTPROPS GRID-ICONS MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP")) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA) (ADDTOVAR NLAML) (ADDTOVAR LAMA LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN) ) (PUTPROPS GRID-ICONS COPYRIGHT ("Xerox Corporation" 1987 1988)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3792 6715 (ICONW.MOVEFN 3802 . 5681) (\ENSURE.ICON.GRID 5683 . 6110) ( \TRIM-ICON-FILE-TITLE 6112 . 6487) (GRID-WINDOW 6489 . 6713)) (18334 21229 ( LOADED-FILES-ICON-WINDOW-BUTTONEVENTFN 18344 . 21227))))) STOP \ No newline at end of file diff --git a/lispusers/GRID-ICONS.TEDIT b/lispusers/GRID-ICONS.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a4218fce0987e5a0fd365833e483e2ebaeebe4cd GIT binary patch literal 19996 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

?42I3iJ~BQy{zXK; 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