/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "plbase64.h"
#include "plstr.h"
#include "nspr.h"

#include <stdio.h>

static unsigned char *base = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

/* PL_Base64Encode, single characters */
PRBool test_001(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 001 (PL_Base64Encode, single characters)                         "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Encode((char*)plain, 1, result);
      if (rv != result) {
        printf("FAIL\n\t(%d, %d): return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strncmp((char*)cypher, result, 4)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.4s.\"\n", a, b,
               cypher, result);
        return PR_FALSE;
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, double characters */
PRBool test_002(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 002 (PL_Base64Encode, double characters)                         "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Encode((char*)plain, 2, result);
          if (rv != result) {
            printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strncmp((char*)cypher, result, 4)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.4s.\"\n",
                   a, b, c, d, cypher, result);
            return PR_FALSE;
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, triple characters */
PRBool test_003(void) {
  PRUint32 a, b, c, d, e, f;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 003 (PL_Base64Encode, triple characters)                         "
      "...");
  fflush(stdout);

  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          for (e = 0; e < 4; e++) {
            cypher[2] = base[d * 4 + e];
            for (f = 0; f < 64; f++) {
              plain[2] = e * 64 + f;
              cypher[3] = base[f];

              rv = PL_Base64Encode((char*)plain, 3, result);
              if (rv != result) {
                printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b,
                       c, d, e, f);
                return PR_FALSE;
              }

              if (0 != PL_strncmp((char*)cypher, result, 4)) {
                printf(
                    "FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got "
                    "\"%.4s.\"\n",
                    a, b, c, d, e, f, cypher, result);
                return PR_FALSE;
              }
            }
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

static struct {
  const char* plaintext;
  const char* cyphertext;
} array[] = {
    /* Cyphertexts generated with uuenview 0.5.13 */
    {" ", "IA=="},
    {".", "Lg=="},
    {"/", "Lw=="},
    {"C", "Qw=="},
    {"H", "SA=="},
    {"S", "Uw=="},
    {"^", "Xg=="},
    {"a", "YQ=="},
    {"o", "bw=="},
    {"t", "dA=="},

    {"AB", "QUI="},
    {"AH", "QUg="},
    {"AQ", "QVE="},
    {"BD", "QkQ="},
    {"CR", "Q1I="},
    {"CS", "Q1M="},
    {"DB", "REI="},
    {"DC", "REM="},
    {"EK", "RUs="},
    {"ET", "RVQ="},
    {"IM", "SU0="},
    {"JR", "SlI="},
    {"LO", "TE8="},
    {"LW", "TFc="},
    {"ML", "TUw="},
    {"SB", "U0I="},
    {"TO", "VE8="},
    {"VS", "VlM="},
    {"WP", "V1A="},
    /* legitimate two-letter words */
    {"ad", "YWQ="},
    {"ah", "YWg="},
    {"am", "YW0="},
    {"an", "YW4="},
    {"as", "YXM="},
    {"at", "YXQ="},
    {"ax", "YXg="},
    {"be", "YmU="},
    {"by", "Ynk="},
    {"do", "ZG8="},
    {"go", "Z28="},
    {"he", "aGU="},
    {"hi", "aGk="},
    {"if", "aWY="},
    {"in", "aW4="},
    {"is", "aXM="},
    {"it", "aXQ="},
    {"me", "bWU="},
    {"my", "bXk="},
    {"no", "bm8="},
    {"of", "b2Y="},
    {"on", "b24="},
    {"or", "b3I="},
    {"ox", "b3g="},
    {"so", "c28="},
    {"to", "dG8="},
    {"up", "dXA="},
    {"us", "dXM="},
    {"we", "d2U="},
    /* all three-letter entries in /usr/dict/words */
    {"1st", "MXN0"},
    {"2nd", "Mm5k"},
    {"3rd", "M3Jk"},
    {"4th", "NHRo"},
    {"5th", "NXRo"},
    {"6th", "NnRo"},
    {"7th", "N3Ro"},
    {"8th", "OHRo"},
    {"9th", "OXRo"},
    {"AAA", "QUFB"},
    {"AAU", "QUFV"},
    {"ABA", "QUJB"},
    {"abc", "YWJj"},
    {"Abe", "QWJl"},
    {"Abo", "QWJv"},
    {"ace", "YWNl"},
    {"ACM", "QUNN"},
    {"ACS", "QUNT"},
    {"act", "YWN0"},
    {"Ada", "QWRh"},
    {"add", "YWRk"},
    {"ado", "YWRv"},
    {"aft", "YWZ0"},
    {"age", "YWdl"},
    {"ago", "YWdv"},
    {"aid", "YWlk"},
    {"ail", "YWls"},
    {"aim", "YWlt"},
    {"air", "YWly"},
    {"ala", "YWxh"},
    {"alb", "YWxi"},
    {"ale", "YWxl"},
    {"Ali", "QWxp"},
    {"all", "YWxs"},
    {"alp", "YWxw"},
    {"A&M", "QSZN"},
    {"AMA", "QU1B"},
    {"ami", "YW1p"},
    {"amp", "YW1w"},
    {"Amy", "QW15"},
    {"amy", "YW15"},
    {"ana", "YW5h"},
    {"and", "YW5k"},
    {"ani", "YW5p"},
    {"Ann", "QW5u"},
    {"ant", "YW50"},
    {"any", "YW55"},
    {"A&P", "QSZQ"},
    {"ape", "YXBl"},
    {"Apr", "QXBy"},
    {"APS", "QVBT"},
    {"apt", "YXB0"},
    {"arc", "YXJj"},
    {"are", "YXJl"},
    {"ark", "YXJr"},
    {"arm", "YXJt"},
    {"art", "YXJ0"},
    {"a's", "YSdz"},
    {"ash", "YXNo"},
    {"ask", "YXNr"},
    {"ass", "YXNz"},
    {"ate", "YXRl"},
    {"Aug", "QXVn"},
    {"auk", "YXVr"},
    {"Ave", "QXZl"},
    {"awe", "YXdl"},
    {"awl", "YXds"},
    {"awn", "YXdu"},
    {"axe", "YXhl"},
    {"aye", "YXll"},
    {"bad", "YmFk"},
    {"bag", "YmFn"},
    {"bah", "YmFo"},
    {"bam", "YmFt"},
    {"ban", "YmFu"},
    {"bar", "YmFy"},
    {"bat", "YmF0"},
    {"bay", "YmF5"},
    {"bed", "YmVk"},
    {"bee", "YmVl"},
    {"beg", "YmVn"},
    {"bel", "YmVs"},
    {"Ben", "QmVu"},
    {"bet", "YmV0"},
    {"bey", "YmV5"},
    {"bib", "Ymli"},
    {"bid", "Ymlk"},
    {"big", "Ymln"},
    {"bin", "Ymlu"},
    {"bit", "Yml0"},
    {"biz", "Yml6"},
    {"BMW", "Qk1X"},
    {"boa", "Ym9h"},
    {"bob", "Ym9i"},
    {"bog", "Ym9n"},
    {"bon", "Ym9u"},
    {"boo", "Ym9v"},
    {"bop", "Ym9w"},
    {"bow", "Ym93"},
    {"box", "Ym94"},
    {"boy", "Ym95"},
    {"b's", "Yidz"},
    {"BTL", "QlRM"},
    {"BTU", "QlRV"},
    {"bub", "YnVi"},
    {"bud", "YnVk"},
    {"bug", "YnVn"},
    {"bum", "YnVt"},
    {"bun", "YnVu"},
    {"bus", "YnVz"},
    {"but", "YnV0"},
    {"buy", "YnV5"},
    {"bye", "Ynll"},
    {"cab", "Y2Fi"},
    {"Cal", "Q2Fs"},
    {"cam", "Y2Ft"},
    {"can", "Y2Fu"},
    {"cap", "Y2Fw"},
    {"car", "Y2Fy"},
    {"cat", "Y2F0"},
    {"caw", "Y2F3"},
    {"CBS", "Q0JT"},
    {"CDC", "Q0RD"},
    {"CEQ", "Q0VR"},
    {"chi", "Y2hp"},
    {"CIA", "Q0lB"},
    {"cit", "Y2l0"},
    {"cod", "Y29k"},
    {"cog", "Y29n"},
    {"col", "Y29s"},
    {"con", "Y29u"},
    {"coo", "Y29v"},
    {"cop", "Y29w"},
    {"cos", "Y29z"},
    {"cot", "Y290"},
    {"cow", "Y293"},
    {"cox", "Y294"},
    {"coy", "Y295"},
    {"CPA", "Q1BB"},
    {"cpu", "Y3B1"},
    {"CRT", "Q1JU"},
    {"cry", "Y3J5"},
    {"c's", "Yydz"},
    {"cub", "Y3Vi"},
    {"cud", "Y3Vk"},
    {"cue", "Y3Vl"},
    {"cup", "Y3Vw"},
    {"cur", "Y3Vy"},
    {"cut", "Y3V0"},
    {"dab", "ZGFi"},
    {"dad", "ZGFk"},
    {"dam", "ZGFt"},
    {"Dan", "RGFu"},
    {"Dar", "RGFy"},
    {"day", "ZGF5"},
    {"Dec", "RGVj"},
    {"Dee", "RGVl"},
    {"Del", "RGVs"},
    {"den", "ZGVu"},
    {"Des", "RGVz"},
    {"dew", "ZGV3"},
    {"dey", "ZGV5"},
    {"did", "ZGlk"},
    {"die", "ZGll"},
    {"dig", "ZGln"},
    {"dim", "ZGlt"},
    {"din", "ZGlu"},
    {"dip", "ZGlw"},
    {"Dis", "RGlz"},
    {"DNA", "RE5B"},
    {"DOD", "RE9E"},
    {"doe", "ZG9l"},
    {"dog", "ZG9n"},
    {"don", "ZG9u"},
    {"dot", "ZG90"},
    {"Dow", "RG93"},
    {"dry", "ZHJ5"},
    {"d's", "ZCdz"},
    {"dub", "ZHVi"},
    {"dud", "ZHVk"},
    {"due", "ZHVl"},
    {"dug", "ZHVn"},
    {"dun", "ZHVu"},
    {"dye", "ZHll"},
    {"ear", "ZWFy"},
    {"eat", "ZWF0"},
    {"ebb", "ZWJi"},
    {"EDT", "RURU"},
    {"eel", "ZWVs"},
    {"eft", "ZWZ0"},
    {"e.g", "ZS5n"},
    {"egg", "ZWdn"},
    {"ego", "ZWdv"},
    {"eke", "ZWtl"},
    {"Eli", "RWxp"},
    {"elk", "ZWxr"},
    {"ell", "ZWxs"},
    {"elm", "ZWxt"},
    {"Ely", "RWx5"},
    {"end", "ZW5k"},
    {"Eng", "RW5n"},
    {"EPA", "RVBB"},
    {"era", "ZXJh"},
    {"ere", "ZXJl"},
    {"erg", "ZXJn"},
    {"err", "ZXJy"},
    {"e's", "ZSdz"},
    {"EST", "RVNU"},
    {"eta", "ZXRh"},
    {"etc", "ZXRj"},
    {"Eva", "RXZh"},
    {"eve", "ZXZl"},
    {"ewe", "ZXdl"},
    {"eye", "ZXll"},
    {"FAA", "RkFB"},
    {"fad", "ZmFk"},
    {"fag", "ZmFn"},
    {"fan", "ZmFu"},
    {"far", "ZmFy"},
    {"fat", "ZmF0"},
    {"fay", "ZmF5"},
    {"FBI", "RkJJ"},
    {"FCC", "RkND"},
    {"FDA", "RkRB"},
    {"Feb", "RmVi"},
    {"fed", "ZmVk"},
    {"fee", "ZmVl"},
    {"few", "ZmV3"},
    {"fib", "Zmli"},
    {"fig", "Zmln"},
    {"fin", "Zmlu"},
    {"fir", "Zmly"},
    {"fit", "Zml0"},
    {"fix", "Zml4"},
    {"Flo", "Rmxv"},
    {"flu", "Zmx1"},
    {"fly", "Zmx5"},
    {"FMC", "Rk1D"},
    {"fob", "Zm9i"},
    {"foe", "Zm9l"},
    {"fog", "Zm9n"},
    {"fop", "Zm9w"},
    {"for", "Zm9y"},
    {"fox", "Zm94"},
    {"FPC", "RlBD"},
    {"fro", "ZnJv"},
    {"fry", "ZnJ5"},
    {"f's", "Zidz"},
    {"FTC", "RlRD"},
    {"fum", "ZnVt"},
    {"fun", "ZnVu"},
    {"fur", "ZnVy"},
    {"gab", "Z2Fi"},
    {"gad", "Z2Fk"},
    {"gag", "Z2Fn"},
    {"gal", "Z2Fs"},
    {"gam", "Z2Ft"},
    {"GAO", "R0FP"},
    {"gap", "Z2Fw"},
    {"gar", "Z2Fy"},
    {"gas", "Z2Fz"},
    {"gay", "Z2F5"},
    {"gee", "Z2Vl"},
    {"gel", "Z2Vs"},
    {"gem", "Z2Vt"},
    {"get", "Z2V0"},
    {"gig", "Z2ln"},
    {"Gil", "R2ls"},
    {"gin", "Z2lu"},
    {"GMT", "R01U"},
    {"GNP", "R05Q"},
    {"gnu", "Z251"},
    {"Goa", "R29h"},
    {"gob", "Z29i"},
    {"god", "Z29k"},
    {"gog", "Z29n"},
    {"GOP", "R09Q"},
    {"got", "Z290"},
    {"GPO", "R1BP"},
    {"g's", "Zydz"},
    {"GSA", "R1NB"},
    {"gum", "Z3Vt"},
    {"gun", "Z3Vu"},
    {"Gus", "R3Vz"},
    {"gut", "Z3V0"},
    {"guy", "Z3V5"},
    {"gym", "Z3lt"},
    {"gyp", "Z3lw"},
    {"had", "aGFk"},
    {"Hal", "SGFs"},
    {"ham", "aGFt"},
    {"Han", "SGFu"},
    {"hap", "aGFw"},
    {"hat", "aGF0"},
    {"haw", "aGF3"},
    {"hay", "aGF5"},
    {"hem", "aGVt"},
    {"hen", "aGVu"},
    {"her", "aGVy"},
    {"hew", "aGV3"},
    {"hex", "aGV4"},
    {"hey", "aGV5"},
    {"hid", "aGlk"},
    {"him", "aGlt"},
    {"hip", "aGlw"},
    {"his", "aGlz"},
    {"hit", "aGl0"},
    {"hob", "aG9i"},
    {"hoc", "aG9j"},
    {"hoe", "aG9l"},
    {"hog", "aG9n"},
    {"hoi", "aG9p"},
    {"Hom", "SG9t"},
    {"hop", "aG9w"},
    {"hot", "aG90"},
    {"how", "aG93"},
    {"hoy", "aG95"},
    {"h's", "aCdz"},
    {"hub", "aHVi"},
    {"hue", "aHVl"},
    {"hug", "aHVn"},
    {"huh", "aHVo"},
    {"hum", "aHVt"},
    {"Hun", "SHVu"},
    {"hut", "aHV0"},
    {"Ian", "SWFu"},
    {"IBM", "SUJN"},
    {"Ibn", "SWJu"},
    {"ICC", "SUND"},
    {"ice", "aWNl"},
    {"icy", "aWN5"},
    {"I'd", "SSdk"},
    {"Ida", "SWRh"},
    {"i.e", "aS5l"},
    {"iii", "aWlp"},
    {"Ike", "SWtl"},
    {"ill", "aWxs"},
    {"I'm", "SSdt"},
    {"imp", "aW1w"},
    {"Inc", "SW5j"},
    {"ink", "aW5r"},
    {"inn", "aW5u"},
    {"ion", "aW9u"},
    {"Ira", "SXJh"},
    {"ire", "aXJl"},
    {"irk", "aXJr"},
    {"IRS", "SVJT"},
    {"i's", "aSdz"},
    {"Ito", "SXRv"},
    {"ITT", "SVRU"},
    {"ivy", "aXZ5"},
    {"jab", "amFi"},
    {"jag", "amFn"},
    {"jam", "amFt"},
    {"Jan", "SmFu"},
    {"jar", "amFy"},
    {"jaw", "amF3"},
    {"jay", "amF5"},
    {"Jed", "SmVk"},
    {"jet", "amV0"},
    {"Jew", "SmV3"},
    {"jig", "amln"},
    {"Jim", "Smlt"},
    {"job", "am9i"},
    {"Joe", "Sm9l"},
    {"jog", "am9n"},
    {"Jon", "Sm9u"},
    {"jot", "am90"},
    {"joy", "am95"},
    {"j's", "aidz"},
    {"jug", "anVn"},
    {"jut", "anV0"},
    {"Kay", "S2F5"},
    {"keg", "a2Vn"},
    {"ken", "a2Vu"},
    {"key", "a2V5"},
    {"kid", "a2lk"},
    {"Kim", "S2lt"},
    {"kin", "a2lu"},
    {"kit", "a2l0"},
    {"k's", "aydz"},
    {"lab", "bGFi"},
    {"lac", "bGFj"},
    {"lad", "bGFk"},
    {"lag", "bGFn"},
    {"lam", "bGFt"},
    {"Lao", "TGFv"},
    {"lap", "bGFw"},
    {"law", "bGF3"},
    {"lax", "bGF4"},
    {"lay", "bGF5"},
    {"lea", "bGVh"},
    {"led", "bGVk"},
    {"lee", "bGVl"},
    {"leg", "bGVn"},
    {"Len", "TGVu"},
    {"Leo", "TGVv"},
    {"let", "bGV0"},
    {"Lev", "TGV2"},
    {"Lew", "TGV3"},
    {"lew", "bGV3"},
    {"lid", "bGlk"},
    {"lie", "bGll"},
    {"lim", "bGlt"},
    {"Lin", "TGlu"},
    {"lip", "bGlw"},
    {"lit", "bGl0"},
    {"Liz", "TGl6"},
    {"lob", "bG9i"},
    {"log", "bG9n"},
    {"lop", "bG9w"},
    {"Los", "TG9z"},
    {"lot", "bG90"},
    {"Lou", "TG91"},
    {"low", "bG93"},
    {"loy", "bG95"},
    {"l's", "bCdz"},
    {"LSI", "TFNJ"},
    {"Ltd", "THRk"},
    {"LTV", "TFRW"},
    {"lug", "bHVn"},
    {"lux", "bHV4"},
    {"lye", "bHll"},
    {"Mac", "TWFj"},
    {"mad", "bWFk"},
    {"Mae", "TWFl"},
    {"man", "bWFu"},
    {"Mao", "TWFv"},
    {"map", "bWFw"},
    {"mar", "bWFy"},
    {"mat", "bWF0"},
    {"maw", "bWF3"},
    {"Max", "TWF4"},
    {"max", "bWF4"},
    {"may", "bWF5"},
    {"MBA", "TUJB"},
    {"Meg", "TWVn"},
    {"Mel", "TWVs"},
    {"men", "bWVu"},
    {"met", "bWV0"},
    {"mew", "bWV3"},
    {"mid", "bWlk"},
    {"mig", "bWln"},
    {"min", "bWlu"},
    {"MIT", "TUlU"},
    {"mix", "bWl4"},
    {"mob", "bW9i"},
    {"Moe", "TW9l"},
    {"moo", "bW9v"},
    {"mop", "bW9w"},
    {"mot", "bW90"},
    {"mow", "bW93"},
    {"MPH", "TVBI"},
    {"Mrs", "TXJz"},
    {"m's", "bSdz"},
    {"mud", "bXVk"},
    {"mug", "bXVn"},
    {"mum", "bXVt"},
    {"nab", "bmFi"},
    {"nag", "bmFn"},
    {"Nan", "TmFu"},
    {"nap", "bmFw"},
    {"Nat", "TmF0"},
    {"nay", "bmF5"},
    {"NBC", "TkJD"},
    {"NBS", "TkJT"},
    {"NCO", "TkNP"},
    {"NCR", "TkNS"},
    {"Ned", "TmVk"},
    {"nee", "bmVl"},
    {"net", "bmV0"},
    {"new", "bmV3"},
    {"nib", "bmli"},
    {"NIH", "TklI"},
    {"nil", "bmls"},
    {"nip", "bmlw"},
    {"nit", "bml0"},
    {"NNE", "Tk5F"},
    {"NNW", "Tk5X"},
    {"nob", "bm9i"},
    {"nod", "bm9k"},
    {"non", "bm9u"},
    {"nor", "bm9y"},
    {"not", "bm90"},
    {"Nov", "Tm92"},
    {"now", "bm93"},
    {"NRC", "TlJD"},
    {"n's", "bidz"},
    {"NSF", "TlNG"},
    {"nun", "bnVu"},
    {"nut", "bnV0"},
    {"NYC", "TllD"},
    {"NYU", "TllV"},
    {"oaf", "b2Fm"},
    {"oak", "b2Fr"},
    {"oar", "b2Fy"},
    {"oat", "b2F0"},
    {"Oct", "T2N0"},
    {"odd", "b2Rk"},
    {"ode", "b2Rl"},
    {"off", "b2Zm"},
    {"oft", "b2Z0"},
    {"ohm", "b2ht"},
    {"oil", "b2ls"},
    {"old", "b2xk"},
    {"one", "b25l"},
    {"opt", "b3B0"},
    {"orb", "b3Ji"},
    {"ore", "b3Jl"},
    {"Orr", "T3Jy"},
    {"o's", "bydz"},
    {"Ott", "T3R0"},
    {"our", "b3Vy"},
    {"out", "b3V0"},
    {"ova", "b3Zh"},
    {"owe", "b3dl"},
    {"owl", "b3ds"},
    {"own", "b3du"},
    {"pad", "cGFk"},
    {"pal", "cGFs"},
    {"Pam", "UGFt"},
    {"pan", "cGFu"},
    {"pap", "cGFw"},
    {"par", "cGFy"},
    {"pat", "cGF0"},
    {"paw", "cGF3"},
    {"pax", "cGF4"},
    {"pay", "cGF5"},
    {"Paz", "UGF6"},
    {"PBS", "UEJT"},
    {"PDP", "UERQ"},
    {"pea", "cGVh"},
    {"pee", "cGVl"},
    {"peg", "cGVn"},
    {"pen", "cGVu"},
    {"pep", "cGVw"},
    {"per", "cGVy"},
    {"pet", "cGV0"},
    {"pew", "cGV3"},
    {"PhD", "UGhE"},
    {"phi", "cGhp"},
    {"pie", "cGll"},
    {"pig", "cGln"},
    {"pin", "cGlu"},
    {"pip", "cGlw"},
    {"pit", "cGl0"},
    {"ply", "cGx5"},
    {"pod", "cG9k"},
    {"Poe", "UG9l"},
    {"poi", "cG9p"},
    {"pol", "cG9s"},
    {"pop", "cG9w"},
    {"pot", "cG90"},
    {"pow", "cG93"},
    {"ppm", "cHBt"},
    {"pro", "cHJv"},
    {"pry", "cHJ5"},
    {"p's", "cCdz"},
    {"psi", "cHNp"},
    {"PTA", "UFRB"},
    {"pub", "cHVi"},
    {"PUC", "UFVD"},
    {"pug", "cHVn"},
    {"pun", "cHVu"},
    {"pup", "cHVw"},
    {"pus", "cHVz"},
    {"put", "cHV0"},
    {"PVC", "UFZD"},
    {"QED", "UUVE"},
    {"q's", "cSdz"},
    {"qua", "cXVh"},
    {"quo", "cXVv"},
    {"Rae", "UmFl"},
    {"rag", "cmFn"},
    {"raj", "cmFq"},
    {"ram", "cmFt"},
    {"ran", "cmFu"},
    {"rap", "cmFw"},
    {"rat", "cmF0"},
    {"raw", "cmF3"},
    {"ray", "cmF5"},
    {"RCA", "UkNB"},
    {"R&D", "UiZE"},
    {"reb", "cmVi"},
    {"red", "cmVk"},
    {"rep", "cmVw"},
    {"ret", "cmV0"},
    {"rev", "cmV2"},
    {"Rex", "UmV4"},
    {"rho", "cmhv"},
    {"rib", "cmli"},
    {"rid", "cmlk"},
    {"rig", "cmln"},
    {"rim", "cmlt"},
    {"Rio", "Umlv"},
    {"rip", "cmlw"},
    {"RNA", "Uk5B"},
    {"rob", "cm9i"},
    {"rod", "cm9k"},
    {"roe", "cm9l"},
    {"Ron", "Um9u"},
    {"rot", "cm90"},
    {"row", "cm93"},
    {"Roy", "Um95"},
    {"RPM", "UlBN"},
    {"r's", "cidz"},
    {"rub", "cnVi"},
    {"rue", "cnVl"},
    {"rug", "cnVn"},
    {"rum", "cnVt"},
    {"run", "cnVu"},
    {"rut", "cnV0"},
    {"rye", "cnll"},
    {"sac", "c2Fj"},
    {"sad", "c2Fk"},
    {"sag", "c2Fn"},
    {"Sal", "U2Fs"},
    {"Sam", "U2Ft"},
    {"San", "U2Fu"},
    {"Sao", "U2Fv"},
    {"sap", "c2Fw"},
    {"sat", "c2F0"},
    {"saw", "c2F3"},
    {"sax", "c2F4"},
    {"say", "c2F5"},
    {"Sci", "U2Np"},
    {"SCM", "U0NN"},
    {"sea", "c2Vh"},
    {"sec", "c2Vj"},
    {"see", "c2Vl"},
    {"sen", "c2Vu"},
    {"seq", "c2Vx"},
    {"set", "c2V0"},
    {"sew", "c2V3"},
    {"sex", "c2V4"},
    {"she", "c2hl"},
    {"Shu", "U2h1"},
    {"shy", "c2h5"},
    {"sib", "c2li"},
    {"sic", "c2lj"},
    {"sin", "c2lu"},
    {"sip", "c2lw"},
    {"sir", "c2ly"},
    {"sis", "c2lz"},
    {"sit", "c2l0"},
    {"six", "c2l4"},
    {"ski", "c2tp"},
    {"sky", "c2t5"},
    {"sly", "c2x5"},
    {"sob", "c29i"},
    {"Soc", "U29j"},
    {"sod", "c29k"},
    {"Sol", "U29s"},
    {"son", "c29u"},
    {"sop", "c29w"},
    {"sou", "c291"},
    {"sow", "c293"},
    {"soy", "c295"},
    {"spa", "c3Bh"},
    {"spy", "c3B5"},
    {"Sri", "U3Jp"},
    {"s's", "cydz"},
    {"SSE", "U1NF"},
    {"SST", "U1NU"},
    {"SSW", "U1NX"},
    {"Stu", "U3R1"},
    {"sub", "c3Vi"},
    {"sud", "c3Vk"},
    {"sue", "c3Vl"},
    {"sum", "c3Vt"},
    {"sun", "c3Vu"},
    {"sup", "c3Vw"},
    {"Sus", "U3Vz"},
    {"tab", "dGFi"},
    {"tad", "dGFk"},
    {"tag", "dGFn"},
    {"tam", "dGFt"},
    {"tan", "dGFu"},
    {"tao", "dGFv"},
    {"tap", "dGFw"},
    {"tar", "dGFy"},
    {"tat", "dGF0"},
    {"tau", "dGF1"},
    {"tax", "dGF4"},
    {"tea", "dGVh"},
    {"Ted", "VGVk"},
    {"ted", "dGVk"},
    {"tee", "dGVl"},
    {"Tel", "VGVs"},
    {"ten", "dGVu"},
    {"the", "dGhl"},
    {"thy", "dGh5"},
    {"tic", "dGlj"},
    {"tid", "dGlk"},
    {"tie", "dGll"},
    {"til", "dGls"},
    {"Tim", "VGlt"},
    {"tin", "dGlu"},
    {"tip", "dGlw"},
    {"tit", "dGl0"},
    {"TNT", "VE5U"},
    {"toe", "dG9l"},
    {"tog", "dG9n"},
    {"Tom", "VG9t"},
    {"ton", "dG9u"},
    {"too", "dG9v"},
    {"top", "dG9w"},
    {"tor", "dG9y"},
    {"tot", "dG90"},
    {"tow", "dG93"},
    {"toy", "dG95"},
    {"TRW", "VFJX"},
    {"try", "dHJ5"},
    {"t's", "dCdz"},
    {"TTL", "VFRM"},
    {"TTY", "VFRZ"},
    {"tub", "dHVi"},
    {"tug", "dHVn"},
    {"tum", "dHVt"},
    {"tun", "dHVu"},
    {"TVA", "VFZB"},
    {"TWA", "VFdB"},
    {"two", "dHdv"},
    {"TWX", "VFdY"},
    {"ugh", "dWdo"},
    {"UHF", "VUhG"},
    {"Uri", "VXJp"},
    {"urn", "dXJu"},
    {"U.S", "VS5T"},
    {"u's", "dSdz"},
    {"USA", "VVNB"},
    {"USC", "VVND"},
    {"use", "dXNl"},
    {"USN", "VVNO"},
    {"van", "dmFu"},
    {"vat", "dmF0"},
    {"vee", "dmVl"},
    {"vet", "dmV0"},
    {"vex", "dmV4"},
    {"VHF", "VkhG"},
    {"via", "dmlh"},
    {"vie", "dmll"},
    {"vii", "dmlp"},
    {"vis", "dmlz"},
    {"viz", "dml6"},
    {"von", "dm9u"},
    {"vow", "dm93"},
    {"v's", "didz"},
    {"WAC", "V0FD"},
    {"wad", "d2Fk"},
    {"wag", "d2Fn"},
    {"wah", "d2Fo"},
    {"wan", "d2Fu"},
    {"war", "d2Fy"},
    {"was", "d2Fz"},
    {"wax", "d2F4"},
    {"way", "d2F5"},
    {"web", "d2Vi"},
    {"wed", "d2Vk"},
    {"wee", "d2Vl"},
    {"Wei", "V2Vp"},
    {"wet", "d2V0"},
    {"who", "d2hv"},
    {"why", "d2h5"},
    {"wig", "d2ln"},
    {"win", "d2lu"},
    {"wit", "d2l0"},
    {"woe", "d29l"},
    {"wok", "d29r"},
    {"won", "d29u"},
    {"woo", "d29v"},
    {"wop", "d29w"},
    {"wow", "d293"},
    {"wry", "d3J5"},
    {"w's", "dydz"},
    {"x's", "eCdz"},
    {"yah", "eWFo"},
    {"yak", "eWFr"},
    {"yam", "eWFt"},
    {"yap", "eWFw"},
    {"yaw", "eWF3"},
    {"yea", "eWVh"},
    {"yen", "eWVu"},
    {"yet", "eWV0"},
    {"yin", "eWlu"},
    {"yip", "eWlw"},
    {"yon", "eW9u"},
    {"you", "eW91"},
    {"yow", "eW93"},
    {"y's", "eSdz"},
    {"yuh", "eXVo"},
    {"zag", "emFn"},
    {"Zan", "WmFu"},
    {"zap", "emFw"},
    {"Zen", "WmVu"},
    {"zig", "emln"},
    {"zip", "emlw"},
    {"Zoe", "Wm9l"},
    {"zoo", "em9v"},
    {"z's", "eidz"},
    /* the false rumors file */
    {"\"So when I die, the first thing I will see in heaven is a score list?\"",
     "IlNvIHdoZW4gSSBkaWUsIHRoZSBmaXJzdCB0aGluZyBJIHdpbGwgc2VlIGluIGhlYXZlbiBpc"
     "yBhIHNjb3JlIGxpc3Q/Ig=="},
    {"1st Law of Hacking: leaving is much more difficult than entering.",
     "MXN0IExhdyBvZiBIYWNraW5nOiBsZWF2aW5nIGlzIG11Y2ggbW9yZSBkaWZmaWN1bHQgdGhhb"
     "iBlbnRlcmluZy4="},
    {"2nd Law of Hacking: first in, first out.",
     "Mm5kIExhdyBvZiBIYWNraW5nOiBmaXJzdCBpbiwgZmlyc3Qgb3V0Lg=="},
    {"3rd Law of Hacking: the last blow counts most.",
     "M3JkIExhdyBvZiBIYWNraW5nOiB0aGUgbGFzdCBibG93IGNvdW50cyBtb3N0Lg=="},
    {"4th Law of Hacking: you will find the exit at the entrance.",
     "NHRoIExhdyBvZiBIYWNraW5nOiB5b3Ugd2lsbCBmaW5kIHRoZSBleGl0IGF0IHRoZSBlbnRyY"
     "W5jZS4="},
    {"A chameleon imitating a mail daemon often delivers scrolls of fire.",
     "QSBjaGFtZWxlb24gaW1pdGF0aW5nIGEgbWFpbCBkYWVtb24gb2Z0ZW4gZGVsaXZlcnMgc2Nyb"
     "2xscyBvZiBmaXJlLg=="},
    {"A cockatrice corpse is guaranteed to be untainted!",
     "QSBjb2NrYXRyaWNlIGNvcnBzZSBpcyBndWFyYW50ZWVkIHRvIGJlIHVudGFpbnRlZCE="},
    {"A dead cockatrice is just a dead lizard.",
     "QSBkZWFkIGNvY2thdHJpY2UgaXMganVzdCBhIGRlYWQgbGl6YXJkLg=="},
    {"A dragon is just a snake that ate a scroll of fire.",
     "QSBkcmFnb24gaXMganVzdCBhIHNuYWtlIHRoYXQgYXRlIGEgc2Nyb2xsIG9mIGZpcmUu"},
    {"A fading corridor enlightens your insight.",
     "QSBmYWRpbmcgY29ycmlkb3IgZW5saWdodGVucyB5b3VyIGluc2lnaHQu"},
    {"A glowing potion is too hot to drink.",
     "QSBnbG93aW5nIHBvdGlvbiBpcyB0b28gaG90IHRvIGRyaW5rLg=="},
    {"A good amulet may protect you against guards.",
     "QSBnb29kIGFtdWxldCBtYXkgcHJvdGVjdCB5b3UgYWdhaW5zdCBndWFyZHMu"},
    {"A lizard corpse is a good thing to turn undead.",
     "QSBsaXphcmQgY29ycHNlIGlzIGEgZ29vZCB0aGluZyB0byB0dXJuIHVuZGVhZC4="},
    {"A long worm can be defined recursively. So how should you attack it?",
     "QSBsb25nIHdvcm0gY2FuIGJlIGRlZmluZWQgcmVjdXJzaXZlbHkuIFNvIGhvdyBzaG91bGQge"
     "W91IGF0dGFjayBpdD8="},
    {"A monstrous mind is a toy forever.",
     "QSBtb25zdHJvdXMgbWluZCBpcyBhIHRveSBmb3JldmVyLg=="},
    {"A nymph will be very pleased if you call her by her real name: Lorelei.",
     "QSBueW1waCB3aWxsIGJlIHZlcnkgcGxlYXNlZCBpZiB5b3UgY2FsbCBoZXIgYnkgaGVyIHJlY"
     "WwgbmFtZTogTG9yZWxlaS4="},
    {"A ring of dungeon master control is a great find.",
     "QSByaW5nIG9mIGR1bmdlb24gbWFzdGVyIGNvbnRyb2wgaXMgYSBncmVhdCBmaW5kLg=="},
    {"A ring of extra ring finger is useless if not enchanted.",
     "QSByaW5nIG9mIGV4dHJhIHJpbmcgZmluZ2VyIGlzIHVzZWxlc3MgaWYgbm90IGVuY2hhbnRlZ"
     "C4="},
    {"A rope may form a trail in a maze.",
     "QSByb3BlIG1heSBmb3JtIGEgdHJhaWwgaW4gYSBtYXplLg=="},
    {"A staff may recharge if you drop it for awhile.",
     "QSBzdGFmZiBtYXkgcmVjaGFyZ2UgaWYgeW91IGRyb3AgaXQgZm9yIGF3aGlsZS4="},
    {"A visit to the Zoo is very educational; you meet interesting animals.",
     "QSB2aXNpdCB0byB0aGUgWm9vIGlzIHZlcnkgZWR1Y2F0aW9uYWw7IHlvdSBtZWV0IGludGVyZ"
     "XN0aW5nIGFuaW1hbHMu"},
    {"A wand of deaf is a more dangerous weapon than a wand of sheep.",
     "QSB3YW5kIG9mIGRlYWYgaXMgYSBtb3JlIGRhbmdlcm91cyB3ZWFwb24gdGhhbiBhIHdhbmQgb"
     "2Ygc2hlZXAu"},
    {"A wand of vibration might bring the whole cave crashing about your ears.",
     "QSB3YW5kIG9mIHZpYnJhdGlvbiBtaWdodCBicmluZyB0aGUgd2hvbGUgY2F2ZSBjcmFzaGluZ"
     "yBhYm91dCB5b3VyIGVhcnMu"},
    {"A winner never quits. A quitter never wins.",
     "QSB3aW5uZXIgbmV2ZXIgcXVpdHMuIEEgcXVpdHRlciBuZXZlciB3aW5zLg=="},
    {"A wish? Okay, make me a fortune cookie!",
     "QSB3aXNoPyBPa2F5LCBtYWtlIG1lIGEgZm9ydHVuZSBjb29raWUh"},
    {"Afraid of mimics? Try to wear a ring of true seeing.",
     "QWZyYWlkIG9mIG1pbWljcz8gVHJ5IHRvIHdlYXIgYSByaW5nIG9mIHRydWUgc2VlaW5nLg="
     "="},
    {"All monsters are created evil, but some are more evil than others.",
     "QWxsIG1vbnN0ZXJzIGFyZSBjcmVhdGVkIGV2aWwsIGJ1dCBzb21lIGFyZSBtb3JlIGV2aWwgd"
     "GhhbiBvdGhlcnMu"},
    {"Always attack a floating eye from behind!",
     "QWx3YXlzIGF0dGFjayBhIGZsb2F0aW5nIGV5ZSBmcm9tIGJlaGluZCE="},
    {"An elven cloak is always the height of fashion.",
     "QW4gZWx2ZW4gY2xvYWsgaXMgYWx3YXlzIHRoZSBoZWlnaHQgb2YgZmFzaGlvbi4="},
    {"Any small object that is accidentally dropped will hide under a larger "
     "object.",
     "QW55IHNtYWxsIG9iamVjdCB0aGF0IGlzIGFjY2lkZW50YWxseSBkcm9wcGVkIHdpbGwgaGlkZ"
     "SB1bmRlciBhIGxhcmdlciBvYmplY3Qu"},
    {"Balrogs do not appear above level 20.",
     "QmFscm9ncyBkbyBub3QgYXBwZWFyIGFib3ZlIGxldmVsIDIwLg=="},
    {"Banana peels work especially well against Keystone Kops.",
     "QmFuYW5hIHBlZWxzIHdvcmsgZXNwZWNpYWxseSB3ZWxsIGFnYWluc3QgS2V5c3RvbmUgS29wc"
     "y4="},
    {"Be careful when eating bananas. Monsters might slip on the peels.",
     "QmUgY2FyZWZ1bCB3aGVuIGVhdGluZyBiYW5hbmFzLiBNb25zdGVycyBtaWdodCBzbGlwIG9uI"
     "HRoZSBwZWVscy4="},
    {"Better leave the dungeon; otherwise you might get hurt badly.",
     "QmV0dGVyIGxlYXZlIHRoZSBkdW5nZW9uOyBvdGhlcndpc2UgeW91IG1pZ2h0IGdldCBodXJ0I"
     "GJhZGx5Lg=="},
    {"Beware of the potion of nitroglycerin -- it's not for the weak of heart.",
     "QmV3YXJlIG9mIHRoZSBwb3Rpb24gb2Ygbml0cm9nbHljZXJpbiAtLSBpdCdzIG5vdCBmb3Igd"
     "GhlIHdlYWsgb2YgaGVhcnQu"},
    {"Beware: there's always a chance that your wand explodes as you try to "
     "zap it!",
     "QmV3YXJlOiB0aGVyZSdzIGFsd2F5cyBhIGNoYW5jZSB0aGF0IHlvdXIgd2FuZCBleHBsb2Rlc"
     "yBhcyB5b3UgdHJ5IHRvIHphcCBpdCE="},
    {"Beyond the 23rd level lies a happy retirement in a room of your own.",
     "QmV5b25kIHRoZSAyM3JkIGxldmVsIGxpZXMgYSBoYXBweSByZXRpcmVtZW50IGluIGEgcm9vb"
     "SBvZiB5b3VyIG93bi4="},
    {"Changing your suit without dropping your sword? You must be kidding!",
     "Q2hhbmdpbmcgeW91ciBzdWl0IHdpdGhvdXQgZHJvcHBpbmcgeW91ciBzd29yZD8gWW91IG11c"
     "3QgYmUga2lkZGluZyE="},
    {"Cockatrices might turn themselves to stone faced with a mirror.",
     "Q29ja2F0cmljZXMgbWlnaHQgdHVybiB0aGVtc2VsdmVzIHRvIHN0b25lIGZhY2VkIHdpdGggY"
     "SBtaXJyb3Iu"},
    {"Consumption of home-made food is strictly forbidden in this dungeon.",
     "Q29uc3VtcHRpb24gb2YgaG9tZS1tYWRlIGZvb2QgaXMgc3RyaWN0bHkgZm9yYmlkZGVuIGluI"
     "HRoaXMgZHVuZ2Vvbi4="},
    {"Dark room? Your chance to develop your photographs!",
     "RGFyayByb29tPyBZb3VyIGNoYW5jZSB0byBkZXZlbG9wIHlvdXIgcGhvdG9ncmFwaHMh"},
    {"Dark rooms are not *completely* dark: just wait and let your eyes "
     "adjust...",
     "RGFyayByb29tcyBhcmUgbm90ICpjb21wbGV0ZWx5KiBkYXJrOiBqdXN0IHdhaXQgYW5kIGxld"
     "CB5b3VyIGV5ZXMgYWRqdXN0Li4u"},
    {"David London sez, \"Hey guys, *WIELD* a lizard corpse against a "
     "cockatrice!\"",
     "RGF2aWQgTG9uZG9uIHNleiwgIkhleSBndXlzLCAqV0lFTEQqIGEgbGl6YXJkIGNvcnBzZSBhZ"
     "2FpbnN0IGEgY29ja2F0cmljZSEi"},
    {"Death is just life's way of telling you you've been fired.",
     "RGVhdGggaXMganVzdCBsaWZlJ3Mgd2F5IG9mIHRlbGxpbmcgeW91IHlvdSd2ZSBiZWVuIGZpc"
     "mVkLg=="},
    {"Demi-gods don't need any help from the gods.",
     "RGVtaS1nb2RzIGRvbid0IG5lZWQgYW55IGhlbHAgZnJvbSB0aGUgZ29kcy4="},
    {"Demons *HATE* Priests and Priestesses.",
     "RGVtb25zICpIQVRFKiBQcmllc3RzIGFuZCBQcmllc3Rlc3Nlcy4="},
    {"Didn't you forget to pay?", "RGlkbid0IHlvdSBmb3JnZXQgdG8gcGF5Pw=="},
    {"Didn't your mother tell you not to eat food off the floor?",
     "RGlkbid0IHlvdXIgbW90aGVyIHRlbGwgeW91IG5vdCB0byBlYXQgZm9vZCBvZmYgdGhlIGZsb"
     "29yPw=="},
    {"Direct a direct hit on your direct opponent, directing in the right "
     "direction.",
     "RGlyZWN0IGEgZGlyZWN0IGhpdCBvbiB5b3VyIGRpcmVjdCBvcHBvbmVudCwgZGlyZWN0aW5nI"
     "GluIHRoZSByaWdodCBkaXJlY3Rpb24u"},
    {"Do you want to make more money? Sure, we all do! Join the Fort Ludios "
     "guard!",
     "RG8geW91IHdhbnQgdG8gbWFrZSBtb3JlIG1vbmV5PyBTdXJlLCB3ZSBhbGwgZG8hIEpvaW4gd"
     "GhlIEZvcnQgTHVkaW9zIGd1YXJkIQ=="},
    {"Don't eat too much: you might start hiccoughing!",
     "RG9uJ3QgZWF0IHRvbyBtdWNoOiB5b3UgbWlnaHQgc3RhcnQgaGljY291Z2hpbmch"},
    {"Don't play hack at your work; your boss might hit you!",
     "RG9uJ3QgcGxheSBoYWNrIGF0IHlvdXIgd29yazsgeW91ciBib3NzIG1pZ2h0IGhpdCB5b3U"
     "h"},
    {"Don't tell a soul you found a secret door, otherwise it isn't a secret "
     "anymore.",
     "RG9uJ3QgdGVsbCBhIHNvdWwgeW91IGZvdW5kIGEgc2VjcmV0IGRvb3IsIG90aGVyd2lzZSBpd"
     "CBpc24ndCBhIHNlY3JldCBhbnltb3JlLg=="},
    {"Drinking potions of booze may land you in jail if you are under 21.",
     "RHJpbmtpbmcgcG90aW9ucyBvZiBib296ZSBtYXkgbGFuZCB5b3UgaW4gamFpbCBpZiB5b3UgY"
     "XJlIHVuZGVyIDIxLg=="},
    {"Drop your vanity and get rid of your jewels! Pickpockets about!",
     "RHJvcCB5b3VyIHZhbml0eSBhbmQgZ2V0IHJpZCBvZiB5b3VyIGpld2VscyEgUGlja3BvY2tld"
     "HMgYWJvdXQh"},
    {"Eat 10 cloves of garlic and keep all humans at a two-square distance.",
     "RWF0IDEwIGNsb3ZlcyBvZiBnYXJsaWMgYW5kIGtlZXAgYWxsIGh1bWFucyBhdCBhIHR3by1zc"
     "XVhcmUgZGlzdGFuY2Uu"},
    {"Eels hide under mud. Use a unicorn to clear the water and make them "
     "visible.",
     "RWVscyBoaWRlIHVuZGVyIG11ZC4gVXNlIGEgdW5pY29ybiB0byBjbGVhciB0aGUgd2F0ZXIgY"
     "W5kIG1ha2UgdGhlbSB2aXNpYmxlLg=="},
    {"Engrave your wishes with a wand of wishing.",
     "RW5ncmF2ZSB5b3VyIHdpc2hlcyB3aXRoIGEgd2FuZCBvZiB3aXNoaW5nLg=="},
    {"Eventually you will come to admire the swift elegance of a retreating "
     "nymph.",
     "RXZlbnR1YWxseSB5b3Ugd2lsbCBjb21lIHRvIGFkbWlyZSB0aGUgc3dpZnQgZWxlZ2FuY2Ugb"
     "2YgYSByZXRyZWF0aW5nIG55bXBoLg=="},
    {"Ever heard hissing outside? I *knew* you hadn't!",
     "RXZlciBoZWFyZCBoaXNzaW5nIG91dHNpZGU/IEkgKmtuZXcqIHlvdSBoYWRuJ3Qh"},
    {"Ever lifted a dragon corpse?",
     "RXZlciBsaWZ0ZWQgYSBkcmFnb24gY29ycHNlPw=="},
    {"Ever seen a leocrotta dancing the tengu?",
     "RXZlciBzZWVuIGEgbGVvY3JvdHRhIGRhbmNpbmcgdGhlIHRlbmd1Pw=="},
    {"Ever seen your weapon glow plaid?",
     "RXZlciBzZWVuIHlvdXIgd2VhcG9uIGdsb3cgcGxhaWQ/"},
    {"Ever tamed a shopkeeper?", "RXZlciB0YW1lZCBhIHNob3BrZWVwZXI/"},
    {"Ever tried digging through a Vault Guard?",
     "RXZlciB0cmllZCBkaWdnaW5nIHRocm91Z2ggYSBWYXVsdCBHdWFyZD8="},
    {"Ever tried enchanting a rope?",
     "RXZlciB0cmllZCBlbmNoYW50aW5nIGEgcm9wZT8="},
    {"Floating eyes can't stand Hawaiian shirts.",
     "RmxvYXRpbmcgZXllcyBjYW4ndCBzdGFuZCBIYXdhaWlhbiBzaGlydHMu"},
    {"For any remedy there is a misery.",
     "Rm9yIGFueSByZW1lZHkgdGhlcmUgaXMgYSBtaXNlcnku"},
    {"Giant bats turn into giant vampires.",
     "R2lhbnQgYmF0cyB0dXJuIGludG8gZ2lhbnQgdmFtcGlyZXMu"},
    {"Good day for overcoming obstacles. Try a steeplechase.",
     "R29vZCBkYXkgZm9yIG92ZXJjb21pbmcgb2JzdGFjbGVzLiBUcnkgYSBzdGVlcGxlY2hhc2U"
     "u"},
    {"Half Moon tonight. (At least it's better than no Moon at all.)",
     "SGFsZiBNb29uIHRvbmlnaHQuIChBdCBsZWFzdCBpdCdzIGJldHRlciB0aGFuIG5vIE1vb24gY"
     "XQgYWxsLik="},
    {"Help! I'm being held prisoner in a fortune cookie factory!",
     "SGVscCEgSSdtIGJlaW5nIGhlbGQgcHJpc29uZXIgaW4gYSBmb3J0dW5lIGNvb2tpZSBmYWN0b"
     "3J5IQ=="},
    {"Housecats have nine lives, kittens only one.",
     "SG91c2VjYXRzIGhhdmUgbmluZSBsaXZlcywga2l0dGVucyBvbmx5IG9uZS4="},
    {"How long can you tread water?",
     "SG93IGxvbmcgY2FuIHlvdSB0cmVhZCB3YXRlcj8="},
    {"Hungry? There is an abundance of food on the next level.",
     "SHVuZ3J5PyBUaGVyZSBpcyBhbiBhYnVuZGFuY2Ugb2YgZm9vZCBvbiB0aGUgbmV4dCBsZXZlb"
     "C4="},
    {"I guess you've never hit a mail daemon with the Amulet of Yendor...",
     "SSBndWVzcyB5b3UndmUgbmV2ZXIgaGl0IGEgbWFpbCBkYWVtb24gd2l0aCB0aGUgQW11bGV0I"
     "G9mIFllbmRvci4uLg=="},
    {"If you are the shopkeeper, you can take things for free.",
     "SWYgeW91IGFyZSB0aGUgc2hvcGtlZXBlciwgeW91IGNhbiB0YWtlIHRoaW5ncyBmb3IgZnJlZ"
     "S4="},
    {"If you can't learn to do it well, learn to enjoy doing it badly.",
     "SWYgeW91IGNhbid0IGxlYXJuIHRvIGRvIGl0IHdlbGwsIGxlYXJuIHRvIGVuam95IGRvaW5nI"
     "Gl0IGJhZGx5Lg=="},
    {"If you thought the Wizard was bad, just wait till you meet the Warlord!",
     "SWYgeW91IHRob3VnaHQgdGhlIFdpemFyZCB3YXMgYmFkLCBqdXN0IHdhaXQgdGlsbCB5b3Ugb"
     "WVldCB0aGUgV2FybG9yZCE="},
    {"If you turn blind, don't expect your dog to be turned into a seeing-eye "
     "dog.",
     "SWYgeW91IHR1cm4gYmxpbmQsIGRvbid0IGV4cGVjdCB5b3VyIGRvZyB0byBiZSB0dXJuZWQga"
     "W50byBhIHNlZWluZy1leWUgZG9nLg=="},
    {"If you want to feel great, you must eat something real big.",
     "SWYgeW91IHdhbnQgdG8gZmVlbCBncmVhdCwgeW91IG11c3QgZWF0IHNvbWV0aGluZyByZWFsI"
     "GJpZy4="},
    {"If you want to float, you'd better eat a floating eye.",
     "SWYgeW91IHdhbnQgdG8gZmxvYXQsIHlvdSdkIGJldHRlciBlYXQgYSBmbG9hdGluZyBleWU"
     "u"},
    {"If your ghost kills a player, it increases your score.",
     "SWYgeW91ciBnaG9zdCBraWxscyBhIHBsYXllciwgaXQgaW5jcmVhc2VzIHlvdXIgc2NvcmU"
     "u"},
    {"Increase mindpower: Tame your own ghost!",
     "SW5jcmVhc2UgbWluZHBvd2VyOiBUYW1lIHlvdXIgb3duIGdob3N0IQ=="},
    {"It furthers one to see the great man.",
     "SXQgZnVydGhlcnMgb25lIHRvIHNlZSB0aGUgZ3JlYXQgbWFuLg=="},
    {"It's easy to overlook a monster in a wood.",
     "SXQncyBlYXN5IHRvIG92ZXJsb29rIGEgbW9uc3RlciBpbiBhIHdvb2Qu"},
    {"Just below any trapdoor there may be another one. Just keep falling!",
     "SnVzdCBiZWxvdyBhbnkgdHJhcGRvb3IgdGhlcmUgbWF5IGJlIGFub3RoZXIgb25lLiBKdXN0I"
     "GtlZXAgZmFsbGluZyE="},
    {"Katanas are very sharp; watch you don't cut yourself.",
     "S2F0YW5hcyBhcmUgdmVyeSBzaGFycDsgd2F0Y2ggeW91IGRvbid0IGN1dCB5b3Vyc2VsZi4"
     "="},
    {"Keep a clear mind: quaff clear potions.",
     "S2VlcCBhIGNsZWFyIG1pbmQ6IHF1YWZmIGNsZWFyIHBvdGlvbnMu"},
    {"Kicking the terminal doesn't hurt the monsters.",
     "S2lja2luZyB0aGUgdGVybWluYWwgZG9lc24ndCBodXJ0IHRoZSBtb25zdGVycy4="},
    {"Killer bees keep appearing till you kill their queen.",
     "S2lsbGVyIGJlZXMga2VlcCBhcHBlYXJpbmcgdGlsbCB5b3Uga2lsbCB0aGVpciBxdWVlbi4"
     "="},
    {"Killer bunnies can be tamed with carrots only.",
     "S2lsbGVyIGJ1bm5pZXMgY2FuIGJlIHRhbWVkIHdpdGggY2Fycm90cyBvbmx5Lg=="},
    {"Latest news? Put `rec.games.roguelike.nethack' in your .newsrc!",
     "TGF0ZXN0IG5ld3M/"
     "IFB1dCBgcmVjLmdhbWVzLnJvZ3VlbGlrZS5uZXRoYWNrJyBpbiB5b3VyIC5uZXdzcmMh"},
    {"Learn how to spell. Play NetHack!",
     "TGVhcm4gaG93IHRvIHNwZWxsLiBQbGF5IE5ldEhhY2sh"},
    {"Leprechauns hide their gold in a secret room.",
     "TGVwcmVjaGF1bnMgaGlkZSB0aGVpciBnb2xkIGluIGEgc2VjcmV0IHJvb20u"},
    {"Let your fingers do the walking on the yulkjhnb keys.",
     "TGV0IHlvdXIgZmluZ2VycyBkbyB0aGUgd2Fsa2luZyBvbiB0aGUgeXVsa2pobmIga2V5cy4"
     "="},
    {"Let's face it: this time you're not going to win.",
     "TGV0J3MgZmFjZSBpdDogdGhpcyB0aW1lIHlvdSdyZSBub3QgZ29pbmcgdG8gd2luLg=="},
    {"Let's have a party, drink a lot of booze.",
     "TGV0J3MgaGF2ZSBhIHBhcnR5LCBkcmluayBhIGxvdCBvZiBib296ZS4="},
    {"Liquor sellers do not drink; they hate to see you twice.",
     "TGlxdW9yIHNlbGxlcnMgZG8gbm90IGRyaW5rOyB0aGV5IGhhdGUgdG8gc2VlIHlvdSB0d2ljZ"
     "S4="},
    {"Lunar eclipse tonight. May as well quit now!",
     "THVuYXIgZWNsaXBzZSB0b25pZ2h0LiBNYXkgYXMgd2VsbCBxdWl0IG5vdyE="},
    {"Meeting your own ghost decreases your luck considerably!",
     "TWVldGluZyB5b3VyIG93biBnaG9zdCBkZWNyZWFzZXMgeW91ciBsdWNrIGNvbnNpZGVyYWJse"
     "SE="},
    {"Money to invest? Take it to the local branch of the Magic Memory Vault!",
     "TW9uZXkgdG8gaW52ZXN0PyBUYWtlIGl0IHRvIHRoZSBsb2NhbCBicmFuY2ggb2YgdGhlIE1hZ"
     "2ljIE1lbW9yeSBWYXVsdCE="},
    {"Monsters come from nowhere to hit you everywhere.",
     "TW9uc3RlcnMgY29tZSBmcm9tIG5vd2hlcmUgdG8gaGl0IHlvdSBldmVyeXdoZXJlLg=="},
    {"Monsters sleep because you are boring, not because they ever get tired.",
     "TW9uc3RlcnMgc2xlZXAgYmVjYXVzZSB5b3UgYXJlIGJvcmluZywgbm90IGJlY2F1c2UgdGhle"
     "SBldmVyIGdldCB0aXJlZC4="},
    {"Most monsters prefer minced meat. That's why they are hitting you!",
     "TW9zdCBtb25zdGVycyBwcmVmZXIgbWluY2VkIG1lYXQuIFRoYXQncyB3aHkgdGhleSBhcmUga"
     "Gl0dGluZyB5b3Uh"},
    {"Most of the bugs in NetHack are on the floor.",
     "TW9zdCBvZiB0aGUgYnVncyBpbiBOZXRIYWNrIGFyZSBvbiB0aGUgZmxvb3Iu"},
    {"Much ado Nothing Happens.", "TXVjaCBhZG8gTm90aGluZyBIYXBwZW5zLg=="},
    {"Multi-player NetHack is a myth.",
     "TXVsdGktcGxheWVyIE5ldEhhY2sgaXMgYSBteXRoLg=="},
    {"NetHack is addictive. Too late, you're already hooked.",
     "TmV0SGFjayBpcyBhZGRpY3RpdmUuIFRvbyBsYXRlLCB5b3UncmUgYWxyZWFkeSBob29rZWQ"
     "u"},
    {"Never ask a shopkeeper for a price list.",
     "TmV2ZXIgYXNrIGEgc2hvcGtlZXBlciBmb3IgYSBwcmljZSBsaXN0Lg=="},
    {"Never burn a tree, unless you like getting whacked with a +5 shovel.",
     "TmV2ZXIgYnVybiBhIHRyZWUsIHVubGVzcyB5b3UgbGlrZSBnZXR0aW5nIHdoYWNrZWQgd2l0a"
     "CBhICs1IHNob3ZlbC4="},
    {"Never eat with glowing hands!",
     "TmV2ZXIgZWF0IHdpdGggZ2xvd2luZyBoYW5kcyE="},
    {"Never mind the monsters hitting you: they just replace the charwomen.",
     "TmV2ZXIgbWluZCB0aGUgbW9uc3RlcnMgaGl0dGluZyB5b3U6IHRoZXkganVzdCByZXBsYWNlI"
     "HRoZSBjaGFyd29tZW4u"},
    {"Never play leapfrog with a unicorn.",
     "TmV2ZXIgcGxheSBsZWFwZnJvZyB3aXRoIGEgdW5pY29ybi4="},
    {"Never step on a cursed engraving.",
     "TmV2ZXIgc3RlcCBvbiBhIGN1cnNlZCBlbmdyYXZpbmcu"},
    {"Never swim with a camera: there's nothing to take pictures of.",
     "TmV2ZXIgc3dpbSB3aXRoIGEgY2FtZXJhOiB0aGVyZSdzIG5vdGhpbmcgdG8gdGFrZSBwaWN0d"
     "XJlcyBvZi4="},
    {"Never teach your pet rust monster to fetch.",
     "TmV2ZXIgdGVhY2ggeW91ciBwZXQgcnVzdCBtb25zdGVyIHRvIGZldGNoLg=="},
    {"Never trust a random generator in magic fields.",
     "TmV2ZXIgdHJ1c3QgYSByYW5kb20gZ2VuZXJhdG9yIGluIG1hZ2ljIGZpZWxkcy4="},
    {"Never use a wand of death.", "TmV2ZXIgdXNlIGEgd2FuZCBvZiBkZWF0aC4="},
    {"No level contains two shops. The maze is no level. So...",
     "Tm8gbGV2ZWwgY29udGFpbnMgdHdvIHNob3BzLiBUaGUgbWF6ZSBpcyBubyBsZXZlbC4gU28uL"
     "i4="},
    {"No part of this fortune may be reproduced, stored in a retrieval system, "
     "...",
     "Tm8gcGFydCBvZiB0aGlzIGZvcnR1bmUgbWF5IGJlIHJlcHJvZHVjZWQsIHN0b3JlZCBpbiBhI"
     "HJldHJpZXZhbCBzeXN0ZW0sIC4uLg=="},
    {"Not all rumors are as misleading as this one.",
     "Tm90IGFsbCBydW1vcnMgYXJlIGFzIG1pc2xlYWRpbmcgYXMgdGhpcyBvbmUu"},
    {"Nymphs and nurses like beautiful rings.",
     "TnltcGhzIGFuZCBudXJzZXMgbGlrZSBiZWF1dGlmdWwgcmluZ3Mu"},
    {"Nymphs are blondes. Are you a gentleman?",
     "TnltcGhzIGFyZSBibG9uZGVzLiBBcmUgeW91IGEgZ2VudGxlbWFuPw=="},
    {"Offering a unicorn a worthless piece of glass might prove to be fatal!",
     "T2ZmZXJpbmcgYSB1bmljb3JuIGEgd29ydGhsZXNzIHBpZWNlIG9mIGdsYXNzIG1pZ2h0IHByb"
     "3ZlIHRvIGJlIGZhdGFsIQ=="},
    {"Old hackers never die: young ones do.",
     "T2xkIGhhY2tlcnMgbmV2ZXIgZGllOiB5b3VuZyBvbmVzIGRvLg=="},
    {"One has to leave shops before closing time.",
     "T25lIGhhcyB0byBsZWF2ZSBzaG9wcyBiZWZvcmUgY2xvc2luZyB0aW1lLg=="},
    {"One homunculus a day keeps the doctor away.",
     "T25lIGhvbXVuY3VsdXMgYSBkYXkga2VlcHMgdGhlIGRvY3RvciBhd2F5Lg=="},
    {"One level further down somebody is getting killed, right now.",
     "T25lIGxldmVsIGZ1cnRoZXIgZG93biBzb21lYm9keSBpcyBnZXR0aW5nIGtpbGxlZCwgcmlna"
     "HQgbm93Lg=="},
    {"Only a wizard can use a magic whistle.",
     "T25seSBhIHdpemFyZCBjYW4gdXNlIGEgbWFnaWMgd2hpc3RsZS4="},
    {"Only adventurers of evil alignment think of killing their dog.",
     "T25seSBhZHZlbnR1cmVycyBvZiBldmlsIGFsaWdubWVudCB0aGluayBvZiBraWxsaW5nIHRoZ"
     "WlyIGRvZy4="},
    {"Only chaotic evils kill sleeping monsters.",
     "T25seSBjaGFvdGljIGV2aWxzIGtpbGwgc2xlZXBpbmcgbW9uc3RlcnMu"},
    {"Only real trappers escape traps.",
     "T25seSByZWFsIHRyYXBwZXJzIGVzY2FwZSB0cmFwcy4="},
    {"Only real wizards can write scrolls.",
     "T25seSByZWFsIHdpemFyZHMgY2FuIHdyaXRlIHNjcm9sbHMu"},
    {"Operation OVERKILL has started now.",
     "T3BlcmF0aW9uIE9WRVJLSUxMIGhhcyBzdGFydGVkIG5vdy4="},
    {"PLEASE ignore previous rumor.",
     "UExFQVNFIGlnbm9yZSBwcmV2aW91cyBydW1vci4="},
    {"Polymorph into an ettin; meet your opponents face to face to face.",
     "UG9seW1vcnBoIGludG8gYW4gZXR0aW47IG1lZXQgeW91ciBvcHBvbmVudHMgZmFjZSB0byBmY"
     "WNlIHRvIGZhY2Uu"},
    {"Praying will frighten demons.",
     "UHJheWluZyB3aWxsIGZyaWdodGVuIGRlbW9ucy4="},
    {"Row (3x) that boat gently down the stream, Charon (4x), death is but a "
     "dream.",
     "Um93ICgzeCkgdGhhdCBib2F0IGdlbnRseSBkb3duIHRoZSBzdHJlYW0sIENoYXJvbiAoNHgpL"
     "CBkZWF0aCBpcyBidXQgYSBkcmVhbS4="},
    {"Running is good for your legs.",
     "UnVubmluZyBpcyBnb29kIGZvciB5b3VyIGxlZ3Mu"},
    {"Screw up your courage! You've screwed up everything else.",
     "U2NyZXcgdXAgeW91ciBjb3VyYWdlISBZb3UndmUgc2NyZXdlZCB1cCBldmVyeXRoaW5nIGVsc"
     "2Uu"},
    {"Seepage? Leaky pipes? Rising damp? Summon the plumber!",
     "U2VlcGFnZT8gTGVha3kgcGlwZXM/"
     "IFJpc2luZyBkYW1wPyBTdW1tb24gdGhlIHBsdW1iZXIh"},
    {"Segmentation fault (core dumped).",
     "U2VnbWVudGF0aW9uIGZhdWx0IChjb3JlIGR1bXBlZCku"},
    {"Shopkeepers sometimes die from old age.",
     "U2hvcGtlZXBlcnMgc29tZXRpbWVzIGRpZSBmcm9tIG9sZCBhZ2Uu"},
    {"Some mazes (especially small ones) have no solutions, says man 6 maze.",
     "U29tZSBtYXplcyAoZXNwZWNpYWxseSBzbWFsbCBvbmVzKSBoYXZlIG5vIHNvbHV0aW9ucywgc"
     "2F5cyBtYW4gNiBtYXplLg=="},
    {"Some questions the Sphynx asks just *don't* have any answers.",
     "U29tZSBxdWVzdGlvbnMgdGhlIFNwaHlueCBhc2tzIGp1c3QgKmRvbid0KiBoYXZlIGFueSBhb"
     "nN3ZXJzLg=="},
    {"Sometimes \"mu\" is the answer.",
     "U29tZXRpbWVzICJtdSIgaXMgdGhlIGFuc3dlci4="},
    {"Sorry, no fortune this time. Better luck next cookie!",
     "U29ycnksIG5vIGZvcnR1bmUgdGhpcyB0aW1lLiBCZXR0ZXIgbHVjayBuZXh0IGNvb2tpZSE"
     "="},
    {"Spare your scrolls of make-edible until it's really necessary!",
     "U3BhcmUgeW91ciBzY3JvbGxzIG9mIG1ha2UtZWRpYmxlIHVudGlsIGl0J3MgcmVhbGx5IG5lY"
     "2Vzc2FyeSE="},
    {"Suddenly, the dungeon will collapse...",
     "U3VkZGVubHksIHRoZSBkdW5nZW9uIHdpbGwgY29sbGFwc2UuLi4="},
    {"Taming a mail daemon may cause a system security violation.",
     "VGFtaW5nIGEgbWFpbCBkYWVtb24gbWF5IGNhdXNlIGEgc3lzdGVtIHNlY3VyaXR5IHZpb2xhd"
     "Glvbi4="},
    {"The crowd was so tough, the Stooges won't play the Dungeon anymore, nyuk "
     "nyuk.",
     "VGhlIGNyb3dkIHdhcyBzbyB0b3VnaCwgdGhlIFN0b29nZXMgd29uJ3QgcGxheSB0aGUgRHVuZ"
     "2VvbiBhbnltb3JlLCBueXVrIG55dWsu"},
    {"The leprechauns hide their treasure in a small hidden room.",
     "VGhlIGxlcHJlY2hhdW5zIGhpZGUgdGhlaXIgdHJlYXN1cmUgaW4gYSBzbWFsbCBoaWRkZW4gc"
     "m9vbS4="},
    {"The longer the wand the better.",
     "VGhlIGxvbmdlciB0aGUgd2FuZCB0aGUgYmV0dGVyLg=="},
    {"The magic word is \"XYZZY\".", "VGhlIG1hZ2ljIHdvcmQgaXMgIlhZWlpZIi4="},
    {"The meek shall inherit your bones files.",
     "VGhlIG1lZWsgc2hhbGwgaW5oZXJpdCB5b3VyIGJvbmVzIGZpbGVzLg=="},
    {"The mines are dark and deep, and I have levels to go before I sleep.",
     "VGhlIG1pbmVzIGFyZSBkYXJrIGFuZCBkZWVwLCBhbmQgSSBoYXZlIGxldmVscyB0byBnbyBiZ"
     "WZvcmUgSSBzbGVlcC4="},
    {"The use of dynamite is dangerous.",
     "VGhlIHVzZSBvZiBkeW5hbWl0ZSBpcyBkYW5nZXJvdXMu"},
    {"There are no worms in the UNIX version.",
     "VGhlcmUgYXJlIG5vIHdvcm1zIGluIHRoZSBVTklYIHZlcnNpb24u"},
    {"There is a trap on this level!",
     "VGhlcmUgaXMgYSB0cmFwIG9uIHRoaXMgbGV2ZWwh"},
    {"They say that Demogorgon, Asmodeus, Orcus, Yeenoghu & Juiblex is no law "
     "firm.",
     "VGhleSBzYXkgdGhhdCBEZW1vZ29yZ29uLCBBc21vZGV1cywgT3JjdXMsIFllZW5vZ2h1ICYgS"
     "nVpYmxleCBpcyBubyBsYXcgZmlybS4="},
    {"They say that Geryon has an evil twin, beware!",
     "VGhleSBzYXkgdGhhdCBHZXJ5b24gaGFzIGFuIGV2aWwgdHdpbiwgYmV3YXJlIQ=="},
    {"They say that Medusa would make a terrible pet.",
     "VGhleSBzYXkgdGhhdCBNZWR1c2Egd291bGQgbWFrZSBhIHRlcnJpYmxlIHBldC4="},
    {"They say that NetHack bugs are Seldon planned.",
     "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGJ1Z3MgYXJlIFNlbGRvbiBwbGFubmVkLg=="},
    {"They say that NetHack comes in 256 flavors.",
     "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGNvbWVzIGluIDI1NiBmbGF2b3JzLg=="},
    {"They say that NetHack is just a computer game.",
     "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIGp1c3QgYSBjb21wdXRlciBnYW1lLg=="},
    {"They say that NetHack is more than just a computer game.",
     "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG1vcmUgdGhhbiBqdXN0IGEgY29tcHV0ZXIgZ2FtZ"
     "S4="},
    {"They say that NetHack is never what it used to be.",
     "VGhleSBzYXkgdGhhdCBOZXRIYWNrIGlzIG5ldmVyIHdoYXQgaXQgdXNlZCB0byBiZS4="},
    {"They say that a baby dragon is too small to hurt or help you.",
     "VGhleSBzYXkgdGhhdCBhIGJhYnkgZHJhZ29uIGlzIHRvbyBzbWFsbCB0byBodXJ0IG9yIGhlb"
     "HAgeW91Lg=="},
    {"They say that a black pudding is simply a brown pudding gone bad.",
     "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHB1ZGRpbmcgaXMgc2ltcGx5IGEgYnJvd24gcHVkZGluZ"
     "yBnb25lIGJhZC4="},
    {"They say that a black sheep has 3 bags full of wool.",
     "VGhleSBzYXkgdGhhdCBhIGJsYWNrIHNoZWVwIGhhcyAzIGJhZ3MgZnVsbCBvZiB3b29sLg="
     "="},
    {"They say that a blank scroll is like a blank check.",
     "VGhleSBzYXkgdGhhdCBhIGJsYW5rIHNjcm9sbCBpcyBsaWtlIGEgYmxhbmsgY2hlY2su"},
    {"They say that a cat named Morris has nine lives.",
     "VGhleSBzYXkgdGhhdCBhIGNhdCBuYW1lZCBNb3JyaXMgaGFzIG5pbmUgbGl2ZXMu"},
    {"They say that a desperate shopper might pay any price in a shop.",
     "VGhleSBzYXkgdGhhdCBhIGRlc3BlcmF0ZSBzaG9wcGVyIG1pZ2h0IHBheSBhbnkgcHJpY2Uga"
     "W4gYSBzaG9wLg=="},
    {"They say that a diamond dog is everybody's best friend.",
     "VGhleSBzYXkgdGhhdCBhIGRpYW1vbmQgZG9nIGlzIGV2ZXJ5Ym9keSdzIGJlc3QgZnJpZW5kL"
     "g=="},
    {"They say that a dwarf lord can carry a pick-axe because his armor is "
     "light.",
     "VGhleSBzYXkgdGhhdCBhIGR3YXJmIGxvcmQgY2FuIGNhcnJ5IGEgcGljay1heGUgYmVjYXVzZ"
     "SBoaXMgYXJtb3IgaXMgbGlnaHQu"},
    {"They say that a floating eye can defeat Medusa.",
     "VGhleSBzYXkgdGhhdCBhIGZsb2F0aW5nIGV5ZSBjYW4gZGVmZWF0IE1lZHVzYS4="},
    {"They say that a fortune only has 1 line and you can't read between it.",
     "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lIGFuZCB5b3UgY2FuJ3Qgc"
     "mVhZCBiZXR3ZWVuIGl0Lg=="},
    {"They say that a fortune only has 1 line, but you can read between it.",
     "VGhleSBzYXkgdGhhdCBhIGZvcnR1bmUgb25seSBoYXMgMSBsaW5lLCBidXQgeW91IGNhbiByZ"
     "WFkIGJldHdlZW4gaXQu"},
    {"They say that a fountain looks nothing like a regularly erupting geyser.",
     "VGhleSBzYXkgdGhhdCBhIGZvdW50YWluIGxvb2tzIG5vdGhpbmcgbGlrZSBhIHJlZ3VsYXJse"
     "SBlcnVwdGluZyBnZXlzZXIu"},
    {"They say that a gold doubloon is worth more than its weight in gold.",
     "VGhleSBzYXkgdGhhdCBhIGdvbGQgZG91Ymxvb24gaXMgd29ydGggbW9yZSB0aGFuIGl0cyB3Z"
     "WlnaHQgaW4gZ29sZC4="},
    {"They say that a grid bug won't pay a shopkeeper for zapping you in a "
     "shop.",
     "VGhleSBzYXkgdGhhdCBhIGdyaWQgYnVnIHdvbid0IHBheSBhIHNob3BrZWVwZXIgZm9yIHphc"
     "HBpbmcgeW91IGluIGEgc2hvcC4="},
    {"They say that a gypsy could tell your fortune for a price.",
     "VGhleSBzYXkgdGhhdCBhIGd5cHN5IGNvdWxkIHRlbGwgeW91ciBmb3J0dW5lIGZvciBhIHBya"
     "WNlLg=="},
    {"They say that a hacker named Alice once level teleported by using a "
     "mirror.",
     "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBBbGljZSBvbmNlIGxldmVsIHRlbGVwb3J0Z"
     "WQgYnkgdXNpbmcgYSBtaXJyb3Iu"},
    {"They say that a hacker named David once slew a giant with a sling and a "
     "rock.",
     "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEYXZpZCBvbmNlIHNsZXcgYSBnaWFudCB3a"
     "XRoIGEgc2xpbmcgYW5kIGEgcm9jay4="},
    {"They say that a hacker named Dorothy once rode a fog cloud to Oz.",
     "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBEb3JvdGh5IG9uY2Ugcm9kZSBhIGZvZyBjb"
     "G91ZCB0byBPei4="},
    {"They say that a hacker named Mary once lost a white sheep in the mazes.",
     "VGhleSBzYXkgdGhhdCBhIGhhY2tlciBuYW1lZCBNYXJ5IG9uY2UgbG9zdCBhIHdoaXRlIHNoZ"
     "WVwIGluIHRoZSBtYXplcy4="},
    {"They say that a helm of brilliance is not to be taken lightly.",
     "VGhleSBzYXkgdGhhdCBhIGhlbG0gb2YgYnJpbGxpYW5jZSBpcyBub3QgdG8gYmUgdGFrZW4gb"
     "GlnaHRseS4="},
    {"They say that a hot dog and a hell hound are the same thing.",
     "VGhleSBzYXkgdGhhdCBhIGhvdCBkb2cgYW5kIGEgaGVsbCBob3VuZCBhcmUgdGhlIHNhbWUgd"
     "Ghpbmcu"},
    {"They say that a lamp named Aladdin's Lamp contains a djinni with 3 "
     "wishes.",
     "VGhleSBzYXkgdGhhdCBhIGxhbXAgbmFtZWQgQWxhZGRpbidzIExhbXAgY29udGFpbnMgYSBka"
     "mlubmkgd2l0aCAzIHdpc2hlcy4="},
    {"They say that a large dog named Lassie will lead you to the amulet.",
     "VGhleSBzYXkgdGhhdCBhIGxhcmdlIGRvZyBuYW1lZCBMYXNzaWUgd2lsbCBsZWFkIHlvdSB0b"
     "yB0aGUgYW11bGV0Lg=="},
    {"They say that a long sword is not a light sword.",
     "VGhleSBzYXkgdGhhdCBhIGxvbmcgc3dvcmQgaXMgbm90IGEgbGlnaHQgc3dvcmQu"},
    {"They say that a manes won't mince words with you.",
     "VGhleSBzYXkgdGhhdCBhIG1hbmVzIHdvbid0IG1pbmNlIHdvcmRzIHdpdGggeW91Lg=="},
    {"They say that a mind is a terrible thing to waste.",
     "VGhleSBzYXkgdGhhdCBhIG1pbmQgaXMgYSB0ZXJyaWJsZSB0aGluZyB0byB3YXN0ZS4="},
    {"They say that a plain nymph will only wear a wire ring in one ear.",
     "VGhleSBzYXkgdGhhdCBhIHBsYWluIG55bXBoIHdpbGwgb25seSB3ZWFyIGEgd2lyZSByaW5nI"
     "GluIG9uZSBlYXIu"},
    {"They say that a plumed hat could be a previously used crested helmet.",
     "VGhleSBzYXkgdGhhdCBhIHBsdW1lZCBoYXQgY291bGQgYmUgYSBwcmV2aW91c2x5IHVzZWQgY"
     "3Jlc3RlZCBoZWxtZXQu"},
    {"They say that a potion of oil is difficult to grasp.",
     "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiBvaWwgaXMgZGlmZmljdWx0IHRvIGdyYXNwLg="
     "="},
    {"They say that a potion of yogurt is a cancelled potion of sickness.",
     "VGhleSBzYXkgdGhhdCBhIHBvdGlvbiBvZiB5b2d1cnQgaXMgYSBjYW5jZWxsZWQgcG90aW9uI"
     "G9mIHNpY2tuZXNzLg=="},
    {"They say that a purple worm is not a baby purple dragon.",
     "VGhleSBzYXkgdGhhdCBhIHB1cnBsZSB3b3JtIGlzIG5vdCBhIGJhYnkgcHVycGxlIGRyYWdvb"
     "i4="},
    {"They say that a quivering blob tastes different than a gelatinous cube.",
     "VGhleSBzYXkgdGhhdCBhIHF1aXZlcmluZyBibG9iIHRhc3RlcyBkaWZmZXJlbnQgdGhhbiBhI"
     "GdlbGF0aW5vdXMgY3ViZS4="},
    {"They say that a runed broadsword named Stormbringer attracts vortices.",
     "VGhleSBzYXkgdGhhdCBhIHJ1bmVkIGJyb2Fkc3dvcmQgbmFtZWQgU3Rvcm1icmluZ2VyIGF0d"
     "HJhY3RzIHZvcnRpY2VzLg=="},
    {"They say that a scroll of summoning has other names.",
     "VGhleSBzYXkgdGhhdCBhIHNjcm9sbCBvZiBzdW1tb25pbmcgaGFzIG90aGVyIG5hbWVzLg="
     "="},
    {"They say that a shaman can bestow blessings but usually doesn't.",
     "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiBjYW4gYmVzdG93IGJsZXNzaW5ncyBidXQgdXN1YWxse"
     "SBkb2Vzbid0Lg=="},
    {"They say that a shaman will bless you for an eye of newt and wing of "
     "bat.",
     "VGhleSBzYXkgdGhhdCBhIHNoYW1hbiB3aWxsIGJsZXNzIHlvdSBmb3IgYW4gZXllIG9mIG5ld"
     "3QgYW5kIHdpbmcgb2YgYmF0Lg=="},
    {"They say that a shimmering gold shield is not a polished silver shield.",
     "VGhleSBzYXkgdGhhdCBhIHNoaW1tZXJpbmcgZ29sZCBzaGllbGQgaXMgbm90IGEgcG9saXNoZ"
     "WQgc2lsdmVyIHNoaWVsZC4="},
    {"They say that a spear will hit a neo-otyugh. (Do YOU know what that is?)",
     "VGhleSBzYXkgdGhhdCBhIHNwZWFyIHdpbGwgaGl0IGEgbmVvLW90eXVnaC4gKERvIFlPVSBrb"
     "m93IHdoYXQgdGhhdCBpcz8p"},
    {"They say that a spotted dragon is the ultimate shape changer.",
     "VGhleSBzYXkgdGhhdCBhIHNwb3R0ZWQgZHJhZ29uIGlzIHRoZSB1bHRpbWF0ZSBzaGFwZSBja"
     "GFuZ2VyLg=="},
    {"They say that a stethoscope is no good if you can only hear your "
     "heartbeat.",
     "VGhleSBzYXkgdGhhdCBhIHN0ZXRob3Njb3BlIGlzIG5vIGdvb2QgaWYgeW91IGNhbiBvbmx5I"
     "GhlYXIgeW91ciBoZWFydGJlYXQu"},
    {"They say that a succubus named Suzy will sometimes warn you of danger.",
     "VGhleSBzYXkgdGhhdCBhIHN1Y2N1YnVzIG5hbWVkIFN1enkgd2lsbCBzb21ldGltZXMgd2Fyb"
     "iB5b3Ugb2YgZGFuZ2VyLg=="},
    {"They say that a wand of cancellation is not like a wand of polymorph.",
     "VGhleSBzYXkgdGhhdCBhIHdhbmQgb2YgY2FuY2VsbGF0aW9uIGlzIG5vdCBsaWtlIGEgd2FuZ"
     "CBvZiBwb2x5bW9ycGgu"},
    {"They say that a wood golem named Pinocchio would be easy to control.",
     "VGhleSBzYXkgdGhhdCBhIHdvb2QgZ29sZW0gbmFtZWQgUGlub2NjaGlvIHdvdWxkIGJlIGVhc"
     "3kgdG8gY29udHJvbC4="},
    {"They say that after killing a dragon it's time for a change of scenery.",
     "VGhleSBzYXkgdGhhdCBhZnRlciBraWxsaW5nIGEgZHJhZ29uIGl0J3MgdGltZSBmb3IgYSBja"
     "GFuZ2Ugb2Ygc2NlbmVyeS4="},
    {"They say that an amulet of strangulation is worse than ring around the "
     "collar.",
     "VGhleSBzYXkgdGhhdCBhbiBhbXVsZXQgb2Ygc3RyYW5ndWxhdGlvbiBpcyB3b3JzZSB0aGFuI"
     "HJpbmcgYXJvdW5kIHRoZSBjb2xsYXIu"},
    {"They say that an attic is the best place to hide your toys.",
     "VGhleSBzYXkgdGhhdCBhbiBhdHRpYyBpcyB0aGUgYmVzdCBwbGFjZSB0byBoaWRlIHlvdXIgd"
     "G95cy4="},
    {"They say that an axe named Cleaver once belonged to a hacker named "
     "Beaver.",
     "VGhleSBzYXkgdGhhdCBhbiBheGUgbmFtZWQgQ2xlYXZlciBvbmNlIGJlbG9uZ2VkIHRvIGEga"
     "GFja2VyIG5hbWVkIEJlYXZlci4="},
    {"They say that an eye of newt and a wing of bat are double the trouble.",
     "VGhleSBzYXkgdGhhdCBhbiBleWUgb2YgbmV3dCBhbmQgYSB3aW5nIG9mIGJhdCBhcmUgZG91Y"
     "mxlIHRoZSB0cm91YmxlLg=="},
    {"They say that an incubus named Izzy sometimes makes women feel "
     "sensitive.",
     "VGhleSBzYXkgdGhhdCBhbiBpbmN1YnVzIG5hbWVkIEl6enkgc29tZXRpbWVzIG1ha2VzIHdvb"
     "WVuIGZlZWwgc2Vuc2l0aXZlLg=="},
    {"They say that an opulent throne room is rarely a place to wish you'd be "
     "in.",
     "VGhleSBzYXkgdGhhdCBhbiBvcHVsZW50IHRocm9uZSByb29tIGlzIHJhcmVseSBhIHBsYWNlI"
     "HRvIHdpc2ggeW91J2QgYmUgaW4u"},
    {"They say that an unlucky hacker once had a nose bleed at an altar and "
     "died.",
     "VGhleSBzYXkgdGhhdCBhbiB1bmx1Y2t5IGhhY2tlciBvbmNlIGhhZCBhIG5vc2UgYmxlZWQgY"
     "XQgYW4gYWx0YXIgYW5kIGRpZWQu"},
    {"They say that and they say this but they never say never, never!",
     "VGhleSBzYXkgdGhhdCBhbmQgdGhleSBzYXkgdGhpcyBidXQgdGhleSBuZXZlciBzYXkgbmV2Z"
     "XIsIG5ldmVyIQ=="},
    {"They say that any quantum mechanic knows that speed kills.",
     "VGhleSBzYXkgdGhhdCBhbnkgcXVhbnR1bSBtZWNoYW5pYyBrbm93cyB0aGF0IHNwZWVkIGtpb"
     "GxzLg=="},
    {"They say that applying a unicorn horn means you've missed the point.",
     "VGhleSBzYXkgdGhhdCBhcHBseWluZyBhIHVuaWNvcm4gaG9ybiBtZWFucyB5b3UndmUgbWlzc"
     "2VkIHRoZSBwb2ludC4="},
    {"They say that blue stones are radioactive, beware.",
     "VGhleSBzYXkgdGhhdCBibHVlIHN0b25lcyBhcmUgcmFkaW9hY3RpdmUsIGJld2FyZS4="},
    {"They say that building a dungeon is a team effort.",
     "VGhleSBzYXkgdGhhdCBidWlsZGluZyBhIGR1bmdlb24gaXMgYSB0ZWFtIGVmZm9ydC4="},
    {"They say that chaotic characters never get a kick out of altars.",
     "VGhleSBzYXkgdGhhdCBjaGFvdGljIGNoYXJhY3RlcnMgbmV2ZXIgZ2V0IGEga2ljayBvdXQgb"
     "2YgYWx0YXJzLg=="},
    {"They say that collapsing a dungeon often creates a panic.",
     "VGhleSBzYXkgdGhhdCBjb2xsYXBzaW5nIGEgZHVuZ2VvbiBvZnRlbiBjcmVhdGVzIGEgcGFua"
     "WMu"},
    {"They say that counting your eggs before they hatch shows that you care.",
     "VGhleSBzYXkgdGhhdCBjb3VudGluZyB5b3VyIGVnZ3MgYmVmb3JlIHRoZXkgaGF0Y2ggc2hvd"
     "3MgdGhhdCB5b3UgY2FyZS4="},
    {"They say that dipping a bag of tricks in a fountain won't make it an "
     "icebox.",
     "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGEgYmFnIG9mIHRyaWNrcyBpbiBhIGZvdW50YWluIHdvb"
     "id0IG1ha2UgaXQgYW4gaWNlYm94Lg=="},
    {"They say that dipping an eel and brown mold in hot water makes "
     "bouillabaisse.",
     "VGhleSBzYXkgdGhhdCBkaXBwaW5nIGFuIGVlbCBhbmQgYnJvd24gbW9sZCBpbiBob3Qgd2F0Z"
     "XIgbWFrZXMgYm91aWxsYWJhaXNzZS4="},
    {"They say that donating a doubloon is extremely pious charity.",
     "VGhleSBzYXkgdGhhdCBkb25hdGluZyBhIGRvdWJsb29uIGlzIGV4dHJlbWVseSBwaW91cyBja"
     "GFyaXR5Lg=="},
    {"They say that eating royal jelly attracts grizzly owlbears.",
     "VGhleSBzYXkgdGhhdCBlYXRpbmcgcm95YWwgamVsbHkgYXR0cmFjdHMgZ3JpenpseSBvd2xiZ"
     "WFycy4="},
    {"They say that eggs, pancakes and juice are just a mundane breakfast.",
     "VGhleSBzYXkgdGhhdCBlZ2dzLCBwYW5jYWtlcyBhbmQganVpY2UgYXJlIGp1c3QgYSBtdW5kY"
     "W5lIGJyZWFrZmFzdC4="},
    {"They say that everyone knows why Medusa stands alone in the dark.",
     "VGhleSBzYXkgdGhhdCBldmVyeW9uZSBrbm93cyB3aHkgTWVkdXNhIHN0YW5kcyBhbG9uZSBpb"
     "iB0aGUgZGFyay4="},
    {"They say that everyone wanted rec.games.hack to undergo a name change.",
     "VGhleSBzYXkgdGhhdCBldmVyeW9uZSB3YW50ZWQgcmVjLmdhbWVzLmhhY2sgdG8gdW5kZXJnb"
     "yBhIG5hbWUgY2hhbmdlLg=="},
    {"They say that finding a winning strategy is a deliberate move on your "
     "part.",
     "VGhleSBzYXkgdGhhdCBmaW5kaW5nIGEgd2lubmluZyBzdHJhdGVneSBpcyBhIGRlbGliZXJhd"
     "GUgbW92ZSBvbiB5b3VyIHBhcnQu"},
    {"They say that finding worthless glass is worth something.",
     "VGhleSBzYXkgdGhhdCBmaW5kaW5nIHdvcnRobGVzcyBnbGFzcyBpcyB3b3J0aCBzb21ldGhpb"
     "mcu"},
    {"They say that fortune cookies are food for thought.",
     "VGhleSBzYXkgdGhhdCBmb3J0dW5lIGNvb2tpZXMgYXJlIGZvb2QgZm9yIHRob3VnaHQu"},
    {"They say that gold is only wasted on a pet dragon.",
     "VGhleSBzYXkgdGhhdCBnb2xkIGlzIG9ubHkgd2FzdGVkIG9uIGEgcGV0IGRyYWdvbi4="},
    {"They say that good things come to those that wait.",
     "VGhleSBzYXkgdGhhdCBnb29kIHRoaW5ncyBjb21lIHRvIHRob3NlIHRoYXQgd2FpdC4="},
    {"They say that greased objects will slip out of monsters' hands.",
     "VGhleSBzYXkgdGhhdCBncmVhc2VkIG9iamVjdHMgd2lsbCBzbGlwIG91dCBvZiBtb25zdGVyc"
     "ycgaGFuZHMu"},
    {"They say that if you can't spell then you'll wish you had a spell book.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3UgY2FuJ3Qgc3BlbGwgdGhlbiB5b3UnbGwgd2lzaCB5b3Uga"
     "GFkIGEgc3BlbGwgYm9vay4="},
    {"They say that if you live by the sword, you'll die by the sword.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3UgbGl2ZSBieSB0aGUgc3dvcmQsIHlvdSdsbCBkaWUgYnkgd"
     "GhlIHN3b3JkLg=="},
    {"They say that if you play like a monster you'll have a better game.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3UgcGxheSBsaWtlIGEgbW9uc3RlciB5b3UnbGwgaGF2ZSBhI"
     "GJldHRlciBnYW1lLg=="},
    {"They say that if you sleep with a demon you might awake with a headache.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc2xlZXAgd2l0aCBhIGRlbW9uIHlvdSBtaWdodCBhd2FrZ"
     "SB3aXRoIGEgaGVhZGFjaGUu"},
    {"They say that if you step on a crack you could break your mother's back.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3Ugc3RlcCBvbiBhIGNyYWNrIHlvdSBjb3VsZCBicmVhayB5b"
     "3VyIG1vdGhlcidzIGJhY2su"},
    {"They say that if you're invisible you can still be heard!",
     "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgaW52aXNpYmxlIHlvdSBjYW4gc3RpbGwgYmUgaGVhc"
     "mQh"},
    {"They say that if you're lucky you can feel the runes on a scroll.",
     "VGhleSBzYXkgdGhhdCBpZiB5b3UncmUgbHVja3kgeW91IGNhbiBmZWVsIHRoZSBydW5lcyBvb"
     "iBhIHNjcm9sbC4="},
    {"They say that in the big picture gold is only small change.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgYmlnIHBpY3R1cmUgZ29sZCBpcyBvbmx5IHNtYWxsIGNoY"
     "W5nZS4="},
    {"They say that in the dungeon it's not what you know that really matters.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBpdCdzIG5vdCB3aGF0IHlvdSBrbm93IHRoY"
     "XQgcmVhbGx5IG1hdHRlcnMu"},
    {"They say that in the dungeon moon rocks are really dilithium crystals.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiBtb29uIHJvY2tzIGFyZSByZWFsbHkgZGlsa"
     "XRoaXVtIGNyeXN0YWxzLg=="},
    {"They say that in the dungeon the boorish customer is never right.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB0aGUgYm9vcmlzaCBjdXN0b21lciBpcyBuZ"
     "XZlciByaWdodC4="},
    {"They say that in the dungeon you don't need a watch to tell time.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgZG9uJ3QgbmVlZCBhIHdhdGNoIHRvI"
     "HRlbGwgdGltZS4="},
    {"They say that in the dungeon you need something old, new, burrowed and "
     "blue.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3UgbmVlZCBzb21ldGhpbmcgb2xkLCBuZ"
     "XcsIGJ1cnJvd2VkIGFuZCBibHVlLg=="},
    {"They say that in the dungeon you should always count your blessings.",
     "VGhleSBzYXkgdGhhdCBpbiB0aGUgZHVuZ2VvbiB5b3Ugc2hvdWxkIGFsd2F5cyBjb3VudCB5b"
     "3VyIGJsZXNzaW5ncy4="},
    {"They say that iron golem plate mail isn't worth wishing for.",
     "VGhleSBzYXkgdGhhdCBpcm9uIGdvbGVtIHBsYXRlIG1haWwgaXNuJ3Qgd29ydGggd2lzaGluZ"
     "yBmb3Iu"},
    {"They say that it takes four quarterstaffs to make one staff.",
     "VGhleSBzYXkgdGhhdCBpdCB0YWtlcyBmb3VyIHF1YXJ0ZXJzdGFmZnMgdG8gbWFrZSBvbmUgc"
     "3RhZmYu"},
    {"They say that it's not over till the fat ladies sing.",
     "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWRpZXMgc2luZy4"
     "="},
    {"They say that it's not over till the fat lady shouts `Off with its "
     "head'.",
     "VGhleSBzYXkgdGhhdCBpdCdzIG5vdCBvdmVyIHRpbGwgdGhlIGZhdCBsYWR5IHNob3V0cyBgT"
     "2ZmIHdpdGggaXRzIGhlYWQnLg=="},
    {"They say that kicking a heavy statue is really a dumb move.",
     "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgaGVhdnkgc3RhdHVlIGlzIHJlYWxseSBhIGR1bWIgb"
     "W92ZS4="},
    {"They say that kicking a valuable gem doesn't seem to make sense.",
     "VGhleSBzYXkgdGhhdCBraWNraW5nIGEgdmFsdWFibGUgZ2VtIGRvZXNuJ3Qgc2VlbSB0byBtY"
     "WtlIHNlbnNlLg=="},
    {"They say that leprechauns know Latin and you should too.",
     "VGhleSBzYXkgdGhhdCBsZXByZWNoYXVucyBrbm93IExhdGluIGFuZCB5b3Ugc2hvdWxkIHRvb"
     "y4="},
    {"They say that minotaurs get lost outside of the mazes.",
     "VGhleSBzYXkgdGhhdCBtaW5vdGF1cnMgZ2V0IGxvc3Qgb3V0c2lkZSBvZiB0aGUgbWF6ZXM"
     "u"},
    {"They say that most trolls are born again.",
     "VGhleSBzYXkgdGhhdCBtb3N0IHRyb2xscyBhcmUgYm9ybiBhZ2Fpbi4="},
    {"They say that naming your cat Garfield will make you more attractive.",
     "VGhleSBzYXkgdGhhdCBuYW1pbmcgeW91ciBjYXQgR2FyZmllbGQgd2lsbCBtYWtlIHlvdSBtb"
     "3JlIGF0dHJhY3RpdmUu"},
    {"They say that no one knows everything about everything in the dungeon.",
     "VGhleSBzYXkgdGhhdCBubyBvbmUga25vd3MgZXZlcnl0aGluZyBhYm91dCBldmVyeXRoaW5nI"
     "GluIHRoZSBkdW5nZW9uLg=="},
    {"They say that no one plays NetHack just for the fun of it.",
     "VGhleSBzYXkgdGhhdCBubyBvbmUgcGxheXMgTmV0SGFjayBqdXN0IGZvciB0aGUgZnVuIG9mI"
     "Gl0Lg=="},
    {"They say that no one really subscribes to rec.games.roguelike.nethack.",
     "VGhleSBzYXkgdGhhdCBubyBvbmUgcmVhbGx5IHN1YnNjcmliZXMgdG8gcmVjLmdhbWVzLnJvZ"
     "3VlbGlrZS5uZXRoYWNrLg=="},
    {"They say that no one will admit to starting a rumor.",
     "VGhleSBzYXkgdGhhdCBubyBvbmUgd2lsbCBhZG1pdCB0byBzdGFydGluZyBhIHJ1bW9yLg="
     "="},
    {"They say that nurses sometimes carry scalpels and never use them.",
     "VGhleSBzYXkgdGhhdCBudXJzZXMgc29tZXRpbWVzIGNhcnJ5IHNjYWxwZWxzIGFuZCBuZXZlc"
     "iB1c2UgdGhlbS4="},
    {"They say that once you've met one wizard you've met them all.",
     "VGhleSBzYXkgdGhhdCBvbmNlIHlvdSd2ZSBtZXQgb25lIHdpemFyZCB5b3UndmUgbWV0IHRoZ"
     "W0gYWxsLg=="},
    {"They say that one troll is worth 10,000 newts.",
     "VGhleSBzYXkgdGhhdCBvbmUgdHJvbGwgaXMgd29ydGggMTAsMDAwIG5ld3RzLg=="},
    {"They say that only David can find the zoo!",
     "VGhleSBzYXkgdGhhdCBvbmx5IERhdmlkIGNhbiBmaW5kIHRoZSB6b28h"},
    {"They say that only angels play their harps for their pets.",
     "VGhleSBzYXkgdGhhdCBvbmx5IGFuZ2VscyBwbGF5IHRoZWlyIGhhcnBzIGZvciB0aGVpciBwZ"
     "XRzLg=="},
    {"They say that only big spenders carry gold.",
     "VGhleSBzYXkgdGhhdCBvbmx5IGJpZyBzcGVuZGVycyBjYXJyeSBnb2xkLg=="},
    {"They say that orc shamans are healthy, wealthy and wise.",
     "VGhleSBzYXkgdGhhdCBvcmMgc2hhbWFucyBhcmUgaGVhbHRoeSwgd2VhbHRoeSBhbmQgd2lzZ"
     "S4="},
    {"They say that playing NetHack is like walking into a death trap.",
     "VGhleSBzYXkgdGhhdCBwbGF5aW5nIE5ldEhhY2sgaXMgbGlrZSB3YWxraW5nIGludG8gYSBkZ"
     "WF0aCB0cmFwLg=="},
    {"They say that problem breathing is best treated by a proper diet.",
     "VGhleSBzYXkgdGhhdCBwcm9ibGVtIGJyZWF0aGluZyBpcyBiZXN0IHRyZWF0ZWQgYnkgYSBwc"
     "m9wZXIgZGlldC4="},
    {"They say that quaffing many potions of levitation can give you a "
     "headache.",
     "VGhleSBzYXkgdGhhdCBxdWFmZmluZyBtYW55IHBvdGlvbnMgb2YgbGV2aXRhdGlvbiBjYW4gZ"
     "2l2ZSB5b3UgYSBoZWFkYWNoZS4="},
    {"They say that queen bees get that way by eating royal jelly.",
     "VGhleSBzYXkgdGhhdCBxdWVlbiBiZWVzIGdldCB0aGF0IHdheSBieSBlYXRpbmcgcm95YWwga"
     "mVsbHku"},
    {"They say that reading a scare monster scroll is the same as saying "
     "Elbereth.",
     "VGhleSBzYXkgdGhhdCByZWFkaW5nIGEgc2NhcmUgbW9uc3RlciBzY3JvbGwgaXMgdGhlIHNhb"
     "WUgYXMgc2F5aW5nIEVsYmVyZXRoLg=="},
    {"They say that real hackers always are controlled.",
     "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgYWx3YXlzIGFyZSBjb250cm9sbGVkLg=="},
    {"They say that real hackers never sleep.",
     "VGhleSBzYXkgdGhhdCByZWFsIGhhY2tlcnMgbmV2ZXIgc2xlZXAu"},
    {"They say that shopkeepers are insured by Croesus himself!",
     "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBhcmUgaW5zdXJlZCBieSBDcm9lc3VzIGhpbXNlb"
     "GYh"},
    {"They say that shopkeepers never carry more than 20 gold pieces, at "
     "night.",
     "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBjYXJyeSBtb3JlIHRoYW4gMjAgZ29sZ"
     "CBwaWVjZXMsIGF0IG5pZ2h0Lg=="},
    {"They say that shopkeepers never sell blessed potions of invisibility.",
     "VGhleSBzYXkgdGhhdCBzaG9wa2VlcGVycyBuZXZlciBzZWxsIGJsZXNzZWQgcG90aW9ucyBvZ"
     "iBpbnZpc2liaWxpdHku"},
    {"They say that soldiers wear kid gloves and silly helmets.",
     "VGhleSBzYXkgdGhhdCBzb2xkaWVycyB3ZWFyIGtpZCBnbG92ZXMgYW5kIHNpbGx5IGhlbG1ld"
     "HMu"},
    {"They say that some Kops are on the take.",
     "VGhleSBzYXkgdGhhdCBzb21lIEtvcHMgYXJlIG9uIHRoZSB0YWtlLg=="},
    {"They say that some guards' palms can be greased.",
     "VGhleSBzYXkgdGhhdCBzb21lIGd1YXJkcycgcGFsbXMgY2FuIGJlIGdyZWFzZWQu"},
    {"They say that some monsters may kiss your boots to stop your drum "
     "playing.",
     "VGhleSBzYXkgdGhhdCBzb21lIG1vbnN0ZXJzIG1heSBraXNzIHlvdXIgYm9vdHMgdG8gc3Rvc"
     "CB5b3VyIGRydW0gcGxheWluZy4="},
    {"They say that sometimes you can be the hit of the party when playing a "
     "horn.",
     "VGhleSBzYXkgdGhhdCBzb21ldGltZXMgeW91IGNhbiBiZSB0aGUgaGl0IG9mIHRoZSBwYXJ0e"
     "SB3aGVuIHBsYXlpbmcgYSBob3JuLg=="},
    {"They say that the NetHack gods generally welcome your sacrifices.",
     "VGhleSBzYXkgdGhhdCB0aGUgTmV0SGFjayBnb2RzIGdlbmVyYWxseSB3ZWxjb21lIHlvdXIgc"
     "2FjcmlmaWNlcy4="},
    {"They say that the Three Rings are named Vilya, Nenya and Narya.",
     "VGhleSBzYXkgdGhhdCB0aGUgVGhyZWUgUmluZ3MgYXJlIG5hbWVkIFZpbHlhLCBOZW55YSBhb"
     "mQgTmFyeWEu"},
    {"They say that the Wizard of Yendor has a death wish.",
     "VGhleSBzYXkgdGhhdCB0aGUgV2l6YXJkIG9mIFllbmRvciBoYXMgYSBkZWF0aCB3aXNoLg="
     "="},
    {"They say that the `hair of the dog' is sometimes an effective remedy.",
     "VGhleSBzYXkgdGhhdCB0aGUgYGhhaXIgb2YgdGhlIGRvZycgaXMgc29tZXRpbWVzIGFuIGVmZ"
     "mVjdGl2ZSByZW1lZHku"},
    {"They say that the best time to save your game is now before its too "
     "late.",
     "VGhleSBzYXkgdGhhdCB0aGUgYmVzdCB0aW1lIHRvIHNhdmUgeW91ciBnYW1lIGlzIG5vdyBiZ"
     "WZvcmUgaXRzIHRvbyBsYXRlLg=="},
    {"They say that the biggest obstacle in NetHack is your mind.",
     "VGhleSBzYXkgdGhhdCB0aGUgYmlnZ2VzdCBvYnN0YWNsZSBpbiBOZXRIYWNrIGlzIHlvdXIgb"
     "WluZC4="},
    {"They say that the gods are angry when they hit you with objects.",
     "VGhleSBzYXkgdGhhdCB0aGUgZ29kcyBhcmUgYW5ncnkgd2hlbiB0aGV5IGhpdCB5b3Ugd2l0a"
     "CBvYmplY3RzLg=="},
    {"They say that the priesthood are specially favored by the gods.",
     "VGhleSBzYXkgdGhhdCB0aGUgcHJpZXN0aG9vZCBhcmUgc3BlY2lhbGx5IGZhdm9yZWQgYnkgd"
     "GhlIGdvZHMu"},
    {"They say that the way to make a unicorn happy is to give it what it "
     "wants.",
     "VGhleSBzYXkgdGhhdCB0aGUgd2F5IHRvIG1ha2UgYSB1bmljb3JuIGhhcHB5IGlzIHRvIGdpd"
     "mUgaXQgd2hhdCBpdCB3YW50cy4="},
    {"They say that there are no black or white stones, only gray.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gYmxhY2sgb3Igd2hpdGUgc3RvbmVzLCBvbmx5I"
     "GdyYXku"},
    {"They say that there are no skeletons hence there are no skeleton keys.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBhcmUgbm8gc2tlbGV0b25zIGhlbmNlIHRoZXJlIGFyZSBub"
     "yBza2VsZXRvbiBrZXlzLg=="},
    {"They say that there is a clever rogue in every hacker just dying to "
     "escape.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBhIGNsZXZlciByb2d1ZSBpbiBldmVyeSBoYWNrZXIga"
     "nVzdCBkeWluZyB0byBlc2NhcGUu"},
    {"They say that there is no such thing as free advice.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGZyZWUgYWR2aWNlLg="
     "="},
    {"They say that there is only one way to win at NetHack.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSB3YXkgdG8gd2luIGF0IE5ldEhhY2s"
     "u"},
    {"They say that there once was a fearsome chaotic samurai named Luk No.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSBvbmNlIHdhcyBhIGZlYXJzb21lIGNoYW90aWMgc2FtdXJha"
     "SBuYW1lZCBMdWsgTm8u"},
    {"They say that there was a time when cursed holy water wasn't water.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSB3YXMgYSB0aW1lIHdoZW4gY3Vyc2VkIGhvbHkgd2F0ZXIgd"
     "2Fzbid0IHdhdGVyLg=="},
    {"They say that there's no point in crying over a gray ooze.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG5vIHBvaW50IGluIGNyeWluZyBvdmVyIGEgZ3JheSBvb"
     "3plLg=="},
    {"They say that there's only hope left after you've opened Pandora's box.",
     "VGhleSBzYXkgdGhhdCB0aGVyZSdzIG9ubHkgaG9wZSBsZWZ0IGFmdGVyIHlvdSd2ZSBvcGVuZ"
     "WQgUGFuZG9yYSdzIGJveC4="},
    {"They say that trapdoors should always be marked `Caution: Trap Door'.",
     "VGhleSBzYXkgdGhhdCB0cmFwZG9vcnMgc2hvdWxkIGFsd2F5cyBiZSBtYXJrZWQgYENhdXRpb"
     "246IFRyYXAgRG9vcicu"},
    {"They say that using an amulet of change isn't a difficult operation.",
     "VGhleSBzYXkgdGhhdCB1c2luZyBhbiBhbXVsZXQgb2YgY2hhbmdlIGlzbid0IGEgZGlmZmljd"
     "Wx0IG9wZXJhdGlvbi4="},
    {"They say that water walking boots are better if you are fast like "
     "Hermes.",
     "VGhleSBzYXkgdGhhdCB3YXRlciB3YWxraW5nIGJvb3RzIGFyZSBiZXR0ZXIgaWYgeW91IGFyZ"
     "SBmYXN0IGxpa2UgSGVybWVzLg=="},
    {"They say that when you wear a circular amulet you might resemble a "
     "troll.",
     "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSB3ZWFyIGEgY2lyY3VsYXIgYW11bGV0IHlvdSBtaWdod"
     "CByZXNlbWJsZSBhIHRyb2xsLg=="},
    {"They say that when you're hungry you can get a pizza in 30 moves or it's "
     "free.",
     "VGhleSBzYXkgdGhhdCB3aGVuIHlvdSdyZSBodW5ncnkgeW91IGNhbiBnZXQgYSBwaXp6YSBpb"
     "iAzMCBtb3ZlcyBvciBpdCdzIGZyZWUu"},
    {"They say that when your god is angry you should try another one.",
     "VGhleSBzYXkgdGhhdCB3aGVuIHlvdXIgZ29kIGlzIGFuZ3J5IHlvdSBzaG91bGQgdHJ5IGFub"
     "3RoZXIgb25lLg=="},
    {"They say that wielding a unicorn horn takes strength.",
     "VGhleSBzYXkgdGhhdCB3aWVsZGluZyBhIHVuaWNvcm4gaG9ybiB0YWtlcyBzdHJlbmd0aC4"
     "="},
    {"They say that with speed boots you never worry about hit and run "
     "accidents.",
     "VGhleSBzYXkgdGhhdCB3aXRoIHNwZWVkIGJvb3RzIHlvdSBuZXZlciB3b3JyeSBhYm91dCBoa"
     "XQgYW5kIHJ1biBhY2NpZGVudHMu"},
    {"They say that you can defeat a killer bee with a unicorn horn.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIGRlZmVhdCBhIGtpbGxlciBiZWUgd2l0aCBhIHVuaWNvc"
     "m4gaG9ybi4="},
    {"They say that you can only cross the River Styx in Charon's boat.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgY3Jvc3MgdGhlIFJpdmVyIFN0eXggaW4gQ2hhc"
     "m9uJ3MgYm9hdC4="},
    {"They say that you can only kill a lich once and then you'd better be "
     "careful.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkga2lsbCBhIGxpY2ggb25jZSBhbmQgdGhlbiB5b"
     "3UnZCBiZXR0ZXIgYmUgY2FyZWZ1bC4="},
    {"They say that you can only wish for things you've already had.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIG9ubHkgd2lzaCBmb3IgdGhpbmdzIHlvdSd2ZSBhbHJlY"
     "WR5IGhhZC4="},
    {"They say that you can train a cat by talking gently to it.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgY2F0IGJ5IHRhbGtpbmcgZ2VudGx5IHRvI"
     "Gl0Lg=="},
    {"They say that you can train a dog by talking firmly to it.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRyYWluIGEgZG9nIGJ5IHRhbGtpbmcgZmlybWx5IHRvI"
     "Gl0Lg=="},
    {"They say that you can trust your gold with the king.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuIHRydXN0IHlvdXIgZ29sZCB3aXRoIHRoZSBraW5nLg="
     "="},
    {"They say that you can't wipe your greasy bare hands on a blank scroll.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2FuJ3Qgd2lwZSB5b3VyIGdyZWFzeSBiYXJlIGhhbmRzIG9uI"
     "GEgYmxhbmsgc2Nyb2xsLg=="},
    {"They say that you cannot trust scrolls of rumor.",
     "VGhleSBzYXkgdGhhdCB5b3UgY2Fubm90IHRydXN0IHNjcm9sbHMgb2YgcnVtb3Iu"},
    {"They say that you could fall head over heels for an energy vortex.",
     "VGhleSBzYXkgdGhhdCB5b3UgY291bGQgZmFsbCBoZWFkIG92ZXIgaGVlbHMgZm9yIGFuIGVuZ"
     "XJneSB2b3J0ZXgu"},
    {"They say that you need a key in order to open locked doors.",
     "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIGtleSBpbiBvcmRlciB0byBvcGVuIGxvY2tlZCBkb"
     "29ycy4="},
    {"They say that you need a mirror to notice a mimic in an antique shop.",
     "VGhleSBzYXkgdGhhdCB5b3UgbmVlZCBhIG1pcnJvciB0byBub3RpY2UgYSBtaW1pYyBpbiBhb"
     "iBhbnRpcXVlIHNob3Au"},
    {"They say that you really can use a pick-axe unless you really can't.",
     "VGhleSBzYXkgdGhhdCB5b3UgcmVhbGx5IGNhbiB1c2UgYSBwaWNrLWF4ZSB1bmxlc3MgeW91I"
     "HJlYWxseSBjYW4ndC4="},
    {"They say that you should always store your tools in the cellar.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGFsd2F5cyBzdG9yZSB5b3VyIHRvb2xzIGluIHRoZ"
     "SBjZWxsYXIu"},
    {"They say that you should be careful while climbing the ladder to "
     "success.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGJlIGNhcmVmdWwgd2hpbGUgY2xpbWJpbmcgdGhlI"
     "GxhZGRlciB0byBzdWNjZXNzLg=="},
    {"They say that you should call your armor `rustproof'.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIGNhbGwgeW91ciBhcm1vciBgcnVzdHByb29mJy4"
     "="},
    {"They say that you should name your dog Spuds to have a cool pet.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciBkb2cgU3B1ZHMgdG8gaGF2ZSBhI"
     "GNvb2wgcGV0Lg=="},
    {"They say that you should name your weapon after your first monster kill.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5hbWUgeW91ciB3ZWFwb24gYWZ0ZXIgeW91ciBma"
     "XJzdCBtb25zdGVyIGtpbGwu"},
    {"They say that you should never introduce a rope golem to a succubus.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIGludHJvZHVjZSBhIHJvcGUgZ29sZW0gd"
     "G8gYSBzdWNjdWJ1cy4="},
    {"They say that you should never sleep near invisible ring wraiths.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHNsZWVwIG5lYXIgaW52aXNpYmxlIHJpb"
     "mcgd3JhaXRocy4="},
    {"They say that you should never try to leave the dungeon with a bag of "
     "gems.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHRyeSB0byBsZWF2ZSB0aGUgZHVuZ2Vvb"
     "iB3aXRoIGEgYmFnIG9mIGdlbXMu"},
    {"They say that you should remove your armor before sitting on a throne.",
     "VGhleSBzYXkgdGhhdCB5b3Ugc2hvdWxkIHJlbW92ZSB5b3VyIGFybW9yIGJlZm9yZSBzaXR0a"
     "W5nIG9uIGEgdGhyb25lLg=="},
    {"This fortune cookie is copy protected.",
     "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyBjb3B5IHByb3RlY3RlZC4="},
    {"This fortune cookie is the property of Fortune Cookies, Inc.",
     "VGhpcyBmb3J0dW5lIGNvb2tpZSBpcyB0aGUgcHJvcGVydHkgb2YgRm9ydHVuZSBDb29raWVzL"
     "CBJbmMu"},
    {"Tired? Try a scroll of charging on yourself.",
     "VGlyZWQ/IFRyeSBhIHNjcm9sbCBvZiBjaGFyZ2luZyBvbiB5b3Vyc2VsZi4="},
    {"To achieve the next higher rating, you need 3 more points.",
     "VG8gYWNoaWV2ZSB0aGUgbmV4dCBoaWdoZXIgcmF0aW5nLCB5b3UgbmVlZCAzIG1vcmUgcG9pb"
     "nRzLg=="},
    {"To reach heaven, escape the dungeon while wearing a ring of levitation.",
     "VG8gcmVhY2ggaGVhdmVuLCBlc2NhcGUgdGhlIGR1bmdlb24gd2hpbGUgd2VhcmluZyBhIHJpb"
     "mcgb2YgbGV2aXRhdGlvbi4="},
    {"Tourists wear shirts loud enough to wake the dead.",
     "VG91cmlzdHMgd2VhciBzaGlydHMgbG91ZCBlbm91Z2ggdG8gd2FrZSB0aGUgZGVhZC4="},
    {"Try calling your katana Moulinette.",
     "VHJ5IGNhbGxpbmcgeW91ciBrYXRhbmEgTW91bGluZXR0ZS4="},
    {"Ulch! That meat was painted!",
     "VWxjaCEgVGhhdCBtZWF0IHdhcyBwYWludGVkIQ=="},
    {"Unfortunately, this message was left intentionally blank.",
     "VW5mb3J0dW5hdGVseSwgdGhpcyBtZXNzYWdlIHdhcyBsZWZ0IGludGVudGlvbmFsbHkgYmxhb"
     "msu"},
    {"Using a morning star in the evening has no effect.",
     "VXNpbmcgYSBtb3JuaW5nIHN0YXIgaW4gdGhlIGV2ZW5pbmcgaGFzIG5vIGVmZmVjdC4="},
    {"Want a hint? Zap a wand of make invisible on your weapon!",
     "V2FudCBhIGhpbnQ/"
     "IFphcCBhIHdhbmQgb2YgbWFrZSBpbnZpc2libGUgb24geW91ciB3ZWFwb24h"},
    {"Want to ascend in a hurry? Apply at Gizmonic Institute.",
     "V2FudCB0byBhc2NlbmQgaW4gYSBodXJyeT8gQXBwbHkgYXQgR2l6bW9uaWMgSW5zdGl0dXRlL"
     "g=="},
    {"Wanted: shopkeepers. Send a scroll of mail to Mage of Yendor/Level "
     "35/Dungeon.",
     "V2FudGVkOiBzaG9wa2VlcGVycy4gU2VuZCBhIHNjcm9sbCBvZiBtYWlsIHRvIE1hZ2Ugb2YgW"
     "WVuZG9yL0xldmVsIDM1L0R1bmdlb24u"},
    {"Warning: fortune reading can be hazardous to your health.",
     "V2FybmluZzogZm9ydHVuZSByZWFkaW5nIGNhbiBiZSBoYXphcmRvdXMgdG8geW91ciBoZWFsd"
     "Ggu"},
    {"We have new ways of detecting treachery...",
     "V2UgaGF2ZSBuZXcgd2F5cyBvZiBkZXRlY3RpbmcgdHJlYWNoZXJ5Li4u"},
    {"Wet towels make great weapons!",
     "V2V0IHRvd2VscyBtYWtlIGdyZWF0IHdlYXBvbnMh"},
    {"What a pity, you cannot read it!",
     "V2hhdCBhIHBpdHksIHlvdSBjYW5ub3QgcmVhZCBpdCE="},
    {"When a piercer drops in on you, you will be tempted to hit the ceiling!",
     "V2hlbiBhIHBpZXJjZXIgZHJvcHMgaW4gb24geW91LCB5b3Ugd2lsbCBiZSB0ZW1wdGVkIHRvI"
     "GhpdCB0aGUgY2VpbGluZyE="},
    {"When in a maze follow the right wall and you will never get lost.",
     "V2hlbiBpbiBhIG1hemUgZm9sbG93IHRoZSByaWdodCB3YWxsIGFuZCB5b3Ugd2lsbCBuZXZlc"
     "iBnZXQgbG9zdC4="},
    {"When you have a key, you don't have to wait for the guard.",
     "V2hlbiB5b3UgaGF2ZSBhIGtleSwgeW91IGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGd1Y"
     "XJkLg=="},
    {"Why are you wasting time reading fortunes?",
     "V2h5IGFyZSB5b3Ugd2FzdGluZyB0aW1lIHJlYWRpbmcgZm9ydHVuZXM/"},
    {"Wish for a master key and open the Magic Memory Vault!",
     "V2lzaCBmb3IgYSBtYXN0ZXIga2V5IGFuZCBvcGVuIHRoZSBNYWdpYyBNZW1vcnkgVmF1bHQ"
     "h"},
    {"Wizard expects every monster to do its duty.",
     "V2l6YXJkIGV4cGVjdHMgZXZlcnkgbW9uc3RlciB0byBkbyBpdHMgZHV0eS4="},
    {"Wow! You could've had a potion of fruit juice!",
     "V293ISBZb3UgY291bGQndmUgaGFkIGEgcG90aW9uIG9mIGZydWl0IGp1aWNlIQ=="},
    {"Yet Another Silly Message (YASM).",
     "WWV0IEFub3RoZXIgU2lsbHkgTWVzc2FnZSAoWUFTTSku"},
    {"You are destined to be misled by a fortune.",
     "WW91IGFyZSBkZXN0aW5lZCB0byBiZSBtaXNsZWQgYnkgYSBmb3J0dW5lLg=="},
    {"You can get a genuine Amulet of Yendor by doing the following: --More--",
     "WW91IGNhbiBnZXQgYSBnZW51aW5lIEFtdWxldCBvZiBZZW5kb3IgYnkgZG9pbmcgdGhlIGZvb"
     "Gxvd2luZzogLS1Nb3JlLS0="},
    {"You can protect yourself from black dragons by doing the following: "
     "--More--",
     "WW91IGNhbiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gYmxhY2sgZHJhZ29ucyBieSBkb2luZyB0a"
     "GUgZm9sbG93aW5nOiAtLU1vcmUtLQ=="},
    {"You can't get by the snake.", "WW91IGNhbid0IGdldCBieSB0aGUgc25ha2Uu"},
    {"You feel like someone is pulling your leg.",
     "WW91IGZlZWwgbGlrZSBzb21lb25lIGlzIHB1bGxpbmcgeW91ciBsZWcu"},
    {"You have to outwit the Sphynx or pay her.",
     "WW91IGhhdmUgdG8gb3V0d2l0IHRoZSBTcGh5bnggb3IgcGF5IGhlci4="},
    {"You hear the fortune cookie's hissing!",
     "WW91IGhlYXIgdGhlIGZvcnR1bmUgY29va2llJ3MgaGlzc2luZyE="},
    {"You may get rich selling letters, but beware of being blackmailed!",
     "WW91IG1heSBnZXQgcmljaCBzZWxsaW5nIGxldHRlcnMsIGJ1dCBiZXdhcmUgb2YgYmVpbmcgY"
     "mxhY2ttYWlsZWQh"},
    {"You offend Shai-Hulud by sheathing your crysknife without having drawn "
     "blood.",
     "WW91IG9mZmVuZCBTaGFpLUh1bHVkIGJ5IHNoZWF0aGluZyB5b3VyIGNyeXNrbmlmZSB3aXRob"
     "3V0IGhhdmluZyBkcmF3biBibG9vZC4="},
    {"You swallowed the fortune!", "WW91IHN3YWxsb3dlZCB0aGUgZm9ydHVuZSE="},
    {"You want to regain strength? Two levels ahead is a guesthouse!",
     "WW91IHdhbnQgdG8gcmVnYWluIHN0cmVuZ3RoPyBUd28gbGV2ZWxzIGFoZWFkIGlzIGEgZ3Vlc"
     "3Rob3VzZSE="},
    {"You will encounter a tall, dark, and gruesome creature...",
     "WW91IHdpbGwgZW5jb3VudGVyIGEgdGFsbCwgZGFyaywgYW5kIGdydWVzb21lIGNyZWF0dXJlL"
     "i4u"},

    {"The End", "VGhlIEVuZA=="}};

/* PL_Base64Encode, random strings */
PRBool test_004(void) {
  int i;
  char result[4096];

  printf(
      "Test 004 (PL_Base64Encode, random strings)                            "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 plen = PL_strlen(array[i].plaintext);
    PRUint32 clen = ((plen + 2) / 3) * 4;

    char* rv = PL_Base64Encode(array[i].plaintext, plen, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strncmp(result, array[i].cyphertext, clen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].plaintext, array[i].cyphertext, clen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, single characters, malloc */
PRBool test_005(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 005 (PL_Base64Encode, single characters, malloc)                 "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Encode((char*)plain, 1, (char*)0);
      if ((char*)0 == rv) {
        printf("FAIL\n\t(%d, %d): no return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strcmp((char*)cypher, rv)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n", a, b, cypher,
               rv);
        PR_DELETE(rv);
        return PR_FALSE;
      }

      PR_DELETE(rv);
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, double characters, malloc */
PRBool test_006(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 006 (PL_Base64Encode, double characters, malloc)                 "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Encode((char*)plain, 2, (char*)0);
          if ((char*)0 == rv) {
            printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strcmp((char*)cypher, rv)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
                   a, b, c, d, cypher, rv);
            PR_DELETE(rv);
            return PR_FALSE;
          }

          PR_DELETE(rv);
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, triple characters, malloc */
PRBool test_007(void) {
  PRUint32 a, b, c, d, e, f;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 007 (PL_Base64Encode, triple characters, malloc)                 "
      "...");
  fflush(stdout);

  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          for (e = 0; e < 4; e++) {
            cypher[2] = base[d * 4 + e];
            for (f = 0; f < 64; f++) {
              plain[2] = e * 64 + f;
              cypher[3] = base[f];

              rv = PL_Base64Encode((char*)plain, 3, (char*)0);
              if ((char*)0 == rv) {
                printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a,
                       b, c, d, e, f);
                return PR_FALSE;
              }

              if (0 != PL_strcmp((char*)cypher, rv)) {
                printf(
                    "FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got "
                    "\"%.4s.\"\n",
                    a, b, c, d, e, f, cypher, rv);
                PR_DELETE(rv);
                return PR_FALSE;
              }

              PR_DELETE(rv);
            }
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, random strings, malloc */
PRBool test_008(void) {
  int i;

  printf(
      "Test 008 (PL_Base64Encode, random strings, malloc)                    "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 plen = PL_strlen(array[i].plaintext);
    PRUint32 clen = ((plen + 2) / 3) * 4;

    char* rv = PL_Base64Encode(array[i].plaintext, plen, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].cyphertext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].plaintext, array[i].cyphertext, rv);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, single characters */
PRBool test_009(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 009 (PL_Base64Decode, single characters, equals)                 "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Decode((char*)cypher, 4, result);
      if (rv != result) {
        printf("FAIL\n\t(%d, %d): return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strncmp((char*)plain, result, 1)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n", a, b,
               plain, result);
        return PR_FALSE;
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, single characters */
PRBool test_010(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 010 (PL_Base64Decode, single characters, no equals)              "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)0;
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Decode((char*)cypher, 2, result);
      if (rv != result) {
        printf("FAIL\n\t(%d, %d): return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strncmp((char*)plain, result, 1)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%.1s.\"\n", a, b,
               plain, result);
        return PR_FALSE;
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, double characters */
PRBool test_011(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 011 (PL_Base64Decode, double characters, equals)                 "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Decode((char*)cypher, 4, result);
          if (rv != result) {
            printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strncmp((char*)plain, result, 2)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
                   a, b, c, d, plain, result);
            return PR_FALSE;
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, double characters */
PRBool test_012(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 012 (PL_Base64Decode, double characters, no equals)              "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)0;
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Decode((char*)cypher, 3, result);
          if (rv != result) {
            printf("FAIL\n\t(%d, %d, %d, %d): return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strncmp((char*)plain, result, 2)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%.2s.\"\n",
                   a, b, c, d, cypher, result);
            return PR_FALSE;
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, triple characters */
PRBool test_013(void) {
  PRUint32 a, b, c, d, e, f;
  unsigned char plain[4];
  unsigned char cypher[5];
  char result[8];
  char* rv;

  printf(
      "Test 013 (PL_Base64Decode, triple characters)                         "
      "...");
  fflush(stdout);

  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          for (e = 0; e < 4; e++) {
            cypher[2] = base[d * 4 + e];
            for (f = 0; f < 64; f++) {
              plain[2] = e * 64 + f;
              cypher[3] = base[f];

              rv = PL_Base64Decode((char*)cypher, 4, result);
              if (rv != result) {
                printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): return value\n", a, b,
                       c, d, e, f);
                return PR_FALSE;
              }

              if (0 != PL_strncmp((char*)plain, result, 3)) {
                printf(
                    "FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got "
                    "\"%.3s.\"\n",
                    a, b, c, d, e, f, plain, result);
                return PR_FALSE;
              }
            }
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings */
PRBool test_014(void) {
  int i;
  char result[4096];

  printf(
      "Test 014 (PL_Base64Decode, random strings, equals)                    "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen = PL_strlen(array[i].cyphertext);
    PRUint32 plen = (clen * 3) / 4;

    char* rv = PL_Base64Decode(array[i].cyphertext, clen, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 == (clen & 3)) {
      if ('=' == array[i].cyphertext[clen - 1]) {
        if ('=' == array[i].cyphertext[clen - 2]) {
          plen -= 2;
        } else {
          plen -= 1;
        }
      }
    }

    if (0 != PL_strncmp(result, array[i].plaintext, plen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, plen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings */
PRBool test_015(void) {
  int i;
  char buffer[4096];
  char result[4096];
  char* rv;

  printf(
      "Test 015 (PL_Base64Decode, random strings, no equals)                 "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen, plen;

    PL_strcpy(buffer, array[i].cyphertext);
    clen = PL_strlen(buffer);

    if (0 == (clen & 3)) {
      if ('=' == buffer[clen - 1]) {
        if ('=' == buffer[clen - 2]) {
          buffer[clen - 2] = buffer[clen - 1] = (char)0;
          clen -= 2;
        } else {
          buffer[clen - 1] = (char)0;
          clen -= 1;
        }
      }
    }

    plen = (clen * 3) / 4;

    rv = PL_Base64Decode(buffer, clen, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strncmp(result, array[i].plaintext, plen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, plen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, single characters, malloc */
PRBool test_016(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 016 (PL_Base64Decode, single characters, equals, malloc)         "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Decode((char*)cypher, 4, (char*)0);
      if ((char*)0 == rv) {
        printf("FAIL\n\t(%d, %d): no return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strcmp((char*)plain, rv)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n", a, b, plain,
               rv);
        PR_DELETE(rv);
        return PR_FALSE;
      }

      PR_DELETE(rv);
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, single characters, malloc */
PRBool test_017(void) {
  PRUint32 a, b;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 017 (PL_Base64Decode, single characters, no equals, malloc)      "
      "...");
  fflush(stdout);

  plain[1] = plain[2] = plain[3] = (unsigned char)0;
  cypher[2] = cypher[3] = (unsigned char)0;
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];

    for (b = 0; b < 4; b++) {
      plain[0] = (unsigned char)(a * 4 + b);
      cypher[1] = base[(b * 16)];

      rv = PL_Base64Decode((char*)cypher, 2, (char*)0);
      if ((char*)0 == rv) {
        printf("FAIL\n\t(%d, %d): no return value\n", a, b);
        return PR_FALSE;
      }

      if (0 != PL_strcmp((char*)plain, rv)) {
        printf("FAIL\n\t(%d, %d): expected \"%s,\" got \"%s.\"\n", a, b, plain,
               rv);
        PR_DELETE(rv);
        return PR_FALSE;
      }

      PR_DELETE(rv);
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, double characters, malloc */
PRBool test_018(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 018 (PL_Base64Decode, double characters, equals, malloc)         "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)'=';
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Decode((char*)cypher, 4, (char*)0);
          if ((char*)0 == rv) {
            printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strcmp((char*)plain, rv)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
                   a, b, c, d, plain, rv);
            PR_DELETE(rv);
            return PR_FALSE;
          }

          PR_DELETE(rv);
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, double characters, malloc */
PRBool test_019(void) {
  PRUint32 a, b, c, d;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 019 (PL_Base64Decode, double characters, no equals, malloc)      "
      "...");
  fflush(stdout);

  plain[2] = plain[3] = (unsigned char)0;
  cypher[3] = (unsigned char)0;
  cypher[4] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          cypher[2] = base[d * 4];

          rv = PL_Base64Decode((char*)cypher, 3, (char*)0);
          if ((char*)0 == rv) {
            printf("FAIL\n\t(%d, %d, %d, %d): no return value\n", a, b, c, d);
            return PR_FALSE;
          }

          if (0 != PL_strcmp((char*)plain, rv)) {
            printf("FAIL\n\t(%d, %d, %d, %d): expected \"%s,\" got \"%s.\"\n",
                   a, b, c, d, cypher, rv);
            PR_DELETE(rv);
            return PR_FALSE;
          }

          PR_DELETE(rv);
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, triple characters, malloc */
PRBool test_020(void) {
  PRUint32 a, b, c, d, e, f;
  unsigned char plain[4];
  unsigned char cypher[5];
  char* rv;

  printf(
      "Test 020 (PL_Base64Decode, triple characters, malloc)                 "
      "...");
  fflush(stdout);

  cypher[4] = (unsigned char)0;
  plain[3] = (unsigned char)0;

  for (a = 0; a < 64; a++) {
    cypher[0] = base[a];
    for (b = 0; b < 4; b++) {
      plain[0] = (a * 4) + b;
      for (c = 0; c < 16; c++) {
        cypher[1] = base[b * 16 + c];
        for (d = 0; d < 16; d++) {
          plain[1] = c * 16 + d;
          for (e = 0; e < 4; e++) {
            cypher[2] = base[d * 4 + e];
            for (f = 0; f < 64; f++) {
              plain[2] = e * 64 + f;
              cypher[3] = base[f];

              rv = PL_Base64Decode((char*)cypher, 4, (char*)0);
              if ((char*)0 == rv) {
                printf("FAIL\n\t(%d, %d, %d, %d, %d, %d): no return value\n", a,
                       b, c, d, e, f);
                return PR_FALSE;
              }

              if (0 != PL_strcmp((char*)plain, rv)) {
                printf(
                    "FAIL\n\t(%d, %d, %d, %d, %d, %d): expected \"%s,\" got "
                    "\"%.3s.\"\n",
                    a, b, c, d, e, f, plain, rv);
                PR_DELETE(rv);
                return PR_FALSE;
              }

              PR_DELETE(rv);
            }
          }
        }
      }
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings, malloc */
PRBool test_021(void) {
  int i;

  printf(
      "Test 021 (PL_Base64Decode, random strings, equals, malloc)            "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen = PL_strlen(array[i].cyphertext);

    char* rv = PL_Base64Decode(array[i].cyphertext, clen, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].plaintext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, rv);
      PR_DELETE(rv);
      return PR_FALSE;
    }

    PR_DELETE(rv);
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, random strings, malloc */
PRBool test_022(void) {
  int i;
  char buffer[4096];
  char* rv;

  printf(
      "Test 022 (PL_Base64Decode, random strings, no equals, malloc)         "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen;

    PL_strcpy(buffer, array[i].cyphertext);
    clen = PL_strlen(buffer);

    if (0 == (clen & 3)) {
      if ('=' == buffer[clen - 1]) {
        if ('=' == buffer[clen - 2]) {
          buffer[clen - 2] = buffer[clen - 1] = (char)0;
          clen -= 2;
        } else {
          buffer[clen - 1] = (char)0;
          clen -= 1;
        }
      }
    }

    rv = PL_Base64Decode(buffer, clen, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].plaintext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, rv);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, random strings */
PRBool test_023(void) {
  int i;
  char result[4096];

  printf(
      "Test 023 (PL_Base64Encode, random strings, strlen)                    "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 plen = PL_strlen(array[i].plaintext);
    PRUint32 clen = ((plen + 2) / 3) * 4;

    char* rv = PL_Base64Encode(array[i].plaintext, 0, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strncmp(result, array[i].cyphertext, clen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].plaintext, array[i].cyphertext, clen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, random strings, malloc */
PRBool test_024(void) {
  int i;

  printf(
      "Test 024 (PL_Base64Encode, random strings, malloc, strlen)            "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 plen = PL_strlen(array[i].plaintext);
    PRUint32 clen = ((plen + 2) / 3) * 4;

    char* rv = PL_Base64Encode(array[i].plaintext, 0, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].cyphertext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].plaintext, array[i].cyphertext, rv);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings */
PRBool test_025(void) {
  int i;
  char result[4096];

  printf(
      "Test 025 (PL_Base64Decode, random strings, equals, strlen)            "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen = PL_strlen(array[i].cyphertext);
    PRUint32 plen = (clen * 3) / 4;

    char* rv = PL_Base64Decode(array[i].cyphertext, 0, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 == (clen & 3)) {
      if ('=' == array[i].cyphertext[clen - 1]) {
        if ('=' == array[i].cyphertext[clen - 2]) {
          plen -= 2;
        } else {
          plen -= 1;
        }
      }
    }

    if (0 != PL_strncmp(result, array[i].plaintext, plen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, plen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings */
PRBool test_026(void) {
  int i;
  char buffer[4096];
  char result[4096];
  char* rv;

  printf(
      "Test 026 (PL_Base64Decode, random strings, no equals, strlen)         "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen, plen;

    PL_strcpy(buffer, array[i].cyphertext);
    clen = PL_strlen(buffer);

    if (0 == (clen & 3)) {
      if ('=' == buffer[clen - 1]) {
        if ('=' == buffer[clen - 2]) {
          buffer[clen - 2] = buffer[clen - 1] = (char)0;
          clen -= 2;
        } else {
          buffer[clen - 1] = (char)0;
          clen -= 1;
        }
      }
    }

    plen = (clen * 3) / 4;

    rv = PL_Base64Decode(buffer, 0, result);

    if (rv != result) {
      printf("FAIL\n\t(%d): return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strncmp(result, array[i].plaintext, plen)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%.*s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, plen, result);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Decode, random strings, malloc */
PRBool test_027(void) {
  int i;

  printf(
      "Test 027 (PL_Base64Decode, random strings, equals, malloc, strlen)    "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen = PL_strlen(array[i].cyphertext);

    char* rv = PL_Base64Decode(array[i].cyphertext, 0, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].plaintext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, rv);
      PR_DELETE(rv);
      return PR_FALSE;
    }

    PR_DELETE(rv);
  }

  printf("PASS\n");
  return PR_TRUE;
}

/* PL_Base64Encode, random strings, malloc */
PRBool test_028(void) {
  int i;
  char buffer[4096];
  char* rv;

  printf(
      "Test 028 (PL_Base64Decode, random strings, no equals, malloc, strlen) "
      "...");
  fflush(stdout);

  for (i = 0; i < sizeof(array) / sizeof(array[0]); i++) {
    PRUint32 clen;

    PL_strcpy(buffer, array[i].cyphertext);
    clen = PL_strlen(buffer);

    if (0 == (clen & 3)) {
      if ('=' == buffer[clen - 1]) {
        if ('=' == buffer[clen - 2]) {
          buffer[clen - 2] = buffer[clen - 1] = (char)0;
          clen -= 2;
        } else {
          buffer[clen - 1] = (char)0;
          clen -= 1;
        }
      }
    }

    rv = PL_Base64Decode(buffer, 0, (char*)0);

    if ((char*)0 == rv) {
      printf("FAIL\n\t(%d): no return value\n", i);
      return PR_FALSE;
    }

    if (0 != PL_strcmp(rv, array[i].plaintext)) {
      printf("FAIL\n\t(%d, \"%s\"): expected \n\"%s,\" got \n\"%s.\"\n", i,
             array[i].cyphertext, array[i].plaintext, rv);
      return PR_FALSE;
    }
  }

  printf("PASS\n");
  return PR_TRUE;
}

int main(int argc, char* argv[]) {
  printf("Testing the Portable Library base64 functions:\n");
  printf("(warning: the \"triple characters\" tests are slow)\n");

  if (1 && test_001() && test_002() && test_003() && test_004() && test_005() &&
      test_006() && test_007() && test_008() && test_009() && test_010() &&
      test_011() && test_012() && test_013() && test_014() && test_015() &&
      test_016() && test_017() && test_018() && test_019() && test_020() &&
      test_021() && test_022() && test_023() && test_024() && test_025() &&
      test_026() && test_027() && test_028()) {
    printf("Suite passed.\n");
    return 0;
  } else {
    printf("Suite failed.\n");
    return 1;
  }

  /*NOTREACHED*/
}
