home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #1 / NN_1993_1.iso / spool / comp / os / msdos / programm / 11971 < prev    next >
Encoding:
Internet Message Format  |  1993-01-11  |  27.2 KB

  1. Path: sparky!uunet!paladin.american.edu!howland.reston.ans.net!spool.mu.edu!uwm.edu!ogicse!news.u.washington.edu!serval!wsuaix.csc.wsu.edu!rnelson
  2. From: rnelson@wsuaix.csc.wsu.edu (roger nelson;S23487)
  3. Newsgroups: comp.os.msdos.programmer
  4. Subject: A foreign language translation Pascal unit
  5. Message-ID: <1993Jan11.034157.14452@serval.net.wsu.edu>
  6. Date: 11 Jan 93 03:41:57 GMT
  7. Article-I.D.: serval.1993Jan11.034157.14452
  8. Sender: news@serval.net.wsu.edu (USENET News System)
  9. Organization: Washington State University
  10. Lines: 693
  11.  
  12.  
  13. Here is the Turbo Pascal Unit for translating phrases to various languages.
  14. It can be used for both DOS and Windows.
  15.  
  16. A couple of weeks ago I asked if windows provided facilities for allowing
  17. an application to switch between one or more foreign languages
  18. and gave a brief outline of what I was planning on doing.
  19.  
  20. A number of people replied suggesting windows string tables, however
  21. this seemed to have a fair amount of overhead.
  22. Others suggested DLL or making resources files, but this didn't allow the
  23. user to change the language on the fly. 
  24.  
  25. Thanks to everyone who replied.
  26.  
  27. This unit allows the user to change the language on the fly and only stores the
  28. phrases used by the current program for the current language in main memory.
  29.  
  30. By editing the PHRASES.LNG file, users can also provide localizations
  31. for other languages (not supplied by the programmer) without having
  32. to recompile the application program.
  33.  
  34. I thought others might find this unit useful so I am posting the short
  35. program listing here.
  36.  
  37. I am also supplying a sample PHRASES.LNG file which has translations of
  38. several common user interface strings for ENGLISH, FRENCH, SPANISH and
  39. ITALIAN.  This file is UUENCODED because it uses IBM-PC 8-bit characters
  40. for accented characters in French,Spanish and Italian.
  41.  
  42. I hope that other programmers will provide multilingual support for their
  43. applications.
  44. _____________________________________________________________________
  45.       ______________
  46. ____  | ^          |    Roger Nelson          rnelson@wsuaix.csc.wsu.edu
  47. \^^ | | ^          |    Biological Systems Engineering Department
  48.  |^^//  ^^         |
  49.  |  '  ^          +|<---Washington State University
  50.  \_  ^    _________|    Pullman, WA 99164-6120
  51.    `-----'              Work: (509)335-4714  Home: (509)332-8387
  52.                         FAX: (509)335-2722
  53.  
  54. LANGUAG.PAS   
  55. ---Cut Here-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<---
  56.  
  57. UNIT languag;
  58. {
  59.    This TurboPascal unit will help provide translation of text strings
  60.    to different human languages.
  61.  
  62.    Written by Roger Nelson  Jan. 1993
  63.    Comments, suggestions, questions and bug reports can be sent to:
  64.  
  65.        Roger Nelson
  66.        Biological Systems Engr. Dept.
  67.        Washington State University
  68.        Pullman, WA 99164-6120
  69.  
  70.        rnelson@wsuaix.csc.wsu.edu
  71.  
  72.        Phone: (509)335-1578
  73.        FAX  : (509)335-2722
  74.  
  75.  
  76.    An equivelent module can also be provided for the programming languages:
  77.    C and scheme by request.
  78.    ________________________________________________________________________
  79.  
  80.    Phrases are stored in the phrases file: PHRASES.LNG
  81.    which must be placed in in the same directory as the application
  82.    program executables.
  83.    (The phrases.lng file must also be available to the compiler.)
  84.  
  85.    The phrases files has the following format which allows for the compiler
  86.    to double check the existance of a phrase so you can't inadvertantly
  87.    leave out a phrase from your translations!!!! 
  88.  
  89.  
  90.    phraseID,
  91.    ( programlist
  92.    ENGLISH English phrase
  93.    SPANISH Spanish phrase
  94.    ITALIAN Italian phrase
  95.    FRENCH French phrase
  96.       :
  97.       :
  98.    )
  99.    NextphrasesID,
  100.       :
  101.       :
  102.  
  103.    The phraseID must be a unique valid Pascal Identifier and must be
  104.    followed by a comma. The phraseID and comma must be on their own line.
  105.  
  106.    THE ( AND ) CHARACTERS ARE ACTUALLY PASCAL COMMENT CHARACTERS AND MUST
  107.    BE ON THEIR OWN LINES.
  108.  
  109.    After the first comment (on the same line) is a list of all programs in
  110.    which the phrase is used, only those phrases used by the program will
  111.    be loaded. This is useful if your application consists of several programs,
  112.    but where not all phrases are used in all the programs.
  113.  
  114.    Each translation must be on its own line, the name of the language
  115.    must be uppercase with consistent spelling and one word.
  116.  
  117.    There must be only one space or one tab character seperating the
  118.    language from the phrase.
  119.  
  120.    There must not be any blank lines between the ) and the next phrase ID.
  121.  
  122.    The very first phrases in PHRASES.LNG must be the translation for the
  123.    name of the language:
  124.  
  125.    L_LANGUAGE,
  126.    ( PROGRAM1 PROGRAM2
  127.    ENGLISH English phrase
  128.    FRENCH Francais phrase
  129.    SPANISH Espanol phrase
  130.    ITALIAN Italiano phrase
  131.    )
  132.    ^- Pascal comment characters!
  133.  
  134.    If the phrase is to be a null string or a single space, then use
  135.    an underscore character _,  Ie:  ENGLISH _
  136.  
  137.  
  138.  
  139. Tips for restarting a TurboVision application with a new application.
  140.  
  141.   You may want to allow the user to change the language within the
  142.   application.
  143.  
  144.   The easiest thing to do is shutdown and restart TurboVision.
  145.  
  146.   1. Create a boolean variable that will be used to test for the actual exit
  147.      of the application.
  148.  
  149.   2. Put a while loop using this variable as the test around the application
  150.      init, run and done procedures.
  151.  
  152.   3. Call the init_language function near the beginning of the program.
  153.      Call the end_language function near the end of the program.
  154.  
  155.   4. Usually object registration for TurboVision is done in the
  156.      application.init procedure.
  157.      Move these registrations to a point before the exit_application loop
  158.      otherwise TurboVision will complain about stream registration when
  159.      init gets call more than once.
  160.  
  161.   5. Provide menu options for changing the language.
  162.      This may be a user preferences dialog box or submenus etc...
  163.  
  164.   6. Provide an application event handler point for each language:
  165.  
  166.     I.e.
  167.  
  168.     cmLanguageDefault :
  169.       BEGIN
  170.          Load_language(getenv('LANGUAGE'),'MYAPP');
  171.          message(@self,evCommand,cmQUIT,NIL);
  172.       END;
  173.     cmLanguageEnglish :
  174.       BEGIN
  175.          Load_language('ENGLISH','MYAPP');
  176.          message(@self,evCommand,cmQUIT,NIL);
  177.       END;
  178.     cmLanguageFrench  :
  179.       BEGIN
  180.          Load_language('FRENCH','MYAPP');
  181.          message(@self,evCommand,cmQUIT,NIL);
  182.       END;
  183.     cmLanguageSpanish :
  184.       BEGIN
  185.          Load_language('SPANISH','MYAPP');
  186.          message(@self,evCommand,cmQUIT,NIL);
  187.       END;
  188.     cmLanguageItalian :
  189.       BEGIN
  190.          Load_language('ITALIAN','MYAPP');
  191.          message(@self,evCommand,cmQUIT,NIL);
  192.       END;
  193.  
  194.   7. When you actually want to exit the program with cmQUIT, set
  195.      exit_application to TRUE:
  196.  
  197.       cmExit_MyApp :
  198.        BEGIN
  199.           exit_application := TRUE;
  200.           message(@self,evCommand,cmQUIT,NIL);
  201.        END;
  202.  
  203.   8. To use a phrase translation simply call tranlate() with the phrase_Id
  204.      Ie.
  205.      Writeln(translate(L_mouse),' (',translate(L_Not_available),')');
  206.  
  207. I.e. The main module of the program MYAPP would look something like this:
  208.  
  209. BEGIN
  210.  
  211.   init_language(getenv('LANGUAGE'),'MYAPP'); <- To get the default language
  212.                                                 From the DOS environment
  213.                                                 variable LANGUAGE, set before
  214.                                                 running the program
  215.  
  216.   RegisterObjects;
  217.   RegisterViews;
  218.   RegisterMenus;
  219.   RegisterDialogs;
  220.   RegisterApp;
  221.   RegisterHelpFile;
  222.  
  223.   exit_application := FALSE;                  <- global variable
  224.   WHILE NOT exit_application DO
  225.   BEGIN
  226.      theapplication.Init;
  227.      theapplication.Run;
  228.      theapplication.Done;
  229.   END;
  230.  
  231.   end_language;
  232. END.
  233.  
  234.  
  235. The function program_path is implemented as follows:
  236.  
  237. FUNCTION program_path : STRING;
  238. VAR
  239.    directory : DirStr;
  240.    Name      : NameStr;
  241.    ext       : ExtStr;
  242. BEGIN
  243.    FSplit(ParamStr(0),directory,name,ext);
  244.    program_path := directory;
  245. END;
  246.  
  247. The function upcase_str is implemented as follows:
  248.  
  249. FUNCTION upcase_str(the_string : STRING) : STRING;
  250. VAR i : INTEGER;
  251. BEGIN
  252.    FOR i := 1 to length(the_string) DO
  253.       the_string[i] := upcase(the_string[i]);
  254.    upcase_str := the_string;
  255. END;
  256.  
  257. The function strpos is implemented as follows:
  258.  
  259. FUNCTION strpos(str1, str2 : STRING) : INTEGER;
  260. VAR
  261.    I,J : INTEGER;
  262. BEGIN
  263.    J := 0;
  264.    strpos := 0;
  265.    FOR I := 1 TO LENGTH(str1) DO
  266.          IF str1[i] = str2[j+1] THEN
  267.          BEGIN
  268.            INC(J);
  269.            IF J = LENGTH(STR2) THEN strpos :=i-j;
  270.          END
  271.          ELSE
  272.          BEGIN
  273.             j  := 0;
  274.             i := i-j;
  275.          END;
  276. END;
  277.  
  278. Please note that the translate function could be enhanced by using
  279. a search tree (which would also require balancing the phrase list), 
  280. however, since the phrases list is ordered by phraseID,
  281. the linear search should suffice for a few hundred phrases.
  282.  
  283. }
  284.  
  285. INTERFACE
  286.  
  287. USES DOS,cs_glob,objects;
  288.  
  289. TYPE
  290.     phrases = ({$I PHRASES.LNG} END_PHRASES);
  291.  
  292. PROCEDURE init_language(Language_Name : STRING; program_name : STRING);
  293. PROCEDURE load_language(Language_Name : STRING; program_name : STRING);
  294. FUNCTION translate(phrase_ID : phrases) : STRING;
  295. PROCEDURE end_language;
  296.  
  297. IMPLEMENTATION
  298.  
  299. TYPE
  300.  
  301.     translation_node_ptr = ^translation_node;
  302.     translation_node = RECORD
  303.         phrase_ID : phrases;
  304.         phrase    : Pstring;
  305.         right     : translation_node_ptr;
  306.     END;
  307.  
  308. VAR
  309.     translation_list : translation_node_ptr;
  310.  
  311. FUNCTION program_path : STRING;
  312. VAR
  313.    directory : DirStr;
  314.    Name      : NameStr;
  315.    ext       : ExtStr;
  316. BEGIN
  317.    FSplit(ParamStr(0),directory,name,ext);
  318.    program_path := directory;
  319. END;
  320.  
  321.  
  322.  
  323. PROCEDURE clear_translation_list(node : translation_node_ptr);
  324. BEGIN
  325.     IF (node <> NIL) THEN
  326.     WITH node^ DO
  327.     BEGIN
  328. {      clear_translation_list(left); }
  329.        clear_translation_list(right);
  330.        DisposeStr(phrase);
  331.        Dispose(node)
  332.     END;
  333. END;
  334.  
  335. PROCEDURE load_language(Language_Name: STRING; program_name : STRING);
  336. VAR
  337.    phrases_file  : TEXT;
  338.    phrases_filename : STRING;
  339.    node : translation_node_ptr;
  340.    phrase_ID : phrases;
  341.    last_node : translation_node_ptr;
  342.    phrase : STRING;
  343.    used_by : STRING;
  344.  
  345.    FUNCTION read_phrase : BOOLEAN;
  346.    VAR  phrase_ID_str : STRING;
  347.         language_name_in : STRING;
  348.         line_in : STRING;
  349.         read_complete : BOOLEAN;
  350.         phrase_in : STRING;
  351.  
  352.         PROCEDURE split_line(line : STRING; VAR lang : STRING;
  353.                              VAR phrase : STRING);
  354.         VAR Line_ndx : INTEGER;
  355.             linelen  : INTEGER;
  356.             langlen  : INTEGER;
  357.             phraselen: INTEGER;
  358.         BEGIN
  359.  
  360.             Line_ndx := 0;
  361.             linelen := length(line);
  362.             langlen := 0;
  363.             REPEAT
  364.                INC(line_ndx);
  365.                INC(langlen);
  366.                lang[langlen] := line[line_ndx];
  367.             UNTIL (line[line_ndx+1] = ' ') OR (line_ndx = linelen);
  368.             lang[0] := char(langlen);
  369.             INC(line_ndx);
  370.             phraselen := 0;
  371.             REPEAT
  372.                INC(line_ndx);
  373.                INC(phraselen);
  374.                phrase[phraselen] := line[line_ndx];
  375.             UNTIL (line_ndx = linelen);
  376.             phrase[0] := CHAR(phraselen);
  377.         END;
  378.  
  379.    BEGIN
  380.       read_phrase := TRUE;
  381.       IF eof(phrases_file) THEN
  382.          read_phrase := FALSE
  383.       ELSE
  384.       BEGIN
  385.          phrase := '';
  386.          readln(phrases_file,phrase_ID_str);  { phrases ID Not used}
  387.          IF (phrase_ID_str = '') OR (eof(phrases_file))
  388.             THEN
  389.             read_phrase := FALSE
  390.          ELSE
  391.          BEGIN
  392.             readln(phrases_file,used_by);
  393.             read_complete := FALSE;
  394.             REPEAT
  395.                 readln(phrases_file,line_in);
  396.  
  397.                 IF (line_in[1] = '}') THEN
  398.                    read_complete := TRUE
  399.                 ELSE
  400.                 BEGIN
  401.                    split_line(line_in,language_name_in,phrase_in);
  402.                    IF language_name_in = language_name THEN
  403.                       phrase := phrase_in
  404.                    ELSE IF (language_name_in = 'ENGLISH') AND  
  405.                            (phrase = '') THEN
  406.                       { Use english if translation not provided}
  407.                       phrase := phrase_in;
  408.  
  409.                 END
  410.             UNTIL read_complete;
  411.          END;
  412.       END;
  413.    END;
  414.  
  415. BEGIN
  416.    IF (translation_list <> NIL) THEN
  417.       clear_translation_list(translation_list);
  418.    translation_list := NIL;
  419.    IF language_name = '' THEN
  420.      language_name := 'ENGLISH';
  421.  
  422.    phrase_ID := L_LANGUAGE;
  423.    phrases_filename := program_path + 'PHRASES.LNG';
  424.    ASSIGN(phrases_file,phrases_filename);
  425.    RESET(phrases_file);
  426.    last_node := NIL;
  427.    FOR phrase_ID := L_LANGUAGE TO PRED(END_PHRASES) DO
  428.       BEGIN
  429.          IF NOT read_phrase THEN halt(0);
  430.          IF strpos(upcase_str(used_by),upcase_str(program_name)) <> 0 THEN
  431.          BEGIN
  432.             new(node);
  433.             IF translation_list = NIL THEN
  434.                translation_list := node;
  435.             node^.phrase_ID := phrase_ID;
  436.             node^.phrase := NewStr(phrase);
  437.             node^.right := NIL;
  438.             IF (last_node <> NIL) THEN
  439.                last_node^.right := node;
  440.             last_node := node;
  441.          END;
  442.       END;
  443.    CLOSE(phrases_file);
  444. END;
  445.  
  446. FUNCTION translate(phrase_ID : phrases) : STRING;
  447. VAR
  448.    curr : translation_node_ptr;
  449.    translation : STRING;
  450. BEGIN
  451.    curr := translation_list;
  452.    WHILE ((curr <> NIL) AND (curr^.phrase_ID <> phrase_ID)) DO
  453.       curr := curr^.right;
  454.    IF (curr <> NIL) THEN
  455.       translation := curr^.phrase^
  456.    ELSE
  457.       translation := 'Unable to translate';
  458.    IF translation = '_' THEN
  459.       translate := ' '
  460.    ELSE
  461.       translate := translation;
  462. END;
  463.  
  464. PROCEDURE init_language(language_name : STRING; program_name : STRING);
  465. BEGIN
  466.    IF language_name = '' THEN
  467.      language_name := 'ENGLISH';
  468.    translation_list := NIL;
  469.    load_language(Language_name,program_name);
  470. END;
  471.  
  472. PROCEDURE end_language;
  473. BEGIN
  474.    clear_translation_list(translation_list);
  475. END;
  476.  
  477. END.
  478. ---Cut Here----->8----->8----->8----->8----->8----->8----->8----->8-----
  479.  
  480. begin 644 phrases.lng
  481. M4F5P;&%C92!-64%04"!W:71H('EO=7(@<')O9W)A;2!N86UE*',I+@H*+2TM
  482. M0W5T($AE<F4M+2TM+3@\+2TM+2TX/"TM+2TM.#PM+2TM+3@\+2TM+2TX/"TM
  483. M+2TM.#PM+2TM+3@\+2TM+2TX/"TM+2TM.#PM+2T*3%],04Y'54%'12P*>R!-
  484. M64%04`I%3D=,25-(($5N9VQI<V@*1E)%3D-(($9R86YC86ES"DE404Q)04X@
  485. M271A;&EA;F\*4U!!3DE32"!%<W!A;F]L"GT*3%]!8F]U="P*>R!-64%04`I%
  486. M3D=,25-(($%B;W5T"D9214Y#2"!!=71O=7(*251!3$E!3B!2:6=U87)D;PI3
  487. M4$%.25-(($%C97)C82!D90I]"DQ?07!R+`I[($U905!0"D5.1TQ)4T@@07!R
  488. M"D9214Y#2"!!=G(*251!3$E!3B!!<'(*4U!!3DE32"!!8G(*?0I,7T%P<FEL
  489. M+`I[($U905!0"D5.1TQ)4T@@07!R:6P*1E)%3D-(($%V<FEL"DE404Q)04X@
  490. M07!R:6QE"E-004Y)4T@@06)R:6P*?0I,7T%U9RP*>R!-64%04`I%3D=,25-(
  491. M($%U9PI&4D5.0T@@06]T"DE404Q)04X@06=T"E-004Y)4T@@06=O"GT*3%]!
  492. M=6=U<W0L"GL@35E!4%`*14Y'3$E32"!!=6=U<W0*1E)%3D-(($%O%G0*251!
  493. M3$E!3B!!9V]S=&\*4U!!3DE32"!!9V]S=&\*?0I,7T-H86YG95]$:7)E8W1O
  494. M<GDL"GL@35E!4%`*14Y'3$E32"!#:&%N9V4@1&ER96-T;W)Y"D9214Y#2"!#
  495. M:&%N9V5R('("<&5R=&]I<F4*251!3$E!3B!#86UB:6\@9&D@9&ER96-T;W)Y
  496. M"E-004Y)4T@@0V%M8FEA<B!D:7)E8W1O<FEO"GT*3%]#:&5C:U]P871H7V]R
  497. M7W-P96QL:6YG+`I[($U905!0"D5.1TQ)4T@@0VAE8VL@=&AE('!A=&@@;W(@
  498. M<W!E;&QI;F<N"D9214Y#2"!0975T+0AT<F4@97)R975R('-E;G1I97(@;W4@
  499. M`G!E;&QA=&EO;BX*251!3$E!3B!697)I9FEC87)E(&EL('!E<F-A<G-O(&\@
  500. M:6P@;F]M92X*4U!!3DE32"!697)I9FEQ=64@;&$@<G5T82!O(&QA(&]R=&]G
  501. M<F%F(6$N"GT*3%]#;&]S92P*>R!-64%04`I%3D=,25-(($-L;W-E"D9214Y#
  502. M2"!&97)M97(*251!3$E!3B!#:&EU9&D*4U!!3DE32"!#97)R87(*?0I,7T-U
  503. M<G)E;G1?9&ER96-T;W)Y+`I[($U905!0"D5.1TQ)4T@@0W5R<F5N="!$:7)E
  504. M8W1O<GD*1E)%3D-((%("<&5R=&]I<F4@0V]U<F%N=`I)5$%,24%.($1I<F5C
  505. M=&]R>2!#;W)R96YT90I34$%.25-(($1I<F5C=&]R:6\@8V]R<FEE;G1E"GT*
  506. M3%]#7V%?<V-A9&4L"GL@35E!4%`*14Y'3$E32"!#?F%^<V-A9&4*1E)%3D-(
  507. M($-^87YS8V%D90I)5$%,24%.($9I;F5S=')E(&EN('Y3?F]V<F%P<&]S:7II
  508. M;VYE"E-004Y)4T@@0WYA?G-C861A"GT*3%]$871E+`I[($U905!0"D5.1TQ)
  509. M4T@@1&%T90I&4D5.0T@@1&%T90I)5$%,24%.($1A=&$*4U!!3DE32"!&96-H
  510. M80I]"DQ?1&%T97-?9F]R7W!R;V9I;&5?;W5T<'5T+`I[($U905!0"D5.1TQ)
  511. M4T@@1&%T97,@9F]R(')E<&]R=&EN9R!S;VEL('!R;V9I;&4@=F%R:6%B;&5S
  512. M"D9214Y#2"!$871E<R!P;W5R(&PG;W5T<'5T(&1E<R!H;W)I>F]N<PI)5$%,
  513. M24%.($1A=&4@<&5R(&PG;W5T<'5T(&1E;&QA('1A=F]L82!D96P@<W5O;&\*
  514. M4U!!3DE32"!&96-H87,@<&%R82!R97!O<G1A<B!V87)I86)L97,@9&5L('!E
  515. M<F9I;"!D92!S=65L;PI]"DQ?1&%Y+`I[($U905!0"D5.1TQ)4T@@1&%Y"D92
  516. M14Y#2"!*;W5R"DE404Q)04X@1VEO<FYO"E-004Y)4T@@1"%A"GT*3%]$87ES
  517. M+`I[($U905!0"D5.1TQ)4T@@1&%Y<PI&4D5.0T@@2F]U<G,*251!3$E!3B!'
  518. M:6]R;FD*4U!!3DE32"!$(6%S"GT*3%]$87E?;V9?;6]N=&@L"GL@35E!4%`*
  519. M14Y'3$E32"!$87D@;V8@=&AE(&UO;G1H"D9214Y#2"!*;W5R(&1U(&UO:7,*
  520. M251!3$E!3B!);"!G:6]R;F\@9&5L(&UE<V4*4U!!3DE32"!$(6$@9&5L(&UE
  521. M<PI]"DQ?1&5C+`I[($U905!0"D5.1TQ)4T@@1&5C"D9214Y#2"!$96,*251!
  522. M3$E!3B!$:6,*4U!!3DE32"!$96,*?0I,7T1E8V5M8F5R+`I[($U905!0"D5.
  523. M1TQ)4T@@1&5C96UB97(*1E)%3D-(($1E8V5M8G)E"DE404Q)04X@1&EC96UB
  524. M<F4*4U!!3DE32"!$:6-I96UB<F4*?0I,7V1E9F%U;'0L"GL@35E!4%`*14Y'
  525. M3$E32"!D969A=6QT"D9214Y#2"!087(@9`)F875T"DE404Q)04X@<')E9&5F
  526. M:6YI=&\*4U!!3DE32"!S=&%N9&%R9`I]"DQ?1&5L971E+`I[($U905!0"D5.
  527. M1TQ)4T@@1&5L971E"D9214Y#2"!3=7!P<FEM97(*251!3$E!3B!#86YC96QL
  528. M80I34$%.25-((%-U<')I;6ER"GT*3%]%;G1E<BP*>R!-64%04`I%3D=,25-(
  529. M($5N=&5R"D9214Y#2"!%;G1R90I)5$%,24%.($EN=')O9'5R<F4*4U!!3DE3
  530. M2"!%;G1R90I]"DQ?17AI="P*>R!-64%04`I%3D=,25-(($5X:70*1E)%3D-(
  531. M(%%U:71T97(*251!3$E!3B!%<V-I"E-004Y)4T@@4V%L:7(*?0I,7T5X=&5N
  532. M<VEO;E]M=7-T7VYO=%]S<&5C:69I960L"GL@35E!4%`*14Y'3$E32"!4:&4@
  533. M97AT96YS:6]N(&UU<W0@;F]T(&)E('-P96-I9FEE9"X*1E)%3D-(($5X=&5N
  534. M<VEO;B!N)V5S="!P87,@;F5C97-S86ER92X*251!3$E!3B!,)V5S=&5N<VEO
  535. M;F4@;F]N(&1E=F4@97-S97)E('-P96-I9FEC871A+@I34$%.25-(($QA(&5X
  536. M=&5N<VEO;B!N;R!D96)E(&5S<&5C:69I8V%R<V4N"GT*3%]%7WA?:70L"GL@
  537. M35E!4%`*14Y'3$E32"!%?GA^:70*1E)%3D-(('Y1?G5I='1E<@I)5$%,24%.
  538. M($5^<WYC:0I34$%.25-(('Y3?F%L:7(*?0I,7T9E8BP*>R!-64%04`I%3D=,
  539. M25-(($9E8@I&4D5.0T@@1F5V"DE404Q)04X@1F5B"E-004Y)4T@@1F5B"GT*
  540. M3%]&96)R=6%R>2P*>R!-64%04`I%3D=,25-(($9E8G)U87)Y"D9214Y#2"!&
  541. M979R:65R"DE404Q)04X@1F5B8G)A:6\*4U!!3DE32"!&96)R97)O"GT*3%](
  542. M96QP+`I[($U905!0"D5.1TQ)4T@@2&5L<`I&4D5.0T@@06ED90I)5$%,24%.
  543. M($%I=71O"E-004Y)4T@@07EU9&$*?0I,7TAO=7)S+`I[($U905!0"D5.1TQ)
  544. M4T@@2&]U<G,*1E)%3D-((&AE=7)E<PI)5$%,24%.($]R90I34$%.25-((&AO
  545. M<F%S"GT*3%]);G-E<G0L"GL@35E!4%`*14Y'3$E32"!);G-E<G0*1E)%3D-(
  546. M($EN<V5R97(*251!3$E!3B!);G-E<FES8VD*4U!!3DE32"!);G-E<G1A<@I]
  547. M"DQ?2F%N+`I[($U905!0"D5.1TQ)4T@@2F%N"D9214Y#2"!*86X*251!3$E!
  548. M3B!'96X*4U!!3DE32"!%;G(*?0I,7TIA;G5A<GDL"GL@35E!4%`*14Y'3$E3
  549. M2"!*86YU87)Y"D9214Y#2"!*86YV:65R"DE404Q)04X@1V5N;F%I;PI34$%.
  550. M25-(($5N97)O"GT*3%]*=6PL"GL@35E!4%`*14Y'3$E32"!*=6P*1E)%3D-(
  551. M($IU;`I)5$%,24%.($QU9PI34$%.25-(($IU;`I]"DQ?2G5L>2P*>R!-64%0
  552. M4`I%3D=,25-(($IU;'D*1E)%3D-(($IU:6QL970*251!3$E!3B!,=6=L:6\*
  553. M4U!!3DE32"!*=6QI;PI]"DQ?2G5N+`I[($U905!0"D5.1TQ)4T@@2G5N"D92
  554. M14Y#2"!*=6X*251!3$E!3B!':74*4U!!3DE32"!*=6X*?0I,7TIU;F4L"GL@
  555. M35E!4%`*14Y'3$E32"!*=6YE"D9214Y#2"!*=6EN"DE404Q)04X@1VEU9VYO
  556. M"E-004Y)4T@@2G5N:6\*?0I,7TQI;F5S7W!E<E]P86=E+`I[($U905!0"D5.
  557. M1TQ)4T@@3&EN97,@<&5R('!A9V4*1E)%3D-(($QI9VYE<R!P87(@<&%G90I)
  558. M5$%,24%.(%)I9VAE('!E<B!P86=I;F$*4U!!3DE32"!,(6YE87,@<&]R('`@
  559. M9VEN80I]"DQ?3&EN95]W:61T:"P*>R!-64%04`I%3D=,25-(($QI;F4@=VED
  560. M=&@*1E)%3D-(($QO;F=U975R(&1E(&QI;F=E<PI)5$%,24%.($QA<F=H97IZ
  561. M82!R:6=A"E-004Y)4T@@06YC:&\@9&4@;&$@;"%N96$*?0I,7TQO860L"GL@
  562. M35E!4%`*14Y'3$E32"!,;V%D"D9214Y#2"!,96-T=7)E"DE404Q)04X@0V%R
  563. M:6-A"E-004Y)4T@@06)R:7(*?0I,7TQO861?0W)E871E+`I[($U905!0"D5.
  564. M1TQ)4T@@3&]A9"]#<F5A=&4*1E)%3D-(($-H87)G97(O0W("97(*251!3$E!
  565. M3B!#87)I8V$O0W)E80I34$%.25-(($%B<FER+V-R96%R"GT*3%]-87(L"GL@
  566. M35E!4%`*14Y'3$E32"!-87(*1E)%3D-(($UA<@I)5$%,24%.($UA<@I34$%.
  567. M25-(($UA<@I]"DQ?36%R8V@L"GL@35E!4%`*14Y'3$E32"!-87)C:`I&4D5.
  568. M0T@@36%R<PI)5$%,24%.($UA<GIO"E-004Y)4T@@36%R>F\*?0I,7TUA>2P*
  569. M>R!-64%04`I%3D=,25-(($UA>0I&4D5.0T@@36%I"DE404Q)04X@36%G9VEO
  570. M"E-004Y)4T@@36%Y;PI]"DQ?36]U<V4L"GL@35E!4%`*14Y'3$E32"!-;W5S
  571. M90I&4D5.0T@@4V]U<FES"DE404Q)04X@36]U<V4*4U!!3DE32"!2870B;@I]
  572. M"DQ?3F5X=%]W:6YD;W<L"GL@35E!4%`*14Y'3$E32"!.97AT('=I;F1O=PI&
  573. M4D5.0T@@1F5N"'1R92!S=6EV86YT"DE404Q)04X@4')O<W-I;6$@9FEN97-T
  574. M<F$*4U!!3DE32"!696YT86YA(%-I9W5I96YT90I]"DQ?3F]T7T%V86EL86)L
  575. M92P*>R!-64%04`I%3D=,25-(($YO="!!=F%I;&%B;&4*1E)%3D-(($YO;B!$
  576. M:7-P;VYI8FQE"DE404Q)04X@3F]N($1I<W!O;FEB:6QE"E-004Y)4T@@3F\@
  577. M9&ES<&]N:6)L90I]"DQ?3F]T7V5N;W5G:%]M96UO<GE?=&]?8V]M<&QE=&5?
  578. M;W!E<F%T:6]N+`I[($U905!0"D5.1TQ)4T@@3F]T(&5N;W5G:"!M96UO<GD@
  579. M879A:6QA8FQE('1O(&-O;7!L971E(&]P97)A=&EO;BX*1E)%3D-(($T";6]R
  580. M:64@;F]N(&1I<W!O;FEB;&4N($]P`G)A=&EO;B!N;VX@8V]M<&QE="X*251!
  581. M3$E!3B!-96UO<FEA(&1I<W!O;FEB:6QE(&EN<W5F9FEC:65N=&4@<&5R(&-O
  582. M;7!L971A<F4@;"=O<&5R87II;VYE+@I34$%.25-(($YO(&AA>2!S=69I8VEE
  583. M;G1E(&UE;6]R:6$@<&%R82!C;VUP;&5T87(@;&$@;W!E<F%C:2)N+@I]"DQ?
  584. M3F]T7W5S960L"GL@35E!4%`*14Y'3$E32"!.;W0@57-E9`I&4D5.0T@@26YU
  585. M=&EL:7,""DE404Q)04X@3F]N(%5T:6QI>GIA=&\*4U!!3DE32"!.;R!S92!U
  586. M<V$*?0I,7TYO=BP*>R!-64%04`I%3D=,25-(($YO=@I&4D5.0T@@3F]V"DE4
  587. M04Q)04X@3F]V"E-004Y)4T@@3F]V"GT*3%].;W9E;6)E<BP*>R!-64%04`I%
  588. M3D=,25-(($YO=F5M8F5R"D9214Y#2"!.;W9E;6)R90I)5$%,24%.($YO=F5M
  589. M8G)E"E-004Y)4T@@3F]V:65M8G)E"GT*3%]/8W0L"GL@35E!4%`*14Y'3$E3
  590. M2"!/8W0*1E)%3D-(($]C=`I)5$%,24%.($]T=`I34$%.25-(($]C=`I]"DQ?
  591. M3V-T;V)E<BP*>R!-64%04`I%3D=,25-(($]C=&]B97(*1E)%3D-(($]C=&]B
  592. M<F4*251!3$E!3B!/='1O8G)E"E-004Y)4T@@3V-T=6)R90I]"DQ?3W!E;BP*
  593. M>R!-64%04`I%3D=,25-(($]P96X*1E)%3D-(($]U=G)I<@I)5$%,24%.($%P
  594. M<FD*4U!!3DE32"!!8G)I<@I]"DQ?3W!E;E]A7T9I;&4L"GL@35E!4%`*14Y'
  595. M3$E32"!/<&5N(&$@1FEL90I&4D5.0T@@3W5V<FER('5N92!F:6-H:65R"DE4
  596. M04Q)04X@07!R:2!U;B!&:6QE"E-004Y)4T@@06)R:7(@=6X@87)C:&EV;PI]
  597. M"DQ?3U]+7RP*>R!-64%04`I%3D=,25-(($]^2WX*1E)%3D-(($]^2WX*251!
  598. M3$E!3B!^17YS96=U:0I34$%.25-(('Y'?G5A<F1A<@I]"DQ?4&%G:6YA=&EO
  599. M;BP*>R!-64%04`I%3D=,25-((%!A9VEN871I;VX*1E)%3D-((%!A9VEN871I
  600. M;VX*251!3$E!3B!);7!A9VEN87II;VYE"E-004Y)4T@@4&%G:6YA8VDB;@I]
  601. M"DQ?4&QE87-E7W=A:70L"GL@35E!4%`*14Y'3$E32"!0;&5A<V4@5V%I="XN
  602. M+@I&4D5.0T@@071T96YD97HN+BX*251!3$E!3B!0<F5G;R!A='1E;F1E<F4N
  603. M+BX*4U!!3DE32"!%<W!E<F4L('!O<B!F879O<BXN+@I]"DQ?4')E<W-?4D54
  604. M55).7W1O7V-O;G1I;G5E+`I[($U905!0"D5.1TQ)4T@@4')E<W,@6U)E='5R
  605. M;ET@=&\@8V]N=&EN=64N"D9214Y#2"!487!E<B!;(#Q$1%D@72!P;W5R(&-O
  606. M;G1I;G5E<BX*251!3$E!3B!0<F5M97)E(%M);G9I;UT@<&5R(&-O;G1I;G5A
  607. M<F4N"E-004Y)4T@@4')E<VEO;F4@6T5N=')A<ET@<&%R82!C;VYT:6YU87(N
  608. M"GT*3%]0<F5V7W=I;F1O=RP*>R!-64%04`I%3D=,25-((%!R978@=VEN9&]W
  609. M"D9214Y#2"!&96X"=')E('!R`F-E9`(*251!3$E!3B!&:6YE<W1R82!P<F5C
  610. M+@I34$%.25-((%9E;G1A;F$@86YT97)I;W(*?0I,7U-A=F4L"GL@35E!4%`*
  611. M14Y'3$E32"!3879E"D9214Y#2"!3875V97(*251!3$E!3B!386QV"E-004Y)
  612. M4T@@1W5A<F1A<@I]"DQ?4V5L96-T7V%?1FEL92P*>R!-64%04`I%3D=,25-(
  613. M(%-E;&5C="!A($9I;&4*1E)%3D-(($-H;VES:7(@=6X@9FEC:&EE<@I)5$%,
  614. M24%.(%-E;&5Z:6]N82!U;B!S:6QE"E-004Y)4T@@4V5L96-C:6]N92!U;B!A
  615. M<F-H:79O"GT*3%]397!T96UB97(L"GL@35E!4%`*14Y'3$E32"!397!T96UB
  616. M97(*1E)%3D-((%-E<'1E;6)R90I)5$%,24%.(%-E='1E;6)R90I34$%.25-(
  617. M(%-E<'1I96UB<F4*?0I,7U-P="P*>R!-64%04`I%3D=,25-((%-P=`I&4D5.
  618. M0T@@4W!T"DE404Q)04X@4V5T"E-004Y)4T@@4W!T"GT*3%]4>7!E7T58251?
  619. M=&]?<F5T=7)N+`I[($U905!0"D5.1TQ)4T@@5'EP92!%6$E4('1O(')E='5R
  620. M;BXN+@I&4D5.0T@@5&%P97H@15A)5"`%(')E=&]U<FYE<BXN+@I)5$%,24%.
  621. M($EN=FEA(&EL(&-O;6%N9&\@15A)5"!P97(@<FET;W)N87)E+BXN"E-004Y)
  622. M4T@@17-C<FEB82!%6$E4('!A<F$@<F5T;W)N87(N+BX*?0I,7UEE87(L"GL@
  623. M35E!4%`*14Y'3$E32"!996%R"DE404Q)04X@06YN;PI34$%.25-(($$D;PI&
  624. M4D5.0T@@06YN90(*?0I,7UIO;VTL"GL@35E!4%`*14Y'3$E32"!:;V]M"D92
  625. M14Y#2"!:;V]M"DE404Q)04X@6F]O;0I34$%.25-((%IO;VT*?0I,7U]!7W!P
  626. M96YD+`I[($U905!0"D5.1TQ)4T@@?D%^<'!E;F0*1E)%3D-(('Y!?FIO=71E
  627. M<@I)5$%,24%.('Y!?F=G:75N9VD*4U!!3DE32"!^07YG<F5G87(*?0I,7U]#
  628. M7V%N8V5L+`I[($U905!0"D5.1TQ)4T@@?D-^86YC96P*1E)%3D-(('Y!?FYN
  629. M=6QE<@I)5$%,24%.($%^;GYN=6QL80I34$%.25-(('Y#?F%N8V5L87(*?0I,
  630. M7U]#7VAD:7(L"GL@35E!4%`*14Y'3$E32"!^0WYH1&ER"D9214Y#2"!^0WYH
  631. M86YG97(*251!3$E!3B!^0WYA;6)I80I34$%.25-(('Y#?F%M8FEA<@I]"DQ?
  632. M7T-?;&]S92P*>R!-64%04`I%3D=,25-(('Y#?FQO<V4*1E)%3D-(('Y&?F5R
  633. M;65R"DE404Q)04X@?D-^:&EU9&D*4U!!3DE32"!^0WYE<G)A<@I]"DQ?7T1?
  634. M96QE=&4L"GL@35E!4%`*14Y'3$E32"!^1'YE;&5T90I&4D5.0T@@?E-^=7!P
  635. M<FEM97(*251!3$E!3B!^0WYA;F-E;&QA"E-004Y)4T@@?E-^=7!R:6UI<@I]
  636. M"DQ?7T1?:7)E8W1O<GDL"GL@35E!4%`*14Y'3$E32"!^1'YI<F5C=&]R>0I&
  637. M4D5.0T@@?E)^`G!E<G1O:7)E"DE404Q)04X@?D1^:7)E8W1O<GD*4U!!3DE3
  638. M2"!^1'YI<F5C=&]R:6\*?0I,7U]$7T]37W-H96QL+`I[($U905!0"D5.1TQ)
  639. M4T@@?D1^3U,@<VAE;&P*1E)%3D-(('Y$?D]3('-H96QL"DE404Q)04X@?D1^
  640. M3U,@<VAE;&P*4U!!3DE32"!^1'Y/4R!S:&5L;`I]"DQ?7T5?>&ET+`I[($U9
  641. M05!0"D5.1TQ)4T@@?D5^>&ET"D9214Y#2"!^47YU:71T97(*251!3$E!3B!^
  642. M17YS8VD*4U!!3DE32"!^4WYA;&ER"GT*3%]?1E]I;&4L"GL@35E!4%`*14Y'
  643. M3$E32"!^1GYI;&4*1E)%3D-(('Y&?FEC:&EE<@I)5$%,24%.('Y&?FEL90I3
  644. M4$%.25-(('Y&?FEC:&5R;PI]"DQ?7TE?;G-E<G0L"GL@35E!4%`*14Y'3$E3
  645. M2"!^27YN<V5R=`I&4D5.0T@@?DE^;G-E<F5R"DE404Q)04X@?DE^;G-E<FES
  646. M8VD*4U!!3DE32"!^27YN<V5R=&%R"GT*3%]?3%]O860L"GL@35E!4%`*14Y'
  647. M3$E32"!^3'YO860*1E)%3D-(('Y,?F5C='5R90I)5$%,24%.('Y#?F%R:6-A
  648. M"E-004Y)4T@@?D%^8G)I<@I]"DQ?7TY?86UE+`I[($U905!0"D5.1TQ)4T@@
  649. M?DY^86UE"D9214Y#2"!^3GYO;0I)5$%,24%.('Y.?F]M90I34$%.25-(('Y.
  650. M?F]M8G)E"GT*3%]?3E]E>'1?=VEN9&]W+`I[($U905!0"D9214Y#2"!^1GYE
  651. M;@AT<F4@<W5I=F%N=`I%3D=,25-(('Y.?F5X="!W:6YD;W<*251!3$E!3B!^
  652. M4'YR;W-S:6UA(&9I;F5S=')A"E-004Y)4T@@5F5N=&%N82!^4WYI9W5I96YT
  653. M90I]"DQ?7T]?<&5N+`I[($U905!0"D5.1TQ)4T@@?D]^<&5N"D9214Y#2"!^
  654. M3WYP96X*251!3$E!3B!^07YP<FD*4U!!3DE32"!^07YB<FER"GT*3%]?3U]R
  655. M:6=I;BP*>R!-64%04`I%3D=,25-(('Y/?G)I9VEN"D9214Y#2"!/<FEG:6YE
  656. M"DE404Q)04X@?D]^<FEG:6YE"E-004Y)4T@@?D]^<FEG:6YA;`I]"DQ?7T]?
  657. M=F5R=W)I=&4L"GL@35E!4%`*14Y'3$E32"!^3WYV97)W<FET90I&4D5.0T@@
  658. M?E)^96UP;&%C97(*251!3$E!3B!^4GYI<V-R:79I"E-004Y)4T@@?D-^86UB
  659. M:6%R"GT*3%]?4%]R:6YT"GL@35E!4%`*14Y'3$E32"!^4'YR:6YT"D9214Y#
  660. M2"!^27YM<')I;65R:64*251!3$E!3B!^4WYT86UP80I34$%.25-(('Y)?FUP
  661. M<FEM:7(*?0I,7U]27V5S:7IE7VUO=F4L"GL@35E!4%`*14Y'3$E32"!^4GYE
  662. M<VEZ92]M;W9E"D9214Y#2"!^0WYA;&EB<F%G90I)5$%,24%.('Y2?FED:6UE
  663. M;G-I;VYA+VUU;W9I"E-004Y)4T@@0V%M8FEA<B!^5'YA;6$D;R]M;W9E<@I]
  664. M"DQ?7U)?=6YT:6UE7V=R87!H+`I[($U905!0"D5.1TQ)4T@@?E)^=6YT:6UE
  665. M($=R87!H"D9214Y#2"!^1WYR87!H:7%U90I)5$%,24%.('Y'?G)A9FEC:2!V
  666. M<R!T96UP;PI34$%.25-(('Y'?G(@9FEC;W,*?0I,7U]37V%V92P*>R!-64%0
  667. M4`I%3D=,25-(('Y3?F%V90I&4D5.0T@@?E-^875V97(*251!3$E!3B!^4WYA
  668. M;'9A"E-004Y)4T@@?D=^=6%R9&%R"GT*3%]?5%]I;&4L"GL@35E!4%`*14Y'
  669. M3$E32"!^5'YI;&4*1E)%3D-(('Y#?A-T92`%(&,3=&4*251!3$E!3B!^07YF
  670. M9FEA;F-A;65N=&\@9&5L;&4@9FEN97-T<F4*4U!!3DE32"!^5GYE;G1A;F%S
  671. M(&-O<W1A9&\@82!C;W-T861O"GT*3%]?5E]I9&5O7VUO9&5?,C5?-3`L"GL@
  672. M35E!4%`*14Y'3$E32"!^5GYI9&5O(&UO9&4@,C4O-3`*1E)%3D-(('Y6?FED
  673. M96\@;6]D92`R-2\U,`I)5$%,24%.('Y3?F-H97)M;R!I;B!-;V1A;&ET!2`R
  674. M-2\U,`I34$%.25-((&UO9&$@9&5L('Y6?FED96\@,C4O-3`*?0I,7U]77VEN
  675. M9&]W+`I[($U905!0"D5.1TQ)4T@@?E=^:6YD;W<*1E)%3D-(('Y&?F5N"'1R
  676. M90I)5$%,24%.('Y&?FEN97-T<F$*4U!!3DE32"!^5GYE;G1A;F$*?0I,7U]:
  677. M7V]O;2P*>R!-64%04`I&4D5.0T@@?EI^;V]M"D5.1TQ)4T@@?EI^;V]M"DE4
  678. M04Q)04X@?EI^;V]M"E-004Y)4T@@?EI^;V]M"GT*3%]$87E?;V9?>65A<BP*
  679. M>R!-64%04`I%3D=,25-(($1A>2!O9B!T:&4@>65A<CL*1E)%3D-(($IO=7(@
  680. M9&4@;"=A;FX"93L*251!3$E!3B!':6]R;F\@9&5L;"=A;FYO"E-004Y)4T@@
  681. M1"%A(&1E;"!A)&\["GT*3%]D:7-A8FQE9"P*>R!-64%04`I%3D=,25-((&1I
  682. M<V%B;&5D"D9214Y#2"!N;VX@:&%B:6QI=`(*251!3$E!3B!D:7-A8FEL:71A
  683. M=&D*4U!!3DE32"!D97-H86)I;&ET861O"GT*3%]E;F%B;&5D+`I[($U905!0
  684. M"D5.1TQ)4T@@96YA8FQE9`I&4D5.0T@@:&%B:6QI=`(*251!3$E!3B!A8FEL
  685. M:71A=&D*4U!!3DE32"!H86)I;&ET861O"GT*3%]&04E,140L"GL@35E!4%`*
  686. M14Y'3$E32"!&04E,140*1E)%3D-((!!#2$5#"DE404Q)04X@1D%,3$E43PI3
  687. M4$%.25-(($9204-!4T$*?0I,7VYO=%]V86QI9"P*>R!-64%04`I%3D=,25-(
  688. M(&YO="!V86QI9`I&4D5.0T@@;F]N('9A;&%B;&4N"DE404Q)04X@;F]N('9A
  689. M;&ED;PI34$%.25-((&YO(&5S('8@;&ED;PI]"DQ?4$%34T5$+`I[($U905!0
  690. M"D5.1TQ)4T@@4$%34T5$"D9214Y#2"!005-3$`I)5$%,24%.(%!!4U-!5$\*
  691. M4U!!3DE32"!%6$E43U-/"GT*3%]686QI9&%T:6YG+`I[($U905!0"D5.1TQ)
  692. M4T@@5F%L:61A=&EN9PI&4D5.0T@@5F%L:61A=&EO;B!E;B!C;W5R<PI)5$%,
  693. M24%.(%9A;&ED87II;VYE(&EN(&%T=&\*4U!!3DE32"!686QI9&%N9&\*?0I,
  694. M7U9A;&ED871I;VXL"GL@35E!4%`*14Y'3$E32"!686QI9&%T:6]N"D9214Y#
  695. M2"!686QI9&%T:6]N"DE404Q)04X@5F%L:61A>FEO;F4*4U!!3DE32"!686QI
  696. M9&%C:2)N"GT*3%]697)I9GEI;F=?97AI<W1A;F-E7V]F7V9I;&4L"GL@35E!
  697. M4%`*14Y'3$E32"!697)I9GEI;F<@97AI<W1E;F-E(&]F(&9I;&4*1E)%3D-(
  698. M(%8"<FEF:6-A=&EO;B!D92!L)P)X:7-T96YC92!D=2!F:6-H:65R"DE404Q)
  699. M04X@5F5R:69I8V$@9&5L;"=E<VES=&5N>F$@9&5L(&9I;&4@:6X@871T;PI3
  700. M4$%.25-((%9E<FEF:6-A;F1O(&5X:7-T96YC:6$@9&5L(&%R8VAI=F\*?0HM
  701. M+2U#=70@2&5R92TM+2TM/C@M+2TM+3XX+2TM+2T^."TM+2TM/C@M+2TM+3XX
  702. <+2TM+2T^."TM+2TM/C@M+2TM+3XX+2TM+2T*"BT^
  703. `
  704. end
  705.