From 6536097c10a645dcbe769455e9ee296f771b2f3c Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Thu, 17 Jul 2025 09:51:15 -0700 Subject: [PATCH 1/5] Move all the proofreader/dictionary files to a proofreader subdirectory --- lispusers/ANALYZER | 1742 ---------------------------------- lispusers/ANALYZER.LCOM | Bin 34773 -> 0 bytes lispusers/ANALYZER.TEDIT | Bin 2279 -> 0 bytes lispusers/DICTTOOL | 1780 ----------------------------------- lispusers/DICTTOOL.LCOM | Bin 38024 -> 0 bytes lispusers/DICTTOOL.TEDIT | 16 - lispusers/PROOFREADER | 613 ------------ lispusers/PROOFREADER.TEDIT | Bin 9531 -> 0 bytes lispusers/WORDNERD | 1553 ------------------------------ 9 files changed, 5704 deletions(-) delete mode 100644 lispusers/ANALYZER delete mode 100644 lispusers/ANALYZER.LCOM delete mode 100644 lispusers/ANALYZER.TEDIT delete mode 100644 lispusers/DICTTOOL delete mode 100644 lispusers/DICTTOOL.LCOM delete mode 100644 lispusers/DICTTOOL.TEDIT delete mode 100644 lispusers/PROOFREADER delete mode 100644 lispusers/PROOFREADER.TEDIT delete mode 100644 lispusers/WORDNERD diff --git a/lispusers/ANALYZER b/lispusers/ANALYZER deleted file mode 100644 index 789f19944..000000000 --- a/lispusers/ANALYZER +++ /dev/null @@ -1,1742 +0,0 @@ -(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 diff --git a/lispusers/ANALYZER.LCOM b/lispusers/ANALYZER.LCOM deleted file mode 100644 index 5c082e2bbe482a3dc1d8d602c316813617a8c29a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34773 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 diff --git a/lispusers/DICTTOOL b/lispusers/DICTTOOL deleted file mode 100644 index e1cd0b746..000000000 --- a/lispusers/DICTTOOL +++ /dev/null @@ -1,1780 +0,0 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - -(FILECREATED " 1-Feb-2022 16:42:35" {DSK}kaplan>Local>medley3.5>my-medley>lispusers>DICTTOOL.;2 92394 - - :CHANGES-TO (VARS DICTTOOLCOMS) - - :PREVIOUS-DATE " 1-Mar-94 10:43:44" -{DSK}kaplan>Local>medley3.5>my-medley>lispusers>DICTTOOL.;1) - - -(* ; " -Copyright (c) 1986-1989, 1991, 1994 by Xerox Corporation. -") - -(PRETTYCOMPRINT DICTTOOLCOMS) - -(RPAQQ DICTTOOLCOMS - ((COMS * DICTTOOLDEPENDENCIES) - (FILES ANALYZER) - - (* ;; "RMK 2022: DICTCLIENT has disappeared") - - (* (FILES (FROM {NFS}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.") - - - (* ;; "3/27/91 jtm: added TEdit interface to the SearchMenu module") - - - (* ;; "3/1/94 jtm: changed the loading of DICTCLIENT and SEARCHMENU") - - (FNS TEDIT.INCLUDESTREAM TEdit.PrintDefinition DictTool.PrintDefinition Dict.PrintDefinition - DictTool.GetEntry TEdit.SetDictionary DictForStream DictTool.Dictionaries PARSEBYCOLONS - PrintPronunciationGuide ConvertPronunciation) - (FNS TEdit.SearchMenu 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"))) - -[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) - - - -(* ;; "RMK 2022: DICTCLIENT has disappeared") - - - - -(* (FILES (FROM {NFS}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.") - - - - -(* ;; "3/27/91 jtm: added TEdit interface to the SearchMenu module") - - - - -(* ;; "3/1/94 jtm: changed the loading of DICTCLIENT and SEARCHMENU") - -(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.SearchMenu - [LAMBDA (stream dict words) (* ; "Edited 1-Mar-94 10:28 by jtm:") - (LOAD? 'SEARCHMENU.MCOM) - (if (NOT (OPENWP SearchMenu)) - then (SearchMenu.Create]) - -(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 27-Mar-91 17:19 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." - ))) - (Relevance% Feedback (FUNCTION TEdit.SearchMenu)) - (|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 1991 1994)) -(DECLARE%: DONTCOPY - (FILEMAP (NIL (6206 19012 (TEDIT.INCLUDESTREAM 6216 . 6727) (TEdit.PrintDefinition 6729 . 8983) ( -DictTool.PrintDefinition 8985 . 11522) (Dict.PrintDefinition 11524 . 12487) (DictTool.GetEntry 12489 - . 12788) (TEdit.SetDictionary 12790 . 14949) (DictForStream 14951 . 15318) (DictTool.Dictionaries -15320 . 15474) (PARSEBYCOLONS 15476 . 16525) (PrintPronunciationGuide 16527 . 17998) ( -ConvertPronunciation 18000 . 19010)) (19013 28606 (TEdit.SearchMenu 19023 . 19253) (TEdit.PrintSearch -19255 . 19705) (DictTool.PrintSearch 19707 . 21970) (DictTool.MergeSearch 21972 . 23800) ( -NerdForStream 23802 . 24112) (TEdit.SetNerd 24114 . 26186) (DictTool.PromptForCutoff 26188 . 26735) ( -DictTool.PromptForKeywordCutoff 26737 . 27385) (PARSESELECTION 27387 . 28604)) (28607 30662 ( -TEdit.PrintPhraseSearch 28617 . 29079) (DictTool.PrintPhraseSearch 29081 . 30660)) (30663 35458 ( -TEdit.PrintSynonyms 30673 . 31002) (REMOVEALL 31004 . 31504) (CONVERTFUNCTIONSTOFORMS 31506 . 31996) ( -TEdit.PrintNounSynonyms 31998 . 32349) (DictTool.PrintNounSynonyms 32351 . 32535) ( -DictTool.PrintVerbSynonyms 32537 . 32721) (DictTool.PrintAdjSynonyms 32723 . 32908) ( -TEdit.PrintVerbSynonyms 32910 . 33252) (TEdit.PrintAdjSynonyms 33254 . 33599) (DictTool.PrintSynonyms -33601 . 35456)) (35459 41047 (DictTool.TEditWrapper 35469 . 38707) (Dict.OutputStream 38709 . 40503) ( -DictTool.PromptStream 40505 . 41045)) (41048 59057 (DictTool.Init 41058 . 42788) (DictTool.Open 42790 - . 46641) (DictTool.OpenDictionary 46643 . 48538) (DictTool.OpenAnalyzer 48540 . 50723) ( -DictTool.OpenNerd 50725 . 54089) (Dict.AddCommands 54091 . 58906) (DictTool.Close 58908 . 59055)) ( -59058 66664 (DictTool.Analyze 59068 . 63116) (DictTool.Analyzers 63118 . 63348) ( -DictTool.Pronunciation 63350 . 63670) (DictTool.Corrections 63672 . 64038) (DictTool.CountWords 64040 - . 66662)) (66703 84035 (DictTool.FindWord 66713 . 68724) (DictTool.SubstituteWord 68726 . 78941) ( -DictTool.CreateConjugationMap 78943 . 81818) (DictTool.FindWordInit 81820 . 84033)) (84036 89838 ( -LingFns.FindWord 84046 . 87864) (LingFns.Capitalize 87866 . 89478) (LingFns.Capitalization 89480 . -89836))))) -STOP diff --git a/lispusers/DICTTOOL.LCOM b/lispusers/DICTTOOL.LCOM deleted file mode 100644 index 2e775e95c4471c8303681a4a52b65860328dab10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38024 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 diff --git a/lispusers/DICTTOOL.TEDIT b/lispusers/DICTTOOL.TEDIT deleted file mode 100644 index 17d488c88..000000000 --- a/lispusers/DICTTOOL.TEDIT +++ /dev/null @@ -1,16 +0,0 @@ -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/PROOFREADER b/lispusers/PROOFREADER deleted file mode 100644 index 846a28edb..000000000 --- a/lispusers/PROOFREADER +++ /dev/null @@ -1,613 +0,0 @@ -(FILECREATED "13-Oct-87 12:01:34" {QV}TOOLS>PROOFREADER.;34 22618 - - changes to: (FNS Proofreader.New) - - previous date: " 6-Feb-87 16:02:15" {QV}TOOLS>PROOFREADER.;33) - - -(* Copyright (c) 1985, 1986, 1987 by Xerox Corporation. All rights reserved.) - -(PRETTYCOMPRINT PROOFREADERCOMS) - -(RPAQQ PROOFREADERCOMS [(FILES ANALYZER SPELLINGARRAY) - (FNS Proofreader.New Proofreader.Open Proofreader.AddEntry - Proofreader.Lookup Proofreader.AllForms) - (FNS Proofreader.CharTable Proofreader.LookupBit Proofreader.SetBit) - (FNS Proofreader.Correct Proofreader.NextWord) - (MACROS Proofreader.Hash1 Proofreader.Hash2 \Proofreader.TestCorruption) - (INITVARS Proofreader Proofreader.AutoLoad Proofreader.Lisp) - (* Proofreader.AutoLoad is a file or list of files to be loaded whenever a - proofreader is opened.) - (P (Analyzer.Establish (SETQ Proofreader (Proofreader.New (QUOTE - Proofreader]) -(FILESLOAD ANALYZER SPELLINGARRAY) -(DEFINEQ - -(Proofreader.New - [LAMBDA (name fileName) (* jtm: "13-Oct-87 11:57") - (PROG [(analyzer (create Morphalyzer - analyzerName _ name - openFn _(FUNCTION Proofreader.Open) - lookupFn _(FUNCTION Proofreader.Lookup) - addEntryFn _(FUNCTION Proofreader.AddEntry] - (RETURN analyzer]) - -(Proofreader.Open - [LAMBDA (analyzer stream) (* jtm: " 6-Feb-87 15:24") - (COND - ((NULL (fetch (Morphalyzer index) of analyzer)) - [replace (Morphalyzer index) of analyzer - with (PROG [(file (Analyzer.Prop analyzer (QUOTE FileName] - [COND - ((AND (NULL SpellingArray) - (NULL file)) - (ERROR "No Spelling Array for" analyzer)) - ((NULL SpellingArray) - (COND - ((NULL stream) - (PROMPTPRINT "initializing Proofreader")) - (T (TEDIT.PROMPTPRINT stream "initializing Proofreader" T))) - (RESETLST (PROG (LENGTH ALENGTH BLOCK STREAM (START 0) - (HEADERSIZE 6)) - [RESETSAVE (SETQ STREAM (OPENSTREAM - file - (QUOTE INPUT) - (QUOTE OLD))) - (QUOTE (PROGN (CLOSEF OLDVALUE] - (SETQ LENGTH (IDIFFERENCE (GETFILEINFO - file - (QUOTE LENGTH)) - (IPLUS HEADERSIZE 2) - )) - (for i from 1 to HEADERSIZE - do (BIN STREAM)) - (* skip header) - (while (ILESSP START LENGTH) - do (SETQ ALENGTH (MIN 64000 - (IDIFFERENCE - LENGTH START))) - (SETQ BLOCK - (\ALLOCBLOCK (LRSH (IPLUS 3 ALENGTH) - 2))) - (\BINS STREAM BLOCK 0 ALENGTH) - (add START ALENGTH) - (push SpellingArray (CONS START BLOCK))) - (SETQ SpellingArray (REVERSE SpellingArray] - (RETURN (CONS SpellingArray (Proofreader.CharTable] - (for file inside Proofreader.AutoLoad do (Analyzer.DefaultLoadWordList analyzer file]) - -(Proofreader.AddEntry - [LAMBDA (analyzer lemma entry dontRecord) (* jtm: " 6-Feb-87 15:24") - - (* * adds "lemma" to the SpellingArray. This procedure is just like Lookup, only it sets the bits rather than just  - reading them.) - - - (PROG (char p x1 x2 x3 x4 x5 x6 x7 hash1 hash2 hash3 hash4 hash5 hash6 hash7 hashArray - hashArray.CharTable start length) (* first save the word on a property list.) - (COND - ((NULL dontRecord) - (Analyzer.PushProp analyzer (QUOTE WordList) - lemma))) - (SETQ hashArray (fetch (Morphalyzer index) of analyzer)) - [COND - ((NULL entry) - (SETQ entry (Proofreader.AllForms lemma] - [COND - ((NULL hashArray) - (Proofreader.Open analyzer) - (SETQ hashArray (fetch (Morphalyzer index) of analyzer] - (SETQ hashArray.CharTable (CDR hashArray)) - (SETQ hashArray (CAR hashArray)) - (SETQ hash1 953) - (SETQ hash2 63869) - (SETQ hash3 2441) - (SETQ hash4 62265) - (SETQ hash5 4079) - (SETQ hash6 60585) - (SETQ hash7 5807) - (SETQ p 359) - (Stream.Init lemma start length) - (while (SETQ char (Stream.NextChar lemma length start)) - do [COND - ((ALPHACHARP char) - (SETQ char (ELT hashArray.CharTable (IDIFFERENCE char 64] - (add p 1009) - (SETQ x1 (LOGAND 65535 (IDIFFERENCE (LOGXOR char (Proofreader.Hash1 - hash2)) - p))) - [SETQ x2 (LOGAND 65535 (IDIFFERENCE p (IDIFFERENCE (Proofreader.Hash2 - hash3) - char] - [SETQ x3 (LOGAND 65535 (LOGXOR p (IDIFFERENCE (Proofreader.Hash1 hash4) - char] - (SETQ x4 (LOGAND 65535 (IDIFFERENCE (IDIFFERENCE char (Proofreader.Hash2 - hash5)) - p))) - (SETQ x5 (LOGAND 65535 (IDIFFERENCE (LOGXOR char (Proofreader.Hash1 - hash6)) - p))) - (SETQ x6 (LOGAND 65535 (IDIFFERENCE (IDIFFERENCE (Proofreader.Hash2 - hash7) - char) - p))) - [SETQ x7 (LOGAND 65535 (IDIFFERENCE p (IDIFFERENCE (Proofreader.Hash1 - hash1) - char] - (SETQ hash1 x1) - (SETQ hash2 x2) - (SETQ hash3 x3) - (SETQ hash4 x4) - (SETQ hash5 x5) - (SETQ hash6 x6) - (SETQ hash7 x7)) - - (* * set the bits.) - - - (Proofreader.SetBit hash1 hash7 hashArray) - (Proofreader.SetBit hash2 hash6 hashArray) - (Proofreader.SetBit hash3 hash5 hashArray) - (Proofreader.SetBit hash4 hash4 hashArray) - (Proofreader.SetBit hash5 hash3 hashArray) - (Proofreader.SetBit hash6 hash2 hashArray) - (Proofreader.SetBit hash7 hash1 hashArray) - (RETURN lemma]) - -(Proofreader.Lookup - [LAMBDA (analyzer stream start length) (* jtm: " 6-Feb-87 15:25") - - (* * hashes the string into the array using a probabalistic technique. This may produce a false positive.) - - - (PROG (char word p x1 x2 x3 x4 x5 x6 x7 hash1 hash2 hash3 hash4 hash5 hash6 hash7 hashArray - hashArray.CharTable) - (SETQ hashArray (fetch (Morphalyzer index) of analyzer)) - [COND - ((NULL hashArray) - (Proofreader.Open analyzer) - (SETQ hashArray (fetch (Morphalyzer index) of analyzer] - (SETQ hashArray.CharTable (CDR hashArray)) - (SETQ hashArray (CAR hashArray)) - (SETQ hash1 953) - (SETQ hash2 63869) - (SETQ hash3 2441) - (SETQ hash4 62265) - (SETQ hash5 4079) - (SETQ hash6 60585) - (SETQ hash7 5807) - (SETQ p 359) - (Stream.Init stream start length) - (while (SETQ char (Stream.NextChar stream length start)) - do [COND - ((IGREATERP char 255) - (SETQ char (IMOD char 256] - [COND - ((ALPHACHARP char) - (SETQ char (ELT hashArray.CharTable (IDIFFERENCE char 64] - (add p 1009) - (SETQ x1 (LOGAND 65535 (IDIFFERENCE (LOGXOR char (Proofreader.Hash1 - hash2)) - p))) - [SETQ x2 (LOGAND 65535 (IDIFFERENCE p (IDIFFERENCE (Proofreader.Hash2 - hash3) - char] - [SETQ x3 (LOGAND 65535 (LOGXOR p (IDIFFERENCE (Proofreader.Hash1 hash4) - char] - (SETQ x4 (LOGAND 65535 (IDIFFERENCE (IDIFFERENCE char (Proofreader.Hash2 - hash5)) - p))) - (SETQ x5 (LOGAND 65535 (IDIFFERENCE (LOGXOR char (Proofreader.Hash1 - hash6)) - p))) - (SETQ x6 (LOGAND 65535 (IDIFFERENCE (IDIFFERENCE (Proofreader.Hash2 - hash7) - char) - p))) - [SETQ x7 (LOGAND 65535 (IDIFFERENCE p (IDIFFERENCE (Proofreader.Hash1 - hash1) - char] - (SETQ hash1 x1) - (SETQ hash2 x2) - (SETQ hash3 x3) - (SETQ hash4 x4) - (SETQ hash5 x5) - (SETQ hash6 x6) - (SETQ hash7 x7)) - (COND - ((AND (Proofreader.LookupBit hash1 hash7 hashArray) - (Proofreader.LookupBit hash2 hash6 hashArray) - (Proofreader.LookupBit hash3 hash5 hashArray) - (Proofreader.LookupBit hash4 hash4 hashArray) - (Proofreader.LookupBit hash5 hash3 hashArray) - (Proofreader.LookupBit hash6 hash2 hashArray) - (Proofreader.LookupBit hash7 hash1 hashArray)) - (RETURN T]) - -(Proofreader.AllForms - [LAMBDA (lemma) (* jtm: " 6-Feb-87 15:25") - - (* * ask the user for the forms to fill out this word.) - - - (PROG (forms form newForms menuPos) - (SETQ forms (LIST (QUOTE NOUN) - (QUOTE VERB) - (QUOTE ADJ) - (English.Suffix lemma "s") - (English.Suffix lemma "s") - (English.Suffix lemma "er") - " " - (English.Suffix lemma "ed") - (English.Suffix lemma "est") - " " - (English.Suffix lemma "ing") - " " " " (QUOTE *OTHER*))) - (while [SETQ form - (MENU (create MENU - TITLE _ "parts of speech" - CENTERFLG _ T - ITEMS _ forms - MENUCOLUMNS _ 3 - CHANGEOFFSETFLG _ T - MENUPOSITION _(COND - (menuPos) - (T (GETMOUSESTATE) - (SETQ menuPos (CONS LASTMOUSEX LASTMOUSEY] - do (pushnew newForms form)) - (RETURN newForms]) -) -(DEFINEQ - -(Proofreader.CharTable - [LAMBDA NIL (* jtm: " 6-Feb-87 15:27") - - (* * comment) - - - (PROG (SpellingArray.CharTable) - (SETQ SpellingArray.CharTable (ARRAY 58)) - (for i in (QUOTE (0 32)) - do (SETA SpellingArray.CharTable (IPLUS i 1) - 65325) - (SETA SpellingArray.CharTable (IPLUS i 2) - 65204) - (SETA SpellingArray.CharTable (IPLUS i 3) - 449) - (SETA SpellingArray.CharTable (IPLUS i 4) - 588) - (SETA SpellingArray.CharTable (IPLUS i 5) - 7102) - (SETA SpellingArray.CharTable (IPLUS i 6) - 64682) - (SETA SpellingArray.CharTable (IPLUS i 7) - 64545) - (SETA SpellingArray.CharTable (IPLUS i 8) - 64418) - (SETA SpellingArray.CharTable (IPLUS i 9) - 1278) - (SETA SpellingArray.CharTable (IPLUS i 10) - 1433) - (SETA SpellingArray.CharTable (IPLUS i 11) - 63968) - (SETA SpellingArray.CharTable (IPLUS i 12) - 63827) - (SETA SpellingArray.CharTable (IPLUS i 13) - 1874) - (SETA SpellingArray.CharTable (IPLUS i 14) - 2027) - (SETA SpellingArray.CharTable (IPLUS i 15) - 2180) - (SETA SpellingArray.CharTable (IPLUS i 16) - 63195) - (SETA SpellingArray.CharTable (IPLUS i 17) - 63058) - (SETA SpellingArray.CharTable (IPLUS i 18) - 62865) - (SETA SpellingArray.CharTable (IPLUS i 19) - 2798) - (SETA SpellingArray.CharTable (IPLUS i 20) - 2963) - (SETA SpellingArray.CharTable (IPLUS i 21) - 62372) - (SETA SpellingArray.CharTable (IPLUS i 22) - 62216) - (SETA SpellingArray.CharTable (IPLUS i 23) - 62067) - (SETA SpellingArray.CharTable (IPLUS i 24) - 3624) - (SETA SpellingArray.CharTable (IPLUS i 25) - 3793) - (SETA SpellingArray.CharTable (IPLUS i 26) - 3944)) - (RETURN SpellingArray.CharTable]) - -(Proofreader.LookupBit - [LAMBDA (row column SpellingArray) (* jtm: " 6-Feb-87 15:27") - - (* * There are 4096 bits per row, but only 4093 of them are used.) - - - (PROG (byte (startByte 0)) - (SETQ row (IMOD row 199)) - (SETQ column (IMOD column 4093)) - (SETQ byte (IPLUS (LLSH row 9) - (LRSH column 3))) - (for block in SpellingArray - do (COND - ((ILESSP byte (CAR block)) - (SETQ byte (\GETBASEBYTE (CDR block) - (IDIFFERENCE byte startByte))) - (RETURN))) - (SETQ startByte (CAR block))) - (RETURN (BITTEST byte (MASK.1'S (IDIFFERENCE 7 (LOGAND column 7)) - 1]) - -(Proofreader.SetBit - [LAMBDA (row column SpellingArray) (* jtm: " 6-Feb-87 15:28") - - (* * There are 4096 bits per row, but only 4093 of them are used.) - - - (PROG (address (startByte 0)) - (SETQ row (IMOD row 199)) - (SETQ column (IMOD column 4093)) - (SETQ address (IPLUS (LLSH row 9) - (LRSH column 3))) - (for block byte in SpellingArray - do (COND - ((ILESSP address (CAR block)) - (SETQ byte (\GETBASEBYTE (CDR block) - (IDIFFERENCE address startByte))) - (SETQ byte (BITSET byte (MASK.1'S (IDIFFERENCE 7 (LOGAND column 7)) - 1))) - (\PUTBASEBYTE (CDR block) - (IDIFFERENCE address startByte) - byte) - (RETURN))) - (SETQ startByte (CAR block]) -) -(DEFINEQ - -(Proofreader.Correct - [LAMBDA (analyzer stream start length) (* jtm: " 6-Feb-87 15:28") - - (* * returns a list of possible spelling corrections for the given word.) - - - (PROG (form word wordList caps periods) - [COND - ((NOT (LISTP stream)) - (SETFILEPTR stream start) - (SETQ word (for i from 1 to length collect (READC stream] - (SETQ caps (Analyzer.Capitalization word)) - (SETQ periods (FMEMB (QUOTE %.) - 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 (QUOTE FIRST)) - (EQ tail word)) (* don't transpose the first letters of a capitalized  - word.) - NIL) - (T (\Proofreader.TestCorruption analyzer word wordList))) - (RPLACA (CDR tail) - (CAR tail)) - (RPLACA tail temp)) - - (* * next try deletions) - - - (COND - ((CDR word) - (\Proofreader.TestCorruption analyzer (CDR word) - wordList))) - (for tail temp on word while (CDR tail) - do (SETQ temp (CDR tail)) - (RPLACD tail (CDDR tail)) - (\Proofreader.TestCorruption analyzer word wordList) - (RPLACD tail temp)) - - (* * prepend a character.) - - - (SETQ word (CONS (QUOTE 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 (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList))) - (for c from (CHARCODE a) to (CHARCODE z) - do (RPLACA word (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList))) - (SETQ word (CDR word)) - - (* * insert characters.) - - - (for tail on word - do (RPLACD tail (CONS (QUOTE A) - (CDR tail))) - [COND - ((EQ caps (QUOTE ALL)) - (for c from (CHARCODE A) to (CHARCODE Z) - do (RPLACA (CDR tail) - (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList))) - (T (for c from (CHARCODE a) to (CHARCODE z) - do (RPLACA (CDR tail) - (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList] - (COND - (periods (RPLACA (CDR tail) - (QUOTE %.)) - (\Proofreader.TestCorruption analyzer word wordList))) - (RPLACD tail (CDDR tail))) - - (* * replace characters) - - - (for tail temp on word - do (SETQ temp (CAR tail)) - [COND - ((OR (EQ caps (QUOTE ALL)) - (AND (EQ caps (QUOTE FIRST)) - (EQ tail word))) - (for c from (CHARCODE A) to (CHARCODE Z) - do (COND - ((NEQ temp (CHARACTER c)) - (RPLACA tail (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList] - [COND - ((OR (EQ caps NIL) - (NOT (ALPHACHARP (CHCON1 temp))) - (AND (EQ caps (QUOTE FIRST)) - (NEQ tail word))) - (for c from (CHARCODE a) to (CHARCODE z) - do (COND - ((NEQ temp (CHARACTER c)) - (RPLACA tail (CHARACTER c)) - (\Proofreader.TestCorruption analyzer word wordList] - (COND - (periods (RPLACA tail (QUOTE %.)) - (\Proofreader.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 (CDDR i] - (RETURN wordList]) - -(Proofreader.NextWord - [LAMBDA (analyzer stream startPtr searchLength NWFn) (* jtm: " 6-Feb-87 15:29") - - (* * 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 period number (filePtr _(GETFILEPTR - stream)) - (EOFPtr _(GETEOFPTR stream)) first (SETQ endPtr (COND - (searchLength (IMIN EOFPtr (IPLUS startPtr - searchLength))) - (T 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] - (COND - (number (* we have a number followed by some characters. - (e.g. 7th, 21st, etc.) Take in the last digit of the  - number.) - (add start -1) - (SETQ number NIL))) - (COND - (quote (COND - ((EQ quote T) (* don't make a list until you need to.) - (SETQ quote NIL))) - (push quote char))) - (COND - (period (COND - ((EQ period T) - (SETQ period NIL))) - (push period char] - ((AND start char (EQUAL char (CHARCODE '))) - (* if the quote is in the middle of a word, leave it  - in.) - (SETQ quote T)) - ((AND start char (EQUAL char (CHARCODE %.))) - (* look for e.g., i.e.) - (OR period (SETQ period T))) - (start (SETQ end (GETFILEPTR stream)) - (SETQ length (IDIFFERENCE end start)) - (AND char (add length -1)) (* back up to the last legal char.) - (COND - ((EQ quote T) (* delete final quotes) - (add length -1)) - ([OR (EQUAL quote (QUOTE (115))) - (EQUAL quote (QUOTE (83] (* delete 's) - (add length -2))) - (SETQ quote NIL) - (COND - ((EQ period T) (* delete final periods) - (add length -1))) - (SETQ period NIL) - (COND - ((AND (EQ length 1) - (EQ char (CHARCODE %)))) - (* letters used for outlines.) - (add length 1))) - [COND - [NWFn (SETQ value (APPLY* NWFn analyzer stream start length)) - (COND - ((EQ value T) - (RETURN (CONS start length))) - (value (RETURN value] - (T (RETURN (CONS start length] - (SETFILEPTR stream end) - (SETQ start NIL)) - ((AND char (NUMBERP char) - (IGEQ char 48) - (ILEQ char 57)) (* a number) - (SETQ number char)) - (T (SETQ number NIL))) - (OR char (RETURN]) -) -(DECLARE: EVAL@COMPILE - -(PUTPROPS Proofreader.Hash1 MACRO - ((X) - (IPLUS (LLSH (LOGAND X 2047) - 5) - (LRSH X 11)))) - -(PUTPROPS Proofreader.Hash2 MACRO - ((X) - (IPLUS (LLSH (LOGAND X 8191) - 3) - (LRSH X 13)))) - -(PUTPROPS \Proofreader.TestCorruption MACRO - [(analyzer word wordList) - (COND - ((Proofreader.Lookup analyzer word NIL NIL) - (push wordList (CONCATLIST word]) -) - -(RPAQ? Proofreader NIL) - -(RPAQ? Proofreader.AutoLoad NIL) - -(RPAQ? Proofreader.Lisp NIL) - - - -(* Proofreader.AutoLoad is a file or list of files to be loaded whenever a proofreader is -opened.) - -[Analyzer.Establish (SETQ Proofreader (Proofreader.New (QUOTE Proofreader] -(PUTPROPS PROOFREADER COPYRIGHT ("Xerox Corporation" 1985 1986 1987)) -(DECLARE: DONTCOPY - (FILEMAP (NIL (1007 10101 (Proofreader.New 1017 . 1378) (Proofreader.Open 1380 . 3320) ( -Proofreader.AddEntry 3322 . 6312) (Proofreader.Lookup 6314 . 9110) (Proofreader.AllForms 9112 . 10099) -) (10102 13915 (Proofreader.CharTable 10112 . 12273) (Proofreader.LookupBit 12275 . 13040) ( -Proofreader.SetBit 13042 . 13913)) (13916 21770 (Proofreader.Correct 13926 . 18270) ( -Proofreader.NextWord 18272 . 21768))))) -STOP diff --git a/lispusers/PROOFREADER.TEDIT b/lispusers/PROOFREADER.TEDIT deleted file mode 100644 index 83120495b7f6f79a379c1620875f639362585cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9531 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 diff --git a/lispusers/WORDNERD b/lispusers/WORDNERD deleted file mode 100644 index efb0b11d7..000000000 --- a/lispusers/WORDNERD +++ /dev/null @@ -1,1553 +0,0 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "18-Nov-88 10:52:55" {ERINYES}MEDLEY>WORDNERD.;1 82616 - - changes to%: (FNS WordNerd.DefaultVennSearch WordNerd.DefaultWeightedSearch - HashfileNerd.ExpandKeyPattern HashfileNerd.MapKeys HashfileNerd.Create) - (VARS WORDNERDCOMS) - (MACROS WordNerd.ExpandKeyPattern) - (RECORDS WNKEYSETINFO WNKEYINFO) - - previous date%: "11-Nov-88 17:23:39" {QV}LISP>WORDNERD.;24) - - -(* " -Copyright (c) 1988 by Xerox Corporation. All rights reserved. -") - -(PRETTYCOMPRINT WORDNERDCOMS) - -(RPAQQ WORDNERDCOMS - ((* * The following macros are the interface to three different search techniques using a - WordNerd. The default implementations are given below.) - (MACROS WordNerd.Open WordNerd.Close WordNerd.AddAssociation WordNerd.MapKeys - WordNerd.ExpandKeyPattern WordNerd.VennSearch WordNerd.RelevanceSearch - WordNerd.WeightedSearch) - (FNS WordNerd.AddEntry WordNerd.AddDictionary WordNerd.AddStopWords WordNerd.SortByFrequency) - (FNS WordNerd.DefaultVennSearch) - (FNS WordNerd.DefaultWeightedSearch AddWeightsToArray FindTopElements AddToPriorityList) - (FNS WordNerd.DefaultRelevanceSearch MergeKeywords) - (FNS WORDNERD.PARSEINPUT) - (RECORDS WNKEYINFO) - (* * SimpleNerd is an in-core version of the WordNerd.) - (COMS (FNS SimpleNerd.Create SimpleNerd.AddAssociation SimpleNerd.MapKeys SimpleNerd.GetEntry - SimpleNerd.MaxEntry SimpleNerd.GetHeader SimpleNerd.ParseDictEntry SimpleNerd.Test - )) - (* * HashfileNerd stores its data structures in an InterLisp hashfile.) - (COMS (FNS HashfileNerd.Create HashfileNerd.Test HashfileNerd.Open HashfileNerd.Close - HashfileNerd.Write SIMPLETYPE HashfileNerd.AddAssociation HashfileNerd.GetEntry - HashfileNerd.ExpandKeyPattern HashfileNerd.MapKeys) - (FNS BIGHASH BIGGETHASH BIGHASHSIZE BIGMAPHASH BIGPUTHASH) - (MACROS BIGHASHP) - (RECORDS BIGHASH)) - (* * the following should be merged into ANALYZER eventually.) - (COMS (FNS FileDict.Create FileDict.AddFiles FileDict.PrintEntry FileDict.Write - FileDict.Lookup FileDict.MapEntries FETCHSTRINGFROMFILE) - (FNS SimpleAnalyzer.Create SimpleAnalyzer.Lookup) - (FNS SimpleDict.Create SimpleDict.Open SimpleDict.Close SimpleDict.Write)) - (VARS ENGLISHSTOPWORDS))) - (* * The following macros are the interface to three different search techniques using a WordNerd. -The default implementations are given below.) - -(DECLARE%: EVAL@COMPILE - -(PUTPROPS WordNerd.Open MACRO ((WORDNERD) - (APPLY* (OR (InvertedDict.Prop WORDNERD 'OPENFN) - (FUNCTION NILL)) - WORDNERD))) - -(PUTPROPS WordNerd.Close MACRO ((WORDNERD) - (APPLY* (OR (InvertedDict.Prop WORDNERD 'CLOSEFN) - (FUNCTION NILL)) - WORDNERD))) - -(PUTPROPS WordNerd.AddAssociation MACRO ((WORDNERD HEADER KEY) - (APPLY* (InvertedDict.Prop WORDNERD - 'ADDASSOCIATIONFN) - WORDNERD HEADER KEY))) - -(PUTPROPS WordNerd.MapKeys MACRO ((WORDNERD MAPFN) - (APPLY* (OR (InvertedDict.Prop WORDNERD 'MAPKEYSFN) - (FUNCTION NILL)) - WORDNERD MAPFN))) - -(PUTPROPS WordNerd.ExpandKeyPattern MACRO ((WORDNERD KEYPATTERN) - (APPLY* (OR (InvertedDict.Prop WORDNERD - 'EXPANDKEYPATTERNFN) - (FUNCTION NILL)) - WORDNERD KEYPATTERN))) - -(PUTPROPS WordNerd.VennSearch MACRO ((WORDNERD SYNONYMCLASSES MINKEYWORDS MINWORD MAXWORD - DONTCONVERT) - (APPLY* (InvertedDict.Prop WORDNERD 'VENNSEARCHFN) - WORDNERD SYNONYMCLASSES MINKEYWORDS MINWORD - MAXWORD DONTCONVERT))) - -(PUTPROPS WordNerd.RelevanceSearch MACRO ((WORDNERD HEADERS KEYSTOIGNORE MINWORD MAXWORD) - (APPLY* (InvertedDict.Prop WORDNERD - 'RELEVANCESEARCHFN) - WORDNERD HEADERS KEYSTOIGNORE MINWORD - MAXWORD))) - -(PUTPROPS WordNerd.WeightedSearch MACRO ((WORDNERD WEIGHTEDKEYS MINWORD MAXWORD - USEFREQWEIGHTS) - (APPLY* (InvertedDict.Prop WORDNERD - 'WEIGHTEDSEARCHFN) - WORDNERD WEIGHTEDKEYS MINWORD MAXWORD - USEFREQWEIGHTS))) -) -(DEFINEQ - -(WordNerd.AddEntry - [LAMBDA (WORDNERD HEADER ENTRY ANALYZER) (* ; "Edited 14-Sep-88 09:25 by jtm:") - (LET (ADDASSOCFN) - [COND - ((NULL ANALYZER) - (SETQ ANALYZER (InvertedDict.Prop WORDNERD 'ANALYZER] - (SETQ ADDASSOCFN (InvertedDict.Prop WORDNERD 'ADDASSOCIATIONFN)) - (Analyzer.Analyze ANALYZER ENTRY NIL NIL (FUNCTION (LAMBDA (ANALYZER STREAM START LENGTH VAL - ) - (APPLY* ADDASSOCFN WORDNERD HEADER - (OR VAL - (STREAM.FETCHSTRING STREAM - START LENGTH NIL T))) - NIL]) - -(WordNerd.AddDictionary - [LAMBDA (WORDNERD DICTIONARY ANALYZER) (* ; "Edited 14-Sep-88 10:11 by jtm:") - [COND - ((NULL ANALYZER) - (SETQ ANALYZER (InvertedDict.Prop WORDNERD 'ANALYZER] - (Dict.MapEntries DICTIONARY (COND - [(EQ (FUNCTION SimpleDict.MapEntries) - (fetch (Dict mapFn) of DICTIONARY)) - (* this is a hack until we fix - SimpleDict.MapEntries) - (FUNCTION (LAMBDA (DICT HEADER ENTRY) - (WordNerd.AddEntry WORDNERD (CONCATLIST HEADER) - ENTRY ANALYZER] - (T (FUNCTION (LAMBDA (DICT HEADER ENTRY) - (WordNerd.AddEntry WORDNERD HEADER ENTRY - ANALYZER]) - -(WordNerd.AddStopWords - [LAMBDA (WORDNERD STOPWORDS) (* ; "Edited 15-Sep-88 17:12 by jtm:") - (for WORD inside STOPWORDS do (WordNerd.AddAssociation WORDNERD :STOPWORD WORD)) - WORDNERD]) - -(WordNerd.SortByFrequency - [LAMBDA (WORDNERD MINCOUNT) (* ; "Edited 25-Oct-88 13:34 by jtm:") - (LET (ENTRIES) - [WordNerd.MapKeys WORDNERD (FUNCTION (LAMBDA (NERD KEYWORD KEYID ASSOCS) - (DECLARE (SPECVARS MINCOUNT)) - (LET (FREQ) - [SETQ FREQ (COND - ((LISTP ASSOCS) - (LENGTH ASSOCS] - (COND - ((AND FREQ (OR (NULL MINCOUNT) - (ILEQ MINCOUNT FREQ))) - (push ENTRIES (LIST FREQ KEYWORD] - [SETQ ENTRIES (SORT ENTRIES (FUNCTION (LAMBDA (A B) - (IGREATERP (CAR A) - (CAR B] - ENTRIES]) -) -(DEFINEQ - -(WordNerd.DefaultVennSearch - [LAMBDA (wordNerd synonymClasses minKeywords minWord maxWord dontConvert) - (* ; "Edited 17-Nov-88 17:14 by jtm:") - (LET (analyzer keys venn first keySet keySetWeight keySetInfo notFound priorSet headerIndex - keyIndex indexFile GetKeyIDFn GetHeaderFn GetBufferFn GetEntryFn ExpandKeyPatternFn - (n 0)) - - (* ;; "initialize the word nerd") - - [COND - ((AND wordNerd (LITATOM wordNerd)) - (SETQ wordNerd (InvertedDictFromName wordNerd] - [COND - ((NULL wordNerd) - (SETQ wordNerd (CAR InvertedDict.List] - (WordNerd.Open wordNerd) - - (* ;; "canonicalize the user input") - - [COND - ((STRINGP synonymClasses) - (SETQ synonymClasses (WORDNERD.PARSEINPUT wordNerd synonymClasses] - - (* ;; "cache the object-oriented fields and functions in local variables.") - - (SETQ headerIndex (fetch (INVERTEDDICT HEADERINDEX) of wordNerd)) - (SETQ keyIndex (fetch (INVERTEDDICT KEYINDEX) of wordNerd)) - (SETQ indexFile (fetch (INVERTEDDICT INDEXFILE) of wordNerd)) - (SETQ GetKeyIDFn (InvertedDict.Prop wordNerd 'GETKEYIDFN)) - (SETQ GetEntryFn (InvertedDict.Prop wordNerd 'GETENTRYFN)) - (SETQ GetHeaderFn (InvertedDict.Prop wordNerd 'GETHEADERFN)) - (SETQ GetBufferFn (InvertedDict.Prop wordNerd 'GETBUFFERFN)) - (SETQ ExpandKeyPatternFn (InvertedDict.Prop wordNerd 'EXPANDKEYPATTERNFN)) - - (* ;; - "synonymClasses is a list of lists of words, where each sub-list represents a class of synonyms") - - [for synonymClass wordList inside synonymClasses - do (SETQ wordList NIL) - - (* ;; "build wordlist, a concatenation of the entries in the synonym class") - - [for pattern inside synonymClass - do (for word word# entry - inside (OR (AND ExpandKeyPatternFn (STRPOS '* pattern) - (APPLY* ExpandKeyPatternFn wordNerd pattern)) - pattern) - do (COND - [[SETQ word# (COND - ((OR (NUMBERP word) - (NULL GetKeyIDFn)) - word) - (T (APPLY* GetKeyIDFn wordNerd word keyIndex - ] - (SETQ entry (APPLY* GetEntryFn wordNerd word# indexFile)) - (COND - ((OR (EQ entry :STOPWORD) - (EQ -1 (CAR entry))) - (SETQ entry NIL))) - (SETQ wordList (COND - ((LISTP synonymClass) - (* ; - "NCONC would destructively modify the wordNerd's entry.") - (APPEND entry wordList)) - (T entry] - (T (push notFound (create WNKEYINFO - WNKEY _ (LIST (CONCAT word "?"] - (SETQ wordList (SORT wordList (FUNCTION ILESSP))) - (* ; - "SORT may modify the entry, but shouldn't be a problem.") - - (* ;; "add the word list to the list of key associations") - - (AND wordList (push keys (create WNKEYINFO - WNKEY _ (COND - [(LISTP synonymClass) - (COND - ((CDR synonymClass) - (CONCAT (CAR synonymClass) - "+")) - (T (CAR synonymClass] - (T synonymClass)) - WNKEYWEIGHT _ (IQUOTIENT 10000 (LENGTH wordList - )) - WNKEYDATA _ wordList] - (SETQ keys (DREVERSE keys)) - - (* ;; "determine the minimum number of keys for a word to be included in the result") - - (OR minKeywords (SETQ minKeywords 2)) - (COND - ((ILEQ minKeywords 0) - (SETQ minKeywords (IPLUS (LENGTH keys) - minKeywords))) - ((ILESSP (LENGTH keys) - minKeywords) - (SETQ minKeywords 1))) - - (* ;; "set up minWord and maxWord") - - (COND - ((NULL minWord) - (SETQ minWord 0)) - ((EQ minWord 1) (* ; - "minWord = 0 allows notFound to be returned.") - (SETQ minWord 0))) - (COND - ((OR (NULL maxWord) - (EQ maxWord 0)) - (SETQ maxWord 65000))) - - (* ;; "now skim the classes off of the top of the lists in alphabetical order, putting them in a Venn diagram") - - [do (* ; - "find the lowest numbered entry in the word lists") - (SETQ first NIL) - [for keyInfo myFirst in keys do (SETQ myFirst - (CAR (fetch WNKEYDATA of keyInfo - ))) - (COND - ((OR (NULL first) - (AND myFirst (ILESSP myFirst first - ))) - (SETQ first myFirst] - (COND - ((NULL first) (* ; "all of the word lists are empty") - (RETURN)) - (T - (* ;; "make a list of all of the classes that have 'first' in their word list. Remove 'first' from the word lists") - - (SETQ keySet NIL) - (SETQ keySetWeight 0) - [for keyInfo myFirst myKey in keys - do (SETQ myKey (fetch WNKEY of keyInfo)) - (SETQ myFirst (CAR (fetch WNKEYDATA of keyInfo))) - (COND - ((AND myFirst (EQP first myFirst)) - (COND - ((NULL keySet) - (push keySet myKey)) - (T (NCONC1 keySet myKey))) - (add keySetWeight (fetch WNKEYWEIGHT of keyInfo)) - - (* ;; "eliminate multiple entries") - - (while (AND (SETQ myFirst (CAR (fetch WNKEYDATA - of keyInfo))) - (EQP myFirst first)) - do (pop (fetch WNKEYDATA of keyInfo] - (* ; - "put 'first' in the appropriate venn diagram entry") - (COND - ((IGEQ (LENGTH keySet) - minKeywords) (* ; - "skip single classes if we were given multiple key classes") - (COND - ([NOT (SETQ keySetInfo (for set in venn - thereis (EQUAL keySet - (fetch WNKEY - of set] - (SETQ keySetInfo (create WNKEYINFO - WNKEY _ keySet - WNKEYWEIGHT _ keySetWeight)) - (push venn keySetInfo))) - (push (fetch WNKEYDATA of keySetInfo) - first] - -(* ;;; "sort the venn diagram so that the classes that are in the most overlaps come first") - - [SORT venn (FUNCTION (LAMBDA (A B) - (LET [(ALEN (LENGTH (fetch WNKEY of A))) - (BLEN (LENGTH (fetch WNKEY of B] - (COND - ((EQ ALEN BLEN) - (IGREATERP (fetch WNKEYWEIGHT of A) - (fetch WNKEYWEIGHT of B))) - (T (IGREATERP ALEN BLEN] - -(* ;;; "extract words in the range '[minWord..maxWord].' Convert numbers into lemmas") - - (SETQ priorSet NIL) - (SETQ venn (NCONC notFound venn)) - [for tail keySet keySetLength overflow i (buffer _ (AND GetBufferFn - (APPLY* GetBufferFn wordNerd - headerIndex))) - on venn do (SETQ overflow NIL) - (SETQ keySet (CAR tail)) - (SETQ keySetLength (LENGTH (fetch WNKEYDATA of keySet))) - (COND - [(IGEQ n maxWord) (* ; - "set is above maximum, remove from venn diagram") - (COND - [(EQ minWord 0) - (replace WNKEYDATA of keySet - with (LIST (CONCAT keySetLength " entries."] - (T (COND - (priorSet (RPLACD priorSet (CDR tail))) - (T (SETQ venn (CDR tail] - [(ILESSP (IPLUS n keySetLength) - minWord) (* ; - "set is below minimum, remove from venn diagram") - (add n keySetLength) - (COND - ((NULL (CDR tail)) - - (* ;; "if all of the sets are below minimum, leave the header for the last one so that the user knows what is going on.") - - (push (fetch WNKEY of keySet) - ". . .") - (replace WNKEYDATA of keySet with (LIST - "no more words." - ))) - (T (SETQ venn (CDR tail] - (T (* ; - "we want to include at least part of this set") - (SETQ priorSet tail) - (replace WNKEYDATA of keySet - with (DREVERSE (fetch WNKEYDATA of keySet))) - [for keyTail on (fetch WNKEYDATA of keySet) - do (add n 1) - (COND - ((AND (IGEQ n minWord) - (NOT dontConvert)) - (* ; "convert the number into a word") - (RPLACA keyTail (CONCAT (APPLY* GetHeaderFn wordNerd - (CAR keyTail) - headerIndex buffer))) - (* ; - "CONCAT will copy the string out of the buffer.") - (BLOCK))) - (COND - ((EQ n minWord) - (* ; - "remove the numbers before this one") - (replace WNKEYDATA of keySet with - keyTail) - (push (fetch WNKEY of keySet) - ". . .")) - ((AND (IGEQ n maxWord) - (CDR keyTail)) - (* ; - "remove the numbers after this one") - (* ; - "add overflow (LENGTH (CDR lemma))") - (SETQ overflow (LENGTH (CDR keyTail))) - (RPLACD keyTail NIL) - (RETURN] - (replace WNKEYDATA of keySet - with (SORT (fetch WNKEYDATA of keySet) - (FUNCTION UALPHORDER))) - [COND - (overflow (NCONC1 (fetch WNKEYDATA of keySet) - (CONCAT ". . .+" overflow " more."] - - (* ;; "finally, remove the WNKEYSETWEIGHT field") - - (RPLACD keySet (CDDR keySet] - - (* ;; "COND ((NEQ overflow 0) (* append the overflow information) (NCONC1 (CADAR (LAST venn)) (CONCAT '. . .+' overflow ' more.')))") - - venn]) -) -(DEFINEQ - -(WordNerd.DefaultWeightedSearch - [LAMBDA (wordNerd weightedKeys minWord maxWord useFreqWeights) - (* ; "Edited 18-Nov-88 10:09 by jtm:") - -(* ;;; "performs a weighted search of wordNerd using the keys and weights in weightedKeys. minWord and maxWord gives the range of the result to be returned. useFreqWeights indicates that frequency should be taken into account. weightedKeys is either a string of keys from the user or a list of keys or a list of key-weight pairs (CAR, CADR).") - - (LET (headerIndex keyIndex indexFile array arrayMax entryCount priorityList weights minimumWeight - shiftFactor maxKeys wordList keysLeft GetKeyFn GetEntryFn GetFreqFn GetHeaderFn - GetBufferFn MaxHeaderFn) - -(* ;;; "the user may specify a database by name.") - - [COND - ((AND wordNerd (LITATOM wordNerd)) - (SETQ wordNerd (InvertedDictFromName wordNerd] - -(* ;;; "The INVERTEDDICT data structure simulates an object-oriented approach. Fetch all of the values once at the beginning to save the cost of multiple fetches.") - - (WordNerd.Open wordNerd) - (OR minWord (SETQ minWord 0)) - (OR maxWord (SETQ maxWord 50)) - (SETQ minimumWeight (OR (InvertedDict.Prop wordNerd 'MINIMUMWEIGHT) - 0)) - (SETQ shiftFactor (OR (InvertedDict.Prop wordNerd 'SHIFTFACTOR) - 0)) - (SETQ maxKeys (OR (InvertedDict.Prop wordNerd 'MAXWEIGHTEDKEYS) - 15)) - (SETQ headerIndex (fetch (INVERTEDDICT HEADERINDEX) of wordNerd)) - (SETQ keyIndex (fetch (INVERTEDDICT KEYINDEX) of wordNerd)) - (SETQ indexFile (fetch (INVERTEDDICT INDEXFILE) of wordNerd)) - (SETQ GetKeyFn (InvertedDict.Prop wordNerd 'GETKEYFN)) - (SETQ GetEntryFn (InvertedDict.Prop wordNerd 'GETENTRYFN)) - (SETQ GetFreqFn (InvertedDict.Prop wordNerd 'GETFREQFN)) - (SETQ MaxHeaderFn (InvertedDict.Prop wordNerd 'MAXHEADERIDFN)) - (SETQ GetHeaderFn (InvertedDict.Prop wordNerd 'GETHEADERFN)) - (SETQ GetBufferFn (InvertedDict.Prop wordNerd 'GETBUFFERFN)) - (SETQ entryCount (OR (APPLY* MaxHeaderFn wordNerd headerIndex) - 10000)) - (SETQ arrayMax (ADD1 (LRSH entryCount 8))) - -(* ;;; "Cache the array scratch pad on invertedDict.") - - (SETQ array (InvertedDict.Prop wordNerd 'Array)) - (COND - ((AND array (IGREATERP arrayMax (ARRAYSIZE array))) - (* ; - "the data has grown since we last saw it.") - (SETQ array NIL))) - [COND - ((NULL array) - (InvertedDict.Prop wordNerd 'Array (SETQ array (ARRAY (ADD1 arrayMax) - NIL NIL 0] - (for I from 0 to arrayMax do (SETA array I NIL)) - -(* ;;; "parse the user's input.") - - (AND (STRINGP weightedKeys) - (SETQ weightedKeys (WORDNERD.PARSEINPUT wordNerd weightedKeys T))) - -(* ;;; "process the keys.") - - [for word word# weight length freq factor inside weightedKeys - do (SETQ wordList NIL) - (COND - ((LISTP word) - (SETQ word (CAR word)) - (SETQ factor (CADR word))) - (T (SETQ factor 1))) - (COND - ([SETQ word# (COND - ((OR (NULL GetKeyFn) - (NUMBERP word)) - word) - (T (APPLY* GetKeyFn wordNerd word keyIndex] - [SETQ freq (COND - ((LISTP word#) - (LENGTH word#)) - ((NULL GetFreqFn) - (SETQ word# (APPLY* GetEntryFn wordNerd word# indexFile)) - (LENGTH word#)) - (T (APPLY* GetFreqFn wordNerd word# indexFile] - (COND - ((NEQ freq 0) - (SETQ weight (COND - [useFreqWeights (ITIMES factor - (IMAX 1 (LRSH (IQUOTIENT entryCount - freq) - shiftFactor] - (T factor))) - (COND - ((IGEQ (ABS weight) - minimumWeight) - (push weights (LIST word# weight word wordList] - -(* ;;; "sort weights from greatest to least. We may not have to process all of the keys, so do the most significant ones first.") - - [SETQ weights (SORT weights (FUNCTION (LAMBDA (A B) - (IGREATERP (CADR A) - (CADR B] - [SETQ keysLeft (COND - (useFreqWeights maxKeys) - (T (LENGTH weightedKeys] - [for tail weightedKey priorTail word weight singleWeight ignoreSingletons - (%#entries _ 0) on weights - do (BLOCK) - (SETQ weightedKey (CAR tail)) - (SETQ weight (CADR weightedKey)) - (SETQ word (CADDR weightedKey)) - [SETQ wordList (COND - ((LISTP (CAR weightedKey)) - (CAR weightedKey)) - (T (APPLY* GetEntryFn wordNerd (CAR weightedKey) - indexFile] - (RPLACA weightedKey word) - (RPLACD (CDR weightedKey) - NIL) - (COND - [(CDR wordList) (* ; - "ignore lists with less than 2 and more than 2000 entries.") - (add keysLeft -1) - (SETQ priorTail tail) - [COND - ((AND singleWeight (NOT ignoreSingletons)) - (SETQ ignoreSingletons - (IGEQ singleWeight - (for remaining in tail as I from 1 to keysLeft - sum (CADR remaining] - (add %#entries (AddWeightsToArray array wordList weight word - ignoreSingletons)) - [COND - ((AND maxWord (IGEQ %#entries maxWord)) - (* ; - "keep track of the maximum weight of any key that could satisfy the query all by itself.") - (COND - ((OR (NULL singleWeight) - (IGREATERP weight singleWeight)) - (SETQ singleWeight weight] - (COND - ((EQ keysLeft 0) - (RPLACD tail NIL) - (RETURN] - (priorTail (RPLACD priorTail (CDR tail))) - (T (SETQ weights (CDR tail] - (SETQ priorityList (CDR (FindTopElements array maxWord arrayMax))) - (AND minWord (IGREATERP minWord 0) - (SETQ priorityList (NTH priorityList minWord))) - [SETQ priorityList (for lemma (buffer _ (AND GetBufferFn (APPLY* GetBufferFn wordNerd - headerIndex))) - in priorityList collect - (* ; - "CONCAT will copy the string out of the buffer.") - (CONS (CONCAT (APPLY* GetHeaderFn wordNerd - (CADR lemma) - headerIndex buffer)) - (LIST (CAR lemma) - (DREVERSE (CDDDR lemma] - (LIST weights priorityList]) - -(AddWeightsToArray - [LAMBDA (array wordList weight word ignoreSingletons) (* jtm%: "17-Nov-87 14:49") - (for header index val elt (%#newEntries _ 0) in wordList - do (SETQ index (LRSH header 8)) - (SETQ elt (ELT array index)) - (COND - ((AND [NULL (SETQ val (for I in elt thereis (EQP header (CAR I] - (NOT ignoreSingletons)) - (SETQ val (LIST header 0)) - (COND - (elt (ATTACH val elt)) - (T (push (ELT array index) - val))) - (add %#newEntries 1))) - (COND - (val (push (CDDR val) - word) - (add (CADR val) - weight))) finally (RETURN %#newEntries]) - -(FindTopElements - [LAMBDA (array maxWord arrayMax) (* jtm%: " 2-Aug-88 10:37") - (LET (priorityList) - (for I from 0 to arrayMax do (for arrayVal in (ELT array I) - do - (* RPLACA (CDR arrayVal) - (ITIMES (CADR arrayVal) - (IMIN 5 (LENGTH (CDDR arrayVal))))) - (SETQ priorityList ( - AddToPriorityList - priorityList - arrayVal - (CADR arrayVal) - maxWord))) - (SETA array I NIL)) - priorityList]) - -(AddToPriorityList - [LAMBDA (priorityList I VAL MAX) (* jtm%: " 6-Nov-87 15:12") - (LET (inserted) - [COND - [(NULL priorityList) (* include a count at the beginning.) - (SETQ priorityList (CONS (CONS 0 1) - (LIST (CONS VAL I] - ((AND MAX (ILEQ MAX (CDAR priorityList)) - (ILEQ VAL (CAAR priorityList))) (* its off the bottom) - NIL) - (T (for tail nextToLast last on priorityList as N from 0 - do (COND - ((OR (NULL (CDR tail)) - (IGREATERP VAL (CAADR tail))) - (COND - ((EQ N MAX) - NIL) - ((AND [SETQ nextToLast (AND MAX (NTH tail (IDIFFERENCE MAX N] - (SETQ last (CDR nextToLast))) - (* re-use the nextToLast cell.) - (RPLACA (CAR priorityList) - (CAAR nextToLast)) - (RPLACD nextToLast NIL) (* remove last from the list.) - (RPLNODE (CAR last) - VAL I) (* update its values.) - (RPLACD last (CDR tail)) (* splice it into the list.) - (RPLACD tail last)) - (T (* (AND MAX (RPLACD - (NTH tail (IDIFFERENCE - (ADD1 MAX) N)) NIL))) - (RPLACD tail (CONS (CONS VAL I) - (CDR tail))) - (add (CDAR priorityList) - 1))) - (RETURN] - priorityList]) -) -(DEFINEQ - -(WordNerd.DefaultRelevanceSearch - [LAMBDA (wordNerd posWords negKeys minWord maxWord) (* jtm%: " 2-Aug-88 10:46") - - (* * extract keywords from the sample words given - (posWords) and do a weighted search.) - - (LET (posKeys dictionary analyzer GetEntryTokensFn) - [COND - ((AND wordNerd (LITATOM wordNerd)) - (SETQ wordNerd (InvertedDictFromName wordNerd] - [COND - ((NULL wordNerd) - (SETQ wordNerd (CAR InvertedDict.List] - [COND - ((STRINGP posWords) - (SETQ posWords (PARSEBYCOLONS posWords] - (SETQ analyzer (InvertedDict.Prop wordNerd 'ANALYZER)) - (SETQ dictionary (InvertedDict.Prop wordNerd 'DICTIONARY)) - (SETQ GetEntryTokensFn (InvertedDict.Prop wordNerd 'GETENTRYTOKENSFN)) - - (* * GetEntryTokensFn is in the wordNerd rather than its dictionary because - there may be more than one wordNerd for a particular dictionary - (as in the WordNerd and EtymologyNerd.)) - - (SETQ posKeys (MergeKeywords (for word in posWords - collect (APPLY* GetEntryTokensFn wordNerd word - dictionary analyzer)) - negKeys)) - (WordNerd.WeightedSearch wordNerd posKeys minWord maxWord T]) - -(MergeKeywords - [LAMBDA (posWordLists negKeywords minimumMatches negWordLists) - (* jtm%: " 1-Aug-88 15:11") - (LET (intersection minimum n m order list) - (OR minimumMatches (SETQ minimumMatches 2)) - [while posWordLists do (SETQ n 0) - (SETQ minimum NIL) - [for tail on posWordLists when (CAR tail) - do (COND - ((OR (NULL minimum) - (ALPHORDER (CAAR tail) - minimum)) - (SETQ minimum (CAAR tail] - (OR minimum (RETURN)) - [for tail on posWordLists when (CAR tail) - do (while (EQUAL minimum (CAAR tail)) - do (add n 1) - (pop (CAR tail] - (COND - ([AND (NOT (MEMBER minimum negKeywords)) - (OR (IGEQ n minimumMatches) - (NULL (CDR posWordLists] - (push intersection (LIST minimum n] - intersection]) -) -(DEFINEQ - -(WORDNERD.PARSEINPUT - [LAMBDA (INVERTEDDICT STRING IGNOREPARENS) (* jtm%: "12-Aug-88 16:45") - (LET (ANALYZER KEYS SUBKEYS ENDPOS SUBSTRING (STARTPOS 1) - (NCHARS (NCHARS STRING))) - (SETQ ANALYZER (InvertedDict.Prop INVERTEDDICT 'ANALYZER)) - (COND - ((NULL ANALYZER) - (SETQ ANALYZER (create Morphalyzer)) - (InvertedDict.Prop INVERTEDDICT 'ANALYZER ANALYZER))) - [while STARTPOS - do (OR IGNOREPARENS (SETQ ENDPOS (STRPOS "(" STRING STARTPOS))) - [SETQ SUBSTRING (SUBSTRING STRING STARTPOS (SUB1 (OR ENDPOS (ADD1 NCHARS] - [AND SUBSTRING (Analyzer.Analyze ANALYZER SUBSTRING NIL NIL - (FUNCTION (LAMBDA (ANALYZER STREAM START LENGTH ENTRY) - (push KEYS - (OR ENTRY (STREAM.FETCHSTRING STREAM START - LENGTH NIL T))) - NIL] - (COND - [ENDPOS (SETQ STARTPOS (ADD1 ENDPOS)) - (SETQ ENDPOS (STRPOS ")" STRING STARTPOS)) - (SETQ SUBKEYS NIL) - [Analyzer.Analyze ANALYZER [SUBSTRING STRING STARTPOS - (SUB1 (OR ENDPOS (ADD1 NCHARS] - NIL NIL (FUNCTION (LAMBDA (ANALYZER STREAM START LENGTH ENTRY) - (push SUBKEYS - (OR ENTRY - (STREAM.FETCHSTRING STREAM START - LENGTH NIL T))) - NIL] - (push KEYS (DREVERSE SUBKEYS)) - (SETQ STARTPOS (ADD1 (OR ENDPOS NCHARS] - (T (SETQ STARTPOS NIL] - (SETQ KEYS (DREVERSE KEYS]) -) -(DECLARE%: EVAL@COMPILE - -(RECORD WNKEYINFO (WNKEY WNKEYWEIGHT WNKEYDATA)) -) - (* * SimpleNerd is an in-core version of the WordNerd.) - -(DEFINEQ - -(SimpleNerd.Create - [LAMBDA (NAME DICTIONARY ANALYZER) (* ; "Edited 25-Oct-88 12:01 by jtm:") - (LET (SIMPLENERD) - (SETQ SIMPLENERD (create INVERTEDDICT - INVERTEDDICTNAME _ NAME)) - (AND DICTIONARY (InvertedDict.Prop SIMPLENERD 'DICTIONARY DICTIONARY)) - (InvertedDict.Prop SIMPLENERD 'ANALYZER (OR ANALYZER (SimpleAnalyzer.Create NAME))) - (InvertedDict.Prop SIMPLENERD 'ADDASSOCIATIONFN (FUNCTION SimpleNerd.AddAssociation)) - (InvertedDict.Prop SIMPLENERD 'GETENTRYFN (FUNCTION SimpleNerd.GetEntry)) - (InvertedDict.Prop SIMPLENERD 'MAXHEADERIDFN (FUNCTION SimpleNerd.MaxEntry)) - (InvertedDict.Prop SIMPLENERD 'GETHEADERFN (FUNCTION SimpleNerd.GetHeader)) - (InvertedDict.Prop SIMPLENERD 'GETENTRYTOKENSFN (FUNCTION SimpleNerd.ParseDictEntry)) - (InvertedDict.Prop SIMPLENERD 'MAPKEYSFN (FUNCTION SimpleNerd.MapKeys)) - (InvertedDict.Prop SIMPLENERD 'VENNSEARCHFN (FUNCTION WordNerd.DefaultVennSearch)) - (InvertedDict.Prop SIMPLENERD 'WEIGHTEDSEARCHFN (FUNCTION WordNerd.DefaultWeightedSearch)) - (InvertedDict.Prop SIMPLENERD 'RELEVANCESEARCHFN (FUNCTION WordNerd.DefaultRelevanceSearch)) - (InvertedDict.Establish SIMPLENERD) - SIMPLENERD]) - -(SimpleNerd.AddAssociation - [LAMBDA (WORDNERD HEADER KEY) (* ; "Edited 21-Sep-88 14:37 by jtm:") - - (* * adds KEY to WORDNERD under HEADER.) - - (LET (LASTENTRY HEADERINDEX INDEXFILE HEADERSIZE ENTRYID ASSOCS) - - (* * initialize local variables and data structures.) - - (COND - ((NULL (SETQ HEADERINDEX (fetch (INVERTEDDICT HEADERINDEX) of WORDNERD))) - (SETQ HEADERINDEX (ARRAY 100)) - (replace (INVERTEDDICT HEADERINDEX) of WORDNERD with HEADERINDEX))) - (COND - ((NULL (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD))) - (SETQ INDEXFILE (SimpleDict.New (fetch (INVERTEDDICT INVERTEDDICTNAME) of - WORDNERD - ))) - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with INDEXFILE))) - [COND - ([NULL (SETQ LASTENTRY (InvertedDict.Prop WORDNERD 'LASTENTRY] - (SETQ LASTENTRY (CONS NIL 0] - - (* * map HEADER to a unique ID using EQUAL. - We want ID numbers to make it easier to convert to external indices.) - - (COND - ((EQ HEADER :STOPWORD) (* do nothing) - NIL) - ((EQUAL HEADER (CAR LASTENTRY)) (* this is optimized for multiple - additions to the same entry.) - (SETQ ENTRYID (CDR LASTENTRY))) - ([SETQ ENTRYID (for I from 1 to (SETQ HEADERSIZE (ARRAYSIZE HEADERINDEX)) - thereis (EQUAL HEADER (ELT HEADERINDEX I] - (* look for an existing entry.) - (InvertedDict.Prop WORDNERD 'LASTENTRY (CONS HEADER ENTRYID))) - (T (* add an HEADER to HEADERINDEX) - (SETQ ENTRYID (ADD1 (OR (InvertedDict.Prop WORDNERD 'LASTINDEX) - 0))) - [COND - ((IGREATERP ENTRYID HEADERSIZE) - (LET (NEWHEADERINDEX) (* get a bigger array.) - (SETQ NEWHEADERINDEX (ARRAY (ITIMES HEADERSIZE 2))) - (for I from 1 to HEADERSIZE do (SETA NEWHEADERINDEX I - (ELT HEADERINDEX I))) - (replace (INVERTEDDICT HEADERINDEX) of WORDNERD with - NEWHEADERINDEX) - (SETQ HEADERINDEX NEWHEADERINDEX] - (SETA HEADERINDEX ENTRYID HEADER) - (InvertedDict.Prop WORDNERD 'LASTINDEX ENTRYID))) - - (* * push the HEADER onto INDEXFILE) - (* used to - #.(SEDIT::MAKE-BROKEN-ATOM "be:") - (SimpleDict.PushEntry INDEXFILE KEY - ENTRYID (QUOTE NEWTOP))) - (COND - ((EQ HEADER :STOPWORD) (* mark as stop word) - (SimpleDict.PutEntry INDEXFILE KEY :STOPWORD)) - [(SETQ ASSOCS (SimpleDict.Lookup INDEXFILE KEY)) - (COND - ((EQ ASSOCS :STOPWORD) (* don't do anything) - NIL) - ((NEQ ENTRYID (CAR ASSOCS)) - (ATTACH ENTRYID ASSOCS] - (T (SimpleDict.PutEntry INDEXFILE KEY (LIST ENTRYID]) - -(SimpleNerd.MapKeys - [LAMBDA (NERD MAPFN) (* ; "Edited 25-Oct-88 11:57 by jtm:") - - (* ;; "Map through all of the keys in the NERD") - - (Dict.MapEntries (fetch (INVERTEDDICT INDEXFILE) of NERD) - (FUNCTION (LAMBDA (DICT PATH ENTRY) - (DECLARE (SPECVARS MAPFN NERD)) - (LET (HEADER) - (SETQ HEADER (CONCATLIST PATH)) (* ; "PATH is a list of characters") - (APPLY* MAPFN NERD HEADER HEADER ENTRY)) - (* ; - "KEY and KEYID are the same. ENTRY may be :STOPWORD") - ]) - -(SimpleNerd.GetEntry - [LAMBDA (WORDNERD KEYID INDEXFILE) (* jtm%: " 2-Aug-88 10:13") - (SimpleDict.Lookup INDEXFILE KEYID]) - -(SimpleNerd.MaxEntry - [LAMBDA (WORDNERD HEADERINDEX) (* jtm%: " 1-Aug-88 16:44") - (InvertedDict.Prop WORDNERD 'LASTINDEX]) - -(SimpleNerd.GetHeader - [LAMBDA (WORDNERD HEADERID HEADERINDEX BUFFER) (* ; "Edited 11-Nov-88 14:30 by jtm:") - (COND - (HEADERINDEX (ELT HEADERINDEX HEADERID)) - (T HEADERID]) - -(SimpleNerd.ParseDictEntry - [LAMBDA (WORDNERD WORD DICTIONARY ANALYZER) (* ; "Edited 24-Oct-88 14:19 by jtm:") - - (* * return the list of tokens in the definition of WORD.) - - (LET (DICTENTRY TOKENS HARRAY) - [OR DICTIONARY (SETQ DICTIONARY (InvertedDict.Prop WORDNERD 'DICTIONARY] - [OR ANALYZER (SETQ ANALYZER (InvertedDict.Prop WORDNERD 'ANALYZER] - (SETQ DICTENTRY (Dict.GetEntry DICTIONARY WORD)) - [COND - (DICTENTRY (SETQ HARRAY (HASHARRAY 100 NIL 'STRINGHASHBITS 'STREQUAL)) - (Analyzer.Analyze ANALYZER DICTENTRY NIL NIL - (FUNCTION (LAMBDA (ANALYZER STREAM START LENGTH ENTRY) - (LET (TOKEN) - (SETQ TOKEN (OR ENTRY (STREAM.FETCHSTRING STREAM START - LENGTH NIL T))) - (PUTHASH TOKEN T HARRAY) - (* ; - "return NIL to keep iteration going") - NIL] - (COND - ((STREAMP DICTENTRY) - (CLOSEF DICTENTRY))) - [MAPHASH HARRAY (FUNCTION (LAMBDA (VAL KEY) - (push TOKENS KEY] - TOKENS]) - -(SimpleNerd.Test - [LAMBDA NIL (* jtm%: " 2-Aug-88 14:54") - (LET (simpleNerd simpleDict analyzer GetEntryTokensFn) - (SETQ simpleDict (SimpleDict.New 'TEST)) - (Dict.PutEntry simpleDict "Paine" - "Now is the time for all good men to come to the aid of their country.") - (Dict.PutEntry simpleDict "Jefferson" "Now is the time for good men to help out.") - (Dict.PutEntry simpleDict "King George" "Now wait a minute!") - (Dict.PutEntry simpleDict "Kennedy" "Ask not what your country can do for you.") - (replace (Dict printEntryFn) of simpleDict with (FUNCTION - DictTool.PrintDefinition)) - (Dict.Establish simpleDict) - (SETQ simpleNerd (SimpleNerd.Create 'TEST)) - (InvertedDict.Prop simpleNerd 'DICTIONARY simpleDict) - (InvertedDict.Prop simpleNerd 'MINIMUMWEIGHT 0) - (SETQ analyzer (InvertedDict.Prop simpleNerd 'ANALYZER)) - (SETQ GetEntryTokensFn (InvertedDict.Prop simpleNerd 'GETENTRYTOKENSFN)) - [Dict.MapEntries simpleDict (FUNCTION (LAMBDA (dict path value) - (LET (string tokens) - (SETQ string (CONCATLIST path)) - (SETQ tokens (APPLY* GetEntryTokensFn - simpleNerd string - simpleDict analyzer)) - (for token in tokens - do (SimpleNerd.AddEntry simpleNerd - string token] - (SETQ TESTNERD simpleNerd]) -) - (* * HashfileNerd stores its data structures in an InterLisp hashfile.) - -(DEFINEQ - -(HashfileNerd.Create - [LAMBDA (NAME FILENAME DICTIONARY ANALYZER) (* ; "Edited 17-Nov-88 17:03 by jtm:") - (LET (NERD) - (SETQ NERD (create INVERTEDDICT - INVERTEDDICTNAME _ NAME - HEADERINDEX _ (ARRAY 100))) - - (* ;; "HashfileNerd.AddAssociation used to create the header array on demand, but now I want a NIL header index to indicate the identity mapping, so the array is created here and removed if the user wants an identity mapping.") - - (InvertedDict.Prop NERD 'FILENAME FILENAME) - (InvertedDict.Prop NERD 'ANALYZER (OR ANALYZER (SimpleAnalyzer.Create NAME))) - (COND - (DICTIONARY (InvertedDict.Prop NERD 'DICTIONARY DICTIONARY))) - (InvertedDict.Prop NERD 'OPENFN (FUNCTION HashfileNerd.Open)) - (InvertedDict.Prop NERD 'CLOSEFN (FUNCTION HashfileNerd.Close)) - (InvertedDict.Prop NERD 'RELEVANCESEARCHFN (FUNCTION WordNerd.DefaultRelevanceSearch)) - (InvertedDict.Prop NERD 'WEIGHTEDSEARCHFN (FUNCTION WordNerd.DefaultWeightedSearch)) - (InvertedDict.Prop NERD 'VENNSEARCHFN (FUNCTION WordNerd.DefaultVennSearch)) - (InvertedDict.Prop NERD 'ADDASSOCIATIONFN (FUNCTION HashfileNerd.AddAssociation)) - (InvertedDict.Prop NERD 'GETENTRYFN (FUNCTION HashfileNerd.GetEntry)) - (InvertedDict.Prop NERD 'MAXHEADERIDFN (FUNCTION SimpleNerd.MaxEntry)) - (InvertedDict.Prop NERD 'GETHEADERFN (FUNCTION SimpleNerd.GetHeader)) - (InvertedDict.Prop NERD 'MAPKEYSFN (FUNCTION HashfileNerd.MapKeys)) - (InvertedDict.Prop NERD 'EXPANDKEYPATTERNFN (FUNCTION HashfileNerd.ExpandKeyPattern)) - (InvertedDict.Prop NERD 'GETENTRYTOKENSFN (FUNCTION SimpleNerd.ParseDictEntry)) - (InvertedDict.Establish NERD) - NERD]) - -(HashfileNerd.Test - [LAMBDA (FILEPATTERN FILENAME) (* ; "Edited 26-Sep-88 13:30 by jtm:") - (LET (NERD DICT) - (SETQ DICT (FileDict.Create 'TEST)) - (FileDict.AddFiles DICT FILEPATTERN) - (SETQ NERD (HashfileNerd.Create 'TEST NIL DICT)) - (WordNerd.AddDictionary NERD DICT) - (HashfileNerd.Write NERD FILENAME) - (HashfileNerd.Close NERD) - (SETQ NERD (HashfileNerd.Create 'TEST NIL DICT)) - (HashfileNerd.Open NERD FILENAME) - NERD]) - -(HashfileNerd.Open - [LAMBDA (WORDNERD FILENAME) (* ; "Edited 11-Nov-88 11:34 by jtm:") - -(* ;;; "Reads a hashfilenerd out of the hashfile stored in FILENAME") - - (LET (HASHFILE HEADERLIST HEADERINDEX DICTNAME ANALYZERNAME) - (COND - ([AND (NULL (fetch (INVERTEDDICT INDEXFILE) of WORDNERD)) - (OR FILENAME (SETQ FILENAME (InvertedDict.Prop WORDNERD 'FILENAME] - (SETQ HASHFILE (OPENHASHFILE FILENAME)) - - (* ;; "read out the name") - - (replace (INVERTEDDICT INVERTEDDICTNAME) of WORDNERD - with (OR (GETHASHFILE '*NAME* HASHFILE) - (fetch (INVERTEDDICT INVERTEDDICTNAME) of WORDNERD))) - - (* ;; "read out the HEADERINDEX") - - [COND - ((SETQ HEADERLIST (GETHASHFILE '*HEADERINDEX* HASHFILE)) - [SETQ HEADERINDEX (ARRAY (IPLUS 10 (LENGTH HEADERLIST] - (for I in HEADERLIST do (SETA HEADERINDEX (CAR I) - (CADR I] - - (* ;; "read out simple properties") - - (for PROP in (GETHASHFILE '*PROPS* HASHFILE) do (InvertedDict.Prop - WORDNERD - (CAR PROP) - (CDR PROP))) - (replace (INVERTEDDICT HEADERINDEX) of WORDNERD with HEADERINDEX) - - (* ;; "check the dictionary name") - - (COND - ([AND (SETQ DICTNAME (GETHASHFILE '*DICTIONARY* HASHFILE)) - (NEQ DICTNAME (Dict.Name (InvertedDict.Prop WORDNERD 'DICTIONARY] - (ERROR "WORDNERD has wrong dictionary for this hash file."))) - - (* ;; " check the analyzer name ") - - (COND - ([AND (SETQ ANALYZERNAME (GETHASHFILE '*ANALYZER* HASHFILE)) - (NEQ ANALYZERNAME (Analyzer.Name (InvertedDict.Prop WORDNERD 'ANALYZER] - (ERROR "WORDNERD has wrong analyzer for this hash file."))) - - (* ;; "finally replace INDEXFILE with HASHFILE atomically") - - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with HASHFILE]) - -(HashfileNerd.Close - [LAMBDA (WORDNERD) (* ; "Edited 15-Sep-88 10:04 by jtm:") - (LET (INDEXFILE) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD)) - [COND - ((OR (HARRAYP INDEXFILE) - (LISTP INDEXFILE)) - (HashfileNerd.Write WORDNERD) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD] - (COND - ((HASHFILEP INDEXFILE) - (CLOSEHASHFILE INDEXFILE) - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with NIL) - (InvertedDict.Prop WORDNERD 'LASTINDEX NIL) - (InvertedDict.Prop WORDNERD 'LASTENTRY NIL))) - NIL]) - -(HashfileNerd.Write - [LAMBDA (WORDNERD FILENAME) (* ; "Edited 11-Nov-88 11:32 by jtm:") - -(* ;;; "Write out WORDNERD onto a hashfile so that it can be read back in later.") - - (LET (INDEXFILE HEADERINDEX HASHFILE HASHARRAY PROPS DICT DICTNAME ANALYZER ANALYZERNAME NAME) - - (* ;; "defaults for FILENAME") - - (COND - [(NULL FILENAME) - (SETQ FILENAME (InvertedDict.Prop WORDNERD 'FILENAME] - (T (InvertedDict.Prop WORDNERD 'FILENAME FILENAME))) - (OR FILENAME (ERROR "Please specify a filename.")) - - (* ;; "set up HASHFILE and HASHARRAY") - - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD)) - (COND - ((LISTP INDEXFILE) (* ; - "information was added to an existing hashfile") - (SETQ HASHARRAY (CAR INDEXFILE)) - (SETQ HASHFILE (CDR INDEXFILE))) - ((HASHFILEP INDEXFILE) - (SETQ HASHFILE INDEXFILE)) - ((HARRAYP INDEXFILE) - (SETQ HASHARRAY INDEXFILE)) - ((BIGHASHP INDEXFILE) - (SETQ HASHARRAY INDEXFILE))) - [COND - ((NULL HASHFILE) (* ; " create a new hashfile") - (SETQ HASHFILE (CREATEHASHFILE FILENAME NIL NIL (BIGHASHSIZE HASHARRAY] - [COND - (HASHARRAY (* ; "write new entries out") - (BIGMAPHASH HASHARRAY (FUNCTION (LAMBDA (VAL KEY) - (PUTHASHFILE KEY VAL HASHFILE] - - (* ;; "store the name on the hashfile if it has changed.") - - (SETQ NAME (fetch (INVERTEDDICT INVERTEDDICTNAME) of WORDNERD)) - (COND - ((NEQ NAME (GETHASHFILE '*NAME* HASHFILE)) - (PUTHASHFILE '*NAME* NAME HASHFILE))) - - (* ;; " store HEADERINDEX on the hashfile if it has changed.") - - (SETQ HEADERINDEX (fetch (INVERTEDDICT HEADERINDEX) of WORDNERD)) - [SETQ HEADERLIST (AND HEADERINDEX (for I ENTRY from 1 - while (SETQ ENTRY (ELT HEADERINDEX I)) - collect (LIST I ENTRY] - (COND - ((NOT (EQUAL HEADERLIST (GETHASHFILE '*HEADERINDEX* HASHFILE))) - (PUTHASHFILE '*HEADERINDEX* HEADERLIST HASHFILE))) - - (* ;; " store simple properties on the hashfile if they have changed.") - - (SETQ PROPS (for PROP in (fetch (INVERTEDDICT INVERTEDDICTPROPS) of WORDNERD - ) when (SIMPLETYPE (CDR PROP)) collect - PROP)) - (COND - ((NOT (EQUAL PROPS (GETHASHFILE '*PROPS* HASHFILE))) - (PUTHASHFILE '*PROPS* PROPS HASHFILE))) - - (* ;; "store the name of the dictionary on the hashfile if it hash changed.") - - (SETQ DICTNAME (AND [type? Dict (SETQ DICT (InvertedDict.Prop WORDNERD 'DICTIONARY] - (Dict.Name DICT))) - (COND - ((NEQ DICTNAME (GETHASHFILE '*DICTIONARY* HASHFILE)) - (PUTHASHFILE '*DICTIONARY* DICTNAME HASHFILE))) - - (* ;; "store the name of the analyzer if it has changed.") - - (SETQ ANALYZERNAME (AND [type? Morphalyzer (SETQ ANALYZER (InvertedDict.Prop - WORDNERD - 'DICTIONARY] - (Analyzer.Name ANALYZER))) - (COND - ((NEQ ANALYZERNAME (GETHASHFILE '*ANALYZER* HASHFILE)) - (PUTHASHFILE '*ANALYZER* ANALYZERNAME HASHFILE))) - - (* ;; "remove the hash array from INDEXFILE") - - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with HASHFILE) - - (* ;; " return the hash file") - - HASHFILE]) - -(SIMPLETYPE - [LAMBDA (DATUM) (* ; "Edited 15-Sep-88 14:33 by jtm:") - (COND - ((NUMBERP DATUM) - T) - ((STRINGP DATUM) - T) - ((LITATOM DATUM) - T) - ((LISTP DATUM) - (for I inside DATUM always (SIMPLETYPE I]) - -(HashfileNerd.AddAssociation - [LAMBDA (WORDNERD HEADER KEY) (* ; "Edited 11-Nov-88 11:30 by jtm:") - - (* * adds KEY to WORDNERD under HEADER.) - - (LET (LASTENTRY HEADERINDEX INDEXFILE HEADERSIZE ENTRYID HASHARRAY HASHFILE ASSOCS) - - (* * initialize local variables and data structures.) - - (WordNerd.Open WORDNERD) - (SETQ HEADERINDEX (fetch (INVERTEDDICT HEADERINDEX) of WORDNERD)) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD)) - [COND - ((HARRAYP INDEXFILE) - (SETQ HASHARRAY INDEXFILE)) - ((BIGHASHP INDEXFILE) - - (* ;; "INDEXFILE is an array of hash arrays indexed by length of the key string.") - - (SETQ HASHARRAY INDEXFILE)) - ((HASHFILEP INDEXFILE) - (SETQ HASHFILE INDEXFILE) - - (* ;; "Create a hash array to handle the new associations.") - - (SETQ HASHARRAY (HASHARRAY 100 NIL (FUNCTION STRINGHASHBITS) - (FUNCTION STREQUAL))) - (SETQ INDEXFILE (CONS HASHARRAY HASHFILE)) - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with INDEXFILE)) - ((NULL INDEXFILE) - (SETQ HASHARRAY (HASHARRAY 100 NIL (FUNCTION STRINGHASHBITS) - (FUNCTION STREQUAL))) - (replace (INVERTEDDICT INDEXFILE) of WORDNERD with HASHARRAY)) - ((LISTP INDEXFILE) (* ; "must follow (NULL INDEXFILE)") - (SETQ HASHARRAY (CAR INDEXFILE)) - (SETQ HASHFILE (CDR INDEXFILE] - [COND - ([NULL (SETQ LASTENTRY (InvertedDict.Prop WORDNERD 'LASTENTRY] - (SETQ LASTENTRY (CONS NIL 0] - - (* * map HEADER to a unique ID using EQUAL. - We want ID numbers to make it easier to convert to external indices.) - - (COND - ((EQ HEADER :STOPWORD) (* don't add header to header index.) - NIL) - ((NULL HEADERINDEX) (* Identity mapping) - (SETQ ENTRYID HEADER)) - ((EQUAL HEADER (CAR LASTENTRY)) (* this is optimized for multiple - additions to the same entry.) - (SETQ ENTRYID (CDR LASTENTRY))) - ([SETQ ENTRYID (for I from 1 to (SETQ HEADERSIZE (ARRAYSIZE HEADERINDEX)) - thereis (EQUAL HEADER (ELT HEADERINDEX I] - (* look for an existing entry.) - (InvertedDict.Prop WORDNERD 'LASTENTRY (CONS HEADER ENTRYID))) - (T (* add an HEADER to HEADERINDEX) - (SETQ ENTRYID (ADD1 (OR (InvertedDict.Prop WORDNERD 'LASTINDEX) - 0))) - [COND - ((IGREATERP ENTRYID HEADERSIZE) - (LET (NEWHEADERINDEX) (* get a bigger array.) - (SETQ NEWHEADERINDEX (ARRAY (ITIMES HEADERSIZE 2))) - (for I from 1 to HEADERSIZE do (SETA NEWHEADERINDEX I - (ELT HEADERINDEX I))) - (replace (INVERTEDDICT HEADERINDEX) of WORDNERD with - NEWHEADERINDEX) - (SETQ HEADERINDEX NEWHEADERINDEX] - (SETA HEADERINDEX ENTRYID HEADER) - (InvertedDict.Prop WORDNERD 'LASTINDEX ENTRYID))) - - (* * push the HEADER onto INDEXFILE) - - (COND - ((EQ HEADER :STOPWORD) - (BIGPUTHASH KEY :STOPWORD HASHARRAY)) - [(SETQ ASSOCS (BIGGETHASH KEY HASHARRAY)) - (COND - ((EQ ASSOCS :STOPWORD) (* don't do anything) - NIL) - ((NEQ ENTRYID (CAR ASSOCS)) - (ATTACH ENTRYID ASSOCS] - ((AND HASHFILE (SETQ ASSOCS (GETHASHFILE KEY HASHFILE)) - (NEQ ASSOCS :STOPWORD) - (NEQ ENTRYID (CAR ASSOCS))) - (push ASSOCS ENTRYID) - (BIGPUTHASH KEY ASSOCS HASHARRAY)) - (T (BIGPUTHASH KEY (LIST ENTRYID) - HASHARRAY]) - -(HashfileNerd.GetEntry - [LAMBDA (WORDNERD KEYID INDEXFILE) (* ; "Edited 11-Nov-88 14:28 by jtm:") - [COND - ((NULL INDEXFILE) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of WORDNERD] - (COND - ((BIGHASHP INDEXFILE) - (BIGGETHASH KEYID INDEXFILE)) - [(LISTP INDEXFILE) (* (CONS HASHARRAY HASHFILE)) - (COND - ((GETHASH KEYID (CAR INDEXFILE))) - (T (GETHASHFILE KEYID (CDR INDEXFILE] - ((HASHFILEP INDEXFILE) - (GETHASHFILE KEYID INDEXFILE)) - ((HARRAYP INDEXFILE) - (GETHASH KEYID INDEXFILE]) - -(HashfileNerd.ExpandKeyPattern - [LAMBDA (NERD KEYPATTERN) (* ; "Edited 17-Nov-88 16:58 by jtm:") - (LET (PAT INDEXFILE KEYS HASHARRAY HASHFILE) - (SETQ PAT (DIRECTORY.MATCH.SETUP KEYPATTERN)) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of NERD)) - [COND - ((OR (BIGHASHP INDEXFILE) - (HARRAYP INDEXFILE)) - (SETQ HASHARRAY INDEXFILE)) - ((HASHFILEP INDEXFILE) - (SETQ HASHFILE INDEXFILE)) - ((LISTP INDEXFILE) - (SETQ HASHARRAY (CAR INDEXFILE)) - (SETQ HASHFILE (CDR INDEXFILE] - [if HASHARRAY - then (BIGMAPHASH HASHARRAY (FUNCTION (LAMBDA (DATA KEY) - (COND - ((DIRECTORY.MATCH PAT KEY) - (push KEYS KEY] - [if HASHFILE - then (MAPHASHFILE HASHFILE (FUNCTION (LAMBDA (DATA KEY) - (COND - ((DIRECTORY.MATCH PAT KEY) - (push KEYS KEY] - KEYS]) - -(HashfileNerd.MapKeys - [LAMBDA (NERD KEYFN) (* ; "Edited 17-Nov-88 16:29 by jtm:") - -(* ;;; "maps through all of the keys in the hash array/ file") - - (LET (INDEXFILE HASHARRAY HASHFILE) - (SETQ INDEXFILE (fetch (INVERTEDDICT INDEXFILE) of NERD)) - [COND - ((OR (BIGHASHP INDEXFILE) - (HARRAYP INDEXFILE)) - (SETQ HASHARRAY INDEXFILE)) - ((HASHFILEP INDEXFILE) - (SETQ HASHFILE INDEXFILE)) - ((LISTP INDEXFILE) - (SETQ HASHARRAY (CAR INDEXFILE)) - (SETQ HASHFILE (CDR INDEXFILE] - [if HASHARRAY - then (BIGMAPHASH HASHARRAY (FUNCTION (LAMBDA (DATA KEY) - (APPLY* KEYFN NERD KEY DATA] - (if HASHFILE - then (MAPHASHFILE HASHFILE (FUNCTION (LAMBDA (DATA KEY) - (APPLY* KEYFN NERD KEY DATA]) -) -(DEFINEQ - -(BIGHASH - [LAMBDA (MAXKEYLENGTH MINKEYS OVERFLOW HASHBITSFN EQUIVFN) - (* ; "Edited 11-Nov-88 11:19 by jtm:") - - (* ;; "A BIGHASH first hashes keys into an array by key length to get a hash array and then hashes the key in that hash array.") - - (create BIGHASH - BIGHASHARRAY _ (ARRAY (ADD1 MAXKEYLENGTH) - NIL NIL 0) - BIGHASHMINKEYS _ MINKEYS - BIGHASHOVERFLOW _ OVERFLOW - BIGHASHBITSFN _ HASHBITSFN - BIGHASHEQUIVFN _ EQUIVFN]) - -(BIGGETHASH - [LAMBDA (KEY BIGHASH) (* ; "Edited 11-Nov-88 11:04 by jtm:") - - (* ;; "get the value from the hash array that has keys of KEY's length") - - (LET (HARRAY) - (COND - [(type? BIGHASH BIGHASH) - (COND - ((SETQ HARRAY (ELT (fetch BIGHASHARRAY of BIGHASH) - (NCHARS KEY))) - (GETHASH KEY HARRAY] - (T (GETHASH KEY BIGHASH]) - -(BIGHASHSIZE - [LAMBDA (BIGHASH) (* ; "Edited 11-Nov-88 11:28 by jtm:") - (LET (ARRAY) - (COND - [(type? BIGHASH BIGHASH) - (SETQ ARRAY (fetch BIGHASHARRAY of BIGHASH)) - (for I HARRAY from 0 to (SUB1 (ARRAYSIZE ARRAY)) - sum (COND - ((SETQ HARRAY (ELT ARRAY I)) - (HARRAYSIZE HARRAY)) - (T 0] - (T (HARRAYSIZE BIGHASH]) - -(BIGMAPHASH - [LAMBDA (BIGHASH MAPBHFN) (* ; "Edited 11-Nov-88 11:10 by jtm:") - - (* ;; "map through all of the keys in the sub-hashes.") - - (LET (ARRAY) - (COND - [(type? BIGHASH BIGHASH) - (SETQ ARRAY (fetch BIGHASHARRAY of BIGHASH)) - (for I HARRAY from 0 to (SUB1 (ARRAYSIZE ARRAY)) - do (COND - ((SETQ HARRAY (ELT ARRAY I)) - (MAPHASH HARRAY MAPBHFN] - (T (MAPHASH BIGHASH MAPBHFN]) - -(BIGPUTHASH - [LAMBDA (KEY VAL BIGHASH) (* ; "Edited 11-Nov-88 11:02 by jtm:") - - (* ;; "put all of the keys with the same lengths together.") - - (LET (HARRAY ARRAY NCHARS) - (COND - ((type? BIGHASH BIGHASH) - (SETQ NCHARS (NCHARS KEY)) - (SETQ ARRAY (fetch BIGHASHARRAY of BIGHASH)) - (SETQ HARRAY (ELT ARRAY NCHARS)) - (COND - ((NULL HARRAY) - (SETQ HARRAY (HASHARRAY (fetch BIGHASHMINKEYS of BIGHASH) - (fetch BIGHASHOVERFLOW of BIGHASH) - (fetch BIGHASHBITSFN of BIGHASH) - (fetch BIGHASHEQUIVFN of BIGHASH))) - (SETA ARRAY NCHARS HARRAY))) - (PUTHASH KEY VAL HARRAY)) - (T (PUTHASH KEY VAL BIGHASH]) -) -(DECLARE%: EVAL@COMPILE - -(PUTPROPS BIGHASHP MACRO ((ARRAY) - (type? BIGHASH ARRAY))) -) -(DECLARE%: EVAL@COMPILE - -(TYPERECORD BIGHASH (BIGHASHARRAY BIGHASHMINKEYS BIGHASHOVERFLOW BIGHASHBITSFN BIGHASHEQUIVFN)) -) - (* * the following should be merged into ANALYZER eventually.) - -(DEFINEQ - -(FileDict.Create - [LAMBDA (NAME FILENAME) (* ; "Edited 15-Sep-88 14:02 by jtm:") - (LET (DICT) - (SETQ DICT (SimpleDict.Create NAME FILENAME)) - (replace (Dict getEntryFn) of DICT with (FUNCTION FileDict.Lookup)) - (replace (Dict mapFn) of DICT with (FUNCTION FileDict.MapEntries)) - (replace (Dict printEntryFn) of DICT with (FUNCTION FileDict.PrintEntry)) - (Dict.Establish DICT) - DICT]) - -(FileDict.AddFiles - [LAMBDA (DICT FILEPATTERN) (* ; "Edited 14-Sep-88 16:30 by jtm:") - (for FULLNAME in (SORT (DIRECTORY FILEPATTERN)) do (Dict.PutEntry DICT - (FILENAMEFIELD FULLNAME - 'NAME) - FULLNAME]) - -(FileDict.PrintEntry - [LAMBDA (DICT KEY STREAM) (* ; "Edited 14-Sep-88 16:38 by jtm:") - (LET (FILE) - (COND - ((SETQ FILE (SimpleDict.Lookup DICT KEY)) - (TEDIT FILE) - ""]) - -(FileDict.Write - [LAMBDA (DICT FILENAME) (* ; "Edited 15-Sep-88 11:13 by jtm:") - (LET (STREAM) - (SETQ STREAM (OPENSTREAM FILENAME 'OUTPUT]) - -(FileDict.Lookup - [LAMBDA (DICT KEY) (* ; "Edited 14-Sep-88 15:08 by jtm:") - (LET (FILE) - (COND - ((SETQ FILE (SimpleDict.Lookup DICT KEY)) - (FETCHSTRINGFROMFILE FILE]) - -(FileDict.MapEntries - [LAMBDA (DICT FDMAPFN PROP) (* ; "Edited 14-Sep-88 15:26 by jtm:") - (SimpleDict.MapEntries DICT (FUNCTION (LAMBDA (DICT KEY FILENAME) - (LET (STREAM) - (SETQ STREAM (OPENTEXTSTREAM FILENAME)) - (APPLY* FDMAPFN DICT (CONCATLIST KEY) - STREAM) - (CLOSEF STREAM]) - -(FETCHSTRINGFROMFILE - [LAMBDA (FILENAME) (* ; "Edited 15-Sep-88 11:01 by jtm:") - (* LET (STREAM STRING) - (SETQ STREAM (OPENTEXTSTREAM - FILENAME)) (TEDIT.SETSEL STREAM 1 - 10000 (QUOTE LEFT)) - (SETQ STRING (TEDIT.SEL.AS.STRING - STREAM)) (CLOSEF STREAM)) - (COND - ((LISTP FILENAME) - (OPENTEXTSTREAM (CAR FILENAME) - NIL - (CADR FILENAME) - (CADDR FILENAME))) - (T (OPENTEXTSTREAM FILENAME]) -) -(DEFINEQ - -(SimpleAnalyzer.Create - [LAMBDA (NAME) (* ; "Edited 14-Sep-88 09:49 by jtm:") - (LET (morphalyzer) - (SETQ morphalyzer (create Morphalyzer - analyzerName _ NAME - lookupFn _ (FUNCTION SimpleAnalyzer.Lookup))) - (Analyzer.Prop morphalyzer 'OPT-SEPR-CODES '(NIL)) - - (* * turn off the optional seperator codes) - - morphalyzer]) - -(SimpleAnalyzer.Lookup - [LAMBDA (ANALYZER STREAM START LENGTH) (* ; "Edited 14-Sep-88 09:46 by jtm:") - (L-CASE (COND - ((STRINGP STREAM) - (SUBSTRING STREAM (ADD1 START) - (IPLUS START LENGTH))) - (T (STREAM.FETCHSTRING STREAM START LENGTH NIL T]) -) -(DEFINEQ - -(SimpleDict.Create - [LAMBDA (name filename) (* ; "Edited 15-Sep-88 11:26 by jtm:") - (LET (dict) - (SETQ dict (create Dict - dictName _ name - openFn _ (FUNCTION SimpleDict.Open) - closeFn _ (FUNCTION SimpleDict.Close) - getEntryFn _ (FUNCTION SimpleDict.Lookup) - putEntryFn _ (FUNCTION SimpleDict.PutEntry) - mapFn _ (FUNCTION SimpleDict.MapEntries) - contents _ (create SimpleDict.Node))) - (Dict.Prop dict 'FILENAME filename) - dict]) - -(SimpleDict.Open - [LAMBDA (DICT) (* ; "Edited 15-Sep-88 11:38 by jtm:") - (LET (FILENAME) - (COND - ([AND (NULL (fetch (SimpleDict.Node subnodes) of (fetch (Dict contents) - of DICT))) - (SETQ FILENAME (Dict.Prop DICT 'FILENAME] - (SETQ DATALIST (CDR (READFILE FILENAME))) - (for PAIR in DATALIST do (Dict.PutEntry DICT (CAR PAIR) - (CADR PAIR]) - -(SimpleDict.Close - [LAMBDA (DICT) (* ; "Edited 15-Sep-88 11:30 by jtm:") - (LET (CONTENTS FILENAME) - (COND - ([AND (SETQ CONTENTS (fetch (Dict contents) of DICT)) - (fetch (SimpleDict.Node subnodes) of CONTENTS) - (SETQ FILENAME (Dict.Prop DICT 'FILENAME] - (SimpleDict.Write DICT FILENAME) - (replace (Dict contents) of DICT with (create SimpleDict.Node)) - DICT]) - -(SimpleDict.Write - [LAMBDA (DICT FILENAME) (* ; "Edited 15-Sep-88 11:21 by jtm:") - (LET (DATALIST) - (COND - [(NULL FILENAME) - (SETQ FILENAME (Dict.Prop DICT 'FILENAME] - (T (Dict.Prop DICT 'FILENAME FILENAME))) - [SimpleDict.MapEntries DICT (FUNCTION (LAMBDA (DICT PATH ENTRY) - (push DATALIST (LIST (CONCATLIST PATH) - ENTRY] - (WRITEFILE (DREVERSE DATALIST) - FILENAME) - DICT]) -) - -(RPAQQ ENGLISHSTOPWORDS - ("from" "to" "the" "of" "in" "a" "for" "on" "and" "that" "s" "is" "at" "it" "be" "by" "with" - "but" "an" "not" "i" "was" "as" "t" "this" "they" "you" "he" "all" "if" "who" "may" - "have" "out" "or" "when" "are" "so" "his" "can" "which" "about" "had" "been" "were" - "do" "has" "other" "would" "we" "also" "some" "your" "my" "me" "their" "no" "could" - "only" "more" "then" "him" "our" "any" "them" "her" "over" "its" "before" "between" - "what" "after" "she" "most" "those" "than" "these" "does" "same" "into" "such" "while" - "here" "how" "off" "will" "around" "there")) -(PUTPROPS WORDNERD COPYRIGHT ("Xerox Corporation" 1988)) -(DECLARE%: DONTCOPY - (FILEMAP (NIL (5746 9213 (WordNerd.AddEntry 5756 . 6713) (WordNerd.AddDictionary 6715 . 7805) ( -WordNerd.AddStopWords 7807 . 8049) (WordNerd.SortByFrequency 8051 . 9211)) (9214 25478 ( -WordNerd.DefaultVennSearch 9224 . 25476)) (25479 38724 (WordNerd.DefaultWeightedSearch 25489 . 34408) -(AddWeightsToArray 34410 . 35287) (FindTopElements 35289 . 36530) (AddToPriorityList 36532 . 38722)) ( -38725 41776 (WordNerd.DefaultRelevanceSearch 38735 . 40149) (MergeKeywords 40151 . 41774)) (41777 -44015 (WORDNERD.PARSEINPUT 41787 . 44013)) (44158 54130 (SimpleNerd.Create 44168 . 45489) ( -SimpleNerd.AddAssociation 45491 . 49412) (SimpleNerd.MapKeys 49414 . 50186) (SimpleNerd.GetEntry 50188 - . 50346) (SimpleNerd.MaxEntry 50348 . 50510) (SimpleNerd.GetHeader 50512 . 50720) ( -SimpleNerd.ParseDictEntry 50722 . 52162) (SimpleNerd.Test 52164 . 54128)) (54209 71892 ( -HashfileNerd.Create 54219 . 56055) (HashfileNerd.Test 56057 . 56625) (HashfileNerd.Open 56627 . 59055) - (HashfileNerd.Close 59057 . 59802) (HashfileNerd.Write 59804 . 63978) (SIMPLETYPE 63980 . 64303) ( -HashfileNerd.AddAssociation 64305 . 68875) (HashfileNerd.GetEntry 68877 . 69535) ( -HashfileNerd.ExpandKeyPattern 69537 . 70869) (HashfileNerd.MapKeys 70871 . 71890)) (71893 75042 ( -BIGHASH 71903 . 72494) (BIGGETHASH 72496 . 72992) (BIGHASHSIZE 72994 . 73532) (BIGMAPHASH 73534 . -74110) (BIGPUTHASH 74112 . 75040)) (75371 78536 (FileDict.Create 75381 . 75899) (FileDict.AddFiles -75901 . 76385) (FileDict.PrintEntry 76387 . 76644) (FileDict.Write 76646 . 76840) (FileDict.Lookup -76842 . 77096) (FileDict.MapEntries 77098 . 77660) (FETCHSTRINGFROMFILE 77662 . 78534)) (78537 79371 ( -SimpleAnalyzer.Create 78547 . 79027) (SimpleAnalyzer.Lookup 79029 . 79369)) (79372 81850 ( -SimpleDict.Create 79382 . 80070) (SimpleDict.Open 80072 . 80680) (SimpleDict.Close 80682 . 81221) ( -SimpleDict.Write 81223 . 81848))))) -STOP From 6eb903660c11155e289a39da71b6ac5c161c883c Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Thu, 17 Jul 2025 10:05:24 -0700 Subject: [PATCH 2/5] The new subdirectory didn't get committed --- lispusers/proofreader/PROOFREADER | Bin 0 -> 30358 bytes lispusers/proofreader/PROOFREADER-ANALYZER | Bin 0 -> 85197 bytes lispusers/proofreader/PROOFREADER-ANALYZER.LCOM | Bin 0 -> 34977 bytes .../proofreader/PROOFREADER-ANALYZER.TEDIT | Bin 0 -> 2279 bytes lispusers/proofreader/PROOFREADER-DICTTOOL | Bin 0 -> 93439 bytes lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM | Bin 0 -> 38436 bytes .../proofreader/PROOFREADER-DICTTOOL.TEDIT | Bin 0 -> 11348 bytes .../proofreader/PROOFREADER-PROOFREADER.TEDIT | Bin 0 -> 9531 bytes lispusers/proofreader/PROOFREADER-WORDNERD | Bin 0 -> 79893 bytes lispusers/proofreader/PROOFREADER-WORDNERD.LCOM | Bin 0 -> 29585 bytes lispusers/proofreader/PROOFREADER.LCOM | Bin 0 -> 10320 bytes lispusers/proofreader/README.TXT | Bin 0 -> 872 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lispusers/proofreader/PROOFREADER create mode 100644 lispusers/proofreader/PROOFREADER-ANALYZER create mode 100644 lispusers/proofreader/PROOFREADER-ANALYZER.LCOM create mode 100644 lispusers/proofreader/PROOFREADER-ANALYZER.TEDIT create mode 100644 lispusers/proofreader/PROOFREADER-DICTTOOL create mode 100644 lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM create mode 100644 lispusers/proofreader/PROOFREADER-DICTTOOL.TEDIT create mode 100644 lispusers/proofreader/PROOFREADER-PROOFREADER.TEDIT create mode 100644 lispusers/proofreader/PROOFREADER-WORDNERD create mode 100644 lispusers/proofreader/PROOFREADER-WORDNERD.LCOM create mode 100644 lispusers/proofreader/PROOFREADER.LCOM create mode 100644 lispusers/proofreader/README.TXT diff --git a/lispusers/proofreader/PROOFREADER b/lispusers/proofreader/PROOFREADER new file mode 100644 index 0000000000000000000000000000000000000000..ea49b1581c2d560d9997c42a7f0a698934d880cf GIT binary patch literal 30358 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@13v=;c9sAE literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER b/lispusers/proofreader/PROOFREADER-ANALYZER new file mode 100644 index 0000000000000000000000000000000000000000..d46b8c462e580239e29b5ea21fb5b968f6cf6f07 GIT binary patch literal 85197 zcmeIuF#!Mo0K%a4Pi+Tph(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ e0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA;2aoC+yDUp literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER.LCOM b/lispusers/proofreader/PROOFREADER-ANALYZER.LCOM new file mode 100644 index 0000000000000000000000000000000000000000..2853f1a89f5b98e0fc5b35b86a05b35ef5f8e79a GIT binary patch literal 34977 zcmeIuF#!Mo0K%a4Pi+kkh(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd T0RsjM7%*VKfB^#r4BQP2h@k)h literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER.TEDIT b/lispusers/proofreader/PROOFREADER-ANALYZER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..b91513ddbc0c4a65ecbd9d253aa0c65d0c61d79d GIT binary patch literal 2279 fcmZQz7zLvtFd71*Aut*OqaiRF0;3@?EJFYQ2YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK OfB^#r3>YwA;2s!l4gdiF literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM b/lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM new file mode 100644 index 0000000000000000000000000000000000000000..5dd42b60efb5f60369ac88820777b09971af4dbc GIT binary patch literal 38436 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ h0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<`0@fdQ5z00961 literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-DICTTOOL.TEDIT b/lispusers/proofreader/PROOFREADER-DICTTOOL.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..a10d04a03478edaf58528a72bdd40992f2e9f756 GIT binary patch literal 11348 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj TFkrxd0RsjM7%*VK!1KTWEK~pi literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-PROOFREADER.TEDIT b/lispusers/proofreader/PROOFREADER-PROOFREADER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..0f8afab75bc42841a8119ee36fd761987c66896e GIT binary patch literal 9531 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj LFkrxdfxCeLB|88C literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-WORDNERD b/lispusers/proofreader/PROOFREADER-WORDNERD new file mode 100644 index 0000000000000000000000000000000000000000..566b8ecae78f9013c043e5e5f732b4f0347d94ef GIT binary patch literal 79893 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ H12+Q$I3xf8 literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-WORDNERD.LCOM b/lispusers/proofreader/PROOFREADER-WORDNERD.LCOM new file mode 100644 index 0000000000000000000000000000000000000000..a6a4a89e262e99c73660c053b741c2c4a067b603 GIT binary patch literal 29585 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* v1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5VBlzAbCCc6 literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER.LCOM b/lispusers/proofreader/PROOFREADER.LCOM new file mode 100644 index 0000000000000000000000000000000000000000..8a7ab12215a4d3ef47447abd311cb064a86c2662 GIT binary patch literal 10320 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj OFkrxd0RsjMybla0Pyhh{ literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/README.TXT b/lispusers/proofreader/README.TXT new file mode 100644 index 0000000000000000000000000000000000000000..ec21897fa2fe95bc9a236fe51d871a9096faea06 GIT binary patch literal 872 zcmcgq!EVz)5ZzEvrF;PAIUr#RWVKdF3pdBLDyvaiVn-mvWn)j{Et_4-yKV@d!1wgj z|KJz+4rbSd_QDO}$kCgbH}B1iywD2Hc`LbsAU=rSgs|1!7p%c*=y0QN5H{LasIf&= zqpAcNpq?^2%}WrF>Q!ZhRt9XtEhr6At2K6jUj>Qj&bv?p)e#Ke zAZ+(!k8&SLX;Raj^yBmh`#~>G_EpXW(uXnKOg|u{uh`DDkD6;pp_ez~ty8bonqO zRx&HI#XKqhhu6QHoQ4nmwVtsNJM`%OZ*Rn2JdXc{pHky1wx7+cf!_&_A18je+US(7`tCaU*%AKE_P^cz0(X7f3;+NC literal 0 HcmV?d00001 From 29552dae151dd8b4ccad6ae6b27b08745aae3b73 Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Tue, 22 Jul 2025 00:19:06 -0700 Subject: [PATCH 3/5] Storing good versions of the moved files --- lispusers/proofreader/PROOFREADER | Bin 30358 -> 30049 bytes lispusers/proofreader/PROOFREADER-ANALYZER | Bin 85197 -> 84095 bytes .../proofreader/PROOFREADER-ANALYZER.LCOM | Bin 34977 -> 34474 bytes .../proofreader/PROOFREADER-ANALYZER.TEDIT | Bin 2279 -> 2279 bytes lispusers/proofreader/PROOFREADER-DICTTOOL | Bin 93439 -> 29942 bytes .../proofreader/PROOFREADER-DICTTOOL.LCOM | Bin 38436 -> 9978 bytes .../proofreader/PROOFREADER-DICTTOOL.TEDIT | Bin 11348 -> 11348 bytes .../proofreader/PROOFREADER-SPELLINGARRAY | Bin 0 -> 103612 bytes lispusers/proofreader/PROOFREADER-WORDNERD | Bin 79893 -> 79852 bytes .../proofreader/PROOFREADER-WORDNERD.LCOM | Bin 29585 -> 29497 bytes lispusers/proofreader/PROOFREADER.LCOM | Bin 10320 -> 10060 bytes lispusers/proofreader/PROOFREADER.TEDIT | Bin 0 -> 9531 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lispusers/proofreader/PROOFREADER-SPELLINGARRAY create mode 100644 lispusers/proofreader/PROOFREADER.TEDIT diff --git a/lispusers/proofreader/PROOFREADER b/lispusers/proofreader/PROOFREADER index ea49b1581c2d560d9997c42a7f0a698934d880cf..97eec86273e648d2ff5079c128c9e53506e0c87c 100644 GIT binary patch literal 30049 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 literal 30358 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@13v=;c9sAE diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER b/lispusers/proofreader/PROOFREADER-ANALYZER index d46b8c462e580239e29b5ea21fb5b968f6cf6f07..13968a6124238ad491ab94200968d5d15918382d 100644 GIT binary patch literal 84095 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 diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER.LCOM b/lispusers/proofreader/PROOFREADER-ANALYZER.LCOM index 2853f1a89f5b98e0fc5b35b86a05b35ef5f8e79a..ca439d0a185f7f630f12d6570ff9113c2eed5eac 100644 GIT binary patch literal 34474 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 a9<2F!YsupsV~eaiC6DUnGINmE;Qs|Tx*16T literal 34977 zcmeIuF#!Mo0K%a4Pi+kkh(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd T0RsjM7%*VKfB^#r4BQP2h@k)h diff --git a/lispusers/proofreader/PROOFREADER-ANALYZER.TEDIT b/lispusers/proofreader/PROOFREADER-ANALYZER.TEDIT index b91513ddbc0c4a65ecbd9d253aa0c65d0c61d79d..b30e528bdefc8b6497b59154c61e0b5b2b9ecf01 100644 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 2279 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 AJOBUy literal 93439 zcmeIufdBvi0K=g9Q(xf#g-~I@fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK OfB^#r3>YwA;2s!l4gdiF diff --git a/lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM b/lispusers/proofreader/PROOFREADER-DICTTOOL.LCOM index 5dd42b60efb5f60369ac88820777b09971af4dbc..6f0e5d0dd65c7384cf91115b6328c6a824338f42 100644 GIT binary patch literal 9978 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 A2><{9 literal 38436 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ h0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<`0@fdQ5z00961 diff --git a/lispusers/proofreader/PROOFREADER-DICTTOOL.TEDIT b/lispusers/proofreader/PROOFREADER-DICTTOOL.TEDIT index a10d04a03478edaf58528a72bdd40992f2e9f756..17d488c884b0993d5e2853ae25c13875c67a7265 100644 GIT binary patch literal 11348 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 TFkrxd0RsjM7%*VK!1KTWEK~pi diff --git a/lispusers/proofreader/PROOFREADER-SPELLINGARRAY b/lispusers/proofreader/PROOFREADER-SPELLINGARRAY new file mode 100644 index 0000000000000000000000000000000000000000..3d04744cad410f23b5267c119e870e44ad313c0f GIT binary patch literal 103612 zcmbrl4|G%4l{dQ2(UE*4%jQUyjcg2aB+EuNhDyc|LulsQ>uVz!Lu6s7Luf}9h8RK; z^QS3E(|PC0*N*HMDjP!#r5)KAYEsf?(xhLK_I1g|B!(s#lP3LWr!!+H?IUfzd9<&6 zUuWKY?|rxJ%$w=Vnm=njtz|Ee?>+aNz4zJYw}1P0gIZH_bX(Kv=4flv>gcxShxv+_ z(zr$0+{FFSZS76**68+_pRb5FDO$Utw*HH+Rb_h<4~ME94jT&oc8o^z!uBSO`|Ijf zw|w^C>bg+fIvxsb46oa`w!zPB#PNA;`<5?k+Hqv>;Uf<{-q~}o^T~%=pW4%T@S!L6 zb{*XN%-S{U9{SuQ7|N7y)a^)XK^zjx3-dH8dO&5QX{pFPSupX7Uw^_WgR zvj3?kO~-Z~<)7Ps@F4$fxbkG@p2zwACwb=)-uW+l_D?Pkwl=l%U~qf88P!{P@ZlZp zu^sKdHQ@iZgkaC%{ZAhK?bH6@B7bmuQ+pft^M6>f`LCe4W6fb2A2y>S911sV2=U-< zrM30pM%Db;!Z*}Eu=clZ@$>e7e`Isdb^qbWzZ-LXeJJ!Vh77MazxvM%xm%5zvoa&^ zw+l1ps44M({)B2C;=dcd+W*g|wp%q#VTS2H*yVS31)Fv%t^c^{e{Q0Gu+={f^zYj4 zUr$H-SMyo>K*NT*|7bquZU6CvemByms~!KCP5#)-CVvpgX0UFHwpKfS@6$i{(|_8l zj^OXy_AhS!j~wR+{%cdj|1eJf$v5XTL4%8=YCK{a1CIN|+1hdyM|{HrBEbbSYIGty z0Se_FrV0=;hFIEe87sj*8*@R60W>*Vieh;cJ)Txy_ZWeWEynDo_kWs({-%|!9i@=U zLQMj&x2X|%+l(-hUdO29#9;5x{sPJt9N_oIet4oKcM={>4OWX2e*648J0f?}7k)KK z#sMY+A~)^WObF2W{0pKfuMhue))9jx6uWAMg!R7+1RHB@y(g?~7!{m!l~2sI&-wTu z*lv~eZj7DS{+o!$vcV1utjlwu@&i36shdmr0%DuSpmF|r;`Z+G#vzrC@i|D=1f@Y- zKEIb~q*w58pYXaahWxSDeP#Ura8}h11|j_?3D1ge$yJG-k6G0Qx=2Yh{t?h2LgaKD zIyQ_4n%6^iK{j>I(WwUlNRpkgS`N-+s;Yl9AS9xB`)YOKN$K6wTI}&&d+B1X?1CO3 z-8N1F>p0CW(lC*c`B(hTZA~?HJ99ZnnZ5P)$xIMR8i^A=(GqRt%rPX>w@xR1JA#r>i%d(f4aeE|2p0(JuMA)r}TRlRiiW3H{zNW_qCSs^q>&v)BE zK-JU9OdpPRh&HHIi{*^w0Y8mE!w184o|Y;bkL zarIKhsZ5|1!EW+W1Xf2T8+^;bu)4`#W=V+BiT~{mKTtx-gyj`^zXWaFiCm?zbv>;S z8^rFUva`@13Du-c`yP~toHN3<|PZI1Ubt` zW3X#mW0QLVBKnO;Y{qgn;L}mFB#4S=;68Wwk%~tpve2%)RK+`K&5feq>s8ABu3AY4 zg7>76_Mo93RWoXPOD4kaGv>X~i^_e213o`Rk%0OI?FT*7^MKC-%w~^f2<(GkW3t^7 z+it0*@*oQOQdY;rkdM|n>(^l5>GhTQz+P=44DVFi@4F5JE!&vB8IT!*aPnyp(<^D- z2Nd%EdPkMp@GBoqT>olpBBjDlP6+6eQPr~Py?kyNRE})vcmAl$`vFQlXm?rIN2K=@ z(D%z!dLytp7-1*#<0D1pCb`sa)IX3ne_XnVRt@=A9R4SErt7m$bxhnRz#5!w4f~OF4S8( zZM{~+s8K`<%! z$+JV23P^nrd?fz@DfH*S1^^K^hUQY;A&@SVdDLparbl6CLWdLn5~}Hnd-0LN02&Ls!-yd7Pj^l ztuygK#)(_reUs3zw+`A@!6r|>O*)dr_Jm{3!$UKDmZh}XV}k7@pnH(2_WKCxaE$@O zgo5!Qs$#pxn>|+n@74j=L5(GkCRHMY6YA`KT-O>|ON~m*^X1Ubs5dg$c=`-q?eeE~ zx^jP!Ov&l~>BKoNmdO{wKF9Z6bef*k88dqMt~ z=Y9++US0FXCdV1mo2q5&*jt}@X|)GsS0&=Uj2Il~!_B$}3U2~4uq~J)mNENb>E_}d zR9m~D#yh{zdEjJ@h-ZM8`Lh>&u=(ydnw?A6v%E-U22^a|0J@pehQjG_umE^uEL50q zOJA(ZljFBzTR;SynFBs*@sLWdg--@qV!a`sD~Fekb|G}pQ{hcu3zNZF_9lwVTV06g zY1Mk^Ot5SfP>QhAMk1tEG<-^Tq^b__envoGNjfNGdZ-QA@Se<0TR7sW>Z}hD!|Q1d zxlm7OFa~r7o+T5I!w(}nZ5jCN*#I@oNROhE*M!4MW?c;A1Kv_)Pib{m)DX1^AqP`v zQm@N(HjJ@AVe0J+h4F(>T+cRV(>1->sD?q*`1juifx<83gUdM_@XfQQvzDAAG5gN6 zvs$KMDMLTDjqlk_xma4~9XK76VM3f=Ae?r7PFRyZb#thQ})BEgjhuT4JUzqsX*{6NU`)CQdOI0V>b`Al*p^i%vq?a6JTIborTG}&^^skOMS1%dhcDhKw6uf zu^aszt`xc!ZX~K1Zy2xM6`NNJLMM*(+{QPuW5izshvh6^8YCZEbn`WUIu4oajfJ#9IZ(;*Uv>V5*n- zAsyW5gT^c%M!e2lmB|L^39M+4wvi7bbcFi1c!BIT^q`f98y-I(>_WTU>>{#m&`|>On&7A@1O6O88`SQNl$c~mVIHt(QO0C5xq*eNIq48aLqvP0S`exxi zrgacW$3G}y;~=_0i2cI!Akon;CZ+0kWMzfZGv#0{H4k#5|K-Dh;vfEu5(Y*Na8b1!XnWr}jELU5@20 zj*vHD7j^8At#uo2mr}(8YD+2j<7MjQL=&g?IosiC9;}0t%HQb9E&T-ptv8?N)dN7kTm6#8$=3`&~Bu<72j8P;+Z7N0W;LRqZ*0nx`7Pbbt0o z8km{HyKfw)`cr$u9QmSc&iZ%F)cQD#F0@xxF^0?kpRO`DZZ?F&pQYcCtFhxPIpCK1 zDufBo)a95v|F3If&g%ic>pDUmbasv%=OUcWk{Bv3V5S9}zKmXQ5PJH+Vn~5t_wBNQT%sPG zuRg$F37Pq%O-&%W&WFB3odKopR}+qi%waO*bw^|s9g|C7*63=@_~iE4<+Bm6K}hF0 z`uEU^`qP}<1Uw=&-Ub$9wT@51n6J{~o1gn3&!#P5o4s%&J0%Gzqs{LyM>gG;r+l4{ zlenWdEtDW28f;Aimv+h}P21qVJ7R^)7f9-Vlyz=j;ABgkJpV|h&1uwg#F-C>HM_BL zG?pk#zhf;=_q3qo_Q(8S;;(P8@A${2Mwc*TLLF{cS{nHMI-1xK^Syd6CBoAplm#r> z_dho>fNqo#_hu)LVWB?hnI44H#1G>M6B~NIRnXntnYIrDsyhu$p%mI;R!GU=14=wg zP_j69s}nrC5*!tGV&8!0V9x5(J&EE)_qKL}O{e?pKiyuI5LrgshO7#3MP7GRXPA-2 z#ObPCAwx4}GX8o;X#TW8Sxg(=KySP9W569eaM1(T5cBT9HdmiKrB8)q8xuS0MM`b0 z+SrOcrswT1EP4o36Ca#85%^eG4?4T)6pX?kkNvVHZU$CkY^A-q@rw}w_nkGp4+3A% zv;Nmw9mRMIc``Zdg`y`a|41Hz?_&y81u3hg3HrF`Zt6_Pc1!BiB)16tlk~K^?b^{1 z*PIOv`g0|pxLm7r<=mgNW}N%exeMlz?Nyd$$$ke&`B$XAwk80OAge)U+<-jC*n5R~ zOpq*5@98Z%D0s}v@OFcbxwZ8BZ$l}R+lQSSMD&V?EFnz)`FhqR( zH(uuToFDewRDJbCWbqTo5nCeODS@ zh`ei)wiyx=m5)NVCCcA5z8xa~s#`#e#sz0fc6w4g0{Rc>eCR|9e1eaJz$}Gl=El(_ zmi4F+4hLLnCfDOm#b}0xOS1c?-D@kSt+g%l*~!#9F)2ZIIWp0;s*Sm0*X@rgv~AOZ z#*Q4%AVaxvkASlq73q5_$o#=UZ+2qXLY;~Q)t-XYIzztJ%bc3{y7Dqw8KjGo&L|rr zAJmR$bSGhIsg0_}7_ou{XHh3kvDGG2ngsab89;qc+#-?UWpgtP>cd>6aP^MuVIW1aN$0;9Kq z=YV{++DocTz)E9rt?g}(-m76AmV;1}%KN|5*Pyf1W~&VOzFH;v)uYwUF-h9*hJme{ zB5>6{3wb)8wX0bJ(=1BFQlNOP{%#f-^#OX1xmK7+SbwMFHdBh@W1j{jOM}*yODdRk z6>*}J&2J_1U03ZzsQ`G;+Q(>zu-vZk<5Y5l`m8hrYxVXI17?kc>O6!d+9h9E0)5lJ zu}r}8IA5y>EK=t7RyXE=2eQan-{5f*=M>}_WhHO}@FCYz_#oOjND2gxmkJ2&zPk=6l!caPEU?M#`-9Nu?!J|C2Xo0&K810X5v+FFwErNQxFdMeJ_ zXZ^3KwmvW?si!?-mb|sHBpx2~&+ZFO;EW~6@9CjXAQYun{p>|2;I;X7(d$6@riVddEC}uIX3SwFkT&Bpcgm7Qm26pPf)K2j*^@UTCB8>?JSspknl*sKTTm zaW^xEHVeP~ej1B>XZTE}s`q1*{Yp0cz67w6JedOrvuMpbQ*N?T1_7TUyK{}ZhecAY z_i~IL`n#@H0>dU1Q&du}pX5}kG0`|X=2K!5y4GMH*HgBmFm^KnYz}*ZsULoqWy|O5 z$P5GAHz)02!YVfFeJIBfUgVjiq(d#A0Iy(cQHE8v*3O$iSK`Tah9QqF+`ymni00?N z%Tr$pBJrrtA%uLXcR+u!lKX<}MwXaS%t*RP2Qo_`2nX^@(>E0Kdi(&(W`~e)<$W?F zvC}G_e?w-j&n+AN%5!Dq7~xag(MwPE=-7n+ybiKgTuiGgci_7Y8SI;JujVwe7ftOl zPsmQINf3cO03)lZK8fE^yAl9f2Q%`yW|q#DkdDGV&26Y#Y}mI(t+AS?6YLrV6WrmL z*ghHr6D+SB&G=PMp)HlEvBy%ORfk%9E4Fy_0f26bhz!BSbdk$7o(*^|#4~fWefI+G z53GZDHxb(AFlgK6vQXtG(;A0ZAJCCv(@({SZn6gVQAdLoTa$RV&O!%7C05nS8n{lg zHDk}lZO7exmJz@u0Lh$hs?K|7{uc>P$9CRef%8;Wb_F&)@4OW3nL6(&k^BbPpy3bT zRz&^&Xb;!IyeoUwx)&UBCMJ$r4@7{&L$UcH%LwL5sJD{nKCWh|$))>Bxno`X)mH(R zPG%K0Eb(BL1M7pVIP8AFtlpDiqC<&;uGaWq4Esddi)6^Fo5k3Pd5&CzoFpz%B|fTI zO1Hq9Fw<95#+#H-#9NT-DFtwa#yo4h0`3Bx{7%UOh6R{xOUk=5`G>k$a|XX~bxADP z54JDA}1%@h`;`qb#{L{8G zT(d+pMbb;$0d9n^3QNUK%UVZcNGj}uO5|@cnav+@olWQ`N3@oj9$#V2F{39U80lx- zwEaW{#px_i9EvYg=}5a&lpL-{q-9#<`vzuET~2SNHkfVK-I-+pd*RgzM@f@BwR$|s zP2`&~k2x260j_p*LUGc6W2>tq5b08KzG%SQJ1GCwiR(WCrEzsR94FSy|zE&*nZTp{ueCOHgm|NL?+-war;l=NY_6 zw4!em@qmDewl6|UYIcL_kEAtS_ZrAD<^BMN1Aab|GKyEbQak?&Wwzi^Br&)@E{?Fa z#Luk-K=NxPn@BS_`956KVW;N2?jGkOKY{`g1|j@V78%E_;ia9`q#iMsNW>?;3Uh>9 z8ys!5LHn_o$ECRBu8!rNNlS6Lc^Kwwq;Kk-Hc>nFo)gm3uYHLsN$d=eF=<=Mzr+lH zp8p-c(DA(n{^r(>ZOqxZ9TnpU_H{gxA#ERof>J)uGA>(f9#)`a=s{TO z0bKl;X*2vaFwhfrD=ghZlOBtQr#IYynues1MA*c)XFrA+olktU0wRuk>_i zY2g3l8r896GUfp04@oM&8m48R=Zzg@^R7#UaM-qL6qd?KpC{o;w4FOWtJp^aKPH<4@CT_aMi&#*DHl_!hM)<|>5lAu&|d#M`QxZ2|0 zZU+zlkqO*J+;-$22Xs5Osu{-KX|^rBlw;(e$DVKQ_At%OK}MU*fo27G_2F8RGtXFm zDPNzF`ib&ZS_vtywVRFP^yPZO^NyZwGpNtQLVosLq{iA1hD!EWI7m$z`7XRM5JO&* z^|9v^a5T-?JIL5|m_k)AZ)hJID>59+TVpcKDTwt<=@#n2Y96ce4W5c&j;xuGm3<6V zFVPD)uR({o=nLH8zVwA{2}tbAuLuf+bOZY@n46b zUbUxZyGqc~Y$nOz@A)7z6aOd|45yP={2+#bt>R^oXwHX(wHDpzYeiU=Y+>H4t>@b% zxB{~}wl5UZ8^vc6uA+J^NG_h+5R&9(-so}A#5V#KDRBQ1rF<7RBH|-FSi0P2gGhMd zf0T!gh^@Rp&WzjiKa=Lir@ATlk&h4)Z8Eq6x#;?pKraGa;PBD#Hxja@0C`5foEqLi zvJ6MD4!&Y4AwYX9k!)`pSdC_j4C3%u1q*g#(xlyUO0z=bR zorpRV-y?Z#UZ;hRk0rEw)#z^Gkf`vx)Y-jpH%#PP+!Ygv+{<>VcEnT|TpM}gV zFRF=;0DFh5b;q)E#N!XkhMK>@_@lt zxVYmzyQ1E0H5q{@v|*THN8}7#z3Yr3MYJ6WrVmP=+jn$a~mBt6N~9)_JoraXYF3^d>rJ=e0Gq(pxA?!P0+vY zym=;bAO`nn)(s@I8Pqpc(`#o^_-RXht@=kZB4biC_FLB-IV9c03=UlV%o_1^F>zzm z&@hH;gDm@(D|L4Qv`^b_>7M;Q7ls{!D=Yf>=)iESB{eVn!7<%*&j7Wm`xT+2ov)3L z)21s)*s0uGMP3zp^)1yxuY6Cf;alz4JbK{6kQt~MaG__Ce*>uDx5 zI*_OWl3CEs5Obe&IOX>M|5!3VQ3v}hO4_HW$SSA^?eSXoWJFa&$zfwf#{=4<|YsL6K= zz=lk0|9!6AFHo)WE31-@5@U1F2d#6E)?!atisfFvS!ip`^I6#=*UtRrw91Qa8|r`v z{D2wK&KgP@KlM^$(zB*U4w`Nv>0!x5{Z+5; zMF16&3rkSCsi9Hr4&|hiFrWTXD3SI4u@*un>Ln8mbsjQ^`||-^6z5F;KqC88nXGustEcHmDty zodCD&fa}5P+7x->Q1`7wC5Q0s37ZRf+{jzz={<~@*c;hP$DZx#?~XyJ;6|^{n!Q+u ze$hu^mzGjXCe|V%%CId8Z^^0kDd=_{#XQng6_$$c$%Miu>P*|0VXsE>C>b9BTQ=c8(nTjJ^~Ct}pIhluM48fmWUXN@#; zYW%dTRcq1z*7rQaH~rq!ix$lBdr@e?&8uSWE?@$@R^yL7@3vlsuCnPYlt5>s8o(H3 z9X$rG)$}#R6Ls|i<-yD^#YLC9r#~2hV->;p6btx)oS~aoH%T-MG&ediM*FRhkMARY zukDkeNW4b|#5rMMb&d{Xy|W8a&Rnys2ch`Lqyp1yWFxYIeTBDuunM-ARI-a!bGY_P zf|Dg~ih|MZ^lCsKX7=_5J%QAMv@6grmic`NwMW_EI9<^cN!@;A4MbWQ7%ZDggmZay zCg*K|e%&Zu%5hn2N9q&O>?M$bwi_s>u#Ath@x`?=;I+^g&$abho;*LXOoa$Ep9?q$ z(ttDcI(o(5Ucw)@SJo28d(#u`H&c7Ainc()3tMIpl=rxqwrjwQ;cON}z0c%aUn?d? z^Gs>`nH0`3yEYEh29`P4qtRpbe2gxdJg~XH4@rp;G`KmN66XykNs6`<2&G zbfCZ$xnyi6%t`^OteSTRVwuHd@40z!*$hJpTDq$VS<9CMy-tzSO+K98Oys3Oe$b~P zx77m!DI%Fmapw~86${Sp5oMK2=w)oy0$m)aU_9CeXvmv$T|8SzOwKOl_NCTnU`hAP zDIb~R0M-Ps5^lC3jeznBvxMql1V#&OCI&)iC_U>hb^NJTXjLn|8c}M%Vue|eNkP?? z)1cnfjAYixhmt88BlO$}+Ua~eFHOn)koU3y%Q6C$eNeKPJC^2$$IY@ckYHHlv}hpH zkprJm@LKnz)xFp_iV7fn9D+3#c=)W0HLjB+ve9Zym{4{wR53ZBe@rw|j%@wA1xW`< zetinlU;@654r#eIA$&THcq23GTrX@!1N`=~z6-8O&AO9ZtE=FG2WYBh|0cpGYf|Zm(g>-;z6@#M zCcWF>s30cEbJga(MIJ#TW-4^w*|v|(fmtnFmv;2B*$y%xGL&qeGQcjoV3`4hg7cF6 zQh58~Tq#(ZygZuTZ~KxCG*gtlF;@-zZ9k*kF30^m>`#EZu12DFa}EV&VZ?!ls|i`A z@?utU?gL@gR6ZOtY!mOB_0qG9S_ptBr`rvfG%Lr>$2ni*fmt8aPfDIO3T;f3E$)ts zCxHe9Q9bx&9tf_&%7(k0k&rRXaMr9Vv%>X9U~jCm7D}5ajfWmSano6itY}gu3|C(2 z%@naq3M>OhhVv+H`1Icu0W9xWbU8yuRQf65vsl3LR@-MeT%X*<4jWe6@=?>WaP=R7#9tjf0=L(mpe^yC%UX=*BBHZW;Cy7xcpWBb9uC zj0?vcf)*0cW9DRo*A_bfI6-F}X<;}S%kZ91BCVE+#(3gu&i2KXRQNu5(`mvU!_l9~ zIvPPbFH80_H>{MD^H|0M=?o#D-J||A73!G)`&m@Xr&Ls+WIq!L@Q@MjtDx*RU3jst zwEE4|@#fN&5n-pIr242VEYxfQ&Rm1`D}QBb|H3moo17YUi}L#?AdvGI-n1HHZ%_HU z8b%fI3u>^U9JCBTTWv!EY^JGY=x^%G%`>t+Q=Ng(lubzqvw9FkVM5I*1!2ES6*tXv zuW?r^S7qEhOy%q>7{6)$f_eD3#<#mKxK>YCE6_+Ljc>k7GrgSp>pWHYaZnPsL$f*G z@G}wb*OpihmXc1Kp-mTZRS@XDZ??=$JwSY7e5}%8@bV}cE$!dR2J<~ZM7cHto4?w@ zuPg8fz^+oe!^Uz^HI^|CO-np{*j{GgS(YHLIMAl|?eH-jBO`X;Gib&Q+)O#NB~nEi zu?zFk9$WNi9hY4J!9YRZ%udow`t+SlCOr$n-fRm(%!g<{JVJ*=ZF6rRJL^7e%zB5|+v3NPhcMoGO-wvD8Z(=CX-6&o@UKtto$ zQIUemTs76}{ZdI!uG<(un)llJ72eB1ny&hlGhtd2&$MTdR{y%qv5(M;dbip&1wMWU zP^9Hq@jN=O!^cp8Z3qe0(3;a`3rxvSgiT8&*XYISchON%^_*@+9h3QJ3cU-^&~G8^ zgfK$OtoI<0z@*zvUb9d?ucO`qGf};0azuu@z%I{z>rX<`=AzK_yuZ3JGQ2#} zU`T{krnIGN3gcBhXqxcOOwAR!@8ffgV=V(Q=p>)&19G+P)@Gaw*VM4U`+T!lu=I!R zCQ8+HMiVhV(I8W3K#a?bea!9H=O1FZ0*8kVI1Lk3jc|pT$)rNtl-dBShN(j}gDzpp z+tc}*;lv1e(u49m0!AJ74;E8uenMF0YA(ctBSuY?!;I;K1YM16PHe`S|k5Pjf{FUo~uX_o39YdTyiik!ghgxT%sT!1=7I0zk2zYRlo2+Ux(BZEp?m)Hck`gxY;%eZtY6;zdjb`+VO7#~4O6>9G0PN5C zSN<}v37MH~xYc03HWEE4IvMRJ2=AZrB!K%KFZEsAO3d_0_M4k}-gIMaq+RQCCVn1h zM5y-0QWn7>GCxW#zY&BDcx-S=GHVqaX*QmySG&f&i()Mua5pEj%d6(Vk?^``CK1YT zs9vI{0&iibFxzX%u2_$GWbx8zmPRT9yF%K$t;nGqBEELBa%r-jxZ(h-*H;dEdJ(Zb zKl<8{%?Vre!#VzgV`ZdOgg-eD88UU$#XRJvD*WKSb-q3;b*;*a%gC`6Xu5O`x4;wB z5=okDdcX*Tu^&YTfQ< zm!M#m_SR>pQy+v!Nw*nw`O5ZMkg;qLd3{Ic>3O=)Z%TxnvF*$zKKxrWcHU~!8Ypq@ z$m-);Tzgu<^HE7#z%Ggg3a7pL2|@~TDs%Py@|V@nWjB@G(x0-!+8X%p*@`+DZj!_c zLD^1k9aLye1J#uB${6tq|7KIw@VX5!Uq^ou!iNpvo}=L z7!%Fi5NzITl_hZM4r!a~pbh;GVXwdT{W30vYE(yTIltuZv)<7#$ZVnz%m=Ysa#@&L z3PJ;P7?awxaLoVWie=baTS>&^{;n}CSpjcF)Yxbo8M%zfMyo-|&0c~Sn6@djh7A|~ zeIPG|%PU{5C!vb!KCmbwP7}M&5vP3BX4awY(x?-<;_7$#?55TLlR$ah)m90pj*eN`fb%X5w3x9ZoGX>xR#m zQRH*@psd?CjTC*rg@0H!5LiX(JZPkaviuG=eSb_b>>r<{9 zQRHs)#ye+q(hjjwQgC+$ru+7H(N>=EpIzG3{GnmT*8ag;By|{eTsO6)SNB)D1mQ>0 zc59^_Gy{EaZvW0=dvB^}vgL=4v&iJLim|h(c6Wtkn+m>C;jCq5^MY6|#OA0#*~FYT zl{+;J*+BW83sp$)`IflVlp2RCIbA=_s;#+=dgrorMn9zqBPX?i%pOBDs9g7oV`nGU zE7JwZC7ou!J7{OSrQbaawzD7JpOD}>JQPni57;x~pvxugjd(Pd;7}fP_KnUA$rIR9 z-V5LG*DTvp#mZ*w){d1Oo^3I1b%Cq$2ViA370@H%AOc2R6>S08?ipPX^QIK-Q_1gS zVbz%nnJoI0b^5f~l&~L*sQv=x7TW8oO6uvhUY9y!MfrNR*Hqj02zGg&WB!{JB9e?l zLl@iVojCbyKU6-d3kO8D;KpRjFoFv%u(?jAHBXfsd42@l%c$)#ws?wCiMzb9Agy-Z z0e?+vNa18FLpGb+0t0k=uAiMsC08t*iysq;H~`80nWZEj?7;dxn|C>WM%?(l{=jis z7%xp5{(K!zrl;V10H@6cQf!piT}sn6q0 zR){E}8zLV>25H6=?ner~j#+zcy`(*81BH#d|JvC&fdf_0VHUCRJVYw_Ei^M54kx^+9aD=H3Ih; ztL(^;YLRWCC*T;3s8@=P@8F{OZsi0E3SO24c{1yC3=-1ZL#+YdHQ&uFc8&x;>b(bt zawP-atF!cW^`S|qa?i!m?GQDU5ii!_@~AUlH4Eiwp6S0r+|7x!)X-5AOkF|WFl8k| zDm(A4xLS(#1-Wkku2p*QawQOnB^q+CvYrOx*BdN9Ok4^2T8{J-G2Ct$U>ks(VFIWOBbST zg+Vc9nl^M*{M2Cfjc!M4Zz@RVdDVx9Y*`uOu%=v2=PZ6BI;y(aneW0A0#x5rX~bUV z9x~D0?rhe4t0)m`7{=0oC(o~%xSnRQXAQ=D-&hv)vQ@xXC$X$}(0~2fRH6L^9fzo_ z@SV?jtv$$p*-a;7%o-pTCMQiUE7KeSXp}a0zS7~eJH7?_`$z`SWP)aWJ^WShWwble z1?T>l&z5Cn){8hVY&P&AEqBQU)hOqH+WjR?bi6)Q#+e)_`?mLp+U);v)U%zuk~%+3 zdt4;ysQA*5=gOqmjRNHhFc`{c^h=tIG=cZL2`})$qQ9Bh4cP&sR6Xu0<&LfCEeqn2z|b@&87z#>z5ZQ`^UL?pl6map`A26YpS*qXhSwp z{q7K)%)4a|FpqvM$owV}X68u4(Im*G zOo)Hn{}VdBNMnK0N?0+6Ei@2`*liO(--fyf4k+~LS_HoCT==>O`8+@O`I+!oT8VuP#oA!qCzP()V z;&VZFvnd0o*|YR=!M?h~5)3VD8{4APWFw4=*udRxNyq zY>}3Wp56By*1gzowB9r8xv6<8M7moP4#Y29h6Z%NbCr7YREF!cvKf-xp5_Ug;)sd@ zQ#u(MdP%MU%W}B0P{+63~as=(vE?1@&pb6p*MBRfvRmw&3Q_UI7lKc43 zIC+{qcgo~-2Ac$}?$E1+?^WJyHsva~to7m(8Qc$Pw0Tyunb2JRUf;8ch{m?`?eJ*3$2m>f_3yC?>t^mhZ*tsNIq=5o%Mwa> zjom!2Uan+bDfnobjQPjrmtUEMPAF`==%)*nE>Bqm@Ng>9Yz3h%9upDcc?a6^>Ix+s zE=QgKII|P7^nEur-vf1zZhuLA-}{5d-k@kvVih&op9J{m{!UMA8`^nWK`&a9u%vW*ch6zElYROg zNnDse@s=xOlo*awbI>2N*QMIi9Z+6wp28mc;Vh&poT=7Y&n3YxD6uLs2a(D01AS=( z1%8@uD%s{jnXQcgXGGaFH|S)UcQtamx2=oG%b8yDT_LTWIbVS9p3AX-(koo65Bb~~ z)$Qvs%c~!NJ7|O!u^XQ_VR73smW>|vW0zvhana3%J0v5N?j=AcC({w`JYW~8M@mDB zgO-!QTKwjq<82A0es@W$D7HKbVj2@d?#0RT72^Kl+&ZrX&oXg-g#S0SaHiIi7JJ(x zvoFbXv)axpn5rF}Ycu8vbEUQ&8j1K#+FwPkA;HZi4ebw76mZ^f?8&mndmvTp^}QGTI~Z4c2)YOWyMSpaAh&3iP8OA!f)G z3n$G?l=1zt%zk6xhUl1hDH`PK z;0!#&4;n-V&bW&^r)o>*du_SXkoR}h^r}p4*@eN;LHE}upw2B3-^*d$n@Pzp66Vdc z`;7dhmaaRjku^if!7AmDdhbjx0aHz!yY>>P9wIwfHek<;bVgAVs$p5O!n#55%l(N2 zNj6BHh_RDF3y(yM$AR$QxQ`WIqX;3|3F~8KeS@AiRSAdAKBp~9V=Wv1|UZ#DuJf_7Jpu(lJEulpX>GsqAAlxSOtv({`TK1$Qm zzaCL7i~p6IQP-V`wccRORLK3NjDNeBsSLBwl4OePb&`-ljtEnkSr24tJZF155`tNT z8cgQLZfMyxKViuXo-y=?T^NiM16^P*$kn zIWPsZevZ8f%b;kq`uxfxsww2*VjPn0Y*4%~aH{-{A8RRcwNMTqrhG~IO(mHXS+_;P z*%S`5kFCFgSMx$XQFg7XsO1>vz2WxnErAZpm@r=N6$lCgm2lYy4kT*zH+YRe)ZKeIIW z&7+JAtTxtfY!P4Wu85OmpVP1wQ^FQWp$BzE_|QJacQk-wLPj%6UGu>Sy6yt+)SHi8uLLi=Km6 z_-8+HM+aAo@w*TUu~gBjmW;T;%?7uUD}Yrhoka!FPVQ3YBZetpr@z$OPb1cRvSzaE zr^;zQg-;bv%5gTiBCk6Iu7i)m92viU{qLId#FzIMyMH9-7|E^%GeX=N#<|g$>(-3N z-$)f-SJZCe&_Jfu)?$pW1o^&1XI_?bx{7k8zPk+yr0bmi;~~bU{mP*)4#ggS8t^GS zU9S0~N6ZfaXi_?x^WFT1JoFMUBu5DarPI|hF*PwkKU#eKn&+{|9m8vFmg}Vw`$PVt zO5O1LH)G!Vj7XOs2l-6eXFNhC{UAeNSR`_UWaDnWtQ`=N7<3{MBR4gTDwPywkhrgR z#IIE38mebp>yNF_EE&qclxDNU-w0-hz;w)V2f>YGMB<=t!{O39Y;X2iKT?$oJoSNA9zV$H`!n;=TwgVXV^C5q$VV>DHyut&z(BmUt8b5tW= zU}^VsQlGk$(5=jFzzq|B$=1fdJ2sGnlwVW15oV)5&-p#&#=jQe^((AY3jgoNALDCC zRO-_$)EdI#Qh?@XAXdO?H)5A4g_}|cOrBTfD^_ySlUSu&tJ%M3h`9eT5fsQp3xi6$ zAiakYv$f~@;4p(ks_6unv+*6-!hcj|NG3>&9*Om4O7z|{ZN~87eidiBh1;j13jw<{ z*py8?QR=^_Fj!CwqT0nWJYIUq7@FPb$@9`Cf;639Jg?jllOd&!e{&$+m=2edas}^J zsu{vYVpGjWIDVXrOB!F(&4kPs)9zfEDtU7re=Sk_#^BM5H&33WQ)YlbT*A33;UL&D3mpk zVPWw2SnAOolcFXhaG7_=UFj4KpmL<0a)CIKbAIOUce`c@IM!Znv_xQn{ZJ@n6e^5h z#=$_Rs4fb_Z1ls=xC?t_CP z7mL3@2ZM!~t7IE;^~)8dIS%bn=xptZpvb089sR^Fu=5lmc2P2*zw8rOd_bf6#i3zJ z=7~>yXQdR&|3|-Sd3@Wxs=+tFGj3!F!)pWdNc7YAcCdyx|BFQPq49%Z^dCD1D#n;O z#oh3s65VJJBb0fZlk*1@HuoP~SQNg5(`|1n0QzYfX00uz@q+)YX*!br%u0v7A({t! zLldB2bTSOB7J+HpO{Ox~3W1Z2TK%C!QCcRdVRK|0FbpZ8MO)V*o?Mmmvk!InZJ(h;% z14+_?zuG}i?vPRti`Lz~Bn+_$GB^5Bc{~y@I|qwzDO%`>$TWAOLmcmi-dL{djH{GR z(8sNjQExKI&1NLZlN9WGExq8^h2Afd|3VpxK96JuuaUA_LulN!14BBl%*^SeiEBpC0=@0&E$L8JF!zONv`Y4-l1Rf zjtKUHF`aJv&XCs1WM-`?(c!*;G$ZVbLZ*U;wx(TW_2JEc(&&HfaTU{S6s^jf+3p)W z)WlfHv?mvs8C5hALdn7j$@i~(`MH%9DRrL)wL#rGG8nB#v*S=XSi!O0B{CCF#?u)i zGsdEI$y{1}HrgorUT#@Zw}!9~uG&Xf->J(oA1ydu%iH;XZBsth$Siin>aajsyMv;~t?E^@5-k!pc36XBt8 zHdpWJRkH#0M3y4@n^;#siR>A4169HR#r>Tw_qotZ_d7Lh9T&CSq8*%@0f1&{SLlTm zcbHvpv3bE2t6FSjF?AxyiPq|B-M(iNPk7f{LV>lCwZel1 zLZnM`L{GW@!Tk(fJ|=(UZ$OH8@z4|wdD;2)axNM+E6E*MF`J4(#&8ZUVAbJM>F&N5 zOq=V78-k;8#_VGr4p)X=ffd*Gj#qOQ5j?3%|IrPc9fPW{mM;Ao^(-JYoc+As@Og-a z`%&^48~4-oCo4%}4(2}#jILN3yY_pU9#Lejse2U1uAJ-bKrU}{xL+(@-{W%|a270ofMNI$M zM-UE$6E`YIRIU8uij%NI-X9#XvN?w|MF>D~Z)5S(*X*`cA}+VSHjb1=z=QWl9d0F) zayZo@^)c+{9Zq)LuNL75dnF|3mZjiO__-tfEtY@AijT@ze3MIqg1sox@2%D#iltHQ z%s0kJ-qwD_l+Zbp%uy`g1_IzBJ@A0>fr)bLD3{?aoSzXFFp8BL#j(ajvf8RrW73zP zdojKiKAV)UUPL(UCtYC{nEDDOa$_DD+9oU!Q%l4%k?mg5-|vH*4-&$={Ym>LcNE}tBgH*a5O*4v+^OBYUfnC^L9zy3Y$4c zOr~f$MBk*zDJYHVkuc78m-6nN4#B!VSJ zy5p5nF$uAFysI?W64={*sjdrf)q;_n2U3mvR)xVL6%A*rqyy_B;MTY?7wml)K%v{; z?hu3Bk&5XXO7x<;Q*RH%wrGLPjJ<_ZWbBHhE@!K|Y2ch9^%y?#8f0TW%ahn6Dipoc zxx2~+3Kl)$a-s4?8C_Hi?0zMi@^{SgilTKgItUS439 z%;Y?_gA&_c6x9W|c*|BmU$n}q36%W!+@{d4Pz#Pqft&hAzYnO+>w0?Bf_0x4#fjuc zt$U)xtbVFqU~OS+>mS_#CK$KXrRX_zz)QyR>lB=|a`!KI#`emcW zI3>I>%hzDbH4kMCU@NU7EyS~sx_-A$&vaF4E6j;6fl{@4cem5S?RoFcm;Pwqqc(B@ zCl?{ml1}ev36fha1%yPGB&4Bg6=%a4Px?n4Vd@AL{VudMpyr+K-t2(p#x{DK#BU_# zHB%OazKkqBrDXS9a!8!k7;>z?Eek7zx+^#NBb|Ct`1^C}HHC&H*D#gw6bjkmQ zM7l4ayADT=$0gs=h6D}3iwiUOu54;Yni{SrMuXwesW|ng@G_x0(7blj0_K`)Bwqrik zmjM@S9F^DMDK2OgCnzKB->00D?1GHX{tT5#@Up%89 zZ_AV4P?Nn<&x;?}ZF9C;DTZbL?K+J6qkT^;6Q(%%b(1ZXm?ojx-b_# z%p0AJ$kc-+SVxh5e3A4Q&iIing9Ppf4q=x{X5f<=sbl7s(fK`1O~->rTfzkK4$8vy z8n?(`CZD2W2}rgY4(aNHYH}qq8;E@AahF1)3_;}T#H+I@<|{?(Phq8Gn3X#VD8yJb zceBu3CrT|FZyfGAnZULgW-udw{#t;Q1*Dk{hZ(uTBDEl1c{0mW zH!!AC>4`d!04;%ssCdwY^}te#X9&)&3SDBWRwvuksBdq55=Bf(zm;0{zo*ceSPm+j zIgRF}QZ^1S#)!9opX%z#5L)RL&w@sjqa6XLtWv_EkPD_FlhHxtcodr&^Rs`iX$DMf z?+!IN#5!HYrNa(8vJ$w=ZqGNp9vGRsHP{tD?#tE@ui+0=w(CBrNL(lQ;av@{_K~3Q zMrH;jRn%38iuup1q~AKwi-(l^7t1FznP0Arpp;p}{E-1&l2P}cDFRgatt33%d)zRj zxpbITD9W6Olgx^Qu|{ZM&-{D5-uWFw=jAS|%AB=`iI)2~6(JnLhi0J^wbG4iw7gz9{Z&IhA&@VIO8bOVpvQ)69LNh05Y#p<70Gt!%_B ztu*6tI8KeoBHq)V({jP3ZDrKsG*9o4gGe%UrJ0EB&C=q8m=;Okg1iKYE{8G${IgJR zarj9j3w;MhEA17cjO*7dYvk@`X9{PLybd){2Kp2qpdGPk_I2>7(=gbgJ_5);D03>0&iZ!zfg#a~i0e?oO;QCFe;QI-9hFv1wtRyq zP*>^xt{Qa5X7x~%WyKr%OT#1(2(6YOoeiT&e5nr`;Te`$0by4F}#{W^v3fZ6z;QIeSDZ8@U3HOU(ij+`K43QrJL znMWUWJawr8e;>H}cZ>3p=wi{lu!%I9JTWysKAuLltjzp9MDWHILC6{XHxg>Zz1>l_ z=k*gLy7+j{__;TG-WW^eFXZMY^5rlYN8ZFa9EJo-83_hMMO?^&PhgXl_n`ucnkAv{ z%YI8bF@6u+BZ8hPj*`6c*l`7NNDjbZ6e^M*f?@u(hii;NIE zdclMLFK-ZDxtn@|Eu5))_I0aJ*=)3UD_Qmi23zL6P%vTShG$#!Sus+0>#eKBA0)R^95o&!%3QkmRDvAqASYpLD2NU(O z52-Wx1+4#{5Y(xjF~_T<6T9?imxAULJE7{PRAv2Fmy16QkG&Ji%S@_)D7MtbhyQ_}d~dZ$@$W$~+sFKAI5$FMkR~r-Isyg>h*~^i+kQ za;OM&e7bvs`Jy9{IOgi;T;os%5(kv70G#YkW9xuKuvMybO}lW;IUaV-7ON&|gF!{^ zsf=4b0WtMNNia9G6}09{F+Zem?GBO8tfdLZ+AbxBhKm(`v>M)?z|#`<_GGUPZVM27 zQ^uQ-4S-Aq+S2_D0D5p4pBu+0ly<-X-muBpWm}@6Vr`%*J%RnckTVjiWq;UYOSfr( z^2@#8hqlLlNZX`T;`UdBE=Ol_Zh#(z{xk#}PXBp{xg^r&qYM0-_`wS67^w(Wbw1`@ zJFy76bq1c}7m{VkXYT=hBmg+>_MeNj7faC+g3fR!>?6zkke^BTvnuCvzH|uBj>3F$ zG~8d@nkgQHZubYxyZ#3C3F&AM>#W=gGm3KO!NpRpnPP-XS@l#VN#9O63xNqKF%wzM zwV_R`Du2owCDsV?At?2$fSQiSJV@;B2XQqSxG9JdV6DbjhiaJv-cPtn*vw6I&Q-CD z^e6W{3`i@3?J^NtH?r_o6zxbAZHWiHn@p72jrSi>z8AG^_Y7WuH&ZP0EI_}%CfJ^z zU?urGA5Y}(s89r}pq`hDJ6(YPloDaa)UhPf%zCI(dbS00KX(=^6Co}-XWbRSf+7Fd z8nh|D&a>=qi_-hA5<4p5GT#&Q7mz|W@hH4L2$5Ntv0yU5969`JCFMk8bUqRg9|e>} z$h? z7CM=YU^1-8z`|Ns68$#wk|@54Dzv~c#h zB;p55St8?C&!e>(!BA!O7`sE%$547WB>Zmpq9P8cBZ>zO1IfxZIA`UgFFROBsV%ki zV{4-8CHGM$ofFw$d+GYU?&fx5-rQe}hYim=NStl&3wOA>XP)HF{3p{zqGc*0mHem$ z!OJj_<09LW$ga~icqMJ%1wN1=;1DW#5#S0Ujp|mU$B`?U0YGVKwDkb@=e+U8FbOmf{ zqn9|}p2~XJQZP|OOY?T)E^s=gf;DllJY~Wc&q8BSy0J68VO*}U*SSwGCse0W5Ht5v zn&NwDQhOWxA-cnru7{&_RO}%iVG|-Jg5(?0#R-MD} zXjT-alvy3f(ig!`XC!p~xH*$wIVNjp#au~=rzA@^P3Qd{u~_ko@KDNnr)s?SUrs9r zOB3$UH4+zcrN5oUCYJY5#m$wh4(Ng027f)F?S7V2V_A&Z#hKb}IzTR?mD%3lt7qtM z{V#d#qK+p%C3;NG0>Ic>Ke)plE{PlMr^T=tf_7c{ZoS`u=kwLy7o;+ORMhrwq3!PL z4yi*Z5`wt&KK^ckgXswlY06+o=BS`CzxY=ppA)AUw!yOYNQpm`+HvGx&dQi##d7Rafer*&srH?ma2yfjgkdn!C#%4tw?N$mn^1A4^`%4ys{)eYTiL2qUc*)4=u`Cp^&pjYQz|3aPaC;;jNQ@xzPq(sNfK zhAAG&hbT)S*bChI+0{i%_V{cK$JCg>UtS%=2tY8L70Drg-;ECRQJ%kq(+c+>0R_o`rez zy*AiK1J)Qc#}`FAohAM{RQ_)*UrM#rx%1hF+f=ctnurQN3)O{9sYJ_7;<8#Q>0C=OO)Q;SQ&uG zOOnLtu9b`p^e>CB_s87rQ#iq#Le>{p)AP)xN>>U_w6%7o1KGPS6-P{wIu);;oIhXl z6MFm2sM_fD6VrSEy&_Z!xjm8KM3nn?dy{ausq@+X1ks`?Mr5)kO32kp{oAu1Zzc8) z=6Rv>N@z?^GPNSt3M-dqmol=35^YK&be$Wk((4>TQj?ySXLSc#Z=~>Te44vM6k&9o%Esgrwl(>nymEZEShAcuYUv=E?o97##0_Om{$#?auKct(ZL%_pV1 zwW{uUxy!ZsAWy3 zP7NsO=G6($YkhI2Q*-PjwK0I7f9WG&#}^EOJWV6B6NohZ*+7Z$buCZ&!pu#b52;eV z)Ojs28p-jH^k@dHg!&wjjZ8~5->q;L^>#i6`R8b_h63F1wQz zAW$Tz;2!Qf_!V|IcThM#tKFdY6~qf}H-hfj=WZRu^~D}LevvarBKfPP;{}#uscb1+ALf2{MDj`QQK$VBWKe|uNEaP zSKX7}l;Yzp=2Ld%T!$2wS9(t~#nR3TQX%hS)R#@|7k}v=h_Mp@AuGP*(9(y|oo}a$ zrK2We(pRs3ey^o?#Pk=3c^gEbLU0^TLuL~EDRC-o#M+NVX&dItj4oshgG6Cj*`%^O zTqg-indxd5^lclR5N$QqyuYntD>I5ewvpl?2T66W`9CAnvclMkIu7y16g=T18qpx_ z?&;wjfq-m!{r42Nm@VRAKc0xXr!@IY#teH_fEUSx1;yco{$lq3!GvtZ{2b{uU<3QOyYhG^W5y37*bNPhT#XU$u3=7(AhrB>acJtTi-dqbIEf-q=p54>N7()OiSHN>2yR|;d6N! zM7B*Op%(Pg*(R3u*bMO}>`;FoH}S8@Iz&ZMmA!nu_F_yJ^z2#ST_@P62qsF;%y;GK zuuoP_AR%d6wz$mo5Y22QNm^V^Oofs97CAk>d*X-X>O||er}irh@V~T9pQ-Vzr@VBi z^wT%*#JoTpnobvZ5|6OBq1Kv z8p>kJ)W*G)UXdm=5+>x-GRpeV)IZIm1=p~+DocK$FsGf+L{Nt`;{iowZdWLCr-FOS zUeGn+lX7XbJ~FK+sxIUY6d}!h{?_vap1@TPN$q>gD>nPH@Rhle%K0pp{XT9b%|qYx zFQ>4AHlqk{g$Tu&unQa~F$SMJOKF8#8Gy3R%vQtZB^|X>|h-?Xc1NGC7G3`YW;0%ZxNlQ=jFs-cs@B1Rv z-W=iJ{W1x9o`Y0nExvz%E?13+qSB06s3|9G?23A?zS5bPX_FYS-p%SgXpir_HaL?B ztTC_j?+-4PWJ3oiydDSvX%dT3U8%eLMzhtswnZqB!&;z*pUWdjWz0pO()VJf z85SzoSK|{qZJq^!6$Ai1e~~l|8tz}GkizQ#H^Pn7s*`^KeoRu_83i5032Hw{~*k2)K{c57M*&3;a7a$0VeQfyPV$}e^9^Qz^BIo{Q;-`2+ zj3P@EiD`54R+Rjg+%CEp+j~Ny8*QnmPzw)eO!f55uB)xCBV1M9BlWWRu-!} zevML-WtmrbI5vSz(@RUMSMXdai-v{f=g^egRtZyX+`ZaJ=f4YbuFV5sR6za#A^{?0EMWcMq-_??oQiy-)C z;(VZ7=r;3ql557E%?+`;sa3EC=lgoB>g+`8ez)8Uf2=4hTIQ0Win-2EZh?cV8r(lk zCTA;Nr*Y*+a78BE=DVh6PBtJa7yFbs_ntx%LZjEj{}5AhbP)$-7(+&HyV!VETY8IS zS;QZ8jSqCs?Fqt_@3)n>s@Ox8nZO=eVs2w@mLOwum;J%1y3IxVmF;1%;vGiYvDY_o z=3J)|JZrNo1eURp@GNtz@YDp+SI8#b2~*?;E>@Y=grmf}?^|Dy2RE4ht-fPw+^^dF z^MrB)(PVLrXS#+b$~#NAC+vA)A*-x8k;b7MpD0Ty*AsCv39bqcJ5%7LviF+nlKtT8 zpN|Ng!D+lULtnD~SZ@ZUdB*)7WT7}jqgjPa@Hks@i~WM6(yipTQ$1jPP^_fzOG-dQ zVPsaG7hy=X8(Fr8JYbo+lJuXQ%w@=GC71`LXDOszXPlJ&`d)g$+*Y?R_XPq?g2ay~ zlR_pR`(vbbNzSYlCwtFaIB}sLN)dfMoL0F~^!v_)KFETpeqSLmp9FnvISQZ!aZ;xG zZGg*PT89e>*-qK?{P{#EhL?Ml!9&VYqH@jb^`A^Um7CP)W!8fZFeRDxX=`2i|F|1k z9&+IkqQ$Xwe<8GQiNWBe`|hu1sm>Mjy|v@F0ihFB;l{Vrv8bTAzH&J9@=&-5se_)k z-(`c!=@AWu47Y2h&gF{id%w?+G-4SJNx%dwgHYkAP#e7)!mnj5X3PXH(XUfOFb45fmY4(&!Z`*y_sjsaJUh;!C1$PU> zTdqmBKYi|!ucvT7XrZrpem4f_?i{%MlT-Ko&2pIx%S;*p9(u$y8HBd^rH9RdQS?Pz z`&|UC&}$(IL87g(&s2`^rv^ATpDZCdds93f}rm(^g9P7Y}m2gw>$Q;JW-|P3u7Rw_G zykhc=($8acHt|VAsavrxnYVVcI_`9(KImDPD-){{Xq8nT1-=#O8E>%kV`P*PyT;#U zIPhBSV7SleE;`+=#6xoZ#rCxgqGS@J%k}0!1}8(f)Il8-g}lc6g_z4dAsICYWM2+- z#@`aj{;W{ad)6vqy6nfCx<~y#_UOexrQwHz)s>JtzhA><#cW=itC+Z@7aZHr?|Hz{ z;GFv-)w1+)&ddDFtW&%cO5idmT&3_~rmqVQ$C2=2r+mZ<36X%?84{^yG7`%hwYMW_ zI*?wrydMl2#I7H7#H6R`mAiuF6{(}3x350ToFhqXz7ZWcO}*}y^f|KjA9sJ=kjbuX z)!e=d%2?PH*^`M7y4f=uK%~I77d$k$_D>UV=Za4=4SOt7_TpR=Af#!;525Pd7H{}Yyald$K4t+H#{2hNBQT?jv{Tbd=$2^M%MYS#LiMNO&l|RtY zT1Tp3z-Q=PJeOWz-j`ck=9ILB%~d`W^%HzN(R7eHJx@0dW9Thc9@jj*7iR#OEhCW~ z8IKrR3HGaq5?aY+Ltg?UuBCRVQXqEiLe`OY-0(CG5#s@15+5ikeA9hpYgVH}kg}0B1tfyyq=0_@zET?@L`dPixeH3`rM(DLh^=pOt3y^MK^3X=u_< zUP{YMv*Y%o=!@SKxKt^ZT_unl8=~;T^19vVRVp&_v%zC?s znI6n2u*avIT7S6Z+=eHn^1ASQ^PI7f$m2A7kMBsKej@)tc&G$PIn$V!O7?B2HZu%9 z!zo3Ai>KrLljayzZf66qlcFR1hC$%#2l87m`Gl3!GL)1kni*n593j}2%*!oXm6{Fs z?c4a}O%nG{v*amALshNM`EqsEttxRFg^g*C0r7?$5Z`+jJU2u?1G@FF5-nn~P6(2$ z!HMln$*{vG#%=|!8xR6`=ut5pHInRDt-D(Hccmm)NP)`u%Jj)vm%WP1~bFvG_2PvH$fI4!F^BUjSB&1q+0Q{kq#>Vu95GaYg>|VD>$w6Hi#$Oziml_OKIRFL1vQ66@2=0GBv!mKG2k{ z=^YumIA8f@I^vcaLqQ|a!}ra5K87XfqpqJUf04K3ys|FR$Tj#pS@O{qIi$r9xizMx z+B#EyUyIFMKAygMHn**J=JTk&#M8uRlS+3c+2yCJC+h;*Xch~l2wp+ux269DqN%h? zvD(`77A=i!ZRRhi2S3x!O~KPXgsURcCkh+|e1ZKA;P9Zz?U!hO zda^*mu44+@I7mT(wxT~8w`*Kb6$M$?nte5;_(|4`V=H`7YR2?GIae}Ly`8OFd_%5N zFvhld`NV;fAy(+ntZ`bD<%g9N@f_bi;#0*B{UQXtHWpeAiG793b1Yp%ZSoc- zM_qwG1i>$*S!L*n2S!jyLZ64$xQKQ$+MLuMJD4ea@xOm5HoZa>!F@E+HIYaf)|~Lq zlk4L(4`<|##$+!%TQg0YN9{-lTR2D#ll0Colvr%AESOjmWM37D`$WPa*{G7hvE)q2 zFYzUZdlHo!c5ay@Hz(qU>LFyw95YG$1m z|7!6Ox2b`v23EoJGc#>5iEdHxb%@F`OVtl(9K7ti+;v>RmkB-+>oa^-MMmz2{DYQ; z5gYrLCx^Vn@itjS*|N7B{OJf-8#DFN>$Cng^A*T}UBuqQz22keIx6%OFBgRc7o%C0 zj(GHb3*;Ek0e+|Sx9-TEGp7PpV!!exACJ4R1&~bZkgbv}_j9yFKp*9vSR1lq_94i? z=2uik<^dnP%qAa(Kb;C74NH4ox}96N<~__Ze&`+qu8F>2MmMZS%XXJQF4>1-DV(cV znTTEzO1nD4mK+6rZr8Vtu81DyZbi>%$^SMfjKa9M3G$?hkE-Ue0XC0s^NgD?kzySD zmrwB7h3mz|3r|M-BK@WmMN(eyDA)ZSBPIb_KA==ofi;oiPkDERg|_sKjL|XU0a@+* z^=37u)O;J;G!Xlwhb(YmRmno&kP@zF44opQ_?`>26!ittm*Js(%IkZ_x_WtO;Yws; zy?bEWQQvUcg#@ZZzEF9NspEi|Inw*eir`dAAYLA4g_Tp#rAbq(5+brCKFCURy9s^y`ELf z(V?;19j0iZ`JTraK(u{cFb6LEKnaR$6lQRKNhH=r_Q|5F*X(>*Zj|i)7e=EwVE9U` z%z2IM0BjW;W4D+U)t<2xwl{vK7y$;kpM&cgq&H2uRnO0`Jn*5~U z#u>aV%hY^)TG`=A9|Gao9!mzl%uzZl(-zN>$t`5DYGUfNN3UL-D3xZco$-DX6~nmc znY<>^bL=dd{n)Aho6HwJloc4@p`EvxvI?;KaTnzwNa7mgo$c*IgKU}%;*qg1O@@xW z!TDDQC5e(6FpdD1$xCOa4-zVQA8wJ}H>>frQ<%$q)3AGtu9k!BfUJ5;D8awZFxRG1 zYa{*}&Bww`1A{uSt7W)e$)VBO)iTxs72oUb^T$lrffZGdfQhULldKZDX28II6rV8c z9whW^N+zJapuXjec1TcWc`F zPxw>l!Tkvef1NUV_B2R33oBJ6O8Yt_=@3-?|8|)QIBLjxVY3Hz{7-$Vek5WlK>oI5tX(|1MX3eRJHrt^JtcL_Za=(~;c}AyEsh3E zxt1GhanWtBTY9b;PxGk;*d;Sgg)*$mA~X<>#vLBskZPr^I1OPMN=f^YjR%w~+z$?N zGpm}YGg?x0KLqkfKZpS#ViHOQ+KK7UU(xPy1s}WK&?6VOLT=tve9mMN8Y0Rm+?9#L z?9f+3b&&SS5u__(-btR{vmeRYC|zSmGNAB!S^xiPK;DMQpzP%fa@t03<1IUd3?6%W zNK0}W@-Q^}tnc0QRH4`^-lzXhh0AMj-JSJi>4jo1uZa0~o-FhEn1CabRo`?V@qd22 zvS?DsADRsqK6*;@0&Yogl*#PtKVm%eI*Yk(YjH2&&-}0hlz*ry3#wF3dQnu^=Z+r=i|J9X&dF#(+tMXJV@2c*wFE7j3RWXWWrlw ztHH2b62`m4b|n(*Wr|FOv%7vt?la74@L`6;pX(#W2Xm2rWccm`ny#x#DEsfT5iTA@ zt_ZT7sd5^dY^G#*FYkL*5rIRJRci=un~wjbEMi?UyW`NWh1$Aim4E1peUG7|EXVtW zWl@}a1|+0Lv+?wyZf#|Aewps*84(AB>C9+rU_+A?mswx5h>2~@t18GKYn0U73#zM z5s#IiC6)_xEnM1$9o4Gs_WKLQpa{gcBF~gl;&Jj~NND%6bYIgIBcKshzER-Gt7mk# zGJl}>X%{Z0BI0G|=9PK1tW&t?Z%B1YXW^2#G)Koy{|;aP6B=Y6kku?BHcB%gqqzK$ z&~(-hnI)30HlC$Rs&MnfsfAong4OpLqScrRSAFx@@T5I0N$R&U?K{hh2q%FzhPEr3hA5GMZ?0 z(I8>2aXW_z>{}{0Cha|td^0Cq8)onGd&&8yB7Dh$2UHpUoxeiy42>zM+qopB_)F>e z_e(ris>&sM)n0|Hxt1-VMNK=QH=IuCW4qeS?z@n74py$j$54Fel=QHMDOwhi>2x|B+_)<>n%;4H8d^FZV&8-0-$2t|pz=Xy#~Pq7OvJUi%4^V7uS@&-4o$KcED zw5PbIJWR5n=Q|1TcIIc`sY@e54z#%gMS4PM{d{!#cv8G-}4%()n&&}hlpOR zs{6*V`bqxr^C~ZrtdXn?k(GHocC!UB&v=RGwBnl`SwAhet<30^RC#(T6qQcJY~8@Q zTt()*l+obOT=KV7UToUq)|pyoHECR0(Gdh)HtuMp7z6W__fc91LQB?%0>85!F2zpX zfgESY^Hh$H;n+U%YzpPCtB-tE3uLEEW5NX^;BDQc;lmJ;XUw(24C0|ILT$B}v;9178FvG5|FB z#21hK+fL7ewbdsc4ftV$w-Znp{!NUDqm=s*gn|#6q98?pmaY~_XAV6;xDV{}I4V`F z1=g!q1+a|>-)V`mF_;L->(2K{{&M#3 zT%K$BkdZW->_1i_yPu|op+ao{Ro&fJDLmLNl2EQeHB!*u^5gVKB+i9yc(K?b`BzT=nyMxwS;F-P$GmZzTl_$pY%4fV#FH`hTxnXEs4=E(7k7ySqrTwIVigG3-( zKHi?`uZu)=fnbSZr;Zx~tW}$gk|?Y+I&gNkgYauv?&)2gEurcc&6L$0U}KZ}ypHbL zn!=iLj&ywju6u#(FO)*JWDZhW>lLY%3-}7DPRu2augiJhxO7+VkU!qXQ0nE(QoZBv z8K$0)ePNh5iXopNd5*i^lI+2kw`U=zJE`uB?u-5&z!##dq};?C8mQJ65F@Q9$U=6% zvz)r2s+fSA_?%B|4SORX6t^L?BMowh*L|AiMhC+pJz0GnkHh{oS=iyyUMrhBRc9K z&_*uP7Sj!P1=FF3$2!4OND%`Fh?pbP; z#zyUymQDh@WUXsPDB8b%eO`~c6u((#1wO5$Q$irD~-iss|^MtV0Z;@-DB4q2b~ z+LK}YvBR|*)h7sDiI6uXo`$jBY`5Xto87*vcT;kGOGA31=c&d#A_8wVs3KYTX5TbJ z*j8wU){DRj4tyH)h0ME|z%YuQ?cR?|A^PfDYtmPdvM55B#$?}WY_`T^z5dAGPFJU< zDhESuCD@hjZJnwPXAd&{mqW-tGvhkY_8GjWY#_~WcQfx2Jq>c6m@`vwxn&)N_hgCi zP|-cp;W<&~6NEBx4jT1dx$G)Xw_OV6q@&|gPI7`XNN!m2Y5`ECTENS>jD^jR=A7wP zZ}b`uPa~fXrzlJ(1pz-Cu8}YNra)emy`rr%_@2{*SP}}poBiwdk^<$a+czR{s13Kv zGYNBgW=nhJ5icW`wI=@4MlpiYeOrc59|VvCU{1fX^ImM@J7x2HC#{6=OJ4IXO1scY zvOPD)TdE}1;kVQSF!#?X^i_`Bb6|DGGfIw?X?Fv;?|yvr{SdVVpievL-`War)e}ZY z(f%Op%Zqa{*=BC_>y!B7Xy`2|I=n9w8P??fG52ot1rbYH9U@UaCU~kd;t5+5zj#S} zTqyp3irzmi%InM{uT8exCBTZ;R&s9!Z1JrRFL8`HYTp_9kVgFhXNj$sc z^s0cLL+9ElJ$z??5duMLXtD(rHxx!+y$pb_zAwLv6z>EllJ@8aG9%+{x496;6d& zA@@+q-`61W5oEFKZ${m*;xp8Sd~;cUEXaR%1Lb)DeQ4HYx*X4%S6tXVO4$g#UfpPQ z7Q5!N*v~l$b+`;DIfUF=tnw@hsHIe>&~1LPrfz2;5v8SLApg-FYjt+R^^fQ1P+8DF zR7;HTnA*FV?A;UU;yD_RW_YuJvJ_C8$7ZPsL3PT*j`1r;Vq%|H`cyz;UEu3MdxP6C z*?>mY#0v7d4zK2rr!EG-dwSEdmnozp98AZ8H83=?K?9uZbT2$t?`)E2nHrzt!yD8D z|0sG3_qjrmv(n|uMRiJ;+7z&sNv{eEPOo*A(7yv%U&w69ARyF+1^bL0cZ6j!}cd=z0!YrDYBBA036C2xV{7Wy-P}Mj%X_>y2rUMm2 z5dLn)-O5UYt#YN1rcG#-qTMJ6J6jIOOd=`pG4_6EXwJw|#Stz208+o^;o_vr3T zP-QBREar>63*W8n0eW@6dR&Dv3qXZ4dt2_srRL<1l&|_|37HBq@R{QrErhX&R6Cb4 zH_0p|015wdihWkYz((>*)N=hNi*6>f$*XI7rvvvD_INfCS{uNPRFI4}F`kWCZC_FK3Dl*yUZl@;GwyT2wG78r3 z6(P}U%+i`Q9rG|(){3zh2gd*p?q0o{Wmh^phcvZBfqng6ez!X?hVO5D+lPR&ip8j3HWK`Mp9FmnPlQ5)dl&OrpRhlpxVurh@S$ol6`n(4+s*+s7Kii5+HX*m`&uFV?;{(~`;AbJ=GpNrD z6TR(gSAFMjmerr-08Aq522lcfGb$5%nv%SMOtiyg{}*$~anp2>>ucs)NGQ5i(ugFe zHL3ro<8KfMVvBNV!P#}I5P^{Ug;!5F`%RuWHd^0cMnlJ6 zQE3`(V<_VF=e!u{@MD1j-nS!w%`Qdl>~l}c)h<>(>LP`afTF_)#%mMmWdhYa;{pAL zEi5SAUc=EpRciXeq(9;EG<*&;W0z#tN;5#QentTr@$k$SQuIq*$%A1*?@F zhx)Y^OiXiMsxXKBFW0UBwmAZo3mEF1G0J)T@T!Ip{nOxXUk&xX2@{Y~4)kvxy#UE5 z9TQ`XP*ckTd}C?+85HQSnXjGBNT1y*$McC1eIRyhok-b~5X-?8;P1yLRo>QxYCuK3 zglARD%FaB)zHy^6pz;>w7`_`Ps#Uywr&W_e@ryIW7@ms)B<>6!g2!i%B7MQWp(qWA z4QTyB*2?F{A{%+efA}nF(rYI0}mL%S%Zzq#yHL_Iyt96xIRWpQSDloH6#tJWk-DG<-D* zZr_f^q+4tnNhG&FhpXBQH1Y)My4Y@vxo6bAH#)J~^jHsf1((i%Y>D!_y3582LRjO< zdaZLxq571=hBeX%^EOh7(*m!DUT(}TeFZy{V#`8vya^eb$@I1$Sq!nCL9i-%NQ zLZdOTOztf{e(uD3YJ&qyW2UEkoYX2Fd>jJI*AW9yEyr^A3Yu)>tnY zhQd7~4$^)ARJc>K3wh1o@VeKLb34XaZ8G-B-&+ID`Mmk@O>To4y|rOzOS&}@;DI@e z*uqku3wp9VSd$l1q^T>lrf}X)t6Ib8Zdug;29BGMD?UB-PN4nY+GppGecIUrhuf!t3m9&d^JR>tMPE>Vq4CML`~o z6MFU*@-Q<|lP=-e0On@)&Z&li#W7W;s=t`9Nsmx8h;bXctd~aqsJE`ijxV>VUqGau z-WYEzLl9>xr`BdhYo-=UFJp5n3)WpjdKuJk( zvj*{AYHz<_hZpxp7v4$>=MdPTUoS`LoQ3mhauc%bDpvlDH!vk8XyakD`+0e>A1xA) z^AIeOZ`NzUdOhT<_E4riM!TBmScAFKIjpi8{57Em+2MdGPQI!N|Lo@J&PgrAMSF7HIZOkS0f~u&bPnF zN1d=3B=@3;FU0(cCm@l_bG%S5x+mcY;)z`v$ju(~X5u&x<3*<#Uj2ZaWBveaO?&$Q z3IC>)EDiPRHi!ZoP~ zgFi>*X;4oZrOt_z^P#~CHS0Iqdx7x;Jpb5*kC$~< zz5$Eo+6sMLiTjv3F7qJT*ID%-wDyv+C~NBL%tfINCo7K< zXNaJ{Nd(-xdLc|gS0<6~bhXXj=W)TT4ltXF%nvjtqDxfbp_X{)v9YtBi;4Iz6h)c< zERFk}yrdBTrtfs2BN#uUw$2wP-1Z0v?xvja?7w(=p-uq`?0mD$%iNoX+vqd4I7oKU z6|}93H{K0AKpEW^3ix|Y-RdCo|<=<23lSqyG@+vn_6fEQ7!2yz3y`&NA7BQuegsj*tU*J&%^37^&RC@K$r zZx?6;TB}F&yMj%T8hBEj()~@#RgD5I6iDTKq$By!nhOc1gju1o( zbWUS4+Y#p75g;5fhaaYGl_fzIAO}9ei6A#qz%&_ZZIP-<#JaXOgh2$-N1|1kM+$h9 zGyM#Ue`6VK<#ACL2doHsqy7^VJ5Y94kF}CePbyMrn8C>(sy6#RL)H_9(hCL4R7IsETA@(@-{zJp|NUWZa_O0b6ZoIU=eM*4SMq zOYjCqNyP@J&G5CEp!KX;B1K*u&+$4-l_^HGFEbfY;JzLH_P>(jtdvzkDO@d}J?~Hc z`z^;QNNo@2)YX2XY)?{!wfxoUng<^~K74Fcf85b(GS`IQ+A`eA?ByR>@u7hBTPlIu z>nE4Eg$ei6RsY2l5LKY*JR_QWwtB1%db=IWXSiIz0|lW6c%<9As57-m9q^7=uF&gD zl1se&xveCY5gL>xCcD!xb2}>-u3mM(?;P@*veu$`J>jJVSDRLt>3-j4V2x+(i+RlV z{xk}9om=F782*h71!~;H38Z*00#oaS!WXAIfc@NzObWb`Kd$_&R#bGbvm z7~F=2UT#_GX;R5gBT*(N6k>-+p!V%3%`3lN6a}`wF^{jeWpYMqH5p5iG5fyw=@V1Jujg-gz#6(kbVwI*Ba$>EWCGP5Iu1iL|epJ-`yFyzrKBD zy#Ed2Pf_R%w|;~LqjsXyy#2-HvVmlNIfo};X7bY4p*=hU^RL60(cKSUR);BBuPhL@ zG&^d^b-sCHyIh9$=R@K`=zfadMS%Kt({WSc0c_VS?8-usJ>RZlT&VM-Ud>2(Sj))7 zndSDBy75wUoQ>YAT1YFR`vh-}33GFtSdG&9_PD)t%pwDrTeE5ftmP?JFq}H9G8_(c z2i8FIgOQr24OeWICpiRp#u|Zfo|Ia}yIE-nJ0adr11~#?ZwYvo4Mu>b%>Wfuc9Qf} z0UpP5U}nFt%$*wVK254zMlOnIKa02$4&J4KL~teSzF@dK5#ze zBD2@9HfPnbe!qD+Hhrl817#i2Xlr>f)+qxnP$D9r+<}qUPzQ8kkYn7lTSQJuC51tZU-)>%VhFx4%tMg67%u zC_RcEn?XlyDRF>3J;k&`;aBn}`8RA%_dYisvWU$+5kfD*(f2~Ek8|IE2TsiOK8FNp zeR8O5kJKw46pp>fB1?K~aHHE+Z(zQ2oJL+mXt+<6oTD_as=28SX&?Lz%^!|MUCs-E z4TZ(3;G{=&5ROk(G-<2&+Vb?BHd5PZi@daX*B(a{EsG$;bI^U~OnYMqGEPsx|C^!k zJ+(fo^8EYFPJ!K4kxX;=^!`Y(+G%IAY`%}!tWKNaM(nrk8obr zgd9jP@W1RU5BPYV>b>m>P}C7h@ZtDXpTw@M)acY*M1VNC0WlmQ9wbpsDUu09%qT0S zN!!R^)N$Uqxht^DzlWe(nvwilfbfY#bP)#Lb4R|U=q!0<*T@x^X#~Y*3n?ep4j+>IlTjnm`OKJEZQC4d^OCm!-UPJ8AvtieoF|XaL(R zm+;$M57^9?Viyr@^2vlEc#%WOFsDj2;4xOX(Xom}IoY1~fxXG+Yj%U!FUViN%->?y zAYC6yf^8()Hs-LgGybQQ?Mxicaxa8yV>>#ABcnX_Km7|7f9`fHy`x2dtsbhW9}q58 zb>q$*Q+!5h6r`vu$?~KE+nmS1kuYu;en-mN_8|F(=wzihm{2a6K3C`M@zj0On(^Bk zFdPT)7I=kb7|CW*_y+;QkvUIlMb@MphEUan{1fs7=ZE;2Z3yR9?$8$0ew2x=BEJy4 z*e2?2>~3^z1Z1gdg{zIY17yWfb*WF38;{$33i0%+L)G0v-RH#@`ZBN4ZjS}6a%0V2 zJ_`C1(wt=Lx7gIMTcGHtWbO(T5GfYhwv4^eH#yK_mMOm41p_9Ojj#nPy}-d^)Ow9i zN!HQwCXW{6<3qu8aTO@M&fyOSIy|!9<`HfbL_}>5I^4pgqcquq9M@`7K6gCX*w&Nr zOPX*xSN?=0$c}XV0q6Uv=hM%|)Tj38L zRptu`Ah!HO=pDHb-(>qwN`|YRm2|W--?2BO27CtVoUH9l{%^PW==}1Gqe-!)9*xy! zFO7IzBROkQ$gyr{1h`sDy5n#P94k0$5Ao@rD?$*3Sq=jzZ$I9yl%;OvaDi6!&AF`r_K4%F@S+QA-!XshqHQG^Dhnr zy>>Nqalse+~8f--sra3{;J)_3Bq{ZcTxSEBsd6r4K9h=?wFFqaNDu z^M7o2%M@ZgAdhg^Ihs*OZo$esl2+gLPP$T@tsNoGZCp5m%7hWW{0yIuOw6D6lSSA4 zF^PVA1=GyFfOs5yJ%)XELz0#lDR$QBUhb524&9&dbY8j!Nu`)g`a|TWGLgkkyUZx1 zEJ@KY^U}srvGo72)g3oPg6<{t9g3(qzp)@}>|Y{t2pcMkLGcA<=y3$f6>;N6x_1Zj zXRmp6mG4vhL{Zi?En~~FdD`6_Jzw@MQLz-x{_ka`9e#@lE_QWE&0T}Wo4m8iI~#Ki zyGy3p7B6%EqCzfF^wait!uwdhYlCtJ&ERuNY}`mk?A7-J7Te)Iz6P8_PaaU^dA6g8 zKVJdiBL3G!yC&XOrI)P@&|@FZOSwZ1g9%lz$8 zN9nRGnIB|*W7~-@$^GqWgXEBkmCEAD;sKJ+o_lZEIRvSf8g)LTXMpVBY$q!zmIHzI zi4Qu#cCtcEm+-fC2VCgr`YG<{kTs=1NXp0`0o1Y!ig#XZZLq?=c2yhp{$*+;!xx$` z{V9@WKEk8xi9Q1BG|YNsC*GL<_C;j8;=JeaQSjBL5%36I7bH7>Go=vYK0gst$47h% zs#k#SoRW>y>$lLa75O3jV{OtZPeuaW5gRX7wwoFc-&VxJ8+ehx_$)-!U?1Hca+UK` zE3{z#plHIm9&8(F;q6-2`3M5q@9eKFp5s~ zD>#dY1zt9k1ajB?zPG{oGu#!a)yK8nR)HTmtIA~Wd(HN>~ zDyS8!#2rq*Z^6q)t^t{tRG!hw0ST)u(m7aPWVc9RuU-*eamx!Z-;_x^Gh?xMp>cjI z@Fm#;b9=xoh3&~1R*-)SP@CJcp;zA7raz#Ie;)P&FY%{h;T6U1b3kWybNRzn?xLO2 zNWy@0kPuD(YN*}*#Wa1$Ks1bmBX@&1S`k%x%MIJ4?!d#WD_nJ;)2*E9V`w~Hrc73o z9ird;9qzUN*~t9c*@j7}P?uv;nc$LM5vEsT4Sw&nr2_y-2n{LLvk!$-^J&k2kqw8%Q$Hc#r4I z6p>|+3eqm;e6>56wjWK!J>H)9C%f48K@})X^D}H)0`<hyz#=k z&F!7Ayg!kx`>lS}5m$wQDH{-5%#4+@weB=6d#unEYaq9zFb-M>A6Z}7Q@nL)-9m|n zy_YF%m%=rM$*xl5M!ZyXF$e8WjkNkshX^06{VJJcI3!?XI-J`HFxoJ$->ZB1{qil2 zUA8Met;x4!>e+s?I-i@^ST4TOmwx2RvylkWM5s{q%ZP4aC^`4T%Qh&3H0V%QW;wGA&pw4WA!z=!3CFX)~JysVH5Wr z1B({D1B57b zuk^80p{$zQU$!2Y=y_^)FrmI?<{(`PgUKZc$w)sKYmrk^?SxW@hT?qz^Td+{YI`x( zv-MEu#4uJ5LsEA`f8dH#C5f_;EN9WKe6|hevuo>^b|+O*m?~KO@UF$7&J=`PS1mD8 zUQ;EP z7!jS0ZcV3F^sI|8c@p;XcQ>Lq0vM zY{=A{_XLC;$+5g(amYLIq#vj2b`;OK(;A|YNI&&^6sYMtt79Fq8n9^hG)KRhu{>&P zK&w4=E~2NQh-PY(4lO6@OnLDWYw53#cvj6styHzuNEe4}l8`5SMoi}gZ}HslAl2Gs zG!%jZ%_Hu@4Kx0%r78PhxVk&%oa%cUf{yH;{BN4j-%dH8g59ybnD;((bbaI<*q8|A z`IB%q6(nVv)O`@=pyXX;JXS8iR4x6&w$A;BA zke}pw-HqMpV=ynqk$aLiHNoL8Y4AAXB3z1zdM(*j8Xi>Aar}#*Jce0De~- zde;+0!LL=v$ko=<>BV?4hi$jHesj4Swf3Jr#Whw39El>SP4+bqfa5+EcesY=8nb-k z*h$x~MnqH4L7YGMv|J6AYj`Y2bjw`5G{I6lwHQ=;j8%zDQu?bFo>P@u=8WBU#MV=K!DoShP+w%x!aT*_0>DswG>hj@W%YKI z7L>zWtU|3M0>e%eSgcr#&v~ebXJ{Oau@fHzq5|G{$Q+(+)fRR{BbT2wCoeuEPx$*P z)}q9cOIy925{W)5kDcF`m1H3d-0|bcAo*icz{`2`IN?CH^=EenK0!7wNEaR~n9G;a z7zD@Rw1io2d3gXzLkhz7$g!%|NptOa1>UE{%K3c~8s8aUWf9_vyCom(K7K|?>EWeRumvm6K*ztP zD4^QvcWQxC{}pK_|8kHm&b$`B2)XO?E{D9iVJOXnL@L3 zUGHuvEh0XbP!3;paW;k5JblAx$(dCYZXEQ$Yg3|YL zmQ=E&M7bZt1A4|Gu%X(hJ2OA7?o;^U4n67##&50Mn5(9;LGSla0tXGLm?5!xpL>k4 zBunltJZHSYN4+jK;{#tlhWCn9;$@4A*qyBE1K7zr zr41*;7r-FwHOsqVe<^W&#}}yUf#vtg&&Gv6KPvH485xNLV8x5zn**ORz`tX^Y~+>@ zQ3ovNdSUIoM9f~4nYUCcBz;>ySMd2wBK;4Q!Xb&Bg`)3{UX^+*Rg-&WhWdudnp_Ct zQ~`LBKe4KNCDV>b)dLEf%}$9kf6Be3v19$~z7BNse2H>UlZ<_^W{USq|I=7881o|m z{4432Dsl__Oe2kzOk_PgzY06tQ>FqZ5~f!R8bNRPY8YCVT9o@M>Y*@hcf#J$w#7P3 zPC_jB?e5S(^zXO7s2Jo2GC!Bx{D+;9@l$q3Onosu-NxSOrmSRwEDt6~fv7+H6BnyZ zW;lEAJLjl8K&?T;9z_)EaE1bPtJgDNXSKUvEx)vC_4 zCNkjl>d58h?B*WqoE87qPMeMrrl%#98Ie`dVO}&ese0~$j~!J4@Gx2pBbQQlM6XJ} zi>J9q(ckO2ROThDb5LEV&f5k`MW3sRR;upn&W;ARhBhZ_b;l}R zD0Vpzm#qchK^uU^bN;|YZ7{}I}2u4JmOS3t#ajy}J9 zcx08b$cgZY9_l-pkoK_``lKas01pMNiR@=2v|gJfHTT7a)&owhSTP2 zUgj{jtzf#ow|1~m*#dm7a00b@pJ+KD65|Ht?xVN$UZcmsg%S~Z`tGPj!3wpLkRxA* zLpH5*#GzH#Coi4`XlY@Rl7mu26O6uOcyrPqRlqEJxv4zgMwf(PU{a0E!?#@{cY{9& zrp~PQFz5xDf3rs;-6D^MwPQE`q&gDv8&jq(-jC1D182#$08`h21+;*sV>*`Q_)e39 z6lbxt12_aBPX8E5rf2Ud(U37W8Wwej@ZQl~uM9NerA3ib$rczWX$Y3m^1&1Kp0MP{ z>aDq9-_Tgc;B?VU>tXTW{m5X{ctPOF?l|}Sw~QQa>+tp0;Y36lf_gci461ckC?-}f ziMRZOU+Yl8se63(jFetWgF)@gZ@WrU*MqV=mJql;lI8dM)9zVyD?q26M7PuoHm=_7#-y^+OS&s_V<^ldzQKfp+7FKfE9<^|0Sc24o4x_fWy3cFll7!tEr%ZJ ziRz>W7SKOf+iPBIV_#N!p|Sm;EXJ<7B;BJS1Nqo#2)K(wxaP-U_{PhDfzBvRaTHNY z11%KyywpabVKRCV6E+LnKL=UK{K8*k07t6Y(_xNWKG2j+=@b6s*(VSt$598bpvC8V zq9Kl&(oqt2k=(%ig21Jr2SmGH$lyF1H5BAp9~Mu4hN5o>?loX$GmujvSQTi-HhMbz z$SGErb?CArys$K)wHdS&j@tFa+x7!K0`C(uzNoxB`k5u{J&A|(!A~;CD6(RrJZ}PAC>^uJF z5;ZEi${Nn+2EpNW+b$ih@)-8cd^!?`a3wDwr@tlr$Ju+eN&(gFqLA_B`OzN#H=Ug` z$x5ia;M)%G`j9V@X0xw+6i6;Ewc^04Lv#3)vI-a+Iu1D19+SshT(R@yxV2weYE7PH zIqn)>rCAtxG8(pTli*iyyISk3aIvqtW^D3icB(}4WKMuBKSi+Dy4OjS8c1ober9SH zBKx2eYJ({?103YVA(!4y{zq$H`dqn7ulf;f7!Cw7fR z=8!)|2W!)t(QQIDa{aBq7nFhnfjs;${Hm|O=!Rq;%VC9{XQgX~w!+^Usq~D14^#oz z2}&$1oisB}jVLmwl_{q;^XuI&IO8Jw2F!YrtLjjQB*T_dO{4dBpSZ00jx+tXV0>3a zuyX(*r}y@v>LmErtjj@HA+D_J>uV}*8I1+*M?LSG050?y!YLlw|;5W@MN@#hOd#$&|GEjeBaE(554#h;Y>way>o3^ zravC|@6HTuaPri?n>eZQuT~cwWzfSqwAcOWV&jzN8Z*iC`jy-^9*V!%jZE2|%8SRG4 zJ&h6lk*s3Gv|W~Z^)lQ8DB=TLPl$50{TAwoG?8&U7=23)SgkrDH;yqx?m`z(Jb(f zvwgqnTDIKts6*Tcm4b_k{wro2T2$)#9qWr#OwfqU4zxm_pX+Dl2jCq0#pGPf-T!Ey zFJ@Mjb*^(5%>#)~1>MuX)~Ah5p1eEh6&raKmVOxnBdD4bP^d_dJw?5a`wjg+@qrLv z$$B(Ja!@S^H%7bJl`IdvCwnz-{G7g{dd}01?R&Z@7}%3B9w+8nvXnK&-PANRXIA7W zFRjpR1!7ngP42`PDQYc!kUF2DJlPk)+c>B`7}v#i&f6QGpa)rwP1rOx(f_(E=;PFV zom8`Q)Z|g+ad*s&W>Bg%20h>?pFbDV8kj-@`jtyM9;;8irZ%EZ=_5~#XK>-c^Q|?y zOGqPo87mQ&4<1SemQEIVXFGfa-IMmQN+?6ia+=UAtzfuI__UKaiKfIpEgDc$yWZAe zXT{Me|GeFsB;@Le7W)Y)5KK#T4_4iQejEvsAq06ZDyR~MO2%y}Y-sX8;tjM*;&>u_ zHFZ77;ykI1OSfVV_xnXxRoL$Sg&2S&DWX){(j#~V$AroR$)4@zPW7vm#jY{BqFDr8 z72?F5JQ3ifodTFOC0O8CV9pI>pcaxE1F|Ne`b6|4MB05HF}%X*bDUif+Hp)#g}Kek zjSb>w`W}p~SNp53VPIVi&29Az+d4Bi?KNKP9!`q$d&?DqEc_xb+};#W_@X9Nb%LUT z@LDH8rby^S1&UUn`CrXdgzZxhNLhC`N|+C*pFkM-!wMu1wA;X-zJD>rq%-X64~s?o zABxqIyxErh$LFhzYiEa@AUX-GXB4ah>&`V7z$&eCZ?gIk0|t;|}jDGD<3HjnuNb}ug|`Dro?c&a}+f63rK z$a|-C#d=88X@noolow`11Y#LY7UpQU1WNE?azwnIxLxnnE!4Jls==#Dccdsg6e)UwmXTOe~P9v$yh$_=&|d!*{Bj zv)>{NB|Gxg9+EH~YL0hJZ|R)W8`^I4w`%IFEuz(p20QAbtCXRrDw>Vq-f&h`*1~}4 zT=*GuA5iZ|$ao#~j=RI&9e9xXOXX*W{(V z248f@nWnhX$jKPDA0RbH+F(5>&v?JHxFk;Vi{J5AhXNU92%)t3Wd$7-*Q@Q()oB|! z9fhX`j&ikuJs%ezmQ(Hf5BE(wAsSH&+l;7NqZuR+$#XW45P8|t3C5s{Rlx6W*>43` zlz<-(Qma!fpLR!t?MP!8+>MQn8Ob6Hv_3EJUzu=4VI5PYOZ|QJ#Fy7o#v`s_Tusgi zt#C5EvY0^$i|~ZIh0aewD!`L@7P-#}nV3`1z2+VuUY5QtJOq^_Hi|iF(bl=SoLEG2 z643StU&j_G#bA5~LU8nZdU_(wAu%0o;_*X|Gd zk||kEFd1>qD8L?fsjC+I#cx%LuUo!hr8T+M8}3>hyrZy@x@;2bV91K& z+W8o2&KB{N#M=22>@CRnw4}QQhWKEbW3iwOW5fNZt4`Jn9=02|XM@gbIX)+yj65jG zH{1gqfYIfnPuL69LdP9%I{F^vzZxrOvj%-z-w0Isy5ZspZ!rYdgnh6WN+J3L)Q1d_ zTQuyiUR*SB!PB`L*tgdUSwOq``fNJXIY*2Hhqms5QWBKN6tJgZ0JF3bW@?G~^dMk{ zz#>R->{b8#m^{fyrch0~$Nv|>4IZ=F5p%4~x+o5QQE>@dvjR5PhROGi2l3E!GF7Jj zj9!h)goxTm*Nz$U-qnH#E#X$y=L2=L`o;?!5$8+6ECx&MBf*0Wjp#WJ$47ky${Cgp z1#^aWTn)BgG@LirlZqQ^8?6GC)g1l>zN6|^xYb@~Ox3k*TK2EvG66?u{C;wYqF_YI ziugl1U(1#6yN*LoL#j?)DA&`rf&3OEtiV+x9SklBtVg7?A38ZSs~ZL!-PH0Br=!TY!6rS_c`?q)k4RQE!C6%f z;Wd$U@K+A+?bh$IlTW(5mM7L)0@pyPpNG!f3NOCGAl4z%-~Pl^{%T@v5?m^TZcH%z zc#i!IjiN~7Jv0<#+e?kGk~&n(tp{4(5D^)Q$?%BRR~kK)GsAlPS@2va_Z#8R?_dfx z^`^`ilm-D1Z7}2!&pRVHger!Kf@I?l$i@&{D))ZmNN{(j10t(hrA9jTt~wDTtw{H+ zukQY&1Lh5VJsT)PSG5;xQ3ac}M@~hUp=1!~sCpIS>407rnOgz15S(uRQAaC5g8NZJ zBo$Y;-Nayh{f$O>wgk69IK7JecnI5EDY3ATpBQ3MPmiMx9#Kbth9aVb#*3IK@THhB z`_Y3ZM!RC+g?(y?>6p$LZ_iwI=ar$(_64CeIbxlP6Vw-Wn`M#F-@s&lo_GHEgTg!h zj7`M+EqPUYa$J3$7h!kORxVefX{l6T_d3h(nm?N0NLkq*n_9E|TSTCL7u6Fp*$(0Pu}uZ@*XAPZ4A7t}ZV4s^34b!%Xe z)VcC<!V#T=_i?4^YOKVX73djka-XE`7>AUE*#ono)Jza|WLNYiRO+~QosEy`# zLmpBu#y#XrH2{AIUcYqWQ5v;;EWE9K^-x2iD$R_{;kewUmUsbq@IyxF<<6;^vr=}l zbG<#wKp9>A?&wQx@j%?9vj~L~=z{d0P%YyigzOp*_+UP{KaV!FCM#P@X9hERglgG# zwJTc_A91*W6Z}q3$Mhc(>4@TmAp7wE2&J-qh?K1dP;L)K#c=#N=wX4A`Kq(}%A*nt zmBRoZN^e93LhmEmn3+8Rr_%Xf#=iuQcPetj@z^?4*w?Grog`e``-_$N93$9p8aCe3 zvU8QgDTZ?ARy~r^rONbLcz(m6-QS4rRsdWwL9Yr_*omU3HC>y9k%}gVt0@i}Rw?qj z1CfaGG`G*uyMYWp+G7qY>+rwJa4L5;29n{^LX@}bU^yFqRgMeX78IF;+S;6jb=d+> zxorR6m3FkStXH<1Gef+De*fi|)40a$haGm+;9r7E%dbune^iB)nENum?I;w zXYb*sXR;o}oBs@{P9rc8S^ri};T06dWOa!HMpJX&@FzmSl;110qMr5I4p{1nCS%2? z0vQq`9Yr02R?4~^3}z|x;1?sxhrLt3*YP?R0g(dZV4mV+)CW7_(+7^ii661qwoUtZ zumOhW-BFXWPBxp?Z39hnnlgB}E86Fv8XQZd!~U0wx$L>U{)lvHb#Qhh6-gNUqFH$-yRLq+;j1nc45WC1!NmQUfsnA*elci{Lna#)SboQ=T+tZ z-pEYVe_n;e)f{+5VS?K`gi_8_1OXMF-PC*R)jzze=lFQ5^PQ4-#B7l=X?Ya=OYfQ* zo$<0_o!cRfzxrR{z6NA}@vNM)>qw5m55EF3T%C?99ns;dtx#zJ{r6p%@z|O(;%CSC z3bg5Pw7_zoT3+l3yguwmC4}kFt9Fq8>Kd#L;O zmZP;j#cE$?qyKkl&lo#0=7ibf|363X9~b3y=Zk;NnKQ$gVZbxPfCG~B%rM}9m<)&( zZQ4E0!+-;#c|gpfakCGI293!QoA#P*zq@CK2OP*~2SkI$b_aq6t;rWt+uCft-2u^{ zF)gtsUz^)@F|n!X=I+;YvwPEf_rC5u`Tpx`csW0w^Esc-``0JFPjSO2hAI?DZ3mIo zgOr>GALk6t-+OM=^?{J8>#pQc`ZG!GYjY#+fjII=cJJg@;uP9)-i}rXNrz%;_GWGIf`!+IkIif1$uZW`~iIYtt>cWvO z(;Hfe5BnlxMN{|!zgCxo#sX;z4SEO8dty1zO23!qLPZxct$U^-k!q?Z@^?jMCQ&y~ zMN6jBHkq(J?53rC=$IYFUKUPYbaHsG4V zMDN=wPOYRh#Gu=z>G<;Mp9gih8{uySdsZ(`!ub%W7rQ@?oLyg#9*4_rJZYN_p6ELn zpT!EH#A@Y6TZU`Fcv85J1SnJK9wi{Vm_-$CwNX;p?*r{d8?Lbq)2!Rb5RYe!xmz8r zU-OWWs}41K_=>41SHIy*&cy`Zxp?psROxo+c2=IDv6e6_geXt*@agu1n(_K8|M zFAmO8&F<-$j{#IeQ7YrDm+lwZTFtMdgAGjz%Q9Uf%y%zNUp=&jBWE}pO78jCN|lGj z74ji+ktQi7^~uH@gT6uUsz+3&v(z1mNgn`*9_$%O2X~N0iPDsq#&@efY=eF)7l`;x zZLv~H*#rq}Ii6&`+SU=LHJaPaT$Y9EDD87lST^8{0_Qf5$#Mt-e`@v;r0P`I(!6ct z>7rkk)`kvvu3wVFNVNfH>0Qj$i>kjb!iSBLyqF0#8%a!(d&kipS0b{Vf#cZtRA80# zG^ra2ZxUP~q)W;F>~*>a=qE8|p(L=rWRT?g92fB4%75I%pMg|Za~$0mteN0)uEi4gr}u6m^?Pv3_cta zqtGgVcE0s%B?H?AvE>xL=OW>#{ly=ClxJyWo`pV-cbL6v3?!P)h<_BDjgoAYlPrTS zJt@~r%F<7jgnQUOlPIlvtiOz=m%U)vla)LC|C(e`xlk`7Qbsm2nlN{?IdV7bRL~6( znRL3i|1xJol0|7&roK-l@;kqrb?WYVcxW7);GWBChhRiJFn2&-5=b%5_D=W8+hL_! zJo7*GN9PB6hNPkv&34aOsz1x9z8QA~u9bk3!cRm9^u6I8mFW zCPKNui)r@Lmb};6ufPvz4wFf}Mvt{8Ws&zUqBNc?t(KkT_$2MGx6g+eyyNbMn=^0Q zCsgxB@@>j*CsOGhCi6#QGn~%C8$4L>?{+M_NzZFzng_BDUo4^;H7Ekb4Iq2$7yqk< zq?0R0WUuK_Os?j?rIiRt9wkbx@VeiLOFe2gko{Bw(+_0mm(+;G*+OH@=Iv251Kp9s9?XVO@<81umO_%Fh zCsSLU&ufhU3i^1N!t!I1`I2!LR46%}%lTLWoovu1E;h$yG)D8P1IO$EH1917OaV$x zLEhH*mrw)yFf;zxgKJ!RY@O3y2Q%7Kby9Q?%}rlV7|PyM2>hQ*m>Mr?`S0e{AG(cD zb;7@iK4!11b1VgS&J(v1&xVS`8;pMjctZvUq~0T~x;HDQFXxG9Is)}v1 zv@L|1B2jPDpf(G3l;*f6YEOa~DZ#-NvQXhy?Ea-@mW|+0nb;JPbn`4di0&Cfis(`o zB4adq8rgQ&^cm+TJKP-Baq(;uQVDt;eyzJMC|2&XBm9N;sZ*G18R-m)tV*h z54P9Iw2QzWh$|zbzFh&w+dUV9QwKBQqH}2ImMAh4oF*LY9lc9&EoAFO#XpLPtX(9O zc8Mpqx(7iyb;s!UFUf;eQ6_}#ct!sPKD00xxcwY$W;8u9nuk1-a?e9s<1t%|ynRWW z7=Dyy_BP_^?Yw9NQfVNWwzT%Mu=$b4&`W!>uTZK*8&pm6L)02Pp$t!snR-17f8X-P z{S0K|_f&rsSnpY6@i3~-`t0ErGtHx5lbw4g z)c;GRzu_3?~(~V=!h7R6H2k3=Ap>t8y&QHldfpG!SSPj z#++xlmh_oZnWl-Wk4dNM3;3mEMbQrPi<&CipG>IijWsr+kZA-&I2e)qg>4=VwJ!i} zr|$d$tn1k%Uje_^5hE>`uFO|UyrDWxacInvr{Vo8!M0>^CUIcfb3qkJs5kNxJ!9uS?zRd*`@FH1q_GWhu18U zUzJ*~!J^01v7!Wih(#6x`11&Kst>k9Aw_=O!Og@S7v1(pkGM}-1_OX#vs#6sxZV%F zHop@4cndt#f4C~mFCF8h4!2j@4#8YUTu~K3+u6uk$Qf7aPS1W8+S}t;_h~5cpIky@ zlpK?Ak`J8C`KJ}0n1t(#iGWL@=Ha4NYX-AQz=m;IjiMag=85LCRaOEUxCu|ut(E0Q$3meVp+1w;e_@^ zxAPA$i<`CXVP+ZmeTC4(uy&EF72m|i6c>CEY_!eA3mww!TAvUUn%tD#|_>o-dw zld&w?u$6t-9nr9n@a&pRs#^gY52c2N?4|B%6`boqo-Im`lJLn5%~c6{YiXBg!fFg< zqIY{$VW3iG$jj-l;!08rM2y3-5S8+{w5u329##M3Z(e-akHm^`CcdSoT}uEXj_~3i z{50J^1Sj?{9l(7ofxRwqr)KHP9gy#nNKV$-eH^|jGQlljnHG3Zl*GCX6O9+Jk)9bi zr$2|zTjpVg6}yP7!9M;u-f$r&Djpnfv>3~8_j*&IbiB}rfwNYwmKg0JaN`w}I4*4^ zA+z11*_;s(tj(}zg9`$Bex>%X6kw*So66bNFYdK0vQFnNjtqB~jVif+lk<{JH%Km7 zLfV*>ZOK4DNw)*lA^WfQ4u=G8;p}u^w*gZo(1DJVX)10*1UF~Ghc$D1C1ar=)0<;g z@;;Fbg@WiMuxL|L=a*mf{kL45X=gFnKC=&tP?5=(5e_TQh~{0nrn`njh@0^s`R40K zgpEENe4IO-J;~ULzC*vU|0`{}M z;kQ3ID0c6vQt2wLx~LV-R&d@X)#L-_4m|Y5V)>?exvS(ZEpVBY zwJ5<-$Na5zP?CK$k=$nZ8YzkJH4K9G>IrI&~A7FmHIQ!+G3t&XalZ7S99k)s?$;D?-75Zr@+U`cRyTlh1L4f;0wM})UJFuK}t+oHFlx@mLFDuye>+n|6T&e;v*G{eK@EKJZF|)_lbY$40rQ zZ7OYJz4E$?e_abzu#?4;yFv5xsO;ll_B__2o~8X4Z~u)KJ7hMvh%R$*?$p;m*sgAp zAGajn@#9TwFRl#_sx^4lddTOAQ**{Zh9+L4zw7{pyQU7lM0+e?)JKW_Rk+;^y=FTI&NcV5SP zPB_rG87|x7GxL(BmL7EH_+bDwZEgylhERRvKu3jre9DDb>h%Xl*$WL0r#p6Yl`y{F zyMFkepyF?r1%ICK9#cUCjreg4QwhloYZ0*QqOu7)o5gwOt0V&gh}R5NX1T)QUt( zeCk3fdoVDZ-YA=CoqxEqM|$u1tDg?s#yzezeG1lHyWqg4tE4}-yyDuAAMx>2{D@jq zf90JzAJ%^B*I0QNsK=6=t}E(^OVJ0%T=r(;{sxRv)Frj!F5vK%AgS<2zkje&mT>J4R9a!>Ve)!4WqC zl~iMYlj}id;Qnf7R|`;R2*#^|IA?(rIs)wht-Oy zu$*xc?}zTRK-}(&OAj;z)P36R8DQTNgB`kiBz05dP!%I;VG+n7Ug~&HpdY4P-{@X`ND92^f)45UTfM zzmZVl-c)#k&qB9UW1BM0Rx&~z&I)XQRlT6{R^3Y31Z#$+fc%*EpkG0SO%i*DD7@6` z{lWsfif928SV(y3b{BfPOrU9cq_C6J@t9dB5<8wl)r%yvM)S;eV~lifY`lQ493LXa zo@A08%Mws}b*Ih1O>8pjv@*vHW6Z ztyPuw#+p?0gS`{{jbzzY@5S?x5buD2TQMv$Kc>cut=o-8qIy9ZdxyRGkpn5bI`IP` z6(gF{BZ8LVvy)c-@)W_2ED%&Yg&-Yxrca7Ke+GtCBTCiruq*MXArq^={HnT!3Srh1 z8n7+Q7cJW8P%U9@Gp9 zqrZ~~LQ^>PLZb((5+jeh&+iYNT11~UsqB0LxkV@%3};j}Bnj`Pm36WAWi06lnCp`n z)VgU>HgtvAL0+*GSwTM#t$iKOL6BrrykZHCJz}@l2Q>TDMAITJmhnegtq^I;>Bqh| z`dZ|2B^lXXnW&X{DN@r?uON4Tzw7g=i7CBF5tN*eP^BbYX&UN9tLNZi%aBNPaA!r@ zDc4Np*fT3%CFwy0)ZNSIiSyOD2Vq~8%q%HYfdcy#5W4tncaUymK5Dv0yl_n@_u;c5 zel6Pp+3vR>`X3)lF^#$wRd%6jo9UO3O6J{%plx-v(vWFE-Iy5*TgDnc!6QIt@&JB9GXS{Yka@XV7K-v=OCiEH3y!L1wgsvOb z(Rj_QP&1e}NkB{+Pc_e%SsOe>TiB<*VP%l)Uw)Pe`ENcF#g`HrvlsihA+T zH|?;OnPvIOy#5*MrNu7G-M@a1XqWk;?SJ!g=zYPWigZ_p`H_XKsR62XT=?YS9_Sz} zAI#1VA`owL=|j;Ba^*&^#ak+7I5}MT{g(2elX8{EDb$mj(%QjUreNl@3dFA*!e~f} zJKr>t&$b5%3I%LiLMjvluT@U@G`w_U1yM4m`_xgUIq9Tl0!5!yiQlW%TTQP$M_vQ8 zG5K7;lZY3>xahgqY3#vDE&}4;-RoU%h@j3kglpBN_{H2;w3&eo2ui(}tqIPb{7h3% zJi*GUEr)EpiAqH!(}8zUp6KxBtUfFP^dq(?|4KXgXh|R^md94Xk8BAPQlK!2U?n>w_pLw=3sF%sPco%vm3EA}_;hv^&S0H3{U9CjK^M8E^@3X{I#@#vW9!c zlGE=Kdru|p-VD6ZP4l0f5|7;u^JsPZzLJ-)4!%6$W*~OQR|iJEoc33_f~2_y4jo|I z$2HhuSb+`Gk?Wbt>s93Pq_^!SP}u*?sNYx$giAv_cyZ-X{(ab`exbPqxBp$GWZL22 zc?fD(01M{fhOkqJ=_=p7VJw~bfdjcCrE$@-=Yb%^(uuup2Q18w!Nda%^*MHL#Ld56 z9f716o-yU|agaFuC$W$jSJhuFp7(7ZFHdZTvTs3~R)_5^Jrye&Wu)kMLJ8yyo~17J znBb}fTbYU%{0!K+&~)%(iC)TB!qY#46EZZIZ9;Ee0j=PLcaiF;rxNjEtLCoXKLN;dSTKK_I`dhn;95_nDbg)e7V>i z(iWv$EaN|AeqTV|uw7L*&SZ7*vprq8uDTqbnrf!Q+%av@?~5hJ0>3XtnKC}29U>l{ zHc3o%!burcuvODuw~8@I+oh$mEg`%(F%fBViTA3qPS%+j)(2Fwt(ai+AGNXkm5wYT zqPIQ=VO7?{Be1-ob)~bTNbXESV7^QxP&cQarO~E9EErh}azHVCaeEQ5=5>{#Pw()h zXa`DUk($B@KO6vn+|`bgUM#QDDEYuuGWPd_-mTevr8#nGIsXl zm4?>>j;qP5ZW}o0f%Rw{r++~ETB)-JF3M_1Hnu%*0mza$&MX#rSJLi*{NPn>WVjhV zv>SZaIY%iH3&zAQ4=kx34F?iRkm9wZKJLuu^{O(1;Z_+^t&|^z0q{OOo-8$vXev@< zZcL_uHo1A;;DHzsG1-67Q`Kt(@4L!IT~bOdn;_ZqXVe_iWgdUsIuztn2H&?0GUK(`REoG!WNFwQ$lk*s{DHVH3M;!yOG{5(@iWkUw z8j-#9+;`)A&NoY(bze1H$`5*f9y$L~QFKp_hLsK=>Pjg}sj!$d@gvuz2O<(H zRr0n)XsVKOxCuaML18P(wavM4Rm@iB2bpn{C<&9XgKeFsg3w%(@~2g(Q)(B}Y`LVkvKt zVgsA*Z0dm$$Am6`tt++(ZMUainX@~gHsohbE7Tj1{?5_4G*|~!u~^oWh1Ns>Q!`fR zN14-29T>dJB2(ge1Z9&hwVixRv=<$(l!O1Pd$+ZlQNwroe0xvNe`xRzfGU}IOxeGES9BO`Tv$?rxGp-K2QGUDI|s@M1jBBp z-&4(i=O+G8pJIWeO3azmd>C5HNacaM7=Gm24fQAxUUvs4f{I7Fo&wYOiQmJrydW~t z)KbIwTN%gISkC%h?D0I3F7V2O1jUrfjwgK{l3J|ARTj=ou>2<-6t31h)u7prNVxT$Zv_6!kBa+`)Kf>FKMUP``e2uHSigMHN%*Uima3|-@_jrD0az?7 zpIds7ytftLPP!zSE>lFWA|{4t6h8A7Ha?%vWqqAze$>3bYa=hmWBW4K0V3Ze+NT1Z z*&h$o0hIOtCUFzrMf@-2l4yxHl$3-5_c_G2Q7C88UjGouh$SBub{Z1r2Z3VYZ&^Io z3{f8Rr_I&|7kUDn9%jO?87DwJYybQJ@?>HmW~hCIfbnK7MPvW5tG@UV>QSO- z*Xjo<>fS?L$E4kyebN_?px$&|!1;j^q1o9;^5qem*Yjzm`3L&`{Hxz zr1YH8PuOx^?swwFY_a6u0zCo;lQ#ZyOm~_}>Dm{nj41Yviq^(fjR)%sE1YjVcY60& z|6Itn81w4RgJhwfm2Oh!1G%@lu3+SX--b&zU8^MU3{FRtxm4X&Fk+8<8)s#6Wija9 zy69S4h{nw-5VOjge>lqPhfsyr7_ak2v?|q%ON7AaX!H4{=}T;0!?eE7A^&R5fBZTu zU_+8AcMi{G0q5;K9b03m$n3D#6ba`I)d4abTT_OusLTo~aDttLSXC|YWdT))#2GkS zt_>i6V+>TFt#R?o)U4bfQ$PQuRHur3r5^<{YV%}$wgsHYk@!sKR6d2%A>@tRI;AFI zr}_+ThY{-+I6>{CM%I$`{xL7T)g1W$L4$}xr6Qj2chtsaX3G_(Iu}*v`(VlR2L)P*&a-9HdPQ#3G zH*5nXkvh@*jEsoBgRmyZB3<{IsZRR22C=D#pahGDFcBQhB z&NO_vrPfg}f3HhQZMc9JShQgFCWOa|;eYkEzlO8kQl%e#bitU)8}8}r#XDQnW!CP9 zJivt)h-((O%&MCw2SgTCnuoEP`pD$>p9^uoDeisH0;iv_BD&b!9d5?m(3Z#ZzHZ~K`PRv~37Sc`aqRkGpbfgGnYJ3OeG*R0yb`dBh{7Cii)1o-`3nMUD? zq@hIe$Pbx))hVBa*HBf&R}EaFu0R>8hSDYyQWS0b;MtLIAelVwqn^F0YLqrD?{$`= zW6od8zzS5BcNM$Wfs=WsUnlY^JK{YA^chFE>O%fx4}B=zp?DJKt45<%z!H0qrZ184g;Z-1mVtF#Dk4EM9WLv=0k9MjS z?B|WRCQOzp!4_Av=>qnkl$j`)oqV{ZbKp|J_{s#0`1J`O9Y7LF12Csf@QiTBb%@#X9O5n?^N0Rj9l`iQc#_{B{*nVC z3zt(3H<+Hj_y{k1PGmsU-z;U% z)lxOZ9mf>U(?7Gx+hLE@QvYujgKt!!p-y++bBLop_^fF-zSGANi)JRf%^B_xOW_#nvZm{W;Q`zjW&I<|J(Z9^p_H zRo|3cn)fD-^{tOX)pu?QvBMw8Vq=xE8RbQjL!7dJ_v=s%_M^p%Q*-JtY(X(Grr)#CWg(kIO2|)${4fTiGSt^qI&5z5R*RF(3gd zpL$NV{A-RhvaBU$t6KiQRn&+ps^`|je$5(iRj-IA>eSXk;;Mo6Ut91AUne?DcJk;Tj(agaG zmxu6(IOu@^Wej~iTl*R4_tf8P^tDH_owwz7tzbtOOxFMhhiaR{=k7YFZxU5^L}$LH zD3P7|63&LK0CUWBVdl(7q|BVC<}5Exr&xCG^%}BRl;#?ofKnW692(3U>J4+xyr&up zY@rMteQl1bofkKbN!vQ6%l5F5dv&j!#&D%46ENvK4iL_IiE8dHOUEquW6>7ntDV~p zQ_J0OyldRPaOqRpiu|Mn>h%A-@NtGk28D8&Lv2n>a%#z&M7!BLZg)PrM~i79Y!8#O z3CIa$$(Pn;w$JeQ9>yy&mllMK_B6%u@i2sKxw0j_K8CNMNO=fl?Q6tyt>U<8i zux0u+br0arRL-D_r?=j!V~p(`MqA9KOCZa>3P{hFV6 zO&87E0fl1T&f(^ z`}@mgoh0(pplQ|akh+cuZ2^T6HBvPshvkot-!+@_%JI#X>?ui2w?K)l@c; z4B5nVl-k4Dz)w60YxEpC8$(=;B{Gck%-7}BK&qv5iO3s-iyK*{XM;`c*w76Z2Gn(G z4j^G2-aV) z6C$cw5(+2SqvXWSNHj4mDGQH(55wsrECwN)u9hNW#EJJiC~|zH>=T$@4QbW4ypTzF zS}VYlkhQcIoEx1RV2e?q6uR*kKj0}S9sc>=w665M$4p1}QjD+(jIZKABTJGFX+aFB znT+R7)0$OkiP~c^?CMnj8rN)8V$E;nq$kv+3&l8LKi+FVX@$QsBWEwfMPsAwH)CZD zqf$X1pvMtzvV_-B7zVpV3A6Y~f70eE=em%rMK>N@T7k%It@~TQa*O-h;DVVHjmko) zkW`BeY`NcZhIS>EnlLI48;5h(yb*Xv%jtsfwXa266?Jb6{I{s8xY)0Ox65$L54yFx}vL1zt{Ft9eiu^Hfy3yoB6 z@shOK?|cupUCpD5_Q;$HV^;_#nD!CxYjnEP@IFYpD+na$W-4SG0ogsTE+_YMv$@Jl z;o$ph#@pG^Q$y+HFGQr%%aTwSfL+YNy8{Q(yu^DJ{9hv>{ita!aiEWB1a*Hy0gpV? z7Vh`7-RCXtpQ&96g%>@KmPl3|+DIJ_A}Wg1!b122WfW&LNiWA@fnG8*>-sCM-dlRf zX+%ILEN-@gPQ4{)I(~;M*sGSjO{#}GX|B$v1Z3afUYuZ1XJCoRJ^?rL7r%>9gEL*; z4yyoV2vheK$^9G>kwVnKU>hb4BHD)^ON5ObM6kL~P^t0nz=z1_5Uj>;7Tc&;lSoY2pI>m#R=a$}0sqt+ocE6c`E@e< zOH}AlpM2r%8t!&m)nR`$@EUW1*pf^Suh3ix_e;L)&;rakuQJXc>Uk0^P@RmAW9B+eP0Zwn+_T}Gg669}#U_>11%9aXB`4yWon zv)5q3g78kgdCOKFZr);S>!{@6hNu>8=Ue-B@87@onJ2Xa2fCiGRBhFouhy@xt*p;w zE~Pd0dbXk0yQQyUQ!kL->F&v(lAqQ7y~l#Y*tL!-MCr0djk;z8P=$vk+@JY3diXx_ zIY)(EG?gotA2t~N{}e`41N-^y1D=Er1?VRe9c<3xu6Slc#(CzY@79K64lHB4E+R)H zfyvuw)*TJ+q)W1kCoqgJPrdFEt@l)@jAulh=$y`FxtGNYg;A`eZu#Z=DfGxkzUm0J{oBXw1gL)b z%*WXUdD}i^Vob0jp~%3T3Y$fGAE3 zzgwV1)l_@jzt-d=M3W37neK{nU*_ujd~m48tz1Qkm``2g*~`}wz5v2W*?^&U*z5Ra zjQVZlkXtaU6wPu}GJp0Pf=!XZwlw+$*}XStQx78gYd4I3f>kbV4#|cE9kh$@m1aCF z?wT60WBr)hu@4Sc;mC>@$*G~;bpb7sKsJu6)U+jio!LT=mdA~xH*$uuQC~&ByB1qMH--*Hzm0V->BA(G7{&%_MZki_6p5r(#5)*bMMWzQ$QZK zt#>NbWx8@AmYkRw@n+jz2p3!fgb#O3J)|}~Mav_!=LEar*45`vQCk(fd4&u_jE9B9oJ#4_fw)I+fRq0J)W1R&CRZHw$wtFBK zoll4reoOhnXG*)X?KqolX+c)(KCU=iPE;Q=Cw}WI0zGk;4944u{9;WPO06*XQi_keqkh z3aPR9j25#zC|uDFnNUw~KHH}b0a5#iN$yWLy*#xu=}CL4oHEe4-?vNUt=WC}jMBY2 z2Jwolo*12Iz=rdSLA6ad8&F+b^rgwV0SyAj??i(5K9nDZ82+8C_cA`b+Sh?`PmRUs<2XAe<2 z+7{F~%L>b21@GU;0~P*9X%0*gSA_n`igM*99|^oxfn!St*-(}`EBxX;LJGQm4)fJr z`aRU^ciY{MsMN-&!bx1bw@LRel)*M7FwC$)%dQFoZPuak?1T^10ud?fdb}B2q zP#rlkIT75lhO${nc z6Y5J8B^1_?@w^Sir_6!K+hS^%dB%a#6y3}gT5f`2*?~88mC6qDeD#hCz~B#+lQMLRZgFw?7`^W;&RB4ETcz(9^malmDWcc3QUDP>6(3 z6LpU@2HGU-i1}t73aVbdiLIm!7XEsg23t9Nzck}|&mn7y_qPaDz=cIo zkvewyHyVchc7Kl?w5kx9hj=j>^$MAlMU^e*ymhBOT2-b*Vd7$a2Qqy*TAx@!`{0Es+3JO zB06IUWl* z?;m;NMD*kP>l~-2-Oh7*!JN7y1@>3CN@z1FPv!tn<;Ej9V@57e<5L-c{+G z@~;r{`(5$OG9$Z4Yu&-Wn|UlFNqWuBf;tH6>9U{h0L@kCw(De@tF`)2i5EL7qu~7V z!dQ&VvOuVosu0`>rGpl48TRm#G<@S4p~@JB@ds};N2wBie$L@r(`;G)W{2Yh&3_)qWrIPOSWINMTKPE@ zM^H6zqQ?09fR_!igpEQtz^0@1$=(rMv(pP-iY=$9@T&8V2(F#-)a4yaDcg0~){zG` zC%B+OAG0o27rKSHJgr86NM*=`9Rs7U)WqPi@9uc&l{LGmVMrqG@ClLw+p-ON%PG9; z0_#wp?PG9`V z4cS97*T?#vPBfj}zv;L}e_NN6ngiJ7`&)Z>YshoT3xV63@1l)cJ*9BVPwvi$UW> zlSLD@K2npZ4%u?}pcZTawP+32iKAeupn};>^81k5o##q(=kU5}0}7HyhyC8)8O1Q; zC@a}QOo-+F(S1fw?HZB96e4ZcL-q;yWU&yzSkaAJ+P+>Q` z2Xgr2F`gj*@hy4>?Q+f`LQ}i>GSl_2itnH`-9K*iXRl(Lu71*XTcSb4gSXFtUz>G? zY=4zgQa{6ebvc>Jwp^5nJHRq7Jb}kl6l;GRL|c5Ezle)P)Y;J?5;az>vtaF)uMKS ze)Guc2){nir`HJvvO=JN$I~;#V#@jft^n734~<7}{&tIliJ7?s#=Rsh z1&(bNMf-uzdxDeYAvksDtU5+X>XBm@xZ@8qInK|D7lwx`0x>XGJtwyWP&BE->{wd* zFA}O{RT@JJyD%0Q+0~v8zj+t-!{9(Vz3#vDwdcq$$HjJA;To2n-iarH3F7kSdc3jV zK-_`q0yTC#F-nV8Li%n-9=LItFn@+mJNrI(Rmyl~SS&<%qY-~xb3ntOke?8GP(8F> zH4le}PlQgJcuZwK^qTOB@E6#f$S@mi8KChoHhwedbrvPdSZ!1Ds*>p}w_C4}krTA^ zEA=%8d^u^A2r93auuNB!FJ5;A++Qka;35du6H{0^R;pYA_iYqHxnl$J+gWPqDIPSS zt8|#z&)QX_(EzCqBvK|pchmX`Sy1(pPL3b3R{}5muu&;!Y%843Dw)#oLDNB|)U%^L zw})nj3RK?qCB`IQ9M*&0RjL~pj}YN>F`G|`0BNP_G(3Yqcw)2eaZE0_4?R!@w%8S6 z>w{t5Sn$%3>@Je%RZjNd0))|ovmIE4|t%SyN2OZDy0BP!rJwWR(v?g~G8=Qw^ zBF*LNq}}m9!2Y81#H^rdn;k~ip{=H*;#{r_ifMu6V)Qpcf+H)kdw|VzA)9z|B&KW` zbCrp*Nud(4b^VC*`Np=dg!_&FIx2)b#6tltP$o9&lK) zJoS@I(v^j>f;njDWLxH3L}=TN=KW4oi|4+tuOC~F5Y~3ye5;*VY<`;mLrUHVQSK|cSop!jLWr4XsGOXj6jg4 zdou8@LiuORr1Oe^- zW6sSA#&))cClXi{jMd3dbWW0RRVw<(n0-e((+3mZ{XZ1Fe_WK;oi_YEXU^Q583uA@ z7;qqH&piw{Ald=ZqOtp)xw*js(cTbZ(AsuDV$h~tw5E^!vCn&ExWNH284xX6lN}HZ zrlyODNliBU?to~~*cOf3wb|}2CTTbA)9qurKR(&*?tb1A|3z`;-1j->`@OE~dtCtl z-MaEuA(Bh`%xGFp_f>y= zDC88)vD)!4jVf!Qb~%8%`hFc-y;2{sN!b|D6n3Ij{d(zSGcR)FscD6P0kP5ei!&e6CTOWJpxZ!UxPDRz0c6s7Whj-l5S_{*_vQTvW7ErAGyN`hgR}hs>r^7J01+R3`MpN#q~1!5Jkz7 z9jyQOB#wJ)2C)*GUwBm+PYB}K5xc51rgtpHpV8kTItKD=4_C)X!w4h;_oajOq+|2U zt*)e)MP!Uf&^0#mtnXDmn`oo}BVjpqBcx~9$^oCjv=g6{n zXB^U&1LzKtiyQe_I(14NyjlmfMm^!K{&4cv9QF|;1t0yvVs5CV<~_j}O}6Lc^6>6*t~c9*tT@r?p{9QIE5jM*DR;i`l4 zTL)xh=P&3?x>IYYi+_h)Ai8R7(we$^NM!a2osJ*(kfe~5`-%*nEvfDic z<2YTstS`>>nlTr%z93lHL?(0?B^1>pw>orI40z>aV@1hF!k4Q@ExGsR?vch}zdA9) zvOBT-7gCa)W_Y{gNpIHP+u`bLmM?x??v6u;8fzP)`@Z3K^0fbY`OWH6hYIK=5jCze zHNd3M4L7~zc_byci|?D60r^~AGA=^+la~cx*=E-Y-j$Xpik=7mi{X(DO8QLsQ%_Uy zvTmU(=j6g>SNwJj#s%Ajvi^wnxXhN2aCR_=EpKzZTm=szp;{axmzL$2?Ih_X8vGMm zStXJ)4%qdCMRG($cW2Mj^i+2+vY4@Kp$0f(?2(+8Ube6+}Gub0H zR=@!=;{~%9i4UR*vKD?T>Do;mP<@$fYKxO(S9T!psoC7oPVG;MPG|`Mo@&6SmHQWn z{H3GbJMZJ91566{;P**F0^_#oUXHZ&va^Na$*X>R23hVA7J_JR3O@*s^}dnyglD5L zG1^03mOAJus692_=x7>x_(F>pX^9=O#gvsdj-UgXYSHpB`r9ov1PbOD^4 zgBrz-ua=1RW;P7PN~VXVmOf5^^ITG@dEammw{y9Bk;sypO&Ean@A4`Chxch95j7837xVqXbERr!y1+5bLywaW5li_-FKy`{ zui+LC`ity+QaL*SO3D$-VMQUIKF1F#ox=^>x^X$;gLXq=BO`L$a9c1=T7+&ZzdE*wZR$ZUI+BWy4|mRfXzh{uzB?Gj(3K9(g>PaE?!bIpCWPIe| zt?6K&YY$CbdSvIYI(u>gF4~>3D{syETaElpVT1`E7^>JwNd~ zVtsYVuj?x{f9nSz>u3|SSh)U2%p&PO{Qtzz=9SoSS5enke11o zCm)_I?`a@PUMyJ>Ht!d7TxMItYZ!Oz+6z~#P;e%RLl=edx+-B(-)G*rLpg8V>|f`V zo8!_C9iO(XP!5}*ca$|f>*^Y+niEryIB}u#nl>kbUPmVS*Ll>?Drel(b%^`9U>z=j ze=GxRx!cdj%MwGA&Xyu**8Z4<>$E$CWS%=d+ZqU=+h=OLnPrMSncn5Tb|MDII_z%S zqg)-6uFmOs{Ts?PdxuOW0i}ago2Tnh^d|A_`87&n{zq`99D?(TKKIdtcsCu8u%=x~ z<;P}abLze?u$N%te3bakGx_HklCFHbXj%i<1AlC3Tbt}tbH=yklmLn?T#0Jo!NvE= zM*T#lc#-}Gc|2B5?F!b0HKAbR`=q{A_QFvFkF65QJ}9i50K(UxEzN8E#UvWN}? z3o7i%ext5dMC{@aZ))`HJr)X=G+<>mzOo{p#Lgm#b*eX{tHL(T-W%}#(wlm2b6N#k zSJmdvD?!bkOu2^-jRdDZQVwGh(;x((^viO4n%|sm; zvcbv9s{-{S?uJ@JpJJJ7+Nh9Qfrh`3`~y31tmyf90qRfVGCZ-GM2pp~yRd6k{J43n zi-Mg=)AKO(%^!onY6ei{uPu7p@WXI&!a6PA&J4!GaJ{Cv za*X%I_QC(i>us&Yg=z=Q$1DF1Bb9&BmD7Z2$L_LKf>qREaE_7rigi2uKadKH&0$S# zn&KjHdp;qw^3gpa^2GkSVTq1pa_~SoUw4}&f=Yc@Byo=QQ6vFyw>cIlQ`H72$T=K> z{c?P%CS>s-OhJwFRZqxW@s`O(XNI%u9i-)WUok|B6aA>z8v76pXZU9l1M?f?!)X@i zOVNE1D=7qhF1RI6-JfU#e5=J~;1oT>H8z}c)+^~yowU;-(Y2VKVNZ+YH^*}RZ!_ZJ z7Q6D)+8|4V<60C&Mi8i+PeTe8A#r>|Av+$9X07bWU*eT<3^M3jr&SRA-;&_D8r-X{ zbe5}abV>zVAfcEun~BStmI^2L0q~g1CT~UH;{LJZ&v!=31^;DjG-yLl0WNDD27TYg z-}ibYS;(Duj`QT0XS?_DWd}pBd1T8E4vqFa)pRLM-8_U&e{v4=-s1JrzAeSlY)du^ zGhQ-?nK>!~rWQjP2Daf(V(Ft3CG9rt4thUqhY>X?ZH0%j#r3`KOD?n6nFT3{%96Gox*P0TXf9tEUQve zRQYPZ%U)Jf*Vcr-#^C;D(QCC)6x`#;6dUl@w7|2La`XzKJ<8ZCz!hxa8i1{_?q&q- zyVLM;2@gC7brc&@=uLZLe}Ze_p}vmB$_swt6X_QZ)y-_jJs{nd)lQ?XR!_!pUjibN z=$a8556R@9E8v)H7kLBH?Hdt2X>iYLsRojrtba>UB`D+#rI}QXYQ}Ec$6SvnMh1y6s$ASv2?1qZ@d z0!fsU-iUHxW1hjS7ZY_!eW1;GXbT-?;Z2$2yS*xuSGi16>zfyd$eeT zAXtdruLc-V`uQo8ADNj3wWQzWOn{x2*Q@iDpPe`-AJ~&Z^RolOG2)=-U1R<nYa)4rg#8i`KZoSUA;%=R1YdY8O1f$X2-oNvTeCp>p|*rZC=}W@UbQV8emVAokFF^}bHvhmr8H9je#}sk~4a395*STj>OA8DcJcNwxp1 zu--54w4Eepy3o^{?#Zos}g4D2RsYTp0qJQU4~Qn)z~Xh zsd5Y?(|hnFCI68A6HNp`#Qo)GV&e)}B!Jw5A@JL&_&3>>Ah-*wQ>hY@TH%J!1RYn@ z?ksFj35Tu({^2OjOmoF^u7RBy?4Ho?{)y`zh%dWb*HS^*+1A|?z-z^?Nv)KBo9+sy z6l`8}86G3y)EM8UFlskv`q|b2%xjQH^RvMWwo&p<%0qt+E-{rF`fRcM=6?6y>8D!f zsB@-Ae#;Xa~cG30`B71v+>pludXK?jK4Y&f| z>g(B;ikR24XF46oh1l?oGhd()RxP-r(#cgfU4M$m!}BEr6L#PLmtpHjx#ZOEh#2vDy9Lsf@Z{M0s!i%hav-XzNS4Cz^qgefIE)UlQ0<$m9Qj0Xmy%_W~YjmP6nRv;mQQ{nAZ zDA$Cq>20yq3Jrtj4rO}-fh!SUL>L8zYHf<5eWPjDMbMFQ!*oOJ;pS9#Tpjr8V)g;l z%({m+`Rf|I(3^fz#P*A*@|kjJ9=gAH0gOhr?btG$R7w(CsqL~iGGu1toh!|ly#M`h z_Vg7Gg4M*dL$P`#S*+}N%hHqiiVL+gBLMSm2M((Aaix&%`Gtvp?!{dMZ#}eXqV9(= zzJLPou-s54QZM*d%*B^XSFH7m{!w4XG2q_Umu6ik<0*5Hq9BJS)rcT1G@i^MyT<;R zddd!a(X)Ce=3I7LB%+}QnSh+Jxh|vs`#px)Un^4gn(l^MZuV1gGCU~iAVU=ndu2xV zE)YmNZJy51Q;kk^P^4+&tXNZTSbnW3^a?{Y>zqr$ygfRv?Wf(HfkmsK7uaEylz+;1aw*EGSE zQg;im@S{Kqcs_*1CNmgvJ_mDC1TPpDbP=5;~WG@f!y^lswUlCRagskoYMKR!-i3u*VR-Bqb<@KzU_;*SV(^4Ku-BPd$QDn)#Pq4(LB54VRgSRd805T@cDE~ zz%{D&DDom5;NQ;=CG2lzXr_0HIg2Y8%5b*TY(|)w?DwC5PpzYbAcTBvrV#!UeMIzkP(qnY+jnQtB?YC-WK{ z0_q3~KR6?MgZ-Z19P{)?Jtw;$p&XRN0#k^f|N!WR*w0j&%V(%0`WY_?XB(9N1IWaB5!6~bHo zEF{d>ogavR2g8c{0N?)`?2eg^HO?U;=2wn&n*U%B-ic=m&!&~QXcmz#G?k1(iSCTx zPh2_9UT0q7kpFZlFoV0|9)&E)=U9zIx6+Dlgv8!9*#)M!7Kkh%SHis-cpg~9tj(yI z9{;mSif%se=lUvA?}n=?=i7=mqoEu~Xo>f&8uJvp83fH%r;8kahXi6+O}~A=>~4L0 z&=Xq1nHVmoo$~&A^h`QAdn;N7MqgVLGTiNAqQ%OhV!4oeH#t>!i#@0lIgu#0Lo;ps z6$d9g#eJdo`DoW6)Ul1aDQ%&?KuZ?kSv;D_5nG5g9u(82lAZ8jEYPtEpOP`rEOQ5t zRn+)|m@Cm&CH-sqtbXnpPKMJnSl~C^pJ=owj#cv35DwEUi9%q^@ly{j&kcWiwJxN2 z?YJ_LT7<<_;?7P>QQKbyk0|HiXJy|0i#27ru)3y#^=O|&#szhcQT%ybA&8>GME;3o zm0${KL=*l0ljFR?orYblqb6ohi2ulH4OSd;@hJIkgK2#NG8u60XUbFA&psB8p-jG z=ZeC)&iW(Ww2if^N})hlCIn#J_^^P`7sF;~!R;ZTfYT&!A5a8;4}%@}S%EyZDTAP_ zWKj!}H=TsKoTKxhMvy$E1VkmZfzWP-+xQ}DjRMaqOsk^S_5aEa&$EzzzRwS#?-srn z!}u|Kxy;*lxl@zi&YPGSnvJi|-`iEp&!>%SFvyP}lv+Q!Kj{o5Y=}%4HJ8Po!) z{bqS7wp#J?Y@CS`_5ja1IgLG42y7Re1F{#L?t~yH$Bbv<;v+?Jw|8>(k*dU7)a)u7 z0fnt37@Ow40LcXn0=4n$1RhVHas50O^35x98oK0{?cx1al>(rLr^ftXYk*ps0(p5L za`ueS?(iaPtl3Ledlv=oh>m`%zb3gX!dO%S2UW4nL#TVh`QDfMQw<6YQdCGVl59%~ z=2G)x>-GC3WZS1?U3VGdn2(7$NT>n+)=;Kzk3m{n=sm~Cc`ZwJ#9R&i)M%UX8-BK7N3=>d zuSKcY=y;vH$z}9~r6_1Z+k1YuNIRZR)=qL9bS4kb?f_CPR-N!}^P>;me1&YIC9-xc zOa)QLz;1`YtZD|!TLpY=iAAdNNF|NSz(P@|;KgN>3D^U!mYCg`#v->Z-8JFZJrK?A4JrELT)}WNJ3kukGJeboO#J)_fl*ul^H3s5+D#P$3-Wsa&WbL-4*7 zir&3PuAQ$% z%6+4Xafn<3fY&SR!%6Rr2@Hk~9&=QYIYg%ezO~L^U1`D5(UN4}00Cvcl56LslI2L@ zKb_6n;_)A`UK|+6xa+{iR)q3m$e+JB*Q<7E-8BBEWv?0hZcCvSip1V&fDuv4Y-#S# zOS;1gU+e_*iW}{BFn+R*gj}ZBDrsJCMMS?1j0&FS}i*@wZ&QS<~5VHg&5OMV?i6K08>}k9{%% zVui|O@k&ExTS6!SBI)4%>8dpAUm4=QY|&%$vccDm7XcO>^@#c9q}aG^I)r}Nn_-t9q>P!FK<8$dLsi5_&07L}x>%#~($BOU(8!rrm||@E~@3 z<^?IUX#Y6<;U|AscjDVal^TMh&nf$X<`E|rOc>MK`N+&CA88FLCENM7w>{qBL}~To?L0#1*Cy;|9{sPd zlpVoTRu8&kIc4cuLK{Srm%AL{9#MD_BFdwf;|NJEx^J4gY)^-%f&R+*BG>bn=R5+j zPza&B@%2RI_hkXZBtQnB&w%WR-QSE*o%Y#STt$jSQf?a948f&@Zs6(*T=lG;;dwmA zX5Yt_UAC#S^k{MeNSMC>dB@So$*Tj2Nw)LZiwl_Y$23iQDRj6gYEmIJwU)kh}jj3uYKO0!KC zpq1q54I3UyPhARll)qMn^y>a$k5{0JI>_ih{VXWk$cf>}EtO5q8I?%tM zo=tXS5R$)FWQ@;9lkM4w>Is2i&J12w91Y*!;Hrk?mhIqkunTtxPjRb6{5)_l71> zd#Yc|Fi{sVq9d+H;lF_8XYFKN5L|U|CCBJ9Vq-2o^VI8~G#9Fv>M&2P`S(s|A$Db0 zn**y*fl=>Nsst5$0lOVe0f1*H4E3o&8j5{OFy1TgCUMi{^1$%sD&DSDz8lSI!E7JZ z&m0|Ez*xParuX70qTP9R>Fb5}it~(}72Az_I5tR>#~(hSEDyP=HNJIY@`f&^@~61+ zoI?uR^RcenpN_lo1nlQ7P=4{A=(#S5a?xRofuSC*Qqr;V2)6|Z<)^f z`c?4^BJP_xeSm*_B}ZlgPIoo$g0gROwHIT{)yE^XwQW-ixygryuOX_+q*5@+rdsN$ zR5oFit98iW1NOA>iC1}H1m4SpT3JE^C&t}K9f)o5xmN0woRh$+6v%N>tBs}FPRLu& z6mnWtulhV_y?g6??@S!D+&A&dQ-PBq$UmuLQLW8i!lElE-%BmW4EP1z zhPqacTn7?#@~+%8(azeVB|8~$?@YRzuw2=6>QWM7t~aya{Ku9Q7+eGobL&7;IT*K` zDpYjP`Ta7dO9xrc(Rft$N=ey7R&ktGi;{64@u)*I)w?IqQx@W}ZX|6UsjOZx0EwAB zg$a$b!~XgFU2cb^F1=%(tWTR&<62Zi?geq;dmIAON*kF)Nvm04vsWA)h@(H=ZM zr%1lx-cr+`j z_GbJT{@HcU6O*z)8!F{|oV;Bu!`dAPl2=9j;k5dVy~>xvYdGDlMxdlJt_BRFxQ4LE zY^KDLb(-=IVE0ntebUy{_<75Ovr^u#_*Mn}O8#D!DwShL!SP>Uu5u#TeqI~ro6kI| zrEtMSfc)JB*8Yw!Z`Wehhx_>SL9oMle1V^jNsr4%pyctnZ~_uTf4UsV3-vq1UpQV26WU{|p zHzna2h)-Lb>#ZZP7)kcdr~$p?#=3z%fVbxf72-=PxJo+srRFV|cYa0*ITU0Vf;d}2 zQF7MN{je_)?ou7|ZS%lHXudE0GSS=va8;n|z@^N?0aH=iFy8Qdi~rNzD&Ph!zjp3r zvM(fMKBUd(bHvoY5vV^n9I?b&4Se%SQ7rq=@iqVF%beZ>$kr0ER-}jNaEz=wE7=tO z@*Mc9L3;B>VrpWZu`(qaM(Mu4gv5fKG2v$&kSn+^vdW{443NbD=oPTD7NKT~TZJ$1 zJPMh7J^{b5OSJ4jvM#-}8k&~!QqeA@nN()~N)nptS`=qjvjO|QBb+0{Ja&F)6k4;9 zrO+2i8n%_wmup_Y`KGN03s3U-k;=|xbDUyTl@nja$9$F&WAb%E0a4Ka4VR5RoE3Ou z>}gJrE5QXBf6ayuL7n#Y{Sqng3f34` z&gFYj13U_)-)a`Bow9Y`!iR>bjk`<RWl7%KKpJyJ(8kR9r5Wz@kXwlOe%mk?xSKos$lp8L^4;bzg^KuesVg?v2U)cvW3oJYNdMpJ z-SK=ogIn~|ftqn-5n-uggidV3!gejA=&Ag*NQffCt0^Qq=x`%;oVTtM(%^`W+(els@E!ohVq1KGoiXV1m*N0@qm?>wV z{q@&B0!~h(oc4_mGaxDhQ_wuiDg7efFU#iBs=TU}PqjS?_GBaeoZY`TB8*lSdj zV}E;eq}nPwV?y){DG`N2=8;J;G&%C6-1_wf{#o{Iw<^^#?HO`TfI(s&>4evJPVqEh ztHX5H&hEC#1_<)IiN=)AmL5E)`^zhEgL}LZ0+$YHniiYKjcTCXv-5_h))4;8E6^*$ zQ4+0cKs_qwDd?9YA3+4h48JZ-R?|Yfj#;+om2nt$gfAY1T_*|1auuiY6Npl8pui)l z{!qfL`7}k1FvQddS*1q>YBK+H4%4OrV8Nk4!Lrz$Os-AZ*AEb_RP_sJ>fToV?UP*% zuL=ExKQkFjejT#!dJSpX?K|Hv+9cIhfM^|#SIm@F2cM8gD=SAH0fozXVEj1H2y;`v z#W~3c3wRG~3jGp(Qk;Mtjy|*$x#tR5hQAsq^97;i_Wmk~pvmviq+=e1``R4vC=9rL z{7zfl^&n*Ndg&WD1nJxlSNRiMDPSO9mh)KpGZ3Q({qpmXsKQT!Z&mAI`WKAG^_-kE z>T@RuQDe)l;B+M|TvhN0Cod(m;AA!R%ub?v?`eK56-y<0G2`C+I^o;BY=<}Wj6$$7 z6Ef+8Q2chxV-VV{3>18-zHG`#e(!BtqIS~g&w6tAFtmQyq#Ined0KJCLbNX#?y+33tPLU=>a`c(*|F2dW>aVF{EZ_}opj=$&(8$`auI-FW!9Yqc&ffcq zlsN~ALC=TWSk+}eJw|b~CA|6pID#{9|h12KF;Mb;tIm~S?qEv*iv@QziV_6`MUC!}FLzzTo= z`J9^a&aGu&EsOO#`nd154(y10<;}2vWxS2qjvl|9X|_-@XghJO^g6G>0IW*jdThlb zoL73ZQyX7}e-#7pG8CS44_qj~ZtY_wQ|es~r*@(FQkwZ9Hqd7qcqN=djbWGz|Hby7cb_RWB^>W0C7!|1g02a z*QnRksf-*)5_XnvJQxtG3G%6&r}RfxgBjZz^GVVag76=v%Hz%h=u%rCqaq>pbE-J7 zbdvWN{{yXLaK>uuENa~zz5Vz`I179TNnqB(h0Q8x=6z7uI=I%wX|z7E_?R@6?iW}9 z_xDY~Ct0_DEbhci<%0=ITaz8WXfaa1+Q9ApC|G#f0gJ9wy@oO}$?nR}=0DLh?CFkQ z7?$A`Qw#9nlVAx8BQAa6aIr5y8`a(DD~!;ol;qccaY%UyH6+mBxwA%YJet~|#jVt^ zh0+TuM~-N9SD$H5tK4203kV0xH~fo=k3mYEMA(fqQqp6j&?VKBNS0vnaO{3?c%4Wo z=3u}^nbieGd!+`e^I{?`!TlBvem#W{4Z)uuY2c6jBsr3W@>dn@<4i`zp~1vl=|DgI zF+@@+?E8`sJ~A{%b<1q>#ws}Pv~#-?(zyt!RH=^*DN0$Qz6$GWk zf9SFd$_aZxFAb<3B>J&qqWQ;bwd>ERo%=>>KbP*ILR8hxU6pSAsj6GDZHo8AWv5-= zJ(SKQ(@P3x&p=&WI@B&<*x!xnW1;LP&-YzbPfHnOI)?=BnPesv&&C^=MrEvZG5MxBsjM3-P=YyQBvs*Qm@VP7eKeBu-Lyu^ju}rZXQHa~ z&pu;$Y#ICWdBE{G9z0LLe9sElScHUCCxj4N5xT#68SxwQV>GLTCkbsOn+pu;&ZFvzTpvkGf}v4)eK;V*ZBCR0w)D%ji_nD&62185-y zN!Sa}TBflJdne#kD(kNK%hcI~zjE5st)LUj{O!WLOjBBfpkm?2BR-Q?)s5)PvS+)a z5EK74n2qgpsRiKZ4s44BI3v_VcpOqq>?8>=^O+L%cmEn1gh%J`-VV69|tQpEeIp#fW~#r*>tqL?|85M zx}OyJ-3lL5%{=O#?yEgW%%^m>z>}T~)VV=sLJgiQK9Yj(ly0dGp2`8FQUQv79Q)c+ z(DZpu^kdkZYXkDWDPAdFIn^}=xH@;F+{;(I;Ko^qVcWbrT%#pNjn9{LC<4}fokI#%so z=I*+OTwS7@DKu%B>V+CHJ~$#*Lb<$5fU`SBOQA*j?kdNkw9{jkt=Hana*hjT{68E5 z=O3`%@}Vrn%#y)GM76Z!tz<0l)wY3OgJiYE-k2mJqNOSx~dbO{El%*o7 zC63HBjlG6~IqHS^?o)`n5m+RAJkt%e-P$k8E+g6y3N-F&IFU<>5+Ohy2-zsGMT^G+ z3Hs&hQpeU<=>v=8Z+mO-_KuhQE-MtrbB=y@tv`Nr(WR9&tse*W<9Z9`|D@6QI z&~t3VN6{@`_5E>1rXGc2{)U+S)bsD2FCTA?kC`*de&tNhU81bY14&v8Xwq}bb#uZkn2P)Npj8R~171~%?oAFCBgi_;Gp}K3w zAWufUXc1X+rb@fdI=u*rk95=A6KM%HRCELT{O-~}P5SFWMdQT$aQ$3Ao~fn%%x zwk}djdeS?&)^Q~Ifg#R8nm7B5Y=^*0Y6Nn^8QsStYiWv`UdNu|0t?q-?r7}ZR(c(NJ9$o2xS%Y_>fHZy!O_aoA2@2gG$98PR+Tq<{%*kfxK!aXfl zJ~|Uw-Kn-t2D4Y`F%Kf0MZGZLL|#AzF6U#B(n$R?1del-(l$Z8Jo{a?1`Fn#Zg3y< zb!T&v-#qPQokKE>oHK~okBIigIP*d<<+%$Q7Vxf{<cp3Vof%dqkhXjj5``l$R#$LLRf*#LWFR+ALbQuqu5Vv{GU{1}ZqghM?7h@} zn07S>Zer=(Q%1%6qDwau3cgbr;SJCv7@229<8+$A#EDVxA&QhK+>r3YfpKrHa|jQ>gv4ug9r=J$u@ zWxaE6U74RS7Xd|4~^jkUp6*`P~&M1v-MX zW=F!#oL6-iRIZP;qHu)g2E@da4?JI+!cr7o)ZDcokvr@8ld3Lay} z@`)Af+R#~8;n6SMN4q)<@z2OLs5^TId@Rn!k@xeg6&86dGZPkzXAfM#6B&N4KC47u zfm%H$j%N>;KkJ$kgMETYDV6B$RAretpX~{69Y(ZLwf|ps4ydRIeg)TofOE5?KI3-4 z;JF~8Mhl#E-wKh_R=hx!`jfuU&}H&{)i%I5Oy`d7y_h-6vffnb?qT67P&c@tQOJ;o2FI1WRSegPlZ7EuYxvj$yeL!Ous$(;B+ zL!$TA(=PCU&ss^1kHZd3Vc8xfuYC7wAwe)Yp zr^Xcb%YAOxn=~*lbQ90Ts^Bn;;X3CCi@JQ)#?fJC=P;Jb-ec?vKj?FCKyCOt&?LgA zkZfyQsXpaFfB*1}*AB}oCyv;eTM?Mg)ok3OW@V$7T^qxPm(!~k*xnxTVgs{zcGRC~KDR5MTaN)ra&VuoxX#wL#vaMl z**`pRtP)Dt-nk{LitSs)i8)2le#0S>TlD3HN+NkF->{$!exy+IP7d!X*&bT10kd%N z2`G9qO-HR@^h#VPIl6k4$<9DR2H6AkzZ%U2PN2@3vXVgCkZV@Mi67?=LU8uWI9JlXh7$6hOu>^O{4X-&aYp43g{_gEf`m~qU5?r>rD#cTz-!J32P8kI z5$W}jrg$vs+!Qu{HY6rq)2TWbmJGmV&LBxgM)NR76E$3mC0Ep%^*bV{>Oa4RS1boS zC;?6P)n%&eS9)B{YBs{t5^hLHNd8G1nGI3zBk3;o9Lm|_uhJwy(!0+=)ER1J<<(qs z%_}wu9uSTC^<4`xTT@kuymBzq)Q#_|s{x9r(m*0Q;ve?MXebTGC%LGeYB%h$&Hf}B zdvxa3YU&NQU`@Iw%`Ovzs0I$bSP~ES_XzTM zio01m+1K|Yr~d#+&Vm}U_vhE}Icr$@)K05UhQVK4fFCrIZ|9*EY8FbD-fr6N%Bgl8 zR)wLMbkmAZw&QH-yNqN_^f0oQt$IfInw%7hoQiJDoh5 zol6BF;jA6mBaOfJ1qw6tS!bOBlQS$)I3#Or`S&r^^^vwmO51`D(una9O8875^A&oz zRk};#Y}jX7LC!~-Vvd#3xY$MivtGa4*Yj=S&t)@GlQLubQspfh|e1zV^BSq}k8CTa~)$$bFe%#d+vXq}JT(`}D zBT|apa(@31AHeKJQ3PVlr49?tf|$YbU4X z@}DahVKZW*-%XqPc%Xl(6rw#wU{j#W=LvqJ)m(s1xCskN9n9XXR22$F?GxB{f%>`D z)l&SB)z&{a>0EP&H5k{%x|cDUQfnCBvP4x$TRIx zOnXp&fXiZ-`?7zg|D>9VYo%xW8cR*ja3f-JCi8&uDqFb_w?xT zp`|wV(m-SV_}z0~KhnM}>*zTJVz>jmi>oX(zGN?}%QnKU32+RHP;GwmlK;iKJfg# zai#dwdFI>jD+6W`oL!u>9ke@o$Y_& zanFN0{9a-324EC($jXLj2xHJ*x4C9a4~_vS9sBMNxJeP|Y(rGb`n5u>Uy6 zb+5iz5h(h=VP(`j<7BJ94=&GRcQ4+yX?+mNGiB3_;QZ`U&^ZJVwZlT~(cDoV7KRLW zxaY>|9`5fQ>M%c!mga)Tisgw1U*oy2EtCf-TpCLM46ttW&0{%%vx+9+YK4I5mMWlLI%*rxW8Fq$(+l>!^T8egz)|4c&JJ)ru{R#BPEj3ogQ6RW@ zbXHi;B^MyX51f`=)vVX$O-Ai`2E*Q)iNZ!tAW#?m-Tbij&!GRh@>`H4-)+C{PSqK8 zz#hh8>1aTig5{a8suWz2MtHy2T{!)r_Kgn%qEH{m!E(KDy3@DqU;Xd%Y2E`e6`b3b%`_b? zQYLM#+%?6JS5$%N2p+N0@PNO-@JL7vif3_)`xF($k7IRW7TS)k^)Ty4>rLI>Y`Q4h z-_hBb_SzR2$oDbr&HYJh8#Dw!o`y*Et;BOHP~fWH0fnb24mn3nU*>a$krYj|b!*I* zFdPtxpatbK>sVm;?=cPl*VCDLc@XlWnLv0kE6@V>u%z$*1TDHP%UX33*m7>nK|8aY zT9d&RWA#Iq8a2@Fl4a_FnVGP93@o@|{`LqQwxUghUkdkDM)7a{#yyP`C{SkueOlIK zI}(XxvkBX(HP1gLNUIVCD(1k2$2^~{pHJwHLZ@VJ6iH<(a|lQ1Hwlp=TZOmjSv=I8 z*otiD*3S+B{+;^9*n~7r8miz^fVbh-BHiK?9b7)ThgwN@T1h1P>^dj2)xr!vp*FG_ z_ZoO&H-t_Ii$KFZoB{n`U1i^S3XVx)9uF4n9q+5|Icl`9wjE zcMO7g<0HRFSsl0^ZB}(jES-vw} z@j_VnTj%b0rJfafP8$CIirzmi%InS-|C}>thBL!}XC4L|kl6DK0}hDh0nwnf?U{#R zGW>`c5DnV2J0My#CX2>wO}2aQnPI>Ii5(CvTGKlqF=&!5nsl$(?Y;K_(GX)=w6>dM z+g?m;Hch+xO0wPFeDCh-zP=~?g}2k0o(AxxyH1D&zQdE<79P4kBI`k|5B)M)G=JFaJc=CV^Auh+PHdTZ zS$JS58Sdzd(PATe=aoMHINAg-?|-yW&++^Y`D_`RoFpS399yd#!??0dSS(R{RHrd| z#iXN&nk2~Eu|Rs{&|b5hVeA*%J!=M{OW!*_0oD z)srQP5oNJ>pgc?T$8$#_@)S#{5ocCSIS zaIxA}QW6)s?8p|Z;Y#5R_UKb~bsLBmb8Vo+CJX9qPeH9}e1bB8mJ4P-_`J)7MGwk^ z5`~pXK+s-P#eLajg*UE9t#uaPag)$6#IYA%hu#p}(;#&Qyw^knC5_lLCX2VD>(fw(zsbdCKHqFT1o^!7EC`NQIlU#_y+b@c%V zRMMye6ttzBtbc!Vh0)BGhlG{1kNTgx>F_4@1FZpT2tZkvW_grC|7za`OL#{7e^$h& zD*-%;2fvP=hdy;+Egb57FYQd@)w=XKf@+grz`Wx*bQy0|d5X-m2jcBf60y1zJ9{$j zHV+NS)T?Dv50P9BUSXlkB^~yQshrZl{!%?DsZ`7$ zZ>89n7Mn^ZjQT>0A+l!fX-=Tk>~ueKFddvH9Jr;TBM zSOPwo=4BQs;2Jwqu%XN;d@Vg}&_MOq(}pN4*)*Qu?jo7a?L++G5`3o|%33t9eVB&Z z%1M6R9C#)(@RA}vSyc}`R$rk`ulw7csC-J@D+jBZ)n@T3sJ&SKa+rs3QNmsSpgZew z*Oz-%Q>AS#6&NnzHCK1{AXBa2zDL<2~ zU`ht!@agJN*0$o1;QLy>c~(no@U87%HEnpywJbU+K1*H`g+D~wEgleuAs*?^xMxGf z@zx;VShQ%gofS+dR=WFJR3wfM2zrK6nDizvOhz%tK+hsl{%tvR@tF5};A&W>7+Z~v zzfQvB+7Vk>P4<^vk-06nqr3t|IQQA8|WG7%!Kjy)xY@eP*467Fna=dotZ#`eHr*8ejE8l zb3n&6+tX~eU0Q=S$N1PEM4qR7ayX)QqjA38;xCVGk@JejI>%x3RuDCQ3_;KPAbbn0 z`#$@BB|9?qytuLfinfUiY+^HY7j!QjiA6J}>1Qst)=|nH_S@AUf_zv`&OotF+QLOH zr&L~ZMwknj>SZ+QE;pAZnnsFBQV|WO0 zfy3$IaRKs2w`;CMilg-yc@@Z4y|R)0C)Cs?hKqcqcGvZ=OWCM67u*TRrkk9sB}DML zXY3PqNyjNgHfQXV>iH6iFC$IuhG+;PjpwshNI8d}*|`QgyRlxXwu%Yo%2@_c9;OGg zD4bUUE0;tb@Auf4V*!txb(YXlN3*pVW?2?N_#CN)C9h6N zm@E5g8=bJa%J9OhW-w*!3(wlKGwYTwqN@E$i2!x##IicmKN#_(zwl8sG(J9AM;@9? zY&OC6TwF9(Tp@-TD1 zTpHde{*T|l(c~D~Ryx2w9ry+rTY5x+G?%tz zq~SOK?hf8hy$bCG{#nQE@$*<;vti#XLSsj~4u#0Q`$2sWmsgm`1>-S-ppa=>+4h)mdh_n8>x3X6@F!+bd9kN zHnfzf*8c4SAB%S&2rY{&ekz^x*I4jUA|8@NW6A8z0k6P)--w>>7r}5G1uzAluxI^D z$A_F{oPJ=*`r9(GP1NpCs4WkJX%P!iHIF*0|8nofP`gn)(4X|=2jWZb*Wi5tL53Bc z$F7Yyoy&?qhzs)^m`W%QLg|cA*6g^G{O|J18PKHMtDrgu9kiTXxa{`CEL=<@zdw4F zoeE)nSl-SY4dAEM>pjEDuG2IUsVLkzPZMy@wZo4qVOyQ1FiIO9SeS!w{a}hAN4wEg zWP8vpa{T_a(Yj!-rfhsXlX%b@r~JevGdNRrkc;%4!!&%Z8r(g8+t!zqK*zv#!dE~} zazq)p&kl}w&!=knue?QBOhn_DXZQu=4o&swle}lC47ya78vkHh%4TM6#T?7lf>~_9 z&xPqbTl6Z45AEa~Fq!qHJR-F-P7`hP|IUsFm!cH4C?M+oX9~>2iPa-P-4wFxal1q9 zbYP$1>}a_5$ngRl=Qg=c;tP>zH&&Y1m=bCBHLStI{@eLz(+S{78xp#Ps1Az%>+LN+Pt?={bIp2VNQS zsg0hmvWmfc4l+`!MP|vSoIfgWzJ`IiYu2_iJ0Zs^FXL2p_}YMAJZV>kgxyd+zYr%k zDUeiAC_tXKvc<#QfxddghkFgEm<^4LPJ2`BEW4<@gm+u}I6xVAX-BWpPXoCMMk{pU$>g+dx=xIhi&KY< z3i=DpKOSY^_ozL3O=S~gSmkMsu4)4vHPM>psc{&23DX67BSeb}GFk~A@m&mgWB-$H zyO`+m`Uk~7%8y6o`@rze_vVUwE9U3Wdw9`h_#v5X54a(jqg!>?2xTu^h?4uf2& zG1(l6yOfUmz3B8E=qYL&4a)|Cj&GVr!+~JO(r}pl1m%FiN4`*0SyJg*sNN=Gs4h`s&}eVgRnTyf(y^hOt;!KNSrI3)ZFM$5M|5pVk~@u* zyrBrUgFOJ+dOM`yI>q%t-()<`*_!f$`}lNE{6(kFo2-1eU=Imz#*6c_0QSBCddyn} z(LQGu`DNpO_^=xwW&F0@eS;G`GR)@}-2az7zx8zAKwe#_@hJ163U6S+>ZA zpUosa5#jTVI>sL>8Fy3R!D~X zz2?2AiUt4|rIp7}?s`+^yv^j3#jKROQ`V<(|39;o3(jjh<=lab_(MjVP66WlJz+1s zxO8$_`xors86b8`jcpZSTr#6RGi!aUR0$K0xo*V{IBD2SMn&Q$1wK10z;smY($(t% zUbEgtBEi-n51e;#pW;Vg+iEsyG7t8@&C>ejcV32268RM0a;%Maq4TedTdD4fkUi4? z1yDC*myxlYW(3J%FEkJ2m})WHQDFe(TPssCpe@m1E^AP+qvjVu*x$%zqmASN>ZQlH zo+_8wP{6m{g1D~+RhzEBu_SmGivv^f8x721F+Ey=qYPQU#*u1Tu`l}0W_{oCH zA?<3{-Q{u&>2=)~MzZ#WD2HW7RR*{VPlBj_awZwHd9kgl$-m__dJ)AvC=&(Vp^wrO zvf4eRTHzV4T=7!d>sP3k(u+7-nq-cxa9}Wiy!RDCoAE=DJJqss|8u#Q`H#N`UYF>| z40-B;uTRL~#9OZiy6F0lWtGunVS=|Be-pTkV>BLaQ-Q`gd5?rb2QrI3XCRjMcfM&WByS;42Y z6NZioi-Mo8ADh|!P5T*z%s2MGqr( z)q)PgH2T(>qdG3iDw#lctPv0R<=^GkdS`9dc;9>5w061&=|y)pWg6M^VS08`;-wO}^j~QPeu0kG0aHrv&#>N74-+m9a#$uj6 z^#gy95Hu5P-6mSk`(n>P(q0)<-o`fiQH&^yLQjz{TjURIre%9@(T(ZQu6QqT@n0vs z@o^dW?r5xqr;aM$H0a3PLqi)> zxBVMs791%cqyOjCW|_VbxXAPDJq$w z=Y(45EdU3Z$(3jabl@A^qC8h+QxM}`VC`$wakbJ(oPt6afr)l@WbBu&m7^g=Z-tMX zJ6~Da46a!2Pfo0mNP(Vl-6RH|bu45IaN6)^>&94;#1zmUlN?nM1QM2t&ZYeRez0Py z2lK=xrxc7AT2(TCHMC#J`&9gzdEG{xuCH#*9^DJ^Rq>s}Jz&2)&9W!4o+$J5Y-h3r zVp;yz6>=RkbhdhW0$=VP!MenW`THn#yd*Q(6jG{>S%?SYZ9C(d@rlp4A=M z1mjT%x$7UO$cnxU#bC=bYi&y*6Rp?*HAATMUP7$PwL47?S1Tpq&L4L%^^w<*b8)j8y z;Y!Z|6+z6r1zC*q^Zx#w)z+GnQJpa)qE$x{MY}exVPI7gf3B^|W7s;LY(8Qgm;;w;$5Q;7X$b zA4!5r25BV&$x*7!B!CJk5E-qQPMLU#Xg52{Sb6`iTp3#ATiT) zZppdQ=NO$!s}d)bfSQ2gzC5>c;({mhRzCAz*$uG8G2h1K{F#qsN!ds(*om_8;>KM| z8DjfFX0kqcW-vLZ@*%bF7X`(kd;a}lrNB?dPYtB^_QEUGHL<~YHATYi+g^rC;tq2R z@1Ga_{w{bxndCY3&_4cA2_XUN?k66$tcul+$~Y!2iNsKY%bg+E-U!0R&#fHr2&l^M zNV6b2)|S{hmjK=XV!4P(wk`hxL`%21KZkpwW=<#`c(0o7(n$$Iy$q zQM=%ElAPF&Kk;*QXaApDRG03H^u#3of zB`6n~9i88YU92_pKa~2GdbVy>hrBM>P+{cC$na}lK7x3ylX|+l95@`?&7z7Uw)|En zJYUMpNhL%H7);~w>#5J|^;-L{4#^~aY@N7MF01`;N(LL}zBEum0oOB$vqvr}dyj%s zg(-iQsadq}xwti2MWdidm?D3Ii$I!7*c>$t^38xt0Tj=Hk>u94p8bSi;c8+pZ5cs03LR29lmYG-Jim#QXcG?6^0UhD~efbeUV5 z7fIx~GVQ9h*~rX)?e^f~B=gyj>@Nw1yaSMl`#%ISZTHIlA`M!xD;^)!UbQ* zP1|fEc1InC5-kyqRbQi~8}UDJHMVwI{_TW&$R9AxnM z+!6eU%U%6+L5KcGb-qZ6tL}CtZ-_C43E+<8ksm+|nm0|HZA^dmZ|owK_Kh}27DOj< zOSJp0AB4a$F)jQ;+T7pQ z1UuxTjFRK%-pWc&!Bf<@zjL+arW>i)+*Oy75b zK*Y7ndRUZXkO=tbyhFLz6+0J0vWqr!OsX06i9$-&g(iezXK{0^Gujzu-Lzq)ri_*u zT_{It$?LysK2%Y1V5GPQN|k*DE4F7$HV@~GeVGqr2p}r;kmY*V^H+AJ2AfgcZFeM@ zh{aSkL!#FIWlUIgzu*bq9JAH?6b#3t9&NhcmW10vDI7ZNZ6NjlT7L1g@=?1!cc>8iYTp^Ga-9W5RHA5`&hm5=f!#kIx1AB ztla$^J{*iR76ikv`~-+Tqq1|q(_&o;e%Onr@7tBBv{2ryPxvjF*QgF=WJFzjg0zqP z&NI1tS{S1&`;@I-z!SYFwUeJEf{4WPasV89c= zAvW&$_IwONEF(K<$lVTgV8RnBajRkaw;c%pi-kNkDgTtVyaGyJCskByZ64|fB`EC~ zt@ExyS4Q(EpQj1{W_E5;UrBmTu@eeBi-XI4G8A*5o3ytM!I6>!hHyrYj;qq^K9zsa z4=6NWIO~&Pg^VZwtz(G(k!9iUA58qMDeNG|(YaKrk;GwDF7)8#aKSbup*gt+$4@~;==ZlU-F(wBbq$av87eej+W5o zSxnD(G4ZJz(^cb1tpb%4klFLTN5*!i4?rmNFf9z*VC_MI8#v<)tVw?XioT`x~Pb z4`!0~x0xRoER%E{CF3bF-8k#V#>Z!dY$59@7qJg0DrG0`Rip%@^T2Yt{5s(WB-Y-Q zV3(*mN0o&`UfeIA(%+xw9%WU_jYh}T064^S(F~Ez`uz7%X>&nll z0{ee`Y4+^3@YBefZv=B6B5s#Fsf16|2TjU{J)?pp!P~8F?U37M^GiKAJ`y}Fj~Q>R z!H#E*e@Di|yo4>WfJt<|MD5X?F#6LQ@M0)|>g!}qIW=y`D69ym#X_(pBQKSCd@q=s zDgHM1!8+mM7Kdtu(f1^Sm9NQJ@C{{xqncHq4q7CkryH(H`yXV2x}_?ZBx_aYf9ztr zJ8Pef-pASuM9`mZzDq~b!VCtv+z^k65I^={Fc1|Qe3){_t|%v-iNlqV%g*JvDWFeO zF9_esd{=4>@9Nq#>kUqKk7ocW-F+cThkeCX{D^khkYtfX3P4x-mIgH_MRHw0PQ(sS2Op$a-MW0TSlwk1K(cf&SMNf$&Y@~~j?m*8Bv@X=|&402+x2S`b ziE3R-r)MkLr--}rsv@eMwzf5?<%+5WjSC4-p@u;^U%|dg^(xARZQ~$vNiFDgRe*TQ)RwR|x8s=x5KwETG%Ku+@4JSYO zs?Ehj$A)-ny5k<_ZNp9<`~X6LTpy$K2$F|kCi4fIKcH1hGEH0y0TQ|5wrge5!CcT{ z=jmo@4}&ECtrm;#(@33DegNlxWa#1SHN60}d zKYNS+-ny}IVfHxLl&huUCwr>zbY5HRDa$)Oo6Vt)k<0GDlLrY)s}rF) z3*czn+3PQ7>4I@r>b+GEz|f>tD0iS{Jz8~J=^N@qLXn`>GL19=+yTHBu!6T>y^(T> zSiKskT<>SmG3Iuxqr-0c%cy)YeJbsaXsSpQT}WXNxS`zLwx@XjEJsZ}PCQc2#)jJE zt9Cr_-$UYkaH1NS7840sascR}I`8U)dt=@W+))b3m?xensP&s`h#u|BzTjuXd#|^5 z{rvhe((>?Zc0lx(67qyETD_MvOsNa`IAAg$R9;(`Rx<)sCeR~Ai&=-AzB0asyNO-( zXW@8-m*tH+lye~gmO29uF+3Y>A>ZVqyGKv8Ui0JVuMtcaR2i>f-oEOF*)*1|&9K>?}~)=VBo`Yl06$N4*_z5aEFm{y+j8 zS9u`m2JHNRFz<-j>t0{^DNOoyroE8NY^VN&`c;xI`BV{^BWl$LpDJ|44&>ZY-VM*) z)<&1Vp-CZ794@q13~p}8B!Yfh>Lg_2$%9W%^y7ovA7?S9gc#-da^pH*%fe6RJ=|IJ z=yDKEW33RRb*nJCoJo3WgfsPy#4QN;^G$`kM1hZpop`X!H`paW)nwzqZ~Kcs@Z{81 z$3VF_g;Zg=+zsn&gdyJgWGm+-Y&W(9)l578B=vEgs(S`ok=UY8P zDB}PEIi49R+jw4mxLc`jo?_+0X2@J^sY`hELlA{1ipcN3%h@dkHUFZ@X2HDV-l%vLV=%t??mjXM2GKq{rS>j5aPIYEpG0fqiDM8S(0=4 zDY_63XEKPFX5XxhNx3SasyGoL=8iRW*wB#}yu;Y&04Qac`u8rPl{>J@H)T)ucq{UJ z;jgx9<;Ojw>((=(NjCaUXeY02i>>2tO8?Rxz5qNYy&fOGu<}O;?0w+kEcOQ9UoLExKz}T5`o^$74qTb! z1BzR5(jT{Go2zi=)IYf0MwU^l47XysR_Z8vT?*m7( zkEGR*()vvA$)5#WPcO>T!6ml(`~b4dKyLs?C({Z@TIP{wD2sSzgE}984u|5sk_4D9 z)=R14W^PY&7$bKvQX7<=jUTLYq}SvQmNjSKHeB87mV5rFwu4_ldwc+(u^~%jdUZJ`o%vwen`` z56#YZq(Xf zxmalRzVe5It<$kSMZWPX9>DMy`?DYPz<>I;Up7OcF$z^zEpIdv9|$$rY6ZAKgnME& z4-ZlF-@s!JoN3(xqR=yETTK+Mop)yyJcgW0xhKXL`v26PsA)S}P%^?)Fs)$;cgK%$ z?*^km`5|V*zz_A7M{U{5<+`^r+P>M5j`y=We>1-~Rhx7bE!B~o8N$s2JiGh0%|XS98ir@I}gOnEJ7+!{c?a)bBs%X)#K9SzK$wZiP{^Nr6}caf0K zE>K+lm2*wKd%vQKs#Ze*72bp!?ZDH08uI<>nV3&QQQy(tXL^**BZR8Uvz^=xIj8no z#f7||DZ*h|gXcCU$YIs`tBk5(@-X#UE zvk4nE_QP&+>ypZHtPXuF6^3`Y3$6ChamQ3sZk<%a&C|)xQ=o!Qc5FLAdI4H4er8oR-drRub;8N-Y2Vf5|#jMRoq@HX?+p>mDh z!Ji>t%-!f3oHXRJWiF+BxH=6_ds-)|YJ1Y`8hUr5wQCoBP}zA_AaeZiemRt4g=9%_ zQsjC6V=kaCZlUG_Wz=$|r}>LX{Y|?b<*AaYs+4-%cKiBFg1zmhD9)W*qKGXnVqBd} zmj~B!X!=#^=nM=1QF@rP$4b7mggv|tmxcLAzQGdId#9^FcNJ)9ruu=7y!u{R_vL%C@1h^%;!aMjoFwDYs>rap8<~&mWBsEoc+zo>mgFd4hQ% zShY~;)E(!tdOZ5OnaQuDU~Kbsn_S@O)odF&9NnK<>i9hxGKS76(d>|CwTIN+H$slo zo3o?oJYaNYv1j&oIT~v^y!n05IX;!Z{cvwVu{z@54`wefAVh zuxa9Pr=e_D7RT#>D&8r*kmo!>G~H>nK}uodBz%E~v#Fxgi_>u~uR=r21*#2<%ys`o zU5x$hd)bf^mw0D41`7T;96iUN20CBp#d z6gcyB#%xh+uDvn5Eo*6{GNk9ATJ5Z#eAj>T&hYvDH+lC2H;pDvKiL$Pa}Zx+d>ux* z9ieTT_Al8$Z1vSNWZ1GYr`lp?K?wUzuaAAFWq?lt&CZ0SoT}o9cou)mG4sQ66tZ#= zf(aOfW^5|vsj89=Wxdsr`yu%u?sF=1&KO+@U$SFlw;}5<@DC^ z!6q)cwLY+~*AUrbUoHZhHmKeigv}Y+)xL6xqQ{pXIHL0tP{wCcLjezQ2V!szH<%aL zKBwesG}^m}+G~W&1iNAA!=?P|ZdtQeEvXMBOdN>%djS2la?=_~CL7Zl!|({cH7FNwTW#4`M&(n^k)ipeQW zFn8GU3^?6ivpI#@`XRg|(dM#RMWo_3@y9?M?h%BW5-AXaL1@$}tT6U8t9Ze<^%`-a zeIsXiIwssU9+|eyF)0Mwoo$ZbqoO_-)EN6q0=-FE6;S5IhiWuXZ-dMd&pBRhjy8>@ z4c>5AW}Dmm?toJl;RoVw@h{50fYfs_VCd0Nui;G-Q%%tLWtyda*L<%~GV}-k!G*p+ zI?tEqzhh-ik2IT3EBajOpzyna#Cy073)TztX+^$U+VEH7v~$>df3^7-9IN@VT z_`CntpynBc4`fB)EHiDkRE-vuo|`Z?q8^CvNB$3^7P}a?4SIdS)Ra@jec-+!KL$U< zPmru4KPsX{m$4kuHH7I%8Ax_VMrDDHyjKp?xo~25Di9Z=OI$p z8*)H=gRr|E3HYS@0G2HE%Bu=RC_CmKTo*{0C&|FrC-FBESlPBHv#vldL!g#*H9-^A z1zx{?DQJ|w?n|yk;K-*Y3}mqR zP|D=;u%$#$@n=sTbfnrf<%YBRx8-bLfHGNSQ@*Mdgg8CZWxCEg{h=#`-7e%fY z{TX{u(yN5Sj+4XDN5_Q}-6wsmup11>2bTPe6i$gCy;C(>-Rc4CV`XIR17W&j3ho@X ze2s~Cbhfgp1mkTKk8#$pFKdY>Ch2_M1i8A|; z!^K^OuZkP67o6kq?Tmqk{AtV~f>DKhGJecn|0(dOJ5ue;y3f?G94^via8HljAhQcl z75a`AI>pH+X?h)n0D2nXGLPwe`Wi=~Or97|p?wj^AB zwb*TtD7M7`G_Kymkn&huZymV+K4-nsS|k5|5U$`rwhCoTiX9I-HaLHg)_qrdcwQ^f z%-D=Srq6`qknNbvq+(?g05><^mANKv_da*NYbKOw!VFU1r^;IDw zJ}6gfoB`sCX(je&s{4F8a$srI9-R@asMD{!9n?t98}SM}=~wez+UW4gjXw=0QYH2! z`dE82CAM8|*6CV~kCQ0JF9-BK=kMau3OlTfCqA{33R`LGb#!=}j8x`r&;akY(Z4+! z+x-@>ah{*eRB4)h@biwzq583x^OKC)F@E;!k@n?#3w`n^Kc>H0uc*M;O!y9+_PF63 zjCD$kA4eD`;ycJj0MlmX4~O51IL;wip{`K1hFi~XK(+OHpTqNv@|FVT5coiaaoZGV zk6>N`J(w7s-vWE8!<+U!8eDxP>S;%byef+TzYoD?EAB=!s69e^ymAmgsRCeWy0F=% zPH6x43Mg%=YW#(?Z4gkZX!kU$vmS6k2~Gi z;b-HDT;p0Hqo$Q#L((zFs*DTvCxr`bfu7>ZTEDzlB1q|*;dw`F^nP{NxP8oM}k>t@rri=lrMkaJ zQ)}ZRp%@QtYii}eP4xz^*|2#N4{q<{(tz3B`yE} literal 0 HcmV?d00001 diff --git a/lispusers/proofreader/PROOFREADER-WORDNERD b/lispusers/proofreader/PROOFREADER-WORDNERD index 566b8ecae78f9013c043e5e5f732b4f0347d94ef..a11cdde9453a896882c794726648dee6c311adf7 100644 GIT binary patch literal 79852 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 AdjJ3c literal 79893 zcmeIu0Sy2E0K%a6Pi+o2h(KY$fB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ H12+Q$I3xf8 diff --git a/lispusers/proofreader/PROOFREADER-WORDNERD.LCOM b/lispusers/proofreader/PROOFREADER-WORDNERD.LCOM index a6a4a89e262e99c73660c053b741c2c4a067b603..27965c00a8c5c86d2e828b145c054ae70573ea5e 100644 GIT binary patch literal 29497 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 diff --git a/lispusers/proofreader/PROOFREADER.LCOM b/lispusers/proofreader/PROOFREADER.LCOM index 8a7ab12215a4d3ef47447abd311cb064a86c2662..846e22c1e7517fab768333cfe98b94f45fb20452 100644 GIT binary patch literal 10060 zcmbVSeQaCTbtftLBT6Du60OLLrd)HLLwS?J?+3|iR)MNv? zE!KYb-uE6KWj1ljKlskM_nvdV&i$Qp&wK94_>`E6k4%YDd_+u5$z&)k#HNMQapDqF zxp+nrvuPI@%EX1qoG>BnE1nRtapLt1cXhd`h8UXV;*-SX^Nu7}l@XuE7bHIan9n;F zjJSx~wNP1FE-S?Xsi?$7e&g&+d{T5ME- z(VpX((a!{iNteqTY3lWQs9rDh)~H(L(E=$$>(s0y5p%oI(NPyE%-7Is8+l*UHT>~| z_xi^I{!cqt;){m-UNRP+6mugJbELYoNV>*i2_bblo*l`_#C=A{WQl2pF?l9COvcig z_!&{2&5lfBB{5+Ch`dl6iG+#QH|Ft<`2#M}^{Lj)KirjWuIXs1c!i8jM!MW0@sf+! zi`4v5k%+`YR1m|&a>-(`*q+9p<&na;!%{EM0*m9YPS|zAsS^V_(XSH@o#@qxZk>2Q zC%Wo(OG=cw+|e+>QzDTF5!89*+2@MY(aGY)`BkN644j0ccU5YQN!W8&Rjg9278h#e zin>BVUamgqs7H@Np%7PV)n^GT)?6-CDvPVj#2acUm6wYu36RfqcFa_& z%OyVQ+*~^T^Pht?wXQgAD|kE}SOZ=6lrR$~S#fOa)NJakn3^1c4dmjn+$oYKSOHHU z>;)AjW&8(8HV6Bk0U00@k{p``LV6dP#zvl&p9@jv5a{g-nj^EbA>M z#f8*tdSpt@%w$iIDH0{w<)WgL)k{LPI{z$6ydGu|l=AW+X5!g+j!VEazII=S#d=ve z*fVjULXG0AgV_fAyPp>PYRTz5+wWZH*J`?Gp{Upz+vml_9@`-hh!(lOn5_g&WP#>_$5`fs}U3E8-GxpBw_mio~_!*qHkiPmb8Eu(;J|at##2Y4JDm|M+d%9?DY~kq?amOS% z8=s;r&IrLhdVW`G zK*}Yy$Mf3J!RBGy`!+UgQZNN8GaIz zT%|ff$>@RDWxd&mMd9%sT&3Kg}MDK5Z3!1_p$;X6Gy zN^xmvzU9~q6Wi&d7E5Q(PIu4Kj@UQ3)eGE+^&^od6JHmY318@}%Veu>oH6xgy)EyO zi8W8ujyLnY>QA1}JJkC=pYK;ch~@{>BmbFqsz3Theo*cIi~Nvky)?&_Z9F8Ocfr3ss<$j$UL}N{A z2r4)!*p>Y4yt}RlvU_*aA-k3HyKl&@gfhO(2K*gS?byBbW|>ILJF*A7GR=7KH9dTnHH?+SQcSe z(gw6lXhv~^V;BQ1j$aJ4IDRqE;`qfti{lpqEskFlfHeG~AQa`O1@NLu0A5r9z>5k4 zyr>|+iwXg}sDO{5mX}H>1*m=sPy-a8oD`r2DL@TTfFb~>^BR&Iop|jsATPH0i@e~%!8HPS8q$hi=cN3b*!U_#@G#amFTiTsXMNKxt6D7wflhDz7dK%F6-iOB;1 zDXk_XI}18}3dI9D^K%gB*BLuhIdrC@Y*+SnUr8u?x6i$hpm24P!qrI%S0@=U zlET$n31E@|R}7UJ?j;JXyb!1!DO_46%IC))UOn6a_6`xb+;H zYC^5JWvbbSI;NU{rv)iYHGm{DhL~y)RJ5=0Mm;Ss<_$%fFos~r3}aA_8-NaDo}dn6 zxPa=&=WFeUq8Pvi7y1??YGLmJBSD8b4UYU|si>}|D=X~KtHmoE1ZmuYxNM1?eM+pb zz=VY;h{-=hIBxBE`atuh#i(%>WV55zp5!rl+gAIl7|;HgYTV(>zjII1aQ%@2Yv90z zzU;sqKH=!B7nBZ~7AQNq>(g5f9@VqP?9ch+je_JD(y#kOCkE@63+iv~6<9ZK7iJt? zbrwaJT(h^W`1V|S&=xuCq?}vu3kdYs5F{gy?C*F zm4w6lOF}T`);2-U{t_6*zBazdz7lLJb%{um3A0j;jwcb9CZ|$xUVajjGW;$8R~aRe zkj=3{&Vday*>i|`qbyedX`Up2$B2+qaxM|ioT9a_6@EIw2Hido>H;0I8 z84>sjsazy0%f;eC$pukAa%V0Qjj#u-7Po{;E)wxE9zNSuT&cNe;=@%e;Gz&@<+!N0 zid7eZ+jgzEkd>p4R`=Nq>~#;yvJglmnD3L#_ujht$>0t&)Q4{x+`)$Wf3F+dA#leH?r=l> z-)jbUUqkJ@V{ly!^}tsR?*4}QlXnd60dQG^d$6G%${1WXxPLdeBMtTNiw0+JsQ>)~ zgX;m;lt{>cCgL|l<{&>aU1{!L&+u)9Y z`+I|PHq;{}#`W1cwmN=m{m$_GAe!m)TxAbzBhI1$86l$9Wr!3kI-Cur=(s*s>! zgpXcZX^AhaHTL1I$xC2FoB$MZ0>;Y;SS2I85v{Q|tTpz+5_wfXYfO_YyaXX2Cji5Y zfcIff9BB4LFw35Zr`gl5weXrHJY5|l%?x8GV!{_ytYozjlodP9_~AML&>*~G;5_ugFl zXUY1VY1@-)|3Gn%h%+*hOkVcXX4raCwU}O;R8XIad3N)KLbbR;oz2fM!6)H$?rDO@ z4`71G+Gz9Hc!W>LG~a(kA_sGv`F?%vpR`H--Mvjx%i`)OGx+`mx^F&GD=yKSJ{G7p zUsgczY-xZj7pvt;fzH`a7Uq|^r=@{4OAygLH==Cja%qy_-lOb}zdAyr?57V19h>8N zoEuy0@paL><}0$jcW!N%N4U5f%Dr2CvZLh8_aZpclAAw}9VZcut^HWEUeAaHtGavq zquoEF&*j}evMRzyyPIR86;bG>U$j{_++xAT+x$6wq76!Et8dch`Q1Nd{`$As{|luj z*;5>RO6)oQfb7Wkcl^HGU$AYSuJ=LD#`JX>G4{F@cmT&m7WA2xYlpgzs3zk*V6XLA7RHSMp8x^mjGpGi;waO-=EHcgR@ z4ycWUJaCM+RJHCS%6UcTv2`Q9cYd(>s3;FI_3b+xM5beKt&CN6-ZuNBh}gKWxV|?BA1& zt=#JFOR_aOUs$*H(w)=xYO~MS)M+fTxU&&!nNfgVu9)P`Ccy>jlPCALebXC{$^%RW zm#McEVPs#kmCtqPqfW7gG7)IHnoa`+P6abf~G}; z7~Y2uzJnP!ZfXH%A0Vb#nSS2f zhgoP81O%3HgP0flz>B?s02R6GvY9Ggt! z?w9NGzzgCHUMYRFd%aU2=eH!e``WtovE){m5hs&0I<~yQm}9){lXCa=&E%I;$VA&gqs-HmT2-&1yXHXlyXq>+=--$LTZ zxx4v_?4&OHi*mP?2wU8y$(sH@kh^LAy}MpQni%20!?FW?T$df?otI095RkEP;<0Y| z6IRfRf?k9R^|ftf^uufGdpX(h(z@lvGTN*?&n{LUenal%#P!3er8~E7me8E)qb%k@ zwWbz#UQH^)J1?geZ{3{S=o=RhohY4?N4oQN%<>h)A}Oc+CE0ElrrGLZc-{52!DM0M zsNa6QNAVbFD-#7CeyG3?J`@SRzGdaniIGt28}~ypM^) zZPS!;X%VBZnoWm^hx0yMVcZe_Fpfru;B9UYaXsF$#&fwjd?&$Q#Nps+b#@8~OCe(LWk};Yho;o1(XzZk=J`AE zN|hk9QzKo-dC)iAE2LH-7m7r|%U*oLbEQ;Ni_ZYq=E-tX5rKRKS-N6j6n&(L+jy}M zNACOrO%)M0>LZ`5HR6qWhY3!V zq1C@n>&I-oq2Kt@fH?^IM{ie93J*GoS(z4iR67S{^cx(A;G?e+b2L;1)1b#- sR4*MIU3q%0f5p5fOu9{Z)10XKb`8+avL=0R7GjYwAz<>b*1`HT5V8DO@0|pEj OFkrxd0RsjMybla0Pyhh{ diff --git a/lispusers/proofreader/PROOFREADER.TEDIT b/lispusers/proofreader/PROOFREADER.TEDIT new file mode 100644 index 0000000000000000000000000000000000000000..83120495b7f6f79a379c1620875f639362585cae GIT binary patch literal 9531 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 literal 0 HcmV?d00001 From 1e07e0e6f8ad7c10c18c3e4c94ca13c9ad18bb07 Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Tue, 22 Jul 2025 12:38:33 -0700 Subject: [PATCH 4/5] Fix the tedit file --- .../proofreader/PROOFREADER-PROOFREADER.TEDIT | Bin 9531 -> 9531 bytes lispusers/proofreader/PROOFREADER.TEDIT | Bin 9531 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lispusers/proofreader/PROOFREADER.TEDIT diff --git a/lispusers/proofreader/PROOFREADER-PROOFREADER.TEDIT b/lispusers/proofreader/PROOFREADER-PROOFREADER.TEDIT index 0f8afab75bc42841a8119ee36fd761987c66896e..83120495b7f6f79a379c1620875f639362585cae 100644 GIT binary patch literal 9531 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 literal 9531 zcmeIufdBvi0K=g9Qy=7oP+`D;0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj LFkrxdfxCeLB|88C diff --git a/lispusers/proofreader/PROOFREADER.TEDIT b/lispusers/proofreader/PROOFREADER.TEDIT deleted file mode 100644 index 83120495b7f6f79a379c1620875f639362585cae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9531 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 From 16b3934bfdaf6f0e60900d991c2a66d4343b78ac Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Tue, 22 Jul 2025 12:43:12 -0700 Subject: [PATCH 5/5] PROOFREADER loads renamed SPELLINGARRAY --- lispusers/proofreader/PROOFREADER | 21 ++++++++++++--------- lispusers/proofreader/PROOFREADER.LCOM | Bin 10060 -> 10273 bytes 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/lispusers/proofreader/PROOFREADER b/lispusers/proofreader/PROOFREADER index 97eec8627..1f108f34c 100644 --- a/lispusers/proofreader/PROOFREADER +++ b/lispusers/proofreader/PROOFREADER @@ -1,18 +1,21 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "21-Jul-2025 23:13:43" {WMEDLEY}proofreader>PROOFREADER.;4 29631 +(FILECREATED "22-Jul-2025 12:42:38"  +{DSK}kaplan>Local>medley3.5>working-medley>lispusers>proofreader>PROOFREADER.;5 29801 :EDIT-BY rmk :CHANGES-TO (VARS PROOFREADERCOMS) + (FNS Proofreader.Open Proofreader.NextWord) - :PREVIOUS-DATE "13-Oct-87 12:01:34" {WMEDLEY}proofreader>PROOFREADER.;3) + :PREVIOUS-DATE "21-Jul-2025 23:13:43" +{DSK}kaplan>Local>medley3.5>working-medley>lispusers>proofreader>PROOFREADER.;4) (PRETTYCOMPRINT PROOFREADERCOMS) (RPAQQ PROOFREADERCOMS - [(FILES PROOFREADER-ANALYZER SPELLINGARRAY) + [(FILES PROOFREADER-ANALYZER PROOFREADER-SPELLINGARRAY) (FNS Proofreader.New Proofreader.Open Proofreader.AddEntry Proofreader.Lookup Proofreader.AllForms) (FNS Proofreader.CharTable Proofreader.LookupBit Proofreader.SetBit) @@ -23,7 +26,7 @@ opened.) (P (Analyzer.Establish (SETQ Proofreader (Proofreader.New 'Proofreader]) -(FILESLOAD PROOFREADER-ANALYZER SPELLINGARRAY) +(FILESLOAD PROOFREADER-ANALYZER PROOFREADER-SPELLINGARRAY) (DEFINEQ (Proofreader.New @@ -566,9 +569,9 @@ [Analyzer.Establish (SETQ Proofreader (Proofreader.New 'Proofreader] (DECLARE%: DONTCOPY - (FILEMAP (NIL (1089 11824 (Proofreader.New 1099 . 1541) (Proofreader.Open 1543 . 3841) ( -Proofreader.AddEntry 3843 . 7245) (Proofreader.Lookup 7247 . 10457) (Proofreader.AllForms 10459 . -11822)) (11825 17652 (Proofreader.CharTable 11835 . 15172) (Proofreader.LookupBit 15174 . 16124) ( -Proofreader.SetBit 16126 . 17650)) (17653 28546 (Proofreader.Correct 17663 . 24229) ( -Proofreader.NextWord 24231 . 28544))))) + (FILEMAP (NIL (1259 11994 (Proofreader.New 1269 . 1711) (Proofreader.Open 1713 . 4011) ( +Proofreader.AddEntry 4013 . 7415) (Proofreader.Lookup 7417 . 10627) (Proofreader.AllForms 10629 . +11992)) (11995 17822 (Proofreader.CharTable 12005 . 15342) (Proofreader.LookupBit 15344 . 16294) ( +Proofreader.SetBit 16296 . 17820)) (17823 28716 (Proofreader.Correct 17833 . 24399) ( +Proofreader.NextWord 24401 . 28714))))) STOP diff --git a/lispusers/proofreader/PROOFREADER.LCOM b/lispusers/proofreader/PROOFREADER.LCOM index 846e22c1e7517fab768333cfe98b94f45fb20452..a7909e4df63143790d3591526b845791c10db128 100644 GIT binary patch delta 513 zcmbV}K}y3w7=>v!LU8R)_?=Q{775KH!Df(vngm-z6Vg`eGB%@zCYdmaSP}6GLQmio z>;b%hx9}oH1e<~z-9Gr=_ul*8hcEu~bc&_HZ6e_=)N=%5)(^EjaqunZ6g z57y}P@nBL=UYPSRPr}S}*(^-Vltu}?S7qJ2V|*TG*V4CQF5eohCtU;q;TocA5WG(` z1HmPyKMcCadC?}2vGS&}fVg5h6W4|MsVvI~qOhzo{pP6~NEA9w-?fhe`*3VqfbdC; zye{|8GCMk8qt{h{*j9fm9bJIH(>W~Ds%OU;j=<-PU2z&ll*?XDvkhTL7v(wQkqE>O z?6bZ%8A(*!gubD!S80x}k%5t^f|0S6k)f5Tg_44XQgVK7L1s>Bib8&#f|5dYxUZ{= zk85PD&BP7L^(LAMTuO!(2#tmYAdQAVjU^y`IqE42nLurBp*}te$m;a;^pq4*5=(%_ zV$pA8sieuJ;pXY%>Kx?i7~<-ppk##VIzwYC6JsTAROg79C>U9q85=5Cxw?3U=sHCz z6y;_sa816=^q-b>jE?oXsNNTe{zYgg}H*Ek(Gg=m9dGE0vC$s7>zeC SV3Jkbd{WtqX|uc<6B7Vocuj@?