K$ VTBOOK014.AA VTBOOK014.A<BACKUP/LOG/BLOC=9216/GROUP=25/INTER [.A]*.*; VTBOOK014.A/SAV GOATHUNTER qweV1.5 _ALPHA::  _ALPHA$DKB100: V1.5 $$*[HUNTER.FILESERV.VTBOOK.A]BOOK.OBJ;1+,).K/ 4KI-) 0123KPWOJ56Od7$/6e86^9GHJ /BOOK0130-Nov-1993 18:1730-Nov-1993 18:17VAX Pascal V4.4-89PABOOKDBGLMF$LMF$LICENSE_TABLEQAuthor: Licence: QId: Alternate licence: QKeytable: QUnknown subtype ls|!+=JWaRECTYPUNKNOWN0FIRSTUNKNOWN2TEXT_5PTEXT_0PLASTONELONG TYPE_F_DESCUNKNOWN8 TYPE_E_FONT CONTINUE_MID CONTINUE_END SB_TBLHDRASCIZ_32SB_FONTSB_FDESCSB_5P16 UNKNOWN11SB_5P18 SB_FIGURESB_FIGURE_HOTSPOT SB_UNKNOWN15 SB_UNKNOWN16 UNKNOWN17 SB_LICENSE*** Record 1 incomplete: Q1stQ1stQlastSection DDesc = QSection DDesc = QSymbolQInterim DMQBoldADOBEQMediumQNormalQDECQHelveticaQTimesQNew Century SchoolbookQCourierQMediumQNormalQISO8859QFont Q = QsubpartQSection FDesc = QSection FDesc = QsubpartQp = , Qp = , QUnknown (Q), RFA = %xQ; offset = %xQFigure hotspot: ;thickness=Q;x,y=Q;l,w=Q;section=Q ( bytes)Qp = , QFigure found, size = Q; x,y = subpartQpartpart% % % @  QQsys$scratch:.logd@8м\lP P|(^ԭ PAS$HANDLERm( ­^ЭVЭQ^SV(acV(Vací^VV^lмVѭѭ:PPPPѭѭЭPllPVlVP^ԭ PAS$HANDLERm( ­^ЭVЭQ^SV(acV(Vací^VV^( ­^ЭVЭQ^SV(acV(Vací^VV^lм V^Rѭѭԏ:ԽPPPPWѭѭԏЭWllWVlVWWV1ѭѭ:PPPP\ѭѭЭ\ѭѭPP \PPXX\YYYR^^Z(;n(\hcYXXXZ^^\(Yjn(_cѭѭԏPP WPPZZXWYYY\^^[(Xln(WjcYP Y(Yk򞭆谏쟭ߏ SYS$TRNLNMPPPPVVP|t^ԭ PAS$HANDLERm( ­^ЭVЭQ^SV(acV(Vací^VV^}ЏP% Ȟt̟LIB$FORMAT_DATE_TIMEDBG_LOG_ENABLEѭѭݭPAS$WRITE_STRINGvtPAS$WRITE_STRING PAS$WRITELN2|^ԭ PAS$HANDLERm( ­^ЭVЭQ^SV(acV(Vací^VV^( ­^ЭVЭQ^SV(acV(Vací^VV^lм VllVԟ( ЭܭЭЭЭ}̟8PV( ЭܭЭЭЭ}ПPVVP^ԭ PAS$HANDLERm^PVݬSYS$GETPWW1ЬPР(XXYЏ؞ Џ䞩 ЏFЏĞ1ԟLЏ؞"Џ$䞩!$$ЏЏ Ğ  ԟЏ؞"Џ$䞩!$$Џ ЏĞ ԟTPPPV~ЏЏЏĞ~ЏĀЏԟNPZPP ZPPPPP8QZa(`aЏ؞Џ!!!ЏЏĞԟϤZ(Y1Y[k 1PPЏЏЏĞЏЏԟЏЏV1PPЏЏЏĞЏЏԟЏ Џ <PPPV14 4 P @Ы @Ы@x PRЏЏЏĞЏЏԟЏЏ  ϼQQ PQQQQQP BSPc(acDBG_LOG_ENABLEPAS$WRITE_STRINGk~vPAS$WRITE_ENUMERATED PAS$WRITELN2©ZIYթZ1ZDBG_LOG_ENABLEPAS$WRITE_STRINGZPAS$WRITE_INTEGER PAS$WRITELN2ۑhh~ЏvԞԭVTBOOK__BADRECTYP LIB$SIGNALЬP"(ЬP<"PPݨЬP<"~Џ'ԞԭVTBOOK__BADSIZE LIB$SIGNALШfШr ШF螭ԟJ ~PAS$NEW2 VV( `ШJPP~PAS$NEW2VV}`ЬP(ZЬPݬSYS$GETPWW1ЬPР(Xhh~ЏYԞԭVTBOOK__BADRECTYP LIB$SIGNALP PPЬV<"VPVЬV<"~PVTBOOK__BADLAST LIB$SIGNALVPYVYVZP Z [ Z' R( BK`YVЬVݬSYS$FINDPWWzЏWVTBOOK__LASTNOTLAST LIB$SIGNALWPdhdP`dh PAS$DISPOSE2dh\\PB_COLS\ PASTEBOARDSMG$END_PASTEBOARD_UPDATEPB_COLS\ PASTEBOARD PAS$HANDLER SYS$TRNLNMLIB$FORMAT_DATE_TIMEVTBOOKVTBOOK30-Nov-1993 18:16:54PAS$ENVIRONMENT_TIME DBG_LOG_ENABLEPAS$WRITE_STRING PAS$WRITELN2SYS$GETPAS$WRITE_ENUMERATEDPAS$WRITE_INTEGERVTBOOK__BADRECTYP LIB$SIGNALVTBOOK__BADSIZEPAS$NEW2VTBOOK__BADLASTSYS$FINDVTBOOK__LASTNOTLAST PAS$DISPOSE2 PB_COLS  PASTEBOARDSMG$END_PASTEBOARD_UPDATESMG$CHANGE_PBD_CHARACTERISTICSSMG$CHANGE_PBD_CHARACTERISTICS\ PASTEBOARDSMG$BEGIN_PASTEBOARD_UPDATE PASTEBOARDXSMG$UNPASTE_VIRTUAL_DISPLAYXSMG$DELETE_VIEWPORTdhdP`dh PAS$DISPOSE2dh мRм S PAS$NEW2R`SPSռPcмcP<^ԭ PAS$HANDLERmмRмPм \ P ~PAS$NEW2QQ}`PQQ \QQRR\ PQ\a(ba^ԭ PAS$HANDLERm^PQRqQ &&QIQ?QQPQQQQF QQQQ6Q9Q $QHQ+QQ"QQ;mQ(Q QQ7rQ 7Q2Q1pQ 5Q4/QEQ Q Q Q"QLkQ,QQQ )Q >QQQQQ0!QQG*Q QG9QQ_Q'hQ)=Q EQ QQQ Q|QQ (QQLeQ Q:'Q QQ8RQ HQ ;QV QHQLQrQQ QQQQYQUQ7Q2VQ'Q"QQ)Q Q]QhzQQQQ Q3QQ~QbQFQ*Q0QzQ9&Q2QQ Q )Q Q 3Q$Q0QQ Q Q!Q QQQQQQHQ ;QCQ Q7>Q0 Q.(Q QQ.>Q0 Q.)Q>Q0 Q.&QdQ"QQ%QQmuQ! Q GQ ;QQQQQyQHQaQ!QI5QyQQaQI!QQ/Q'QQQ Q uQeQQOQQ!Q&QQaSQ:Q8Q Q? Q8#Q. Q04Q67Q;#Q,Q/Q QqQQHQqQqQ QQ$qQGQ8Q/Q $QQQ$ QQQJ/Q,VQ1Q8#Q Q Q Q-Q gQ0QQc7QJ Q Added CTRL-D to spawn subprocess by calling spawn_subproc. 19-NOV-1993 Hunter Goatley V1.2K Fixed "buffer too large" problems reading some remote-via-DECnet books. 18-NOV-1993 Hunter Goatley V1.2 Added show_help calls.!17-NOV-1993 Darrell Burkhead V1.2L Move to the next section if the user attempts to page-down or down-arrowM past the end of the section. (The same applies to moving to the previous section.)217-NOV-1993 Hunter Goatley & Darrell Burkhead V1.2L Corrected reading in of books so that books produced with DOCUMENT V2.2+J are also displayed properly. Changed definition of br_first_record to include all the information.!11-NOV-1993 Darrell Burkhead V1.12 Modified menu_book to take a default filespec.!10-NOV-1993 Darrell Burkhead V1.1I Fixed the Go-Back key ([Return]); it wouldn't go back after moving toN the previous/next topic with the left/right arrow keys. Also, implementedA a go-back list (instead of just recording the last position). 9-NOV-1993 B. Wortman V1.1L Implement /DEBUG as a qualifier - don't open or write to log file unless requested. 5-NOV-1993 C. Snyder V1.1> Change error code for book_badlast to match message format 5-NOV-1993 C. SNYDER V1.15 Modify keypad entries to add VT generic terminals! 5-NOV-1993 Darrell Burkhead V1.1H Replaced defnam references with book_defnam, which is now defined in VTBOOK.PAS.! 4-NOV-1993 Darrell Burkhead V1.1 Improved error checking.19-DEC-1991 Chris1 Correct bug in handling of multi-record parts%[change_entry]%...-*)TYPE $UBYTE = [BYTE] 0..255; $UQUAD = [QUAD,UNSAFE] RECORD L0,L1:UNSIGNED; END;! $BOOL = [BIT(1),UNSAFE] BOOLEAN;CONST debug = TRUE; verbose = FALSE; max_index = 10;& charwidth = 4; (*35 units at 140*) charheight = 72; doublehighwidemin = 200; m_hw = smg$m_user1; m_sy = smg$m_user2;TYPE. recbuff = PACKED ARRAY [1..32768] OF CHAR; prec = ^recbuff; pun = [UNSAFE]^UNSIGNED; puw = [UNSAFE]^$uword; pub = [UNSAFE]^$ubyte;' rfa_array = ARRAY [1..3] of $UWORD; br_ptr = RECORD! rfa: ARRAY [1..3] OF $uword; siz: INTEGER; END; br_sectptr = RECORD! rfa: ARRAY [1..3] OF $uword;# offset, vpos, partno: INTEGER; END;I rectyp = (unknown0, first, unknown2, text_5p, text_0p, last, onelong,F type_f_desc, unknown8, type_e_font, continue_mid, continue_end,B sb_tblhdr, asciz_32, sb_font, sb_fdesc, sb_5p16, unknown11,I sb_5p18, sb_figure, sb_figure_hotspot, sb_unknown15, sb_unknown16, unknown17, sb_license); wrectyp = [WORD] rectyp; br_record = RECORD rtype: wrectyp; len: INTEGER; END; p_br_record = ^br_record; ascic = RECORD len: $ubyte;( txt: PACKED ARRAY [1..255] OF CHAR; END; br_txt_rec = RECORD subsectyp, len: $ubyte; hor, ver: $uword; fontno, x, y: $ubyte; txt: ascic; END; pbr_txt_rec = ^br_txt_rec; br_key_head = RECORD subtype: wrectyp; sublen: INTEGER; CASE (*subtype*) rectyp OF sb_tblhdr: ( (*first; table header*)3 unknown0: INTEGER; (* total record size *): keyid: $ubyte; (* 5=contents, x0a=index, 0=other *)8 count: INTEGER; (*some sort of count of entries*)$ part: INTEGER; (*partnumber*) title_b_len: $ubyte;3 title_asciz: PACKED ARRAY [1..255] OF CHAR); sb_5p16: ( (*5p,0p; text*)* unknownw: ARRAY [1..7] OF $uword; txt16: br_txt_rec); sb_5p18: ( (*5p,0p; text*)* ictrl0: ARRAY [2..10] OF INTEGER; txt18: br_txt_rec); sb_figure: ( (*5p,0p; figure*). unknown_long: ARRAY [1..9] OF UNSIGNED;+ unknown_w4b: ARRAY [1..2] OF $uword; x, y: $uword;1 pixels: PACKED ARRAY [1..65536] OF $bool); sb_figure_hotspot:! ( (*5p,0p; figure hotspot*)% unknown1, unknown2: INTEGER;: thickness, horpos, verpos, len, wid, sect: INTEGER; unknown3: INTEGER);' sb_unknown16: ( (*5p,0p; unknown*) ); sb_license: ( (*first*)5 alt_license: PACKED ARRAY [1..255] OF CHAR); END; pbr_key_head = ^br_key_head;* br_a32 = PACKED ARRAY [1..32] OF CHAR; pbr_a32 = ^br_a32; br_part_ptr = RECORD subtype: wrectyp; len: INTEGER;( partno: ARRAY [0..255] OF UNSIGNED; END; br_fdesc = RECORDU&O$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Qu"  subtype: wrectyp; len: INTEGER;( txt: PACKED ARRAY [1..255] OF CHAR; END; pbr_fdesc = ^br_fdesc; br_font = RECORD subtype: wrectyp; len: INTEGER; fontno: $uword;( txt: PACKED ARRAY [1..255] OF CHAR; END; pbr_font = ^br_font; br_first_record = RECORD rtype: wrectyp; len: INTEGER;: major_version: $uword; (* ODS major version number *)/ minor_version: $uword; (* ODS eco level *)0 author_asciz: PACKED ARRAY [1..24] OF CHAR;1 product_asciz: PACKED ARRAY [1..36] OF CHAR;/ partcount: INTEGER; (* Number of parts *)4 sectioncount: INTEGER; (* Number of subparts *)0 unknown2, (* Number of directories (?) *)& unknown3, (* Number of fonts *). unknown4: INTEGER; (* Highest font id *)? lastptr: rfa_array; (* RFA of part index record (last) *)9 lastsiz: $uword; (* Size of part index record(s) *)8 docverspage, (* page id of the book header ext. *)/ index_page, (* page id of chunk index *). unknown8, (* page id of chunk titles *). unknown9, (* page id of symbol table *)3 font_page, (* page id of font definitions *)3 unknownb, (* id of page to open with book *)4 unknownc: INTEGER; (* id of copyright chunk *) title_b_len: $ubyte;0 title_asciz: PACKED ARRAY [1..128] OF CHAR; credate: $uquad;8 id_asciz: PACKED ARRAY [1..33] OF CHAR; (*vms_map*) (*Key headers follow here*)K (*This takes us up to 'len' - rest is zero apart from long x0000* at end*) END; br_last_record = RECORD rtype: wrectyp;) len: INTEGER; (*x1fa - no idea why*)& part: ARRAY [0..10000] OF br_ptr; END;2 part(n: INTEGER) = ARRAY [0..n - 2] OF br_ptr;2 sect(n: INTEGER) = ARRAY [0..n] OF br_sectptr; fontdata = RECORD charsize: INTEGER; render: UNSIGNED; END; hotspot = RECORD pnxt, pprv: ^hotspot;' row, col, lines, chars, sect: INTEGER; END; keymenu(n: INTEGER) = RECORD# sect: ARRAY [1..n] OF INTEGER;1 name: ARRAY [1..n] OF VARYING [132] OF CHAR; END; pposmem = ^posmem; posmem = RECORD pnxt, pprv: pposmem; br_pos, vt_pos: INTEGER; END; itmlst = RECORD buflen : $UWORD; itmcod : $UWORD; bufadr : UNSIGNED; retlen : UNSIGNED; null : UNSIGNED; END;CONST: subpart_minlen = BYTE_OFFSET(br_key_head, sublen) + 4;VAR bookdbg: TEXT; parts: ^part; sects: ^sect; keys: ^keymenu;& fonts: ARRAY [0..100] OF fontdata;/ cury, maxfont, maxkey, longestkey: INTEGER; book: UNSIGNED;# old_pb_cols, book_len: INTEGER;# hotspots, curhotspot: ^hotspot;) sect_vpos, hotsect, cursect: INTEGER;* dodgy_file, return_sect_vpos: BOOLEAN;@ keypart, keykind, keycount: ARRAY [1..max_index] OF INTEGER;: keyname: ARRAY [1..max_index] OF VARYING [30] OF CHAR; nkeys: INTEGER VALUE 0;! title: VARYING [132] OF CHAR;1 hmem, vmem, oldhmem, curh: pposmem VALUE NIL;) leftmost, rightmost, lowest: INTEGER;+ prevpart, nextpart: INTEGER VALUE ZERO; broken_subpart: ^STRING; net_block_count: UNSIGNED;F xab_itmlst: itmlst VALUE [buflen: 4; itmcod: xab$_net_block_count; OTHERWISE ZERO];D rab: rab$type VALUE [rab$b_bid: rab$c_bid; rab$b_bln: rab$c_bln;C rab$b_mbc: 127; rab$v_rah: TRUE; rab$v_loc: TRUE; OTHERWISE ZERO];D fab: fab$type VALUE [fab$b_bid: fab$c_bid; fab$b_bln: fab$c_bln;! fab$b_rtv: - 1; OTHERWISE ZERO];G xab: xab$type VALUE [xab$b_cod: xab$c_fhc; xab$b_bln: xab$c_fhclen; OTHERWISE ZERO];J xabitm: xab$type VALUE [xab$b_cod: xab$c_itm; xab$b_bln: xab$c_itmlen;, xab$b_mode: xab$k_setmode; OTHERWISE ZERO]; )PROCEDURE init_rms_blk(VAR fab: fab$type; VAR rab: rab$type); BEGIN3 xab_itmlst.bufadr := IADDRESS(net_block_count);0 xabitm.xab$l_itmlst := IADDRESS(xab_itmlst);& xab.xab$l_nxt := IADDRESS(xabitm);# fab.fab$l_xab := IADDRESS(xab);# rab.rab$l_fab := IADDRESS(fab); END; FFUNCTION check_license(author: PACKED ARRAY [l1..u1: INTEGER] OF CHAR;9 product: PACKED ARRAY [l2..u2: INTEGER] OF CHAR;. maxlen: [TRUNCATE] INTEGER): BOOLEAN; VAR i, j: INTEGER; s: VARYING [80] OF CHAR; chk: BOOLEAN; BEGIN$ j := INDEX(product, CHR(0)) - 1;) IF (j < 0) THEN j := LENGTH(product);> IF PRESENT(maxlen) AND_THEN (j > maxlen) THEN j := maxlen; IF (j = 0) THEN BEGIN# IF verbose AND_THEN dbg_log_enable. THEN WRITELN(bookdbg, 'No licence required'); check_license := TRUE; END ELSE BEGIN i := INDEX(author, CHR(0)) - 1;% IF (i < 0) THEN i := LENGTH(author);B s := 'LMF$' + SUBSTR(author, 1, i) + '_' + SUBSTR(product, 1, j);2 chk := ODD($trnlnm(tabnam := 'LMF$LICENSE_TABLE', attr := lnm$m_case_blind, lognam := s));( IF verbose AND_THEN dbg_log_enable THEN IF chk THEN. WRITELN(bookdbg, 'Licence ', s, ' present.') ELSE. WRITELN(bookdbg, 'Licence ', s, ' absent.'); check_license := chk; END; END; BFUNCTION length_asciz(val: PACKED ARRAY [l2..u2: INTEGER] OF CHAR;- maxlen: [TRUNCATE] INTEGER): INTEGER; VAR i: INTEGER; BEGIN i := INDEX(val, CHR(0)) - 1;% IF (i < 0) THEN i := LENGTH(val);> IF PRESENT(maxlen) AND_THEN (i > maxlen) THEN i := maxlen; length_asciz := i; END; BFUNCTION write_asciz(name: PACKED ARRAY [l1..u1: INTEGER] OF CHAR;3 val: PACKED ARRAY [l2..u2: INTEGER] OF CHAR;, maxlen: [TRUNCATE] INTEGER): INTEGER; VAR i: INTEGER; BEGIN IF PRESENT(maxlen) THEN i := length_asciz(val, maxlen) ELSE i := length_asciz(val);K IF verbose AND_THEN dbg_log_enable THEN WRITELN(bookdbg, name, val: i); write_asciz := i; END; FPROCEDURE write_datetime(name: PACKED ARRAY [l1..u1: INTEGER] OF CHAR; val: $uquad); VAR s: VARYING [80] OF CHAR; BEGIN1 lib$format_date_time(date_string := %DESCR s, DATE := val);5 IF dbg_log_enable THEN WRITELN(bookdbg, name, s); END; JFUNCTION verify_first_and_last(VAR rab: rab$type; VAR index_page: INTEGER;$ VAR font_page: INTEGER): UNSIGNED; VAR p1: [UNSAFE]^br_first_record; pk: [UNSAFE]^br_key_head; pl: [UNSAFE]^br_last_record; i: INTEGER; sts: UNSIGNED; licensed: BOOLEAN VALUE FALSE; end_offset: UNSIGNED; BEGIN sts := $get(rab); IF ODD(sts) THEN BEGIN p1 := rab.rab$l_rbf; IF debug THEN BEGIN WITH p1^ DO BEGIN( write_asciz('Author: ', author_asciz);* write_asciz('Licence: ', product_asciz);9 licensed := check_license(author_asciz, product_asciz);. i := length_asciz(title_asciz, title_b_len);% title := SUBSTR(title_asciz, 1, i);$ IF verbose AND_THEN dbg_log_enable* THEN WRITELN(bookdbg, 'Title: ', title);$ IF verbose AND_THEN dbg_log_enable) THEN write_datetime('Date: ', credate); write_asciz('Id: ', id_asciz); END;* i := p1^.len - SIZE(br_first_record);/ pk := p1::INTEGER + SIZE(br_first_record);9 WHILE (pk^.sublen > 0) AND_THEN (i >= pk^.sublen) DO BEGIN WITH pk^ DO CASE subtype OF sb_license: BEGIN6 write_asciz('Alternate licence: ', alt_license,, sublen - SIZE(sublen) - SIZE(subtype)); IF NOT licensed THEN/ licensed := check_license(p1^.author_asciz, alt_license, sublen -' SIZE(sublen) - SIZE(subtype)); END; sb_tblhdr: BEGIN nkeys := nkeys + 1; keykind[nkeys] := keyid; keycount[nkeys] := count; keypart[nkeys] := part;/ keyname[nkeys] := SUBSTR(title_asciz, 1,$ write_asciz('Keytable: ', title_asciz, title_b_len));. IF verbose AND_THEN dbg_log_enable THEN: WRITELN(bookdbg, ' Id, count, part: ', keyid: 1, ', ', count: 1, ', ', part: 1); END; OTHERWISE BEGIN IF dbg_log_enable; THEN WRITELN(bookdbg, 'Unknown subtype ', subtype: 1) END; END; i := i - pk^.sublen;! pk := pk::INTEGER + pk^.sublen; END;( IF (i <> 0) AND_THEN dbg_log_enable> THEN WRITELN(bookdbg, '*** Record 1 incomplete: ', i: 1); END; IF (p1^.rtype <> first) THENG lib$signal(vtbook__badrectyp, 2, %STDESCR '1st', %IMMED p1^.rtype)8 ELSE IF (rab.rab$w_rsz < SIZE(br_first_record)) OR_ELSE! (rab.rab$w_rsz < p1%:$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Qu5"^.len) THENI lib$signal(vtbook__badsize, 3, %STDESCR '1st', %IMMED rab.rab$w_rsz, p1^.len); index_page := p1^.index_page; font_page := p1^.font_page; NEW(parts, p1^.partcount); NEW(sects, p1^.sectioncount); rab.rab$w_rfa := p1^.lastptr; rab.rab$b_rac := rab$c_rfa; sts := $get(rab); IF ODD(sts) THEN BEGIN pl := rab.rab$l_rbf; IF (pl^.rtype <> last) THENE lib$signal(vtbook__badrectyp, 2, %STDESCR 'last', %IMMED pl^.rtype) ELSE BEGIN4 end_offset := (BYTE_OFFSET(br_last_record, part) + parts^.n * SIZE(br_ptr));" IF (end_offset <> rab.rab$w_rsz) THEN@ lib$signal(vtbook__badlast, 2, end_offset, rab.rab$w_rsz); END;< FOR i := 0 TO parts^.n - 2 DO parts^[i] := pl^.part[i]; rab.rab$b_rac := rab$c_seq; sts := $find(rab); IF (sts = rms$_eof) THEN sts := rms$_suc ELSE% lib$signal(vtbook__lastnotlast, 0); END; END;! verify_first_and_last := sts; END; PROCEDURE display_xl(pu: pun; i: INTEGER); BEGIN+ IF (i > 0) AND_THEN dbg_log_enable THEN BEGIN& WRITE(bookdbg, i: 1, 'p = ', pu^: 1); WHILE (i > 1) DO BEGIN i := i - 1; pu := pu::INTEGER + 4;" WRITE(bookdbg, ', ', pu^: 1); END; WRITELN(bookdbg); END; END; PROCEDURE display_xw(pu: puw; i: INTEGER); BEGIN+ IF (i > 0) AND_THEN dbg_log_enable THEN BEGIN& WRITE(bookdbg, i: 1, 'p = ', pu^: 1); WHILE (i > 1) DO BEGIN i := i - 1; pu := pu::INTEGER + 2;" WRITE(bookdbg, ', ', pu^: 1); END; WRITELN(bookdbg); END; END; PROCEDURE display_xb(pu: pub; i: INTEGER); BEGIN+ IF (i > 0) AND_THEN dbg_log_enable THEN BEGIN& WRITE(bookdbg, i: 1, 'p = ', pu^: 1); WHILE (i > 1) DO BEGIN i := i - 1; pu := pu::INTEGER + 1;" WRITE(bookdbg, ', ', pu^: 1); END; WRITELN(bookdbg); END; END; FUNCTION addmem(p, n: pposmem; b, v: INTEGER): pposmem; VAR x: pposmem; BEGIN NEW(x); WITH x^ DO BEGIN pnxt := n; pprv := p; br_pos := b; vt_pos := v; END;$ IF (n <> NIL) THEN n^.pprv := x;$ IF (p <> NIL) THEN p^.pnxt := x; addmem := x; END; PROCEDURE scrap(VAR p: pposmem); VAR p1: pposmem; BEGIN WHILE (p <> NIL) DO BEGIN p1 := p; p := p^.pnxt; DISPOSE(p1); END; END; PROCEDURE scraphotspots; BEGINR WHILE (hotspots <> NIL) DO BEGIN curhotspot := hotspots; hotspots := hotspots^.pnxt; DISPOSE(curhotspot);t END;n curhotspot := NIL; END; UJFUNCTION findm(lo, hi: INTEGER; p: pposmem; bestguess: BOOLEAN ): pposmem; BEGIN ; WHILE (p<>NIL) AND_THEN (p^.br_pos>hi) DO p := p^.pnxt;OA IF bestguess OR_ELSE ((p<>NIL) AND_THEN (p^.br_pos>=lo)) THEN- findm := p- ELSE findm := NIL; END; -"FUNCTION vtv(b: INTEGER): INTEGER; VAR v: INTEGER; p: pposmem; BEGINl IF (vmem <> NIL) THENV IF (vmem^.br_pos = b) THEN vtv := 0  ELSEg BEGIN p := vmem;tE WHILE (p^.br_pos > b) AND_THEN (p^.pnxt <> NIL) DO p := p^.pnxt;h IF (p^.br_pos = b) THEN v := p^.vt_pos ELSE  BEGINs7 v := p^.vt_pos - ROUND((p^.br_pos - b) / charheight);  IF (v < 1) THEN v := 1;. IF (p^.br_pos > b) THEN  addmem(p, p^.pnxt, b, v) ELSE IF (p^.pprv = NIL) THEN" vmem := addmem(NIL, p, b, v) ELSE addmem(p^.pprv, p, b, v);c END;% vtv := v - smg$cursor_row(book);e END ELSE BEGIN% v := ROUND((b - cury) / charheight); 7 vmem := addmem(NIL, NIL, b, v + smg$cursor_row(book));o vtv := v; END;  END; fFUNCTION vth(b, vdisp: INTEGER;u scale: REAL): INTEGER; VAR h: INTEGER; p, p1: pposmem VALUE NIL; BEGIN 2 IF (hmem <> NIL) OR_ELSE (oldhmem <> NIL) THEN BEGIN p := hmem;d IF (p <> NIL) THENnE WHILE (p^.br_pos > b) AND_THEN (p^.pnxt <> NIL) DO p := p^.pnxt;nG IF ((p = NIL) OR_ELSE (p^.br_pos <> b)) AND_THEN (oldhmem <> NIL) THENl BEGIN p1 := oldhmem;V9 WHILE (p1^.br_pos > b) AND_THEN (p1^.pnxt <> NIL) DOa p1 := p1^.pnxt;  IF (p1^.br_pos = b) THEN  BEGIN 7 IF (p1^.pnxt <> NIL) THEN p1^.pnxt^.pprv := p1^.pprv;5 IF (p1^.pprv = NIL) THEN oldhmem := p1^.pnxte ELSE! p1^.pprv^.pnxt := p1^.pnxt;e IF (hmem = NIL) THEN BEGINa hmem := p1; p1^.pnxt := NIL; p1^.pprv := NIL; END  ELSE IF (p^.br_pos > b) THEN BEGIN p1^.pnxt := NIL; p1^.pprv := p; p^.pnxt := p1; END, ELSE BEGIN p1^.pnxt := p; p1^.pprv := p^.pprv; p^.pprv := p1; IF (p1^.pprv = NIL) THEN hmem := p1a ELSE p1^.pprv^.pnxt := p1; END; p := p1; END; END;  END;i IF (p <> NIL) THEN IF (p^.br_pos = b) THEN$ vth := p^.vt_pos - curh^.vt_pos ELSEK BEGIN IF (vdisp = 0) THEN7 h := curh^.vt_pos + ROUND((b - curh^.br_pos) * scale)U ELSEr2 h := p^.vt_pos + ROUND((b - p^.br_pos) * scale); IF (h < 1) THEN h := 1; IF (p^.br_pos > b) THEN addmem(p, p^.pnxt, b, h)! ELSE IF (p^.pprv = NIL) THENp hmem := addmem(NIL, p, b, h) ELSEu addmem(p^.pprv, p, b, h);r vth := h - curh^.vt_pos;t END ELSE BEGIN h := ROUND(b * scale);s hmem := addmem(NIL, NIL, b, h); vth := h - curh^.vt_pos;i END;, END; 1PROCEDURE display_ascii(pt: [UNSAFE] pbr_txt_rec;p i: INTEGER; xonly: BOOLEAN := FALSE); TYPE% str = PACKED ARRAY [1..255] OF CHAR;  VARn pb: pub;n pl: pun;  pa: [UNSAFE]^ascic; j, k, r, c: INTEGER; s: VARYING [255] OF CHAR; scale: REAL;N hw: BOOLEAN;& was_hw: [STATIC] BOOLEAN VALUE FALSE; BEGINC WHILE (i > 0) DO BEGIN WITH pt^ DO CASE subsectyp OF 1: BEGINt- IF verbose AND_THEN dbg_log_enable THEN / WRITELN(bookdbg, 'SOH: Fill x,y = ', hor: 1,. ',', ver: 1, ', dx,dy = ', fontno: 1, ',', y: 1); i := i - pt^.len;" pt := pt::INTEGER + pt^.len; END; 2, 3: BEGINe( IF verbose AND dbg_log_enable THEN8 WRITELN(bookdbg, 'ETX (', len: 1, ') H,V = ', hor: 1,0 ',', ver:1, ', font = ', fontno: 1, ' ?,?=', x: 1, ',', y: 1);  IF NOT xonly THENo BEGIN k := vtv(ver); / scale := charwidth / fonts[fontno].charsize;l1 hw := (UAND(fonts[fontno].render, m_hw) <> 0);2 IF hw THEN " j := vth(hor, k, 2 * scale) ELSEu j := vth(hor, k, scale); cury := ver;t r := smg$cursor_row(book);p c := smg$cursor_column(book);. IF was_hw AND_THEN (k > 1) THEN k := k + 1; curh^.vt_pos := c + j;u1 IF hw THEN curh^.vt_pos := curh^.vt_pos DIV 2;, IF (r + k > lowest) THEN lowest := r + k;# IF (r + k + 10 >= book_len) THENE BEGIN book_len := r + k + 100;s2 smg$change_virtual_display(book, book_len);& smg$set_cursor_abs(book, r, c); END;s IF hw THEN k := k - 1;E IF return_sect_vpos THEN; BEGIN# sects^[cursect].vpos := r+k;c! return_sect_vpos := FALSE; END; ) smg$set_cursor_rel(display_id := book,  delta_row := k,a delta_column := j);A0 IF (c + j < leftmost) THEN leftmost := c + j; curh^.br_pos := hor;  pa := IADDRESS(txt);l$ j := len - BYTE_OFFSET(pt^, txt); s := '';E WHILE (j > 0) DOe BEGIN, s := s + SUBSTR(pa^.txt, 1, pa^.len);5 curh^.br_pos := curh^.br_pos + ROUND(pa^.len /b scale);) IF verbose AND_THEN dbg_log_enabler- THEN WRITE(bookdbg, pa^.txt: pa^.len);; j := j - 1 - pa^.len - 1;' pb := pa::INTEGER + 1 + pa^.len; IF (j >= 0) THENR BEGIN ' curh^.br_pos := curh^.br_pos + pb^; & IF verbose AND_THEN dbg_log_enable* THEN WRITE(bookdbg, '<', pb^: 1, '>'); s := s + PAD('', ' ',o( ROUND(pb^ * charwidth / 140)); END; pa := pb::INTEGER + 1;H END;r WITH fonts[fontno] DO IF hw THENs% IF (UAND(render, m_sy) <> 0) THENa3 smg$put_chars_highwide(book, s, , , render, ,o smg$c_spec_graphics) ELSE3 smg$put_chars_highwide(book, s, , , render)_- ELSE IF (UAND(render, m_sy) <> 0) THEN * smg$put_chars(book, s, , , , render, , smg$c_spec_graphics)( ELSEt) smg$put_chars(book, s, , , , ren2i$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Qu"-der);(, curh^.vt_pos := curh^.vt_pos + LENGTH(s); IF hw THENk BEGIN- IF (curh^.vt_pos * 2 > rightmost) THEN " rightmost := 2 * curh^.vt_pos; END* ELSE IF (curh^.vt_pos > rightmost) THEN! rightmost := curh^.vt_pos;(* IF verbose AND_THEN dbg_log_enable THEN WRITELN(bookdbg); END;A i := i - pt^.len; " pt := pt::INTEGER + pt^.len; END; OTHERWISE;( IF verbose AND_THEN dbg_log_enable, THEN WRITELN(bookdbg, 'Asciz ', i: 1);) j := length_asciz(pt^::str, i) + 1;  IF xonly THENC BEGIN8 keys^.name[maxkey + 1] := SUBSTR(pt^::str, 1, j - 1);1 IF (j >= longestkey) THEN longestkey := j + 1; END; ( IF verbose AND_THEN dbg_log_enable- THEN WRITELN(bookdbg, pt^::str: j - 1); IF (j < i) THEN BEGIN pl := pt::INTEGER + j;e IF verbose THEN BEGIN9 IF dbg_log_enable THEN WRITE(bookdbg, 'Section ');s% display_xl(pl, (i - j) DIV 4);I END;R4 IF xonly THEN keys^.sect[maxkey + 1] := INT(pl^); END ELSE IF xonly THEN keys^.sect[maxkey + 1] := 0;s) IF xonly THEN maxkey := maxkey + 1;: i := 0;b END; END;I END; 0PROCEDURE process_subpart_5p16(pk: pbr_key_head;# xonly: BOOLEAN := FALSE); BEGIN: IF verbose THEN display_xw(IADDRESS(pk^.unknownw), 7);" IF NOT xonly THEN scrap(vmem);L display_ascii(IADDRESS(pk^.txt16), pk^.sublen - BYTE_OFFSET(pk^, txt16), xonly);^ IF NOT xonly THENu BEGIN scrap(oldhmem); oldhmem := hmem; hmem := NIL;, END;, END; T1PROCEDURE process_subpart_5p18(pk: pbr_key_head);_ BEGINR8 IF verbose THEN display_xl(IADDRESS(pk^.ictrl0), 9); scrap(vmem); return_sect_vpos := TRUE;u cursect := pk^.ictrl0[3];e) sects^[cursect].rfa := rab.rab$w_rfa;eC sects^[cursect].offset := pk::INTEGER - rab.rab$l_rbf::INTEGER;CM display_ascii(IADDRESS(pk^.txt18), pk^.sublen - BYTE_OFFSET(pk^, txt18));m! cury := cury - pk^.ictrl0[8];E scrap(oldhmem);  oldhmem := hmem; hmem := NIL; END; NQPROCEDURE process_subpart_fig_hotspot(pk: pbr_key_head; xonly: BOOLEAN := FALSE);; VAR_ h, v: pposmem;L hs, hs1: ^hotspot;: s: VARYING [255] OF CHAR; i: INTEGER; BEGIN: IF NOT xonly THENb WITH pk^ DO BEGIN3 h := findm(horpos, horpos+len, oldhmem, TRUE);o1 v := findm(verpos, verpos+wid, vmem, FALSE); $ IF verbose OR_ELSE (v=NIL) THEN IF dbg_log_enable@ THEN WRITELN(bookdbg, 'Figure hotspot: ', unknown1: 1, ',',5 unknown2: 1, ';thickness=', thickness: 1, ';x,y=', 3 horpos: 1, ',', verpos: 1, ';l,w=', len: 1, ',',l8 wid: 1, ';section=', sect: 1, ';', unknown3: 1, ' (',6 pk^.sublen-4-BYTE_OFFSET(br_key_head, unknown3): 1, ' bytes)'); IF (v<>NIL) THENI BEGINa NEW(hs); WITH hs^ DO( BEGINn pnxt := NIL; pprv := NIL;B row := v^.vt_pos - ROUND((v^.br_pos-verpos-wid)/charheight); IF (row<=0) THEN row := 1$ ELSE IF (row>lowest) THEN; row := lowest;e% lines := ROUND(wid/charheight);: IF (lines=0) THEN lines := 1K' ELSE IF (row+lines>lowest+1) THEN  lines := lowest+1-row;E IF (h=NIL) THEN col := 1 + ROUND(horpos/36) ELSE3 col := h^.vt_pos - ROUND((h^.br_pos-horpos)/36);t IF (col=rightmost) THENA col := rightmost - 1; chars := ROUND(len/36);T# IF (chars=0) THEN chars := 1;d IF (lines=1) THENT BEGIN smg$read_from_display ( display_id := book,$ resultant_string := %descr s, start_row := row);i i := LENGTH(s);1 WHILE (i>0) AND_THEN (s[i]=' ') DO i := i - 1;  IF (i>0) THEN BEGIN s.length := i;n2 IF (h=NIL) OR_ELSE (h^.br_pos<>horpos) THEN BEGIN - IF (col>LENGTH(s)) THEN col := LENGTH(s);l3 WHILE (col<=LENGTH(s)) AND_THEN (s[col]=' ') DO' col := col + 1;)- WHILE (col>1) AND_THEN (s[col-1]<>' ') DO  col := col - 1;c END;, s := SUBSTR(s, col, LENGTH(s)+1-col);; WHILE (chars<=LENGTH(s)) AND_THEN (s[chars]<>' ') DOa chars := chars + 1;:, IF (chars>1) THEN chars := chars - 1; END;I END( ELSE IF (col+chars>rightmost) THEN chars := rightmost - col; sect := pk^.sect;m END; IF (hotspots=NIL) THEN BEGIN hotspots := hs;N curhotspot := hs; ENDu ELSE BEGIN hs1 := curhotspot;5 WHILE (hs1<>NIL) AND_THEN (hs1^.row>hs^.row) DON hs1 := hs1^.pprv; IF (hs1<>NIL) THEN8 WHILE (hs1<>NIL) AND_THEN (hs1^.row=hs^.row) AND_THEN+ (hs1^.col>hs^.col) DO hs1 := hs1^.pprv;v IF (hs1=NIL) THEND BEGIN hs^.pnxt := hotspots; hotspots^.pprv := hs; hotspots := hs; END ELSE BEGIN hs^.pnxt := hs1^.pnxt;  hs^.pprv := hs1;R hs1^.pnxt := hs;$ IF (hs^.pnxt=NIL) THENY curhotspot := hs  ELSE  hs^.pnxt^.pprv := hs; END;D END; smg$change_rendition ( display_id := book,b start_row := hs^.row, start_column := hs^.col," number_of_rows := hs^.lines,% number_of_columns := hs^.chars,:- rendition_complement := smg$m_reverse);c END; END;^ END; p"PROCEDURE process_subpart_unknown( pk: [UNSAFE] pbr_key_head;c7 s: PACKED ARRAY [l..u:INTEGER] OF CHAR := 'subpart' );  VAR i: INTEGER; pn: pun; BEGINs dodgy_file := TRUE;r WITH rab, pk^ DO IF dbg_log_enable THEN WRITELN(O2 bookdbg, 'Unknown ', s, subtype, ' (', sublen:1,@ '), RFA = %x', HEX(rab$w_rfa[1],4,4), ',', HEX(rab$w_rfa[2],4,2 4), ',', HEX(rab$w_rfa[3],4,4), '; offset = %x',# HEX(pk::UNSIGNED-rab$l_rbf,4,4));n% i := pk^.sublen - subpart_minlen; IF (i>120) THEN i := 120;o' pn := pk::INTEGER + subpart_minlen;  WHILE (i>=40) DO BEGIN display_xl(pn, 10); i := i - 40;t pn := pn::INTEGER + 40; END;_ IF (i>=4) THEN BEGIN display_xl(pn, i DIV 4); ! pn := pn::INTEGER + 4*(i DIV 4);p i := i MOD 4; END;r$ IF (i>0) THEN display_xb(pn, i); END; (>PROCEDURE process_subpart_figure( pk: [UNSAFE] pbr_key_head ); BEGIN dodgy_file := TRUE;B WITH pk^ DOe IF dbg_log_enable THEN:D WRITELN(bookdbg, 'Figure found, size = ', sublen:1, '; x,y = ', x:1, ',', y:1);. display_xl(IADDRESS(pk^.unknown_long), 9);K IF (pk^.unknown_w4b[1]<>16#4b) OR_ELSE (pk^.unknown_w4b[2]<>16#4b) THENE* display_xw(IADDRESS(pk^.unknown_w4b), 2); END; N4PROCEDURE extendpart(VAR pk, len: [UNSAFE] INTEGER); VAR i: INTEGER; BEGIN ; i := broken_subpart^.capacity - broken_subpart^.LENGTH;  IF (i>len) THEN i := len; A broken_subpart^ := broken_subpart^ + SUBSTR(pk::prec^, 1, i);  len := len - i; pk := pk + i;s END; l7PROCEDURE extendvarpart(VAR pk, len: [UNSAFE] INTEGER);, VAR, ps: ^STRING;u pk1: [UNSAFE] pbr_key_head; BEGIN extendpart(pk, len);* pk1 := IADDRESS(broken_subpart^.body);D IF (LENGTH(broken_subpart^) < pk1^.sublen) AND_THEN (len>0) THEN BEGIN ps := broken_subpart;" NEW(broken_subpart, pk1^.sublen); broken_subpart^ := ps^; DISPOSE(ps);L extendpart(pk, len);1 END;l END; ;PROCEDURE makepart( pk: [UNSAFE] prec; cap, len: INTEGER );a BEGINa NEW(broken_subpart, cap);M+ broken_subpart^ := SUBSTR(pk^, 1, len);E END; dAPROCEDURE makevarpart( pk: [UNSAFE] pbr_key_head; len: INTEGER );o BEGIN, IF (len NIL) THEN  BEGIN extendvarpart(pk, i);' pk1 := IADDRESS(broken_subpart^.body);s/ IF (pk1^.sublen<=LENGTH(broken_subpart^)) THENn BEGIN ps := broken_subpart; broken_subpart := NIL;b4 display_text_subparts(pk1, pk1^.sublen, xonly); DISPOSE(ps);b END;t END;d. WHILE (i > 0) AND_THEN (pk^.sublen > 0) DO BEGIN IF (i < pk^.sublen) THENl makevarpart(pk, i)b ELSE: CASE pk^.subtype OF+ sb_5p16: process_subpart_5p16(pk, xonly);$ sb_5p18: process_subpart_5p18(pk);( sb_figure: process_subpart_figure(pk);5 sb_figure_hotspot: process_subpart_fig_hotspot(pk);; OT L$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Qu">HERWISER" process_subpart_unknown(pk); END; i := i - pk^.sublen;( pk := pk::INTEGER + pk^.sublen; END;G END; g?PROCEDURE process_part_5p(p: pun; len: INTEGER; cont: BOOLEAN);i TYPEJ p5 = ARRAY [1..5] OF UNSIGNED; (*thispart,1,sectcount,prevpart,nextpart*) VARI pk: [UNSAFE]^p5;D BEGIN; IF NOT cont THEN BEGIN pk := p; # IF verbose THEN display_xl(pk, 5);( prevpart := INT(pk^[4]);e nextpart := INT(pk^[5]);d p := p::INTEGER + SIZE(p5); len := len - SIZE(p5);B END; " display_text_subparts(p, len); END; WLPROCEDURE process_part_index(pk: pbr_key_head; len: INTEGER; cont: BOOLEAN); BEGINR) display_text_subparts(pk, len, TRUE);E END; IBPROCEDURE build_section_map(pk: pun; len: INTEGER; cont: BOOLEAN); VAR1" nxtsct: [STATIC] INTEGER VALUE 0; i, l: INTEGER; pk1: pun; BEGINp IF NOT cont THEN nxtsct := 0& ELSE IF (broken_subpart<>NIL) THEN BEGIN extendpart(pk, len);N' pk1 := IADDRESS(broken_subpart^.body);( IF verbose AND_THEN dbg_log_enable THENF WRITELN(bookdbg, 'Section ', nxtsct: 1, ' is in part ', pk1^: 1); WITH sects^[nxtsct] DO= BEGIN rfa := ZERO; offset := 0;H partno := INT(pk1^);( END;H nxtsct := nxtsct + 1; END;:" l := nxtsct - 1 + (len DIV 4); FOR i := nxtsct TO l DO: BEGIN( IF verbose AND_THEN dbg_log_enable THEN? WRITELN(bookdbg, 'Section ', i: 1, ' is in part ', pk^: 1);; WITH sects^[i] DO BEGIN rfa := ZERO;L offset := 0;  partno := INT(pk^); END; pk := pk::INTEGER + 4;; END;O nxtsct := l + 1; i := len MOD 4; % IF (i>0) THEN makepart(pk, 4, i);h END; oBPROCEDURE process_part_fdesc(pk: [UNSAFE] pbr_fdesc; len: INTEGER; cont: BOOLEAN); VAR  j: [STATIC] INTEGER VALUE 1;O pk1: [UNSAFE] pbr_fdesc;p BEGINo IF NOT cont THEN j := 1E& ELSE IF (broken_subpart<>NIL) THEN BEGIN extendvarpart(pk, len);' pk1 := IADDRESS(broken_subpart^.body);I9 IF dbg_log_enable THEN WRITE(bookdbg, 'Section ', j: 1); j := j + 1;D write_asciz(' FDesc = ', pk1^.txt, pk1^.len - BYTE_OFFSET(br_fdesc, txt)); END;)> WHILE (len >= subpart_Minlen) AND_THEN (len >= pk^.len) DO BEGIN! IF (pk^.subtype = sb_fdesc) THENR BEGIN= IF dbg_log_enable THEN WRITE(bookdbg, 'Section ', j: 1);( j := j + 1;F write_asciz(' FDesc = ', pk^.txt, pk^.len - BYTE_OFFSET(br_fdesc, txt));m END ELSE G lib$signal(vtbook__badrectyp, 2, %STDESCR 'subpart', pk^.subtype);u len := len - pk^.len; pk := pk::INTEGER + pk^.len;( END;r END; PPROCEDURE process_part_font(pk: [UNSAFE] pbr_font; len: INTEGER; cont: BOOLEAN);(*> Font = -author-family-weight-r-normal--*-size-*-*-p-*-std-ver author = ADOBE H family = Helvetica/Courier/New Century Schoolbook/Symbol/Interim DM etc weight = Medium/Bold/* etcH r = I/O/R etc normal = Normal/* etc size = 120/140/180/240 etco p = P/M etc std = ISO8859/*/DEC etc ver = 1/* etc*) VARO5 sep: [STATIC] PACKED ARRAY [1..1] OF CHAR VALUE '-';l sts: UNSIGNED; G author, weight, r, normal, null, star1, ssize, star2, star3, p, star4,), std, xtra: VARYING [10] OF CHAR VALUE '';7 family, fontname, ver: VARYING [255] OF CHAR VALUE '';n bold, symbol, ok: BOOLEAN;F ps: ^STRING;L pk1: [UNSAFE] pbr_font; BEGINL1 IF cont AND_THEN (broken_subpart <> NIL) THENm BEGIN extendvarpart(pk, len); ps := broken_subpart; broken_subpart := NIL;v pk1 := ps; ( process_part_font(pk1, pk1^.len, cont); DISPOSE(ps);  END;n= WHILE (len > subpart_minlen) AND_THEN (len >= pk^.len) DO, BEGIN IF (pk^.subtype = sb_font) THEN BEGIN maxfont := maxfont + 1; fonts[maxfont].render := 0;9 fontname := SUBSTR(pk^.txt, 1, length_asciz(pk^.txt,  pk^.len -# BYTE_OFFSET(br_font, txt))); @ sts := str$element(%DESCR author, 1, sep, %DESCR fontname); IF ODD(sts) THEN= sts := str$element(%DESCR family, 2, sep, %DESCR fontname);N IF ODD(sts) THENa= sts := str$element(%DESCR weight, 3, sep, %DESCR fontname);a IF ODD(sts) THENH8 sts := str$element(%DESCR r, 4, sep, %DESCR fontname); IF ODD(sts) THENF= sts := str$element(%DESCR normal, 5, sep, %DESCR fontname);S IF ODD(sts) THENb; sts := str$element(%DESCR null, 6, sep, %DESCR fontname); IF ODD(sts) THENc< sts := str$element(%DESCR star1, 7, sep, %DESCR fontname); IF ODD(sts) THEN< sts := str$element(%DESCR ssize, 8, sep, %DESCR fontname); IF ODD(sts) THENL< sts := str$element(%DESCR star2, 9, sep, %DESCR fontname); IF ODD(sts) THEN= sts := str$element(%DESCR star3, 10, sep, %DESCR fontname);A IF ODD(sts) THENa9 sts := str$element(%DESCR p, 11, sep, %DESCR fontname);  IF ODD(sts) THENH= sts := str$element(%DESCR star4, 12, sep, %DESCR fontname);  IF ODD(sts) THEN ; sts := str$element(%DESCR std, 13, sep, %DESCR fontname);  IF ODD(sts) THEN1; sts := str$element(%DESCR ver, 14, sep, %DESCR fontname);; IF ODD(sts) THENn< sts := str$element(%DESCR xtra, 15, sep, %DESCR fontname);C symbol := (family = 'Symbol') OR_ELSE (family = 'Interim DM');b bold := (weight = 'Bold'); D READV(ssize, fonts[maxfont].charsize, xtra, error := CONTINUE);G ok := (sts = str$_noelem) AND_THEN (fontname[1] = sep[1]) AND_THEN2 (author = 'ADOBE') AND_THEN ((r = 'I') OR_ELSE (r = 'O') OR_ELSE] (r = 'R')) AND_THEN / (null = '') AND_THEN (star1 = '*') AND_THEN1 (STATUSV = 0) AND_THEN (star2 = '*') AND_THENrA (star3 = '*') AND_THEN ((p = 'M') OR_ELSE (p = 'P')) AND_THENmA (star4 = '*') AND_THEN (xtra = '') AND_THEN ((symbol AND_THENr8 ((weight = '*') AND_THEN (normal = '*') AND_THENA (std = '*') AND_THEN (ver = '*')) OR_ELSE ((bold OR_ELSE" (weight = 'Medium')) AND_THEN7 (normal = 'Normal') AND_THEN (std = 'DEC'))) OR_ELSEsA (((family = 'Helvetica') OR_ELSE (family = 'Times') OR_ELSEb. (family = 'New Century Schoolbook') OR_ELSE/ (family = 'Courier')) AND_THEN (bold OR_ELSE  (weight =s 'Medium')) AND_THEN ? (normal = 'Normal') AND_THEN (std = 'ISO8859') AND_THENe (ver = '1'))); WITH fonts[maxfont] DO  BEGINo1 IF bold THEN render := UOR(render, smg$m_bold);t- IF symbol THEN render := UOR(render, m_sy);I) IF (charsize >= doublehighwidemin) THEN," render := UOR(render, m_hw); END;& IF NOT ok AND_THEN dbg_log_enableD THEN WRITELN(bookdbg, 'Font ', pk^.fontno: 1, ' = ', fontname); END ELSEaG lib$signal(vtbook__badrectyp, 2, %STDESCR 'subpart', pk^.subtype);k len := len - pk^.len; pk := pk::INTEGER + pk^.len;  END; ) IF (len>0) THEN makevarpart(pk, len);  END; ROPROCEDURE process_part_az32(pk: [UNSAFE] pbr_a32; len: INTEGER; cont: BOOLEAN);  VARn i, l: INTEGER;I" nxtsct: [STATIC] INTEGER VALUE 1; BEGINP IF cont THEN BEGIN IF (broken_subpart<>NIL) THEN BEGIN extendpart(pk, len);HA IF dbg_log_enable THEN WRITE(bookdbg, 'Section ', nxtsct:1); 4 write_asciz(' DDesc = ', broken_subpart^.body); DISPOSE(broken_subpart);  broken_subpart := NIL;$ nxtsct := nxtsct + 1; END;$ END ELSE nxtsct := 1; - l := nxtsct - 1 + (len DIV SIZE(br_a32));  FOR i := nxtsct TO l DOk BEGIN9 IF dbg_log_enable THEN WRITE(bookdbg, 'Section ', i: 1);t write_asciz(' DDesc = ', pk^);r" pk := pk::INTEGER + SIZE(br_a32); END;  i := len MOD SIZE(br_a32);0 IF (i>0) THEN makepart(pk, SIZE(br_a32), i); nxtsct := l + 1; END; ^%PROCEDURE process_part(part: INTEGER;h VAR rab: rab$type;N" kind: [TRUNCATE] rectyp); VAR  sts: UNSIGNED;d i, partlen: INTEGER;  pr: [UNSAFE] p_br_record; pk: [UNSAFE] pbr_key_head;  rtyp: wrectyp VALUE ZERO; cont: BOOLEAN VALUE FALSE;E BEGIN  rab.rab$b_rac := rab$c_rfa;b& rab.rab$w_rfa := parts^[part].rfa;% partlen := parts^[part].siz - 16;:+ IF verbose AND_THEN dbg_log_enable THENN0 WRITELN(bookdbg, '%%% Part ', part: 1, ' %%%'); REPEAT sts := $get(rab); rab.rab$b_rac := rab$c_seq;) partlen := partlen + 16 - rab.rab$w_rsz;_ IF NOT ODD(sts) THENI( lib$signal(sts, INT(rab.rab$l_stv)) ELSE BEGIN pr := rab.rab$l_rbf;R IF (rtyp = unknown0) THEN IF PRESENT(kind) THEN_ rtyp := kind ELSE rtyp := pr^.rtype; IF (partlen < 0  {$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Qu="O) THENE lib$signal(vtbook__badpart, 4, part, %REF parts^[part].rfa, parts^[ ) part].rfa[3], parts^[part].siz)c, ELSE IF (pr^.len <> rab.rab$w_rsz) THEN1 lib$signal(vtbook__badsize, 3, %STDESCR 'part',D$ %IMMED rab.rab$w_rsz, pr^.len)) ELSE IF (rtyp <> pr^.rtype) AND_THENo+ (pr^.rtype <> continue_mid) AND_THENv' (pr^.rtype <> continue_end) THENw: lib$signal(vtbook__parttypmis, 3, part, rtyp, pr^.rtype) ELSE BEGINp! i := pr^.len - SIZE(br_record);(& pk := pr::INTEGER + SIZE(br_record);, IF (partlen>0) THEN i := i - SIZE(br_ptr); CASE rtyp OF, text_5p: process_part_5p(pk, i, cont);/ text_0p: process_part_index(pk, i, cont);. onelong: build_section_map(pk, i, cont);3 type_f_desc: process_part_fdesc(pk, i, cont);E2 type_e_font: process_part_font(pk, i, cont);/ asciz_32: process_part_az32(pk, i, cont);t OTHERWISEa4 lib$signal(vtbook__badrectyp, 2, %STDESCR 'part', %IMMED rtyp); END; END; cont := TRUE; END;i. UNTIL (partlen <= 0) OR_ELSE NOT ODD(sts); END; :NFUNCTION display_part(p: INTEGER; s: INTEGER := 0; batched: BOOLEAN): INTEGER; VARO i, j: INTEGER; BEGINh smg$erase_display(book); curh^ := ZERO; curh^.vt_pos := 1; cury := 0; lowest := 1; leftmost := MAXINT;  rightmost := 1;d hotsect := s;n2 IF (hotsect>0) THEN sects^[hotsect].vpos := 1; process_part(p, rab);  IF (lowest < book_len) THENb BEGIN book_len := lowest;, smg$change_virtual_display(book, book_len); END;u! IF (rightmost < pb_cols) THEN  i := 1' ELSE BEGINA IF (rightmost - leftmost > pb_cols) THEN old_pb_cols := pb_cols;e IF batched THEN IF rightmost>132 THEN pb_cols := 132 ELSEk pb_cols := rightmost ELSE E smg$change_pbd_characteristics (pasteboard, rightmost, pb_cols); IF (rightmost < pb_cols) THEN i := 1o ELSE. i := leftmost;_ END;p$ IF (book_len > pb_rows - 4) THEN j := pb_rows - 4 ELSE j := book_len;T IF (hotsect>0) THEN " sect_vpos := sects^[hotsect].vpos ELSE sect_vpos := 1;C IF (sect_vpos+j-1>book_len) THEN sect_vpos := book_len + 1 - j;o IF (hotspots<>NIL) THEN) BEGIN hotspots^.pprv := curhotspot; curhotspot := hotspots;@ WHILE (curhotspot<>NIL) AND_THEN (curhotspot^.rowold_pb_cols) THENN BEGIN' smg$end_pasteboard_update(pasteboard);N? smg$change_pbd_characteristics (pasteboard, pb_cols, pb_cols);c) smg$begin_pasteboard_update(pasteboard);D END;E IF (j>=book_len) THENr display_part := 0 ELSE display_part := sect_vpos;  END; -PROCEDURE undisplay_part( batched: BOOLEAN ); BEGINo" IF (old_pb_cols<>pb_cols) THEN BEGIN7 IF batched THEN smg$end_pasteboard_update(pasteboard); C smg$change_pbd_characteristics (pasteboard, old_pb_cols, pb_cols);r9 IF batched THEN smg$begin_pasteboard_update(pasteboard);( END;w2 smg$unpaste_virtual_display(book, pasteboard); smg$delete_viewport(book); scraphotspots; END; t:FUNCTION changepart(p: INTEGER; s: INTEGER := 0): INTEGER; BEGINE, smg$begin_pasteboard_update(pasteboard); undisplay_part(TRUE);t+ changepart := display_part(p, s, TRUE);c* smg$end_pasteboard_update(pasteboard); END;TYPE go_back_ptr = ^go_back_node; go_back_node = RECORD  lastpart, lastline : INTEGER; next : go_back_ptr; END;  rCPROCEDURE insert_gbe(VAR head : go_back_ptr; part, line : INTEGER); (*E * Insert a new go-back entry. An empty list should have NIL head andp * tail pointers._ *)r VAR( new_node : go_back_ptr; BEGINA NEW(new_node); new_node^.lastpart := part;  new_node^.lastline := line; IF (head = NIL) THEN BEGIN (* New head *) head := new_node; new_node^.next := NIL;E END( ELSE BEGIN (* Insert at the head *) new_node^.next := head; head := new_node; END;, END; 2+FUNCTION remove_gbe(VAR head : go_back_ptr;f& VAR part, line : INTEGER) : BOOLEAN;(*J * Return the go-back info for the head of the list and remove the head ofF * the list. The function returns FALSE if the list is empty and TRUEC * otherwise. part and line are not modified if the list is empty.E *) VAR> del_node : go_back_ptr; BEGINI IF (head = NIL) THEN% remove_gbe := FALSE (* Empty list *)r ELSE BEGIN4 del_node := head; (* point to the node to remove *) head := del_node^.next; part := del_node^.lastpart; line := del_node^.lastline; DISPOSE(del_node);  remove_gbe := TRUE; END;E END; g2FUNCTION change_part_and_line( part_num : INTEGER;" line_num : INTEGER) : INTEGER;(*I * Called to "Go Back" to a specific part and line. To mimic changepart,w/ * the line number is returned by the function.u *)n VAR; temp_line : INTEGER;D BEGINa& temp_line := changepart(part_num); IF (temp_lineline_num) THEN ; smg$scroll_viewport(book, smg$m_down, temp_line-line_num);1% change_part_and_line := line_num;k END; ;FUNCTION switch_parts(! VAR old_list : go_back_ptr;E VAR old_part : INTEGER; old_line : INTEGER; new_part : INTEGER;& new_sect : INTEGER := 0) : INTEGER;(*I * Switches to the selected part (and section) and saves the old part andEK * line information in the "Go Back" list. The new line number is returnedlK * by the function. The new part number is stored back in the integer thatl! * contained the old part number.t *) BEGINe- insert_gbe(old_list, old_part, old_line);r old_part := new_part;r3 switch_parts := changepart(new_part, new_sect);d END; e2PROCEDURE show_part(p: INTEGER; s: INTEGER := 0 ); VARI# last_list : go_back_ptr VALUE NIL; sts, lastline,p i, j : INTEGER;  term : $UWORD; BEGINn NEW(curh);4 i := display_part(p, s, FALSE) (*scrollable?*) ; sts := 1;  WHILE ODD(sts) DO: BEGIN+ sts := smg$read_keystroke(keyboard, term); % IF ODD(sts) OR (sts = smg$_eof) THEN BEGIN CASE term OF  smg$k_trm_ctrlz, smg$k_trm_f10:(*H * If this is a figure or table reached by a hotspot, then Ctrl-Z shouldL * have the same effect as [Return], i.e., it should go back to the previous * section.t *L * If the next and previous topic keys don't work (prevpart and nextpart are; * zero), then assume we're dealing with a table or figure.i *)^4 IF (prevpart = 0) AND_THEN (nextpart = 0) AND_THEN* remove_gbe(last_list, p, lastline) THEN/ BEGIN (* Go back to the previous topic *)b- i := change_part_and_line(p, lastline);f1 sts := 1; (* In case Ctrl-Z was pressed *)f ENDp1 ELSE sts := smg$_eof; (* Get out of the loop *)( smg$k_trm_ctrle: $exit(1);# smg$k_trm_ctrlr, smg$k_trm_ctrlw:;" smg$repaint_screen(pasteboard); smg$k_trm_up:: IF (i > 1) THENo BEGINi i := i - 1;R, smg$scroll_viewport(book, smg$m_down); ENDe ELSE IF (prevpart = 0) THENE smg$ring_bell(book)N ELSE3 i := switch_parts(last_list, p, i, prevpart);x smg$k_trm_down:r7 IF (i > 0) AND_THEN (i + pb_rows - 5 < book_len) THENT BEGIN5 i := i + 1;I smg$scroll_viewport(book); END, ELSE IF (nextpart = 0) THENR smg$ring_bell(book)r ELSE3 i := switch_parts(last_list, p, i, nextpart);p smg$k_trm_left:  IF (prevpart = 0) THEN smg$ring_bell(book)a ELSE3 i := switch_parts(last_list, p, i, prevpart);[ smg$k_trm_right: IF (nextpart = 0) THEN smg$ring_bell(book)T ELSE3 i := switch_parts(last_list, p, i, nextpart);H smg$k_trm_kp7, smg$k_trm_prev_screen: IF ( E$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Quv`i > 1) THEN^ BEGINI j := pb_rows - 5;g" IF (i <= j) THEN j := i - 1; i := i - j;'/ smg$scroll_viewport(book, smg$m_down, j);D ENDG ELSE IF (prevpart = 0) THENf smg$ring_bell(book)I ELSE3 i := switch_parts(last_list, p, i, prevpart);  smg$k_trm_kp8, smg$k_trm_cr,  smg$k_trm_next_screen:7 IF (i > 0) AND_THEN (i + pb_rows - 5 < book_len) THENT BEGIN' j := pb_rows - 5;p. IF (i + pb_rows - 5 + j > book_len) THEN%a j := book_len - (i + pb_rows - 5);  i := i + j;p% smg$scroll_viewport(book, , j);+ ENDO ELSE IF (nextpart = 0) THEN  smg$ring_bell(book)> ELSE3 i := switch_parts(last_list, p, i, nextpart);c smg$k_trm_period,A smg$k_trm_select:N IF (curhotspot=NIL) THEN smg$ring_bell(book)R2 ELSE IF (sects^[curhotspot^.sect].partno=p) THEN BEGINn" insert_gbe(last_list, p, i);) j := sects^[curhotspot^.sect].vpos;t IF (ij) THEN. smg$scroll_viewport(book, smg$m_down, i-j); i := j;c ENDt ELSE WITH curhotspot^ DO% i := switch_parts(last_list, p, i, sects^[sect].partno, sect); smg$k_trm_ctrlb:. IF (remove_gbe(last_list, p, lastline)) THEN- i := change_part_and_line(p, lastline);o smg$k_trm_pf3, smg$k_trm_find:  IF (curhotspot=NIL) THEN smg$ring_bell(book)B ELSE BEGIN IF (i=0) OR_ELSE6 ((i=curhotspot^.row)) THEN. BEGIN (*hotspot visible - advance to next*) smg$change_rendition (r display_id := book,p% start_row := curhotspot^.row,( start_column := curhotspot^.col,, number_of_rows := curhotspot^.lines,/ number_of_columns := curhotspot^.chars,S/ rendition_complement := smg$m_reverse);H! IF (curhotspot^.pnxt=NIL) THEN* curhotspot := hotspotst ELSEP& curhotspot := curhotspot^.pnxt; smg$change_rendition (p display_id := book,]% start_row := curhotspot^.row,( start_column := curhotspot^.col,, number_of_rows := curhotspot^.lines,/ number_of_columns := curhotspot^.chars,,; rendition_complement := smg$m_reverse+smg$m_blink);O END;p WITH curhotspot^ DO] IF (i>0) AND_THEN3 ((i>=row+lines) OR_ELSE (i+pb_rows-5book_len) THENr" j := book_len - (pb_rows - 5); IF (i 0) THEN' show_sect(keys^.sect[j])  ELSE IF (sts <> smg$_eof) THEN= smg$ring_bell(ndx); END;  DISPOSE(keys); smg$delete_menu(ndx);H$ smg$delete_virtual_display(ndx);. IF (sts <> smg$_eof) THEN lib$signal(sts); END; gPROCEDURE offer_index_choice;o VARo i: INTEGER; term, j: $uword;E sts, indices: UNSIGNED; BEGIN_ i := 4 * nkeys + 2;R7 FOR j := 1 TO nkeys DO i := i + LENGTH(keyname[j]);(3 IF (i < LENGTH(title)) THEN i := LENGTH(title);w: sts := smg$create_virtual_display(number_of_rows := 1,! number_of_columns := i,A display_id := indices,. display_attributes := smg$m_border + smg$m_trunc_icon); IF ODD(sts) THEN/ sts := smg$label_border(display_id := indices,F TEXT := title,$ rendition_set := smg$m_reverse); IF ODD(sts) THEN. sts := smg$create_menu(display_id := indices,$ choices := %DESCR keyname,) menu_type := smg$k_horizontal);S IF ODD(sts) THEN8 sts := smg$paste_virtual_display(display_id := indices," pasteboard_id := pasteboard, pasteboard_row := 2,, pasteboard_column := (pb_cols - i) DIV 2); WHILE ODD(sts) DOt BEGIN5 sts := smg$select_from_menu(keyboard_id := keyboard,  display_id := indices,. (* Return the terminator key, drb, V1-003 *)% word_terminator_code := term,N$ flags := smg$m_return_immed,. (* Return the terminator key, drb, V1-003 *)% selected_choice_number := j);w IF ODD(sts) THEN= CASE term OF. smg$k_trm_cr, smg$k_trm_enter,% smg$k_trm_period, smg$k_trm_select:  offer_key_choice(j); ! smg$k_trm_ctrlz, smg$k_trm_f10:1( sts := smg$_eof; (* Exit this menu *). smg$k_trm_ctrle: $exit(1); (* Exit VTBOOK *)* smg$k_trm_question_mark, smg$k_trm_help:* show_help (pasteboard_id := pasteboard, m keyboard_id := keyboard); smg$k_trm_ctrld:7 spawn_subproc(pasteboard_id := pasteboard);Z% OTHERWISE ; (* Ignore this key *)  END; (* end of cases *) END;r smg$delete_menu(indices);y( smg$delete_virtual_display(indices);. IF (sts <> smg$_eof) THEN lib$signal(sts); END; _;[GLOBAL] PROCEDURE menu_book(filename: VARYING [u] OF CHAR;E& bookname: VARYING [v] OF CHAR;+ default_file: VARYING [w] OF CHAR); VARa sts: UNSIGNED;[ index_page : INTEGER; font_page : INTEGER;67 tmp_desc: dsc1$type VALUE [dsc$b_class: dsc$k_class_s;E0 dsc$b_dtype: dsc$k_dtype_t; OTHERWISE ZERO]; temp_len: INTEGER;r BEGINb dodgy_file := FALSE;- fab.fab$l_fna := IADDRESS(filename.body);O& fab.fab$b_fns := LENGTH(filename); temp_len := 1;4 WHILE (temp_len < LENGTH(default_file)) AND_THEN& (default_file[temp_len+1] <> ';') DO temp_len := temp_len+1;< fab.fab$b_dns := temp_len-5; (* Subtract away 'SHELF' *)1 fab.fab$l_dna := IADDRESS(default_file.body); L (* Set the RMS network block count to a big value (allows up to 65536 *)8 net_block_count := 127; (* Pointed to by $XABITM *) sts := $open(fab); IF NOT ODD(sts) THEN BEGIN. tmp_desc.dsc$w_maxstrlen := LENGTH(filename);3 tmp_desc.dsc$a_pointer := IADDRESS(filename.body); G lib$signal(vtbook__openin, 1, %REF tmp_desc, sts, INT(fab.fab$l_stv));3 END% ELSE BEGIN (* book file opened *)  IF dbg_log_enable THENc BEGIN& OPEN(FILE_VARIABLE := bookdbg,& FILE_NAME := 'sys$scratch:.log', HISTORY := NEW,  DEFAULT := filename ); REWRITE(bookdbg); END;e (*r * Allocate the record buffer.n *) IF (xab.xab$w_lrl = 0) THEN IF (xab.xab$w_mrz = 0) THEN rab.rab$w_usz := %xFFFF( ELSE rab.rab$w_usz := xab.xab$w_mrz% ELSE rab.rab$w_usz := xab.xab$w_lrl;t4 sts := lib$get_vm(number_of_bytes := rab.rab$w_usz,' base_address := rab.rab$l_ubf); IF NOT ODD(sts) THEN  P\$ VTBOOK014.A)) $[HUNTER.FILESERV.VTBOOK.A]BOOK.PAS;1Quvzq lib$signal(sts) ELSE BEGIN; sts := $connect(rab); IF ODD(sts) THENO BEGIN; sts := verify_first_and_last(rab, index_page, font_page);: IF ODD(sts) THEN BEGIN  maxfont := - 1;- process_part(index_page, rab, onelong); 0 process_part(font_page, rab, type_e_font); book_len := pb_rows - 4;( sts := smg$create_virtual_display(! number_of_rows := pb_rows - 4,) number_of_columns := 132, display_id := book,' display_attributes := smg$m_border);b IF ODD(sts) THEN sts := smg$label_border(p display_id := book,D text := title,$ rendition_set := smg$m_reverse); old_pb_cols := pb_cols;s IF (nkeys > 1) THEN  offer_index_choicee ELSE IF (nkeys = 1) THEN offer_key_choice(1) ELSE show_sect(1); END; DISPOSE(sects);h DISPOSE(parts);e nkeys := 0;t END;2 lib$free_vm(number_of_bytes := xab.xab$w_lrl," base_address := rab.rab$l_ubf); END;( $CLOSE(fab);s IF dbg_log_enable THEN ' IF verbose OR_ELSE dodgy_file THEN( CLOSE(bookdbg) ELSE: CLOSE( bookdbg, DELETE );L: IF NOT ODD(sts) THEN lib$signal(sts, INT(rab.rab$l_stv));$ END; (* End of shelf file opened *) END; TO BEGIN DO init_rms_blk(fab, rab);rEND. curhotspot := hotspots;@ WHILE (curhotspot<>NIL) AND_THEN (curhotspot^.rowBADSHELFENTRY /FAO=2.LASTNOTLAST /FAO=0 .SEVERITY ERROR;BADRECTYP /FAO=2?BADLAST /FAO=3IBADSIZE /FAO=3;BADPART /FAO=4?PARTTYPMIS /FAO=34BADSUBSIZ /FAO=0!OPENIN /FAO=1 .SEVERITY FATAL4UNDEFTERM /FAO=0 .END'*[HUNTER.FILESERV.VTBOOK.A]BOOKMSG.OBJ;1+,)./ 4-) 0123KPWO56Od784/6e8x^9GHJ4BOOKMSGV1.230-NOV-1993 18:1830-NOV-1993 18:18VAX-11 Message V04-00k$ABS$ MSG$SECTIONMSG$AAAAAAAAAAAMSG$AAAAAAAAAABMSG$AAAAAAAAAAC'TVTBOOK__UNDEFTERMJVTBOOK__OPENINBVTBOOK__BADSUBSIZ:VTBOOK__PARTTYPMIS2VTBOOK__BADPART*VTBOOK__BADSIZE"VTBOOK__BADLASTVTBOOK__BADRECTYPVTBOOK__LASTNOTLASTVTBOOK__BADSHELFENTRYVTBOOK$_FACILITYPeP*P'P(X{ .(n08@6HlP@ BADSHELFENTRY(bookshelf entry contains invalid !AS !AS0 LASTNOTLASTrecord(s) following 'last'> BADRECTYP)book !AS record has invalid type code !XW@BADLAST.expected end of book at !UL, actual end at !UWJBADSIZE8expected !AS record to have size !UW, actual size is !UL<BADPART*part !UL, RFA !XL,!XW has invalid size !ULB PARTTYPMIS,part !UL should be type !UL, actual type !UL6 BADSUBSIZ"subrecord size does not fit record"OPENINerror opening !AS4 UNDEFTERM Unknown or invalid terminal type VTBOOK)*[HUNTER.FILESERV.VTBOOK.A]BOOKSHELF.OBJ;1+,) .$/ 4$"4-) 0123KPWO#56Od7@>/6e8@'_9GHJ 4 BOOKSHELF0130-Nov-1993 18:1730-Nov-1993 18:17VAX Pascal V4.4-89PALIBRARY Q`QQUPQN  Q`QQUPQN% ,% ,sys$disk:[]library.decw$bookshelfQ &+ SHELF_ENTRYSHELFBOOKTITLEQFQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQnamefiletypetype DQQ"PQQ1QQQQnametype Q  h$ VTBOOK014.A) ) )[HUNTER.FILESERV.VTBOOK.A]BOOKSHELF.OBJ;1$"  Q`QQQUPQNQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQLibrary ...QDECW$BOOK:LIBRARY.DECW$BOOKSHELFdecw$book:.decw$bookshelfQDECUS VTBOOK V1.4<(^}}QXQQQ Q zQxQQQQQQoQ>/QQQQOQ Q?IQW QQQoQ'QQ84Q*QQ Q2Q(QQQBQ4Q0Q30Q,\QQ!QQQ2Q/`SMG$DELETE_MENUSMG$DELETE_VIRTUAL_DISPLAY 7MENU_BOOKSHELF PB_ROWSVTBOOK__OPENIN PAS$RESET2PAS$NEW2 STR$ELEMENTPAS$READV_ENUMERATED PAS$STATUSVVTBOOK__BADSHELFENTRYPAS$GET PAS$DISPOSE2PAS$CLOSE_LOCAL_R3SYS$GET `AMENU_BOOKSHELF_LIST SYS$SEARCHPAS$WRITEV_STRINGPAS$WRITEV_INTEGERE$CODE%$LOCAL\ LIB$SIGNALPݭ status1, status2 : [VOLATILE] INTEGER; (* _sts and _stv *)&FUNCTION user_open(VAR fab : FAB$TYPE; VAR rab : RAB$TYPE;( VAR f : shelf_file_type) : INTEGER; BEGIN status1 := $OPEN(fab); IF NOT ODD(status1) THEN status2 := INT(fab.fab$l_stv) ELSE BEGIN status1 := $CONNECT(rab); IF NOT ODD(status1) THEN BEGIN# status2 := INT(rab.rab$l_stv); $CLOSE(fab); END; END; user_open := status1; END;TYPE' shelf_entry = (shelf, book, title);D title_array = ARRAY [1..maxchoice] OF VARYING [maxline] OF CHAR;5 type_array = ARRAY [1..maxchoice] OF shelf_entry;2 var_filespec = VARYING [nam$c_maxrssZ$ VTBOOK014.A*) )[HUNTER.FILESERV.VTBOOK.A]BOOKSHELF.PAS;1P'h4"] OF CHAR;7 fname_array = ARRAY [1..maxchoice] OF var_filespec;VAR row,% column : [STATIC] INTEGER VALUE 2;: delim : [STATIC] PACKED ARRAY [1..1] OF CHAR VALUE '\'; @[GLOBAL] PROCEDURE menu_bookshelf(filename: VARYING [u] OF CHAR;% shelfname: VARYING [v] OF CHAR;( default_file: VARYING [w] OF CHAR;# top_level: BOOLEAN); FORWARD; DPROCEDURE shelf_menu(num_choices, menu_length, menu_width : INTEGER;4 VAR titles : title_array; VAR types : type_array; VAR filenames : fname_array;# menu_name : VARYING [v] OF CHAR;& default_file : VARYING [w] OF CHAR; top_level : BOOLEAN);(*K * The common part of menu_bookshelf and menu_bookshelf_list. This routine4 * was copied from the lower half of menu_bookshelf. *) VAR i : INTEGER; chosen, trmkey : $UWORD; disp, sts : UNSIGNED; BEGIN IF (num_choices > 1) THEN BEGIN: FOR i := num_choices + 1 TO maxchoice DO titles[i] := '';@ IF (num_choices < menu_length) THEN menu_length := num_choices;A sts := smg$create_virtual_display(number_of_rows := menu_length,' number_of_columns := menu_width, display_id := disp,+ display_attributes := smg$m_border + smg$m_trunc_icon); IF ODD(sts) THEN BEGIN0 sts := smg$label_border(display_id := disp, TEXT := menu_name,% rendition_set := smg$m_bold); IF ODD(sts) THEN, sts := smg$create_menu(display_id := disp,$ choices := %DESCR titles,( menu_type := smg$k_vertical); IF ODD(sts) THEN6 sts := smg$paste_virtual_display(display_id := disp,# pasteboard_id := pasteboard, pasteboard_row := row,$ pasteboard_column := column); chosen := 1; WHILE ODD(sts) DO BEGIN6 sts := select_from_menu(pasteboard_id := pasteboard, keyboard_id := keyboard, display_id := disp, choice_number := chosen, choices := titles, max_choice := num_choices, terminator := trmkey); IF ODD(sts) THEN$ IF (trmkey=smg$k_trm_f20) THEN BEGIN" IF openlib THEN CLOSE(library);! OPEN(FILE_VARIABLE := library, FILE_NAME := libname, HISTORY := NEW ); REWRITE(library); openlib := TRUE; END, ELSE IF ( ( trmkey = smg$k_trm_f19) OR, ( trmkey = smg$k_trm_kp1)) AND_THEN openlib THEN BEGIN CLOSE(library); openlib := FALSE; END) ELSE IF (trmkey=smg$k_trm_pf4) THEN BEGIN IF NOT openlib THEN BEGIN% OPEN(FILE_VARIABLE := library, FILE_NAME := libname, HISTORY := UNKNOWN); EXTEND(library); openlib := TRUE; END;+ WRITELN(library, types[chosen]:5, delim,. filenames[chosen], delim, titles[chosen]); END- ELSE IF (trmkey<>smg$k_trm_cr) AND_THEN) (trmkey<>smg$k_trm_enter) AND_THEN& (trmkey<>smg$k_trm_do) AND_THEN& (trmkey<>smg$k_trm_select) THEN smg$ring_bell(disp)* ELSE IF (types[chosen] = shelf) THEN BEGIN row := row + 1; column := column + 1;4 menu_bookshelf(filenames[chosen], titles[chosen], default_file, top_level); column := column - 1; row := row - 1; END ELSE/ menu_book(filenames[chosen], titles[chosen], default_file); END; smg$delete_menu(disp);& smg$delete_virtual_display(disp); END;+ IF (sts <> smg$_eof) THEN lib$signal(sts); END" ELSE IF (num_choices = 1) THEN IF (types[1] = shelf) THENE menu_bookshelf(filenames[1], menu_name, default_file, top_level) ELSE6 menu_book(filenames[1], titles[1], default_file); END; +FUNCTION get_title(filename : var_filespec;! VAR name : VARYING [u] OF CHAR;! VAR error : BOOLEAN) : BOOLEAN;(*M * Open a shelf file and search for the TITLE record. If one is found, storeF * the value in name and return TRUE. Otherwise, return FALSE. If anK * error is detected while reading the shelf file, then it will be signaled! * and error will be set to TRUE. *) VAR sts : INTEGER;, buffer : PACKED ARRAY [1..bigline] OF CHAR;B rab : rab$type VALUE [rab$b_bid: rab$c_bid; rab$b_bln: rab$c_bln;, rab$w_usz: SIZE(buffer); OTHERWISE ZERO];B fab : fab$type VALUE [fab$b_bid: fab$c_bid; fab$b_bln: fab$c_bln;( fab$b_rat: fab$m_cr; OTHERWISE ZERO];% temp_rec: VARYING [bigline] OF CHAR; rec_type: shelf_entry; match : BOOLEAN VALUE FALSE;7 tmp_desc: dsc1$type VALUE [dsc$b_class: dsc$k_class_s;0 dsc$b_dtype: dsc$k_dtype_t; OTHERWISE ZERO];8 file_desc: dsc1$type VALUE [dsc$b_class: dsc$k_class_s;0 dsc$b_dtype: dsc$k_dtype_t; OTHERWISE ZERO]; BEGIN- fab.fab$l_fna := IADDRESS(filename.body);& fab.fab$b_fns := LENGTH(filename);# rab.rab$l_fab := IADDRESS(fab);& rab.rab$l_ubf := IADDRESS(buffer);2 file_desc.dsc$w_maxstrlen := LENGTH(filename);7 file_desc.dsc$a_pointer := IADDRESS(filename.body); error := FALSE; sts := $OPEN(fab); IF NOT ODD(sts) THEN BEGINH lib$signal(vtbook__openin, 1, %REF file_desc, sts, INT(fab.fab$l_stv)); error := TRUE; END ELSE BEGIN sts := $CONNECT(rab); IF ODD(sts) THEN BEGIN REPEAT sts := $GET(rab); IF ODD(sts) THEN BEGIN0 str$copy_r(%DESCR temp_rec, rab.rab$w_rsz, %IMMED rab.rab$l_rbf);! IF (temp_rec[1] <> '!') THEN BEGIN3 READV(temp_rec, rec_type, ERROR := CONTINUE); IF (STATUSV = 0) THEN BEGIN IF (rec_type = title) THEN BEGIN0 sts := str$element(%DESCR name, 2, delim, temp_rec); IF ODD(sts) THEN BEGINe match := TRUE;. sts := rms$_eof; (* get out of the loop *) END ELSE BEGINE1 lib$signal(vtbook__openin, 1, %REF file_desc,s vtbook__badshelfentry, 2,* %STDESCR 'name', %REF tmp_desc, sts); sts := 1;N END; END;O END ELSE BEGIN0 lib$signal(vtbook__openin, 1, %REF file_desc,. vtbook__badshelfentry, 2, %STDESCR 'type', %STDESCR ' ');1 END;r END;t END; UNTIL NOT ODD(sts);; IF sts = rms$_eof THEN (* Expected error, ignore it *)t sts := 1;1 END ELSE error := TRUE; IF NOT ODD(sts) THEN7 lib$signal(vtbook__openin, 1, %REF file_desc, sts,E INT(rab.rab$l_stv));9 END;l $CLOSE(fab); get_title := match;a END;TYPE: pack_filespec = PACKED ARRAY[1..nam$c_maxrss] OF CHAR; o<FUNCTION parse_filespec(VAR resultant : VARYING [u] OF CHAR;" filename : VARYING [v] OF CHAR;, default : VARYING [w] OF CHAR) : INTEGER;(*O * This routine parses filename and default and places the result in resultant.o4 * Errors are signaled here, so the STV can be used. *) VARc sts : INTEGER;6 e_name : pack_filespec VALUE [1..nam$c_maxrss: ' '];2 parse_nam : NAM$TYPE VALUE [nam$b_bid: nam$c_bid;2 nam$b_bln: nam$c_bln; nam$b_ess: SIZE(e_name); OTHERWISE ZERO];2 parse_fab : FAB$TYPE VALUE [fab$b_bid: fab$c_bid;* fab$b_bln: fab$c_bln; OTHERWISE ZERO]; temp_len : $UWORD;r BEGINd/ parse_fab.fab$l_nam := IADDRESS(parse_nam);t3 parse_fab.fab$l_fna := IADDRESS(filename.body); , parse_fab.fab$b_fns := LENGTH(filename);2 parse_fab.fab$l_dna := IADDRESS(default.body);+ parse_fab.fab$b_dns := LENGTH(default);F, parse_nam.nam$l_esa := IADDRESS(e_name); sts := $PARSE(parse_fab);  IF NOT ODD(sts) THEN* lib$signal(sts, INT(parse_fab.fab$l_stv)) ELSE BEGIN! temp_len := parse_nam.nam$b_esl;B7 sts := str$copy_r(%DESCR resultant, temp_len, e_name);N IF NOT ODD(sts) THENa lib$signal(sts);t END;E parse_filespec := sts; END; EFUNCTION parse_filespec_for_node(VAR resultant : VARYING [u] OF CHAR;G- filename : VARYING [v] OF CHAR) : INTEGER;$(*A * This routine parses filename and places the node in resultant.4 * Errors are signaled here, so the STV can be used. *)r VARA sts : INTEGER;6 e_name : pack_filespec VALUE [1..nam$c_maxrss: ' '];2 parse_nam : NAM$TYPE VALUE [nam$b_bid: nam$c_bid;2 nam$b_bln: nam$c_bln; nam$b_ess: SIZE(e_name); OTHERWISE ZERO];2 parse_fab : FAB$TYPE VALUE [fab$b_bid: fab$c_bid;* fab$b_bln: fab$c_bln; OTHERWISE ZERO]; temp_len : $UWORD;A BEGIN;/ parse_fab.fab$l_nam := IADDRESS(parse_nam);e3 parse_fab.fab$l_fna := IADDRESS(filename.body);O, parse_fab.fab$b_fns := LENGTH(filename);, parse_nam.nam$l_esa := IADDRESS(e_name); sts := $PARSE(parse_fab);s IF NOT ODD(sts) THEN* lib$signal(sts, INT(parse_fab.fab$l_stv)) ELSE BEGIN" temp_ $ VTBOOK014.A*) )[HUNTER.FILESERV.VTBOOK.A]BOOKSHELF.PAS;1P'"len := parse_nam.nam$b_node;. sts := str$copy_r(%DESCR resultant, temp_len, %IMMED parse_nam.nam$l_node); IF NOT ODD(sts) THEN; lib$signal(sts);t END;u# parse_filespec_for_node := sts;T END; *E[GLOBAL] PROCEDURE menu_bookshelf_list(libname : VARYING [u] OF CHAR;:$ defname : VARYING [v] OF CHAR);(*N * Build a menu of shelf files found from a search. Used to build the initial * menu. *)h VAR  e_name,6 r_name : pack_filespec VALUE [1..nam$c_maxrss: ' '];1 srch_nam : NAM$TYPE VALUE [nam$b_bid: nam$c_bid;r2 nam$b_bln: nam$c_bln; nam$b_ess: SIZE(e_name); nam$b_rss: SIZE(r_name);0 nam$b_nop: nam$m_noconceal; OTHERWISE ZERO];1 srch_fab : FAB$TYPE VALUE [fab$b_bid: fab$c_bid;t* fab$b_bln: fab$c_bln; OTHERWISE ZERO]; temp_len : $UWORD;e, temp_name : VARYING [nam$c_maxrss] OF CHAR; err_title,  match : BOOLEAN; j,b. menu_width : INTEGER VALUE LENGTH(vtbook_id); menu_length : INTEGER VALUE 0;  i : INTEGER VALUE 0; sts : UNSIGNED; / names : title_array VALUE [1..maxchoice: ''];t0 filnam : fname_array VALUE [1..maxchoice: ''];2 filtyp : type_array VALUE [1..maxchoice: shelf];! num_bad_files : INTEGER VALUE 0; 2 bad_files : fname_array VALUE [1..maxchoice: '']; BEGINW- srch_fab.fab$l_nam := IADDRESS(srch_nam);m1 srch_fab.fab$l_fna := IADDRESS(libname.body);d@ srch_fab.fab$b_fns := LENGTH(libname); (* Blank if hybrid *)1 srch_fab.fab$l_dna := IADDRESS(defname.body);=* srch_fab.fab$b_dns := LENGTH(defname);+ srch_nam.nam$l_esa := IADDRESS(e_name);k+ srch_nam.nam$l_rsa := IADDRESS(r_name);C sts := $PARSE(srch_fab); IF ODD(sts) THEN BEGIN REPEAT= sts := $SEARCH(srch_fab); IF ODD(sts) THENI= BEGIN (* Found another shelf file, add it to the list *)r$ temp_len := srch_nam.nam$b_rsl;4 str$copy_r(%DESCR temp_name, temp_len, r_name); (*? * Note: if DECW$BOOK (or DECW$BOOKSHELF) is a search list andtF * LIBRARY is a search list, then some filenames may be returned more * than one time. *) j := 1; match := FALSE;B WHILE (j <= i) AND NOT match DO (* Make sure this filename *)* BEGIN (* isn't already represented *)! match := temp_name = filnam[j]; j := j+1;e END; (*mE * If this shelf was found, but rejected earlier because of an errorE- * reading the TITLE record, then ignore it. *) j := 1;0 WHILE (j <= num_bad_files) AND NOT match DO BEGIN$ match := temp_name = bad_files[j]; j := j+1;] END; IF NOT match THEN" BEGIN (* Found a new filename *) i := i+1;k filnam[i] := temp_name;tB (* Use the TITLE record of the shelf if one could be found *)2 IF NOT get_title(temp_name, names[i], err_title) AND_THEN NOT err_title THEN' WRITEV(names[i], 'Library ', i:1);  IF err_title THEN BEGINl0 i := i-1; (* Error, ignore this shelf *)' num_bad_files := num_bad_files+1;E, bad_files[num_bad_files] := temp_name; ENDh ELSE BEGIN: names[i] := names[i]+'...'; (* Mark it as a shelf *)/ IF (LENGTH(names[i])+2 > menu_width) THENt$ menu_width := LENGTH(names[i])+2; END; END; END;a UNTIL NOT ODD(sts);8 IF sts = rms$_nmf THEN (* Expected error, ignore it *) sts := 1; A (* If the first $SEARCH fails, then rms$_fnf will be returned *)r END;t IF NOT ODD(sts) THEN lib$signal(vtbook__openin, 1,. %STDESCR 'DECW$BOOK:LIBRARY.DECW$BOOKSHELF',$ INT(sts), INT(srch_fab.fab$l_stv)) ELSE BEGIN" menu_length := pb_rows - row - 4;> shelf_menu(i, menu_length, menu_width, names, filtyp, filnam,! vtbook_id, shelf_defnam, TRUE);a END;; END; $PROCEDURE menu_bookshelf;b VART menu_length: INTEGER; i, j, longest: INTEGER; sts: UNSIGNED;n f: shelf_file_type; name: ^title_array;. filnam: fname_array VALUE [1..maxchoice: ''];0 filtyp: type_array VALUE [1..maxchoice: shelf];# typstr: VARYING [maxline] OF CHAR;L7 tmp_desc: dsc1$type VALUE [dsc$b_class: dsc$k_class_s;y0 dsc$b_dtype: dsc$k_dtype_t; OTHERWISE ZERO]; new_default: var_filespec; book_default: var_filespec; shelf_default: var_filespec; nodename: var_filespec; BEGINe% menu_length := pb_rows - row - 4;i OPEN(file_variable := f, file_name := filename, history := READONLY, error := CONTINUE, user_action := user_open,i default := default_file);_ IF NOT ODD(status1) THEN BEGIN. tmp_desc.dsc$w_maxstrlen := LENGTH(filename);3 tmp_desc.dsc$a_pointer := IADDRESS(filename.body);k@ lib$signal(vtbook__openin, 1, %REF tmp_desc, status1, status2); END ELSE BEGIN RESET(f); longest := LENGTH(shelfname);; WHILE (longest > 0) AND_THEN (shelfname[longest] = '.') DOD longest := longest - 1; shelfname.LENGTH := longest;. i := 1; NEW(name);r8 sts := parse_filespec_for_node(nodename, default_file);( new_default := nodename + default_file; WHILE NOT EOF(f) DO BEGIN< sts := str$element(%DESCR typstr, 0, delim, %DESCR f^); IF typstr[1] <> '!' THENn! BEGIN (* Not a comment record *)p IF ODD(sts) THEN)! BEGIN (* Got the record type *)U. READV(typstr, filtyp[i], error := CONTINUE); IF (STATUSV = 0) THENE- BEGIN (* Interpreted the record type *)l IF filtyp[i] <> title THEN! BEGIN (* Not a title record *)p1 sts := str$element(%DESCR filnam[i], 1, delim, %DESCR f^); IF ODD(sts) THEN(# BEGIN (* Got the filename *) 4 sts := str$element(%DESCR name^[i], 2, delim, %DESCR f^);D IF ODD(sts) THEN BEGIN (* Got the title *)  IF (filtyp[i] = shelf) THEN + BEGIN (* Shelf titles end in ... *)" j := LENGTH(name^[i]) + 1;! name^[i].LENGTH := j + 2;p name^[i][j] := '.';E name^[i][j + 1] := '.';l name^[i][j + 2] := '.';i. END; (* End of fix shelf title name *), IF (LENGTH(name^[i]) + 2 > longest) THEN( longest := LENGTH(name^[i]) + 2;& i := i + 1; (* Count this entry *)" END (* End of got the title *). ELSE BEGIN (* Error extracting title *)1 tmp_desc.dsc$w_maxstrlen := LENGTH(name^[i]);s tmp_desc.dsc$a_pointer :=d IADDRESS(name^[i].body);( lib$signal(vtbook__badshelfentry, 2,* %STDESCR 'name', %REF tmp_desc, sts);, END; (* End of error extracting title *)) END (* End of got the filename *):1 ELSE BEGIN (* Error extracting the filename *)F5 tmp_desc.dsc$w_maxstrlen := LENGTH(filnam[i]);c: tmp_desc.dsc$a_pointer := IADDRESS(filnam[i].body);< lib$signal(vtbook__badshelfentry, 2, %STDESCR 'file', %REF tmp_desc, sts);a6 END; (* End of error extracting the filename *)' END; (* End of not a title record *)l2 END (* End of interpreted the record type *)5 ELSE BEGIN (* Error interpreting the record type *) 1 tmp_desc.dsc$w_maxstrlen := LENGTH(typstr);N6 tmp_desc.dsc$a_pointer := IADDRESS(typstr.body);; lib$signal(vtbook__badshelfentry, 2, %STDESCR 'type',% %REF tmp_desc);_: END; (* End of error interpreting the record type *)& END (* End of got the record type *)6 ELSE BEGIN (* Error extracting the record type *)- tmp_desc.dsc$w_maxstrlen := LENGTH(typstr);N2 tmp_desc.dsc$a_pointer := IADDRESS(typstr.body);7 lib$signal(vtbook__badshelfentry, 2, %STDESCR 'type',  %REF tmp_desc);3 END (* End of error extracting the record type *); END; (* Not a comment *)V& GET(f); (* Get the next record *)' END; (* End of record-read loop *) B CLOSE(f, error := CONTINUE); (* Ignore errors closing the file *) i := i - 1;(*K * Only parse in the shelf name if it is not a top-level shelf (those namesJ * are returned by LIB$FIND_FILE) and if it has something to add, i.e., it" * contains a device or directory. *)SB IF NOT top_level AND_THEN (find_member(filename, [':',']']) <> 0) THENs? sts := parse_filespec(new_default, filename, default_file)a ELSE  sts := 1; IF ODD(sts) THENt? shelf_menu(i, menu_length, longest, name^, filtyp, filnam,n" shelfname, new_default, FALSE); DISPOSE(name);m$ END; (* End of shelf file opened *)$ END; (* End of menu_bookshelf *)END.s);t END;u# parse_filespec_for_node := sts;T END; *E[GLOBAL] PROCEDURE menu_bookshelf_list(libname : VARYING [u] OF CHAR;:$ defname : VARYING [v] OF CHAR);(*N * Build a menu of shelf files found from a search. Used to build the initial * menu. *)h VAR  e_name,6 r_name : pack_filespec VALUE [1..nam$c_maxrss: ' '];1 srcK$ VTBOOK014.A*) '[HUNTER.FILESERV.VTBOOK.A]DESCRIP.MMS;1K/H'*[HUNTER.FILESERV.VTBOOK.A]DESCRIP.MMS;1+,*./ 4KZ-) 0123KPWO56Od7H/6e8O _9GHJ## MMS file to build VTBOOK#1# Written by Darrell Burkhead and Hunter Goatley## Revision History#"# 30-NOV-1993 Bret D. Wortman V1.4K# Modified to account for VTBOOKMENU's [new] dependendency on VTBOOK.PEN.#.IFDEF __debug__PFLAGS = $(PFLAGS)/DEBUG/NOOPTLINKFLAGS = $(LINKFLAGS)/DEBUG.ELSEPFLAGS = $(PFLAGS)/NODEBUG(LINKFLAGS = $(LINKFLAGS)/NODEBUG/NOTRACE.ENDIF .IFDEF EXE.ELSE EXE = .EXE OBJ = .OBJ OLB = .OLB.ENDIF4.suffixes : .SDML .HLP .PAS .MSG .CLD .PEN .OBJ .OLBDOCUMENT = DOCUMENTPASCAL = PASCAL3HLPFLAGS = /NOCONTENTS/NOPRINT/OUTPUT=$(MMS$TARGET) .SDML.HLP :. $(DOCUMENT)$(HLPFLAGS) $(MMS$SOURCE) HELP HLPAOBJS = VTBOOK$(OBJ),VTBOOKMENU$(OBJ),BOOK$(OBJ),BOOKSHELF$(OBJ),-( BOOKMSG$(OBJ),VTBOOK_TABLE$(OBJ)&VTBOOK$(EXE) : VTBOOK$(OLB)($(OBJS)): $(LINK)$(LINKFLAGS) VTBOOK$(OLB)/INCLUDE=(VTBOOK)/LIBRARY=VTBOOK$(OBJ),VTBOOK.PEN : VTBOOK.PAS,VTBOOK_CLI_ROUTINES.PEN ;VTBOOKMENU$(OBJ),VTBOOKMENU.PEN : VTBOOKMENU.PAS,VTBOOK.PEN2VTBOOK_CLI_ROUTINES.PEN : VTBOOK_CLI_ROUTINES.PAS; $(PASCAL)/NOOBJECT/ENVIRONMENT=$(MMS$TARGET) $(MMS$SOURCE)0BOOK$(OBJ) : BOOK.PAS,VTBOOKMENU.PEN,VTBOOK.PEN:BOOKSHELF$(OBJ) : BOOKSHELF.PAS,VTBOOKMENU.PEN,VTBOOK.PENBOOKMSG$(OBJ) : BOOKMSG.MSG%VTBOOK_TABLE$(OBJ) : VTBOOK_TABLE.CLD"VTBOOK_HELP.HLP : VTBOOK_HELP.SDML)*[HUNTER.FILESERV.VTBOOK.A]KITINSTAL.COM;1+,I*.6/ 4i65N-) 0123KPWO656Hse7[ue89GHJ$!D$! ****************************************************************$!.$! Copyright (c) 1993, Hottentot Software$!$! All Rights Reserved$!C$! Permission is hereby granted to use, copy, modify, andC$! distribute this software provided that the above copyrightC$! notice appears in all copies and that any distribution be for$! noncommercial purposes.$!C$! The above copyright holder disclaims all warranties with regardC$! to this software. In no event shall the above copyright holderC$! be liable for any special, indirect, or consequential damagesC$! or any damages whatsoever resulting from loss of use, data, orC$! profits arising out of or in connection with the use or!$! performance of this software.$!D$! ****************************************************************$!$!++ $! Kitinstal.Com for VTBOOK V1.4$!$! Description:$!;$! VMS SYS$UPDATE:VMSINSTAL installation command procedure$! for VTBOOK.$!3$! Written By: Bret D. Wortman, 4-NOV-1993, V1.1b1$!$! Modifications:$!$! V1.3 BDW 21-NOV-1993,$! Removed maximum VMS version restriction.$!$! V1.2 HG 18-NOV-1993 13:49$! Updated for VTBOOK V1.2.$!$! V1.1b3 BDW 11-NOV-1993F$! Added sensitivity to V1.1b3, command proc to remove CLD if foreignI$! command is now desired. Fixed directory protections to (g:re,w:re).B$! Enhanced help install for multiple libraries. Reduced from 4$! savesets to 2.$!$! v1.1b2 BDW 9-NOV-1993H$! Added "standalone sensitivity", changed compiles to place objects inL$! temporary files until completion, switched to production compile quals,L$! removed foreign symbol ability, fixed .CLD file provision logic/SRC dirN$! creation logic, changed some messages, fixed .HLP file provision, changedI$! all "Y" default answers to "YES", "N" to "NO" for compatibility with$! SET PURGE ASK.$!$!--$ OLD_VERIFY = 'F$VERIFY(P2)'$!%$ axp == f$getsyi("HW_MODEL").ge.1024$ TRUE == 1$ FALSE == 00$ VTBOOK_SPEC == "SYS$SYSDEVICE:[VTBOOK.]"$ VTB_DO_HELP == 1$ VTB_DO_CLD == 1$ VTB_FOREIGN_CMD == 0$ VTB_COMPILE == 1$ VTB_USE_EXE == 0$ VTB_SRC == 1$ VTB_DOC == 17$ VTB_CLUS_DETECTED == f$getsyi("cluster_member")6$ VTB_CLUS_STARTUP == f$getsyi("cluster_member")!$ VTBOOK_PEAK_USAGE == 2304M$ VTB_PREV_VERS == f$edit(f$trnlnm("VTBOOK_VERSION"),"COLLAPSE,UPCASE");$ VTB_SRC_EXISTS == (f$trnlnm("VTBOOK_SRC") .nes. "");$ VTB_DOC_EXISTS == (f$trnlnm("VTBOOK_DOC") .nes. "")<$ VTB_UPGRADE == (f$trnlnm("VTBOOK_VERSION") .nes. "").$ VTB_PREV_SRC == f$trnlnm("VTBOOK_SRC").$ VTB_PREV_DOC == f$trnlnm("VTBOOK_DOC")$ VTB_HELP_LIB == ""$!$! set up error handling$!,$ on CONTROL_Y then VMI$CALLBACK CONTROL_Y&$ on WARNING then goto ERROR_HANDLER$!:$! interpret VMSINSTAL request: we only do IVP and INSTALL$!:$ if p1 .eqs. "VMI$_INSTALL" then goto VTB_INSTALLATION,$ if p1 .eqs. "VMI$_IVP" then goto VTB_IVP$ exit VMI$_UNSUPPORTED$!$!$ VTB_INSTALLATION:$!-$ if axp then goto VTB_KIT_V5 !Any AXP is OK$$! Handle Specific VMS Version stuff-$ VMI$CALLBACK CHECK_VMS_VERSION kit$ 5.0 "" $ if kit$ then goto VTB_KIT_V5J$ VMI$CALLBACK MESSAGE S BADVERS "Bad VMS Version" "Must be at least V5.0"$ EXIT VMI$_FAILURE $ VTB_KIT_V5:$!5$! Make sure there is sufficient disk space available$!B$ VMI$CALLBACK CHECK_NET_UTILIZATION VTB_size$ 'VTBOOK_PEAK_USAGE':$ if .not. VTB_size$ then VMI$CALLBACK MESSAGE E NOSPACE -A"The system disk does not have ''VTBOOK_PEAK_USAGE' blocks free."+$ if .not. VTB_size$ then exit VMI$_FAILURE$!$!$! Tell user what we are doing$!$ type sys$inputVTBOOK Version V1.49(Obligatory Lawyerese follows -- snooze at your leisure.)D ****************************************************************9 Original Version Copyright (c) 1992, Chris Sharman> DECUS Version Copyright (c) 1993, Hottentot Software All Rights ReservedC Permission is hereby granted to use, copy, modify, andC distribute this software provided that the above copyrightC notice appears in all copies and that any distribution be for noncommercial purposes.C The above copyright holder disclaims all warranties with regardC to this software. In no event shall the above copyright holderC be liable for any special, indirect, or consequential damagesC or any damages whatsoever resulting from loss of use, data, orC profits arising out of or in connection with the use or! performance of this software.D ****************************************************************$!-$! Wait for User to acknowledge the copyright$!I$ read/prompt="Press RETURN to continue " sys$command VTBOOK_temporary_cr$!$! Check for previous version$!:$ VTBOOK_SPEC == F$PARSE ("VTBOOK_LOC",,,,"NO_CONCEAL")!$ IF "''VTBOOK_SPEC'" .EQS. ""2$ THEN VTBOOK_SPEC == "SYS$SYSDEVICE:[VTBOOK.]" $ ELSEE$ VTBOOK_SPEC == F$PARSE ("VTBOOK_LOC",,,"DEVICE","NO_CONCEAL")+-@ F$PARSE ("VTBOOK_LOC",,,"DIRECTORY","NO_CONCEAL")-- "]" + ".]" $ ENDIF$!H$! Ask if the user wants a default installation and tell them what it'll$! give them and where...$!$ type sys$input: Fast Installation -----------------F Having been through all too many of these ourselves, the VTBOOK teamG has decided to give you the option of making this installation really easy.G You can, at this time, elect a standard VTBOOK installation, or electJ to change these parameters as you wish. If you want a standard install, you get:) DCL HELP files installed in SYS$HELP.? DCL command inserted into SYS$COMMON:[SYSLIB]DCLTABLES.EXE.G Compilation from sources if you have Pascal available on this node.F Re-linking of provided .OBJs if you don't have Pascal, or from the( .OBJs created in the above step.$ write sys$output -D" The VTBOOK directory tree will be created under ''VTBOOK_SPEC'"$ if VTB_CLUS_STARTUP$ then$ write sys$output -H" The cluster-wide startup procedure will be run after installation."$ else$ write sys$output -;" The startup procedure will be run after installation."$ endif$ write sys$output -9" The IVP will run to test installation on this node."'$ if (VTB_DOC_EXISTS .and. VTB_UPGRADE)$ then wriȺ$ VTBOOK014.AI*) )[HUNTER.FILESERV.VTBOOK.A]KITINSTAL.COM;1i6:"te sys$output -B" Documentation will be provided in ''f$trnlnm("VTBOOK_DOC")'."$ else$ if .not. VTB_UPGRADE$ then write sys$output -C" Documentation will be provided in SYS$SYSDEVICE:[VTBOOK.DOC]." $ else$ write sys$output -)" Documentation will not be provided." $ endif$ endif'$ if (VTB_SRC_EXISTS .and. VTB_UPGRADE)$ then write sys$output -<" Sources will be provided in ''f$trnlnm("VTBOOK_SRC")'."$ else$ if .not. VTB_UPGRADE$ then write sys$output -=" Sources will be provided in SYS$SYSDEVICE:[VTBOOK.SRC]." $ else$ write sys$output -#" Sources will not be provided." $ endif$ endif$ type sys$input:6 Files replaced by the installation will be purged.J$ VMI$CALLBACK ASK VTB_CUSTOM "Do you want to answer a lot of questions" -? YES AB "If you answer NO, you will get the standard setup"$!B$! Ask user whether old copies of installed files should be purged$!$ if VTB_CUSTOM$ then$ type sys$input: Don't trust us, eh?$ VMI$CALLBACK SET PURGE ASK$ goto _ask_root$ else$ VMI$CALLBACK SET PURGE YES$ goto _skip_it_all$ endif$!4$! Get DEVICE or rooted logical to install VTBOOK on$! $_ask_root:$ type sys$input: Directory Specification -----------------------F VTBOOK will create several directories as part of this installation,F if they are required. You must define a rooted directory that these directories will fall under. $ VMI$CALLBACK ASK VTBOOK_SPEC -J "Where should the VTBOOK top directory be located" "''VTBOOK_SPEC'" S -? "Where do you want the files? What disk or rooted logical?"($ VTBOOK_TMP == VTBOOK_SPEC - ".]" + "]":$ if f$length(f$parse(VTBOOK_TMP,,,,"SYNTAX_ONLY")) .eq. 0$ thenS$ VMI$CALLBACK MESSAGE W BADSPEC "The specification ''VTBOOK_SPEC' is invalid" -2 "Please provide on of the form ROOT:[VTBOOK.]"$ goto _ask_root$ endif#$ VTBOOK_SPEC == VTBOOK_SPEC - ".]"$!$! Run the IVP?$!$ VMI$CALLBACK SET IVP ASK H$!"$! Ask if they want help installed$!M$ VMI$CALLBACK ASK VTB_DO_HELP "Do you want the help files installed" YES B -V "This will insert help text for use by DCL's HELP command into a selected library"$ if VTB_DO_HELP$ then$ type sys$input:F Help files may be provided into one or more libraries. Some of them are:# SYS$SYSROOT:[SYSHLP]HELPLIB.HLBA$ if f$trnlnm("HLP$LIBRARY","LNM$SYSTEM_TABLE").nes."" then -H write sys$output " ''f$trnlnm("HLP$LIBRARY","LNM$SYSTEM_TABLE")'"C$ if f$trnlnm("HLP$LIBRARY_1","LNM$SYSTEM_TABLE").nes."" then -J write sys$output " ''f$trnlnm("HLP$LIBRARY_1","LNM$SYSTEM_TABLE")'"C$ if f$trnlnm("HLP$LIBRARY_2","LNM$SYSTEM_TABLE").nes."" then -J write sys$output " ''f$trnlnm("HLP$LIBRARY_2","LNM$SYSTEM_TABLE")'"C$ if f$trnlnm("HLP$LIBRARY_3","LNM$SYSTEM_TABLE").nes."" then -J write sys$output " ''f$trnlnm("HLP$LIBRARY_3","LNM$SYSTEM_TABLE")'"$ write sys$output ""a$ IF VTB_DO_HELP then VMI$CALLBACK ASK VTB_HELP_LIB "Which library should have VTBOOK help" -) "SYS$SYSROOT:[SYSHLP]HELPLIB.HLB"$ else$ VTB_HELP_LIB == ""$ endif$!$! CLI provided?$!$ type sys$input: Invocation ----------" VTBOOK can be run in three ways:K 1. The command language definition can be inserted into DCLTABLES.EXE.J This will result in the command being accessible to all nodes that* share DCLTABLES.EXE with this one.$ write sys$output -P" 2. The command language definition can be provided in ''VTBOOK_SPEC'.SRC]"$ type sys$input:I but not inserted into DCLTABLES.EXE. It can be manually inserted* by you later by using the command:C $ SET COMMMAND/TABLE=SYS$COMMON:[SYSLIB]DCLTABLES.EXE -M _$ /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES.EXE VTBOOK_SRC:VTBOOK.CLDI 3. The command may be executed as a foreign command. A line similarJ to the following may be placed in SYLOGIN.COM or the LOGIN.COMs of. those users who need access to VTBOOK.$ VMI$CALLBACK ASK VTB_DO_CLD -D "Do you want the command inserted into your DCLTABLES.EXE" YES B=$ if .not. VTB_DO_CLD THEN VMI$CALLBACK ASK VTB_FOREIGN_CMD -: "Will you be running VTBOOK as a foreign command" NO B$!$! Use the provided .EXE?$!$ if axp$ then type sys$input$ OpenVMS AXP version of VTBOOK V1.4$ ----------------------------------B As of VTBOOK V1.4, the DEC Pascal compiler has not been releasedC for OpenVMS AXP. However, a VESTed version of the VAX executable* has been provided and will be installed.$ VTB_USE_EXE == 1$ goto _skip_comp$ endif$ type sys$input: Optional Compile from Sources -----------------------------J VTBOOK comes precompiled and linked. We suggest recompiling the sourcesF if possible so we can all feel better about security and VMS versionH compatibility. If you don't have a Pascal compiler, at least LINK theC provided .OBJs. We're not malicious, but this *is* the nineties.C$ VMI$CALLBACK ASK VTB_USE_EXE "Use the provided executable" NO B -U "If you answer No here and don't have Pascal or choose not to use it, we'll LINK"$!$! Compile from sources?$!%$ if VTB_USE_EXE then goto _skip_compD$ if f$search("SYS$SYSTEM:PASCAL.EXE") .eqs. "" then goto _skip_comp$ type sys$input:! Looking for Pascal compiler....I You may safely ignore any %LICENSE-F- or %LICENSE-I- errors that occur. $ set noon"$ define/nol vtbook vmi$kwd:vtbook*$ define/nol vtbookmenu vmi$kwd:vtbookmenu($ define/nol bookshelf vmi$kwd:bookshelf$ define/nol book vmi$kwd:book$$ define/nol bookmsg vmi$kwd:bookmsg*$ pascal/nolist/nocheck/nodebug/noobject - VMI$KWD:pas_test.PAS$ VTB_COMP_STAT == $STATUS$ deass vtbook$ deass vtbookmenu$ deass bookshelf $ deass book$ deass bookmsg$ set on$ if .not. vtb_comp_stat$ then$ VTB_COMPILE == 0$ type sys$input:@ Either your compiler is not licensed on this node or is unable? to compile the VTBOOK sources. If you elected not to use the@ provided executable, the provided .OBJs will be linked to form your VTBOOK image.$ goto _skip_comp$ endif$ type sys$input:E VMSINSTAL has detected a Pascal compiler. You may recompile VTBOOKI directly from its sources. NOTE: Pascal V4.4 is the minimum supported version for compilation.C$ VMI$CALLBACK ASK VTB_COMPILE "Compile VTBOOK from sources" YES BU$! $_skip_comp:$!H$! Install the sources? Default to NO if this is an upgrade and there's#$! no sources currently installed.$!:$ if VTB_COMPILE .or. (VTB_SRC_EXISTS .and. VTB_UPGRADE) - .or. (.not. VTB_UPGRADE)$ thenE$ VMI$CALLBACK ASK VTB_SRC "Install the Pascal source files" YES B$ elseD$ VMI$CALLBACK ASK VTB_SRC "Install the Pascal source files" NO B$ endif$!E$! Install the docs? Default to NO if this is an upgrade and there's!$! no docs currently installed.$!@$ if (VTB_DOC_EXISTS .and. VTB_UPGRADE) .or. (.not. VTB_UPGRADE)$ then@$ VMI$CALLBACK ASK VTB_DOC "Install the documentation" YES B$ else?$ VMI$CALLBACK ASK VTB_DOC "Install the documentation" NO B$ endif$!$ if VTB_CLUS_STARTUP$ then$ type sys$input: Optional Cluster-wide Startup -----------------------------E VTBOOK comes with a cluster-wide startup procedure that may be usedF at the end of this installation to make VTBOOK immediately availableI on all nodes in the cluster. This procedure will use SYSMAN to installE the newly modified DCLTABLES.EXE if you chose to install the VTBOOK/ command, and will set up all VTBOOK logicals.H Users will still need to log out and back in to get the new DCLTABLES.i$ VMI$CALLBACK ASK VTB_CLUS_STARTUP "Do you wish VMSINSTAL to perform the cluster-wide startup" YES B$ endif$!$_skip_it_all:$!5$! That's everything we need to know, so let's do it!$!$ type sys$input:H************************************************************************, No further questions will be asked of you.4 $ SET TERM/COFFEE_BREAK (go ahead, you earned it!)H************************************************************************$!$!#$! Create the VTBOOK home directory$!#$ VTBOOK_SPEC == VTBOOK_SPEC - ".]"5$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'] -; "/OWNER_UIC=[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)""$ ASSIGN 'VTBOOK_SPEC'] VTBOOK_DIR9$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'.EXE] -; "/OWNER_UIC=$ VTBOOK014.AI*) )[HUNTER.FILESERV.VTBOOK.A]KITINSTAL.COM;1i6"[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)"?$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'.ALPHA_EXE] -; "/OWNER_UIC=[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)"$ if axp1$ then ASSIGN 'VTBOOK_SPEC'.ALPHA_EXE] VTBOOK_EXE,$ else ASSIGN 'VTBOOK_SPEC'.EXE] VTBOOK_EXE$ endif9$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'.OBJ] -; "/OWNER_UIC=[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)"&$ ASSIGN 'VTBOOK_SPEC'.OBJ] VTBOOK_OBJ$!$! Compile if requested$! $ set noon($ if VTB_USE_EXE then goto _skip_compile$ if VTB_COMPILE$ thenI$ VMI$CALLBACK GET_IMAGE_ID PASCAL_VERSION VMI$ROOT:[SYSEXE]PASCAL.EXEN$ PASCAL_VERSION = F$EXTRACT(F$LOCATE("V",PASCAL_VERSION),4,PASCAL_VERSION):$ if PASCAL_VERSION .LTS. "V4.4" then goto _low_version$ type sys$input: Compiling sources....B$ message/nolist/object=VMI$KWD:BOOKMSG.OBJ VMI$KWD:BOOKMSG.MSGI$ set command/object=VMI$KWD:VTBOOK_TABLE.OBJ VMI$KWD:VTBOOK_TABLE.CLD%$ define/nol vtbook vmi$kwd:vtbook-$ define/nol vtbookmenu vmi$kwd:vtbookmenu*+$ define/nol bookshelf vmi$kwd:bookshelfo!$ define/nol book vmi$kwd:booke'$ define/nol bookmsg vmi$kwd:bookmsg!?$ define/nol vtbook_cli_routines vmi$kwd:vtbook_cli_routines$ say " VTBOOK.PAS"r*$ pascal/nodebug/nolist/nocheck/nodiag-+ /object=VMI$KWD:VTBOOK.VTB_TMPOBJ - ) /environment=VMI$KWD:VTBOOK.PEN -p VMI$KWD:VTBOOK.PAS,$ if .not. $STATUS then goto _bad_compile$ say " VTBOOKMENU.PAS" +$ pascal/nodebug/nolist/nocheck/nodiag -!/ /object=VMI$KWD:VTBOOKMENU.VTB_TMPOBJ -q- /environment=VMI$KWD:VTBOOKMENU.PEN -  VMI$KWD:VTBOOKMENU.PAS,$ if .not. $STATUS then goto _bad_compile$ say " BOOK.PAS"o+$ pascal/nodebug/nolist/nocheck/nodiag -!) /object=VMI$KWD:BOOK.VTB_TMPOBJ -* VMI$KWD:BOOK.PAS,$ if .not. $STATUS then goto _bad_compile$ say " BOOKSHELF.PAS"+$ pascal/nodebug/nolist/nocheck/nodiag -d. /object=VMI$KWD:BOOKSHELF.VTB_TMPOBJ - VMI$KWD:BOOKSHELF.PAS,$ if .not. $STATUS then goto _bad_compile $ set on8$ rename VMI$KWD:VTBOOK.VTB_TMPOBJ VMI$KWD:VTBOOK.OBJ@$ rename VMI$KWD:VTBOOKMENU.VTB_TMPOBJ VMI$KWD:VTBOOKMENU.OBJ4$ rename VMI$KWD:BOOK.VTB_TMPOBJ VMI$KWD:BOOK.OBJ>$ rename VMI$KWD:BOOKSHELF.VTB_TMPOBJ VMI$KWD:BOOKSHELF.OBJ$ endifi $ goto _link$!$_low_version:F$ VMI$CALLBACK MESSAGE W OLDCOMPILER "Compiler is earlier than V4.4" - "Using provided .OBJs" $ goto _link$!$_bad_compile:$ set on$ type sys$input:tG *********************************************************************tJ An error occurred while attempting to compile one of the source modules.$ Verify that your compiler is V4.4.2 Installation will complete using existing .OBJs.F You may safely ignore any File Not Found or NOFILE errors which may/ follow before the %VTBOOK-I-CONTINUE message.AG *********************************************************************O $ set noon/$ VMI$CALLBACK DELETE_FILE VMI$KWD:*.VTB_TMPOBJ $ set onP$ VMI$CALLBACK MESSAGE I CONTINUE "The installation procedure is continuing...."$!$! LINK it....$!$_link: $ type sys$input:= Linking objects....=-$ link/notrace/nomap/exe=VMI$KWD:VTBOOK.EXE -  VMI$KWD:VTBOOK.OBJ, -t! VMI$KWD:VTBOOKMENU.OBJ, -_ VMI$KWD:BOOK.OBJ, -s VMI$KWD:BOOKSHELF.OBJ, - VMI$KWD:BOOKMSG.OBJ, - VMI$KWD:VTBOOK_TABLE.OBJ&$ if .not. $STATUS then goto _bad_link$ SET ON@$ VMI$CALLBACK PROVIDE_IMAGE VTBOOK_IMAGE VTBOOK.EXE VTBOOK_EXE:$ goto _ancillary_files $! $_bad_link: $ SET ON$ type sys$inputG *********************************************************************I LINK failed to complete successfully. Installation will continue using! precompiled image.G ********************************************************************* P$ VMI$CALLBACK MESSAGE I CONTINUE "The installation procedure is continuing...."$_skip_compile:s$ if axp:$ then rename vmi$kwd:vtbook.alpha_exe vmi$kwd:vtbook.exe;$ purge vmi$kwd:vtbook.exeI$ endifR@$ VMI$CALLBACK PROVIDE_IMAGE VTBOOK_IMAGE VTBOOK.EXE VTBOOK_EXE:$_ancillary_files:$!$! Create the startup filess$!/$ open/append outfil VMI$KWD:VTBOOK_STARTUP.COMS$ write outfil "$ define/sys/exec vtbook_root ''VTBOOK_SPEC'.]/translation=conceal"u=$ write outfil "$ define/sys/exec vtbook_loc ''VTBOOK_SPEC']":$ write outfil "$ define/sys/exec vtbook_version ""V1.4"""?$ write outfil "$ define/sys/exec vtbook_obj vtbook_root:[obj]"'D$ write outfil "$ if f$getsyi("""HW_MODEL""").ge.1024 !It's an AXP"J$ write outfil "$ then define/sys/exec vtbook_exe vtbook_root:[alpha_exe]"D$ write outfil "$ else define/sys/exec vtbook_exe vtbook_root:[exe]"$ write outfil "$ endif" $ if VTB_DOC$ thenB$ write outfil "$ define/sys/exec vtbook_doc vtbook_root:[doc]"$ elseC$ write outfil "$! define/sys/exec vtbook_doc vtbook_root:[doc]"l$ endif @$ if VTB_SRC .or. (.not. VTB_DO_CLD .and. .not. VTB_FOREIGN_CMD)$ thenB$ write outfil "$ define/sys/exec vtbook_src vtbook_root:[src]"$ elseC$ write outfil "$! define/sys/exec vtbook_src vtbook_root:[src]"e$ endiff$ write outfil "$ exit" $ close outfil/$ purge/noconf/nolog VMI$KWD:VTBOOK_STARTUP.COMn$!5$! Copy the other needed files into their directories $!/$ VMI$CALLBACK PROVIDE_FILE "" VTBKITA.DAT "" Ti$!F$! Create SRC dir if Pascal source is to be provided *or* CLD is *not*&$! to be installed by this procedure.$!@$ if VTB_SRC .or. (.not. VTB_DO_CLD .and. .not. VTB_FOREIGN_CMD)$ then<$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'.SRC] -@ "/OWNER_UIC=[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)")$ ASSIGN 'VTBOOK_SPEC'.SRC] VTBOOK_SRC*2$ VMI$CALLBACK PROVIDE_FILE "" VTBKITB.DAT "" T$ endifc$!$! Do the docs, if requested:d $ if VTB_DOC$ then<$ VMI$CALLBACK CREATE_DIRECTORY USER 'VTBOOK_SPEC'.DOC] -? "/OWNER_UIC=[1,4]/PROTECTION=(S:RWED,O:RWED,G:RE,W:RE)"C)$ ASSIGN 'VTBOOK_SPEC'.DOC] VTBOOK_DOC"#$ VMI$CALLBACK RESTORE_SAVESET B"2$ VMI$CALLBACK PROVIDE_FILE "" VTBKITC.DAT "" T$ endifP$!!$! Install HELP file if requestedA$!$ if VTB_DO_HELP$ then$ if VTB_HELP_LIB .eqs. ""C $ then6$ VMI$CALLBACK PROVIDE_DCL_HELP VTBOOK_HELP.HLP $ elsew@$ VMI$CALLBACK UPDATE_LIBRARY VTB_ 'VTB_HELP_LIB' HELP -/ "/REPLACE" VMI$KWD:VTBOOK_HELP.HLPI $ endif$ endif-$!#$! Install the command if requestedo$!@$ if VTB_DO_CLD then VMI$CALLBACK PROVIDE_DCL_COMMAND VTBOOK.CLD$!E$! Provide sources for HELP or CLI, depending on which were selected.h$!$ if VTB_SRC .and. VTB_DO_HELP$ then%$ VMI$CALLBACK MESSAGE I HELPSRC -e< "Providing VTBOOK_HELP.HLP in VTBOOK_SRC directory"I$ VMI$CALLBACK PROVIDE_FILE VTB_VTBOOK_HLP VTBOOK_HELP.HLP VTBOOK_SRC: $ endifN$!J$! Only provide the CLD file if they did *not* select to have it inserted.$!@$ if VTB_SRC .or. (.not. VTB_DO_CLD .and. .not. VTB_FOREIGN_CMD)$ then$$ VMI$CALLBACK MESSAGE I CLDSRC -7 "Providing VTBOOK.CLD in VTBOOK_SRC directory" D$ VMI$CALLBACK PROVIDE_FILE VTB_VTBOOK_CLD VTBOOK.CLD VTBOOK_SRC:$ endif $!$!$! Final completion messages$!$ type sys$input:  Postinstallation Tasks ----------------------D$ if VTB_DO_CLD .and. .not. VTB_CLUS_STARTUP .and. VTB_CLUS_DETECTED$ then$ type sys$input:tL After this procedure completes, you will need to update your DCLTABLES.EXE3 on all nodes by executing the following commands:s $ MCR SYSMAN# SYSMAN> SET ENVIRONMENT/CLUSTERt8 SYSMAN> DO INSTALL REPLACE SYS$LIBRARY:DCLTABLES.EXEG All currently logged-in users will need to log out and back in to getS the new DCLTABLES.$ endif $ type sys$input:tJ You will need to ensure the following line appears in your site-specificE startup procedure if you want VTBOOK to function after each reboot:u% $ @SYS$STARTUP:VTBOOK_STARTUP.COMfM You will also need to execute this command on all other nodes before VTBOOKs will be operational on them.A The VTBOOK IVP may be run at any time by executing the command:t $ @SYS$TEST:VTBOOK_IVP.COMG$ if (VTB_PREV_VERS .eqs. "V1.1B1" .or. VTB_PREV_VERS .eqs. "V1.1B2") -e .and. VTB_FOREIGN_CMD$ then$ type sys$input:P********************************************************************************P* IMPORTANT NOTE FOR FOREIGN COMMAND USERS UPGRADING FROM V1.1b2 *P* du$ VTBOOK014.AI*) )[HUNTER.FILESERV.VTBOOK.A]KITINSTAL.COM;1i6q 0 *P* To make the transition from our "CLD required" beta-2 test version to this *P* foreign command-friendly version easier, we have provided the file *P* VTBOOK_LOC:REMOVE_VTBOOK_COMMAND.COM. This procedure will delete the *P* VTBOOK command definition from SYS$COMMON:[SYSLIB]DCLTABLES.EXE and then *P* reinstall the new versions. *P* *P* This is a template procedure only and is not intended to be run "as is". *P* You should make any modifications necessary for your site and familiarize *P* yourself with its operation before using it. *P********************************************************************************L$ read/prompt="Press RETURN to continue " sys$command VTBOOK_temporary_crB$ VMI$CALLBACK PROVIDE_FILE REM_CLD REMOVE_VTBOOK_COMMAND.COM - VTBOOK_LOC:$ endifR$!"$! Common exit routine for success$!$ if VTB_CLUS_STARTUPw$ then@$ VTB_STARTUP_PARAM = (VTB_FOREIGN_CMD .or. .not. VTB_DO_CLD)L$ VMI$CALLBACK SET STARTUP VTBOOK_CLUSTER_STARTUP.COM 'VTB_STARTUP_PARAM'$ else0$ VMI$CALLBACK SET STARTUP VTBOOK_STARTUP.COM$ endif $ GOOD_EXIT:$!,$! Exit to VMSINSTAL saying everything is ok$!'$ OLD_VERIFY = 'F$VERIFY(OLD_VERIFY)' $ EXIT VMI$_SUCCESS$!$!$! Error handling routineA$!$ ERROR_HANDLER:$!$! What failed? $!$!$! INSTALLATION failure"$ INSTALLATION_FAILED:$!$ type sys$inputG *********************************************************************u VTBOOK installation failed."> [Here comes the highly informative instructional message:]I Please examine all errors generated by this procedure and, if you are_H unable to rectify the situation (and even if you are) please contact3 the VTBOOK maintenance team on the Internet at:r wortman@eisner.decus.orgTG *********************************************************************KI$ read/prompt="Press RETURN to continue " sys$command VTBOOK_temporary_crS$!$ goto ERROR_EXIT$!'$! report failure to VMSINSTAL and exit$! $ ERROR_EXIT:?$!%$ OLD_VERIFY = 'F$VERIFY(OLD_VERIFY)' $ EXIT VMI$_FAILURE$!$! Handle the IVP, if requestedo$! $ VTB_IVP:$!$! Initialize error handling$!,$ on CONTROL_Y then VMI$CALLBACK CONTROL_Y&$ on WARNING then goto ERROR_HANDLER$!$@SYS$TEST:VTBOOK_IVP.COMh$!%$ OLD_VERIFY = 'F$VERIFY(OLD_VERIFY)'T$!$! End of the IVP!$!$ exit VMI$_SUCCESS VTBOOK_SPEC'.SRC]"$ type sys$input:I but not inserted into DCLTABLES.EXE. It can be manually inserted* by you later by using the command:C $ SET COMMMAND/TABLE=SYS$COMMON:[SYSLIB]DCLTABLES.EXE -M _$ /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES.EXE VTBOOK_SRC:VTBOOK.CLDI 3. The command may be executed as a foreign command. A line similarJ to the following may be placed in (*[HUNTER.FILESERV.VTBOOK.A]PAS_TEST.PAS;1+,*./ 4P -) 0123KPWO56Od7 O/6e8 _9GHJ[ CHECK(NONE) ]PROGRAM pas_test; {+COMPONENT: Pascal Test Module PROGRAM DESCRIPTION:J Test program for VTBOOK install, used to verify existence of licensed  pascal compiler. AUTHORS:  Bret D. Wortman CREATION DATE: 8-NOV-1993 DESIGN ISSUES: VERSION:  V1.1 MODIFICATION HISTORY: % Date | Name | DescriptionP--------------+---------+-------------------------------------------------------8 08-NOV-1993 | BDW | Original Version, VTBOOK V1.1P--------------+---------+-------------------------------------------------------%[change_entry]%-} VAR( temp1,temp2,temp3 : INTEGER VALUE 0; BEGIN temp1 := 15; temp2 := 25; temp3 := temp1 + temp2;END.5*[HUNTER.FILESERV.VTBOOK.A]REMOVE_VTBOOK_COMMAND.COM;1+,* ./ 4R-) 0123KPWO5n6Od7`R/6e8`_9GHJ$!$! REMOVE_VTBOOK_COMMAND.COM$!'$! V1.1b3, Bret D. Wortman, 11-NOV-1993$!K$! A template procedure for removing the VTBOOK command from DCLTABLES.EXEO$! should a site with to change to foreign command invocation after installing/$! V1.1b2, which required the CLD to function.$!M$! This is a template procedure only, and is not intended to be run "as is".$!$!$ say := write sys$output:$ if f$search("sys$common:[syslib]dcltables.exe") .eqs. ""$ thenR$ say "%VTBOOK-F-NOTFOUND, SYS$COMMON:[SYSLIB]DCLTABLES.EXE could not be found" $ exit$ endif$ set command/delete=VTBOOK -. /tables=SYS$COMMON:[SYSLIB]DCLTABLES.EXE -, /output=SYS$COMMON:[SYSLIB]DCLTABLES.EXE$ if .not. $status$ thenM$ say "%VTBOOK-F-BADDEL, Error occurred during deletion of VTBOOK command" $ exit$ endif $ mcr sysman set env/cluster5 do install replace sys$common:[syslib]dcltables.exe exit$ exit'*[HUNTER.FILESERV.VTBOOK.A]VTBKITA.DAT;1+, *./ 4E-) 0123KPWO5(6Od7@QW/6e8@_9GHJ! PROVIDE_FILE data!9! This list should contain all files required by VTBOOK.!! HG 18-NOV-1993 V1.2! BDW 4-NOV-1993 V1.1! ! Format is:(! logical filename destination [options]!/VTB_BOOK_OBJ BOOK.OBJ VTBOOK_OBJ:/VTB_BOOKMSG_OBJ BOOKMSG.OBJ VTBOOK_OBJ:/VTB_BOOKSHELF_OBJ BOOKSHELF.OBJ VTBOOK_OBJ:/VTB_VTBOOK_OBJ VTBOOK.OBJ VTBOOK_OBJ:/VTB_VTBOOKMENU_OBJ VTBOOKMENU.OBJ VTBOOK_OBJ:6VTB_VTBOOK_IVP_COM VTBOOK_IVP.COM VMI$ROOT:[SYSTEST]BVTB_VTBOOK_STARTUP_COM VTBOOK_STARTUP.COM VMI$ROOT:[SYS$STARTUP]EVTB_CLUSTER_STARTUP VTBOOK_CLUSTER_STARTUP.COM VMI$ROOT:[SYS$STARTUP]/VTB_VTBOOK_TABLE VTBOOK_TABLE.OBJ VTBOOK_OBJ:'*[HUNTER.FILESERV.VTBOOK.A]VTBKITB.DAT;1+,-*./ 4?J-) 0123KPWO5(6Od7 [/6e8 %_9GHJ! PROVIDE_FILE data!9! This list should contain all files required by VTBOOK.!! HG 18-NOV-1993 V1.2! BDW 4-NOV-1993 V1.1! ! Format is:(! logical filename destination [options]!/VTB_BOOK_PAS BOOK.PAS VTBOOK_SRC:/VTB_BOOKMSG_MSG BOOKMSG.MSG VTBOOK_SRC:/VTB_BOOKSHELF_PAS BOOKSHELF.PAS VTBOOK_SRC:/VTB_VTBOOK_PAS VTBOOK.PAS VTBOOK_SRC:/VTB_VTBOOK_PEN VTBOOK.PEN VTBOOK_SRC:/VTB_VTBOOKMENU_PAS VTBOOKMENU.PAS VTBOOK_SRC:/VTB_VTBOOKMENU_PEN VTBOOKMENU.PEN VTBOOK_SRC:?VTB_VTBOOK_CLI_ROUTINES_PAS VTBOOK_CLI_ROUTINES.PAS VTBOOK_SRC:?VTB_VTBOOK_CLI_ROUTINES_PEN VTBOOK_CLI_ROUTINES.PEN VTBOOK_SRC:/DESCRIP_MMS DESCRIP.MMS VTBOOK_SRC:1VTB_VTBOOK_TABLE_CLD VTBOOK_TABLE.CLD VTBOOK_SRC:1VTB_VTBOOK_HELP_SDML VTBOOK_HELP.SDML VTBOOK_SRC:,*[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1+,)./ 4-) 0123KPWO56f.e7ce89GHJ@$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1",h 25e0!#.e VTBOOK_TVV1.4V1.1$ $$ $s$ $u$v i$ J6 LIBRTL_TV_0016 g PASRTL_TV_0016f SMGSHR_TV_0016 TIE$SHARE_001 x VTBO ,(@T VTBOOK$DEBUG z DECW$BOOK: '\ uDP,$ -SYS$COMMAND Broadcast Message Type LOGOUT to return to VTBOOKKey(s) Function------ --------=CTRL-Z, F10 Close active window and retreat one level'Left/Right arrow Previous/Next Topic/Prev/Next (book) Scroll backward and forward/KP7, KP8 Scroll backward and forwardReturn (book) Screen down0Prev/Next (menu) Advance/back up menu choices-Up/Down arrow Move up and down one line3Find, KP3 (book) Move to and select next hotspot+Find, KP3 (menu) Begin title search mode7Select (book), KP Go to the selected hotspot location=CTRL-B Back - return to previous topic or screen:Do, Return Select and open the highlighted choice"CTRL-R, CTRL-W Refresh screenCTRL-E Exit VTBOOK*CTRL-D Spawn a DCL subprocess%Help, ? Display this help VTBOOK Help DECW$BOOKSHELFLNM$DCL_LOGICALLIBRARYLNM$DCL_LOGICALErrorDEBUGVTBOOK DEBUGSYS$COMMANDSYS$COMMANDdecw$bookshelf:.decw$bookshelflibrarydecw$bookshelf:library.decw$bookshelfdecw$book:.decw$bookshelflibrary^^P\ ^;PRЏ% 0PR+PS"wT^P8^ԭm^\\^~(nn% ^^PP1Џ% HP1O`?HJ^4D! &߳.g/C!+|~H<۲؇!2۸H%t1;+IioK`ʵЯ-O$C7/3|A~W5 k6R "o!`֍t+'%_)n ۮ|"NhW&i4kl8SK˧iEH#oi&ETVD[3Mll}g!LO4jK+.-y{̍7‰G c(w.,H7c$;K@e.qY[:۞98$\l)SqL])/YpAܘ\@0*[/DžƤ[w\Z'cv1wmI$$i&`Q+ê*|aaR_.N%)7ʏtFLhe߁#gWSev1]@X@&ن3tWd^8{9Ymۿ!1f8vzgEhޟHV*Gk安g!2(Y0dUh#+{q3aϻ޴Ao<" Gql^l?ǟV(T ߂ɋs^Gqdy8o{^ДKXHEѿ9lngJʏE/jц/!پ@u}x3ҷʾwh|Ujgk1VbҔ%Ft*`d !Ka?{+=פ~3Pe,پ!S܇{nEr; Y: C|!JgJ4 /\hQZhSj_4pQk2Հ`6F9i1:? /u9O,$ -Сi׀s)7Ǵ)ZrAo,(&Dv!6tlk.:j, +9nVPq'TmΔKcFoH \\cEJ(^"^$`_q% }fgrW&<͡ -2 E!T$z$q$ϪjHȧI<. u3c3ZFd@saw㈦LWKM ˉkm]ue =QY,{Cxr dT/3`H]4AN_$Q(8e֧H0C|O1q_pqЊ҆rMaj}W`A\a+&b ?]\HjƦMvm[_Iuqc \Gݬ3ljťI073쪢[kNMPBVZ&1% ,(yJ·7) h= B;cuwEj.C[;AtGu"^1wVhhG/)|-'H/!L(RUcv :[t\{jaW)Zyi>U(v\3d1)gavtrë3Œ5M_'qȘ@@|/+P'1zkSܒg؆f!7GBݘ)iN߀?8o 6*`և@"/ibZY#El@LEk˿G^nrRwmڹ5)+6On, ud&c=-fTGܩsʪz4FLj/ā{p7u @&TRk掊^s\F!q.I Fg9P0F++z4THG>oXͤrk< <) E`DlwDo$M\$"+A @EpQ?4[=6(t<,蘁돳ۖ̆GuY9 Mf~#2 &\u a18MB3&N 8-pNcfh'ۯ ?mB,(54}.h%<P;ܙL2VH8h(G_9q^l@ꇦFɠV'AzUU~J@8gYA4 =a7DA'ie.fE<ܜ(5D-XyeEt:߈aR6O#mJplNmbu%m4MMY/oɕSFhߠ236H7j’xn/ FIW,%N$i5lb){z˰'ې97U ICeTPSWlpN_e~2q9WƙpNS~Og꿨'/ʼnX$m%C+טn;mFObW>JdGkD!2<[GtÇYsG E- }IX˧9Yb&}' },6fNf5"f+ Xb2[Z:y/:_`7"`üMjL;Whuz&I90xC̴'M1=IO.6 r,B}z4K~O'>IMo5ŀBd3ʈ%;\h'i/c9>&ƶ.Pd`Vp"+S<`/}k'L-< qnFbQqDhur~Rf#daW oz+NKWm ;~= b +< !CE+E. XmҰ\+'lN=疒u'6fkΚJoSBhQ[E&R_z>^|dnZ~blL%xCO}f9eZ:fivaHc60w)gyV}6Jm3Gϑ< 2I`v_?:?S I._ F@wKkgVqHAEx˖0F~ nF𽛕ڠ쭁X7uX`ᾏJg*koڰa0ƏmXq,Ľ`Z?*aHF"l1tbb/;b'Zp۱ z%!b4c9txa}RcdߤQʡd83ʘ1/:)4ZynA§" >Kjz߮,bS}0OJS޳FY8ǡtU%ޜiiM+oOou~@$ZZNj$ar^ПՆ{i3 _m|;fر66.9@;0'!: .e^|McWƏ@Lz-3|5kGV-bmYk[@hmZSA^r3bS n~ktL1MeS5a5oϜ.{Nܞqw%W*RΏhFRfWoUF7BK Ξ~zTY.GJz[HГ BgR 5b:/IxG<{M(4pZ<9udπ>A,&ta<4FMd_L"TG`e7l$辳ѕtgҰ 3qWD|uU${< ÿi( Y< ¡!v+Wg;] G9@˦=‚ղoW%ODc{]B]75uɞwie&)) V$9FZ#&#l^1_D԰ί5Npn ]9!tO<ASZi\ fSOd1+$3w@mKc)8XB9JY8/mX'y YX i!FG- -C&g[j{[*#tSh 7hpZw'4Hg~#Ŏ$iȧE;/FBkX;#W7uwiv00\U,?Ǩ>l_Z>r B07P_0Ӏ{u ]_2_RWt]g\A^T(.'UA;mp)ثxת9Bo <`-j*tfȼx Jծ\ g)4Q'|h ġsڼŔ\mQc!s{X$ֹ52B"~.mQV}>lC ^GGHl@Wy "E(y2cnIn60iuv6\wYUd&d\O+7g;"?-U5Ju<$9B1NX4_&hkTFᶠL8QQSGHn"_9Z*0c.Jث:O>˖hD \ʃM2ZL2OlN=(7Be~0ue%B>IN+Έda Pm%\,_i kBJ2*?ownPw ݎ;mmݜ#I^v,/ƖSA)Hg76mK5D2zLfд{U~dH[lzoz@KQ =ӭ!ާh~s&jW<13X:RK4zo\#vגU]C!'F|&Jj}{[2}2r;ܺ01 %+X՟³O`wPՔUӷ}HZփ2k%H%KL6&‰FZ {fpERS +*C}Ip8MlIR_$I1R/T xy[]U`;c\ ?nU%[ 2 93*$H݄ll}nzC'1֐ G6yQj{}gb {,|lJ&,9:՜N& `1X=5:mSc|0l" 2! Rh:QVeMOCBH8|s鴳30~A:QΆ='ҍ=AS ;j*mY)V!MZkEEYkp"0@.-MK Vu~G.50D%5s#7\W5@F7:UfABB,]&߅(c$jG—h"}FL4g^C*^!٦ފ41g%!R%eMwPIӷ24 3b7ER]5`MʡΨlBܝG6)Aa}ŏ Xٮ0R>JhUNhmȿ-ZӢM7HB` vxQnX +=AԷ*5 Y27jk8Bsi3G ,č5H=77)uB_*"i!%_5WBt~["XAlXoWȄ:v}oRq*b b3-':Lٓ;jJ&ӮA }&N38m\;dD?FW%E PGy+ mV3&m@M`EçCŌzWܙ؆(B7TYͩ"oإ=7u/LyU ̵فI;_v}wr{ ^e0[h1踕W@;:X_->q+ff_Dvz.C?ٖk8׌s~.i,kfsefg(~-uVA+ OݚTBsloX[[(V5sHΩ)aSTUU Sm! TPFlWU|vڹtsӫ?\~_ͬ]QgѲpZ"J0ߡNH2Pn z ~5#?OGC@rĤxa<å,}>uX(Ϣ"0.,JX3_KNbA;Ӝ ?Jׁ4T!-` ,|}?U6$Na9_Ch<73#jRބSG!  mܕ|6\!j~"elBTUUJdw2?r0?D:\\~W?㕘 RX~p;!9wi'B:Þ+8q`7in%@h1lR~ρ5bљz kh b0`_ifJ|29d~-PNѡ(.pFw^ڜƙU^)+9.R8 8CK O۲pg0]EV`GHh>ogRܰ3ٙoS}&tOՐxS.Ö͋ԨxvZߎQTT(&NQSa]]99w#cgmeiď.i?f`?9$)/qN%׌xx  Y_2E=Ik{U e#1M_''YFa^py${q.ҷо¤{utav,^ԭxvmЬP` `|(`~}^P(D8(PV}70}6^W~<|PPܞt|\<|PP~ PXXݭXJ\u 18PXX18PXX1o`P--1. nZZ(n<W18}ߏЏ % IP\- - WW-Э XXnA\Ο,nAмRм\\1$iy\nAmAbmA.\Rm}AbmpA\ϟmBA|(^ԭbAmмV( ­^Э\ЭQ^S\(ac\(\ací^\\^ܐpV\Ah1/m@ѭѭݭl@l~^l@l@ݬlj@ l]@.SR,k>bk>Sϟj>(\(V\(1_\1VR\SST1ezTjo>jb>bjU>/TRpj1>b_j$>TϟMj=SFcVSS\\11>e1y\j= j=f~i=-\Vi=f~i{=\ΟiY=мPмQм R\bRRѢQ\RѢPRRP^ԭ@=mмV\\1V\ oЬP@ψPRnЬP@gPS1d1.h<ݬh<,hx<ݬ hr< he<ݬhK<}h><ݬkh$<,Zh<ݬHh<3h;ݬ!h;,h;ݬg;U g;ݬ"g;;gs;ݬ&gm;g`;*~gD;vg7;ig;S1 *;PWWXhԨãPPNPPF9PKPPP ѨllNPF9PKP 'ШP:epQ$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1U"T@PlSPSèlSRNSF1SKSS âSNSSF1SKSSS Ѩ sl kl Ѩ `l Wl NSF1SKSѨ1?Џ% iB:0[PW\ PPн@ [\WP \\LZԭխ1мRЬPаRJ+ռ<^ԭB+mм\!]R]P`]R+\ڐZЬ Z5WP ZR(]B`WP nZRBP ]\`**\Ϛ¬Z\\\P`w\\z*h\X\[\M\ ^мR\\* 6\S/\P`'\S.*\ڐ\R\9[\[P`[\)[[[[<^ԭ)mмм [1\[PP[QQ8Q0QPѠ+QQQPРQQPߏ P!HWVPP!ߏߏKHPb!\HAHP;(Hy!HHHH!GO!WDPW BPWWP ^мRм\G!S PG>G GOG S wG jGOu O (OOOP`OO|OxO\R PRFJ RP^м PмRмS^TЬUмVPW V`WPWe PegegPeRT\^TFUNF>yFpFNXFU HF;FNFxN)rNqNgNP`_N]NLNHNSRPRET^\TRP|^мPм\^RRS^RPTUEVME>zEqEMYEV IEP6GPP쟭G==IF!ߏlI쟭ϚP1FF1FPgCQ P@Qa1쟭ϙFP4CQ P@ QaѭíܟHFm'ѭíܟߏFDЭ1FPBQ RB쟭ϨP1䟭P1䟭϶P1EE1խ@EPРPEQ@QѭQ1ЭQ%=PAPqEQP1ߏYEQOEPEER ;ES!E$EP`PEEP EߏDPDQDR DSD|DPխ1РQAQѭQЭQL쟭P ^ԭ&mм\\L@P \QA0^ԭmм\ \ P@CŏPQQP~QQ?}` \ P PQACQQ PP@1 \ QA&B( 'k>PРQA`QQŏܞzР쟭П*9 9MPVVSQ PP@:P QQAWW쟭=P WQAwV V11=~bV V|0^ԭ2m~BPP\PpBQPQ#PЭP<`PP>PPЭ\>>\>PRR/ЭP<`PPD>RJP 1V21ЭP`ݨ7D 73 ;>#A> =.>=>==<=䟭 PRRR 1g2=PRR10䟭=ϕPRR1Q:<8䟏 <'17:ߏ:ߏ1䟭 PRR7ߏ;ఏ;䟭9 PR19; <;ߏ $PP䟭D6Q \L+6~ 6~ *;<<<䟭T <0&595G 55 R;Rh;k;a;l<^<;ЬP;$ЬPЬ<<`^,n䐏Pݬi^|QVX^,n䐏QeYݬf^PRݬ l$լ ݬf  RP|VD^,nȐSȞ؞ܕlլݬfЬ̑lլ  lլ,n䞭l լ Ь l լЬlլ ݬf^<`^,n䐏T9-l լЬ^<`^,n䐏Uݬ^@\:Ь:ޯA,::PQl`::{:мPQl`@i:\e(X{ .(n08@6HlP@ BADSHELFENTRY(bookshelf entry contains invalid !AS !AS0 LASTNOTLASTrecord(s) following 'last'> BADRECTYP)book !AS record has invalid type code !XW@BADLAST.expected end of book at !UL, actual end at !UWJBADSIZE8expected !AS record to have size !UW, actual size is !UL<BADPART*part !UL, RFA !XL,!XW has invalid size !ULB PARTTYPMIS,part !UL should be type !UL, actual type !UL6 BADSUBSIZ"subrecord size does not fit record"OPENINerror opening !AS4 UNDEFTERM Unknown or invalid terminal type VTBOOKq@@ () @LIBRTLPASRTLSMGSHRe(X{ .(n08@6HlP@ BADSHELFENTRY(bookshelf entry contains invalid !AS !AS0 LASTNOTLASTrecord(s) following 'last'> BADRECTYP)book !AS record has invalid type code !XW@BADLAST.expected end of book at !UL, actual end at !UWJBADSIZE8expected !AS record to have size !UW, actual size is !UL<BADPART*part !UL, RFA !XL,!XW has invatlid size !ULB PARTTYPMIS,part !UL should be type !UL, actual type !UL6 BADSUBSIZ"subrecord size does not fit record"OPENINerror opening !AS4 UNDEFTERM Unknown or invalid terminal type VTBOOKO'o'@Zo"H{@ZkO'o'@Z!o"H{@ZkO'o'@Z!o"H{@Zk"FB0F&O'O"N"<]uo'"Z!?"{@Zk%l!O'o'@ZH{@Zk##GC%P!8GxN#AG^CzG! #qK_"m" SJ#'PJM#0F -##.E"?"T J EF>tSJ.UJF> NO'.\|no'Z!{@Zk%x~!"FB0Fo'% &O'M"N"s"m"#h]{?#.o'Z"?"{!D<y|$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1d"v@Zk%}!- D!v H C @- !v H O'o'`Z$vHh{?"D"1F@ZkP@."!F>BQF oM#N/#O'$aB8C.D-D@7J&m#nm#_"8]t8CNFZo'"{0@!?"@Zk%}!D@"FBG@/#_#|@K."-" JmO' ""[`K #Gmo'?#M.R QJrFM>rJ"m.SqJ?"SFm>,]{o'.!Z{@Zk%4|!#GCF/'% _&O'm/".R"m""M"m#o'"\y?"!Z{@Zk%{!N#AG^CzG&O'#"_"`]to'N"Z!?"{@Zk%T{!"FBG'O#NO'-#.#T]|"no'Z?"D{!@Zk%z!"FB0F/'O'M"N"ʙo"n"#$]yo'Z"{?"!D@Zk%|z!D@N#AG^CzG&O'#_"L]tNo'Z"!{?"@Zk% z!D@xv"FBGM#N'O'-##".?"\|nZo'!{@Zk%y!D@" E  FU vH1@W"B@1!J1W JA1&1A1&1"kPLLLLLLLLLLLLLLLL0n"aF~BFO'#"Zo'&@s""{!?"@Zk%x!O'o'0ZYo"8{?"@Zk.#!G>CYGO&O'o#n#P]ro'Z"!{?"@Zk%Hx!" E lF"FBFo'O' #?#4]{o'."Z!?"{@Zk%w!#GCF&O'-"._"\to'N"Z!?"{@Zk%w!"FBGO#'NO'/#.#`]|"no'Z!?"{@Zk%C%dv!yGXvҤ#GCF,!&O'M"m"N"o'n"]u?"!Z{@Zk%u!#GC8G&M#NO'# o#n_"o'8]t"N!Z?"{@Zk%pu!"FBGO'/#o'. /"M""Z!{@ZkO'o'Z"@/"{M"@Zk &:1@MO'm#n#_"\tNo'Z"!{?"@Zk%t!"FBG _#m#p[K&?'O'/9#-"-m"-\KM"F?n"No'\u"!Z?"{@Zk%t!#GC8GQO#N&O'Wo#n# "_"o'$]t"N?"Z!{@Zk%s!"FBG'O'-#.#d]|"no'Z!?"{@Zk%Ds!"FB0F&O' _"o'"?"l\tNZ!{@Zk%r!D@"FBGO'N?#.o'pZo""x{_"!?"@Zk%pr!N#AG^CzG&O'#"_"l]to'N"Z!?"{@Zk%r!"FBG'O'-#.#4]|"no'Z!?"{@Zk%q!"FB0F&O'M"Nm""no' ]u"!Z?"{@Zk%hq!DMm$!_FCJMF 6@JmFpG C`7J@AGNCSkO'o'Z{@Zk#.#!G>C%p!yG$uҼ#GCF/&O'\1o'!-DL"l`/"ZEҠM"{@Zk /M#NO'! 8C!D8D @7J&&/#.F 6#m#n8]t_"8CNZFo'"?"{!0 @@Zk%o!D`"FBGP/# _#.|@K"-"m JO'p"[`K"Gmo' #M.?#R QJrFM>rJ"m.SqJ?"SFm>,]{.o'Z!{@Zk%o! #GCFD@N"" @ B/".8GM"NFO'o'Z"{@ZkA _"/`/PJm"\ K`K SJGq@K#0F M#'-#.#"?"T JF>tSJ.UJF> NO'.]|nZo'!{@Zk%m!0@]@."!F>BQF'O'ǜo"nͰ""`]xo'"Z!?"{@Zk%m!.#!G>CYG&O'm#n#Ͱ_"o'T]t"NDZ!?"{@Zk%m!"FBGO#M&NO'-#.m#Ͱ#n_"o'$]t"N?"Z!D{@Zk%l!D`zx"FBG-#M#'#"?".NO'\|nZo'!{@Zk%$l!D`"DFV vH1@W"B@1!J1W JA1&41A1&41"kPLLLLLLLLLLLLLLLL1n"aF~BFO'#"Zo'&@s""{!?"@Zk%4k!O'o'0Zo"8{?"@Zk.#!G>CYGO&ͰO'm#n#P]ro'"Z!?"{@Zk%j!"DgF"FBFo'O' #?#4]{.o'Z"!{?"@Zk%`j!#GCF&O'/".ͰM"N"`]uo'"Z!?"{@Zk%j!#GC8GM#'NO'#\|"no'ZD!{?"@Zk%i!DMm,!$͠_FCJ(F6@JmFpF BM `7J@AFNBSkO'o'Z{@Zk#N"AF^B% i!Fs8AG/'G\9-LZMDKm,vI PA<AGGEL.O',.o'`.R LJ,JS `JQF J,"F`>sJ"@".TJtF>Z{@Zkͱ/'E J "h\9FB-m"-F`/\K@/P BM[ `K@KzGpHF.#!Gn>C#?"yG#"Go&HWs"G@Sk%g! _."!F>BQFO'0^&s"mo'ZM"{/""!@ZkO''""# o'Z!M"{/""@Zk-#-M#NO'#po"no'Z!?"{@Zk%f!#DGDO'o'@ZH{@Zk"FB0FO'(^_&R"Mo'ZM"{/""!@ZkO'&m"m""o'Z!/"{M""@ZkO' # -#.#o"no'Z!?"{@Zk%e!#DGDO'o'@ZH{@Zk#N"AF^B%e!Fq#GC8GO'.A\Z% ?&1"M `0`C !-O'o'@Zo"H{@ZkS @~s"ND'..Z#_"U JJGF}o&/!z/P\s\ K=zK.G@CU J:..o'Q :JJ0FZF JO'G>uJ/XKF?@ZH{@Zk.#!G>CYGo'!\{О"m"mO'#o'EG_D1QBrJ"m.SqJ?"SFm>,]{.o'Z!{@Zk%a!  @;D0@8BN"AF^BrFD@pO _#?# EC @% 'S"F"# {GO'o'Zq"{@Zk&AO'&1"-M"Nm"n]u"o'Z"?"{!@Zk%`! @.#!G>CYG&O'Ͱ-".m#n#"_"$]tNo'Z"{?"!@Zk%_! Dë"FBGO#N'O'-##".?"\|nZo'!{@Zk%$_! D"_DF #" vH1@3B-@1!J1W JA1&81A1&81"kP=- E$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1"PS"FBFO'#?#B"QF.n" JT J#F>tJG.UJF>O'o'ZG"{ȗ/"N"@Zkn/N/% ?"M"[ nKNK\KzGp K 2JF#"m.E "S rJFm>s2J?".TJtF>o&s" ͱ@Sk%V!z.#!G>CYG&% 'O'{#m# "_"`\tNo'Z"{?"!@Zk%@V!  ZϠ'#&vH@@ O'o'@Z=o"H{@Zk:AAGZGO'o'ZE{N"З/""@ZkO'o'Z"{/"C"@Zk;vH#|CO'o'@Z]o"H{@Zk."!F>BQF tH`O'o'S`J@"F`Z("{"@Zko&% 'D[s""#/#-# M#Nn"?"!@Sk%T!   /&0F O o`"FBFO''# o'ZE{M"ؗ/""@Zko&HWs"-#-M##n"N!?"@Sk%DT!0AGEF."!F>BQFo.tI #8"SoJ/#Fo>. _#|@K"-"m JO'"[`K#Gmo'"M.?#R QJrFM>rJ"m.SqJ?"SFm>@]{.o'Z!{@Zk%XS!  M8B N"AF^BrF5"8/O'5.?#.o'X KJ@o"GBpZ"?"x{_"!@Zk%R!.N#AG^CzG #qK_" m" SJ#PJ'0F O#-#.#"?"T JF>tSJ.UJF> NO'.\|nZo'!{@Zk%R!  %."!F>BQFO'o"ml"(",4#0$/#.#nZo'&s""{?"!@Zk%Q!#GCF&O'/".O"N"l]uo'Z"!{?"@Zk%@Q!#GC8G_'Z#MO'o'ZE{ E/""!M"@ZkO'&m#m#" Zo'/"{M""!@ZkO'-""-M"o'N&Zs""{?"!@Zk%dP!"DFDEGG E6.#!G>CYGO''{#mo'ZE E{/""!M"@ZkO'?&# "1"-o'Z/"{M""!@ZkO'M"M"m"no'Z&s"{"?"!@Zk%XO!"DFDEGG Ez9уA!G9Gn#aG~C_#G.." PKQ 0Jn"QF.>qPKaFN.RPJ2FN>O'o'ZsF"{/"N"@Zk/.% #-#X KJY KGzJ |KYG-E3@ .M"aFP J0F >p|K-.QMͱsF"FB"GN/.# JZ YK#zGN?zJGn/[yK[Gn?O'o'ZG"{/"N"@ZkN...% "m #R NJ.JS`JQFtJ JFmo&xs"-/#m#mEY 8K "YG-?yJ?"M/ZXK:GM?ͱ@Sk%HM!y0AFFN"AF^B?"rF." 4JU J.#G>u4J!G/XKF?O'o'Z9G"{ /"N"@Zk/n/% _" m"\ KnKPJGq@K SJ0F E9@. #!GT JF>tSJ.UJF> ͱ9Gn#aG~C_#G.." PKQ 0Jn"QF.>qPKaFN.RPJ2FN>O'o'ZsF"{0/"N"@Zk/.% #-#X KJY KGzJ |KYG-"mo& .xs"M"P JME0F >p|K-.Qͱ "?"@Sk%`K!y41AFF#GC"8Gn/N# J[ zK"Gn?{JF/\K|G?O'o'ZF"{H/"N"@Zkn.N.% #-#S nJNJTJrFu J KFE0@M/#FZ YKzGM?zKm/[yK[Gm?ͱFN"AF^B?"rF." 4JU J.#G>u4J!G/XKF?O'o'Z9G"{d/"N"@Zk/n/% _" m"\ KnKPJGq@K SJ0F ?#- # .E "?"T JF>tSJ.UJo&xs"F>ͱ@Sk%xI!N#AG^CzG O'_"No'Z&@s"{"!?"@Zk%(I!O'o'0Zo"?"8{@Zk#"FB%I!Gk(.#!GL9GZDKMmK vHP@1A!F 1FE.O'`.o'."T J`JU JF AJ "G>uAJA"/XKF?Z{@Zkͱ ,9-$KM,vI PA;AaG{GEO' .o',.@. JQ ,JR @J0F K,"rF@>rK"`.S`JSF`>Z@"{@ZkO'ͱo'Z&{EM"/""@ZkO'o'Z&{"(M"/"@ZkO'o'Z&"{ /"M"@Zk ("m#PB @/" //Z @K- K\KYGpH P BF?Mn#.aG`.~C /M#T J4M`JXKFyHG8G ?"FB0Fn"aF~BM"F#NGC&"?"0s"8Gn#"aGO'{GZo'{@Zk%F! D#GCF-O'_"N.o'pZo&Ms"x{"!_"?"@Zk%E!Jn"aF~BF3 /3"vH-#K.m#F:vHMn% " "- tJO'rJQ J'QF--##."?"U JG>utJ /XKF ?.L\|nZo'!{@Zk%D! D"FB0FO'_"No'o&pZs""x{_"!?"@Zk%D!E_#"FB%D!Gi4.#!GL9GZDKMmK ,vI PA1A!F1FEO'l.o'.,"."lJT JU JF @JG>u@J@"/XKF?Z{@ZkO'ͱo'Z&{EM"\/""@ZkO'o'Z&{"M"\/"@ZkO'o'Z&"{4M"/"@ZkM -#\-"P@C`m.F/Bh-.m"P JmKQ-JFr HFQFh->#GC8Gn#aG~C4M#G"NFB&_"?"0s"F#N"GO'o'ZG{@Zk%lB! D.#!G>CYG@mO'#no'pZo&%s"x{"!_"?"@Zk% B!I"FB0Fm.vH #% "mJ-"@F5vH J'M"m"-|@K[`K-GmO'o'M.R QJrFM>rJ"m.SqJ?"SFm>L\xZ!{@Zk%@A! D.#!G>CYGO'#no'pZo&as"x{"_"!?"@Zk%@!E_"FB0F&LO'"o'N"tu?"!Z{@Zk%@!܇܇ /2N#AG^CzGO'_"o'N&s"Z"?"{!@Zk%@!܇܇o`"FBF O'# &s""?",no'.Z!{@Zk%?!O'܇o'@ZH{@Zk##GC%?!\FiҨn"aF&sF\L , ZՠDKMm vHP@<AG GE@.O' .o'a.R @J JS aJQF JA"Fa>sJ" ".TJtF>Z{@Zkͱ J vHP@9A!G 9GEA"/`/.\ K`KP JG AKo'0F>pAKO'!.Q!JF!> "Z"{@Zkͱ"$L=@.r.UJrJxTJG>ͱ  0@,_# zA'` kE A0N#," .UJ>Z{@Zk,# 0`A xA? @@Dn#aG~CG&&O'"-".M" m"N"o'n"8]u?"!Z{@Zk%utJ /XKF ?-NO'no',]rZ!{@Zk%;!D+n"aF~BFO'&ٵ"o'"ZM"{ /"!@Zk M#'-#z# #NO'."x]|?"no'Z!{@Zk%;!D"FB0F/'O'""O"o"nN#$]yo'"Z!?"{@Zk%:!Dm_#|@K[`KGm"FB0FO'M"NͰm"no'Z,/"M"{"!@Zk o&s"z" o#O#N #n>&B$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1'"-#.#""?"!@Sk%9!D ,?"0vJBS@܇.ه.هo"U JJF`#GC8G'ȇO#NO'#\|no'Z"!{?"@Zk%H9!"FB0Fo'O'ȇ#Lo"n!""_"N?#\{.o'Z"{?"!@Zk%8!#GCF&O'ȇ/"._"\tNo'Z"!{?"@Zk%8!ه//"ه#zJY8KYGه/?8m+#;v`K|C-_"1v J2B `܇/ه"ه.X KJG.#!G>CYGO&O'ȇo#n#\ro'"Z!?"{@Zk%7!ه.هo"TJه> ?#8vKC@܇.هo#ه/P JKF7`."!F>BQF'O'ȇ/#L".!"#"n#\|"no'Z?"{!@Zk%7!"FB0F&O'ȇO"N"\uo'"Z!?"{@Zk%6!هO/#ه/#ZYK{KzGهO?#GCF?". ,"_" vH@0ND B uB8GFO'o'Z&{\"@Zk &p#ȇ"AZ#_"z/"?"zKNO'\tNo'Z!{@Zk%5!"FBGO&_#NO'ȇo#n/#.\r#o'Z"?"{!@Zk%5!n"aF~BF ?#,#" vH@YOD uC CFZGO'o'Z&"{@Zk /'O'A!("..ȇ"h.#o'T JhJ"FN?"\yZ!{@Zk%4!N#AG^CzG&O'"ȇ/".쇏#\t_"No'Z"?"{!@Zk%X4!"FBG ?#,_# vH@pOD C \C0F{GO'o'Z&{"@Zk o'O'ȇ#Az!H"N.?#."?"U JJFn\{o'.!Z{@Zk%3!#GCF&O'ȇ/"._"\to'N"Z!?"{@Zk%<3! #5vJB% M#:v@K[C (?"0vJB@m:"3v`JtB#GC8GM#N'O'#L]|"no'Z!?"{@Zk%2! ",?" vH@0@N @ BFRF`O'o'Z&O"{@Zk 9IxA@{#C/C_#K M;gK B`"O0B0@B/oM- /.X KJG: CAGZGn#aG~CG.." Hn"Q 0JaFQF.>qHN.RPJ2FN>O'o'ZsF{"*"N"@Zk/% #.#- |KX KJY KGzJM"YG-ME .P J0F >p|K-.Qͱ, )@z)!.i.T JiJF5@FF#GC8Gn/N# :H[ zK"Gn?{:HF/\K|G?O'o'ZF"{)"N"@Zkn.N.% #-#S nJNJTJrFu J KF#EM/Z YKzGM?zKm/[yK[Gm?ͱ, +@k!+. .Q +J J0F2@AFRFn"aF~BF/" 5HN#X KAG8G?x5H./Y5KG.?ZGO'o'Z"+"{N"@Zk.% "/"- tJP JKQ JFr`K_#QF--#-EM. "?"U JG>utJo& /\s"XKF ?ͱ@Sk%.!o<1`C11B臏/-i.I.S iJIJrF5BFF#GC8Gn/N# H"[ zKFGn?{H/\K|G?O'o'ZF{")"N"@ZkN.% #n.-# KNJS nJTJrFu J2IFqA#M/2B1B BZ YKEzGM?zKm/[yK[Gm?ͱl jAzk!.k.T JkJ F5 @FF#GC8Gn/N# ZI"[ zKFGn?{ZI/\K|G?O'o'ZF{"N"+"@ZkN."n.M% #NJS nJTJrFu J-#F K#M/EZ YKzGM?zKm/[yK[Gm?ͱL HAJ!J.*.R JJ*JQF3@aFsF"FBF./# IY 8Kn#YG.?yIaGN/ZXK:GN?O'{GZo'"*"N"{@Zk...% "M"Q .JJR@J0FsK JrFMo&Is" /#M#MEmX K "8G ?xJ?"-/Y5KG-?ͱ@Sk%+!A#GCF&O'-"._"t]to'N"Z!?"{@Zk%,+!"FBG'O'-#.#4]|"no'Z!?"{@Zk%*!&"@ N"AF^BrFO'"o'pZo&s"x{"_"!?"@Zk%t*!õ5@ 8/8K8K͠M#M /f/\ KfKG1B!F1FN"AF^BrF." HU J.#G>uH!G/XKF?O'o'Z9G"{&"N"@Zk/n/% _" m"\ KnKPJGq@K SJ0F # E.T JF>tSJ.UJF>ͱG/'/Z GK'K YG; @aG{G#GCFN.." 1I"R QJFrFN>r1In.SqJSFn>O'o'ZF{"'"N"@Zk./% #/ "M KY .KKZ@K8G{Jm"zGMmE-.Q 0JQF->qKM.RPJ2FM>ͱ,..U JJ F8 @GG.#!G>CYG/n# [I\ K."F?|[I!F.PJG>O'o'Z1F"{)"N"@Zk.n.% ?#M#T JnJUJFx@J :KGo&\s"m/?" " -E[ zK "Gm?{:K?"/\K|G?ͱ@Sk%@'!͠f.F.S fJFJrF5BFF#GC8Gn/N# H[ zK"Gn?{HF/\K|G?O'o'ZF"{&"N"@Zkn.N.% #-#S nJNJTJrFu J KF#EM/Z YKzGM?zKm/[yK[Gm?ͱ'..Q 'JJ 0F2 @AFRFn"aF~BF/" 5IN#X KAG8G?x5I./Y5KG.?ZGO'o'Z"'"{N"@Zk.% "/"- tJP JKQ JFr`K-#QF--E.U JG>utJ /XKF ?ͱl/L/[ lKLK zG< @GG"FB0Fn.N" 2IS rJ"Fn>s2IF.TJtF>O'o'ZF"{,"N"@ZkN/./% "m-"Z NK.K[`KYG|K JGm""M.ER QJrFM>rJ "m.SqJ?"SFm>o&ͱIs"@Sk%8$!M<!m, _F8mCJ4MF0-6@JM$͠FpG(Cm `7J@AGNCSkO'o'Z{@Zk#.#!G>C%#!yGb'GG"F/& $\1 ""-@"@`F J vHP@9A!G9G EA"@ "a/" AK[ aKGa?{AKO'/\K|G?Zo'{@Zkͱ  J- vHP@2AAFRF EO'.`o'A"T J aJ "F>taJ".UJF>Z{@Zkͱ  K- vHP@:AAG ZGEO'`A"/ " aK\ KF?|aKo'.PJG>Z"{@Zkͱm",O'.o'&Q.TJEQJM&u3J"F>Z/"tR"{@ZkO'o'Z&{"!"C"@ZkO'o'Z/&M&{&"R"1"@Zk'N"8 AFͱ^B9$KKrF8GK Mo C0@  "".FBGN#AG^C?#zG.".!F>B'h؜# "QF"FB"F.#!Gn>C#YG#G-CFa#N"nAF!^BrF".FB"GN#AG^C/'>9#zG"F.B#0Fn"aF~BM&R"F.#N!G'>C "?"\xyG#"GO'o'ZG{@Zk%L!܇3."!F>BQF O&-iR". "`.UJP CMT J`J?"FxHO'Go"no'܇."?".r.T JrJF@BNpZo&ts"x{!_"@Zk%|!#GC8GM'Z#'NO'#\|"no'Z!?"{@Zk%$!  ..Q JJ0FD(1A A0N " A`.@.S `J@JrF!D CYGF O'o'Z&{"@Zk@#.?". #;gKJC_n"aF~BF_#O&/ I'{#X K#8G?xI"5/?"Y5KG5?MO'n\ro'!Z{@Zk%!m D.k.T JkJF8BGG.#!G>CYG/n# H."\ K!FF?|H.PJG>O'o'Z1F{"+"N"@Zkn.M#.% ?# :KnJT JUJFx@Jm"G% ?&M&m/1" "-R"M[ zK"Gm?{:K?"/E\K|G?mo&s" ͱ "@Sk%!& D'/_'/Z#Y 'KK vH8G @A`O'o'@Zo&1s"H{@Zk0CFO'o'ZF-&{ EN"1""@ZkO'o'Z"{'"C"@Zk1vI_"2B`O'o'@Zo&H{Os"@Zk&xIδO'o'M&UJ)"GδZR"{"@Zk&.#!G>CYG'% '{#mМ "?"s J""M JO#'R@J% &rFM-&# /m#1""X KM"8G ?xJ"-/Y5K&G-?MO'no'-?" "NT\u!Z{@Zk%!%ь!?#,C0`O ' D_# :C vH @F {GO'o'Z&{"@Zkl.!" ?"1'JlJTB` '-ј,vI:,CAGZGO'o'Z-&{EN"1""@Zk m,_"?"B0`N PB B[`K|IFGmsFO'o'Z&"{@Zk.#!G>C'#YG#GCpo#FN"AFn^B-"rF#G.&C"\u?"8Gn#"aG?Ye$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1O'{GZo'{@Zk%!A'Ϝ#qH.PJ0F>N"AF^BrF&O'\to'"Z?"!{@Zk%!A&ϵ"?#/KB@ n#aG~CG-&% &" 1M""u`J-#N-# K/&쇏#TJ "F_1""M/,"% _&R"Z YKzGM?zK#m/[yK[Gm?.mM`B8O tB BzG9G@O'o'Z&{"{@ZkA&'O'sќ# "_"T\to'N"Z?"!{@Zk%!#,?#B0@O B 5C DGZG`O'o'Z&{"@Zk`7"FB0Fm&% _&R"Ms""yJm_#m# [Ko&/"XKM"8G 9Hx@/CCB\ Ks"F?|[K@A .zZ#% &"PJm#G >-#NO&n"MO'?"no'T\rZ!{@Zk%!m"," D`B0O tB BYGG O'o'Z&"{@Zk`A{'{#/K;gK|`2Hq@2B1B B LAz D.D.#a.U JT JaJF 0 @ AP A0O &H ;AG>u&H/XKF?B/"/Z BK"KYGcD BGQF O'o'Z&{?"@ZkC@0 A@@0N"."/yJ "#XK3gJ8G?f/ \@F/[ fKFKzGcD "BrFF@O'o'Z&T"{@Zk @0 N@#."8/zJz! "Y8K"YG8?/4Jl/ 0@\ KlKGD ABF1F`O'o'Z&{j"@ZkA9#.#Y/{K "ZYK5JzGY?1Hp@BB C LAz!l.L.S lJLJ rF PA A 9Hx@CC B LAz!l/L/[ lKLK zGPA0C >."!F>BQF5HMt@BB `B LAz!1H,/ /p@BY ,K KB 8GZ@K{IC&@A&|R"zGMm"Mn"no' #ڵ-# _##.o&NO'{s""?"npZo'_"!x{@Zk%!p"FB0F_"L?#&UJ'm##-"M"LA$s .`.T J`JFxH&G""AZ'uZ#MO'nno'-?" N"no&@䔢Ks"_"!pZx{@Zk%!5#GC8GM'm &[`Ko& vH_&|H"Gm -"R".M/'s9#""m##y/o&Y/s""[ yKYK_"zGO' C.o'pZ!?"x{@Zk%,!5"FB0FM&m&S`JO' vH?'tHѵ"Fm #9#-/& Z1"m#m#M"O'q."Q.o'"S qJQJrF B.o&pZs"!x{_"?"@Zk%T!"FBG'O'-'9#.#\|no'Z"!{?"@Zk%!-&1"Q.QJ6 Jn"aF~BF'-'O'&9#"#.#\|"no'Z!?"{@Zk%| ! M11B-@-.i i.cDT JiJFD.Jw@H@DA9'$9#! y/yK:K 1@cD'#@-./P JK F2)BAFRFn"aF~BF/" 5IX KN#8G?x5IAG./Y5KG.?ZGO'o'Z"{'"N"@Zk./% "-"P J-KQ JFr`K tJQF--#-E.U JG>utJ /XKF ?ͱi/I/[ iKIK zG< @GG"FB0Fn.N" I"S rJFFn>sI.TJtF>O'o'ZF{")"N"@Zk./% "N/-"m J.KZ NK[`KYG|K 'Gm% &"M._## -#-R QJM"rFM>rJ "m.ESqJ?"SFm>o&s"ͱ@Sk% ! D!`' o'{#m|+v`I1 B!F1FN"AF^BrF." tI.#U J!GG>utI/XKF?O'o'Z9G{-&"1"N"@Zk/n/% _" m"\ KmnKPJGq@K SJ0F # E.T JF>tSJ.UJF>ͱK/+/Z KK+KYG;@aG{G#GCFN.." H"R QJFrFN>rHn.SqJSFn>O'o'ZF{"+"N"@Zk/ "./% #M KK Y .KMZ@K8G{Jm"zGMmo&s"-.&&Q 0J #QF->qKmM#MM.-# #-tҔ"RPJ ϵ"2FM>ͱE?" "@Sk%d!#GCF&O'N_"\tNo'Z"{!?"@Zk%!O'& Zo'\u?"({@Zk%!_#.#!G>C%!yG+[,#GCF/&"\1,!- `..`JT JFUBO'o'@Zo&H{ls"@Zk.#!G>CYG.O'/|-P JKQ JFr`Ko'QF|-Z~M"{ ""@ZklO'o'&s/&"8M"dJmD1"ZE{@ZkO'o'Z/&&{"M"1"@Zk&| /'ڵ vH~m#J04 #9qHm~ #| |m"-$K .M" vHMo'PJ uHtMTJ\m0F >F ,#_"&Y/s"E"ZYKY?O'D?"N!Z{@Zk%!D+n"aF~BFO'Z#?# #._"o&/s"z/"N?"\ KzK_"G@CNO'o'pZ!x{@Zk%0! ".xtJUJG>.#!G>CYGO'8m##no'Z&s"{"?"!@Zk%!D"FB0FO'8M""o'N&Zs""{?"!@Zk%T!Dg"FBG`-ZM#&% ?&. "[/1"Zm/,M"m"\ KzK"GMO'Mo'-"n?"L\uZ!{@Zk%!-- , #C0@O vH?# C @GZG`O'o'Z&{v"@ZkA.!" "0JAJ3B',-!v H !D5@FO'o'ZF{ E".-"N"@Zk n#maGXKy@I~CO'8G Z#G."!FN>Bp"QF"FBm"Fn#aGn/'~C#\y?"GN""AFO'o'ZRF{@Zk%X!D ?E iF"FBF'O'\xo'Z"?"{!@Zk%!?E_#:C`#GCFM,-""R@Js J JrFM.M#m# /#qK_"X Km"8G ?xJ-/Y5K SJG-?MO'n# -#Z#PJ0F .T JF>tSJ% _".UJm"F> SJ .N mqKPJm0F .T JF>.UJtSJo'O'F> #?#T\{.o'Z"!{?"@Zk%!D#D%Gz!q"FB0F&&0M"Ns"mO'ڔJZ#"?# #.O&/VR"z/ "?"\ K.zK"G@CNO'.o'r."?"T JrJF@BNo&pZas"_"x{!@Zk%!!7#GC8G . ##q|KPJ_'&&Z#M0F >M"Mm"n"ڵo' # -#_#N./&{#"O'n_"1o'No&s".pZ"?"x{_"!@Zk%!~&zs"A ! "8/zJY8KYG8?n#aG~CGD o&-"._"NO's"o'"npZo&s"x{?"_"!@Zk%!"FBGO'-##n.o'Z&s"{"?"!@Zk%!DDGV_#N"AF^B%!FX'GG(.#!GO'9G\ZMl{xmdK|x vHP@0AF| FEO'`.o'@.".S `J@JT JrF !JA"F>t!J ".UJF>Z{@Zk|ͱ p Kt-p,vI PA:AAGtZGE/O' . .KP JQ JF `K"QF >q`Ko'@.R@J2F@>Z,"@"{@ZkO'tͱo'Z&/&{EpM"1"\"@ZkO'o'Z&{/&h"1"pM"@ZkO'o'Z&{/&t"1"M"@ZkO'o'Z&{/&"M"P1"@ZkO'"mo'M&Z&/&{1"_R""!@ZkO'o'Z/&{&M&"2R"z1"@ZkO'o'Z&"{!"C"@ZkO'o'Z/&{&M&"\1R"ԧ1"@ZkO'o'ZM&&{/&1"0R"" G@ZkO'o'Z&"{C"!"@Zk&",Ա| #| PC-@/ #`/ .@KtM[ `KPJzGqHt P@B0F >m".F.B-/pm#U JmJY8KFzHp#YG-?0FN"AF^BrF"FB"Gn#aG~C&?#?"0s"GN"."AFO'o'ZRF{@Zk%D! D`n"aF~BFO'"#o'Z&Hs"{"?"!@Zk%! D`.#!G>CYG &*"/m#0.K&Q 0J pK*"QF0>qpKpm"% _'P.-#Z#m'RPJ({#2FP>n#/_"."?"X KJG&.MO'mo'L\tNZ!{@Zk%!! _E-?#AYO",# A CGZG`O'o'Z&"{@ZkA$1 & //O'(o'ЃZY KK؃{-&8G"0vJ _"*1"@Zk_# _E JG _E 0Am A_!-_"ArN",?" A ,BFsFO'o'Z&{"@ZkA$/ '@/o' /-&("Z @K؃{ K0vJYGO' _"ЃZ*1"@Zk# _E jG _E 0A A_@6À ,""0B-M@B0N SB B8GFO'o'Z&"{@Zk_#@$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1Lm'O'({-&*1"A!$1! aK/A"\ KF?|aKo'.PJG>"Z{@Zk5Ht@BB`BA-'$% _& # R"M-"-._ Ͱ(M',Z'vH;GCaGO'{GZo'-&{"N"*1"@Zk#GCFN.." H#R QJ"rFN>rH"n. "GSqJ?"SFn>o&s"G@Sk%!<-: N#AG^CzGD&//&O'\ K?",1"._""o'PJ>n"N.?"\uZ!{@Zk%!#GC8G_#Nm&O'#n_"\to'N"Z?"!{@Zk%!0 0 A A #N_#,# :A iC91C-QFF O'o'Z&"{@ZkA$/ m&.(sO'o'T J gJ-&F>tgJG".*1""UJF>Z{@Zk YD_# //'{#Y KK8GGCAO'o'@Zo&H{ s"@Zk &,1B!FO'1Fͱo'Z" "{N"@ZkO'o'Z/&"{41"C"@Zk2vI"SBO'o'@Zo&H{-s"@ZkD I.O' o'"U J@"G>uI/XKF?Z-{@ZkDm@/ /Z @K KYGP@ @&..Q &JJ0FP@M`&ʂs"sA!3`"FBG-_'n Z#o'.MO'/&{Z"M"81"!@Zk/&1"m#m"#q.O'Q."o'S qJQJ"rF B.pZo&s"x{_"!?"@Zk%!䇯m'O'Z# CM9@-,{<1cCGG."!F>B"QF.n" JT J#F>tJG.UJF>O'o'ZG/&{"N"X1"@Zkn/% ?"N/M" 2J[ nKNK\KzGp KEF81@"m.GS rJFm>s2J.TJtF>ͱGN#AG^C?#zG.# pO'o'ZRF{/&"t1"N"@Zk..% _# m#U JJXKFy`J [K8G m&\1s"/&mo&s"\ KM&F?|[K-"--#- . # _#M" PJ_"G >2R"ͱ?"M "E@Sk%L!_##GC%@!\FT҄n"aF~BF&o'\!"M", 9ؠ- L,{O'Z@Zkl&O'#; "_"o'E E _E?" 0]t"N!Z{@Zk%T!"FBG&M#NO'm#-#.n#Ͱ "_" o'"(]t?"N!Z{@Zk%! MC-0@Cm vH vH #"FB0F/'O&&O'm""R"N"n#8]yo'"Z!?"{@Zk%$!LGF/z/\ KzKG:FKAGF@GFF L.r.T JrJF @,#. o Y/ K _ Z YK zGY?zK y/[yK[Gy?\K,􈏢q.Q.S qJQJrFB . o  XK_ N#AG^CzGO&o&<.0s".*R"?#Q CYGO&ͰO'm#n#P]ro'"Z!?"{@Zk%!n"aF~BFo&s""Ͱ #?#."!?"@Sk%d!N#AG^CzGo&s"#_"N"?"!@Sk% !" E kF$" E F{ø - vH @"􈯲 C /O. o Z@KO _ gø vH @0@?"/O. o  R@JO_ T vHP" _E F vHXK55@yJ8GDüM7#:v@K[C vHP@/ 1 B @+@"o(O _#0BXKyJ8G/ vH!v H@0`O @ @F{GO'o'Z&{"@ZkM ?"b.1'JtBJSbJFb>M"v@H0@@􈯲-M"1C@@0`OBD C \C0F{GO'o'Z&{"@ZkM?#mRLbB/.X KJGB@O'o'@Zo&s"H{@Zk./O'-P JKQ JFr`Ko'QF-""ZM"{"@Zk O vH"v@H @`O"v@HTJu@HF C _#Oo `C0 N |C BrF1F@O'o'Z& "{@Zk#LB@/ /Z @K KYGCO'o'@Zo&H{s"@Zk@.O' .o'mR @J JS`JQFtJ"FmM"Z "{@Zk􈯢 B?#/O0@Co# 0B- M vH @B`M "B0O vH B @YGG O'o'Z&{l"@Zk. ?" #;gKJC_m=`BräM"v@H"U@ vH0@@ @@3- O!1 @ vH"v@H O'o'@Zo&H{s"@Zk!D"@G!DFVG D!GVG "GGX`GVG9@VG @-r@H O'Q J QF-@Zo' 1@" "{M"@Zk5äMm- "v@H"S@!1 @ vH0@@ O'o'@Zo&H{s"@Zk!D"@G!DFF DFF FFGXGF4@F @?mM |@H[`K@O'GmZo' 1@" "{M"@Zk ä O vH"v@H @O-"v@HQ Jr@HQF-Mo"v@HbBD"FBG?#_#.N?"oM" 2J"p`K\K #F# "m.S rJFm>s2J.TJ KtF>m"'-"M"{ KZ@KzGMO'o'-.Q 0JQF->qKM.RPJ"2FM>m?"X\x!Z{@Zk%D!.#!G>CYG##n""- tJ/#rJQ JM#QF-?"M".U JG>utJ /XK 2JF ?-"NO'm #?#p`K\Ko'F"m.S rJFm>s2J?".TJtF>X\{o'.!Z{@Zk%4!􈏣5C//21 BOm7"3v`JtB ?#8vKC@# _E jG4 _E2ü7"rJq.SqJSFq>B,#C@O'o'@Zo&H{s"@Zkm. |KP J0F>p|K<.QD(_ÈO#\OO'8o##0o/#/"莯o'@ZH{@Zk##GC%!\FMl5QB 0C[@{C@C,M!m_F CJF6@JFpGC`7J@AGAjR$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1vZ"NCSkO'o'Z{@Zk#N"AF^B%!FM8AG/'O'\9o'M"G-"Z{,@ZkM;AaG͠'-#{G@EO'o'Z&{"!"C"@Zk_&R"?&@ @ @@BFFFO'o'Z"{!"C"@Zk -ͱ&A&CMlS`C Р-5 B@O'o'@Zo&H{s"@Zkm&"tBO'o'@Zo&H{s"@ZkO'-o'MZ"1v J{@Zk 1@ C 1@-5 C@O'o'@Zo&s"H{@Zkm'#|CO'o'@Zo&s"H{@Zk ,S B@"tBO'o'@Zo&H{s"@Zk @ L?#:C`O'o'@Zo&$s"H{@ZkDM(!m$͠_FCJFm6@J MFpG C`7J@AGNCSkO'o'Z{@Zk#N"AF^B%!FlM҄#G/'O'\9o'M"-GZ"{,@ZkM;AaG͠'#-{G@EO'o'Z&\"{!"C"@Zk_&R"?&@ @ @@BFFFO'o'Z"!"{C"@Zk o'-M"ͱ"&A&CMO'{Z,@Zkm<AG͠&-"G@E O'o'Z&{"!"C"@Zk&s"_&@ @ @`BFGFO'o'Z"{!"C"@Zk-Mͱ&AFCmsC ,ѠME5@B`O'o'@Zo&s"H{@Zk&"BO'o'@Zo&s"H{@ZkO'-o'Z"M1v J{@Zk- 1@  C'1@M5@C`O'o'@Zo&H{s"@Zk&"C O'o'@Zo&H{ s"@ZkLs@B`"BO'o'@Zo&s"H{@Zk @ l_#[CO'o'@Zo&H{&s"@ZkD"DF-5 B@O'o'@Zo&H{>s"@Zkm&"tBO'o'@Zo&H{Js"@ZkO'-o'MZ"1v J{@Zk 1@ C,1@-5 C@O'o'@Zo&hs"H{@Zkm'#|CO'o'@Zo&ts"H{@Zk-5 B@O'o'@Zo&H{s"@Zkm&"tBO'o'@Zo&H{s"@Zk 1@O'o'@Zo&H{s"@ZkD @GDF6GDG6G G:GGX@G6G@6Gm@ ?& A1"0B1A(1A@O'o'@Zo&s"H{@Zk3I@aF/$! sFA,n ,O'o'AHC,T H("F HB CH EDCs2J.TJ KtF>o&&Ms""u"Z@K#zGMO'o'-.Q 0JQF->qKM.RPJ"2FM>m?"|yZ!{@Zk%!_#D@GDDDfGDDG_t."!FO&O'\Ro'1F"MM"Z,{@ZkmE5AF͠?'9#-F@8 BE@O'o'Z&{"!"C"@Zk'#D'@ @ @CCSFqFQF?"FBFO'o'Z!"{C""@Zk M% &ͱM"&AFCm9 A /'FCO't"Ps""J- #o'"?"Nm\\yZ!{@Zk%!/KZ` 5B O'o'@Zo&s"H{@ZkM&s"SBO'o'@Zo&(s"H{@Zk"FBG-O&o#.#M"no'?"NO'\r!Z{@Zk%!n"aF~BFv"'t O'/#.#\|"no'Z?"!{@Zk%!"FB0F&O'O"N"\uo'"Z!?"{@Zk%L!O'o'@ZH{@Zk##GC%0!8GIҴN#AGo'ZG\{O'M"mo'Z"{,@Zk0AF͠?&1"-F@E@O'o'Z&"{!"C"@Zk&"&@ @ @BG5GGO'o'Z!"C"{"@ZkMM"m"ͱ&AO'fCo'Z{,@Zk 1A!F͠_&-R"1F@E`O'o'Z&{"!"C"@Zk&"&@ @ @B:GXG8GO'o'Z"{!"C"@Zkmͱ&AC ,s B@ lӠsB:,#C@O'o'@Zo&H{ s"@Zkn#aG~CGO'Ͱ "Zo'/&{!"M"1"@Zk #mM#8KMJ-"mo&G,s"-J-?"MNn!@Sk%T!D*#GCFO'o'Z/&{$1"M""@Zk #M#m"8KMJ-mo&G-,s"J-M?"Nn!@Sk%!DD_#N"AF^B%!FWI҈#GC8GO'!\Z#&s"MO'E"l?"Dno'Z!{@Zk%!Dc"FB0F _&"(#?#m&- E # _#M i"R"M#m"mo&/&&&;s"?#-# "01"-_&M/"" M#N#n"!?"@Sk%!#GCF?&&mo&?#-1"-"I"M$"!"$_#M$# m#n7s"mo&'&;s" # ?&-8" _"M# ""#n-#."?"!@Sk%@!#GCF?&$#1" "I"-&m$_#M$"!"?#-m#Mn i"mo&'/s""" " _"M?&-## #n-#."?"!@Sk%p!#GCF1$HHQF~ /3'J~"gJK-#".mo&DD_',s"F_"~)"MZ#-" 'i#m""M#"?"!@Sk%! D 1@O'o'@Zo&H{/s"@ZkD @GDFVGD GVG *GGX`GVG@VG@"FB0F0/ s@IAO' R@Jo'rFAZ0@ 1@{ "A""@Zk&o&#""' !?#-!" I#M!#m-".Ds"mo&_&;s"'R"M"#m&C# ?#-_#M_"N#"?"!@Sk% !/"."((!X KJG B )Ek/kK9AC9'K'K!C96 K9W KA9'TE9A9'TE9#kd4444444444483"FB0F.k.K" #T JrJ?'F @B5Q@"mo&'m;s"o''& " ?"-9#-#K#M_"M"?"-" G{#m#?'-"_#MH# "M"N"!?"@Sk%x!<"FBGK/+#k/?& "YK[ yK#zG C"Z{@ZkLo.oJI@"FBF'O#NO''h#?#.\|#no'Z"?"{!@Zk%@!"FB0F_"N.o'O'&Jnx"#?#\{.o'Z"{?"!@Zk%д!#GCF&O'/"._"\tNo'Z"!{?"@Zk%!/I#i/")/ /\ KzKKY 5KG8G@C*UA ICI.). "R PJ0JQFB ..i"U JJF`B SAAG@o/oKD@#GCF&O'/&1"._"No"n\u"o'Z"?"{!@Zk%!#GC8G_#NO&NO'o#n#\ro'"Z!?"{@Zk%,!n"aF~BF/'O'"#\yo'"Z!?"{@Zk%ܲ!h/#hK\C2."!F>BQF.&"Jn/'9#Z Cy/GGCCHCyK@Y/ZYK[G8eKO&K # "?".RO'"o'NpZo&s"x{"?"!_"@Zk%BQ$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1Ұ"!] (_## /"""/Y 5KK8GB` H".h.# ."#".T JrJQ BQFm'O'"aB\xo'"Z!?"{@Zk%l!O' ϰZo'"-"@"{@ZkMh/JH/J(#[ yKYKzG- CO'o'@Zo&H{As"@Zk."!F>BQFm'#"0`BX@CB?"-!CNO'\|nZo'!{@Zk%!"FB0F ϰO'mo'MZ(""3dJ@JrF@ Z{@"@Zk "'#/"yJ"XK?"8G?LNO'|no'Z!{@Zk%ح!D _"((.(JB,`"FBF(/o'_'Z#(KMO&{R"# "?"mO'".o'."r.?"T JrJF@BNpZo&s"x{!_"@Zk%!6 ̠"/#."f#ZCZCP JK C@F@' N"AF^BrF̠O'Z##/""".?#_"X K.Jo&G/s"z/"N_"\ KzK?"G@CNO'o'pZ!x{@Zk%(! G`)Q`B @. D @APO _A BYG G O'o'Z&{&"@Zk@APO'# _A jC0FGO'o'Z&{1"@ZkO'o'ZA"{1" @@Zk0@ @_n"aF~BF̠#&ps"/""?"XK?Lno'NO'{!Z@Zk%!'Dz#@$ ."!F>BQFo&O'ls"o'"npZo&ws"x{!_"?"@Zk%p!D_#GC8G\O&\_""`O`O'?"`\oo'\tN!Z{@Zk%!\O'`o'@ZH{@Zk##GC%ܩ!8GBLT E z/CzK LGF N"AF^BrF'O'""X]xo'"Z!?"{@Zk%L!.#!G>CYG&O'" o#T#n_"o'"H]t?"N!Z{@Zk%ܨ!"FBG'O'/#.#\]|no'Z"!{?"@Zk%!"FB0F&O'O"NPo"n"]uo'Z"!{?"@Zk%0!#GC8G'PO#NO'#]|no'Z"!{?"@Zk%!"FB0F\O\'O'`O`"o'`\o"?"\xZ!{@Zk%x!\/?`_##GC%`!\FpBn"aF~BF 'O' ?#xU#."\|?"no'Z!{@Zk%!@` @,LRClMm!_FCJMFm6@J FpFB`7J@AFNBSkO'o'Z{@Zk#"FB%8!GMB.#!G>CYGo'&\{_"s"m.A  ,\@0N @ `BGO'o'Z&"{@ZkM&_"P@CmO'o' ?#9'K?"C\t"N!Z{@Zk%D! ܎/? !1 @8KJG܎ O'o'@Zo&H{s"@Zk!D,@G!DFVG D!GVG ,GGX`GVG9@VG'#<@.`.1vI0@@T J`J"1@@F2BO'o'@Zo&H{s"@ZkD I/O'o'"X K""8G?xIA"!/Y!KG!?Z{@Zk_#GCFo&E\s.AEm2!B܎O܎/L..U JZJF&C @9 C`ܠ܎/ D܎$1@l!.39@B.Q !JJ0FO'o'@Zo&H{ms"@ZkD@GDFFDFF FFGXGBF@F_'Z#@& @"0CE4A8C(1A29 B@O'o'@Zo&s"H{@Zk8 @GO'o'ZG{9 @N"!"" E@ZkO'o'Z"("{C"@Zk.:v I/P JKF[C O'o'@Zo&s"H{@ZkD I@.O'o'R @J*"rF@>r I"`.S`JSF`>Z@"{@Zk8BL9 BzfCO'fC@Zo'H{@Zk#N"AF^B%!F|AҰ#GC8GO'!\ZEMl{m E0.0J  F܎O@܎/܎ .a.T JaJF,B A ܎/ #1`@܎Ϡa/A/[ aKAKzG`O'o'@Zo&) s"H{@ZkcDl@GaDFF`DGF GFGX FF|@F_&R"r@&A"0BA'1@O'o'@Zo&M s"H{@Zk9@!GO'o'Z9G{ EN"!""@ZkO'o'Z"{'"C"@Zk./:vIP JKF[C O'o'@Zo&H{e s"@ZkD I@.O'o')"R @J"rF@>rI`.S`JSF`>@"Z{@Zk 5B C-/K1`"FB0F'O'O& R""N"n"\xo'"Z?"!{@Zk%!.#!G>CYG#n&`O'"_"\to'N"Z?"!{@Zk%D!܎'#B O'o'@Zo&H{ s"@ZkN#AG^CzG'#"?& -`"@"m-#"M_'/&o' " "' Z#.1"mo&;s" _"M{#m"-# "M?"!@Sk%8!.#!G>CYG܎o&O'_"<aC\to'N"Z!?"{@Zk%!`܎0B`?#`/M``Ϡ<C@C\G@K<C|G A! E @v0@Do.oJ0@"FBF'O#NO'' #?#.#\|"no'Z?"!{@Zk%!"FB0F&O'_"No"n"\uo'Z"!{?"@Zk%!#GC8Gm_' " Z#Mm' ?# "-#M#.'' ?"N{#(#&31@Bn "O&'R"-?# #" "Nmo& ;s""mM-?".!@Sk%̚! @ @#M` #GF."!F>BQF m"no&Ys"&#"0 ""?"!@Sk%H!0A`/M4!m(_F0-CJ, F6@J Fp`GmnC$͠M `n7J@AGNnCSkO'o'Z{@Zk##GC%!\F>n"aF~BF .AUـA N#AG^CzGo&&Ys"#c "_"M-".N"?"!@Sk%!n"aF~BFo&Ys""##-#M."n?"!@Sk%!M!m_FMCJ F6@JFpGC`7J@AGNCSkO'o'Z{@Zk#N"AF^B%H!FD?#GC8GO'.A\ZͱMlm܎/܎./ P JGKF(!B A`܎ #1`@܎/..XU JJF`O'o'@Zo& s"H{@ZkcDh@GaDFVG`D#GVG (GGX`GVGy@VG'#|@?& A1" 0@@qA*1@A@O'o'@Zo&H{ s"@Zkm4kBFO'o'ZF{EN" ""@ZkO'o'Z"{*"C"@ZkI/)/5v`IZ IK)KYGB`O'o'@Zo&H{! s"@Zk)E `I/O'o'&"\ K@"F?|`I.PJG>"Z{@Zk'2(BGmB܎܎!//H#h/'/\ KzKKY 'KG8G@C @,1 N"AF^BrF/"._'Z#܎X KJ?#GBB0`O B TCFmO'o'Z&{n "@ZkM/'O'#P@Bmo' ?"1'J"?"B\yZ!{@Zk%Д!!܎mDM;dK@KzG@܎(...`.JQ (JT J`J0FFCO'o'@Zo& s"H{@Zk#GC8Gh// DI"hK\ K .G IKP Jo'0F >pIKO').Q)JF)>Z(" "{@Zk&O'G"N"\uo'"Z)!{!?"@Zk%! ܎܎G/'/`Z GK'KYG'gC @܎!m+1`A܎@. .ӠR @J J QF`O'o'@Zo& s"H{@ZkkE gAGaEFF`EFF FFGXGFtAF?'9#yA_' @{#0@{A&1@O'o'@Zo&H{ s"@Zk 1 B!FO'o'Z1F{ EN" ""@ZkO'o'Z"{&"C"@Zk..2v`IU JJFSBO'o'@Zo&H{4 s"@ZkE `I /o'*"@"Y K"YG ?y`I@/Z@K:G@?O'{Z@Zkl<gC 0'BPW_#"FB%!G=.#!G>CYGo'!\{E-. m m _ m m _   m .  _  m , Ep . Q. S`JQJ`MPJp _ m m . [`KY KmUJ - ,F _ rm . R@JP - 0_ @M mbm . `M_  m . . Rm  C4B$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1O)"_  _ . Bm 2m _  .  _ S`JTJmUJ"m . Q JXK -\KP Z@K@M 0 _ m . - m m _ . _ m .  PJ m [`K. m _ Y K- _ E  m . F܎OD@n"aF~BFo&gs"" #?#."!?"@Sk%!N#AG^CzG܎O#܎qI .M"BD`"PJ"0F >no&tns"N ""!?"@Sk%!#GC8G'B#NO'#\|no'Z"!{?"@Zk%! _"0.0JB`"FBFDd#0CD/DO@C0O _C zC0FGO'o'Z&{n"@Zk@@ # _'M'Z#`..@"#rJT J?"F5AB"_"-"mo&,s"m!CM"-" M"?" !@Sk%!? !1 @ O'o'@Zo&s"H{@Zk!D @G!DF6G DG6G G:GGX@G6G8@6G?@#GCF-rHO'B Q J0@@QF-Zo'"1@@{M""""@Zk% &"s"m"#-zK##Y K |KYG-&% & .O'\O""P Jm"0F >p|K #-. "-##QM"?"n .T\|nZo'!{@Zk%! D:"FB0F% _&m"mR"M" "yJm#XK_#8G [Ko&/% &\/"gs"\ KM"F?|[KO' ."" #PJo'G >-?#n"N?"T\{.o'Z!{@Zk%! D:#GCF% ?&M"1"-Mm"n"xJM#?#UJ :KGO&% &m/\"R"-"[ zK"Gm?{:K/'/ s""#\KO'|G? o'N".?"mT\y!Z{@Zk%! D:N#AG^CzG% ' " #-".m_"t@J #S`J"Fm J&-/% ?&\o#"Y 8K#YG-?yJ&M/M" 1"m"ZXK":GM?O'mo'"M-n?"T\uZ!{@Zk%0! D:#GC8G% _'m#Z#Mm#"-rJ""Q J tJQF-\/#o'.M#% 'C{#U J #G>utJ " /-"_"XK&F ?-NO'no' ."T\t?"N!Z{@Zk%D! D:"FBG% ?'M#M9#-m#n #qKm"PJ_"0F SJO'.\#Z#% 'T J-#F>tSJp#. {# "_"UJ?"F>& NO'.mo'"T\tNZ!{@Zk%X! D:"FBG% ?'M#9#-Mm#n# qKm"_"PJ SJ0F O'\#.Z#% '-#T J`#F>tSJ {#. "_"?"UJF>& NO'.mo'T\t"N!Z{@Zk%l! D:"FBG% ?'M#M9#-m#n #qKm"PJ_"0F SJO'.\# Z#% 'T J-#F>tSJ#. {# "_"UJ?"F>& NO'.mo'"T\tNZ!{@Zk%! D:"FBG% ?'M#9#-Mm#n# qKm"_"PJ SJ0F O'\#.iZ#% '-#T JP#F>tSJ {#. "_"?"UJF>& NO'.mo'T\t"N!Z{@Zk%! D:"FBG% ?'M#M9#-m#n #qKm"PJ_"0F SJO'.\#Z#% 'T J-#F>tSJ@#. {# "_"UJ?"F>& NO'.mo'"T\tNZ!{@Zk%! D:"FBG% ?'M#9#-Mm#n# qKm"_"PJ SJ0F O'\#.Z#% '-#T J0#F>tSJ {#. "_"?"UJF>& NO'.mo'T\t"N!Z{@Zk%! D:"FBG% ?'M#M9#-m#n #qKm"PJ_"0F SJO'.\#GZ#% 'T J-#F>tSJ #. {# "_"UJ?"F>& NO'.mo'"T\tNZ!{@Zk%Ѐ! D:"FBG% ?'M#9#-Mm#n# qKm"_"PJ SJ0F O'\#.Z#% '-#T J#F>tSJ {#. "_"?"UJF>& NO'.mo'T\t"N!Z{@Zk%! D:"FBG% ?'M#M9#-m#n #qKm"PJ_"0F SJO'.\#Z#% 'T J-#F>tSJ#.{# "_"UJ?"F>& NO'.mo'"T\tNZ!{@Zk%~! D:"FBG% ?'M#9#-Mm#n# qKm"_"PJ SJ0F O'\#.%Z#% '-#T J#F>tSJ {#. "_"?"UJF>& NO'.mo'T\t"N!Z{@Zk% ~! DO' o'ЃZ&؃{0vJ-" _""4"@Zk O' o'ЃZ&-"؃{0vJ _" "<"@Zk"DFDO' o'ЃZ&-"؃{0vJ _""H"@Zk#EGE vH D9@!GO'o'Z9G E{"-"N"@ZkM{@Imd"Z@KzGMDC0 N C BrF 1F@O'o'Z&"{@Zk"FBKoA&k!"GN#AG^C-#zG"F.O&B#\r?"F#"GO'o'ZG{@Zk% |!.#!G>CYG& o'O'-".{#n # "_"\tNo'Z"{?"!@Zk%{!%&"AM!?# *C0`O vH_# :C @F {GO'o'Z&"{@Zkj.\.\" ?"jJJ1'JTBO' o'ЃZ&-"؃{0vJ _""L"@ZksO' o'ЃZ&-"؃{0vJ _"""@ZkO' o'ЃZ&؃{0vJ-" _""$"@ZkO' o'ЃZ&-"؃{0vJ _""/"@ZkKO'p o'ЃZr-" _"؃{0vJG"@Zk>O'` o'ЃZ&؃{0vJb-" _""N"@Zk0.#!G>CYGo'O'\{o'"Z?"!{@Zk%y!O'P o'ЃZ&R-"؃{0vJ _""l"@ZkO'@ o'ЃZ&B-"؃{0vJ _""|"@ZkO'0 o'ЃZ&2-"؃{0vJ _"""@ZkO'0 o'ЃZ&؃{0vJ2-" _"""@ZkO' o'ЃZ&؃{0vJ"-" _"""@ZkO' o'ЃZ0vJ؃{-" _"G"@Zk5O' o'ЃZ&؃{0vJ-" _"""@Zk(O' o'ЃZ&-"؃{0vJ _"""@ZkO' o'ЃZ&؃{0vJ-" _"""@ZkO' o'ЃZ&-"؃{0vJ _"""@Zk O' o'ЃZ&؃{0vJ-" _""T"@ZkO' o'ЃZ&-"؃{0vJ _""\"@Zk O' o'ЃZ&؃{0vJ-" _""d"@ZkiO' o'ЃZ&-"؃{0vJ _" "h"@Zk'O' o'ЃZ&؃{0vJ-" _""t"@ZkO' o'ЃZ&-"؃{0vJ _""|"@Zk O' o'ЃZ&؃{0vJ-" _"""@Zk9 O' o'ЃZ&؃{0vJ-" _"""@Zk+O' o'ЃZ&-"؃{0vJ _"""@ZkO' o'ЃZ&؃{0vJ-" _"""@ZkO' o'ЃZ&-"؃{0vJ _"""@Zk# ?E G ?E+"0FK"F C k_#zG O.OJ n"aF~BF'O'&"#/#.#\|"no'Z?"!{@Zk%\t!"FB0F_"No' O'#?#.`"."?"U JJFn\{o'.!Z{@Zk%s!#GCF&O'/&1"._"No"n\u"o'Z"?"{!@Zk%s!#GC8GM#Nm&O'#n_"o'\t"N?"Z!{@Zk% s!"FBG'O'/#.#\|no'Z"!{?"@Zk%r!6"FB0FMO'&."r.o'/&T JrJ"FNM"Z1"{!@Zko'a{# # _#-#N.O'._"/o&Nls"P JK_"F`CnpZo'"!?"x{@Zk%q! m.`".K#U J JF9C-/k/\ KzKG@C@CM B M..`"U JJF`B SB- N#AG^CzGo&Lfs" "_"#N"!?"@Sk%q!6_#"FB%q!G5Ҵ.#!G>CYGl!{m E0.0J  F_"XO[܎o`X"FBFo&gs" #-##n".!?"@Sk%Lp!܎!/./J1N"AF^BrFo'O'&""#?#\{o'."Z?"!{@Zk%o!#GCF?".&XOO'o"n"N\uo'"Z?"!{@Zk%to!#GC8GXO#m"0@CXo,.& .L##Q sK.TJtF>T0BT-TϠ;C C;GW K;C[G ATϠ! E @80@DAP"N A BrF1F@O'o'Z&{"@ZkO'o'Z@/&ȃ{"""_"1"@Zk ."G# @U J >/XK?-g/9[ zK :KGg?{:K/\K|G?" ?0ATO" `FF"FBGo& Ys"O'-#.#m#n,Z#N"?"!@Sk%e!_L,Q.J#GC8G_#O&NO'o#n#\ro'Z"!{?"@Zk%pe!n"aF~BF'O'&"#/#.#\|"no'Z?"!{@Zk% e!"FB0F_"N/'.O'"#Jno'\y"?"Z!{@Zk%d!6N#AG^CzG&/&O'_"No"n1".\u"o'ZE09C{",1A?"!B @Zk%0d!#GC8G_#N/&O'"Kn_"\to'N"Z?"!{@Zk%c!=A#GC8G'O#NO'\|#nZo'"!?"{@Zk%tc!O'o'@ZH{@Zk, P.J`"FBGO#'NO'?#.#\|no'Z"!{?"@Zk%b!"FB0F'O'O&R""N"n"\xo'"Z?"!{@Zk%|b!.#!G>CYG#n&O'"_"\to'N"Z?"!{@Zk%b!5"FBGE&:9 CO'o'#"{#n_"\to'N"Z,1A{?"!B @Zk%a!"FBG?#.O&Bo#n#o'NO'\r"Z?"!{@Zk%Da!=A"FBFo'O'#?#\{o'."Z!?"{@Zk%`!O'o'@ZH{@Zk##GC%`!\F13AaF&O'\o'M"sF"Z{,ՠ@Zk 9A!G_'Z#-9GAE`O'o'Z&"{!"C"@Zk&"' A A ABSFqFQF?O'o'Z"!"{C"@Zk?#{/Kͱ,AB pO/ DZOKzGpO?/./JN"AF^BrFo'O'&""#\{?#.o'Z"?"{!@Zk%0_!5CO'o'@Zo&H{s"@Zk-_&R"2B`O'o'@Zo&H{s"@Zk"FBF 'O##"-?"NO'.\|no'Z!{@Zk%x^!"FB0F_"N.o'O'&Jnx"#?#\{.o'Z"{?"!@Zk%^!#GCF&O'/&1"_".o"Nn"\uo'"Z?"!{@Zk%]!#GC8G_#Nl# .&/O'/".P JK_"Fno'\t"N?"Z!{@Zk%0]!"FBGO& _#NO'/'9#o#.n#\ro'"Z?"!{@Zk%\!n"aF~BF"&_#-##8vK NO'#.n_"o'\t"N!Z?"{@Zk%P\!"FBGO&_#NO'o#n-#.\r#o'Z"?"{!@Zk%[!n"aF~BF'O',#/#."\|#no'Z"?"{!@Zk%[!"FB0F_"N.o"._#O&U JJm#FmNO' #n?#.#\ro'"Z!?"{@Zk%[!n"aF~BF'O'#/#".#\|"no'Z?"!{@Zk%Z!"FB0F'O',""n_"N"\xo'"Z?"!{@Zk%DZ!.#!G>CYG#n&O' "_"CYG&O' #"#n\t_"No'Z"?"{!@Zk%W!"FBGO&_#NO'/'9#o#.n#\ro'"Z?"!{@Zk%V!n"aF~BF"'O'/#.#\|"no'Z?"!{@Zk%TV!3"FB0F'O&O'""nR"N"\xo'"ZB {!#1`@?"@Zk%U!.#!G>CYG#n&O'"_"\to'N"Z?"!{@Zk%U!=`@#GC8G'O#NO'\|#nZo'"!?"{@Zk%,U!,A( A\ñA 4CEEAW@JD4CtFcD///KN#AG^CzG&O'#"_"\tNo'Z"!{?"@Zk%xT!"FBGO&_#NO'/'9#o#.n#\ro'"Z?"!{@Zk%T!n"aF~BF"'O'/#.#\|"no'Z?"!{@Zk%S!3"FB0F'O&O'""nR"N"\xo'"ZB {!$1@?"@Zk%DS!.#!G>CYG#n&O'"_"\to'N"Z?"!{@Zk%R!=@#GC8G'O#NO'\|#nZo'"!?"{@Zk%R!P@B?"f@ F EE.J`"FBGO#N'O'?#.#\|"no'Z!?"{@Zk%Q!"FB0F'O'O&R"N"n"\x"o'Z"?"{!@Zk%Q!.#!G>CYG#n.&O'/"J._"\to'N"Z?"!{@Zk%,Q!4"FBG_#NO&/'O'o#9#.n#\ro'"Z {!,1A?"@Zk%P!n"aF~BF"'&/O#NO'#&K"\|?"no'Z!{@Zk%XP!=A."!F>BQF&O'o"n"\uo'Z"!{?"@Zk%P!_#.#!G>C%O!yG,L r. , ErJ0Q LFB@ B@ C GBD_##GC%pO!\F,n"aF~BF&!\, EY/ؠYK ,Gn#aG~CG D&"/".l.L"." /M#,/rJT JKY 5KF8Go&B s"@Bl##n"N!?"@Sk%pN!"FB0FO&R"o"Nn,# /".DL/o&!l/X KJYK[ yKGzG@ C s" C- "_"N#"?"!@Sk%M!D`J.JF#GC8GO'&0Z#NO'#n#\t_"No'Z"?"{!@Zk%PM!"FBG?#. /L#l/&"\ KzK_"GNO'\to'N"Z?"{!@Zk%L!"FBGO&,_#NO'o#?#.n#\ro'"Z?"!{@Zk%|L!n"aF~BF" # L/O& ,/o#n#Z XK8Ko'YGO'\r"?"Z!{@Zk%L!E$$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1"n"aF~BF'O'&@" #/#.#\|"no'Z?"!{@Zk%K!"FB0F_"Nl".o'.O'#U JJ?#Fn"\{o'.?"Z!{@Zk%0K!#GCF&O'/&L1"_".o"Nn"\uo'"Z?"!{@Zk%J!#GC8G_#Nl# .&/O'/".P JK_"Fno'\t"N?"Z!{@Zk%XJ!"FBGO&,_#NO'o#n?#.\r#o'Z"?"{!@Zk%I!n"aF~BF"L/ #,/O&o#nZ XK8K#YGO'\ro'"Z?"{!@Zk%I!n"aF~BF'O'&T"#/#.\|#no'Z"?"{!@Zk% I!"FB0F_"N.l".o'O'U JJ#Fn?#\{o'."Z?"{!@Zk%H!#GCF&O',_"o"N?".n"\uo'"Z?"!{@Zk%LH!#GC8G_#Nl#! .&/O'/".P JK_"Fno'\t"N?"Z!{@Zk%G!"FBGO& _#NO'/'\9#o#.n#\ro'"Z?"!{@Zk%tG!n"aF~BF"" #%L/O&",/o#n#Z XK8Ko'YGO'\r"?"Z!{@Zk%G!n"aF~BF'O';#/#."\|#no'Z"?"{!@Zk%F!"FB0F_"N).&l"&.o'O'U JJ#Fn?#\{o'."Z?"{!@Zk%,F!#GCF&O'/&f1"._"No"n\u"o'Z"?"{!@Zk%E!#GC8G_#N.f#/&O'P JKO"FN1QeC."\uo'Z"!{?"@Zk%PE!#GC8GO'&hZ#NO'##n_"\to'N"Z?"!{@Zk%D!"FBG'O'/#.#\|"no'Z!?"{@Zk%D!`"FB0F&O'_"N"\uo'"Z!?"{@Zk%DD!DD,##O&L/l/ .!,.[ yKYKJQ CYG&% 'O'h#n# " -".PO"N"\uo'Z"!{?"@Zk%hA! vH 1@- @m0 O##v`H @ `@zG9G@O'o'Z&{""@Zk!. _" #<K!JBuHTJF @l/L/,#[ yKYKzG CCO ,vI B ,vI  H0@B h ,vI B M ?#C0@O,vI C AGZG`O'o'Z&{,#"@ZkB. " "0JBJ3B 81B  (= C@ h #"1`C@@0N,vI \@ AQFF O'o'Z&W#"{@Zk. # "J3gJB? H H ,vI"1@@,A vH 0A@O'o'@Zo&u#s"H{@ZkBDL@GADFG@DbGG lGGGXFG[@G@@?mtI HO' S`J@Fmo'Z 1@"{ "M"@Zk0B ( vH C@h! #lC0N vH |C @QF F O'o'Z&{#"@Zk. # "3gJJB?H=@C`01C (̎O ,B A` ̎8B%f/"&#"F/[ yKYKzG(\\`%`' B_ htB  ' C_\og\Ϡ\ `."!F>BQF'PO#NO'o& #'#$s"."n"#]|"no'Z?"!{@Zk%|CYGO&O'o#n#\ro'Z"!{?"@Zk%h9!O'o'@ZH{@Zk#"FB%L9!G&,po/_#|OK[oKGpo?EO.OJ n"aF~BF'O'&x"#/#.#\|"no'Z?"!{@Zk%8!"FB0F_"Nb".o'.O'#U JJ?#Fn"\{o'.?"Z!{@Zk%(8!#GCF&O'/&1"_".o"Nn"\uo'"Z?"!{@Zk%7!#GC8G_#N.b#/.&./O'/".P JK_"Fno'\t"N?"Z!{@Zk%P7!"FBGO&,_#NO'o#n?#.\r#o'Z"?"{!@Zk%6!n"aF~BF"1B/O&0"/o#n#Z BK"Ko'YGO'\r"?"Z!{@Zk%6!n"aF~BF/'O'"#\yo'Z"!{?"@Zk%06!ЀA  o'%{#/K`O.OJ n"aF~BF'O' #/#."\|#no'Z"?"{!@Zk%5!"FB0F'O'O&R""N"n"\xo'"Z?"!{@Zk%<5!.#!G>CYG#n&O'"_"\to'N"Z?"!{@Zk%4!3"FBG_#NO&/'O'o#9#.n#\ro'"ZB {!#1`@?"@Zk%l4!n"aF~BF"'O'/#.#\|"no'Z?"!{@Zk% 4!=`@."!F>BQF&O'o"n"\uo'"Z!?"{@Zk%3!PAK#@/ /Z @K KYGC -L., ",,.K"R PJ0JQFB D_ '&#8/8K/K`"FB0F'O'"n"_"N\x"o'Z"?"{!@Zk%2!.#!G>CYG&O'o'p{##n"_"\to'N"Z?"!{@Zk%t2!"FBG?#.&/"l/_""\ KlK?"GNO'\to'N!Z{@Zk%2!7"FBG_#NO&/'O'o#t9#.n#\ro'"Z!{!"1@@?"@Zk%1!n"aF~BF"O&L/o#,/#no'Z LK,K"YGO'\r?"!Z{@Zk%$1!=@@"FBFo'O'#?#\{o'."Z!?"{@Zk%0!_"FB0FLo'lO' #?#R"s?"\{.o'Z!{@Zk%X0!DaA `@O'o'@ZH{@Zk##GC%0!\F8%n"aF~BF ,.AE EGOGU @o`Aøo`c C#?`CBB`30/! B!?ABC%`! AOat/ C a# aCA#a`/<!D`a@B Ď c E4rBĎϠĎ&U@ݴ݌WFTW} ݠ@ ! Y@  W@ TW C@C a bC("FB0F&#O'_"N"\uo'DZ"E{?"! D BDcD@Zk%-!D!A a  DGGDR`@') N#AG^CzG&O'#_"\to'NDZ"E{?"D! BD cD G@Zk%,!Da!A `  DFFE&#GC8G_#'NO'\|#nZo'DE"{!?" D BD@Zk%4,!Da! a`DFFEĎ (2@M4n"aF~BF] /'O' "#Wo'DE"GH U G?"Wݠ\yZ!{D@Zk%d+!DA a DAGZGĎE `<@ _#N"AF^B% +!F# /E ü@LC`Gü C$?D@LB`&!A==Wa8TW==C $ ,C(@n#aG~CG&O'"_"\tNo'ZBDF$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1V" "{E?"! D ED@Zk%)!D! ABDFFDR@).#!G>CYGO&O'#n\r#o'ZBD"{E?" D! E DG@Zk%0)!DA! a@ BDaFsFD&"FBFo'O'Ơ#\{?#.o'ZBDE{"!?" DE@Zk%(!D ABDGGD"FB0F&O'PO"N"]uo'"Z!?"{@Zk% (!#@G#GC8G@Oo'& A [O'P# _"o'WBDE"GG?"`TW}]tNZ!{@Zk%x'!"FBG'O'?#.#\|no'Z"!{ @?"@Zk%$'!D ABDFFDDcD_#N"AF^B%&!F"Ҥ#GC8GO'M"\Z!Ml{m m.0.SrJ0JtJFm>ͱk.J81@WC 8K8WKA'A'#kLLM-0@Cmf/fK0 B0C F.FJ`BmIl"FBGl/L/,#o&[ yKYKs"zG-_"N#"?"!@Sk%h%! l".d"J@0OD ?C BzGG@O'o'Z&D,"{@Zk@@ &,"d"ऐWpW L.QJ@0ND B uB8GFO'o'Z&c,"{@Zk@@ _#`zG .#qKP J0F >M.RMJM>""FBG/'MM#ؤ9m##o&SQVs"M""mNn,. .Q n"aF~BF'O' " #P/#.\|#no'Z"?"{!@Zk% ! Ȏ/B @@Ȏ /".0AĎoL#X KJ aBG. -m l/_ zK\K(1@ M _ -"1@@r. vH0 BrJ@O'o'@Zo&H{-s"@ZkBDJ@GADFF@DFF FFGXGFT@F_@?_' @AZ#0 @:A'1@`O'o'@Zo&.s"H{@Zk0CFO'o'ZF{EN"-""@ZkO'o'Z"'"{C"@Zk1v I_"2B`O'o'@Zo&6.s"H{@Zku IO'TJo'FZM"&"{"@Zk 8/8KW`TW K @Ck-m.Q.J A(Q@QJ`B"c+/&_&/R"K CKm͠/&vHKP@B W`TW==2A`O'o'@Zo&H{.s"@Zk4v IC 9 C!GO'o'Z9Gȃ{E""_".""@Zk_' &AZ#:A`O'o'@Zo&H{.s"@Zk<@GO'o'ZG{EN"-""@Zk0v I?"B@O'o'@Zo&.s"H{@Zkmt IO'S`Jo'FmZ"'"{M"@Zk0B ,/ #d_#8KA0`OE C \C0F {GO'o'Z&."{@ZkMLA!h@" F3`"FBG/'/9#.L#N?"M" 2JmO'" #p`K\KP/#F'#m."S rJFm>s2J?".TJtF>.]|nZo'!{@Zk%!"FB0FL"#N-# K#m "P/"_"u`JTJF&M/Z YKzGM?zKm/[yK[GO'm?o'".?"]tNZ!{@Zk%!i "G4.#!G>CYGo'/{#n#"" tJ-# M#-Po##rJQ J"QF-O&?".U JG>utJ /XKF ?-NO'no']rZ!{@Zk%8!1n"aF~BF"## |KM"m"P" "-zKY K'YG-O' .P J0F >p|Ko'-.Q"M?"n]xZ!{@Zk%p!Ď/!C,vI@LC` ̎/@ B A@@B̎o̎ @̎-m 0 CM@/@K<`C0B . J@BMn"aF~BF"-'# _'M- #m "" "?# #11B."?"Nmo&,s"M.!@Sk%8!M!_@Ho#0`C@0N D \B BF1F`O'o'Z&{0"@Zk '1@XB C `A 1AO'o'@Zo&0s"H{@ZkD@GDFVGD'GVG GGX`GVG@VG@ 1vH_"2B0B'1@`O'o'@Zo&H{0s"@Zk Az)! H.O'o'T J'"F>t HI". "UJF>Z{@ZkL)! A 0ALOm A -B 3 HO"0@B@0ND C BYGF O'o'Z&(1"{@Zkm\ @{| H/_" 0 BA`0NE B uB8G FO'o'Z&K1"{@ZkZAm`H0CH- _"FBG ,O&l#@"Y?"Z[O'N\ro'!Z{@Zk%4!lsO'o'@ZH{@Zk&^\#GC8GO'#@"?"OO'N\|no'Z!{@Zk%!."!F>BQFq."q"xtJUJ ,#Gq> l/ L/[ yKYKzGl/lCP"N C BrF1F@O'o'Z&{1"@ZkO'o'Z"/"{@@ZklBPO B BYGG O'o'Z&{2"@Zk@o o&.<A K2s"P J"0F>pK2 A .m#PA_"Q JF >XAn!.o& /(s"-"JX KG9QB-n!".?"N!:YB@Sk%!!.l".@U JJF9C@/: Cn#aG~CG&O'_"o'"?"\tNZ!{@Zk%X!O'o'@ZH{@Zk.#!G>CYG,E E.AQ.n"/!.o&m#X KJ(s"G9B-B@n!B@-"._"N":B!?"@Sk%!n"aF~BF/'O'#o'"?"\yZ!{@Zk%!O_ooO'o'@ZH{@Zk##GC%X!\Fn"aF~BF&#\.A  ,9- L .z/PJzKq\K0F >܎O@n"aF~BFo&gs"" #?#."!?"@Sk%!܎܎/ a/#. .A/[ aKJQ CYGO&O'`#"oo'?"\rZ!{@Zk%H !o"FBFqO/#q/#{KZYK #zGqO? ,. .Q s@J#.PA-"_"TJtF>o&(s"L/,/Z XK8KYG;QCm ".?"N!@Sk%!!..l"@U JJF9C@/N#AG^CzGo&O'_"o'"n?"\tNZ!{@Zk% !JG~H $ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1="1.#!G>CYGo&s"m#n#"?"!@Sk%!9"FB0Fm"no&s"O&]5R"N""!?"@Sk%x!%"FBG"mo&&?'0s"O'_"M?"-" #'mZ#M9#-""#"?"!@Sk%! M`/@/ #"" [ yKYKzG0C b.B.S qJQJrF B B-  /"/Y 5KK8GB2È_#GCF E.Al/'/59#4M#o&K.s"- EN m##"n2!B F!?"@Sk%!O'o'@ZH{@Zk"FB0F E.A E8/3AB58K  G D!D L !"@ԎO0Cl؎o."!F>BQFo&$6s"no&s"-"# ""?"!@Sk%!O'o'@ZH{@Zk#.#!G>C%!yGh#GCF/&.A\1-LRMls`B -//Y-KKzJYG-?E #vI ?E.#q|KPJ0F>M / @BPNa _B rBGFO'o'Z&}6"{@ZkO'o'Z"{"@@"@Zk-  CPaO@ ?C YCF{GO'o'Z&6"{@Zk@ `.@.S `J@JrF""B"FBFO' ?#.o'&Zs""{?"!@Zk% !  "`/@#[zK`? " .""#@.0JR PJQF @"`B"FBG #o& 6s""_".?"Mno'NO'x{!pZ@Zk%d! <I( sB l_"SBO'o'@Zo&H{6s"@Zk /vI KFd/D/vI[ dKDKzG(Gm@#GCF-  BPaN@ ?B QBFsFO'o'Z&7"{@Zk@ @/ /Z @K KYGm /`CPAN.!. CJQ !J0FC CFRF`O'o'Z&{*7"@Zk#@! !//Y !KK8GM o@CP!N/ _C.KP JF`C zCrF1F@O'o'Z&B7"{@Zkf@/'#O'#L79o&no'W7s".pZ"?"x{_"!@Zk%4!n P@C# ."."#Q m `m'@ Ԏ؎ Cm.#!G>CYGo&o's"-8{#n "_"#N"?"!@Sk%P!n"aF~BFx-IMo&.s"/'UJN89#G>M#Nm#n#".?"!@Sk%!"FB0Fm.M"t2I"SrJ #Fm>o&s"#M-#n".?"!@Sk%h!{#GCFM.-"s1IRQJ"rFM>o&s""M?# #."?"!@Sk%!^N#AG^CzG .#qN""no&tns"M"?"!@Sk%!A#GC8Gm/M#|:I[zKo&Gm?t^s" "-"".M"M"?"N!@Sk% !$"FBGo'_'E.Z#M{O&# "?"mO'".o'8Ro&8s""NpZ_"x{!?"@Zk%x!" ?E F@ È_#n#aG~C%P!G~"FB0FO&.A\R'O'MP/# #"l E/?"Ӡ.K F]|no'Z!{@Zk%!O'Ďo'Z/&ȃ{"""_"B91"@ZkĎ_&7HR"" ?"Ў/@B@"ȎO̎ohhBPO B BYGG O'o'Z&9"{@Zk@ #/ gK\ KF?|gK.PJG>."!F>BQFo"no&Ͱ(s""""!?"@Sk%l!ЎX/ C@n#aG~CGЎ&O'X/"XPO"N."o'"?"D]u!Z{@Zk%!̎ / C@ 5Ȏo̎  C @ OTO ̎opB" ̎ .#!G>CYG&O'" o#̎#n_"o'"H]t?"N!Z{@Zk%!̎  B  ȎϠOXo @C `C'BXh/ hO@BPN` _B rBGFO'o'Z&:"{@Zk@ `/@/[ `K@KzGd/#ddX@ @ XO GB0@do\6\`\`` `/`O@`d` |C`/ \@`On"aF~BF`&&[;" @#NO'`## #.P#n_"]to'N"Z!?"{@Zk%T!"FBG /#.&M#NO'd#ͰP"m#n_"]to'N"Z!?"{@Zk%!"FBGO'&;Z#N/'O'P#o#n;9#._"$]tNo'Z"{?"!@Zk%h!H TBD N#AG^CzG&O'#_"X]to'N"Z!?"{@Zk%!"FBGO& O#NO'o# /#n.#o'"H]r?"!Z{@Zk%!n"aF~BF/'O'"#\]yo'"Z!?"{@Zk%D!XO @`GdD`_"FB0FE.Ao'O'T#3AB?#\]{.o'Z"!{?"@Zk%!T# /DGBE@n"aF~BF/'O'"#X]yo'"Z!?"{@Zk%L!N#AG^CzG&O'/" #.T"_"o'"H]t?"N!Z{@Zk%!`"FBG'O'/#.#\]|no'Z"!{?"@Zk%!"FB0F&O'O"NPo"n"]uo'Z"!{?"@Zk%0!#GC8G'PO#NO'#]|no'Z"!{?"@Zk%!"FB0F\O\'O'`O`"o'`\o"?"\xZ!{@Zk%x!\/?N#AG^CzGo&`'s"<# "-"M_"."N!?"@Sk%!n"aF~BF/'O'"#X]yo'Z"!{D?"@Zk%!O'o'@ZBDH{@Zk#n#aG~C%!G"FB0F Ll.Ao'O' #S?#t"Eՠ?"D\{o'.!Z{@Zk%!@."!F>BQFl'O'"S"o'\]x DEZ"?"{!@Zk%x!TO?# oD%G[CE"FB0F&O'O"N"X]uo'"Z!?"{@Zk% !#GC8G& O#NO'#To#n_"o'"H]t?"N!Z{@Zk%!"FBG'O'/#.#\]|no'Z"!{?"@Zk%H!"FB0F&O'O"NPo"n"]uo'Z"!{?"@Zk%!#GC8G'PO#NO'#]|no'Z"!{?"@Zk%!"FB0F\O\'O'`O`"o'`\o"?"\xZ!{@Zk%8!\/?N#AG^CzGo&`'s">#m "-"M_"."N!?"@Sk%!n"aF~BF/'O'"#X]yo'Z"!{D?"@Zk%|!DAGZGEBDp_##GC%\!\Fn"aF~BF .A'O'/##.E\]|BDno'ZE"{D!G?"@Zk%!T/ O"DF2BE`"FBFo'O'#?#X]{.o'Z"!{?"@Zk%`!#GCF&O'o"n /".TO"N"o'H]u"?"Z!{@Zk%!#GC8G'O#NO'\]|#nZo'"!?"{@Zk%!"FB0F&O'O"Po"Nn"]uo'"Z!?"{@Zk%D!#GC8G'PO#NO']|#nZo'"!?"{@Zk%!"FB0F\O'\O'"`O`o'"`\o?"\x!Z{@Zk%!\/?N#AG^CzGo&'`ﳰs"?# "-"_"".?"N!@Sk%$!n"aF~BF/'O'"#X]yo'"Z!D{?"@Zk%!BDAG @ZGcD`#GCF&O'1A-M"NPo"n"|]uo'"Z?"!{@Zk%T!ø @.#!G>CYG&O'&;@P/"m#.o?"_"|]to'N"Z!?"{@Zk%!E[_##GC%!8G9LZ@_D!n#aG~CG o'LO'?#" 2?"`t \{.o'Z!{@Zk%(!#_DG_DDFU_#H:$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1 O"BN"AF^B%!F#GC8GO'.A\Z&"_"MO'lE?"{mo'\t"N!Z{@Zk%l!"FBGo&/'Ďs"?9#.#m#M#nN"?"!@Sk%! !"FB0F&O'o"nM""o'"N?"\uZ!{@Zk%! D'#A  :# vH:Q@\CD`:AK:W@KAZ'ZAZ'Z#k8( $$L (  x L ( ;Ԏ,؎/* N"AF^BrFo&4s"" #?#.""?"!@Sk%!N#AG^CzGo&s" "_"#N"!?"@Sk%! !"%!n"aF~BFO'#"Zo'&@s""{!?"@Zk%CYGO&O'o#n#P]ro'"Z!?"{@Zk%!m=`B"FBG-&o':1 CMO'C{#nP#|]t_"No'Z"?"{!@Zk%P!2Ԏ#GC8GPO#'NO'#L]|no'Z"!{?"@Zk%!"FB0FԎo"no&ds"O&NCR"N"" #?#."?"!@Sk%! M!@ /Xo @! ;@"FB0FM'O'0@BmP""o'|]x"?"Z!{@Zk%!y؎/ N#AG^CzG&O'P#_"L]tNo'Z"!{?"@Zk%!a"FBGo&ds"/' "C9#._"N#m#n؎O#N"?"!@Sk%0! FԎo`"FBFo'O'P#?#L]{o'."Z!?"{@Zk%!.#GCFm"no&ds"/&C1"ԎO"N""#".?"!@Sk%d! ؎/ N#AG^CzG&O'P#_"L]tNo'Z"!{?"@Zk%!"FBGo&ds"/' ":D9#._"N#m#n؎O#N"?"!@Sk%! m=`B(-8B M :C`01C ."!F>BQFm'PO#/'5BNO' #D9#.#|]|no'Z"{?"!@Zk%!2Ԏ."!F>BQF&O'Po"n"L]uo'Z"!{?"@Zk%!#GC8Go&ds"O' "DZ#NԎo#n#-"._"N"?"!@Sk% ! m7` /X @! 4@0m9C-OX zC@ @/M"XoQB @5B#GC8GMm& "P/"zCO'_".o'|]t"N?"Z!{@Zk%8!2؎#GC8GPO#'NO'#L]|no'Z"!{?"@Zk%!"FB0F؎o"no&ds"O&bER"N"" #?#."?"!@Sk%p! `O@n#aG~CG&O'P"_"L]to'N"Z!?"{@Zk% !`/BP"O B CzG9G@O'o'Z&E"{@Zk @! M!..Q !JJ0FCC`s"FBFo&Xs"-#M#.#N #n"?"!@Sk%BQF``"n/BPO B BYGG O'o'Z&ZF"{@Zko&ds""@ "-".{#n_"N#"?"!@Sk%! >n"aF~BFo&4s" #-#.#n""?"!@Sk%!(#GCFo&s"-".M"N""!?"@Sk%h! `#GC8GPO#N'O'#L]|"no'Z!?"{@Zk%! ``/M! B AB`X-@`/  @O#GC8GO'FZ#N`/&O'PO"a#n`"o'#`O "`o"N#".?"]uZ!{@Zk% !`\``.#!G>CYGo'YG{#n&`O'Po""#`/o'"`O" "".`o?"nC"N]u!Z{@Zk%t! `  M!C AC`-OA@B \@ -OXO @@B R@`X"B@@ -M :C`#GCF-M/'O'"3QBmP"#o'|]y"?"Z!{@Zk%x!N#AG^CzG 'o&O'1B-P"(Hs"nM"N"|]xo'Z"{?"!@Zk%!--9N#AG^CzGo&s""_"#N"!?"@Sk%!&n"aF~BFo&s""#"?"!@Sk%h!.#!G>CYGO&O'Po#n#L]ro'Z"!{?"@Zk%!An"aF~BFo&$Vs"&{H"#"?"!@Sk%!.#!G>CYGĎoO&O'n#\ro'"Z!?"{@Zk%t!n"aF~BFo&4s" #-##."n"?"!@Sk%$!_`O&O'SRo'`"R"?"NZ!{@Zk%!o&Hs"'..ФxU JJF`BSO'o'@Zo&Hs"H{@Zk#n#aG~C%!G "FB0FO& "\R".AMlA0O A BYGG O'o'Z&H"{@Zk[@#{m C O'o'@Zo&Is"H{@ZkN"AF^BrFM_"9׀JxBC[_CCB`C@&O'o' B."\t?"N!Z{@Zk%L!"FBGA0N / #M#- A C:DK KQFYG F O'o'Z&{8I"@Zk3HZ@`BǍ! o&.(s".'#HU JJpZ#F/#L/VI#."N?"n!@Sk%d!A0 N# " A BrF1F@O'o'Z&{pI"@ZkT@!B @/ CN#AG^CzG'&O'L/"I#. "M" "No'8]u"!Z?"{@Zk%!DI#GC8GAN ## C AO'QFIZ#NF O'o'Z&{I"@ZkA ̌ _#.XK.m# [KU JJ "Fy`J&8G M"m""/\ KF?|[KO' .PJo'G >"-?"Nn,]uZ!{@Zk%`!D7#GC8GO'IZ#NO'o'/&ZM"{1""!@ZkO'" #?#A @-za"`m2`Kq{C2B1BBo'"?"x]{.o'Z!{@Zk%!D#GCF'/&O'O&o""OJR"NIJ1".n"$]xo'"Z?"{!@Zk%!DM?#{ KZ@KzGM-0CQ JrJQF- "/ vH@0ND C BYGF O'o'Z&J"{@Zk[@{#GCFA0`N?" _" A LBFsFO'o'Z&{J"@ZkO'X/@#Zo'/&"!{M"1"@Zkm"" #"A @-z!" -?"0 K|9CCC`CM/#@#"Mno&s".n!@Sk%P!DU #/ vH@0 ND \B BF1F`O'o'Z&K"{@ZkU@=#GC8G-_#!v H` @0O!D B pCQFG O'o'Z&K"{@ZkS @"@PO @ BYGG O'o'Z&4K"{@Zko&s"@{#n#"?"IQ'2$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1"S!@Sk%!&"@ N"AF^BrF'O'""L]xo'Z"!{?"@Zk%!I.#!G>CYGo&O'_"<aC\to'N"Z!?"{@Zk%4!"FBG'O'-#.#t]|no'Z"!{?"@Zk%!"FB0F&O'M"N"4]uo'Z"!{?"@Zk%!'#@ N#AG^CzGO'ΰ#o'pZo&Ks"x{"_"!?"@Zk%,!!_#N"AF^B% !F\ #GC8GO'.A\ZM,o,/\CC P@ @$-rH "Q J"QF-M"v@H@@NBD C BYGF O'o'Z&{K"@ZkǍB 0@/b/ @\ KbKG A0 vH A 0 vH DN"AF^BrF'&O'/'L"" #L9#.#8]|"no'Z!?"{@Zk%!D2"FB0FO&(LR"#N-# K2#0o "-"_"u`JTJF&M/Z YKzGM?zKm/[yK[GO'm?o'".?",]tNZ!{@Zk%п!D,"FBGO'/'cL9#.o'/&Z1"{M""!@ZkO#&MO'̌o#m# "_"x]to'N"Z!?"{@Zk%!D"FBG& //&m"O",,C<CEEA7@KL1"<C|GMO'. "Nn"o'$]u"!Z?"{@Zk%x!D#GC8GM#N&O'o' "/".L{#n# _"o'"p]t?"N!Z{@Zk%!D 6?# vH5@B@5J5WJA&lBA&lB"k<00VN#AG^CzGo&t3s"CYGo&s"o#n#_"N"!?"@Sk%!n"aF~BFo&s""#"?"!@Sk%d!;.#!G>CYGO&O'm#n#t]ro'Z"!{?"@Zk%!n"aF~BF/'O'"#4]yo'Z"!{?"@Zk%!_'Z#@`#GCFO'ΰ_"No'pZo&Os"x{"_"!?"@Zk%T!:_#"FB%H!GQ9A!GO'9G\ZMl{mdK vHP@0AF FE`.O'@.o'."S `J@JT JrF !JA"F>t!J ".UJF>Z{@Zkͱ  K- vHP@:AAG ZGEO'./!.P JKQ !JF aK"QF!>qaKo'A.RAJ2FA>A"Z "{@Zkͱ lsmdJ,vI PA5AFFE,/"L/,"`/@",KZ LK[ `KYG KO'G`?{K/\K|G?o'Z{@Zk&ͱElO#J -pO.ROJpO>PBd lo/ //[zKY KK8G|H Glo?0@,. .Q ,J J 0F @!@ 0@A-0O"a. A.aJT JFBD ,CzGG@O'o'Z&P"{@Zk"@";_"0. #<K0JB"FBFmO/m#9@{8KZXK?"zGmO?O'"/8O"PCho'&Ns""!Z?"{@Zk%!D2@"FBG &m Q" m"@/" /[`KPB-Z @K K"YG|HO'GmDO#no&Qs"N?"N_"5//no'Y 5KK8GB!pZx{@Zk%!:/./J8N"AF^BrF O'Z#"&NO'"#?#.##n_"\to'N"Z!?"{@Zk%T!"FBG'O'/#.#\|"no'Z!?"{@Zk%!O./."R PJ0JQF0Jo3fJ`"xJUJGà/O{ KZ@KzGO Ó/.#.OQ CYGo&l?s""#_"Nm#n"?"!@Sk%!D@n"aF~BFo&(s"'GDM#N#n/#.Q#"?"!@Sk%!#GCFm"no&(s"/&R1"O"."N"?"!@Sk%s2J?".TJtF>.,]|no'Z!{@Zk%!D,/ = BT@n"aF~BFo&=s""?"!@Sk%!<,5B.#!G>CYGo&t3s"o'R{#n#"?"!@Sk%@!'"FB0F"`BPN M"N/ B B8G FO'o'Z&R"{@Zko&s",@Z#N#n"?"!@Sk%!#GCF/&O'"2!BN\uo'"Z!?"{@Zk%L!#GC8G OO&#;ACnO'\ro'Z"!{?"@Zk%!,n"aF~BF"#O&O/m#//#"Z XK8K?"YG O'np\ro'!Z{@Zk%|!n"aF~BFO'8"#o'&Zs""{?"!@Zk%$!o/oK-@p"FB0F&O'O"N"\uo'Z"!{?"@Zk%!#GC8G_#O&NO'o#n#\ro'"Z!?"{@Zk%d!@n"aF~BFO'#No'o&pZmSs""x{!_"?"@Zk%!_O#o#O쏏#o" O'o'$ ,< @ZH{@Zk#N"AF^B%!FP#GC8GO'eZ#`!?" ". BG@Zk/P_#m#\Kp[K/&F?O&t\1"m"/'-O'p\R#o'"M_ ?"n  H\yZ!{@Zk%ا!N#AG^CzGO'α_"N# "Zo'&s""{?"!@Zk%|!_H"FBGO'/'eZ# "X!H\٠?"BG. @Zk/Q_#m#\Kp[K/&F?O&t\1"m"O'-#p\Ro'"_ M?"nf"   !Z{@Zk%!.#!G>CYG&O'α n#n#_"0TtNo'Z"!{?"@Zk%P!"FBG-#.L'#"NO'P\|Dno'Z!?"{@Zk%!,._",JBA` ?"FBG.#.N#NlO'#f"nZo'"?"!{@Zk%|!N..."mR PJ0J3v`JQFB.//" LY 5KKz/8G J[ zKGz?{J/\K|G? , Q. JR QJrFQ>rJq.SqJSFq>O'o'@ZBDH{@Zk#"FB%!GD.#!G>CYGO'o'eZ#D!H\۠?" ". GB@Zk .S#qKO&P Jo&0F >t\R_  M p\sm.J4J .#!G>CYGm#n# O'_"No'Zf""{?"!@Zk%!m"m?# / KB@ l` .?" JC@l`O'eZ#?" ". GB@Zk"" _ ,/_#,KC`  L."LJ3B L/#LK;C ."!F>BQFm"n"O'#o'Zf""{?"!@Zk%l!.#!G>CYGO'_"αn#N#no'Z&s"{"?"!@Zk%!)_`"J.h.$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;15<"dFBGO'eZ#?" "`!. GB@Zkm/T?#M#|:K[zK&Gm?t\/&_  p\1 -l.lJ2GJ@#GC8GN#NO'm#α#no'Z&s"{"?"!@Zk%!O'o'@ZH{@ZkP"FB0FO'eZ#`!?" ". BG@Zk.U_"m"uSJTJ'F>t\/'m#M# &p\9_""_ -?"no'NO' H\tN!Z{@Zk%ll&U"x"hoddGFDD6GD6G$O'o'ZQF{`"?"G "GF@Zk%,!dOZ=@doGF`CGd|GFG`CF`GFGX FFCFhoGF`BFtFFLFGF`FFGXGDFBDFFvGD`BvGO'o'ZQF{`"?"G "GF@Zk%,!O'o'@ZH{@ZklpE<7KqE! 1!BrF3BJ /FrF3DJ;BrFG`QK`[K2F;F0>k0.\KS[JGQ;J?3F0>krFF3DJ`qCp/[pKrFSPJ1$B{Fp?#F  F `P>B;bC`P>BG`P>B p/RQJ[qKrGp?kP>1$BP>P> P>B? 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p  0 @ P ` p  0 @ P ` p  0 @ P ` p  0 @ P ` p  0 @ P ` p  0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`pK|Σ$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1"u 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p  0 @ P ` p 0$%@%V1.1May 18 1993 12:51:35VTBOOKV1.425eCGOCGO@@ACGOCGO@@A@ @0@r@r@b@b@b@r@r@ D@jnJ}*:j1 7:g^fn ~NP[rhjmpz&v* .   .  #b M lr z B J   F:A&G.J2w|*fnr v;AHvxFJVZbf+b0jt>wB|R~Vj>BRVhEBTVXZZfvy~~ 2 : >2 ? D F    j  r  v  z    4#%7#%B#6&O#&Q#&b#&d#&o#'q#'t#&'w#*'z#.'#~'#'#'# (#.(#R)#V)#Z)$)&$))$)=$)?$*]$n*_$*$&+$2+$B+$J+$N+$+$+$+%,(%,1%,@%6-D%:-l%-s%-z%-}%-%n.%.&/ &/&/&/&/&/b&0e&0j&0l&0u&0&2&2('4,'4'6V6V7;W9AW9MWN:PWR:zW;W&;Wz;W;W;X=X=%X=(X>PX>VX>aX&?jX.?xX?X?X?X?X@Xj@X@X@BY.BEY2BRYBBTYBB~YBYBYBYfCYnCYrCYJDYRDZDZDZE;ZnE>ZrEHZEZ6FZ>FZBFZVFZrFZFZ2GZGZGZGZGZG[6H [JH[^H[bH[~H7[HD[>IK[ZIx["J[J[RK[K\~L \L\L\L\L&\M.\"M:\vM@\zMi\Ml\N]6Q$]RQ]T]T]T]T].U]>U]BU]U^U^U^U ^U^U^X^X/_[0_\\2_~\>``E``t`ax`a`a`b` b`b`b`caVd1ad3adOaeQa2edarea^fafafafafb"hbBh!bh%bh(bh2bh5bhbib>jbBjbBkckckckqcmcmcnc"ncocoKdpPd pdpdpdqd rd"rd&rdrdrererer"es%e s+es.eseFueNueRueVueZu?fwHfwNfxPfxRf>xlfxnfxfFzfNzgzgzgR{%gZ{(g^{7g{=g{@g{egR|}g|g|g}g}g~g~g ~g~g~hzh(hahzhhh^hbhfhvh~hhhhjhxh3jƆ9jΆqfr rr&r)rž>rFr_r&hr2rҟrRrnrΠrrrss~s4s@sFsLsOsZs2ssys|ssҢss sNsVssƣss&s.trtvt%t2tktƥotʥrtΥt֦tڦttttt"t2t:tNtbu uuuu$u'u*u ;ufDurduuu&u*u.u2u6uuΪuުuu*"z2\zl^ztzvz>zzz:zBzNzjz~zz­zέz֭zz{ {.{2{>{N{j{r${&{){,{.{:Z{n{{v{ư{ {{"{>{R{n{{{{|ұ | ||||"|>!|F&|V(|r+|v/|z8|>|@|J|ƲL|U| \|b|h|*j|Ft|Zv|vz|z||||ҳ|޳||>|J|j||.|J|µ|޵||}}6 }z}$}&}¶<}">}>}}}}}}}&}~~J~V~b~~(~*~L̾$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1~"=~R~n_~`~лb~~Z~~.~~~½~ʽֽ  <Dnbqfxlz y؀&V/f16?ЁruxZfǃɃڃZf:%*0 37?Ter.wB 2„r~".J&AC Yv2:>Zȅ̅ F<Q]2h>w$FˆjΆnۆ.2 ,*0.V^hj{":J^ۇVf"NbRjmot}B^tˆ.2)Z+v09MOevgf&5&D:KBkzp~r}R >RV'j<HLJnZsxRNj>ʋBr !#OVRZWfZj:b܌ߌ2 B^z46 GrHtJ2:CMJPNVfYj͎~ӎՎڎ9? ̏Ϗҏ^ad;>Avz~ϑbґfՑjNRVc:f>iB&*.ADT6djizk~y~ՓZޓjnR'25ADQ&T*[n_rbvorNR̔ה*^ #6 3j C S c f t> r         " ɕ2 ̕6 ϕ: וF ڕJ  &  0 =: @> ljv^̖jԖrזv 6ʗ2ߗglØĘƘ6249^BnVXnp6ؙܙޙ#8>J*M.U:X>i~bf>ƚFӚ֚*$(CfTYfh0jR Лr ӛv   !!2!!'"<f"N"c>#~#$z$%Μf%ߜ%B& &!'='O'\2(jV(nZ(xb(~(((((V)ȝ)̝)&*** *****!*-&+0*+86+I+^+oV,tZ,,&-.-~--Þ-ƞ-Ȟ-˞-Ӟ-֞-.z...+N/=/B/O 0P 0R.0d^0gb0kf0qr0tv0xz0~0000000ȟ1:2B2F2R2V22#.343F4[f4m4>5566̠6ޠ^77288( 99j9K9`B:t:;n;r;v;;̡F<ԡR<ޡb<j<<<< <$<8>=M=W=d=n=w=>>">&>>>¢>Ƣ>ޢ?"?&?>?f?z? ???3@8@;&@A2@^@u@w@|*A2AzAAAãBɣBУ"B:BJBnB zBBB B'B+B0B4B8B?BFBJBhBvBCCCD"D&DŤ2D֤DDbEfEE-JF2RF?F@FBFXG[ GpnGGFHHIΥIۥIIIJ JjJJ,.K02KKK\KaLnVLyzLLLLLLL2MæMզNئ NvNN N>OBO3OIOMOQOTOXOZ P{VP^PbPjPnPrP~PPPPPPPħPǧPͧPѧPקPۧPPPPQQQ*Q$:Q5RQ@ZQDbQGfQKjQNnQW~QhQlQQRRR"RɨRߨRRRRRR6S,NS0RS4VS7ZSHrS`SvSzS~SS TTTͩTѩTթTةTTTU *U .U>U FU,NU/RU5^U9fUCvUL~U`UcUiU.VFVJVNVRVfVrVҪVVVVVWzW2W6W:W=WCWPWXXXXXYY Y"Yī(YƫJYYYY:Z!BZ$FZ1Zu[{[~[[6\>\\\ˬ]ܬn]z]]]]]]]']Jj^]^a^d^k^__` `n`````a6a6a8arVbbbb6cRcҮcԮc߮cccc VdfdF.eL2eye|efffgggg%g,gI2hhhðRiŰniʰiӰiiiRjZjfjzj0j4jOFkSNkYZk\^kafkdjklnkkkklrlƱzl**n4VnRnZnnn|oovo~oòpƲ"pȲ&pppppp&2q)6q4~qOqRqp"rzrrvrrrssʳjsгns߳ssssJtRt8t;t>t@t`FuhNu|^ufuuufww6w>wQxYBx[Fxfxhx*y~yyȵy˵yεy>zRzz"z8{<({>J{U{Z{||ȶF}ٶ}ܶ}}}}}~"~&~W\m΀Ҁ˷зܷ߷ >+b=@Z.]2wy˸͸ ҅8jyֆRٹ.6N VZf(r8~Yfls *.6Ǻܺ‰҉ډމ"* ;C&R2z.»Żһ߻v ƌҌڌ#ތ*BRRn_.2ڎ*.ڼNd<KT&Z2qnr’ҽ߽jn ғړ.:>HJƔp>ZnѾƖ޾~*::ER\`e˜.4VbM|qn$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;10"jۿr z), ʠfr~ >BN,08ƢGLfjmrrvڤ>B%4 8RrVvYz_ou"&.F(f?ҨD֨Lި[2`6z~z~ΪJʫ8>@JlpsRVZ 26VZ6BPWگޯ&9 @S^UbbdsvyF*.t">"i ?BEcf l&oBº"=@I&UzX~[jּv*z޽FF־n"vS:V>YB&.2oJrNbfRb>JR &DQY&a2lN|jZ^zJ^Pf*.Bvzj-5<IJLN[^mrHj2%^4DI*N2Zahm.qDsfV^z&:B!$INSbe*<^~6U*XB ^*<  * -W|\'PV  : wU0~ (@ - ~  &@ 8299@p~h~ZVpATT0\<  B ``L@-0<l3Ȁ `x VU€ <*X*'@%@ >*j0  `` L@M@- A* 9p !UA  p` *4@,i @ W* 1PU1 *TCPPVPU(c`BIC@B v![ 9D @l  (p !;$` "`@@-` 0 4A0@`  T`2IAT)@A IAT(@%!8`P!@P !dI@(!KBBJ*@!%H/~@@I~ vH &W`@8@@@CXA V@ \pPT̀0g@),T@%U*@h%$@0904 @ @d* <$'JZAZ  20aCPL @l $UpJ-Y @ h|@ Z9A. B̲%)U .t@mŮ] |C.T * `Oy o V@\U(EL@< l @ @& P3@ʶp73p6b`1@v2 d@X `;PAs2<H /** g 5 `PP*TJ*U@RUD J*U<@*T0*UU $$PR ` @IH(8T @ @ \#$a`Y B*PVPo( .0 d@@@NC}X `v2 00$ *T fZJUI*R5, =ԇ@  p%=ԇ@  N&H A $H A  $u@Ҁ$fHaSk6@qZ!`jkg*-T!S `B* @T@aB@**`` U © PU?n~%iIχNH t/~$_ IJe!P( B `@@,XS H/@UP(,g d $%95)%@c3=*!;*wU0!{UAT@e5R *Ux3PUS5ʇn0 PHEnp0` (7I*ZPpk  R C 0@@P!JU p-p d I>p c`~3a@JA cJ`Ր@8A[!h m-PR%  m-P  !@@U 0a@@pC %AT *8,T0 ^BTPp @&4@8$CCH CH+@``U  @Pp(@`! @H(  B-$U+ @RX U0$9TxPX@$V`*#0#0TT<| HL`PPT0 XP \ `@ dhlppt`p P  `pp0 @ 0p )P@0 p $`(,@004 8<@DHLN~"d $ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1mMԞPNPe2o]J=s``}%D̕₄NA̅p3"7M99wda _w$AW#Q1ç?JH\z.6m\#7sh9$?[//m A:S(PA- uOu !K@cx *yXMعD"}!)F#Zmmhd83XlR'_R,Nꡰ' A":.)$jdb=ˇYXVp$bK8fLyy ܮ셉CLwJsr+(Jl ?Q?$tM=pQ! -Kb%*?jɤxȳo6Why_9Inww$cJ ӦJ$UƷĊh *LO? Q晊T#ƘbHynP #?A 4/@Im>Z%&GNm^ E*zQ{C"*Ʌ1_@GǂGY[E21_C -̻>O0]v]p[z޼lo b/g !% R!BGTVj_*ŭ'vZQ\oevbٻ /Q2WkQAIDĻm;  P*Ӿg2ϕX|s[zY(zzGM'\ؼ(hZY H_2ʾ4J]:|15@Fܩn7\o1OہؖEc|bIѹJcѫ+ٷG:[>rCp>Qfȗ_ B3}PKuP;/+li?,L 4 9+T2D[ jw#C! 1qW`#1b\`չ!=DZ}H @Hi); 6ĈC-j1 #|g 7ܺ /| n_I+CooGee?ADMNɹ$ʥ#w 5VpW99"]S( oaAz_'ξ5qP2x Y$>8*/E ߯1fnYCn BBW0$]TMtAEDfo<,&J͔,Z+*_= fu-6ܠ828>U-Ҹ4!S9'~HԒ i>WoN9gpR8(?8|:w)i}6t,Θ\,C7RGۙ-j׫ʼnAudJ9zP${njyO"/6>Xx4duADCx6pؕ\"9&]Xwtj7q6\=˨ȂPcFS/O8=o7.B!PYΏ|brtaxҖ 2K5@NP OH,х݊ ZqOvr USݘriw8YK;Vty%"/d"ĮթH x\\dtx(qZpO* {k~˒PodL4)5M^ t$V.[+  Ⱥيh@xwwU쌵d*gU:lp{:29^1{ѱN(Fzg LO@֧!-*R6#r# 4Ysc\$ڇ.\`N|/B u 5 +H!$va>Q&Cn;:N>.tPC+@ct-C}eDTlj "2=v*xF[ p:_`l/|]2UE2$e>'#΄2h_lWaH׵x3B-d柽Tݟa7J9Mszŏ,'" E]jX# VWJu": nԔW&'-{6Iy|Rq`š&Qcu-h'[/$TI)_g.J΀}&{̀Ucfi ȵ|nJęnI2>=%}gl1Bk'F5&&y3/07=L6 =83xD]{Nv[QOJ7ziҘ$@̸aȝ`*dV3 WN:o,MUw6ULF׈ []Qr:|Qn>uu<x2Nq;iLr̄uV^H_f=$Zr\ R;SӾ W!?Op>R g 8܉gƍȞӍ; T;4a2l3tmzmYk#i֎y p@-/L/,lcmRq6fF`>i|E_%Ss#6-$D<|~0O9 +k`5l{/mYγ</>j"D|FAR g\OX{4iQmz$|fɟX툢kgx* {g:M}9LI^uñȽ3$lm%{# FWBW9\/O.n#0?(fZMnVOY .޶} [>v<i5x9S}kdr"&l GeaoVyKie%)xYȞ#C;q3l0Mi+|dF T;%OËtuIǘis+ 'iJhD"LWCr;;^:\sSA:7)EJ}z$]Pe%0r Y:_zK H]^WE[Mϩϯ4") &Rp8t QgՋFJ|Mwx\%fE[(^SLJVǡi/Urze?Dfyg淠h|@ O[R/ BPWH+: jǥ7&imi2u%N?BJ1\M$i"Q)"u(mX,;*Q۫u"-bdXɀ_օPmnT-8";U cBj!τb{iHMn=~'t`Dk&JD S/}97Df^RF !Q_CY}h}oTiX)؃DG}ˆCvdHx-llm,^ě _'u ,ڙOE|#Q#. Cp+Naž V6_oC`XZj`l_KR`Eex+#{ pX"}p+H{+gylJoRny 34'e2x8&p]%=ZOR|}rG<DpIzSC1 ‡ǬAFc) F89u'H'cjCU1.Fj8VXgi8)5S{z_Cv9vxH6;N}s~$`u A/H}D`b|m YLʣzDoy}Kj;6'y5]C@ؼupVFGTi2:D h%5pʡswZeXJ=(E5 ''V|ݜ<4z4ډ1povS-GG˹*8+h1ڐ8nTQ,aӈH߲ŕqQCHt  `pb4hwY 󇮼˚cczKoK߫&[:E#W,E'zݡ6v1'jǝ Qƥ&/xYh`Bǩ<:g]˷ߝ|`(F&oQKr=.ISZE!|jq+|$S;~uZҕ&dT0si`(ŀ;3m_R#n" B1ƙg ]4Z#gO)WT0Ɛ䂉X1i]5m nXsy2}>aԠi<-j /]OcAlE*|e%HءN,'@#bؚfe,<#zd~Kn5V/$2h$AeDu9'c5$KGvGNyni j"kV''fӜK@*!eL_*[uF5׳%t ;59#V"թ|}X kΪ׹Y6$؅Ѽ"1=2҈F}^.Z)4f*)J<ǑF hfҨQ#rwFyTO~Є qw2VOFJi)kۛVߐm. R&\WR͏wcx>{6`dj76d3#9,flm~BR/0jQz]8Sn`[j^R(\jHhŵO.jKB;CTctz%?w,Sٸ?(1G\ ;DWeD<唲u۟!/6Ll4)_mU+Ьf-X*wk^E %ݬ!m<{Չ7\2,Wg#j'cqћL cA`20x{Q^qI5M00w @R,a0Eh;|ļ;m_-SC -J*E|~0mdtispw)8/Opd^VnGUZ Yr^]^1Avn|;(`!^RD(BckgDS؎*I>`;n3MHF``y /op~oF4ǩY&{D薊<7m~FJ K1aUrb鹺+$J_FfҞ:nNHh1aG+dBpeŨRP@ԑnR:~(Uy蟵p1,%;jDJ T (1xz+=uGCX3Ah2d ˪6ӯ?( RplYJ3C'pT~ {rK'X\5S-,#xD Į"F0ְAmnSp˦Nv/0;{aetx3aYƋ:MbUE ߰Y  Mp5} 0 f 4( ۆxmO򦞈*ێM?|kњi =wP,oz]N 7䈡C_wr@VL잪?7/J.zïSq]բS9Ȯx:QOAWj.+ bV-vgtO1LGܘt#:qMEK~vu~r}X-z,ԜIz}G<v9Fɯ(V4U?.hhMiπ!}gz  O4H(R0Siu(#`~*jM mW_[F;ILR[y﵌6z%>¡ȼ }LtqZ@>ԉ' f-Y:pfŶe1U; zu_EDXNt.u+x=e=ky8F?ؑ>!tVZ:uy63$Yu:IwC]ڹ4K%míIHţt Kph0KJPa}ֲQ^%"`:V 7~d&$#αq@Q sXZA|ʨBW[p ^zLfglń*ӑtfN..tq$$fχPcϻF$"'_K뵫 s"d_R=NjO%9jqvY*0]cJ}#ڶ?l# iJrE}9pv"•ė{ajW8t=Q? Y"qq_FBΐZB룍jqRgW>-{$Aknjϔ6h-qɧJ j~M[E>s_Q81{xtqb#2&:?7F킲/s}ahzs hW5(,(p4"KhI%p>ٴ;2iUIwvŁq ˑBq(]dR7oLa"L8"h -5m&0>g -`ߧ3xͅIL;GI2і4LcKΟD! .P?6yÂ~|dvٌnBtP.%*'#OPE{]n_}v(sՄҙXD3Os䫤(?ҧ[[:>\F "ȞCi%MƄ6Ry(xYV6gtՊ/tkMdYdznj{bugI(@/-pTH1LNE* }MZԘ|`1T~BܜA8xrS"wT^P8^ԭm^\\^~(nn% ^^PP1Џ% HP1"namefiletypetype DPnametype `PZ!$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"['$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pw"\nd$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p{"]%P$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pL"^;3$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"_=V1$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pu  `4$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"ah$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pb"+b9h$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p*"<c$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"Md/$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pa"^e=|$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"of2$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1pXn"g$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p"h "$ VTBOOK014.A)) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK.ALPHA_EXE;1m"SZS$IMLDtvo1`ca+$Mqsa;$`{wqs4zpePKGORT $rusurpoPTB3OKew)& $ & Functil 0@P`p%--%- ( ( ( %--%--, 0@P`pKTM%Z!N1!( !( "Klqm Aa|iFg(w)llo'"in"zepma"gn"degdDev'Re`t bzrt( #XrUuao5p'N5{| 4lxiXrer'Nu|| fgo[-( `$[c"kdl@ficsir$in$nosir?CP)(K`=( `%( p%( @%[cjdlgicrir%in%norir /Ze4sznp.jom! P&( &[ccmnbgw 0@`Xrq'N| jmn.( 'Idffc(jal(u'eer(chgacu{ 0@P`]]pLgw(irg (( (Eom(u(in(lowg(o~l(lIgm0 @ P ` p   Nim$ Y; kgo ( )Eol(to*int*{eLoktdmx4*`o$yxo p     Nin$ Z; gmn#( +Jewbf Tb|lU+{e!ykhpfgd p       [enkt#joog!,0GX ,Ooxg 4dm #idexmdPdgt|gt`gcxao     KTRA%B0-( -( -( `-Ja3f(-@mtf b(ph~ix{ bxi-gr~krhf *Lo .ZeD{zn`.( p.( @.[ekktofdaxe.|h.`ifdif|e.khgke KTC%R|/KT2C%WP/( /Ze}ms/{cjmn 0@OKT2\%EP0( 0( 0( 0Mxd(VRGO 0@P`ZKT]%D1( 1( 1( 1[pff 1LC1{ubbzosw{s 0@P`p@eb$ 2( 2( 2( 2Libday3|hy`(hEx0@P`pE\B\C vdpTQKWVGO{G@E RZE$$WD_<[OIUD]JRFQZE$WD_[OIUDfzorTPJUgfAJO^(PJU'#L[$ZEM[LL[$ZEM[Lpkwwgof`elp2.tskwtgo[e`e,p<jrdqskwtgoe`ep2jrdq.skwtgoe`elqtrkwugo[-&d%t$2xgkml~jreq/?/ VNH\ ฏ^V=_#XR,ȇ=K2I4|HQ< YбJIY<}\ưMJQNt\0PKӷ=_XR(H 1=׏쐔뗭Cݐ/_ %=쏱(b4׏AjXRM?_W? H 0LZ\ϒ ߰UNdP"Z]l `MZ9w z=-聥LRW \qQ LPON ......;&.6._/ h T/ ߯  P"ɂ$r @pZ ~ؼ| TQ2hQPI$HRߏ( "(9PPP蟭؟ IRLTЏ ԞԭߏߏDH_  RR [OV_VHk/R`R>/a1'+Ra?/C/C/kpY䒏fN QYR_ TX@XSL 1׏1А=LKK 0K]ߟ" ]Ju h` X0Аhx"_}TߏVPS_ډE&PSR쟭ߏV蟭蟭PSS1|@wLBT\蟭PSSWPWR}0wTTO41=ǡ+RaF/.pv,^ԭxvmЬP` `|(`~}^P(D8(PV}70}6^W~<|PPܞt|\<|PP~ PXXݭXJ\u 18PXX18PXX1o`P--1. nZZ(n<W18}ߏЏ % IP\- - WW-Э XXnA\Ο,nAмRм\\1$iy\nAmAbmA.\Rm}AbmpA\ϟmBA|(^ԭbAmмV( ­^Э\ЭQ^S\(ac\(\ací^\\^ܐpV\Ah1/m@ѭѭݭl@l~^l@l@ݬlj@ l]@.SR,k>bk>Sϟj>(\(V\(1_\1VR\SST1ezTjo>jb>bjU>/TRpj1>b_j$>TϟMj=SFcVSS\\11>e1y\j= j=f~i=-\Vi=f~i{=\ΟiY=мPмQм R\bRRѢQ\RѢPRRP^ԭ@=mмV\\1V\ oЬP@ψPRnЬP@gPS1d1.h<ݬh<,hx<ݬ hr< he<ݬhK<}h><ݬkh$<,Zh<ݬHh<3h;ݬ!h;,h;ݬg;U g;ݬ"g;;gs;ݬ&gm;g`;*~gD;vg7;ig;S1 *;PWWXhԨãPPNPPF9PKPPP ѨllNPF9PKP 'ШP@PlSPSèlSRNSF1SKSS âSNSSF1SKSSS Ѩ sl kl Ѩ `l Wl NSF1SKSѨ1?Џ% iB:0[PW\ PPн@ [\WP \\LZԭխ1мRЬPаRJ+ռ<^ԭB+mм\!]R]P`]R+\ڐZЬ Z5WP ZR(]B`WP nZRBP ]\`**\Ϛ¬Z\\\P`w\\z*h\X\[\M\ ^мR\\* 6\S/\P`'\S.*\ڐ\R\9[\[P`[\)[[[[<^ԭ)mмм [1\[PP[QQ8Q0QPѠ+QQQPРQQPߏ P!HWVPP!ߏߏKHPb!\HAHP;(Hy!HHHH!GO!WDPW BPWWP ^мRм\G!S PG>G GOG S wG jGOu O (OOOP`OO|OxO\R PRFJ RP^м PмRмS^TЬUмVPW V`WPWe PegegPeRT\^TFUNF>yFpFNXFU HF;FNFxN)rNqNgNP`_N]NLNHNSRPRET^\TRP|^мPм\^RRS^RPTUEVME>zEqEMYEV IEP6GPP쟭G==IF!ߏlI쟭ϚP1FF1FPgCQ P@Qa1쟭ϙFP4CQ P@ QaѭíܟHFm'ѭíܟߏFDЭ1FPBQ RB쟭ϨP1䟭P1䟭϶P1EE1խ@EPРPEQ@QѭQ1ЭQ%=PAPqEQP1ߏYEQOEPEER ;ES!E$EP`PEEP EߏDPDQDR DSD|DPխ1РQAQѭQЭQL쟭P ^ԭ&mм\\L@P \QA0^ԭmм\ \ P@CŏPQQP~QQ?}` \ P PQACQQ PP@1 \ QA&B( 'k>PРQA`QQŏܞzР쟭П*9 9MPVVSQ PP@:P QQAWW쟭=P WQAwV V11=~bV V|0^ԭ2m~BPP\PpBQPQ#PЭP<`PP>PPЭ\>>\>PRR/ЭP<`PPD>RJP 1V21ЭP`ݨ7D 73 ;>#A> =.>=>==<=䟭 PRRR 1g2=PRR10䟭=ϕPRR1Q:<8䟏 <'17:ߏ:ߏ1䟭 PRR7ߏ;ఏ;䟭9 PR19; <;ߏ $PP䟭D6Q \L+6~ 6~ *;<<<䟭T <0&595G 55 R;Rh;k;a;l<^<;ЬP;$ЬPЬ<<`^,n䐏Pݬi^|QVX^,n䐏QeYݬf^PRݬ l$լ ݬf  RP|VD^,nȐSȞ؞ܕlլݬfЬ̑lլ  lլ,n䞭l լ Ь l լЬlլ ݬf^<`^,n䐏T9-l լЬ^<`^,n䐏Uݬ^@\:Ь:ޯA,::PQl`::{:мPQl`@i:\e(X{ .(n08@6HlP@ BADSHELFENTRY(bookshelf entry contains invalid !AS !AS0 LASTNOTLASTrecord(s) following 'last'> BADRECTYP)book !AS record has invalid type code !XW@BADLAST.expected end of book at !UL, actual end at !UWJBADSIZE8expected !AS record to have size !UW, actual size is !UL<BADPART*part !UL, RFA !XL,!XW has invau*$ VTBOOK014.AB*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.EXE;1p1nlid size !ULB PARTTYPMIS,part !UL should be type !UL, actual type !UL6 BADSUBSIZ"subrecord size does not fit record"OPENINerror opening !AS4 UNDEFTERM Unknown or invalid terminal type VTBOOK@@ ` ` xHP( 8x (8Xx)H@P 8`Xxpx(pXxp`X @LIBRTLPASRTLSMGSHR&*[HUNTER.FILESERV.VTBOOK.A]VTBOOK.MAP;1+,K*./ 4-) 0123KPWO5 6Od7Aq/6e83_9GHJ VTBOOK.EXE 29-NOV-1993 19:39 VAX-11 Linker V05-13 Page 1G +------------------------+G ! Object Module Synopsis !G +------------------------+lModule Name Ident Bytes File Creation Date Creatorl----------- ----- ----- ----- ------------- -------tVTBOOK V1.3 6165 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 19:38 VAX Pascal V4.4-89tBOOKSHELF 01 279999 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 19:38 VAX Pascal V4.4-89tVTBOOKMENU 01 2478 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 18:41 VAX Pascal V4.4-89VTBOOK_TABLE 0-0 120 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-NOV-1993 18:42 VAX/VMS Command Definition UtiwBOOKMSG V1.2 681 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-NOV-1993 18:42 VAX-11 Message V04-00tBOOK 01 25873 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 19:38 VAX Pascal V4.4-89H +--------------------------+H ! Program Section Synopsis !H +--------------------------+kPsect Name Module Name Base End Length Align Attributesk---------- ----------- ---- --- ------ ----- ----------CLI$TABLES 00000200 00000277 00000078 ( 120.) LONG 2 PIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD,NOWRT,NOVECP VTBOOK_TABLE 00000200 00000277 00000078 ( 120.) LONG 2LIB$INITIALIZE 00000278 0000027B 00000004 ( 4.) LONG 2 NOPIC,USR,CON,REL,GBL,NOSHR,NOEXE, RD,NOWRT,NOVECP BOOK 00000278 0000027B 00000004 ( 4.) BYTE 0$LOCAL 00000400 00000FD3 00000BD4 ( 3028.) LONG 2 PIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD, WRT,NOVECP VTBOOK 00000400 00000737 00000338 ( 824.) LONG 2P BOOKSHELF 00000738 0000075C 00000025 ( 37.) LONG 2P VTBOOKMENU 00000760 00000867 00000108 ( 264.) LONG 2P BOOK 00000868 00000FD3 0000076C ( 1900.) LONG 2$CODE 00001000 0004D0C4 0004C0C5 ( 311493.) LONG 2 PIC,USR,CON,REL,LCL, SHR, EXE, RD,NOWRT,NOVECP VTBOOK 00001000 000024DC 000014DD ( 5341.) LONG 2P BOOKSHELF 000024E0 00046A79 0004459A ( 279962.) LONG 2P VTBOOKMENU 00046A7C 00047321 000008A6 ( 2214.) LONG 2P BOOK 00047324 0004D0C4 00005DA1 ( 23969.) LONG 2MSG$AAAAAAAAAAA 0004D400 0004D40F 00000010 ( 16.) LONG 2 PIC,USR,OVR,REL,LCL,NOSHR,NOEXE, RD,NOWRT, VECP BOOKMSG 0004D400 0004D40F 00000010 ( 16.) LONG 2MSG$AAAAAAAAAAB 0004D410 0004D413 00000004 ( 4.) LONG 2 PIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD,NOWRT, VECP BOOKMSG 0004D410 0004D413 00000004 ( 4.) LONG 2MSG$AAAAAAAAAAC 0004D414 0004D417 00000004 ( 4.) LONG 2 PIC,USR,OVR,REL,LCL,NOSHR,NOEXE, RD,NOWRT, VECP BOOKMSG 0004D414 0004D417 00000004 ( 4.) LONG 2MSG$SECTION 0004D418 0004D6A8 00000291 ( 657.) BYTE 0 PIC,USR,CON,REL,LCL,NOSHR,NOEXE, RD,NOWRT, VECP BOOKMSG 0004D418 0004D6A8 00000291 ( 657.) BYTE 0C +-----------------+C ! Symbols By Name !C +-----------------+Symbol Value Symbol Value Symbol Value ------ ----- ------ ----- ------ ----- MENU_BOOK 0004CD08-R VTBOOK__BADLAST 08018022 VTBOOK__OPENIN 0801804A MENU_BOOKSHELF 00045C78-R VTBOOK__BADPART 08018032 VTBOOK__PARTTYPMIS 0801803A XMENU_BOOKSHELF_LIST 00046640-R VTBOOK__BADRECTYP 0801801A XSELECT_FROM_MENU 00046A7C-R VTBOOK__BADSHELFENTRY 08018008 XSHOW_HELP 000015F8-R VTBOOK__BADSIZE 0801802A XVTBOOK$_FACILITY 00000801 VTBOOK__BADSUBSIZ 08018042 XVTBOOK_TABLE 00000200-R VTBOOK__LASTNOTLAST 08018010  WORTMAN0:[VTBOOK.VTBOOKA]VTBOOK.EXE;3 29-NOV-1993 19:39 VAX-11 Linker V05-13 Page 2Symbol Value Symbol Value Symbol Value ------ ----- ------ ----- ------ ----- $ Key for special characters above: +------------------+ ! * - Undefined ! ! U - Universal ! ! R - Relocatable ! ! X - External ! ! WK - Weak ! +------------------+ WORTMAN0:[VTBOOK.VTBOOKA]VTBOOK.EXE;3 29-NOV-1993 19:39 VAX-11 Linker V05-13 Page 3C +----------------+C ! Image Synopsis !C +----------------+hVirtual memory allocated: 00000200 0004DBFF 0004DA00 (317952. bytes, 621. pages)AStack size: 20. pagesTImage header virtual block limits: 1. 1. ( 1. block)UImage binary virtual block limits: 2. 622. ( 621. blocks)=Image name and identification: VTBOOK V1.3;Number of files: 13.;Number of modules: v@r$ VTBOOK014.AK*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.MAP;1  13.;Number of program sections: 19.;Number of global symbols: 742.;Number of image sections: 16.:User transfer address: 0000207C;Number of code references to shareable images: 74.:OTS transfer address - LIB$INITIALIZE: 0004D2C2=Image type: EXECUTABLE.gMap format: DEFAULT in file WORTMAN0:[VTBOOK.VTBOOKA]VTBOOK.MAP;1<Estimated map length: 75. blocksE +---------------------+E ! Link Run Statistics !E +---------------------+SPerformance Indicators Page Faults CPU Time Elapsed TimeS---------------------- ----------- -------- ------------U Command processing: 83 00:00:00.02 00:00:00.11U Pass 1: 222 00:00:00.53 00:00:04.25U Allocation/Relocation: 28 00:00:00.02 00:00:00.06U Pass 2: 142 00:00:00.29 00:00:02.13U Map data after object module synopsis: 9 00:00:00.02 00:00:00.02U Symbol table output: 3 00:00:00.00 00:00:00.03KUTotal run values: 487 00:00:00.88 00:00:06.601YUsing a working set limited to 2599 pages and 762 pages of data storage (excluding image)-5Total number object records read (both passes): 557 S of which 250 were in libraries and 0 were DEBUG data records containing 0 bytes-6Number of modules extracted explicitly = 11 with 9 extracted to resolve undefined symbols A696 library searches were for symbols not in the library searched 4A total of 0 global symbol table records was writtenLLINK/EXEC=VTBOOK.EXE/NODEBUG/NOTRACE/MAP VTBOOK.OLB/INCLUDE=(VTBOOK)/LIBRARY 29-Nov-1993 19:38 VAX Pascal V4.4-89tBOOKSHELF 01 279999 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 19:38 VAX Pascal V4.4-89tVTBOOKMENU 01 2478 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-Nov-1993 18:41 VAX Pascal V4.4-89VTBOOK_TABLE 0-0 120 [VTBOOK.VTBOOKA]VTBOOK.OLB;1 29-NO&*[HUNTER.FILESERV.VTBOOK.A]VTBOOK.OBJ;1+,O*./ 4-) 0123KPWO56Od7 Ot/6e8 6_9GHJ3VTBOOKV1.430-Nov-1993 18:1630-Nov-1993 18:16VAX Pascal V4.4-89PSYS$COMMANDQ Broadcast Message QType LOGOUT to return to VTBOOKQKey(s) FunctionQ*------ --------Q*=CTRL-Z, F10 Close active window and retreat one levelQ 'Left/Right arrow Previous/Next TopicQ/Prev/Next (book) Scroll backward and forwardQ/KP7, KP8 Scroll backward and forwardQReturn (book) Screen downQ'0Prev/Next (menu) Advance/back up menu choicesQ-Up/Down arrow Move up and down one lineQ3Find, KP3 (book) Move to and select next hotspotQ+Find, KP3 (menu) Begin title search modeQ7Select (book), KP Go to the selected hotspot locationQ=CTRL-B Back - return to previous topic or screenQ :Do, Return Select and open the highlighted choiceQ "CTRL-R, CTRL-W Refresh screenQ$CTRL-E Exit VTBOOKQ'*CTRL-D Spawn a DCL subprocessQ%Help, ?  Display this helpQ! VTBOOK Help QQQDECW$BOOKSHELFQLNM$DCL_LOGICALQLIBRARYQLNM$DCL_LOGICALQErrorQDEBUGQVTBOOK QDEBUGQSYS$COMMANDQSYS$COMMANDQdecw$bookshelf:.decw$bookshelfQlibraryQdecw$bookshelf:Qlibrary.decw$bookshelfQdecw$book:.decw$bookshelfQlibrarySMG$DELETE_PASTEBOARD^^P\ ^SMG$CREATE_VIRTUAL_KEYBOARDPRЏ% SMG$GET_BROADCAST_MESSAGEPR PSMG$DELETE_VIRTUAL_DISPLAYS TSMG$CHANGE_PBD_CHARACTERISTICSP8^ԭ PAS$HANDLERm^\\^~(nn% ^^PP1Џ% LIB$GET_FOREIGNP  1<VVWWW\^^X(n(VcW PW`(h` VTBOOK_TABLEЏ%  CLI$DCL_PARSEP  ȏ  1XЏ(螭 CLI$PRESENTPXX8  SMG$CREATE_PASTEBOARDP  8VTBOOK__UNDEFTERM LIB$SIGNAL SMG$CREATE_VIRTUAL_KEYBOARDP  1(,40$ SYS$DCLEXHSMG$SET_BROADCAST_TRAPPING\X^\Џ(Џ(Ȟȭܟ SYS$TRNLNMPPP\^X\P1\X^\Џ(r螭Џ(aȞȭܟ SYS$TRNLNMPPP\^X\P\^~(nun% ^^PP^~(nonذ% ^ܞح^PMENU_BOOKSHELF_LIST\^~(nBn% ^^PP^~(n,nذ% ^ܞح^PMENU_BOOKSHELF_LIST\^~(nn% ^^PP^~(nnذ% ^ܞح^PMENU_BOOKSHELF_LIST SYS$EXITPP DECW$B SYS$PUTMSGSMG$CHANGE_PBD_CHARACTERISTICS  VTBOOKLIB$GET_FOREIGN VTBOOK_TABLE CLI$DCL_PARSESMG$CREATE_PASTEBOARDVTBOOK__UNDEFTERM SYS$DCLEXHMENU_BOOKSHELF_LIST   PASTEBOARD  KEYBOARD  PB_ROWS   PB_COLS  DBG_LOG_ENABLE % CMD % DECW$BOOKSHELF_HYBRID %  TRANSL_TEXT   STS $EXH_DESC  4 EXIT_COND  8 TERM_TYPEOOK:Q QQP QQDqQQwQrQQOQ (Q3Q3QQ QQ6 QQ|QwQ!QPQ (Q3Q3QQ QQQQJQQQ(QQHQ +Q3Q<{Q5QIQoQQ"QQxKQVQVQNeQeQ:Q 2Q#QQ Q"QoQ/QQQC QQ$QLKQQD1Q9QQQ QGQQ [QYYQZZG  <ITEM % @ DEVICE_TYPE$CODE$LOCALo3Find, KP3 (book) Move to and select next hotspotQ+Find, KP3 (menu) Begin title search modeQ7Select (book), KP Go to the selected hotspot locationQ=CTRL-B Back - return to previous topic or screenQ :Do, Return Select and open the highlighted choiceQ "CTRL-R, CTRL-W Refresh screenQ$CTRL-E Exit VT&*[HUNTER.FILESERV.VTBOOK.A]VTBOOK.PAS;1+,P* .-/ 4P-+x-) 0123KPWO,56Od7x/6e8#;_9GHJ[IDENT('V1.4'), ENVIRONMENT, INHERIT('sys$share:starlet',% 'sys$share:pascal$smg_routines', 'vtbook_cli_routines',% 'sys$share:pascal$lib_routines',& 'sys$share:pascal$str_routines')]PROGRAM vtbook;(*PROGRAM DESCRIPTION: VT bookreaderAUTHORS: ChrisCREATION DATE: 15-OCT-1991MODIFICATION HISTORY: Date Name DescriptionP-------------------------------------------------------------------------------- 30-NOV-1993 Bret D. Wortman V1.4E Added CTRL-D to spawn subprocess by calling spawn_subproc. Added= constant help_items in show_help to aid help text growth."29-NOV-1993 Bret D. Wortman V1.3-1B Reworked DECW$BOOKSHELF logical yet again -- switched to usingM 'library.decw$bookshelf' as first parameter, "decw$bookshelf:" as second.M Removed bookshelf_file_only function. Added error for undefined terminal types. 22-NOV-1993 Bret D. Wortman V1.3K Set broadcast display to size-to-fit width for short messages, variable number of lines for larger. 22-NOV-1993 Hunter Goatley V1.31 Fix display of multi-line broadcast messages. 20-NOV-1993 Bret D. Wortman V1.3G Added bookshelf_file_only function for DECW$BOOKSHELF defined to be a filename only. 19-NOV-1993 Bret D. Wortman V1.3. Added popup window for broadcast messages. 18-NOV-1993 Hunter Goatley V1.2E Changed version number and added show_help call to error handler.$17-NOV-1993 Darrell Burkhead V1.21 Added support for the DECW$BOOKSHELF logical.&11-NOV-1993 Darrell Burkhead V1-004E Modified the menu_bookshelf and menu_book external declaration toI include a default filespec argument. Also, added Ctrl-R/W support to vtbook_handler.$ 9-NOV-1993 Bret D. Wortman V1.1/ Added CLI$ support for new /DEBUG qualifier& 8-NOV-1993 Darrell Burkhead V1-003K Fixed 80-column dependency in vtbook_handler. And added Ctrl-E supportF when error messages are displayed. Established an exit handler toI delete pasteboard, so the screen will be cleared if the user exits as a result of pressing Ctrl-E.$ 5-NOV-1993 Darrell Burkhead V1.1L Call menu_bookshelf_list instead of menu_bookshelf for the initial menu.$ 4-NOV-1993 Darrell Burkhead V1.1I Added a condition handler which displays error messages in a bordered SMG display.19-DEC-1991 Chris' V1.1 Fix multi-record part handling*)VAR VTBOOK__BADSUBSIZ, VTBOOK__LASTNOTLAST, VTBOOK__PARTTYPMIS, VTBOOK__BADPART, VTBOOK__BADSIZE, VTBOOK__BADLAST, VTBOOK__BADRECTYP, VTBOOK__BADSHELFENTRY, VTBOOK__OPENIN,3 VTBOOK__UNDEFTERM : [EXTERNAL,VALUE] UNSIGNED; 2PROCEDURE menu_book(filename: VARYING [u] OF CHAR;& bookname: VARYING [v] OF CHAR;5 default_file: VARYING [w] OF CHAR); EXTERNAL;7PROCEDURE menu_bookshelf(filename: VARYING [u] OF CHAR;( shelfname: VARYING [v] OF CHAR;+ default_file: VARYING [w] OF CHAR;' top_level: BOOLEAN); EXTERNAL;;PROCEDURE menu_bookshelf_list(libname: VARYING [u] OF CHAR;0 defname: VARYING [v] OF CHAR); EXTERNAL; [HIDDEN] TYPE $UWORD = [WORD] 0..65535; message_list = RECORD msg_count : INTEGER;7 messages : ARRAY[1..10] OF VARYING[132] OF CHAR; END;& sigarr = ARRAY[0..100] OF INTEGER;. mecharr = ARRAY[0..4] OF [UNSAFE] INTEGER; item_list = RECORD buflen : $UWORD; itmcod : $UWORD; bufadr : UNSIGNED; retlen : UNSIGNED; TERMINATOR : UNSIGNED; END;CONST. decw$bookshelf_defnam = 'decw$bookshelf:';/ shelf_defnam = 'decw$book:.decw$bookshelf'; max_cmd_len = 255;$ vtbook_id = 'DECUS VTBOOK V1.4';VAR. pasteboard, keyboard: [VOLATILE] UNSIGNED;) pb_rows, pb_cols: [VOLATILE] INTEGER; dbg_log_enable: BOOLEAN;' cmd: VARYING [max_cmd_len] OF CHAR;- vtbook_table : [VALUE,EXTERNAL] UNSIGNED;E decw$bookshelf_hybrid : VARYING [255] OF CHAR VALUE 'DECW$BOOK:';1 transl_text: VARYING [255] OF CHAR VALUE ' '; [HIDDEN] VAR sts: UNSIGNED VALUE 1;.[HIDDEN, ASYNCHRONOUS] PROCEDURE exit_handler; BEGIN? smg$delete_pasteboard(pasteboard); (* clears the screen *) END;0[HIDDEN,ASYNCHRONOUS] FUNCTION add_line_to_list( VAR line : dsc1$type;2 VAR msg_list : message_list) : INTEGER;(*H * Build up the list of messages to display. This list is created so tox$ VTBOOK014.AP* ) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.PAS;1P-A8" , * determine the size of the display needed. *) BEGIN WITH msg_list DO/ BEGIN (* Add this line to the list *) msg_count := msg_count+1;7 str$copy_dx(%DESCR messages[msg_count], %REF line); END;; add_line_to_list := 0; (* Don't write to SYS$OUTPUT *) END; 0[HIDDEN, ASYNCHRONOUS] PROCEDURE show_broadcast;(*J * This routine pops up a window whenever a broadcast message is received. *) VAR sts,7 cursor_display : UNSIGNED; (* cursor display id *)0 broad_display : UNSIGNED; (* display id *)6 broad_keyboard : UNSIGNED; (* temp keyboard id *) term_code : $UWORD;" done : BOOLEAN VALUE FALSE;> display_rows, (* How many rows in display *)A display_cols, (* How many columns in display *)D max_cols, (* Largest possible display width *) count,9 start_col : INTEGER; (* calculated display size *)( msg_text : VARYING[1024] OF CHAR; msg_len : $UWORD; BEGINE sts := smg$create_virtual_keyboard(keyboard_id := broad_keyboard,/ input_device := 'SYS$COMMAND');? sts:=smg$get_broadcast_message(pasteboard_id := pasteboard,+ message := %DESCR msg_text,+ message_length := msg_len);? max_cols := pb_cols - 4; (* Largest width allowed *) IF msg_len < max_cols  THEN BEGIN5 display_cols := msg_len; (* Size to fit *) display_rows := 1 END ELSE BEGINL display_cols := max_cols; (* Size to largest and add extra rows *)0 display_rows := msg_len DIV max_cols + 2 END;B start_col := (pb_cols-display_cols) DIV 2 + 1; (* Center it *) & sts := smg$create_virtual_display(' number_of_rows := display_rows,* number_of_columns := display_cols,$ display_id := broad_display,, display_attributes := SMG$M_BORDER); IF ODD(sts) THEN8 BEGIN (* Display created, fill it in and paste it *) smg$label_border($ display_id := broad_display,& text := ' Broadcast Message ',% rendition_set := smg$m_bold);. smg$put_line (display_id := broad_display, text := %DESCR msg_text," flags := SMG$M_WRAP_WORD);< sts := smg$set_cursor_mode (pasteboard_id := pasteboard,# flags := SMG$M_CURSOR_OFF);@ sts := smg$find_cursor_display (pasteboard, cursor_display);% sts := smg$paste_virtual_display($ display_id := broad_display,$ pasteboard_id := pasteboard, pasteboard_row := 3,( pasteboard_column := start_col); IF ODD(sts) THEND sts := smg$ring_bell( (* Draw attention to the message *)) display_id := broad_display); IF ODD(sts) THEN BEGIN WHILE NOT done DO BEGIN" sts := smg$read_keystroke(* keyboard_id := broad_keyboard,/ word_terminator_code := term_code); IF NOT ODD(sts) THEN4 done := TRUE (* Error reading, get out *) ELSE CASE term_code OF: smg$k_trm_ctrle: $exit(1); (* Exit key pressed *) smg$k_trm_ctrlr,0 smg$k_trm_ctrlw: (* Refresh screen *)' smg$repaint_screen(pasteboard);1 OTHERWISE done := TRUE; (* Get out *) END; (* end of cases *)( END; (* End of keystroke loop *) END;. smg$delete_virtual_display( (* Clean up *)- display_id := broad_display);? smg$delete_virtual_keyboard(keyboard_id := broad_keyboard);< sts := smg$set_cursor_mode (pasteboard_id := pasteboard,* flags := SMG$M_CURSOR_ON);/ sts := smg$set_cursor_rel (cursor_display);% END; (* End of display created *) END; J[GLOBAL, ASYNCHRONOUS] PROCEDURE spawn_subproc (pasteboard_id : UNSIGNED);(*H * This routine saves the current physical screen, clears it, and spawnsH * a subprocess. When the user logs out of the subprocess, the previousD * physical screen is restored. Broadcast trapping must be disabledB * prior to the spawn to disassociate the terminal mailbox. It is( * restored immediately after returning. *)VARE hold_display, (* holds display to which pasteboard 0 is written *)N blank_display, (* blanks screen, displays "LOGOUT" message *) sts : UNSIGNED;BEGIN< smg$save_physical_screen(pasteboard_id := pasteboard_id,: display_id := hold_display );9 smg$create_virtual_display(number_of_rows := pb_rows,< number_of_columns := pb_cols,< display_id := blank_display);B smg$put_line (display_id := blank_display, (* Instructions *)C text := %DESCR 'Type LOGOUT to return to VTBOOK',/ rendition_set := smg$m_bold);F smg$put_line (display_id := blank_display, (* Add a blank line *)& text := %DESCR ' ');: smg$paste_virtual_display(display_id := blank_display,= pasteboard_id := pasteboard_id,2 pasteboard_row := 1,6 pasteboard_column := 1); L smg$disable_broadcast_trapping( (* Get rid of the mailbox *), pasteboard_id := pasteboard_id);1 sts := lib$spawn; (* Let them out of here *) IF NOT ODD(sts) THEN lib$signal(sts);; smg$set_broadcast_trapping(pasteboard_id := pasteboard,> ast_routine := show_broadcast);N smg$delete_virtual_display(display_id := blank_display); (* Clean up *)F sts := smg$restore_physical_screen(pasteboard_id := pasteboard_id,D display_id := hold_display );END; ,[ASYNCHRONOUS, GLOBAL] PROCEDURE show_help (+ pasteboard_id, keyboard_id : UNSIGNED);(*& * This routine pops up a HELP window. *) CONST4 help_items = 18; (* for as help grows.... *) VAR sts,7 cursor_display : UNSIGNED; (* cursor display id *)0 help_display : UNSIGNED; (* display id *) term_code : $UWORD;" done : BOOLEAN VALUE FALSE; count, start_col,9 disp_cols : INTEGER; (* calculated display size *)E help_array : ARRAY [1..help_items] OF VARYING [70] OF CHAR VALUE) [ 1 : 'Key(s) Function';) 2 : '------ --------';J 3 : 'CTRL-Z, F10 Close active window and retreat one level';4 4 : 'Left/Right arrow Previous/Next Topic';< 5 : 'Prev/Next (book) Scroll backward and forward';< 6 : 'KP7, KP8 Scroll backward and forward';, 7 : 'Return (book) Screen down';= 8 : 'Prev/Next (menu) Advance/back up menu choices';: 9 : 'Up/Down arrow Move up and down one line';@ 10 : 'Find, KP3 (book) Move to and select next hotspot';8 11 : 'Find, KP3 (menu) Begin title search mode';D 12 : 'Select (book), KP Go to the selected hotspot location';J 13 : 'CTRL-B Back - return to previous topic or screen';G 14 : 'Do, Return Select and open the highlighted choice';/ 15 : 'CTRL-R, CTRL-W Refresh screen';, 16 : 'CTRL-E Exit VTBOOK';7 17 : 'CTRL-D Spawn a DCL subprocess';3 18 : 'Help, ? Display this help']; BEGIN disp_cols := 70;? start_col := (pb_cols-disp_cols) DIV 2 + 1; (* Center it *)& sts := smg$create_virtual_display(% number_of_rows := help_items,' number_of_columns := disp_cols,# display_id := help_display,, display_attributes := SMG$M_BORDER); IF ODD(sts) THEN8 BEGIN (* Display created, fill it in and paste it *) smg$label_border(# display_id := help_display, text := ' VTBOOK Help ',% rendition_set := smg$m_bold);$ FOR count := 1 TO help_items DO. smg$put_chars (display_id := help_display,% text := help_array[count],2 start_row := count, start_column := 2);? sts := smg$set_cursor_mode (pasteboard_id := pasteboard_id,# flags := SMG$M_CURSOR_OFF);C sts := smg$find_cursor_display (pasteboard_id, cursor_display);% sts := smg$paste_virtual_display(# display_id := help_display,' pasteboard_id := pasteboard_id, pasteboard_row := 3,( pasteboard_column := start_col); IF ODD(sts) THEN BEGIN WHILE NOT done DO y;u$ VTBOOK014.AP* ) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.PAS;1P-ܡ  BEGIN" sts := smg$read_keystroke(# keyboard_id := keyboard_id,+ word_terminator_code := term_code); IF NOT ODD(sts) THEN4 done := TRUE (* Error reading, get out *) ELSE CASE term_code OF: smg$k_trm_ctrle: $exit(1); (* Exit key pressed *) smg$k_trm_ctrlr,0 smg$k_trm_ctrlw: (* Refresh screen *)* smg$repaint_screen(pasteboard_id);1 OTHERWISE done := TRUE; (* Get out *) END; (* end of cases *)( END; (* End of keystroke loop *) END;. smg$delete_virtual_display( (* Clean up *)$ display_id := help_display);? sts := smg$set_cursor_mode (pasteboard_id := pasteboard_id," flags := SMG$M_CURSOR_ON);/ sts := smg$set_cursor_rel (cursor_display);% END; (* End of display created *) END; .[HIDDEN,ASYNCHRONOUS] FUNCTION vtbook_handler( VAR sigargs : sigarr;" VAR mechargs : mecharr;) VAR unwind : INTEGER) : INTEGER;(*I * This condition handler is established once the pasteboard and keyboardI * have been created. It intercepts signaled error messages and displaysF * them in a bordered display. The display is deleted (and the action$ * continues) once a key is pressed. *) VAR sts,, err_display : UNSIGNED; (* display id *) term_code : $UWORD; done,* pbwid_change : BOOLEAN VALUE FALSE;" old_pb_cols : INTEGER VALUE 0; count, start_col,9 disp_cols : INTEGER; (* calculated display size *)9 msg_list : message_list; (* Messages to display *) BEGIN msg_list.msg_count := 0; sigargs[0] := sigargs[0]-2;' $PUTMSG( MSGVEC := %REF sigargs,& ACTRTN := %IMMED add_line_to_list, ACTPRM := %REF msg_list); disp_cols := 0; WITH msg_list DO@ BEGIN (* Make the display as wide as the widest message *)" FOR count := 1 to msg_count DO. IF messages[count].length > disp_cols THEN( disp_cols := messages[count].length;9 disp_cols := disp_cols+2; (* Add some whitespace *)! IF (disp_cols > pb_cols) THEN BEGIN= IF (pb_cols < 132) THEN (* OK to switch to 132 columns *) BEGIN old_pb_cols := pb_cols; pbwid_change := TRUE;# smg$change_pbd_characteristics($ pasteboard_id := pasteboard, desired_width := 132, width := pb_cols); END;? IF (disp_cols > pb_cols) THEN (* Truncate if necessary *) disp_cols := pb_cols; END;? start_col := (pb_cols-disp_cols) DIV 2 + 1; (* Center it *)& sts := smg$create_virtual_display($ number_of_rows := msg_count,' number_of_columns := disp_cols," display_id := err_display,, display_attributes := SMG$M_BORDER); IF ODD(sts) THEN8 BEGIN (* Display created, fill it in and paste it *) smg$label_border(" display_id := err_display, text := 'Error'); FOR count:=1 to msg_count DO smg$put_chars(" display_id := err_display,' text := %DESCR messages[count],r start_row := count,: start_column := 2);'% sts := smg$paste_virtual_display(a& display_id := err_display,( pasteboard_id := pasteboard, pasteboard_row := 3,, pasteboard_column := start_col); IF ODD(sts) THEN BEGINI WHILE NOT done DOt BEGIN" sts := smg$read_keystroke( keyboard_id := keyboard,+ word_terminator_code := term_code);r IF NOT ODD(sts) THEN4 done := TRUE (* Error reading, get out *) ELSE CASE term_code OF: smg$k_trm_ctrle: $exit(1); (* Exit key pressed *) smg$k_trm_ctrlr,0 smg$k_trm_ctrlw: (* Refresh screen *)' smg$repaint_screen(pasteboard);i0 smg$k_trm_question_mark, smg$k_trm_help:/ show_help (pasteboard_id := pasteboard,f( keyboard_id := keyboard); smg$k_trm_ctrld:7 spawn_subproc(pasteboard_id := pasteboard);t1 OTHERWISE done := TRUE; (* Get out *) END; (* end of cases *)1( END; (* End of keystroke loop *) END;. smg$delete_virtual_display( (* Clean up *)# display_id := err_display);C% END; (* End of display created *)a> IF pbwid_change THEN (* Restore the pasteboard width *)# smg$change_pbd_characteristics(1 pasteboard_id := pasteboard,! desired_width := old_pb_cols,e width := pb_cols); END; (* End of WITH block *)9 vtbook_handler := 1; (* Ignore any local errors *) END; a=FUNCTION from_cld (qualif : VARYING [$u1] OF CHAR) : INTEGER;e VARx: cli_desc: dsc1$type VALUE [dsc$b_class: dsc$k_class_s;4 dsc$b_dtype: dsc$k_dtype_t; OTHERWISE ZERO]; BEGINN ESTABLISH(lib$sig_to_ret);/ cli_desc.dsc$w_maxstrlen := LENGTH(qualif);4 cli_desc.dsc$a_pointer := IADDRESS(qualif.body);. cli$present(entity_desc := %REF cli_desc); from_cld :=1; END; m%FUNCTION bookshelf_defined : BOOLEAN;e(*M * This function returns TRUE if the DECW$BOOKSHELF logical is defined. ThisiJ * function is used to determine whether to search for library files usingN * DECW$BOOKSHELF:.DECW$BOOKSHELF or DECW$BOOK:.DECW$BOOKSHELF as the default. *) BEGINa% bookshelf_defined := ODD($TRNLNM(d. TABNAM := %STDESCR 'LNM$DCL_LOGICAL',/ LOGNAM := %STDESCR 'DECW$BOOKSHELF'));i END; m#FUNCTION library_defined : BOOLEAN;(*F * This function returns TRUE if the LIBRARY logical is defined. ThisJ * function is used to determine whether to search for library files usingD * DECW$BOOKSHELF:.DECW$BOOKSHELF or DECW$BOOKSHELF: as the default. *)K BEGIN:# library_defined := ODD($TRNLNM(C. TABNAM := %STDESCR 'LNM$DCL_LOGICAL',( LOGNAM := %STDESCR 'LIBRARY')); END; [HIDDEN] TYPEw desblk = RECORD flink : INTEGER; handler : [UNSAFE] INTEGER; arg_count : INTEGER;# cond_addr : [UNSAFE] INTEGER;V END; [HIDDEN] VAR exh_desc : desblk;X- exit_cond : [STATIC, VOLATILE] INTEGER;m# term_type : UNSIGNED VALUE 0;n- item : INTEGER VALUE DVI$_DEVTYPE;]' device_type : VARYING[132] OF CHAR; BEGIN_,IF NOT ODD(from_cld(qualif := 'DEBUG')) THEN BEGINg; sts := lib$get_foreign(resultant_string := %DESCR cmd);  IF ODD(sts) THEN BEGIN; cmd := 'VTBOOK '+cmd;  sts := cli$dcl_parse( ! command_string := %DESCR cmd,:! table := %REF VTBOOK_TABLE ); IF NOT ODD (sts) THEN> sts := UOR(sts, STS$M_INHIB_MSG); (* Already signaled *) END; END;IF ODD(sts) THEN BEGINoI dbg_log_enable := ODD(cli$present( entity_desc := %STDESCR 'DEBUG'));e= sts := smg$create_pasteboard(pasteboard_id := pasteboard,b( output_device := 'SYS$COMMAND',. number_of_pasteboard_rows := pb_rows,1 number_of_pasteboard_columns := pb_cols,e( type_of_terminal := term_type); IF ODD(sts) THEN% IF term_type <> SMG$K_VTTERMTABLEF THEN% lib$signal(vtbook__undefterm)I ELSEC sts := smg$create_virtual_keyboard(keyboard_id := keyboard,D2 input_device := 'SYS$COMMAND'); IF ODD(sts) THEN BEGINbE ESTABLISH(vtbook_handler); (* Errors routed to an SMG display *)C WITH exh_desc DO BEGIN & handler := IADDRESS(exit_handler); arg_count := 1; % cond_addr := IADDRESS(exit_cond);  END;D $DCLEXH(DESBLK := exh_desc); (* Clear the screen upon exit *); smg$set_broadcast_trapping(pasteboard_id := pasteboard,I> ast_routine := show_broadcast); IF bookshelf_defined THENm IF library_defined THENK menu_bookshelf_list('library', (* Allow for LIBRARY logical *)N1 'decw$bookshelf:.decw$bookshelf')a ELSE9 menu_bookshelf_list('library.decw$bookshelf', @ decw$bookshelf_defnam) (* Use DECW$BOOKSHELF *) ELSE7 + menu_bookshelf_list('library', (* Use DECW$BOOK *)d shelf_defnam); END; END; $EXIT(sts);aEND. term_code : $UWORD;" done : BOOLEAN VALUE FALSE;> display_rows, (* How many rows in display *)A display_cols, (* How many columns in display *)D max_cols, (* Largest possible display width *) count,9 start_col : INTEGER; (* calculated display size *)( msg_text : VARYING[1024] OF CHAR; msg_z{e$ VTBOOK014.AU*) &[HUNTER.FILESERV.VTBOOK.A]VTBOOK.PEN;1&*[HUNTER.FILESERV.VTBOOK.A]VTBOOK.PEN;1+,U*./ 4-) 0123KPWO56Od7@{/6e8@0>_9GHJ k(QXL30-Nov-1993 18:16:54V1.4VTBOOKVAX Pascal V4.4-89  VTBOOK__BADSUBSIZ  VTBOOK__LASTNOTLAST  VTBOOK__PARTTYPMIS  VTBOOK__BADPART  VTBOOK__BADSIZE  VTBOOK__BADLAST  VTBOOK__BADRECTYP  VTBOOK__BADSHELFENTRY  VTBOOK__OPENIN  VTBOOK__UNDEFTERM8  MENU_BOOKE MENU_BOOKSHELFR MENU_BOOKSHELF_LIST[ZDECW$BOOKSHELF_DEFNAM^] SHELF_DEFNAM` MAX_CMD_LENba VTBOOK_ID  d PASTEBOARD  fKEYBOARD  gPB_ROWS  hPB_COLS  iDBG_LOG_ENABLEj" kCMD  VTBOOK_TABLEo" pqDECW$BOOKSHELF_HYBRIDt" uv TRANSL_TEXTy  SPAWN_SUBPROCz  SHOW_HELP}|~FROM_CLDBOOKSHELF_DEFINEDLIBRARY_DEFINED $9:% FILENAME $;<% BOOKNAME=> $?% DEFAULT_FILE=@ ((A=B(C((D(( $FG% FILENAME $HI% SHELFNAME=J $KL% DEFAULT_FILE=M(N $ TOP_LEVEL=O(P((Q(( $ST% LIBNAME $U% DEFNAME=V=W(X(Y(( xdecw$bookshelf:,x\( decw$book:.decw$bookshelf,_(  DECUS VTBOOK V1.4,c(e PASTEBOARDVTBOOK30-Nov-1993 18:16:54V1.4eKEYBOARDePB_ROWSePB_COLSeDBG_LOG_ENABLElmeCMD(,n(rm seDECW$BOOKSHELF_HYBRID( PDECW$BOOK:wm xe TRANSL_TEXT(  $  PASTEBOARD_ID ${  PASTEBOARD_ID $  KEYBOARD_ID  ,FROM_CLD $% QUALIFeFROM_CLD=(( -BOOKSHELF_DEFINEDeBOOKSHELF_DEFINED .LIBRARY_DEFINEDeLIBRARY_DEFINED (DEBUG,(( 8VTBOOK ,8( (DEBUG XSYS$COMMAND,X (  XSYS$COMMAND 8library decw$bookshelf:.decw$bookshelf,( library.decw$bookshelf,( 8library0d$T(Rz&Lt(Tv $ 8 L ` t " @ r $ L t < n ( P x <XDl@h~ Ht $@L`(Fr8\t HZr Lt3*[HUNTER.FILESERV.VTBOOK.A]VTBOOK014.RELEASE_NOTES;1+,d* ./ 4N-) 0123KPWO56Od7 /6e8 B_9GHJ;This distribution is V1.4, production version, 30-NOV-1993.@---------------------------------------------------------------- V1.4 NOTESCDECUS VTBOOK V1.4 includes the following enhancements and bug fixes over V1.3-1:E o Ctrl/D now spawns a subprocess and restores the VTBOOK displays upon return.Known problems:F o Sites using the logical name LIBRARY may experience difficultiesD with the new DECW$BOOKSHELF handling routines -- please report. any problems to VTBOOK-L@wkuvx1.wku.edu.? o The title pages of some books are not displayed properly.C o The AXP image (from VEST) does not successfully handle errors& caused by errors opening a book.? o Accessing the index in some manuals may cause recoverable access violations.G o Some books, mostly those created by DECWrite, cannot be read past the index and contents.@----------------------------------------------------------------IMPORTANT NOTE:FAs of this version of DECUS VTBOOK, all files reside in subdirectoriesFof [VTBOOK]. Depending on your installation, you may find one or moreof the following:2[VTBOOK.DOC] ! Optional documentation files)[VTBOOK.EXE] ! Required executable*[VTBOOK.SRC] ! Optional source code-[VTBOOK.OBJ] ! Required object modulesFWe suggest deleting all files from installations prior to V1.1b1, due Fto the inability of VMSINSTAL to determine whether or not you have oneHof these earlier versions inst{rS$ VTBOOK014.Ad* ) 3[HUNTER.FILESERV.VTBOOK.A]VTBOOK014.RELEASE_NOTES;1Nalled. This will reduce file clutter and Gprevent conflicts with earlier invocations by foreign command. Please Bsee the file INSTALL.DOC for further information and instructions.@----------------------------------------------------------------INCLUDED FILES=In a full installation, the follwing files will be installed:VTBOOK_ROOT:[DOC]----------------- INSTALL.DOC VTBOOK.DOCVTBOOK_ROOT:[EXE]----------------- VTBOOK.EXEVTBOOK_ROOT:[OBJ]-----------------BOOK.OBJ BOOKMSG.OBJ BOOKSHELF.OBJ VTBOOK.OBJVTBOOKMENU.OBJVTBOOK_TABLE.OBJVTBOOK_ROOT:[SRC]-----------------BOOK.PAS BOOKMSG.MSG BOOKSHELF.PAS DESCRIP.MMS VTBOOK.CLD VTBOOK.PAS VTBOOK.PENVTBOOKMENU.PASVTBOOKMENU.PENVTBOOK_TABLE.CLDVTBOOK_CLI_ROUTINES.PASVTBOOK_CLI_ROUTINES.PENVTBOOK_HELP.HLP VTBOOK_LOC: -----------REMOVE_DCL_COMMAND.COM SYS$TEST: ---------VTBOOK_IVP.COMSYS$COMMON:[SYS$STARTUP]------------------------MVTBOOK_STARTUP.COM ! Should be called by site-specific startup proc.GVTBOOK_CLUSTER_STARTUP.COM ! Used by the cluster startup option during+ ! installation.@---------------------------------------------------------------- LOGICAL NAMESMThe following logical names may be defined by SYS$STARTUP:VTBOOK_STARTUP.COM:JVTBOOK_ROOT ! Always defined, rooted logical pointing to top-level dirEVTBOOK_LOC ! Always defined, points to top-level dir, non-rooted8VTBOOK_EXE ! Always defined, points to VTBOOK image8VTBOOK_OBJ ! Always defined, points to object files3VTBOOK_DOC ! Optional, points to documentation2VTBOOK_SRC ! Optional, points to source filesAVTBOOK_VERSION ! Required, indicates currently installed version@----------------------------------------------------------------NReport any problems, enhancement suggestions, etc. to wortman@eisner.decus.orgThanks,!The DECUS VTBOOK development team @---------------------------------------------------------------- V1.3-1 NOTESEDECUS VTBOOK V1.3-1 includes the following enhancements and bug fixes over V1.3:E o DECW$BOOKSHELF logical handling has been revamped in an attemptE to make it handle as many different situations as possible. NoC guarantees are made that it'll work for a given installation.E o Unknown/undefined terminal types now exit with an error message during initialization.@---------------------------------------------------------------- V1.3 NOTESCDECUS VTBOOK V1.3 includes the following enhancements and bug fixes over V1.2:G o The DECW$BOOKSHELF logical is now handled correctly in situationsG where it is defined to be a filename rather than a search-list of directories.6 o Broadcast messages now appear in a popup window.@---------------------------------------------------------------- V1.2 NOTESCDECUS VTBOOK V1.2 includes the following enhancements and bug fixes over V1.1:B o All .DECW$BOOK files should be readable now. V1.1 could not@ read books created with VAX DOCUMENT V2.2 and later. This problem has been solved.C o A help screen can be displayed at any time by pressing either" the Help key or the "?" key.D o Pressing "next screen" at the end of a topic will now take youA on to the next topic. Previously, the "next topic" key was required.: o The DECW$BOOKSHELF logical is now handled correctly.@ o Remote books read over DECnet no longer produce occasional2 "record too large for user's buffer" errors.A o A VESTed version of the VTBOOK executable has been provided for OpenVMS AXP.D o Various cleanup was performed on the source files and the .MMS file.AAll work on V1.2 was done by Darrell Burkhead and Hunter Goatley.@---------------------------------------------------------------- V1.1 NOTES=The production version contains no fixes not addressed in theearlier beta versions.@---------------------------------------------------------------- V1.1b3 NOTES=The beta-3 release provides the following enhancements and/or bugfixes:2o Renewed support for foreign command invocation? o Attempts to detect V1.1b2 or V1.1b1 currently installedA and provides REMOVE_DCL_COMMAND.COM in VTBOOK_LOC: if so.+ o User's choice of invocation method.$o Enhanced "go-back" functionality! o Available through Ctrl/B.? o Maintains "go-back-list" for simulation of Bookreader's go-back behavior.o Installation procedureA o Recognizes configuration of last installation (source and/ docs) and defaults to same on upgrades.? o Modified "fast install" menu to reflect these defaults.% o Two savesets instead of four.@ o Directory security now (g:re,w:re) instead of (g:e,w:e).Do If multiple libraries are defined, opening menu banner now reads: "DECUS VTBOOK Vn.n" for ease of version determination.Eo New VTB_CLI_ROUTINES.PAS/.PEN contains templates for CLI routines not provided by Digital.:o Fixed behavior of message box when in 132-column mode.<o F10 now behaves exactly like Ctrl/Z when reading a book.Co Ctrl/E implemeented as "Fast Exit" key -- exits directly to DCL while reading a book.DDue to the inconvenience or removing a command from DCLTABLES.EXE, aD*template* command file has been furnished for those sites where theAinstall procedure detects a previous installation. It should not=be run as is, but should be examined for needed site-specificmodifications.@---------------------------------------------------------------- V1.1b2 NOTES@The beta-2 release contains several improvements and bugfixes tobeta-1."o The installation procedure now1 o Recognizes clusters vs. standalone nodes.F o Requires either installation of the .CLD into either DCLTABLESJ or invocation by private SET COMMAND. VTBOOK.CLD will be providedK in VTBOOK_SRC ([VTBOOK.SRC]) if you elect not to have it installed.G If sources are not being installed, this will create the [.SRC]$ directory for the .CLD file.A o Compiles (if VAX Pascal V4.4 is available) into temporaryD object files until all compiles have completed successfully.F o Will not attempt to provide the .HLP source unless sources are to be installed.? o Compilation of sources now uses "production" qualifiers) (/NODEBUG/NOLIST/NOCHECK/NODIAG).%o Changes to VTBOOK itself include:C o New /DEBUG qualifier to enable debugging logfiles that wereG previously mandatory. These may still be enabled using /DEBUG.6 The default behavior of VTBOOK is now /NODEBUG'o Changes to the Online Help include:? o Documentation of the /DEBUG qualifier and its behavior.FMost users will not detect a change, save that their directories won't%pile up with .LOG files ad infinitum.DThis qualifier now *requires* that invocation occur through the CLI,Feither by installing the .CLD in DCLTABLES.EXE (which the Install willDdo for you if you wish) or by using SET COMMAND VTBOOK_SRC:VTBOOK inLOGIN.COM or SYLOGIN.COM.**[HUNTER.FILESERV.VTBOOK.A]VTBOOKMENU.OBJ;1+,g*. / 4 :-) 0123KPWO 56Od7/6e8XG_9GHJ5 VTBOOKMENU0130-Nov-1993 18:1730-Nov-1993 18:17VAX Pascal V4.4-89PΤ^ԭ PAS$HANDLERmмVмм X( мY^PZ[X̟SMG$GET_DISPLAY_ATTR短̟ȟVXSMG$GET_PASTING_INFOЭ֭<P<PPߏߏSMG$CREATE_VIRTUAL_DISPLAY<PPY(n<PP(n<ߏߏ SMG$PUT_CHARS<P̟VSMG$PASTE_VIRTUAL|$ VTBOOK014.Ag*) *[HUNTER.FILESERV.VTBOOK.A]VTBOOKMENU.OBJ;1 _DISPLAYߏ񟭸X SMG$SELECT_FROM_MENUPW Added CTRL-D to spawn subprocess by calling spawn_subproc.!10-NOV-1993 Darrell Burkhead V1.1 Added Ctrl-E as an exit key. 5-NOV-1993 C. Snyder Update keypad entries-*)TYPE $UWORD = [WORD] 0..65535; [ASYNCHRONOUS, HIDDEN, EXTERNAL]FPROCEDURE show_help (pasteboard_id, keyboard_id : UNSIGNED); EXTERNAL; [GLOBAL]KFUNCTION select_from_menu(pasteboard_id, keyboard_id, display_id: UNSIGNED;" VAR choice_number: $uword;B VAR choices: ARRAY [l..u: INTEGER] OF VARYING [x] OF CHAR; max_choice: INTEGER;5 VAR terminator: [TRUNCATE] $uword): UNSIGNED; VAR sts, curdsp: UNSIGNED; cur, trmkey: $uword;$ relabel, done: BOOLEAN VALUE FALSE; i, wl, r, c: INTEGER; s: VARYING [255] OF CHAR;1 curstr: [STATIC] VARYING [255] OF CHAR VALUE ''; anxt: [STATIC] INTEGER VALUE 1; BEGIN2 smg$get_display_attr(display_id := display_id, height := wl);2 smg$get_pasting_info(display_id := display_id,# pasteboard_id := pasteboard_id, flags := %REF i, pasteboard_row := r, pasteboard_column := c); r := r + wl; c := c + 1; IF (LENGTH(curstr) > 0) THEN i := LENGTH(curstr) ELSE i := 1;3 smg$create_virtual_display(number_of_rows := 1,! number_of_columns := i, display_id := curdsp,* video_attributes := smg$m_bold);D IF (choice_number < 1) OR_ELSE (choice_number > max_choice) THEN BEGIN choice_number := 1; curstr := ''; END;1 IF (anxt <> choice_number) THEN curstr := ''; anxt := choice_number;( smg$put_chars(curdsp, curstr, 1, 1); IF (LENGTH(curstr) > 0) THEN0 smg$paste_virtual_display(display_id := curdsp,% pasteboard_id := pasteboard_id, pasteboard_row := r, pasteboard_column := c); REPEAT8 sts := smg$select_from_menu(keyboard_id := keyboard_id,! display_id := display_id,& selected_choice_number := cur,& default_choice_number := anxt,$ flags := smg$m_return_immed,( word_terminator_code := trmkey); IF (anxt <> cur) THEN BEGIN relabel := (curstr <> ''); curstr := ''; anxt := cur; END; IF ODD(sts) THEN CASE trmkey OF smg$k_trm_ctrle: $exit(1);# smg$k_trm_ctrlr, smg$k_trm_ctrlw:( smg$repaint_screen(pasteboard_id);* smg$k_trm_question_mark, smg$k_trm_help:- show_help (pasteboard_id := pasteboard_id,# keyboard_id := keyboard_id); smg$k_trm_ctrld:7 spawn_subproc(pasteboard_id := pasteboard);@ smg$k_trm_select, smg$k_trm_do, smg$k_trm_enter, smg$k_trm_cr: done := TRUE;1 smg$k_trm_f10, (* Added, CS, V1.1, 5-NOV-1993 *) smg$k_trm_ctrlz: BEGIN sts := smg$_eof; done := TRUE; END; smg$k_trm_kp8, smg$k_trm_next_screen: BEGIN anxt := cur + wl - 1;5 IF (anxt > max_choice) THEN anxt := max_choice; curstr := ''; END; smg$k_trm_kp7, smg$k_trm_prev_screen: BEGIN anxt := cur - wl + 1;# IF (anxt < 1) THEN anxt := 1; curstr := ''; END; smg$k_trm_delete:" IF (LENGTH(curstr) > 0) THEN BEGIN relabel := TRUE;' curstr.LENGTH := LENGTH(curstr) - 1; END;1 smg$k_trm_pf3, (* Added, CS, V1.1, 5-NOV-1993 *): 32..62, 64..126, 160..255, smg$k_trm_find: (*printable*) BEGIN% IF (trmkey=smg$k_trm_find) THEN BEGIN anxt := cur + 2;) IF (anxt-1>max_choice) THEN anxt := 2;}$ VTBOOK014.Ai*) *[HUNTER.FILESERV.VTBOOK.A]VTBOOKMENU.PAS;1P   END ELSE BEGIN& curstr.LENGTH := curstr.LENGTH + 1;( curstr[curstr.LENGTH] := CHR(trmkey); anxt := cur + 1; END; s := choices[anxt-1];( IF LENGTH(s) > LENGTH(curstr) THEN s.LENGTH := LENGTH(curstr);, IF (anxt > max_choice) THEN anxt := 1;8 WHILE (anxt <> cur) AND_THEN (str$compare_multi(s, curstr, 1, 1) <> 0) DO BEGIN s := choices[anxt]; IF (anxt >= max_choice) THEN anxt := 1 ELSE anxt := anxt + 1; i := 1;2 WHILE (i <= LENGTH(s)) AND_THEN (s[i] = ' ') DO i := i + 1; IF (i > 1) THEN3 IF (LENGTH(s) + 1 - i > LENGTH(curstr)) THEN% s := SUBSTR(s, i, LENGTH(curstr)) ELSE( s := SUBSTR(s, i, LENGTH(s) + 1 - i), ELSE IF (LENGTH(s) > LENGTH(curstr)) THEN" s.LENGTH := LENGTH(curstr); END;6 IF (str$compare_multi(s, curstr, 1, 1) = 0) THEN BEGIN IF (anxt = 1) THEN anxt := max_choice ELSE anxt := anxt - 1;, relabel := ( (trmkey<>smg$k_trm_find) AND# (trmkey<> smg$k_trm_pf3)); END, ELSE IF ( (trmkey<>smg$k_trm_find) AND& (trmkey<>smg$k_trm_pf3)) THEN' curstr.LENGTH := LENGTH(curstr) - 1; END; OTHERWISE" done := PRESENT(terminator);1 IF NOT done THEN smg$ring_bell(display_id); END; IF relabel THEN BEGIN8 smg$unpaste_virtual_display(curdsp, pasteboard_id);! IF (LENGTH(curstr) > 0) THEN BEGIN7 smg$change_virtual_display(curdsp, , LENGTH(curstr));& smg$put_chars(curdsp, curstr, 1, 1);1 smg$paste_virtual_display(display_id := curdsp,& pasteboard_id := pasteboard_id, pasteboard_row := r, pasteboard_column := c); END; relabel := FALSE; END;$ UNTIL done OR_ELSE NOT ODD(sts);7 smg$unpaste_virtual_display(curdsp, pasteboard_id); choice_number := cur;5 IF PRESENT(terminator) THEN terminator := trmkey; select_from_menu := sts; END;END.**[HUNTER.FILESERV.VTBOOK.A]VTBOOKMENU.PEN;1+,j*./ 4-) 0123KPWO56Od7?/6e8P_9GHJ m!OZL30-Nov-1993 18:17:1401 VTBOOKMENUVAX Pascal V4.4-89(@$UWORD SELECT_FROM_MENU($UWORD VTBOOKMENU30-Nov-1993 18:17:1401  SELECT_FROM_MENU $  PASTEBOARD_ID $  KEYBOARD_ID $  DISPLAY_ID $ CHOICE_NUMBER $% CHOICES $  MAX_CHOICE( $ TERMINATOR  ((!(2\Hz 4f3*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_CLI_ROUTINES.PAS;1+,l*./ 4P6-) 0123KPWO56Od7Ӓ/6e8U_9GHJ[ ENVIRONMENT, IDENT('V1.3') ]MODULE VTB_CLI_ROUTINES; (*+COMPONENT: VTB_CLI_ROUTINES PROGRAM DESCRIPTION: C Function, value, and procedure templates for the CLI$ routines. AUTHORS:  Bret D. Wortman CREATION DATE: 10-NOV-1993 DESIGN ISSUES: VERSION: V1.1b3 MODIFICATION HISTORY: % Date | Name | DescriptionP--------------+---------+-------------------------------------------------------+ 10-nov-1993 | bdw | Original VersionP--------------+---------+-------------------------------------------------------%[change_entry]%-*) VAR/ CLI$_PRESENT : [ EXTERNAL, VALUE ] INTEGER;/ CLI$_NEGATED : [ EXTERNAL, VALUE ] INTEGER; [HIDDEN] TYPE $UWORD = [WORD] 0..65535; MFUNCTION CLI$PRESENT( entity_desc: [CLASS_S] PACKED ARRAY [$l1..$u1:INTEGER] M OF CHAR): UNSIGNED; EXTERNAL;?FUNCTION CLI$DCL_PARSE( command_string: [CLASS_S] PACKED ARRAY O [$l1..$u1:INTEGER] OF CHAR := %IMMED 0;( table: UNSIGNED;< param_routine: UNSIGNED := %IMMED 0;= prompt_routine: UNSIGNED := %IMMED 0;> prompt_string: [CLASS_S] PACKED ARRAY M [$l2..$u2:INTEGER] OF CHAR := %IMMED 0+ ):UNSIGNED; EXTERNAL;;FUNCTION CLI$GET_VALUE( entity_desc: [CLASS_S] PACKED ARRAY@ [$l1..$u1:INTEGER] OF CHAR;D VAR retdesc: [CLASS_S,VOLATILE] PACKED ARRAY< [$l2..$u2:INTEGER] OF CHAR;D VAR retlength: [VOLATILE] $UWORD := %IMMED 0+ ):UNSIGNED; EXTERNAL;END.3*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_CLI_ROUTINES.PEN;1+,n* ./ 4-) 0123KPWO56Od7g/6e8Y_9GHJ u- QbL22-Nov-1993 10:44:25V1.3VTB_CLI_ROUTINESVAX Pascal V4.4-89  CLI$_PRESENT  CLI$_NEGATED  CLI$PRESENT  CLI$DCL_PARSE% $ CLI$GET_VALUE   CLI$PRESENT $ ENTITY_DESC(   CLI$DCL_PARSE $COMMAND_STRING $ TABLE( `~ؙ$ VTBOOK014.An* ) 3[HUNTER.FILESERV.VTBOOK.A]VTBOOK_CLI_ROUTINES.PEN;1* $  PARAM_ROUTINE $  !PROMPT_ROUTINE  $"# PROMPT_STRING (    CLI$GET_VALUE $&' ENTITY_DESC $() RETDESC( $* @+ RETLENGTH((, -$UWORDVTB_CLI_ROUTINES22-Nov-1993 10:44:25V1.3.Z$Lp8n|Dp$66*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_CLUSTER_STARTUP.COM;1+,r*./ 4E<-) 0123KPWO5h6Od7t/6e8\_9GHJ)$! VTBOOK Cluster-wide Startup Procedure$!3$! Site-specific modifications should be placed in&$! SYS$STARTUP:VTBOOK_SYSTARTUP.COM$!E$! 1-NOV-1993 Bret D. Wortman Original version V1-001$!$!>$ if p1 ! If Foreign Command install .or. .not. CLD installed$ then $ MCR SYSMAN SET ENVIRONMENT/CLUSTER$ DO @SYS$STARTUP:VTBOOK_STARTUP.COM EXIT$ else ! If DLC was installed $ MCR SYSMAN SET ENVIRONMENT/CLUSTER. DO INSTALL REPLACE SYS$LIBRARY:DCLTABLES.EXE$ DO @SYS$STARTUP:VTBOOK_STARTUP.COM EXIT$ endif$ EXIT+*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_HELP.HLP;1+,s* ./ 4Dn-) 0123KPWO56Od7/6e8Ha_9GHJ  1 VTBOOKD DECUS VTBOOK is a bookreader for character-cell terminals. It canC be used to read any files readable by the DECwindows Bookreader,6 but it displays the text on VTxxx-series terminals. Format VTBOOK 2 Menu_Navigation@ Pressing Help or ``?'' at any time will display a help screen- showing all of the VTBOOK key definitions.@ o A menu with only 1 choice is passed through automatically.8 o Do, Return, Enter, Select: select the current itemD o Arrow keys, Prev/Next Screen: move forward/back as appropriate o CTRL-Z: exit the menu? o Printable characters: Search forward through options. The< search pattern accumulates until a manual move occurs.9 o Delete: deletes a character from the search pattern6 o Find: Finds the next match of the search pattern< o Other keys may be defined specific to given menus (see Library_Customization) o CTRL-E: exit VTBOOK 2 Book_Navigation@ Pressing Help or ``?'' at any time will display a help screen- showing all of the VTBOOK key definitions.B At the top level of a book is a choice of ``index'' structures.@ These may include contents, tables, figures, examples, index.B After choosing one of these, a menu will be presented (contentsA or whatever). This menu may be navigated and items selected inA the usual way. Figures are not currently displayed. Tables and text are displayed.2 o You may move around using Up/Down/Next/Prev.B o Left/Right will move to the previous/next portion of text in; the book, if you are in text (as opposed to a table).> o Find will find the next ``hot-spot.'' Hotspots appear inA reverse video, and the current one appears flashing. Select< moves to the section indicated by the current hotspot.! o CTRL-Z exits from the book. 2 Library_Customization? The library is accessed via the name LIBRARY; the default isC DECW$BOOK:.DECW$BOOKSHELF. All files have a default directory ofA DECW$BOOK:. You may create your own shelf files and define theC logical name LIBRARY to point to them. VTBOOK provides some help" with this from the shelf menus:= o F20 will create a new LIBRARY in your default directory o F19 will close the library8 o PF4 will append the current choice to the library. 2 Authors> The original version of VTBOOK was written by Chris Sharman@ of CCA Stationery, England. The DECUS version expands Chris's original effort.B DECUS VTBOOK is freely distributable, modifiable, copyable, and usable.? DECUS VTBOOK contains modifications by the following people:3 o Darrell Burkhead, Western Kentucky University1 o Hunter Goatley, Western Kentucky University o Curt Snyder, Allergan* o Bret Wortman, Century Lubricants Co.,*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_HELP.SDML;1+,t*. / 4F p-) 0123KPWO 56Od7/6e8e_9GHJ  File : VTBOOK_HELP.SDML Author : Hunter Goatley Date : November 18, 1993 Description:; This file is used to generate the on-line help for VTBOOK.> The following command will generate the .HLP file for VTBOOK:; $ DOCUMENT VTBOOK_HELP HELP HLP ! Creates VTBOOK_HELP.HLP0 $ LIBRARY/INSERT/HELP help-library VTBOOK_HELP or1 $ LIBRARY/REPLACE/HELP help-library VTBOOK_HELP Revision History:* 01-000 Hunter Goatley 18-NOV-1993 11:57& Creation from VTBOOK V1.1 .HLP file. )(VTBOOK Command\\VTBOOK)(VTBOOK\\VTBOOK_CMD) EDECUS VTBOOK is a bookreader for character-cell terminals. It can beAused to read any files readable by the DECwindows Bookreader, but/it displays the text on VTxxx-series terminals. (VTBOOK) () (Command Qualifiers)(/DEBUG\/NODEBUG) (Menu Navigation)EPressing Help or ``?'' at any time will display a help screen showing"all of the VTBOOK key definitions.(UNNUMBERED)? A menu with only 1 choice is passed through automatically.7 Do, Return, Enter, Select: select the current itemC Arrow keys, Prev/Next Screen: move forward/back as appropriate CTRL-Z: exit the menuE Printable characters: Search forward through options. The search> pattern accumulates until a manual move occurs.8 Delete: deletes a character from the search pattern5 Find: Finds the next match of the search pattern; Other keys may be defined specific to given menus (see Library_Customization) CTRL-E: exit VTBOOK (Book Navigation)EPressing Help or ``?'' at any time will display a help screen showing"all of the VTBOOK key definitions.

EAt the top level of a book is a choice of ``index'' structures. TheseFmay include contentsp$ VTBOOK014.At*) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK_HELP.SDML;1F B< , tables, figures, examples, index. After choosingCone of these, a menu will be presented (contents or whatever). ThisFmenu may be navigated and items selected in the usual way. Figures are8not currently displayed. Tables and text are displayed. (UNNUMBERED)1 You may move around using Up/Down/Next/Prev.E Left/Right will move to the previous/next portion of text in the2 book, if you are in text (as opposed to a table).F Find will find the next ``hot-spot.'' Hotspots appear in reverseA video, and the current one appears flashing. Select moves to the* section indicated by the current hotspot. CTRL-Z exits from the book. $(Library Customization)<The library is accessed via the name LIBRARY; the default is@DECW$BOOK:.DECW$BOOKSHELF. All files have a default directory of?DECW$BOOK:. You may create your own shelf files and define theElogical name LIBRARY to point to them. VTBOOK provides some help withthis from the shelf menus:(UNNUMBERED)< F20 will create a new LIBRARY in your default directory F19 will close the library7 PF4 will append the current choice to the library.  (Authors)BThe original version of VTBOOK was written by Chris Sharman of CCA@Stationery, England. The DECUS version expands Chris's originaleffort.

?DECUS VTBOOK is freely distributable, modifiable, copyable, andusable.

<DECUS VTBOOK contains modifications by the following people:(UNNUMBERED)2 Darrell Burkhead, Western Kentucky University0 Hunter Goatley, Western Kentucky University Curt Snyder, Allergan) Bret Wortman, Century Lubricants Co.  !(Command Qualifiers)(/DEBUG\/NODEBUG (D)) DEnables debugging output into logfiles located in SYS$SCRATCH. The<default behavior is for VTBOOK not to create these logfiles.

6This qualifier is primarily for use by the developers. **[HUNTER.FILESERV.VTBOOK.A]VTBOOK_IVP.COM;1+,0,./ 4I-) 0123KPWO5(6Od7/6e8h_9GHJ $!$! VTBOOK_IVP.COM$!&$! Bret D. Wortman, 4-NOV-1993, V1.1$!$!I$! This IVP is basically just a check to ensure that all essential files-$! are where they oughta be. Nothing fancy.$!$! $ set = "set"$$ set symbol/scop=(nolocal,noglobal)$!$! Initial comments$!$ type sys$input:1 +--------------------------------------------+1 | Installation Verification Procedure |1 | for VTBOOK |1 +--------------------------------------------+:$ if f$search("SYS$STARTUP:VTBOOK_STARTUP.COM") .eqs. "" - then goto _bad_startupH$ if f$trnlnm("VTBOOK_LOC","LNM$SYSTEM") .eqs. "" then goto _bad_loc_lnmH$ if f$trnlnm("VTBOOK_EXE","LNM$SYSTEM") .eqs. "" then goto _bad_exe_lnmD$ if f$search("VTBOOK_EXE:VTBOOK.EXE") .eqs. "" then goto _bad_image$ type sys$input: IVP Completed successfully $ exit %X01$!$_bad_startup:$ sav_stat = $status$ type sys$input:E The file SYS$COMMON:[SYSMGR]VTBOOK_STARTUP.COM could not be found.' You can create this file as follows:2 $ CREATE SYS$COMMON:[SYSMGR]VTBOOK_STARTUP.COM" $define vtbook_loc :

 ^Z $I This will create the VTBOOK_LOC logical needed for VTBOOK to find itsF image. Replace and as appropriate in the above lines.$ goto _bad_exit$!$_bad_loc_lnm:$ sav_stat = $status$ type sys$input:F The logical VTBOOK_LOC has not yet been defined but should have beenC defined by the startup procedure. You may define this logical by* executing SYS$STARTUP:VTBOOK_STARTUP.COM$ goto _bad_exit$!$_bad_exe_lnm:$ sav_stat = $status$ type sys$input:F The logical VTBOOK_EXE has not yet been defined but should have beenC defined by the startup procedure. You may define this logical by* executing SYS$STARTUP:VTBOOK_STARTUP.COM$ goto _bad_exit$! $_bad_image:$ sav_stat = $status$ type sys$input:F The IVP was unable to locate VTBOOK_EXE:VTBOOK.EXE. If this file isG not located in VTBOOK_EXE, please edit SYS$STARTUP:VTBOOK_STARTUP.COMH and indicate the new location in the definition of VTBOOK_EXE. If theA image is missing, attempt to reinstall the VTBOOK distribution. $_bad_exit:$ exit sav_stat.*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_STARTUP.COM;1+,u*./ 4F-) 0123KPWO5(6Od7=/6e8}m_9GHJ$! VTBOOK Startup Procedure$!;$! Site-specific modifications may be placed in this file.$!*$! 18-NOV-1993 Hunter Goatley V1.2F$! 1-NOV-1993 Bret D. Wortman Original version V1-001$!$!,*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_TABLE.CLD;1+,v*./ 4B-) 0123KPWO5%6Od7J/6e8p_9GHJ!%! VTBOOK Internal Command Definition!B! 10-NOV-1993 bdw Original version V1.1b3!!MODULE VTBOOK_TABLE DEFINE VERB VTBOOK QUALIFIER DEBUG,*[HUNTER.FILESERV.VTBOOK.A]VTBOOK_TABLE.OBJ;1+,w* ./ 4z-) 0123KPWO56Od7 X/6e8 s_9GHJ' VTBOOK_TABLE0-030-NOV-1993 18:18-VAX/VMS Command Definition Utility (V4-001) VTBOOK_TABLEx CLI$TABLESPz x VTBO ,(@T VTBOOK$DEBUG`$ VTBOOK014.Ac*) ,[HUNTER.FILESERV.VTBOOK.A]VTBOOK0-#:]&SMXV0+a#d";tZ&u$~vA>)9&9IU("wK"rts#6*<ϭR*.CՖSX.}5"rFL/̪F3\M¾֋t9񭳚HV*1̈z5ݡXmI®㆖0WF' {9͢ןZ/q}<2aD{$Jk!Q` ?n?6b2.%F:1SFnHzS@$GBLW)d>)lm]#<]GgXҥb[$ӅrCSGx_#F.4e7sH*1a!"IgHh={ߛ#WkgTɈ}i5 :$g;}q\}VnQKs*ûn1Ο(ű.|Yo>ӯŨ"wn(yOhhklF]D^gyYC_ECCiV ye x]CZEt^U)Qg\} w.1F>l*L8i܋KC؊OVb,'i]"®6c0o .`8PF- (kCArE@@Z6LAS.ir r)K*<9ی `VO+\t:w-0138'A(Wf-F?TG䬷OWM 1P5P&9xy-trArkON}-.@9oWoS3,aDn,x }=D?;~&d|USJD$1ضs@]]46AOL`S Nn]{9xZHD1pLqߴTBpwdtS+fՇdqtt_ 1 [BPD^piԀ0މj / !}ÞD3vj |OBKH$*UR#Ӝ8>(jW$N{ ~{N捫.8˯%[A(Yy&;H{uO7JUh001.ߦsi:_ c'eHvS78^U Yi|tkEa]^gN=Apn )@"bеV8;Zf`̡9HqK@2*1daЁ&DK =bDP>&Plb҄1p IV哃 \Q ZZraѶ^]֧%DLsǠD'.cHEcFFv&)GR<B4%cv@4^Ew;0gF lAJW_ `Gf,ĈaFTob)ad  WĻ Vhl,'EOU)oUKR0A)N~< bcO`WB<@$h E6o22\⟪z"F1K'9e8@簻'^Zui=yFX|vDpHC,yia8"̙^)\vbTMetlK!KSu׼++"G`Kr902)eA:Ό9 liӥMAm\\=LLK4*q[Wk:ƭ^KJ~|t>Кk_ȤhDsaK%WND%ǜ=ԄJ\6e~ԳFwCUYBVLWXߘk]& K+ YT]FnG.*i9ןLrH2s/#HKh y,B\kc+`5իJKSc (UWҟX]=q|Ъ\`l`#Rr4'nWoJOvÛ+OpxCGP|^V0asL O2҄^e!C2c']!&N}Kw҆O#H9OIF??q/ഷ є,x}Gu:*ԇ!}?_jμ 9ܑ{,uj̹b& I;t\F zc6?@gU ٩f]ȽYyrpW}'*>ܓ@G+?Aks@EGܼ103-m{cL)[NbRZט8uXFkFhR@Kh7h?X[d+z뗐4)f vg 41%o8ϔ׺x1ʊTf`9rp 0@r ofU~.uaf7 A]hHVhBeHv =?۫fve$+F eVaywo ?J lЎ2_ǰkW:6Z2hG $M!R+e:0bBNwnSfP_$Sp. ]U(1{S¿ djrM:VnwC.eH5~'Y/l"H=u-:-OM^}L}Gi$Fx|L| Pe(z%ޞ7k&30Vqڽ7:G2|M?\!X>!A6-x•UcK3$0e•#XgZ,a`dRpp(&JJM"|ؑ_%5b@YFYԧrDrC4-5D=\ֹĄ] g︑lŐ9d20CeJhTdd;D(^2KY Ddg%mZ0Y<k]ok rRF,y-);rn<{%#S3Iވ n+<_,@Y-b0I&ɕ1c#M\SdMʮ+KRTDÔА{"b0ѮA ݬ!HNu:8C; -/PD?GcᣑdtDale*V/OΕKy`޶ DT092׷vx%Ԥ,Ɠ\_^W^WOWe#{\yiM5xZv^wWѤ=81I Ssk[%{p[lͿ>>&*I_g1pRxu ҥ bh<&G>ij~zy[Mowiɢ9߂,-~Nl0񼔳`M4 N[j U8ۇ:"E;q@  a3N;9?J{WKv$p+IHKA%hp!FQ,E`@32:_K&I%l,*RփP. 5wc$Ƣ/9!v"5֟2hz<~d͒7_>.6R+Smѡ&$bBj qW]V/c6aUc<料?5Io6, sƽU`D:Tr-h3}ȶ9RM]r~ܦET.azB"}H)g8 Ҵu/XUE%.k-LCXþ|?PA"qR[ԏ([Yj YѼxxA=%bW*HA~=xg wA+U&; $sμDƶ].)Î>-hl~/ $Ε 9b50O0i% }mVo!"@x'X6KY\U[ Au.:$Th* [*Egr0\{&p3^3ۻ= 4ksA{ge&t~pQ[12'ojYo9TyT_jǬ1zB:[EԜ<2ɋ 4Ƕ0,8qN7}+y 03^lKB9PIUUȞRm#A0dFb˝{B?@{?%ePjl,[P_i~tMo9Fd hi UV\ ^yIN#6{(,ymϯcgM>ZGv -y:Ȫ"p_\I+d <+,4A f>}hKƌᎁuGuN>%fRpQW?l4ȬA׏ tL^FQ`H? O SCJ͞f#YֶZ: Rv GipGcP&p&xeZ}gՙlN5Ԋnּv&d@ݢ!2NQ'^^ȓ( TJb Xr%lzՖg΂}ffh\Y;Qd伴~M >cB-|=1L6fwaT}vOl ٍލz'H4+؊΂4G G(Cu9l`~8G\nHRMc3@I.<(YܪƄp%Od9U8.}zMau8BB⃮z/!M3%Uk4Xki&xzbsffG%wHm(&d[f1!\ e*~ʓŮ|wIB3]=Pm8ELT0Ho-W*XbN.g!_n ȥVƇ޶HQyQc^e[UƆb >i/FJO t쐼IyvyVX)IB5Z@Ue7>2+.ѻ5WjL3]x2i;90\T'kʫK`>T5|է_+w~nbNJz2uVd3 "*rhM咶Eb-` bjg 3D)9~4Qɹ lԍ`D-Mv7d~ÌDZRbWi[? Է)L󢇂as9j7|hVſ'hŒĥm4 p(=; m*+٨LF/A;K͊׀:;1n P쏭8? 嫇H+:5}3̍!I" Nb$pM8uSɮ2Iǜql{ˑj꾥.)!ERzsfG"d"5`>ZIxixIu_QNAٖ_r tv8-#\E=.;,O>M!KaXAn5uGX{%"v 'pCtWoNƓ&>]ם \ ; 6jd` -- L~QERB1x0Q(hhDalaz֭%AA*!}Zt)mD @YT@5tZOWGpʗ􀓊3:qW ul d]!.VΟA9`z1U=>UZ_MGVBΔqߛ9ŲK *!op }+Gڒ_Ҽ 11{_",neHYF9y,sl ȰqVk/ 4<7B%43xbR PeL:T64db!ds:7hźvRS8AIJ1 2u>`ʬmT|f6`06~z-4Ǒz`Oü?2zH"4-vehyUxh3u"rbefϏQ!Ou$ԽJrBQZ"X~`BHn9D&//Pο#A'B&D-w1ik᲻g4__nsd ' X_4sZR3 92qWpzNrmhvn,SCwJ<-VPi$SW#xb{F̌RJ8v Qތxns&C=3fBO1r#1*w=^3 \o}1uɊ |(h* $*i %;%#=#Og`5 `rQ g(WO6ؖkqI-Pcf0$7,jL]<ܯý;]iB8%|GW"`วA8p^KJz/|;Vl/Iu- QM& i36`> }J\\FE !5;EB lu!׏f.$ ~XC.%3Lg^R SI Ӳ.GȰ($)^ooZ 7-6HPނ֯c`V5| YN 69Ƴi;ڑuQ-˜oQ~Q<_0cƞ so I'QTӿ4  sCgIԶ$'yfsVڼ׎BtD qBW aܳ29@^J08!ݾek*IrlaY-cA%sb}~U1KWȿV3?NM*&$rL}eTHERMnot you have oneHof these earlier versions inst