From 8f4e597db53fe503c025cfa60e2aa92496bb9deb Mon Sep 17 00:00:00 2001 From: Jeff Jetton Date: Sat, 14 May 2022 10:48:07 -0500 Subject: [PATCH] Initial commit --- packer.py | 102 +++++++ words.txt | 866 ++++++++++++++++++++++++++++++++++++++++++++++++++++ words_0.bin | Bin 0 -> 1656 bytes words_1.bin | Bin 0 -> 942 bytes worple.asm | 404 ++++++++++++++++++++++++ worple.bin | Bin 0 -> 3329 bytes worple.js | 421 +++++++++++++++++++++++++ worple.txt | 417 +++++++++++++++++++++++++ 8 files changed, 2210 insertions(+) create mode 100644 packer.py create mode 100644 words.txt create mode 100644 words_0.bin create mode 100644 words_1.bin create mode 100644 worple.asm create mode 100644 worple.bin create mode 100644 worple.js create mode 100644 worple.txt diff --git a/packer.py b/packer.py new file mode 100644 index 0000000..8cf77da --- /dev/null +++ b/packer.py @@ -0,0 +1,102 @@ + +# Read in file of five-letter words and encode them into two groups +# of three-byte packed binary. +# +# Each letter is converted to a five-bit value, 0-25. +# The bits are put together into a 25 bits, which would normally take +# up four bytes of storage. Since bit 0 of the MSB (the right-most bit +# of our 25 bits) can only be 0 or 1, we'll just split the data +# into two groups and only store the least-significant 24 bits. +# +# In other words, if the first letter is A-P (0-15), we can store that +# first letter in only four bits. Remaining letters are five bits each +# regardless, for a total of 24 bits (three bytes). +# If the first letter is P-Z (15-25), we'll still store it in four bits, +# but in separate list that we'll keep in a specific section of +# memory. We'll just need to be aware that words from that part of the +# list will need to have that bit put back on (i.e., have that first +# letter shifted up the alphabet by 16 letters) + +import random + +INFILE = 'words.txt' +OUTFILE_0 = 'words_0.bin' +OUTFILE_1 = 'words_1.bin' + + +def pack(word): + # Pack a five-letter word into three bytes. + # Return binary bytes along with an overflow flag (1 or 0) + word = word.strip().upper() + if len(word) != 5: + raise ValueError(f'"{word}" is not five letters long') + b = 0 + for i in range(5): + # Convert letter to 0-25 integer + c = ord(word[i]) - 65 + if (c < 0) or (c > 25): + raise ValueError('Character out of range A-Z in word ' + word) + # Scoot current contents of b over by five bits, + # then add new character + b = b * 32 + b += c + + # Did we "overflow" into bit 24? + if b & 0x1000000: + # Mask off just the leftmost three bytes + b &= 0xFFFFFF + overflow = 1 + else: + overflow = 0 + + # Return as a three-byte bytes object + return [b.to_bytes(3, 'big'), overflow] + + +def head_and_tail(list, size=6): + print('Head: ' + str(list[0:size])) + print('Tail: ' + str(list[-size:])) + return + + +############################################################################## + +# Read in list +print('\nReading ' + INFILE) +with open(INFILE, 'r') as infile: + words = infile.readlines() +print('Words read: ' + str(len(words))) +head_and_tail(words) +print() + +# Shuffle them up +print('Shuffling...') +random.seed(24601) +random.shuffle(words) +head_and_tail(words) +print() + +# Pack into bytes (this also uppercases and strips whitespace/returns) +print('Packing words...') +packed_list = [[],[]] +for word in words: + packed = pack(word) + packed_list[packed[1]].append(packed[0]) +print('Words with first bit = 0: ' + str(len(packed_list[0]))) +print('Words with first bit = 1: ' + str(len(packed_list[1]))) +print() + +# Save as two separate list files +print('Saving word lists...') +with open(OUTFILE_0, 'wb') as outfile: + for data in packed_list[0]: + outfile.write(data) +with open(OUTFILE_1, 'wb') as outfile: + for data in packed_list[1]: + outfile.write(data) +print('Done\n') + + + + + diff --git a/words.txt b/words.txt new file mode 100644 index 0000000..133aaae --- /dev/null +++ b/words.txt @@ -0,0 +1,866 @@ +ABBOT +ABEAM +ABOUT +ABOVE +ABUSE +ABUZZ +ABYSS +ACHOO +ACRID +ADDED +ADDER +AFOOT +AFTER +AGAIN +AGAPE +AGLOW +AGREE +AIDED +ALGOL +ALIEN +ALLEY +ALLOW +ALLOY +ALOFT +ALTAR +AMBER +AMBLE +AMONG +ANGER +ANGLE +ANISE +ANKLE +ANNEX +ANODE +ANVIL +AORTA +APPLE +ARISE +ARMOR +AROMA +ARRAY +ARTSY +ASHEN +ASIDE +ASSAY +ATTIC +AUDIT +AWARE +AWFUL +AWOKE +BADGE +BADLY +BAKER +BALER +BANJO +BARGE +BARON +BASIC +BASIN +BATHE +BAYOU +BEADY +BEFIT +BEGAN +BEGIN +BELIE +BENCH +BERTH +BEVEL +BINGO +BIRTH +BLACK +BLANK +BLAST +BLESS +BLITZ +BLOCK +BLOWN +BLUER +BLUFF +BLUNT +BLUSH +BOARD +BODGE +BOOST +BOOZE +BRACE +BRAID +BRAIN +BRAWN +BREAD +BREAK +BRIBE +BRIDE +BRING +BRISK +BROAD +BROIL +BROKE +BROTH +BROWN +BUDGE +BUGGY +BUILD +BUILT +BULGE +BULKY +BURNT +BURST +BUSHY +BUTTE +BUYER +BYTES +CABBY +CABIN +CACHE +CAGED +CAMEL +CANDY +CARAT +CAROL +CARRY +CATCH +CAUSE +CEASE +CEDAR +CHAFE +CHAIR +CHAMP +CHARD +CHART +CHASE +CHEAP +CHECK +CHESS +CHICK +CHIEF +CHILD +CHIRP +CHOCK +CHORD +CHUNK +CLACK +CLAIM +CLASP +CLASS +CLEAN +CLEAR +CLICK +CLIMB +CLOCK +CLOSE +CLOUD +CLUNG +COAST +COBOL +COCOA +CODEC +CODED +CODER +COLOR +COMBO +COMET +CONCH +COULD +COUNT +COUPE +COVEN +COVER +CRAFT +CREAK +CREEP +CREPE +CRIED +CROSS +CROWD +CRUEL +CRUFT +CRUMB +CRUST +CRYPT +CYCLE +DAFFY +DANCE +DANDY +DATED +DAZED +DEATH +DEBAR +DEBUG +DELTA +DEPOT +DEUCE +DEVIL +DIARY +DICEY +DIMLY +DINGO +DIODE +DISCO +DITCH +DOING +DOLLY +DOUGH +DOWEL +DOWNY +DRAWL +DRAWN +DREAD +DREAM +DRESS +DRIFT +DRINK +DRIVE +DROID +DROVE +DROWN +DRUID +DUVET +DWELL +DWELT +EARLY +EARTH +EIGHT +EJECT +ELECT +ELEGY +ELFIN +ELUDE +EMAIL +EMOJI +EMOTE +ENEMY +ENJOY +ENTER +ENVOY +EPOXY +EQUAL +EQUIP +ERASE +ERECT +ESSAY +ETHIC +ETHOS +ETUDE +EVENT +EVERY +EXACT +EXILE +EXPEL +EXTOL +FAINT +FALSE +FARAD +FAVOR +FEAST +FETAL +FIBER +FIELD +FIERY +FIGHT +FILTH +FINAL +FIRST +FISHY +FLACK +FLAIL +FLAKE +FLANK +FLARE +FLIER +FLING +FLOCK +FLOOR +FLOSS +FLUID +FLUME +FLUNG +FLUTE +FOCAL +FOGGY +FOIST +FOLLY +FORCE +FORTH +FOUND +FREED +FRESH +FRIAR +FRILL +FRISK +FROND +FRONT +FROST +FROTH +FRUIT +FUROR +GAILY +GASSY +GAUZE +GAYLY +GEESE +GENIE +GHOST +GIRTH +GIVEN +GLADE +GLASS +GLIDE +GLINT +GLOAM +GLOSS +GLUON +GLYPH +GOOFY +GOOSE +GOURD +GRACE +GRADE +GRAFT +GRAND +GRAPE +GRASP +GRASS +GRAVE +GRAZE +GREAT +GREED +GREEN +GRILL +GRIPE +GROOM +GROUP +GROWL +GRUMP +GRUNT +GUARD +GUESS +GUEST +GUIDE +GUILE +GULCH +GUSTO +HACKS +HAIRY +HANDY +HAPPY +HARPY +HARRY +HASTE +HASTY +HATCH +HEADY +HEARD +HEART +HEAVY +HELIX +HENRY +HERON +HERTZ +HINGE +HOBBY +HONEY +HORSE +HOTEL +HOTLY +HOUSE +HUMAN +HUMID +HURRY +HYDRO +HYENA +IDEAL +IDYLL +INEPT +INERT +INFER +INFIX +INNER +INTRO +IRATE +IVORY +JELLY +JERKY +JETON +JEWEL +JOKER +JOULE +JOUST +JUMBO +JUMPY +KABOB +KAPUT +KARMA +KAYAK +KNEEL +KNOCK +KNOLL +KNOWN +KOALA +KUDZU +LABEL +LABOR +LANAI +LARGE +LARVA +LATER +LATHE +LAUGH +LEACH +LEARN +LEASH +LEAST +LEAVE +LEECH +LEMMA +LEVEL +LEVER +LIEGE +LIGHT +LIKEN +LILAC +LINGO +LLAMA +LOCAL +LOCUS +LOGIC +LOOPY +LUCID +LURCH +LYRIC +MACRO +MAJOR +MANNA +MASON +MATCH +MEANT +MEATY +MEDIA +MELON +MERGE +METAL +METER +MICRO +MIGHT +MIMIC +MINCE +MIRTH +MISTY +MODEL +MODEM +MOMMY +MONEY +MONTH +MORAL +MOUND +MOUNT +MOUTH +MUMMY +MUMPS +MUSIC +MUSTY +NAIVE +NASAL +NAVEL +NEEDY +NERDY +NEVER +NIGHT +NINNY +NOISE +NORTH +NOSEY +NUDGE +NURSE +NYLON +NYMPH +OCCUR +OCEAN +OCTAL +OCTET +ODDLY +OFFER +OFTEN +OLDEN +OLDER +ONION +OPERA +OPIUM +ORBIT +ORDER +ORGAN +OTHER +OVERT +OXIDE +OZONE +PAINT +PANDA +PANEL +PANKO +PAPER +PARER +PARTY +PEACE +PEARL +PECAN +PENNY +PERCH +PESKY +PETAL +PETTY +PHASE +PIANO +PIECE +PIETY +PILAF +PIPER +PIQUE +PITCH +PIXEL +PLACE +PLAIN +PLAIT +PLANE +PLANT +PLIED +PLIER +PLUMB +POACH +POINT +POISE +POKER +POLKA +POSER +POSSE +POUCH +POUND +POWER +PRESS +PRIDE +PRINT +PROBE +PROSE +PROVE +PROWL +PSALM +PULSE +PUNCH +PUPIL +PUREE +PURGE +PURSE +QUACK +QUAIL +QUAKE +QUALM +QUARK +QUART +QUEEN +QUEER +QUELL +QUERY +QUEST +QUEUE +QUICK +QUIET +QUILL +QUILT +QUIRK +QUITE +QUOTA +RABID +RACER +RADAR +RADIO +RAISE +RANGE +RAZOR +REACH +REACT +READY +REALM +RECAP +REIGN +RELAX +RELAY +REMIX +REPEL +REPLY +RESET +RETRO +RETRY +REVEL +RHYME +RIGHT +RIGID +RIPER +RISER +RIVER +RONDO +ROUND +ROWDY +ROYAL +RUDER +SABLE +SALLY +SATIN +SAUCE +SAUCY +SAUNA +SAVOR +SCALA +SCALE +SCANT +SCARE +SCOOT +SCORE +SCORN +SCOUR +SENSE +SERVE +SERVO +SETUP +SEVEN +SEVER +SEWER +SHALL +SHAPE +SHARE +SHARK +SHARP +SHAVE +SHEAR +SHEEP +SHEET +SHELL +SHIED +SHIFT +SHINE +SHINY +SHIRT +SHOAL +SHOOK +SHORE +SHORT +SHOUT +SHOWN +SHREW +SHUSH +SHYLY +SIEGE +SIGHT +SILKY +SINCE +SIXTH +SKILL +SKIMP +SKUNK +SLACK +SLAIN +SLASH +SLEEK +SLEEP +SLEPT +SLIME +SLIMY +SLURP +SMACK +SMALL +SMELL +SMILE +SMIRK +SMITE +SMOKE +SMOOT +SNARE +SNARL +SNEAK +SNEER +SNOOP +SNOUT +SNOWY +SOLID +SOLVE +SONAR +SONIC +SOUND +SOUTH +SPACE +SPARE +SPARK +SPEAK +SPECK +SPEED +SPELL +SPEND +SPICY +SPOKE +SPREE +SQUAD +STAGE +STAKE +STAND +START +STASH +STATE +STEAM +STEEL +STEIN +STENT +STICK +STILL +STILT +STINT +STONE +STONY +STOOD +STOOL +STORE +STORK +STORY +STOUT +STOVE +STRIP +STRUT +STUCK +STUDY +SUAVE +SUGAR +SWAMP +SWARM +SWELL +SWIFT +SWORE +SWUNG +SYRUP +SYSOP +TABLE +TABOO +TACKY +TEACH +TEETH +TENOR +TENTH +TERSE +TESLA +TESTY +THANK +THEIR +THERE +THESE +THICK +THIEF +THIGH +THING +THINK +THIRD +THOSE +THREE +THROW +TIBIA +TIGER +TITAN +TITHE +TODAY +TONIC +TOOTH +TOPAZ +TOPIC +TORCH +TORSO +TOTAL +TOUCH +TOWER +TOXIC +TRACK +TRACT +TRADE +TRAIL +TRAIN +TRAIT +TREAD +TREND +TRIAC +TROLL +TROOP +TRUCK +TRUNK +TRUST +TUBER +TUNIC +TWANG +TWICE +TWIST +TYING +UNDER +UNITY +UNSET +UNTIL +USUAL +VALID +VALUE +VAPOR +VENAL +VERSO +VIDEO +VIGOR +VIOLA +VIRUS +VISIT +VISTA +VITAL +VIVID +VOCAL +VOICE +VOILA +VOLTS +VOUCH +VOWEL +VYING +WACKY +WAIVE +WASTE +WATCH +WATER +WATTS +WAXEN +WELCH +WHEAT +WHEEL +WHERE +WHICH +WHIFF +WHILE +WHITE +WHOLE +WHOSE +WIDEN +WIDTH +WIELD +WINCE +WISPY +WITCH +WITTY +WOKEN +WOMAN +WONKY +WOOZY +WORLD +WORSE +WOULD +WREAK +WRIST +WRITE +WRONG +WROTE +XENON +YACHT +YEARN +YEAST +YIELD +YOUNG +YOUTH +ZEBRA +ZESTY +ZONED diff --git a/words_0.bin b/words_0.bin new file mode 100644 index 0000000000000000000000000000000000000000..bd0c1c2e95a32d877c72e8678a114756607f2adc GIT binary patch literal 1656 zcmWNQ?Qa_Q0f6CnDfYnvILuenN!VuuQVqk-xjrY&6iq+w@P(#ufP9}j&x zNxnw?z(Hb7!&dHatI%qd4x2K~YAerp3Y=QWbx%Tyjm0@>V^#g)$X&9R50+m9^QZYw zcpg2^-60(+QR({b-GIe=cpCi3a?V$$Bz7G$ZELFwd;U-s#BGzru1IKMy*c-Eq;?hC zOREoV1-W)#^;{Akbr+mIrcDQ2j}li;eqJnkQrDD(?(+5JA^# zR*tdcLgCuElyl2q*q==BYp)Q=c0XuG$SJjHCsOHbd22*+XX$wwz(3E=5$|tW6~h+? z2_8<=sNn>>0g;E{<;N8FvS{fFAps1$YX=dao5eU(xZ*?(ObT-RrnpW>TW(dmnDay@ zox!SCcyOluQc8CJIP_vXgqZ4?L#xFV$h$C(DUbyp=awj3FxxTGk&V4rS#0%}8+2;n zL(x#HB6Wa4_ytCKW!k~7{ZIS*=etV@^`2wpeP~zI?1QUB3N1~}LABX1`N7Zp$5=j& z!O3?xR9#~)i87$AA>SR*SL!p7OWVAq&4^Z@c+8?Z`!+6@<90kK9Bjlzk2yO}fQkNC zTravzM@XsSyu(Hkstfdtx7ZWt^$iV)X3Fpw@C24=DE4TqGyfJR1v4Fq{i`-f74V-H z#Z7GQFbv-!QdYAPz_?B1v=C$(L&bmnMU)KR7(OrdLMUb`&S|(xjXJY}X$bwZj9W+i zq})lUI%nVHQ{)t{>kgN=b)Yn&tDg8$KLi@)#ng46AgAM>?kD!y6F?e^A}UZX3a$$R zT#qjwc8k-4WVfZqI&N7vsD-zh+YomWhU1~m?XU7F8vVc~@rN^pk9UaA4iJg;M626C znW~xph$)mn_}!9U#Q4;iI$P<&B#UXDQBTVEnz z3_Hr?M}6Er;M{@*S9P;pbR$}w^YuD1)Ow_0^@{7^qth(VfqO24#rQGns8MdgmcncM zadBfP^QSEPtRLLY#72KpbC>w3!xzauF3qowe+ms77x2>B4`!ud&d*Y811oCevT~V$ zkaOwruY%AyUw*kLZp8CvzrMGyDIODCB0CU@Ua`MwVdF~|K=I1odZI_^Ed4Obrb|b| zH=h{)#?A&iX<@0ro(djmJF07i~&K(Vze7|Po=tRyZ~ zPwsHmLD5)aADQ5eTz>wc=uoSJUF@`-PGl%XvTggC+hKT?z!|kibN|US^#>;r^Q!!& zcj;`!&>VT9aS zn6!>V!%)i65}$>N7vSFJAmrVT*%6D?!r=wlw8!YQN7|t7c8N9Y+WuK;;wxnrl0$gQ z@yMN%ab~)YwfpoMdD-|K{Lm}veBXC!1HCr}o?RZAy><*lIt(Kj5Jygl>+FOH{(%4; zdFR3pw#J(-0)H)BczM646@pJp7PLkY-yPUB+>}h?g6=MX&-UXRP}$9!AH51CWZIjl zHr`0#*`_tvoC`Kb`zqTOjd84Eedj4shY>k70l)_2OOz@BHs{Vz$O?r>0{}TqsFjCw z?2~|h9xJw^tL>0zcl2Ok^5Q0(=8rUjxvL4GE5BUV=MkZssaHoMjj1gC%GWFwy5ntC zby`chG^2F;Z`j_Oh_0ryZ>Mtu6(K)+vqOw|4PShZO83t*z+Iz4Lagl-J%*j2a2Y>n z#q)uywe_%=ki@k7pdvRhY!8u}3*srl>pTJfzLmqXJ93xKgOME>JRUkRNK5v3zU#Fm XY>4x8ZF%CNiw6IZ*aQzwMr!{Dx?`Z( literal 0 HcmV?d00001 diff --git a/words_1.bin b/words_1.bin new file mode 100644 index 0000000000000000000000000000000000000000..bfad14e768e9fa31341374e0885862eab06fb44d GIT binary patch literal 942 zcmWO3&2QRf0Dy5Y%aj^u!9jxTWc&3;Up~?dJGDcSn`bu`Ll9iSp_{DPlOws>A-!+} zhpE!C48I_4I|5-Ga@Zx8*w@i*>Xap<(zI)({s+12xZI!9?dL`eA7E2M$rp6)KD^D#rSf^9nGy zKD7Kbvx=nMb)0&IQ*L?RlzVG( z;PT@(5$W{PR()?t)HaBSR@OU2O%^6|mKxwhQ%dBh=!Km)WkiJ!6uONLeH@H0!1$PK zjH&H+J9Jap!k}mK9`m{}&#cF|a0I+3sYE*4?ht#O6s-{CRZ$)6MCa_JPp;gTdA6$q zf8b#yd5nEk)TpQl!mG`dzpWvIV|nK@OGamf##|WxA+AJPb&aZ&$mdJ2_>uTDD@+0J z<4(h()n8kbnKk3kPXKSmZ7Z;M21AB0P734&OS#4U>(naB>>}{Klh38$SZ60cr&eOd z^BC_ROM968(4lJsa2Xe?AL<)@Q@26y1M{T=!@PXk6nf`*YzB~vlR8n%f^fu?+JOGczoVZj@{P`IzoU&) z%Rez6v@_3;HP%|Iah&KMs5Q26&Wq`KDaLPMWmU--$k|LnPry^B*2LyFW*}tDs>TJ^ zQeCt6{}YA^-&N#pQyA;k_!rjGh}B0_)aDy!#O?_f(LwN5Qft=KhQUlgX&8>6r&aDp z`zP?tBjDwo9U1;UG7>+~2Es96sCR_%x9U|~s>Tn4`Qg+ClS@Zc)b9}<(S;$C6~B2w z%|R%@;4ewha6&GmU6Y=XpC^UMx%35Aj%dQ7Z@xH9i3{0}*=Y+-E|}E9tQ}Dm#!!cx w$MB^XPL2-5IE67dZL8Cc6)G)K5vxhg$2T9eVJK&EcTyY4z2q)6C!US|2j#>oG5`Po literal 0 HcmV?d00001 diff --git a/worple.asm b/worple.asm new file mode 100644 index 0000000..95d705c --- /dev/null +++ b/worple.asm @@ -0,0 +1,404 @@ +;----------------------------------------------------------------------------- +; +; "Worple" -- A Wordle-Style Game for the Apple I +; +; Jeff Jetton (inspired by a Javascript game by Josh Wardle) +; Feb/Mar 2022 +; +; Written for the dasm assembler, but should work with tweaks for others +; +;----------------------------------------------------------------------------- + + processor 6502 + +; Constants ----------------------------------------------------------------- + +KBD equ $D010 ; Location of input character from keyboard +KBDCR equ $D011 ; Keyboard control: Indicator that a new input + ; character is ready +ECHO equ $FFEF ; WozMon routine to display register A char +WOZMON equ $FF1F ; Entry point back to WozMonitor +NULL equ $00 ; String terminator +CR equ $0D ; Carriage return ASCII value +ESC equ $1B ; Escape key ASCII value +BACKSP equ '_ ; Yup. This is what the backspace key generates. +MAXGUES equ '6 ; Guesses are tracked as ASCII numbers, not ints! +BUFFER equ $0200 ; Text buffer for user input + + + +; Zero-page variables ------------------------------------------------------- + + seg.u VARS + org $0000 + +APACK ds 4 ; Workspace for packed version of answer +HINTWK ds 5 ; Workspace for building hint string--starts as copy of ANSWER +RAND ds 2 ; Pointer to a word in the list, constantly cycled in the + ; key-polling routine to "randomly" pick one each game +COUNTER ds 1 ; Zero-page counter to use when X & Y are occupied in EVALUATE +TXTPTR ds 2 ; Two-byte pointer to char in a text string. Used by PRINT + + + +; Main program -------------------------------------------------------------- + + seg CODE + org $0300 + + ; Init the program + cli ; No interrupts (just to be safe) + cld ; BCD mode off + jsr INITRND ; Set RAND pointer to beginning of word list + + + ; Show welcome message and ask if user wants instructions + jsr PRINT + dc CR + dc "WORPLE!" + dc CR + dc CR + dc "INSTRUCTIONS (Y/N)? " + dc NULL + jsr GETLINE ; Ask user for a string in input text + lda BUFFER ; Put first character of that string in A + cmp #'Y ; Is it Y? + beq INSTR ; Yes, show instructions + jmp NEWGAME ; Too far for a branch :-( + +INSTR jsr PRINT + dc "YOU HAVE SIX TURNS TO GUESS MY 5-LETTER" + dc CR + dc "WORD. I'LL GIVE YOU HINTS AFTER EACH:" + dc CR + dc CR + dc " * = LETTER IN CORRECT PLACE" + dc CR + dc " ? = RIGHT LETTER, WRONG PLACE" + dc CR + dc " - = NOT IN WORD" + dc CR + dc NULL + + +NEWGAME jsr PRINT + dc CR + dc NULL + lda #'0 ; Init GNUM (guess number) to ASCII "0" + sta GNUM ; We store this directly in the prompt text +; jsr INITRND ; Uncomment to debug (always pick 1st word) + jsr UNPACK ; Unpack into ANSWER whatever RAND now points to + + +NXTTURN inc GNUM ; Next guess number +PROMPT jsr PRINT ; Display prompt... + dc "GUESS #" +GNUM dc 'N ; Current guess # is embedded here + dc ": " + dc NULL + jsr GETLINE ; Get player guess + + cpx #5 ; User typed exactly five chars + CR? + beq EVALUAT ; Yes + cpx #0 ; No chars? + beq PROMPT ; Yes, just redo prompt without err msg + jsr PRINT ; Display error message amd try again + dc " ENTER 5 LETTERS" + dc CR + dc NULL + jmp PROMPT + + +EVALUAT SUBROUTINE ; Build hint string. The workspace keeps track + ; of which letters in the ANSWER we've matched + ; to already, in some way or another. + lda #0 + sta COUNTER ; Track number of matches in COUNTER + ldx #4 +.exalp lda ANSWER,X + cmp BUFFER,X ; Exact match to guess at this position? + beq .match ; Yes + sta HINTWK,X ; Store the answer letter in HINTWK workspace + lda #'- ; for possible inexact matching later + sta HINT,X ; Store "-" in HINT for now + bne .nxtltr ; Always taken +.match lda #'* ; Put "*" in both HINT (for display) and HINTWK + sta HINT,X ; (so the letter is out of the running for + sta HINTWK,X ; the inexact match check below) + inc COUNTER +.nxtltr dex ; Loop backwards for exact matches + bpl .exalp + + ldx #0 ; Now check (looping forward) for inexact matches +.inxlp lda HINTWK,X + cmp #'* ; Have we exact-matched this letter already? + beq .nextx ; Yes, move on to next guessed letter + lda BUFFER,X ; A holds guessed letter + ldy #0 +.chkltr cmp HINTWK,Y ; Does guessed letter match answer letter at Y? + beq .inxmch ; Yes, it's an inexact match + iny + cpy #5 + bne .chkltr + beq .nextx +.inxmch lda #'? + sta HINT,X ; Put "?" at the guessed letter's position in HINT + sta HINTWK,Y ; and at the tested letter's position in HINTWK, so + ; it won't get re-matched by a later guessed letter +.nextx inx + cpx #5 + bne .inxlp + + ; Display the hint string + jsr PRINT + dc " " +HINT dc "-----" ; This gets overwritten by hint string at runtime + dc CR + dc NULL + + ; Was that a winning guess? (i.e., did we get five matches?) + lda #5 + cmp COUNTER + beq WINNER + + ; Are we done yet? + lda GNUM ; Check current guess number + cmp #MAXGUES ; Was that the last turn? + beq LOSE ; Yup + jmp NXTTURN + +LOSE jsr PRINT + dc "SORRY, THE WORD WAS " + dc '" +ANSWER dc "XXXXX" ; Overwritten by answer text at runtime + dc '" + dc NULL + jmp REPLAY + +WINNER lda GNUM ; We won! Set up a response string to print... + and #%111 ; Convert ASCII GNUM "1" to "6" to values 1 to 6 + asl ; Mult. by two to yield an offset from 2 to 12 + tax ; Move offset to X + lda [PTRTBL-2],X ; Copy over LSB of response string + sta TXTPTR + lda [PTRTBL-1],X ; ...and the MSB + sta TXTPTR+1 + jsr PRPTR ; Call print subroutine that assumes TXTPTR is set + lda #'! ; Saves one byte vs. putting the ! in each string + jsr ECHO + +REPLAY jsr PRINT + dc CR + dc CR + dc "PLAY AGAIN (Y/N)? " + dc NULL + jsr GETLINE + lda BUFFER ; First character of response + cmp #'Y ; Is it Y? + bne QUIT ; No + jmp NEWGAME +QUIT jmp WOZMON ; Exit to monitor + + + + + +; Subroutines --------------------------------------------------------------- + + +UNPACK SUBROUTINE ; Unpack the word currently pointed to by RAND + + ldy #2 ; First copy the three bytes of the packed answer into + ; the last three bytes of four-byte workspace APACK +.cpylp lda (RAND),Y + sta [APACK+1],Y + dey + bpl .cpylp ; Loop if not done copying + + lda RAND ; Which part of the word list is RAND on (0 or 1)? + cmp #WORDS_1 ; taking into account the carry flag from the cmp step + lda #0 ; Carry flag winds up equal to what bit 25 should be + adc #0 ; Put carry flag in A + sta APACK ; 1 if we're into "1" list, 0 if not + + ldy #6 ; Shift the 25 bits of the packed word to the leftmost +.shftlp jsr ROTWKSP ; end of the four-byte (32-bit) workspace + dey + bpl .shftlp + + iny ; Bump Y to zero to track ANSWER byte offset +.nxtltr lda #5 ; Each letter is encoded into five bits + sta COUNTER ; which we'll count using COUNTER +.nxtbit jsr ROTWKSP ; Rotate leftmost workspace bit into carry + rol ; Rotate that carry into A + dec COUNTER + bne .nxtbit + clc ; Letter is ready. Convert to ASCII char. + adc #$A1 ; The 5 we put in A at .nxtltr was never cleared. + ; So we can't just add 65 to convert 0-25 to ASCII + ; 65-90. The shifted 101 means the letters are now + ; encoded as 10100000-10111001 ($A0-$B9), so we + ; add $A1. Not clearing A saves two bytes :-) + sta ANSWER,Y ; Store freshly-unpacked letter in the ANSWER string + iny + cpy #5 ; Have we done all five letters? + bmi .nxtltr ; No, do next letter... + rts + + + +ROTWKSP SUBROUTINE ; Rotates all 32 bits of APACK to the left, into carry + ; Used by UNPACK above. Destroys X. + ldx #3 ; Loop uses 4 fewer bytes than unrolled version +.shflp ROL APACK,X + dex + bpl .shflp + rts + + + +INITRND lda #WORDS_0 + sta RAND + 1 + rts + + + +; Input handling. Similar to WozMon's GETLINE, but doesn't do a CR first +; and also cycles through RAND offsets while polling for a key press. +; Ignores non-alpha keys except for backspace, escape, and return. +; Treats backspace like an escape (cancels current input line), so the hint +; string will still line up with the guess correctly. + +GETLINE SUBROUTINE ; Get user input and cycle word pointer while polling + ldx #0 ; Register X is our current buffer offset + +.getkey clc ; Move RAND pointer up by three bytes + lda RAND + adc #3 + sta RAND + lda RAND+1 + adc #0 + sta RAND+1 + lda RAND ; Did we move past the end of the word list? + cmp #WRDEND + bcc .chkpia ; Carry clear = had to borrow, so not past end yet + jsr INITRND ; Otherwise, set back at beginning of list + +.chkpia lda KBDCR ; Check PIA for keyboard input + bpl .getkey ; Loop if A is "positive" (bit 7 low... no key ready) + lda KBD ; Get the keyboard character + and #%01111111 ; Clear bit 7, which is always set for some reason + + cmp #'[ ; Did they type something greater than Z? + bcs .notaz ; Yes -- so not A-Z, check for other commands + cmp #'A ; Less than A? + bcc .notaz ; Yes + + sta BUFFER,X ; Store letter in buffer + jsr ECHO ; display it + inx ; bump up buffer pointer + bmi .reprmt ; If we overflowed the buffer, reprompt + ; (Otherwise this will fall through to the bne .getkey) + +.notaz cmp #CR ; Return/Enter? + beq .enter ; Yes, echo it and return without zeroing X + cmp #BACKSP ; Did they hit a backspace? + beq .reprmt ; Yes, reprompt + cmp #ESC ; What about Escape? + bne .getkey ; Nope. Ignore this key and get next one +.reprmt ldx #0 ; Set X back to zero and return (causing a re-prompt) +.enter lda #CR + jmp ECHO + +; End of input line handler + + + +; Print routines: Use PRINT to print text immediately after JSR PRINT call +; (Immediate mode). PRPTR is, in turn, called by PRINT. +; PRPTR assumes TXTPTR is already correctly set up. Call it +; directly when setting up TXTPTR in some other way. Note +; that PRPTR starts with an INC, so set TXTPTR to one less +; than the address of the string you want to print. + +PRINT SUBROUTINE ; Prints any null-terminated text following its call + pla ; JSR stores the return address minus one on the stack + sta TXTPTR ; Pop it back off and put it in our text pointer + pla ; (Little end was last in!) + sta TXTPTR+1 + jsr PRPTR ; Call print routine now that TXTPTR is set up + lda TXTPTR+1 ; Push current pointer onto the stack (big end first) + pha ; This will be on the NULL, i.e. address-1 of the + lda TXTPTR ; next operation after the end of the string, + pha ; which is what RTS expects to see + rts + +PRPTR SUBROUTINE ; Prints null-terminated string starting from TXTPTR+1 + ldx #0 ; No non-indexed indirect mode, so just keep X at zero +.nextch inc TXTPTR ; Bump up the pointer one byte + bne .readch ; If we didn't wrap, read next character + inc TXTPTR+1 ; We did wrap, so bump up the most-sig byte too +.readch lda (TXTPTR,X) + beq .done ; If we're on a NULL, stop printing + jsr ECHO ; Otherwise, display the character + jmp .nextch +.done rts + + + +; Stored data -------------------------------------------------------------- + + +PTRTBL ; Pointer table for the "winner" responses below + + .word TXT_W1-1 ; PRPTR routine assumes we start + .word TXT_W2-1 ; by pointing to the address + .word TXT_W3-1 ; just before the string + .word TXT_W4-1 ; we really want + .word TXT_W5-1 + .word TXT_W6-1 + +; The responses themselves, depending on guess # + +TXT_W1 dc "LUCKY" + dc NULL +TXT_W2 dc "AMAZING" + dc NULL +TXT_W3 dc "WOO-HOO" + dc NULL +TXT_W4 dc "WELL DONE" + dc NULL +TXT_W5 dc "NOT BAD" + dc NULL +TXT_W6 dc "PHEW" + dc NULL + + + +; **** Word lists ********************************************************** + +; Letters are coded into five-bit chunks, so 25 bits for a five-letter word. +; Ex: A = 0 (00000), P = 15 (01111), Q = 16 (10000), and Z = 25 (11001) +; To fit into three bytes (24 bits), we don't store the leftmost bit of the +; first letter. Instead it's inferred and reconstructed based on which section +; of the alphabetical list of words we're in: + +; Words starting with A-P, where the unstored leftmost bit should be zero: +WORDS_0 INCBIN "words_0.bin" + +; Words starting with Q-Z, where unstored leftmost bit should be one: +WORDS_1 INCBIN "words_1.bin" + +WRDEND ; Symbol to let us know we've reached the end of the list + + + + \ No newline at end of file diff --git a/worple.bin b/worple.bin new file mode 100644 index 0000000000000000000000000000000000000000..8e58b9ef43cc054020dc8c6f017c0c943d40256e GIT binary patch literal 3329 zcmZ8iVQ?B}dR`V##KOjatO~2?bYVe&EEGwstd(px(RtYgyhaF?3SZNf3#)-xnX5+W zjJeF+6p-Z099Ff9F138qq=1k*QtKN<_$IJ(p89;`6j{arIhW{e(wQh#VyEr&7|E_w z_eZ+Q-Q16UKX!NKectDLpZ9&fZvkm=8)=s#-;={5Lq0F<(8I9H<7a$)0TDkSMd|Gwu zALP?8G9zEsBft4dOod^wO&5_tYEYE_|0h;Gni&1ZUuD2|6xSud8|uSF#m4X=^rdPU zcm3-% zx<$n+(rLvaBoaU(-B%*rF-|Hv>4v7N-npT!TK{I_&sO1$K~C`&0E$&U>QZgMb!g)+ z>#~hMto}<5Scd7}d=;HmMZZ?E2s;;5PLcTwRTcaK&Z_DSViG+o5B-z;9eGLqGx?_c zft(JUJAV-vyfFApmxlsIhK6j;p&?+zA$p4#@;HDa1AJqU0K87e2=IEh6wSD!rF*Y; z!IqtU$D8nzL}4_;u40XMB!w&YJDo{_(S*r+JSkDiRFfa}7LQ~1qqW%=9kBy_;Yo&n z7fQFvsbCd9F+1dSng@Dp2Q0z|`t9~UaE z`qvoJKN@FsMd@R04EW4rrGXgy5e^N`dIuCW6v_(~}W1%Z)`;*M1 zNg#SULxIG~Gi2z%Kpc3f(ON}IMxx35?cR(j>AUPBlz)(#Air}{U6$Y24kVO;qPr)c zTmz{cdhV_}_GlhfICWhZ@v@fi64G%jhH}SRb=!?)UHuHdN@i}GYLcsy=HYOwqhR4? zA4`6m2|=H9KXf^DjivaG8b-QO2o?*bskAL-%D8b(rNyY`r2k>=YSoZm_eHM!ke3$= zx)Onb_*0Cs2)^dT%Ku1S{p{XMpf=T<`wn=I2eydgWCYEIC&1!3O?~&-&N`N2FlFdl zF|@YAii+aI0YJUnD_bg!dBtug;DaEqCdy_NZ%Pi~LY~p$4sLsm;mxY#Ws(>%_!$|G zH16uMORXN(8>k^fldH<^fhX4h3XSKL{e-z|&IkJ6?LWMHA(nB(4>RmPN^R=!9^)T(k97Q3n2PdkF^-Sc1mJ)aTH_0RJyAc{54PXMu{qWiI$xCEj<5O8&G zCnX#PYSLDH_(R=3UXt$2#8!#&`tX98nK6LGy6S3VfGF$sU2km#w%9#_YMAFy&iycr zJSB+%W^M=KFLh85+@yBFtMXdvjGbX>jNiJ^dGOT&H zaEB<57FBIhev*(9Q-~aHxXv~g z-6l>G!HZiAzt$apBguYjAkN4AeHV+SY+`ihVMrf~CKg<8fjtdZ@a)R3RpoV6YTV7P zWAlKJFN-$dCJ`C_QwR7Yk$-fRUt>~_zcF>?CSNCGfuzwnd`x=+W|^6%MA;(z+&sJ+ zP5Q14v(fBs&)EkJ%j~%0Fv`uOgQ?3hJo6`W!JPYU_xxo#WfCSW)l^+yxD9n)d9x+T zHAQO$Zzpk>_LaNAZ#rs@DjO^LQw${ru|8ZJLV43uTPxq9-R#;SD(=DEQYv z|H?58O=#BC6rL&Ud1C4gzM;sz+o(Jg@}K>XZ>|+O6znCfFA#SJGnzZL${kucPU68@ z6EOYYlKb1Oq~B6Y+_cO*?vMvcHC?hYqT3E;$4s@Q){e43PqA{hsS_e21hEF% z0@vC>g#z^S)1GS}VKL3xpIxl1M2g3^oPF~yGgwfQ~v&v{<7vNNi3W(;O zUzMeF926`S`n>C-N#8TKSj_3MR0~oG9L${@zCuy_IwWavC9ew2_wK1w5hrzAqAQ+{feYsKA+e(P^pXOr znlWO8xkMO(e3XOGOaaYIBEuPd|AW&8e_tATMJgTS>}ko8DJxzqBC=gH2FlGQK^vX{U+$pvk`O9Xy5#r6X(I%-M;u|CUpP6u zWY4T)a$v+u=?82`poW(JPTSpL&!J`xiVTMhPFmoRa&ChiA@Qv_ahxAi|TFf(B;6;cF`JNa;i63;TE zo$`?$)9{KJ(|B!Cb1&FK62}=n(gjLQr^yMtiqf%NezgD=2F)8j-ko+ z$Z6dAi#bO1w+4oXKzrI9vuCEsin5PZMoUZ49E)a)5t1OU@(|#*r;RPxw_nmPp@Q97 z+Uz4JNQJ-h88ucGZyr_?wq^@Pbvfjj&<_|HGToLm xnr%`Dne$;vJ!pgsESZai1!4ptFdA;-pe{wwD&WU;`+Y$kPrzsNOIqjL{{b3$w6p*K literal 0 HcmV?d00001 diff --git a/worple.js b/worple.js new file mode 100644 index 0000000..f77e1b3 --- /dev/null +++ b/worple.js @@ -0,0 +1,421 @@ +tapes['Worple'] = { + script: 'C100R\n0300.0FFER\n0300R\n', + tracks: [[ + 0x58, 0xD8, 0x20, 0x2A, 0x05, 0x20, 0x7D, 0x05, + 0x0D, 0x57, 0x4F, 0x52, 0x50, 0x4C, 0x45, 0x21, + 0x0D, 0x0D, 0x49, 0x4E, 0x53, 0x54, 0x52, 0x55, + 0x43, 0x54, 0x49, 0x4F, 0x4E, 0x53, 0x20, 0x28, + 0x59, 0x2F, 0x4E, 0x29, 0x3F, 0x20, 0x00, 0x20, + 0x33, 0x05, 0xAD, 0x00, 0x02, 0xC9, 0x59, 0xF0, + 0x03, 0x4C, 0xD8, 0x03, 0x20, 0x7D, 0x05, 0x59, + 0x4F, 0x55, 0x20, 0x48, 0x41, 0x56, 0x45, 0x20, + 0x53, 0x49, 0x58, 0x20, 0x54, 0x55, 0x52, 0x4E, + 0x53, 0x20, 0x54, 0x4F, 0x20, 0x47, 0x55, 0x45, + 0x53, 0x53, 0x20, 0x4D, 0x59, 0x20, 0x35, 0x2D, + 0x4C, 0x45, 0x54, 0x54, 0x45, 0x52, 0x0D, 0x57, + 0x4F, 0x52, 0x44, 0x2E, 0x20, 0x20, 0x49, 0x27, + 0x4C, 0x4C, 0x20, 0x47, 0x49, 0x56, 0x45, 0x20, + 0x59, 0x4F, 0x55, 0x20, 0x48, 0x49, 0x4E, 0x54, + 0x53, 0x20, 0x41, 0x46, 0x54, 0x45, 0x52, 0x20, + 0x45, 0x41, 0x43, 0x48, 0x3A, 0x0D, 0x0D, 0x20, + 0x20, 0x2A, 0x20, 0x3D, 0x20, 0x4C, 0x45, 0x54, + 0x54, 0x45, 0x52, 0x20, 0x49, 0x4E, 0x20, 0x43, + 0x4F, 0x52, 0x52, 0x45, 0x43, 0x54, 0x20, 0x50, + 0x4C, 0x41, 0x43, 0x45, 0x0D, 0x20, 0x20, 0x3F, + 0x20, 0x3D, 0x20, 0x52, 0x49, 0x47, 0x48, 0x54, + 0x20, 0x4C, 0x45, 0x54, 0x54, 0x45, 0x52, 0x2C, + 0x20, 0x57, 0x52, 0x4F, 0x4E, 0x47, 0x20, 0x50, + 0x4C, 0x41, 0x43, 0x45, 0x0D, 0x20, 0x20, 0x2D, + 0x20, 0x3D, 0x20, 0x4E, 0x4F, 0x54, 0x20, 0x49, + 0x4E, 0x20, 0x57, 0x4F, 0x52, 0x44, 0x0D, 0x00, + 0x20, 0x7D, 0x05, 0x0D, 0x00, 0xA9, 0x30, 0x8D, + 0xF2, 0x03, 0x20, 0xE9, 0x04, 0xEE, 0xF2, 0x03, + 0x20, 0x7D, 0x05, 0x47, 0x55, 0x45, 0x53, 0x53, + 0x20, 0x23, 0x4E, 0x3A, 0x20, 0x00, 0x20, 0x33, + 0x05, 0xE0, 0x05, 0xF0, 0x1C, 0xE0, 0x00, 0xF0, + 0xE7, 0x20, 0x7D, 0x05, 0x20, 0x45, 0x4E, 0x54, + 0x45, 0x52, 0x20, 0x35, 0x20, 0x4C, 0x45, 0x54, + 0x54, 0x45, 0x52, 0x53, 0x0D, 0x00, 0x4C, 0xE8, + 0x03, 0xA9, 0x00, 0x85, 0x0B, 0xA2, 0x04, 0xBD, + 0x9E, 0x04, 0xDD, 0x00, 0x02, 0xF0, 0x09, 0x95, + 0x04, 0xA9, 0x2D, 0x9D, 0x6F, 0x04, 0xD0, 0x09, + 0xA9, 0x2A, 0x9D, 0x6F, 0x04, 0x95, 0x04, 0xE6, + 0x0B, 0xCA, 0x10, 0xE3, 0xA2, 0x00, 0xB5, 0x04, + 0xC9, 0x2A, 0xF0, 0x19, 0xBD, 0x00, 0x02, 0xA0, + 0x00, 0xD9, 0x04, 0x00, 0xF0, 0x07, 0xC8, 0xC0, + 0x05, 0xD0, 0xF6, 0xF0, 0x08, 0xA9, 0x3F, 0x9D, + 0x6F, 0x04, 0x99, 0x04, 0x00, 0xE8, 0xE0, 0x05, + 0xD0, 0xDC, 0x20, 0x7D, 0x05, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2D, + 0x2D, 0x2D, 0x2D, 0x2D, 0x0D, 0x00, 0xA9, 0x05, + 0xC5, 0x0B, 0xF0, 0x2C, 0xAD, 0xF2, 0x03, 0xC9, + 0x36, 0xF0, 0x03, 0x4C, 0xE5, 0x03, 0x20, 0x7D, + 0x05, 0x53, 0x4F, 0x52, 0x52, 0x59, 0x2C, 0x20, + 0x54, 0x48, 0x45, 0x20, 0x57, 0x4F, 0x52, 0x44, + 0x20, 0x57, 0x41, 0x53, 0x20, 0x22, 0x58, 0x58, + 0x58, 0x58, 0x58, 0x22, 0x00, 0x4C, 0xC1, 0x04, + 0xAD, 0xF2, 0x03, 0x29, 0x07, 0x0A, 0xAA, 0xBD, + 0x9E, 0x05, 0x85, 0x0C, 0xBD, 0x9F, 0x05, 0x85, + 0x0D, 0x20, 0x8D, 0x05, 0xA9, 0x21, 0x20, 0xEF, + 0xFF, 0x20, 0x7D, 0x05, 0x0D, 0x0D, 0x50, 0x4C, + 0x41, 0x59, 0x20, 0x41, 0x47, 0x41, 0x49, 0x4E, + 0x20, 0x28, 0x59, 0x2F, 0x4E, 0x29, 0x3F, 0x20, + 0x00, 0x20, 0x33, 0x05, 0xAD, 0x00, 0x02, 0xC9, + 0x59, 0xD0, 0x03, 0x4C, 0xD8, 0x03, 0x4C, 0x1F, + 0xFF, 0xA0, 0x02, 0xB1, 0x09, 0x99, 0x01, 0x00, + 0x88, 0x10, 0xF8, 0xA5, 0x09, 0xC9, 0x51, 0xA5, + 0x0A, 0xE9, 0x0C, 0xA9, 0x00, 0x69, 0x00, 0x85, + 0x00, 0xA0, 0x06, 0x20, 0x22, 0x05, 0x88, 0x10, + 0xFA, 0xC8, 0xA9, 0x05, 0x85, 0x0B, 0x20, 0x22, + 0x05, 0x2A, 0xC6, 0x0B, 0xD0, 0xF8, 0x18, 0x69, + 0xA1, 0x99, 0x9E, 0x04, 0xC8, 0xC0, 0x05, 0x30, + 0xE9, 0x60, 0xA2, 0x03, 0x36, 0x00, 0xCA, 0x10, + 0xFB, 0x60, 0xA9, 0xD9, 0x85, 0x09, 0xA9, 0x05, + 0x85, 0x0A, 0x60, 0xA2, 0x00, 0x18, 0xA5, 0x09, + 0x69, 0x03, 0x85, 0x09, 0xA5, 0x0A, 0x69, 0x00, + 0x85, 0x0A, 0xA5, 0x09, 0xC9, 0xFF, 0xA5, 0x0A, + 0xE9, 0x0F, 0x90, 0x03, 0x20, 0x2A, 0x05, 0xAD, + 0x11, 0xD0, 0x10, 0xE1, 0xAD, 0x10, 0xD0, 0x29, + 0x7F, 0xC9, 0x5B, 0xB0, 0x0D, 0xC9, 0x41, 0x90, + 0x09, 0x9D, 0x00, 0x02, 0x20, 0xEF, 0xFF, 0xE8, + 0x30, 0x0C, 0xC9, 0x0D, 0xF0, 0x0A, 0xC9, 0x5F, + 0xF0, 0x04, 0xC9, 0x1B, 0xD0, 0xBF, 0xA2, 0x00, + 0xA9, 0x0D, 0x4C, 0xEF, 0xFF, 0x68, 0x85, 0x0C, + 0x68, 0x85, 0x0D, 0x20, 0x8D, 0x05, 0xA5, 0x0D, + 0x48, 0xA5, 0x0C, 0x48, 0x60, 0xA2, 0x00, 0xE6, + 0x0C, 0xD0, 0x02, 0xE6, 0x0D, 0xA1, 0x0C, 0xF0, + 0x06, 0x20, 0xEF, 0xFF, 0x4C, 0x8F, 0x05, 0x60, + 0xAB, 0x05, 0xB1, 0x05, 0xB9, 0x05, 0xC1, 0x05, + 0xCB, 0x05, 0xD3, 0x05, 0x4C, 0x55, 0x43, 0x4B, + 0x59, 0x00, 0x41, 0x4D, 0x41, 0x5A, 0x49, 0x4E, + 0x47, 0x00, 0x57, 0x4F, 0x4F, 0x2D, 0x48, 0x4F, + 0x4F, 0x00, 0x57, 0x45, 0x4C, 0x4C, 0x20, 0x44, + 0x4F, 0x4E, 0x45, 0x00, 0x4E, 0x4F, 0x54, 0x20, + 0x42, 0x41, 0x44, 0x00, 0x50, 0x48, 0x45, 0x57, + 0x00, 0x7A, 0x31, 0x03, 0x23, 0xA0, 0x4A, 0x68, + 0xB9, 0xCC, 0x7A, 0x30, 0x0D, 0x28, 0xE1, 0xF3, + 0x45, 0x95, 0x0D, 0xF5, 0x81, 0xB3, 0x65, 0xA0, + 0x64, 0xB0, 0x34, 0x08, 0xC2, 0x01, 0xB3, 0x86, + 0xCE, 0x2E, 0x48, 0x82, 0x44, 0x54, 0x11, 0x63, + 0x46, 0xCC, 0x91, 0x46, 0x01, 0x0B, 0x04, 0x0C, + 0x83, 0xD4, 0x35, 0xB8, 0x14, 0x34, 0xCE, 0x68, + 0xD1, 0x8F, 0x40, 0x45, 0x78, 0xF7, 0x21, 0xB3, + 0xF5, 0xA0, 0x91, 0xB7, 0x0A, 0x92, 0x1A, 0x2D, + 0x58, 0xF8, 0xA1, 0xB3, 0x60, 0x53, 0x24, 0x28, + 0xA0, 0x83, 0xF7, 0x2D, 0x40, 0x20, 0x4C, 0x47, + 0x15, 0x92, 0x52, 0x15, 0xD2, 0x47, 0x08, 0xB1, + 0xD1, 0x27, 0x0C, 0x83, 0xF5, 0x81, 0x13, 0x20, + 0x45, 0xCB, 0x0B, 0x02, 0x24, 0x60, 0x4A, 0x58, + 0xDC, 0x2D, 0xCD, 0x72, 0x02, 0x23, 0x63, 0xBA, + 0x53, 0x38, 0xBA, 0xCD, 0x1A, 0x21, 0x73, 0x54, + 0x46, 0x53, 0x65, 0x80, 0x64, 0x18, 0xB8, 0x03, + 0xF4, 0x12, 0x78, 0x00, 0xE2, 0x52, 0x3B, 0x11, + 0x6B, 0xEA, 0x92, 0x33, 0x02, 0xB9, 0xD3, 0x09, + 0x20, 0x64, 0x54, 0x2E, 0x67, 0x00, 0xD3, 0x39, + 0xF5, 0xD1, 0x81, 0x1A, 0x48, 0xF8, 0x18, 0x90, + 0x03, 0x17, 0x0C, 0xC4, 0xF0, 0x34, 0x60, 0x86, + 0x92, 0x33, 0xF5, 0xA0, 0x83, 0x25, 0xBA, 0x44, + 0x32, 0x2E, 0x60, 0x55, 0x81, 0xAA, 0x07, 0x46, + 0x60, 0xF7, 0x22, 0x44, 0xF7, 0x50, 0x47, 0x65, + 0xD1, 0xCD, 0x12, 0x46, 0x67, 0x68, 0x82, 0xA4, + 0xC0, 0x35, 0xA0, 0x25, 0x82, 0x52, 0x77, 0x52, + 0x44, 0x0B, 0x16, 0x8B, 0x72, 0x46, 0x79, 0xB4, + 0x10, 0xC4, 0x05, 0xAD, 0xD8, 0x55, 0x81, 0x0B, + 0x55, 0xB8, 0x4A, 0x32, 0x55, 0x0B, 0xB2, 0x02, + 0x47, 0xE1, 0x4C, 0x93, 0xCA, 0x4A, 0x78, 0xE8, + 0x98, 0x0D, 0x09, 0x48, 0x18, 0x30, 0x34, 0x44, + 0x62, 0x12, 0x44, 0x50, 0x44, 0x03, 0x70, 0x34, + 0x78, 0x23, 0x90, 0x0F, 0x1A, 0x18, 0xD8, 0x08, + 0xC4, 0x18, 0xF0, 0x3C, 0x91, 0xB0, 0x46, 0xA0, + 0xC0, 0x25, 0xD1, 0x01, 0x8C, 0x83, 0x27, 0x51, + 0x63, 0x1A, 0x45, 0xB3, 0x28, 0x90, 0x8F, 0xF4, + 0x01, 0xAE, 0xA0, 0x60, 0x0A, 0xDC, 0x31, 0xE7, + 0x49, 0x48, 0x18, 0x08, 0xB9, 0x80, 0xE1, 0x10, + 0x0D, 0x20, 0x30, 0x8B, 0x20, 0x34, 0x78, 0x58, + 0x92, 0x47, 0x92, 0x2D, 0x78, 0x25, 0xA0, 0x4A, + 0x38, 0x90, 0x0C, 0x12, 0x34, 0x47, 0x15, 0x82, + 0x53, 0xE7, 0xA2, 0x8C, 0xD0, 0x22, 0xA4, 0xC7, + 0x52, 0x67, 0x86, 0x94, 0x91, 0x05, 0xB8, 0xB3, + 0x18, 0xB9, 0x44, 0x34, 0x02, 0x38, 0xFA, 0x34, + 0x47, 0x28, 0xBA, 0x52, 0x15, 0x81, 0xAA, 0xF9, + 0x01, 0x6C, 0xE2, 0xCC, 0x8D, 0x55, 0xD1, 0x84, + 0x15, 0xA2, 0x79, 0x02, 0xCC, 0x91, 0x00, 0xD2, + 0x44, 0x14, 0x46, 0x67, 0x23, 0xA1, 0x63, 0x72, + 0x02, 0xB8, 0x70, 0x4C, 0x47, 0x7C, 0x0E, 0x2E, + 0xF0, 0x34, 0x8B, 0x54, 0x34, 0x0B, 0x60, 0x61, + 0x78, 0x23, 0xD1, 0xAA, 0x64, 0x46, 0x67, 0x68, + 0x80, 0x44, 0xF7, 0x00, 0x47, 0x62, 0x35, 0x04, + 0xA6, 0xB9, 0x6B, 0x50, 0x21, 0xB3, 0xF5, 0x81, + 0x0D, 0xF7, 0x58, 0x91, 0x10, 0x44, 0xC4, 0x27, + 0x0C, 0x91, 0x25, 0x82, 0x4F, 0x38, 0xBA, 0xA4, + 0x54, 0x12, 0x38, 0x45, 0x90, 0xD8, 0xB2, 0x54, + 0x91, 0x27, 0x0C, 0x82, 0x77, 0x46, 0x44, 0x57, + 0x22, 0x53, 0x54, 0x04, 0x91, 0x20, 0x08, 0xE4, + 0x18, 0xA1, 0xA6, 0x1A, 0x4E, 0x64, 0x50, 0x55, + 0xD1, 0x20, 0x44, 0x13, 0x49, 0xD0, 0x64, 0xF2, + 0x02, 0x2B, 0xB2, 0x00, 0x47, 0x23, 0x80, 0xA4, + 0x0B, 0x39, 0x44, 0x27, 0x30, 0x93, 0x52, 0x02, + 0x53, 0xB7, 0x39, 0xF8, 0x77, 0x4D, 0x78, 0xA0, + 0x45, 0x80, 0xF8, 0xA0, 0x64, 0xA7, 0x01, 0x60, + 0x4A, 0x92, 0x38, 0xE5, 0x8C, 0x91, 0xB4, 0x34, + 0xCE, 0xE1, 0x4C, 0x0B, 0x40, 0x46, 0x67, 0x10, + 0x0C, 0xC4, 0x30, 0x34, 0x78, 0xB4, 0x18, 0xF3, + 0x92, 0x45, 0x58, 0xC7, 0x31, 0x98, 0xE9, 0x9C, + 0x91, 0xA0, 0x05, 0xC1, 0x05, 0xAC, 0x98, 0x17, + 0x02, 0x23, 0x34, 0x08, 0x98, 0x72, 0x00, 0x78, + 0xA6, 0xB8, 0x4A, 0xF4, 0x10, 0x44, 0x6A, 0x02, + 0x23, 0x8A, 0xBA, 0x38, 0x10, 0x35, 0x2E, 0x47, + 0xBA, 0xF8, 0x55, 0xD1, 0x03, 0x1A, 0x21, 0x63, + 0xD4, 0x18, 0xF3, 0x38, 0xB9, 0x03, 0xE1, 0x8D, + 0x78, 0xB0, 0x44, 0xC4, 0xC7, 0x51, 0xA3, 0x27, + 0x54, 0x8D, 0x22, 0x02, 0x44, 0xC7, 0x0C, 0x8C, + 0x67, 0x3A, 0x44, 0xC4, 0x18, 0xF3, 0x49, 0x9D, + 0xD2, 0x55, 0xD2, 0x64, 0xF2, 0x44, 0x47, 0x06, + 0x98, 0x91, 0x23, 0x90, 0x4A, 0xE7, 0x92, 0x20, + 0xFA, 0x46, 0x44, 0x3A, 0x54, 0x93, 0xE1, 0x0A, + 0x91, 0x6A, 0x2C, 0x47, 0x0A, 0x0D, 0x13, 0x10, + 0x49, 0x0D, 0xB0, 0x05, 0xD1, 0x92, 0x4D, 0xCD, + 0xC2, 0x02, 0x78, 0xF2, 0x4C, 0x0B, 0x54, 0x48, + 0xF8, 0x4B, 0xBC, 0x8B, 0x67, 0x52, 0x23, 0x7C, + 0x11, 0xA0, 0x81, 0xE1, 0x6B, 0x05, 0x99, 0xCB, + 0x46, 0xA5, 0xD8, 0x18, 0xA0, 0x64, 0x27, 0x51, + 0xB3, 0xC2, 0x44, 0xC4, 0x65, 0xB8, 0x0C, 0x74, + 0x34, 0xC4, 0x4A, 0x91, 0xB3, 0xF7, 0x4A, 0x44, + 0xC7, 0x44, 0x0B, 0xB5, 0x81, 0x80, 0x1A, 0x60, + 0x91, 0x06, 0x04, 0x91, 0x57, 0x2D, 0x78, 0x28, + 0x90, 0x0A, 0x48, 0x50, 0x0B, 0x58, 0xBA, 0x67, + 0x46, 0x91, 0x98, 0x6A, 0x12, 0x53, 0x28, 0x91, + 0xE4, 0xF4, 0x3C, 0x91, 0x17, 0x3A, 0x53, 0xC2, + 0x4C, 0x91, 0x57, 0x46, 0x67, 0x22, 0x0C, 0x11, + 0x15, 0xBA, 0xCD, 0x6A, 0x20, 0x64, 0x4B, 0xCD, + 0xCB, 0x44, 0x90, 0x53, 0x10, 0x4C, 0xE4, 0xF4, + 0x5C, 0x8B, 0x06, 0xB4, 0x97, 0x70, 0x4A, 0x78, + 0x06, 0x05, 0x64, 0xEC, 0xB9, 0xA4, 0x72, 0x02, + 0x33, 0x27, 0x2D, 0xD1, 0x32, 0x04, 0x11, 0x01, + 0x8C, 0x91, 0x81, 0x90, 0x0B, 0x27, 0x02, 0x53, + 0x23, 0x82, 0x23, 0x08, 0xA2, 0x44, 0x23, 0x92, + 0x52, 0x68, 0x80, 0x64, 0x37, 0x58, 0x8B, 0x37, + 0x2D, 0x78, 0xD2, 0x44, 0x78, 0x25, 0x90, 0x0D, + 0x38, 0xD1, 0x03, 0x70, 0x09, 0x52, 0xC7, 0x51, + 0xB3, 0x72, 0x2D, 0x17, 0x15, 0x80, 0x4A, 0xB0, + 0x50, 0xC7, 0x10, 0x28, 0x91, 0xB0, 0x4C, 0xE4, + 0xF3, 0x82, 0x44, 0x03, 0x44, 0x84, 0x20, 0x05, + 0x0D, 0x06, 0x99, 0x64, 0x15, 0xB8, 0x4A, 0x25, + 0x90, 0x11, 0x67, 0x38, 0xB8, 0xD2, 0x54, 0x91, + 0xB2, 0x31, 0x80, 0x88, 0x82, 0x64, 0xD7, 0x22, + 0x44, 0x4B, 0x80, 0x53, 0x37, 0x59, 0xB8, 0x25, + 0xA1, 0x81, 0x65, 0xE1, 0xE7, 0x60, 0x21, 0x78, + 0x68, 0x81, 0xA3, 0x49, 0x9D, 0x02, 0x32, 0x06, + 0x86, 0x38, 0xA1, 0xAA, 0xDA, 0x0C, 0xC4, 0xC7, + 0x0C, 0x8B, 0x70, 0x4A, 0x64, 0xC7, 0x34, 0x98, + 0x00, 0xBA, 0xA4, 0xC4, 0x46, 0x67, 0x68, 0x90, + 0x83, 0x20, 0x04, 0x38, 0xBC, 0x45, 0x02, 0xF5, + 0x81, 0xA4, 0xE8, 0x8C, 0x91, 0xB2, 0x54, 0x8B, + 0xF4, 0x42, 0x84, 0x86, 0xB4, 0x91, 0xF0, 0x46, + 0x78, 0x55, 0x82, 0x24, 0x48, 0x51, 0x0F, 0x12, + 0x19, 0x0D, 0x64, 0x54, 0x8D, 0xFA, 0x44, 0xC4, + 0x28, 0xBA, 0xC3, 0x27, 0x51, 0xE4, 0x68, 0x82, + 0x52, 0x97, 0x51, 0x64, 0x68, 0xA1, 0xE4, 0x32, + 0x3D, 0xD3, 0x06, 0xA9, 0x64, 0x70, 0x45, 0xF8, + 0x68, 0x90, 0x8D, 0x92, 0x58, 0x8B, 0x77, 0x04, + 0x38, 0xA0, 0x3E, 0x93, 0x58, 0xA2, 0x4A, 0xCA, + 0x31, 0x98, 0x77, 0x4C, 0x8B, 0x25, 0xBA, 0x83, + 0x28, 0xD0, 0x8B, 0xF0, 0x21, 0xB3, 0xC0, 0x0A, + 0x2E, 0x86, 0x95, 0x17, 0x68, 0x90, 0x13, 0x68, + 0xD1, 0xB3, 0x50, 0x2E, 0x44, 0xF8, 0x92, 0x52, + 0xC4, 0x31, 0x02, 0x5A, 0x45, 0xD1, 0x45, 0xD0, + 0x64, 0x58, 0xB9, 0xA3, 0x68, 0xBA, 0xCB, 0x15, + 0xD0, 0xA5, 0x23, 0x81, 0x8F, 0xE5, 0x8C, 0x8D, + 0xC0, 0x4C, 0x47, 0x68, 0x80, 0xB3, 0xC4, 0x34, + 0x44, 0x30, 0x4C, 0x83, 0x72, 0x36, 0x38, 0x06, + 0xA2, 0x44, 0x58, 0xBA, 0x53, 0xB2, 0x02, 0x53, + 0xAA, 0x0F, 0x34, 0x23, 0x81, 0x11, 0xB2, 0x10, + 0x47, 0x38, 0xA0, 0xB3, 0xF2, 0x4E, 0x78, 0x10, + 0x2C, 0x91, 0x06, 0xB8, 0x64, 0xB7, 0x08, 0x0B, + 0xF8, 0xBA, 0xA4, 0xE2, 0x94, 0x91, 0x15, 0xD1, + 0xB3, 0x2C, 0x09, 0x64, 0x6A, 0x12, 0x52, 0x55, + 0x80, 0x4A, 0x58, 0xA0, 0x11, 0xC2, 0x2D, 0xCD, + 0xC2, 0x4C, 0x0B, 0x70, 0x46, 0x38, 0x58, 0xD1, + 0x13, 0x00, 0x85, 0xD3, 0x6A, 0x4A, 0x6E, 0x1A, + 0x46, 0x53, 0x28, 0xD1, 0x81, 0xB4, 0x28, 0x8D, + 0xF4, 0x2C, 0x05, 0x55, 0xB9, 0xD1, 0x18, 0x82, + 0xCD, 0x57, 0x18, 0xD8, 0x58, 0xA1, 0x6B, 0x25, + 0xD1, 0xA6, 0x1A, 0x2C, 0xC4, 0xBA, 0x44, 0x47, + 0xF2, 0x00, 0x44, 0x34, 0x38, 0x64, 0xC4, 0x4A, + 0x78, 0xCA, 0x49, 0x02, 0x01, 0x1D, 0xCE, 0x9A, + 0x31, 0xF8, 0x32, 0x50, 0x44, 0x23, 0xBA, 0x23, + 0x65, 0xA1, 0xB3, 0x1A, 0x0C, 0xC4, 0x58, 0x90, + 0x83, 0xF4, 0x4C, 0x47, 0x10, 0x49, 0x02, 0x32, + 0x02, 0x67, 0x15, 0xD0, 0x91, 0xD7, 0x48, 0x98, + 0xFA, 0x44, 0x84, 0xB4, 0x2C, 0x02, 0x28, 0xD2, + 0x53, 0x12, 0x18, 0x0D, 0x10, 0x0D, 0x78, 0x38, + 0x92, 0x52, 0x08, 0xCE, 0x58, 0x03, 0x01, 0xE4, + 0x01, 0x45, 0x03, 0x4B, 0xA1, 0x64, 0x05, 0xCC, + 0x11, 0xE6, 0xA1, 0xCD, 0x38, 0xA2, 0xA4, 0x20, + 0x18, 0x83, 0x18, 0x81, 0x0D, 0xF0, 0x35, 0x4E, + 0xF2, 0x49, 0x58, 0x6A, 0x21, 0x64, 0x12, 0x2D, + 0x04, 0x00, 0xBA, 0x93, 0x06, 0xD5, 0x0B, 0x97, + 0x28, 0x91, 0x03, 0x2D, 0xD6, 0xF8, 0xB8, 0x24, + 0x17, 0x3B, 0x24, 0xD7, 0x46, 0x67, 0x23, 0x82, + 0x33, 0xF0, 0x44, 0x91, 0x52, 0x4C, 0x0B, 0x18, + 0x80, 0x44, 0x54, 0x18, 0xF3, 0x46, 0x3A, 0x64, + 0x57, 0x08, 0x0B, 0xDA, 0x46, 0x44, 0xF8, 0xBA, + 0xCB, 0xFA, 0x2E, 0x44, 0xC0, 0x49, 0xCD, 0x20, + 0x46, 0x38, 0x1C, 0x4C, 0x92, 0xE8, 0x85, 0x13, + 0xD0, 0x48, 0x0B, 0xF2, 0x08, 0x0D, 0x23, 0xB8, + 0x4A, 0x46, 0xD5, 0xD8, 0x12, 0x00, 0x78, 0x65, + 0xBA, 0x52, 0x38, 0x90, 0x03, 0x7A, 0x46, 0x38, + 0x70, 0x22, 0x38, 0xB2, 0x02, 0xA4, 0x25, 0x81, + 0x0C, 0xB7, 0x19, 0x02, 0x55, 0xBA, 0x52, 0x28, + 0x80, 0xB3, 0xC7, 0x36, 0x67, 0x38, 0x82, 0xCD, + 0x10, 0x45, 0xCD, 0x72, 0x45, 0xCD, 0x37, 0x21, + 0xA6, 0xC2, 0x0D, 0x00, 0x06, 0x39, 0xA6, 0x10, + 0x61, 0xD4, 0x18, 0xB9, 0x0B, 0x18, 0xBA, 0x67, + 0x57, 0x44, 0x44, 0xB2, 0x02, 0x2D, 0x55, 0xA1, + 0xA6, 0x30, 0x64, 0x83, 0x25, 0x80, 0x4A, 0x18, + 0xA2, 0x4A, 0x18, 0xA0, 0x24, 0x44, 0x18, 0xF3, + 0x55, 0xD1, 0xA6, 0x97, 0x52, 0x53, 0x9A, 0x30, + 0x2E, 0x77, 0x34, 0x98, 0xF7, 0x51, 0xA3, 0xF7, + 0x48, 0x91, 0x12, 0x15, 0x13, 0x34, 0x4C, 0x47, + 0xFA, 0x3D, 0x0B, 0x68, 0x81, 0xE4, 0x00, 0x90, + 0x0C, 0x09, 0xCD, 0x02, 0x23, 0xA2, 0x2F, 0xB0, + 0x04, 0x8B, 0x18, 0x90, 0x0A, 0x58, 0xB9, 0xB3, + 0x37, 0x50, 0xC7, 0x65, 0x82, 0x52, 0x07, 0xBD, + 0x64, 0x34, 0x48, 0x4E, 0x28, 0xD0, 0xB3, 0x03, + 0x01, 0x0D, 0x68, 0xA1, 0x6B, 0xC4, 0x0A, 0x2E, + 0x3B, 0x11, 0x73, 0x57, 0x51, 0xA3, 0x68, 0x82, + 0x4F, 0x68, 0x83, 0x24, 0xA6, 0x90, 0x8B, 0x70, + 0x3D, 0xF8, 0x46, 0x39, 0x28, 0x05, 0xAD, 0xD6, + 0x23, 0xA0, 0x85, 0xF5, 0x80, 0x44, 0x25, 0xB8, + 0x4A, 0x48, 0x90, 0x53, 0xF7, 0x28, 0x91, 0x27, + 0x05, 0xCB, 0x45, 0x90, 0x53, 0x23, 0x82, 0x44, + 0xD0, 0x54, 0x8B, 0x30, 0x14, 0xB8, 0xB0, 0x4C, + 0x91, 0x55, 0xA0, 0x91, 0x68, 0xBA, 0x8F, 0xA6, + 0xBA, 0xCD, 0x34, 0x34, 0xCE, 0x18, 0xBA, 0xCD, + 0x86, 0x91, 0xF3, 0x18, 0x81, 0x03, 0x27, 0x30, + 0x2E, 0xD2, 0x10, 0x78, 0x38, 0x82, 0xCB, 0xBA, + 0x09, 0x03, 0x27, 0x34, 0x47, 0xF8, 0xBA, 0x44, + 0xCA, 0x31, 0xF2, 0x05, 0xA0, 0x8D, 0x12, 0x54, + 0x8B, 0x09, 0x1C, 0x8D, 0x34, 0x31, 0x78, 0x27, + 0x09, 0xC0, 0x27, 0x54, 0x91, 0x20, 0x52, 0x44, + 0xEB, 0xA0, 0x64, 0x55, 0x81, 0x44, 0xF2, 0x35, + 0xB8, 0x32, 0x35, 0xD1, 0x37, 0x3A, 0x67, 0x57, + 0x58, 0x8B, 0x2B, 0x01, 0x8F, 0x29, 0xD0, 0x4A, + 0x21, 0x3A, 0x91, 0x34, 0x18, 0x91, 0x68, 0xA2, + 0x53, 0x33, 0xC5, 0xD6, 0x72, 0x35, 0xCD, 0x92, + 0x06, 0x20, 0x3B, 0x20, 0x44, 0x32, 0x12, 0x67, + 0x17, 0x51, 0xA3, 0x38, 0x81, 0x0B, 0x87, 0x52, + 0x67, 0x80, 0x08, 0xF3, 0x38, 0x80, 0x4A, 0x68, + 0xBA, 0x64, 0x27, 0x52, 0x67, 0x12, 0x2C, 0x18, + 0x2B, 0x3A, 0x24, 0x64, 0x34, 0x44, 0x54, 0x19, + 0xD1, 0x26, 0x82, 0x2B, 0x29, 0xB9, 0xB8, 0x27, + 0x90, 0x4A, 0x12, 0x01, 0x6C, 0x29, 0xBA, 0xA4, + 0x20, 0x2D, 0x78, 0x0A, 0x01, 0x44, 0x23, 0x90, + 0x93, 0x46, 0xC8, 0x93, 0x0A, 0x01, 0x6C, 0x63, + 0xB9, 0x64, 0x67, 0x28, 0x8D, 0x26, 0xBA, 0xD8, + 0x82, 0x02, 0x53, 0x26, 0x11, 0x6B, 0x26, 0x22, + 0x64, 0x0A, 0x01, 0x0B, 0x54, 0x49, 0x13, 0x2B, + 0x02, 0x2C, 0x67, 0x35, 0x58, 0x97, 0x34, 0x83, + 0x0A, 0x3A, 0x60, 0x23, 0xA1, 0xA4, 0x25, 0x91, + 0xF3, 0x23, 0xA2, 0x33, 0x49, 0x50, 0x0B, 0x29, + 0x80, 0xC4, 0x0A, 0x10, 0x91, 0x29, 0x81, 0x44, + 0x25, 0x81, 0x0D, 0x24, 0x18, 0xF3, 0x64, 0x4E, + 0x78, 0x64, 0x4C, 0x47, 0x33, 0xBA, 0x44, 0x29, + 0xB9, 0xC3, 0x10, 0x0D, 0x0E, 0x63, 0x90, 0x13, + 0x60, 0x4C, 0x91, 0x37, 0x3C, 0x19, 0x0A, 0x21, + 0x73, 0x0A, 0x21, 0x6B, 0x32, 0x49, 0x60, 0x38, + 0x81, 0x13, 0x38, 0xB9, 0x6B, 0x27, 0xA0, 0x58, + 0x12, 0x00, 0x78, 0x84, 0x11, 0x63, 0x50, 0x3D, + 0xD1, 0x12, 0x4E, 0x2E, 0x12, 0x00, 0x47, 0x32, + 0x4A, 0x78, 0x12, 0x4E, 0x38, 0x33, 0xA1, 0xA6, + 0x25, 0x21, 0x8F, 0x0A, 0x12, 0x53, 0x37, 0x0C, + 0x18, 0x21, 0x01, 0xB3, 0x64, 0x0C, 0x8D, 0x24, + 0x34, 0x44, 0x27, 0xB9, 0x44, 0x22, 0x58, 0x91, + 0x68, 0x90, 0x0A, 0x23, 0xA0, 0xB3, 0x23, 0xA0, + 0x83, 0x20, 0x51, 0xA0, 0x21, 0x39, 0xD3, 0x3B, + 0x22, 0x53, 0x37, 0x35, 0x02, 0x29, 0x82, 0x64, + 0x27, 0x82, 0x24, 0x87, 0x51, 0xA6, 0x14, 0x19, + 0x03, 0x26, 0xBA, 0x93, 0x23, 0x82, 0x2F, 0x10, + 0x0C, 0x11, 0x17, 0x58, 0x78, 0x12, 0x3D, 0x78, + 0x10, 0x22, 0x44, 0x12, 0x20, 0xCD, 0x2C, 0x46, + 0x8F, 0x3B, 0x01, 0xA6, 0x25, 0xA1, 0x84, 0x20, + 0x05, 0x64, 0x27, 0x82, 0x2A, 0x25, 0x80, 0x4A, + 0x23, 0x90, 0x8F, 0x82, 0x02, 0x2D, 0x38, 0xA0, + 0x02, 0x62, 0x2C, 0x47, 0x21, 0x01, 0x60, 0x23, + 0xBA, 0xCD, 0x30, 0x05, 0xCE, 0x63, 0x92, 0x24, + 0x0A, 0x02, 0x2A, 0x67, 0x45, 0x63, 0x38, 0x91, + 0xA3, 0x2B, 0x51, 0xA6, 0x33, 0xA0, 0xC7, 0x34, + 0x05, 0x00, 0x57, 0x50, 0x47, 0x21, 0x3A, 0x2D, + 0x20, 0x55, 0xD1, 0x23, 0xC4, 0x96, 0x12, 0x31, + 0x17, 0x33, 0xA2, 0x23, 0x27, 0x90, 0x0A, 0x67, + 0x51, 0x63, 0x22, 0x46, 0xAE, 0x57, 0x21, 0x60, + 0x17, 0x60, 0x0B, 0x29, 0x90, 0x0C, 0x23, 0x82, + 0xA4, 0x26, 0x39, 0x44, 0x29, 0x81, 0xA3, 0x29, + 0xBA, 0x24, 0x12, 0x54, 0x8B, 0x2B, 0x20, 0xB3, + 0x25, 0x21, 0x6B, 0x2C, 0x49, 0xCF, 0x10, 0x08, + 0x91, 0x14, 0x3C, 0x91, 0x23, 0xE1, 0x78, 0x2A, + 0x18, 0x11, 0x29, 0xA0, 0x4A, 0x25, 0xA1, 0x98, + 0x10, 0x05, 0x03, 0x54, 0x55, 0x03, 0x27, 0x90, + 0x83, 0x37, 0x3D, 0x02, 0x64, 0x0E, 0x67, 0x22, + 0x4E, 0x8F, 0x23, 0xB8, 0x0B, 0x34, 0x4C, 0xE4, + 0x50, 0x2E, 0x84, 0x60, 0x4A, 0x64, 0x23, 0x81, + 0xE4, 0x24, 0x5E, 0x67, 0x29, 0xBA, 0x2A, 0x38, + 0xD2, 0x53, 0x33, 0x81, 0xAA, 0x2A, 0x02, 0xA4, + 0x23, 0x91, 0x6B, 0x0A, 0x20, 0x4A, 0x12, 0x2C, + 0x17, 0x23, 0xBA, 0x93, 0x24, 0x2D, 0x58, 0x54, + 0x4A, 0x60, 0x29, 0x91, 0xB3, 0x23, 0xD2, 0x47, + 0x54, 0x39, 0x60, 0x3A, 0x04, 0x91, 0x29, 0xA1, + 0x73, 0x26, 0x01, 0x6B, 0x1A, 0x0C, 0x91, 0x27, + 0xC4, 0x84, 0x26, 0x90, 0x91, 0x38, 0xB9, 0xCF, + 0x22, 0x46, 0xA4, 0x57, 0x2E, 0x72, 0x29, 0xD0, + 0x78, 0x0A, 0x22, 0x2A, 0x27, 0x91, 0x6B, 0x29, + 0xA1, 0x6B, 0x0A, 0x11, 0x6B, 0x38, 0xD1, 0xAA, + 0x29, 0x91, 0x0D, 0x54, 0x4C, 0x0B, 0x26, 0x22, + 0x2A, 0x12, 0x00, 0x53, 0x23, 0x81, 0x6B, 0x23, + 0x90, 0x11, 0x23, 0x82, 0x24, 0x26, 0x21, 0x64, + 0x30, 0x05, 0x64, 0x27, 0x91, 0xA3, 0x10, 0x65, + 0xD1, 0x38, 0x80, 0x64, 0x20, 0x50, 0x58, 0x32, + 0x36, 0x67, 0x25, 0xD2, 0x2F, 0x28, 0x50, 0x03, + 0x13, 0xE1, 0x84, 0x20, 0x50, 0x44, 0x25, 0x90, + 0x8F, 0x25, 0x90, 0x8A, 0x22, 0x36, 0x44, 0x38, + 0xD0, 0x4A, 0x26, 0x39, 0xD3, 0x22, 0x54, 0x8D, + 0x63, 0x90, 0x8B, 0x60, 0x09, 0x58, 0x14, 0x48, + 0x91, 0x63, 0xA0, 0x47, 0x57, 0x08, 0x0B, 0x0A, + 0x12, 0x84, 0x52, 0x46, 0x4E, 0x25, 0x51, 0xAA, + 0x27, 0x34, 0x11, 0x50, 0x2D, 0x03, 0x27, 0x35, + 0x02, 0x32, 0x46, 0x44, 0x14, 0x54, 0x91, 0x67, + 0x30, 0x0D, 0x29, 0x82, 0x33, 0x0A, 0x10, 0x8D, + 0x63, 0xA1, 0x64, 0x27, 0x2E, 0xA4, 0x23, 0xBA, + 0x24, 0x60, 0x4C, 0x47, 0x26, 0xB9, 0xCF, 0x37, + 0x50, 0x47, 0x64, 0x49, 0xF8, 0x33, 0x92, 0x44, + 0x27, 0x80, 0x44, 0x38, 0x80, 0x53, 0x33, 0xA0, + 0x4A, 0x63, 0xA0, 0xA5, 0x25, 0x82, 0x47, 0x12, + 0x08, 0x0F, 0x21, 0x01, 0x64, 0x27, 0x51, 0xA3, + 0x12, 0x3C, 0x8B, 0x26, 0x00, 0x4A, 0x23, 0xB9, + 0xCA, 0x37, 0x46, 0x4E, 0x63, 0xA2, 0x64, 0x29, + 0xB9, 0xA4, 0x33, 0x91, 0x11, 0x29, 0xBA, 0x93, + 0x29, 0x82, 0x47, 0x3A, 0x35, 0x02, 0x29, 0x90, + 0x8B, 0x29, 0xC5, 0x0F, 0x23, 0x82, 0x2A, 0x67, + 0x3B, 0x38, 0x29, 0xC6, 0x93, 0x54, 0x0C, 0x8E, + 0x22, 0x54, 0x91, 0x0A, 0x02, 0x33, 0x92, 0x4A, + 0x78, 0x33, 0xA0, 0x85, 0x46, 0xCD, 0x0B, 0x37, + 0x4C, 0x0B, 0x68, 0xB9, 0xA6, 0x68, 0xA2, 0x64, + 0x23, 0xA1, 0xB8, 0x67, 0x46, 0x44, 0x46, 0x8C, + 0x91, 0x0A, 0x00, 0x4A, 0x33, 0x92, 0x24, 0x17, + 0x34, 0x6E, 0x5C, 0x21, 0xA6, 0x23, 0xBA, 0x33, + 0x29, 0xB9, 0xCB, 0x37, 0x44, 0x47, 0x0A, 0x12, + 0x38, 0x2B, 0x11, 0x6B, 0x60, 0x22, 0xA4, 0x20, + 0x4D, 0x0D, 0x33, 0xA1, 0xAA, 0x37, 0x5D, 0x02, + 0x32, 0x00, 0x47, 0x33, 0xC4, 0x84, 0x60, 0x5C, + 0x8D, 0x10, 0x34, 0xC4, 0x38, 0x90, 0x03, 0x64, + 0x11, 0x63, 0x29, 0xA1, 0xB3, 0x24, 0x10, 0xC4, + 0x60, 0x4E, 0x72, 0x21, 0x3A, 0x24, 0x54, 0x46, + 0x92, 0x26, 0x82, 0x24, 0x27, 0x2D, 0x03, 0x0A, + 0x20, 0x93, 0x52, 0x34, 0x0B, 0x21, 0x02, 0x24, + 0x0A, 0x22, 0x64, 0x46, 0xA2, 0x78, 0x63, 0xBA, + 0x44, 0x57, 0x20, 0x44, 0x34, 0x4C, 0x0D, 0x26, + 0x90, 0x0A, 0x30, 0x09, 0x58, 0x29, 0xBA, 0x38, + 0x14, 0x18, 0xF3, 0x37, 0x58, 0x91, 0x38, 0x81, + 0x0D, 0x3C, 0x21, 0xA6, 0x12, 0x48, 0x93 + ]] +}; \ No newline at end of file diff --git a/worple.txt b/worple.txt new file mode 100644 index 0000000..b17780a --- /dev/null +++ b/worple.txt @@ -0,0 +1,417 @@ +0300: 58 D8 20 2A 05 20 7D 05 +: 0D 57 4F 52 50 4C 45 21 +: 0D 0D 49 4E 53 54 52 55 +: 43 54 49 4F 4E 53 20 28 +: 59 2F 4E 29 3F 20 00 20 +: 33 05 AD 00 02 C9 59 F0 +: 03 4C D8 03 20 7D 05 59 +: 4F 55 20 48 41 56 45 20 +: 53 49 58 20 54 55 52 4E +: 53 20 54 4F 20 47 55 45 +: 53 53 20 4D 59 20 35 2D +: 4C 45 54 54 45 52 0D 57 +: 4F 52 44 2E 20 20 49 27 +: 4C 4C 20 47 49 56 45 20 +: 59 4F 55 20 48 49 4E 54 +: 53 20 41 46 54 45 52 20 +: 45 41 43 48 3A 0D 0D 20 +: 20 2A 20 3D 20 4C 45 54 +: 54 45 52 20 49 4E 20 43 +: 4F 52 52 45 43 54 20 50 +: 4C 41 43 45 0D 20 20 3F +: 20 3D 20 52 49 47 48 54 +: 20 4C 45 54 54 45 52 2C +: 20 57 52 4F 4E 47 20 50 +: 4C 41 43 45 0D 20 20 2D +: 20 3D 20 4E 4F 54 20 49 +: 4E 20 57 4F 52 44 0D 00 +: 20 7D 05 0D 00 A9 30 8D +: F2 03 20 E9 04 EE F2 03 +: 20 7D 05 47 55 45 53 53 +: 20 23 4E 3A 20 00 20 33 +: 05 E0 05 F0 1C E0 00 F0 +: E7 20 7D 05 20 45 4E 54 +: 45 52 20 35 20 4C 45 54 +: 54 45 52 53 0D 00 4C E8 +: 03 A9 00 85 0B A2 04 BD +: 9E 04 DD 00 02 F0 09 95 +: 04 A9 2D 9D 6F 04 D0 09 +: A9 2A 9D 6F 04 95 04 E6 +: 0B CA 10 E3 A2 00 B5 04 +: C9 2A F0 19 BD 00 02 A0 +: 00 D9 04 00 F0 07 C8 C0 +: 05 D0 F6 F0 08 A9 3F 9D +: 6F 04 99 04 00 E8 E0 05 +: D0 DC 20 7D 05 20 20 20 +: 20 20 20 20 20 20 20 2D +: 2D 2D 2D 2D 0D 00 A9 05 +: C5 0B F0 2C AD F2 03 C9 +: 36 F0 03 4C E5 03 20 7D +: 05 53 4F 52 52 59 2C 20 +: 54 48 45 20 57 4F 52 44 +: 20 57 41 53 20 22 58 58 +: 58 58 58 22 00 4C C1 04 +: AD F2 03 29 07 0A AA BD +: 9E 05 85 0C BD 9F 05 85 +: 0D 20 8D 05 A9 21 20 EF +: FF 20 7D 05 0D 0D 50 4C +: 41 59 20 41 47 41 49 4E +: 20 28 59 2F 4E 29 3F 20 +: 00 20 33 05 AD 00 02 C9 +: 59 D0 03 4C D8 03 4C 1F +: FF A0 02 B1 09 99 01 00 +: 88 10 F8 A5 09 C9 51 A5 +: 0A E9 0C A9 00 69 00 85 +: 00 A0 06 20 22 05 88 10 +: FA C8 A9 05 85 0B 20 22 +: 05 2A C6 0B D0 F8 18 69 +: A1 99 9E 04 C8 C0 05 30 +: E9 60 A2 03 36 00 CA 10 +: FB 60 A9 D9 85 09 A9 05 +: 85 0A 60 A2 00 18 A5 09 +: 69 03 85 09 A5 0A 69 00 +: 85 0A A5 09 C9 FF A5 0A +: E9 0F 90 03 20 2A 05 AD +: 11 D0 10 E1 AD 10 D0 29 +: 7F C9 5B B0 0D C9 41 90 +: 09 9D 00 02 20 EF FF E8 +: 30 0C C9 0D F0 0A C9 5F +: F0 04 C9 1B D0 BF A2 00 +: A9 0D 4C EF FF 68 85 0C +: 68 85 0D 20 8D 05 A5 0D +: 48 A5 0C 48 60 A2 00 E6 +: 0C D0 02 E6 0D A1 0C F0 +: 06 20 EF FF 4C 8F 05 60 +: AB 05 B1 05 B9 05 C1 05 +: CB 05 D3 05 4C 55 43 4B +: 59 00 41 4D 41 5A 49 4E +: 47 00 57 4F 4F 2D 48 4F +: 4F 00 57 45 4C 4C 20 44 +: 4F 4E 45 00 4E 4F 54 20 +: 42 41 44 00 50 48 45 57 +: 00 7A 31 03 23 A0 4A 68 +: B9 CC 7A 30 0D 28 E1 F3 +: 45 95 0D F5 81 B3 65 A0 +: 64 B0 34 08 C2 01 B3 86 +: CE 2E 48 82 44 54 11 63 +: 46 CC 91 46 01 0B 04 0C +: 83 D4 35 B8 14 34 CE 68 +: D1 8F 40 45 78 F7 21 B3 +: F5 A0 91 B7 0A 92 1A 2D +: 58 F8 A1 B3 60 53 24 28 +: A0 83 F7 2D 40 20 4C 47 +: 15 92 52 15 D2 47 08 B1 +: D1 27 0C 83 F5 81 13 20 +: 45 CB 0B 02 24 60 4A 58 +: DC 2D CD 72 02 23 63 BA +: 53 38 BA CD 1A 21 73 54 +: 46 53 65 80 64 18 B8 03 +: F4 12 78 00 E2 52 3B 11 +: 6B EA 92 33 02 B9 D3 09 +: 20 64 54 2E 67 00 D3 39 +: F5 D1 81 1A 48 F8 18 90 +: 03 17 0C C4 F0 34 60 86 +: 92 33 F5 A0 83 25 BA 44 +: 32 2E 60 55 81 AA 07 46 +: 60 F7 22 44 F7 50 47 65 +: D1 CD 12 46 67 68 82 A4 +: C0 35 A0 25 82 52 77 52 +: 44 0B 16 8B 72 46 79 B4 +: 10 C4 05 AD D8 55 81 0B +: 55 B8 4A 32 55 0B B2 02 +: 47 E1 4C 93 CA 4A 78 E8 +: 98 0D 09 48 18 30 34 44 +: 62 12 44 50 44 03 70 34 +: 78 23 90 0F 1A 18 D8 08 +: C4 18 F0 3C 91 B0 46 A0 +: C0 25 D1 01 8C 83 27 51 +: 63 1A 45 B3 28 90 8F F4 +: 01 AE A0 60 0A DC 31 E7 +: 49 48 18 08 B9 80 E1 10 +: 0D 20 30 8B 20 34 78 58 +: 92 47 92 2D 78 25 A0 4A +: 38 90 0C 12 34 47 15 82 +: 53 E7 A2 8C D0 22 A4 C7 +: 52 67 86 94 91 05 B8 B3 +: 18 B9 44 34 02 38 FA 34 +: 47 28 BA 52 15 81 AA F9 +: 01 6C E2 CC 8D 55 D1 84 +: 15 A2 79 02 CC 91 00 D2 +: 44 14 46 67 23 A1 63 72 +: 02 B8 70 4C 47 7C 0E 2E +: F0 34 8B 54 34 0B 60 61 +: 78 23 D1 AA 64 46 67 68 +: 80 44 F7 00 47 62 35 04 +: A6 B9 6B 50 21 B3 F5 81 +: 0D F7 58 91 10 44 C4 27 +: 0C 91 25 82 4F 38 BA A4 +: 54 12 38 45 90 D8 B2 54 +: 91 27 0C 82 77 46 44 57 +: 22 53 54 04 91 20 08 E4 +: 18 A1 A6 1A 4E 64 50 55 +: D1 20 44 13 49 D0 64 F2 +: 02 2B B2 00 47 23 80 A4 +: 0B 39 44 27 30 93 52 02 +: 53 B7 39 F8 77 4D 78 A0 +: 45 80 F8 A0 64 A7 01 60 +: 4A 92 38 E5 8C 91 B4 34 +: CE E1 4C 0B 40 46 67 10 +: 0C C4 30 34 78 B4 18 F3 +: 92 45 58 C7 31 98 E9 9C +: 91 A0 05 C1 05 AC 98 17 +: 02 23 34 08 98 72 00 78 +: A6 B8 4A F4 10 44 6A 02 +: 23 8A BA 38 10 35 2E 47 +: BA F8 55 D1 03 1A 21 63 +: D4 18 F3 38 B9 03 E1 8D +: 78 B0 44 C4 C7 51 A3 27 +: 54 8D 22 02 44 C7 0C 8C +: 67 3A 44 C4 18 F3 49 9D +: D2 55 D2 64 F2 44 47 06 +: 98 91 23 90 4A E7 92 20 +: FA 46 44 3A 54 93 E1 0A +: 91 6A 2C 47 0A 0D 13 10 +: 49 0D B0 05 D1 92 4D CD +: C2 02 78 F2 4C 0B 54 48 +: F8 4B BC 8B 67 52 23 7C +: 11 A0 81 E1 6B 05 99 CB +: 46 A5 D8 18 A0 64 27 51 +: B3 C2 44 C4 65 B8 0C 74 +: 34 C4 4A 91 B3 F7 4A 44 +: C7 44 0B B5 81 80 1A 60 +: 91 06 04 91 57 2D 78 28 +: 90 0A 48 50 0B 58 BA 67 +: 46 91 98 6A 12 53 28 91 +: E4 F4 3C 91 17 3A 53 C2 +: 4C 91 57 46 67 22 0C 11 +: 15 BA CD 6A 20 64 4B CD +: CB 44 90 53 10 4C E4 F4 +: 5C 8B 06 B4 97 70 4A 78 +: 06 05 64 EC B9 A4 72 02 +: 33 27 2D D1 32 04 11 01 +: 8C 91 81 90 0B 27 02 53 +: 23 82 23 08 A2 44 23 92 +: 52 68 80 64 37 58 8B 37 +: 2D 78 D2 44 78 25 90 0D +: 38 D1 03 70 09 52 C7 51 +: B3 72 2D 17 15 80 4A B0 +: 50 C7 10 28 91 B0 4C E4 +: F3 82 44 03 44 84 20 05 +: 0D 06 99 64 15 B8 4A 25 +: 90 11 67 38 B8 D2 54 91 +: B2 31 80 88 82 64 D7 22 +: 44 4B 80 53 37 59 B8 25 +: A1 81 65 E1 E7 60 21 78 +: 68 81 A3 49 9D 02 32 06 +: 86 38 A1 AA DA 0C C4 C7 +: 0C 8B 70 4A 64 C7 34 98 +: 00 BA A4 C4 46 67 68 90 +: 83 20 04 38 BC 45 02 F5 +: 81 A4 E8 8C 91 B2 54 8B +: F4 42 84 86 B4 91 F0 46 +: 78 55 82 24 48 51 0F 12 +: 19 0D 64 54 8D FA 44 C4 +: 28 BA C3 27 51 E4 68 82 +: 52 97 51 64 68 A1 E4 32 +: 3D D3 06 A9 64 70 45 F8 +: 68 90 8D 92 58 8B 77 04 +: 38 A0 3E 93 58 A2 4A CA +: 31 98 77 4C 8B 25 BA 83 +: 28 D0 8B F0 21 B3 C0 0A +: 2E 86 95 17 68 90 13 68 +: D1 B3 50 2E 44 F8 92 52 +: C4 31 02 5A 45 D1 45 D0 +: 64 58 B9 A3 68 BA CB 15 +: D0 A5 23 81 8F E5 8C 8D +: C0 4C 47 68 80 B3 C4 34 +: 44 30 4C 83 72 36 38 06 +: A2 44 58 BA 53 B2 02 53 +: AA 0F 34 23 81 11 B2 10 +: 47 38 A0 B3 F2 4E 78 10 +: 2C 91 06 B8 64 B7 08 0B +: F8 BA A4 E2 94 91 15 D1 +: B3 2C 09 64 6A 12 52 55 +: 80 4A 58 A0 11 C2 2D CD +: C2 4C 0B 70 46 38 58 D1 +: 13 00 85 D3 6A 4A 6E 1A +: 46 53 28 D1 81 B4 28 8D +: F4 2C 05 55 B9 D1 18 82 +: CD 57 18 D8 58 A1 6B 25 +: D1 A6 1A 2C C4 BA 44 47 +: F2 00 44 34 38 64 C4 4A +: 78 CA 49 02 01 1D CE 9A +: 31 F8 32 50 44 23 BA 23 +: 65 A1 B3 1A 0C C4 58 90 +: 83 F4 4C 47 10 49 02 32 +: 02 67 15 D0 91 D7 48 98 +: FA 44 84 B4 2C 02 28 D2 +: 53 12 18 0D 10 0D 78 38 +: 92 52 08 CE 58 03 01 E4 +: 01 45 03 4B A1 64 05 CC +: 11 E6 A1 CD 38 A2 A4 20 +: 18 83 18 81 0D F0 35 4E +: F2 49 58 6A 21 64 12 2D +: 04 00 BA 93 06 D5 0B 97 +: 28 91 03 2D D6 F8 B8 24 +: 17 3B 24 D7 46 67 23 82 +: 33 F0 44 91 52 4C 0B 18 +: 80 44 54 18 F3 46 3A 64 +: 57 08 0B DA 46 44 F8 BA +: CB FA 2E 44 C0 49 CD 20 +: 46 38 1C 4C 92 E8 85 13 +: D0 48 0B F2 08 0D 23 B8 +: 4A 46 D5 D8 12 00 78 65 +: BA 52 38 90 03 7A 46 38 +: 70 22 38 B2 02 A4 25 81 +: 0C B7 19 02 55 BA 52 28 +: 80 B3 C7 36 67 38 82 CD +: 10 45 CD 72 45 CD 37 21 +: A6 C2 0D 00 06 39 A6 10 +: 61 D4 18 B9 0B 18 BA 67 +: 57 44 44 B2 02 2D 55 A1 +: A6 30 64 83 25 80 4A 18 +: A2 4A 18 A0 24 44 18 F3 +: 55 D1 A6 97 52 53 9A 30 +: 2E 77 34 98 F7 51 A3 F7 +: 48 91 12 15 13 34 4C 47 +: FA 3D 0B 68 81 E4 00 90 +: 0C 09 CD 02 23 A2 2F B0 +: 04 8B 18 90 0A 58 B9 B3 +: 37 50 C7 65 82 52 07 BD +: 64 34 48 4E 28 D0 B3 03 +: 01 0D 68 A1 6B C4 0A 2E +: 3B 11 73 57 51 A3 68 82 +: 4F 68 83 24 A6 90 8B 70 +: 3D F8 46 39 28 05 AD D6 +: 23 A0 85 F5 80 44 25 B8 +: 4A 48 90 53 F7 28 91 27 +: 05 CB 45 90 53 23 82 44 +: D0 54 8B 30 14 B8 B0 4C +: 91 55 A0 91 68 BA 8F A6 +: BA CD 34 34 CE 18 BA CD +: 86 91 F3 18 81 03 27 30 +: 2E D2 10 78 38 82 CB BA +: 09 03 27 34 47 F8 BA 44 +: CA 31 F2 05 A0 8D 12 54 +: 8B 09 1C 8D 34 31 78 27 +: 09 C0 27 54 91 20 52 44 +: EB A0 64 55 81 44 F2 35 +: B8 32 35 D1 37 3A 67 57 +: 58 8B 2B 01 8F 29 D0 4A +: 21 3A 91 34 18 91 68 A2 +: 53 33 C5 D6 72 35 CD 92 +: 06 20 3B 20 44 32 12 67 +: 17 51 A3 38 81 0B 87 52 +: 67 80 08 F3 38 80 4A 68 +: BA 64 27 52 67 12 2C 18 +: 2B 3A 24 64 34 44 54 19 +: D1 26 82 2B 29 B9 B8 27 +: 90 4A 12 01 6C 29 BA A4 +: 20 2D 78 0A 01 44 23 90 +: 93 46 C8 93 0A 01 6C 63 +: B9 64 67 28 8D 26 BA D8 +: 82 02 53 26 11 6B 26 22 +: 64 0A 01 0B 54 49 13 2B +: 02 2C 67 35 58 97 34 83 +: 0A 3A 60 23 A1 A4 25 91 +: F3 23 A2 33 49 50 0B 29 +: 80 C4 0A 10 91 29 81 44 +: 25 81 0D 24 18 F3 64 4E +: 78 64 4C 47 33 BA 44 29 +: B9 C3 10 0D 0E 63 90 13 +: 60 4C 91 37 3C 19 0A 21 +: 73 0A 21 6B 32 49 60 38 +: 81 13 38 B9 6B 27 A0 58 +: 12 00 78 84 11 63 50 3D +: D1 12 4E 2E 12 00 47 32 +: 4A 78 12 4E 38 33 A1 A6 +: 25 21 8F 0A 12 53 37 0C +: 18 21 01 B3 64 0C 8D 24 +: 34 44 27 B9 44 22 58 91 +: 68 90 0A 23 A0 B3 23 A0 +: 83 20 51 A0 21 39 D3 3B +: 22 53 37 35 02 29 82 64 +: 27 82 24 87 51 A6 14 19 +: 03 26 BA 93 23 82 2F 10 +: 0C 11 17 58 78 12 3D 78 +: 10 22 44 12 20 CD 2C 46 +: 8F 3B 01 A6 25 A1 84 20 +: 05 64 27 82 2A 25 80 4A +: 23 90 8F 82 02 2D 38 A0 +: 02 62 2C 47 21 01 60 23 +: BA CD 30 05 CE 63 92 24 +: 0A 02 2A 67 45 63 38 91 +: A3 2B 51 A6 33 A0 C7 34 +: 05 00 57 50 47 21 3A 2D +: 20 55 D1 23 C4 96 12 31 +: 17 33 A2 23 27 90 0A 67 +: 51 63 22 46 AE 57 21 60 +: 17 60 0B 29 90 0C 23 82 +: A4 26 39 44 29 81 A3 29 +: BA 24 12 54 8B 2B 20 B3 +: 25 21 6B 2C 49 CF 10 08 +: 91 14 3C 91 23 E1 78 2A +: 18 11 29 A0 4A 25 A1 98 +: 10 05 03 54 55 03 27 90 +: 83 37 3D 02 64 0E 67 22 +: 4E 8F 23 B8 0B 34 4C E4 +: 50 2E 84 60 4A 64 23 81 +: E4 24 5E 67 29 BA 2A 38 +: D2 53 33 81 AA 2A 02 A4 +: 23 91 6B 0A 20 4A 12 2C +: 17 23 BA 93 24 2D 58 54 +: 4A 60 29 91 B3 23 D2 47 +: 54 39 60 3A 04 91 29 A1 +: 73 26 01 6B 1A 0C 91 27 +: C4 84 26 90 91 38 B9 CF +: 22 46 A4 57 2E 72 29 D0 +: 78 0A 22 2A 27 91 6B 29 +: A1 6B 0A 11 6B 38 D1 AA +: 29 91 0D 54 4C 0B 26 22 +: 2A 12 00 53 23 81 6B 23 +: 90 11 23 82 24 26 21 64 +: 30 05 64 27 91 A3 10 65 +: D1 38 80 64 20 50 58 32 +: 36 67 25 D2 2F 28 50 03 +: 13 E1 84 20 50 44 25 90 +: 8F 25 90 8A 22 36 44 38 +: D0 4A 26 39 D3 22 54 8D +: 63 90 8B 60 09 58 14 48 +: 91 63 A0 47 57 08 0B 0A +: 12 84 52 46 4E 25 51 AA +: 27 34 11 50 2D 03 27 35 +: 02 32 46 44 14 54 91 67 +: 30 0D 29 82 33 0A 10 8D +: 63 A1 64 27 2E A4 23 BA +: 24 60 4C 47 26 B9 CF 37 +: 50 47 64 49 F8 33 92 44 +: 27 80 44 38 80 53 33 A0 +: 4A 63 A0 A5 25 82 47 12 +: 08 0F 21 01 64 27 51 A3 +: 12 3C 8B 26 00 4A 23 B9 +: CA 37 46 4E 63 A2 64 29 +: B9 A4 33 91 11 29 BA 93 +: 29 82 47 3A 35 02 29 90 +: 8B 29 C5 0F 23 82 2A 67 +: 3B 38 29 C6 93 54 0C 8E +: 22 54 91 0A 02 33 92 4A +: 78 33 A0 85 46 CD 0B 37 +: 4C 0B 68 B9 A6 68 A2 64 +: 23 A1 B8 67 46 44 46 8C +: 91 0A 00 4A 33 92 24 17 +: 34 6E 5C 21 A6 23 BA 33 +: 29 B9 CB 37 44 47 0A 12 +: 38 2B 11 6B 60 22 A4 20 +: 4D 0D 33 A1 AA 37 5D 02 +: 32 00 47 33 C4 84 60 5C +: 8D 10 34 C4 38 90 03 64 +: 11 63 29 A1 B3 24 10 C4 +: 60 4E 72 21 3A 24 54 46 +: 92 26 82 24 27 2D 03 0A +: 20 93 52 34 0B 21 02 24 +: 0A 22 64 46 A2 78 63 BA +: 44 57 20 44 34 4C 0D 26 +: 90 0A 30 09 58 29 BA 38 +: 14 18 F3 37 58 91 38 81 +: 0D 3C 21 A6 12 48 93 +0300R