nsprpub/lib/tests/base64t.c

Fri, 16 Jan 2015 18:13:44 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 18:13:44 +0100
branch
TOR_BUG_9701
changeset 14
925c144e1f1f
permissions
-rw-r--r--

Integrate suggestion from review to improve consistency with existing code.

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "plbase64.h"
     7 #include "plstr.h"
     8 #include "nspr.h"
    10 #include <stdio.h>
    12 static unsigned char *base = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    14 /* PL_Base64Encode, single characters */
    15 PRBool test_001(void)
    16 {
    17     PRUint32 a, b;
    18     unsigned char plain[ 4 ];
    19     unsigned char cypher[ 5 ];
    20     char result[ 8 ];
    21     char *rv;
    23     printf("Test 001 (PL_Base64Encode, single characters)                         ..."); fflush(stdout);
    25     plain[1] = plain[2] = plain[3] = (unsigned char)0;
    26     cypher[2] = cypher[3] = (unsigned char)'=';
    27     cypher[4] = (unsigned char)0;
    29     for( a = 0; a < 64; a++ )
    30     {
    31         cypher[0] = base[a];
    33         for( b = 0; b < 4; b++ )
    34         {
    35             plain[0] = (unsigned char)(a * 4 + b);
    36             cypher[1] = base[(b * 16)];
    38             rv = PL_Base64Encode((char *)plain, 1, result);
    39             if( rv != result )
    40             {
    41                 printf("FAIL\n\t(%d, %d): return value\n", a, b);
    42                 return PR_FALSE;
    43             }
    45             if( 0 != PL_strncmp((char *)cypher, result, 4) )
    46             {
    47                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.4s.\"\n",
    48                        a, b, cypher, result);
    49                 return PR_FALSE;
    50             }
    51         }
    52     }
    54     printf("PASS\n");
    55     return PR_TRUE;
    56 }
    58 /* PL_Base64Encode, double characters */
    59 PRBool test_002(void)
    60 {
    61     PRUint32 a, b, c, d;
    62     unsigned char plain[ 4 ];
    63     unsigned char cypher[ 5 ];
    64     char result[ 8 ];
    65     char *rv;
    67     printf("Test 002 (PL_Base64Encode, double characters)                         ..."); fflush(stdout);
    69     plain[2] = plain[3] = (unsigned char)0;
    70     cypher[3] = (unsigned char)'=';
    71     cypher[4] = (unsigned char)0;
    73     for( a = 0; a < 64; a++ )
    74     {
    75         cypher[0] = base[a];
    76         for( b = 0; b < 4; b++ )
    77         {
    78             plain[0] = (a*4) + b;
    79             for( c = 0; c < 16; c++ )
    80             {
    81                 cypher[1] = base[b*16 + c];
    82                 for( d = 0; d < 16; d++ )
    83                 {
    84                     plain[1] = c*16 + d;
    85                     cypher[2] = base[d*4];
    87                     rv = PL_Base64Encode((char *)plain, 2, result);
    88                     if( rv != result )
    89                     {
    90                         printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
    91                         return PR_FALSE;
    92                     }
    94                     if( 0 != PL_strncmp((char *)cypher, result, 4) )
    95                     {
    96                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
    97                                a, b, c, d, cypher, result);
    98                         return PR_FALSE;
    99                     }
   100                 }
   101             }
   102         }
   103     }
   105     printf("PASS\n");
   106     return PR_TRUE;
   107 }
   109 /* PL_Base64Encode, triple characters */
   110 PRBool test_003(void)
   111 {
   112     PRUint32 a, b, c, d, e, f;
   113     unsigned char plain[ 4 ];
   114     unsigned char cypher[ 5 ];
   115     char result[ 8 ];
   116     char *rv;
   118     printf("Test 003 (PL_Base64Encode, triple characters)                         ..."); fflush(stdout);
   120     cypher[4] = (unsigned char)0;
   122     for( a = 0; a < 64; a++ )
   123     {
   124         cypher[0] = base[a];
   125         for( b = 0; b < 4; b++ )
   126         {
   127             plain[0] = (a*4) + b;
   128             for( c = 0; c < 16; c++ )
   129             {
   130                 cypher[1] = base[b*16 + c];
   131                 for( d = 0; d < 16; d++ )
   132                 {
   133                     plain[1] = c*16 + d;
   134                     for( e = 0; e < 4; e++ )
   135                     {
   136                         cypher[2] = base[d*4 + e];
   137                         for( f = 0; f < 64; f++ )
   138                         {
   139                             plain[2] = e * 64 + f;
   140                             cypher[3] = base[f];
   142                             rv = PL_Base64Encode((char *)plain, 3, result);
   143                             if( rv != result )
   144                             {
   145                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b, c, d, e, f);
   146                                 return PR_FALSE;
   147                             }
   149                             if( 0 != PL_strncmp((char *)cypher, result, 4) )
   150                             {
   151                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
   152                                        a, b, c, d, e, f, cypher, result);
   153                                 return PR_FALSE;
   154                             }
   155                         }
   156                     }
   157                 }
   158             }
   159         }
   160     }
   162     printf("PASS\n");
   163     return PR_TRUE;
   164 }
   166     static struct
   167     {
   168         const char *plaintext;
   169         const char *cyphertext;
   170     } array[] =
   171       {
   172           /* Cyphertexts generated with uuenview 0.5.13 */
   173           { " ", "IA==" },
   174           { ".", "Lg==" },
   175           { "/", "Lw==" },
   176           { "C", "Qw==" },
   177           { "H", "SA==" },
   178           { "S", "Uw==" },
   179           { "^", "Xg==" },
   180           { "a", "YQ==" },
   181           { "o", "bw==" },
   182           { "t", "dA==" },
   184           { "AB", "QUI=" },
   185           { "AH", "QUg=" },
   186           { "AQ", "QVE=" },
   187           { "BD", "QkQ=" },
   188           { "CR", "Q1I=" },
   189           { "CS", "Q1M=" },
   190           { "DB", "REI=" },
   191           { "DC", "REM=" },
   192           { "EK", "RUs=" },
   193           { "ET", "RVQ=" },
   194           { "IM", "SU0=" },
   195           { "JR", "SlI=" },
   196           { "LO", "TE8=" },
   197           { "LW", "TFc=" },
   198           { "ML", "TUw=" },
   199           { "SB", "U0I=" },
   200           { "TO", "VE8=" },
   201           { "VS", "VlM=" },
   202           { "WP", "V1A=" },
   203           /* legitimate two-letter words */
   204           { "ad", "YWQ=" },
   205           { "ah", "YWg=" },
   206           { "am", "YW0=" },
   207           { "an", "YW4=" },
   208           { "as", "YXM=" },
   209           { "at", "YXQ=" },
   210           { "ax", "YXg=" },
   211           { "be", "YmU=" },
   212           { "by", "Ynk=" },
   213           { "do", "ZG8=" },
   214           { "go", "Z28=" },
   215           { "he", "aGU=" },
   216           { "hi", "aGk=" },
   217           { "if", "aWY=" },
   218           { "in", "aW4=" },
   219           { "is", "aXM=" },
   220           { "it", "aXQ=" },
   221           { "me", "bWU=" },
   222           { "my", "bXk=" },
   223           { "no", "bm8=" },
   224           { "of", "b2Y=" },
   225           { "on", "b24=" },
   226           { "or", "b3I=" },
   227           { "ox", "b3g=" },
   228           { "so", "c28=" },
   229           { "to", "dG8=" },
   230           { "up", "dXA=" },
   231           { "us", "dXM=" },
   232           { "we", "d2U=" },
   233           /* all three-letter entries in /usr/dict/words */
   234           { "1st", "MXN0" },
   235           { "2nd", "Mm5k" },
   236           { "3rd", "M3Jk" },
   237           { "4th", "NHRo" },
   238           { "5th", "NXRo" },
   239           { "6th", "NnRo" },
   240           { "7th", "N3Ro" },
   241           { "8th", "OHRo" },
   242           { "9th", "OXRo" },
   243           { "AAA", "QUFB" },
   244           { "AAU", "QUFV" },
   245           { "ABA", "QUJB" },
   246           { "abc", "YWJj" },
   247           { "Abe", "QWJl" },
   248           { "Abo", "QWJv" },
   249           { "ace", "YWNl" },
   250           { "ACM", "QUNN" },
   251           { "ACS", "QUNT" },
   252           { "act", "YWN0" },
   253           { "Ada", "QWRh" },
   254           { "add", "YWRk" },
   255           { "ado", "YWRv" },
   256           { "aft", "YWZ0" },
   257           { "age", "YWdl" },
   258           { "ago", "YWdv" },
   259           { "aid", "YWlk" },
   260           { "ail", "YWls" },
   261           { "aim", "YWlt" },
   262           { "air", "YWly" },
   263           { "ala", "YWxh" },
   264           { "alb", "YWxi" },
   265           { "ale", "YWxl" },
   266           { "Ali", "QWxp" },
   267           { "all", "YWxs" },
   268           { "alp", "YWxw" },
   269           { "A&M", "QSZN" },
   270           { "AMA", "QU1B" },
   271           { "ami", "YW1p" },
   272           { "amp", "YW1w" },
   273           { "Amy", "QW15" },
   274           { "amy", "YW15" },
   275           { "ana", "YW5h" },
   276           { "and", "YW5k" },
   277           { "ani", "YW5p" },
   278           { "Ann", "QW5u" },
   279           { "ant", "YW50" },
   280           { "any", "YW55" },
   281           { "A&P", "QSZQ" },
   282           { "ape", "YXBl" },
   283           { "Apr", "QXBy" },
   284           { "APS", "QVBT" },
   285           { "apt", "YXB0" },
   286           { "arc", "YXJj" },
   287           { "are", "YXJl" },
   288           { "ark", "YXJr" },
   289           { "arm", "YXJt" },
   290           { "art", "YXJ0" },
   291           { "a's", "YSdz" },
   292           { "ash", "YXNo" },
   293           { "ask", "YXNr" },
   294           { "ass", "YXNz" },
   295           { "ate", "YXRl" },
   296           { "Aug", "QXVn" },
   297           { "auk", "YXVr" },
   298           { "Ave", "QXZl" },
   299           { "awe", "YXdl" },
   300           { "awl", "YXds" },
   301           { "awn", "YXdu" },
   302           { "axe", "YXhl" },
   303           { "aye", "YXll" },
   304           { "bad", "YmFk" },
   305           { "bag", "YmFn" },
   306           { "bah", "YmFo" },
   307           { "bam", "YmFt" },
   308           { "ban", "YmFu" },
   309           { "bar", "YmFy" },
   310           { "bat", "YmF0" },
   311           { "bay", "YmF5" },
   312           { "bed", "YmVk" },
   313           { "bee", "YmVl" },
   314           { "beg", "YmVn" },
   315           { "bel", "YmVs" },
   316           { "Ben", "QmVu" },
   317           { "bet", "YmV0" },
   318           { "bey", "YmV5" },
   319           { "bib", "Ymli" },
   320           { "bid", "Ymlk" },
   321           { "big", "Ymln" },
   322           { "bin", "Ymlu" },
   323           { "bit", "Yml0" },
   324           { "biz", "Yml6" },
   325           { "BMW", "Qk1X" },
   326           { "boa", "Ym9h" },
   327           { "bob", "Ym9i" },
   328           { "bog", "Ym9n" },
   329           { "bon", "Ym9u" },
   330           { "boo", "Ym9v" },
   331           { "bop", "Ym9w" },
   332           { "bow", "Ym93" },
   333           { "box", "Ym94" },
   334           { "boy", "Ym95" },
   335           { "b's", "Yidz" },
   336           { "BTL", "QlRM" },
   337           { "BTU", "QlRV" },
   338           { "bub", "YnVi" },
   339           { "bud", "YnVk" },
   340           { "bug", "YnVn" },
   341           { "bum", "YnVt" },
   342           { "bun", "YnVu" },
   343           { "bus", "YnVz" },
   344           { "but", "YnV0" },
   345           { "buy", "YnV5" },
   346           { "bye", "Ynll" },
   347           { "cab", "Y2Fi" },
   348           { "Cal", "Q2Fs" },
   349           { "cam", "Y2Ft" },
   350           { "can", "Y2Fu" },
   351           { "cap", "Y2Fw" },
   352           { "car", "Y2Fy" },
   353           { "cat", "Y2F0" },
   354           { "caw", "Y2F3" },
   355           { "CBS", "Q0JT" },
   356           { "CDC", "Q0RD" },
   357           { "CEQ", "Q0VR" },
   358           { "chi", "Y2hp" },
   359           { "CIA", "Q0lB" },
   360           { "cit", "Y2l0" },
   361           { "cod", "Y29k" },
   362           { "cog", "Y29n" },
   363           { "col", "Y29s" },
   364           { "con", "Y29u" },
   365           { "coo", "Y29v" },
   366           { "cop", "Y29w" },
   367           { "cos", "Y29z" },
   368           { "cot", "Y290" },
   369           { "cow", "Y293" },
   370           { "cox", "Y294" },
   371           { "coy", "Y295" },
   372           { "CPA", "Q1BB" },
   373           { "cpu", "Y3B1" },
   374           { "CRT", "Q1JU" },
   375           { "cry", "Y3J5" },
   376           { "c's", "Yydz" },
   377           { "cub", "Y3Vi" },
   378           { "cud", "Y3Vk" },
   379           { "cue", "Y3Vl" },
   380           { "cup", "Y3Vw" },
   381           { "cur", "Y3Vy" },
   382           { "cut", "Y3V0" },
   383           { "dab", "ZGFi" },
   384           { "dad", "ZGFk" },
   385           { "dam", "ZGFt" },
   386           { "Dan", "RGFu" },
   387           { "Dar", "RGFy" },
   388           { "day", "ZGF5" },
   389           { "Dec", "RGVj" },
   390           { "Dee", "RGVl" },
   391           { "Del", "RGVs" },
   392           { "den", "ZGVu" },
   393           { "Des", "RGVz" },
   394           { "dew", "ZGV3" },
   395           { "dey", "ZGV5" },
   396           { "did", "ZGlk" },
   397           { "die", "ZGll" },
   398           { "dig", "ZGln" },
   399           { "dim", "ZGlt" },
   400           { "din", "ZGlu" },
   401           { "dip", "ZGlw" },
   402           { "Dis", "RGlz" },
   403           { "DNA", "RE5B" },
   404           { "DOD", "RE9E" },
   405           { "doe", "ZG9l" },
   406           { "dog", "ZG9n" },
   407           { "don", "ZG9u" },
   408           { "dot", "ZG90" },
   409           { "Dow", "RG93" },
   410           { "dry", "ZHJ5" },
   411           { "d's", "ZCdz" },
   412           { "dub", "ZHVi" },
   413           { "dud", "ZHVk" },
   414           { "due", "ZHVl" },
   415           { "dug", "ZHVn" },
   416           { "dun", "ZHVu" },
   417           { "dye", "ZHll" },
   418           { "ear", "ZWFy" },
   419           { "eat", "ZWF0" },
   420           { "ebb", "ZWJi" },
   421           { "EDT", "RURU" },
   422           { "eel", "ZWVs" },
   423           { "eft", "ZWZ0" },
   424           { "e.g", "ZS5n" },
   425           { "egg", "ZWdn" },
   426           { "ego", "ZWdv" },
   427           { "eke", "ZWtl" },
   428           { "Eli", "RWxp" },
   429           { "elk", "ZWxr" },
   430           { "ell", "ZWxs" },
   431           { "elm", "ZWxt" },
   432           { "Ely", "RWx5" },
   433           { "end", "ZW5k" },
   434           { "Eng", "RW5n" },
   435           { "EPA", "RVBB" },
   436           { "era", "ZXJh" },
   437           { "ere", "ZXJl" },
   438           { "erg", "ZXJn" },
   439           { "err", "ZXJy" },
   440           { "e's", "ZSdz" },
   441           { "EST", "RVNU" },
   442           { "eta", "ZXRh" },
   443           { "etc", "ZXRj" },
   444           { "Eva", "RXZh" },
   445           { "eve", "ZXZl" },
   446           { "ewe", "ZXdl" },
   447           { "eye", "ZXll" },
   448           { "FAA", "RkFB" },
   449           { "fad", "ZmFk" },
   450           { "fag", "ZmFn" },
   451           { "fan", "ZmFu" },
   452           { "far", "ZmFy" },
   453           { "fat", "ZmF0" },
   454           { "fay", "ZmF5" },
   455           { "FBI", "RkJJ" },
   456           { "FCC", "RkND" },
   457           { "FDA", "RkRB" },
   458           { "Feb", "RmVi" },
   459           { "fed", "ZmVk" },
   460           { "fee", "ZmVl" },
   461           { "few", "ZmV3" },
   462           { "fib", "Zmli" },
   463           { "fig", "Zmln" },
   464           { "fin", "Zmlu" },
   465           { "fir", "Zmly" },
   466           { "fit", "Zml0" },
   467           { "fix", "Zml4" },
   468           { "Flo", "Rmxv" },
   469           { "flu", "Zmx1" },
   470           { "fly", "Zmx5" },
   471           { "FMC", "Rk1D" },
   472           { "fob", "Zm9i" },
   473           { "foe", "Zm9l" },
   474           { "fog", "Zm9n" },
   475           { "fop", "Zm9w" },
   476           { "for", "Zm9y" },
   477           { "fox", "Zm94" },
   478           { "FPC", "RlBD" },
   479           { "fro", "ZnJv" },
   480           { "fry", "ZnJ5" },
   481           { "f's", "Zidz" },
   482           { "FTC", "RlRD" },
   483           { "fum", "ZnVt" },
   484           { "fun", "ZnVu" },
   485           { "fur", "ZnVy" },
   486           { "gab", "Z2Fi" },
   487           { "gad", "Z2Fk" },
   488           { "gag", "Z2Fn" },
   489           { "gal", "Z2Fs" },
   490           { "gam", "Z2Ft" },
   491           { "GAO", "R0FP" },
   492           { "gap", "Z2Fw" },
   493           { "gar", "Z2Fy" },
   494           { "gas", "Z2Fz" },
   495           { "gay", "Z2F5" },
   496           { "gee", "Z2Vl" },
   497           { "gel", "Z2Vs" },
   498           { "gem", "Z2Vt" },
   499           { "get", "Z2V0" },
   500           { "gig", "Z2ln" },
   501           { "Gil", "R2ls" },
   502           { "gin", "Z2lu" },
   503           { "GMT", "R01U" },
   504           { "GNP", "R05Q" },
   505           { "gnu", "Z251" },
   506           { "Goa", "R29h" },
   507           { "gob", "Z29i" },
   508           { "god", "Z29k" },
   509           { "gog", "Z29n" },
   510           { "GOP", "R09Q" },
   511           { "got", "Z290" },
   512           { "GPO", "R1BP" },
   513           { "g's", "Zydz" },
   514           { "GSA", "R1NB" },
   515           { "gum", "Z3Vt" },
   516           { "gun", "Z3Vu" },
   517           { "Gus", "R3Vz" },
   518           { "gut", "Z3V0" },
   519           { "guy", "Z3V5" },
   520           { "gym", "Z3lt" },
   521           { "gyp", "Z3lw" },
   522           { "had", "aGFk" },
   523           { "Hal", "SGFs" },
   524           { "ham", "aGFt" },
   525           { "Han", "SGFu" },
   526           { "hap", "aGFw" },
   527           { "hat", "aGF0" },
   528           { "haw", "aGF3" },
   529           { "hay", "aGF5" },
   530           { "hem", "aGVt" },
   531           { "hen", "aGVu" },
   532           { "her", "aGVy" },
   533           { "hew", "aGV3" },
   534           { "hex", "aGV4" },
   535           { "hey", "aGV5" },
   536           { "hid", "aGlk" },
   537           { "him", "aGlt" },
   538           { "hip", "aGlw" },
   539           { "his", "aGlz" },
   540           { "hit", "aGl0" },
   541           { "hob", "aG9i" },
   542           { "hoc", "aG9j" },
   543           { "hoe", "aG9l" },
   544           { "hog", "aG9n" },
   545           { "hoi", "aG9p" },
   546           { "Hom", "SG9t" },
   547           { "hop", "aG9w" },
   548           { "hot", "aG90" },
   549           { "how", "aG93" },
   550           { "hoy", "aG95" },
   551           { "h's", "aCdz" },
   552           { "hub", "aHVi" },
   553           { "hue", "aHVl" },
   554           { "hug", "aHVn" },
   555           { "huh", "aHVo" },
   556           { "hum", "aHVt" },
   557           { "Hun", "SHVu" },
   558           { "hut", "aHV0" },
   559           { "Ian", "SWFu" },
   560           { "IBM", "SUJN" },
   561           { "Ibn", "SWJu" },
   562           { "ICC", "SUND" },
   563           { "ice", "aWNl" },
   564           { "icy", "aWN5" },
   565           { "I'd", "SSdk" },
   566           { "Ida", "SWRh" },
   567           { "i.e", "aS5l" },
   568           { "iii", "aWlp" },
   569           { "Ike", "SWtl" },
   570           { "ill", "aWxs" },
   571           { "I'm", "SSdt" },
   572           { "imp", "aW1w" },
   573           { "Inc", "SW5j" },
   574           { "ink", "aW5r" },
   575           { "inn", "aW5u" },
   576           { "ion", "aW9u" },
   577           { "Ira", "SXJh" },
   578           { "ire", "aXJl" },
   579           { "irk", "aXJr" },
   580           { "IRS", "SVJT" },
   581           { "i's", "aSdz" },
   582           { "Ito", "SXRv" },
   583           { "ITT", "SVRU" },
   584           { "ivy", "aXZ5" },
   585           { "jab", "amFi" },
   586           { "jag", "amFn" },
   587           { "jam", "amFt" },
   588           { "Jan", "SmFu" },
   589           { "jar", "amFy" },
   590           { "jaw", "amF3" },
   591           { "jay", "amF5" },
   592           { "Jed", "SmVk" },
   593           { "jet", "amV0" },
   594           { "Jew", "SmV3" },
   595           { "jig", "amln" },
   596           { "Jim", "Smlt" },
   597           { "job", "am9i" },
   598           { "Joe", "Sm9l" },
   599           { "jog", "am9n" },
   600           { "Jon", "Sm9u" },
   601           { "jot", "am90" },
   602           { "joy", "am95" },
   603           { "j's", "aidz" },
   604           { "jug", "anVn" },
   605           { "jut", "anV0" },
   606           { "Kay", "S2F5" },
   607           { "keg", "a2Vn" },
   608           { "ken", "a2Vu" },
   609           { "key", "a2V5" },
   610           { "kid", "a2lk" },
   611           { "Kim", "S2lt" },
   612           { "kin", "a2lu" },
   613           { "kit", "a2l0" },
   614           { "k's", "aydz" },
   615           { "lab", "bGFi" },
   616           { "lac", "bGFj" },
   617           { "lad", "bGFk" },
   618           { "lag", "bGFn" },
   619           { "lam", "bGFt" },
   620           { "Lao", "TGFv" },
   621           { "lap", "bGFw" },
   622           { "law", "bGF3" },
   623           { "lax", "bGF4" },
   624           { "lay", "bGF5" },
   625           { "lea", "bGVh" },
   626           { "led", "bGVk" },
   627           { "lee", "bGVl" },
   628           { "leg", "bGVn" },
   629           { "Len", "TGVu" },
   630           { "Leo", "TGVv" },
   631           { "let", "bGV0" },
   632           { "Lev", "TGV2" },
   633           { "Lew", "TGV3" },
   634           { "lew", "bGV3" },
   635           { "lid", "bGlk" },
   636           { "lie", "bGll" },
   637           { "lim", "bGlt" },
   638           { "Lin", "TGlu" },
   639           { "lip", "bGlw" },
   640           { "lit", "bGl0" },
   641           { "Liz", "TGl6" },
   642           { "lob", "bG9i" },
   643           { "log", "bG9n" },
   644           { "lop", "bG9w" },
   645           { "Los", "TG9z" },
   646           { "lot", "bG90" },
   647           { "Lou", "TG91" },
   648           { "low", "bG93" },
   649           { "loy", "bG95" },
   650           { "l's", "bCdz" },
   651           { "LSI", "TFNJ" },
   652           { "Ltd", "THRk" },
   653           { "LTV", "TFRW" },
   654           { "lug", "bHVn" },
   655           { "lux", "bHV4" },
   656           { "lye", "bHll" },
   657           { "Mac", "TWFj" },
   658           { "mad", "bWFk" },
   659           { "Mae", "TWFl" },
   660           { "man", "bWFu" },
   661           { "Mao", "TWFv" },
   662           { "map", "bWFw" },
   663           { "mar", "bWFy" },
   664           { "mat", "bWF0" },
   665           { "maw", "bWF3" },
   666           { "Max", "TWF4" },
   667           { "max", "bWF4" },
   668           { "may", "bWF5" },
   669           { "MBA", "TUJB" },
   670           { "Meg", "TWVn" },
   671           { "Mel", "TWVs" },
   672           { "men", "bWVu" },
   673           { "met", "bWV0" },
   674           { "mew", "bWV3" },
   675           { "mid", "bWlk" },
   676           { "mig", "bWln" },
   677           { "min", "bWlu" },
   678           { "MIT", "TUlU" },
   679           { "mix", "bWl4" },
   680           { "mob", "bW9i" },
   681           { "Moe", "TW9l" },
   682           { "moo", "bW9v" },
   683           { "mop", "bW9w" },
   684           { "mot", "bW90" },
   685           { "mow", "bW93" },
   686           { "MPH", "TVBI" },
   687           { "Mrs", "TXJz" },
   688           { "m's", "bSdz" },
   689           { "mud", "bXVk" },
   690           { "mug", "bXVn" },
   691           { "mum", "bXVt" },
   692           { "nab", "bmFi" },
   693           { "nag", "bmFn" },
   694           { "Nan", "TmFu" },
   695           { "nap", "bmFw" },
   696           { "Nat", "TmF0" },
   697           { "nay", "bmF5" },
   698           { "NBC", "TkJD" },
   699           { "NBS", "TkJT" },
   700           { "NCO", "TkNP" },
   701           { "NCR", "TkNS" },
   702           { "Ned", "TmVk" },
   703           { "nee", "bmVl" },
   704           { "net", "bmV0" },
   705           { "new", "bmV3" },
   706           { "nib", "bmli" },
   707           { "NIH", "TklI" },
   708           { "nil", "bmls" },
   709           { "nip", "bmlw" },
   710           { "nit", "bml0" },
   711           { "NNE", "Tk5F" },
   712           { "NNW", "Tk5X" },
   713           { "nob", "bm9i" },
   714           { "nod", "bm9k" },
   715           { "non", "bm9u" },
   716           { "nor", "bm9y" },
   717           { "not", "bm90" },
   718           { "Nov", "Tm92" },
   719           { "now", "bm93" },
   720           { "NRC", "TlJD" },
   721           { "n's", "bidz" },
   722           { "NSF", "TlNG" },
   723           { "nun", "bnVu" },
   724           { "nut", "bnV0" },
   725           { "NYC", "TllD" },
   726           { "NYU", "TllV" },
   727           { "oaf", "b2Fm" },
   728           { "oak", "b2Fr" },
   729           { "oar", "b2Fy" },
   730           { "oat", "b2F0" },
   731           { "Oct", "T2N0" },
   732           { "odd", "b2Rk" },
   733           { "ode", "b2Rl" },
   734           { "off", "b2Zm" },
   735           { "oft", "b2Z0" },
   736           { "ohm", "b2ht" },
   737           { "oil", "b2ls" },
   738           { "old", "b2xk" },
   739           { "one", "b25l" },
   740           { "opt", "b3B0" },
   741           { "orb", "b3Ji" },
   742           { "ore", "b3Jl" },
   743           { "Orr", "T3Jy" },
   744           { "o's", "bydz" },
   745           { "Ott", "T3R0" },
   746           { "our", "b3Vy" },
   747           { "out", "b3V0" },
   748           { "ova", "b3Zh" },
   749           { "owe", "b3dl" },
   750           { "owl", "b3ds" },
   751           { "own", "b3du" },
   752           { "pad", "cGFk" },
   753           { "pal", "cGFs" },
   754           { "Pam", "UGFt" },
   755           { "pan", "cGFu" },
   756           { "pap", "cGFw" },
   757           { "par", "cGFy" },
   758           { "pat", "cGF0" },
   759           { "paw", "cGF3" },
   760           { "pax", "cGF4" },
   761           { "pay", "cGF5" },
   762           { "Paz", "UGF6" },
   763           { "PBS", "UEJT" },
   764           { "PDP", "UERQ" },
   765           { "pea", "cGVh" },
   766           { "pee", "cGVl" },
   767           { "peg", "cGVn" },
   768           { "pen", "cGVu" },
   769           { "pep", "cGVw" },
   770           { "per", "cGVy" },
   771           { "pet", "cGV0" },
   772           { "pew", "cGV3" },
   773           { "PhD", "UGhE" },
   774           { "phi", "cGhp" },
   775           { "pie", "cGll" },
   776           { "pig", "cGln" },
   777           { "pin", "cGlu" },
   778           { "pip", "cGlw" },
   779           { "pit", "cGl0" },
   780           { "ply", "cGx5" },
   781           { "pod", "cG9k" },
   782           { "Poe", "UG9l" },
   783           { "poi", "cG9p" },
   784           { "pol", "cG9s" },
   785           { "pop", "cG9w" },
   786           { "pot", "cG90" },
   787           { "pow", "cG93" },
   788           { "ppm", "cHBt" },
   789           { "pro", "cHJv" },
   790           { "pry", "cHJ5" },
   791           { "p's", "cCdz" },
   792           { "psi", "cHNp" },
   793           { "PTA", "UFRB" },
   794           { "pub", "cHVi" },
   795           { "PUC", "UFVD" },
   796           { "pug", "cHVn" },
   797           { "pun", "cHVu" },
   798           { "pup", "cHVw" },
   799           { "pus", "cHVz" },
   800           { "put", "cHV0" },
   801           { "PVC", "UFZD" },
   802           { "QED", "UUVE" },
   803           { "q's", "cSdz" },
   804           { "qua", "cXVh" },
   805           { "quo", "cXVv" },
   806           { "Rae", "UmFl" },
   807           { "rag", "cmFn" },
   808           { "raj", "cmFq" },
   809           { "ram", "cmFt" },
   810           { "ran", "cmFu" },
   811           { "rap", "cmFw" },
   812           { "rat", "cmF0" },
   813           { "raw", "cmF3" },
   814           { "ray", "cmF5" },
   815           { "RCA", "UkNB" },
   816           { "R&D", "UiZE" },
   817           { "reb", "cmVi" },
   818           { "red", "cmVk" },
   819           { "rep", "cmVw" },
   820           { "ret", "cmV0" },
   821           { "rev", "cmV2" },
   822           { "Rex", "UmV4" },
   823           { "rho", "cmhv" },
   824           { "rib", "cmli" },
   825           { "rid", "cmlk" },
   826           { "rig", "cmln" },
   827           { "rim", "cmlt" },
   828           { "Rio", "Umlv" },
   829           { "rip", "cmlw" },
   830           { "RNA", "Uk5B" },
   831           { "rob", "cm9i" },
   832           { "rod", "cm9k" },
   833           { "roe", "cm9l" },
   834           { "Ron", "Um9u" },
   835           { "rot", "cm90" },
   836           { "row", "cm93" },
   837           { "Roy", "Um95" },
   838           { "RPM", "UlBN" },
   839           { "r's", "cidz" },
   840           { "rub", "cnVi" },
   841           { "rue", "cnVl" },
   842           { "rug", "cnVn" },
   843           { "rum", "cnVt" },
   844           { "run", "cnVu" },
   845           { "rut", "cnV0" },
   846           { "rye", "cnll" },
   847           { "sac", "c2Fj" },
   848           { "sad", "c2Fk" },
   849           { "sag", "c2Fn" },
   850           { "Sal", "U2Fs" },
   851           { "Sam", "U2Ft" },
   852           { "San", "U2Fu" },
   853           { "Sao", "U2Fv" },
   854           { "sap", "c2Fw" },
   855           { "sat", "c2F0" },
   856           { "saw", "c2F3" },
   857           { "sax", "c2F4" },
   858           { "say", "c2F5" },
   859           { "Sci", "U2Np" },
   860           { "SCM", "U0NN" },
   861           { "sea", "c2Vh" },
   862           { "sec", "c2Vj" },
   863           { "see", "c2Vl" },
   864           { "sen", "c2Vu" },
   865           { "seq", "c2Vx" },
   866           { "set", "c2V0" },
   867           { "sew", "c2V3" },
   868           { "sex", "c2V4" },
   869           { "she", "c2hl" },
   870           { "Shu", "U2h1" },
   871           { "shy", "c2h5" },
   872           { "sib", "c2li" },
   873           { "sic", "c2lj" },
   874           { "sin", "c2lu" },
   875           { "sip", "c2lw" },
   876           { "sir", "c2ly" },
   877           { "sis", "c2lz" },
   878           { "sit", "c2l0" },
   879           { "six", "c2l4" },
   880           { "ski", "c2tp" },
   881           { "sky", "c2t5" },
   882           { "sly", "c2x5" },
   883           { "sob", "c29i" },
   884           { "Soc", "U29j" },
   885           { "sod", "c29k" },
   886           { "Sol", "U29s" },
   887           { "son", "c29u" },
   888           { "sop", "c29w" },
   889           { "sou", "c291" },
   890           { "sow", "c293" },
   891           { "soy", "c295" },
   892           { "spa", "c3Bh" },
   893           { "spy", "c3B5" },
   894           { "Sri", "U3Jp" },
   895           { "s's", "cydz" },
   896           { "SSE", "U1NF" },
   897           { "SST", "U1NU" },
   898           { "SSW", "U1NX" },
   899           { "Stu", "U3R1" },
   900           { "sub", "c3Vi" },
   901           { "sud", "c3Vk" },
   902           { "sue", "c3Vl" },
   903           { "sum", "c3Vt" },
   904           { "sun", "c3Vu" },
   905           { "sup", "c3Vw" },
   906           { "Sus", "U3Vz" },
   907           { "tab", "dGFi" },
   908           { "tad", "dGFk" },
   909           { "tag", "dGFn" },
   910           { "tam", "dGFt" },
   911           { "tan", "dGFu" },
   912           { "tao", "dGFv" },
   913           { "tap", "dGFw" },
   914           { "tar", "dGFy" },
   915           { "tat", "dGF0" },
   916           { "tau", "dGF1" },
   917           { "tax", "dGF4" },
   918           { "tea", "dGVh" },
   919           { "Ted", "VGVk" },
   920           { "ted", "dGVk" },
   921           { "tee", "dGVl" },
   922           { "Tel", "VGVs" },
   923           { "ten", "dGVu" },
   924           { "the", "dGhl" },
   925           { "thy", "dGh5" },
   926           { "tic", "dGlj" },
   927           { "tid", "dGlk" },
   928           { "tie", "dGll" },
   929           { "til", "dGls" },
   930           { "Tim", "VGlt" },
   931           { "tin", "dGlu" },
   932           { "tip", "dGlw" },
   933           { "tit", "dGl0" },
   934           { "TNT", "VE5U" },
   935           { "toe", "dG9l" },
   936           { "tog", "dG9n" },
   937           { "Tom", "VG9t" },
   938           { "ton", "dG9u" },
   939           { "too", "dG9v" },
   940           { "top", "dG9w" },
   941           { "tor", "dG9y" },
   942           { "tot", "dG90" },
   943           { "tow", "dG93" },
   944           { "toy", "dG95" },
   945           { "TRW", "VFJX" },
   946           { "try", "dHJ5" },
   947           { "t's", "dCdz" },
   948           { "TTL", "VFRM" },
   949           { "TTY", "VFRZ" },
   950           { "tub", "dHVi" },
   951           { "tug", "dHVn" },
   952           { "tum", "dHVt" },
   953           { "tun", "dHVu" },
   954           { "TVA", "VFZB" },
   955           { "TWA", "VFdB" },
   956           { "two", "dHdv" },
   957           { "TWX", "VFdY" },
   958           { "ugh", "dWdo" },
   959           { "UHF", "VUhG" },
   960           { "Uri", "VXJp" },
   961           { "urn", "dXJu" },
   962           { "U.S", "VS5T" },
   963           { "u's", "dSdz" },
   964           { "USA", "VVNB" },
   965           { "USC", "VVND" },
   966           { "use", "dXNl" },
   967           { "USN", "VVNO" },
   968           { "van", "dmFu" },
   969           { "vat", "dmF0" },
   970           { "vee", "dmVl" },
   971           { "vet", "dmV0" },
   972           { "vex", "dmV4" },
   973           { "VHF", "VkhG" },
   974           { "via", "dmlh" },
   975           { "vie", "dmll" },
   976           { "vii", "dmlp" },
   977           { "vis", "dmlz" },
   978           { "viz", "dml6" },
   979           { "von", "dm9u" },
   980           { "vow", "dm93" },
   981           { "v's", "didz" },
   982           { "WAC", "V0FD" },
   983           { "wad", "d2Fk" },
   984           { "wag", "d2Fn" },
   985           { "wah", "d2Fo" },
   986           { "wan", "d2Fu" },
   987           { "war", "d2Fy" },
   988           { "was", "d2Fz" },
   989           { "wax", "d2F4" },
   990           { "way", "d2F5" },
   991           { "web", "d2Vi" },
   992           { "wed", "d2Vk" },
   993           { "wee", "d2Vl" },
   994           { "Wei", "V2Vp" },
   995           { "wet", "d2V0" },
   996           { "who", "d2hv" },
   997           { "why", "d2h5" },
   998           { "wig", "d2ln" },
   999           { "win", "d2lu" },
  1000           { "wit", "d2l0" },
  1001           { "woe", "d29l" },
  1002           { "wok", "d29r" },
  1003           { "won", "d29u" },
  1004           { "woo", "d29v" },
  1005           { "wop", "d29w" },
  1006           { "wow", "d293" },
  1007           { "wry", "d3J5" },
  1008           { "w's", "dydz" },
  1009           { "x's", "eCdz" },
  1010           { "yah", "eWFo" },
  1011           { "yak", "eWFr" },
  1012           { "yam", "eWFt" },
  1013           { "yap", "eWFw" },
  1014           { "yaw", "eWF3" },
  1015           { "yea", "eWVh" },
  1016           { "yen", "eWVu" },
  1017           { "yet", "eWV0" },
  1018           { "yin", "eWlu" },
  1019           { "yip", "eWlw" },
  1020           { "yon", "eW9u" },
  1021           { "you", "eW91" },
  1022           { "yow", "eW93" },
  1023           { "y's", "eSdz" },
  1024           { "yuh", "eXVo" },
  1025           { "zag", "emFn" },
  1026           { "Zan", "WmFu" },
  1027           { "zap", "emFw" },
  1028           { "Zen", "WmVu" },
  1029           { "zig", "emln" },
  1030           { "zip", "emlw" },
  1031           { "Zoe", "Wm9l" },
  1032           { "zoo", "em9v" },
  1033           { "z's", "eidz" },
  1034           /* the false rumors file */
  1035           { "\"So when I die, the first thing I will see in heaven is a score list?\"", 
  1036             "IlNvIHdoZW4gSSBkaWUsIHRoZSBmaXJzdCB0aGluZyBJIHdpbGwgc2VlIGluIGhlYXZlbiBpcyBhIHNjb3JlIGxpc3Q/Ig==" },
  1037           { "1st Law of Hacking: leaving is much more difficult than entering.", 
  1038             "MXN0IExhdyBvZiBIYWNraW5nOiBsZWF2aW5nIGlzIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhhbiBlbnRlcmluZy4=" },
  1039           { "2nd Law of Hacking: first in, first out.", 
  1040             "Mm5kIExhdyBvZiBIYWNraW5nOiBmaXJzdCBpbiwgZmlyc3Qgb3V0Lg==" },
  1041           { "3rd Law of Hacking: the last blow counts most.", 
  1042             "M3JkIExhdyBvZiBIYWNraW5nOiB0aGUgbGFzdCBibG93IGNvdW50cyBtb3N0Lg==" },
  1043           { "4th Law of Hacking: you will find the exit at the entrance.", 
  1044             "NHRoIExhdyBvZiBIYWNraW5nOiB5b3Ugd2lsbCBmaW5kIHRoZSBleGl0IGF0IHRoZSBlbnRyYW5jZS4=" },
  1045           { "A chameleon imitating a mail daemon often delivers scrolls of fire.", 
  1046             "QSBjaGFtZWxlb24gaW1pdGF0aW5nIGEgbWFpbCBkYWVtb24gb2Z0ZW4gZGVsaXZlcnMgc2Nyb2xscyBvZiBmaXJlLg==" },
  1047           { "A cockatrice corpse is guaranteed to be untainted!", 
  1048             "QSBjb2NrYXRyaWNlIGNvcnBzZSBpcyBndWFyYW50ZWVkIHRvIGJlIHVudGFpbnRlZCE=" },
  1049           { "A dead cockatrice is just a dead lizard.", 
  1050             "QSBkZWFkIGNvY2thdHJpY2UgaXMganVzdCBhIGRlYWQgbGl6YXJkLg==" },
  1051           { "A dragon is just a snake that ate a scroll of fire.", 
  1052             "QSBkcmFnb24gaXMganVzdCBhIHNuYWtlIHRoYXQgYXRlIGEgc2Nyb2xsIG9mIGZpcmUu" },
  1053           { "A fading corridor enlightens your insight.", 
  1054             "QSBmYWRpbmcgY29ycmlkb3IgZW5saWdodGVucyB5b3VyIGluc2lnaHQu" },
  1055           { "A glowing potion is too hot to drink.", 
  1056             "QSBnbG93aW5nIHBvdGlvbiBpcyB0b28gaG90IHRvIGRyaW5rLg==" },
  1057           { "A good amulet may protect you against guards.", 
  1058             "QSBnb29kIGFtdWxldCBtYXkgcHJvdGVjdCB5b3UgYWdhaW5zdCBndWFyZHMu" },
  1059           { "A lizard corpse is a good thing to turn undead.", 
  1060             "QSBsaXphcmQgY29ycHNlIGlzIGEgZ29vZCB0aGluZyB0byB0dXJuIHVuZGVhZC4=" },
  1061           { "A long worm can be defined recursively. So how should you attack it?", 
  1062             "QSBsb25nIHdvcm0gY2FuIGJlIGRlZmluZWQgcmVjdXJzaXZlbHkuIFNvIGhvdyBzaG91bGQgeW91IGF0dGFjayBpdD8=" },
  1063           { "A monstrous mind is a toy forever.", 
  1064             "QSBtb25zdHJvdXMgbWluZCBpcyBhIHRveSBmb3JldmVyLg==" },
  1065           { "A nymph will be very pleased if you call her by her real name: Lorelei.", 
  1066             "QSBueW1waCB3aWxsIGJlIHZlcnkgcGxlYXNlZCBpZiB5b3UgY2FsbCBoZXIgYnkgaGVyIHJlYWwgbmFtZTogTG9yZWxlaS4=" },
  1067           { "A ring of dungeon master control is a great find.", 
  1068             "QSByaW5nIG9mIGR1bmdlb24gbWFzdGVyIGNvbnRyb2wgaXMgYSBncmVhdCBmaW5kLg==" },
  1069           { "A ring of extra ring finger is useless if not enchanted.", 
  1070             "QSByaW5nIG9mIGV4dHJhIHJpbmcgZmluZ2VyIGlzIHVzZWxlc3MgaWYgbm90IGVuY2hhbnRlZC4=" },
  1071           { "A rope may form a trail in a maze.", 
  1072             "QSByb3BlIG1heSBmb3JtIGEgdHJhaWwgaW4gYSBtYXplLg==" },
  1073           { "A staff may recharge if you drop it for awhile.", 
  1074             "QSBzdGFmZiBtYXkgcmVjaGFyZ2UgaWYgeW91IGRyb3AgaXQgZm9yIGF3aGlsZS4=" },
  1075           { "A visit to the Zoo is very educational; you meet interesting animals.", 
  1076             "QSB2aXNpdCB0byB0aGUgWm9vIGlzIHZlcnkgZWR1Y2F0aW9uYWw7IHlvdSBtZWV0IGludGVyZXN0aW5nIGFuaW1hbHMu" },
  1077           { "A wand of deaf is a more dangerous weapon than a wand of sheep.", 
  1078             "QSB3YW5kIG9mIGRlYWYgaXMgYSBtb3JlIGRhbmdlcm91cyB3ZWFwb24gdGhhbiBhIHdhbmQgb2Ygc2hlZXAu" },
  1079           { "A wand of vibration might bring the whole cave crashing about your ears.", 
  1080             "QSB3YW5kIG9mIHZpYnJhdGlvbiBtaWdodCBicmluZyB0aGUgd2hvbGUgY2F2ZSBjcmFzaGluZyBhYm91dCB5b3VyIGVhcnMu" },
  1081           { "A winner never quits. A quitter never wins.", 
  1082             "QSB3aW5uZXIgbmV2ZXIgcXVpdHMuIEEgcXVpdHRlciBuZXZlciB3aW5zLg==" },
  1083           { "A wish? Okay, make me a fortune cookie!", 
  1084             "QSB3aXNoPyBPa2F5LCBtYWtlIG1lIGEgZm9ydHVuZSBjb29raWUh" },
  1085           { "Afraid of mimics? Try to wear a ring of true seeing.", 
  1086             "QWZyYWlkIG9mIG1pbWljcz8gVHJ5IHRvIHdlYXIgYSByaW5nIG9mIHRydWUgc2VlaW5nLg==" },
  1087           { "All monsters are created evil, but some are more evil than others.", 
  1088             "QWxsIG1vbnN0ZXJzIGFyZSBjcmVhdGVkIGV2aWwsIGJ1dCBzb21lIGFyZSBtb3JlIGV2aWwgdGhhbiBvdGhlcnMu" },
  1089           { "Always attack a floating eye from behind!", 
  1090             "QWx3YXlzIGF0dGFjayBhIGZsb2F0aW5nIGV5ZSBmcm9tIGJlaGluZCE=" },
  1091           { "An elven cloak is always the height of fashion.", 
  1092             "QW4gZWx2ZW4gY2xvYWsgaXMgYWx3YXlzIHRoZSBoZWlnaHQgb2YgZmFzaGlvbi4=" },
  1093           { "Any small object that is accidentally dropped will hide under a larger object.", 
  1094             "QW55IHNtYWxsIG9iamVjdCB0aGF0IGlzIGFjY2lkZW50YWxseSBkcm9wcGVkIHdpbGwgaGlkZSB1bmRlciBhIGxhcmdlciBvYmplY3Qu" },
  1095           { "Balrogs do not appear above level 20.", 
  1096             "QmFscm9ncyBkbyBub3QgYXBwZWFyIGFib3ZlIGxldmVsIDIwLg==" },
  1097           { "Banana peels work especially well against Keystone Kops.", 
  1098             "QmFuYW5hIHBlZWxzIHdvcmsgZXNwZWNpYWxseSB3ZWxsIGFnYWluc3QgS2V5c3RvbmUgS29wcy4=" },
  1099           { "Be careful when eating bananas. Monsters might slip on the peels.", 
  1100             "QmUgY2FyZWZ1bCB3aGVuIGVhdGluZyBiYW5hbmFzLiBNb25zdGVycyBtaWdodCBzbGlwIG9uIHRoZSBwZWVscy4=" },
  1101           { "Better leave the dungeon; otherwise you might get hurt badly.", 
  1102             "QmV0dGVyIGxlYXZlIHRoZSBkdW5nZW9uOyBvdGhlcndpc2UgeW91IG1pZ2h0IGdldCBodXJ0IGJhZGx5Lg==" },
  1103           { "Beware of the potion of nitroglycerin -- it's not for the weak of heart.", 
  1104             "QmV3YXJlIG9mIHRoZSBwb3Rpb24gb2Ygbml0cm9nbHljZXJpbiAtLSBpdCdzIG5vdCBmb3IgdGhlIHdlYWsgb2YgaGVhcnQu" },
  1105           { "Beware: there's always a chance that your wand explodes as you try to zap it!", 
  1106             "QmV3YXJlOiB0aGVyZSdzIGFsd2F5cyBhIGNoYW5jZSB0aGF0IHlvdXIgd2FuZCBleHBsb2RlcyBhcyB5b3UgdHJ5IHRvIHphcCBpdCE=" },
  1107           { "Beyond the 23rd level lies a happy retirement in a room of your own.", 
  1108             "QmV5b25kIHRoZSAyM3JkIGxldmVsIGxpZXMgYSBoYXBweSByZXRpcmVtZW50IGluIGEgcm9vbSBvZiB5b3VyIG93bi4=" },
  1109           { "Changing your suit without dropping your sword? You must be kidding!", 
  1110             "Q2hhbmdpbmcgeW91ciBzdWl0IHdpdGhvdXQgZHJvcHBpbmcgeW91ciBzd29yZD8gWW91IG11c3QgYmUga2lkZGluZyE=" },
  1111           { "Cockatrices might turn themselves to stone faced with a mirror.", 
  1112             "Q29ja2F0cmljZXMgbWlnaHQgdHVybiB0aGVtc2VsdmVzIHRvIHN0b25lIGZhY2VkIHdpdGggYSBtaXJyb3Iu" },
  1113           { "Consumption of home-made food is strictly forbidden in this dungeon.", 
  1114             "Q29uc3VtcHRpb24gb2YgaG9tZS1tYWRlIGZvb2QgaXMgc3RyaWN0bHkgZm9yYmlkZGVuIGluIHRoaXMgZHVuZ2Vvbi4=" },
  1115           { "Dark room? Your chance to develop your photographs!", 
  1116             "RGFyayByb29tPyBZb3VyIGNoYW5jZSB0byBkZXZlbG9wIHlvdXIgcGhvdG9ncmFwaHMh" },
  1117           { "Dark rooms are not *completely* dark: just wait and let your eyes adjust...", 
  1118             "RGFyayByb29tcyBhcmUgbm90ICpjb21wbGV0ZWx5KiBkYXJrOiBqdXN0IHdhaXQgYW5kIGxldCB5b3VyIGV5ZXMgYWRqdXN0Li4u" },
  1119           { "David London sez, \"Hey guys, *WIELD* a lizard corpse against a cockatrice!\"", 
  1120             "RGF2aWQgTG9uZG9uIHNleiwgIkhleSBndXlzLCAqV0lFTEQqIGEgbGl6YXJkIGNvcnBzZSBhZ2FpbnN0IGEgY29ja2F0cmljZSEi" },
  1121           { "Death is just life's way of telling you you've been fired.", 
  1122             "RGVhdGggaXMganVzdCBsaWZlJ3Mgd2F5IG9mIHRlbGxpbmcgeW91IHlvdSd2ZSBiZWVuIGZpcmVkLg==" },
  1123           { "Demi-gods don't need any help from the gods.", 
  1124             "RGVtaS1nb2RzIGRvbid0IG5lZWQgYW55IGhlbHAgZnJvbSB0aGUgZ29kcy4=" },
  1125           { "Demons *HATE* Priests and Priestesses.", 
  1126             "RGVtb25zICpIQVRFKiBQcmllc3RzIGFuZCBQcmllc3Rlc3Nlcy4=" },
  1127           { "Didn't you forget to pay?", 
  1128             "RGlkbid0IHlvdSBmb3JnZXQgdG8gcGF5Pw==" },
  1129           { "Didn't your mother tell you not to eat food off the floor?", 
  1130             "RGlkbid0IHlvdXIgbW90aGVyIHRlbGwgeW91IG5vdCB0byBlYXQgZm9vZCBvZmYgdGhlIGZsb29yPw==" },
  1131           { "Direct a direct hit on your direct opponent, directing in the right direction.", 
  1132             "RGlyZWN0IGEgZGlyZWN0IGhpdCBvbiB5b3VyIGRpcmVjdCBvcHBvbmVudCwgZGlyZWN0aW5nIGluIHRoZSByaWdodCBkaXJlY3Rpb24u" },
  1133           { "Do you want to make more money? Sure, we all do! Join the Fort Ludios guard!", 
  1134             "RG8geW91IHdhbnQgdG8gbWFrZSBtb3JlIG1vbmV5PyBTdXJlLCB3ZSBhbGwgZG8hIEpvaW4gdGhlIEZvcnQgTHVkaW9zIGd1YXJkIQ==" },
  1135           { "Don't eat too much: you might start hiccoughing!", 
  1136             "RG9uJ3QgZWF0IHRvbyBtdWNoOiB5b3UgbWlnaHQgc3RhcnQgaGljY291Z2hpbmch" },
  1137           { "Don't play hack at your work; your boss might hit you!", 
  1138             "RG9uJ3QgcGxheSBoYWNrIGF0IHlvdXIgd29yazsgeW91ciBib3NzIG1pZ2h0IGhpdCB5b3Uh" },
  1139           { "Don't tell a soul you found a secret door, otherwise it isn't a secret anymore.", 
  1140             "RG9uJ3QgdGVsbCBhIHNvdWwgeW91IGZvdW5kIGEgc2VjcmV0IGRvb3IsIG90aGVyd2lzZSBpdCBpc24ndCBhIHNlY3JldCBhbnltb3JlLg==" },
  1141           { "Drinking potions of booze may land you in jail if you are under 21.", 
  1142             "RHJpbmtpbmcgcG90aW9ucyBvZiBib296ZSBtYXkgbGFuZCB5b3UgaW4gamFpbCBpZiB5b3UgYXJlIHVuZGVyIDIxLg==" },
  1143           { "Drop your vanity and get rid of your jewels! Pickpockets about!", 
  1144             "RHJvcCB5b3VyIHZhbml0eSBhbmQgZ2V0IHJpZCBvZiB5b3VyIGpld2VscyEgUGlja3BvY2tldHMgYWJvdXQh" },
  1145           { "Eat 10 cloves of garlic and keep all humans at a two-square distance.", 
  1146             "RWF0IDEwIGNsb3ZlcyBvZiBnYXJsaWMgYW5kIGtlZXAgYWxsIGh1bWFucyBhdCBhIHR3by1zcXVhcmUgZGlzdGFuY2Uu" },
  1147           { "Eels hide under mud. Use a unicorn to clear the water and make them visible.", 
  1148             "RWVscyBoaWRlIHVuZGVyIG11ZC4gVXNlIGEgdW5pY29ybiB0byBjbGVhciB0aGUgd2F0ZXIgYW5kIG1ha2UgdGhlbSB2aXNpYmxlLg==" },
  1149           { "Engrave your wishes with a wand of wishing.", 
  1150             "RW5ncmF2ZSB5b3VyIHdpc2hlcyB3aXRoIGEgd2FuZCBvZiB3aXNoaW5nLg==" },
  1151           { "Eventually you will come to admire the swift elegance of a retreating nymph.", 
  1152             "RXZlbnR1YWxseSB5b3Ugd2lsbCBjb21lIHRvIGFkbWlyZSB0aGUgc3dpZnQgZWxlZ2FuY2Ugb2YgYSByZXRyZWF0aW5nIG55bXBoLg==" },
  1153           { "Ever heard hissing outside? I *knew* you hadn't!", 
  1154             "RXZlciBoZWFyZCBoaXNzaW5nIG91dHNpZGU/IEkgKmtuZXcqIHlvdSBoYWRuJ3Qh" },
  1155           { "Ever lifted a dragon corpse?", 
  1156             "RXZlciBsaWZ0ZWQgYSBkcmFnb24gY29ycHNlPw==" },
  1157           { "Ever seen a leocrotta dancing the tengu?", 
  1158             "RXZlciBzZWVuIGEgbGVvY3JvdHRhIGRhbmNpbmcgdGhlIHRlbmd1Pw==" },
  1159           { "Ever seen your weapon glow plaid?", 
  1160             "RXZlciBzZWVuIHlvdXIgd2VhcG9uIGdsb3cgcGxhaWQ/" },
  1161           { "Ever tamed a shopkeeper?", 
  1162             "RXZlciB0YW1lZCBhIHNob3BrZWVwZXI/" },
  1163           { "Ever tried digging through a Vault Guard?", 
  1164             "RXZlciB0cmllZCBkaWdnaW5nIHRocm91Z2ggYSBWYXVsdCBHdWFyZD8=" },
  1165           { "Ever tried enchanting a rope?", 
  1166             "RXZlciB0cmllZCBlbmNoYW50aW5nIGEgcm9wZT8=" },
  1167           { "Floating eyes can't stand Hawaiian shirts.", 
  1168             "RmxvYXRpbmcgZXllcyBjYW4ndCBzdGFuZCBIYXdhaWlhbiBzaGlydHMu" },
  1169           { "For any remedy there is a misery.", 
  1170             "Rm9yIGFueSByZW1lZHkgdGhlcmUgaXMgYSBtaXNlcnku" },
  1171           { "Giant bats turn into giant vampires.", 
  1172             "R2lhbnQgYmF0cyB0dXJuIGludG8gZ2lhbnQgdmFtcGlyZXMu" },
  1173           { "Good day for overcoming obstacles. Try a steeplechase.", 
  1174             "R29vZCBkYXkgZm9yIG92ZXJjb21pbmcgb2JzdGFjbGVzLiBUcnkgYSBzdGVlcGxlY2hhc2Uu" },
  1175           { "Half Moon tonight. (At least it's better than no Moon at all.)", 
  1176             "SGFsZiBNb29uIHRvbmlnaHQuIChBdCBsZWFzdCBpdCdzIGJldHRlciB0aGFuIG5vIE1vb24gYXQgYWxsLik=" },
  1177           { "Help! I'm being held prisoner in a fortune cookie factory!", 
  1178             "SGVscCEgSSdtIGJlaW5nIGhlbGQgcHJpc29uZXIgaW4gYSBmb3J0dW5lIGNvb2tpZSBmYWN0b3J5IQ==" },
  1179           { "Housecats have nine lives, kittens only one.", 
  1180             "SG91c2VjYXRzIGhhdmUgbmluZSBsaXZlcywga2l0dGVucyBvbmx5IG9uZS4=" },
  1181           { "How long can you tread water?", 
  1182             "SG93IGxvbmcgY2FuIHlvdSB0cmVhZCB3YXRlcj8=" },
  1183           { "Hungry? There is an abundance of food on the next level.", 
  1184             "SHVuZ3J5PyBUaGVyZSBpcyBhbiBhYnVuZGFuY2Ugb2YgZm9vZCBvbiB0aGUgbmV4dCBsZXZlbC4=" },
  1185           { "I guess you've never hit a mail daemon with the Amulet of Yendor...", 
  1186             "SSBndWVzcyB5b3UndmUgbmV2ZXIgaGl0IGEgbWFpbCBkYWVtb24gd2l0aCB0aGUgQW11bGV0IG9mIFllbmRvci4uLg==" },
  1187           { "If you are the shopkeeper, you can take things for free.", 
  1188             "SWYgeW91IGFyZSB0aGUgc2hvcGtlZXBlciwgeW91IGNhbiB0YWtlIHRoaW5ncyBmb3IgZnJlZS4=" },
  1189           { "If you can't learn to do it well, learn to enjoy doing it badly.", 
  1190             "SWYgeW91IGNhbid0IGxlYXJuIHRvIGRvIGl0IHdlbGwsIGxlYXJuIHRvIGVuam95IGRvaW5nIGl0IGJhZGx5Lg==" },
  1191           { "If you thought the Wizard was bad, just wait till you meet the Warlord!", 
  1192             "SWYgeW91IHRob3VnaHQgdGhlIFdpemFyZCB3YXMgYmFkLCBqdXN0IHdhaXQgdGlsbCB5b3UgbWVldCB0aGUgV2FybG9yZCE=" },
  1193           { "If you turn blind, don't expect your dog to be turned into a seeing-eye dog.", 
  1194             "SWYgeW91IHR1cm4gYmxpbmQsIGRvbid0IGV4cGVjdCB5b3VyIGRvZyB0byBiZSB0dXJuZWQgaW50byBhIHNlZWluZy1leWUgZG9nLg==" },
  1195           { "If you want to feel great, you must eat something real big.", 
  1196             "SWYgeW91IHdhbnQgdG8gZmVlbCBncmVhdCwgeW91IG11c3QgZWF0IHNvbWV0aGluZyByZWFsIGJpZy4=" },
  1197           { "If you want to float, you'd better eat a floating eye.", 
  1198             "SWYgeW91IHdhbnQgdG8gZmxvYXQsIHlvdSdkIGJldHRlciBlYXQgYSBmbG9hdGluZyBleWUu" },
  1199           { "If your ghost kills a player, it increases your score.", 
  1200             "SWYgeW91ciBnaG9zdCBraWxscyBhIHBsYXllciwgaXQgaW5jcmVhc2VzIHlvdXIgc2NvcmUu" },
  1201           { "Increase mindpower: Tame your own ghost!", 
  1202             "SW5jcmVhc2UgbWluZHBvd2VyOiBUYW1lIHlvdXIgb3duIGdob3N0IQ==" },
  1203           { "It furthers one to see the great man.", 
  1204             "SXQgZnVydGhlcnMgb25lIHRvIHNlZSB0aGUgZ3JlYXQgbWFuLg==" },
  1205           { "It's easy to overlook a monster in a wood.", 
  1206             "SXQncyBlYXN5IHRvIG92ZXJsb29rIGEgbW9uc3RlciBpbiBhIHdvb2Qu" },
  1207           { "Just below any trapdoor there may be another one. Just keep falling!", 
  1208             "SnVzdCBiZWxvdyBhbnkgdHJhcGRvb3IgdGhlcmUgbWF5IGJlIGFub3RoZXIgb25lLiBKdXN0IGtlZXAgZmFsbGluZyE=" },
  1209           { "Katanas are very sharp; watch you don't cut yourself.", 
  1210             "S2F0YW5hcyBhcmUgdmVyeSBzaGFycDsgd2F0Y2ggeW91IGRvbid0IGN1dCB5b3Vyc2VsZi4=" },
  1211           { "Keep a clear mind: quaff clear potions.", 
  1212             "S2VlcCBhIGNsZWFyIG1pbmQ6IHF1YWZmIGNsZWFyIHBvdGlvbnMu" },
  1213           { "Kicking the terminal doesn't hurt the monsters.", 
  1214             "S2lja2luZyB0aGUgdGVybWluYWwgZG9lc24ndCBodXJ0IHRoZSBtb25zdGVycy4=" },
  1215           { "Killer bees keep appearing till you kill their queen.", 
  1216             "S2lsbGVyIGJlZXMga2VlcCBhcHBlYXJpbmcgdGlsbCB5b3Uga2lsbCB0aGVpciBxdWVlbi4=" },
  1217           { "Killer bunnies can be tamed with carrots only.", 
  1218             "S2lsbGVyIGJ1bm5pZXMgY2FuIGJlIHRhbWVkIHdpdGggY2Fycm90cyBvbmx5Lg==" },
  1219           { "Latest news? Put `rec.games.roguelike.nethack' in your .newsrc!", 
  1220             "TGF0ZXN0IG5ld3M/IFB1dCBgcmVjLmdhbWVzLnJvZ3VlbGlrZS5uZXRoYWNrJyBpbiB5b3VyIC5uZXdzcmMh" },
  1221           { "Learn how to spell. Play NetHack!", 
  1222             "TGVhcm4gaG93IHRvIHNwZWxsLiBQbGF5IE5ldEhhY2sh" },
  1223           { "Leprechauns hide their gold in a secret room.", 
  1224             "TGVwcmVjaGF1bnMgaGlkZSB0aGVpciBnb2xkIGluIGEgc2VjcmV0IHJvb20u" },
  1225           { "Let your fingers do the walking on the yulkjhnb keys.", 
  1226             "TGV0IHlvdXIgZmluZ2VycyBkbyB0aGUgd2Fsa2luZyBvbiB0aGUgeXVsa2pobmIga2V5cy4=" },
  1227           { "Let's face it: this time you're not going to win.", 
  1228             "TGV0J3MgZmFjZSBpdDogdGhpcyB0aW1lIHlvdSdyZSBub3QgZ29pbmcgdG8gd2luLg==" },
  1229           { "Let's have a party, drink a lot of booze.", 
  1230             "TGV0J3MgaGF2ZSBhIHBhcnR5LCBkcmluayBhIGxvdCBvZiBib296ZS4=" },
  1231           { "Liquor sellers do not drink; they hate to see you twice.", 
  1232             "TGlxdW9yIHNlbGxlcnMgZG8gbm90IGRyaW5rOyB0aGV5IGhhdGUgdG8gc2VlIHlvdSB0d2ljZS4=" },
  1233           { "Lunar eclipse tonight. May as well quit now!", 
  1234             "THVuYXIgZWNsaXBzZSB0b25pZ2h0LiBNYXkgYXMgd2VsbCBxdWl0IG5vdyE=" },
  1235           { "Meeting your own ghost decreases your luck considerably!", 
  1236             "TWVldGluZyB5b3VyIG93biBnaG9zdCBkZWNyZWFzZXMgeW91ciBsdWNrIGNvbnNpZGVyYWJseSE=" },
  1237           { "Money to invest? Take it to the local branch of the Magic Memory Vault!", 
  1238             "TW9uZXkgdG8gaW52ZXN0PyBUYWtlIGl0IHRvIHRoZSBsb2NhbCBicmFuY2ggb2YgdGhlIE1hZ2ljIE1lbW9yeSBWYXVsdCE=" },
  1239           { "Monsters come from nowhere to hit you everywhere.", 
  1240             "TW9uc3RlcnMgY29tZSBmcm9tIG5vd2hlcmUgdG8gaGl0IHlvdSBldmVyeXdoZXJlLg==" },
  1241           { "Monsters sleep because you are boring, not because they ever get tired.", 
  1242             "TW9uc3RlcnMgc2xlZXAgYmVjYXVzZSB5b3UgYXJlIGJvcmluZywgbm90IGJlY2F1c2UgdGhleSBldmVyIGdldCB0aXJlZC4=" },
  1243           { "Most monsters prefer minced meat. That's why they are hitting you!", 
  1244             "TW9zdCBtb25zdGVycyBwcmVmZXIgbWluY2VkIG1lYXQuIFRoYXQncyB3aHkgdGhleSBhcmUgaGl0dGluZyB5b3Uh" },
  1245           { "Most of the bugs in NetHack are on the floor.", 
  1246             "TW9zdCBvZiB0aGUgYnVncyBpbiBOZXRIYWNrIGFyZSBvbiB0aGUgZmxvb3Iu" },
  1247           { "Much ado Nothing Happens.", 
  1248             "TXVjaCBhZG8gTm90aGluZyBIYXBwZW5zLg==" },
  1249           { "Multi-player NetHack is a myth.", 
  1250             "TXVsdGktcGxheWVyIE5ldEhhY2sgaXMgYSBteXRoLg==" },
  1251           { "NetHack is addictive. Too late, you're already hooked.", 
  1252             "TmV0SGFjayBpcyBhZGRpY3RpdmUuIFRvbyBsYXRlLCB5b3UncmUgYWxyZWFkeSBob29rZWQu" },
  1253           { "Never ask a shopkeeper for a price list.", 
  1254             "TmV2ZXIgYXNrIGEgc2hvcGtlZXBlciBmb3IgYSBwcmljZSBsaXN0Lg==" },
  1255           { "Never burn a tree, unless you like getting whacked with a +5 shovel.", 
  1256             "TmV2ZXIgYnVybiBhIHRyZWUsIHVubGVzcyB5b3UgbGlrZSBnZXR0aW5nIHdoYWNrZWQgd2l0aCBhICs1IHNob3ZlbC4=" },
  1257           { "Never eat with glowing hands!", 
  1258             "TmV2ZXIgZWF0IHdpdGggZ2xvd2luZyBoYW5kcyE=" },
  1259           { "Never mind the monsters hitting you: they just replace the charwomen.", 
  1260             "TmV2ZXIgbWluZCB0aGUgbW9uc3RlcnMgaGl0dGluZyB5b3U6IHRoZXkganVzdCByZXBsYWNlIHRoZSBjaGFyd29tZW4u" },
  1261           { "Never play leapfrog with a unicorn.", 
  1262             "TmV2ZXIgcGxheSBsZWFwZnJvZyB3aXRoIGEgdW5pY29ybi4=" },
  1263           { "Never step on a cursed engraving.", 
  1264             "TmV2ZXIgc3RlcCBvbiBhIGN1cnNlZCBlbmdyYXZpbmcu" },
  1265           { "Never swim with a camera: there's nothing to take pictures of.", 
  1266             "TmV2ZXIgc3dpbSB3aXRoIGEgY2FtZXJhOiB0aGVyZSdzIG5vdGhpbmcgdG8gdGFrZSBwaWN0dXJlcyBvZi4=" },
  1267           { "Never teach your pet rust monster to fetch.", 
  1268             "TmV2ZXIgdGVhY2ggeW91ciBwZXQgcnVzdCBtb25zdGVyIHRvIGZldGNoLg==" },
  1269           { "Never trust a random generator in magic fields.", 
  1270             "TmV2ZXIgdHJ1c3QgYSByYW5kb20gZ2VuZXJhdG9yIGluIG1hZ2ljIGZpZWxkcy4=" },
  1271           { "Never use a wand of death.", 
  1272             "TmV2ZXIgdXNlIGEgd2FuZCBvZiBkZWF0aC4=" },
  1273           { "No level contains two shops. The maze is no level. So...", 
  1274             "Tm8gbGV2ZWwgY29udGFpbnMgdHdvIHNob3BzLiBUaGUgbWF6ZSBpcyBubyBsZXZlbC4gU28uLi4=" },
  1275           { "No part of this fortune may be reproduced, stored in a retrieval system, ...", 
  1276             "Tm8gcGFydCBvZiB0aGlzIGZvcnR1bmUgbWF5IGJlIHJlcHJvZHVjZWQsIHN0b3JlZCBpbiBhIHJldHJpZXZhbCBzeXN0ZW0sIC4uLg==" },
  1277           { "Not all rumors are as misleading as this one.", 
  1278             "Tm90IGFsbCBydW1vcnMgYXJlIGFzIG1pc2xlYWRpbmcgYXMgdGhpcyBvbmUu" },
  1279           { "Nymphs and nurses like beautiful rings.", 
  1280             "TnltcGhzIGFuZCBudXJzZXMgbGlrZSBiZWF1dGlmdWwgcmluZ3Mu" },
  1281           { "Nymphs are blondes. Are you a gentleman?", 
  1282             "TnltcGhzIGFyZSBibG9uZGVzLiBBcmUgeW91IGEgZ2VudGxlbWFuPw==" },
  1283           { "Offering a unicorn a worthless piece of glass might prove to be fatal!", 
  1284             "T2ZmZXJpbmcgYSB1bmljb3JuIGEgd29ydGhsZXNzIHBpZWNlIG9mIGdsYXNzIG1pZ2h0IHByb3ZlIHRvIGJlIGZhdGFsIQ==" },
  1285           { "Old hackers never die: young ones do.", 
  1286             "T2xkIGhhY2tlcnMgbmV2ZXIgZGllOiB5b3VuZyBvbmVzIGRvLg==" },
  1287           { "One has to leave shops before closing time.", 
  1288             "T25lIGhhcyB0byBsZWF2ZSBzaG9wcyBiZWZvcmUgY2xvc2luZyB0aW1lLg==" },
  1289           { "One homunculus a day keeps the doctor away.", 
  1290             "T25lIGhvbXVuY3VsdXMgYSBkYXkga2VlcHMgdGhlIGRvY3RvciBhd2F5Lg==" },
  1291           { "One level further down somebody is getting killed, right now.", 
  1292             "T25lIGxldmVsIGZ1cnRoZXIgZG93biBzb21lYm9keSBpcyBnZXR0aW5nIGtpbGxlZCwgcmlnaHQgbm93Lg==" },
  1293           { "Only a wizard can use a magic whistle.", 
  1294             "T25seSBhIHdpemFyZCBjYW4gdXNlIGEgbWFnaWMgd2hpc3RsZS4=" },
  1295           { "Only adventurers of evil alignment think of killing their dog.", 
  1296             "T25seSBhZHZlbnR1cmVycyBvZiBldmlsIGFsaWdubWVudCB0aGluayBvZiBraWxsaW5nIHRoZWlyIGRvZy4=" },
  1297           { "Only chaotic evils kill sleeping monsters.", 
  1298             "T25seSBjaGFvdGljIGV2aWxzIGtpbGwgc2xlZXBpbmcgbW9uc3RlcnMu" },
  1299           { "Only real trappers escape traps.", 
  1300             "T25seSByZWFsIHRyYXBwZXJzIGVzY2FwZSB0cmFwcy4=" },
  1301           { "Only real wizards can write scrolls.", 
  1302             "T25seSByZWFsIHdpemFyZHMgY2FuIHdyaXRlIHNjcm9sbHMu" },
  1303           { "Operation OVERKILL has started now.", 
  1304             "T3BlcmF0aW9uIE9WRVJLSUxMIGhhcyBzdGFydGVkIG5vdy4=" },
  1305           { "PLEASE ignore previous rumor.", 
  1306             "UExFQVNFIGlnbm9yZSBwcmV2aW91cyBydW1vci4=" },
  1307           { "Polymorph into an ettin; meet your opponents face to face to face.", 
  1308             "UG9seW1vcnBoIGludG8gYW4gZXR0aW47IG1lZXQgeW91ciBvcHBvbmVudHMgZmFjZSB0byBmYWNlIHRvIGZhY2Uu" },
  1309           { "Praying will frighten demons.", 
  1310             "UHJheWluZyB3aWxsIGZyaWdodGVuIGRlbW9ucy4=" },
  1311           { "Row (3x) that boat gently down the stream, Charon (4x), death is but a dream.", 
  1312             "Um93ICgzeCkgdGhhdCBib2F0IGdlbnRseSBkb3duIHRoZSBzdHJlYW0sIENoYXJvbiAoNHgpLCBkZWF0aCBpcyBidXQgYSBkcmVhbS4=" },
  1313           { "Running is good for your legs.", 
  1314             "UnVubmluZyBpcyBnb29kIGZvciB5b3VyIGxlZ3Mu" },
  1315           { "Screw up your courage! You've screwed up everything else.", 
  1316             "U2NyZXcgdXAgeW91ciBjb3VyYWdlISBZb3UndmUgc2NyZXdlZCB1cCBldmVyeXRoaW5nIGVsc2Uu" },
  1317           { "Seepage? Leaky pipes? Rising damp? Summon the plumber!", 
  1318             "U2VlcGFnZT8gTGVha3kgcGlwZXM/IFJpc2luZyBkYW1wPyBTdW1tb24gdGhlIHBsdW1iZXIh" },
  1319           { "Segmentation fault (core dumped).", 
  1320             "U2VnbWVudGF0aW9uIGZhdWx0IChjb3JlIGR1bXBlZCku" },
  1321           { "Shopkeepers sometimes die from old age.", 
  1322             "U2hvcGtlZXBlcnMgc29tZXRpbWVzIGRpZSBmcm9tIG9sZCBhZ2Uu" },
  1323           { "Some mazes (especially small ones) have no solutions, says man 6 maze.", 
  1324             "U29tZSBtYXplcyAoZXNwZWNpYWxseSBzbWFsbCBvbmVzKSBoYXZlIG5vIHNvbHV0aW9ucywgc2F5cyBtYW4gNiBtYXplLg==" },
  1325           { "Some questions the Sphynx asks just *don't* have any answers.", 
  1326             "U29tZSBxdWVzdGlvbnMgdGhlIFNwaHlueCBhc2tzIGp1c3QgKmRvbid0KiBoYXZlIGFueSBhbnN3ZXJzLg==" },
  1327           { "Sometimes \"mu\" is the answer.", 
  1328             "U29tZXRpbWVzICJtdSIgaXMgdGhlIGFuc3dlci4=" },
  1329           { "Sorry, no fortune this time. Better luck next cookie!", 
  1330             "U29ycnksIG5vIGZvcnR1bmUgdGhpcyB0aW1lLiBCZXR0ZXIgbHVjayBuZXh0IGNvb2tpZSE=" },
  1331           { "Spare your scrolls of make-edible until it's really necessary!", 
  1332             "U3BhcmUgeW91ciBzY3JvbGxzIG9mIG1ha2UtZWRpYmxlIHVudGlsIGl0J3MgcmVhbGx5IG5lY2Vzc2FyeSE=" },
  1333           { "Suddenly, the dungeon will collapse...", 
  1334             "U3VkZGVubHksIHRoZSBkdW5nZW9uIHdpbGwgY29sbGFwc2UuLi4=" },
  1335           { "Taming a mail daemon may cause a system security violation.", 
  1336             "VGFtaW5nIGEgbWFpbCBkYWVtb24gbWF5IGNhdXNlIGEgc3lzdGVtIHNlY3VyaXR5IHZpb2xhdGlvbi4=" },
  1337           { "The crowd was so tough, the Stooges won't play the Dungeon anymore, nyuk nyuk.", 
  1338             "VGhlIGNyb3dkIHdhcyBzbyB0b3VnaCwgdGhlIFN0b29nZXMgd29uJ3QgcGxheSB0aGUgRHVuZ2VvbiBhbnltb3JlLCBueXVrIG55dWsu" },
  1339           { "The leprechauns hide their treasure in a small hidden room.", 
  1340             "VGhlIGxlcHJlY2hhdW5zIGhpZGUgdGhlaXIgdHJlYXN1cmUgaW4gYSBzbWFsbCBoaWRkZW4gcm9vbS4=" },
  1341           { "The longer the wand the better.", 
  1342             "VGhlIGxvbmdlciB0aGUgd2FuZCB0aGUgYmV0dGVyLg==" },
  1343           { "The magic word is \"XYZZY\".", 
  1344             "VGhlIG1hZ2ljIHdvcmQgaXMgIlhZWlpZIi4=" },
  1345           { "The meek shall inherit your bones files.", 
  1346             "VGhlIG1lZWsgc2hhbGwgaW5oZXJpdCB5b3VyIGJvbmVzIGZpbGVzLg==" },
  1347           { "The mines are dark and deep, and I have levels to go before I sleep.", 
  1348             "VGhlIG1pbmVzIGFyZSBkYXJrIGFuZCBkZWVwLCBhbmQgSSBoYXZlIGxldmVscyB0byBnbyBiZWZvcmUgSSBzbGVlcC4=" },
  1349           { "The use of dynamite is dangerous.", 
  1350             "VGhlIHVzZSBvZiBkeW5hbWl0ZSBpcyBkYW5nZXJvdXMu" },
  1351           { "There are no worms in the UNIX version.", 
  1352             "VGhlcmUgYXJlIG5vIHdvcm1zIGluIHRoZSBVTklYIHZlcnNpb24u" },
  1353           { "There is a trap on this level!", 
  1354             "VGhlcmUgaXMgYSB0cmFwIG9uIHRoaXMgbGV2ZWwh" },
  1355           { "They say that Demogorgon, Asmodeus, Orcus, Yeenoghu & Juiblex is no law firm.", 
  1356             "VGhleSBzYXkgdGhhdCBEZW1vZ29yZ29uLCBBc21vZGV1cywgT3JjdXMsIFllZW5vZ2h1ICYgSnVpYmxleCBpcyBubyBsYXcgZmlybS4=" },
  1357           { "They say that Geryon has an evil twin, beware!", 
  1358             "VGhleSBzYXkgdGhhdCBHZXJ5b24gaGFzIGFuIGV2aWwgdHdpbiwgYmV3YXJlIQ==" },
  1359           { "They say that Medusa would make a terrible pet.", 
  1360             "VGhleSBzYXkgdGhhdCBNZWR1c2Egd291bGQgbWFrZSBhIHRlcnJpYmxlIHBldC4=" },
  1361           { "They say that NetHack bugs are Seldon planned.", 
  1362             "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGJ1Z3MgYXJlIFNlbGRvbiBwbGFubmVkLg==" },
  1363           { "They say that NetHack comes in 256 flavors.", 
  1364             "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGNvbWVzIGluIDI1NiBmbGF2b3JzLg==" },
  1365           { "They say that NetHack is just a computer game.", 
  1366             "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIGp1c3QgYSBjb21wdXRlciBnYW1lLg==" },
  1367           { "They say that NetHack is more than just a computer game.", 
  1368             "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG1vcmUgdGhhbiBqdXN0IGEgY29tcHV0ZXIgZ2FtZS4=" },
  1369           { "They say that NetHack is never what it used to be.", 
  1370             "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG5ldmVyIHdoYXQgaXQgdXNlZCB0byBiZS4=" },
  1371           { "They say that a baby dragon is too small to hurt or help you.", 
  1372             "VGhleSBzYXkgdGhhdCBhIGJhYnkgZHJhZ29uIGlzIHRvbyBzbWFsbCB0byBodXJ0IG9yIGhlbHAgeW91Lg==" },
  1373           { "They say that a black pudding is simply a brown pudding gone bad.", 
  1374             "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHB1ZGRpbmcgaXMgc2ltcGx5IGEgYnJvd24gcHVkZGluZyBnb25lIGJhZC4=" },
  1375           { "They say that a black sheep has 3 bags full of wool.", 
  1376             "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHNoZWVwIGhhcyAzIGJhZ3MgZnVsbCBvZiB3b29sLg==" },
  1377           { "They say that a blank scroll is like a blank check.", 
  1378             "VGhleSBzYXkgdGhhdCBhIGJsYW5rIHNjcm9sbCBpcyBsaWtlIGEgYmxhbmsgY2hlY2su" },
  1379           { "They say that a cat named Morris has nine lives.", 
  1380             "VGhleSBzYXkgdGhhdCBhIGNhdCBuYW1lZCBNb3JyaXMgaGFzIG5pbmUgbGl2ZXMu" },
  1381           { "They say that a desperate shopper might pay any price in a shop.", 
  1382             "VGhleSBzYXkgdGhhdCBhIGRlc3BlcmF0ZSBzaG9wcGVyIG1pZ2h0IHBheSBhbnkgcHJpY2UgaW4gYSBzaG9wLg==" },
  1383           { "They say that a diamond dog is everybody's best friend.", 
  1384             "VGhleSBzYXkgdGhhdCBhIGRpYW1vbmQgZG9nIGlzIGV2ZXJ5Ym9keSdzIGJlc3QgZnJpZW5kLg==" },
  1385           { "They say that a dwarf lord can carry a pick-axe because his armor is light.", 
  1386             "VGhleSBzYXkgdGhhdCBhIGR3YXJmIGxvcmQgY2FuIGNhcnJ5IGEgcGljay1heGUgYmVjYXVzZSBoaXMgYXJtb3IgaXMgbGlnaHQu" },
  1387           { "They say that a floating eye can defeat Medusa.", 
  1388             "VGhleSBzYXkgdGhhdCBhIGZsb2F0aW5nIGV5ZSBjYW4gZGVmZWF0IE1lZHVzYS4=" },
  1389           { "They say that a fortune only has 1 line and you can't read between it.", 
  1390             "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lIGFuZCB5b3UgY2FuJ3QgcmVhZCBiZXR3ZWVuIGl0Lg==" },
  1391           { "They say that a fortune only has 1 line, but you can read between it.", 
  1392             "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lLCBidXQgeW91IGNhbiByZWFkIGJldHdlZW4gaXQu" },
  1393           { "They say that a fountain looks nothing like a regularly erupting geyser.", 
  1394             "VGhleSBzYXkgdGhhdCBhIGZvdW50YWluIGxvb2tzIG5vdGhpbmcgbGlrZSBhIHJlZ3VsYXJseSBlcnVwdGluZyBnZXlzZXIu" },
  1395           { "They say that a gold doubloon is worth more than its weight in gold.", 
  1396             "VGhleSBzYXkgdGhhdCBhIGdvbGQgZG91Ymxvb24gaXMgd29ydGggbW9yZSB0aGFuIGl0cyB3ZWlnaHQgaW4gZ29sZC4=" },
  1397           { "They say that a grid bug won't pay a shopkeeper for zapping you in a shop.", 
  1398             "VGhleSBzYXkgdGhhdCBhIGdyaWQgYnVnIHdvbid0IHBheSBhIHNob3BrZWVwZXIgZm9yIHphcHBpbmcgeW91IGluIGEgc2hvcC4=" },
  1399           { "They say that a gypsy could tell your fortune for a price.", 
  1400             "VGhleSBzYXkgdGhhdCBhIGd5cHN5IGNvdWxkIHRlbGwgeW91ciBmb3J0dW5lIGZvciBhIHByaWNlLg==" },
  1401           { "They say that a hacker named Alice once level teleported by using a mirror.", 
  1402             "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBBbGljZSBvbmNlIGxldmVsIHRlbGVwb3J0ZWQgYnkgdXNpbmcgYSBtaXJyb3Iu" },
  1403           { "They say that a hacker named David once slew a giant with a sling and a rock.", 
  1404             "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEYXZpZCBvbmNlIHNsZXcgYSBnaWFudCB3aXRoIGEgc2xpbmcgYW5kIGEgcm9jay4=" },
  1405           { "They say that a hacker named Dorothy once rode a fog cloud to Oz.", 
  1406             "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEb3JvdGh5IG9uY2Ugcm9kZSBhIGZvZyBjbG91ZCB0byBPei4=" },
  1407           { "They say that a hacker named Mary once lost a white sheep in the mazes.", 
  1408             "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBNYXJ5IG9uY2UgbG9zdCBhIHdoaXRlIHNoZWVwIGluIHRoZSBtYXplcy4=" },
  1409           { "They say that a helm of brilliance is not to be taken lightly.", 
  1410             "VGhleSBzYXkgdGhhdCBhIGhlbG0gb2YgYnJpbGxpYW5jZSBpcyBub3QgdG8gYmUgdGFrZW4gbGlnaHRseS4=" },
  1411           { "They say that a hot dog and a hell hound are the same thing.", 
  1412             "VGhleSBzYXkgdGhhdCBhIGhvdCBkb2cgYW5kIGEgaGVsbCBob3VuZCBhcmUgdGhlIHNhbWUgdGhpbmcu" },
  1413           { "They say that a lamp named Aladdin's Lamp contains a djinni with 3 wishes.", 
  1414             "VGhleSBzYXkgdGhhdCBhIGxhbXAgbmFtZWQgQWxhZGRpbidzIExhbXAgY29udGFpbnMgYSBkamlubmkgd2l0aCAzIHdpc2hlcy4=" },
  1415           { "They say that a large dog named Lassie will lead you to the amulet.", 
  1416             "VGhleSBzYXkgdGhhdCBhIGxhcmdlIGRvZyBuYW1lZCBMYXNzaWUgd2lsbCBsZWFkIHlvdSB0byB0aGUgYW11bGV0Lg==" },
  1417           { "They say that a long sword is not a light sword.", 
  1418             "VGhleSBzYXkgdGhhdCBhIGxvbmcgc3dvcmQgaXMgbm90IGEgbGlnaHQgc3dvcmQu" },
  1419           { "They say that a manes won't mince words with you.", 
  1420             "VGhleSBzYXkgdGhhdCBhIG1hbmVzIHdvbid0IG1pbmNlIHdvcmRzIHdpdGggeW91Lg==" },
  1421           { "They say that a mind is a terrible thing to waste.", 
  1422             "VGhleSBzYXkgdGhhdCBhIG1pbmQgaXMgYSB0ZXJyaWJsZSB0aGluZyB0byB3YXN0ZS4=" },
  1423           { "They say that a plain nymph will only wear a wire ring in one ear.", 
  1424             "VGhleSBzYXkgdGhhdCBhIHBsYWluIG55bXBoIHdpbGwgb25seSB3ZWFyIGEgd2lyZSByaW5nIGluIG9uZSBlYXIu" },
  1425           { "They say that a plumed hat could be a previously used crested helmet.", 
  1426             "VGhleSBzYXkgdGhhdCBhIHBsdW1lZCBoYXQgY291bGQgYmUgYSBwcmV2aW91c2x5IHVzZWQgY3Jlc3RlZCBoZWxtZXQu" },
  1427           { "They say that a potion of oil is difficult to grasp.", 
  1428             "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiBvaWwgaXMgZGlmZmljdWx0IHRvIGdyYXNwLg==" },
  1429           { "They say that a potion of yogurt is a cancelled potion of sickness.", 
  1430             "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiB5b2d1cnQgaXMgYSBjYW5jZWxsZWQgcG90aW9uIG9mIHNpY2tuZXNzLg==" },
  1431           { "They say that a purple worm is not a baby purple dragon.", 
  1432             "VGhleSBzYXkgdGhhdCBhIHB1cnBsZSB3b3JtIGlzIG5vdCBhIGJhYnkgcHVycGxlIGRyYWdvbi4=" },
  1433           { "They say that a quivering blob tastes different than a gelatinous cube.", 
  1434             "VGhleSBzYXkgdGhhdCBhIHF1aXZlcmluZyBibG9iIHRhc3RlcyBkaWZmZXJlbnQgdGhhbiBhIGdlbGF0aW5vdXMgY3ViZS4=" },
  1435           { "They say that a runed broadsword named Stormbringer attracts vortices.", 
  1436             "VGhleSBzYXkgdGhhdCBhIHJ1bmVkIGJyb2Fkc3dvcmQgbmFtZWQgU3Rvcm1icmluZ2VyIGF0dHJhY3RzIHZvcnRpY2VzLg==" },
  1437           { "They say that a scroll of summoning has other names.", 
  1438             "VGhleSBzYXkgdGhhdCBhIHNjcm9sbCBvZiBzdW1tb25pbmcgaGFzIG90aGVyIG5hbWVzLg==" },
  1439           { "They say that a shaman can bestow blessings but usually doesn't.", 
  1440             "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiBjYW4gYmVzdG93IGJsZXNzaW5ncyBidXQgdXN1YWxseSBkb2Vzbid0Lg==" },
  1441           { "They say that a shaman will bless you for an eye of newt and wing of bat.", 
  1442             "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiB3aWxsIGJsZXNzIHlvdSBmb3IgYW4gZXllIG9mIG5ld3QgYW5kIHdpbmcgb2YgYmF0Lg==" },
  1443           { "They say that a shimmering gold shield is not a polished silver shield.", 
  1444             "VGhleSBzYXkgdGhhdCBhIHNoaW1tZXJpbmcgZ29sZCBzaGllbGQgaXMgbm90IGEgcG9saXNoZWQgc2lsdmVyIHNoaWVsZC4=" },
  1445           { "They say that a spear will hit a neo-otyugh. (Do YOU know what that is?)", 
  1446             "VGhleSBzYXkgdGhhdCBhIHNwZWFyIHdpbGwgaGl0IGEgbmVvLW90eXVnaC4gKERvIFlPVSBrbm93IHdoYXQgdGhhdCBpcz8p" },
  1447           { "They say that a spotted dragon is the ultimate shape changer.", 
  1448             "VGhleSBzYXkgdGhhdCBhIHNwb3R0ZWQgZHJhZ29uIGlzIHRoZSB1bHRpbWF0ZSBzaGFwZSBjaGFuZ2VyLg==" },
  1449           { "They say that a stethoscope is no good if you can only hear your heartbeat.", 
  1450             "VGhleSBzYXkgdGhhdCBhIHN0ZXRob3Njb3BlIGlzIG5vIGdvb2QgaWYgeW91IGNhbiBvbmx5IGhlYXIgeW91ciBoZWFydGJlYXQu" },
  1451           { "They say that a succubus named Suzy will sometimes warn you of danger.", 
  1452             "VGhleSBzYXkgdGhhdCBhIHN1Y2N1YnVzIG5hbWVkIFN1enkgd2lsbCBzb21ldGltZXMgd2FybiB5b3Ugb2YgZGFuZ2VyLg==" },
  1453           { "They say that a wand of cancellation is not like a wand of polymorph.", 
  1454             "VGhleSBzYXkgdGhhdCBhIHdhbmQgb2YgY2FuY2VsbGF0aW9uIGlzIG5vdCBsaWtlIGEgd2FuZCBvZiBwb2x5bW9ycGgu" },
  1455           { "They say that a wood golem named Pinocchio would be easy to control.", 
  1456             "VGhleSBzYXkgdGhhdCBhIHdvb2QgZ29sZW0gbmFtZWQgUGlub2NjaGlvIHdvdWxkIGJlIGVhc3kgdG8gY29udHJvbC4=" },
  1457           { "They say that after killing a dragon it's time for a change of scenery.", 
  1458             "VGhleSBzYXkgdGhhdCBhZnRlciBraWxsaW5nIGEgZHJhZ29uIGl0J3MgdGltZSBmb3IgYSBjaGFuZ2Ugb2Ygc2NlbmVyeS4=" },
  1459           { "They say that an amulet of strangulation is worse than ring around the collar.", 
  1460             "VGhleSBzYXkgdGhhdCBhbiBhbXVsZXQgb2Ygc3RyYW5ndWxhdGlvbiBpcyB3b3JzZSB0aGFuIHJpbmcgYXJvdW5kIHRoZSBjb2xsYXIu" },
  1461           { "They say that an attic is the best place to hide your toys.", 
  1462             "VGhleSBzYXkgdGhhdCBhbiBhdHRpYyBpcyB0aGUgYmVzdCBwbGFjZSB0byBoaWRlIHlvdXIgdG95cy4=" },
  1463           { "They say that an axe named Cleaver once belonged to a hacker named Beaver.", 
  1464             "VGhleSBzYXkgdGhhdCBhbiBheGUgbmFtZWQgQ2xlYXZlciBvbmNlIGJlbG9uZ2VkIHRvIGEgaGFja2VyIG5hbWVkIEJlYXZlci4=" },
  1465           { "They say that an eye of newt and a wing of bat are double the trouble.", 
  1466             "VGhleSBzYXkgdGhhdCBhbiBleWUgb2YgbmV3dCBhbmQgYSB3aW5nIG9mIGJhdCBhcmUgZG91YmxlIHRoZSB0cm91YmxlLg==" },
  1467           { "They say that an incubus named Izzy sometimes makes women feel sensitive.", 
  1468             "VGhleSBzYXkgdGhhdCBhbiBpbmN1YnVzIG5hbWVkIEl6enkgc29tZXRpbWVzIG1ha2VzIHdvbWVuIGZlZWwgc2Vuc2l0aXZlLg==" },
  1469           { "They say that an opulent throne room is rarely a place to wish you'd be in.", 
  1470             "VGhleSBzYXkgdGhhdCBhbiBvcHVsZW50IHRocm9uZSByb29tIGlzIHJhcmVseSBhIHBsYWNlIHRvIHdpc2ggeW91J2QgYmUgaW4u" },
  1471           { "They say that an unlucky hacker once had a nose bleed at an altar and died.", 
  1472             "VGhleSBzYXkgdGhhdCBhbiB1bmx1Y2t5IGhhY2tlciBvbmNlIGhhZCBhIG5vc2UgYmxlZWQgYXQgYW4gYWx0YXIgYW5kIGRpZWQu" },
  1473           { "They say that and they say this but they never say never, never!", 
  1474             "VGhleSBzYXkgdGhhdCBhbmQgdGhleSBzYXkgdGhpcyBidXQgdGhleSBuZXZlciBzYXkgbmV2ZXIsIG5ldmVyIQ==" },
  1475           { "They say that any quantum mechanic knows that speed kills.", 
  1476             "VGhleSBzYXkgdGhhdCBhbnkgcXVhbnR1bSBtZWNoYW5pYyBrbm93cyB0aGF0IHNwZWVkIGtpbGxzLg==" },
  1477           { "They say that applying a unicorn horn means you've missed the point.", 
  1478             "VGhleSBzYXkgdGhhdCBhcHBseWluZyBhIHVuaWNvcm4gaG9ybiBtZWFucyB5b3UndmUgbWlzc2VkIHRoZSBwb2ludC4=" },
  1479           { "They say that blue stones are radioactive, beware.", 
  1480             "VGhleSBzYXkgdGhhdCBibHVlIHN0b25lcyBhcmUgcmFkaW9hY3RpdmUsIGJld2FyZS4=" },
  1481           { "They say that building a dungeon is a team effort.", 
  1482             "VGhleSBzYXkgdGhhdCBidWlsZGluZyBhIGR1bmdlb24gaXMgYSB0ZWFtIGVmZm9ydC4=" },
  1483           { "They say that chaotic characters never get a kick out of altars.", 
  1484             "VGhleSBzYXkgdGhhdCBjaGFvdGljIGNoYXJhY3RlcnMgbmV2ZXIgZ2V0IGEga2ljayBvdXQgb2YgYWx0YXJzLg==" },
  1485           { "They say that collapsing a dungeon often creates a panic.", 
  1486             "VGhleSBzYXkgdGhhdCBjb2xsYXBzaW5nIGEgZHVuZ2VvbiBvZnRlbiBjcmVhdGVzIGEgcGFuaWMu" },
  1487           { "They say that counting your eggs before they hatch shows that you care.", 
  1488             "VGhleSBzYXkgdGhhdCBjb3VudGluZyB5b3VyIGVnZ3MgYmVmb3JlIHRoZXkgaGF0Y2ggc2hvd3MgdGhhdCB5b3UgY2FyZS4=" },
  1489           { "They say that dipping a bag of tricks in a fountain won't make it an icebox.", 
  1490             "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGEgYmFnIG9mIHRyaWNrcyBpbiBhIGZvdW50YWluIHdvbid0IG1ha2UgaXQgYW4gaWNlYm94Lg==" },
  1491           { "They say that dipping an eel and brown mold in hot water makes bouillabaisse.", 
  1492             "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGFuIGVlbCBhbmQgYnJvd24gbW9sZCBpbiBob3Qgd2F0ZXIgbWFrZXMgYm91aWxsYWJhaXNzZS4=" },
  1493           { "They say that donating a doubloon is extremely pious charity.", 
  1494             "VGhleSBzYXkgdGhhdCBkb25hdGluZyBhIGRvdWJsb29uIGlzIGV4dHJlbWVseSBwaW91cyBjaGFyaXR5Lg==" },
  1495           { "They say that eating royal jelly attracts grizzly owlbears.", 
  1496             "VGhleSBzYXkgdGhhdCBlYXRpbmcgcm95YWwgamVsbHkgYXR0cmFjdHMgZ3JpenpseSBvd2xiZWFycy4=" },
  1497           { "They say that eggs, pancakes and juice are just a mundane breakfast.", 
  1498             "VGhleSBzYXkgdGhhdCBlZ2dzLCBwYW5jYWtlcyBhbmQganVpY2UgYXJlIGp1c3QgYSBtdW5kYW5lIGJyZWFrZmFzdC4=" },
  1499           { "They say that everyone knows why Medusa stands alone in the dark.", 
  1500             "VGhleSBzYXkgdGhhdCBldmVyeW9uZSBrbm93cyB3aHkgTWVkdXNhIHN0YW5kcyBhbG9uZSBpbiB0aGUgZGFyay4=" },
  1501           { "They say that everyone wanted rec.games.hack to undergo a name change.", 
  1502             "VGhleSBzYXkgdGhhdCBldmVyeW9uZSB3YW50ZWQgcmVjLmdhbWVzLmhhY2sgdG8gdW5kZXJnbyBhIG5hbWUgY2hhbmdlLg==" },
  1503           { "They say that finding a winning strategy is a deliberate move on your part.", 
  1504             "VGhleSBzYXkgdGhhdCBmaW5kaW5nIGEgd2lubmluZyBzdHJhdGVneSBpcyBhIGRlbGliZXJhdGUgbW92ZSBvbiB5b3VyIHBhcnQu" },
  1505           { "They say that finding worthless glass is worth something.", 
  1506             "VGhleSBzYXkgdGhhdCBmaW5kaW5nIHdvcnRobGVzcyBnbGFzcyBpcyB3b3J0aCBzb21ldGhpbmcu" },
  1507           { "They say that fortune cookies are food for thought.", 
  1508             "VGhleSBzYXkgdGhhdCBmb3J0dW5lIGNvb2tpZXMgYXJlIGZvb2QgZm9yIHRob3VnaHQu" },
  1509           { "They say that gold is only wasted on a pet dragon.", 
  1510             "VGhleSBzYXkgdGhhdCBnb2xkIGlzIG9ubHkgd2FzdGVkIG9uIGEgcGV0IGRyYWdvbi4=" },
  1511           { "They say that good things come to those that wait.", 
  1512             "VGhleSBzYXkgdGhhdCBnb29kIHRoaW5ncyBjb21lIHRvIHRob3NlIHRoYXQgd2FpdC4=" },
  1513           { "They say that greased objects will slip out of monsters' hands.", 
  1514             "VGhleSBzYXkgdGhhdCBncmVhc2VkIG9iamVjdHMgd2lsbCBzbGlwIG91dCBvZiBtb25zdGVycycgaGFuZHMu" },
  1515           { "They say that if you can't spell then you'll wish you had a spell book.", 
  1516             "VGhleSBzYXkgdGhhdCBpZiB5b3UgY2FuJ3Qgc3BlbGwgdGhlbiB5b3UnbGwgd2lzaCB5b3UgaGFkIGEgc3BlbGwgYm9vay4=" },
  1517           { "They say that if you live by the sword, you'll die by the sword.", 
  1518             "VGhleSBzYXkgdGhhdCBpZiB5b3UgbGl2ZSBieSB0aGUgc3dvcmQsIHlvdSdsbCBkaWUgYnkgdGhlIHN3b3JkLg==" },
  1519           { "They say that if you play like a monster you'll have a better game.", 
  1520             "VGhleSBzYXkgdGhhdCBpZiB5b3UgcGxheSBsaWtlIGEgbW9uc3RlciB5b3UnbGwgaGF2ZSBhIGJldHRlciBnYW1lLg==" },
  1521           { "They say that if you sleep with a demon you might awake with a headache.", 
  1522             "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc2xlZXAgd2l0aCBhIGRlbW9uIHlvdSBtaWdodCBhd2FrZSB3aXRoIGEgaGVhZGFjaGUu" },
  1523           { "They say that if you step on a crack you could break your mother's back.", 
  1524             "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc3RlcCBvbiBhIGNyYWNrIHlvdSBjb3VsZCBicmVhayB5b3VyIG1vdGhlcidzIGJhY2su" },
  1525           { "They say that if you're invisible you can still be heard!", 
  1526             "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgaW52aXNpYmxlIHlvdSBjYW4gc3RpbGwgYmUgaGVhcmQh" },
  1527           { "They say that if you're lucky you can feel the runes on a scroll.", 
  1528             "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgbHVja3kgeW91IGNhbiBmZWVsIHRoZSBydW5lcyBvbiBhIHNjcm9sbC4=" },
  1529           { "They say that in the big picture gold is only small change.", 
  1530             "VGhleSBzYXkgdGhhdCBpbiB0aGUgYmlnIHBpY3R1cmUgZ29sZCBpcyBvbmx5IHNtYWxsIGNoYW5nZS4=" },
  1531           { "They say that in the dungeon it's not what you know that really matters.", 
  1532             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBpdCdzIG5vdCB3aGF0IHlvdSBrbm93IHRoYXQgcmVhbGx5IG1hdHRlcnMu" },
  1533           { "They say that in the dungeon moon rocks are really dilithium crystals.", 
  1534             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBtb29uIHJvY2tzIGFyZSByZWFsbHkgZGlsaXRoaXVtIGNyeXN0YWxzLg==" },
  1535           { "They say that in the dungeon the boorish customer is never right.", 
  1536             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB0aGUgYm9vcmlzaCBjdXN0b21lciBpcyBuZXZlciByaWdodC4=" },
  1537           { "They say that in the dungeon you don't need a watch to tell time.", 
  1538             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgZG9uJ3QgbmVlZCBhIHdhdGNoIHRvIHRlbGwgdGltZS4=" },
  1539           { "They say that in the dungeon you need something old, new, burrowed and blue.", 
  1540             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgbmVlZCBzb21ldGhpbmcgb2xkLCBuZXcsIGJ1cnJvd2VkIGFuZCBibHVlLg==" },
  1541           { "They say that in the dungeon you should always count your blessings.", 
  1542             "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3Ugc2hvdWxkIGFsd2F5cyBjb3VudCB5b3VyIGJsZXNzaW5ncy4=" },
  1543           { "They say that iron golem plate mail isn't worth wishing for.", 
  1544             "VGhleSBzYXkgdGhhdCBpcm9uIGdvbGVtIHBsYXRlIG1haWwgaXNuJ3Qgd29ydGggd2lzaGluZyBmb3Iu" },
  1545           { "They say that it takes four quarterstaffs to make one staff.", 
  1546             "VGhleSBzYXkgdGhhdCBpdCB0YWtlcyBmb3VyIHF1YXJ0ZXJzdGFmZnMgdG8gbWFrZSBvbmUgc3RhZmYu" },
  1547           { "They say that it's not over till the fat ladies sing.", 
  1548             "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWRpZXMgc2luZy4=" },
  1549           { "They say that it's not over till the fat lady shouts `Off with its head'.", 
  1550             "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWR5IHNob3V0cyBgT2ZmIHdpdGggaXRzIGhlYWQnLg==" },
  1551           { "They say that kicking a heavy statue is really a dumb move.", 
  1552             "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgaGVhdnkgc3RhdHVlIGlzIHJlYWxseSBhIGR1bWIgbW92ZS4=" },
  1553           { "They say that kicking a valuable gem doesn't seem to make sense.", 
  1554             "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgdmFsdWFibGUgZ2VtIGRvZXNuJ3Qgc2VlbSB0byBtYWtlIHNlbnNlLg==" },
  1555           { "They say that leprechauns know Latin and you should too.", 
  1556             "VGhleSBzYXkgdGhhdCBsZXByZWNoYXVucyBrbm93IExhdGluIGFuZCB5b3Ugc2hvdWxkIHRvby4=" },
  1557           { "They say that minotaurs get lost outside of the mazes.", 
  1558             "VGhleSBzYXkgdGhhdCBtaW5vdGF1cnMgZ2V0IGxvc3Qgb3V0c2lkZSBvZiB0aGUgbWF6ZXMu" },
  1559           { "They say that most trolls are born again.", 
  1560             "VGhleSBzYXkgdGhhdCBtb3N0IHRyb2xscyBhcmUgYm9ybiBhZ2Fpbi4=" },
  1561           { "They say that naming your cat Garfield will make you more attractive.", 
  1562             "VGhleSBzYXkgdGhhdCBuYW1pbmcgeW91ciBjYXQgR2FyZmllbGQgd2lsbCBtYWtlIHlvdSBtb3JlIGF0dHJhY3RpdmUu" },
  1563           { "They say that no one knows everything about everything in the dungeon.", 
  1564             "VGhleSBzYXkgdGhhdCBubyBvbmUga25vd3MgZXZlcnl0aGluZyBhYm91dCBldmVyeXRoaW5nIGluIHRoZSBkdW5nZW9uLg==" },
  1565           { "They say that no one plays NetHack just for the fun of it.", 
  1566             "VGhleSBzYXkgdGhhdCBubyBvbmUgcGxheXMgTmV0SGFjayBqdXN0IGZvciB0aGUgZnVuIG9mIGl0Lg==" },
  1567           { "They say that no one really subscribes to rec.games.roguelike.nethack.", 
  1568             "VGhleSBzYXkgdGhhdCBubyBvbmUgcmVhbGx5IHN1YnNjcmliZXMgdG8gcmVjLmdhbWVzLnJvZ3VlbGlrZS5uZXRoYWNrLg==" },
  1569           { "They say that no one will admit to starting a rumor.", 
  1570             "VGhleSBzYXkgdGhhdCBubyBvbmUgd2lsbCBhZG1pdCB0byBzdGFydGluZyBhIHJ1bW9yLg==" },
  1571           { "They say that nurses sometimes carry scalpels and never use them.", 
  1572             "VGhleSBzYXkgdGhhdCBudXJzZXMgc29tZXRpbWVzIGNhcnJ5IHNjYWxwZWxzIGFuZCBuZXZlciB1c2UgdGhlbS4=" },
  1573           { "They say that once you've met one wizard you've met them all.", 
  1574             "VGhleSBzYXkgdGhhdCBvbmNlIHlvdSd2ZSBtZXQgb25lIHdpemFyZCB5b3UndmUgbWV0IHRoZW0gYWxsLg==" },
  1575           { "They say that one troll is worth 10,000 newts.", 
  1576             "VGhleSBzYXkgdGhhdCBvbmUgdHJvbGwgaXMgd29ydGggMTAsMDAwIG5ld3RzLg==" },
  1577           { "They say that only David can find the zoo!", 
  1578             "VGhleSBzYXkgdGhhdCBvbmx5IERhdmlkIGNhbiBmaW5kIHRoZSB6b28h" },
  1579           { "They say that only angels play their harps for their pets.", 
  1580             "VGhleSBzYXkgdGhhdCBvbmx5IGFuZ2VscyBwbGF5IHRoZWlyIGhhcnBzIGZvciB0aGVpciBwZXRzLg==" },
  1581           { "They say that only big spenders carry gold.", 
  1582             "VGhleSBzYXkgdGhhdCBvbmx5IGJpZyBzcGVuZGVycyBjYXJyeSBnb2xkLg==" },
  1583           { "They say that orc shamans are healthy, wealthy and wise.", 
  1584             "VGhleSBzYXkgdGhhdCBvcmMgc2hhbWFucyBhcmUgaGVhbHRoeSwgd2VhbHRoeSBhbmQgd2lzZS4=" },
  1585           { "They say that playing NetHack is like walking into a death trap.", 
  1586             "VGhleSBzYXkgdGhhdCBwbGF5aW5nIE5ldEhhY2sgaXMgbGlrZSB3YWxraW5nIGludG8gYSBkZWF0aCB0cmFwLg==" },
  1587           { "They say that problem breathing is best treated by a proper diet.", 
  1588             "VGhleSBzYXkgdGhhdCBwcm9ibGVtIGJyZWF0aGluZyBpcyBiZXN0IHRyZWF0ZWQgYnkgYSBwcm9wZXIgZGlldC4=" },
  1589           { "They say that quaffing many potions of levitation can give you a headache.", 
  1590             "VGhleSBzYXkgdGhhdCBxdWFmZmluZyBtYW55IHBvdGlvbnMgb2YgbGV2aXRhdGlvbiBjYW4gZ2l2ZSB5b3UgYSBoZWFkYWNoZS4=" },
  1591           { "They say that queen bees get that way by eating royal jelly.", 
  1592             "VGhleSBzYXkgdGhhdCBxdWVlbiBiZWVzIGdldCB0aGF0IHdheSBieSBlYXRpbmcgcm95YWwgamVsbHku" },
  1593           { "They say that reading a scare monster scroll is the same as saying Elbereth.", 
  1594             "VGhleSBzYXkgdGhhdCByZWFkaW5nIGEgc2NhcmUgbW9uc3RlciBzY3JvbGwgaXMgdGhlIHNhbWUgYXMgc2F5aW5nIEVsYmVyZXRoLg==" },
  1595           { "They say that real hackers always are controlled.", 
  1596             "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgYWx3YXlzIGFyZSBjb250cm9sbGVkLg==" },
  1597           { "They say that real hackers never sleep.", 
  1598             "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgbmV2ZXIgc2xlZXAu" },
  1599           { "They say that shopkeepers are insured by Croesus himself!", 
  1600             "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBhcmUgaW5zdXJlZCBieSBDcm9lc3VzIGhpbXNlbGYh" },
  1601           { "They say that shopkeepers never carry more than 20 gold pieces, at night.", 
  1602             "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBjYXJyeSBtb3JlIHRoYW4gMjAgZ29sZCBwaWVjZXMsIGF0IG5pZ2h0Lg==" },
  1603           { "They say that shopkeepers never sell blessed potions of invisibility.", 
  1604             "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBzZWxsIGJsZXNzZWQgcG90aW9ucyBvZiBpbnZpc2liaWxpdHku" },
  1605           { "They say that soldiers wear kid gloves and silly helmets.", 
  1606             "VGhleSBzYXkgdGhhdCBzb2xkaWVycyB3ZWFyIGtpZCBnbG92ZXMgYW5kIHNpbGx5IGhlbG1ldHMu" },
  1607           { "They say that some Kops are on the take.", 
  1608             "VGhleSBzYXkgdGhhdCBzb21lIEtvcHMgYXJlIG9uIHRoZSB0YWtlLg==" },
  1609           { "They say that some guards' palms can be greased.", 
  1610             "VGhleSBzYXkgdGhhdCBzb21lIGd1YXJkcycgcGFsbXMgY2FuIGJlIGdyZWFzZWQu" },
  1611           { "They say that some monsters may kiss your boots to stop your drum playing.", 
  1612             "VGhleSBzYXkgdGhhdCBzb21lIG1vbnN0ZXJzIG1heSBraXNzIHlvdXIgYm9vdHMgdG8gc3RvcCB5b3VyIGRydW0gcGxheWluZy4=" },
  1613           { "They say that sometimes you can be the hit of the party when playing a horn.", 
  1614             "VGhleSBzYXkgdGhhdCBzb21ldGltZXMgeW91IGNhbiBiZSB0aGUgaGl0IG9mIHRoZSBwYXJ0eSB3aGVuIHBsYXlpbmcgYSBob3JuLg==" },
  1615           { "They say that the NetHack gods generally welcome your sacrifices.", 
  1616             "VGhleSBzYXkgdGhhdCB0aGUgTmV0SGFjayBnb2RzIGdlbmVyYWxseSB3ZWxjb21lIHlvdXIgc2FjcmlmaWNlcy4=" },
  1617           { "They say that the Three Rings are named Vilya, Nenya and Narya.", 
  1618             "VGhleSBzYXkgdGhhdCB0aGUgVGhyZWUgUmluZ3MgYXJlIG5hbWVkIFZpbHlhLCBOZW55YSBhbmQgTmFyeWEu" },
  1619           { "They say that the Wizard of Yendor has a death wish.", 
  1620             "VGhleSBzYXkgdGhhdCB0aGUgV2l6YXJkIG9mIFllbmRvciBoYXMgYSBkZWF0aCB3aXNoLg==" },
  1621           { "They say that the `hair of the dog' is sometimes an effective remedy.", 
  1622             "VGhleSBzYXkgdGhhdCB0aGUgYGhhaXIgb2YgdGhlIGRvZycgaXMgc29tZXRpbWVzIGFuIGVmZmVjdGl2ZSByZW1lZHku" },
  1623           { "They say that the best time to save your game is now before its too late.", 
  1624             "VGhleSBzYXkgdGhhdCB0aGUgYmVzdCB0aW1lIHRvIHNhdmUgeW91ciBnYW1lIGlzIG5vdyBiZWZvcmUgaXRzIHRvbyBsYXRlLg==" },
  1625           { "They say that the biggest obstacle in NetHack is your mind.", 
  1626             "VGhleSBzYXkgdGhhdCB0aGUgYmlnZ2VzdCBvYnN0YWNsZSBpbiBOZXRIYWNrIGlzIHlvdXIgbWluZC4=" },
  1627           { "They say that the gods are angry when they hit you with objects.", 
  1628             "VGhleSBzYXkgdGhhdCB0aGUgZ29kcyBhcmUgYW5ncnkgd2hlbiB0aGV5IGhpdCB5b3Ugd2l0aCBvYmplY3RzLg==" },
  1629           { "They say that the priesthood are specially favored by the gods.", 
  1630             "VGhleSBzYXkgdGhhdCB0aGUgcHJpZXN0aG9vZCBhcmUgc3BlY2lhbGx5IGZhdm9yZWQgYnkgdGhlIGdvZHMu" },
  1631           { "They say that the way to make a unicorn happy is to give it what it wants.", 
  1632             "VGhleSBzYXkgdGhhdCB0aGUgd2F5IHRvIG1ha2UgYSB1bmljb3JuIGhhcHB5IGlzIHRvIGdpdmUgaXQgd2hhdCBpdCB3YW50cy4=" },
  1633           { "They say that there are no black or white stones, only gray.", 
  1634             "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gYmxhY2sgb3Igd2hpdGUgc3RvbmVzLCBvbmx5IGdyYXku" },
  1635           { "They say that there are no skeletons hence there are no skeleton keys.", 
  1636             "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gc2tlbGV0b25zIGhlbmNlIHRoZXJlIGFyZSBubyBza2VsZXRvbiBrZXlzLg==" },
  1637           { "They say that there is a clever rogue in every hacker just dying to escape.", 
  1638             "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBhIGNsZXZlciByb2d1ZSBpbiBldmVyeSBoYWNrZXIganVzdCBkeWluZyB0byBlc2NhcGUu" },
  1639           { "They say that there is no such thing as free advice.", 
  1640             "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGZyZWUgYWR2aWNlLg==" },
  1641           { "They say that there is only one way to win at NetHack.", 
  1642             "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSB3YXkgdG8gd2luIGF0IE5ldEhhY2su" },
  1643           { "They say that there once was a fearsome chaotic samurai named Luk No.", 
  1644             "VGhleSBzYXkgdGhhdCB0aGVyZSBvbmNlIHdhcyBhIGZlYXJzb21lIGNoYW90aWMgc2FtdXJhaSBuYW1lZCBMdWsgTm8u" },
  1645           { "They say that there was a time when cursed holy water wasn't water.", 
  1646             "VGhleSBzYXkgdGhhdCB0aGVyZSB3YXMgYSB0aW1lIHdoZW4gY3Vyc2VkIGhvbHkgd2F0ZXIgd2Fzbid0IHdhdGVyLg==" },
  1647           { "They say that there's no point in crying over a gray ooze.", 
  1648             "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG5vIHBvaW50IGluIGNyeWluZyBvdmVyIGEgZ3JheSBvb3plLg==" },
  1649           { "They say that there's only hope left after you've opened Pandora's box.", 
  1650             "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG9ubHkgaG9wZSBsZWZ0IGFmdGVyIHlvdSd2ZSBvcGVuZWQgUGFuZG9yYSdzIGJveC4=" },
  1651           { "They say that trapdoors should always be marked `Caution: Trap Door'.", 
  1652             "VGhleSBzYXkgdGhhdCB0cmFwZG9vcnMgc2hvdWxkIGFsd2F5cyBiZSBtYXJrZWQgYENhdXRpb246IFRyYXAgRG9vcicu" },
  1653           { "They say that using an amulet of change isn't a difficult operation.", 
  1654             "VGhleSBzYXkgdGhhdCB1c2luZyBhbiBhbXVsZXQgb2YgY2hhbmdlIGlzbid0IGEgZGlmZmljdWx0IG9wZXJhdGlvbi4=" },
  1655           { "They say that water walking boots are better if you are fast like Hermes.", 
  1656             "VGhleSBzYXkgdGhhdCB3YXRlciB3YWxraW5nIGJvb3RzIGFyZSBiZXR0ZXIgaWYgeW91IGFyZSBmYXN0IGxpa2UgSGVybWVzLg==" },
  1657           { "They say that when you wear a circular amulet you might resemble a troll.", 
  1658             "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSB3ZWFyIGEgY2lyY3VsYXIgYW11bGV0IHlvdSBtaWdodCByZXNlbWJsZSBhIHRyb2xsLg==" },
  1659           { "They say that when you're hungry you can get a pizza in 30 moves or it's free.", 
  1660             "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSdyZSBodW5ncnkgeW91IGNhbiBnZXQgYSBwaXp6YSBpbiAzMCBtb3ZlcyBvciBpdCdzIGZyZWUu" },
  1661           { "They say that when your god is angry you should try another one.", 
  1662             "VGhleSBzYXkgdGhhdCB3aGVuIHlvdXIgZ29kIGlzIGFuZ3J5IHlvdSBzaG91bGQgdHJ5IGFub3RoZXIgb25lLg==" },
  1663           { "They say that wielding a unicorn horn takes strength.", 
  1664             "VGhleSBzYXkgdGhhdCB3aWVsZGluZyBhIHVuaWNvcm4gaG9ybiB0YWtlcyBzdHJlbmd0aC4=" },
  1665           { "They say that with speed boots you never worry about hit and run accidents.", 
  1666             "VGhleSBzYXkgdGhhdCB3aXRoIHNwZWVkIGJvb3RzIHlvdSBuZXZlciB3b3JyeSBhYm91dCBoaXQgYW5kIHJ1biBhY2NpZGVudHMu" },
  1667           { "They say that you can defeat a killer bee with a unicorn horn.", 
  1668             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIGRlZmVhdCBhIGtpbGxlciBiZWUgd2l0aCBhIHVuaWNvcm4gaG9ybi4=" },
  1669           { "They say that you can only cross the River Styx in Charon's boat.", 
  1670             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgY3Jvc3MgdGhlIFJpdmVyIFN0eXggaW4gQ2hhcm9uJ3MgYm9hdC4=" },
  1671           { "They say that you can only kill a lich once and then you'd better be careful.", 
  1672             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkga2lsbCBhIGxpY2ggb25jZSBhbmQgdGhlbiB5b3UnZCBiZXR0ZXIgYmUgY2FyZWZ1bC4=" },
  1673           { "They say that you can only wish for things you've already had.", 
  1674             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgd2lzaCBmb3IgdGhpbmdzIHlvdSd2ZSBhbHJlYWR5IGhhZC4=" },
  1675           { "They say that you can train a cat by talking gently to it.", 
  1676             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgY2F0IGJ5IHRhbGtpbmcgZ2VudGx5IHRvIGl0Lg==" },
  1677           { "They say that you can train a dog by talking firmly to it.", 
  1678             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgZG9nIGJ5IHRhbGtpbmcgZmlybWx5IHRvIGl0Lg==" },
  1679           { "They say that you can trust your gold with the king.", 
  1680             "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRydXN0IHlvdXIgZ29sZCB3aXRoIHRoZSBraW5nLg==" },
  1681           { "They say that you can't wipe your greasy bare hands on a blank scroll.", 
  1682             "VGhleSBzYXkgdGhhdCB5b3UgY2FuJ3Qgd2lwZSB5b3VyIGdyZWFzeSBiYXJlIGhhbmRzIG9uIGEgYmxhbmsgc2Nyb2xsLg==" },
  1683           { "They say that you cannot trust scrolls of rumor.", 
  1684             "VGhleSBzYXkgdGhhdCB5b3UgY2Fubm90IHRydXN0IHNjcm9sbHMgb2YgcnVtb3Iu" },
  1685           { "They say that you could fall head over heels for an energy vortex.", 
  1686             "VGhleSBzYXkgdGhhdCB5b3UgY291bGQgZmFsbCBoZWFkIG92ZXIgaGVlbHMgZm9yIGFuIGVuZXJneSB2b3J0ZXgu" },
  1687           { "They say that you need a key in order to open locked doors.", 
  1688             "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIGtleSBpbiBvcmRlciB0byBvcGVuIGxvY2tlZCBkb29ycy4=" },
  1689           { "They say that you need a mirror to notice a mimic in an antique shop.", 
  1690             "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIG1pcnJvciB0byBub3RpY2UgYSBtaW1pYyBpbiBhbiBhbnRpcXVlIHNob3Au" },
  1691           { "They say that you really can use a pick-axe unless you really can't.", 
  1692             "VGhleSBzYXkgdGhhdCB5b3UgcmVhbGx5IGNhbiB1c2UgYSBwaWNrLWF4ZSB1bmxlc3MgeW91IHJlYWxseSBjYW4ndC4=" },
  1693           { "They say that you should always store your tools in the cellar.", 
  1694             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGFsd2F5cyBzdG9yZSB5b3VyIHRvb2xzIGluIHRoZSBjZWxsYXIu" },
  1695           { "They say that you should be careful while climbing the ladder to success.", 
  1696             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgd2hpbGUgY2xpbWJpbmcgdGhlIGxhZGRlciB0byBzdWNjZXNzLg==" },
  1697           { "They say that you should call your armor `rustproof'.", 
  1698             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGNhbGwgeW91ciBhcm1vciBgcnVzdHByb29mJy4=" },
  1699           { "They say that you should name your dog Spuds to have a cool pet.", 
  1700             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciBkb2cgU3B1ZHMgdG8gaGF2ZSBhIGNvb2wgcGV0Lg==" },
  1701           { "They say that you should name your weapon after your first monster kill.", 
  1702             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciB3ZWFwb24gYWZ0ZXIgeW91ciBmaXJzdCBtb25zdGVyIGtpbGwu" },
  1703           { "They say that you should never introduce a rope golem to a succubus.", 
  1704             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIGludHJvZHVjZSBhIHJvcGUgZ29sZW0gdG8gYSBzdWNjdWJ1cy4=" },
  1705           { "They say that you should never sleep near invisible ring wraiths.", 
  1706             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHNsZWVwIG5lYXIgaW52aXNpYmxlIHJpbmcgd3JhaXRocy4=" },
  1707           { "They say that you should never try to leave the dungeon with a bag of gems.", 
  1708             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHRyeSB0byBsZWF2ZSB0aGUgZHVuZ2VvbiB3aXRoIGEgYmFnIG9mIGdlbXMu" },
  1709           { "They say that you should remove your armor before sitting on a throne.", 
  1710             "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIHJlbW92ZSB5b3VyIGFybW9yIGJlZm9yZSBzaXR0aW5nIG9uIGEgdGhyb25lLg==" },
  1711           { "This fortune cookie is copy protected.", 
  1712             "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyBjb3B5IHByb3RlY3RlZC4=" },
  1713           { "This fortune cookie is the property of Fortune Cookies, Inc.", 
  1714             "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyB0aGUgcHJvcGVydHkgb2YgRm9ydHVuZSBDb29raWVzLCBJbmMu" },
  1715           { "Tired? Try a scroll of charging on yourself.", 
  1716             "VGlyZWQ/IFRyeSBhIHNjcm9sbCBvZiBjaGFyZ2luZyBvbiB5b3Vyc2VsZi4=" },
  1717           { "To achieve the next higher rating, you need 3 more points.", 
  1718             "VG8gYWNoaWV2ZSB0aGUgbmV4dCBoaWdoZXIgcmF0aW5nLCB5b3UgbmVlZCAzIG1vcmUgcG9pbnRzLg==" },
  1719           { "To reach heaven, escape the dungeon while wearing a ring of levitation.", 
  1720             "VG8gcmVhY2ggaGVhdmVuLCBlc2NhcGUgdGhlIGR1bmdlb24gd2hpbGUgd2VhcmluZyBhIHJpbmcgb2YgbGV2aXRhdGlvbi4=" },
  1721           { "Tourists wear shirts loud enough to wake the dead.", 
  1722             "VG91cmlzdHMgd2VhciBzaGlydHMgbG91ZCBlbm91Z2ggdG8gd2FrZSB0aGUgZGVhZC4=" },
  1723           { "Try calling your katana Moulinette.", 
  1724             "VHJ5IGNhbGxpbmcgeW91ciBrYXRhbmEgTW91bGluZXR0ZS4=" },
  1725           { "Ulch! That meat was painted!", 
  1726             "VWxjaCEgVGhhdCBtZWF0IHdhcyBwYWludGVkIQ==" },
  1727           { "Unfortunately, this message was left intentionally blank.", 
  1728             "VW5mb3J0dW5hdGVseSwgdGhpcyBtZXNzYWdlIHdhcyBsZWZ0IGludGVudGlvbmFsbHkgYmxhbmsu" },
  1729           { "Using a morning star in the evening has no effect.", 
  1730             "VXNpbmcgYSBtb3JuaW5nIHN0YXIgaW4gdGhlIGV2ZW5pbmcgaGFzIG5vIGVmZmVjdC4=" },
  1731           { "Want a hint? Zap a wand of make invisible on your weapon!", 
  1732             "V2FudCBhIGhpbnQ/IFphcCBhIHdhbmQgb2YgbWFrZSBpbnZpc2libGUgb24geW91ciB3ZWFwb24h" },
  1733           { "Want to ascend in a hurry? Apply at Gizmonic Institute.", 
  1734             "V2FudCB0byBhc2NlbmQgaW4gYSBodXJyeT8gQXBwbHkgYXQgR2l6bW9uaWMgSW5zdGl0dXRlLg==" },
  1735           { "Wanted: shopkeepers. Send a scroll of mail to Mage of Yendor/Level 35/Dungeon.", 
  1736             "V2FudGVkOiBzaG9wa2VlcGVycy4gU2VuZCBhIHNjcm9sbCBvZiBtYWlsIHRvIE1hZ2Ugb2YgWWVuZG9yL0xldmVsIDM1L0R1bmdlb24u" },
  1737           { "Warning: fortune reading can be hazardous to your health.", 
  1738             "V2FybmluZzogZm9ydHVuZSByZWFkaW5nIGNhbiBiZSBoYXphcmRvdXMgdG8geW91ciBoZWFsdGgu" },
  1739           { "We have new ways of detecting treachery...", 
  1740             "V2UgaGF2ZSBuZXcgd2F5cyBvZiBkZXRlY3RpbmcgdHJlYWNoZXJ5Li4u" },
  1741           { "Wet towels make great weapons!", 
  1742             "V2V0IHRvd2VscyBtYWtlIGdyZWF0IHdlYXBvbnMh" },
  1743           { "What a pity, you cannot read it!", 
  1744             "V2hhdCBhIHBpdHksIHlvdSBjYW5ub3QgcmVhZCBpdCE=" },
  1745           { "When a piercer drops in on you, you will be tempted to hit the ceiling!", 
  1746             "V2hlbiBhIHBpZXJjZXIgZHJvcHMgaW4gb24geW91LCB5b3Ugd2lsbCBiZSB0ZW1wdGVkIHRvIGhpdCB0aGUgY2VpbGluZyE=" },
  1747           { "When in a maze follow the right wall and you will never get lost.", 
  1748             "V2hlbiBpbiBhIG1hemUgZm9sbG93IHRoZSByaWdodCB3YWxsIGFuZCB5b3Ugd2lsbCBuZXZlciBnZXQgbG9zdC4=" },
  1749           { "When you have a key, you don't have to wait for the guard.", 
  1750             "V2hlbiB5b3UgaGF2ZSBhIGtleSwgeW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGd1YXJkLg==" },
  1751           { "Why are you wasting time reading fortunes?", 
  1752             "V2h5IGFyZSB5b3Ugd2FzdGluZyB0aW1lIHJlYWRpbmcgZm9ydHVuZXM/" },
  1753           { "Wish for a master key and open the Magic Memory Vault!", 
  1754             "V2lzaCBmb3IgYSBtYXN0ZXIga2V5IGFuZCBvcGVuIHRoZSBNYWdpYyBNZW1vcnkgVmF1bHQh" },
  1755           { "Wizard expects every monster to do its duty.", 
  1756             "V2l6YXJkIGV4cGVjdHMgZXZlcnkgbW9uc3RlciB0byBkbyBpdHMgZHV0eS4=" },
  1757           { "Wow! You could've had a potion of fruit juice!", 
  1758             "V293ISBZb3UgY291bGQndmUgaGFkIGEgcG90aW9uIG9mIGZydWl0IGp1aWNlIQ==" },
  1759           { "Yet Another Silly Message (YASM).", 
  1760             "WWV0IEFub3RoZXIgU2lsbHkgTWVzc2FnZSAoWUFTTSku" },
  1761           { "You are destined to be misled by a fortune.", 
  1762             "WW91IGFyZSBkZXN0aW5lZCB0byBiZSBtaXNsZWQgYnkgYSBmb3J0dW5lLg==" },
  1763           { "You can get a genuine Amulet of Yendor by doing the following: --More--", 
  1764             "WW91IGNhbiBnZXQgYSBnZW51aW5lIEFtdWxldCBvZiBZZW5kb3IgYnkgZG9pbmcgdGhlIGZvbGxvd2luZzogLS1Nb3JlLS0=" },
  1765           { "You can protect yourself from black dragons by doing the following: --More--", 
  1766             "WW91IGNhbiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gYmxhY2sgZHJhZ29ucyBieSBkb2luZyB0aGUgZm9sbG93aW5nOiAtLU1vcmUtLQ==" },
  1767           { "You can't get by the snake.", 
  1768             "WW91IGNhbid0IGdldCBieSB0aGUgc25ha2Uu" },
  1769           { "You feel like someone is pulling your leg.", 
  1770             "WW91IGZlZWwgbGlrZSBzb21lb25lIGlzIHB1bGxpbmcgeW91ciBsZWcu" },
  1771           { "You have to outwit the Sphynx or pay her.", 
  1772             "WW91IGhhdmUgdG8gb3V0d2l0IHRoZSBTcGh5bnggb3IgcGF5IGhlci4=" },
  1773           { "You hear the fortune cookie's hissing!", 
  1774             "WW91IGhlYXIgdGhlIGZvcnR1bmUgY29va2llJ3MgaGlzc2luZyE=" },
  1775           { "You may get rich selling letters, but beware of being blackmailed!", 
  1776             "WW91IG1heSBnZXQgcmljaCBzZWxsaW5nIGxldHRlcnMsIGJ1dCBiZXdhcmUgb2YgYmVpbmcgYmxhY2ttYWlsZWQh" },
  1777           { "You offend Shai-Hulud by sheathing your crysknife without having drawn blood.", 
  1778             "WW91IG9mZmVuZCBTaGFpLUh1bHVkIGJ5IHNoZWF0aGluZyB5b3VyIGNyeXNrbmlmZSB3aXRob3V0IGhhdmluZyBkcmF3biBibG9vZC4=" },
  1779           { "You swallowed the fortune!", 
  1780             "WW91IHN3YWxsb3dlZCB0aGUgZm9ydHVuZSE=" },
  1781           { "You want to regain strength? Two levels ahead is a guesthouse!", 
  1782             "WW91IHdhbnQgdG8gcmVnYWluIHN0cmVuZ3RoPyBUd28gbGV2ZWxzIGFoZWFkIGlzIGEgZ3Vlc3Rob3VzZSE=" },
  1783           { "You will encounter a tall, dark, and gruesome creature...", 
  1784             "WW91IHdpbGwgZW5jb3VudGVyIGEgdGFsbCwgZGFyaywgYW5kIGdydWVzb21lIGNyZWF0dXJlLi4u" },
  1786           { "The End", "VGhlIEVuZA==" }
  1787       };
  1789 /* PL_Base64Encode, random strings */
  1790 PRBool test_004(void)
  1792     int i;
  1793     char result[ 4096 ];
  1795     printf("Test 004 (PL_Base64Encode, random strings)                            ..."); fflush(stdout);
  1797     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1799         PRUint32 plen = PL_strlen(array[i].plaintext);
  1800         PRUint32 clen = ((plen + 2)/3)*4;
  1802         char *rv = PL_Base64Encode(array[i].plaintext, plen, result);
  1804         if( rv != result )
  1806             printf("FAIL\n\t(%d): return value\n", i);
  1807             return PR_FALSE;
  1810         if( 0 != PL_strncmp(result, array[i].cyphertext, clen) )
  1812             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  1813                    i, array[i].plaintext, array[i].cyphertext, clen, result);
  1814             return PR_FALSE;
  1818     printf("PASS\n");
  1819     return PR_TRUE;
  1822 /* PL_Base64Encode, single characters, malloc */
  1823 PRBool test_005(void)
  1825     PRUint32 a, b;
  1826     unsigned char plain[ 4 ];
  1827     unsigned char cypher[ 5 ];
  1828     char *rv;
  1830     printf("Test 005 (PL_Base64Encode, single characters, malloc)                 ..."); fflush(stdout);
  1832     plain[1] = plain[2] = plain[3] = (unsigned char)0;
  1833     cypher[2] = cypher[3] = (unsigned char)'=';
  1834     cypher[4] = (unsigned char)0;
  1836     for( a = 0; a < 64; a++ )
  1838         cypher[0] = base[a];
  1840         for( b = 0; b < 4; b++ )
  1842             plain[0] = (unsigned char)(a * 4 + b);
  1843             cypher[1] = base[(b * 16)];
  1845             rv = PL_Base64Encode((char *)plain, 1, (char *)0);
  1846             if( (char *)0 == rv )
  1848                 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
  1849                 return PR_FALSE;
  1852             if( 0 != PL_strcmp((char *)cypher, rv) )
  1854                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
  1855                        a, b, cypher, rv);
  1856                 PR_DELETE(rv);
  1857                 return PR_FALSE;
  1860             PR_DELETE(rv);
  1864     printf("PASS\n");
  1865     return PR_TRUE;
  1868 /* PL_Base64Encode, double characters, malloc */
  1869 PRBool test_006(void)
  1871     PRUint32 a, b, c, d;
  1872     unsigned char plain[ 4 ];
  1873     unsigned char cypher[ 5 ];
  1874     char *rv;
  1876     printf("Test 006 (PL_Base64Encode, double characters, malloc)                 ..."); fflush(stdout);
  1878     plain[2] = plain[3] = (unsigned char)0;
  1879     cypher[3] = (unsigned char)'=';
  1880     cypher[4] = (unsigned char)0;
  1882     for( a = 0; a < 64; a++ )
  1884         cypher[0] = base[a];
  1885         for( b = 0; b < 4; b++ )
  1887             plain[0] = (a*4) + b;
  1888             for( c = 0; c < 16; c++ )
  1890                 cypher[1] = base[b*16 + c];
  1891                 for( d = 0; d < 16; d++ )
  1893                     plain[1] = c*16 + d;
  1894                     cypher[2] = base[d*4];
  1896                     rv = PL_Base64Encode((char *)plain, 2, (char *)0);
  1897                     if( (char *)0 == rv )
  1899                         printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
  1900                         return PR_FALSE;
  1903                     if( 0 != PL_strcmp((char *)cypher, rv) )
  1905                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
  1906                                a, b, c, d, cypher, rv);
  1907                         PR_DELETE(rv);
  1908                         return PR_FALSE;
  1911                     PR_DELETE(rv);
  1917     printf("PASS\n");
  1918     return PR_TRUE;
  1921 /* PL_Base64Encode, triple characters, malloc */
  1922 PRBool test_007(void)
  1924     PRUint32 a, b, c, d, e, f;
  1925     unsigned char plain[ 4 ];
  1926     unsigned char cypher[ 5 ];
  1927     char *rv;
  1929     printf("Test 007 (PL_Base64Encode, triple characters, malloc)                 ..."); fflush(stdout);
  1931     cypher[4] = (unsigned char)0;
  1933     for( a = 0; a < 64; a++ )
  1935         cypher[0] = base[a];
  1936         for( b = 0; b < 4; b++ )
  1938             plain[0] = (a*4) + b;
  1939             for( c = 0; c < 16; c++ )
  1941                 cypher[1] = base[b*16 + c];
  1942                 for( d = 0; d < 16; d++ )
  1944                     plain[1] = c*16 + d;
  1945                     for( e = 0; e < 4; e++ )
  1947                         cypher[2] = base[d*4 + e];
  1948                         for( f = 0; f < 64; f++ )
  1950                             plain[2] = e * 64 + f;
  1951                             cypher[3] = base[f];
  1953                             rv = PL_Base64Encode((char *)plain, 3, (char *)0);
  1954                             if( (char *)0 == rv )
  1956                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a, b, c, d, e, f);
  1957                                 return PR_FALSE;
  1960                             if( 0 != PL_strcmp((char *)cypher, rv) )
  1962                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
  1963                                        a, b, c, d, e, f, cypher, rv);
  1964                                 PR_DELETE(rv);
  1965                                 return PR_FALSE;
  1968                             PR_DELETE(rv);
  1976     printf("PASS\n");
  1977     return PR_TRUE;
  1980 /* PL_Base64Encode, random strings, malloc */
  1981 PRBool test_008(void)
  1983     int i;
  1985     printf("Test 008 (PL_Base64Encode, random strings, malloc)                    ..."); fflush(stdout);
  1987     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  1989         PRUint32 plen = PL_strlen(array[i].plaintext);
  1990         PRUint32 clen = ((plen + 2)/3)*4;
  1992         char *rv = PL_Base64Encode(array[i].plaintext, plen, (char *)0);
  1994         if( (char *)0 == rv )
  1996             printf("FAIL\n\t(%d): no return value\n", i);
  1997             return PR_FALSE;
  2000         if( 0 != PL_strcmp(rv, array[i].cyphertext) )
  2002             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2003                    i, array[i].plaintext, array[i].cyphertext, rv);
  2004             return PR_FALSE;
  2008     printf("PASS\n");
  2009     return PR_TRUE;
  2012 /* PL_Base64Decode, single characters */
  2013 PRBool test_009(void)
  2015     PRUint32 a, b;
  2016     unsigned char plain[ 4 ];
  2017     unsigned char cypher[ 5 ];
  2018     char result[ 8 ];
  2019     char *rv;
  2021     printf("Test 009 (PL_Base64Decode, single characters, equals)                 ..."); fflush(stdout);
  2023     plain[1] = plain[2] = plain[3] = (unsigned char)0;
  2024     cypher[2] = cypher[3] = (unsigned char)'=';
  2025     cypher[4] = (unsigned char)0;
  2027     for( a = 0; a < 64; a++ )
  2029         cypher[0] = base[a];
  2031         for( b = 0; b < 4; b++ )
  2033             plain[0] = (unsigned char)(a * 4 + b);
  2034             cypher[1] = base[(b * 16)];
  2036             rv = PL_Base64Decode((char *)cypher, 4, result);
  2037             if( rv != result )
  2039                 printf("FAIL\n\t(%d, %d): return value\n", a, b);
  2040                 return PR_FALSE;
  2043             if( 0 != PL_strncmp((char *)plain, result, 1) )
  2045                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n",
  2046                        a, b, plain, result);
  2047                 return PR_FALSE;
  2052     printf("PASS\n");
  2053     return PR_TRUE;
  2056 /* PL_Base64Decode, single characters */
  2057 PRBool test_010(void)
  2059     PRUint32 a, b;
  2060     unsigned char plain[ 4 ];
  2061     unsigned char cypher[ 5 ];
  2062     char result[ 8 ];
  2063     char *rv;
  2065     printf("Test 010 (PL_Base64Decode, single characters, no equals)              ..."); fflush(stdout);
  2067     plain[1] = plain[2] = plain[3] = (unsigned char)0;
  2068     cypher[2] = cypher[3] = (unsigned char)0;
  2069     cypher[4] = (unsigned char)0;
  2071     for( a = 0; a < 64; a++ )
  2073         cypher[0] = base[a];
  2075         for( b = 0; b < 4; b++ )
  2077             plain[0] = (unsigned char)(a * 4 + b);
  2078             cypher[1] = base[(b * 16)];
  2080             rv = PL_Base64Decode((char *)cypher, 2, result);
  2081             if( rv != result )
  2083                 printf("FAIL\n\t(%d, %d): return value\n", a, b);
  2084                 return PR_FALSE;
  2087             if( 0 != PL_strncmp((char *)plain, result, 1) )
  2089                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n",
  2090                        a, b, plain, result);
  2091                 return PR_FALSE;
  2096     printf("PASS\n");
  2097     return PR_TRUE;
  2100 /* PL_Base64Decode, double characters */
  2101 PRBool test_011(void)
  2103     PRUint32 a, b, c, d;
  2104     unsigned char plain[ 4 ];
  2105     unsigned char cypher[ 5 ];
  2106     char result[ 8 ];
  2107     char *rv;
  2109     printf("Test 011 (PL_Base64Decode, double characters, equals)                 ..."); fflush(stdout);
  2111     plain[2] = plain[3] = (unsigned char)0;
  2112     cypher[3] = (unsigned char)'=';
  2113     cypher[4] = (unsigned char)0;
  2115     for( a = 0; a < 64; a++ )
  2117         cypher[0] = base[a];
  2118         for( b = 0; b < 4; b++ )
  2120             plain[0] = (a*4) + b;
  2121             for( c = 0; c < 16; c++ )
  2123                 cypher[1] = base[b*16 + c];
  2124                 for( d = 0; d < 16; d++ )
  2126                     plain[1] = c*16 + d;
  2127                     cypher[2] = base[d*4];
  2129                     rv = PL_Base64Decode((char *)cypher, 4, result);
  2130                     if( rv != result )
  2132                         printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
  2133                         return PR_FALSE;
  2136                     if( 0 != PL_strncmp((char *)plain, result, 2) )
  2138                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
  2139                                a, b, c, d, plain, result);
  2140                         return PR_FALSE;
  2147     printf("PASS\n");
  2148     return PR_TRUE;
  2151 /* PL_Base64Decode, double characters */
  2152 PRBool test_012(void)
  2154     PRUint32 a, b, c, d;
  2155     unsigned char plain[ 4 ];
  2156     unsigned char cypher[ 5 ];
  2157     char result[ 8 ];
  2158     char *rv;
  2160     printf("Test 012 (PL_Base64Decode, double characters, no equals)              ..."); fflush(stdout);
  2162     plain[2] = plain[3] = (unsigned char)0;
  2163     cypher[3] = (unsigned char)0;
  2164     cypher[4] = (unsigned char)0;
  2166     for( a = 0; a < 64; a++ )
  2168         cypher[0] = base[a];
  2169         for( b = 0; b < 4; b++ )
  2171             plain[0] = (a*4) + b;
  2172             for( c = 0; c < 16; c++ )
  2174                 cypher[1] = base[b*16 + c];
  2175                 for( d = 0; d < 16; d++ )
  2177                     plain[1] = c*16 + d;
  2178                     cypher[2] = base[d*4];
  2180                     rv = PL_Base64Decode((char *)cypher, 3, result);
  2181                     if( rv != result )
  2183                         printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
  2184                         return PR_FALSE;
  2187                     if( 0 != PL_strncmp((char *)plain, result, 2) )
  2189                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
  2190                                a, b, c, d, cypher, result);
  2191                         return PR_FALSE;
  2198     printf("PASS\n");
  2199     return PR_TRUE;
  2202 /* PL_Base64Decode, triple characters */
  2203 PRBool test_013(void)
  2205     PRUint32 a, b, c, d, e, f;
  2206     unsigned char plain[ 4 ];
  2207     unsigned char cypher[ 5 ];
  2208     char result[ 8 ];
  2209     char *rv;
  2211     printf("Test 013 (PL_Base64Decode, triple characters)                         ..."); fflush(stdout);
  2213     cypher[4] = (unsigned char)0;
  2215     for( a = 0; a < 64; a++ )
  2217         cypher[0] = base[a];
  2218         for( b = 0; b < 4; b++ )
  2220             plain[0] = (a*4) + b;
  2221             for( c = 0; c < 16; c++ )
  2223                 cypher[1] = base[b*16 + c];
  2224                 for( d = 0; d < 16; d++ )
  2226                     plain[1] = c*16 + d;
  2227                     for( e = 0; e < 4; e++ )
  2229                         cypher[2] = base[d*4 + e];
  2230                         for( f = 0; f < 64; f++ )
  2232                             plain[2] = e * 64 + f;
  2233                             cypher[3] = base[f];
  2235                             rv = PL_Base64Decode((char *)cypher, 4, result);
  2236                             if( rv != result )
  2238                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b, c, d, e, f);
  2239                                 return PR_FALSE;
  2242                             if( 0 != PL_strncmp((char *)plain, result, 3) )
  2244                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.3s.\"\n",
  2245                                        a, b, c, d, e, f, plain, result);
  2246                                 return PR_FALSE;
  2255     printf("PASS\n");
  2256     return PR_TRUE;
  2259 /* PL_Base64Decode, random strings */
  2260 PRBool test_014(void)
  2262     int i;
  2263     char result[ 4096 ];
  2265     printf("Test 014 (PL_Base64Decode, random strings, equals)                    ..."); fflush(stdout);
  2267     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2269         PRUint32 clen = PL_strlen(array[i].cyphertext);
  2270         PRUint32 plen = (clen * 3) / 4;
  2272         char *rv = PL_Base64Decode(array[i].cyphertext, clen, result);
  2274         if( rv != result )
  2276             printf("FAIL\n\t(%d): return value\n", i);
  2277             return PR_FALSE;
  2280         if( 0 == (clen & 3) )
  2282             if( '=' == array[i].cyphertext[clen-1] )
  2284                 if( '=' == array[i].cyphertext[clen-2] )
  2286                     plen -= 2;
  2288                 else
  2290                     plen -= 1;
  2295         if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
  2297             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  2298                    i, array[i].cyphertext, array[i].plaintext, plen, result);
  2299             return PR_FALSE;
  2303     printf("PASS\n");
  2304     return PR_TRUE;
  2307 /* PL_Base64Decode, random strings */
  2308 PRBool test_015(void)
  2310     int i;
  2311     char buffer[ 4096 ];
  2312     char result[ 4096 ];
  2313     char *rv;
  2315     printf("Test 015 (PL_Base64Decode, random strings, no equals)                 ..."); fflush(stdout);
  2317     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2319         PRUint32 clen, plen;
  2321         PL_strcpy(buffer, array[i].cyphertext);
  2322         clen = PL_strlen(buffer);
  2324         if( 0 == (clen & 3) )
  2326             if( '=' == buffer[clen-1] )
  2328                 if( '=' == buffer[clen-2] )
  2330                     buffer[clen-2] = buffer[clen-1] = (char)0;
  2331                     clen -= 2;
  2333                 else
  2335                     buffer[clen-1] = (char)0;
  2336                     clen -= 1;
  2341         plen = (clen * 3) / 4;
  2343         rv = PL_Base64Decode(buffer, clen, result);
  2345         if( rv != result )
  2347             printf("FAIL\n\t(%d): return value\n", i);
  2348             return PR_FALSE;
  2351         if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
  2353             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  2354                    i, array[i].cyphertext, array[i].plaintext, plen, result);
  2355             return PR_FALSE;
  2359     printf("PASS\n");
  2360     return PR_TRUE;
  2363 /* PL_Base64Decode, single characters, malloc */
  2364 PRBool test_016(void)
  2366     PRUint32 a, b;
  2367     unsigned char plain[ 4 ];
  2368     unsigned char cypher[ 5 ];
  2369     char *rv;
  2371     printf("Test 016 (PL_Base64Decode, single characters, equals, malloc)         ..."); fflush(stdout);
  2373     plain[1] = plain[2] = plain[3] = (unsigned char)0;
  2374     cypher[2] = cypher[3] = (unsigned char)'=';
  2375     cypher[4] = (unsigned char)0;
  2377     for( a = 0; a < 64; a++ )
  2379         cypher[0] = base[a];
  2381         for( b = 0; b < 4; b++ )
  2383             plain[0] = (unsigned char)(a * 4 + b);
  2384             cypher[1] = base[(b * 16)];
  2386             rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
  2387             if( (char *)0 == rv )
  2389                 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
  2390                 return PR_FALSE;
  2393             if( 0 != PL_strcmp((char *)plain, rv) )
  2395                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
  2396                        a, b, plain, rv);
  2397                 PR_DELETE(rv);
  2398                 return PR_FALSE;
  2401             PR_DELETE(rv);
  2405     printf("PASS\n");
  2406     return PR_TRUE;
  2409 /* PL_Base64Decode, single characters, malloc */
  2410 PRBool test_017(void)
  2412     PRUint32 a, b;
  2413     unsigned char plain[ 4 ];
  2414     unsigned char cypher[ 5 ];
  2415     char *rv;
  2417     printf("Test 017 (PL_Base64Decode, single characters, no equals, malloc)      ..."); fflush(stdout);
  2419     plain[1] = plain[2] = plain[3] = (unsigned char)0;
  2420     cypher[2] = cypher[3] = (unsigned char)0;
  2421     cypher[4] = (unsigned char)0;
  2423     for( a = 0; a < 64; a++ )
  2425         cypher[0] = base[a];
  2427         for( b = 0; b < 4; b++ )
  2429             plain[0] = (unsigned char)(a * 4 + b);
  2430             cypher[1] = base[(b * 16)];
  2432             rv = PL_Base64Decode((char *)cypher, 2, (char *)0);
  2433             if( (char *)0 == rv )
  2435                 printf("FAIL\n\t(%d, %d): no return value\n", a, b);
  2436                 return PR_FALSE;
  2439             if( 0 != PL_strcmp((char *)plain, rv) )
  2441                 printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n",
  2442                        a, b, plain, rv);
  2443                 PR_DELETE(rv);
  2444                 return PR_FALSE;
  2447             PR_DELETE(rv);
  2451     printf("PASS\n");
  2452     return PR_TRUE;
  2455 /* PL_Base64Decode, double characters, malloc */
  2456 PRBool test_018(void)
  2458     PRUint32 a, b, c, d;
  2459     unsigned char plain[ 4 ];
  2460     unsigned char cypher[ 5 ];
  2461     char *rv;
  2463     printf("Test 018 (PL_Base64Decode, double characters, equals, malloc)         ..."); fflush(stdout);
  2465     plain[2] = plain[3] = (unsigned char)0;
  2466     cypher[3] = (unsigned char)'=';
  2467     cypher[4] = (unsigned char)0;
  2469     for( a = 0; a < 64; a++ )
  2471         cypher[0] = base[a];
  2472         for( b = 0; b < 4; b++ )
  2474             plain[0] = (a*4) + b;
  2475             for( c = 0; c < 16; c++ )
  2477                 cypher[1] = base[b*16 + c];
  2478                 for( d = 0; d < 16; d++ )
  2480                     plain[1] = c*16 + d;
  2481                     cypher[2] = base[d*4];
  2483                     rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
  2484                     if( (char *)0 == rv )
  2486                         printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
  2487                         return PR_FALSE;
  2490                     if( 0 != PL_strcmp((char *)plain, rv) )
  2492                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
  2493                                a, b, c, d, plain, rv);
  2494                         PR_DELETE(rv);
  2495                         return PR_FALSE;
  2498                     PR_DELETE(rv);
  2504     printf("PASS\n");
  2505     return PR_TRUE;
  2508 /* PL_Base64Decode, double characters, malloc */
  2509 PRBool test_019(void)
  2511     PRUint32 a, b, c, d;
  2512     unsigned char plain[ 4 ];
  2513     unsigned char cypher[ 5 ];
  2514     char *rv;
  2516     printf("Test 019 (PL_Base64Decode, double characters, no equals, malloc)      ..."); fflush(stdout);
  2518     plain[2] = plain[3] = (unsigned char)0;
  2519     cypher[3] = (unsigned char)0;
  2520     cypher[4] = (unsigned char)0;
  2522     for( a = 0; a < 64; a++ )
  2524         cypher[0] = base[a];
  2525         for( b = 0; b < 4; b++ )
  2527             plain[0] = (a*4) + b;
  2528             for( c = 0; c < 16; c++ )
  2530                 cypher[1] = base[b*16 + c];
  2531                 for( d = 0; d < 16; d++ )
  2533                     plain[1] = c*16 + d;
  2534                     cypher[2] = base[d*4];
  2536                     rv = PL_Base64Decode((char *)cypher, 3, (char *)0);
  2537                     if( (char *)0 == rv )
  2539                         printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
  2540                         return PR_FALSE;
  2543                     if( 0 != PL_strcmp((char *)plain, rv) )
  2545                         printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
  2546                                a, b, c, d, cypher, rv);
  2547                         PR_DELETE(rv);
  2548                         return PR_FALSE;
  2551                     PR_DELETE(rv);
  2557     printf("PASS\n");
  2558     return PR_TRUE;
  2561 /* PL_Base64Decode, triple characters, malloc */
  2562 PRBool test_020(void)
  2564     PRUint32 a, b, c, d, e, f;
  2565     unsigned char plain[ 4 ];
  2566     unsigned char cypher[ 5 ];
  2567     char *rv;
  2569     printf("Test 020 (PL_Base64Decode, triple characters, malloc)                 ..."); fflush(stdout);
  2571     cypher[4] = (unsigned char)0;
  2572     plain[3] = (unsigned char)0;
  2574     for( a = 0; a < 64; a++ )
  2576         cypher[0] = base[a];
  2577         for( b = 0; b < 4; b++ )
  2579             plain[0] = (a*4) + b;
  2580             for( c = 0; c < 16; c++ )
  2582                 cypher[1] = base[b*16 + c];
  2583                 for( d = 0; d < 16; d++ )
  2585                     plain[1] = c*16 + d;
  2586                     for( e = 0; e < 4; e++ )
  2588                         cypher[2] = base[d*4 + e];
  2589                         for( f = 0; f < 64; f++ )
  2591                             plain[2] = e * 64 + f;
  2592                             cypher[3] = base[f];
  2594                             rv = PL_Base64Decode((char *)cypher, 4, (char *)0);
  2595                             if( (char *)0 == rv )
  2597                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a, b, c, d, e, f);
  2598                                 return PR_FALSE;
  2601                             if( 0 != PL_strcmp((char *)plain, rv) )
  2603                                 printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got \"%.3s.\"\n",
  2604                                        a, b, c, d, e, f, plain, rv);
  2605                                 PR_DELETE(rv);
  2606                                 return PR_FALSE;
  2609                             PR_DELETE(rv);
  2617     printf("PASS\n");
  2618     return PR_TRUE;
  2621 /* PL_Base64Decode, random strings, malloc */
  2622 PRBool test_021(void)
  2624     int i;
  2626     printf("Test 021 (PL_Base64Decode, random strings, equals, malloc)            ..."); fflush(stdout);
  2628     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2630         PRUint32 clen = PL_strlen(array[i].cyphertext);
  2632         char *rv = PL_Base64Decode(array[i].cyphertext, clen, (char *)0);
  2634         if( (char *)0 == rv )
  2636             printf("FAIL\n\t(%d): no return value\n", i);
  2637             return PR_FALSE;
  2640         if( 0 != PL_strcmp(rv, array[i].plaintext) )
  2642             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2643                    i, array[i].cyphertext, array[i].plaintext, rv);
  2644             PR_DELETE(rv);
  2645             return PR_FALSE;
  2648         PR_DELETE(rv);
  2651     printf("PASS\n");
  2652     return PR_TRUE;
  2655 /* PL_Base64Encode, random strings, malloc */
  2656 PRBool test_022(void)
  2658     int i;
  2659     char buffer[ 4096 ];
  2660     char *rv;
  2662     printf("Test 022 (PL_Base64Decode, random strings, no equals, malloc)         ..."); fflush(stdout);
  2664     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2666         PRUint32 clen;
  2668         PL_strcpy(buffer, array[i].cyphertext);
  2669         clen = PL_strlen(buffer);
  2671         if( 0 == (clen & 3) )
  2673             if( '=' == buffer[clen-1] )
  2675                 if( '=' == buffer[clen-2] )
  2677                     buffer[clen-2] = buffer[clen-1] = (char)0;
  2678                     clen -= 2;
  2680                 else
  2682                     buffer[clen-1] = (char)0;
  2683                     clen -= 1;
  2688         rv = PL_Base64Decode(buffer, clen, (char *)0);
  2690         if( (char *)0 == rv )
  2692             printf("FAIL\n\t(%d): no return value\n", i);
  2693             return PR_FALSE;
  2696         if( 0 != PL_strcmp(rv, array[i].plaintext) )
  2698             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2699                    i, array[i].cyphertext, array[i].plaintext, rv);
  2700             return PR_FALSE;
  2704     printf("PASS\n");
  2705     return PR_TRUE;
  2708 /* PL_Base64Encode, random strings */
  2709 PRBool test_023(void)
  2711     int i;
  2712     char result[ 4096 ];
  2714     printf("Test 023 (PL_Base64Encode, random strings, strlen)                    ..."); fflush(stdout);
  2716     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2718         PRUint32 plen = PL_strlen(array[i].plaintext);
  2719         PRUint32 clen = ((plen + 2)/3)*4;
  2721         char *rv = PL_Base64Encode(array[i].plaintext, 0, result);
  2723         if( rv != result )
  2725             printf("FAIL\n\t(%d): return value\n", i);
  2726             return PR_FALSE;
  2729         if( 0 != PL_strncmp(result, array[i].cyphertext, clen) )
  2731             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  2732                    i, array[i].plaintext, array[i].cyphertext, clen, result);
  2733             return PR_FALSE;
  2737     printf("PASS\n");
  2738     return PR_TRUE;
  2741 /* PL_Base64Encode, random strings, malloc */
  2742 PRBool test_024(void)
  2744     int i;
  2746     printf("Test 024 (PL_Base64Encode, random strings, malloc, strlen)            ..."); fflush(stdout);
  2748     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2750         PRUint32 plen = PL_strlen(array[i].plaintext);
  2751         PRUint32 clen = ((plen + 2)/3)*4;
  2753         char *rv = PL_Base64Encode(array[i].plaintext, 0, (char *)0);
  2755         if( (char *)0 == rv )
  2757             printf("FAIL\n\t(%d): no return value\n", i);
  2758             return PR_FALSE;
  2761         if( 0 != PL_strcmp(rv, array[i].cyphertext) )
  2763             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2764                    i, array[i].plaintext, array[i].cyphertext, rv);
  2765             return PR_FALSE;
  2769     printf("PASS\n");
  2770     return PR_TRUE;
  2773 /* PL_Base64Decode, random strings */
  2774 PRBool test_025(void)
  2776     int i;
  2777     char result[ 4096 ];
  2779     printf("Test 025 (PL_Base64Decode, random strings, equals, strlen)            ..."); fflush(stdout);
  2781     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2783         PRUint32 clen = PL_strlen(array[i].cyphertext);
  2784         PRUint32 plen = (clen * 3) / 4;
  2786         char *rv = PL_Base64Decode(array[i].cyphertext, 0, result);
  2788         if( rv != result )
  2790             printf("FAIL\n\t(%d): return value\n", i);
  2791             return PR_FALSE;
  2794         if( 0 == (clen & 3) )
  2796             if( '=' == array[i].cyphertext[clen-1] )
  2798                 if( '=' == array[i].cyphertext[clen-2] )
  2800                     plen -= 2;
  2802                 else
  2804                     plen -= 1;
  2809         if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
  2811             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  2812                    i, array[i].cyphertext, array[i].plaintext, plen, result);
  2813             return PR_FALSE;
  2817     printf("PASS\n");
  2818     return PR_TRUE;
  2821 /* PL_Base64Decode, random strings */
  2822 PRBool test_026(void)
  2824     int i;
  2825     char buffer[ 4096 ];
  2826     char result[ 4096 ];
  2827     char *rv;
  2829     printf("Test 026 (PL_Base64Decode, random strings, no equals, strlen)         ..."); fflush(stdout);
  2831     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2833         PRUint32 clen, plen;
  2835         PL_strcpy(buffer, array[i].cyphertext);
  2836         clen = PL_strlen(buffer);
  2838         if( 0 == (clen & 3) )
  2840             if( '=' == buffer[clen-1] )
  2842                 if( '=' == buffer[clen-2] )
  2844                     buffer[clen-2] = buffer[clen-1] = (char)0;
  2845                     clen -= 2;
  2847                 else
  2849                     buffer[clen-1] = (char)0;
  2850                     clen -= 1;
  2855         plen = (clen * 3) / 4;
  2857         rv = PL_Base64Decode(buffer, 0, result);
  2859         if( rv != result )
  2861             printf("FAIL\n\t(%d): return value\n", i);
  2862             return PR_FALSE;
  2865         if( 0 != PL_strncmp(result, array[i].plaintext, plen) )
  2867             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", 
  2868                    i, array[i].cyphertext, array[i].plaintext, plen, result);
  2869             return PR_FALSE;
  2873     printf("PASS\n");
  2874     return PR_TRUE;
  2877 /* PL_Base64Decode, random strings, malloc */
  2878 PRBool test_027(void)
  2880     int i;
  2882     printf("Test 027 (PL_Base64Decode, random strings, equals, malloc, strlen)    ..."); fflush(stdout);
  2884     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2886         PRUint32 clen = PL_strlen(array[i].cyphertext);
  2888         char *rv = PL_Base64Decode(array[i].cyphertext, 0, (char *)0);
  2890         if( (char *)0 == rv )
  2892             printf("FAIL\n\t(%d): no return value\n", i);
  2893             return PR_FALSE;
  2896         if( 0 != PL_strcmp(rv, array[i].plaintext) )
  2898             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2899                    i, array[i].cyphertext, array[i].plaintext, rv);
  2900             PR_DELETE(rv);
  2901             return PR_FALSE;
  2904         PR_DELETE(rv);
  2907     printf("PASS\n");
  2908     return PR_TRUE;
  2911 /* PL_Base64Encode, random strings, malloc */
  2912 PRBool test_028(void)
  2914     int i;
  2915     char buffer[ 4096 ];
  2916     char *rv;
  2918     printf("Test 028 (PL_Base64Decode, random strings, no equals, malloc, strlen) ..."); fflush(stdout);
  2920     for( i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
  2922         PRUint32 clen;
  2924         PL_strcpy(buffer, array[i].cyphertext);
  2925         clen = PL_strlen(buffer);
  2927         if( 0 == (clen & 3) )
  2929             if( '=' == buffer[clen-1] )
  2931                 if( '=' == buffer[clen-2] )
  2933                     buffer[clen-2] = buffer[clen-1] = (char)0;
  2934                     clen -= 2;
  2936                 else
  2938                     buffer[clen-1] = (char)0;
  2939                     clen -= 1;
  2944         rv = PL_Base64Decode(buffer, 0, (char *)0);
  2946         if( (char *)0 == rv )
  2948             printf("FAIL\n\t(%d): no return value\n", i);
  2949             return PR_FALSE;
  2952         if( 0 != PL_strcmp(rv, array[i].plaintext) )
  2954             printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", 
  2955                    i, array[i].cyphertext, array[i].plaintext, rv);
  2956             return PR_FALSE;
  2960     printf("PASS\n");
  2961     return PR_TRUE;
  2964 int
  2965 main
  2967     int     argc,
  2968     char   *argv[]
  2971     printf("Testing the Portable Library base64 functions:\n");
  2972     printf("(warning: the \"triple characters\" tests are slow)\n");
  2974     if( 1
  2975         && test_001()
  2976         && test_002()
  2977         && test_003()
  2978         && test_004()
  2979         && test_005()
  2980         && test_006()
  2981         && test_007()
  2982         && test_008()
  2983         && test_009()
  2984         && test_010()
  2985         && test_011()
  2986         && test_012()
  2987         && test_013()
  2988         && test_014()
  2989         && test_015()
  2990         && test_016()
  2991         && test_017()
  2992         && test_018()
  2993         && test_019()
  2994         && test_020()
  2995         && test_021()
  2996         && test_022()
  2997         && test_023()
  2998         && test_024()
  2999         && test_025()
  3000         && test_026()
  3001         && test_027()
  3002         && test_028()
  3005         printf("Suite passed.\n");
  3006         return 0;
  3008     else
  3010         printf("Suite failed.\n");
  3011         return 1;
  3014     /*NOTREACHED*/

mercurial