home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / mac / source / untype.zoo / untype1
Text File  |  1990-11-22  |  31KB  |  1,004 lines

  1.  
  2. #!/bin/sh
  3. # This is a shell archive (shar 3.24)
  4. # made 11/15/1990 02:06 UTC by ???@blofeld.pa.dec.com
  5. # Source directory /nfs/catacomb/cc1/sears/untype1
  6. #
  7. # existing files WILL be overwritten
  8. #
  9. # This shar contains:
  10. # length  mode       name
  11. # ------ ---------- ------------------------------------------
  12. #    364 -rw-rw-rw- Makefile
  13. #   3658 -rw-r--r-- README
  14. #   5322 -rw-r--r-- chars.c
  15. #   1829 -rw-rw-rw- eexec.c
  16. #   3369 -rw-r--r-- header.ps
  17. #    895 -rw-r--r-- trailer.ps
  18. #    535 -rwxr-xr-x untype1
  19. #   9054 -rw-r--r-- un-adobe.hqx
  20. #     42 -rw-r--r-- view_pre.ps
  21. #    618 -rw-r--r-- view_post.ps
  22. #
  23. if touch 2>&1 | fgrep '[-amc]' > /dev/null
  24.  then TOUCH=touch
  25.  else TOUCH=true
  26. fi
  27. # ============= Makefile ==============
  28. echo "x - extracting Makefile (Text)"
  29. sed 's/^X//' << 'SHAR_EOF' > Makefile &&
  30. XCFLAGS = -g
  31. X
  32. Xall:    eexec chars
  33. X
  34. Xeexec:    eexec.o
  35. X    cc ${CFLAGS} -o eexec eexec.o
  36. X
  37. Xeexec.o:
  38. X    cc ${CFLAGS} -c eexec.c
  39. X
  40. Xchars:    chars.o
  41. X    cc ${CFLAGS} -o chars chars.o
  42. X
  43. Xchars.o:
  44. X    cc ${CFLAGS} -c chars.c
  45. X
  46. Xclean:
  47. X    rm -f *.o eexec chars untype1.shar
  48. X
  49. Xshar:
  50. X    shar Makefile README chars.c eexec.c header.ps trailer.ps untype1
  51. un-adobe.hqx view_pre.ps view_post.ps >untype1.shar
  52. SHAR_EOF
  53. $TOUCH -am 1114140890 Makefile &&
  54. chmod 0666 Makefile ||
  55. echo "restore of Makefile failed"
  56. set `wc -c Makefile`;Wc_c=$1
  57. if test "$Wc_c" != "364"; then
  58.     echo original size 364, current size $Wc_c
  59. fi
  60. # ============= README ==============
  61. echo "x - extracting README (Text)"
  62. sed 's/^X//' << 'SHAR_EOF' > README &&
  63. Xuntype1 - Adobe Type 1 Font Decryption
  64. X
  65. XChris B. Sears
  66. XDigital Equipment, WSE
  67. XMay 31, 1990
  68. X
  69. XThese utilities decrypt an Adobe Type 1 font and leave a raw PostScript
  70. file as
  71. Xa result.  Most of this procedure is documented in "Adobe Type 1 Font Format"
  72. Xavailable from Adobe Systems.
  73. X
  74. XConverting a Type 1 font program into the outlines is done in two phases.
  75. XIt assumes that you have a Macintosh, a Unix system and Display Postscript.
  76. XI haven't tried using NeWS, GhostScript or a LaserWriter, but they'd probably
  77. Xwork as well.  The PostScript that I use is pretty simple, but the
  78. Ximplementation limits of other systems may break this.
  79. X
  80. X1. Using un-adobe, which is in hqx format, convert the Type 1 font into
  81. X   a eexec encoded text file.  Un-adobe.hqx was snarfed off of SUMEX.
  82. X   I can't remember who wrote it but you can find that out when you run
  83. X   the program.
  84. X2. Using untype1, a shell script driver, convert the results into a list
  85. X   of simple PostScript programs.
  86. X
  87. XHere is a description of the files in this directory:
  88. X
  89. X    untype1: a shell script that uses eexec, chars and DPStest to take
  90. X        an ASCII PostScript PostScript file with an encrypted Adobe Type 1
  91. X        font and generate raw PostScript for the font
  92. X    Makefile: a make(1) description file for compiling exec.c and chars.c
  93. X    eexec.c: decrypts a font file encrypted for the eexec operator
  94. X    chars.c: decrypts a font file of encrypted CharStrings.  chars couldn't
  95. X        easily be written to accept standard input because it repositions
  96. X        itself with fseek() after a charstring has been decrypted.
  97. X    header.ps: a PostScript wrapper that removes font hints, squashes
  98. X        procedures and transforms operators and operands
  99. X    trailer.ps: a PostScript wrapper to send the filtered PostScript to the
  100. X        standard output
  101. X    un-adobe.hqx: a Macintosh application that converts an Adobe PostScript
  102. X        font into an ASCII file for transfer to a UNIX system
  103. X    view_pre.ps and view_post.ps:  After converting a Type-1 file, these
  104. X        files can be used for viewing the results with Display PostScript.
  105. X
  106. XTo decrypt a Type 1 font first transform the Adobe font file into a text file
  107. Xon a Macintosh.  This can be done with the Macintosh program in unadobe.hqx
  108. Xwritten by Jerry Keough and Ted Ede at Mitre Corporation.  Next transfer the
  109. Xencrypted PostScript file from the Macintosh to your UNIX system with a file
  110. Xtransfer utility like NCSA Telnet or Kermit.  Be sure to transfer this file
  111. Xin text mode and *not* binary mode).  Once the font file is on your UNIX
  112. Xsystem, you can perform the decryption with the shell script untype1.
  113. X
  114. Xuntype1 is basically three pass: it runs eexec and chars, wraps the output
  115. Xwith header.ps and trailer.ps and then runs it through Display PostScript.
  116. XTo interact with Display PostScript we use dpstest(1X) found in
  117. X/usr/examples/dps/dpstest in the Ultrix release.  The result is a very simple
  118. XPostScript file containing only:
  119. X
  120. X    /characterName
  121. X    closepath
  122. X    curveto
  123. X    lineto
  124. X    moveto
  125. X    def
  126. X    { }
  127. X
  128. Xview_pre.ps and view_post.ps are useful for displaying the font using
  129. XDisplay PostScript. Concatenate view_pre.ps, the font file and
  130. Xview_post.ps together.  The results can be viewed with DPS.
  131. X
  132. XNovember 9, 1990
  133. X
  134. XStoneSerif used " |- " rather than " RD " to read the encrypted charstrings.
  135. XI Added some notes to this document.
  136. XThere is a bug with seac where the x origin of accented characters is wrong.
  137. XRenamed the shell script transform to untype1.
  138. XThe header.ps and trailer.ps files were substantially revised to use the
  139. Xpathforall operator.  This resulted in much simple code and the resulting
  140. XPostScript output was much simpler still.  Used bind def.  Save those cycles.
  141. XYou may want to use flattenpath as well.
  142. SHAR_EOF
  143. $TOUCH -am 1114180290 README &&
  144. chmod 0644 README ||
  145. echo "restore of README failed"
  146. set `wc -c README`;Wc_c=$1
  147. if test "$Wc_c" != "3658"; then
  148.     echo original size 3658, current size $Wc_c
  149. fi
  150. # ============= chars.c ==============
  151. echo "x - extracting chars.c (Text)"
  152. sed 's/^X//' << 'SHAR_EOF' > chars.c &&
  153. X/*
  154. X * chars.c -- decrypt an Adobe font file of encrypted CharStrings
  155. X *
  156. X * Chris B. Sears
  157. X */
  158. X#include <stdio.h>
  159. X#include <strings.h>
  160. X
  161. X#define TRUE            1
  162. X#define FALSE            0
  163. X
  164. Xint lenIV = 4;            /* CharString salt length */
  165. X
  166. Xtypedef struct {
  167. X    char *command;
  168. X    int value;
  169. X} Command;
  170. X
  171. XCommand commands[] = {
  172. X    { "notdefined_c0",    0 },
  173. X    { "hstem",            1 },
  174. X    { "notdefined_c2",    2 },
  175. X    { "vstem",            3 },
  176. X    { "vmoveto",        4 },
  177. X    { "chars_rlineto",    5 },
  178. X    { "hlineto",        6 },
  179. X    { "vlineto",        7 },
  180. X    { "rrcurveto",        8 },
  181. X    { "chars_closepath",9 },
  182. X    { "callsubr",        10 },
  183. X    { "return",            11 },
  184. X    { "escape",            12 },
  185. X    { "hsbw",            13 },
  186. X    { "endchar",        14 },
  187. X    { "notdefined_c15",    15 },
  188. X    { "notdefined_c16",    16 },
  189. X    { "notdefined_c17",    17 },
  190. X    { "notdefined_c18",    18 },
  191. X    { "notdefined_c19",    19 },
  192. X    { "notdefined_c20",    20 },
  193. X    { "chars_rmoveto",    21 },
  194. X    { "hmoveto",        22 },
  195. X    { "notdefined_c23",    23 },
  196. X    { "notdefined_c24",    24 },
  197. X    { "notdefined_c25",    25 },
  198. X    { "notdefined_c26",    26 },
  199. X    { "notdefined_c27",    27 },
  200. X    { "notdefined_c28",    28 },
  201. X    { "notdefined_c29",    29 },
  202. X    { "vhcurveto",        30 },
  203. X    { "hvcurveto",        31 }
  204. X};
  205. X
  206. XCommand escapes[] = {
  207. X    { "dotsection",        0 },
  208. X    { "vstem3",            1 },
  209. X    { "hstem3",            2 },
  210. X    { "notdefined_e3",    3 },
  211. X    { "notdefined_e4",    4 },
  212. X    { "notdefined_e5",    5 },
  213. X    { "seac",            6 },
  214. X    { "sbw",            7 },
  215. X    { "notdefined_e8",    8 },
  216. X    { "notdefined_e9",    9 },
  217. X    { "notdefined_e10",    10 },
  218. X    { "notdefined_e11",    11 },
  219. X    { "chars_div",        12 },
  220. X    { "notdefined_e13",    13 },
  221. X    { "notdefined_e14",    14 },
  222. X    { "notdefined_e15",    15 },
  223. X    { "callothersubr",    16 },
  224. X    { "chars_pop",        17 },
  225. X    { "notdefined_e18",    18 },
  226. X    { "notdefined_e19",    19 },
  227. X    { "notdefined_e20",    20 },
  228. X    { "notdefined_e21",    21 },
  229. X    { "notdefined_e22",    22 },
  230. X    { "notdefined_e23",    23 },
  231. X    { "notdefined_e24",    24 },
  232. X    { "notdefined_e25",    25 },
  233. X    { "notdefined_e26",    26 },
  234. X    { "notdefined_e27",    27 },
  235. X    { "notdefined_e28",    28 },
  236. X    { "notdefined_e29",    29 },
  237. X    { "notdefined_e30",    30 },
  238. X    { "notdefined_e31",    31 },
  239. X    { "notdefined_e32",    32 },
  240. X    { "setcurrentpoint",33 }
  241. X};
  242. X
  243. X#define MAX_ESCAPE        33
  244. X
  245. X#define CR                4330
  246. X#define CC1                52845
  247. X#define CC2                22719
  248. X
  249. Xunsigned short int cr, cc1, cc2;
  250. X
  251. Xunsigned char
  252. XDeCrypt(cipher)
  253. X    unsigned char cipher;
  254. X{
  255. X    unsigned char plain;
  256. X
  257. X    plain = (cipher ^ (cr >> 8));
  258. X    cr = (cipher + cr) * cc1 + cc2;
  259. X
  260. X    return plain;
  261. X}
  262. X
  263. Xvoid
  264. Xmain(argc, argv)
  265. X    int argc;
  266. X    char **argv;
  267. X{
  268. X    FILE *in, *out;
  269. X    unsigned char in_buff[BUFSIZ], byte, *rd_pos, *count_pos;
  270. X    int in_size, line_pos, i, count;
  271. X    long value;
  272. X
  273. X    if (argc != 3) {
  274. X        fprintf(stderr, "Usage: %s input output\n", argv[0]);
  275. X        exit(0);
  276. X    }
  277. X
  278. X    if ((in = fopen(argv[1], "r")) == NULL) {
  279. X        fprintf(stderr, "%s: can't open %s\n", argv[0], argv[1]);
  280. X        exit(0);
  281. X    }
  282. X
  283. X    out = fopen(argv[2], "w");
  284. X
  285. X    setbuf(out, NULL);
  286. X
  287. X    /*
  288. X     * TODO: rewrite this so as not to use a seek and to use stdin.
  289. X     */
  290. X    for (;;) {
  291. X        line_pos = ftell(in);
  292. X
  293. X        if (fgets(in_buff, BUFSIZ, in) == NULL)
  294. X            break;
  295. X        in_size = strlen(in_buff) - 1;
  296. X
  297. X        if (strncmp("/lenIV", in_buff, 6) == 0)
  298. X            lenIV = atoi(in_buff + 7);
  299. X
  300. X        if ((rd_pos = (unsigned char *) strstr(in_buff, " RD ")) == NULL) {
  301. X            if ((rd_pos = (unsigned char *) strstr(in_buff, " -| ")) == NULL) {
  302. X                fputs(in_buff, out);
  303. X                continue;
  304. X            }
  305. X        }
  306. X
  307. X        /*
  308. X         * We found an encrypted CharString.
  309. X         * Back up and determine the number of encrypted characters.
  310. X         * These have the form: dup 105 9 RD 9bytesofdata noaccess put
  311. X         */
  312. X        for (count_pos = rd_pos - 1;
  313. X            (count_pos >= in_buff) && (*count_pos != ' ');
  314. X            count_pos--)
  315. X                ;
  316. X
  317. X        if (*count_pos == ' ')    /* This can be at the beginning of a line */
  318. X            count_pos++;
  319. X
  320. X        /*
  321. X         * Write out the beginning of the string without the RD stuff.
  322. X         */
  323. X        fwrite(in_buff, count_pos - in_buff, 1, out);
  324. X        fprintf(out, "{");
  325. X
  326. X        count = atoi(count_pos);
  327. X
  328. X        /*
  329. X         * Seek to and read the binary data.
  330. X         */
  331. X        fseek(in, line_pos + (rd_pos - in_buff) + 4, SEEK_SET);
  332. X        fread(in_buff, BUFSIZ, 1, in);
  333. X
  334. X        /*
  335. X         * We must restart the decryption machinery for each CharString.
  336. X         */
  337. X        cr = CR;
  338. X        cc1 = CC1;
  339. X        cc2 = CC2;
  340. X
  341. X        /*
  342. X         * Skip over the salt.
  343. X         */
  344. X        for (i = 0; i < lenIV; i++)
  345. X            byte = DeCrypt(in_buff[i]);
  346. X
  347. X        /*
  348. X         * Translate the buffer.
  349. X         */
  350. X        for (; i < count;) {
  351. X            byte = DeCrypt(in_buff[i++]);
  352. X            if (byte == 11) {            /* return */
  353. X                fprintf(out, " %s", commands[byte].command);
  354. X                break;
  355. X            } else if (byte == 12) {    /* escape */
  356. X                byte = DeCrypt(in_buff[i++]);
  357. X                if (byte > MAX_ESCAPE)
  358. X                    fprintf(out, " not_defined_e%d", byte);
  359. X                else
  360. X                    fprintf(out, " %s", escapes[byte].command);
  361. X                continue;
  362. X            } else if (byte < 32)
  363. X                fprintf(out, " %s", commands[byte].command);
  364. X
  365. X            if (byte >= 32) {
  366. X                if (byte <= 246)
  367. X                    fprintf(out, " %d", byte  - 139);
  368. X                else if ((byte >= 247) && (byte <= 250))
  369. X                    fprintf(out, " %d",
  370. X                        (byte  - 247) * 256 + DeCrypt(in_buff[i++]) + 108);
  371. X                else if ((byte >= 251) && (byte <= 254))
  372. X                    fprintf(out, " %d",
  373. X                        -(byte  - 251) * 256 - DeCrypt(in_buff[i++]) - 108);
  374. X                else if (byte == 255) {
  375. X                    value = DeCrypt(in_buff[i++]);
  376. X                    value <<= 8;
  377. X                    value += DeCrypt(in_buff[i++]);
  378. X                    value <<= 8;
  379. X                    value += DeCrypt(in_buff[i++]);
  380. X                    value <<= 8;
  381. X                    value += DeCrypt(in_buff[i++]);
  382. X                    fprintf(out, " %d", value);
  383. X                }
  384. X            }
  385. X        }
  386. X
  387. X        fprintf(out, " }");
  388. X
  389. X        /*
  390. X         * Seek just past the CharString bytes and continue.
  391. X         */
  392. X        fseek(in, line_pos + (rd_pos - in_buff) + 4 + i, SEEK_SET);
  393. X    }
  394. X
  395. X    fclose(in);
  396. X    fclose(out);
  397. X
  398. X    exit(0);
  399. X}
  400. SHAR_EOF
  401. $TOUCH -am 1109112490 chars.c &&
  402. chmod 0644 chars.c ||
  403. echo "restore of chars.c failed"
  404. set `wc -c chars.c`;Wc_c=$1
  405. if test "$Wc_c" != "5322"; then
  406.     echo original size 5322, current size $Wc_c
  407. fi
  408. # ============= eexec.c ==============
  409. echo "x - extracting eexec.c (Text)"
  410. sed 's/^X//' << 'SHAR_EOF' > eexec.c &&
  411. X/*
  412. X * eexec.c -- decrypt an Adobe font file encrypted for eexec
  413. X *
  414. X * Chris B. Sears
  415. X */
  416. X#include <stdio.h>
  417. X#include <strings.h>
  418. X
  419. X#define TRUE                1
  420. X#define FALSE                0
  421. X
  422. X#define EEXEC_SKIP_BYTES    4
  423. X
  424. Xunsigned short int er =        55665;
  425. Xunsigned short int ec1 =    52845;
  426. Xunsigned short int ec2 =    22719;
  427. X
  428. Xunsigned char
  429. XDeCrypt(ch1, ch2)
  430. X    unsigned char ch1, ch2;
  431. X{
  432. X    unsigned char plain, cipher;
  433. X
  434. X    /*
  435. X     * Decode hex.
  436. X     */
  437. X    if ('A' <= ch1 && ch1 <= 'F')
  438. X        ch1 -= 'A' - 10;
  439. X    else if ('a' <= ch1 && ch1 <= 'f')
  440. X        ch1 -= 'a' - 10;
  441. X    else
  442. X        ch1 -= '0';
  443. X
  444. X    if ('A' <= ch2 && ch2 <= 'F')
  445. X        ch2 -= 'A' - 10;
  446. X    else if ('a' <= ch2 && ch2 <= 'f')
  447. X        ch2 -= 'a' - 10;
  448. X    else
  449. X        ch2 -= '0';
  450. X
  451. X    /*
  452. X     * Decode cipher.
  453. X     */
  454. X    cipher = ch1 * 16 + ch2;
  455. X
  456. X    plain = (cipher ^ (er >> 8));
  457. X    er = (cipher + er) * ec1 + ec2;
  458. X
  459. X    return plain;
  460. X}
  461. X
  462. Xvoid
  463. Xmain(argc, argv)
  464. X    int argc;
  465. X    char **argv;
  466. X{
  467. X    FILE *in;
  468. X    char in_buff[BUFSIZ], out_buff[BUFSIZ];
  469. X    int i, o, in_size;
  470. X    int skip_salt = TRUE;
  471. X
  472. X    if (argc != 2) {
  473. X        fprintf(stderr, "Usage: %s input\n", argv[0]);
  474. X        exit(0);
  475. X    }
  476. X
  477. X    if ((in = fopen(argv[1], "r")) == NULL) {
  478. X        fprintf(stderr, "%s: can't open %s\n", argv[0], argv[1]);
  479. X        exit(0);
  480. X    }
  481. X
  482. X    /*
  483. X     * Just copy to output until we see an eexec.
  484. X     */
  485. X    while (fgets(in_buff, BUFSIZ, in) != NULL) {
  486. X        if (strcmp(in_buff, "currentfile eexec\n") == 0)
  487. X            break;
  488. X        fprintf(stdout, "%s", in_buff);
  489. X    }
  490. X
  491. X    for (;;) {
  492. X        if (fgets(in_buff, BUFSIZ, in) == NULL)
  493. X            break;
  494. X        in_size = strlen(in_buff) - 1;
  495. X
  496. X        /*
  497. X         * Decrypt a line of hex.
  498. X         */
  499. X        for (i = o = 0; i < in_size; i += 2)
  500. X            out_buff[o++] = DeCrypt(in_buff[i], in_buff[i + 1]);
  501. X
  502. X        /*
  503. X         * Skip the salt if this is the first cypher line.
  504. X         */
  505. X        if (skip_salt) {
  506. X            fwrite(out_buff + EEXEC_SKIP_BYTES, o - EEXEC_SKIP_BYTES, 1, stdout);
  507. X            skip_salt = FALSE;
  508. X        } else
  509. X            fwrite(out_buff, o, 1, stdout);
  510. X    }
  511. X
  512. X    fclose(in);
  513. X
  514. X    exit(0);
  515. X}
  516. SHAR_EOF
  517. $TOUCH -am 0601103390 eexec.c &&
  518. chmod 0666 eexec.c ||
  519. echo "restore of eexec.c failed"
  520. set `wc -c eexec.c`;Wc_c=$1
  521. if test "$Wc_c" != "1829"; then
  522.     echo original size 1829, current size $Wc_c
  523. fi
  524. # ============= header.ps ==============
  525. echo "x - extracting header.ps (Text)"
  526. sed 's/^X//' << 'SHAR_EOF' > header.ps &&
  527. X%!
  528. X%
  529. X% header.ps
  530. X%
  531. X% After interpreting a decrypted Adobe font program there are four
  532. dictionaries.
  533. X%
  534. X%        font (implicit)
  535. X%        FontInfo
  536. X%        Private
  537. X%        CharStrings
  538. X%
  539. X% The strategy is to redefine certain operators, interpret the font and dump
  540. X% the resulting dictionaries while filtering out font hint operators.
  541. X% The resulting paths are converted into very simple PostScript using
  542. X% the pathforall operator.
  543. X%
  544. X
  545. X/readonly { } bind def
  546. X/executeonly { } bind def
  547. X/noaccess { } bind def
  548. X/definefont { } bind def
  549. X
  550. X/clearStack {
  551. X    cleartomark mark
  552. X} bind def
  553. X
  554. X%
  555. X% commands for starting and finishing
  556. X%
  557. X/endchar { clearStack } bind def
  558. X
  559. X/seac {
  560. X    /achar exch def
  561. X    /bchar exch def
  562. X    /ady exch def
  563. X    /adx exch def
  564. X    /asb exch def
  565. X
  566. X    /xOrigin adx def /yOrigin ady def
  567. X    mark Encoding achar get load exec pop clearStack
  568. X    /xOrigin 0 def /yOrigin 0 def
  569. X    mark Encoding bchar get load exec pop
  570. X} bind def
  571. X
  572. X/hsbw {
  573. X    pop /xOrigin exch xOrigin add def
  574. X    xOrigin yOrigin moveto clearStack
  575. X} bind def
  576. X
  577. X/sbw {
  578. X    pop pop /yOrigin exch yOrigin add def
  579. X    /xOrigin exch xOrigin add def
  580. X    xOrigin yOrigin moveto clearStack
  581. X} bind def
  582. X
  583. X%
  584. X% path construction commands
  585. X%
  586. X% convert the operators and operands to rmoveto, rlineto and rcurveto.
  587. X% chars_closepath has different semantics from PostScript closepath.
  588. X%
  589. X/chars_closepath {
  590. X    currentpoint closepath moveto clearStack
  591. X} bind def
  592. X
  593. X/hlineto { 0 rlineto clearStack } bind def
  594. X/hmoveto { 0 rmoveto clearStack } bind def
  595. X/chars_rlineto { rlineto clearStack } bind def
  596. X/chars_rmoveto { rmoveto clearStack } bind def
  597. X/vlineto { 0 exch rlineto clearStack } bind def
  598. X/vmoveto { 0 exch rmoveto clearStack } bind def
  599. X
  600. X/hvcurveto {
  601. X    /dy3 exch def /dy2 exch def /dx2 exch def /dx1 exch def
  602. X    dx1 0 dx2 dy2 0 dy3 rrcurveto
  603. X} bind def
  604. X
  605. X/vhcurveto {
  606. X    /dx3 exch def /dy2 exch def /dx2 exch def /dy1 exch def
  607. X    0 dy1 dx2 dy2 dx3 0 rrcurveto
  608. X} bind def
  609. X
  610. X/rrcurveto {
  611. X    /dy3 exch def /dx3 exch def
  612. X    /dy2 exch def /dx2 exch def
  613. X    /dy1 exch def /dx1 exch def
  614. X    dx1 dy1
  615. X    dx1 dx2 add dy1 dy2 add
  616. X    dx1 dx2 dx3 add add dy1 dy2 dy3 add add
  617. X    rcurveto clearStack
  618. X} bind def
  619. X
  620. X%
  621. X% hint commands
  622. X%
  623. X/dotsection { clearStack } bind def
  624. X/hstem { clearStack } bind def
  625. X/hstem3 { clearStack } bind def
  626. X/vstem { clearStack } bind def
  627. X/vstem3 { clearStack } bind def
  628. X
  629. X%
  630. X% Arithmetic command
  631. X%
  632. X/chars_div { div } bind def
  633. X
  634. X%
  635. X% Subroutine commands
  636. X% All OtherSubr routines are hint related
  637. X% For 0, 1, 2 the stack contents are left unchanged.
  638. X% For 3, the trailing pop will push a 3 on the stack.
  639. X% See p. 95 of the Black Book.
  640. X%
  641. X/callothersubr {
  642. X} bind def
  643. X
  644. X/callsubr {
  645. X    /i exch def
  646. X    i 0 eq {
  647. X%        pop pop pop        % Flex height control parameter and end points
  648. X        /yEnd exch def /xEnd exch def pop
  649. X
  650. X        /y5 exch def /x5 exch def
  651. X        /y4 exch def /x4 exch def
  652. X        /y3 exch def /x3 exch def
  653. X        /y2 exch def /x2 exch def
  654. X        /y1 exch def /x1 exch def
  655. X        /y0 exch def /x0 exch def
  656. X        /yRef exch def /xRef exch def
  657. X
  658. X        x0 xRef add y0 yRef add x1 y1 x2 y2 rrcurveto
  659. X        x3 y3 x4 y4 x5 y5 rrcurveto
  660. X
  661. X%
  662. X% The Flex can be replaced by a lineto.
  663. X%
  664. X
  665. X        /chars_rmoveto { rmoveto clearStack } def
  666. X    } if
  667. X    i 1 eq {
  668. X        /chars_rmoveto { } def
  669. X    } if
  670. X    i 2 eq { } if        % leave the arguments on the stack
  671. X    i 3 eq { } if
  672. X    i 3 gt {            % normal subroutines
  673. X        Subrs i get exec
  674. X    } if
  675. X} bind def
  676. X
  677. X/return { } bind def
  678. X/chars_pop { 3 } bind def    % transfers from PS stack to BuildChar stack
  679. X
  680. X%
  681. X% setcurrentpoint shouldn't appear in a charstring program
  682. X%
  683. SHAR_EOF
  684. $TOUCH -am 1114112390 header.ps &&
  685. chmod 0644 header.ps ||
  686. echo "restore of header.ps failed"
  687. set `wc -c header.ps`;Wc_c=$1
  688. if test "$Wc_c" != "3369"; then
  689.     echo original size 3369, current size $Wc_c
  690. fi
  691. # ============= trailer.ps ==============
  692. echo "x - extracting trailer.ps (Text)"
  693. sed 's/^X//' << 'SHAR_EOF' > trailer.ps &&
  694. X%!
  695. X%
  696. X% trailer.ps
  697. X%
  698. X
  699. X/Helvetica findfont 20 scalefont setfont
  700. X/myString 20 string def
  701. X/numString 20 string def
  702. X
  703. X%
  704. X% All of the numbers being passed in are real equivalents of integers.
  705. X% Convert them back into ints before printing so that print doesn't
  706. X% append a ".0"
  707. X%
  708. X/printNumbers {
  709. X    /ii exch def
  710. X    ii 1 sub -1 0 { index cvi numString cvs print ( ) print } for
  711. X    ii { pop } repeat
  712. X} def
  713. X
  714. X%
  715. X% Traverse the dictionaries and arrays.
  716. X%
  717. Xbegin
  718. XPrivate begin
  719. XCharStrings begin
  720. X100 dict begin
  721. X
  722. X100 100 moveto
  723. X
  724. XCharStrings {        % name procedure
  725. X    gsave
  726. X        /xOrigin 0 def
  727. X        /yOrigin 0 def
  728. X        (/) print exch myString cvs print ( { ) print
  729. X        mark exch
  730. X        gsave newpath exec cleartomark
  731. X            { 2 printNumbers (moveto ) print }
  732. X            { 2 printNumbers (lineto ) print }
  733. X            { 6 printNumbers (curveto ) print }
  734. X            { (closepath ) print } pathforall
  735. X        grestore
  736. X        ( } def\n) print
  737. X    grestore
  738. X    0 40 rmoveto
  739. X} forall
  740. X
  741. Xshowpage
  742. SHAR_EOF
  743. $TOUCH -am 1114105990 trailer.ps &&
  744. chmod 0644 trailer.ps ||
  745. echo "restore of trailer.ps failed"
  746. set `wc -c trailer.ps`;Wc_c=$1
  747. if test "$Wc_c" != "895"; then
  748.     echo original size 895, current size $Wc_c
  749. fi
  750. # ============= untype1 ==============
  751. echo "x - extracting untype1 (Text)"
  752. sed 's/^X//' << 'SHAR_EOF' > untype1 &&
  753. X#!/bin/sh
  754. X#
  755. X# untype1 -- transform an Adobe Type 1 font file
  756. X#   encrypted with eexec and CharStrings into raw PostScript
  757. X#
  758. X
  759. XPROGRAM=`basename $0`
  760. XTMP1=/tmp/$$.tr1
  761. XTMP2=/tmp/$$.tr2
  762. XTMP3=/tmp/$$.tr3
  763. XTMP4=/tmp/$$.tr4
  764. XTMP5=/tmp/$$.tr5
  765. X
  766. Xtrap 'rm -f /tmp/$$.tr?; exit 0' 0 1 2 15
  767. X
  768. Xcase $# in
  769. X2) ;;
  770. X*) echo "Usage: $PROGRAM \"Adobe Type 1 font file\" \"output file\""
  771. X   exit 1;;
  772. Xesac
  773. X
  774. Xeexec $1 > $TMP1
  775. Xchars $TMP1 $TMP2
  776. Xsed -e '/definefont/,$d' $TMP2 > $TMP3
  777. Xcat header.ps $TMP3 trailer.ps > $TMP4
  778. XDPS > $2 <<end-of-here
  779. X#$TMP4
  780. Xend-of-here
  781. SHAR_EOF
  782. $TOUCH -am 1113130990 untype1 &&
  783. chmod 0755 untype1 ||
  784. echo "restore of untype1 failed"
  785. set `wc -c untype1`;Wc_c=$1
  786. if test "$Wc_c" != "535"; then
  787.     echo original size 535, current size $Wc_c
  788. fi
  789. # ============= un-adobe.hqx ==============
  790. echo "x - extracting un-adobe.hqx (Text)"
  791. sed 's/^X//' << 'SHAR_EOF' > un-adobe.hqx &&
  792. XDate: Tue, 13 Mar 90 23:59:57 -0800
  793. XFrom: C43MRP%AVIARY.gm@hac2arpa.hac.com
  794. XSubject: unAdobe.hqx
  795. X
  796. XunAdobe is an application that converts an Adobe type 1 font into printable
  797. XASCII characters that can be edited into a postscript document.  Written by
  798. XJerry Keough and Ted Ede of the Mitre Corp.
  799. X
  800. XEnjoy!
  801. X
  802. XMark Probert
  803. XDelco Electronics
  804. X
  805. X(This file must be converted with BinHex 4.0)
  806. X
  807. X:#h9Z3@4[BQ8ZFfPd!&0*9#&6593K!3!!!"Ld!!!!!2rl8dP8)3!"!!!BY(*-BA8
  808. X"!!!!!!!!!!)!"h9Z3@4[BQ8Y6'pRT3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  809. X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%&38%a+5e4&)3#IZ*E*RlL@c!!!(Hi
  810. X!!!!!!!!B,J!!!!#eC`!!!!!!!!!!)T!!!!!%#!LJ!j+!(!i'0%83`)i"p`"!)4#
  811. X%J)%KBGb-+F1QB8%#*J#d+%!!dB%kES+3!(NMTS`!JN'J3''LC!Q9)L!#!J)!T#%
  812. X$3J&McUaj-bH!R6dp+QeBJFdRA*D5+HhJEJF"D!#D@%55KJbC-QimMKS)S&D!L4F
  813. XcEZcBm!3!G!i$E0RTN3KC+fF*&#LLTX`B1NUlN!"pNlF!%6PTl*44kTB"J&`!c#e
  814. Xe@qia!(Y,q3$J"k"2!#Td!fC!!`#"3#G@rU&c%SFeL,!-)%!!)j!!"Zd!6N#i+&d
  815. X&8!XJrpK9HI+M"6mK50`%e`f!!HJA!*cSNU"PaaGq4QkE%0+QRaAQcRhhC-!F3Hr
  816. XITE-mHE%E!4`"d+8c`#5pJTd@Ae5c9bhGJUrpUqPLJ4$X0IHDIK!8L)"d#1LJi([
  817. XakF+!'2L9GL!k,8$4R"+ZP2C'3'$!!F9[`BN)5iF)I&KD#f%K%0a`a4fAA(!&-L"
  818. XG",TBKaf-aL(A"Mp+"0%12dL!J)!8J%3BJ5Fk'L%L0"dbJ"i$F-!#jBSp)3#'*J$
  819. X@4dZAZP$J$'d!%,'"CJ(`8`5C1X6S)cp3a1L%G!CSFkC!DT)*!K+!-0#6!@4B!!d
  820. X3-1`!J!&1l!1!!2l`iJm`rU$cMc,r8$1T%ek!m!886cJ"$@Vq1-1DDbd1iBirm-$
  821. XaJ`MB4)(-2rcmX"X$U#L5(!!2*1F20$r`F*SZ$[M4J4[q["-U(!"!i%+S2`#!#L,
  822. X$k3S2+Sc!`%-!N!"!mJ85`!6#Q3$0bTSX+T0)L`SKQ'Vka$X!+1!TU++f&XGVTCQ
  823. X+UUUXZJUVZ,6D'PDZa2,U+fl!8M"XXFFQZk`cc6iV,J6L5N#ZZHKQqX@kcEfEQML
  824. XMaY'$CNDSpM%!-[bMcXF"L"!FbX,miijk3T`b)cT)k$'!"am-h#X!!m$a$h4#R""
  825. Xc+K2Jp`mjqj'$bK`lSp#"CJ2m)`kbbNSGVUmBe#`!0p,jSmh14M`YN!$89,YJ03!
  826. Xl-k#e*&hcXR-9BJG!YX*Rlkb!eR2UiSmR1mmKK0P6dbh1eFeTMDMHJZ`Xb0pc9cd
  827. XifVkUV8F!`(4YaXkEa0dii)4,(S!QA51ambZ-"qiii3R8(!!5AE1`FbkPPefhVkR
  828. XV!3$AHN2XDc0JDfikjj!!!e!l!+adMFA1[2[+51b#Selc89hMJ2c1d[JZqq-l$jq
  829. Xh2aC-Ikd)c*mHr2!L50H22F1P3JF%(bJ38!"+!("'3!5!i8l5U9#!U40e,2"%(A5
  830. X!!`""B)BdX+%-$TL#AplJ"M+!J!aT#!-EhR!'(9K!!8P`J`$T3%!$PX%#$6"#'Z3
  831. X`"`j#8))8e-%6U)#'-S#J#8QJJK4`-S3hb!%10J`$(G,!3"#%B3jcU%-EA1L'0i"
  832. X!$Q@B!`lG-)FdL-'!DD"$(JKS3a$3SB8JU--FA2J'-eJ4$@QBJ`rK!!FfT'%-1Z5
  833. XK'ea!!aD'FBaP2'-DHrM')R,3$&@FJ`6,`!)#PS%M"%5L#qPJa$'m!3jjF)%&$U!
  834. X#%)#JNBp%`42G%!Bj6"'2FQL$$N'3!!Bh%0+(EJ""%+B`K#3NJBUCh'3"$kK)&EK
  835. X4M'%JSaR4Z--HSJ31B4M$'Q"*48pb-T4"%!0,bR##19L!"&G!$"hS!"B3L''+5LL
  836. X$(#`*JL@8i3ee1!-D31P!+T6"J8Ai5LYVL%M%D*1$U3""$(+!!a`iFiSXG#%-C8K
  837. X$'q*3$R0Fi`94ST*KZZ#I&J#!"))QR3)S!cArJ)Gd$Z!$)IP$"#p!!#VFJ!TrT%)
  838. X#UB""+TJaY$fJ!JT`#-!+J!#N(@LQ!855$Mm)JB3I3D'Pr-ME!-LJ"10!BAi!S%@
  839. XdA#URR38J&F4S%J2Dm!pB'3'RKS$T5hmN"1N%!!0#-%i46"S!H[5$#M"S`9@P!)3
  840. XG!1'UkRN"$cJe"5S8jkUT!-8+[Y!2+#LK&@h&+3eHS&8Sh)J#G'fVG##!#4"d"`S
  841. X[J%"BkbUG"rK#1[P!4PlYUJX)''+aU4M&@pYk"@!3i5K5MGmC01%QTmT"U6$0Q`"
  842. XF3CYrX-i,G,)!U%64XC&"`@8MZ`'0c-D1jl&"9k+J&`-LqMbcqNS!dP'!(l$`"0c
  843. X'E%DXRBiNULB+p`P%X`%K$fb%-"Z%k(CRTP81+b)UR36BJPi)J)%VrS'+G'fU8p"
  844. X!J![iZC+@"&3#U1N(1cUQ@hZPDP@YHP@XI*9G9#@R(`V943)qk`B!rpFGd[Q(%C6
  845. XJ!J#E)5!')"-MSP9JH-LU(qi!,hFPT)FHX*8G5LJ`1ajm+$+KJ3(+UBCm58`##J2
  846. Xi`[IM!9'+)0DEB)%+mK'!Kq9,*JkJq"r2@(&!*$!Fm2i!![+Kaij",')5Dm$&&Qj
  847. X`KPZdB3BJB-RQjC6'60Ba',9R4[19%!JmE$)[PfBrB@D!(mLX$M-[5%+5B,0jUB"
  848. XH8*'$[Q&4J(haP9pB84K9iN+!VX+m!%Kif"rZm,)rDNZX!$'!!)GqfAU@&D!'#!)
  849. XrrN$DXZi-,'@`*p25FB!6&-hS5,dQdi%0lT@rJ'K5bmF!N6Dc!h5&MP-M$FN#0NH
  850. XN2meT"dL!ep*T!!ZbA'FV"!3*ji#!)m-#!4(!TMa&d!F!@#!"$0KJB1R)!!8#)!!
  851. XKi%S#mXK*&*Ea$hP-!4"Q-!F6[N'!"9RX'jb*VUGJ%!-Cc)!'0E$"$A#3!)-J#'%
  852. X)4#L#%4$+0RQj&VDDN5dl@X!(*PaKi2q3!!5DR`H&Q2Pd4T)iVR+5#`%&-0Hjm*0
  853. XIG(9,h4jIPlmcfZkE$q!"m)UA[-6fP%!0!!4m!#%9b3""FFq"!3#B`!%S3%!B$,"
  854. XZ!'#!IbpB!!PDm!pCQ!%NAq$IGQia$$%3i"E%%)-"5,!#%+R$U8K33YF0F!B)"%%
  855. XI!B!$$&BKd,-(!!a1*3$A!b)G!("!#B)!!c'J!i)&!!-A!p$!#BJULi#-Y1NJq!$
  856. X58lB!B3"H!d0S"q)M8(CB"1)-""!"%-"!$a!!3353!"#"iZYJ,AVB!1GK8-!CJ%Y
  857. Xk(Y$M"MK(0K!!!3+Qbk,X)QMmiber"JGi(J33-)-peXeYC2'2q!))+G)4X+jr1%-
  858. X)VfM1#`ibd!m0k%-D#-)k!'#"kGYGjk!!`!dqe(-#B%`'QP)#%-kJ!6rpSaT29hi
  859. XGh*q1"rY$(Q)(!18"i!pe',m1%G9mcaGpZd9p3Q"p"`J!'J"qc-FZk2F&kRF'$1"
  860. Xqd'"rZL"rraH!lq"md#Gp"SL!f!Gq#A"qkEGq#&"6rk!+mq-2KX!rq4F"CL!#!YL
  861. X"$2!$D`!!"'"di"F!jaH"*mKd+XKrA-!r#F!%8`!&hY3'b)+$-H!#-K!%!$!&4!8
  862. X1*V8Srq!0h2%2f#!%VG"d@DJ+*J8$-!"cZX!6GBF&G3F+6L9UZK!!%X!#6@!#%2J
  863. X"Cd!#GJ!!0Y!#!!!#iE!%,I93%e94&j94'p941KF*``!+,H"8j6-0BA"8#V!'%'"
  864. X5rj!!$rp32(9!LIG`LIb6KCJB"LT3GQ[!!CVi$kj!LIM`$l$!2j4SLDI)"rqJ$kV
  865. XBL86P#PQiLR8!!6JJ!!GJ"KDJL`)3#@T!!2rh%VJb"3"J"[6J-r`MIdI3$[S!!N,
  866. X3G3H!!0Xh%!G`!CVa%K%!"G[R!&'`I3EJMFd4MJ$3!%,!GJK`!pX)!"5JMHHB,1C
  867. XM#Xpi$ri`M3"3MGXA%0Q)*[T(MZ!SMZE)!1D)MZV)MS[LM[$B!2+S#rhJ"[`6!jc
  868. X4!!UJ"*hBKD6!2e!JHDT3HdeR"JV!K8dA"4bC#[4J!N$30@L3!(pNChEki!q3!,"
  869. XfEIH5J0!e*!!#A3F!B#!05V#,MU!'MB3(!3!$3i!2!8!"4J)*N8!($!!,J["")K!
  870. X&)B!-4bN#J#!%%5!#H#!!UL!#L!!#JK!0UC!!-A8!#Q2!2`63K%m)!-J'$-!!!Y"
  871. X"!4"PG#r`)4$JMQ%`Dq`b%"L`EJ-`!-6&2mJ'!`"!!Q`T"-83$#D`1N0`$-"J$FJ
  872. Xa"2mQ$)mC##!`!%9R)hA3PX!`Pa4`"N)!Ph4TPhMT)&$BPpr`Pi'jQHIJPTjj"Si
  873. X%(4J3"KkJ")!`M0!3IAM9%aK3PmRLMRi*Q*e5"mJ5#-#!E$i!!#S!!'SJ!%3!##`
  874. X3!-e*")&JQ)XT"&FC#(M`!H-J#H-!#H13!!L`-!KY3!#3!$!)8K!)8d!%E1!15P!
  875. X)d`N)Zf!)daN)4FF(D+Q@8"K4I2FK9,+(EaQJ)##J"*TiQZ)#Rb#BV8PlGSNX!rU
  876. XJ"9UJGJN$F5N((f!15#!*K"+A!Y!6"a!!m(#Aa$F!,h!&Km)&`iPXm-#J4ZHJ%3U
  877. XK-%TqG2!"&'Th'%S*3'#K0HS"'+UK-#!!B$#1m"!3A!8,3I!'pV#M(CU2G[!2iE!
  878. X#a`!$G`N("b!$d-%"!J#&"`!*3G#Ni!#P-*!!%m6h!#9D'PV'QZ$!SK5JSp#K!6d
  879. X+"-J#"LG)Q-N)"88D"'f`M!F`9`VBEIN)#8*!"rm!$LTJ"!)!!9)+!-!J!'B!!fa
  880. XUG'm+!fpR!%T!TfE!!9cP*`$`!@mJ$c@+!8Yk!))D$S9kU)QkU-4h!%"`$Vlj%JT
  881. X!"0p`TQh*SSKDS4HDS4[UMU(UQiiK!8-TSYm3!!1!SJVUPL$`)A**IR*`!##3!!'
  882. X"J!P4N!!-X4LFCBS!XYUDEiQX)U#Xc*S"`3#YdUS2e'ULeTULf(UXlVLY4VHXc@S
  883. X%J2#YdIS2q$#ZCQUZi!!-RiUZ'U#Z(Z#E&!!!(M!SKA)SLC+3!)lK'!hK!3$J!P3
  884. Xk#iKJ"IVPP`H!-Hj#R!FJ!KK!!KNJ#))J#i)!XIpJ$f"J$P5+X4T,#)&!#i%!XL*
  885. XV$CaTTHk)VKBJ!NL!,#,3Q6KlXcUEXjf*I9-3"'IJ!A$`!9`U$NN3"%-+!$#3!!h
  886. XabJrdUJ!8bcm4N!!&Q`S'YA81pkUZ')#Z(1#[GNFe'%!$!T8"K8F'!V"Y8m!G#$!
  887. X,#'!&P-)2CL!!K5Ha82!)5+F!kSS!*1#I03S"BLX"'L!,!Q#ffbB"`J!'!L!"fK!
  888. X&E`X,!8!#Ak!Zl1)Zd$#Vk2TVrLP39!-"-!X"2cX&31!5A$ULA'#h!+J!k1SHbB)
  889. X"FJ!!kXS!J%%"'3!,h(&-5#!&Sm3G%$!,#Z#fX()'4i)%S!X'hY#kN!#V+CcL!i%
  890. X`Ep""!%2!,JBJ!`"3$NNJ$F%!!P%J!TH!E!!!$UdV"8J!"KT!!MVNMKSJ$B2,!*3
  891. X3!&13!(`!)!IrJ,J3X,K[UbrNX'i(N!!XJH!#5B#l)(!&RN)#02S"E1#q-[!"EX!
  892. X!4"!%Z-ZP"B`XFK!!QL)#9r!#!K#l%!!0`5!&3N!*39$!J%'lEb!!2bS"`)#i%Y"
  893. XR-98()dV"E3QRb3)"+D`[r#$!-%$!"Sc!#Xc!3H$!lK["QQ,"'1c"(2`''#$#*"b
  894. X-%)#M'M`%55Zr62Zfr*0i"i`%35!$r#8#NIXK""#l%3!"83`V@[brB%!!e-U@2!F
  895. X$H!!!9*-"''`$!!#CYR#N"'!$!B!(r`!"Jf$&3H)'!K$"2bX,"bJ!-L!!Z&X%m##
  896. XT4a#L!8!$#f!#5Q!*`%!*5d!%h'%!&6!#M!XVL(bAPX$!3f!,32!'"J$(L%X"6%Y
  897. XZr#!&4,"Z$("dG4!&`B#i8"!-#18-3H!1cKF#,E+(-F"X4ZGXc4%#89#B3N!D,#!
  898. X%U,#`5K!!6`F+3#S!S$!!2G!6%L$-$#!#bi`#Q+,&m%B3lK)0#!8-ZI`2`-$,[bN
  899. X"[qb1h(I-GJF+"e$0h)I0-V$-&J!#++#dD5S1J!!-F1%$i`!)i3!)`S`!9YR0Ar$
  900. X0!5&UiT`Dj+c,j``E!J8+&#$2cGBLpFap#&fh6Y$3jPc1%GdZ!VA1TQ%"S&!"mLa
  901. XUAU$&TG[4i`c5*-epk1`q%J!+%j!!dJMGdKjYT,S-#qJX!5-0c!15caS!#LF)",l
  902. XScK`!#Z5"!%-!&b!J!Zj3'L)3*D$3!2+X@LZGd2%'!!apbqAX$1MX!%(G(1e-e%+
  903. X3!-mES-c[l,SB[F`B)-r`p@jG6EPJVF[1X-k1J3'J%0Fpi3!&VFd,Qp0fkp'iM0I
  904. XV60BBS0I6KXkQi3+J3!3@[G'&IGI1apKm(3%T(GM,c!'%lG+TFGLA,G%Bi0M[,!%
  905. Xi[G8kEGPjhFYm(3$bl#i@3`9fqbQT`G1U10CPl4K$VB"+cG4b(343AG$@NLbJi!)
  906. X)VG$Y!YUU@-iq(4CNVFi5hGXDm0X-m04lk(+q!J((lGaA,GI*AGI-,GTL$GflIGB
  907. X+D0T,[3$J[GA+(FkX2G0PAG*TVB#JN!!!UFh5K3d+`iCfR$$'A`!+!)afS4Hj6`!
  908. X+'H!0R#&UD#F)!+k)6S"fH!!+0K$K!8!(SD!"hNF!&Ui'$li"&Zi&,l#9$-(KD-F
  909. X&)mk91'MK8M$'(a!+)Z!#L'$K2[$J)f$K02$J*H!#YfN!3R!*&Ni#&Zi",UiTS#$
  910. XND#HANIX&S@!#-QlK"VhNSB!#6bjYqP$N!Ai#%3i!m1$LSH!"93i!j2$JLLGYf[$
  911. XJ)F$MDZ$M3#jY"b9Ya)$PS!!#@ki,!"i+5"$QVJ!+AGX6*Nim@K`+(5!##+!T),#
  912. Xr05PYNZ$LS-!%2,lPKX$S+5PYIX$S6E$PG2$J+l$P(VlNS*!!!PX1"JqZ!PYZ"3q
  913. XH"&[1"!pZNG)Q"!qq"&Z1!b-q!2R-iA8JHSRhi#iJ!N'`jA!TP+Eajal`!eZC%lB
  914. XqiN1jiY,fRbq3!!!aX+Kd6T`k1AbT#3#mG3iIi!-J%!&r&hKQB!"`-!NGMJ**J!$
  915. XrHJ"RB!$@mJq,B$mX)*3BB!*KiES4i(L"aqY4N!!))T!!!J&KlaVJ!J%3"BH!,0-
  916. X3$,1`$'43'dV!lr)$!@SJ%#SJ!QQ!Jp2J$%S3!6FB!%6q!##`PDSJ#F[-a[p!!Vk
  917. X#J`$JX@dJ%!C!!0i'#*)J#!J3#!(a#F(J#C`K!5U`(P"Bk&33"8M`!U4"%#"!!Gf
  918. XZiH2a!963N!!!i!e+)!&Q`!)LX*al'2#!!!Q(i%,!b`#K`3!I"!*8)!*+82!JF!#
  919. X6!!b4B08Z!!*-S&CJB!HD8AIQi&6FA)DJ%28"8AXi+#3#"IB&ArEF!!KRhac(V35
  920. X(J&0+!!)*!!Q+`(iL!!"4%!L5F281N!$e-KpGC8!!AJm'TP!#5F%%dD#d0ik$)f!
  921. X%!6%"QT%8c9jh,9L'b&"hRlFYR`m$B!#YL4!&8B,iLSpjR"m3**!!"#63$RI2"*(
  922. XJ$#5!$#LJ#"J3I4#!,0r!,JLJi!+eERb!$mmZ!0%qp'HJ!%A[H6jIaVN-!$QHc`$
  923. XJldSJrK+S"R**'J43m4Hr"JT!!NJ3$F%3#mY3"Yi3T,%!r!``"JT9"hL2!,$J%,3
  924. X"khF!)Sp!mAV4i"K%!Q$J#3$"5-&"MHqiUEfapm`fRIq$!Mk2!SJr+!!)3N"5L!$
  925. XH"J"%Jh-'K3$!0)J58maAd)9'acrSJ!6l!Mm!2L#!9U!1k-!!L($rJ"l3!H!LLp`
  926. X"(6"aUN(S%33kK3#-d@qkHfB)q*'k1&!!l)"2539*Db!8&Ap`&(K'&43!J1!4r!0
  927. X"-(X@"3Mi"9)$!Z`%!4$crS%j)!!l33%)J%rJ$bE!2pJ*L'm3q!-JN!!!GJ)J5!#
  928. Xr)"`)$d!J!!4!!MJ%p-!!e%%%S!$`S!bVJe%Y!A`#)1!(kZ"15!#G)#!N!%%J#@R
  929. X"!I!(#3!4&-(%&`(%33+BFhi3'!`"IH!)rH!ri"RjJ#l)MD,##PZK+hb&X$!@bX*
  930. XC5!YVS5fmKEL`&Vk2J2!2U1!Uj"Q!B!!!J[a&14c!!!J%i)!$()"K!!p`J!-i"lJ
  931. X!$RL!1m!"`)%2d!%1!"Mi!@8)+BaK-2!(4f!!$!0r-!B'`6(`"h&J'$`$I`!'aX%
  932. Xj*!*cB"`kJ((`$6r!-)!82f!3D--r-!#!J5r`!`-J((J$2R!!jS!c`!-1i!FB!MM
  933. X!!6l!!!!(cT!!FP#TS`!1K#(P@)8lSDJX"B+`K2j!8F%((P&HK853!2J44k**,)N
  934. XIN4@QST5)%N9L5b5*,M%Q`X5CH"*PBNfNL5pa*'l%T8!#CJa"#!"*B!JiJ4%J%(D
  935. XK3!J!!F!)c"$54aDD)P)N#'kJ$E#ABG*(RSRAqbBJ)*bi%"-!!U,*0*NLeJ5ED"0
  936. XmeJ6#3#GK!p"%QPL5&*!!pXK*(M!RD!#G["1[KdAQb3`"!6ANKZ53!&Ub4N3*'f!
  937. X$4b30R"-aJN5fL"a3$'4J0r!MSF!%P-)"X$&*Mb`8aB"J%"##3J!!$+%2!J%")!m
  938. X)!JI!M$KS#$b"J&-898"3()T&83JdP9C'%,5!6``)CN!T#TbLf,T@SGJL#!,!"KJ
  939. X#A[J2FN)'B![[iaF#J!`!#4D&$4!%8[!8+L"+d"#5Bd$B!*M!12S"h[JFJ8&c"!!
  940. XDdHj)Vp`i1B3M"qJ"$3&4I`!!:
  941. SHAR_EOF
  942. $TOUCH -am 0604153590 un-adobe.hqx &&
  943. chmod 0644 un-adobe.hqx ||
  944. echo "restore of un-adobe.hqx failed"
  945. set `wc -c un-adobe.hqx`;Wc_c=$1
  946. if test "$Wc_c" != "9054"; then
  947.     echo original size 9054, current size $Wc_c
  948. fi
  949. # ============= view_pre.ps ==============
  950. echo "x - extracting view_pre.ps (Text)"
  951. sed 's/^X//' << 'SHAR_EOF' > view_pre.ps &&
  952. X%!
  953. X300 dict dup /font_dict exch def begin
  954. SHAR_EOF
  955. $TOUCH -am 0612145690 view_pre.ps &&
  956. chmod 0644 view_pre.ps ||
  957. echo "restore of view_pre.ps failed"
  958. set `wc -c view_pre.ps`;Wc_c=$1
  959. if test "$Wc_c" != "42"; then
  960.     echo original size 42, current size $Wc_c
  961. fi
  962. # ============= view_post.ps ==============
  963. echo "x - extracting view_post.ps (Text)"
  964. sed 's/^X//' << 'SHAR_EOF' > view_post.ps &&
  965. Xend
  966. X
  967. X%
  968. X% The display order is strange because of the hashing of dictionary entries.
  969. X%
  970. X/myString 30 string def
  971. X/iChar 0 def
  972. X/Helvetica findfont 30 scalefont setfont
  973. X100 100 translate
  974. X
  975. Xfont_dict { % name procedure
  976. X    /proc exch def
  977. X    /name exch def
  978. X    gsave
  979. X        gsave
  980. X        erasepage
  981. X        0.3 0.3 scale
  982. X        gsave 0 0 moveto 0 1000 rlineto
  983. X        1000 0 rlineto 0 -1000 rlineto closepath stroke grestore
  984. X        proc stroke
  985. X        grestore
  986. X        name myString cvs gsave 0 -50 moveto show grestore
  987. X        gsave -50 -50 moveto iChar (    ) cvs show grestore
  988. X        /iChar iChar 1 add def
  989. X        usertime 800 add
  990. X        { dup usertime lt { pop exit } if } loop
  991. X    grestore
  992. X} forall
  993. SHAR_EOF
  994. $TOUCH -am 1113184090 view_post.ps &&
  995. chmod 0644 view_post.ps ||
  996. echo "restore of view_post.ps failed"
  997. set `wc -c view_post.ps`;Wc_c=$1
  998. if test "$Wc_c" != "618"; then
  999.     echo original size 618, current size $Wc_c
  1000. fi
  1001. exit 0
  1002.  
  1003.  
  1004.