78 1246 0 4 2 71 38 40 #0 The System Object 24 2 -1 -1 -1 1 -1 20 6 do_login_command 2 173 -1 server_started 2 173 -1 core_objects 2 173 -1 init_for_core 2 165 -1 user_created user_connected 2 173 -1 user_disconnected user_client_disconnected 2 173 -1 95 builder login last_huh guest_log last_restart_time biglist big_mail_recipient limbo registration_db new_player_log verb_help core_help prog_help wiz_help shutdown_task wiz_utils site_db math_utils set_utils builtin_function_help new_prog_log generic_help guest spell seq_utils quota_log you free_list max_seconds max_ticks hacker generic_db shutdown_message shutdown_time no_one player_db class_registry player_class gender_utils trig_utils time_utils editor_help mail_recipient mail_agent mail_editor note_editor verb_editor generic_editor match_utils object_utils lock_utils gripe_recipients letter dump_interval list_utils command_utils player wiz prog code_utils help nothing failed_match ambiguous_match perm_utils building_utils string_utils news note container thing exit room player_start root_class recycler garbage mail_options edit_options display_options generic_options maxint minint list_options error newt_log toad_log site_log housekeeper network generic_biglist_home feature local gopher nntp 99 1 4 2 5 1 12 2 1 1 13 2 1 1 14 2 1 0 751261366 2 5 1 15 2 5 1 16 2 5 1 17 2 5 1 18 2 5 1 19 2 5 1 22 2 5 1 23 2 5 1 24 2 5 1 25 2 5 3 0 2 5 1 26 2 5 1 27 2 5 1 28 2 5 1 29 2 5 1 30 2 5 1 31 2 5 1 32 2 5 1 33 2 1 1 34 2 5 1 35 2 5 1 36 2 5 1 37 38 1 4 0 2 5 0 5 2 5 0 30000 2 5 1 38 2 5 1 39 2 5 2 2 5 0 0 2 5 1 40 2 1 1 41 2 1 4 2 4 3 2 generics 2 Generic objects intended for use as the parents of new objects 4 13 1 3 1 7 1 5 1 9 1 55 1 8 1 1 1 6 1 59 1 58 1 51 1 46 1 47 4 3 2 utilities 2 Objects holding useful general-purpose verbs 4 12 1 20 1 43 1 28 1 44 1 52 1 53 1 54 1 56 1 57 1 60 1 42 1 21 2 5 1 6 2 5 1 43 2 1 1 28 2 5 1 44 2 5 1 45 2 5 1 46 2 5 1 47 2 5 1 48 2 5 1 49 2 5 1 50 2 5 1 51 2 5 1 52 2 5 1 53 2 5 1 54 2 5 4 1 1 2 2 5 1 55 2 5 0 3600 2 5 1 56 2 5 1 57 2 5 1 6 2 5 1 58 2 5 1 59 2 5 1 60 2 5 1 61 2 5 1 -1 2 5 1 -3 2 5 1 -2 2 5 1 42 2 5 1 21 2 5 1 20 2 5 1 10 2 5 1 9 2 5 1 8 2 5 1 5 2 5 1 7 2 5 1 3 2 5 1 11 2 5 1 1 2 5 1 62 2 5 1 63 2 5 1 64 2 5 1 65 2 5 1 66 2 5 1 67 2 5 0 2147483647 2 5 0 -2147483648 2 5 1 68 2 5 1 69 2 5 1 70 2 5 1 70 2 5 1 70 2 5 1 71 2 5 1 72 2 5 1 73 2 1 1 74 2 5 1 -1 2 5 1 75 2 1 1 76 2 5 5 2 4 4 3 2 The 2 Known 2 Universe 2 5 2 The known universe. 2 5 4 2 0 9821 0 749766669 2 1 #1 Root Class 152 2 -1 -1 -1 -1 3 -1 38 initialize 2 165 -1 recycle 2 165 -1 set_name 2 165 -1 title 2 173 -1 titlec 2 173 -1 set_aliases 2 165 -1 match 2 173 -1 match_object 2 173 -1 set_description 2 173 -1 description 2 173 -1 look_self 2 173 -1 exam*ine 2 37 -1 notify 2 173 -1 tell 2 173 -1 tell_lines 2 173 -1 accept 2 173 -1 moveto 2 165 -1 eject eject_nice eject_basic 2 165 -1 is_unlocked_for 2 173 -1 huh 2 173 -1 set_message 2 165 -1 do_examine 2 165 -1 examine_key 2 173 -1 examine_names 2 173 -1 examine_desc 2 173 -1 examine_contents 2 165 -1 examine_verbs 2 165 -1 get_message 2 165 -1 room_announce*_all_but 2 165 -1 init_for_core 2 173 -1 contents 38 173 -1 examine_verb_ok 2 165 -1 is_listening 2 173 -1 hidden_verbs 2 165 -1 examine_owner 2 173 -1 announce*_all_but 2 173 -1 tell_lines_suspended 2 173 -1 acceptable 2 173 -1 4 key aliases description object_size 4 0 0 2 4 4 0 2 5 2 2 5 4 2 0 16651 0 750578402 2 1 #2 Wizard 7 2 11 -1 -1 58 -1 -1 0 0 70 2 2 5 2 %n @newts %d (%[#d]) 2 5 1 -1 2 5 2 %d is now a programmer. 2 5 2 You are now a programmer. 2 5 2 Have a nice life... 2 5 2 %n @toads %d (%[#d]) 2 5 1 -1 2 4 4 0 38 1 0 0 2 5 0 0 2 5 2 2 5 0 1 2 5 4 0 38 1 0 0 2 0 4 0 2 5 2 2 0 0 0 2 1 0 0 2 5 2 *** More *** %n lines left. Do @more [rest|flush] for more. 2 5 4 2 0 0 0 0 38 1 0 0 38 1 4 0 38 0 0 0 38 1 0 0 2 5 4 0 2 1 0 -79 38 1 0 1 2 4 5 2 0 5 2 0 4 0 2 5 4 0 2 4 0 0 2 5 4 0 2 4 0 10 2 4 2 %N is not currently logged in. 2 5 2 its 2 5 2 Its 2 5 2 You sense that %n is looking for you in %l. 2 5 2 Your message has been sent. 2 5 4 0 2 5 4 0 2 5 4 0 2 5 4 0 2 5 4 2 0 0 0 0 2 4 4 0 2 4 0 0 2 1 0 142 2 0 2 neuter 2 5 2 Itself 2 5 2 Its 2 5 2 It 2 5 2 It 2 5 2 itself 2 5 2 its 2 5 2 it 2 5 2 it 2 5 1 11 2 5 0 0 2 0 4 0 2 5 0 0 2 5 4 0 2 5 4 0 2 5 4 0 2 5 0 2147483647 2 1 0 0 2 4 0 0 2 4 4 1 2 Wizard 2 1 2 2 5 4 2 0 75799 0 750665764 2 1 #3 generic room 152 2 -1 -1 -1 1 51 0 42 confunc 2 173 -1 disfunc 2 173 -1 say 2 85 -2 emote 2 93 -2 announce 2 173 -1 match_exit 2 173 -1 add_exit 2 165 -1 tell_contents 2 173 -1 @exits 2 5 -1 look_self 2 173 -1 acceptable 2 173 -1 add_entrance 2 165 -1 bless_for_entry 2 173 -1 @entrances 2 1 -1 go 2 29 -1 l*ook 2 93 -2 announce_all 2 173 -1 announce_all_but 2 173 -1 enterfunc 2 173 -1 exitfunc 2 173 -1 remove_exit 2 173 -1 remove_entrance 2 173 -1 @add-exit 2 17 -1 @add-entrance 2 17 -1 recycle 2 165 -1 e east w west s south n north ne northeast nw northwest se southeast sw southwest u up d down 2 13 -1 @eject @eject! @eject!! 2 25 -1 ejection_msg oejection_msg victim_ejection_msg 38 173 -1 accept_for_abode 2 173 -1 @resident*s 2 25 -1 match 2 173 -1 @remove-exit 2 25 -1 @remove-entrance 2 25 -1 moveto 2 173 -1 who_location_msg 2 173 -1 exits entrances 2 173 -1 obvious_exits 2 165 -1 here_huh 2 173 -1 room_announce*_all_but 2 173 -1 examine_commands_ok 2 173 -1 examine_key 2 173 -1 examine_contents 2 165 -1 13 who_location_msg free_home victim_ejection_msg ejection_msg oejection_msg residents free_entry entrances blessed_object blessed_task exits dark ctype 17 2 %T 2 5 0 0 2 5 2 You have been expelled from %i by %n. 2 5 2 You expel %d from %i. 2 5 2 %D is unceremoniously expelled from %i by %n. 2 5 4 0 2 5 0 1 2 5 4 0 2 4 1 -1 2 5 0 0 2 5 4 0 2 4 0 0 2 5 0 3 2 5 5 2 4 4 1 2 generic room 2 5 5 2 5 4 2 0 23620 0 750664812 2 1 #4 generic builder 144 2 -1 -1 -1 6 59 -1 27 @quota 2 17 -1 @create 2 81 -2 @recycle 2 17 -1 @recreate 2 89 13 @dig 2 81 -2 @audit 2 89 -2 @count 2 25 -1 @countDB 2 25 -1 @sort-owned*-objects 2 9 -1 @add-owned 2 25 -1 @verify-owned 2 9 -1 @unlock 2 17 -1 @lock 2 89 0 @newmess*age 2 81 -2 @unmess*age 2 81 -2 _messagify 2 173 -1 @kids 2 29 -1 @contents 2 25 -1 @par*ents 2 25 -1 @location*s 2 25 -1 @cl*asses 2 89 -2 classes_2 2 173 -1 _create 2 173 -1 _recycle 2 173 -1 @chparent 2 81 1 @check-chp*arent 2 89 1 @set*prop 2 89 1 1 recreate_enabled 58 0 1 2 5 5 38 1 5 2 0 5 2 5 5 2 0 5 2 1 0 0 2 5 5 2 5 5 38 1 5 38 1 5 38 0 5 38 1 5 2 5 5 2 1 5 38 1 5 2 4 5 2 0 5 2 0 5 2 5 5 2 4 5 2 5 5 2 4 5 2 4 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 4 5 2 4 5 2 1 0 0 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 1 11 2 5 5 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 1 5 2 4 5 2 4 4 1 2 generic builder 2 1 2 You see a player who should type '@describe me as ...'. 2 5 4 2 0 27097 0 750665976 2 1 #5 generic thing 152 2 -1 -1 -1 1 8 6 6 g*et t*ake 2 45 -1 d*rop th*row 2 45 -1 moveto 2 173 -1 take_failed_msg take_succeeded_msg otake_failed_msg otake_succeeded_msg drop_failed_msg drop_succeeded_msg odrop_failed_msg odrop_succeeded_msg 2 173 -1 gi*ve ha*nd 2 109 1 examine_key 2 173 -1 8 drop_failed_msg drop_succeeded_msg odrop_failed_msg odrop_succeeded_msg otake_succeeded_msg otake_failed_msg take_succeeded_msg take_failed_msg 12 2 You can't seem to drop %t here. 2 5 2 You drop %t. 2 5 2 tries to drop %t but fails! 2 5 2 drops %t. 2 5 2 picks up %t. 2 5 2 2 5 2 You take %t. 2 5 2 You can't pick that up. 2 5 5 2 4 4 1 2 generic thing 2 5 5 2 5 4 2 0 4369 0 750664824 2 1 #6 generic player 152 2 -1 -1 -1 1 40 7 128 init_for_core 2 173 -1 confunc 2 173 -1 disfunc 2 173 -1 initialize 2 173 -1 recycle 2 173 -1 acceptable 2 173 -1 my_huh 2 165 -1 last_huh 2 173 -1 my_match_object 2 173 -1 tell_contents 2 173 -1 titlec 2 173 -1 notify 2 173 -1 notify_lines 2 173 -1 linesplit 2 173 -1 linelen 38 173 -1 @more 2 25 -1 @wrap 38 1 -2 @linelen*gth 38 17 -1 @pagelen*gth 2 17 -1 tell 2 165 -1 gag_p 2 173 -1 set_gaglist 2 173 -1 @gag 2 89 -2 @listgag @gaglist 2 5 -1 @ungag 2 29 -1 whodunnit 2 173 -1 @ch*eck-full 2 89 -2 @paranoid 2 89 -2 @sw*eep 2 9 -1 wh*isper 2 157 1 page 2 93 -2 receive_page 2 173 -1 page_origin_msg page_echo_msg page_absent_msg 38 165 -1 i inv*entory 2 9 -1 look_self 2 173 -1 home 2 9 -1 @sethome 2 9 -1 g*et take 2 45 -1 @move 2 93 1 @eject @eject! @eject!! 2 89 5 where*is @where*is 2 93 -2 @who 2 85 -2 @wizards 2 29 -1 ?* help info*rmation @help 2 85 -2 news 2 13 -1 mail_forward mail_notify 2 173 -1 receive_message 2 173 -1 display_message 2 173 -1 parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_date_gt length_all_msgs exists_num_eq rm_message_seq undo_rmm expunge_rmm renumber 2 173 -1 msg_summary_line 38 173 -1 msg_text 2 173 -1 notify_mail 2 173 -1 __fix 2 173 -1 current_message 2 173 -1 get_current_message 2 173 -1 set_current_message 2 173 -1 make_current_message 2 173 -1 kill_current_message 2 173 -1 current_folder 2 173 -1 set_current_folder 2 173 -1 parse_folder_spec 2 173 -1 parse_mailread_cmd 2 173 -1 @mail 2 85 -2 @read @peek 2 93 -2 @next @prev 2 89 -2 @rmm*ail 2 89 -2 @renumber 2 25 -1 @unrmm*ail 2 89 -2 @send 2 93 -2 @answer @repl*y 2 89 -2 @forward 2 93 -2 @gripe 2 89 -2 @typo @bug @suggest*ion @idea @comment 2 89 -2 @skip 2 89 -2 @subscribe @unsubscribed 2 89 -2 mail_catch_up 2 173 -1 @rn check_mail_lists @subscribed 2 5 -1 mail_option 2 173 -1 display_option 2 173 -1 edit_option 2 173 -1 list_option 2 173 -1 set_mail_option set_edit_option set_list_option set_display_option 2 173 -1 @mailo*ptions @mail-o*ptions @edito*ptions @edit-o*ptions @displayo*ptions @display-o*ptions 2 89 -2 set_name 2 173 -1 set_aliases 2 173 -1 @rename 2 81 1 @addalias @add-alias 2 81 1 @rmalias 2 81 5 @desc*ribe 2 89 13 @mess*ages 2 17 -1 @notedit 38 25 -1 @password 2 89 -2 @last-c*onnection 2 29 -1 set_gender 2 173 -1 @gender 2 25 -1 set_brief 2 173 -1 @mode 2 81 -2 @exam*ine 2 29 -1 exam*ine 2 25 -1 add_feature 38 165 -1 remove_feature 38 165 -1 @add-feature @addfeature 2 25 -1 @remove-feature @rmfeature 2 25 -1 @features 2 85 11 @features 2 17 -1 @memory 38 9 -1 @version 38 9 -1 @uptime 38 9 -1 @quit 2 9 -1 examine_commands_ok 2 173 -1 is_listening 2 165 -1 moveto 2 173 -1 announce*_all_but 2 165 -1 linewrap 38 173 -1 @set-note-string @set-note-text 2 17 -1 verb_sub 2 165 -1 ownership_quota 2 173 -1 tell_lines 2 173 -1 @lastlog 2 29 -1 set_linelength 2 173 -1 set_pagelength 2 165 -1 set_home 2 165 -1 @unsub*scribe 2 89 -2 @registerme 2 89 -2 ctime 2 173 -1 send_self_netmail 2 173 -1 @netforw*ard 2 93 -2 @@sendmail 2 89 -2 53 features previous_connection mail_lists email_address last_disconnect_time help more_msg linetask linesleft linebuffer pagelen _mail_task owned_objects linelen current_folder all_connect_places last_connect_place dict messages_going brief responsible lines page_absent_msg pq pqc page_origin_msg page_echo_msg mail_notify mail_forward edit_options mail_options current_message messages last_connect_time ownership_quota gender prc ppc poc psc pr pp po ps home password gaglist paranoid display_options list_options verb_subs first_connect_time messages_kept 57 4 0 38 1 0 0 2 0 4 0 2 5 2 2 0 0 0 2 1 0 0 2 5 2 *** More *** %n lines left. Do @more [rest|flush] for more. 2 5 4 2 0 0 0 0 38 1 0 0 38 1 4 0 38 0 0 0 38 1 0 0 2 5 4 0 2 1 0 -79 38 1 0 1 2 4 4 0 2 0 2 ? 2 0 4 0 2 5 4 0 2 4 0 0 2 5 4 0 2 4 0 10 2 4 2 %N is not currently logged in. 2 5 2 its 2 5 2 Its 2 5 2 You sense that %n is looking for you in %l. 2 5 2 Your message has been sent. 2 5 4 0 2 5 4 0 2 5 4 0 2 5 4 0 2 5 4 2 0 0 0 0 2 4 4 0 2 4 0 0 2 1 0 0 2 0 2 neuter 2 5 2 Itself 2 5 2 Its 2 5 2 It 2 5 2 It 2 5 2 itself 2 5 2 its 2 5 2 it 2 5 2 it 2 5 1 11 2 5 2 impossible password to type 2 0 4 0 2 5 0 0 2 5 4 0 2 5 4 0 2 5 4 0 2 5 0 2147483647 2 1 0 0 2 4 5 2 4 4 1 2 generic player 2 1 2 You see a player who should type '@describe me as ...'. 2 5 4 2 0 130343 0 750664969 2 1 #7 generic exit 152 2 -1 -1 -1 1 -1 52 11 invoke 2 173 -1 move 2 173 -1 recycle 2 165 -1 leave_msg oleave_msg arrive_msg oarrive_msg nogo_msg onogo_msg 2 173 -1 set_name 2 173 -1 set_aliases 2 173 -1 announce_all_but 2 173 -1 defaulting_oleave_msg 2 173 -1 moveto 2 173 -1 examine_key 2 173 -1 announce_msg 2 173 -1 9 obvious source dest nogo_msg onogo_msg arrive_msg oarrive_msg oleave_msg leave_msg 13 0 1 2 5 1 -1 2 5 1 -1 2 5 0 0 2 5 0 0 2 5 0 0 2 5 0 0 2 5 0 0 2 5 0 0 2 5 5 2 4 4 1 2 generic exit 2 5 5 2 5 4 2 0 5828 0 751010400 2 1 #8 generic container 152 2 -1 -1 -1 5 -1 9 14 p*ut in*sert d*rop 2 157 3 re*move ta*ke g*et 2 157 5 look_self 2 173 -1 acceptable 2 173 -1 open 2 45 -1 @lock_for_open 2 105 0 is_openable_by 2 173 -1 close 2 45 -1 @unlock_for_open 2 41 -1 tell_contents 2 173 -1 set_opened 2 165 -1 @opacity 2 97 12 set_opaque 2 165 -1 oclose_msg close_msg oopen_msg open_msg oput_fail_msg put_fail_msg oremove_fail_msg oremove_msg remove_fail_msg remove_msg oput_msg put_msg oopen_fail_msg open_fail_msg empty_msg 38 165 -1 19 oclose_msg close_msg oopen_msg open_msg oput_fail_msg put_fail_msg opaque dark oremove_fail_msg oremove_msg remove_fail_msg remove_msg oput_msg put_msg oopen_fail_msg open_fail_msg empty_msg opened open_key 31 2 closes %d. 2 5 2 You close %d. 2 5 2 opens %d. 2 5 2 You open %d. 2 5 2 2 5 2 You can't put %d in that. 2 5 0 1 2 1 0 0 2 1 2 2 5 2 removes %d from %i. 2 5 2 You can't remove that. 2 5 2 You remove %d from %i. 2 5 2 puts %d in %i. 2 5 2 You put %d in %i. 2 5 2 2 5 2 You can't open that. 2 5 2 It is empty. 2 5 0 1 2 1 0 0 2 4 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 4 4 1 2 generic container 2 5 5 2 5 4 2 0 7218 0 750664969 2 1 #9 generic note 152 2 -1 -1 -1 5 10 62 11 r*ead 2 45 -1 er*ase 2 45 -1 wr*ite 2 157 4 del*ete rem*ove 2 153 5 encrypt 2 97 0 decrypt 2 33 -1 text 2 173 -1 is_readable_by 2 173 -1 set_text 2 173 -1 is_writable_by 2 173 -1 mailme @mailme 2 41 -1 3 writers encryption_key text 15 4 0 2 5 0 0 2 4 4 0 2 4 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 4 4 1 2 generic note 2 5 2 There appears to be some writing on the note ... 2 5 4 2 0 4808 0 750664972 2 1 #10 a newspaper 16 2 11 -1 2 9 -1 55 8 description 2 173 -1 read 2 45 -1 check 2 173 -1 touch 2 45 -1 init_for_core 2 173 -1 announce_new_edition 2 173 -1 gc garbage_collect 2 41 -1 set_text 2 173 -1 3 readtimes readers last_write_time 18 4 0 2 5 4 0 2 5 0 751265161 2 5 4 0 2 5 5 2 4 4 1 2 There's no news unless you write it. 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 38 5 5 38 5 5 38 5 2 Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up. 38 5 1 10 2 4 4 2 2 newspaper 2 a newspaper 38 5 2 It's the latest issue of the MOO Herald-Examiner, dated %d. 38 5 4 2 0 51231 0 750665048 2 1 #11 The First Room 16 38 -1 10 -1 3 -1 -1 5 keep_clean 2 173 -1 disfunc 2 173 -1 enterfunc 2 173 -1 match 38 173 -1 init_for_core 2 173 -1 1 body_bag 18 1 25489 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 4 0 38 4 5 38 5 5 38 5 4 0 38 4 5 38 5 5 38 5 5 38 4 4 0 38 5 2 This is all there is right now. 38 5 5 2 1 #12 Login Commands 16 2 -1 -1 -1 1 -1 67 24 ? 2 93 -1 h*elp @h*elp 2 93 -1 w*ho @w*ho 2 93 -1 co*nnect @co*nnect 2 93 -1 cr*eate @cr*eate 2 93 -1 q*uit @q*uit 2 93 -1 up*time @up*time 2 93 -1 v*ersion @v*ersion 2 93 -1 parse_command 2 165 -1 check_for_shutdown 2 173 -1 check_player_db 2 173 -1 _match_player 2 165 -1 notify 2 165 -1 tell 38 173 -1 player_creation_enabled 2 173 -1 newt_registration_string registration_string 2 173 -1 init_for_core 2 173 -1 special_action 2 164 -1 blacklisted graylisted redlisted spooflisted 2 165 -1 blacklist_add graylist_add redlist_add spooflist_add 2 173 -1 blacklist_remove graylist_remove redlist_remove spooflist_remove 2 173 -1 listname 2 173 -1 record_connection 2 173 -1 who(vanilla) 2 173 -1 17 welcome_message newt_registration_string registration_string registration_address create_enabled bogus_command blank_command graylist blacklist redlist who_masks_wizards max_player_name spooflist ignored max_connections unlimited_hosts connection_limit_msg 21 4 5 2 Welcome to the LambdaCore database. 2 2 Type 'connect wizard' to log in. 2 2 You will probably want to change this text, which is stored in $login.welcome_message. 2 5 2 Your character is temporarily hosed. 2 5 2 Character creation is disabled. 2 5 2 2 5 0 1 2 5 2 ? 2 1 2 help 2 1 4 2 4 0 4 0 2 0 4 2 4 0 4 0 2 0 4 2 4 0 4 0 2 0 0 0 2 0 0 40 2 5 4 2 4 0 4 0 2 0 4 0 2 5 0 999999 38 5 4 1 2 localhost 2 5 2 ***** There are too many players connected. Please wait a few *MINUTES* before trying again. **** 38 0 5 2 4 4 1 2 Login Commands 2 5 2 This provides everything needed by #0:do_login_command. See `help $login' on $core_help for details. 2 5 4 2 0 22593 0 751013345 2 1 #13 Player Last_huh Verbs 16 2 -1 -1 -1 1 -1 12 4 @* 2 165 -1 give hand 2 173 -1 get take 2 173 -1 drop throw 2 173 -1 0 4 5 2 4 4 1 2 Player Last_huh Verbs 2 5 2 A repository of last-resort player verbs to be called by $player:last_huh 2 5 4 2 0 5157 0 750666092 2 1 #14 Guest Log 0 2 -1 -1 -1 1 -1 13 3 enter 2 173 -1 last 2 157 4 init_for_core 2 173 -1 1 connections 5 4 0 2 0 5 2 4 4 1 2 Guest Log 2 5 5 2 5 4 2 0 9176 0 750668096 2 1 #15 Generic BigList Utilities 144 38 -1 -1 -1 1 -1 73 25 length 38 173 -1 find_nth 38 173 -1 find_ord 38 173 -1 set_nth 38 173 -1 kill 38 173 -1 insert_after insert_before 38 173 -1 extract_range 38 173 -1 delete_range 38 173 -1 keep_range 38 173 -1 insert_last 38 173 -1 start 38 173 -1 next 38 173 -1 _find_nth 38 173 -1 _find_ord 38 173 -1 _set_nth 38 173 -1 _skill 38 173 -1 _extract 38 173 -1 _merge 38 173 -1 _smerge 38 173 -1 _split 38 173 -1 _rmerge 38 173 -1 _scrunch 38 173 -1 _listfind_nth 38 173 -1 _insertfirst 38 173 -1 debug 38 173 -1 2 about maxfanout 6 4 15 2 Implementation notes 2 -------------------- 2 Each biglist is actually a tree (a kind of B-tree, actually). 2 The routines above pass around handles of the form 2 2 {root_node, size, leftmost_ord} 2 2 where root_node is the (string) name of a property that holds the root of the tree, size is the number of leaves in the tree, and leftmost_ord is the :_ord value of the leftmost element of the list (i.e., the leftmost leaf). 2 Each node property has a value of the form 2 2 {height,list of subtrees}. 2 2 where the each of the subtrees is itself a 3-element list as above unless 2 the height is 0, in which case the subtrees are actually biglist elements of the arbitrary form determined by the home object. 2 At every level, each node except the rightmost has between this.maxfanout/2 and this.maxfanout subtrees; the rightmost is allowed to have as few as 1 subtree. 38 5 0 7 38 5 5 38 4 4 2 2 ghblu 2 biglist_utils 38 1 4 73 2 Generic BigList Utilities 2 ---------------------------- 2 This is a package for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}). The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object. It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of this one; this object merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation. 2 2 All of the utilities below refer to `caller' to locate the home object. Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself. The home object needs to define the following verbs 2 2 :_make(@args) => new property on home object with value args 2 :_kill(prop) delete a given property that was created by :_make 2 :_get(prop) => home.prop 2 :_put(prop,@args) set home.prop = args 2 :_ord(element) given something that is of the form of a biglist element 2 return the corresponding ordinal (for sorting purposes). 2 If you never intend to use :find_ord, then this can be a 2 routine that always returns 0 or some other random value. 2 2 See #5546 (Generic Biglist Resident) or $big_mail_recipient 2 for examples. 2 2 Those of the following routines that take a biglist argument are expecting 2 either {} (empty biglist) or some biglist returned by one of the other routines 2 2 :length(biglist) => length(biglist) (i.e., number of elements) 2 :find_nth(biglist,n) => biglist[n] 2 :find_ord(biglist,k,comp) => n where n is 2 the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or 2 the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true. 2 Always returns a value between 0 and length(biglist) inclusive. 2 This assumes biglist to be sorted in order of increasing :_ord values 2 with respect to home:(comp)(). 2 Standard situation is :_ord returns a number and comp is a < verb. 2 2 :start(biglist,s,e) => {biglist[s..?],@handle} or {} 2 :next(@handle) => {biglist[?+1..??],@newhandle} or {} 2 These two are used for iterating over a range of elements of a biglist 2 The canonical incantation for doing 2 for elt in (biglist[first..last]) 2 ... 2 endfor 2 is 2 handle = :start(biglist,first,last); 2 while(handle) 2 for elt in (handle[1]) 2 ... 2 endfor 2 handle = :next(@listdelete(handle,1)); 2 endwhile 2 2 The following all destructively modify their biglist argument(s) L (and M). 2 2 :set_nth(L,n,value) => L[n] = value 2 replaces the indicated element 2 2 :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]} 2 :insert_after (L,M,n) => {@L[1..n], @M,@L[n+1..length(L)]} 2 takes two distinct biglists, inserts one into the other at the given point 2 returns the resulting consolidated biglist 2 2 :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 2 breaks the given biglist into two distinct biglists. 2 2 :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]} 2 :keep_range (L,m,n[,leafkiller]) => L[m..n] 2 like extract_range only we destroy what we don't want. 2 2 :insertlast(L,value) => {@L,value} 2 inserts a new element at the end of biglist. 2 If find_ord is to continue to work properly, it is assumed that the 2 home:_ord(elt) is greater (comp-wise) than all of the :_ord values 2 of elements currently in the biglist. 2 2 :kill(L[,leafkiller]) 2 destroys all nodes used by biglist. 2 Calls home:leafkiller on each element. 38 5 4 2 0 24940 0 750668545 2 1 #16 Generic Large-Capacity Mail Recipient 144 38 -1 -1 -1 46 19 70 40 _genprop 38 173 -1 _make 2 173 -1 _kill 2 165 -1 _get 38 165 -1 _put 38 173 -1 _ord 38 173 -1 _makemsg 38 173 -1 _killmsg 38 173 -1 _message_num 38 173 -1 _message_date 38 173 -1 _message_hdr 38 173 -1 _message_text 38 173 -1 _lt_msgnum 38 173 -1 _lt_msgdate 38 173 -1 receive_batch 38 173 -1 receive_message 38 173 -1 messages_in_seq 38 173 -1 display_seq_headers 38 173 -1 display_seq_full 38 173 -1 list_rmm 38 173 -1 undo_rmm 38 173 -1 expunge_rmm 38 173 -1 rm_message_seq 38 165 -1 renumber 38 173 -1 length_all_msgs 38 173 -1 length_num_le 38 173 -1 length_date_le 38 173 -1 exists_num_eq 38 173 -1 new_message_num 38 173 -1 from_msg_seq 38 173 -1 %from_msg_seq 38 173 -1 to_msg_seq 38 173 -1 %to_msg_seq 38 173 -1 subject_msg_seq 38 173 -1 body_msg_seq 38 173 -1 date_sort 38 173 -1 _fix_last_msg_date 38 173 -1 __fix 38 173 -1 init_for_core 38 173 -1 length_date_gt 38 173 -1 4 summary_uses_body _mgr mowner _genprop 22 0 0 38 5 1 15 38 5 1 38 38 1 2 38 1 5 38 5 0 0 38 1 4 0 38 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 1 5 38 1 5 38 5 5 38 1 5 38 0 5 38 5 5 38 5 5 38 4 4 1 2 Generic Large-Capacity Mail Recipient 38 1 4 24 2 Generic Large Capacity Mail Recipient 2 ------------------------------------- 2 Since any modifications to large lists entail copying the entire list 2 over, operations on ordinary mail recipients having large numbers of 2 messages, that actually change the content of .messages will take 2 inordinately long. Thus we have this version which makes use of the 2 $biglist package, scattering the messages onto numerous properties so 2 that write operations involving only a few messages will not require 2 recopying of the entire list. 2 2 In nearly all respects it behaves as the ordinary Mail Recipient, 2 except that it is faster for certain kinds of operations. 2 2 Certain unimplemented verbs, like :date_sort(), and :messages() 2 currently return E_VERBNF. 2 2 To convert an existing $mail_recipient-child (call it #MR) into a 2 $big_mail_recipient-child the basic procedure is 2 2 ;;something.foo= #MR:messages(); 2 @rmm 1-$ from #MR 2 @unrmm expunge 2 @chparent #MR to $big_mail_recipient 2 ;#MR:receive_batch(@something.foo); 38 5 4 2 0 22901 0 750669076 2 1 #17 The Body Bag 16 2 -1 -1 -1 1 -1 29 3 acceptable 2 173 -1 confunc 2 173 -1 who_location_msg 38 173 -1 0 4 5 2 4 4 1 2 The Body Bag 2 5 5 2 5 4 2 0 583 0 750756028 2 1 #18 Registration Database 0 38 -1 -1 -1 39 -1 34 6 find* _only 38 173 -1 add 38 173 -1 init_for_core 38 173 -1 suspicious_address 2 173 -1 suspicious_userid 2 173 -1 describe_registration 2 173 -1 1 registrar 8 1 2 38 5 2 38 5 5 38 1 4 4 2 2 4 0 4 0 38 0 5 38 4 4 1 2 Registration Database 38 5 5 38 5 4 2 0 594818 0 750668532 2 1 #19 Player-Creation-Log 0 38 -1 -1 -1 16 -1 -1 4 display_seq_headers 2 173 -1 msg_summary_line 2 173 -1 init_for_core 2 173 -1 is_usable_by 38 165 -1 1 autoregistration_player 23 1 49853 38 5 0 1 38 5 1 15 38 5 1 38 38 1 2 38 1 5 38 5 0 751254194 38 1 4 0 38 0 0 1 38 5 2 %n (%#) can't send to moderated list %t (%[#t]) directly. 38 5 4 0 38 5 4 0 38 5 4 1 1 2 38 1 4 2 1 2 1 19 38 1 0 2592000 38 5 0 0 38 1 4 0 38 0 5 38 5 5 38 5 5 38 4 4 3 2 Player-Creation-Log 2 Player_Creation_Log 2 PCL 38 1 2 Log of player creations. 38 5 4 2 0 390145 0 751012092 2 1 #20 string utilities 24 2 -1 -1 -1 1 -1 21 66 space 38 173 -1 left 38 173 -1 right 38 173 -1 centre center 38 173 -1 columnize columnise 38 173 -1 from_list 38 173 -1 english_list 38 173 -1 names_of 38 173 -1 from_seconds 38 173 -1 trim 38 173 -1 triml 38 173 -1 trimr 38 173 -1 strip_chars 38 173 -1 strip_all_but 38 173 -1 uppercase lowercase 38 173 -1 capitalize capitalise 38 173 -1 literal_object 38 173 -1 match 38 165 -1 match_str*ing 38 173 -1 match_object 38 173 -1 match_player 38 173 -1 match_player_or_object 38 173 -1 find_prefix 38 173 -1 index_d*elimited 38 165 -1 is_numeric 38 173 -1 ordinal 38 173 -1 group_number 38 173 -1 english_number 2 173 -1 english_ordinal 38 173 -1 english_ones 38 173 -1 english_tens 38 173 -1 subst*itute 38 173 -1 substitute_d*elimited 2 13 -1 _cap_property 2 165 -1 pronoun_sub 2 173 -1 pronoun_sub_secure 38 173 -1 pronoun_quote 38 173 -1 alt_pronoun_sub 2 13 -1 explode 38 173 -1 words 38 173 -1 word_start 38 173 -1 to_value 38 173 -1 prefix_to_value 38 173 -1 _tolist 38 173 -1 _unquote 38 173 -1 _toscalar 38 173 -1 parse_command 2 173 -1 from_value 2 173 -1 print 38 173 -1 print_suspended 2 173 -1 reverse 38 173 -1 char_list 38 173 -1 regexp_quote 38 173 -1 connection_hostname_bsd 38 173 -1 connection_hostname 38 173 -1 from_value_suspended 2 173 -1 end_expression 38 173 -1 first_word 38 173 -1 common 38 173 -1 title_list*c list_title*c 38 173 -1 name_and_number nn 38 173 -1 name_and_number_list 38 173 -1 columnize_suspended columnise_suspended 38 173 -1 a_or_an 38 173 -1 index_all 38 173 -1 match_stringlist match_string_list 38 165 -1 5 digits ascii alphabet use_article_a use_article_an 9 2 0123456789 2 5 2 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ 2 5 2 abcdefghijklmnopqrstuvwxyz 2 5 4 5 2 unit 2 unix 2 one 2 once 2 utility 38 1 4 0 38 1 5 2 4 4 2 2 string 2 utils 2 5 4 72 2 For a complete description of a given verb, do `help $string_utils:verbname' 2 2 Conversion routines: 2 2 :from_list (list [,sep]) => "foo1foo2foo3" 2 :english_list (str-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3" 2 :title_list*c (obj-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3" 2 or => "Foo1, foo2, and foo3" 2 :from_value (value [,quoteflag [,maxlistdepth]]) => "{foo1, foo2, foo3}" 2 2 :to_value (string) => {success?, value or error message} 2 :prefix_to_value(string) => {rest of string, value} or {0, error message} 2 2 :english_number(42) => "forty-two" 2 :english_ordinal(42) => "forty-second" 2 :ordinal(42) => "42nd" 2 :group_number(42135 [,sep]) => "42,135" 2 2 Type checking: 2 2 :is_numeric (string) => return true if string is composed entirely of digits 2 2 Parsing: 2 2 :explode (string,char) -- string => list of words delimited by char 2 :words (string) -- string => list of words (as with command line parser) 2 :word_start (string) -- string => list of start-end pairs. 2 2 Matching: 2 2 :match_string (string, pattern, options) => * wildcard matching 2 :find_prefix (prefix, string-list)=>list index of element starting with prefix 2 :index_delimited(string,target[,case]) =>index of delimited string occurrence 2 :match (string, [obj-list, prop-name]+) => matching object 2 :match_player (string-list[,me-object]) => list of matching players 2 :match_object (string, location) => default object match... 2 :literal_object (string) => match against #xxx, $foo 2 :match_stringlist (string, targets) => match against static strings 2 :match_string (string, wildcard target) => match against a wildcard 2 2 Pretty printing: 2 2 :space (n/string[,filler]) => n spaces 2 :left (string,width[,filler]) => left justified string in field 2 :right (string,width[,filler]) => right justified string in field 2 :center/re (string,width[,filler]) => centered string in field 2 :columnize/se (list,n[,width]) => list of strings in n columns 2 2 Substitutions 2 2 :substitute (string,subst_list [,case]) -- general substitutions. 2 :pronoun_sub (string/list[,who[,thing[,location]]]) 2 -- pronoun substitutions. 2 :pronoun_sub_secure (string[,who[,thing[,location]]],default) 2 -- substitute and check for names. 2 :pronoun_quote (string/list/subst_list) -- quoting for pronoun substitutions. 2 2 Miscellaneous string munging: 2 2 :trim (string) => string with outside whitespace removed. 2 :triml (string) => string with leading whitespace removed. 2 :trimr (string) => string with trailing whitespace removed. 2 :strip_chars (string,chars) => string with all chars in `chars' removed. 2 :strip_all_but(string,chars) => string with all chars not in `chars' removed. 2 :capitalize/se(string) => string with first letter capitalized. 2 :uppercase/lowercase(string) => string with all letters upper or lowercase. 2 :names_of (list of OBJ) => string with names and object numbers of items. 2 :a_or_an (word) => "a" or "an" as appropriate for that word. 2 2 A useful property: 2 2 .alphabet => "abcdefghijklmnopqrstuvwxyz" 2 5 4 2 0 71124 0 750665274 2 1 #21 building utilities 24 2 -1 -1 -1 1 -1 42 9 make_exit 2 173 -1 set_names 2 165 -1 recreate 2 173 -1 transfer_ownership(useless) 2 169 -1 parse_names 2 173 -1 audit_object_category 2 173 -1 object_audit_string 2 173 -1 do_audit do_prospectus 2 173 -1 do_audit_item 2 173 -1 0 4 5 2 4 4 2 2 building 2 utils 2 5 4 13 2 Verbs useful for building. For a complete description of a given verb, do `help $building_utils:verbname'. 2 2 make_exit(spec,source,dest[,don't-really-create]) => a new exit 2 spec is an exit-spec as described in `help @dig' 2 2 set_names(object, spec) - sets name and aliases for an object 2 parse_names(spec) => list of {name, aliases} 2 in both of these, spec is of the form 2 <name>[[,:]<alias>,<alias>,...] 2 (as described in `help @rename') 2 2 recreate(object, newparent) - effectively recycle and recreate object 2 as a child of newparent 2 5 4 2 0 11639 0 750665278 2 1 #22 Verb Help DB 16 38 -1 -1 -1 1 -1 14 3 find_topics 38 173 -1 get_topic 2 173 -1 dump_topic 2 173 -1 0 4 5 38 4 4 2 2 verbhelp 2 vh 38 5 2 A `help database' that knows about all of the documented verbs. 38 5 4 2 0 2482 0 750666106 2 1 #23 Core Utility Help 16 38 -1 -1 -1 32 -1 -1 3 find_topics 38 165 -1 get_topic 38 173 -1 dump_topic 2 173 -1 31 $login $container $mail_agent MR-subscribing MR-naming MR-access $mail_recipient receiving-mail mail-format mail-resolve sending-mail mail-system $player_db core-index object-matching $no_one $exit $room $help $generic_db $generic_editor $generic_help $generic_options MR-sequences MR-reading MR-writing MR-searching $housekeeper $recycler $error $biglist 36 4 70 2 $login 2 ------ 2 This object manages command parsing for unconnected players and governs the initiation of an actual connection. There are verbs pertaining to registration, controlling player creation, and doing site-locks (see `help blacklist' on $wiz_help). 2 2 COMMANDS FOR UNCONNECTED PLAYERS 2 2 Recall that for each line that an unconnected player types, the server parses that line into words (the same way normal commands are parsed into a list of words that is then assigned to `args') and then #0:do_login_command is called. 2 2 :parse_command (@args) => {verb, @args} 2 given the sequence of arguments that were fed to #0:do_login_command 2 this returns the name of a verb on $login to be called together with a 2 list of arguments to be passed to it. 2 2 By default this just returns args iff args[1] names an actual verb on $login that is +x and has args {"any","none","any"}. Otherwise, it returns one of 2 2 .blank_command -- verb to call if command line is empty 2 .bogus_command -- verb to call if command line otherwise unintelligible 2 2 In both cases :parse_command returns a verbname followed by the entire args list passed to it (including the would-be verb at the beginning if any). 2 2 Currently the following verbs are availabe to non-connected players 2 2 h*elp @h*elp -- print .welcome_message 2 ? -- print a short list of available commands 2 w*ho @w*ho -- print a list of logged in players (excluding wizards) 2 co*nnect @co*nnect -- connect to an existing player 2 cr*eate @cr*eate -- create a new player 2 up*time @up*time -- tell how long the server has been running 2 version @version -- tell which version of the server is running 2 q*uit @q*uit -- logoff 2 2 Adding a new command is fairly straightforward; just create a verb on $login, making sure a previous verb doesn't already match the name you want to give it. Then give it args of "any" "none "any" and make sure it is +x. Such a verb should begin with `if (caller != #0) return E_PERM; ...' so as to prevent anyone other from a not-logged-in player from making use of it. 2 2 CUSTOMIZATIONS 2 2 .welcome_message 2 -- the message for "help" to print. 2 .create_enabled 2 == 0 => @create prints .registration_string if one tries to use it 2 == 1 => anyone from a non-blacklisted site (see `help blacklist') 2 may use @create to make a new player 2 2 .registration_address 2 -- an email address for character creation requests 2 .registration_string 2 -- string to print to players to give them information about how to get 2 a character created for them, .registration_address is substituted 2 for %e, % for %% 2 .newt_registration_string 2 -- string to print to @newted players (see `help @newt'). 2 same substitutions as for .registration_string. 2 2 Other verbs 2 :registration_string() => .registration_string with substitutions 2 :newt_registration_string() => .newt_registration_string with substitutions 2 :player_creation_enabled(connection) 2 decides whether someone on connection should be allowed to create 2 a player. If you decide this shouldn't depend strictly on the blacklist 2 and on the value of .create_enabled, here's where the extra code can go. 2 :check_for_shutdown() 2 prints a warning message to append to the login banner in the event 2 that the server will be going down soon. 2 :check_player_db() 2 prints a warning message to append to the login banner in the event 2 that $player_db is being reloaded to warn players that their character 2 names might not be recognized. 2 2 SITE LOCKS 2 see `help blacklist' 2 38 5 4 29 2 The Generic Container (for programmers) 2 2 In addition to the command verbs described under `help containers' 2 and the _msg properties described in `help container-messages', 2 the following verbs and properties are available for use within programs 2 2 .opened == TRUE iff the container is open 2 .dark == TRUE iff the contents of the container may be seen 2 .opaque -- describes the correlation between .open and .dark 2 == 0 container is always !dark 2 == 1 container is dark iff it is closed 2 == 2 container is always dark 2 2 :set_opaque(newvalue) 2 changes the .opaque value for the container 2 => newvalue or E_PERM or E_INVARG 2 2 :set_opened(newvalue) 2 opens/closes the container (updates .open and .dark) according to newvalue 2 => newvalue or E_PERM 2 2 :is_openable_by(player) 2 what the :open command uses to test whether the player should be able to open 2 the container. By default this refers to .open_key (set by 2 @(un)lock_for_open), but the object owner is free to customize this. 2 2 N.B.: There is no way to directly set .dark; .dark can be changed only by 2 changing one of .opaque or .opened. Use :set_opaque(0) and :set_opaque(2) 2 to have .dark change independently of the value of .opened. 38 5 4 68 2 $mail_agent 2 2 This object contains a two distinct sets of routines: 2 2 1. utilities for performing basic mailsystem functions, e.g., 2 matching on recipient names, resolving mail forwarding, 2 formatting messages, sending messages 2 2 Recipient Matching 2 2 match - match on a $mail_recipient 2 match_recipient - match on either a $mail_recipient or a player 2 match_failed - print angry messages to the user for $failed/ambiguous_match 2 2 look_self - provides a list of available $mail_recipients 2 check_names 2 touch 2 accept 2 2 Message Format 2 2 make_message - produces a message in the canonical transmission format 2 name - single recipient => string for address field 2 name_list - list of recipients => string for address field 2 parse_address_field - address field string => object list 2 2 Sending Messages 2 2 send_message - advertised message sending routine. 2 raw_send - raw message sending routine 2 (only called by $mail_editor:send and this:send_message) 2 resolve_addr - converts a given list recipients into a list of actual 2 recipients and objects to be notified. 2 sends_to - Does X forward (transitively) to Y 2 2 Mail Options 2 2 option 2 option_verbose 2 2 2. canonical versions of mail_recipient verbs 2 2 Ideally, the verbs to perform operations on a given mail recipient would be located on the recipient itself, except for the fact that these verbs also need to be located on players, which for various reasons, shouldn't be children of $mail_recipient. Multiple inheritance would solve our problems, but we don't have it yet. Ergo, both $mail_recipient and $player refer to the following verbs here: 2 2 display_seq_full print entire text of messages (@read) 2 display_seq_headers print headers of messages (@mail) 2 rm_message_seq remove messages (@rmm) 2 undo_rmm undo last rm_message_seq (@unrmm) 2 expunge_rmm flush removed messages (@unrmm expunge) 2 list_rmm list removed messages (@unrmm list) 2 renumber renumber messages (@renumber) 2 msg_summary_line msg header => display_seq_headers/list_rmm summary line 2 2 parse_message_seq command line msg sequence spec => message sequence 2 new_message_num => message number of next new message 2 length_all_msgs => number of messages (total) 2 length_num_le => number of messages numbered <= some number 2 length_date_le => number of messages dated <= some date 2 exists_num_eq => true iff there exists a messsage with the given number 2 from_msg_seq => message sequence of msgs from given sender(s) 2 to_msg_seq => message sequence of msgs to given recipient(s) 2 subject_msg_seq => message sequence of msgs with subjects containing text 2 body_msg_seq => message sequence of msgs with bodies containing text 2 messages_in_seq => list of {message number, message} pairs 2 2 messages == :messages_in_seq(1,:length_all_msgs()+1) (obsolete) 2 2 The $mail_agent versions of these verbs are set_task_perms(caller_perms()) and perform their operations on caller, which in turn is assumed to have done any necessary security checks. 38 5 4 38 2 Subscribing to Mail Recipients 2 ------------------------------ 2 There are two notions of being "subscribed" to a mailing list/recipient. 2 2 (1) Hard subscribed == being on the recipient's .mail_forward list so that mail sent to this list is forwarded to one's own .messages as well (see `help mail-forwarding'). 2 2 (2) Soft subscribed == keeping track of a current message for this recipient and (optionally) being on the recipient's .mail_notify list. 2 2 2 Each player has a .current_message property that contains, for each recipient the player cares to keep track of, a current message number and a last read date. 2 2 player:current_message(rcpt) (somewhat obsolete) 2 => player's current message number for rcpt 2 2 player:get_current_message(rcpt) 2 => player's {current message number for rcpt, last-read-date for rcpt} 2 2 player:make_current_message(rcpt) 2 => adds a current_message entry for rcpt (NOOP if rcpt == player) 2 2 player:set_current_message(rcpt,n|E_NONE,[,date]) 2 => sets player's current message number for rcpt to n iff n!=E_NONE 2 updates the last-read-date for rcpt to date iff date > last-read-date 2 2 player:kill_current_message(rcpt) 2 => removes current-message info for rcpt (NOOP if rcpt == player) 2 2 2 On $mail_recipient, .mail_forward and .mail_notify are -c so one needs to use the following verbs to actually modify them. 2 2 :add_forward(@new_recipients) 2 :delete_forward(@recpients) 2 :add_notify(@new_notifiees) 2 :delete_notify(@notifiees) 2 2 A recipient's owner is, of course, allowed to make arbitrary changes to .mail_forward and .mail_notify. However, the default versions of these verbs also allow any player to add him/herself to a recipient's .mail_forward or .mail_notify if the recipient is readable (see `help MR-access') by him/her. 2 2 Likewise any player may use the :delete* verbs to delete him/herself from any .mail_forward/.mail_notify list, regardless of his actual access to the list. 38 5 4 15 2 One may always refer to a list by its object number. In order to refer to it by name, it must be contained in $mail_agent, which holds all mailing lists, i.e., those that you want others to be able to refer to by name. 2 2 The .aliases field holds the names by which one may refer to the list, but only those names not containing spaces actually count for anything. As with certain other types of objects (e.g., players), set_aliases() needs to be called in order to change the .aliases field. 2 2 $mail_agent:match(name) 2 is the canonical way to obtain the objectid of a mailing list 2 given the name ("*" is assumed; an initial "*" will be dropped). 2 2 $mail_agent:match_recipient(name) 2 is the canonical way to obtain the objectid of a list or player 2 matching the given name. An initial "*" indicates that this is 2 supposed to be a list. 2 2 $mail_agent:match_failed(objid,name) 2 is the mail_recipient counterpart to $command_utils:object_match_failed 38 5 4 32 2 Controlling Access to Mail Recipients 2 ------------------------------------- 2 :is_writable_by(one) - one may alter/add/remove saved messages 2 :is_readable_by(one) - one may read messages. 2 :is_usable_by(one) - one may send to this list 2 2 By default, these verbs refer to the following properties: 2 2 writers - list of players other from the owner who can do anything 2 readers - if == 1, indicates a public mailing list. 2 list of additional readers (by default anyone who receives mail 2 sent to the list can read the saved messages). 2 moderated - if false, indicates a normal mail recipient everyone can send to. 2 otherwise this should be a list of approved senders. 2 2 Terminology: 2 A mailing list is "public" if everyone can read it. 2 A mailing list is "moderated" if not everyone can send to it. 2 2 Note that while being able to write to a recipient implies being able to read from it or send to it, neither of read-ability or send-ability implies the other. 2 2 It is highly recommended that if you are creating custom mail recipients with variable reader/sender lists, i.e., you find you need to write your own :is_readable/usable/writabe_by verbs, you are best off if such verbs are of the form 2 2 return pass(@args) || << your_test(args[1]) >> 2 2 and have .writers == .readers == {} and .moderated == 1. This will ensure 2 (1) wizards having write access 2 --- necessary in order for :receive_message to work 2 (2) writers being able to read and send (the converse being a ludicrous 2 situation), 2 (3) persons on the mail_forward list of someone with reader access will also 2 have read access (convenient). 38 5 4 19 2 Generic Mail Recipient 2 ---------------------- 2 A "mail recipient" is, by definition, an object that can be sent mail. 2 Mail recipients must either be players or descendants of $mail_recipient. 2 2 One source of confusion is that the terms "mail recipient", "mail folder", "mailing list", and "mail collection" really all refer to the same kind of object. It so happens that $mail_recipient serve several distinct functions and we tend to use whatever term happens to best match the application under discussion, e.g., it's a "mailing list" if we're playing with its .mail_forward property but it's also a "mail folder" if we're examining the messages that have been saved in it. 2 2 Note that, by default, a freshly created recipient is accessibly only by you. If you wish to make a publically accessible recipient, set .readers=1. Furthermore, if you want to allow a message on your recipient to be removed by its sender without your intervention, set .rmm_own_msgs=1. Finally, in order for other players to be able to refer to your recipient by name, the object must reside in $mail_agent. $mail_agent will not accept the object unless it has an actual description and a name distinct from all other mail recipient names/aliases. 2 2 Topics: 2 2 MR-access -- controlling read, write and send access to a recipient 2 MR-naming -- naming conventions and how to match on recipient names 2 MR-sequences -- message sequence arguments to $mail_recipient verbs 2 MR-reading -- reading messages/headers on recipients 2 MR-searching -- searching message lists for patterns in certain fields 2 MR-writing -- removing and renumbering messages 2 MR-subscribing -- updating .mail_forward, .mail_notify 2 and the story of .current_message 38 5 4 24 2 Receiving Mail 2 -------------- 2 By definition a recipient "receives" a mail message when its :receive_message verb is called with that message as an argument. 2 2 :new_message_num() 2 => number that will be assigned to the next incoming message. 2 By default this returns the maximum of the message numbers appearing in 2 messages or .messages_going, incremented by 1. If the recipient is a player 2 then the value returned will be 1 higher if it conflicts with the player's 2 current message number for him/herself. 2 2 :receive_message(msg,sender) 2 By default this first calls this:new_message_num to obtain a message number to assign to the incoming message and then appends {num,msg} to this.messages. 2 `sender', the original sender, is supplied in case one wants different 2 action depending on who is sending the message (e.g., mail-gagging). 2 The return value should be an error or string if :receive_message is considered to have failed in some way. Otherwise, a number should be returned --- this number is given to any :notify_mail routines that are called and is expected to either be 0 or the number assigned to the incoming message. 2 2 Note that :receive_message can do arbitrary things, including resending the same message to a new destination. Hacking :receive_message to resend messages is different from using .mail_forward in the following respects 2 (1) the resent message is considered to be a distinct message having this 2 object as its "author" --- i.e., the From: line will necessarily be 2 different. 2 (2) since this "forwarding" is invisible to the mailsystem, 2 there is no protection against loops and multiple copies. 2 38 5 4 34 2 Mail Transmission Format 2 ------------------------ 2 There is a standard message format used for transmitting messages. This is the format that $mail_editor:make_message produces, and that :receive_message verbs on players and $mail_recipients expect to see. The (currently experimental) @refile and @copym commands also use this format to transfer messages. 2 2 This *transmission* format is distinct from the *storage* format, though, for convenience this same format is often used as well for storing messages in player collections and ordinary $mail_recipient children though, in general, there is no requirement that this be the case. 2 2 A transmitted message is a list in the following form 2 2 date (number), 2 the time() value at the time the message was sent. 2 from (string), 2 the sending object (address list form) 2 if this is not a player, an additional header will indicate the 2 current ownership of the object. 2 to (string), 2 recipients (address list form) which can either be players 2 or $mail_recipient descendents. 2 subject (string), 2 subject of the message, or " " if there is no subject, 2 @additional optional headers (list of strings), 2 each header has the form "<header-name>: text" where <header-name>: 2 is padded out to a width of 10 columns for the convenience of 2 :display_message. Currently "Reply-to: <address list>" is the only 2 additional header in use, 2 "", 2 @body of message (list of strings) 2 2 Note that the from, to and subject lines do *not* include a header name like "From:", "To:", or "Subject:". The @'s indicate that the lists in question get spliced in (as usual), thus the entire message is a list whose first element is a number and the rest are strings. 2 2 The address lists that appear in the from and to lines is a string in the form a sequence of object ids, each enclosed in parentheses and preceded by optional text, e.g., 2 2 "*Core-DB-Issues (#8175), Rog (#4292), and Haakon (#2)" 2 2 The text is intended to give the current name of each object for the benefit of human readers, but is actually ignored by all header parsing routines. The convention is that the text is either a player name or a * followed by a mailing list name. 38 5 4 52 2 Resolving Mail Forwarding & Notification 2 ---------------------------------------- 2 For each recipient of a given mail message, the following two verbs are called to determine where the message should actually go and who should be notified about it: 2 2 :mail_forward([from]) 2 should return either 2 . a list of objects (either players or $mail_recipients) 2 to which mail for this recipient will be redirected. 2 . a string error message to be printed to the player sending the message. 2 If this recipient is one of the original destinations (i.e., not the 2 result of a previous forwarding), no mail is actually sent. 2 2 If :mail_forward returns a nonempty list, the recipient itself will *not* 2 actually receive the mail message unless it is included in the list. 2 #-1 is allowed to be on the list; it is ignored but does make the list 2 nonempty. Thus, having :mail_forward() return {#-1} is the canonical way 2 to have arriving mail disappear without being kept or forwarded. 2 2 :mail_notify([from]) 2 should return a list of objects that are to be told about any mail sent 2 to this recipient (whether or not the recipient actually receives it). 2 Said objects must have a :notify_mail verb, but other from that, there 2 is no restriction on what these can be. 2 2 object:notify_mail is called with the arguments 2 (sender,recipients,msgnumbers) where 2 recipients == list of recipients including object in .mail_notify 2 msgsnumbers == corresponding list of :receive_message return values 2 (or 0 if :receive_message is not actually called, which 2 will be the case if the recipient forwards without keeping) 2 2 When called as part of a mail send, the `from' argument is the immediate predecessor on the forwarding chain. The default versions of these verbs return the values of .mail_forward and .mail_notify respectively (pronoun_subbing if the value is a string), unless this is a moderated mailing list and `from' is an unapproved sender (see `help MR-access') in which case the following verbs are called instead: 2 2 :moderator_forward(from) 2 what :mail_forward should return for mail coming from unapproved senders 2 This returns .moderator_forward (pronoun_subbed if a string) by default. 2 2 :moderator_notify(from) 2 what :mail_notify should return for mail coming from unapproved senders 2 This returns .moderator_notify (pronoun_subbed if a string) by default. 2 2 Since the :mail_forward verbs only see the previous sender in the forwarding chain, if, e.g, B is moderated but A can send to B (i.e., B:mail_forward(A) returns an actual list), then any mail sent to A goes to B even if the original sender isn't normally allowed to send to B directly. 2 2 These verbs should all allow `from' to be omitted in which case they should return as if `from' were a generic approved sender (e.g., wizard). 2 2 It should rarely be necessary to actually modify any of :*_forward/*_notify verbs, since one has a fair amount of control over their behavior via the following properties 2 2 .mail_forward 2 .mail_notify 2 .moderated (see `help MR-access') 2 .moderator_forward 2 .moderator_notify 38 5 4 24 2 Sending Mail 2 ------------ 2 $mail_agent:send_message(from,recipients,headers,body) 2 from: sender of the message 2 (this must be you or something you own; otherwise => E_PERM) 2 recipients: object or list of objects (must all be players or 2 $mail_recipient descendants) 2 headers: either a string (contents of the Subject: line) 2 or a list {subject,replytos} replytos is a list 2 of objects designated to receive replies. 2 Use {"",replytos} to have a Reply-to: without a Subject: 2 2 This is the canonical way to send a mail message from a program. 2 This calls $mail_agent:make_message to format the arguments into an actual message (see `help mail-format') and then $mail_agent:raw_send to do the actual sending which goes as follows: 2 2 (1) Call :mail_forward on all recipients add any new recipients thus obtained to final recipient list, keep calling mail:forward on the new recipients until we obtain no additional recipients. If one of the initial recipients is invalid, is not a player or $mail_recipient, or has its mail_forward return a string error, then we print the error message and abort at this point with no mail being sent. If one of the later recipients bombs similarly, error messages are printed, but in this case mail still goes out to the other recipients. 2 2 (2) Call :mail_notify on all recipients encountered in stage (1) to get a list of objects to notify. 2 2 (3) All final recipients receive the message (see `help receive-mail') 2 (4) All notifications are delivered (using :notify_mail()) 2 2 We return {0, @failed_recipients} if we bombed out at step 1. 2 Otherwise return {1, @actual_rcpts} indicating what mail was sent. 38 5 4 13 2 Mail System 2 ----------- 2 The following topics describe the guts of the LambdaCore mail system 2 2 sending-mail -- how to send mail from a program; what happens. 2 mail-forwarding -- how to do mail forwarding/notification (the simple version) 2 mail-resolution -- how mail forwarding/notification works, in gory detail 2 receiving-mail -- what :receive_message should do 2 mail-format -- format of transmitted messages 2 mail-command-parsing (TODO) -- routines for parsing mail commands 2 2 $mail_recipient -- generic non-player mail recipient 2 $mail_agent -- mail utility object 38 5 4 34 2 2 Database of Players 2 ------------------- 2 This is an instance of the Generic Database ($generic_db) that 2 holds the {name/alias,#objectid} pairs for every 2 name and alias of every player in the MOO. 2 2 Verbs supplied include 2 2 :find(string) => player or $ambiguous_match or $failed_match 2 :find_exact(string) => player or $failed_match (does not do partial matches) 2 :find_all(string) => list of all matching players 2 2 :insert(string,player) 2 records that string is now a name or alias of player 2 :delete(string) 2 removes string from the db 2 :available(string) 2 returns 1 if string is available as a player name or alias, 2 an object if string is in use, or 0 if string is otherwise unavailable. 2 :load() 2 resets the db, inserting all current player names and aliases. 2 2 The internal representation and all of the above verbs (except :load() and 2 :available()) are as described for $generic_db. 2 2 It should be noted that for any application that involves resolving a player name from a command line, you should be using $string_utils:match_player() rather than $player_db:find(), since the former will deal correctly with other ways of referring to players apart from their names and aliases (e.g., literal object numbers, "me", "$no_one"...). 2 2 :load() needs to be done periodically as it is possible for the player db 2 to get out of synch with reality. In particular, there is currently no way 2 to block someone writing his own player :recycle() verb that neglects to 2 remove his names from the player db. 2 2 While a :load() is in progress the .frozen property is set to 1 to indicate that any results of :find*() are not to be trusted. 38 5 4 2 2 *index* 2 Core Utility Help Topics 38 5 4 64 2 2 Which :match...() Verb Do I Call? 2 --------------------------------- 2 There are many situations where one wishes to obtain an object from a room or a player's .contents whose name/aliases matches a particular string. There are four main verbs available for this and it is important to understand the distinctions between them and how they are supposed to be used. 2 2 (*) LOC:match("X") 2 -- what you get looking for something that is inside LOC and named "X". 2 By default, this looks through LOC.contents to find a unique object 2 having a name or alias that has "X" as a prefix. 2 2 Essentially, you can think of :match as a contents-matching verb, though, e.g., for rooms you also get matches on exits as well. 2 2 (*) LOC:match_object("X", YOU) [YOU defaults to player] 2 (*) YOU:my_match_object("X", LOC) [LOC defaults to player.location] 2 -- what YOU get being located at LOC and looking for something named "X". 2 By default these both return $string_utils:match_object("X",LOC,YOU) 2 2 (*) $string_utils:match_object("X", LOC, YOU) 2 -- what you *would* get *if* YOU were a typical player, YOU were inside LOC, 2 YOU were looking for something named "X", *and* LOC were a typical place. 2 2 In other words, $string_utils:match_object describes the :match_object() algorithm for "typical places" and the :my_match_object for "typical players": 2 2 (1) check for "X" being one of "", "me", "here", "$something", or "#n" 2 (2) try YOU:match("X") i.e., something in your inventory (maybe) 2 (3) try LOC:match("X") i.e., some object in the room (maybe) 2 2 The distinction between these location:match_object and player:my_match_object has to do with whether the player or the location should determine what the matching algorithm is. Which one you should use depends on the command that you are writing. If you are writing a command with a virtual-reality flavor, then you should be respecting the room owner's idea of which objects you can "see" and thus the command should be calling the location's :match_object verb. If you are writing a building/programming command where it is appropriate for the player to determine the matching algorithm --- whether because the current location is irrelevant, not to be trusted, or both --- then the player's :my_match_object verb should be called. 2 2 Examples: 2 2 `look diamond in box' 2 calls box:match("diamond"). This is a match on the contents of box. 2 2 `take ball', 2 calls player.location:match_object("ball") 2 to determine which "ball" to take. Note that if the room is dark, 2 we might not be able to find any "ball". 2 2 `@program widget:foo', 2 calls player:my_match_object("widget") to get the player's own idea 2 of what "widget" should be. Note that if I were carrying something 2 named "widget" and expecting to be programming a :foo() verb on it, 2 it would be potentially disastrous should the room where I am decide 2 for me to be programming something else (not even necessarily 2 called "widget"). 2 2 Object Matching Failures 2 ------------------------ 2 As with other matching routines, one gets back 2 2 $failed_match in the case of no matching object 2 $ambiguous_match in the case of more than one matching object 2 $nothing in the case of a blank string argument 2 2 or an object-id. In these first 3 cases, one usually wants to translate these nonresults to the player; this is what $command_utils:object_match_failed. The standard idiom to mimic what the builtin parser does, say, with the direct object is 2 2 dobj = foo:match_???(dobjstr); 2 if($command_utils:object_match_failed(dobj, dobjstr)) 2 "...give up. nothing to do. error message has already printed..."; 2 else 2 "...dobj is something useful. Continue..."; 2 ... 2 endif 38 5 4 15 2 $no_one 2 ------- 2 ..is a powerless player. He owns no objects, not even himself; nor does he own any verbs. He is, however, a programmer and thus may use eval(). 2 In fact his sole purpose is to evaluate questionable code. 2 `questionable' could be in either or both of the following senses 2 2 (1) Its origin is sufficiently uncertain so that there is no obvious way of deciding whose permissions it should run under. 2 (2) The code itself is potentially malicious, i.e., to the extent that one does not want to be evaluating it using one's own permissions. 2 2 set_task_perms($no_one); is thus the canonical idiom in wizard code for rendering anything that follows mostly harmless. For use by ordinary programmers, we have: 2 2 $no_one:eval(string) 2 2 which attempts to evaluate an arbitrary string using $no_one's permissions. 2 string is either an expression or ";" followed by one or more statements, of which the final semicolon may be omitted. return values are what eval() would return (either {1,value} or {0,@error_messages}). 38 5 4 19 2 Exits 2 ----- 2 An exit can be renamed by either the owner of the exit or the owner of its source. 2 2 The standard verbs that are called in exit movement are: 2 2 :move(object) - moves the object via this exit 2 :invoke() - equivalent to :move(player) 2 2 When an exit is invoked on a particular object (via exit:move(object)), the following occurs. 2 2 (1) The exit may be locked against the object, in which case we print the 2 nogo messages and quit. 2 2 (2) (room=exit.dest):bless_for_entry(object) is called. Assuming that exit is recognized by room as being a legitimate entrance (i.e., is in room.entrances), this will enable room:accept(object) to return true. 2 2 (3) object:moveto(room) is called and the various messages (see `help exit-messages') are :announced/:told. Note that this, in accordance with the way the builtin move() (and hence the default :moveto()) works, we get a call to room:accept(object) which checks for the room itself being locked against the object, and otherwise returns true if the blessing in the previous step worked. The move is performed, here:exitfunc(object) and room:enterfunc(object) are called. In particular, room:enterfunc clears the blessing bestowed in (2) now that it is no longer needed. 2 2 In general, the move may fail, in which case we :announce the (o)nogo_msgs. 38 5 4 81 2 The Generic Room ($room) 2 ---------------- 2 2 (1) Announcements 2 2 :announce (@text) => broadcasts to all except player 2 :announce_all (@text) => broadcasts to all 2 :announce_all_but (objects,@text) => broadcasts to all except those in objects 2 2 say, emote 2 2 2 (2) Command recovery 2 2 :huh (verb,args) - server hook: last chance to make sense of verb 2 :here_huh (verb,args) - room's last attempt to parse something 2 :here_explain_syntax (this,verb,args) - attempts to explain usage of verb 2 2 2 (3) Residency 2 2 free_home - true => @sethome allows anyone to set his .home to be here 2 residents - objects on this list may teleport in and/or set their homes here. 2 2 :accept_for_abode(player) 2 => true iff player should be allowed to set .home to this room. 2 2 @resident*s 2 2 2 (4) Looking 2 2 dark - true => contents are not visible 2 ctype - 1..4 for four different styles of .contents lists 2 2 :match (string) => exit or object in room's .contents 2 :tell_contents (objects,ctype) - format objects according to ctype, tell player 2 2 l*ook 2 2 2 (5) Entrance and exit. 2 2 :accept (object) - Called by move() and :moveto() before an object enters a room, if false is returned, movement is prevented. Protocol permits this verb to make noise (though this is discouraged) as this is the only place the room will learn the object's original location. 2 2 :acceptable (object) - Called by verbs which wish to check whether movement will be possible. Protocol prohibits this verb from making noise and requires it to return the same value as :accept would for the same arguments. 2 2 :is_unlocked_for (object) - interface with the @lock protocol. Returns true or false depending on the state of locks for the object with the room. Other things may prevent entrance even if this returns true. Protocol prohibits this verb from making noise. 2 2 :enterfunc (object) - called after entrance has succeeded. Noise is fine. 2 2 :exitfunc (object) - called after an object has successfully left. Noisemaking is fine. 2 2 (6) Topology and Movement via Exits 2 2 See `help $exit' for an explanation of how the generic $exit works. 2 2 free_entry - true => `teleporting' in is allowed 2 false => only residents may teleport in 2 exits - list of invokable exits leading from this room 2 entrances - list of recognized exits leading to this room 2 blessed_object - object currently entering via an exit 2 blessed_task - task_id for entering object 2 2 :match_exit (string) => exit whose name matches string 2 :bless_for_entry (object) - set up room to accept object arriving from entrance 2 :add_exit (exit) 2 :add_entrance (exit) 2 :remove_exit (exit) 2 :remove_entrance (exit) 2 2 e/east/w/west/s/south/n/north/ne/northeast/nw/northwest/se/southeast/sw/southwest/u/up/d/down, go, @add-exit, @add-entrance, @remove-exit, @remove-entrance, @exits, @entrances 2 2 2 (7) Ejection 2 2 victim_ejection_msg/oejection_msg/ejection_msg 2 :*_msg() messages 2 2 @eject 2 38 5 4 2 2 *forward* 2 $generic_help 38 5 4 79 2 Generic Database 2 ---------------- 2 This holds a collection of {string key, datum} pairs, where datum can be anything. At most one datum may be associated with any given string. Data may be anything (lists, strings, numbers, objectids). If you like, you can think of this as an array indexed by strings. 2 Verbs supplied include 2 2 :find(string) => datum, $ambiguous_match or $failed_match 2 :find_key(string) => full string key, $ambiguous_match or $failed_match 2 :find_exact(string) => datum or $failed_match (no partial matches) 2 :find_all(string) => list of all data corresponding to matching strings 2 :find_all_keys(string) => list of all matching strings 2 2 :insert(string,datum) 2 if the string is already present in the db, 2 changes the associated datum and returns {old_datum}; 2 otherwise enters a new {string,datum} pair and return 0. 2 :delete(string) 2 if there is a datum associated with string, 2 remove this association and return {datum}; otherwise return 0. 2 :delete2(string,datum) 2 if the given datum is associated with string, 2 removes that association and return {datum}, 2 if some other datum is associated with string, just return {other datum} 2 otherwise return 0. 2 :clearall([4|3]) 2 removes all associations from the database. 2 optional argument changes the type of the database 2 (4 is normal, 3 is a kludge for when the data are simply boolean flags 2 i.e., this is a set of strings rather than a string-indexed array; 2 more on this below) 2 2 count [entries|chars] in this 2 provide some vague statistics about how big this thing is. 2 2 N.B. As entries get made, properties belonging to $generic_db.owner will be created on the db object itself. These properties will be created having flags as specified by .node_perms, which by default is "r", but can be changed to "" should you want to ensure that randoms don't have access to the raw information. 2 2 Implementation notes 2 - - - - - - - - - - 2 The representation is as a `trie', a tree in which each internal node corresponds to a prefix shared by two or more strings in the db. 2 Each internal node is kept in a property named " "+<prefix>, where <prefix> is a prefix shared by all strings in the subtree under this node. 2 The property value is a 4 element list 2 2 this.(" "+<prefix>)[1] = <common> 2 maximal continuation shared by all strings beginning with prefix 2 i.e., all these names actually begin with <prefix>+<common> 2 2 this.(" "+<prefix>)[2] = <continuations> 2 string of all characters <c> that can follow <prefix>+<common> for which 2 there is more than one string in the db beginning with <prefix>+<common>+<c> 2 2 this.(" "+<prefix>)[3] = <exact_matches> 2 list of all strings in this subtree for which 2 the character (or lack thereof) following the <prefix>+<common> substring 2 suffices to determine the string. 2 2 this.(" "+<prefix>)[4] = <data> 2 list of data corresponding to the strings in [3]. 2 2 Child nodes are this.(" "+<prefix>+<common>+<c>) 2 for all <c> in this.(" "+<prefix>)[2]. 2 The root node is this.(" "). 2 If, e.g., there are 2 or more strings in the db beginning with a, 2 there will be a node this.(" a"). 2 If all of these strings actually begin with "ani", then this.(" a")[1]=="ni". 2 The db consisting of the 5 correspondences 2 2 {"animal", #1} 2 {"anime", #2} 2 {"anil", #3} 2 {"anile", #4} 2 {"banal", #5} 2 2 would be represented 2 2 this.(" ") =={"", "a", {"banal"}, {#5}} 2 this.(" a") =={"ni","lm", {}, {}} 2 this.(" anim")=={"", "", {"animal","anime"},{#1,#2}} 2 this.(" anil")=={"", "", {"anil","anile"}, {#3,#4}} 2 2 In some cases one may merely wish to hold a collection of strings without trying to associate a particular datum with each string. One may then instead set up a db without the fourth field on each of the properties. In this case the datum is taken to be the found string itself and that is what gets returned by :find*() in the event of a successful search. :find and :find_key are then equivalent as are :find_all and :find_all_keys. To setup the db this way, do a :clearall(3). :clearall(4) reverts to the above described type of db with a separately kept datum. Note that you can't change the type without emptying the db. 3 and 4 are currently the only db types allowed. 38 5 4 201 2 The Generic Editor enables a player to edit a list of strings. While one might contrive to use it directly, it is rather intended as a parent for some actual editor. It supplies the following commands: 2 2 say <text> w*hat 2 emote <text> abort 2 lis*t [<range>] [nonum] q*uit,done,pause 2 ins*ert [<ins>] ["<text>] 2 n*ext,p*rev [n] ["<text>] 2 del*ete [<range>] 2 f*ind /<str>[/[c][<range>]] 2 s*ubst /<str1>/<str2>[/[g][c][<range>]] 2 m*ove,c*opy [<range>] to <ins> 2 join*l [<range>] 2 fill [<range>] [@<col>] 2 2 $editor_help.(cmdname) descrbes cmdname 2 $editor_help.insert descrbes insertion points (<ins>) 2 $editor_help.ranges descrbes range specifications (<range>) 2 2 You'll notice that nowhere does it say how to load in a given list of strings or how and where one may save said list away when one is done editing. These commands are supplied by the child editor object. The generic editor contains only the code for editing lines, though it defines additional functions for use by the children: 2 2 :loaded(player) 2 returns the index (player in this.active) iff text has been loaded 2 from somewhere, otherwise returns 0. 2 2 Note that, by default, there is a difference between 2 2 having nothing loaded (:text(who)==0) and 2 having loaded something with no text (:text(who)=={}). 2 2 If you don't care about this distinction in a particular case, 2 just do (player in this.active) instead of this:loaded(player). 2 If you don't want your editor to make this distinction at all, do 2 2 @stateprop texts={} for <youreditor> 2 2 which changes the initial value of :text() to {} 2 2 In all functions below, 'who' is the index returned by :loaded(player) 2 2 BTW, be careful about using 'player' in non-user (i.e., +x this-none-this) verbs --- much better to have the user verb get the index with :loaded() and then pass that around. 2 2 Also be careful about suspend() and verbs that call suspend(). In particular, the player's index in the .active list can change during the suspend interval, so you must be sure to obtain the index (e.g., using :loaded()) again after the suspend() returns. 2 2 For your non-user verbs, we have 2 2 :ok(who) 2 returns E_PERM if the caller is not an editor verb and E_RANGE 2 if 'who' does not point to a valid session. 2 2 which should take care of the more egregious security holes (but maybe not the less egregious ones). For getting and loading text, we have 2 2 :text(who) 2 the current text string list or 0 if nothing loaded yet. 2 :load(who,text) 2 loads the given list of strings as the text to be edited. 2 this also resets the 'changed' flag and pushes the insertion 2 point to the end. 2 2 and various flags and properties (all of the set_* routines return E_PERM when not called from an editor verb, E_RANGE if who is out of bounds, E_INVARG if something is wrong with the 2nd arg, or the new value, which may not necessarily be the same as the 2nd arg (e.g., set_insertion(..,37) on a 5 line text buffer returns 6). 2 2 :changed(who) 2 has the text been altered since the last save/load? 2 (the child editor gets to define what "save" means). 2 :set_changed(who,value) 2 Any child editor command that is considered to save the text should do a 2 :set_changed(who,0). 2 Note that if the changed flag is 0, the session will be flushed when 2 the player leaves the editor, so you may also want certain commands to 2 do set_changed(who,1)... 2 2 :origin(who) 2 room where the player came from. 2 :set_origin(who,room) 2 can be used to change the room the player will return to when finished 2 editing. Since origin gets set even in cases where the player teleports 2 into the editor you probably won't usually need to do this. 2 2 :insertion(who) 2 current insertion point. 2 :set_insertion(who,linenumber) 2 linenumber needs to be a positive integer and will get 2 2 :readable(who) 2 whether the current editing session has been made globally readable. 2 :set_readable(who,boolean) 2 change the readability of the current editing session. 2 This is used by the publish/perish verbs. 2 2 We also provide 2 2 :invoke(...) 2 If the player has a previous unsaved (i.e., :changed()!=0) 2 session, we return to it, moving the player to the editor. 2 If the player is already in the editor, this has no effect other 2 than to print a few nasty messages. In any case a :changed() 2 session must be aborted or set_changed(,0) before anything else 2 can be started 2 2 Otherwise, we pass the arguments (which are assumed to be the 2 result of some munging of the command line) to :parse_invoke(), 2 move the player to the editor and load whatever parse_invoke() 2 specified. The only interpretation the generic editor makes on 2 the arguments is that if the boolean value of the first is true, 2 this indicates that the player wanted to load something as 2 opposed to resume a previous session. Usually a command calling 2 :invoke will have a true (i.e., nonzero number, nonempty list or 2 string) first arg iff the command line is nonempty, in which case 2 'args' works fine for this purpose. 2 2 If the command parses sucessfully (:parse_invoke() returns a list), 2 we move the player to the editor if necessary and then call 2 :init_session() to set things up. 2 2 The child editor is assumed to provide 2 2 :parse_invoke(...) 2 given :invoke()'s arguments, determines what the player wants to edit. 2 It either returns 0 and reports syntax errors to player, 2 or it returns some list that :init_session() will understand. 2 2 :init_session(who,@spec) 2 where spec is something that was returned by :parse_invoke(). 2 Loads the text and sets the stateprops (below) to indicate that 2 we are working on whatever it is we're suppose to be working on. 2 2 :working_on(who) 2 returns a string X as in "You are working on X." 2 This is called by the 'w*hat' command, among other things. 2 2 Child editors may have their own properties giving state information for the various editing sessions. The value of each such property will be a list giving a value for each player in the editor. For each such property, you should, once the editor object has been created, initialize the property to {} and do one of 2 2 @stateprop <propname> for <editor> 2 @stateprop <propname>=<default-value> for <editor> 2 (0 is the default <default-value>) 2 2 Henceforth, adding and deleting new editing sessions will amend the list held by the given property. The value of the property for a given session can be obtained via this.<propname>[player in this.active] and can be changed with a corresponding listset() call. The usual idiom for an editor command is 2 2 if(!(who=this:loaded(player))) 2 player:tell(nothing_loaded_msg()); 2 else 2 ... various references to this.<propname>[who] ... 2 endif 2 2 To remove such a property from the list of such state properties: 2 2 @rmstateprop <propname> from <editor> 2 2 Note that you can only do this with properties defined on the child editor itself. 2 2 Sometimes you may wish to @stateprop a new property on an editor where active editing sessions exist. @stateprop will fail if the property in question does not hold a list of the correct length (== length(editor.active); one value for each editing session). You need to either give the @flush command to clear out all sessions and boot all players currently in the editor or somehow manually initialize the property to a list of appropriate values and pray that nobody enters/exits the editor between the property initialization and the @stateprop command --- this problem can be avoided by doing an eval() that does all of the initializations (beware of suspends()) and calls :set_stateprops directly. 2 2 Incidentally, the @flush command may be used at any time to clean out the editor or to remove all sessions older than a given date. 2 2 There are also numerous _msg properties that may be customized 2 2 @depart announced at the origin when :invoke() is called. 2 @return announced at the origin the player is returned there. 2 @nothing_loaded printed when user attempts editing 2 before anything has been loaded. 2 @no_text response to 'list' when :text()=={} 2 @no_change printed by 'what' when :changed()==0 2 @change printed by 'what' when :changed()==1 2 @no_littering printed upon leaving the editor with :changed()==1. 2 @previous_session printed by :invoke() when player tries to start a 2 new session without aborting or saving the old one 2 2 The general procedure for creating a child editor: 2 2 . @create $generic_editor named <editor> 2 2 . define additional <editor> verbs/properties 2 At the very least you need 'edit' and 'save' commands. 2 Usually you can get away with just having 'edit' call :invoke(); 2 Presumably, you'll need at least a command to load text from somewhere 2 as well as a command to save it back out. 2 2 . define a verb (somewhere) to invoke the editor 2 This could be just a one-liner that calls <editor>:invoke(args,verb). 2 Either that or 2 . you have to set up an exit somewhere whose destination is <editor> 2 . you have to advertise the object number so that people can 2 teleport to it. 2 2 . @stateprop x for <editor> 2 2 . if you want the 'abort' command to boot the player from the editor do 2 <editor>.exit_on_abort = 1; 2 2 . set <editor>.commands to be the list of additional commands defined 2 by <editor>. 2 Each element of the list is itself a list of the form {name,args}. 2 set <editor>.commands2 to be the list of commands that should appear 2 in the `look' listing, and should be a list of strings appearing 2 as names in .commands on either <editor> or some editor ancestor. 2 look at $verb_editor or $note_editor for an example. 2 2 . If you want to have help text for new verbs you define, create a child of 2 $generic_help and add properties to this object for each of the topics 2 that you want to provide help text. 2 Finally, set <editor>.help = {this object} so that the help system 2 knows to consult this object. 38 5 4 76 2 The Help System 2 --------------- 2 When a player types help, the following list of objects is consulted for .help properties: the player itself, all ancestors of player up to and including $player, and, if the current location is a room, the current location together with all ancestors of the current location back to and including $room. Each help property should have as value either an object or a list of objects (otherwise we just ignore it). These objects are then strung together as a list of `help databases' to be searched in order for the requested topic. 2 2 A help database (in the sense of anything that is usable by $player:help()) is any object having the following three verbs: 2 2 :find_topics([string]) 2 where string is a supposed help topic, returns a list of strings, 2 i.e., actual help topics that this db knows about, or some boolean 2 false value in the event that this db is clueless... 2 If no arguments are given, this should return a list of all topics 2 in the db 2 2 :get_topic(string) 2 given one of the strings returned by :find_topics this either 2 returns a list of strings (text to be spewed to the player) or 2 returns 1 to indicate that it has already taken care of printing 2 information to the player. 2 2 :dump_topic(string) 2 like get_topic, but instead returns the raw text of a help topic 2 as a (download/upload) script 2 2 In short if :find_topic reports that a particular db knows about a given topic 2 it returns the full topic name, so that :get_topic may be called on it later. 2 :dump_topic is used by maintainers (see $wiz:@gethelp) to edit help topics. 2 2 $generic_help and $help 2 ----------------------- 2 The Generic Help Database, $generic_help, is the parent class of a particular kind of help database of which $help is an instance. On help databases of this type, every help topic has a corresponding property, interpreted as follows: 2 2 this.(topic) = string 2 one-line help text. 2 2 this.(topic) = {"*<verb>*",@args} 2 call this:<verb>(args,dblist) to get text where dblist is the list of 2 help objects that would have been consulted had the topic not been found 2 on this object. 2 2 this.(topic) = other list of strings 2 multi-line help text 2 2 For the {"*<verb>*",...} form, the current verbs available are 2 2 {"*forward*", topic, @rest} 2 - get help text for topic and then append the lines of `rest'. 2 rest may, in turn, begin with a "*<verb>*"... 2 2 {"*pass*", topic, @rest} 2 - get help text for topic from the first help database after this one 2 that actually has help text for topic, and then append lines of `rest'. 2 As with "*forward*" rest may, in turn, begin with a "*<verb>*"... 2 2 {"*subst*", @lines} 2 - All occurences of %[exp] in lines are replaced with the value of exp 2 which is assumed to evaluate to a string. 2 All lines beginning with %;exp are replaced with the value of exp 2 which is assumed to evaluate to a list of strings. 2 Evaluation is done using $no_one's permissions so exp in either case 2 can only refer to public information. 2 2 {"*index*", title} 2 - returns a list of all topics in this database, arranged in columns. 2 title is used as a heading for this index. 2 2 Individual help dbs are free to define additional verbs that may be used in this context. $help itself defines the following additional such verbs: 2 2 {"*index_list*"} 2 - returns a list of all index topics in all databases in the search list. 2 An index topic is one whose actual text is {"*index*", something}. 2 When creating a help db, you should be sure to make an index topic. 2 2 {"*full_index*"} 2 - prints indices for all help databases in the search list. 2 2 It should be noted (once again) that help databases need not be children of $generic_help, so long as they have :find_topics/:get_topic/:dump_topic working as specified above. 38 5 4 62 2 Generic Option Package 2 ---------------------- 2 It occasionally happens that one has a command or set of commands for which one wishes to provide several options/flags that a player can set to customize the command's behavior for him/herself. Making each option a separate property is a bit expensive, especially when the option in question is merely a boolean flag that gets set to false in most cases. This package provides an alternative, as well as providing a uniform set of commands for setting these flags/options and checking that the values given are of appropriate types. 2 2 Instead of needing several properties, only one is required to store a list containing values for all of the options. An "option package" (pkg, below) is then an object of this class, which provides routines for manipulating such lists. 2 2 The set of option names is divided into a set of "real" options, those whose names will actually appear in a given list, and "extras" which are either synonyms for or represent combinations of real options. 2 2 pkg:add_name(name) adds name to .names (remove it from .extras if there) 2 pkg:add_name(name,1) adds name to .extras (remove it from .names if there) 2 => 1 - ok, 0 - already added, E_INVARG - illegal name, E_PERM 2 2 pkg:remove_name(name) remove name from either .names or .extras 2 => 1 - ok, 0 - not present, E_PERM 2 2 For setting or retrieving values we have 2 2 pkg:get(options,name) 2 => value (or 0 if name isn't a real option) 2 pkg:set(options,name,value) 2 => revised options (or string error message if something goes wrong) 2 2 By default, a given option can only be a boolean flag, having one of the values 0 (absent from the list), or 1 (present in the list). :set translates 0/""/{} to 0 and any other non-object value to 1. 2 2 One may however designate a wider range of possible values for an option "foo" by either installing one of 2 2 pkg.type_foo 2 -- list of allowed types, 2 e.g., {NUM,STR} => must be a number or a string 2 e.g., {OBJ,{OBJ}} => must be an object or a list of objects 2 for anything fancier use: 2 2 pkg:check_foo(value) 2 => string error message or {value munged as desired} 2 2 In general, the only restriction on option values is that 0 is the only false value; setting an option to "" or {} sets it to 0. Every option defaults to 0, and no matter what you install as .type_foo or :check_foo(), 0 will always be a legal value for option "foo". 2 2 When presented with an option that is in .extras, :set will typecheck the value as described, however, then :actual(name, value) will be called to obtain a list of {name-of-real-option, value} pairs indicating which combination of real options should be set. 2 2 Other verbs 2 pkg:parse(args,...) 2 parses the command line arguments of a @whatever_option command 2 => {optionname, value} if the player wants to set an option 2 => {optionname} if the player wants to view an option 2 => string error message otherwise 2 2 one may install pkg:parse_foo to parse arguments for option "foo" 2 !foo => {"foo",0} (:parse_foo not called) 2 foo= => {"foo",0} (:parse_foo not called) 2 -foo => {"foo",0} (:parse_foo not called) 2 +foo => pkg:parse_foo("foo",1) 2 foo=word => pkg:parse_foo("foo","word") 2 foo word1 word2 => pkg:parse_foo("foo",{"word1","word2"}) 2 foo is word1 word2 => pkg:parse_foo("foo",{"word1","word2"}) 2 2 pkg:show(options,name|list of names) 2 => list of strings describing the current value of the named option(s). 2 calls pkg:show_foo(options,list of names) or 2 refers to pkg.show_foo 2 to describe option "foo" 2 2 (see sources for details... at some point I'll finish writing this... --Rog) 38 5 4 24 2 Message Sequences 2 ----------------- 2 A "message sequence" is a handle by which one may refer to a particular subset of a mail recipient's (player or $mail_recipient-descendant) saved messages. Routines like rcpt:display_seq_headers or rcpt:display_seq_full need to be supplied with message-sequence arguments to deterimine which headers or full-messages to display. 2 2 Message sequences can in turn be obtained from routines like rcpt:parse_message_seq, which takes a command-line description of a message sequence on that particular recipient and returns the corresponding message sequence handle. 2 2 The actual form of a message sequence (though you shouldn't actually need to make use of this) is that of a set of integers in the format used by $seq_utils (see `help $seq_utils'). It should however be noted that these integers are *not* themselves message numbers, but rather indices into the list of saved messages. For example, if a particular recipient holds 5 messages numbered 1,3,5,7,9. Then the message sequence handle representing messages 3,5,7 collectively, would be {2,5} which is $seq_utils-ese for the range 2..4, namely the second, third and fourth messages saved on that recipient. 2 2 The following verbs are available for obtaining indices to use in message sequences 2 2 :length_all_msgs() => total number of messages, or equivalently, 2 => index of last message 2 :length_num_le(n) => number of messages numbered <= n, or equivalently, 2 => index of highest numbered message <= n 2 :exists_num_eq(n) => 0 unless there exists a message numbered n in which 2 case we return the index of that message. 2 :length_date_le(date) => number of messages dated <= date, or equivalently, 2 => index of most recent message dated <= date 2 2 :length_date_gt(date) => number of messages dated > date 2 2 Note that r:length_date_gt(date) == r:length_all_msgs()-r:length_date_le(date). 2 The only reason :length_date_gt is provided as a separate routine is in order 2 to do quick checks for the existence of new mail (as @rn needs to do). 38 5 4 24 2 Read verbs 2 ---------- 2 The following verbs may be used to extract headers/messages from readable mail recipients/players; 2 2 :display_seq_headers (message sequence, current message number, last_read_date) 2 Does a @mail listing of the given message sequence. If current message 2 number is given and the sequence includes it, we mark it with a `>'. 2 Likewise if the sequence includes any new messages (i.e., dated after 2 last_read_date), these are also indicated as such. 2 2 display_seq_full (message sequence, preamble) 2 Does a @read listing of the given message sequence. Each message is preceded 2 by preamble. 2 => {new current message number, new last_read_date} 2 2 :messages_in_seq (index) 2 => {n, msg} 2 :messages_in_seq (message sequence) 2 => {{n_1,msg_1},{n_2,msg_2},...} 2 where the n_i are message numbers and the msg_i are messages in transmission 2 format (see `help mail-format') 2 2 :list_rmm () 2 Does an `@unrmm list' listing of messages in .messages_going 38 5 4 17 2 Write verbs 2 ----------- 2 The following verbs can be used to manipulate writable mail recipients/players: 2 2 :rm_message_seq (message sequence) 2 Does an @rmmail. Messages in message sequence are removed from this 2 recipient's saved .messages and written to .messages_going. 2 2 :undo_rmm () 2 Does an @unrmm. Messages in .messages_going are copied back to .messages. 2 2 :expunge_rmm () 2 Does an @unrmm expunge. Blows away .messages_going. 2 2 :renumber () 2 Does a @renumber. 2 38 5 4 25 2 Search verbs 2 ------------ 2 The following verbs can be used on a readable mail-recipient/player to search for messages with fields matching a given pattern. 2 2 from_msg_seq (objectid or list [,mask]) 2 => message sequence: messages from (one of) the given objectid(s) 2 2 %from_msg_seq (string or list [,mask]) 2 => message sequence: messages with (one of) the given string(s) 2 in the From: line 2 2 to_msg_seq (objectid or list [,mask]) 2 => message sequence: messages to (one of) the given objectid(s) 2 2 %to_msg_seq (string or list [,mask]) 2 => message sequence: messages with (one of) the given string(s) 2 in the To: line 2 2 subject_msg_seq (string [,mask]) 2 => message sequence: messages with given string occurring in Subject: 2 2 body_msg_seq (string [,mask]) 2 => message sequence: messages with given string occurring in body of message 2 2 In all cases `mask' is a message sequence which one may supply to limit the range of the search. One way of looking at it is that the message sequence to be returned is first intersected with mask. 38 5 4 43 2 The housekeeper is an object that can help keep other objects where they belong. New MOOs may want to add their own user interface for the housekeeper; here is some information that may be helpful. 2 2 To indicate what objects should be cleaned: 2 2 :add_cleanup(object[, requestor[, where]]) 2 Ask the housekeeper to clean 'object' for 'requestor' to 'where'. 2 Requestor defaults to 'player'. 2 Where defaults to object.location. 2 2 :remove_cleanup(what[, requestor]) 2 Remove 'what' from the cleanup list at 'requestor's request. 2 Will remove it only if 'requestor' made the original request and owns 2 the object or the destination. 2 2 To actually get the housekeeper to clean stuff up: 2 2 :cleanup([insist]) 2 Clean up player's objects. Argument is 'up' or 'up!' for manually 2 requested cleanups. 'up!' means to clean things even if it's against 2 the housekeeper's better judgement. 2 2 :replace(object[, insist]) 2 Clean up the indicated object. 'insist' is as in :cleanup. 2 2 :continuous() 2 Starts the housekeeper cleaning continuously, killing any previous 2 continuous task. This should be called only when starting up a new MOO, 2 or if something has gone wrong, as normally it will just keep going 2 without any help. 2 2 :litterbug() 2 Clean up all the places in housekeeper.public_places by getting rid of 2 all contents not in their .residents lists. This is called by 2 :continuous, so it doesn't need to be called directly. 2 2 To find out what's being cleaned to where for whom: 2 2 :cleanup_list([whom]) 2 Show 'player' the personal cleanup list for 'whom', or the housekeeper's 2 complete list if no argument is given. 2 2 :clean_status() 2 Show 'player' a brief summary of eir personal cleanup list. 38 5 4 28 2 $recycler 2 ========= 2 2 Rather than having the server built-in recycle() and create() functions handle the creation and destruction of objects, a recycling center has been created to simulate these actions by changing objects that would have been recycled into children of $garbage (The Generic Garbage Object) and making them owned by Hacker, and then when they're needed again, to avoid a raw create() command, those objects are given to whoever's asking for them. 2 2 Most Useful Verbs 2 ----------------- 2 2 $recycler:_recycle( object ) 2 This will effectively recycle an object. (As a point of fact, it changes ownership of the object to Hacker and makes the object a child of $garbage.) It handles .ownership_quota and .owned_objects properly. Generally, use this instead of a recycle() in your verbs. 2 2 $recycler:_create( parent object [ , new owner object ] ) 2 This effectively creates an object (with the specified parent, if possible, and with the specified owner, if possible; these are the same restrictions as on the server create() builtin). This is what should generally be used instead of create() in your programming. 2 2 $recycler:valid ( object ) 2 This is a variant of the server built-in valid() except that it handles the $garbage objects as well. It returns a 1 if the object specified -is- valid and is -not- a $garbage object. 2 2 Other Notes 2 ----------- 2 2 request <object> from <recycler> 2 This is not an internal verb (it's !x). It is, however, a command-line verb that can be used to request a specific object from the recycler. It's also useful for the creation of objects like a Magic Number Repository. When the object is removed from the recycler, the .announce_removal_msg is announced to the room if it's set (it's piped through $string_utils for pronoun substitution). 2 2 show-history <recycler> 2 This is a wizardly verb which allows wizards to check the `history list' of the recycler. The history maintains the latest ($recycler.nhist) entries. 2 2 $recycler.orphans 2 This maintains a list of objects for which the recreation process got mangled. It ought to be checked every once in a while to see what's up. 2 1 4 10 2 $error 2 ====== 2 2 The Error Generator, $error, may be used to automatically generate errors. This is particularly useful if you are working in a !d verb but have occasion to -want- to crash with traceback. To raise a specific error, use $error:raise(error type) -- for example, $error:raise(E_PERM) will produce traceback resulting from a Permission Denied error. 2 2 Random notes about $error: 2 2 + The complete list of errors is stored in $error.names. 2 + The seemingly useless :accept() verb on $error is so that $error:E_RECMOVE and $error:E_NACC will be guaranteed success (success meaning, of course, a termination by traceback). 2 + There is, unfortunately, no way to raise the error E_NONE. 2 1 4 72 2 Generic BigList Utilities 2 ---------------------------- 2 $biglist is a collection of routines for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}). The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object. It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of $biglist one; $biglist merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation. 2 2 All of the utilities below refer to `caller' to locate the home object. Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself. The home object needs to define the following verbs 2 2 :_make(@args) => new property on home object with value args 2 :_kill(prop) delete a given property that was created by :_make 2 :_get(prop) => home.prop 2 :_put(prop,@args) set home.prop = args 2 :_ord(element) given something that is of the form of a biglist element 2 return the corresponding ordinal (for sorting purposes). 2 If you never intend to use :find_ord, then this can be a 2 routine that always returns 0 or some other random value. 2 2 See $generic_biglist_home or $big_mail_recipient for examples. 2 2 Those of the following routines that take a biglist argument are expecting 2 either {} (empty biglist) or some biglist returned by one of the other routines 2 2 :length(biglist) => length(biglist) (i.e., number of elements) 2 :find_nth(biglist,n) => biglist[n] 2 :find_ord(biglist,k,comp) => n where n is 2 the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or 2 the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true. 2 Always returns a value between 0 and length(biglist) inclusive. 2 This assumes biglist to be sorted in order of increasing :_ord values 2 with respect to home:(comp)(). 2 Standard situation is :_ord returns a number and comp is a < verb. 2 2 :start(biglist,s,e) => {biglist[s..?],@handle} or {} 2 :next(@handle) => {biglist[?+1..??],@newhandle} or {} 2 These two are used for iterating over a range of elements of a biglist 2 The canonical incantation for doing 2 for elt in (biglist[first..last]) 2 ... 2 endfor 2 is 2 handle = :start(biglist,first,last); 2 while(handle) 2 for elt in (handle[1]) 2 ... 2 endfor 2 handle = :next(@listdelete(handle,1)); 2 endwhile 2 2 The following all destructively modify their biglist argument(s) L (and M). 2 2 :set_nth(L,n,value) => L[n] = value 2 replaces the indicated element 2 2 :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]} 2 :insert_after (L,M,n) => {@L[1..n], @M,@L[n+1..length(L)]} 2 takes two distinct biglists, inserts one into the other at the given point 2 returns the resulting consolidated biglist 2 2 :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 2 breaks the given biglist into two distinct biglists. 2 2 :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]} 2 :keep_range (L,m,n[,leafkiller]) => L[m..n] 2 like extract_range only we destroy what we don't want. 2 2 :insertlast(L,value) => {@L,value} 2 inserts a new element at the end of biglist. 2 If find_ord is to continue to work properly, it is assumed that the 2 home:_ord(elt) is greater (comp-wise) than all of the :_ord values 2 of elements currently in the biglist. 2 2 :kill(L[,leafkiller]) 2 destroys all nodes used by biglist. 2 Calls home:leafkiller on each element. 38 1 5 38 5 5 38 4 4 1 2 Core Utility Help 38 5 2 Help database for LambdaCore utility objects and generics. 38 5 4 2 0 83978 0 750669393 2 1 #24 Programmer Help 16 2 -1 -1 -1 32 -1 23 2 errors 2 173 -1 prepositions 2 165 -1 51 @check-property @check-chparent @egrep regular-expressions @show @grep prog-index help prepositions ; utilities truth tasks statements programming precedence language functions expressions eval errors @verb @setenv @rmverb @rmproperty @prospectus @property @program @list @kill @kids @forked @edit @display @dbsize @copy @chparent @chmod @args .program @clearproperty @disown @disinherit @displayoptions @display-options @add-feature @remove-feature features examine mail # 56 4 2 2 *forward* 2 @check-chparent 2 5 4 10 2 Syntax: @check-property <object>.<propname> 2 @check-chparent <object> to <newparent> 2 2 You cannot add a new property to an object if an ancestor or a descendant already defines a property with the same name. @check-property will give you the list of all descendants of <object> that that define .<propname>. 2 2 Likewise you cannot chparent an object to a new parent if the new parent has a property that is also defined on the object or some descendant. Use @check-chparent to find out all instances of conflicting properties that would interfere with @chparent in this manner. 2 2 Note that @check-property requires either that you own the object or that it be writeable, the same conditions that need to hold if you are to create new properties on the object. Similarly, @check-chparent requires that you own the object and that the new parent is either fertile or likewise owned by you. 2 2 For objects with large numbers of descendants, these commands can be time-consuming. 2 5 4 2 2 *forward* 2 @grep 2 5 4 162 2 Regular expression matching allows you to test whether a string fits into a specific syntactic shape. You can also search a string for a substring that fits a pattern. See also the built-in function match()/rmatch(). 2 2 A regular expression describes a set of strings. The simplest case is one that describes a particular string; for example, the string `foo' when regarded as a regular expression matches `foo' and nothing else. Nontrivial regular expressions use certain special constructs so that they can match more than one string. For example, the regular expression `foo%|bar' matches either the string `foo' or the string `bar'; the regular expression `c[ad]*r' matches any of the strings `cr', `car', `cdr', `caar', `cadddar' and all other such strings with any number of `a''s and `d''s. 2 2 Regular expressions have a syntax in which a few characters are special constructs and the rest are "ordinary". An ordinary character is a simple regular expression that matches that character and nothing else. The special characters are `$', `^', `.', `*', `+', `?', `[', `]' and `%'. Any other character appearing in a regular expression is ordinary, unless a `%' precedes it. 2 2 For example, `f' is not a special character, so it is ordinary, and therefore `f' is a regular expression that matches the string `f' and no other string. (It does *not*, for example, match the string `ff'.) Likewise, `o' is a regular expression that matches only `o'. 2 2 Any two regular expressions A and B can be concatenated. The result is a regular expression which matches a string if A matches some amount of the beginning of that string and B matches the rest of the string. 2 2 As a simple example, we can concatenate the regular expressions `f' and `o' to get the regular expression `fo', which matches only the string `fo'. Still trivial. 2 2 The following are the characters and character sequences that have special meaning within regular expressions. Any character not mentioned here is not special; it stands for exactly itself for the purposes of searching and matching. 2 2 `.' is a special character that matches any single character. Using 2 concatenation, we can make regular expressions like `a.b', which matches 2 any three-character string that begins with `a' and ends with `b'. 2 2 `*' is not a construct by itself; it is a suffix that means that the preceding 2 regular expression is to be repeated as many times as possible. In `fo*', 2 the `*' applies to the `o', so `fo*' matches `f' followed by any number of 2 `o''s. 2 2 The case of zero `o''s is allowed: `fo*' does match `f'. 2 2 `*' always applies to the *smallest* possible preceding expression. Thus, 2 `fo*' has a repeating `o', not a repeating `fo'. 2 2 The matcher processes a `*' construct by matching, immediately, as many 2 repetitions as can be found. Then it continues with the rest of the 2 pattern. If that fails, it backtracks, discarding some of the matches of 2 the `*''d construct in case that makes it possible to match the rest of 2 the pattern. For example, matching `c[ad]*ar' against the string 2 `caddaar', the `[ad]*' first matches `addaa', but this does not allow the 2 next `a' in the pattern to match. So the last of the matches of `[ad]' is 2 undone and the following `a' is tried again. Now it succeeds. 2 2 `+' is like `*' except that at least one match for the preceding pattern is 2 required for `+'. Thus, `c[ad]+r' does not match `cr' but does match 2 anything else that `c[ad]*r' would match. 2 2 `?' is like `*' except that it allows either zero or one match for the 2 preceding pattern. Thus, `c[ad]?r' matches `cr' or `car' or `cdr', and 2 nothing else. 2 2 `[ ... ]' 2 `[' begins a "character set", which is terminated by a `]'. In the 2 simplest case, the characters between the two brackets form the set. 2 Thus, `[ad]' matches either `a' or `d', and `[ad]*' matches any string of 2 `a''s and `d''s (including the empty string), from which it follows that 2 `c[ad]*r' matches `car', etc. 2 2 Character ranges can also be included in a character set, by writing two 2 characters with a `-' between them. Thus, `[a-z]' matches any lower-case 2 letter. Ranges may be intermixed freely with individual characters, as in 2 `[a-z$%.]', which matches any lower case letter or `$', `%' or period. 2 2 Note that the usual special characters are not special any more inside a 2 character set. A completely different set of special characters exists 2 inside character sets: `]', `-' and `^'. 2 2 To include a `]' in a character set, you must make it the first character. 2 For example, `[]a]' matches `]' or `a'. To include a `-', you must use it 2 in a context where it cannot possibly indicate a range: that is, as the 2 first character, or immediately after a range. 2 2 `[^ ... ]' 2 `[^' begins a "complement character set", which matches any character 2 except the ones specified. Thus, `[^a-z0-9A-Z]' matches all characters 2 *except* letters and digits. 2 2 `^' is not special in a character set unless it is the first character. 2 The character following the `^' is treated as if it were first (it may be 2 a `-' or a `]'). 2 2 `^' is a special character that matches the empty string -- but only if at the 2 beginning of the string being matched. Otherwise it fails to match 2 anything. Thus, `^foo' matches a `foo' which occurs at the beginning of 2 the string. 2 2 `$' is similar to `^' but matches only at the *end* of the string. Thus, 2 `xx*$' matches a string of one or more `x''s at the end of the string. 2 2 `%' has two functions: it quotes the above special characters (including `%'), 2 and it introduces additional special constructs. 2 2 Because `%' quotes special characters, `%$' is a regular expression that 2 matches only `$', and `%[' is a regular expression that matches only `[', 2 and so on. 2 2 For the most part, `%' followed by any character matches only that 2 character. However, there are several exceptions: characters that, when 2 preceded by `%', are special constructs. Such characters are always 2 ordinary when encountered on their own. 2 2 No new special characters will ever be defined. All extensions to the 2 regular expression syntax are made by defining new two-character 2 constructs that begin with `%'. 2 2 `%|' specifies an alternative. Two regular expressions A and B with `%|' in 2 between form an expression that matches anything that either A or B will 2 match. 2 2 Thus, `foo%|bar' matches either `foo' or `bar' but no other string. 2 2 `%|' applies to the largest possible surrounding expressions. Only a 2 surrounding `%( ... %)' grouping can limit the grouping power of `%|'. 2 2 Full backtracking capability exists for when multiple `%|''s are used. 2 2 `%( ... %)' 2 is a grouping construct that serves three purposes: 2 2 1. To enclose a set of `%|' alternatives for other operations. Thus, 2 `%(foo%|bar%)x' matches either `foox' or `barx'. 2 2 2. To enclose a complicated expression for a following `*', `+', or `?' 2 to operate on. Thus, `ba%(na%)*' matches `bananana', etc., with any 2 number of `na''s, including none. 2 2 3. To mark a matched substring for future reference. 2 2 This last application is not a consequence of the idea of a parenthetical 2 grouping; it is a separate feature that happens to be assigned as a second 2 meaning to the same `%( ... %)' construct because there is no conflict in 2 practice between the two meanings. Here is an explanation of this 2 feature: 2 2 `%DIGIT' 2 After the end of a `%( ... %)' construct, the matcher remembers the 2 beginning and end of the text matched by that construct. Then, later on 2 in the regular expression, you can use `%' followed by DIGIT to mean 2 "match the same text matched by the DIGIT'th `%( ... %)' construct in the 2 pattern." The `%( ... %)' constructs are numbered in the order that their 2 `%(''s appear in the pattern. 2 2 The strings matching the first nine `%( ... %)' constructs appearing in a 2 regular expression are assigned numbers 1 through 9 in order of their 2 beginnings. `%1' through `%9' may be used to refer to the text matched by 2 the corresponding `%( ... %)' construct. 2 2 For example, `%(.*%)%1' matches any string that is composed of two 2 identical halves. The `%(.*%)' matches the first half, which may be 2 anything, but the `%1' that follows must match the same exact text. 2 2 `%b' matches the empty string, but only if it is at the beginning or end of a 2 word. Thus, `%bfoo%b' matches any occurrence of `foo' as a separate word. 2 `%bball%(s%|%)%b' matches `ball' or `balls' as a separate word. 2 2 For the purposes of this construct and the five that follow, a word is 2 defined to be a sequence of letters and/or digits. 2 2 `%B' matches the empty string, provided it is *not* at the beginning or end of 2 a word. 2 2 `%<' matches the empty string, but only if it is at the beginning of a word. 2 2 `%>' matches the empty string, but only if it is at the end of a word. 2 2 `%w' matches any word-constituent character (i.e., any letter or digit). 2 2 `%W' matches any character that is not a word constituent. 2 5 4 7 2 Syntax: @show <object> 2 @show <object>.<prop-name> 2 @show <object>:<verb-name> 2 2 Displays quite detailed information about an object, property or verb, including its name, owner, permission bits, etc. The information displayed for an object can be quite long. 2 2 See also @display, which displays different information and is controlled differently. 2 5 4 9 2 Syntax: @grep <string> in <object> 2 @grep <string> in {<objectlist>} 2 2 @egrep <regexp> in <object> 2 @egrep <regexp> in {<objectlist>} 2 2 These are named for the corresponding unix utilities. 2 @grep searches the given object(s) for verbs whose verbcode contains the given string as a substring of one of its lines. 2 @egrep searches the given object(s) for verbs whose verbcode contains a substring matching the given regular expression (see `help regular-expressions'). 2 5 4 2 2 *index* 2 Programmer Help Topics 2 5 4 15 2 *pass* 2 help 2 2 For programmers, the help system provides the following additional forms: 2 2 help object:verbname -- prints any documentation strings that are present 2 at the beginning of the program for that verb. 2 help $<whatever>_utils -- prints general information about one of the 2 $..._utils objects (e.g., $string_utils, 2 $list_utils, etc...), which are all libraries 2 of generally used verbs. 2 help builtin() -- prints documentation from the programmers manual 2 about the named primitive, for example length() 2 2 For information about how the help system itself works and about how to associate local help databases with specific rooms or player classes, see `help $help'. 2 5 4 3 2 *prepositions* 2 The complete list of prepositions recognized by the command-line parser: 2 2 5 4 2 2 *forward* 2 eval 38 1 4 17 2 The core database has a number of objects serving as libraries of useful verbs. 2 More detailed information can be obtained for (some of) these, via `help $whatever_utils' 2 2 $building_utils -- 2 $code_utils -- parsing and manipulating verb code 2 $command_utils -- reporting matching errors to the player 2 $gender_utils -- managing gendered objects 2 $list_utils -- list manipulation 2 $set_utils -- set manipulation 2 $lock_utils -- key expression manipulation 2 $match_utils -- 2 $object_utils -- object information 2 (inheritance/location hierarchy, verb/property lists) 2 $perm_utils -- permissions 2 $string_utils -- string manipulation 2 $time_utils -- time (numeric and verbal) manipulation 2 $trig_utils -- trigonometric and other numerical utilities 2 5 4 5 2 Several kinds of statements, expressions, and functions in the MOO programming language use a notion that some MOO values are 'true' and others 'false'. 2 2 The only values that are considered true are non-zero numbers, non-empty strings, and non-empty lists. 2 2 All other values (i.e., 0, "", {}, objects, and errors) are considered false. 38 1 4 17 2 A task is an execution of a MOO program. There are five ways for tasks to be created in LambdaMOO: 2 + Every time a player types a command, a task is created to execute that command; we call these 'command tasks'. 2 + Whenever a player connects or disconnects from the MOO, the server starts a task to do whatever processing is necessary, such as printing out 'Munchkin has connected' to all of the players in the same room; these are called 'server tasks'. 2 + The FORK statement in the programming language creates a task whose execution is delayed for at least some given number of seconds; these are 'forked tasks'. 2 + The suspend() function suspends the execution of the current task. A snapshot is taken of whole state of the execution, and the execution will be resumed later. These are called `suspended tasks'. 2 + The read() function also suspends the execution of the current task, in this case waiting for the player to type a line of input. When the line is received, the task resumes with the read() function returning the input line as result. These are called `reading tasks'. 2 2 The last three kinds of tasks above are collectively known as `queued tasks' or `waiting tasks', since they may not run immediately. 2 2 To prevent a maliciously- or incorrectly-written MOO program from running forever and monopolizing the server, limits are placed on the running time of every task. One limit is that no task is allowed to run longer than 15 seconds; this limit is, in practice, never reached. The reason is that there is a second limit on the number of operations a task may execute. 2 2 The server counts down 'ticks' as any task executes. Roughly speaking, it counts one tick for every expression evaluation (other than variables and literals), one for every `if', `fork' or `return' statement, and one for every iteration of a loop. If the count gets all the way down to zero, the task is immediately and unceremoniously aborted. All tasks begin or resume with an store of 30,000 ticks; this is enough for almost all normal uses. 2 2 Because queued tasks may exist for long periods of time before they begin execution, there are commands to list the ones that you own and to kill them before they execute. These commands are covered in the following help topics: 2 2 @forked -- listing the forked tasks that you own 2 @kill -- killing a particular forked task 38 1 4 36 2 The following kinds of statements exist in the MOO programming language: 2 2 ; 2 The null statement does nothing. 2 2 expression ; 2 The expression statement evaluates the expression and then discards the value. 2 2 IF ( expression ) statements ENDIF 2 IF ( expression ) statements ELSE statements ENDIF 2 IF ( expression ) 2 statements 2 ELSEIF ( expression ) 2 statements 2 ... 2 ELSE 2 statements 2 ENDIF 2 The conditional statement evaluates each expression in turn and executes the statements associated with the first one to return a true value; the ELSE statements are executed if none of the expressions returns a true value. There can be any number of ELSEIF clauses and the ELSE part is optional. See 'help truth' for the definition of 'true value'. 2 2 FOR name IN ( expression ) statements ENDFOR 2 The list iteration statement first evaluates the expression, which must return a list. It then executes the statements once for each element of that list, each time with the named variable having the value of the corresponding list element. 2 2 FOR name IN [ expression .. expression ] statements ENDFOR 2 The numeric iteration statement first evaluates the two expressions, both of which must return numbers; call those numbers N1 and N2, respectively. The statements are then executed once for each integer I such that N1 <= I <= N2, in increasing order; each time, the named variable has the corresponding value of I. 2 2 WHILE ( expression ) statements ENDWHILE 2 The indefinite iteration statement repeatedly evaluates the expression and, each time it returns a true value, executes the statements. The loop stops the first time that the expression returns a false value. The definitions of 'true' and 'false' values is in 'help truth'. 2 2 RETURN ; 2 RETURN expression ; 2 The return statement evalautes the expression, if any, and returns the resulting value (or 0 if there is no expression) to the verb that called the current one. Execution of the current verb is immediately terminated. 2 2 FORK ( expression ) statements ENDFORK 2 FORK name ( expression ) statements ENDFORK 2 The fork statement first executes the expression, which must return a number; call that number N. It then creates a new MOO task that will, after at least N seconds, execute the statements. When the new task begins, all variables will have the values they had at the time the FORK statement was executed. The task executing the FORK statement immediately continues execution. If a variable name is given after the FORK keyword, then it is assigned the 'queue ID' of the newly-created task. The value of this variable is visible both to the task executing the fork statement and to the statements in the newly-created task. See 'help tasks' for more information about forked tasks. 38 1 4 26 2 MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects. Help is available on the following topics concerning programming in MOO: 2 2 language -- a brief reference for the syntax and semantics of the MOO language 2 tasks -- a brief description of MOO tasks and their resource limits 2 2 @property -- adding a property to an object 2 @rmproperty -- removing a property from an object 2 2 @verb -- adding a verb to an object 2 @rmverb -- removing a verb from an object 2 @args -- changing the syntax of a verb 2 @copy -- copying a verb from one object to another 2 2 .program/@program -- entering the program for a verb 2 @list -- printing a listing of the program for a verb 2 @edit -- editing verb code 2 2 @show -- looking at all the details of an object, a property, or a verb 2 @parents -- listing the ancestors of an object 2 @kids -- listing the children of an object 2 @contents -- listing the contents of an object 2 @chmod -- changing the permissions on an object, a property, or a verb 2 @chparent -- changing the parent of an object 2 @rename -- changing the name of a verb or object 2 2 eval -- executing MOO statements and expressions without writing a verb 38 1 4 17 2 The table below gives the relative precedence of all of the MOO operators; operators on higher lines in the table have higher precedence and those on the same line have identical precedence: 2 2 ! - (without a left operand) 2 * / % 2 +- 2 == != < <= > >= in 2 && || 2 ... ? ... | ... (the conditional expression) 2 = 2 2 Thus, the horrendous expression 2 2 x = a < b && c > d + e * f ? w in y | - q - r 2 2 would be grouped as follows: 2 2 x = (((a < b) && (c > (d + (e * f)))) ? (w in y) | ((- q) - r)) 38 1 4 5 2 The MOO programming language is described in excruciating detail in the LambdaMOO Programmer's Manual, available for FTP from parcftp.xerox.com in the file pub/MOO/ProgrammersManual.txt. The online help consists of a few quick reference guides here in the help system under the following topics: 2 2 statements -- the syntax and semantics of the various kinds of MOO statements 2 expressions -- the same for the various kinds of MOO expressions 2 functions -- a list of the primitive functions available to MOO programs 38 1 4 93 2 There are many, many built-in functions available to MOO programmers. The following list gives a brief summary of the arguments and purpose of each function; for more information, see the LambdaMOO Programmer's Manual. 2 2 pass(arg, ...) -- calling a verb defined on this object's parent 2 eval(string) -- parsing and executing strings as MOO code 2 notify(player, string) -- sending text to a player's terminal 2 read() -- reading a line of input from the player (*) 2 output_delimiters(player) -- return {prefix,suffix} set by PREFIX/SUFFIX cmds 2 2 typeof(value) -- determining the data type of a value 2 tostr(value, ...) -- converting any set of values into a string 2 tonum(value) -- converting any non-list value into a number 2 toobj(value) -- converting any non-list value into an object 2 length(value) -- returns the length of a string or list 2 2 listappend(list, value [, index]) -- adding an element at the end of a list 2 listinsert(list, value [, index]) -- adding an element at the head of a list 2 listset(list, value, index) -- updating a list at some index 2 listdelete(list, index) -- removing an element from a list 2 setadd(list, element) -- adding an element to a set represented as a list 2 setremove(list, element) -- removing an element from such a set 2 2 min(n1, n2, ...) -- minimum of n1,n2,... 2 max(n1, n2, ...) -- maximum of n1,n2,... 2 abs(n) -- absolute value of n 2 sqrt(n) -- square root of n, rounded down 2 random(n) -- random integer between 1 and n inclusive 2 time() -- current time in seconds since midnight GMT, 1 Jan 70 2 ctime([time]) -- time (or current time) converted to a human-readable string 2 index(str1, str2 [, case-matters]) -- index of first str2 in str1 2 rindex(str1, str2 [, case-matters]) -- index of last str2 in str1 2 strcmp(str1, str2) -- case-sensitive string comparison 2 strsub(subject, what, with [, case-matters]) -- substitution in a string 2 crypt(string [, salt]) -- one-way string encryption 2 match(str1, str2 [, case-matters]) -- match first regular expr str2 in str1 2 rmatch(str1, str2 [, case-matters]) -- match last regular expr str2 in str1 2 substitute(template, subs) -- perform substitutions on template 2 2 valid(object) -- testing whether an object exists 2 create(parent [, owner(*)])-- creating a new MOO object 2 recycle(object) -- destroying a MOO object 2 move(object, where) -- altering the object-containment hierarchy 2 chparent(object, new-parent) -- altering the object-inheritance hierarchy 2 parent(object) -- object's parent in the inheritance hierarchy 2 children(object) -- object's children in the inheritance hierarchy 2 max_object() -- the highest-numbered object in the MOO 2 renumber(obj) -- changes an object's number to lowest available one (*) 2 reset_max_object() -- resets max_object() to the largest valid object (*) 2 2 properties(object) -- a list of the properties defined on an object 2 add_property(object, prop-name, value, info) -- add a new property 2 delete_property(object, prop-name) -- remove a property 2 property_info(object, prop-name) -- {owner, perms} info on a property 2 set_property_info(object, prop-name, info) -- setting same 2 is_clear_property(object, prop-name) -- find out if a property is "clear" 2 clear_property(object, prop-name) -- make a property "clear" 2 2 verbs(object) -- a list of the verbs defined on an object 2 add_verb(object, info, args) -- add a verb to an object 2 delete_verb(object, verb-name) -- remove a verb from an object 2 verb_info(object, verb-name) -- {owner, perms, names} info for a verb defn. 2 verb_args(object, verb-name) -- {dobj, prep, iobj} argument info for a verb 2 verb_code(object, verb-name [, fully-paren [, indent]]) -- program listing 2 set_verb_info(object, verb-name, {owner, perms, names}) 2 set_verb_args(object, verb-name, {dobj, prep, iobj}) 2 set_verb_code(object, verb-name, {line, line, ...}) 2 2 is_player(object) -- testing whether or not object is a player 2 players() -- a list of all players, active or not 2 connected_players() -- a list of all currently-connected players 2 idle_seconds(player) -- seconds since given player typed anything 2 connected_seconds(player) -- seconds given player has been logged in 2 boot_player(player) -- disconnect player from the MOO immediately(*) 2 set_player_flag(player, value) -- set/clear player bit; boot player if clear(*) 2 connection_name(player) -- a server-assigned name for player's connection 2 open_network_connection(@args) -- open a connection to another network site 2 2 caller_perms() -- the player whose permissions your caller was using 2 set_task_perms(player) -- changing permissions of the running task (*) 2 callers() -- list of {obj, verb, owner, vloc, player}: this task's stack 2 suspend(secs) -- suspending the current task for a number of seconds 2 seconds_left() -- number of seconds left in the current task 2 ticks_left() -- number of ticks left in the current task 2 task_id() -- a random number representing the currently-running task 2 queued_tasks() -- list of {id,start,0,20000,owner,obj,verb,line,this} 2 kill_task(id) -- delete one of your tasks from the queue 2 2 server_log(string) -- add a comment to the server log file 2 server_version() -- a string of three numbers "major.minor.release" 2 memory_usage() -- {{blocksize, nused, nfree}, ...}, the server's memory stats 2 shutdown(msg) -- print msg and kill the server (*) 2 dump_database() -- what it says (*) 2 2 (*) => as you might have expected, these usually require wizard permissions. 38 1 4 69 2 The following kinds of expressions exist in the MOO programming language: 2 2 number 2 # number 2 # - number 2 "character string" 2 error-name 2 Literal expressions return the obvious values: numbers, object numbers, strings, and errors. 2 2 { expression , expression , ... , expression } 2 The list-construction expression evaluates the each of the expressions in turn and returns a list whose elements are the results of those expressions. Any of the expressions may be prefixed with an at-sign ('@'); in this case, that expression must return a list and, rather than that list becoming an element of the final list, its elements are spliced into the final list. 2 2 name 2 Variable expressions return the current value of the named variable. Variable names must start with a letter or underscore ('_') and contain only letters, digits, and underscores. The following variables are predefined: 2 OBJ, STR, LIST, ERR, NUM 2 player, caller, this, verb, args 2 argstr, dobj, dobjstr, prepstr, iobj, iobjstr 2 Their initial values are described in detail in the LambdaMOO Programmer's Manual. 2 2 expression . name 2 expression . ( expression ) 2 $ name 2 Property-reading expressions return the current value of a named property on the object that is the value of the first subexpression. In the second form, the second subexpression must return a string, the name of the property to be read. The third form is an abbreviation for '#0.name'. 2 2 expression : name ( arguments ) 2 expression : ( expression ) ( arguments ) 2 Verb-call expressions invoke a named verb on the object that is the value of the first subexpression, passing the given arguments. In the second form, the second subexpression must return a string, the name of the verb to invoke. The syntax and semantics of arguments is exactly as in the list-construction expression but no initial or final curly-braces ('{' or '}') are used. 2 2 function ( arguments ) 2 The function-call expression invokes one of the MOO primitive functions, as listed in 'help functions', passing the given arguments. 2 2 expression [ expression ] 2 The indexing expression first evaluates the two subexpressions; call their values S and N, respectively. S must be a string or a list and N must be a number between 1 and the length of S, inclusive. The Nth element of S is returned. The elements of a string are themselves one-character strings. 2 2 expression [ expression .. expression ] 2 The subsequence expression first evaluates the three subexpressions; call their values S, N1, and N2, respecitively. S must be a string or a list and N1 and N2 must be numbers. If N1 <= N2, then both must be between 1 and the length of S, inclusive; the subsequence of S beginning at index N1 and continuing through index N2 is returned. If N1 > N2, the empty sequence of the same type as S is returned, either "" or {}. 2 2 name = expression 2 expression . name = expression 2 expression . ( expression ) = expression 2 $ name = expression 2 Assignment expressions give new values to variables and object properties. For the second and third forms, the expressions on the left-hand side of the '=' are evaluated first. Then the right-hand side expression is evaluated and result is stored in the indicated variable or object property. 2 2 expression + expression 2 expression - expression 2 expression * expression 2 expression / expression 2 expression % expression 2 - expression 2 The arithmetic expressions evaluate the subexpressions, all of which must return numbers, and then perform addition, subtraction, multiplication, division, remaindering, or negation, respectively. For addition, the subexpressions may both return strings as well; in this case, the result is the concatenation of the two strings. 2 2 expression == expression 2 expression != expression 2 expression < expression 2 expression <= expression 2 expression > expression 2 expression >= expression 2 The comparison expressions evaluate the subexpressions and then test whether or not the first result is equal to, unequal to, less than, less than or equal to, greater than, or greater than or equal to the second result, respectively. If the indicated relation holds then they return 1 and otherwise they return 0. Comparisons of strings are performed case-insensitively, those of lists are performed on an element-by-element basis, objects are compared by their object numbers, and errors by an ordering given in the LambdaMOO Programmer's Manual. 2 2 expression ? expression | expression 2 expression && expression 2 expression || expression 2 ! expression 2 The logical expressions each return results based upon the truth value of their first subexpression; call the value of this expression X. The first of these returns the value of the second subexpression if X is a true value and that of the third expression if X is a false value; the unused subexpression is not evaluated. The definitions of 'true value' and 'false value' are given in 'help truth'. The expression 'E1 && E2' is an abbreviation for 'E1 ? E2 | E1' except that E1 is only evaluated once. The expression 'E1 || E2' is an abbreviation for 'E1 ? E1 | E2' except that E1 is only evaluated once. The expression '! E' is an abbreviation for 'E ? 0 | 1'. 2 2 expression IN expression 2 The list-membership expression first evaluates both subexpressions; call their values E and L, respectively. L must be a list. If E is an element of L, then the index of the first occurence of E in L is returned. If E is not an element of L, then 0 is returned. 2 2 The method for disambiguating the meaning of a complex MOO expression in the absence of sufficient parentheses is described in 'help precedence'. 38 1 4 37 2 Syntax: eval <MOO-code> 2 ; <MOO-code> 2 eval-d <MOO-code> 2 2 Evaluates the given piece of MOO code and prints the resulting value. If the MOO code begins with one of the MOO language keywords ('if', 'for', 'while', 'fork', or 'return') or with the character ';', then the entire piece of code is treated as the program for a verb, with ';' appended to the end. Otherwise, 'return' is appended to the front and ';' is appended to the end and that string is treated as the code for a verb. In either case, the resulting verb is invoked and whatever value it returns is printed. 2 2 For programmers, this is such a mind-bogglingly useful thing to do that there is a simple abbreviation for this command; any command beginning with a semicolon (';') is treated as a use of 'eval'. 2 2 Eval treats specially a duplicated semicolon at the beginning. It enables you to make multi-statement programs within eval (but does not by default print the return value). 2 2 Eval-d (no ";" abbreviation for this) evaluates the following text exactly as eval, except that the "d" debug flag (see programmer's manual for explanation) is turned off. Thus errors will cause an error return value rather than a traceback. 2 2 If you set the player property .eval_time to 1, then eval will print out how many ticks and seconds the program required. 2 2 Examples: 2 eval 3 + 4 2 => 7 2 ;3+4 2 => 7 2 ;for x in (player.aliases) player:tell(x); endfor 2 Haakon 2 Wizard 2 ArchWizard 2 => 0 2 ;;l = {}; for i in [1..10] l = {@l, i}; endfor return l 2 => {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 2 eval-d 8 + "foo" 2 => E_TYPE (Type mismatch) 2 2 You may customize your evaluation environment. The player property .eval_env may contain statements to be executed prior to any evaluated program. Two caveats: This will throw off the tick count. You can account for additional ticks inserted by your environment with the .eval_ticks property; just set it to the number of ticks you'd like subtracted from the total. Additionally, if you make a syntax error in your program, the line reported will be wrong (it will count those initial statements), and if you make an error in the eval_env itself, you can be in deep trouble. Despite these drawbacks, the eval_env property can be quite useful. The following is a sample: 2 2 Eval_env: "me=player;here=player.location;" 2 eval_ticks: 3 2 2 See also @setenv. 2 2 You can also define textual substitutions in a separate property, called eval_subs. These are discouraged, however, for anything that can be done with variable assignments, because the overhead of replacing the strings in the evaluated program is significant. However, some things, such as substituting characters which can't be typed easily on one keyboard (e.g. "[]" is difficult to type on some IBM keyboards), can only be done by textual substitutions. Note that the eval substitutions are also interpreted by the verb editor when "eval_subs" is selected in your .edit_options property (see `help editors'). This adds to their overhead, but again, makes it possible for people to program who otherwise can't type the full character set. Remember: Don't use eval_subs unless you really have to! 38 1 4 3 2 *errors* 2 The complete list of error codes: 2 2 5 4 17 2 Syntax: @verb <object>:<verb-name(s)> 2 @verb <object>:<verb-name(s)> <dobj> [<prep> [<iobj>]] 2 2 Adds a new verb with the given name(s) to the named object. If there are multiple names, they should be separated by spaces and all enclosed in quotes: 2 2 @verb foo:"bar baz mum*ble" 2 2 The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'; their meaning is discussed in the LambdaMOO Programmer's Manual. The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions' (a prepositional phrase with more than one word must be enclosed in quotes ("")). All three specifiers default to 'none'. 2 2 It is also possible to specify the new verb's permissions and owner as part of the same command (rather than having to issue separate @chmod/@chown commands) 2 2 @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions> 2 @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions> <owner> 2 2 <permissions> are as with @chmod, i.e., must be some subset of "rwxd". They default to "rd" (specifying "w" for a verb is highly inadvisable). The owner defaults to the player typing the command; only wizards can create verbs with owners other than themselves. 2 2 You may also use "tnt" in place of "this none this" for the dobj prep iobj arguments. "this none this" is used to indicate non-command verbs, since the parser can't possibly interpret a command as "this none this". For these verbs, the permissions default to "rxd"; the "x" bit is set so that they can be called from other programs. (If they couldn't be used as commands, and they couldn't be called from programs, they wouldn't be good for anything!) 38 1 4 5 2 Syntax: @setenv <environment string> 2 2 Defines the environment for eval (property player.eval_env). See "help eval" 2 for more information. This is mostly useful when one's .eval_env is broken 2 and prevents one from using eval to reset it. 38 1 4 7 2 Syntax: @rmverb <object>:<verb-name> 2 @rmverb <object>:<verb-name> <dobj> <prep> <iobj> 2 2 Removes the named verb from the named object. 2 If there is more than one verb matching the given verb-name, this removes the most recently defined one. 2 2 With the 2nd form of the command the verb removed is the most recent one matching both the given verb-name *and* the given dobj/prep/iobj specifiers. 2 5 4 3 2 Syntax: @rmproperty <object>.<prop-name> 2 2 Removes the named property from the named object. '@rmproperty' may be abbreviated as '@rmprop'. 2 5 4 29 2 Usage: @prospectus player [from number] [to number] 2 2 Like @audit, but displays more information. The optional from and to arguments are for restricting the display to specific object numbers, if you happen to know the player only owns objects in the included range. 2 2 Example: 2 Objects owned by Frand (from #0 to #54949): 2 P[ 23] #47 Frand [Hyperspace Hovel] 2 T #152 Frand's trio of shoes [Frand] 2 KfT[ 10] #391 Frand's notifier class [Nowhere] 2 T[ 8] #393 Frand's chessboard [The Dining Room] 2 KfT[ 11] #775 Frand's generic game board [Nowhere] 2 T[ 6] #893 Ghost game [The Dining Room] 2 T[ 16] #894 Frand's mind bender [The Dining Room] 2 C #997 polka-dot hole [Hyperspace Hovel] 2 R[ 1] #1002 Hyperspace Hovel 2 E #11958 out Monster Cage->*Dr. Empirico's Lab 2 ... 2 2 The K in the first column indicates that the object has children owned by other players. A lowercase k indicates the object has children but owned only by the player. The second column indicates whether the object is publicly readable or publicly parentable. An r indicates readability. A lowercase f indicates the object is both readable and allows children (is fertile). An uppercase F indicates the object is not readable, yet allows children to be created. (This is usually an error.) If the object is readable by the issuer of the @prospectus command (that is, publicly readable or owned by the issuer), then the number in brackets indicates the number of verbs which have been defined on this object (not including any verbs from any parents). 2 2 The third column indicates what type of object this is. 2 T Thing 2 E Exit 2 R Room 2 C Container 2 N Note 2 P Player 2 p Parent object appropriate for players ("Player class") 2 blank Other 2 5 4 13 2 Syntax: @property <object>.<prop-name> 2 @property <object>.<prop-name> <initial-value> 2 2 Adds a new property named <prop-name> to the named object. The initial value is given by the second argument, if present; it defaults to 0. 2 2 Normally, a property is created with permissions 'rc' and owned by whoever types the command. However, you may also specify these explicitly 2 2 @property <object>.<prop-name> <initial-value> <permissions> 2 @property <object>.<prop-name> <initial-value> <permissions> <owner> 2 2 Only wizards can create properties with owners other than themselves. 2 2 '@property' can be abbreviated as '@prop'. 38 1 4 17 2 Syntax: @program <object>:<verb-name> 2 @program <object>:<verb-name> <dobj> <preposition> <iobj> 2 2 Changes the MOO program associated with the named verb on the named object. 2 If you provide <dobj> <preposition> and <iobj> as in the second form of this command, then it is the first verb with matching direct object, preposition and indirect object specifiers that is the one getting the new program. This is useful if you have several verbs matching the same name. 2 2 Typing the @program command always puts the server into a line-reading mode, in which each line you type is saved away without any action unless said line is one of the following: 2 2 . 2 @abort 2 .<text> 2 2 A period on a line by itself ends the line-reading mode and continues with the command, in this case, the saved lines are considered as a program, checked for syntax errors and, if no errors are found, installed as the new program for the specified verb. 2 2 @abort causes the command to terminate immediately with no change to any verb's program. .<text> enters <text> literally as one of the lines to be saved, which is used for when, e.g., you want to enter the line `.' or the line `@abort'. 2 2 Note that this command *always* enters the line-reading mode, even if the indicated verb is not found. In this case, lines of text are still read but they are ignored. After any @program command, you always need to type a period or `@abort' to get back into the normal command-reading mode. 2 5 4 20 2 Syntax: @list <object>:<verb> 2 @list <object>:<verb> [with|without parentheses|numbers] 2 @list <object>:<verb> <dobj> <prep> <iobj> 2 @list <object>:<verb> <start>..<end> 2 2 Prints out the code for the MOO program associated with the named verb on the named object. 2 2 Normally, the code is shown with each line numbered and with only those parentheses that are necessary to show the meaning of the program. You can e.g., specify `without numbers' to have the numbers omitted or `with parentheses' to include all parentheses or even `with parentheses without numbers' to do both. 2 2 The 3rd form of the verb lists the verb matching the given dobj/prep/iobj specification if such exists. 2 The 4th form prints only those lines in the specified range. 2 2 Example: 2 Type `@list $room:@move' to see the code for the `@move' command, or even `@list $prog:@list' to see the code implementing @list itself... 2 2 The 2nd-4th forms may be combined, e.g., 2 2 @list frobule:burfle this in front of any without numbers 1..10 2 2 which would be useful if `frobule' had more than one `burfle' verb and we wanted to see the first 10 lines of the one having `this' `in front of' `any' as its respective dobj/prep/iobj specifiers. 38 1 4 24 2 Syntax: @kill task_id 2 @kill [object]:[verb] 2 @kill soon [number-of-seconds] 2 @kill all 2 @kill %trailing_id 2 2 2 Immediately kills one or more forked tasks. The '@forked' command is useful for finding out what tasks you have pending; see 'help @forked' for details. Only the owner of a task may kill it. 2 2 @kill task_id kills only the task with that id. 2 2 @kill object:verb kills all tasks which were scheduled by the object running the verb named. Both object and verb are optional: @kill object: kills all tasks scheduled by that object, and @kill :verb kills all tasks which were scheduled by any object running that verb. This can be useful if you have several similar objects which are running tasks from similarly named verbs. (Perversely, @kill : kills all tasks... Any object running any task.) 2 2 @kill soon kills all tasks scheduled within the next minute. @kill soon number kills all tasks scheduled within that number of seconds, e.g. @kill soon 300 would kill all tasks scheduled within the next five minutes. This can be useful if you have a runaway task you want to quickly remove, but don't want to kill you later tasks. 2 2 @kill all kills all tasks. Like @kill soon, but more dramatic. 2 2 @kill %trailing_id expects you to specify the last few digits of a task id. It then kills all tasks that end with those digits. 2 2 Example: 2 @forked 2 1359083655 Sep 16 21:45:00 1991 yduJ #5803:heartbeat (10) [#68] 2 @kill %655 2 Killed: task 1359083655, verb #5803:heartbeat, line 10, this==#68 38 1 4 8 2 Syntax: @kids object 2 2 A quick way to find out the children of an object. Prints out the names and object numbers of the found children. Note: this is not a list of all descendents, just direct children. 2 2 Example: 2 @kids #3107 2 Generic Body of Chlorinated Water(#3107) has 3 kids. 2 The Pool(#1428) The Hot Tub(#388) Deep Blue Underground Pool(#17340) 2 5 4 22 2 Syntax: @forked 2 2 Gives a list of all of the forked tasks you own, along with detailed information about each one. The information includes the following: 2 2 Queue ID: 2 A numeric identifier for the task, for use in killing it (see 'help @kill'). 2 2 Start Time: 2 The time after which the task will begin execution. 2 2 Owner: 2 The player whose permissions under which the task is running. 2 Unless you are a wizard, @forked will show only your tasks. 2 2 Verb: 2 The object and verb-name of the code that forked the task. 2 2 Line: 2 The line number of the first statement that the task will execute when it starts. Note that the code for the verb in question may have changed since the task was forked; the forked task will use the version that was being executed when it was forked. 2 2 This: 2 The value of `this' for the forked task, in the case that it is different from (i.e., is a descendant of) the object on which the verb code lives. 38 1 4 3 2 Syntax: @edit <object>:<verb-name> [<dobj> [<prep> [<iobj>]]] 2 2 Enters the MOO Verb Editor for the named verb on the named object. See 'help editors' for more detail. 2 5 4 42 2 Syntax: @display <object>.[property] 2 ,[inherited_property] 2 :[verb] 2 ;[inherited_verb] 2 2 @display is a fancy version of @show. As @show, it can select individual verbs or properties to display. In addition, it can display all the verbs or properties defined on an object, or all the verbs or properties defined on any of the object's ancestors. Don't specify a property or verbname after the punctuation mark to get the "all" feature. Its display is more compact than that of @show (it uses a one-line format, and truncates values that don't fit in the value field). 2 2 You may mix properties and verbs on the command line, but the parser may become confused. (E.g. @display object,: displays all properties including inherited ones plus all locally defined verbs on the object.) 2 2 Examples: 2 Individual property: 2 @display poolsweep.count 2 .count yduJ (#68) r c 8 2 2 Individual verb: 2 @display poolsweep:tell 2 #3560:tell yduJ (#68) rxd this none this 2 2 All properties, including one truncated value: 2 @display poolsweep. 2 poolsweep (#3560) [ readable ] 2 Owned by yduJ (#68). 2 Child of generic thing (#5). 2 Location The Pool (#1428). 2 .gagged yduJ (#68) r c 0 2 .count yduJ (#68) r c 8 2 .messages yduJ (#68) r c {"The poolsweep stir.. 2 .index yduJ (#68) r c 2 2 .quantum yduJ (#68) r c 20 2 2 Inherited verbs, edited for brevity, showing verbs from various parents, with owners, permissions, and argument lists. 2 @d poolsweep; 2 poolsweep (#3560) [ readable ] 2 #3560:tell yduJ (#68) rxd this none this 2 #3560:description yduJ (#68) rxd this none this 2 #5:"g*et t*ake" Haakon (#2) rxd this none none 2 #5:"d*rop th*row" Haakon (#2) rxd this none none 2 #5:moveto Haakon (#2) rxd this none this 2 #1:description Haakon (#2) rxd this none this 2 #1:look_self Haakon (#2) rxd this none this 2 2 Some aspects of @display can be customized (see `help @display-options'). 2 5 4 3 2 Syntax: @dbsize 2 2 @dbsize goes through the entire database, counting the valid and invalid objects, giving a summary at the end. This information can be useful, but because this command is cpu intensive, it should be used sparingly. 2 5 4 11 2 Syntax: @copy <object>:<verb> to [<newobject>][:<newverb>] 2 2 Copies the code of the named verb to the new object and verbname. Permissions, and arguments of the new verb are set to match those of the old verb in the event that the new verb does not already exist. One of <newobject> or :<newverb> must be supplied. If no new verbname is given, the old name is retained. Likewise, <newobject> defaults to <object> if not given. 2 2 Examples: 2 @copy me:verbname to myobject 2 @copy me:test_verb to myobject:real_verb 2 2 In general, @copy'ing verbs is a bad idea. In the vast majority of cases, the desired effect can be accomplished with parenting (i.e., having <object> be an ancestor of <newobject>), which has the advantage that if a verb is updated or fixed, this immediately becomes available to child objects that inherit this verb. In such a case, copies that were made using @copy have to be tracked down and fixed by hand. 2 2 This facility is provided for those rare occasions where one has no choice but to actually copy the verb. 2 5 4 7 2 Syntax: @chparent <object> to <new parent> 2 2 Changes the parent of the named object to be the named parent. The object acquires all the verb and property definitions of its parent. Newly acquired properties are initilialized with `clear' values so that they inherit whatever values are currently assigned to the parent's corresponding properties (see `help @clearproperty'). 2 2 If the player does not own <new parent>, it must have been set `fertile'. <object> must be owned by the player. Neither <object> nor any descendant can define any property which already exist on <new parent>. Use @check-chparent (see `help @check-chparent') to list such property conflicts. 2 2 It is also sometimes the case that you will own some object and want to @chparent some child of that object that you do not own. Use @disinherit (see `help @disinherit') in such situations. 2 5 4 25 2 Syntax: @chmod <object> <object-permissions> 2 @chmod <object>.<prop-name> <property-permissions> 2 @chmod <object>:<verb-name> <verb-permissions> 2 2 Changes the permissions of an object, property or verb, to those given. The following table shows what permission bits are allowed for each form of the command: 2 <object-permissions> r, w, f 2 <property-permissions> r, w, c 2 <verb-permissions> r, w, x, d 2 2 See the LambdaMOO Programmer's Manual for their meanings. 2 2 To clear all of the permissions for an object, verb, or property, use "" as the second argument. 2 2 @chmod also accepts +, !, and - as modifiers for a single permission to add or subtract that permission from the current set. (! and - are the same.) 2 2 Examples: 2 2 Set a verb to be Readable and Callable: 2 @chmod chair:sit rx 2 2 Set a verb to be not Callable, without changing its other permissions: 2 @chmod cookies:eat !x 2 2 Set an object to be Writeable in addition to any current bits: 2 @chmod table +w 2 5 4 5 2 Syntax: @args <object>:<verb-name> <dobj> 2 @args <object>:<verb-name> <dobj> <prep> 2 @args <object>:<verb-name> <dobj> <prep> <iobj> 2 2 Changes the direct object, preposition, and/or indirect object specifiers for the named verb on the named object. Any specifiers not provided on the command line are not changed. The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'. The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions'. 38 1 4 13 2 Syntax: .program <object>:<verb-name> 2 : 2 : 2 <lines of MOO code> 2 : 2 : 2 . 2 2 Provides or changes the MOO program associated with the named verb on the named object. 2 2 This command is mostly obsolete. Use @program instead. The only reason this command still exists is that it is a server builtin command that will continue to work in the (unlikely) event that @program gets trashed ... 2 2 This command works differently from most other MOO commands, in that it actually changes how the server will interpret later lines that you type to it. After typing the '.program' line, you are in 'programming mode'. All lines that you type in this mode are simply saved away in the server until you type a line containing only a single period ('.'). At that point, those lines are interpreted as a MOO program and are checked for syntax errors. If none are found, a message to that effect is printed and the code you typed is installed as the program for the verb in question. In any case, after typing the '.' line, you are returned to the normal input-handling mode. 38 1 4 32 2 Syntax: @clearproperty <object>.<prop-name> 2 2 This clears <object>'s <prop-name> property. That is the property value becomes `clear' and all further references to this property will use the value of the same property on the parent object. Note that you can only clear inherited properties. Nor is this the same as removing a property; the property continues to exist. 2 2 `@clearproperty' can be abbreviated as `@clearp'. 2 2 Example: 2 2 @create #1 named foo 2 You now have foo with object number #42 and parent Root Class (#1). 2 [foo, as a child of #1 has a .description property which starts out clear] 2 ;#1.description 2 => "" 2 ;#1.description = "You see nothing special" 2 => "You see nothing special" 2 ;#42.description 2 => "You see nothing special" 2 ;#42.description = "Something special" 2 => "Something special" 2 [foo.description is now no longer clear; it has a value of its own] 2 ;#1.description = "Boring" 2 => "Boring" 2 ;#42.description 2 => "Something special" 2 2 @clearp foo.description 2 Property #42.description cleared; value is now "Boring". 2 [foo.description is now clear again] 2 ;#1.description = "" 2 => "" 2 ;#42.description 2 => "" 2 5 4 2 2 *forward* 2 @disinherit 2 5 4 11 2 Syntax: @disinherit <object> 2 @disinherit <object> [from <parent>] 2 2 Synonym: @disown 2 2 This command is used to remove an unwanted child from an object you own. If you owned said child, you could use @chparent; this command is to cover the other case, namely where you don't own the child. 2 2 Both forms of this command chparent <object> to its grandparent, provided you own the parent. The second form matches the string you supply for <object> against the list of children of the given <parent>. 2 2 Turning off the fertile bit (.f) for a particular object prevents others from creating children of it or chparenting to it (see `help @chmod'). 2 Note also that, though the name might seem to indicate otherwise, this command does not change the ownership of any object. 2 5 4 2 2 *forward* 2 @display-options 2 5 4 24 2 Syntax: @display-option 2 @display-option <option> 2 2 Synonym: @displayoption 2 2 The display options customize the behavior of the @display command to your particular taste. The first form of this command displays all of your display options. The second form displays just that one option, one of the flags listed below. 2 2 The remaining forms of this command are for setting your display options: 2 2 @display-option +<flag> 2 @display-option -<flag> 2 @display-option !<flag> (equivalent to -<flag>) 2 2 These respectively set and reset the specified flag 2 2 -blank_tnt Show the verb args on all verbs. 2 +blank_tnt Don't show the verb args on `this none this' verbs. 2 -shortprep Use full prepositions (e.g., "on top of/on/onto/upon") 2 +shortprep Use short prepositions (e.g., "on") 2 -thisonly Specifying . (:) to retrieve all properties (verbs) will go 2 up the ancestor chain until it finds a readable object with 2 properties (verbs) defined on it. 2 +thisonly Specifying . (:) to retrieve all properties (verbs) will only 2 display properties (verbs) defined on the object itself. 2 5 4 24 2 *pass* 2 @add-feature 2 2 Note to programmers: @add-feature and @remove-feature are front-ends for player:add_feature and :remove_feature. 2 2 :add_feature returns 2 2 * E_PERM unless caller == this || $perm_utils:controls(caller_perms()) 2 2 * E_INVARG if feature is not an object or is invalid 2 2 * E_PERM if the object is not feature_ok 2 2 * a true value otherwise 2 2 and calls feature:feature_add, if the verb exists. 2 2 :remove_feature returns 2 2 * E_PERM unless caller == this || $perm_utils:controls(caller_perms()) || caller_perms() == feature.owner 2 2 * a true value otherwise 2 2 and calls feature:feature_remove, if the verb exists. 2 5 4 2 2 *forward* 2 @add-feature 2 5 4 6 2 *pass* 2 features 2 2 Note to programmers: In order to be available for general use as a feature, an object must have a verb or property named "feature_ok" which returns a true value. 2 2 When a feature is added to a player's features list, feature:feature_add is called, if it exists, with the player in question as its argument. Likewise, when a feature is removed, feature:feature_remove is called. 2 5 4 4 2 *pass* 2 examine 2 2 [Note to programmers: the 'obvious' verbs are those that can be invoked as commands and are not specified by the :hidden_verbs verb. The default definition of "hidden" is "not readable". You can override this definition with a :hidden_verbs verb that gets the default list with pass(@args) and then alters that list.] 2 5 4 5 2 *pass* 2 mail 2 - - - - - 2 See `help mail-system' for a description of the programming interface to the mail system. 2 In particular, see `help $mail_recipient' for information on creating new mail collections. 2 5 4 7 2 #<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string. String is matched in the current room unless one of exit|player|inventory is given. 2 If neither .<property>|.parent nor <code> is specified, just return <thing>. 2 If .<property> is named, return <thing>.<property>. .parent returns parent(<thing>). 2 If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>. 2 For example, the command 2 #JoeFeedback.parent player for tonum(%#) 2 will return 26026 (unless Joe has chparented since writing this). 2 5 5 2 5 5 2 4 4 1 2 Programmer Help 2 5 2 This provides help on the programmer commands available on $prog and related topics. 2 5 4 2 0 69643 0 750754798 2 1 #25 Wizard Help 16 38 -1 -1 -1 32 -1 24 0 35 @guests @log @egrep @unnewt @denewt @newt @grep $site_db graylist blacklist @recycle wiz-index @dump-database @players @net-who @@who make-core-database @quota @detoad @untoad @toad @grepcore @who-calls @abort-shutdown @shutdown @programmer @shout @chown redlist @blacklist @graylist @redlist @make-guest @spooflist spooflist 40 4 7 2 Syntax: @guests [<n>] 2 2 Prints out the log of guest player connections, indicating connect/disconnect times and where they came from. If a numeric argument n is given, then only the last n entries in the log are consulted (useful for when the full log is rather long) --- note that connections and disconnections are separate entries so the actual printed listing will be about half this length. 2 2 Alternate: @guests now 2 2 Prints out in @who format all connected guests. In place of the location field is the current connect site. 38 5 4 11 2 Syntax: @log <message> 2 @log 2 2 The first form enters <message> as a one-line comment in the server log. 2 The second form prompts for a sequence of lines to be collectively entered as an extended comment. This uses $command_utils:read_lines so all of those conventions apply, i.e., a period on a line by itself ends the text, `@abort' aborts the command, etc...). Example: If Wizard (#2) types 2 2 @log I did $dump_interval=3600 2 2 the following line appears in the server log 2 2 Aug 19 22:36:52: COMMENT: from Wizard (#2): I did $dump_interval=3600 38 5 4 2 2 *forward* 2 @grep 38 5 4 2 2 *forward* 2 @denewt 38 5 4 10 2 Syntax: @denewt <player> [commentary] 2 2 Synonyms: @unnewt 2 @get-better 2 2 @denewt reverses the effects of @newt, moving a player's :denewt_confunc back to :confunc, but checking first that :confunc is the same as $wiz_utils:newt_confunc (if not, we save :confunc as :newt_confunc and complain). 2 2 Mail is sent to $newt_log including any commentary you provide. E.g., 2 2 @denewt Twit He promises not to do it again. 38 5 4 25 2 *subst* 2 Syntax: @newt <player> [commentary] 2 2 The @newt command temporarily prevents logins on a given player. 2 It works by installing a confunc ($wiz_utils:newt_confunc) on player that does an immediate ;boot_player(), saving any existing :confunc the user may have as :denewt_confunc. Use @denewt to reverse this. 2 2 You must give either the player's full name or its object number. 2 Also, this command does not let you @newt yourself. 2 2 Mail will be sent to $newt_log, listing the player's .all_connect_places and including any commentary you provide. E.g., 2 2 @newt Twit did real annoying things. 2 2 As with @toad and @programmer, there are messages that one may set 2 2 @newt [%[$wiz.newt_msg]] 2 Printed to everyone in the room in which the victim is being @newted. 2 If you're worried about accidentally newting yourself in the process of 2 setting this message, you can't (see above). 2 2 @newt_victim [%[$wiz.newt_victim_msg]] 2 Printed to the victim. 2 This is followed by $login:newt_registration_string(). 2 2 See `help @toad' if you need something more drastic. 38 5 4 13 2 *pass* 2 @grep 2 2 For wizards, the following forms are also available for doing full-db searches 2 2 @grep <pattern> 2 @grep <pattern> 2 @egrep <pattern> from [#]<n> 2 @egrep <pattern> from [#]<n> 2 2 the first two search all objects in the database while the last two search the range [#<n>..max_object()] 2 2 See also: @grepcore, @who-calls. 38 5 4 21 2 Database of places 2 ------------------ 2 i.e., places people have connected from. 2 2 :add(sitename,player) 2 records the fact that player connected from sitename. 2 :load() 2 clears the db and reloads all of the player connection info. 2 2 .domain 2 default domain for unqualified sitenames given to :add. 2 2 For each domain we keep a list of players and subdomains. 2 For example, :add("doc.ic.ac.uk",#666) enters #666 on the lists for "doc.ic.ac.uk", and, if we have to create an entry for "doc.ic.ac.uk", we enter "doc" on the list for "ic.ac.uk", "ic" on the list for "ac.uk", etc.... In this case, :find("ic") will return the "ic.ac.uk" list if there is no other domain in $site_db starting with "ic". Note that the "ic.ac.uk" list may contain both objects, i.e., namely players that have connected from the site "ic.ac.uk", and strings, i.e., subdomains of "ic.ac.uk" like "doc". 2 2 :find_exact(string) => player/subdomain list or $failed_match 2 :find_all_keys(string) => list of all domains that begin with string 2 :find_key (string) => unique domain that begins with string, 2 $ambiguous_match or $failed_match 2 2 The other $generic_db functions (:find, :find_all) are also available, though admittedly less useful. 38 5 4 2 2 *forward* 2 blacklist 38 5 4 28 2 2 The Site Blacklist 2 ------------------ 2 $login maintains three lists of hosts/domains to support player registration schemes and blocking of connections from highly untrusted hosts: 2 2 .redlist -- all connections from these sites are disabled 2 .blacklist -- player creation and guest logins are disabled 2 .graylist -- advisory list of potential trouble spots (putting a site on the 2 .graylist merely annotates it in @net-who listings). 2 .spooflist -- guests from these sites cannot use @request to request 2 a character 2 2 The lists are kept in a special format so it is highly recommended that you 2 either use $wiz:@*list/@un*list or the following verbs to query/update the 2 respective lists rather than bash them directly: 2 2 $login:*listed (host) is host is on .*list? 2 $login:*list_add (domain or subnet) add domain or subnet to .*list 2 $login:*list_remove(domain or subnet) remove domain or subnet from .*list 2 2 where `*' is one of `black', `red', `gray', or `spoof'. 2 2 One may either specify a domain name (e.g., "baz.edu") or a numeric IP address (e.g., "36.0.23.17"). Domain names match all hosts underneath that domain, so, e.g., puting "baz.edu" on a list effectively adds "x.bax.edu" for all x as well. 2 Likewise, an incomplete numeric address, e.g., "128.42" will match that entire subnet, in this case all hosts whose IP numbers have the form "128.42.m.n" for arbitrary integers m and n. 2 2 One may also give a domain name containing a wildcard ("*"), e.g., "fritz*.baz.edu", in which case all hostnames matching in the sense of $string_utils:match_string() are considred to be on the list. Wildcard matching should be avoided since it is more time-consuming. 2 2 It should be noted that, since there is no direct access to the domain name service from within the MOO, it is possible for a host to be blacklisted or redlisted via its domain name, and yet have someone be able to connect from that host (and, in the case of a blacklisted host, create a character) --- this can happen if the name service is down and connection_name() on that player thus has given the numeric IP address rather than the domain name. Similarly, if you list a host by IP number alone, it will still be possible to get in via the site's domain name. Thus to be completely assured of shutting out a site, you need to list it both by domain name and IP number. 38 5 4 6 2 *pass* 2 @recycle 2 2 Of course, wizards are allowed to @recycle anything at all. 2 2 There is, however, a block (in $player:recycle) against recycling actual players, i.e., descendants of $player that have the player flag set. This is mainly to prevent stupid mistakes. If, for some reason, you want to recycle a player, you need to @toad it first. 38 5 4 2 2 *index* 2 Wizard Help Topics 38 5 4 3 2 Syntax: @dump-database 2 2 Invokes the builtin dump_database(), which requests that the server checkpoint the database at its next opportunity. It is not normally necessary to call this function; the server automatically checkpoints the database at regular intervals; see the chapter on server assumptions about the database for details. 38 5 4 3 2 Syntax: @players [with objects] 2 2 Hmmm... what *does* this do, anyway? 38 5 4 9 2 Syntax: @net-who [<player>...] 2 @net-who from [<domain>] 2 2 Synonym: @@who 2 2 @net-who without any arguments prints all connected users and hosts. If one or more <player> arguments are given, the specified users are printed along with their current or most recent connected hosts. If any of these hosts are mentioned on $login.blacklist or $login.graylist (see `help blacklist'), 2 an annotation appears. 2 2 With a `from...' argument, this command consults $site_db and prints all players who have ever connected from the given domain. 38 5 4 2 2 *forward* 2 @net-who 38 5 4 3 2 Syntax: make-core-database 2 2 ...makes a core database (surprise). Film at 11... 38 5 4 7 2 *pass* 2 @quota 2 2 - - - - - - - - - - - - - - - - - - - - - - - - - - 2 Syntax: @quota <player> is <number> [<reason>] 2 2 This second and more interesting form of the verb changes a player's quota to the given number. Mail will be sent to $quota_log; the message will include the <reason> if such is given. 38 5 4 2 2 *forward* 2 @untoad 38 5 4 13 2 Syntax: @untoad <object> [as <name>,<alias>,<alias>...] 2 2 Synonym: @detoad 2 2 Turns the object into a player. 2 If the name/alias... specification is given, the object is also renamed. 2 In order for this to work, the object must be a nonplayer descendant of $player and the new object name (or the original name if none is given in the command line) must be available for use as a player name. As with ordinary player @renaming, any aliases which are unavailable for use as player names are eliminated. 2 2 If the object is a descendant of $guest, then it becomes a new guest character. 2 Otherwise the object is chowned to itself. In the latter case, it is advisable to check that the .password property has something nontrivial in it. 2 2 If the object is a descendant of $prog, then its .programmer flag is set. 2 Note that the .wizard flag is not set under any circumstances. 38 5 4 26 2 *subst* 2 Syntax: @toad <player> [graylist|blacklist|redlist] 2 @toad! <player> 2 @toad!! <player> 2 2 Resets the player flag of <player> (thus causing <player> to be booted), resets the .programmer and .wizard flags, chowns the player object to $hacker, and removes all of its names and aliases from $player_db. 2 2 You must give either the player's full name or its object number. 2 Also, this command does not let you @toad yourself. 2 2 In some cases you may wish to add the player's last connected site to the site graylist, blacklist or redlist --- see `help blacklist' --- in order to invoke various kinds of blocking on that site (e.g., if player creation is enabled, you may want to enter the player on the blacklist to keep him from immediately creating a new character). Specifying one of the listnames `graylist', `blacklist' or `redlist' will do this. 2 2 @toad! <player> is synonymous with @toad <player> blacklist 2 @toad!! <player> is synonymous with @toad <player> redlist 2 2 There are messages that one may set to customize toading. After all, a toading is (supposed to be) a rare event and you will doubtless want to put on a good show. Thus we have 2 2 @toad [%[$wiz.toad_msg]] 2 Printed to everyone in the room in which the victim is being @toaded. 2 If you're worried about accidentally toading yourself in the process of 2 setting this message, see above. 2 2 @toad_victim [%[$wiz.toad_victim_msg]] 2 Printed to the victim. 2 2 These are pronoun_subbed with victim == dobj. 38 5 4 6 2 Syntax: @grepcore <pattern> 2 @who-calls <verbname> 2 2 @grepcore pattern is @grep pattern in {all core objects}. Core objects are computed for you by #0:core_objects(). 2 2 @who-calls greps for the verbname + "(", hoping to catch it as a verb call. Currently @who-calls does not allow you to restrict the search as @grep does. (Volunteers?) 38 5 4 2 2 *forward* 2 @grepcore 38 5 4 3 2 Syntax: @abort-sh*utdown [<text>] 2 2 This aborts any shutdown currently in progress (i.e., set in motion by @shutdown). All players are notified that no shutdown will actually occur; <text>, if given will be included in this notification. 38 5 4 5 2 Syntax: @shutdown [in <m>] [<text>] 2 2 This is the friendly way to do a server shutdown; it arranges for the actual shutdown to take place `m' minutes hence (default two). Shutdown is preceded by a sequence of warnings to all connected players. Warnings are likewise given to all players who connect during this time. <text>, if given is included in these warning messages, perhaps as an explanation for why the server is being shut down. 2 2 Shutdown may be aborted at any time by using @abort-shutdown. 38 5 4 16 2 *subst* 2 Syntax: @programmer <player> 2 2 Sets the programmer flag on the indicated player and sends mail to $new_prog_log. 2 2 If the player is not already a descendant of $prog, we @chparent him/her to $prog. In this case, if $prog has a larger .ownership_quota than its ancestors, then we raise the player's quota by the difference between $prog.ownership_quota and the .ownership_quota of the common ancestor of player and $prog, be this $player or some intermediate class. 2 2 There are messages that one may set to customize how the granting of a programmer bit looks to the victim and to any onlookers. After all, this is a seminal event in a MOOer's life... Thus we have 2 2 @programmer [%[$wiz.programmer_msg]] 2 Printed to everyone in the room with the victim being @programmer'ed. 2 2 @programmer_victim [%[$wiz.programmer_victim_msg]] 2 Printed to the victim. 2 2 These are pronoun subbed with victim == dobj. 38 5 4 3 2 Syntax: @shout <text> 2 2 Broadcasts the given text to all connected players. 38 5 4 13 2 Syntax: @chown <object> [to] <owner> 2 @chown <object>.<propname> [to] <owner> 2 @chown <object>:<verbname> [to] <owner> 2 2 Changes the ownership of the indicated object, property or verb. 2 2 Verb ownership changes are fairly straightforward, being merely a matter of changing the verb_info() on a single verb. 2 2 Changing an object ownership includes changing the ownership on all +c properties on that object. Note that @chown will not change the ownership of any other properties, nor will it change verb ownerships. Use @grant if you need to do a more complete ownership change. The quota of the former owner is increased by one, as is the quota of the new owner decreased by one. 2 2 Changing a property ownership is truly hairy. If the property is +c one shouldnot be doing this, unless it is to correct a past injustice which caused the property to be owned by the wrong player. In the case of -c properties, the property ownership is changed on all descendent objects (currently, if +c instances of a -c property are found in the traversal of all of the descendants, these are not changed, being deemed sufficiently weird that they should be handled on a case-by-case basis...). 2 2 If there's any justice, a future version of the server will prevent occurrences of (1) +c properties being owned by someone other than the object owner (2) -c properties with different owners on descendant objects (3) -c properties that are +c on some descendants. 38 5 4 2 2 *forward* 2 blacklist 38 5 4 16 2 Syntax: @redlist [<domain or subnet> [commentary]] 2 @blacklist [<domain or subnet> [commentary]] 2 @graylist [<domain or subnet> [commentary]] 2 @spooflist [<domain or subnet> [commentary]] 2 2 Syntax: @unredlist [<domain or subnet> [commentary]] 2 @unblacklist [<domain or subnet> [commentary]] 2 @ungraylist [<domain or subnet> [commentary]] 2 @unspooflist [<domain or subnet> [commentary]] 2 2 With no argument, the current contents of the corresponding list are printed. 2 Otherwise, the specified domain or subnet is added to or removed from the list and mail will be sent to $site_log. 2 2 If the given domain or subnet has subdomains/subsubnets that are already on the list, you will be prompted as to whether you want to remove them. Note that adding an entry for a particular domain or subnet effectively adds all subdomains/subsubnets, so unless there's some reason for keeping an explicit entry for a particular subdomain, chances are you will indeed want to remove them. One reason to keep an explicit entry for a subdomain would be if you intended to unlist the full domain later but wanted to be sure you didn't unlist the subdomain in the process. 2 2 See `help blacklist' for a description of the functions of these lists. 38 5 4 2 2 *forward* 2 @blacklist 38 5 4 2 2 *forward* 2 @blacklist 38 5 4 7 2 Syntax: @make-guest <adjective> 2 2 This creates a new guest character. For example, 2 @make-guest Loud 2 creates a child of $guest, owned by $hacker, named Loud_Guest and with aliases Loud and Loud_Guest. 2 2 See also `help @make-player'. 38 5 4 2 2 *forward* 2 @blacklist 38 5 4 2 2 *forward* 2 blacklist 38 5 5 38 5 5 38 4 4 1 2 Wizard Help 38 5 4 1 2 This describes the various commands available on $wiz. 38 5 4 2 0 20399 0 750666134 2 1 #26 Wizard Utilities 16 2 -1 -1 -1 1 -1 15 28 set_programmer 2 173 -1 set_player 2 173 -1 set_owner 2 173 -1 set_property_owner 2 165 -1 unset_player 2 173 -1 set_property_flags 2 165 -1 _set_property_flags 2 173 -1 random_password 2 173 -1 queued_tasks 2 165 -1 player_cmd_perms 2 173 -1 isnewt 2 165 -1 newt_confunc 2 169 -1 initialize_owned 2 173 -1 verify_owned_objects 2 173 -1 connected_wizards 38 165 -1 all_wizards 38 165 -1 rename_all_instances 2 165 -1 missed_help 2 173 -1 show_missing_help 2 173 -1 init_for_core 2 173 -1 show_netwho_listing 2 173 -1 show_netwho_from_listing 2 173 -1 check_player_request check_reregistration 2 173 -1 make_player 2 173 -1 send_new_player_mail 2 173 -1 do_make_player 2 93 -2 do_register 2 173 -1 do_new_password 2 93 -2 4 default_programmer_quota default_player_quota missed_help_strings missed_help_counters 8 0 20 2 5 0 7 2 5 4 0 2 1 4 0 2 1 5 2 4 4 1 2 Wizard Utilities 2 5 4 36 2 Wizard Utilities 2 ---------------- 2 The following functions are substitutes for various server builtins. 2 Anytime one feel tempted to use one of the expressions on the right, 2 use the corresponding one on the left instead. This will take care 2 of various things that the server (for whatever reason) does not handle. 2 2 :set_programmer(object) object.programmer = 1; 2 chparent object to $prog 2 send mail to $prog_log 2 2 :set_player(object[,nochown]) set_player_flag(object,1); 2 set player flag, 2 add name/aliases to $player_db, 2 and maybe do a self chown. 2 2 :unset_player(object[,newowner]) set_player_flag(object,0); 2 unset player flag, 2 remove name/aliases from $player_db 2 chown to newowner if given 2 2 :set_owner(object, newowner) object.owner = newowner; 2 change ownership on object 2 change ownership on all +c properties 2 juggle .ownership_quotas 2 2 :set_property_owner(object, property, newowner) 2 change owner on a given property 2 if this is a -c property, we change the owner on all descendants 2 for which this is also a -c property. 2 Polite protest if property is +c and newowner != object.owner. 2 2 :set_property_flags(object, property, flags) 2 change the permissions on a given property and propagate these to 2 *all descendants*. property ownership is changed on descendants 2 where necessary. 2 5 4 2 0 36224 0 750665908 2 1 #27 Site DB 0 38 -1 -1 -1 39 -1 18 6 find* _only _every* 38 173 -1 add 38 173 -1 load 2 173 -1 domain_literal 38 173 -1 init_for_core 38 173 -1 cleanup 38 41 -1 1 domain 8 2 localdomain 38 1 2 38 5 5 38 1 4 4 2 2 4 0 4 0 38 0 5 38 4 4 3 2 sitedb 2 site 2 db 38 5 4 2 2 This object holds a db of places from which players have connected (see `help $site_db'). 2 The site blacklist and the graylist live as well (see `help blacklist'). 38 5 4 2 0 1452162 0 750668012 2 1 #28 Math Utilities 16 38 -1 -1 -1 1 -1 53 35 sin 38 173 -1 cos 38 173 -1 tan 38 173 -1 xsin 38 173 -1 xcos 38 173 -1 factorial 38 173 -1 pow 38 173 -1 fibonacci 38 173 -1 geometric 38 173 -1 divmod 38 173 -1 combinations 38 173 -1 permutations 38 173 -1 simpson 38 173 -1 parts 38 173 -1 sqrt 38 173 -1 arctan 38 173 -1 div 38 173 -1 mod 38 173 -1 aexp 38 173 -1 random 38 173 -1 random_range 38 173 -1 is_prime 38 173 -1 AND 38 173 -1 OR 38 173 -1 XOR 38 173 -1 NOT 38 173 -1 BLFromInt 38 173 -1 IntFromBL 38 173 -1 gcd greatest_common_divisor 38 173 -1 lcm least_common_multiple 38 173 -1 are_rel_prime are_relatively_prime 38 173 -1 base_conversion 38 173 -1 exp 38 173 -1 norm 38 173 -1 sum 38 173 -1 4 base_alphabet tangents factor taylor 8 2 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 38 5 4 45 0 174 0 349 0 524 0 699 0 874 0 1051 0 1227 0 1405 0 1583 0 1763 0 1943 0 2125 0 2308 0 2493 0 2679 0 2867 0 3057 0 3249 0 3443 0 3639 0 3838 0 4040 0 4244 0 4452 0 4663 0 4877 0 5095 0 5317 0 5543 0 5773 0 6008 0 6248 0 6494 0 6745 0 7002 0 7265 0 7535 0 7812 0 8097 0 8390 0 8692 0 9004 0 9325 0 9656 0 10000 38 5 0 10000 38 5 0 100 38 5 5 38 4 4 4 2 Math Utilities 2 Math_Utils 2 trigonometric utilites 2 trig_utils 38 5 4 47 2 Trigonometric/Exponential functions: 2 sin(a),cos(a),tan(a) -- returns 10000*(the value of the corresponding 2 trigonometric function) angle a is in degrees. 2 arctan([x,]y) -- returns arctan(y/x) in degrees in the range -179..180. 2 x defaults to 10000. Quadrant is that of (x,y). 2 exp(x[,n]) -- calculates e^x with an nth order taylor polynomial 2 2 Statistical functions: 2 combinations(n,r) -- returns the number of combinations given n objects 2 taken r at a time. 2 permutations(n,r) -- returns the number of permutations possible given 2 n objects taken r at a time. 2 2 Number decomposition: 2 div(n,d) -- correct version of / (handles negative numbers correctly) 2 mod(n,d) -- correct version of % (handles negative numbers correctly) 2 divmod(n,d) -- {div(n,d),mod(n,d)} 2 parts(n,q[,i]) -- returns a list of two elements {integer,decimal fraction} 2 2 Other math functions: 2 sqrt(x) -- returns the largest integer n <= the square root of x 2 pow(x,n) -- returns x^n 2 factorial(x) -- returns x! 2 2 Series: 2 fibonacci(n) -- returns the 1st n fibonacci numbers in a list 2 geometric(x,n) -- returns the value of the nth order geometric series at x 2 2 Integer Properties: 2 gcd(a,b) -- find the greatest common divisor of the two numbers 2 lcm(a,b) -- find the least common multiple of the two numbers 2 are_relatively_prime(a,b) -- return 1 if a and b are relatively prime 2 is_prime(n) -- returns 1 if the number is a prime and 0 otherwise 2 2 Miscellaneous: 2 random(n) -- returns a random number from 0..n if n > 0 or n..0 if n < 0 2 random_range(n[,mean]) -- returns a random number from mean - n..mean + n 2 with mean defaulting to 0 2 simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- returns the numerical 2 approximation of an integral using simpson's rule 2 2 Bitwise Arithmetic: 2 AND(x,y) -- returns x AND y 2 OR(x,y) -- returns x OR y 2 XOR(x,y) -- returns x XOR y (XOR is the exclusive-or function) 2 NOT(x) -- returns the complement of x 2 All bitwise manipulation is of 32-bit values. 38 5 4 2 0 19005 0 750666785 2 1 #29 Set Utilities 16 38 -1 -1 -1 1 -1 26 7 union 38 173 -1 intersection 38 173 -1 diff*erence 38 173 -1 contains 38 173 -1 exclusive_or xor 38 173 -1 difference_suspended diff_suspended 38 173 -1 equal 38 173 -1 0 4 5 38 4 4 2 2 Set Utilities 2 set_utilities 38 5 4 16 2 This object is useful for operations that treat lists as sets (i.e., 2 without concern about order and assuming no duplication). 2 2 union(set, set, ...) => union 2 intersection(set, set, ...) => intersection 2 2 diff*erence(set1, set2, ..., setn) 2 => result of removing all elements of sets 2..n from set 1. 2 exclusive_or(set, set, set, ...) 2 => all elements that are contained in exactly one of the sets 2 2 contains(set1, set2, ..., setn) 2 => true if and only if all of sets 2..n are subsets of set 1 2 2 equal(set1, set2) 2 => true if and only if set1 and set2 are equal 38 5 4 2 0 4429 0 750754537 2 1 #30 Builtin Function Help 16 38 -1 -1 -1 32 -1 25 1 init_for_core 2 173 -1 81 match() rmatch() substitute() sqrt() server_log() pass() builtin-index open_network_connection() connection_name() shutdown() dump_database() memory_usage() reset_max_object() renumber() server_version() output_delimiters() callers() kill_task() queued_tasks() read() suspend() task_id() seconds_left() ticks_left() caller_perms() set_task_perms() eval() boot_player() notify() idle_seconds() connected_seconds() connected_players() set_player_flag() is_player() players() set_verb_code() verb_code() delete_verb() add_verb() set_verb_args() verb_args() set_verb_info() verb_info() verbs() delete_property() add_property() set_property_info() property_info() properties() move() max_object() recycle() children() parent() valid() chparent() create() setremove() setadd() listset() listdelete() listinsert() listappend() strcmp() rindex() index() crypt() strsub() length() ctime() time() random() abs() max() min() toobj() tonum() tostr() typeof() clear_property() is_clear_property() 86 4 20 2 Syntax: match (str <subject>, str <pattern> [, <case-matters>]) => list 2 rmatch (str <subject>, str <pattern> [, <case-matters>]) => list 2 2 The function `match()' (`rmatch()') searches for the first (last) occurrence of the regular expression <pattern> in the string <subject>. If <pattern> is syntactically malformed, then `E_INVARG' is returned. If no match is found, the empty list is returned; otherwise, these functions return a list containing information about the match (see below). By default, the search ignores upper/lower case distinctions. If <case-matters> is provided and true, then case is treated as significant in all comparisons. 2 2 The list that `match()' (`rmatch()') returns contains the details about the match made. The list is in the form: 2 2 {<start>, <end>, <replacements>, <subject>} 2 2 where <start> is the index in STRING of the beginning of the match, <end> is the index of the end of the match, <replacements> is a list described below, and <subject> is the same string that was given as the first argument to the `match()' or `rmatch()'. 2 2 The <replacements> list is always nine items long, each item itself being a list of two numbers, the start and end indices in <subject> matched by some parenthesized sub-pattern of <pattern>. The first item in <replacements> carries the indices for the first parenthesized sub-pattern, the second item carries those for the second sub-pattern, and so on. If there are fewer than nine parenthesized sub-patterns in <pattern>, or if some sub-pattern was not used in the match, then the corresponding item in <replacements> is the list {0, -1}. See the discussion of `%)' in `help regular-expressions', for more information on parenthesized sub-patterns. 2 2 match("foo", "f*o") => {1, 2, {{0, -1}, ...}, "foo"} 2 match("foo", "fo*") => {1, 3, {{0, -1}, ...}, "foo"} 2 match("foobar", "o*b") => {2, 4, {{0, -1}, ...}, "foobar"} 2 rmatch("foobar", "o*b") => {4, 4, {{0, -1}, ...}, "foobar"} 2 match("foobar", "f%(o*%)b") => {1, 4, {{2, 3}, {0, -1}, ...}, "foobar"} 2 2 See `help regular-expressions' for information on the syntax and semantics of patterns. 38 5 4 2 2 *forward* 2 match() 38 5 4 9 2 Syntax: substitute (str <template>, list <subs>) => str 2 2 Performs a standard set of substitutions on the string <template>, using the information contained in <subs>, returning the resulting, transformed <template>. <Subs> should be a list like those returned by `match()' or `rmatch()' when the match succeeds. 2 2 In <template>, the strings `%1' through `%9' will be replaced by the text matched by the first through ninth parenthesized sub-patterns when `match()' or `rmatch()' was called. The string `%0' in <template> will be replaced by the text matched by the pattern as a whole when `match()' or `rmatch()' was called. 2 2 subs = match("*** Welcome to LambdaMOO!!!", "%(%w*%) to %(%w*%)"); 2 substitute("I thank you for your %1 here in %2.", subs) 2 => "I thank you for your Welcome here in LambdaMOO." 38 5 4 3 2 Syntax: sqrt (num <x>) => num 2 2 Returns the square root of <x>. If <x> is negative, then `E_INVARG' is returned. 38 5 4 3 2 Syntax: server_log (str <message> [, <is-error>]) => none 2 2 The text in <message> is sent to the server log. If the programmer is not a wizard, then `E_PERM' is returned. If <is-error> is provided and true, then <message> is marked in the server log as an error. 38 5 4 31 2 Syntax: pass (<arg>,...) 2 2 Often, it is useful for a child object to define a verb that *augments* 2 the behavior of a verb on its parent object. For example, the root object 2 (an ancestor of every other object) defines a :description() verb that 2 simply returns the value of `this.description'; 2 this verb is used by the implementation of the `look' command. 2 In many cases, a programmer would like the description of some object to 2 include some non-constant part; for example, a sentence about whether or not 2 the object was `awake' or `sleeping'. This sentence should be added onto the 2 end of the normal description. The programmer would like to have a means of 2 calling the normal `description' verb and then appending the sentence onto the 2 end of that description. The function `pass()' is for exactly such situations. 2 2 pass() calls the verb with the same name as the current verb but as 2 defined on the parent of the object that defines the current verb. The 2 arguments given to the called verb are the ones given to pass() and the 2 returned value of the called verb is returned from the call to pass(). 2 The initial value of `this' in the called verb is the same as in the 2 calling verb. 2 2 Thus, in the example above, the child-object's :description() verb might 2 have the following implementation: 2 2 return pass(@args) + " It is " + (this.awake ? "awake." | "sleeping."); 2 2 That is, it calls its parent's :description() verb and then appends to the 2 result a sentence whose content is computed based on the value of a property on 2 the object. 2 2 In the above example, `pass()' would have worked just as well, since :description() is not normally given any arguements. However, it is a good idea to get into the habit of using `pass(@args)' rather than `pass(args[1])' or `pass()' even if the verb being pass()ed to is already known to take a set number of arguments or none at all. For one thing, though the args may be irrelevant to the code that you've written, it may be that the corresponding verb on the parent has been rewritten to take additional arguments, in which case you will want your verb to continue to work... 38 5 4 2 2 *index* 2 Server Built-in Functions 38 5 4 52 2 Syntax: open_network_connection (<value>, ...) => obj 2 2 Establishes a network connection to the place specified by the arguments and 2 pretends that a new, normal player connection has been established from there. 2 The new connection, as usual, will not be logged in initially and will have a 2 negative object number associated with it for use with `read()', 2 `notify()', and `boot_player()'. This object number is the value returned by this function. 2 2 If the programmer is not a wizard or if the `OUTBOUND_NETWORK' compilation 2 option was not used in building the server, then `E_PERM' is returned. If 2 the network connection cannot be made for some reason, then other errors will 2 be returned, depending upon the particular network implementation in use. 2 2 For the BSD UNIX network implementation (the only publicly-available one as of 2 this writing), there must be two arguments, a string naming a host (possibly 2 using the numeric Internet syntax) and a number specifying a TCP port. If a 2 connection cannot be made because the host does not exist, the port does not 2 exist, the host is not reachable or refused the connection, `E_INVARG' is 2 returned. If the connection cannot be made for other reasons, including 2 resource limitations, then `E_QUOTA' is returned. 2 2 It is worth mentioning a couple of tricky points concerning the use of this 2 function. 2 2 Since the server treats the new connection like any other normal 2 player connection, it will naturally try to parse any input from that 2 connection as commands in the usual way. To prevent this treatment, it is 2 necessary to ensure that some task is always suspended using `read()' on 2 the connection whenever the server considers a line of input from it. That 2 way, the line of input will be given to that task instead of being parsed as a 2 command. The only reliable way to ensure this is for the task that opens the 2 connection to enter an infinite loop reading from the connection. One possible 2 structure for such a task is as follows: 2 2 conn = open_network_connection(...); 2 read(conn); 2 while (1) 2 line = read(conn); 2 fork (0) 2 this:handle_input(line); 2 endfork 2 endwhile 2 2 The first call to `read()' in this example is to discard the null line of 2 input always automatically supplied by the server for new connections; for more 2 details, see the discussion of `#0:do_login_command' in the section on 2 server commands and database assumptions. 2 2 The second fine point to be considered is that, unless the new connection 2 eventually `logs in' in the usual way for players, the server will impose its 2 usual five-minute timeout on it, shutting down the connection unless new input 2 arrives at least once every five minutes. 38 5 4 15 2 Syntax: connection_name (obj <player>) => str 2 2 Returns a network-specific string identifying the connection being used by the 2 given player. If the programmer is not a wizard and not <player>, then 2 `E_PERM' is returned. If <player> is not currently connected, then 2 `E_INVARG' is returned. 2 2 For the BSD UNIX network implementation (the only publicly-available one as of 2 this writing), the string has the form 2 2 "<number> from <host>" 2 2 where <number> is a remarkably uninteresting internal server index and 2 <host> is either the name or decimal TCP address of the host from which the 2 player is connected. 38 5 4 5 2 Syntax: shutdown (str <message>) => none 2 2 Requests that the server shut itself down at its next opportunity. Before 2 doing so, the given <message> is printed to all connected players. If the 2 programmer is not a wizard, then `E_PERM' is returned. 38 5 4 7 2 Syntax: dump_database () => none 2 2 Requests that the server checkpoint the database at its next opportunity. It 2 is not normally necessary to call this function; the server automatically 2 checkpoints the database at regular intervals; see the chapter on server 2 assumptions about the database for details. If the programmer is not a wizard, 2 then `E_PERM' is returned. 38 5 4 17 2 Syntax: memory_usage () => list 2 2 On some versions of the server, this returns statistics concerning the server 2 consumption of system memory. The result is a list of lists, each in the 2 following format: 2 2 {<block-size>, <nused>, <nfree>} 2 2 where <block-size> is the size in bytes of a particular class of memory 2 fragments, <nused> is the number of such fragments currently in use in the 2 server, and <nfree> is the number of such fragments that have been reserved 2 for use but are currently free. 2 2 On servers for which such statistics are not available, `memory_usage()' 2 returns `{}'. The compilation option `USE_SYSTEM_MALLOC' controls 2 whether or not statistics are available; if the option is provided, statistics 2 are not available. 38 5 4 10 2 Syntax: reset_max_object () => none 2 2 The server's idea of the highest object number ever used is changed to be the 2 highest object number of a currently-existing object, thus allowing reuse of 2 any higher numbers that refer to now-recycled objects. If the programmer is 2 not a wizard, then `E_PERM' is returned. 2 2 This operation is intended for use in making new versions of the LambdaCore 2 database from the then-current LambdaMOO database, and other similar 2 situations. Its use requires great care. 38 5 4 19 2 Syntax: renumber (obj <object>) => obj 2 2 The object number of the object currently numbered <object> is changed to 2 be the least nonnegative object number not currently in use and the new object 2 number is returned. If <object> is not valid, then `E_INVARG' is 2 returned. If the programmer is not a wizard, then `E_PERM' is returned. 2 If there are no unused nonnegative object numbers less than <object>, then 2 <object> is returned and no changes take place. 2 2 The references to <object> in the parent/children and location/contents 2 hierarchies are updated to use the new object number, and any verbs, properties 2 and/or objects owned by <object> are also changed to be owned by the new 2 object number. The latter operation can be quite time consuming if the 2 database is large. No other changes to the database are performed; in 2 particular, no object references in property values or verb code are updated. 2 2 This operation is intended for use in making new versions of the LambdaCore 2 database from the then-current LambdaMOO database, and other similar 2 situations. Its use requires great care. 38 5 4 22 2 Syntax: server_version () => str 2 2 Returns a string giving the version number of the MOO server in the following 2 format: 2 2 "<major>.<minor>.<release>" 2 2 where <major>, <minor>, and <release> are all decimal numbers. 2 2 The major version number changes very slowly, only when existing MOO code might 2 stop working, due to an incompatible change in the syntax or semantics of the 2 programming language, or when an incompatible change is made to the database 2 format. 2 2 The minor version number changes more quickly, whenever an upward-compatible 2 change is made in the programming language syntax or semantics. The most 2 common cause of this is the addition of a new kind of expression, statement, or 2 built-in function. 2 2 The release version number changes as frequently as bugs are fixed in the 2 server code. Changes in the release number indicate changes that should only 2 be visible to users as bug fixes, if at all. 38 5 4 8 2 Syntax: output_delimiters (obj <player>) => list 2 2 Returns a list of two strings, the current "output prefix" and "output 2 suffix" for <player>. If <player> does not have an active network 2 connection, then `E_INVARG' is returned. If either string is currently 2 undefined, the value `""' is used instead. See the discussion of the 2 `PREFIX' and `SUFFIX' commands in the next chapter for more 2 information about the output prefix and suffix. 38 5 4 22 2 Syntax: callers () => list 2 2 Returns information on each of the verbs currently waiting to resume execution 2 in the current task. When one verb calls another verb, execution of the caller 2 is temporarily suspended, pending the called verb returning a value. At any 2 given time, there could be several such pending verbs: the one that called the 2 currently executing verb, the verb that called that one, and so on. The result 2 of `callers()' is a list, each element of which gives information about 2 one pending verb in the following format: 2 2 {<this>, <verb-name>, <programmer>, <verb-loc>, <player>} 2 2 where <this> is the initial value of the variable `this' in that verb, 2 <verb-name> is the name used to invoke that verb, <programmer> is 2 the player with whose permissions that verb is running, <verb-loc> is the 2 object on which that verb is defined, and <player> is the initial value of 2 the variable `player' in that verb. 2 2 The first element of the list returned by `callers()' gives information on 2 the verb that called the currently-executing verb, the second element describes 2 the verb that called that one, and so on. The last element of the list 2 describes the first verb called in this task. 38 5 4 6 2 Syntax: kill_task (num <task-id>) => none 2 2 Removes the task with the given <task-id> from the queue of waiting tasks. 2 If the programmer is not the owner of that task and not a wizard, then 2 `E_PERM' is returned. If there is no task on the queue with the given 2 <task-id>, then `E_INVARG' is returned. 38 5 4 25 2 Syntax: queued_tasks () => list 2 2 Returns information on each of the forked, suspended or reading tasks owned by 2 the programmer (or, if the programmer is a wizard, all queued tasks). The 2 returned value is a list of lists, each of which encodes certain information 2 about a particular queued task in the following format: 2 2 {<task-id>, <start-time>, <ticks>, <clock-id>, 2 <programmer>, <verb-loc>, <verb-name>, <line>, <this>} 2 2 where <task-id> is a numeric identifier for this queued task, 2 <start-time> is the time after which this task will begin execution (in 2 `time()' format), <ticks> is the number of ticks this task will have 2 when it starts (always 20,000 now), <clock-id> is a number whose value is 2 no longer interesting, <programmer> is the permissions with which this task 2 will begin execution (and also the player who "owns" this task), 2 <verb-loc> is the object on which the verb that forked this task was 2 defined at the time, <verb-name> is that name of that verb, <line> is 2 the number of the first line of the code in that verb that this task will 2 execute, and <this> is the value of the variable `this' in that verb. 2 For reading tasks, <start-time> is `-1'. 2 2 The <ticks> and <clock-id> fields are now obsolete and are retained 2 only for backward-compatibility reasons. They may disappear in a future 2 version of the server. 38 5 4 46 2 Syntax: read ([obj <player>]) => str 2 2 This function suspends the current task, waiting for a line of input from the 2 given <player> (which defaults to the player that typed the command that 2 initiated the current task), and resumes when such a line is received, 2 returning that line as a string. Upon resumption, the task is given a full 2 quota of ticks and seconds. `Read()' may only be called by a wizard, and, 2 unless <player> is given explicitly, only in a command task that has never 2 been suspended by a call to `suspend()'. Otherwise, `E_PERM' is 2 returned. If the given `player' is not currently connected and has no 2 pending lines of input, `read()' returns `E_INVARG'. 2 2 These restrictions on the use of `read()' without an explicit argument 2 preserve the following simple invariant: if input is being read from a player, 2 it is for the task started by the last command that player typed. This 2 invariant adds responsibility to the programmer, however. If your program 2 calls another verb before doing a `read()', then that verb must also not 2 suspend. As an example, consider the following, which refers to the verbs 2 programmed in the `suspend()' example in `help suspend()': 2 2 .program #0:read_twice_A 2 s = read(); /* success depends on programmer's permissions */ 2 #0:callee_A(); /* callee_A does not suspend */ 2 t = read(); /* success depends on programmer's permissions */ 2 . 2 2 .program #0:read_twice_B 2 s = read(); /* success depends on programmer's permissions */ 2 #0:callee_B(); /* callee_B does suspend */ 2 t = read(); /* fails, returning E_PERM */ 2 . 2 2 In three of the four calls to `read()', success depends on on the 2 programmer's permissions. However, the second `read()' in 2 `#0:read_twice_B' always fails and returns `E_PERM'. This is because 2 the task was suspended, even though `#0:read_twice_B' did not do the 2 actual suspending. Hence, if you want to read some input (by using 2 `read()' directly or by calling other verbs which do the reading), you 2 must make sure that the task is not suspended before the reading. This 2 includes making sure that any verbs you call, directly or indirectly, also do 2 not suspend. 2 2 It is possible to call `read()' many times in the same command task, so 2 long as the task does not call `suspend()' or an explicit argument is 2 given. The best use for `read()' with an explicit argument is in 2 conjunction with `open_network_connection()', if it is enabled. 38 5 4 61 2 Syntax: suspend (num <seconds>) => none 2 2 Suspends the current task, and resumes it after at least <seconds> seconds. 2 When the task is resumed, it will have a full quota of ticks and seconds. This 2 function is useful for programs that run for a long time or require a lot of 2 ticks. If <seconds> is negative, then `E_INVARG' is returned. 2 2 In some sense, this function forks the `rest' of the executing task. However, 2 there is a major difference between the use of `suspend(<seconds>)' 2 and the use of the `fork (<seconds>)'. The `fork' statement 2 creates a new task (a "forked task") while the currently-running task still 2 goes on to completion, but a `suspend()' suspends the currently-running 2 task (thus making it into a "suspended task"). This difference may be best 2 explained by the following examples, in which one verb calls another: 2 2 .program #0:caller_A 2 #0.prop = 1; 2 #0:callee_A(); 2 #0.prop = 2; 2 . 2 2 .program #0:callee_A 2 fork(5) 2 #0.prop = 3; 2 endfork 2 . 2 2 .program #0:caller_B 2 #0.prop = 1; 2 #0:callee_B(); 2 #0.prop = 2; 2 . 2 2 .program #0:callee_B 2 suspend(5); 2 #0.prop = 3; 2 . 2 2 Consider `#0:caller_A', which calls `#0:callee_A'. Such a task would 2 assign 1 to `#0.prop', call `#0:callee_A', fork a new task, return to 2 `#0:caller_A', and assign 2 to `#0.prop', ending this task. Five 2 seconds later, if the forked task had not been killed, then it would begin to 2 run; it would assign 3 to `#0.prop' and then stop. So, the final value of 2 `#0.prop' (i.e., the value after more than 5 seconds) would be 3. 2 2 Now consider `#0:caller_B', which calls `#0:callee_B' instead of 2 `#0:callee_A'. This task would assign 1 to `#0.prop', call 2 `#0:callee_B', and suspend. Five seconds later, if the suspended task had 2 not been killed, then it would resume; it would assign 3 to `#0.prop', 2 return to `#0:caller', and assign 2 to `#0.prop', ending the task. 2 So, the final value of `#0.prop' (i.e., the value after more than 5 2 seconds) would be 2. 2 2 A suspended task, like a forked task, can be described by the 2 `queued_tasks()' function and killed by the `kill_task()' function. 2 Suspending a task does not change its task id. A task can be suspended again 2 and again by successive calls to `suspend()'. 2 2 Once `suspend()' has been used in a particular task, then the 2 `read()' function will always return `E_PERM' in that task. For more 2 details, see the description of `read()' below. 38 5 4 5 2 Syntax: task_id () => num 2 2 Returns the numeric identifier for the currently-executing task. Such numbers 2 are randomly selected for each task and can therefore safely be used in 2 circumstances where unpredictability is required. 38 5 4 2 2 *forward* 2 ticks_left() 38 5 4 7 2 Syntax: ticks_left () => num 2 seconds_left () => num 2 2 These two functions return the number of ticks or seconds (respectively) left 2 to the current task before it will be forcibly terminated. These are useful, 2 for example, in deciding when to fork another task to continue a long-lived 2 computation. 38 5 4 6 2 Syntax: caller_perms () => obj 2 2 Returns the permissions in use by the verb that called the currently-executing 2 verb. If the currently-executing verb was not called by another verb (i.e., it 2 is the first verb called in a command or server task), then 2 `caller_perms()' returns `#-1'. 38 5 4 10 2 Syntax: set_task_perms (obj <player>) => none 2 2 Changes the permissions with which the currently-executing verb is running to 2 be those of <player>. If <player> is not a valid player object, then 2 `E_INVARG' is returned. If the programmer is neither <player> nor a 2 wizard, then `E_PERM' is returned. 2 2 Note: This does not change the owner of the currently-running verb, only the 2 permissions of this particular invocation. It is used in verbs owned by 2 wizards to make themselves run with lesser (usually non-wizard) permissions. 38 5 4 32 2 Syntax: eval (str <string>) => list 2 2 The MOO-code compiler processes <string> as if it were to be the program 2 associated with some verb and, if no errors are found, that fictional verb is 2 invoked. If the programmer is not, in fact, a programmer, then `E_PERM' 2 is returned. The normal result of calling `eval()' is a two element list. 2 The first element is true if there were no compilation errors and false 2 otherwise. The second element is either the result returned from the fictional 2 verb (if there were no compilation errors) or a list of the compiler's error 2 messages (otherwise). 2 2 When the fictional verb is invoked, the various built-in variables have values 2 as shown below: 2 2 player the same as in the calling verb 2 this #-1 2 caller the same as the initial value of `this' in the calling verb 2 2 args {} 2 argstr "" 2 2 verb "" 2 dobjstr "" 2 dobj #-1 2 prepstr "" 2 iobjstr "" 2 iobj #-1 2 2 The fictional verb runs with the permissions of the programmer and as if its 2 `d' permissions bit were on. 2 2 eval("return 3 + 4;") => {1, 7} 38 5 4 15 2 Syntax: boot_player (obj <player>) => none 2 2 Immediately terminates any currently-active connection to the given 2 <player>. If the programmer is not either a wizard or the same as 2 <player>, then `E_PERM' is returned. If there is no currently-active 2 connection to <player>, then this function does nothing. 2 2 If there was a currently-active connection, then the following two verb calls 2 are made before the connection is closed: 2 2 <player>:disfunc() 2 <player>.location:disfunc(<player>) 2 2 It is not an error if either of these verbs do not exist; the corresponding 2 call is simply skipped. 38 5 4 6 2 Syntax: notify (obj <player>, str <string>) => none 2 2 Outputs <string> (on a line by itself) to the user connected to the given 2 <player>. If the programmer is not <player> or a wizard, then 2 `E_PERM' is returned. If there is no currently-active connection to 2 <player>, then this function does nothing. 38 5 4 2 2 *forward* 2 connected_seconds() 38 5 4 7 2 Syntax: connected_seconds (obj <player>) => num 2 idle_seconds (obj <player>) => num 2 2 These functions return the number of seconds that the currently-active 2 connection to <player> has existed and been idle, respectively. If 2 <player> is not the object number of a player object with a 2 currently-active connection, then `E_INVARG' is returned. 38 5 4 4 2 Syntax: connected_players () => list 2 2 Returns a list of the object numbers of those player objects with 2 currently-active connections. 38 5 4 20 2 Syntax: set_player_flag (obj <object>, <value>) => none 2 2 Confers or removes the ``player object'' status of the given <object>, 2 depending upon the truth value of <value>. If <object> is not valid, 2 `E_INVARG' is returned. If the programmer is not a wizard, then 2 `E_PERM' is returned. 2 2 If <value> is true, then <object> gains (or keeps) ``player object'' 2 status: it will be an element of the list returned by `players()', the 2 expression `is_player(<object>)' will return true, and users can 2 connect to <object> by name when they log into the server. 2 2 If <value> is false, the <object> loses (or continues to lack) ``player 2 object'' status: it will not be an element of the list returned by 2 `players()', the expression `is_player(<object>)' will return 2 false, and users cannot connect to <object> by name when they log into the 2 server. In addition, if a user is connected to <object> at the time that 2 it loses ``player object'' status, then that connection is immediately broken, 2 just as if `boot_player(<object>)' had been called (see the 2 description of `boot_player()' below). 38 5 4 4 2 Syntax: is_player (obj <object>) => num 2 2 Returns a true value if the given <object> is a player object and a false 2 value otherwise. If <object> is not valid, `E_INVARG' is returned. 38 5 4 3 2 Syntax: players () => list 2 2 Returns a list of the object numbers of all player objects in the database. 38 5 4 2 2 *forward* 2 verb_code() 38 5 4 25 2 Syntax: verb_code (obj <object>, str <verb-name> [, <fully-paren> [, <indent>]]) => list 2 set_verb_code (obj <object>, str <verb-name>, list <code>) => list 2 2 These functions get and set (respectively) the MOO-code program associated with 2 the verb named <verb-name> on <object>. The program is represented as 2 a list of strings, one for each line of the program; this is the kind of value 2 returned by `verb_code()' and expected as the third argument to 2 `set_verb_code()'. For `verb_code()', the expressions in the 2 returned code are usually written with the minimum-necessary parenthesization; 2 if <full-paren> is true, then all expressions are fully parenthesized. 2 Also for `verb_code()', the lines in the returned code are usually not 2 indented at all; if <indent> is true, each line is indented to better show 2 the nesting of statements. 2 2 If <object> is not valid, then `E_INVARG' is returned. If 2 <object> does not define a verb named <verb-name>, then `E_VERBNF' 2 is returned. If the programmer does not have read (write) permission on the 2 verb in question, then `verb_code()' (`set_verb_code()') returns 2 `E_PERM'. If the programmer is not, in fact, a programmer, then 2 `E_PERM' is returned. 2 2 For `set_verb_code()', the result is a list of strings, the error messages 2 generated by the MOO-code compiler during processing of <code>. If the 2 list is non-empty, then `set_verb_code()' did not install <code>; the 2 program associated with the verb in question is unchanged. 38 5 4 7 2 Syntax: delete_verb (obj <object>, str <verb-name>) => none 2 2 Removes the verb named <verb-name> from the given <object>. If 2 <object> is not valid, then `E_INVARG' is returned. If the programmer 2 does not have write permission on <object>, then `E_PERM' is returned. 2 If <object> does not define a verb named <verb-name>, then 2 `E_VERBNF' is returned. 38 5 4 14 2 Syntax: add_verb (obj <object>, list <info>, list <args>) => none 2 2 Defines a new verb on the given <object>. The new verb's owner, permission 2 bits and name(s) are given by <info> in the same format as is returned by 2 `verb_info()'. The new verb's direct-object, preposition, and indirect-object 2 specifications are given by <args> in the same format as is returned by 2 `verb_args()'. The new verb initially has the empty program associated with 2 it; this program does nothing but return an unspecified value. 2 2 If <object> is not valid, or <info> does not specify a legitimate owner 2 and permission bits, or <args> is not a legitimate syntax specification, 2 then `E_INVARG' is retuned. If the programmer does not have write 2 permission on <object> or if the owner specified by <info> is not the 2 programmer and the programmer is not a wizard, then `E_PERM' is returned. 38 5 4 2 2 *forward* 2 verb_args() 38 5 4 12 2 Syntax: verb_args (obj <object>, str <verb-name>) => list 2 set_verb_args (obj <object>, str <verb-name>, list <args>) => none 2 2 These two functions get and set (respectively) the direct-object, preposition, and indirect-object specifications for the verb named <verb-name> on the given <object>. If <object> is not valid, then `E_INVARG' is returned. If <object> does not define a verb named <verb-name>, then `E_VERBNF' is returned. If the programmer does not have read (write) permission on the verb in question, then `verb_args()' (`set_verb_args()') returns `E_PERM'. Verb args specifications have the following form: 2 2 {<dobj>, <prep>, <iobj>} 2 2 where <dobj> and <iobj> are strings drawn from the set `"this"', `"none"', and `"any"', and <prep> is a string that is either `"none"', `"any"', or one of the prepositional phrases listed much earlier in the description of verbs in the first chapter. This is the kind of value returned by `verb_info()' and expected as the third argument to `set_verb_info()'. Note that for `set_verb_args()', <prep> must be only one of the prepositional phrases, not (as is shown in that table) a set of such phrases separated by `/' characters. `Set_verb_args()' returns `E_INVARG' if any of the <dobj>, <prep>, or <iobj> strings is illegal. 2 2 verb_args($container, "take") 2 => {"any", "out of/from inside/from", "this"} 2 set_verb_args($container, "take", {"any", "from", "this"}) 38 5 4 2 2 *forward* 2 verb_info() 38 5 4 19 2 Syntax: verb_info (obj <object>, str <verb-name>) => list 2 set_verb_info (obj <object>, str <verb-name>, list <info>) => none 2 2 These two functions get and set (respectively) the owner, permission bits, and 2 name(s) for the verb named <verb-name> on the given <object>. If 2 <object> is not valid, then `E_INVARG' is returned. If <object> 2 does not define a verb named <verb-name>, then `E_VERBNF' is returned. 2 If the programmer does not have read (write) permission on the verb in 2 question, then `verb_info()' (`set_verb_info()') returns 2 `E_PERM'. Verb info has the following form: 2 2 {<owner>, <perms>, <names>} 2 2 where <owner> is an object, <perms> is a string containing only 2 characters from the set `r', `w', `x', and `d', and 2 <names> is a string. This is the kind of value returned by 2 `verb_info()' and expected as the third argument to 2 `set_verb_info()'; the latter function returns `E_INVARG' if 2 <owner> is not valid or <perms> contains any illegal characters. 38 5 4 6 2 Syntax: verbs (obj <object>) => list 2 2 Returns a list of the names of the verbs defined directly on the given 2 <object>, not inherited from its parent. If <object> is not valid, 2 then `E_INVARG' is returned. If the programmer does not have read 2 permission on <object>, then `E_PERM' is returned. 38 5 4 8 2 Syntax: delete_property (obj <object>, str <prop-name>) => none 2 2 Removes the property named <prop-name> from the given <object> and all 2 of its descendants. If <object> is not valid, then `E_INVARG' is 2 returned. If the programmer does not have write permission on <object>, 2 then `E_PERM' is returned. If <object> does not directly define a 2 property named <prop-name> (as opposed to inheriting one from its parent), 2 then `E_PROPNF' is returned. 38 5 4 12 2 Syntax: add_property (obj <object>, str <prop-name>, <value>, list <info>) => none 2 2 Defines a new property on the given <object>, inherited by all of its 2 descendants; the property is named <prop-name>, its initial value is 2 <value>, and its owner and initial permission bits are given by <info> 2 in the same format as is returned by `property_info()'. 2 If <object> is not valid or <object> already has a property named 2 <prop-name> or <info> does not specify a legitimate owner and 2 permission bits, then `E_INVARG' is retuned. If the programmer does not 2 have write permission on <object> or if the owner specified by <info> 2 is not the programmer and the programmer is not a wizard, then `E_PERM' is 2 returned. 38 5 4 2 2 *forward* 2 property_info() 38 5 4 18 2 Syntax: property_info (obj <object>, str <prop-name>) => list 2 set_property_info (obj <object>, str <prop-name>, list <info>) => none 2 2 These two functions get and set (respectively) the owner and permission bits 2 for the property named <prop-name> on the given <object>. If 2 <object> is not valid, then `E_INVARG' is returned. If <object> 2 has no non-built-in property named <prop-name>, then `E_PROPNF' is 2 returned. If the programmer does not have read (write) permission on the 2 property in question, then `property_info()' (`set_property_info()') 2 returns `E_PERM'. Property info has the following form: 2 2 {<owner>, <perms>} 2 2 where <owner> is an object and <perms> is a string containing only 2 characters from the set `r', `w', and `c'. This is the kind of 2 value returned by `property_info()' and expected as the third argument to 2 `set_property_info()'; the latter function returns `E_INVARG' if 2 <owner> is not valid or <perms> contains any illegal characters. 38 5 4 6 2 Syntax: properties (obj <object>) => list 2 2 Returns a list of the names of the properties defined directly on the given 2 <object>, not inherited from its parent. If <object> is not valid, 2 then `E_INVARG' is returned. If the programmer does not have read 2 permission on <object>, then `E_PERM' is returned. 38 5 4 41 2 Syntax: move (obj <what>, obj <where>) => none 2 2 Changes <what>'s location to be <where>. This is a complex process 2 because a number of permissions checks and notifications must be performed. 2 The actual movement takes place as described in the following paragraphs. 2 2 <what> should be a valid object and <where> should be either a valid 2 object or `#-1' (denoting a location of 'nowhere'); otherwise 2 `E_INVARG' is returned. The programmer must be either the owner of 2 <what> or a wizard; otherwise, `E_PERM' is returned. 2 2 If <where> is a valid object, then the verb-call 2 2 <where>:accept(<what>) 2 2 is performed before any movement takes place. If the verb returns a 2 false value and the programmer is not a wizard, then <where> is 2 considered to have refused entrance to <what>; `move()' returns 2 `E_NACC'. If <where> does not define an `accept' verb, then it 2 is treated as if it defined one that always returned false. 2 2 If moving <what> into <where> would create a loop in the containment 2 hierarchy (i.e., <what> would contain itself, even indirectly), then 2 `E_RECMOVE' is returned instead. 2 2 The `location' property of <what> is changed to be <where>, and 2 the `contents' properties of the old and new locations are modified 2 appropriately. Let <old-where> be the location of <what> before it was 2 moved. If <old-where> is a valid object, then the verb-call 2 2 <old-where>:exitfunc(<what>) 2 2 is performed and its result is ignored; it is not an error if <old-where> 2 does not define a verb named `exitfunc'. Finally, if <where> and 2 <what> are still valid objects, and <where> is still the location of 2 <what>, then the verb-call 2 2 <where>:enterfunc(<what>) 2 2 is performed and its result is ignored; again, it is not an error if 2 <where> does not define a verb named `enterfunc'. 38 5 4 6 2 Syntax: max_object () => obj 2 2 Returns the largest object number yet assigned to a created object. Note that 2 the object with this number may no longer exist; it may have been recycled. 2 The next object created will be assigned the object number one larger than the 2 value of `max_object()'. 38 5 4 14 2 Syntax: recycle (obj <object>) => none 2 2 The given <object> is destroyed, irrevocably. The programmer must either 2 own <object> or be a wizard; otherwise, `E_PERM' is returned. If 2 <object> is not valid, then `E_INVARG' is returned. The children of 2 <object> are reparented to the parent of <object>. Before <object> 2 is recycled, each object in its contents is moved to `#-1' (implying a 2 call to <object>'s `exitfunc' verb, if any) and then <object>'s 2 `recycle' verb, if any, is called with no arguments. 2 2 After <object> is recycled, if the owner of the former object has a 2 property named `ownership_quota' and the value of that property is a 2 number, then `recycle()' treats that value as a "quota" and increments 2 it by one, storing the result back into the `ownership_quota' property. 38 5 4 2 2 *forward* 2 parent() 38 5 4 5 2 Syntax: parent (obj <object>) => obj 2 children (obj <object>) => list 2 2 These functions return the parent and a list of the children of <object>, 2 respectively. If <object> is not valid, then `E_INVARG' is returned. 38 5 4 8 2 Syntax: valid (obj <object>) => num 2 2 Returns a non-zero number (i.e., a true value) if <object> is a valid 2 object (one that has been created and not yet recycled) and zero (i.e., a false 2 value) otherwise. 2 2 valid(#0) => 1 2 valid(#-1) => 0 38 5 4 27 2 Syntax: chparent (obj <object>, obj <new-parent>) => none 2 2 Changes the parent of <object> to be <new-parent>. If the programmer 2 is neither a wizard or the owner of <object>, or if <new-parent> is not 2 fertile (i.e., its `f' bit is not set) and the programmer is neither the 2 owner of <new-parent> nor a wizard, then `E_PERM' is returned. If 2 <object> is not valid or if <object> or one of its descendants defines 2 a property with the same name as one defined either on <new-parent> or on 2 one of its ancestors, then `E_INVARG' is returned. 2 2 Changing an object's parent can have the effect of removing some properties 2 from and adding some other properties to that object and all of its descendants 2 (i.e., its children and its children's children, etc.). Let <common> be 2 the nearest ancestor that <object> and <new-parent> have in common 2 before the parent of <object> is changed. Then all properties defined by 2 ancestors of <object> under <common> (that is, those ancestors of 2 <object> that are in turn descendants of <common>) are removed from 2 <object> and all of its descendants. All properties defined by 2 <new-parent> or its ancestors under <common> are added to <object> 2 and all of its descendants. As with `create()', the newly-added 2 properties are given the same permission bits as they have on <new-parent>, 2 the owner of each added property is either the owner of the object it's added 2 to (if the `c' permissions bit is set) or the owner of that property on 2 <new-parent>, and the value of each added property is "clear"; see the 2 description of the built-in function `clear_property()' for details. All 2 properties that are not removed or added in the reparenting process are 2 completely unchanged. 38 5 4 45 2 Syntax: create (obj <parent> [, obj <owner>]) => obj 2 2 Creates and returns a new object whose parent is <parent> and whose owner 2 is as described below. Either the given <parent> object must be fertile 2 (i.e., its `f' bit must be set) or else the programmer must own 2 <parent> or be a wizard; otherwise `E_PERM' is returned. 2 `E_PERM' is also returned if <owner> is provided and not the same as 2 the programmer, unless the programmer is a wizard. After the new object is 2 created, its `initialize' verb, if any, is called with no arguments. 2 2 The new object is assigned the least non-negative object number that has not 2 yet been used for a created object. Note that no object number is ever reused, 2 even if the object with that number is recycled. 2 2 The owner of the new object is either the programmer (if <owner> is not 2 provided), the new object itself (if <owner> was given as `#-1'), or 2 <owner> (otherwise). 2 2 The other built-in properties of the new object are initialized as follows: 2 name "" 2 location #-1 2 contents {} 2 programmer 0 2 wizard 0 2 r 0 2 w 0 2 f 0 2 2 In addition, the new object inherits all of the other properties on 2 <parent>. These properties have the same permission bits as on 2 <parent>. If the `c' permissions bit is set, then the owner of the 2 property on the new object is the same as the owner of the new object itself; 2 otherwise, the owner of the property on the new object is the same as that on 2 <parent>. The initial value of every inherited property is "clear"; 2 see the description of the built-in function `clear_property()' for 2 details. 2 2 2 If the intended owner of the new object has a property named 2 `ownership_quota' and the value of that property is a number, then 2 `create()' treats that value as a "quota". If the quota is less than 2 or equal to zero, then the quota is considered to be exhausted and 2 `create()' returns `E_QUOTA' instead of creating an object. 2 Otherwise, the quota is decremented and stored back into the 2 `ownership_quota' property as a part of the creation of the new object. 38 5 4 2 2 *forward* 2 setadd() 38 5 4 16 2 Syntax: setadd (list <list>, <value>) => list 2 setremove (list <list>, <value>) => list 2 2 Returns a copy of <list> with the given <value> added or removed, as 2 appropriate. `setadd()' only adds <value> if it is not already an 2 element of <list>; <list> is thus treated as a mathematical set. 2 <value> is added at the end of the resulting list, if at all. Similarly, 2 `setremove()' returns a list identical to <list> if <value> is not 2 an element. If <value> appears more than once in <list>, only the 2 first occurrence is removed in the returned copy. 2 2 setadd({1, 2, 3}, 3) => {1, 2, 3} 2 setadd({1, 2, 3}, 4) => {1, 2, 3, 4} 2 setremove({1, 2, 3}, 3) => {1, 2} 2 setremove({1, 2, 3}, 4) => {1, 2, 3} 2 setremove({1, 2, 3, 2}, 2) => {1, 3, 2} 38 5 4 8 2 Syntax: listset (list <list>, <value>, num <index>) => list 2 2 Returns a copy of <list> with the <index>th element replaced by 2 <value>. If <index> is not in the range 2 `[1..length(<list>)]', then `E_RANGE' is returned. 2 2 x = {"foo", "bar", "baz"}; 2 listset(x, "mumble", 2) => {"foo", "mumble", "baz"} 38 5 4 8 2 Syntax: listdelete (list <list>, num <index>) => list 2 2 Returns a copy of <list> with the <index>th element removed. If 2 <index> is not in the range `[1..length(<list>)]', then 2 `E_RANGE' is returned. 2 2 x = {"foo", "bar", "baz"}; 2 listdelete(x, 2) => {"foo", "baz"} 38 5 4 27 2 Syntax: listinsert (list <list>, <value> [, num <index>]) => list 2 listappend (list <list>, <value> [, num <index>]) => list 2 2 These functions return a copy of <list> with <value> added as a new 2 element. `listinsert()' and `listappend()' add <value> before 2 and after (respectively) the existing element with the given <index>, if 2 provided. 2 2 The following three expressions always have the same value: 2 2 listinsert(<list>, <element>, <index>) 2 listappend(<list>, <element>, <index> - 1) 2 {@<list>[1..<index> - 1], <element>, @<list>[<index>..length(<list>)]} 2 2 If <index> is not provided, then `listappend()' adds the <value> 2 at the end of the list and `listinsert()' adds it at the beginning; this 2 usage is discouraged, however, since the same intent can be more clearly 2 expressed using the list-construction expression, as shown in the examples 2 below. 2 2 x = {1, 2, 3}; 2 listappend(x, 4, 2) => {1, 2, 4, 3} 2 listinsert(x, 4, 2) => {1, 4, 2, 3} 2 listappend(x, 4) => {1, 2, 3, 4} 2 listinsert(x, 4) => {4, 1, 2, 3} 2 {@x, 4} => {1, 2, 3, 4} 2 {4, @x} => {4, 1, 2, 3} 38 5 4 2 2 *forward* 2 listinsert() 38 5 4 8 2 Syntax: strcmp (str <str1>, str <str2>) => num 2 2 Performs a case-sensitive comparison of the two argument strings. If 2 <str1> is lexicographically less than <str2>, the 2 `strcmp()' returns a negative number. If the two strings are 2 identical, `strcmp()' returns zero. Otherwise, `strcmp()' 2 returns a positive number. The ASCII character ordering is used for the 2 comparison. 38 5 4 2 2 *forward* 2 index() 38 5 4 15 2 Syntax: index (str <str1>, str <str2> [, <case-matters>]) => num 2 rindex (str <str1>, str <str2> [, <case-matters>]) => num 2 2 The function `index()' (`rindex()') returns the index of the first 2 character of the first (last) occurrence of <str2> in <str1>, or zero 2 if <str2> does not occur in <str1> at all. By default the search for 2 an occurrence of <str2> is done while ignoring the upper/lower case 2 distinction. If <case-matters> is provided and true, then case is treated 2 as significant in all comparisons. 2 2 index("foobar", "o") => 2 2 rindex("foobar", "o") => 3 2 index("foobar", "x") => 0 2 index("foobar", "oba") => 3 2 index("Foobar", "foo", 1) => 0 38 5 4 19 2 Syntax: crypt (str <text> [, str <salt>]) => str 2 2 Encrypts the given <text> using the standard UNIX encryption method. If 2 provided, <salt> should be a two-character string for use as the extra 2 encryption ``salt'' in the algorithm. If <salt> is not provided, a random 2 pair of characters is used. In any case, the salt used is also returned as the 2 first two characters of the resulting encrypted string. 2 2 Aside from the possibly-random selection of the salt, the encryption algorithm 2 is entirely deterministic. In particular, you can test whether or not a given 2 string is the same as the one used to produced a given piece of encrypted text; 2 simply extract the first two characters of the encrypted text and pass the 2 candidate string and those two characters to `crypt()'. If the result is 2 identical to the given encrypted text, then you've got a match. 2 2 crypt("foobar") => "J3fSFQfgkp26w" 2 crypt("foobar", "J3") => "J3fSFQfgkp26w" 2 crypt("mumble", "J3") => "J3D0.dh.jjmWQ" 2 crypt("foobar", "J4") => "J4AcPxOJ4ncq2" 38 5 4 12 2 Syntax: strsub (str <subject>, str <what>, str <with> [, <case-matters>]) => str 2 2 Replaces all occurrences in <subject> of <what> with <with>, 2 performing string substitution. The occurrences are found from left to right 2 and all substitutions happen simultaneously. By default, occurrences of 2 <what> are searched for while ignoring the upper/lower case distinction. 2 If <case-matters> is provided and true, then case is treated as significant 2 in all comparisons. 2 2 strsub("%n is a fink.", "%n", "Fred") => "Fred is a fink." 2 strsub("foobar", "OB", "b") => "fobar" 2 strsub("foobar", "OB", "b", 1) => "foobar" 38 5 4 8 2 Syntax: length (<list or string>) => num 2 2 Returns the number of characters in <list or string>. 2 2 length("foo") => 3 2 length("") => 0 2 length({1, 2, 3}) => 3 2 length({}) => 0 38 5 4 17 2 Syntax: ctime ([num <time>]) => str 2 2 Interprets <time> as a time, using the same representation as given in the 2 description of `time()', and converts it into a 28-character, 2 human-readable string in the following format: 2 2 Mon Aug 13 19:13:20 1990 PDT 2 2 If the current day of the month is less than 10, then an extra blank appears 2 between the month and the day: 2 2 Mon Apr 1 14:10:43 1991 PST 2 2 If <time> is not provided, then the current time is used. 2 2 Note that `ctime()' interprets <time> for the local time zone of the 2 computer on which the MOO server is running. 38 5 4 4 2 Syntax: time () => num 2 2 Returns the current time, represented as the number of seconds that have 2 elapsed since midnight on 1 January 1970, Greenwich Mean Time. 38 5 4 4 2 Syntax: random (num <mod>) => num 2 2 <mod> must be a positive number; otherwise, `E_INVARG' is returned. A 2 number is chosen randomly from the range `[1..<mod>]' and returned. 38 5 4 4 2 Syntax: abs (num <x>) => num 2 2 Returns the absolute value of <x>. If <x> is negative, then the result 2 is `-<x>'; otherwise, the result is <x>. 38 5 4 2 2 *forward* 2 min() 38 5 4 6 2 Syntax: min (num <x>, ...) => num 2 max (num <x>, ...) => num 2 2 These two functions return the smallest or largest of their arguments, 2 respectively. All of the arguments must be numbers; otherwise `E_TYPE' is 2 returned. 38 5 4 10 2 Syntax: toobj (<value>) => obj 2 2 Converts the given MOO value into an object number and returns that object 2 number. The conversions are very similar to those for `tonum()' except 2 that for strings, the number *may* be preceded by `#'. 2 2 toobj("34") => #34 2 toobj("#34") => #34 2 toobj("foo") => #0 2 toobj({1, 2}) -error-> E_TYPE 38 5 4 14 2 Syntax: tonum (<value>) => num 2 2 Converts the given MOO value into a number and returns that number. Object 2 numbers are converted into the equivalent numbers, strings are parsed as the 2 decimal encoding of a number, and errors are converted into numbers obeying the 2 same ordering (with respect to `<=' as the errors themselves. 2 `tonum()' returns `E_TYPE' if <value> is a list. If <value> 2 is a string but the string does not contain a syntactically-correct number, 2 then `tonum()' returns 0. 2 2 tonum(#34) => 34 2 tonum("34") => 34 2 tonum(" - 34 ") => -34 2 tonum(E_TYPE) => 1 38 5 4 15 2 Syntax: tostr (<value>, ...) => str 2 2 Converts all of the given MOO values into strings and returns the concatenation 2 of the results. 2 2 tostr(17) => "17" 2 tostr(#17) => "#17" 2 tostr("foo") => "foo" 2 tostr({1, 2}) => "{list}" 2 tostr(E_PERM) => "Permission denied" 2 tostr("3 + 4 = ", 3 + 4) => "3 + 4 = 7" 2 2 Note that `tostr()' does not do a good job of converting lists into 2 strings; all lists, including the empty list, are converted into the string 2 `"{list}"'. 38 5 4 14 2 Syntax: typeof (<value>) => num 2 2 Takes any MOO value and returns a number representing the type of <value>. 2 The result is the same as the initial value of one of these built-in variables: 2 `NUM', `STR', `LIST', `OBJ', or `ERR'. Thus, one 2 usually writes code like this: 2 2 if (typeof(x) == LIST) ... 2 2 and not like this: 2 2 if (typeof(x) == 3) ... 2 2 because the former is much more readable than the latter. 38 5 4 15 2 Syntax: clear_property (obj <object>, str <prop-name>) => none 2 is_clear_property (obj <object>, str <prop-name>) => boolean 2 2 These two functions test for clear and set to clear, respectively, the property 2 named <prop-name> on the given <object>. If <object> is not valid, 2 then `E_INVARG' is returned. If <object> has no non-built-in property 2 named <prop-name>, then `E_PROPNF' is returned. If the programmer 2 does not have read (write) permission on the property in question, then 2 `is_clear_property()' (`clear_property()') returns `E_PERM'. 2 If a property is clear, then when the value of that property is queried the 2 value of the parent's property of the same name is returned. If the parent's 2 property is clear, then the parent's parent's value is examined, and so on. 2 If <object> is the definer of the property <prop-name>, as opposed to 2 an inheritor of the property, then `clear_property()' returns 2 `E_INVARG'. 38 5 4 2 2 *forward* 2 clear_property() 38 5 5 38 5 5 38 4 4 1 2 Builtin Function Help 38 5 4 32 2 A help database (in the sense of anything that is usable by $player:help()) is any object having the following two verbs: 2 2 :find_topics(string) 2 returns a list of strings or some boolean false value. 2 2 :get_topic(string) 2 given one of the strings returned by :find_topics this either 2 returns a list of strings (text to be spewed to the player) or 2 returns 1 to indicate that it has already taken care of printing 2 information to the player. 2 2 $player:help() consults any .help properties that exist on the player, its ancestors, player.location and its ancestors (in that order). These properties are assumed to have values that are objects or lists of objects, each object itself assumed to be a help database in the above sense. The main help database ($help) is placed at the end of the list of databases to be consulted. 2 2 The Generic Help Database (this object) is the standard model help database of which the actual help database itself ($help) is an instance. On help databases of this type, every help topic has a corresponding property, interpreted as follows: 2 2 this.(topic) = string - one-line help text. 2 this.(topic) = {"*verb*",@args} - call this:verb(@args) to get text 2 this.(topic) = any other list - multi-line help text 2 2 For the {"*verb*",...} form, the current verbs available are 2 2 {"*forward*", topic2, @rest} 2 - get topic2 help text and then append rest. 2 rest may, in turn, begin with a "*verb*"... 2 2 {"*subst*", @lines} 2 - all occurences of %[exp] in lines are replaced with value of exp. 2 exp is assumed to evaluate to a string. Evaluation is done using 2 $no_one's permissions so exp can only refer to public information. 2 2 {"*index*"} 2 - returns a list of all topics in this database, arranged in columns. 38 5 4 2 0 65428 0 750669221 2 1 #31 New-Prog-Log 0 38 47 -1 -1 46 -1 16 7 init_for_core 2 173 -1 receive_message 38 173 -1 display_seq_headers display_seq_full 38 173 -1 from_msg_seq 38 173 -1 to_msg_seq 38 173 -1 %to_msg_seq subject_msg_seq 2 173 -1 %from_msg_seq 2 173 -1 0 18 5 38 5 0 0 38 1 4 0 38 0 0 1 38 5 2 %n (%#) can't send to moderated list %t (%[#t]) directly. 38 5 4 0 38 5 4 0 38 5 4 1 1 2 38 1 4 2 1 2 1 31 38 1 0 2592000 38 5 0 0 38 1 4 0 38 0 5 38 5 5 38 5 5 38 4 4 3 2 New-Prog-Log 2 New_Prog_Log 2 NPL 38 1 2 Record of who's been made a @programmer. 38 5 4 2 0 44304 0 750756205 2 1 #32 Generic Help Database 144 38 -1 -1 -1 1 61 17 10 find_topics 2 165 -1 get_topic 2 165 -1 sort_topics 38 173 -1 columnize 38 173 -1 forward pass 38 165 -1 subst 38 173 -1 index 38 173 -1 initialize 2 173 -1 verbdoc 2 173 -1 dump_topic 2 165 -1 1 index 5 4 0 38 5 5 38 4 4 1 2 Generic Help Database 38 5 2 A help database of the standard form in need of a description. See `help $generic_help'... 38 5 4 2 0 7944 0 750670916 2 1 #33 Generic Guest 16 38 -1 -1 -1 6 -1 4 18 @password 2 93 -2 boot 2 173 -1 disfunc 2 173 -1 defer 2 173 -1 mail_catch_up 2 173 -1 create 38 89 -2 eject 38 173 -1 log 38 173 -1 confunc 2 173 -1 log_disconnect 2 165 -1 @last-c*onnection 2 29 -1 connection_name_hash 2 173 -1 my_huh 2 173 -1 @read 38 89 -2 set_current_folder 38 173 -1 @request*-character @register 2 89 11 init_for_core 2 173 -1 set_name set_aliases 2 173 -1 4 default_gender default_description request extra_confunc_msg 61 2 neuter 38 1 4 1 2 By definition, guests appear nondescript. 38 1 0 0 2 0 2 38 5 4 0 38 1 5 2 0 5 38 5 5 2 0 5 2 1 0 0 38 5 5 38 5 5 38 1 5 38 1 5 38 0 5 38 1 5 38 5 5 2 1 0 79 38 1 5 38 4 5 2 0 5 2 0 5 38 5 5 38 4 5 38 5 4 0 38 4 0 30 38 4 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 2 %t (%[#t]) is a guest character. 38 5 5 38 5 5 38 5 5 38 4 5 38 4 5 2 1 0 0 2 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 0 2 0 5 38 5 0 1 38 5 5 38 5 5 38 5 5 38 5 5 2 1 5 38 4 5 38 4 4 1 2 Generic Guest 2 1 4 1 2 By definition, guests appear nondescript. 38 5 4 2 0 11509 0 750668629 2 1 #34 Mr. Spell 16 38 -1 -1 -1 39 -1 -1 19 description 38 173 -1 valid 38 173 -1 get_input 38 165 -1 guess_words 38 165 -1 strip_chars 38 173 -1 find_exact 38 173 -1 sort 38 173 -1 _every_key 38 173 -1 _suspend 38 173 -1 insert delete delete2 38 173 -1 add_word 38 173 -1 remove_word 38 173 -1 submit 38 173 -1 words 38 13 -1 purge_entire_database 38 173 -1 random 38 173 -1 help_msg 38 13 -1 init_for_core 2 173 -1 clear-submitted 38 141 4 11863 worthl drive driver uns topi frien computa entries activa messa locatio setti sett creati lambd rigoro rigo programmer harde redef redem keybi keyb buffe artifice horizont vertica automati trunc redr scrol connecti emac fris cyni interse corner headlin keyw tablesp irritat bonu intere graz dozen pastu rollin fields proofr foote locati times inser clipb savi unk faili faile missp playe zigz zes zer zen zea zealo Ze Zan zag za Yv Yuk Yug Yuc yu yt yout yourse yours Youngs youn Yos York yor yon Yoke yok yog Yod yip yi yest yes yeo yell yello yel yeas year yaw yarm Yard yar yap Yank yan Yam Yal Yak yac yachts ya xyle xy Xero Xer xen xe X wyn Wya Wy Wu wron Wrong wrongd wro write writ wris wrin wrig wri wres wrec wrea wreat wre wrat wrap wra wr wov woul wou Wort worsh worse wors worr worm worl worksh works workp workma workm workb Words wool woody woodw woods woodr woodla Woodl woodc Wood woo wonde wond won womb woma wolv Wolf wol wok woe witt withs withh withe withdra withd witc with wisp wish wise wis wire wiretapp wiret wirem wir Winte Wint wins Winnip Winni Winn wink wingm wing winem wine Winds windo windb wind Winch winc win Wilso Wils Wilm willow willo Willia Williams Willi Willa Will Wilkin Wilki Wilk Wilh wilf Wile wildc wild Wil wiggl wiggi Wigg wig wie widt wido widg wide wid wick wic whos whoo whom whole wholes whol who' whiz Whitt whiteh white whit whist whis whirl whir whipp whip whin whims whim whic whet wherew where' whereo wherea wher when whel wheez wheel whee Whea what' what Whar Whal wha wet western weste Wesl West Wert Were wer Wend Wen Welles Welle well Weld welc Wel weir Wein weight weig Wei weed week wed we' Web weathers weat weari wear weap wealt weal weak wea ways wayl wax wave wavel wavef wav watt waters waterm Waterl waterf Wate watchma watchm watc Wat waste wast wasp washbo washb wash wart warra warr warp warm wareh ware wardr ward war wap wang wand want waltz Walte Walt wallo walle Walla wall walko walk Waldo Wald Wal wakef Wak Wait wais Wain wai Wah wagg wag waf wad wack wac vu vow Vouc vou vot vorti vort vora vor volunta volun volume volum volu Voltai volta Volt voll volcani volc vol voic vog voca vocal vocab vocabu voc voi Vl vivi Viva vivaci vivac viv vitrio vitri vitr vita vit visit visio Visi viscou visco visce visc visa vis viru virtuos virtuosi virtuo virt virg Virgi Virgini virgin vir viole viola vio vint vine vind vin villa villai vill vil vii vigi vigila vig viewp Vietn Viet Vienn Vien view video vide vid victoria Victori Victo vict Vick vicin vici vice vica vic vibr vibrat vib via vie vexa vex veteri vete vet vestig vesti vest ves vertic verti verte verteb vert versa versat Vers Vero Verna vern vermo vermi verm verit veri verdi Verd verbo verba verb veran verac vera Ver Venu venture ventu vent venom veno Veni veng Venet venera vener vene vend ven velv velo vell vela Vel vei vehi veh vege veg veer vee vec ve Vaug Vaud Vau Vat Vass vase vas vari varie varian varia var vap vani Vander Vande Vand Vanc van vam valu vall valid vali Valer valen valedicto valed vale val vain vai vagi vaga vag Vad vacuol vacuo vacu vacc vaca vacat vac utt uto utili util uti uter ute Ut usurp usur usua USI USC usa U. Ursu Urs urina urin uri urge urgen urg uret ure Urb ura Urani uran ur upw upto Upt upsta upstat upst upsi upse ups uproa upro upri upr uppercl upperc upp upl uphols upho uphe uph upd upbr upb unive univa Univ unite unitar unita unit unis unip unim unif unid unde underc und unc unb unan una umb umbra umbr umbi um ulti ult ulc ul Ukr Uk ug ub tyra tyrann Tyranni tyr typog typo typi typho Typh type typew typesett typese types Typ two twitc twit twis twir twin twil twig twi twen twel tweed twee twe twa TW TV tuto tut Tusk tusc Tuscan Tus turt turp turno turne turna turk Turi turbo turbin turbid turbi turb turn tup Tunis Tuni tungs tung tune tun tumu tumb tum tula tul tug tuf Tuck Tuc tubu tuber tube tub TT tsa ts trut trust trus trun trumpe trump Trum Trud truc trua Trout troub troubles troubl trou tropos tropo troph trop trom trol trod tro trivia trivi triv trium triumpha triu trit trist Tris tripo triple Triplet tripl trip trio trini trinit trin trime trim trilo trill trilli tril trigo trig triflu trif trie trid trick trichl trich Tric tribut tribun tribu tribes tribe trib Triang Triangula triangu trian tria tri tres trend trenc trenche tren trem tree trea treat treasu treaso treas tread treac tre travers traversa traver travel trave trav trau Trash tras trapezo trape trap transver transv transshipp transs transpos transpor transpo transpl transpi transpa transp transo transmu transmi transmitte transmitta transmitt transmit transmis transm transl transiti Transit transi transg transfu transfo transfi transfe transferr transfere transf transe transd transcrip transcr transco transce transcende transcen transc transa trans tranq tran your tramp you' you yo tram ye yea y traito trait trainm work word traine wor wom wo trail wit train tragi wi trage trag who traffick traf whi whe tradi trades wh wes trade wee tract we wa track trace way was trac Toy toxic wan w vo tox townsm vi va v towns town usu towh use us up towe un unio towa uni u ty tour touc tur tu tou try tru totem tote tra trai trad tota tr tow tot tos tortu torto tort tors thing Torr torp Toroi telephone toro torn teams take Tor suppor Tops topol style topo statesm top toothp standa spend tooth toot specifi spaces sovi tool sourc too tons someti smalle toni size situa tong sincer ton tomog tomo tomm serve tomb send toma tom seem secur toll toler tole Tol say tok toile rul toi revie togg tog retu tof TOE resou require todd Toda tod requir Toba remai Tob toas relatio relati relate toad toa to relat regio TN recor recen Titu receive receiv reas titi titani reache reach tita Tit raisi tire tira raise Tir quickl tipp provide tip tint proposi propose tink programm ting profit productiv producti product Tin timo produci produce processi probab time price timbe timb tim presen tilt possi populat til Tigr tigh tig tif plann tie tide performa tid tickl tick tic particular tibe Tibet Tib Ti ours thyroi organiz thyro thyr order thym thy operati operate thw open Thur thunders thunderb thun thumb number thum thul numbe numb thug thu thrus thru never throw throu name thron names ms mrs throa thro movi move thrif thri month thres three threa threat thread thre thra thr membe thous meeti thought thoug medica thou matter matte markete thoro fucke fuck fuch Thorn manager thori Thor thom make makes Tho thist this thirte thirt longe locate thirs thir locat livin thio thin Thim thiev thie thicke thic thi leadsm leader they' they Thet larges these thes keys Thermo keep thermi therm thereu its issue theret involve involv thereo investo there' therefo interna theref inflati therea individual there thera increase ther include includ theore theoret theor theol Theod Theo thenc then them theis thei thea havi The tha that' that thank than give thall thal Thai getty Th textur general textu text texa Tex tetrahedra tetrah forme tetraf tetr tet followe testim testic testi find testam figure testa test tess feel tes territ terrif eyes experienc terri terre Terra executiv terr examp terp europea tern termin estat termina estab termi term espe employe tera ter electroni tep tenu effo educat tenta tent economic tensio earni tensi tens earl teno doors tenne Tenn dolla does tene tender tende tend deve tenac tena ten describe describ tempt departm deman tempor tempo defensi Temple templ tempe decisio tempes temper temperat decide tempera temp tem tell custome telev telety telet create teles telepro telepr countri telephon teleph corporati telepa telep corporat teleo telegrap teleg continui Telec continue tele tel consumer Tek Teh consume constructi teethe teeth teet computer compute teen companio tee tedi communicati Ted communicat tech technoc techno comin Technic techni techn tec tea citiz teasp tease teas tear team teak teac te cause taxp taxo taxi buy tax taw buildi tav taut tau bring tattl tatt tate tat bette taste tast benefit tass believ Task tas Tarta tart Tarr tarpa tarp avera avai taran tara tar associati tapp associat tapi aske tape tap arms Tao announce tanta annou tantal Tant amou american alw tangen tange tang Tana tan Tamp additio adden activ actio accordi tamar tama tam tally Tall talk tali tale talc tal takeo tak tail tai Tah tag Taff taf tad tactic tacti tact tack Taci tach tachi tac tabul tabu table tables tablea tabl tab ta T systemi sys syru syring syrin syri Syr synthes synth synta synt synops synop synon syno synergi syne syndi synd synch synchron sync syna synaps synap syn sympt sympo symph sympa symp symb symbo symbi sym Sylva Sylv Syll syllo sylla syllabi syl syco syc syb Sy swu sword swor swo Switz Switc switchb swit swish swis swir swing swin swim swig swi swelt swel sweet sweep swee Swede Swed Swea sweat swe swath swat Swarth Swart swar swank swan swamp swam swal swag swab swa sw suze suz Sut sust suspi suspe suspens suspen susp susc Susa Sus survi surve survey surv surt surro surre surr surp surm surj surge surg surfa surf sure surc sur supre supra supr suppressi suppr suppos suppo suppl supple supp superv superst supers supern superl superi superfl superf superb supe sup suntann sunt sunshi sunsh suns Sunn sunl sunk sung sunf sunde sund sunbu sunb sun summi summe Summa summat summar summ Sume Suma sum sulta sult Sull sulk sulf sulfu sulfi sulfa sul suit suic sui suggesti sugg sug suffr Suffo suffic suffi suf sue Suda Sud suck succ succu succe successi succes suc subv subu subtr subtle subtl subte subt subsume subsu substituti substitut substi substa substantia subst subsis subsid subsi subs submitt submi subm subl subje subj sub su Styr styli styl sty Stut stur stupe stupef stup stun stump stum stuf studi stude Stud stuc stubb stub Stu struc struct stru strop strong stron Strom strob stro striv strip strin strik strid strict strick Stric stri stres strep streng stren stree strea stream stre stra straw strato strategi strate strata strat strang stran straig strai strab str stowa stow story storm store stor stop stoo stone stonewa stonew ston stom stole stol Stok stoi stoc Stockh stock sto Stir stip stink sting stin stimula stimulat stim still stile stil stig stiff stif stic stickl sti Steward stewa stew Stevens Steven stev Stet stern stere ster Stephens Stephe Stepha steph step stenog steno stenc sten stel Stei steepl steep Steel stee stea stear steam stealt steal stead ste stay Staun stau statut statue statu stationa statio stati state statesma states stater Stat stas starv start starli starl Stark starc star Stapl staph stap stann stand stanch stanc stan stamp stami Stam stall stale stal stairw stair stai stagn stage stag Staf stad stac stab stablem stabl sta st SS squirm squire squir squi squee squea squeak sque squa squaw squatte squatt squat squas squal squad sq spy zig sput spur spun spum spu spru sprou Spro spring springt sprin sprig spri spre spra spr spou spot sportswrite sportswr sportsw sportsm sports sport spor spoon spook spoo spont spong spon spokesm spokes spoke spok Spoi spo splu splo splint splin spli splen splee sple spla splay splas spl spite spit spiri spir spino spinn spina spin spil spike spik spid spic spice spi sphero sphe spha sph Sperm Zu Zoro Zor zoo zom Zod zo zi zir zip Zio zin z sper spenc Spen spel speed spee specu spectros spectrog spectrograp spectro spectra spectr Specta spectac spect speck specif specie speci spec spea spear speak spe spa spay spat spas Spart spark spar spani span space spac sp soy sow sove sov southwe southw souther southea southe South sout sour soun soul soug sou sort sorro sorr Soren Sore sor sophom sophoc Sopho Sophi sophist sophis Soph Sop sooths sooth soot soo sonor Sono sonn songb song sona son Somm somew somet Somers somer someo someb some somb soma Somal som solve solv solut solu Solo solita solit solid solic solicito soli sole soldi sold sola sol soi softw soft sof sod Socr socke sock socio Socie socia soci soc sobr sob soaps soap soa so Sny snugg snug snuf snu snowf snow snor snoop snoo snob snobb sno snipp snip sniff snif Sni snee snea sne sna snar snapp snap snak snag sn Smy smut smug smud smu smoot smoo smoke smokes smok smo smith smit smi smel sme sma Smal sm slur slum slugg slug slu slow Slove slov slou sloth slot slop sloga slog sloa Slo sliv slit slipp slip slin slim slid slic sli slei sleet sleep slee sled sledg sle sla slavi slave slav slau slate slat slap sland slan slac sl skyw skyli skyl Sky skul skull sku skit skir skip skin skimp skim skil skid ski sket skel ske ska skate sk siz sixte sixt six situ sit Sisy Sist sis sire sir sinuso sinus sinu sink sini singlet singl Singa sing sinew sine Since sinc Sin simult simu simplic simpli simple simpl simp Simo Simm simi sim Silv silt sill silk silico silici silica sili sila sil Signo signi signa sign Sigm sigh sights sight sig sien Sieg Siege Sie side sidewi sidewa sidewal sidew sidest sides sider sidem sideli sidel sideb sid sickl sick Sici Sic sibl Sib sia Siam SI Shy shutt shuto shut shun shuf shud shu shrun shrug shrub shru shro shriv shrink shrin shril shri shrew Shre shra shr showp showm show shov shoul shou shot shorts shortc short shore shor shop shoo shoe shod Shoc sho shive shiv shirt shir shipma shipm Shipl shipbu shipb ship shin shim Shil shif shi Sherw sherr sheri sher shep shen Shelt Shell she' Shel Shei sheep shee Shed sheat Shear shea She sha shaw shav Shatte shat sharpe Sharp share shar Shap shant shan shamef shame sham shallo shall shal shake Shakespeare Shakes shak shagg shag Shaf shado shad shac sh sextu sext Sex Sewa sew Seve severa sever seven sevente sevent sev set ses servo servic servicem servi serv serpent serp seria seri serg serend sere Sera serap ser sequi seque seques sequen sequ seq sepu septu septi septe septa sept sepa separ sep senti sente sent sensu senso sensi sens Seno seni Sene sena sen Semit Semina seminar semin semi sema sem sell self seleni selena selen Selec selectm sele sel seiz seismog seismo seis sei segr Segm seg seep seed see seduc seduct sedu sedit sedim sedimenta sedi sede seda sed secu sect secreti secretari secreta secret secr seco secl sece sec seaw seat seaso seas searc sear sean seam seal seag seaf sea se Scyt scy scut scurr scur sculptu sculpt sculp scul scuf scu scrut scrupu scrup scru scro scriptu script scrip scrim scrib scri screwb screw screen screec scree scre scra scraw scrat scrap scram scr scour scou Scott Scots scot scorp scorn score scor scop scoo sco scl scient scie sci Schwa Schw Schuy Schum Schul Schu Schr school schoolm schoolg schoolb schoo schol Scho Schna schn Schm Schli schl schizop schiz schis schi schema schemat schem sche scha Sch scen scene sce scatt scat scarl scarf scare Scar scapu scap scant scandi Scanda scand scan scam scala scal scab sca sc saxon Saxo sax sawt sawf saw Savoy savo sava savan Savag sav saut Saul Saud Sauc sauce sau Saturn Satura saturat satu satisfa satis satir satia sati sata sat Sask Sash sas sars sard sarco sarca sarc sara Sar sapp sapi sap Santa Sant sanitar sanit sani sanguine sangu sang sandpi sandp Sande sandb sanda sand sancti sanct sanch Sanc sanat sana San Samu Samp samo sam salva Salvat salvag salv saluta salut salu salt saloo salo salm sall saliv Salis salin Sali salesm Sales Sale salam sala Sal sail Sai Sagit sagi sage sagac saga sag safe saf sadis sadi saddl sadd sad sacril sacrif sacri sacra Sacram sacr Sach sac Sabi Sabb sab sa s Ryd Ry Rutl Ruthe ruth rut rust russe Russ Rush rus rup runt Runn Rung runa run rump rumm Rum rui ruff ruf rue Rudy Rudo rudi rudd rud rubi Rube rubb rub ru roya roy Rowl Rowe row rout Rous roundh roun roug rough rou rotu roto Roth rotar rota Rot rost roset Rosenb Rosen roseb rose rosa Ros roose Roos room rook rooft roof roo Ron Rome Roma rom Rolli roll rol roi rog roe rode rod rocke rocka rock roc robo Robi Rober Robe robb rob roa roads roadb road ro river rive riva riv rit risk rise ris ripe rip riot Rio ring rin rim rill ril righ Rigg Rig riflem rifl rif Rie ridi Ridge ridg ridd rid rico Ricke rick Richa Rich ric ribos ribo rib ri rhyt rhy rhombi rhom rhodo Rhodes Rhode Rhod Rho rhino rhine rhi rheuma rheu rhet rheo rhen Rhe Rha rh Rey revv revolu revol revo reviv revisi revisa revis revi reversi revers reveren revere rever reven revela revel reve rev Reub Reu retrogre retrog retrofitt retrof retro retrie retri retr retir retina retin retic reticu reti rete retarda retar retal retai reta ret resur resum resul resu restra restr resto resti resta rest responsi respons respond respo respir respira respirato respi respe resp resor reson resol resolu reso resisti resis resin resig resid residua residu reside residen resi reserv reser resen resem rese resc res requis requi req reput repul repub repu rept repris repri repre repress repres repr repor repo repli reple repl repetitio repet reper repen repelle repell repel repea repeat repe repar repai repa rep rent reno rene rende rend rena ren Remu remor remo remitt remit remis remin remini remi remem remed remedi reme Rema reman rem relig relie relic reli rele rela rel rejo rej rein reim Rei rehe reh regul Regula regulat regu regrett regret regres regressi regr registra regist regis Regin Regim regiment regimen regi rega regal reg refut refug refu refra refrac refracto refr reflec refl refe referr referent referend referen referee refere refer ref Reev reed ree reduc redu Redst reds rede redd redb reda red recus recurr recur recu recto rectif recti recta rect recr recon reco recl reck recit reciproca recipr recip reci recessi reces recepti recep recei rece rec rebutt rebut rebu rebellio rebelli rebell rebel rebe Reb realt real read reac react rea re razo raz Ray raw ravi raven rave rav Rau rattl ratt ratio rati rate rat Rast rasp ras Rare rar rapt rapp rapi rap rans Ranki Rank range rang rando Rand ranch ranc ran rampa ramp Rama Ram ral rak raj rais rain rail rai rag raffi raff Raf radiu radioch radioc radioa radio radic radia radian radi Rad racke rack Rach race rac rab rabi rabbi rabb ra r quota quot quo quizz quiz quix quit quirk quir quip quinti quint quin quill quil quiet quie quicks quic qui questi ques quer quee Que qua quat quasi quas quartz quarti quarter quarte quart quarrym quarry quarre quarr quar quantit quanti Quant quan quali qualit qual Quak quai quadru quadrill quadril quadric quadri quadra quadrat quadran quadrang quadr quad quac qu Q pytha Pyt pyrox pyrol pyro pyri Pyre pyram pyra pyr Pyg py putt put puss push Pus purve purv pursu purs purpose purpo purp purl purit purin Puri purga purgati purg Purc purch pur puppy puppe pupp pupa pup punk puni pund punctua punct punc pun pumpk pump pum pulsa puls pulp pull Pul Pug puf Puer pue puddl puddi pud puck puc Pub public publ pube pu Pto ptA pt psyc psychoth psychot psychos psychoph psychopa psychop psychoanalys psychoan psychoa psycho psychia psychiatri psychi psy psa ps prud pru proxi proxima prox prow provoc provocati provo provis provin provid providen provi prove prover proven prov Prou protrus protru protr protoz protot protopl protop proto protesta protes proteo protecto protec protea prote prota prot prosti prost prosper prospec prosp prosod proso prosec prose proscr prosc pros pror propy proprio proprie propr propos propor propo propit propi prophet proph proper propel propelle propell prope propag propagan propa prop proo pronounc prono pron promp promo promisc promis promi promethe Promet Prome prom prolon prolo prolif proli prol Prok proj prohibiti proh progressi progre progra programme progr progn proge prog profus profu profi professo profe prof produ prodi prod proct Procru procr procla procl proces proced proce proc probl proba prob pro priz priva priv prism pris prio print princ Princi prince prin prime prima prim prig Prie prick pric pri preve preva prev Pret presump presu Presto presti prestig prest press presiden presi prese prescr presc Pres prepon prepo prepara preparati prepa prep premi premie prem prel preferr prefere prefer prefec prefe prefa pref preem preempti pree predic predict predica predi pred preco precis precipita precipit precip preci prece preca prec Prea pre pray pran prais prai Pragm pragmatis prag Prac practic practica pra pr power powe powd pow poun poul Pou Pott potenti pote potb potat potas pota pot postu postpr postpo postp posto postma postm posterio poste postc posta post posse possessi posses possem poss positi posi Pose pos portug Portu portray portrai portr porti portent porten porte porta port porp poro porn porc por populi popula popu popl pop Pool poo pontifi pontif ponti Pont ponde pond ponc ponch Pon pompo pompe pompa pomp pom polyt polyph Polyp polymo polyme polym Polyhe polyhedra polyh polygo polyg poly polon polo Pollut pollu pollo Poll polka polk politi polit polis polio polic police policem poli pole Polarog polarograp polaro polaris Polari polar pola Pol pok poiso pois point poin poi pog poet poe podi pod Pock poc po pneumo pn Ply pluton pluto Plut plush plus plun plumba plumb plum plugg plug pluc plu plow plo plia pli pleu plent pleni plen Plei pleb plea pleas ple playw playb play Platonis Platon plato platit plati plate plat plasti plast plasm plas planta plant plano plank planetari planeta planet plane plan plaint Plain plai plagu plagi plagia plag plac placen place placa pla pl piz pix piv Pitts Pitt piti pith pitc pit pistol pisto pist pisc Pis piro pira Pir piq pipe pip Pion pio pint Pins pinn pinki pink pinh pine pinc pin pim pillo pilla pill pilg pilf pile pil pigm piggi pigg pige pig piet pier piec pie pid pictu pict pico picnicke picnick picn Picket picker Picke pick picc Pica Pic pian piani pia pi physiot physio Physic phys Phyl phy phr photol photog phot phosphore phospho phosphi phosp phos phono phonem phone phon phoen Phoe pho phl philos philo Philip Phili philan phila Phil Phi pheny pheno phenomeno phenomena phenom phenol phen Phe Pha pharmaco phar phan phalan phal phag ph Pf pew petu pett petrol petro petri petr peti Peter Pete pet pestil pesti pest pess pessimi pes pervers perve perva pervas perv perus peru pertu perti pert persuas persu perspir perspic perspicu perspi persp persona perso persis persi Perse persev Persec pers perpe perpetua perpetu perpet perp permu permitt permit permis permi perme perma perm Perk perj peris periphe periph perip perio Peril peric Peri perfum perfu perform perfo perfi perfe perf pere percu perch perce percepti percep percen perc per Peps peppe pepp pep peo penur penu pente pentag pentago penta pent pensi pens penny penna penn penm penitenti penit peni penet pene pend penc penal pena pen pem pelv pelt pell pel Pegg Peg peep pee pedia pedi pede peda pedan pedag ped pecul pecu pect pec pea Peas pearl Pear Peal peak Peach peace peac Pe pay pawn paw pav paun Pauls Pauli Paul Pau Patte Patt patron patrol patrolm patroll patro patri patrio patrim patrici Patric Patria patr pati pathog patho path patern pater paten pate patc Pat pasto pasti Pasteu paste past passiv passio passi passe Passag passa pass pasc Pas particu partici participa partic parti part parso parsim parsi Pars Parr parol paro parliamenta parli parla parl parki Park parish paris pari parenthes parenth parenta paren pare parc parasi paras paraph parap paranoi paranoia paran parama param paralle parall paral parago parag parado paradig paradi parad parab parabolo para par papy papp paperw pape papa pap panto panthei panth pant panor pano panick pani pane pandem pande panda Pand pancr Panc pana pan pamp Pam Palo palm palli palladia Palla pall palin pali Paleo Pale palaz Palat pala pal Pak pair paint Pain pai pagea page pag padd pad Packa pack pacifi pacifis paci pace pac Pab Pa p oz oxy oxida oxi oxe oxa ox owl Owe ow ovi overt over oven ove ova ov ouz outl out our oug ou Otto Ott Oti oth otherw other ot ostra Ostrac ostr oste osteopa osteop osteo osten ost oss osmo osm Osi O'S oscilla osci osc Osb Os Orw orthop orthog orthodox orthodon orthod ortho orth ort Orpha orp Oro orna ornam orn Orl Orio Orin origina orig orie ori orga organ organi org Ores Oreg ore ordi orde ord orchi orche orc orbi orb oratori orato orat orange oran ora or opu optom opto optimi optima optim opti opth opt oppre oppressi oppr opposi oppos oppo opp opin opi opera operat operan oper Ope OPa opal op oo onto ont ons onr Onom ono onlo onl One onco onc on omnip omn omitt omit omi ome omb oma Om Oly Ols olivi Olive Oliv Olig oligo oliga oli ole olds Olde old ola Ol ok oil oilm oi ohm Oh ogr og ofte oft offsh offse offs officio officia official offici office offi offer offen offe off of oed Oe Ody odo O'D odi Ode od octo octi octe Octav octan octahedra octah octag octa oct O'Co O'C o' ocea oceani Oce occurre occurr occur occupa occup occul occu occlus occl occid occi occ oc obvi obv obtr obt obstr obsti obst obso obsessi obses observa observat obser obseq obse obsc obs obo obliv oblig obliga obli obl objec obj obf obe obd ob oat oas Oakl oak oa o nympho nym NY nutritio nutrit nutr nut nurs nur numis numi numero Numeri numera nume num nul nug nud nucle nucleol nucleo nuclei nuclea nuc nub nu now Novo novi Novel nove Nova nov nou notor noto notic noti note nota not nostra Nostr Nosta nost nose noseb nos Norwa Norw North northwe northw Northr northern norther northea northe Nort Norman normal norma Norm Nord Nor noon noo none nonc non nomo nomina nomi noma nom Nol noise noi Noe nodu nod noc nobo noblem nobl nobe Nob Noa NO NN nitrog nitroge nitro nitri nitr nit Nipp nip nio ninete ninet nine nin NIMb nim Nil Nik nihi nih nightm nightc night nigh nigg nige Nig Niel Nie nicot Nico nick Nichols Nicho Nich nice nic nib nia Ni Newto newt newspaperm newsp newsm news newl Newf Newe newc newb New neve neva Nev neutr neut neuros neurop neuron neuroa neuroana neuro neura neural neur neu nett Neth net nest nes nerv Ner nept nep neop neona neon neol neo Nels Nell Nel nei Negr nego neglige negli negl neg needl need nee nect necrom necromanc necr neckl neck nece necessi nec nebula nebu neb neat near Nea Ne Nd NC NB Nazi Naza Naz navi nave nava nav naut nausea naus nau natu natio nati Nath Nata Nat nast Nash nasA nas narra narr narco narci narc nar Napo nap Nan nam nak naiv Nair nai Nag nad Nab na N myt mysti myste myst mys myr myop myoc myo Myn Myel mye myco myce Myc My Muz mutu mutt mutin muti muta mutat mutan mut mustac musta must musl musko muske Musk musi mush muse musc muscu Musco mus murr murk Muri murd mur Muo munic muni munc Mun mum multit multiplica multiplicat multipli multiple multiplex multip mult mullig mulli Mulle mull mulc mul mugg mug muf mue muddl mudd Mud muc mu Mr mov Mouth mout mous mour mounta mount moun moul Mou mott moto motiv moti mothe moth mote mot moss mosq Mose Mos morti mortgage mortg morta mort mors morri Morris morr morpho morphi morphe morp moroc Moro mori morg Morel more mora moral mor Moor moonl Moon mood moo Montr Montev Monte Montag Monta mont monstr monst mons Monr monot monome monom monolo monol monog monoc mono monke monk monit monic Moni mong money monet mone Mona monast monas monar monad Mon mome momenta mom molybde moly molt molly molli Moll Moli molec mole Mold mola mol moist mois Moi Moha Moh Moe modula modu modi Modes moder mode mod mocke mock moc mobi mob moa mo mn mix mitt mitr mito mite Mit mist Misso Missis missio missi miss miso mise misce miscel misc misa mis mira mirac mir minute minutem minut minus minue minu minst minsk Mins mino Minne Minn minis minima minim mini mines Minera miner mine Mind minc min mimick mimic mimi Mime mim Milto Milt millio Milli millen millenn mille Mill milk militi milita militari militar milit mili miles mile mild mila Mil migrat migr migh mig midwi Midwes Midwe midw midst midsh mids midg Middlet middlem Middl midd Mid Micron micr Micke Mick Miche Micha Mich mic mias mia Mi Mex mett metrop metro metr meti methy Methu metho metha methan meth meteorit meteori meteo mete metap metamorpho metamorphi metam metallurgi metallu metallo metalli metall metal metab metaboli meta met messi mess meso mesc mes merry merri merrim Merr merl merit merid meri merg Mere merc mercuri mercu merch merce Merca Mer ment mensu mens meni mende menda mend mena men memora memoran memorab memor memo memb mem Melv melod melodr melodi melo mell meli melani Melan mela mel mei megaw megal megab mega meg meet mee medl Medit medio medicin medici medic media medi meda med mechanis mech mec meat meas meant mean meal mead meado mea me McNa McN McM McLe McL McKi McKen McKe McK McI McGra McGr McGo McGi McG McF McDon McDo McD McCon McCo McClu McCl McCa McCar McCal McC McA Mc Mb maz mayor mayo Mayf maya May Maxw Maxim maxima maxi max maw Mav Maurit Mauric Mauri Maur mau matu Matt Mats matro matri matrim matric matria matr matin mati Mathi Mathew Mathem Mathematic mathe math matern materi mater Mate matc mat masti maste mast massi Masse massac massa Mass masq Masoni Mason masoc maso Mase masc mas Mary Marve marv martyr marty Martini Martin martia Marti marte mart Marshal marsha Marsh mars marro marri Marria marr marque marq marm Marlb Marl marks Marko marke mark Marj marit marion Mario marina marin Marie Maria Mari margina margi Marga marg Marcel Marce Marc mara mar map Mao manumit manum Manu mantl mantis manti mant Manse mans mano mann manip manife manif mania maniac mani manh mange mang mane mandr manda mandat mand Manage manag mana man mamma mammal mamm mam malto Malt malp Malon Malo maln mallo malle mall malig malic mali malfo malf male Maldi mald malcon malc Mala Malay malar malada malad mal mak maje maj maint mains mainl Main mailm mail Maid maide mai Maho maha Mah Magnu magnif magni magneti magnet magnes magne magna magnan magn magis magic magi maggo magg Mag Mae mads madri Madr madm Madel Made Madd Madam mada Mad macros macrom macr mackina Macki macke MacK machine machin machi Mach Maced Mace MacD maca mac Ma m lyse lys lyr Lync Lyn lympho lymp lym Ly luxuri luxuria luxu Luxe lux Luth lute lut lust lus lur lung Lund lunc luna lunat lunar lun lump lumino lumina lumi lumb lumberm lumbe lum lull lul luk lugg luge lug Luf Lud Lucret Lucre lucr luck lucia Luci Luc Lub lubrici lubrica lubr Lu l' loya loy Lowe low lovela Lovel lov Louv louse lous Loun Loui louds loud lou Lotte lott lot loss los Loren Lore lord lor loquac loq lops Lope lop loos loop Loom look loo longit longi longh long lone lon Lomb Lomba Lom loll lol Loin loi logic logi logg logar loga Log lof loe lodg lod locus locu locom locomoto locomoti loco Lockh Lock loca local loc lobu lobs lob loat loam loa lo liz Livi live Liverp Liver liv litu litto littl litt litiga liti lithos lithog litho lithi lith literat lite lit list Lis liqui lique liquef liq lipsc Lips lip lione Lio Lino link lingua lingu linge ling linem linea line Linds Lindb Lind Lin limp limi lime limb Lim Lilli Lill Lila lil lik lign lighth ligh Ligg Liga lig LIFe lifes lifeb lif lieu Lie lice licens licen lic Libret libre libra librar libr libi libert Libera liber libel libe lib lia li Lexic lexico lex lew Levit Levin Levi lever leve lev leu lette letterm lett Letha leth let Lest lesso lesse less les lep Leop leoni Leonar Leona Leon Leo lenti Lent Lenn Lenin Leni leng Len lemo lemm lem leit Leig Lei Leh legu legit legis legi legg legen lege legate legat lega leg lef leew leer lee led lect lech lec Lebe leba Leb Lea Leaven leav leat lease leas lear leap Lean leak leaf leads leade lead leac le lazy laz layo laym lay lax laws lawr lawma lawm lawg lawb law lava lav Laurent Lauren laure laur laund laun laug Laud lauda lau latt latitudi latit latin Lati lath latera later late lat lass lasc las laryng lary larv Lars Lark larg Lare larc lar lape lap Lao lanth lant lank langui langu Lang lands land lanca Lanc Lan lamp lami lamen lame lamb Lama Lam Lak laid Lai Lagr Lago lag lady lad lacun lacu lact lack Lacer lace lac labr labor labo labil labia labi Lab la l Ky Kur kud ku Kru Kris Kri Kre Kra krau Krak Kr Kowa Kow Kor Kon kol Koe Koda kod Koc Ko Knut Knud Knuc knu Knox Knowle Knowled knowl know knott Knot knoc knob kno Knig knic Kni knee kne kna knap Kn Kle kla Kl kiw kiv kitte kitt kitc Kit Kirk Kirc Kir Kio kink Kings king kines kine kind kin Kimb Kim kill kil Kie kidna kidnapp kidn kidd Kid kic kib ki Kha kh keyne Keyn key kett keto ketc ket kes kerr kern Ker kep Keny Kent Kenne Kenn Ken kell Kelle Kel Keen keel kee kea Ke kay Kau Kath Kat Kara Kar kap kao kan kam Kalm kalei kale kal Kaf Kab Ka K jux jut Justin justic justi jus jurisp juris juri jura Jur junke junk juni June Junc junct jun jump jumb jum Julie Juli Jule Jul Juk juj jui jugg jug Judic judicia judici judica judicat judi Juda Jud jub jua Ju Joy jow Jovi Jov journeym journe journa jour jou Jose Josep Jos Jorgen Jorg Jor Jona Jon joll Jol joi Johnst Johns John Joha Johans Johann Johanne Joh jogg jog Joe jocu jock joc job Joan Joann Joa Jo jit jin jimm Jim jil jigg jig ji Jewel Jewe jew jet Jesu jess Jessi Jes Jero jerk Jere Jerem Jer jeo jenni Jenn Jen jel jej Jef Jea Jean jeal je jaz jaw jav jau jas jar Jap Janu janit jani Jane Jan Jame Jam jak Jai jag Jacq Jacobs Jacobi Jaco JACk Jacks jacka jac jab Ja j Iva Iv it' iti ite Itali ita It Ist iss Israeli Isr isot isomo isom Isol isoc isoch iso isla islam Isl Isin isi Isab Isaa Isa Is Irv irrit irri irreve irrev irresp irresolu irreso irres irrepro irrepr irrep irrem irrede irreden irred irrec irreco irre irra irr Iron irons iro irk Irishm Irish Iris iri Ire Ira Ir ips ip iono ion iodin iodi iod io involu involut invol invo invite invit invio invi investi inves invert invers inver invento inventi inven invei inve inva invas invar invali inval inv inu intuiti intu intrus intru introv introd introduct intro intric intri intra intran intr intox inton intol into intima intimat inti intes interve interv interst inters interrupti interru interro interr interpr interpo interpola interp intern intermi interm interi interfere interf interce interc inter intent intensi intens intend inten intem intellige intelli intelle intel integ integra integr inte inta int insur insupp insup insula insul insuf insub insu instrum instruc instr instit instin instil insti inste insta instan instal inst inspi inspe insp insom insolv insol inso insis insin insign insigh insig insid insi insen insec insect inse inscri insc insa ins inquisiti inquis inquir inqui inq inp inor inope inop ino innu innoc inno inna inn inm inla inl ink injur injun Inju inj init iniq inim ini inhu inhom inho inhibito inhi inheri inhere inhe inha inhal inhab inhabita inh ingra ingrati ingrat ingr ingesti inges Ingen ingenu inge ing infusi infus infu infra infr informat informa info influe influent influ infle infla inflate inflat inflam inflammat inflamm infl infir infinitu infinite infin infim infi infes inferr infern infere infer infel infec infe infa infantrym infantr infan infam inf inext inexpli inexpl inexpe inexper inexp inex ines inerti inert iner inequit inequi ineq inel ineffi ineffe inef ine industri indus indul induct induc indu Indoc indo individ indiv indist indispo indisp indisc indiscre indiscr indis indir indigna indign indige indiges indigen indig indica indic india Indian Indi Inde indet indes inden indel indefi indef indecis indeci indec ind incurre incurr incur incul incub incu incre incredu incred increa incr incorr incorp incor inconv incontr incont inconsid inconsi incons incong inconc incon incompreh incompr incompl incompa incomp incommu incomme incomm incom inco inclus inclu incli incl incis incid inci incest inces incep incen ince incar incapac incap incant incan inca Inc inbr inbo inb inaug inau inat inapt inapp inappro inappr inap inan inal inadv inade inad inactiv inact inacc inaccu inac ina in imput impul impu improvis improvi improv improp impro impri impressi impress impres impreg imprec impre impra impr impost impos importu importa impor impol impo implica impli imple impla implan impl impi impet impert impers imperm imperi imperc imper impen impelle impell impel imped impe impassi impas impar impal impa imp immun immu immor immodes immod immob immo immig immi immer immed imme imma immat imm imi imbr imb ima imagina imagi image im illust illusi illusio illus illum illumi illu illit illi illegit illegi ille ill I' Ili il ii ignora ignor igno igni ign ig if idy ido idiot idios idiom idi ideo iden idea ide Ida Id icosahedra icos icon icono ico Icel iceb ice IC ibi ibe ib ia I hysteri hystere hys hypothes hypothe hypotha hypoth hypot hypocrit hypocr hypoch hypoc hypo hypn hyph hype hyperb hyperbolo hyp hymn hym hygr hyg hydroxyl hydroxy hydrox hydros hydropho hydrop hydrol hydrog hydrochl hydroch hydroc hydro hydra hydran hydr hyd hya Hy Hux Hutchin Hutchi Hutc hut Hust husb husbandm hus hurt hurra hurr hurl hurd hur Hunt Hunga Hung hund hun hump humm humil humid humidi humi Humb huma hum hul Hugh Hugg hug Huf Hud huc hub Hube Hubb Hu hoyd hoy hows Howe How hov House housewi housew housebr houseb hous hour Houg houd Hou hoth hote hotb hot hoste host hospit hosp hos Hort horsew horsep horsem horsef hors horri horr horo Hornbl hornb horn hori hora Hor Hopk hope hop hoov Hoos hoop hook hoof hood hoo honora honorari honor hono honey hones hone hond hon homom homol homogene homog homo homic homi homew homes homeom homeo homem homebu homeb home hom holy holste Hols holog holoc Holo Holm holly Hollo Holli Holle holla Holl hole hold Hol hog Hof Hodge hod hock hoc Hobo hobby hobb Hob hoar hoag Hoa ho hith Hitc Hit histori histor histoc histo hist His hirs Hiro hire hir hippo Hippoc Hipp hip hint Hind hin Him Hilt hillm hill Hila hil highwaym highw highl highb high hig Hiero hiera hierar hie hideo hide hid Hic Hibe Hib Hiat hia Hi hey hexag hexa hex Hew Heus heu Hett Hete heteros heteroge heterog het Hess Hesi hesitat hes Hert Hersh hers herr herp heroin heroi Hero hermi Herme herma Herm heri hereu hereto heret hereina herei hered herea here herd Herc Herb Hera Her Hepa hep henri Henr Hendr Hend hench hence henc hen Hemp hemor hemo hemis hemi hem help helms helm Helle hell he' helio helic heli Hele Hel heir Hein height heig hei heg hef hee hedo hedg hed hect heck heca hec Hebr Hebe heb heavy heave heaven heav heathe heath heat heartb heart hears hear healt Heal head headwa headw headst headsm heads headli headl hea he hazel haze haza haz Hayd Hay Hawt Hawk Hawa Haw haven have hav haun haul haug hau Hatti Hatt Hath hate hatc hat haste hast hash has Harves harve harv Hart hars harri Harris Harr harp harmonic harmoni harmo harm Harle Harl hare hardwo hardw hardt hardbo hardb hard harb Hara har happe happ haploi hapl hap Hanso Hanse Hans Hanov Hano Hanna Hann Hanl Hank hango hangm hanga hang handym handy handwr handw hands handm handle handl handic handicrafts handicr handica handicappe handicapp handi handc handb hand Han Hamp Hammo hamm Haml hamb Ham Halve halv Hals halo Hallo Halle hall hali half Hale hal Hait hair hails hail hai hagg hage Hag hadr hadd Had hack hac habitu habitat habita habit habi Habe Haber hab Haa Ha h gyro gyr gyps gyp gym gymna gymnast gymn gy Gw Guy Gut Gustav Gusta Gust gus Gur guns gunp gunn gunm gunk gunfi gunf Gun gum Gull gul guilt guill guild guil guide guid gui guess gues guer Gue guardi guard guara guarante guar guani guan gua Gu Grum grub gru grown grow grov group groun grounds grou Grot Gross gros groo groc groa gro griz grit grist gris grip grind grin Grime Grima grim gril Grif griev grie grid gri grey Gret Gren greg Greenw greens greene Greenbe Greenb Green greed gree grea great greas gre gra gray gravi grave graves grav gratu grati grate grat grass gras graphi graph grape grap granula granu grant grani grands grandp grandn grandm grandi grandc grand gran grammar gram grain grai graf gradu grad grace grac gr gov gour Gou Gott Goth Got goss gosh gos gorge gorg Gore gord Gor gop goos goof Goody Goodw good goo Gonz gon Gold Goldst Golds goldf golde Gol gog Goe godw gods Godf godd God gobb gob goa Go gnom gnomo gno gna gn GM glyc glyco glyce glyceri glycerin gly glutami gluta glut glue glu glot glos glori gloria Glor gloo glom globu glob glo glit glis glim glid Gli Glend Glen glee glea gle gla glau glassw glass glas gland glan glamor glam gladi gladd glad glac glacia gl giv Giu girli girl gird gir ginsb Gins ging Gin gimb Gim Gille Gill Gile Gilb gil gigg giga gig gif Gidd gid gibb gibbo gibbe gib gia gian gi ghou gho ghe Gha gh Gett get gesta Ges gerundi geru germin germic germi germani germa Germ Gerh gerb Gera geral Ger George Geor geoph geop geom geog geode geodes geod geoc geoche geoch geo genu gentlem gentl gentil genti gent geno genit geni Genev genes genero genera gener gene gen Gemi gem gelat gela gel geig Gei gee ge gaz Gay gaw Gave gav Gaus gaun gaul Gauge gaug gauc gau gate Gat gastron gastr gast Gasp Gas Gart Garri garr garn garl gari garg Garde gard garb gar gap gant Gann gangli gangl Gang gan game gambi gamb Gam Galva galvani galv gallu gallow gallon gallo galli galle gallan galla Gall galen Gale Galat galac gala gal Gait Gaine Gain gail Gai gagg gag gaf gadg gad Gabr gabb gab ga G fuz fut fuss fusi fuse fus furth further furtherm furt furr furni furn furlo furl fur funn fungi fung fune fund functo functi func fun fumi fum full ful Fuj fug fuc Fu FT Fry frustr frus frui Fru froz frow frot frostb fros frontiers fronti fronta fron fro friv frit fril Frigi frigh Frig fried Frie Fric fria fri Frey Freu Fresn freshm fresh fresc fres frenc Frenchm Fren freew Freet freem freeh freedm freed free Frederick Frede Fredd Fred frea fre fra fraz fraud frau frat frankfu Frankf Frank Franco Francisc Francis Franci France franc fran frame fram frai fragmenta fragm frag frac fracti fraction fr foxho foxh fox fourte fourt fours four founta fount found foun foul fou fost foss fossi fos fortun fortu fortr forti forth Forte fort forsa fors formu formic Formi formatt format formal forma form fork forgo forgi forgett forget forge forg forfei forf fores fore Ford force forc forbo forbidd forbi Forbea forbe forb fora for fop footw foots footpa footp footm footb foot fool food foo Fonta Font fond fon follo folli foll folks folk folia foli Fold fol foi fogg Fog focu foc foa foam fo FM fly flut flus fluorid fluori fluore fluo fluf flue flu flowe flow flour floun flou flot Florid flori Flore Flora flor flop floor flood floodl floo flog floc flo flirta flir flip flint flin fli flexu flex Flet fles flem flee fledg fled flea fle flax flau flatu flatt flat flash flas Flan flam flak flai flags flage flag fla fl fiz fix fiv Fitz Fitc Fit fist fissi fiss Fisk fisherm fishe fish fisc Fisch Fis firs firm firewo firew Fires firep firem fireb fire fir Finn Finl fini fing fines fine financi finan final fina fin filth filt film fill fili file fila fil figura figu fig fifte fift FIF fier fien fiel fief fie fide fidd fid fict fic fibro fibr Fibe fib fia fian fi fev feuda feu fett feti fet festi fest fes ferru ferrom ferro ferri ferre Ferr fero Fern fermi ferme ferm Fer fenc fen feminis femi fem felo fell felic felicit felici Feli Feld fel fei feed fee fede fed Febr feb featherbe featherb feath feat feas fear fea fe Faye Fay Faus faun fault faul Fau fatt Fati fath fate fat fast fasc fascis fascic fas fart farm fare farc Fara far fanta fantasi fant fang fanf fanc fan famil famili familia fami fam fals fallo falla fall falc fal fait Fairf Fair fain fail fails fai Fah fade fad factor facto fact facil faci facet face fac fabr Fab Fa F Ez eyel eyebr eyeb ey exulta exul exud exu extrus extru extro extric extri extrema extre extra extrav extrad extract extrac extr extol extolle extoll exto extin exti exter extensi extens extend exten extem exte ext expu expre expressi expr exposito exposi expos expor expon exponenti expo explos explora explor exploi explo explica expli expla explan expl expir expia expi expert experi experim experie exper expens expend expen expell expel expediti expedit exped expec expecto expecta expe expa expan expansi expans exp exoti exot exorc exor exoga exog exo existe exis exi exhu exho exhib exhi exha exhausti exhau exh exerc exer exempt exempl exempla exem exeg exec executi execu execr exe excus excur excul excu excre excret excr exco exclusio exclus exclu excla exclam excl excita excit excis exci excha exch exces excep excelle excell excel exce exc exa exas exami exam exal exac ex evolu evol evoc evo evil evid evi every everg Evere Ever eventu event even Eve eva evas Evans evang evan eval ev eute Eut Europe Euro Euri eur euphori eupho euphe eup eule Eul eugeni Eug Euc Eucl Eu eti ethy etho ethno ethn Ethi ether ethe Etha eth ete etc et estu estop esto esti Este esta est Essen esse Ess espou espo esp eso Esc escr Esch esca escape escap es e' erup erud eru Ers erro errat erran errant erra err erot erosi eros Erod ero Erne Ern Eric Eri erg ere era Erat eras erad er equiv equita equit equipp equipo equip equino equin equilibri equili equil equi equa equat eq Eps epoc epo epithel epith epita epitax epit epist episo episc episcopal Epis epiphy epip epil epigram epigr epig epider epidem epid epic epicy Epicu epi Ephe Ephes Ephem ephemeri eph epA ep eo enz envi enve env enun enum enu entre entra entr ento entir enti enthusiast enthu enth ente enter ent ens enr enq enor eno enig eni Englishm Engli Engle Engla Engl engi eng enfo enf energ ener ene endot endoga endog endo end encu encr encom enco enc en emuls emu empo emplo empl empi emphy empha emphas emph emp Emo Emma Emm emitte emitt emit emissi emis Emil Emig emi emeri emerg emer eme embry embroid embro embra embr embod embo embl embed embedde embedd embe emba embarg embar emb eman ema em elys Ely elut elu Elsi Else Els elo Elm Ellis ellips ellipsoi ellipso ellip ellio Elli Ell Elk Eliz Elis eli eleve elev elep elem eleg electrop electron electrolyt electrol electroencephalograp electroe electroc electro electric electri electre electr electora electo elec elea Ele Elde eld elb elas Ela el Ek eje ej Eis einsteini Ein eighte eigh eige eigenv eigens eig eid ei Eh Egy egr egot ego egg ega Eg eff effluv efflu efflo effl Effic effica effi effec effectu effe effa ef eer EEl ee Edwi Edwa Edwardi Edw educ edu Edmo Edmond Edm edito Edit edif edi Edge edg ede edd Ed ecum ecu ect ecs economi econome Econ ecol eco ecli ecl echo echi ech ecc eccl Ec Eb eaves eav eate eat easy Eastw easte east ease eas earthmo earthm earthe eart earn ear eag Ea e dysp dys dyna dynas dynam dynami dyn dye dya dy dwi dwe dwa dw duti dutc Dutchm dut dust dusk duse Dus Durk dure Dura Duran dur duplica dupli dupl dup duo Dunl Dunk dung Dune dunc Dun Dump dumb dum dull dul Dug duf due Dud duct duck duc dubi Dub Dua du dry drun drum drug drud dru drows drow dros drop droop droo dro driz driv drip drib dri dres drea dream dread dre drawb draw drap dramati dramat drama dram drai dragon drago drag draftsm drafts draf Dra dr doz downw downtr downt downst downs downp down dow dov Dougl Dough doug doub doubt doubl double doublet Dou dot dos Doro dorm Dori Dorc Dora Dor dop doorm doorke doork door doom Dool Doo Dono Donne Donn Done Donal Dona Don dominic Domini domina domin domi domes Dome dom dolt Dolom dolo doll dole dol dogt dogmat dogm dogg dogb dog doe dodecahedra dode Dod documenta docu doctrina doctr docto doctora doct dock doc dobb Dob Do Dn Dixi dix divo divisi divis divin divid divi dives diversio diversi divers diverg diver dive diva div ditt dit distu distrib distributi distri distr distin distil disti dista dist dissi disse dissem diss disrupti disr disq dispu dispo dispersi disper dispensa dispen dispel dispell dispe dispa disp Disn dism dishw dish disg disd discuss discu discriminat discri discre discreti discret discr disco discipli disci disce disc disa dis dirt directr directo direc dire dir diplomat diplom diploi dipl diph dip dior diop Dion dioc dio dinn ding Din diminu dimi dime dim dilut dilu Dill dile dila dilat dil digre digr dignit dign digita digi digesti dige dig diff diffusi diffu diffr diffic diffi diffe differenti differe differ diffeo dif diet diel Die did dicti dicta dictat dict Dicke dick dicho dich dic dia diatom diato diath diat diaph diap Dian diama diam diale dial diagr diagn diagnost diag diac diab diabe di dh dextr dexte dex dew devou devote devot Devon devo devis devil devia devi dev deut deu detra detr deton deto detes deterre deterr determina determ deter deten detec dete deta d' detai det desu destru destr desti destin dest dess despot despon despo despi despe desp desol deso desir desig desid desi deser desec dese descripti descrip descr descend desce desca Desc des derr dero deriv deris deri dere Derb dera der depu depri depressi depres deprec depreci depreca depre depr deposito deposi depos depor depo deplo deple depl depe depa dep deox deo denud denu dent dens denou denota denot deno Denn denia deni Dene dend den demurre demurr demur demu demons demoni demon demol democ democrat demo demitt demit demis demi demen deme dema demar demag dem delus delu delt delphin Delp Dell deliv delir deliq deline delin delim delig delica delicat delic deli delete delet deleg delec dele Delan Dela Del dej dei deh degu degre degra degr dege dega deg defra defr deform defore defor defo defle defla defl definiti defini defin defic defi deferr defer defens defend defen defect defec defe defa def deers Deer deep dee deduct dedu ded decryp decry decre decree decr decor deconv decont decontroll decon decompr decompo decom decoll decol deco declin decli decla declara declarato declarati declar declam decl decis decim decid deci decep decen deceit decei dece Decat decad deca dec debut debug debugge debugg debu debt debri debr Debo debil debi Debb Deba debau debat debar deb deat Dear Dean deal deaf deadl dead deac deaco dea de daz Dayto Dayt dayb day Daw Davis David Davi Dave dav daup daug Dau date data dat dash das Darw Dart Darr darl dark dar dapp dap Danu Danie Dani dange dang dand Dan damp damn damas Dama dam dall Dale Dal Dak dais dairym Dair Dai Dahl dah daf Dad dact dac Dab da d Czec Cze cza cz cyt cys Cyri Cyr Cypri Cyp Cyn cyl cyclot Cyclop cyclo cycli cycl Cyc cya cyani cyana cy cuttl cutt cuto cutle cutl cut custom custod custodi custo cust cush Cushi cus curva curv curta curt curso curs curricula curri curra curr curl curio curi curd curb cur cupr cupi cup Cunn cun cumu Cumm cumb cum culv cultu culti cult culpa culp cul cuf cudd cud cuc cub Cu crystallo crystalli crystall crys cryptograp crypto cryptanalys crypta cryp cryo cry crus crump crumb crum crui crue crud cruc crucifi crucif cru crowb crow crou crot crosswa crossw crossb cross cros croo cron Crom croco Crocke crock croc croa Cro criti crite crit criss Crisp cris crin crime Crim cri crewm crew creti Creta Cret crest cresc cres crep Creo crem creep creek creed cree credu credit credi crede credent cred crea creat cream creak cre cra craz cray crawl Craw crave crav crat cras crap crank crani Cran Cram crag craftsp craftsm crafts craf crac crab cr cp coz coy cox cowpo cowp cowm cowl cowh cowb cowar cowa Cow covet covera cover coven cove cova covari covar cov cous courtes courte court coura cour coup county countrym country countr counters counterpr counterpo counterp counterm counterf countera counter counte count couns counc councilw councilm coun could coul coug cou cotto cotta cott cot Cost cosmo cosm cose cos corv coru corte cort corrupti corrup corru corros corrod corrob corro corrige corrig corri corres correc corre corra corr corpus corpu corpsm corps corpora corpo corp corone corona Coron coro cornf Corneli Cornel Corne corn cork Corin Cori Core cordi cord Corb cora cor coq copy copr Copp Coper Cope cop Coor coop cool cooke cook coo convulsi convu convolu convol convo convi convey convert conversa convers converg conver convent conven conve conva conval conv contu controvers controv control controlle controll contro contriv contrit contrib contributo contri contra contrave contrav contrar contral contradis contradic contrad contract contrace contrac contrab contr conto continuo continua continu contine contin contig conti contex contes contenti content conten contem contempt contempo conte conta contam contag cont consump consum consul consultat consulta consult consula consu construc constru constri constra constr constituti constitut consti conste consta Constanti Const conspira conspirat conspir consp consor conson consol conso consis consig consid consi conserva conservato conservati conser conseq consen consec conse conscr consci conscio conscie consc consa cons Conr conque conquer conq connota connot Conno conniv conni Connec Conne Conn conjun conjug conju conjo conje conj conif coni congressw congressm congres congre congra congr Congo conge congesti conges congeni congen cong confus confuc Confu confro confr conforma confor confo confl confiscat confis confirma confir config confid confiden confide confida confi confes conferr confere confer confed confec confe conf cone conduc conduct condu condo condi conde condes conden condem condemna cond concurre concurr concur concu concr concor conco conclus conclu concl concis concil conci conces concerti concert concer concep concen concei conce conca conc Cona Con comput compul compulsi compu compt compre compressi compres compreh comprehens compr composi compos compon compo complim complic compli complex complet complem complementar complementa comple compla complain complai compl compi competiti competi compete compet compensat compens compend compen compel compell compe compa compat compassi compas compara compar compani compan Compac comp commut commun communic communi commu commonw common commod commodi commo committeew committeem committee committe committa committ commit commissa commiss commis commi commer commenta comment commens commend commenda commen comme comma comman comm Comi comet - comed come combu combina combinato combi comba comb coma Com column columb Columbi colu colt Colos colora colorat color coloni colon Colom Colo collu colloqui colloquia colloqu colloq collo Collin Collie colli collegi colleg collec colle colla collat collar collap collag coll coli Cole cola col coinciden coinc coin coi coho Cohe cohes coher coh cogniz cognit cogni cogna cogn cog coffee coffe coff cof coexi coex coerci coer coed coe codo codi code codd cod coco cockl cock Cochr coch coca coc cobbl cobb Cob coax Coat coas coar coale coal coag coac coachm coa CO Cly clut clum club clu cloud clou clothesm clothes clothe cloth clot close clos clon clog clod clockw cloc cloa clo clip Clint clini cling clin clima climat clim Cliff clif clie clic cli clev clerg clergym cler Clem clea cleav clear clean cle cla Clay claust Clause claus Claud Claudi Clau clat classif classi class clas Clark clari Claren Clare Clar clap clan clam clair Claim clai clad cl civil civi civ city citro citr citi cita cit circumv circumst circumsp circumsc circums circumfe circumf circumc circumcis circum circulat circul circui circu circl Cir cinn Cinem cine Cinde Cind cinc Cin cil cig Cice Cic ci chut churc churchw churchm Churchi churchg chur chunk chun chum chug chuc chub chu Chry chronog chrono chroni chron chrom chromi chroma chromatograp chromato chromati chro chri Christop Christo Christin Christia Christi Christens Christe christ Chr chow chos choreo chore chordat chorda chord chora chor Chop choo Chom chole chol chok choir choi choc cho chloropl chlorop chloro chlori chl chiva chiv chit Chis chir chip Chine chinc Chinam China chin Chime chimer chim chill child chil chig chie chick Chican chicag Chica Chic chia Chi chevr Chev Cheste Chest Ches cheru Cher Chen chemi chemist chemiso chemis chem cheese cheesec chees cheer cheek chee checksumm checks checke chec chea cheat che cha chau chatt chate chat chasti chast chas chartre chartr Chart Charlo Charle Charles Charl charit charis chari charg chara char Chapl chaper chape chap chao chant change chang chand chanc chance chancel chan Champa champ chamo chamb cham chalk chalc chal chairw chairm chair chai chaf Chad Ch Cet cess ces cerv certif certi certa cert ceri ceremoni cerem cerebr cereb cere Cera cer centu centrifuga centrif centri centr centi center centen cente cent censu censo cens cen cem cellulo cellu cell celes celer celeb celebra celebr cele Cela Cel ced Ceci Cec Ce Cay cavil cavi caver cavem cave cava cav caution caut causa caus caul cauc Cauca Cau cattlem cattl catt cats cati cathod catho Cather Cathe cath cater categ cate catc catat catas catalys cataly catal Cata cat casu Casti caste cast Cassi casse cass cask cash case casc cas carv cartog carto carti carte cart carry carro Carri Carra carr carpen carpe Carp Caroli Carol caro Carne carna carn carmi Carme Carm carlo Carli Carl carib Cari cargo carg caret caref caree care cardio Cardi card carcinog carci carc carbu carbox carboni carbona carbon Carbo carbi carb Cara car captiv captio capti capta capt capst caps capr Capito capita capit Capi cape capacita capacit capa cap canv Canton canto canti canter Cante canta Cant canon Cano cannon canno canni canne canna cann cank canis Cani candl candida candi cande cand cancer cancel cancell canc Canad Cana Can campa camp Camil Cami Camero Camera cameram camer Camelo camel came cambr Camb cam Calve calv calumn calu calo callig calli Calla call caliph calip calif calib calibr cali calf calen cale Calde cald Calcul calcula calcu calci calc calami calam cala Cal Cair Cain Cai cah cag caf caden cade cadd cada cad cact caco cach cac cabine cabi caba cab ca c Byz byw Byron Byro Byr bypa byp byl by Buz Buxt Bux butyr buty Buttr button butto Butterf butter butte butt bute butc buta but bust businessm busi bush bus Burt burst burs Burro burr Burn Burm burle burl Burgu burgl burge burg buret burea bureaucrat bureauc bure burde burd Bur buo bunk bung bund bun bump bumb bum bully bullh bullf bulle bulld bull bulk bulg Bulb bul built build buil bui bugg bug buf Bue budget budg Buddhi Buddh Budd Bud bucks Buckl bucket bucke buck buch Bucha Buc Bub bu bryop bryo Brya Bry brut brush brus brun brui Bruc Bruce bru browni Browne Brown brow brou brothe brot broom Brookl Brook brood broo bronz Bronc bronch bronchi bronchio bron bromi brom brok brock broc broa broad bro Britt brita Britan Brit Brist bris brink brind brin brim Bril bright brigh brigad briga brig brie bridgew Bridget bridg bride brid brickl brick bric brib bria bri brew breve brev Bret Brenn Brend Bren brem breez bree brea breat breas breaka break bread bre bra Brazil Brazi braz brave brav brass Bras brandy Brande Brand bran brak Brain Brai Brahms Brah bragg Brag Brad brac bracke brack brace br Boyl boyc boy box bowm bowl Bowe Bowd Bow bout bourg bourb bour bound bounc boun boul boug bou botu botto bottl bott both bota botani bot boson boso Bos borr boro Borne born Bori Borea Bore borderl border bord Bora bor boots bootlegg bootl Boot boor Boon boom booksh books booki book boo Bonne bonn boni bong bonds bond bona bon bombas bomba bom Bolt bolsh Bolshe Bolshevis Bols Bolo Boli bole bold bol Bois Boi Boh bogg boge bog Boe bodyb body bod boc bobbi bobb Bob boa boatm boat boas board boar bo blust blus blur blun Blum blueg bluebo bluebi blueb blue blu blow blot Bloom blood bloodst bloodsh bloods bloo blon Blom blocka block Bloc blo blit bliss blis blind blin bli bles Blen Blee blea ble bla blaz blat blast blasp blas blank bland blanc Blanch blan blam Blai bladd blad Blacks Blackm blackbo blackb blac bl biz biva biv bitu bittern bitter bitte bitt bit bist bisma Bism bish bise bis birt bird bir bipa bip bioti biot biom bio bino Bingh bing bind bina bin bimo Bime bim billio Billi bill bili bila bil bije bij bigo Big bif bienn bie bidi bidd bid bico bica bic biblio bibli bibl bib bia bi Bh bey bewi bewa bew beve Bever bev betw bett Bets betro betra betr beto Bethe beth Bete beta bet bests besto bestir besti best Besse Bess bespe besp besi bese beset bes bery Bertr Berth bert berr Bernie Berni Berne Bernar Berna Bern Berm Berl Berke berk beri Bergs Bergl berg berea Bere ber beq Beo benze Benz benth Bent Benn beni Beng benefic benefici benefice benefi benef Benedic benedicti Bened Bene Bend benc ben bemA bem belv Belt belo belly bellm Bellin belli bella Bell belie beli Belgi Belg belf bela Bel bei behe beha behav beh begu bego beginn begi begga begg bege beg befor befog befo befi befa bef Beet beef Beec beeb Bee bedsp beds bedro bedr bedimm bedi Bedf bed beck Beca bec beauti beaut Beau beatif beati beate beat beas Beard bear bead beac beach bea be bayon Bayo bay bawd baw Baud bau battlef battl batte batt Bato bathr bath bate Batc Bat bast bassi Bass baske bask basil basi bash basep basem basel baseba baseb base basa bas Barto Barth Barte barten bart Barry barri barret barre barrac barra barr barone baron baro Barnet Barne barna Barn Barl bark bari barg baref bare Barc barbi barber barbe barbari barbar Barba Barb bar baptiste Baptist Baptism bap Bantu bant bankr bank bani bangl bang bane bandw bands band bana Ban Bamb Bam Baltim Balt bals balm ballo ballet balle Balla ball Balk Bali bale bald Bal Bake baker Bak bail Bai Bah bagg bag baf Bade bad bacteria bact backwa backw backst backs backpl backp backl backb back baci bach Bacc Bacca bac bab babysi babys Baby Babe Babb ba b Azt azi Az Aye Ay axo axis axiom axio axi ax awe awa awar awak aw avoi Avoc avoca avo avia aviat avi avers averr aver Aven ave Ava avar av autu auton automo automa autom autocrat autocr autoco autoc auto auti auth authori autho authe aut Austra Austr Auste aust ausp aus auro Auri aure Aura aur aun Augus augu augm auge Aug audito audit audio audi auda aud auct auc Aub Au Atw attrib attributi attri attr attic Atti attes attent attend atten atte atta attai attac attach att Atroph atrop atroc atro atr aton atom ato atm atlan Atlantic Atlanti atl Atk athl Athen Athei athe ath atav ata At asyn asymp asym asy asu astrop astron astrono astrona astro astri astra astr Astor Asto asti astero asteri aste asta ast Assy assur assum assu assoc asso assis Assim assig assid assi asses assem asse assas Assai assail assa ass aspira aspir aspi asph asper aspe aspa aspara asp ask asia Asi ashm Ashl Ashe ash ascr asce ascen ascend asc as aru artis artifi artif Artic articu arti Arth arteri arteriol arterio arter artem arte Art arse arseni arsena ars arrow arrog arro arri arre arra arran Arr arp arous arou arom aro Armo armi Armc armat Armad arma arm Arle Arl Arka Ark Aristote Aristot Aristoc aristocrat arist arise aris aria Ari argumenta argum argu Argon argo argi arg arena aren areaw area are arde ard arcta arct arcs archiv architectu archit Archi archet arche archai archa arch arcc arcan arcad Arca arc arbo arbi arbitr arb arac Arab Arabi ara Ar Aqui aque aqua Aquar aq apt apro apri Apr approx approv approp appro apprehens appreh apprec appre appra appr appos appoi appointe appo applic appli Apple appla appl appendi appen appel appea appeas appear appe appa appare appar appal app apot apos apolo apoll Apol apoc apocr Apoca apo api apha aph aper ape apa apath apat apar ap A& anyw anyb any anx antony Anton Antoi Anto antis antiqua antiquar antiq antipa antip antigo Antig antici antic anti anthro anthra anthr Antho anthe anth anten ante Antarc Antar antag Anta ant ANSe Ans anorthi anort anor anon anoma anom anod ano annull annul annu annoy anno anni anne Annale Annal anna Ann ank aniso anise anis anio anima animad anim ani anhydri anhy Anh angu angs Ango Anglo angli Angle Angl angi Ange angel Angelin Angelic Angeli Ang anec ane Andro Andre Andr Ando andesi andes Ander Ande And anci anchor anch ance ancestr anc anatom anato Anat anasto anasti anas anar analys analy analo anal anag anach anac Anab Ana an amy amu ampli ampl amphib amphibo amphibi amphi amph Amper ampe amp amor amon amoe amo ammonia ammon ammo amme Amm amin amid ami amet america Ameri Amer amend amen amel ame ambus ambul ambu ambrosi ambr ambl ambit ambig ambi amb Amaz amate amat Amar aman amal Ama AM alve alva Alv alum alumna alumn alumi alu altr alto alti alth altern alte alta alt Also als Alpha alphab alph Alpe alp along alon alo almo alma Alm ally alluv allus allu Alls allow allott allot alloc allo Allis alli alley aller Allen alleg allegr allego alle Alla All alkali alk Alis alig alie Alic alia ali algor Algo algi Alger Algeb alge alga algae alg alfred Alfr alf Alexandr Alexa Alex Alec Ale aldr Alde alderm alder ald alcoh alco alc Album albu Albr Albert Alber Albe Albani Alban alba alb Alam alabam Alab Ala al Ak Aj airs airp airma airm airli airl airf Aire air Ain aile ail Aid Aide Ai ahe ah agric agricu agri agre agr agon ago agno agne Agn agi aggressi aggres aggre aggr aggl agglu agg agen Age aga Agat Agai ag afterw afte aft afr afor afo afl afi Afg affr affore affo affl affirma affir affi affec affe affa aff af aest aes aeros aerob aero aer Aeo Aen Aeg ae advo adviso advise advis advi advert advers adverb adver adven adventu adve adva advant adv adulte adult adu adsorp adsorb ads Adria Adri Adre adr ador adopti adop Adolp Adol ado admo admi admix admitt admit admis admira admiral admir admin administrat administr adm adjud adju adjoi adjo adje adj adi adhes adher adh adeq adeno aden Adel Ade addr addit Addis Addi adde add adap adam adag ada Ad acu actu acto actin actino actini acti Act acry acrob acrobat acro acre acr acquitt acquit acquis acquie acqui acqua acq aco acm ackn Ack aci Achi ach acet acer ace accusa accusati accus accur accu accru accred accre accr accoun accou accor accompl accompa accompani accomp accom acco accla accl accid acci acce accessi acces accep accentu accen accel acc acad Acade academi academic aca ac Abyss aby abutt abut abus abu abstra abstr abst absorp absorb absor absol absolu abso absente abse absc absci abs abro abri abre abra abras Abram Abr abov abou abori abor abom abol abo abn abla abl Abid Abi abh abey abett abet aberr Aber Abel abe abdo abd Abbo abbe abb abA abas abac Ab Aar AaA AA A submitted trusted procedure quoti abbr evaluat introduce define own propert ancesto defau uncl manne modif modifi reduce behavi newel behave severe contai bless relea toug remov imprope satisfy notif securi belon smell temporar eage chirp obvio branc optio owne menti liste suppli remove seemi shorte solidi fiddle flic slig please teach optiona functiona centre parse personal alias owner zool finis complete fak initial cure modific elim unf actual easi faste impai simplif subjecti interfe specifica alterna present existent extreme carefu curre definite sandw reasona instant finishe unsc represe implic generat frid fille neate backwar basic circumstanc incidenta conveni delib whil applicat critic 11870 4 3 2 ess 2 4 2 2 worthlessness 2 worthless 38 1 4 3 2 2 r 4 3 2 driveway 2 driven 2 drive 38 1 4 3 2 2 4 2 2 drivers 2 driver 38 1 4 3 2 2 c 4 1 2 unsure 38 1 4 3 2 c 2 4 2 2 topical 2 topic 38 1 4 3 2 d 2 4 3 2 friendly 2 friends 2 friend 38 1 4 3 2 tion 2 4 2 2 computations 2 computation 38 1 0 25132 38 1 4 3 2 t 2 4 2 2 activating 2 activate 38 1 4 3 2 ge 2 4 2 2 messages 2 message 38 1 4 3 2 n 2 4 2 2 locations 2 location 38 1 4 3 2 ng 2 4 2 2 settings 2 setting 38 1 4 3 2 2 i 4 1 2 settle 38 1 4 3 2 2 4 2 2 creation 2 creating 38 1 4 3 2 a 2 4 2 2 lambdahouse 2 lambda 38 1 4 3 2 us 2 4 2 2 rigorously 2 rigorous 38 1 4 3 2 r 2 o 4 1 2 rigor 38 1 4 3 2 2 4 2 2 programmers 2 programmer 38 1 4 3 2 2 4 2 2 harder 2 harden 38 1 4 3 2 in 2 4 2 2 redefining 2 redefine 38 1 4 3 2 pti 2 4 2 2 redemptive 2 redemption 38 1 4 3 2 nding 2 4 2 2 keybindings 2 keybinding 38 1 4 3 2 2 i 4 1 2 keyboard 38 1 4 3 2 2 4 2 2 buffer 2 buffet 38 1 4 3 2 2 4 2 2 artificer 2 artifice 38 1 4 3 2 al 2 4 2 2 horizontally 2 horizontal 38 1 4 3 2 l 2 4 2 2 vertically 2 vertical 38 1 4 3 2 c 2 4 2 2 automatically 2 automatic 38 1 4 3 2 ate 2 4 2 2 truncated 2 truncate 38 1 4 3 2 aw 2 4 2 2 redraw 2 redraws 38 1 4 3 2 l 2 4 2 2 scrolling 2 scroll 38 1 4 3 2 2 4 2 2 connection 2 Connecticut 38 1 4 3 2 2 4 2 2 emacs 2 emaciate 38 1 4 3 2 2 4 2 2 frisbee 2 frisky 38 1 4 3 2 c 2 4 2 2 cynical 2 cynic 38 1 4 3 2 ct 2 4 2 2 intersection 2 intersect 38 1 4 3 2 2 4 2 2 corner 2 cornerstone 38 1 4 3 2 e 2 4 2 2 headlines 2 headline 38 1 4 3 2 ord 2 4 2 2 keywords 2 keyword 38 1 4 3 2 oon 2 4 2 2 tablespoonful 2 tablespoon 38 1 4 3 2 e 2 4 2 2 irritated 2 irritate 38 1 4 3 2 s 2 4 2 2 bonuses 2 bonus 38 1 4 3 2 st 2 4 2 2 interesting 2 interest 38 1 4 3 2 2 4 2 2 grazing 2 graze 38 1 4 3 2 2 4 2 2 dozens 2 dozen 38 1 4 3 2 re 2 4 2 2 pastures 2 pasture 38 1 4 3 2 2 4 2 2 rolling 2 Rollins 38 1 4 3 2 2 4 2 2 fields 2 fieldstone 38 1 4 3 2 ead 2 4 2 2 proofreading 2 proofread 38 1 4 3 2 2 4 2 2 footer 2 Foote 38 1 4 3 2 2 o 4 1 2 locating 38 1 4 3 2 2 4 2 2 times 2 timeshare 38 1 4 3 2 t 2 4 2 2 insertion 2 insert 38 1 4 3 2 oard 2 4 2 2 clipboards 2 clipboard 38 1 4 3 2 2 4 2 2 saving 2 Saviour 38 1 4 3 2 2 4 2 2 unknown 2 unkempt 38 1 4 3 2 ng 2 4 2 2 failings 2 failing 38 1 4 3 2 2 4 2 2 failer 2 failed 38 1 4 3 2 elling 2 4 2 2 misspellings 2 misspelling 38 1 4 3 2 r 2 4 2 2 players 2 player 38 1 4 3 2 ag 2 4 2 2 zigzag 2 zigzagging 38 1 4 3 2 t 2 4 2 2 zesty 2 zest 38 1 4 3 2 o 2 4 3 2 zeroth 2 zeroes 2 zero 38 1 4 3 2 2 4 2 2 zenith 2 Zen 38 1 4 3 2 l 2 o 4 2 2 Zealand 2 zeal 38 1 4 3 2 2 4 2 2 zealous 2 zealot 38 1 4 3 2 2 anrs 4 5 2 Zeus 2 zeta 2 Zellerbach 2 Zeiss 2 zebra 38 1 4 3 2 2 4 2 2 Zanzibar 2 Zan 38 1 4 3 2 2 4 3 2 Zagreb 2 zagging 2 zag 38 1 4 3 2 2 gn 4 5 2 zazen 2 zap 2 Zambia 2 Zaire 2 Zachary 38 1 4 3 2 e 2 4 2 2 Yvette 2 Yves 38 1 4 3 2 2 4 2 2 Yukon 2 Yuki 38 1 4 3 2 oslav 2 4 2 2 Yugoslavia 2 Yugoslav 38 1 4 3 2 2 4 3 2 yuck 2 yucca 2 Yucatan 38 1 4 3 2 2 cgk 4 2 2 yule 2 yuh 38 1 4 3 2 t 2 4 2 2 yttrium 2 ytterbium 38 1 4 3 2 h 2 4 2 2 youthful 2 youth 38 1 4 3 2 l 2 4 2 2 yourselves 2 yourself 38 1 4 3 2 2 e 4 1 2 yours 38 1 4 3 2 t 2 4 2 2 Youngstown 2 youngster 38 1 4 3 2 g 2 s 4 2 2 youngish 2 young 38 1 4 3 2 2 4 2 2 Yost 2 Yosemite 38 1 4 3 2 2 4 2 2 Yorktown 2 york 38 1 4 3 2 2 k 4 1 2 yore 38 1 4 3 2 2 4 3 2 Yonkers 2 yond 2 yon 38 1 4 3 2 2 4 2 2 yokel 2 yoke 38 1 4 3 2 2 e 4 2 2 Yokuts 2 Yokohama 38 1 4 3 2 2 4 4 2 yogurt 2 yogi 2 yoghurt 2 yoga 38 1 4 3 2 e 2 4 2 2 Yoder 2 yodel 38 1 4 3 2 2 4 2 2 yipping 2 yip 38 1 4 3 2 2 p 4 3 2 yin 2 yield 2 Yiddish 38 1 4 3 2 er 2 4 2 2 yesteryear 2 yesterday 38 1 4 3 2 2 t 4 2 2 yeshiva 2 yes 38 1 4 3 2 man 2 4 2 2 yeomanry 2 yeoman 38 1 4 3 2 2 o 4 1 2 yell 38 1 4 3 2 w 2 4 4 2 Yellowstone 2 Yellowknife 2 yellowish 2 yellow 38 1 4 3 2 2 l 4 1 2 yelp 38 1 4 3 2 t 2 4 2 2 yeasty 2 yeast 38 1 4 3 2 2 4 4 2 yearn 2 yearbook 2 years 2 year 38 1 4 3 2 2 4 3 2 yawn 2 yawl 2 yaw 38 1 4 3 2 2 4 2 2 yarmulke 2 Yarmouth 38 1 4 3 2 2 4 3 2 yardstick 2 yardage 2 yard 38 1 4 3 2 2 dm 4 2 2 yarrow 2 yarn 38 1 4 3 2 2 4 2 2 yapping 2 yap 38 1 4 3 2 2 4 3 2 Yankton 2 Yankee 2 yank 38 1 4 3 2 2 k 4 1 2 yang 38 1 4 3 2 2 4 2 2 Yamaha 2 yam 38 1 4 3 2 2 4 2 2 Yalta 2 Yale 38 1 4 3 2 2 4 2 2 Yakima 2 yak 38 1 4 3 2 ht 2 s 4 1 2 yacht 38 1 4 3 2 m 2 4 2 2 yachtsmen 2 yachtsman 38 1 4 3 2 2 cklmnprw 4 4 2 Yates 2 Yaqui 2 Yaounde 2 yah 38 1 4 3 2 2 4 2 2 xylene 2 xylem 38 1 4 3 2 l 2 e 4 1 2 xylophone 38 1 4 3 2 2 4 2 2 Xerox 2 xerography 38 1 4 3 2 2 o 4 1 2 Xerxes 38 1 4 3 2 o 2 4 2 2 xenophobia 2 xenon 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 2 ey 4 4 2 x's 2 xi 2 Xavier 2 x 38 1 4 3 2 2 4 2 2 wynn 2 Wyner 38 1 4 3 2 2 4 2 2 Wyatt 2 Wyandotte 38 1 4 3 2 2 an 4 5 2 Wyoming 2 Wyman 2 Wylie 2 Wyeth 2 WY 38 1 4 3 2 2 4 2 2 Wuhan 2 Wu 38 1 4 3 2 2 g 4 1 2 Wronskian 38 1 4 3 2 2 d 4 2 2 wrongful 2 wrong 38 1 4 3 2 o 2 4 3 2 wrongdoing 2 wrongdoer 2 wrongdo 38 1 4 3 2 2 n 4 2 2 wrought 2 wrote 38 1 4 3 2 2 4 2 2 writeup 2 write 38 1 4 3 2 2 e 4 3 2 writhe 2 writ 2 written 38 1 4 3 2 t 2 4 3 2 wristwatch 2 wristband 2 wrist 38 1 4 3 2 2 4 2 2 wrinkle 2 wring 38 1 4 3 2 2 4 3 2 Wrigley 2 wright 2 wriggle 38 1 4 3 2 2 gnst 4 0 38 1 4 3 2 t 2 4 2 2 wrestle 2 wrest 38 1 4 3 2 k 2 4 2 2 wreckage 2 wreck 38 1 4 3 2 2 t 4 1 2 wreak 38 1 4 3 2 h 2 4 2 2 wreathe 2 wreath 38 1 4 3 2 2 acs 4 2 2 wretch 2 wrench 38 1 4 3 2 h 2 4 2 2 wrathful 2 wrath 38 1 4 3 2 2 4 2 2 wrapup 2 wrap 38 1 4 3 2 2 pt 4 3 2 wrangle 2 wraith 2 wrack 38 1 4 3 2 2 aeio 4 1 2 wry 38 1 4 3 2 e 2 4 2 2 woven 2 wove 38 1 4 3 2 d 2 4 2 2 wouldn't 2 would 38 1 4 3 2 2 l 4 1 2 wound 38 1 4 3 2 h 2 l 4 4 2 worthy 2 worthwhile 2 Worthington 2 worth 38 1 4 3 2 ip 2 4 2 2 worshipful 2 worship 38 1 4 3 2 2 4 2 2 worsen 2 worse 38 1 4 3 2 2 eh 4 1 2 worst 38 1 4 3 2 2 4 2 2 worry 2 worrisome 38 1 4 3 2 2 4 2 2 wormy 2 worm 38 1 4 3 2 d 2 4 2 2 worldwide 2 world 38 1 4 3 2 2 4 2 2 workshop 2 worksheet 38 1 4 3 2 2 h 4 3 2 workstation 2 workspace 2 works 38 1 4 3 2 2 4 2 2 workplace 2 workpiece 38 1 4 3 2 n 2 4 2 2 workmanlike 2 workman 38 1 4 3 2 2 a 4 1 2 workmen 38 1 4 3 2 2 4 2 2 workbook 2 workbench 38 1 4 3 2 2 4 2 2 Wordsworth 2 words 38 1 4 3 2 2 4 3 2 Woolworth 2 woolgather 2 wool 38 1 4 3 2 2 4 2 2 woodyard 2 woody 38 1 4 3 2 2 4 3 2 woodwork 2 woodwind 2 Woodward 38 1 4 3 2 2 4 3 2 woodside 2 woodshed 2 Woods 38 1 4 3 2 2 4 2 2 woodruff 2 Woodrow 38 1 4 3 2 2 4 2 2 Woodlawn 2 woodland 38 1 4 3 2 2 a 4 1 2 woodlot 38 1 4 3 2 2 4 3 2 woodcut 2 woodcock 2 woodcarver 38 1 4 3 2 2 clrswy 4 7 2 woodpeck 2 woodhen 2 woodgrain 2 wooden 2 Woodbury 2 Woodard 2 wood 38 1 4 3 2 2 dl 4 2 2 Wooster 2 woo 38 1 4 3 2 r 2 4 3 2 wonderland 2 wonderful 2 wonder 38 1 4 3 2 2 e 4 1 2 wondrous 38 1 4 3 2 2 d 4 4 2 wont 2 won't 2 Wong 2 won 38 1 4 3 2 2 4 2 2 wombat 2 womb 38 1 4 3 2 n 2 4 2 2 womanhood 2 woman 38 1 4 3 2 e 2 4 2 2 wolves 2 wolve 38 1 4 3 2 2 4 5 2 wolfish 2 Wolfgang 2 Wolff 2 Wolfe 2 wolf 38 1 4 3 2 2 fv 4 2 2 wold 2 Wolcott 38 1 4 3 2 2 4 2 2 woke 2 wok 38 1 4 3 2 2 4 3 2 woeful 2 woebegone 2 woe 38 1 4 3 2 2 4 2 2 witty 2 Witt 38 1 4 3 2 t 2 4 2 2 withstood 2 withstand 38 1 4 3 2 2 4 2 2 withhold 2 withheld 38 1 4 3 2 2 4 2 2 wither 2 withe 38 1 4 3 2 w 2 4 3 2 withdrawn 2 withdrawal 2 withdraw 38 1 4 3 2 r 2 a 4 1 2 withdrew 38 1 4 3 2 h 2 4 2 2 witchcraft 2 witch 38 1 4 3 2 2 dehs 4 5 2 withy 2 withal 2 without 2 within 2 with 38 1 4 3 2 2 4 2 2 wispy 2 wisp 38 1 4 3 2 2 4 4 2 wishy 2 wishful 2 wishbone 2 wish 38 1 4 3 2 2 4 4 2 wisenheimer 2 wisecrack 2 wiseacre 2 wise 38 1 4 3 2 2 ehp 4 3 2 wistful 2 wisdom 2 Wisconsin 38 1 4 3 2 2 mt 4 1 2 wire 38 1 4 3 2 2 4 2 2 wiretapping 2 wiretapper 38 1 4 3 2 ap 2 p 4 1 2 wiretap 38 1 4 3 2 2 4 2 2 wiremen 2 wireman 38 1 4 3 2 2 e 4 1 2 wiry 38 1 4 3 2 r 2 4 3 2 wintertime 2 Winters 2 winter 38 1 4 3 2 2 e 4 2 2 wintry 2 Winthrop 38 1 4 3 2 2 4 3 2 Winston 2 winsome 2 Winslow 38 1 4 3 2 e 2 4 2 2 Winnipesaukee 2 Winnipeg 38 1 4 3 2 2 p 4 1 2 Winnie 38 1 4 3 2 2 i 4 2 2 winnow 2 Winnetka 38 1 4 3 2 2 4 2 2 winkle 2 wink 38 1 4 3 2 2 4 2 2 wingmen 2 wingman 38 1 4 3 2 2 m 4 4 2 wingtip 2 wingspan 2 wingback 2 wing 38 1 4 3 2 a 2 4 2 2 winemaster 2 winemake 38 1 4 3 2 2 m 4 3 2 wineskin 2 winery 2 wine 38 1 4 3 2 2 4 4 2 windsurf 2 windstorm 2 Windsor 2 windshield 38 1 4 3 2 w 2 4 3 2 windowsill 2 windowpane 2 window 38 1 4 3 2 2 4 2 2 windbreak 2 windbag 38 1 4 3 2 2 bos 4 6 2 windy 2 windward 2 windup 2 windmill 2 windfall 2 wind 38 1 4 3 2 2 4 2 2 Winchester 2 winch 38 1 4 3 2 2 h 4 1 2 wince 38 1 4 3 2 2 cdegknst 4 5 2 winy 2 wino 2 Winifred 2 Winfield 2 win 38 1 4 3 2 n 2 4 2 2 Wilsonian 2 Wilson 38 1 4 3 2 2 o 4 1 2 Wilshire 38 1 4 3 2 2 4 2 2 Wilmington 2 Wilma 38 1 4 3 2 2 4 2 2 willowy 2 willow 38 1 4 3 2 2 w 4 1 2 Willoughby 38 1 4 3 2 m 2 s 4 1 2 William 38 1 4 3 2 2 4 3 2 Williamson 2 Williamsburg 2 Williams 38 1 4 3 2 2 a 4 2 2 Willis 2 Willie 38 1 4 3 2 2 4 2 2 Willard 2 Willa 38 1 4 3 2 2 aio 4 3 2 Wills 2 willful 2 will 38 1 4 3 2 s 2 4 2 2 Wilkinson 2 Wilkins 38 1 4 3 2 2 n 4 1 2 Wilkie 38 1 4 3 2 2 i 4 1 2 Wilkes 38 1 4 3 2 elm 2 4 2 2 Wilhelmina 2 Wilhelm 38 1 4 3 2 2 4 2 2 wilful 2 Wilfred 38 1 4 3 2 2 4 2 2 Wiley 2 wile 38 1 4 3 2 at 2 4 2 2 wildcatter 2 wildcat 38 1 4 3 2 2 c 4 4 2 wildlife 2 wildfire 2 wilderness 2 wild 38 1 4 3 2 2 defhklms 4 4 2 wily 2 wilt 2 Wilcox 2 Wilbur 38 1 4 3 2 2 4 2 2 wiggly 2 wiggle 38 1 4 3 2 n 2 4 2 2 Wiggins 2 wigging 38 1 4 3 2 2 il 4 0 38 1 4 3 2 2 g 4 4 2 wigwam 2 wigmake 2 Wightman 2 wig 38 1 4 3 2 2 4 3 2 Wier 2 wiener 2 wield 38 1 4 3 2 h 2 4 2 2 widthwise 2 width 38 1 4 3 2 w 2 4 2 2 widowhood 2 widow 38 1 4 3 2 e 2 4 2 2 widget 2 widgeon 38 1 4 3 2 2 4 3 2 widespread 2 widen 2 wide 38 1 4 3 2 2 egot 4 0 38 1 4 3 2 2 4 2 2 wicket 2 wick 38 1 4 3 2 2 k 4 1 2 Wichita 38 1 4 3 2 2 4 2 2 whosoever 2 whose 38 1 4 3 2 2 4 2 2 whoosh 2 whoop 38 1 4 3 2 2 4 3 2 whomsoever 2 whomever 2 whom 38 1 4 3 2 2 s 4 2 2 wholehearted 2 whole 38 1 4 3 2 2 4 2 2 wholesome 2 wholesale 38 1 4 3 2 2 e 4 1 2 wholly 38 1 4 3 2 2 4 3 2 who'll 2 who'd 2 who've 38 1 4 3 2 2 4 2 2 whizzing 2 whiz 38 1 4 3 2 2 4 3 2 whittle 2 Whittier 2 Whittaker 38 1 4 3 2 2 4 3 2 Whitehorse 2 whitehead 2 Whitehall 38 1 4 3 2 2 h 4 5 2 whitewash 2 whitetail 2 whiten 2 whiteface 2 white 38 1 4 3 2 2 et 4 7 2 Whitney 2 Whitman 2 Whitlock 2 whither 2 Whitcomb 2 Whitaker 2 whit 38 1 4 3 2 le 2 4 2 2 whistleable 2 whistle 38 1 4 3 2 2 t 4 3 2 whisper 2 whisk 2 whish 38 1 4 3 2 2 4 4 2 whirlwind 2 whirlpool 2 whirligig 2 whirl 38 1 4 3 2 2 l 4 1 2 whir 38 1 4 3 2 2 4 3 2 Whipple 2 whippet 2 Whippany 38 1 4 3 2 2 p 4 3 2 whipsaw 2 whiplash 2 whip 38 1 4 3 2 2 4 2 2 whinny 2 whine 38 1 4 3 2 2 4 2 2 whimsic 2 whimsey 38 1 4 3 2 2 s 4 2 2 whimper 2 whim 38 1 4 3 2 h 2 4 2 2 whichever 2 which 38 1 4 3 2 2 4 2 2 whet 2 whether 38 1 4 3 2 ith 2 4 2 2 wherewithal 2 wherewith 38 1 4 3 2 2 4 2 2 where're 2 where'd 38 1 4 3 2 2 4 2 2 whereon 2 whereof 38 1 4 3 2 2 4 2 2 whereas 2 whereabout 38 1 4 3 2 e 2 ao'w 4 7 2 wherever 2 whereupon 2 wheresoever 2 wherein 2 wherefore 2 whereby 2 where 38 1 4 3 2 2 4 3 2 whenever 2 whence 2 when 38 1 4 3 2 2 4 5 2 whelp 2 whelm 2 Wheller 2 whelk 2 Whelan 38 1 4 3 2 2 4 2 2 wheezy 2 wheeze 38 1 4 3 2 2 4 4 2 wheelhouse 2 wheelchair 2 wheelbase 2 wheel 38 1 4 3 2 2 lz 4 2 2 wheedle 2 whee 38 1 4 3 2 t 2 4 2 2 Wheatstone 2 wheat 38 1 4 3 2 2 4 2 2 what're 2 what'd 38 1 4 3 2 2 ' 4 5 2 whatsoever 2 whatnot 2 Whatley 2 whatever 2 what 38 1 4 3 2 2 4 3 2 wharves 2 Wharton 2 wharf 38 1 4 3 2 e 2 4 2 2 Whalen 2 whale 38 1 4 3 2 2 lrt 4 2 2 wham 2 whack 38 1 4 3 2 2 4 2 2 wetland 2 wet 38 1 4 3 2 2 4 2 2 westernmost 2 western 38 1 4 3 2 r 2 n 4 1 2 westerly 38 1 4 3 2 ey 2 4 2 2 Wesleyan 2 Wesley 38 1 4 3 2 2 e 4 8 2 westward 2 Weston 2 Westminster 2 Westinghouse 2 Westfield 2 Westchester 2 westbound 2 west 38 1 4 3 2 2 4 2 2 Werther 2 wert 38 1 4 3 2 2 4 2 2 weren't 2 were 38 1 4 3 2 2 et 4 1 2 Werner 38 1 4 3 2 2 4 2 2 Wendy 2 Wendell 38 1 4 3 2 2 d 4 1 2 went 38 1 4 3 2 2 4 2 2 Wellesley 2 Welles 38 1 4 3 2 2 s 4 1 2 Weller 38 1 4 3 2 2 e 4 4 2 Wells 2 wellington 2 wellbeing 2 well 38 1 4 3 2 2 4 2 2 Weldon 2 weld 38 1 4 3 2 2 4 2 2 welcome 2 Welch 38 1 4 3 2 2 cdl 4 3 2 welt 2 welsh 2 welfare 38 1 4 3 2 2 4 2 2 weird 2 weir 38 1 4 3 2 2 4 2 2 Weinstein 2 Weinberg 38 1 4 3 2 2 4 2 2 weighty 2 weight 38 1 4 3 2 h 2 t 4 1 2 weigh 38 1 4 3 2 2 gnr 4 3 2 Weiss 2 Weierstrass 2 Wei 38 1 4 3 2 2 4 2 2 weedy 2 weed 38 1 4 3 2 2 4 4 2 weekend 2 weekday 2 weeks 2 week 38 1 4 3 2 2 4 4 2 wedlock 2 wedge 2 wed 2 wednesday 38 1 4 3 2 2 4 4 2 we've 2 we'll 2 we'd 2 we're 38 1 4 3 2 2 4 4 2 Webster 2 weber 2 Webb 2 web 38 1 4 3 2 trip 2 4 2 2 weatherstripping 2 weatherstrip 38 1 4 3 2 her 2 s 4 3 2 weatherproof 2 weatherbeaten 2 weather 38 1 4 3 2 2 4 2 2 wearisome 2 wearied 38 1 4 3 2 2 i 4 3 2 wearable 2 weary 2 wear 38 1 4 3 2 on 2 4 2 2 weaponry 2 weapon 38 1 4 3 2 h 2 4 2 2 wealthy 2 wealth 38 1 4 3 2 2 t 4 1 2 weal 38 1 4 3 2 2 4 2 2 weaken 2 weak 38 1 4 3 2 2 klprt 4 3 2 weave 2 weasel 2 wean 38 1 4 3 2 2 4 2 2 wayside 2 ways 38 1 4 3 2 a 2 4 2 2 waylay 2 waylaid 38 1 4 3 2 2 4 4 2 waxy 2 waxwork 2 waxen 2 wax 38 1 4 3 2 2 fl 4 3 2 wavenumber 2 waveguide 2 wave 38 1 4 3 2 e 2 4 2 2 wavelet 2 wavelength 38 1 4 3 2 2 4 2 2 wavefront 2 waveform 38 1 4 3 2 2 e 4 1 2 wavy 38 1 4 3 2 2 4 4 2 Watts 2 wattle 2 wattage 2 watt 38 1 4 3 2 2 4 3 2 waterside 2 watershed 2 Waters 38 1 4 3 2 2 4 2 2 watermelon 2 Waterman 38 1 4 3 2 2 4 2 2 Waterloo 2 waterline 38 1 4 3 2 2 4 2 2 waterfront 2 waterfall 38 1 4 3 2 r 2 flms 4 9 2 watery 2 waterway 2 Watertown 2 waterproof 2 Waterhouse 2 Watergate 2 watercourse 2 Waterbury 2 water 38 1 4 3 2 2 4 2 2 watchman 2 watchmake 38 1 4 3 2 2 a 4 1 2 watchmen 38 1 4 3 2 h 2 m 4 5 2 watchword 2 watchful 2 watchdog 2 watchband 2 watch 38 1 4 3 2 2 cet 4 3 2 Watson 2 Watkins 2 Watanabe 38 1 4 3 2 2 4 5 2 wastewater 2 wasteland 2 wasteful 2 wastebasket 2 waste 38 1 4 3 2 2 e 4 3 2 wastrel 2 wastage 2 wast 38 1 4 3 2 2 4 2 2 waspish 2 wasp 38 1 4 3 2 2 4 2 2 washbowl 2 washboard 38 1 4 3 2 2 o 4 2 2 Washburn 2 washbasin 38 1 4 3 2 2 b 4 4 2 washy 2 washout 2 wash 2 washington 38 1 4 3 2 2 4 3 2 warty 2 wartime 2 wart 38 1 4 3 2 nt 2 4 2 2 warranty 2 warrant 38 1 4 3 2 2 a 4 2 2 warrior 2 warren 38 1 4 3 2 2 4 2 2 warplane 2 warp 38 1 4 3 2 2 4 6 2 warmup 2 warmth 2 warmonger 2 warmish 2 warmhearted 2 warm 38 1 4 3 2 ouse 2 4 2 2 warehouseman 2 warehouse 38 1 4 3 2 2 h 4 1 2 ware 38 1 4 3 2 o 2 4 2 2 wardroom 2 wardrobe 38 1 4 3 2 2 r 4 2 2 warden 2 ward 38 1 4 3 2 2 demprt 4 10 2 wary 2 Warwick 2 Warsaw 2 warn 2 warlike 2 Waring 2 warhead 2 warfare 2 warble 2 war 38 1 4 3 2 2 4 3 2 Wappinger 2 wapiti 2 wapato 38 1 4 3 2 2 4 2 2 wangle 2 Wang 38 1 4 3 2 2 4 2 2 wander 2 wand 38 1 4 3 2 2 4 5 2 wanton 2 wants 2 wanting 2 wanted 2 want 38 1 4 3 2 2 4 2 2 waltzing 2 waltz 38 1 4 3 2 r 2 4 2 2 Walters 2 Walter 38 1 4 3 2 2 ez 4 3 2 Walton 2 Waltham 2 Walt 38 1 4 3 2 2 4 2 2 wallow 2 wallop 38 1 4 3 2 2 4 2 2 wallet 2 Waller 38 1 4 3 2 2 4 2 2 Wallace 2 wallaby 38 1 4 3 2 2 aeo 4 6 2 wally 2 Walls 2 wallpaper 2 Wallis 2 wallboard 2 wall 38 1 4 3 2 2 4 2 2 walkover 2 walkout 38 1 4 3 2 2 o 4 3 2 walkway 2 walkie 2 walk 38 1 4 3 2 2 4 2 2 Waldorf 2 Waldo 38 1 4 3 2 2 o 4 2 2 Waldron 2 Walden 38 1 4 3 2 2 dklt 4 7 2 Walsh 2 walrus 2 Walpole 2 walnut 2 Walgreen 2 wale 2 Walcott 38 1 4 3 2 2 4 2 2 wakeful 2 Wakefield 38 1 4 3 2 e 2 f 4 4 2 wakeup 2 wakerobin 2 waken 2 wake 38 1 4 3 2 2 4 3 2 waitress 2 Waite 2 wait 38 1 4 3 2 t 2 4 3 2 waistline 2 waistcoat 2 waist 38 1 4 3 2 2 4 2 2 Wainwright 2 wainscot 38 1 4 3 2 2 nst 4 2 2 waive 2 wail 38 1 4 3 2 2 4 2 2 Wahl 2 wah 38 1 4 3 2 2 4 2 2 waggle 2 wagging 38 1 4 3 2 2 g 4 4 2 wagoneer 2 Wagner 2 wage 2 wag 38 1 4 3 2 2 4 2 2 wafer 2 waffle 38 1 4 3 2 2 4 5 2 Wadsworth 2 wadi 2 wade 2 waddle 2 wad 38 1 4 3 2 2 4 3 2 wacky 2 wacke 2 wack 38 1 4 3 2 2 k 4 2 2 Waco 2 WAC 38 1 4 3 2 l 2 4 5 2 vulture 2 vulpine 2 vulnerable 2 vulgar 2 Vulcan 38 1 4 3 2 2 4 2 2 vowel 2 vow 38 1 4 3 2 h 2 4 2 2 vouchsafe 2 vouch 38 1 4 3 2 2 c 4 1 2 Vought 38 1 4 3 2 2 4 3 2 votive 2 vote 2 votary 38 1 4 3 2 c 2 4 2 2 vorticity 2 vortices 38 1 4 3 2 2 i 4 1 2 vortex 38 1 4 3 2 ci 2 4 2 2 voracity 2 voracious 38 1 4 3 2 2 at 4 0 38 1 4 3 2 r 2 4 2 2 voluntary 2 voluntarism 38 1 4 3 2 t 2 a 4 1 2 volunteer 38 1 4 3 2 2 4 2 2 volumetric 2 volume 38 1 4 3 2 2 e 4 1 2 voluminous 38 1 4 3 2 2 mn 4 2 2 voluptuous 2 voluble 38 1 4 3 2 2 4 2 2 Voltaire 2 voltaic 38 1 4 3 2 2 i 4 2 2 voltage 2 Volta 38 1 4 3 2 2 a 4 3 2 voltmeter 2 Volterra 2 volt 38 1 4 3 2 ey 2 4 2 2 volleyball 2 volley 38 1 4 3 2 2 4 2 2 volcanism 2 volcanic 38 1 4 3 2 an 2 i 4 1 2 volcano 38 1 4 3 2 2 cltu 4 5 2 Volvo 2 Volstead 2 Volkswagen 2 volition 2 volatile 38 1 4 3 2 e 2 4 3 2 voiceband 2 voices 2 voice 38 1 4 3 2 2 4 2 2 vogue 2 Vogel 38 1 4 3 2 2 bl 4 1 2 vocate 38 1 4 3 2 2 4 2 2 vocalic 2 vocal 38 1 4 3 2 2 u 4 1 2 vocable 38 1 4 3 2 lar 2 4 2 2 vocabulary 2 vocabularian 38 1 4 3 2 2 a 4 1 2 vociferous 38 1 4 3 2 2 c 4 1 2 void 38 1 4 3 2 adi 2 4 2 2 Vladivostok 2 Vladimir 38 1 4 3 2 2 4 3 2 vivify 2 vivid 2 Vivian 38 1 4 3 2 2 c 4 2 2 Vivaldi 2 viva 38 1 4 3 2 2 4 2 2 vivacity 2 vivacious 38 1 4 3 2 2 i 4 1 2 vivace 38 1 4 3 2 2 ai 4 1 2 vivo 38 1 4 3 2 l 2 4 2 2 vitriolic 2 vitriol 38 1 4 3 2 2 o 4 1 2 vitrify 38 1 4 3 2 2 i 4 2 2 vitro 2 vitreous 38 1 4 3 2 2 4 4 2 vitamin 2 vital 2 vitae 2 vita 38 1 4 3 2 2 ar 4 2 2 Vito 2 vitiate 38 1 4 3 2 2 4 3 2 visitor 2 visitation 2 visit 38 1 4 3 2 n 2 4 2 2 visionary 2 vision 38 1 4 3 2 2 ot 4 2 2 Visigoth 2 visible 38 1 4 3 2 2 4 2 2 viscous 2 viscount 38 1 4 3 2 2 u 4 3 2 viscosity 2 viscometer 2 viscoelastic 38 1 4 3 2 ra 2 4 2 2 visceral 2 viscera 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 4 2 2 visage 2 visa 38 1 4 3 2 2 aci 4 6 2 visual 2 vista 2 visor 2 Vishnu 2 vise 2 vis 38 1 4 3 2 2 4 2 2 virus 2 virulent 38 1 4 3 2 2 i 4 1 2 virtuoso 38 1 4 3 2 2 4 2 2 virtuosity 2 virtuosi 38 1 4 3 2 2 s 4 1 2 virtuous 38 1 4 3 2 u 2 o 4 2 2 virtue 2 virtual 38 1 4 3 2 2 i 4 2 2 virgule 2 Virgo 38 1 4 3 2 2 n 4 1 2 Virgil 38 1 4 3 2 a 2 4 2 2 Virginian 2 Virginia 38 1 4 3 2 2 i 4 2 2 virginal 2 virgin 38 1 4 3 2 2 gtu 4 1 2 virile 38 1 4 3 2 2 4 2 2 violet 2 violent 38 1 4 3 2 2 4 2 2 violate 2 viola 38 1 4 3 2 l 2 ae 4 1 2 violin 38 1 4 3 2 2 4 2 2 vintner 2 vintage 38 1 4 3 2 2 4 3 2 vineyard 2 vinegar 2 vine 38 1 4 3 2 ic 2 4 2 2 vindictive 2 vindicate 38 1 4 3 2 2 det 4 3 2 vinyl 2 Vinson 2 Vincent 38 1 4 3 2 2 i 4 2 2 village 2 villa 38 1 4 3 2 n 2 4 2 2 villainous 2 villain 38 1 4 3 2 2 a 4 1 2 villein 38 1 4 3 2 2 l 4 2 2 vilify 2 vile 38 1 4 3 2 2 4 2 2 viii 2 vii 38 1 4 3 2 l 2 a 4 1 2 vigil 38 1 4 3 2 nt 2 4 3 2 vigilantism 2 vigilante 2 vigilant 38 1 4 3 2 2 i 4 2 2 vigorous 2 vignette 38 1 4 3 2 o 2 4 2 2 viewport 2 viewpoint 38 1 4 3 2 am 2 4 2 2 Vietnamese 2 Vietnam 38 1 4 3 2 2 n 4 1 2 Viet 38 1 4 3 2 2 4 2 2 Viennese 2 Vienna 38 1 4 3 2 2 n 4 1 2 Vientiane 38 1 4 3 2 2 p 4 2 2 views 2 view 38 1 4 3 2 2 4 2 2 videotape 2 video 38 1 4 3 2 2 o 4 1 2 vide 38 1 4 3 2 2 e 4 1 2 Vida 38 1 4 3 2 2 4 2 2 Victorian 2 Victoria 38 1 4 3 2 2 a 4 1 2 victorious 38 1 4 3 2 r 2 i 4 2 2 victory 2 victor 38 1 4 3 2 2 o 4 3 2 victual 2 victrola 2 victim 38 1 4 3 2 2 4 2 2 Vicky 2 Vicksburg 38 1 4 3 2 2 4 2 2 vicinity 2 vicinal 38 1 4 3 2 2 n 4 2 2 vicissitude 2 vicious 38 1 4 3 2 2 4 2 2 viceroy 2 vice 38 1 4 3 2 r 2 4 2 2 vicarious 2 vicar 38 1 4 3 2 2 aeikt 4 1 2 Vichy 38 1 4 3 2 a 2 t 4 1 2 vibrant 38 1 4 3 2 2 4 2 2 vibrato 2 vibrate 38 1 4 3 2 2 r 4 1 2 viburnum 38 1 4 3 2 2 4 3 2 vial 2 viaduct 2 via 38 1 4 3 2 2 wnt 4 1 2 vie 38 1 4 3 2 tio 2 4 2 2 vexatious 2 vexation 38 1 4 3 2 2 a 4 1 2 vex 38 1 4 3 2 nar 2 4 2 2 veterinary 2 veterinarian 38 1 4 3 2 r 2 i 4 1 2 veteran 38 1 4 3 2 2 e 4 3 2 veto 2 vetch 2 vet 38 1 4 3 2 2 4 2 2 vestigial 2 vestige 38 1 4 3 2 2 g 4 1 2 vestibule 38 1 4 3 2 2 i 4 3 2 vestry 2 vestal 2 vest 38 1 4 3 2 2 t 4 3 2 vessel 2 vesper 2 vesicular 38 1 4 3 2 2 a 4 1 2 vertices 38 1 4 3 2 2 c 4 1 2 vertigo 38 1 4 3 2 2 b 4 1 2 vertex 38 1 4 3 2 ra 2 4 4 2 vertebrate 2 vertebral 2 vertebrae 2 vertebra 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 t 4 2 2 Versailles 2 versa 38 1 4 3 2 2 4 2 2 versatile 2 versatec 38 1 4 3 2 2 a 4 3 2 versus 2 version 2 verse 38 1 4 3 2 n 2 4 2 2 Veronica 2 Verona 38 1 4 3 2 2 4 3 2 vernal 2 vernacular 2 Verna 38 1 4 3 2 2 a 4 3 2 Vernon 2 vernier 2 Verne 38 1 4 3 2 2 4 2 2 vermouth 2 Vermont 38 1 4 3 2 2 4 3 2 vermin 2 vermilion 2 vermiculite 38 1 4 3 2 2 io 4 1 2 vermeil 38 1 4 3 2 2 4 2 2 verity 2 veritable 38 1 4 3 2 2 t 4 3 2 verisimilitude 2 verify 2 veridic 38 1 4 3 2 2 4 2 2 verdict 2 Verdi 38 1 4 3 2 2 i 4 2 2 Verde 2 verdant 38 1 4 3 2 s 2 4 2 2 verbosity 2 verbose 38 1 4 3 2 2 4 2 2 verbatim 2 verbal 38 1 4 3 2 2 ao 4 3 2 verbiage 2 verbena 2 verb 38 1 4 3 2 da 2 4 2 2 verandah 2 veranda 38 1 4 3 2 i 2 4 2 2 veracity 2 veracious 38 1 4 3 2 2 cn 4 1 2 Vera 38 1 4 3 2 2 abdimnost 4 4 2 verve 2 Verlag 2 verge 2 very 38 1 4 3 2 s 2 4 2 2 Venusian 2 Venus 38 1 4 3 2 2 4 2 2 venturesome 2 venture 38 1 4 3 2 r 2 e 4 1 2 venturi 38 1 4 3 2 2 u 4 3 2 ventricle 2 ventilate 2 vent 38 1 4 3 2 2 4 2 2 venomous 2 venom 38 1 4 3 2 2 m 4 1 2 venous 38 1 4 3 2 2 4 3 2 venison 2 Venice 2 venial 38 1 4 3 2 e 2 4 2 2 vengeful 2 vengeance 38 1 4 3 2 2 4 2 2 Veneto 2 Venetian 38 1 4 3 2 2 4 2 2 venerate 2 venerable 38 1 4 3 2 2 a 4 1 2 venereal 38 1 4 3 2 2 rt 4 2 2 Venezuela 2 veneer 38 1 4 3 2 2 4 4 2 vendor 2 vendible 2 vendetta 2 vend 38 1 4 3 2 2 degiotu 4 1 2 venal 38 1 4 3 2 et 2 4 2 2 velvety 2 velvet 38 1 4 3 2 2 4 2 2 velours 2 velocity 38 1 4 3 2 2 4 2 2 vellum 2 Vella 38 1 4 3 2 2 4 2 2 Velasquez 2 velar 38 1 4 3 2 2 alov 4 1 2 veldt 38 1 4 3 2 2 4 2 2 vein 2 veil 38 1 4 3 2 c 2 4 2 2 vehicular 2 vehicle 38 1 4 3 2 2 i 4 1 2 vehement 38 1 4 3 2 ta 2 4 3 2 vegetate 2 vegetarian 2 vegetable 38 1 4 3 2 2 e 4 1 2 Vega 38 1 4 3 2 2 4 2 2 veery 2 veer 38 1 4 3 2 2 r 4 1 2 vee 38 1 4 3 2 tor 2 4 2 2 vectorial 2 vector 38 1 4 3 2 2 ceghilnrstx 4 2 2 Veda 2 veal 38 1 4 3 2 h 2 4 2 2 Vaughn 2 Vaughan 38 1 4 3 2 2 4 2 2 Vaudois 2 vaudeville 38 1 4 3 2 2 dg 4 2 2 vaunt 2 vault 38 1 4 3 2 2 4 2 2 Vatican 2 vat 38 1 4 3 2 a 2 4 2 2 Vassar 2 vassal 38 1 4 3 2 2 4 2 2 vasectomy 2 vase 38 1 4 3 2 2 es 4 3 2 vast 2 Vasquez 2 vascular 38 1 4 3 2 2 ae 4 3 2 Varitype 2 varistor 2 various 38 1 4 3 2 2 4 2 2 variety 2 variegate 38 1 4 3 2 2 4 2 2 variant 2 Varian 38 1 4 3 2 2 n 4 3 2 variate 2 variac 2 variable 38 1 4 3 2 2 i 4 3 2 vary 2 varsity 2 varnish 38 1 4 3 2 2 4 2 2 vaporous 2 vapid 38 1 4 3 2 2 4 3 2 vanity 2 vanish 2 vanilla 38 1 4 3 2 2 4 2 2 Vanderpoel 2 Vanderbilt 38 1 4 3 2 2 r 4 1 2 Vandenberg 38 1 4 3 2 2 e 4 1 2 vandal 38 1 4 3 2 2 4 2 2 Vancouver 2 Vance 38 1 4 3 2 2 cdi 4 6 2 vantage 2 vanquish 2 vanguard 2 vane 2 vanadium 2 van 38 1 4 3 2 p 2 4 2 2 vampire 2 vamp 38 1 4 3 2 2 4 2 2 valuate 2 value 38 1 4 3 2 e 2 4 2 2 valley 2 Valletta 38 1 4 3 2 2 4 2 2 validate 2 valid 38 1 4 3 2 2 d 4 2 2 valine 2 valiant 38 1 4 3 2 2 4 2 2 Valery 2 Valerie 38 1 4 3 2 t 2 4 2 2 valentine 2 valent 38 1 4 3 2 r 2 4 2 2 valedictory 2 valedictorian 38 1 4 3 2 ict 2 o 4 1 2 valediction 38 1 4 3 2 2 dnr 4 3 2 valeur 2 valet 2 vale 38 1 4 3 2 2 eilu 4 5 2 valve 2 Valparaiso 2 Valois 2 Valkyrie 2 Valhalla 38 1 4 3 2 2 4 2 2 vainglorious 2 vain 38 1 4 3 2 2 n 4 1 2 Vail 38 1 4 3 2 na 2 4 2 2 vaginal 2 vagina 38 1 4 3 2 2 4 2 2 vagary 2 vagabond 38 1 4 3 2 2 ai 4 2 2 vague 2 vagrant 38 1 4 3 2 2 4 2 2 Vaduz 2 vade 38 1 4 3 2 2 4 2 2 vacuole 2 vacuolate 38 1 4 3 2 2 l 4 2 2 vacuous 2 vacuo 38 1 4 3 2 2 o 4 2 2 vacuum 2 vacua 38 1 4 3 2 in 2 4 2 2 vaccine 2 vaccinate 38 1 4 3 2 2 t 4 1 2 vacant 38 1 4 3 2 2 4 2 2 vacationland 2 vacate 38 1 4 3 2 2 acu 4 1 2 vacillate 38 1 4 3 2 er 2 4 3 2 uttermost 2 utterance 2 utter 38 1 4 3 2 pia 2 4 2 2 utopian 2 utopia 38 1 4 3 2 t 2 4 3 2 utilities 2 utility 2 utilitarian 38 1 4 3 2 2 i 4 1 2 utile 38 1 4 3 2 2 l 4 1 2 Utica 38 1 4 3 2 2 4 2 2 uterus 2 uterine 38 1 4 3 2 2 r 4 1 2 utensil 38 1 4 3 2 2 eiot 4 4 2 Utrecht 2 utmost 2 Utah 2 UT 38 1 4 3 2 2 4 2 2 usurpation 2 usurp 38 1 4 3 2 2 p 4 3 2 usury 2 usurious 2 usurer 38 1 4 3 2 l 2 4 2 2 usually 2 usual 38 1 4 3 2 2 4 2 2 USIA 2 using 38 1 4 3 2 2 4 2 2 USC&GS 2 USC 38 1 4 3 2 2 4 4 2 usage 2 USAF 2 usable 2 USA 38 1 4 3 2 S 2 4 2 2 U.S.A 2 U.S 38 1 4 3 2 l 2 4 2 2 Ursuline 2 Ursula 38 1 4 3 2 2 u 4 1 2 Ursa 38 1 4 3 2 2 4 2 2 urinary 2 urinal 38 1 4 3 2 2 a 4 1 2 urine 38 1 4 3 2 2 n 4 2 2 Uris 2 Uri 38 1 4 3 2 2 n 4 1 2 urge 38 1 4 3 2 2 4 2 2 urgent 2 urgency 38 1 4 3 2 2 e 4 1 2 urging 38 1 4 3 2 h 2 4 2 2 urethra 2 urethane 38 1 4 3 2 2 t 4 2 2 uremia 2 urea 38 1 4 3 2 an 2 4 4 2 urbanite 2 urbane 2 Urbana 2 urban 38 1 4 3 2 2 n 4 1 2 uracil 38 1 4 3 2 2 4 2 2 uranium 2 urania 38 1 4 3 2 2 i 4 2 2 uranyl 2 Uranus 38 1 4 3 2 2 abegis 4 3 2 Uruguay 2 urn 2 urchin 38 1 4 3 2 2 4 2 2 upwind 2 upward 38 1 4 3 2 2 4 2 2 uptown 2 Upton 38 1 4 3 2 2 o 4 3 2 upturn 2 uptrend 2 uptake 38 1 4 3 2 2 t 4 3 2 upstart 2 upstand 2 upstair 38 1 4 3 2 e 2 4 2 2 upstater 2 upstate 38 1 4 3 2 2 a 4 1 2 upstream 38 1 4 3 2 2 4 2 2 upsilon 2 upside 38 1 4 3 2 t 2 4 2 2 upsetting 2 upset 38 1 4 3 2 2 eit 4 4 2 upswing 2 upsurge 2 upslope 2 upshot 38 1 4 3 2 r 2 4 2 2 uproarious 2 uproar 38 1 4 3 2 2 a 4 1 2 uproot 38 1 4 3 2 2 4 3 2 upriver 2 uprise 2 upright 38 1 4 3 2 2 io 4 1 2 upraise 38 1 4 3 2 assm 2 4 2 2 upperclassmen 2 upperclassman 38 1 4 3 2 2 l 4 1 2 uppercut 38 1 4 3 2 er 2 c 4 2 2 uppermost 2 upper 38 1 4 3 2 2 4 2 2 uplift 2 upland 38 1 4 3 2 ter 2 4 2 2 upholstery 2 upholster 38 1 4 3 2 l 2 s 4 1 2 uphold 38 1 4 3 2 2 4 2 2 upheld 2 upheaval 38 1 4 3 2 2 eo 4 1 2 uphill 38 1 4 3 2 2 4 2 2 updraft 2 update 38 1 4 3 2 2 4 2 2 upbring 2 upbraid 38 1 4 3 2 2 r 4 1 2 upbeat 38 1 4 3 2 rs 2 4 3 2 universe 2 universal 2 university 38 1 4 3 2 2 4 3 2 univariate 2 univalent 2 Univac 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 unite 2 united 38 1 4 3 2 2 4 2 2 unitary 2 unitarian 38 1 4 3 2 2 r 4 1 2 unital 38 1 4 3 2 2 ae 4 2 2 unity 2 unit 38 1 4 3 2 2 4 2 2 unison 2 unisex 38 1 4 3 2 2 4 3 2 uniprocessor 2 unipolar 2 uniplex 38 1 4 3 2 od 2 4 2 2 unimodular 2 unimodal 38 1 4 3 2 2 4 2 2 unify 2 uniform 38 1 4 3 2 i 2 4 2 2 unidirectional 2 unidimensional 38 1 4 3 2 r 2 c 4 3 2 understand 2 underling 2 under 38 1 4 3 2 lassm 2 4 2 2 underclassmen 2 underclassman 38 1 4 3 2 2 e 4 1 2 undulate 38 1 4 3 2 2 l 4 4 2 unceremoniously 2 unction 2 uncouth 2 unchristian 38 1 4 3 2 2 4 2 2 unbidden 2 unbeknownst 38 1 4 3 2 im 2 4 2 2 unanimous 2 unanimity 38 1 4 3 2 2 n 4 1 2 unary 38 1 4 3 2 2 ir 4 1 2 umber 38 1 4 3 2 2 4 2 2 umbrage 2 umbra 38 1 4 3 2 2 a 4 1 2 umbrella 38 1 4 3 2 lic 2 4 3 2 umbilicus 2 umbilici 2 umbilical 38 1 4 3 2 2 b 4 2 2 umpire 2 umlaut 38 1 4 3 2 mat 2 4 2 2 ultimatum 2 ultimate 38 1 4 3 2 2 i 4 2 2 ultra 2 ulterior 38 1 4 3 2 er 2 4 2 2 ulcerate 2 ulcer 38 1 4 3 2 2 ct 4 4 2 Ulysses 2 Ulster 2 Ullman 2 Ulan 38 1 4 3 2 ain 2 4 2 2 Ukrainian 2 Ukraine 38 1 4 3 2 2 r 4 1 2 UK 38 1 4 3 2 2 4 3 2 ugly 2 ugh 2 Uganda 38 1 4 3 2 iquit 2 4 2 2 ubiquity 2 ubiquitous 38 1 4 3 2 n 2 n 4 1 2 tyrant 38 1 4 3 2 2 i 4 2 2 tyranny 2 Tyrannosaurus 38 1 4 3 2 c 2 4 2 2 tyrannicide 2 tyrannic 38 1 4 3 2 2 a 4 1 2 tyrosine 38 1 4 3 2 raph 2 4 2 2 typography 2 typographer 38 1 4 3 2 2 g 4 2 2 typology 2 typo 38 1 4 3 2 2 4 3 2 typing 2 typify 2 typic 38 1 4 3 2 2 4 3 2 typhoon 2 Typhon 2 typhoid 38 1 4 3 2 2 o 4 1 2 typhus 38 1 4 3 2 2 sw 4 3 2 typed 2 typeface 2 type 38 1 4 3 2 rit 2 4 2 2 typewritten 2 typewrite 38 1 4 3 2 2 4 2 2 typesetting 2 typesetter 38 1 4 3 2 t 2 t 4 1 2 typeset 38 1 4 3 2 2 e 4 2 2 typescript 2 types 38 1 4 3 2 2 ehio 4 0 38 1 4 3 2 2 4 4 2 twosome 2 Twombly 2 twofold 2 two 38 1 4 3 2 h 2 4 2 2 twitchy 2 twitch 38 1 4 3 2 2 c 4 1 2 twit 38 1 4 3 2 t 2 4 2 2 twisty 2 twist 38 1 4 3 2 l 2 4 2 2 twirly 2 twirl 38 1 4 3 2 2 4 4 2 twinkle 2 twinge 2 twine 2 twin 38 1 4 3 2 2 4 2 2 twill 2 twilight 38 1 4 3 2 2 4 2 2 twigging 2 twig 38 1 4 3 2 2 glnrst 4 2 2 twiddle 2 twice 38 1 4 3 2 t 2 4 2 2 twenty 2 twentieth 38 1 4 3 2 2 4 2 2 twelve 2 twelfth 38 1 4 3 2 2 4 2 2 tweedy 2 tweed 38 1 4 3 2 2 d 4 1 2 tweeze 38 1 4 3 2 2 eln 4 1 2 tweak 38 1 4 3 2 2 4 3 2 twain 2 twaddle 2 TWA 38 1 4 3 2 2 aeio 4 1 2 TWX 38 1 4 3 2 2 4 2 2 TVA 2 TV 38 1 4 3 2 r 2 4 2 2 tutorial 2 tutor 38 1 4 3 2 2 o 4 3 2 tutu 2 Tuttle 2 tutelage 38 1 4 3 2 2 4 2 2 Tuskegee 2 tusk 38 1 4 3 2 a 2 n 4 2 2 Tuscarora 2 Tuscaloosa 38 1 4 3 2 2 4 2 2 Tuscany 2 Tuscan 38 1 4 3 2 2 ck 4 1 2 tussle 38 1 4 3 2 le 2 4 3 2 turtleneck 2 turtleback 2 turtle 38 1 4 3 2 2 4 2 2 turpitude 2 turpentine 38 1 4 3 2 2 4 3 2 turnover 2 turnout 2 turnoff 38 1 4 3 2 2 4 2 2 turnery 2 turned 38 1 4 3 2 2 4 2 2 turnaround 2 turnabout 38 1 4 3 2 2 4 3 2 Turkish 2 turkey 2 turk 38 1 4 3 2 n 2 4 2 2 Turing 2 Turin 38 1 4 3 2 2 4 2 2 turbojet 2 turbofan 38 1 4 3 2 2 4 2 2 turbine 2 turbinate 38 1 4 3 2 2 4 2 2 turbidity 2 turbid 38 1 4 3 2 2 dn 4 0 38 1 4 3 2 2 io 4 2 2 turbulent 2 turban 38 1 4 3 2 2 aeo 4 6 2 turntable 2 turnstone 2 turnpike 2 turnkey 2 turnip 2 turn 38 1 4 3 2 2 4 2 2 tuple 2 tupelo 38 1 4 3 2 2 4 2 2 Tunisia 2 Tunis 38 1 4 3 2 2 s 4 1 2 tunic 38 1 4 3 2 t 2 4 2 2 tungsten 2 tungstate 38 1 4 3 2 2 s 4 1 2 tung 38 1 4 3 2 2 4 3 2 tuned 2 tuneful 2 tune 38 1 4 3 2 2 egi 4 4 2 tunnel 2 tundra 2 tuna 2 tun 38 1 4 3 2 lt 2 4 2 2 tumultuous 2 tumult 38 1 4 3 2 2 4 2 2 tumbrel 2 tumble 38 1 4 3 2 2 bu 4 1 2 tum 38 1 4 3 2 2 4 2 2 tularemia 2 Tulane 38 1 4 3 2 2 a 4 3 2 Tulsa 2 tulle 2 tulip 38 1 4 3 2 2 4 2 2 tugging 2 tug 38 1 4 3 2 2 4 2 2 tuft 2 tuff 38 1 4 3 2 2 4 2 2 Tucker 2 tuck 38 1 4 3 2 2 k 4 1 2 Tucson 38 1 4 3 2 l 2 4 2 2 tubule 2 tubular 38 1 4 3 2 cul 2 4 2 2 tuberculosis 2 tuberculin 38 1 4 3 2 2 r 4 1 2 tube 38 1 4 3 2 2 eu 4 2 2 tuba 2 tub 38 1 4 3 2 2 4 2 2 TTY 2 TTL 38 1 4 3 2 r 2 4 2 2 tsarina 2 tsar 38 1 4 3 2 2 a 4 1 2 tsunami 38 1 4 3 2 h 2 4 2 2 truthful 2 truth 38 1 4 3 2 2 4 4 2 trustworthy 2 trustful 2 trustee 2 trust 38 1 4 3 2 2 t 4 1 2 truss 38 1 4 3 2 2 c 4 2 2 trunk 2 trundle 38 1 4 3 2 2 4 2 2 trumpet 2 trumpery 38 1 4 3 2 2 e 4 1 2 trump 38 1 4 3 2 2 p 4 2 2 Trumbull 2 Truman 38 1 4 3 2 2 4 2 2 Trudy 2 trudge 38 1 4 3 2 2 4 3 2 truculent 2 truck 2 truce 38 1 4 3 2 n 2 4 2 2 truant 2 truancy 38 1 4 3 2 2 4 2 2 Troutman 2 trout 38 1 4 3 2 2 l 4 1 2 troubador 38 1 4 3 2 2 4 2 2 troublesome 2 troubleshoot 38 1 4 3 2 e 2 s 4 1 2 trouble 38 1 4 3 2 2 bt 4 4 2 trouser 2 troupe 2 trounce 2 trough 38 1 4 3 2 pher 2 4 2 2 tropospheric 2 troposphere 38 1 4 3 2 2 s 4 1 2 tropopause 38 1 4 3 2 2 4 2 2 trophy 2 trophic 38 1 4 3 2 2 ho 4 1 2 tropic 38 1 4 3 2 2 4 2 2 trompe 2 trombone 38 1 4 3 2 l 2 4 3 2 trollop 2 trolley 2 troll 38 1 4 3 2 2 4 2 2 trodden 2 trod 38 1 4 3 2 2 dlmpu 4 6 2 troy 2 trot 2 troop 2 Trojan 2 troika 2 troglodyte 38 1 4 3 2 2 4 2 2 trivial 2 trivia 38 1 4 3 2 2 a 4 1 2 trivium 38 1 4 3 2 2 i 4 1 2 trivalent 38 1 4 3 2 ph 2 a 4 1 2 triumph 38 1 4 3 2 2 4 2 2 triumphant 2 triumphal 38 1 4 3 2 2 m 4 1 2 triune 38 1 4 3 2 2 4 3 2 triton 2 tritium 2 trite 38 1 4 3 2 a 2 4 2 2 tristate 2 Tristan 38 1 4 3 2 2 t 4 2 2 trisyllable 2 trisodium 38 1 4 3 2 2 4 2 2 tripoli 2 tripod 38 1 4 3 2 2 t 4 2 2 triplex 2 triple 38 1 4 3 2 2 4 2 2 Triplett 2 triplet 38 1 4 3 2 2 e 4 1 2 triplicate 38 1 4 3 2 2 lo 4 5 2 triptych 2 triphenylphosphine 2 tripe 2 tripartite 2 trip 38 1 4 3 2 2 4 3 2 trioxide 2 triode 2 trio 38 1 4 3 2 2 t 4 1 2 Trinidad 38 1 4 3 2 2 4 2 2 trinity 2 trinitarian 38 1 4 3 2 2 i 4 1 2 trinket 38 1 4 3 2 2 4 2 2 trimester 2 trimer 38 1 4 3 2 2 e 4 1 2 trim 38 1 4 3 2 2 4 2 2 trilogy 2 trilobite 38 1 4 3 2 2 i 4 1 2 trill 38 1 4 3 2 on 2 4 2 2 trillionth 2 trillion 38 1 4 3 2 2 lo 4 0 38 1 4 3 2 n 2 4 2 2 trigonometry 2 trigonal 38 1 4 3 2 2 o 4 2 2 trigram 2 trig 38 1 4 3 2 o 2 4 2 2 trifluouride 2 trifluoride 38 1 4 3 2 l 2 u 4 1 2 trifle 38 1 4 3 2 2 4 3 2 tries 2 triennial 2 tried 38 1 4 3 2 2 4 2 2 tridiagonal 2 trident 38 1 4 3 2 2 4 5 2 tricky 2 trickster 2 trickle 2 trickery 2 trick 38 1 4 3 2 oro 2 4 2 2 trichloroethane 2 trichloroacetic 38 1 4 3 2 2 l 4 2 2 trichrome 2 Trichinella 38 1 4 3 2 2 hk 4 1 2 Triceratops 38 1 4 3 2 2 4 2 2 tribute 2 tributary 38 1 4 3 2 2 4 2 2 tribune 2 tribunal 38 1 4 3 2 2 nt 4 1 2 tribulate 38 1 4 3 2 m 2 4 2 2 tribesmen 2 tribesman 38 1 4 3 2 2 s 4 1 2 tribe 38 1 4 3 2 2 eu 4 1 2 tribal 38 1 4 3 2 2 u 4 1 2 triangle 38 1 4 3 2 2 4 2 2 triangulate 2 triangular 38 1 4 3 2 l 2 a 4 1 2 Triangulum 38 1 4 3 2 2 g 4 1 2 Trianon 38 1 4 3 2 2 n 4 6 2 triatomic 2 Triassic 2 trial 2 triad 2 triac 2 triable 38 1 4 3 2 2 abcdefglmnopstuv 4 1 2 trihedral 38 1 4 3 2 2 4 3 2 trestle 2 tress 2 trespass 38 1 4 3 2 2 4 2 2 trendy 2 trend 38 1 4 3 2 h 2 e 4 2 2 trenchant 2 trench 38 1 4 3 2 rm 2 4 2 2 trenchermen 2 trencherman 38 1 4 3 2 2 cd 4 1 2 Trenton 38 1 4 3 2 2 4 4 2 tremulous 2 tremor 2 tremendous 2 tremble 38 1 4 3 2 2 4 2 2 treetop 2 tree 38 1 4 3 2 2 cdst 4 0 38 1 4 3 2 2 4 3 2 treaty 2 treatise 2 treat 38 1 4 3 2 r 2 4 2 2 treasury 2 treasure 38 1 4 3 2 n 2 4 2 2 treasonous 2 treason 38 1 4 3 2 2 ou 4 0 38 1 4 3 2 2 4 3 2 treadmill 2 treadle 2 tread 38 1 4 3 2 her 2 4 2 2 treachery 2 treacherous 38 1 4 3 2 2 aemns 4 6 2 Trevelyan 2 trepidation 2 trellis 2 trek 2 trefoil 2 treble 38 1 4 3 2 2 a 4 1 2 traverse 38 1 4 3 2 2 4 2 2 traversal 2 traversable 38 1 4 3 2 2 s 4 1 2 travertine 38 1 4 3 2 2 4 2 2 travelogue 2 travel 38 1 4 3 2 2 lr 4 1 2 travesty 38 1 4 3 2 2 e 4 2 2 Travis 2 travail 38 1 4 3 2 ma 2 4 2 2 traumatic 2 trauma 38 1 4 3 2 2 4 2 2 trashy 2 trash 38 1 4 3 2 2 h 4 1 2 Trastevere 38 1 4 3 2 id 2 4 2 2 trapezoidal 2 trapezoid 38 1 4 3 2 z 2 o 4 1 2 trapezium 38 1 4 3 2 2 e 4 1 2 trap 38 1 4 3 2 s 2 4 2 2 transverse 2 transversal 38 1 4 3 2 e 2 r 4 1 2 transvestite 38 1 4 3 2 2 4 2 2 transshipping 2 transshipped 38 1 4 3 2 hip 2 p 4 1 2 transship 38 1 4 3 2 2 4 3 2 transposition 2 transpose 2 transposable 38 1 4 3 2 t 2 4 3 2 transporter 2 transportation 2 transport 38 1 4 3 2 2 rs 4 1 2 transpond 38 1 4 3 2 ant 2 4 2 2 transplantation 2 transplant 38 1 4 3 2 r 2 4 2 2 transpire 2 transpiration 38 1 4 3 2 2 4 2 2 transparent 2 transpacific 38 1 4 3 2 2 ailo 4 0 38 1 4 3 2 2 4 2 2 transom 2 transoceanic 38 1 4 3 2 t 2 4 2 2 transmute 2 transmutation 38 1 4 3 2 2 st 4 0 38 1 4 3 2 2 4 2 2 transmitter 2 transmitted 38 1 4 3 2 2 4 3 2 transmittance 2 transmittal 2 transmittable 38 1 4 3 2 2 ae 4 1 2 transmitting 38 1 4 3 2 2 t 4 1 2 transmit 38 1 4 3 2 si 2 4 2 2 transmission 2 transmissible 38 1 4 3 2 2 iu 4 1 2 transmogrify 38 1 4 3 2 2 4 3 2 translucent 2 transliterate 2 translate 38 1 4 3 2 2 4 2 2 transitive 2 transition 38 1 4 3 2 2 i 4 3 2 transitory 2 Transite 2 transit 38 1 4 3 2 2 t 4 2 2 transistor 2 transient 38 1 4 3 2 ress 2 4 3 2 transgressor 2 transgression 2 transgress 38 1 4 3 2 s 2 4 3 2 transfusion 2 transfuse 2 transfusable 38 1 4 3 2 rm 2 4 2 2 transformation 2 transform 38 1 4 3 2 2 4 2 2 transfix 2 transfinite 38 1 4 3 2 r 2 er 4 3 2 transferor 2 transferable 2 transfer 38 1 4 3 2 2 4 3 2 transferring 2 transferred 2 transferral 38 1 4 3 2 2 4 2 2 transference 2 transferee 38 1 4 3 2 2 eiou 4 0 38 1 4 3 2 2 4 2 2 transept 2 transect 38 1 4 3 2 uc 2 4 2 2 transduction 2 transducer 38 1 4 3 2 t 2 4 2 2 transcription 2 transcript 38 1 4 3 2 i 2 p 4 1 2 transcribe 38 1 4 3 2 n 2 4 2 2 transcontinental 2 transconductance 38 1 4 3 2 2 n 4 1 2 transceiver 38 1 4 3 2 nt 2 4 2 2 transcendental 2 transcendent 38 1 4 3 2 d 2 e 4 1 2 transcend 38 1 4 3 2 2 eor 4 0 38 1 4 3 2 2 4 3 2 transatlantic 2 transalpine 2 transact 38 1 4 3 2 2 acdefgilmopsv 4 1 2 Transylvania 38 1 4 3 2 uil 2 4 2 2 tranquillity 2 tranquil 38 1 4 3 2 2 qs 4 1 2 trance 38 1 4 3 2 2 s 4 1 2 your 38 1 4 3 2 2 4 2 2 trample 2 tramp 38 1 4 3 2 2 4 4 2 you've 2 you're 2 you'll 2 you'd 38 1 4 3 2 2 'rnt 4 1 2 you 38 1 4 3 2 2 udgknrs 4 2 2 yow 2 yolk 38 1 4 3 2 2 p 4 3 2 tramway 2 trammel 2 tram 38 1 4 3 2 2 alos 4 5 2 Yerkes 2 yen 2 Yemen 2 yet 2 ye 38 1 4 3 2 2 rs 4 4 2 Yeats 2 yeah 2 Yeager 2 yea 38 1 4 3 2 2 eoaituv 4 5 2 YWCA 2 y's 2 Ypsilanti 2 YMCA 2 y 38 1 4 3 2 r 2 4 2 2 traitorous 2 traitor 38 1 4 3 2 2 o 4 1 2 trait 38 1 4 3 2 2 4 2 2 trainmen 2 trainman 38 1 4 3 2 2 bmps 4 10 2 worktable 2 workout 2 workload 2 workhorse 2 workforce 2 workday 2 workaday 2 working 2 worked 2 work 38 1 4 3 2 2 s 4 2 2 wordy 2 word 38 1 4 3 2 2 4 2 2 trainee 2 trained 38 1 4 3 2 2 dklmrst 4 3 2 worn 2 wore 2 Worcester 38 1 4 3 2 2 ab 4 1 2 women 38 1 4 3 2 2 mreklnouv 4 4 2 wow 2 Wotan 2 wop 2 wobble 38 1 4 3 2 2 4 4 2 trailside 2 trailhead 2 trailblaze 2 trail 38 1 4 3 2 2 hct 4 2 2 witness 2 wit 38 1 4 3 2 2 em 4 2 2 training 2 train 38 1 4 3 2 c 2 4 2 2 tragicomic 2 tragic 38 1 4 3 2 2 tcdeglnrs 4 5 2 wizard 2 wive 2 wipe 2 wife 2 WI 38 1 4 3 2 d 2 4 2 2 tragedy 2 tragedian 38 1 4 3 2 2 ei 4 1 2 trag 38 1 4 3 2 2 'lmos 4 5 2 whore 2 whop 2 whoever 2 whoa 2 who 38 1 4 3 2 2 4 2 2 trafficking 2 trafficked 38 1 4 3 2 fic 2 k 4 1 2 traffic 38 1 4 3 2 2 cmnprstzl 4 2 2 whig 2 whiff 38 1 4 3 2 2 aelnrt 4 0 38 1 4 3 2 tion 2 4 2 2 tradition 2 traditional 38 1 4 3 2 m 2 4 2 2 tradesmen 2 tradesman 38 1 4 3 2 2 eioa 4 2 2 whup 2 why 38 1 4 3 2 2 tl 4 0 38 1 4 3 2 2 s 4 3 2 tradeoff 2 trademark 2 trade 38 1 4 3 2 2 kd 4 2 2 weep 2 wee 38 1 4 3 2 2 4 2 2 tractor 2 tract 38 1 4 3 2 2 esab'dilnrt 4 5 2 Weyerhauser 2 wept 2 Wehr 2 WECo 2 we 38 1 4 3 2 2 nsycdfghiklprtvx 4 3 2 Wabash 2 Waals 2 WA 38 1 4 3 2 2 4 2 2 trackage 2 track 38 1 4 3 2 2 4 4 2 traceback 2 tracery 2 traceable 2 trace 38 1 4 3 2 2 ls 4 4 2 wayward 2 Wayne 2 waybill 2 way 38 1 4 3 2 2 hpt 4 3 2 Wasserman 2 wasn't 2 was 38 1 4 3 2 2 ekt 4 2 2 Tracy 2 trachea 38 1 4 3 2 2 4 2 2 Toyota 2 toy 38 1 4 3 2 2 4 2 2 toxicology 2 toxic 38 1 4 3 2 2 tdg 4 2 2 wane 2 wan 38 1 4 3 2 2 aehioruy 4 3 2 WV 2 w's 2 w 38 1 4 3 2 2 icglrtuw 4 5 2 voyage 2 Voss 2 voodoo 2 von 2 vomit 38 1 4 3 2 i 2 c 4 1 2 toxin 38 1 4 3 2 2 4 2 2 townsmen 2 townsman 38 1 4 3 2 2 eabcdgilnorstv 4 4 2 viz 2 vixen 2 Viking 2 vi 38 1 4 3 2 2 cdgilmnprstu 4 1 2 VA 38 1 4 3 2 2 aioelu 4 6 2 vying 2 VT 2 v's 2 Vreeland 2 VHF 2 v 38 1 4 3 2 2 m 4 1 2 Townsend 38 1 4 3 2 2 s 4 2 2 townhouse 2 town 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 e 2 4 2 2 towhee 2 towhead 38 1 4 3 2 2 4 5 2 useless 2 uses 2 useful 2 used 2 use 38 1 4 3 2 2 euaCI 4 7 2 USSR 2 USPS 2 USN 2 usher 2 USGS 2 USDA 2 us 38 1 4 3 2 2 bdhlprstw 4 6 2 upkeep 2 upgrade 2 upend 2 upcome 2 upon 2 up 38 1 4 3 2 2 4 2 2 tower 2 towel 38 1 4 3 2 2 iabcdksf 4 6 2 unless 2 unwieldy 2 unruly 2 UNESCO 2 until 2 UN 38 1 4 3 2 n 2 4 2 2 unions 2 union 38 1 4 3 2 rd 2 4 2 2 towards 2 toward 38 1 4 3 2 2 odfmpstv 4 7 2 Unix 2 Uniroyal 2 unique 2 uninominal 2 unilateral 2 unicorn 2 uniaxial 38 1 4 3 2 2 npsbgklmr.t 4 4 2 u's 2 UHF 2 UCLA 2 u 38 1 4 3 2 2 pr 4 6 2 Tyson 2 Tyndall 2 Tyler 2 tying 2 tycoon 2 Tyburn 38 1 4 3 2 2 4 2 2 tournament 2 tour 38 1 4 3 2 h 2 4 4 2 touchy 2 touchstone 2 touchdown 2 touch 38 1 4 3 2 2 nbikpt 4 6 2 turvy 2 turret 2 turquoise 2 turmoil 2 turgid 2 turf 38 1 4 3 2 2 rbcfglmnpst 4 4 2 tuxedo 2 tuition 2 Tudor 2 tuesday 38 1 4 3 2 2 crg 4 2 2 tout 2 tousle 38 1 4 3 2 2 4 4 2 trytophan 2 trypsin 2 trying 2 try 38 1 4 3 2 2 acdmnst 4 3 2 truism 2 truly 2 true 38 1 4 3 2 2 4 2 2 totemic 2 totem 38 1 4 3 2 2 m 4 1 2 tote 38 1 4 3 2 2 dicfgmnpsuv 4 3 2 tray 2 trawl 2 trajectory 38 1 4 3 2 2 nlt 4 1 2 traipse 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 l 2 4 2 2 totalitarian 2 total 38 1 4 3 2 2 auyeio 4 1 2 TRW 38 1 4 3 2 2 aehn 4 2 2 towboat 2 tow 38 1 4 3 2 2 ae 4 1 2 tot 38 1 4 3 2 2 4 2 2 toss 2 Toshiba 38 1 4 3 2 2 4 2 2 torture 2 tortuous 38 1 4 3 2 ise 2 4 2 2 tortoiseshell 2 tortoise 38 1 4 3 2 2 ou 4 1 2 tort 38 1 4 3 2 2 4 2 2 torso 2 torsion 38 1 4 3 2 2 4 2 2 things 2 thing 38 1 4 3 2 2 4 4 2 torrid 2 torrent 2 Torrance 2 torr 38 1 4 3 2 2 4 3 2 torpor 2 torpid 2 torpedo 38 1 4 3 2 d 2 4 2 2 toroidal 2 toroid 38 1 4 3 2 2 4 2 2 telephones 2 telephone 38 1 4 3 2 2 i 4 1 2 Toronto 38 1 4 3 2 2 4 2 2 tornado 2 torn 38 1 4 3 2 2 4 2 2 teams 2 teamster 38 1 4 3 2 2 o 4 5 2 taker 2 takes 2 taketh 2 taken 2 take 38 1 4 3 2 2 noprst 4 8 2 tory 2 torus 2 torque 2 tori 2 tore 2 torch 2 Torah 2 tor 38 1 4 3 2 t 2 4 2 2 supports 2 support 38 1 4 3 2 2 4 2 2 Topsy 2 topsoil 38 1 4 3 2 og 2 4 2 2 topology 2 topologize 38 1 4 3 2 2 4 2 2 styles 2 style 38 1 4 3 2 2 l 4 2 2 topography 2 topocentric 38 1 4 3 2 2 a 4 1 2 statesmen 38 1 4 3 2 2 osi 4 8 2 topple 2 topnotch 2 topmost 2 topgallant 2 Topeka 2 topcoat 2 topaz 2 top 38 1 4 3 2 2 4 2 2 toothpick 2 toothpaste 38 1 4 3 2 rd 2 4 2 2 standards 2 standard 38 1 4 3 2 2 4 2 2 spending 2 spend 38 1 4 3 2 2 p 4 2 2 toothbrush 2 tooth 38 1 4 3 2 2 h 4 2 2 tootle 2 toot 38 1 4 3 2 c 2 a 4 1 2 specific 38 1 4 3 2 2 4 3 2 spaceship 2 spaces 2 spacesuit 38 1 4 3 2 et 2 4 2 2 soviets 2 soviet 38 1 4 3 2 2 4 4 2 toolsmith 2 toolmake 2 toolkit 2 tool 38 1 4 3 2 e 2 4 2 2 sources 2 source 38 1 4 3 2 2 lt 4 3 2 took 2 toodle 2 too 38 1 4 3 2 il 2 4 2 2 tonsillitis 2 tonsil 38 1 4 3 2 me 2 4 2 2 sometimes 2 sometime 38 1 4 3 2 2 4 2 2 smaller 2 Smalley 38 1 4 3 2 2 4 3 2 tonight 2 tonic 2 Toni 38 1 4 3 2 2 4 2 2 sizes 2 size 38 1 4 3 2 t 2 4 2 2 situation 2 situate 38 1 4 3 2 2 4 2 2 tongue 2 tong 38 1 4 3 2 e 2 4 2 2 sincerely 2 sincere 38 1 4 3 2 2 gis 4 6 2 tony 2 tonnage 2 tonk 2 tone 2 tonal 2 ton 38 1 4 3 2 raph 2 4 2 2 tomography 2 tomograph 38 1 4 3 2 2 g 4 1 2 tomorrow 38 1 4 3 2 2 4 2 2 tommy 2 Tommie 38 1 4 3 2 2 4 3 2 server 2 served 2 serve 38 1 4 3 2 2 4 2 2 tombstone 2 tomb 38 1 4 3 2 2 4 3 2 sends 2 sending 2 send 38 1 4 3 2 to 2 4 2 2 tomatoes 2 tomato 38 1 4 3 2 2 abmo 4 4 2 Tompkins 2 Tomlinson 2 tome 2 Tom 38 1 4 3 2 2 i 4 3 2 seems 2 seemed 2 seem 38 1 4 3 2 2 i 4 1 2 secure 38 1 4 3 2 2 4 3 2 tollhouse 2 tollgate 2 toll 38 1 4 3 2 a 2 4 3 2 tolerate 2 tolerant 2 tolerable 38 1 4 3 2 2 r 4 1 2 Toledo 38 1 4 3 2 2 el 4 3 2 toluene 2 Tolstoy 2 told 38 1 4 3 2 2 4 3 2 says 2 saying 2 say 38 1 4 3 2 2 4 3 2 Tokyo 2 token 2 tokamak 38 1 4 3 2 t 2 4 2 2 toiletry 2 toilet 38 1 4 3 2 e 2 4 2 2 rules 2 rule 38 1 4 3 2 l 2 e 4 2 2 toilsome 2 toil 38 1 4 3 2 w 2 4 2 2 reviews 2 review 38 1 4 3 2 2 4 2 2 toggle 2 togging 38 1 4 3 2 2 g 4 4 2 togs 2 Togo 2 together 2 tog 38 1 4 3 2 rn 2 4 3 2 returning 2 returned 2 return 38 1 4 3 2 2 4 2 2 tofu 2 toffee 38 1 4 3 2 2 4 3 2 toenail 2 TOEFL 2 toe 38 1 4 3 2 rce 2 4 3 2 resources 2 resource 2 resourceful 38 1 4 3 2 2 4 4 2 requirements 2 requires 2 required 2 require 38 1 4 3 2 2 4 2 2 toddle 2 Todd 38 1 4 3 2 y 2 4 2 2 today'll 2 today 38 1 4 3 2 2 ad 4 0 38 1 4 3 2 2 e 4 1 2 requiring 38 1 4 3 2 2 4 2 2 Tobago 2 tobacco 38 1 4 3 2 n 2 4 3 2 remains 2 remain 2 remainder 38 1 4 3 2 2 a 4 1 2 Toby 38 1 4 3 2 t 2 4 2 2 toastmaster 2 toast 38 1 4 3 2 n 2 4 2 2 relations 2 relation 38 1 4 3 2 2 o 4 1 2 relating 38 1 4 3 2 2 4 2 2 related 2 relate 38 1 4 3 2 2 4 2 2 toady 2 toad 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 2 abdEfgiklmnoprstwuxy 4 2 2 toccata 2 to 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 n 2 4 2 2 regions 2 region 38 1 4 3 2 2 4 2 2 TNT 2 TN 38 1 4 3 2 d 2 4 2 2 records 2 record 38 1 4 3 2 t 2 4 2 2 recently 2 recent 38 1 4 3 2 2 4 2 2 Titus 2 titular 38 1 4 3 2 2 4 2 2 received 2 receive 38 1 4 3 2 2 e 4 1 2 receiving 38 1 4 3 2 on 2 a 4 2 2 reasons 2 reason 38 1 4 3 2 2 4 2 2 titillate 2 titian 38 1 4 3 2 2 4 2 2 titanium 2 titanic 38 1 4 3 2 2 4 2 2 reaches 2 reached 38 1 4 3 2 2 e 4 2 2 reaching 2 reach 38 1 4 3 2 n 2 i 4 2 2 titanate 2 Titan 38 1 4 3 2 2 aiu 4 5 2 titrate 2 titmouse 2 title 2 tithe 2 tit 38 1 4 3 2 n 2 4 2 2 raising 2 raisin 38 1 4 3 2 2 4 2 2 tiresome 2 tire 38 1 4 3 2 2 4 2 2 Tirana 2 tirade 38 1 4 3 2 2 4 3 2 raises 2 raised 2 raise 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 quickly 2 quicklime 38 1 4 3 2 2 4 3 2 tippy 2 tipple 2 Tipperary 38 1 4 3 2 2 n 4 3 2 provides 2 provided 2 provide 38 1 4 3 2 2 p 4 4 2 tiptoe 2 tipsy 2 tipoff 2 tip 38 1 4 3 2 2 4 2 2 tintype 2 tint 38 1 4 3 2 2 4 2 2 proposing 2 proposition 38 1 4 3 2 2 4 3 2 proposes 2 proposed 2 propose 38 1 4 3 2 2 4 2 2 tinkle 2 tinker 38 1 4 3 2 2 e 4 2 2 programming 2 programmable 38 1 4 3 2 2 4 2 2 tingle 2 tinge 38 1 4 3 2 2 4 2 2 profits 2 profit 38 1 4 3 2 2 4 2 2 productivity 2 productive 38 1 4 3 2 2 v 4 1 2 production 38 1 4 3 2 2 i 4 2 2 products 2 product 38 1 4 3 2 2 gkt 4 8 2 tiny 2 tinsel 2 tinfoil 2 tine 2 tinder 2 tincture 2 Tina 2 tin 38 1 4 3 2 2 4 2 2 timothy 2 Timon 38 1 4 3 2 2 4 2 2 producing 2 producible 38 1 4 3 2 2 4 3 2 produces 2 produced 2 produce 38 1 4 3 2 2 4 2 2 processing 2 procession 38 1 4 3 2 2 4 2 2 probably 2 probabilist 38 1 4 3 2 2 s 4 7 2 timeless 2 Timex 2 timeworn 2 timetable 2 timepiece 2 timeout 2 time 38 1 4 3 2 2 4 2 2 prices 2 price 38 1 4 3 2 r 2 4 2 2 timberland 2 timber 38 1 4 3 2 2 e 4 1 2 timbre 38 1 4 3 2 2 beo 4 2 2 timid 2 Tim 38 1 4 3 2 2 t 4 1 2 presence 38 1 4 3 2 2 4 2 2 tilth 2 tilt 38 1 4 3 2 bl 2 4 2 2 possibly 2 possible 38 1 4 3 2 2 4 2 2 population 2 populate 38 1 4 3 2 2 t 4 4 2 till 2 tile 2 tilde 2 til 38 1 4 3 2 2 4 2 2 Tigris 2 tigress 38 1 4 3 2 t 2 4 2 2 tighten 2 tight 38 1 4 3 2 2 hr 4 1 2 tiger 38 1 4 3 2 2 4 2 2 tift 2 Tiffany 38 1 4 3 2 2 4 2 2 planning 2 planned 38 1 4 3 2 2 4 4 2 tier 2 Tientsin 2 tied 2 tie 38 1 4 3 2 2 4 3 2 tidewater 2 tideland 2 tide 38 1 4 3 2 nce 2 4 2 2 performances 2 performance 38 1 4 3 2 2 e 4 4 2 tidy 2 tidbit 2 tidal 2 tid 38 1 4 3 2 2 4 2 2 ticklish 2 tickle 38 1 4 3 2 2 l 4 2 2 ticket 2 tick 38 1 4 3 2 2 k 4 1 2 tic 38 1 4 3 2 2 4 2 2 particularly 2 particular 38 1 4 3 2 2 t 4 1 2 Tiber 38 1 4 3 2 2 4 2 2 Tibetan 2 Tibet 38 1 4 3 2 2 e 4 1 2 tibia 38 1 4 3 2 2 bcdefglmnprt 4 3 2 tissue 2 Tioga 2 ti 38 1 4 3 2 2 4 2 2 ours 2 ourselves 38 1 4 3 2 d 2 4 2 2 thyroidal 2 thyroid 38 1 4 3 2 ation 2 4 2 2 organizations 2 organization 38 1 4 3 2 2 i 4 4 2 thyroxine 2 thyrotoxic 2 thyronine 2 thyroglobulin 38 1 4 3 2 2 o 4 1 2 thyratron 38 1 4 3 2 2 4 3 2 ordered 2 orders 2 order 38 1 4 3 2 2 4 3 2 thymus 2 thymine 2 thyme 38 1 4 3 2 2 mr 4 1 2 thy 38 1 4 3 2 2 4 3 2 operation 2 operating 2 operatic 38 1 4 3 2 2 4 2 2 operated 2 operate 38 1 4 3 2 a 2 4 2 2 thwart 2 thwack 38 1 4 3 2 2 4 4 2 opens 2 opening 2 opened 2 open 38 1 4 3 2 2 4 2 2 Thursday 2 Thurman 38 1 4 3 2 2 4 2 2 thunderstorm 2 thundershower 38 1 4 3 2 2 4 2 2 thunderbolt 2 thunderbird 38 1 4 3 2 der 2 bs 4 4 2 thunderous 2 thunderflower 2 thunderclap 2 thunder 38 1 4 3 2 2 4 2 2 thumbnail 2 thumb 38 1 4 3 2 2 4 2 2 numbers 2 number 38 1 4 3 2 2 b 4 1 2 thump 38 1 4 3 2 2 4 2 2 thulium 2 Thule 38 1 4 3 2 2 r 4 1 2 numbed 38 1 4 3 2 2 e 4 1 2 numb 38 1 4 3 2 2 4 2 2 thuggee 2 thug 38 1 4 3 2 2 glmnr 4 3 2 thus 2 thud 2 Thuban 38 1 4 3 2 2 4 2 2 thrust 2 thrush 38 1 4 3 2 2 s 4 2 2 Thruway 2 thrum 38 1 4 3 2 2 4 2 2 never 2 nevertheless 38 1 4 3 2 2 4 4 2 thrown 2 throwback 2 throwaway 2 throw 38 1 4 3 2 gh 2 4 3 2 throughput 2 throughout 2 through 38 1 4 3 2 2 s 4 4 2 named 2 nameplate 2 nameable 2 name 38 1 4 3 2 2 4 2 2 throng 2 throne 38 1 4 3 2 2 4 2 2 names 2 namesake 38 1 4 3 2 2 4 2 2 ms. 2 Ms 38 1 4 3 2 2 4 2 2 mrs. 2 Mrs 38 1 4 3 2 t 2 4 2 2 throaty 2 throat 38 1 4 3 2 2 anuw 4 4 2 throttle 2 thrombosis 2 throes 2 throb 38 1 4 3 2 2 4 2 2 moving 2 movie 38 1 4 3 2 2 4 4 2 moves 2 movement 2 moved 2 move 38 1 4 3 2 t 2 4 2 2 thrifty 2 thrift 38 1 4 3 2 2 f 4 4 2 thrive 2 thrips 2 thrill 2 thrice 38 1 4 3 2 2 4 2 2 months 2 month 38 1 4 3 2 h 2 4 2 2 threshold 2 thresh 38 1 4 3 2 2 4 3 2 threesome 2 threefold 2 three 38 1 4 3 2 2 dt 4 0 38 1 4 3 2 2 4 2 2 threaten 2 threat 38 1 4 3 2 2 4 2 2 threadbare 2 thread 38 1 4 3 2 2 aes 4 2 2 threw 2 threonine 38 1 4 3 2 2 4 2 2 thrash 2 thrall 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 r 2 4 2 2 members 2 member 38 1 4 3 2 and 2 4 3 2 thousandth 2 thousandfold 2 thousand 38 1 4 3 2 ng 2 4 3 2 meetings 2 meeting 2 meetinghouse 38 1 4 3 2 2 4 3 2 thoughts 2 thoughtful 2 thought 38 1 4 3 2 h 2 t 4 1 2 though 38 1 4 3 2 2 4 2 2 medical 2 medicate 38 1 4 3 2 2 gs 4 1 2 thou 38 1 4 3 2 2 4 2 2 matters 2 matter 38 1 4 3 2 2 r 4 1 2 matte 38 1 4 3 2 2 4 2 2 marketed 2 marketeer 38 1 4 3 2 ugh 2 4 4 2 thoroughgoing 2 thoroughfare 2 thoroughbred 2 thorough 38 1 4 3 2 2 4 2 2 fucker 2 fucked 38 1 4 3 2 2 e 4 3 2 fucks 2 fucking 2 fuck 38 1 4 3 2 s 2 4 2 2 Fuchsia 2 Fuchs 38 1 4 3 2 2 4 3 2 thorny 2 Thornton 2 thorn 38 1 4 3 2 2 4 3 2 managers 2 manager 2 managerial 38 1 4 3 2 2 4 2 2 thorium 2 thoriate 38 1 4 3 2 2 ino 4 4 2 Thorstein 2 Thorpe 2 Thoreau 2 Thor 38 1 4 3 2 2 4 4 2 Thomson 2 Thompson 2 Thomistic 2 Thomas 38 1 4 3 2 2 s 4 2 2 makeup 2 make 38 1 4 3 2 2 4 2 2 makes 2 makeshift 38 1 4 3 2 2 mru 4 2 2 those 2 thong 38 1 4 3 2 le 2 4 2 2 thistledown 2 thistle 38 1 4 3 2 2 t 4 2 2 this'll 2 this 38 1 4 3 2 en 2 4 2 2 thirteenth 2 thirteen 38 1 4 3 2 2 e 4 2 2 thirty 2 thirtieth 38 1 4 3 2 2 4 2 2 longer 2 longevity 38 1 4 3 2 2 4 2 2 located 2 locate 38 1 4 3 2 t 2 4 2 2 thirsty 2 thirst 38 1 4 3 2 2 st 4 1 2 third 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 g 2 4 2 2 living 2 Livingston 38 1 4 3 2 2 4 2 2 thiouracil 2 thiocyanate 38 1 4 3 2 2 g 4 4 2 thinnish 2 think 2 thine 2 thin 38 1 4 3 2 b 2 4 2 2 Thimbu 2 thimble 38 1 4 3 2 2 4 2 2 thieving 2 thieves 38 1 4 3 2 2 v 4 1 2 thief 38 1 4 3 2 2 4 2 2 thicket 2 thicken 38 1 4 3 2 k 2 e 4 2 2 thickish 2 thick 38 1 4 3 2 2 cemnors 4 3 2 thither 2 thigh 2 thiamin 38 1 4 3 2 2 4 2 2 leadsmen 2 leadsman 38 1 4 3 2 2 4 2 2 leaders 2 leader 38 1 4 3 2 2 4 4 2 they've 2 they're 2 they'll 2 they'd 38 1 4 3 2 2 ' 4 1 2 they 38 1 4 3 2 2 4 2 2 Thetis 2 theta 38 1 4 3 2 2 4 2 2 largest 2 largesse 38 1 4 3 2 2 4 3 2 Theseus 2 theses 2 these 38 1 4 3 2 2 e 4 3 2 thespian 2 thesis 2 thesaurus 38 1 4 3 2 2 4 2 2 keys 2 keystone 38 1 4 3 2 2 4 3 2 thermostat 2 Thermofax 2 thermo 38 1 4 3 2 2 4 2 2 keeps 2 keep 38 1 4 3 2 2 4 2 2 thermistor 2 thermionic 38 1 4 3 2 2 io 4 1 2 thermal 38 1 4 3 2 2 4 2 2 thereupon 2 thereunder 38 1 4 3 2 2 4 2 2 its 2 itself 38 1 4 3 2 2 4 2 2 issues 2 issue 38 1 4 3 2 o 2 4 2 2 theretofore 2 thereto 38 1 4 3 2 2 4 2 2 involved 2 involve 38 1 4 3 2 2 e 4 1 2 involving 38 1 4 3 2 2 4 2 2 thereon 2 thereof 38 1 4 3 2 r 2 4 2 2 investors 2 investor 38 1 4 3 2 2 4 2 2 there'll 2 there'd 38 1 4 3 2 r 2 4 2 2 therefore 2 therefor 38 1 4 3 2 2 4 2 2 international 2 internal 38 1 4 3 2 2 o 4 1 2 therefrom 38 1 4 3 2 on 2 4 2 2 inflation 2 inflationary 38 1 4 3 2 2 4 3 2 thereat 2 thereafter 2 thereabouts 38 1 4 3 2 2 4 2 2 individuals 2 individual 38 1 4 3 2 2 af'otu 4 5 2 therewith 2 Theresa 2 therein 2 thereby 2 there 38 1 4 3 2 p 2 4 3 2 therapy 2 therapist 2 therapeutic 38 1 4 3 2 2 4 3 2 increases 2 increased 2 increase 38 1 4 3 2 2 aem 4 0 38 1 4 3 2 2 4 2 2 included 2 include 38 1 4 3 2 2 e 4 1 2 including 38 1 4 3 2 2 t 4 1 2 theorem 38 1 4 3 2 ic 2 4 2 2 theoretician 2 theoretic 38 1 4 3 2 2 e 4 2 2 theory 2 theorist 38 1 4 3 2 og 2 4 2 2 theology 2 theologian 38 1 4 3 2 o 2 4 2 2 Theodosian 2 Theodore 38 1 4 3 2 2 dlr 4 1 2 theocracy 38 1 4 3 2 e 2 4 2 2 thenceforth 2 thence 38 1 4 3 2 2 c 4 1 2 then 38 1 4 3 2 2 4 4 2 themselves 2 theme 2 thematic 2 them 38 1 4 3 2 2 4 2 2 theist 2 theism 38 1 4 3 2 2 s 4 1 2 their 38 1 4 3 2 2 4 2 2 theatric 2 Thea 38 1 4 3 2 2 4 2 2 having 2 Havilland 38 1 4 3 2 2 aimnorsty 4 5 2 Thelma 2 theft 2 thee 2 Thebes 2 the 38 1 4 3 2 2 ilnt 4 2 2 Thayer 2 thaw 38 1 4 3 2 2 4 2 2 that'll 2 that'd 38 1 4 3 2 2 ' 4 2 2 thatch 2 that 38 1 4 3 2 2 4 3 2 thanksgiving 2 thankful 2 thank 38 1 4 3 2 2 k 4 1 2 than 38 1 4 3 2 2 4 5 2 gives 2 giveth 2 given 2 giveaway 2 give 38 1 4 3 2 2 4 2 2 thallophyte 2 thallium 38 1 4 3 2 2 l 4 1 2 Thalia 38 1 4 3 2 2 4 2 2 Thailand 2 Thai 38 1 4 3 2 2 4 2 2 Gettysburg 2 Getty 38 1 4 3 2 2 aeioruwy 4 0 38 1 4 3 2 2 4 2 2 texture 2 textural 38 1 4 3 2 2 4 2 2 generally 2 general 38 1 4 3 2 2 r 4 1 2 textual 38 1 4 3 2 2 u 4 4 2 Textron 2 textile 2 textbook 2 text 38 1 4 3 2 2 4 3 2 Texas 2 Texan 2 Texaco 38 1 4 3 2 2 at 4 0 38 1 4 3 2 2 4 2 2 tetrahedral 2 tetrahedra 38 1 4 3 2 edr 2 a 4 1 2 tetrahedron 38 1 4 3 2 2 4 2 2 former 2 formed 38 1 4 3 2 luo 2 4 2 2 tetrafluouride 2 tetrafluoride 38 1 4 3 2 a 2 fh 4 3 2 tetravalent 2 tetragonal 2 tetrachloride 38 1 4 3 2 2 r 4 3 2 tether 2 tete 2 tetanus 38 1 4 3 2 2 4 2 2 followed 2 followeth 38 1 4 3 2 on 2 4 2 2 testimony 2 testimonial 38 1 4 3 2 2 4 2 2 testicular 2 testicle 38 1 4 3 2 2 cm 4 1 2 testify 38 1 4 3 2 2 4 2 2 finds 2 find 38 1 4 3 2 ent 2 4 2 2 testamentary 2 testament 38 1 4 3 2 2 4 2 2 figures 2 figure 38 1 4 3 2 2 m 4 1 2 testate 38 1 4 3 2 2 ai 4 5 2 tests 2 testy 2 testes 2 testbed 2 test 38 1 4 3 2 2 4 2 2 tessellate 2 Tess 38 1 4 3 2 2 4 2 2 feels 2 feel 38 1 4 3 2 2 st 4 0 38 1 4 3 2 or 2 4 2 2 territory 2 territorial 38 1 4 3 2 2 4 2 2 terrify 2 terrific 38 1 4 3 2 2 4 2 2 eyes 2 eyesight 38 1 4 3 2 e 2 4 2 2 experiences 2 experience 38 1 4 3 2 2 ft 4 2 2 terrier 2 terrible 38 1 4 3 2 2 4 2 2 terrestrial 2 Terre 38 1 4 3 2 2 4 5 2 terrapin 2 terramycin 2 terrain 2 terrace 2 Terra 38 1 4 3 2 e 2 4 2 2 executives 2 executive 38 1 4 3 2 2 aei 4 2 2 terry 2 terror 38 1 4 3 2 le 2 4 2 2 examples 2 example 38 1 4 3 2 sichore 2 4 2 2 terpsichorean 2 Terpsichore 38 1 4 3 2 n 2 4 2 2 europeans 2 European 38 1 4 3 2 2 4 2 2 ternary 2 tern 38 1 4 3 2 2 a 4 3 2 terminus 2 terminology 2 termini 38 1 4 3 2 e 2 4 2 2 estates 2 estate 38 1 4 3 2 2 4 3 2 terminate 2 terminal 2 terminable 38 1 4 3 2 lish 2 4 3 2 establishing 2 established 2 establish 38 1 4 3 2 2 n 4 1 2 termite 38 1 4 3 2 2 i 4 2 2 terms 2 term 38 1 4 3 2 cial 2 4 2 2 especially 2 especial 38 1 4 3 2 e 2 4 2 2 employees 2 employee 38 1 4 3 2 to 2 4 2 2 teratology 2 teratogenic 38 1 4 3 2 2 amnpr 4 5 2 tertiary 2 terse 2 Teresa 2 tercel 2 terbium 38 1 4 3 2 c 2 4 2 2 electronics 2 electronic 38 1 4 3 2 2 4 2 2 tepid 2 tepee 38 1 4 3 2 2 4 2 2 tenure 2 tenuous 38 1 4 3 2 rt 2 4 2 2 efforts 2 effort 38 1 4 3 2 2 4 2 2 education 2 educate 38 1 4 3 2 2 4 2 2 tentative 2 tentacle 38 1 4 3 2 2 a 4 3 2 tenth 2 tenterhooks 2 tent 38 1 4 3 2 2 4 2 2 economics 2 economic 38 1 4 3 2 n 2 4 2 2 tensional 2 tension 38 1 4 3 2 ng 2 4 2 2 earnings 2 earning 38 1 4 3 2 2 o 4 1 2 tensile 38 1 4 3 2 2 i 4 3 2 tenspot 2 tensor 2 tense 38 1 4 3 2 2 4 3 2 early 2 earlier 2 earl 38 1 4 3 2 2 4 2 2 tenor 2 tenon 38 1 4 3 2 2 4 2 2 doors 2 doorstep 38 1 4 3 2 2 4 3 2 Tenney 2 Tennessee 2 Tenneco 38 1 4 3 2 2 e 4 2 2 Tennyson 2 tennis 38 1 4 3 2 r 2 4 2 2 dollars 2 dollar 38 1 4 3 2 2 4 2 2 does 2 doesn't 38 1 4 3 2 2 4 3 2 tenet 2 tenement 2 tenebrous 38 1 4 3 2 2 4 2 2 tenderloin 2 tenderfoot 38 1 4 3 2 2 r 4 1 2 tendency 38 1 4 3 2 2 e 4 2 2 tendon 2 tend 38 1 4 3 2 lop 2 4 4 2 develops 2 development 2 developed 2 develop 38 1 4 3 2 i 2 4 2 2 tenacity 2 tenacious 38 1 4 3 2 2 c 4 2 2 tenant 2 tenable 38 1 4 3 2 2 adenostu 4 2 2 tenfold 2 ten 38 1 4 3 2 2 4 2 2 described 2 describe 38 1 4 3 2 2 e 4 1 2 describing 38 1 4 3 2 2 4 3 2 temptress 2 temptation 2 tempt 38 1 4 3 2 ent 2 4 2 2 departments 2 department 38 1 4 3 2 d 2 4 2 2 demands 2 demand 38 1 4 3 2 a 2 r 4 1 2 temporal 38 1 4 3 2 2 r 4 1 2 tempo 38 1 4 3 2 2 4 2 2 defensive 2 defensible 38 1 4 3 2 2 4 2 2 Templeton 2 temple 38 1 4 3 2 2 e 4 1 2 template 38 1 4 3 2 2 rs 4 0 38 1 4 3 2 n 2 4 2 2 decisions 2 decision 38 1 4 3 2 t 2 4 2 2 tempestuous 2 tempest 38 1 4 3 2 2 a 4 1 2 temper 38 1 4 3 2 2 4 2 2 temperature 2 temperate 38 1 4 3 2 2 4 3 2 decides 2 decided 2 decide 38 1 4 3 2 2 t 4 2 2 temperance 2 tempera 38 1 4 3 2 2 elot 4 0 38 1 4 3 2 2 p 4 1 2 temerity 38 1 4 3 2 2 4 6 2 telling 2 tells 2 tellurium 2 telltale 2 teller 2 tell 38 1 4 3 2 r 2 4 2 2 customers 2 customer 38 1 4 3 2 is 2 4 2 2 television 2 televise 38 1 4 3 2 pe 2 4 3 2 teletypewrite 2 teletypesetting 2 teletype 38 1 4 3 2 2 y 4 1 2 telethon 38 1 4 3 2 2 4 2 2 created 2 create 38 1 4 3 2 cop 2 4 2 2 telescopic 2 telescope 38 1 4 3 2 2 4 2 2 teleprompter 2 teleprocessing 38 1 4 3 2 2 o 4 1 2 teleprinter 38 1 4 3 2 2 4 2 2 countries 2 countrify 38 1 4 3 2 2 e 4 2 2 telephony 2 telephonic 38 1 4 3 2 o 2 n 4 1 2 telephotography 38 1 4 3 2 on 2 4 2 2 corporations 2 corporation 38 1 4 3 2 th 2 4 2 2 telepathy 2 telepathic 38 1 4 3 2 2 ahr 4 0 38 1 4 3 2 2 i 4 1 2 corporate 38 1 4 3 2 2 4 2 2 teleost 2 teleology 38 1 4 3 2 h 2 4 2 2 telegraphy 2 telegraph 38 1 4 3 2 ra 2 p 4 1 2 telegram 38 1 4 3 2 2 4 2 2 continuing 2 continuity 38 1 4 3 2 o 2 4 2 2 teleconference 2 telecommunicate 38 1 4 3 2 2 4 3 2 continues 2 continued 2 continue 38 1 4 3 2 2 cgopstv 4 5 2 Telex 2 telemeter 2 telekinesis 2 Telefunken 2 Teledyne 38 1 4 3 2 2 el 4 1 2 Tel 38 1 4 3 2 2 4 2 2 consumers 2 consumer 38 1 4 3 2 t 2 4 2 2 Tektronix 2 tektite 38 1 4 3 2 2 4 2 2 Tehran 2 Teheran 38 1 4 3 2 2 r 4 2 2 consumed 2 consume 38 1 4 3 2 2 4 2 2 construction 2 constructible 38 1 4 3 2 2 4 2 2 teethed 2 teethe 38 1 4 3 2 2 e 4 2 2 teething 2 teeth 38 1 4 3 2 2 h 4 3 2 teetotal 2 teeter 2 teet 38 1 4 3 2 2 4 2 2 computers 2 computer 38 1 4 3 2 2 r 4 1 2 compute 38 1 4 3 2 2 4 3 2 teensy 2 teenage 2 teen 38 1 4 3 2 n 2 4 3 2 companionship 2 companionway 2 companion 38 1 4 3 2 2 nt 4 3 2 teem 2 teeing 2 tee 38 1 4 3 2 2 4 2 2 tedium 2 tedious 38 1 4 3 2 on 2 4 2 2 communications 2 communication 38 1 4 3 2 2 i 4 2 2 Teddy 2 Ted 38 1 4 3 2 2 i 4 1 2 communicate 38 1 4 3 2 2 n 4 1 2 tech 38 1 4 3 2 rat 2 4 2 2 technocratic 2 technocrat 38 1 4 3 2 2 c 4 1 2 technology 38 1 4 3 2 2 4 2 2 coming 2 Cominform 38 1 4 3 2 2 4 2 2 technician 2 technic 38 1 4 3 2 2 c 4 2 2 technique 2 Technion 38 1 4 3 2 2 io 4 1 2 technetium 38 1 4 3 2 2 h 4 2 2 tecum 2 tectonic 38 1 4 3 2 2 ckmrs 4 5 2 teat 2 teapot 2 teal 2 teahouse 2 tea 38 1 4 3 2 en 2 4 2 2 citizenry 2 citizen 38 1 4 3 2 oon 2 4 2 2 teaspoonful 2 teaspoon 38 1 4 3 2 2 4 2 2 teasel 2 tease 38 1 4 3 2 2 ep 4 0 38 1 4 3 2 2 4 3 2 tearful 2 teardrop 2 tear 38 1 4 3 2 2 s 4 3 2 teamwork 2 teammate 2 team 38 1 4 3 2 2 4 2 2 teakwood 2 teakettle 38 1 4 3 2 2 h 4 2 2 teacup 2 teacart 38 1 4 3 2 2 acdehklmnprstx 4 3 2 Teutonic 2 Tegucigalpa 2 Teflon 38 1 4 3 2 2 4 3 2 causes 2 caused 2 cause 38 1 4 3 2 ay 2 4 2 2 taxpaying 2 taxpayer 38 1 4 3 2 nom 2 4 2 2 taxonomy 2 taxonomic 38 1 4 3 2 2 4 4 2 taxiway 2 taxied 2 taxicab 2 taxi 38 1 4 3 2 2 4 2 2 buys 2 buy 38 1 4 3 2 2 iop 4 3 2 taxes 2 taxation 2 tax 38 1 4 3 2 2 4 2 2 tawny 2 tawdry 38 1 4 3 2 ng 2 4 2 2 buildings 2 building 38 1 4 3 2 ern 2 4 2 2 taverna 2 tavern 38 1 4 3 2 2 4 2 2 tautology 2 taut 38 1 4 3 2 2 t 4 4 2 Taurus 2 taunt 2 taught 2 tau 38 1 4 3 2 2 4 2 2 brings 2 bring 38 1 4 3 2 e 2 4 3 2 tattletale 2 tattler 2 tattle 38 1 4 3 2 2 l 4 2 2 tatty 2 tattoo 38 1 4 3 2 2 4 2 2 tater 2 tate 38 1 4 3 2 2 et 4 1 2 tat 38 1 4 3 2 2 4 2 2 better 2 Bette 38 1 4 3 2 2 4 2 2 tasteful 2 taste 38 1 4 3 2 2 e 4 2 2 tasty 2 tasting 38 1 4 3 2 2 4 2 2 benefits 2 benefit 38 1 4 3 2 2 4 2 2 tassel 2 Tass 38 1 4 3 2 e 2 4 2 2 believes 2 believe 38 1 4 3 2 2 4 2 2 taskmaster 2 task 38 1 4 3 2 2 kst 4 1 2 Tasmania 38 1 4 3 2 r 2 4 2 2 Tartary 2 tartar 38 1 4 3 2 2 a 4 1 2 tart 38 1 4 3 2 y 2 4 2 2 Tarrytown 2 tarry 38 1 4 3 2 2 4 2 2 tarpaulin 2 tarpaper 38 1 4 3 2 2 a 4 1 2 tarpon 38 1 4 3 2 ge 2 4 2 2 averages 2 average 38 1 4 3 2 l 2 4 2 2 available 2 avail 38 1 4 3 2 t 2 4 2 2 tarantula 2 tarantara 38 1 4 3 2 2 n 4 1 2 tara 38 1 4 3 2 2 aprt 4 7 2 Tarzan 2 tarnish 2 tariff 2 target 2 tardy 2 Tarbell 2 tar 38 1 4 3 2 on 2 4 2 2 associations 2 association 38 1 4 3 2 2 4 2 2 tappet 2 tappa 38 1 4 3 2 2 i 4 1 2 associate 38 1 4 3 2 2 4 2 2 tapis 2 tapir 38 1 4 3 2 2 4 2 2 asked 2 askew 38 1 4 3 2 2 4 4 2 tapeworm 2 tapestry 2 taper 2 tape 38 1 4 3 2 2 eip 4 2 2 tapa 2 tap 38 1 4 3 2 2 4 2 2 arms 2 Armstrong 38 1 4 3 2 2 4 3 2 Taos 2 Taoist 2 tao 38 1 4 3 2 2 4 2 2 announced 2 announce 38 1 4 3 2 2 l 4 1 2 tantamount 38 1 4 3 2 nc 2 e 4 1 2 announcing 38 1 4 3 2 u 2 4 2 2 Tantalus 2 tantalum 38 1 4 3 2 2 a 4 1 2 tantrum 38 1 4 3 2 nt 2 4 2 2 amounts 2 amount 38 1 4 3 2 2 4 2 2 american 2 Americana 38 1 4 3 2 ay 2 4 2 2 always 2 alway 38 1 4 3 2 t 2 4 2 2 tangential 2 tangent 38 1 4 3 2 2 n 4 1 2 tangerine 38 1 4 3 2 2 e 4 5 2 tangy 2 tango 2 tangle 2 tangible 2 tang 38 1 4 3 2 2 4 3 2 Tananarive 2 Tanaka 2 tanager 38 1 4 3 2 2 agt 4 8 2 Tanzania 2 Tanya 2 tansy 2 tannin 2 tank 2 tanh 2 tandem 2 tan 38 1 4 3 2 2 4 3 2 tampon 2 Tampa 2 tamp 38 1 4 3 2 n 2 4 3 2 additions 2 additional 2 addition 38 1 4 3 2 d 2 4 3 2 addendum 2 addenda 2 addend 38 1 4 3 2 2 a 4 1 2 activities 38 1 4 3 2 n 2 4 2 2 actions 2 action 38 1 4 3 2 2 4 2 2 according 2 accordion 38 1 4 3 2 2 4 2 2 tamarind 2 tamarack 38 1 4 3 2 2 r 4 1 2 tamale 38 1 4 3 2 2 ap 4 4 2 Tammany 2 tame 2 tambourine 2 tam 38 1 4 3 2 2 4 2 2 tallyho 2 tally 38 1 4 3 2 2 y 4 3 2 tallow 2 Tallahassee 2 tall 38 1 4 3 2 2 4 4 2 talky 2 talkie 2 talkative 2 talk 38 1 4 3 2 sman 2 4 2 2 talismanic 2 talisman 38 1 4 3 2 2 4 2 2 talent 2 tale 38 1 4 3 2 2 4 2 2 talcum 2 talc 38 1 4 3 2 2 ceikl 4 3 2 talus 2 talon 2 Talmud 38 1 4 3 2 2 4 2 2 takeover 2 takeoff 38 1 4 3 2 2 e 4 1 2 taking 38 1 4 3 2 2 4 5 2 tailwind 2 tailspin 2 tailor 2 tailgate 2 tail 38 1 4 3 2 2 l 4 3 2 Taiwan 2 Taipei 2 taint 38 1 4 3 2 2 4 2 2 Tahoe 2 Tahiti 38 1 4 3 2 2 4 2 2 tagging 2 tag 38 1 4 3 2 2 4 2 2 taffy 2 taffeta 38 1 4 3 2 2 f 4 1 2 Taft 38 1 4 3 2 2 4 2 2 tadpole 2 tad 38 1 4 3 2 2 4 2 2 tactician 2 tactic 38 1 4 3 2 2 c 4 1 2 tactile 38 1 4 3 2 2 i 4 3 2 tactual 2 tactful 2 tact 38 1 4 3 2 2 4 3 2 tacky 2 tackle 2 tack 38 1 4 3 2 t 2 4 2 2 Tacitus 2 tacit 38 1 4 3 2 2 i 4 1 2 tachometer 38 1 4 3 2 2 4 2 2 tachistoscope 2 tachinid 38 1 4 3 2 2 hikt 4 1 2 Tacoma 38 1 4 3 2 a 2 4 3 2 tabulate 2 tabular 2 tabula 38 1 4 3 2 2 l 4 1 2 tabu 38 1 4 3 2 2 as 4 4 2 tablet 2 tableland 2 tablecloth 2 table 38 1 4 3 2 2 p 4 1 2 tables 38 1 4 3 2 u 2 4 2 2 tableaux 2 tableau 38 1 4 3 2 2 e 4 1 2 tabloid 38 1 4 3 2 2 lu 4 3 2 taboo 2 tabernacle 2 tab 38 1 4 3 2 2 bcdfghiklmnoprstuvwx 4 2 2 Taylor 2 TA 38 1 4 3 2 2 aehiNoruysTVW 4 3 2 TX 2 t's 2 t 38 1 4 3 2 2 4 2 2 systemization 2 systemic 38 1 4 3 2 tem 2 i 4 3 2 systemwide 2 systematic 2 system 38 1 4 3 2 p 2 4 2 2 syrupy 2 syrup 38 1 4 3 2 2 4 2 2 syringe 2 syringa 38 1 4 3 2 2 g 4 1 2 syrinx 38 1 4 3 2 2 n 4 1 2 Syria 38 1 4 3 2 2 iu 4 1 2 Syracuse 38 1 4 3 2 2 4 2 2 synthesis 2 syntheses 38 1 4 3 2 e 2 s 4 1 2 synthetic 38 1 4 3 2 2 4 2 2 syntax 2 syntactic 38 1 4 3 2 2 ah 4 0 38 1 4 3 2 2 4 2 2 synopsis 2 synopses 38 1 4 3 2 2 s 4 1 2 synoptic 38 1 4 3 2 ym 2 4 3 2 synonymy 2 synonymous 2 synonym 38 1 4 3 2 2 np 4 1 2 synod 38 1 4 3 2 s 2 4 2 2 synergistic 2 synergism 38 1 4 3 2 rg 2 i 4 1 2 synergy 38 1 4 3 2 c 2 4 2 2 syndicate 2 syndic 38 1 4 3 2 2 i 4 1 2 syndrome 38 1 4 3 2 ro 2 n 4 1 2 synchrotron 38 1 4 3 2 2 4 3 2 synchrony 2 synchronous 2 synchronism 38 1 4 3 2 2 h 4 1 2 syncopate 38 1 4 3 2 2 p 4 1 2 synagogue 38 1 4 3 2 e 2 4 2 2 synapses 2 synapse 38 1 4 3 2 2 s 4 1 2 synaptic 38 1 4 3 2 2 acdeot 4 1 2 Synge 38 1 4 3 2 om 2 4 2 2 symptomatic 2 symptom 38 1 4 3 2 si 2 4 2 2 symposium 2 symposia 38 1 4 3 2 on 2 4 2 2 symphony 2 symphonic 38 1 4 3 2 th 2 4 2 2 sympathy 2 sympathetic 38 1 4 3 2 2 ahot 4 1 2 symplectic 38 1 4 3 2 2 io 4 0 38 1 4 3 2 l 2 4 2 2 symbolic 2 symbol 38 1 4 3 2 o 2 4 2 2 symbiotic 2 symbiosis 38 1 4 3 2 2 bp 4 1 2 symmetry 38 1 4 3 2 n 2 4 2 2 Sylvania 2 sylvan 38 1 4 3 2 2 a 4 2 2 Sylvia 2 Sylvester 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 gis 2 4 2 2 syllogistic 2 syllogism 38 1 4 3 2 b 2 i 4 2 2 syllabus 2 syllable 38 1 4 3 2 2 4 3 2 syllabify 2 syllabic 2 syllabi 38 1 4 3 2 2 lv 4 1 2 Sylow 38 1 4 3 2 phant 2 4 2 2 sycophantic 2 sycophant 38 1 4 3 2 2 o 4 1 2 sycamore 38 1 4 3 2 2 4 2 2 Sybil 2 sybarite 38 1 4 3 2 2 bclmnrs 4 4 2 syzygy 2 Sykes 2 syenite 2 Sydney 38 1 4 3 2 2 4 2 2 swung 2 swum 38 1 4 3 2 2 4 4 2 swordtail 2 swordplay 2 swordfish 2 sword 38 1 4 3 2 2 d 4 2 2 sworn 2 swore 38 1 4 3 2 2 r 4 2 2 swoop 2 swollen 38 1 4 3 2 er 2 4 2 2 Switzerland 2 Switzer 38 1 4 3 2 h 2 b 4 4 2 switches 2 switchman 2 switchgear 2 switch 38 1 4 3 2 2 4 2 2 switchboard 2 switchblade 38 1 4 3 2 2 cz 4 0 38 1 4 3 2 2 4 2 2 swishy 2 swish 38 1 4 3 2 2 h 4 1 2 swiss 38 1 4 3 2 l 2 4 2 2 swirly 2 swirl 38 1 4 3 2 2 4 3 2 swingy 2 swingable 2 swing 38 1 4 3 2 2 g 4 2 2 swine 2 swindle 38 1 4 3 2 2 4 2 2 swimsuit 2 swim 38 1 4 3 2 2 4 2 2 swigging 2 swig 38 1 4 3 2 2 gmnrst 4 4 2 swizzle 2 swivel 2 swipe 2 swift 38 1 4 3 2 2 4 2 2 swelter 2 swelt 38 1 4 3 2 2 t 4 1 2 swell 38 1 4 3 2 2 4 4 2 sweetish 2 sweetheart 2 sweeten 2 sweet 38 1 4 3 2 2 4 2 2 sweepstake 2 sweep 38 1 4 3 2 2 pt 4 1 2 Sweeney 38 1 4 3 2 2 4 2 2 Sweden 2 Swede 38 1 4 3 2 2 e 4 1 2 Swedish 38 1 4 3 2 2 t 4 1 2 swear 38 1 4 3 2 2 4 5 2 sweaty 2 sweatshirt 2 sweater 2 sweatband 2 sweat 38 1 4 3 2 2 adel 4 3 2 swerve 2 swept 2 Swenson 38 1 4 3 2 2 4 2 2 swathe 2 swath 38 1 4 3 2 2 h 4 2 2 swatch 2 swat 38 1 4 3 2 2 4 3 2 swarthy 2 Swarthout 2 Swarthmore 38 1 4 3 2 2 h 4 1 2 swart 38 1 4 3 2 2 t 4 1 2 swarm 38 1 4 3 2 2 4 2 2 swanky 2 swank 38 1 4 3 2 2 k 4 3 2 Swanson 2 swanlike 2 swan 38 1 4 3 2 2 4 2 2 swampy 2 swamp 38 1 4 3 2 2 p 4 2 2 swami 2 swam 38 1 4 3 2 low 2 4 2 2 swallowtail 2 swallow 38 1 4 3 2 2 4 2 2 swage 2 swag 38 1 4 3 2 2 4 2 2 swabby 2 swab 38 1 4 3 2 2 bglmnrt 4 6 2 Swaziland 2 sway 2 swastika 2 swap 2 swain 2 Swahili 38 1 4 3 2 2 aeiou 4 1 2 SW 38 1 4 3 2 rain 2 4 2 2 suzerainty 2 suzerain 38 1 4 3 2 2 e 4 2 2 Suzuki 2 Suzanne 38 1 4 3 2 2 4 3 2 suture 2 Sutton 2 Sutherland 38 1 4 3 2 2 4 2 2 sustenance 2 sustain 38 1 4 3 2 cio 2 4 2 2 suspicious 2 suspicion 38 1 4 3 2 2 n 4 1 2 suspect 38 1 4 3 2 2 4 3 2 suspensor 2 suspension 2 suspense 38 1 4 3 2 2 s 4 1 2 suspend 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 ept 2 4 2 2 susceptible 2 susceptance 38 1 4 3 2 n 2 4 2 2 Susanne 2 Susan 38 1 4 3 2 2 acpt 4 4 2 Sussex 2 Susie 2 sushi 2 Sus 38 1 4 3 2 v 2 4 3 2 survivor 2 survive 2 survival 38 1 4 3 2 2 y 4 1 2 surveillant 38 1 4 3 2 2 4 3 2 surveys 2 surveyor 2 survey 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 2 2 surtout 2 surtax 38 1 4 3 2 2 4 2 2 surround 2 surrogate 38 1 4 3 2 2 4 4 2 surrey 2 surreptitious 2 surrender 2 surreal 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 4 3 2 surprise 2 surplus 2 surpass 38 1 4 3 2 2 4 2 2 surmount 2 surmise 38 1 4 3 2 ecti 2 4 2 2 surjective 2 surjection 38 1 4 3 2 2 4 3 2 surgery 2 surgeon 2 surge 38 1 4 3 2 2 e 4 1 2 surgical 38 1 4 3 2 c 2 4 2 2 surfactant 2 surface 38 1 4 3 2 2 a 4 2 2 surfeit 2 surf 38 1 4 3 2 2 4 2 2 surety 2 sure 38 1 4 3 2 2 4 2 2 surcharge 2 surcease 38 1 4 3 2 2 cefgjmprtv 4 1 2 surname 38 1 4 3 2 m 2 4 3 2 supremum 2 supreme 2 supremacy 38 1 4 3 2 2 4 2 2 supranational 2 supra 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 suppression 2 suppressible 38 1 4 3 2 ess 2 i 4 2 2 suppressor 2 suppress 38 1 4 3 2 2 4 3 2 supposition 2 suppose 2 supposable 38 1 4 3 2 2 sr 4 0 38 1 4 3 2 2 ei 4 2 2 supply 2 supplant 38 1 4 3 2 2 4 2 2 supplementary 2 supple 38 1 4 3 2 2 lor 4 0 38 1 4 3 2 2 4 2 2 supervisory 2 supervene 38 1 4 3 2 itio 2 4 2 2 superstitious 2 superstition 38 1 4 3 2 2 t 4 1 2 supersede 38 1 4 3 2 2 4 2 2 supernovae 2 supernatant 38 1 4 3 2 2 4 2 2 superlunary 2 superlative 38 1 4 3 2 2 4 2 2 superior 2 superintendent 38 1 4 3 2 u 2 4 2 2 superfluous 2 superfluity 38 1 4 3 2 2 l 4 1 2 superficial 38 1 4 3 2 2 4 2 2 superbly 2 superb 38 1 4 3 2 r 2 bfilnsv 4 4 2 superposable 2 supercilious 2 superannuate 2 super 38 1 4 3 2 2 epr 4 2 2 supine 2 sup 38 1 4 3 2 2 4 2 2 suntanning 2 suntanned 38 1 4 3 2 an 2 n 4 1 2 suntan 38 1 4 3 2 n 2 4 2 2 sunshiny 2 sunshine 38 1 4 3 2 2 i 4 1 2 sunshade 38 1 4 3 2 2 h 4 3 2 sunspot 2 sunset 2 sunscreen 38 1 4 3 2 y 2 4 2 2 Sunnyvale 2 sunny 38 1 4 3 2 i 2 4 2 2 sunlit 2 sunlight 38 1 4 3 2 2 4 2 2 sunken 2 sunk 38 1 4 3 2 2 4 2 2 sunglasses 2 sung 38 1 4 3 2 2 4 2 2 sunflower 2 sunfish 38 1 4 3 2 2 4 2 2 sundew 2 sunder 38 1 4 3 2 2 e 4 4 2 sundry 2 sundown 2 sundial 2 Sunday 38 1 4 3 2 rn 2 4 2 2 sunburnt 2 sunburn 38 1 4 3 2 2 u 4 2 2 sunbonnet 2 sunbeam 38 1 4 3 2 2 bdfgklnst 4 3 2 SUNY 2 sunrise 2 sun 38 1 4 3 2 t 2 4 2 2 summitry 2 summit 38 1 4 3 2 r 2 4 3 2 summertime 2 Summers 2 summer 38 1 4 3 2 2 rt 4 1 2 summand 38 1 4 3 2 2 4 2 2 summation 2 summate 38 1 4 3 2 2 4 2 2 summary 2 summarily 38 1 4 3 2 2 aei 4 1 2 summon 38 1 4 3 2 ria 2 4 2 2 Sumerian 2 Sumeria 38 1 4 3 2 2 4 2 2 Sumatra 2 sumac 38 1 4 3 2 2 aem 4 4 2 Sumter 2 sumptuous 2 Sumner 2 sum 38 1 4 3 2 n 2 4 2 2 sultanate 2 sultan 38 1 4 3 2 2 a 4 1 2 sultry 38 1 4 3 2 2 4 3 2 sully 2 Sullivan 2 sullen 38 1 4 3 2 2 4 2 2 sulky 2 sulk 38 1 4 3 2 2 aiu 4 1 2 sulfonamide 38 1 4 3 2 r 2 4 3 2 sulfurous 2 sulfuric 2 sulfur 38 1 4 3 2 2 4 2 2 sulfite 2 sulfide 38 1 4 3 2 2 4 3 2 sulfate 2 sulfanilamide 2 sulfa 38 1 4 3 2 2 fklt 4 1 2 sulphur 38 1 4 3 2 2 4 4 2 suitor 2 suite 2 suitcase 2 suit 38 1 4 3 2 id 2 4 2 2 suicide 2 suicidal 38 1 4 3 2 2 ct 4 0 38 1 4 3 2 2 4 3 2 suggestive 2 suggestion 2 suggestible 38 1 4 3 2 est 2 i 4 1 2 suggest 38 1 4 3 2 2 g 4 1 2 sugar 38 1 4 3 2 age 2 4 2 2 suffragette 2 suffrage 38 1 4 3 2 2 4 2 2 Suffolk 2 suffocate 38 1 4 3 2 2 4 2 2 sufficient 2 suffice 38 1 4 3 2 2 c 4 1 2 suffix 38 1 4 3 2 f 2 ior 4 2 2 suffuse 2 suffer 38 1 4 3 2 2 4 3 2 Suez 2 suey 2 sue 38 1 4 3 2 n 2 4 2 2 Sudanese 2 Sudan 38 1 4 3 2 2 a 4 3 2 suds 2 sudden 2 sud 38 1 4 3 2 2 4 2 2 suckling 2 suck 38 1 4 3 2 2 eu 4 1 2 succinct 38 1 4 3 2 2 4 2 2 succumb 2 succubus 38 1 4 3 2 2 s 4 1 2 succeed 38 1 4 3 2 2 4 2 2 successive 2 succession 38 1 4 3 2 s 2 i 4 3 2 successor 2 successful 2 success 38 1 4 3 2 2 ck 4 3 2 suction 2 sucrose 2 such 38 1 4 3 2 er 2 4 2 2 subvert 2 subversive 38 1 4 3 2 rb 2 4 2 2 suburbia 2 suburb 38 1 4 3 2 a 2 4 2 2 subtrahend 2 subtracter 38 1 4 3 2 2 4 2 2 subtlety 2 subtle 38 1 4 3 2 2 e 4 1 2 subtly 38 1 4 3 2 r 2 4 2 2 subterranean 2 subterfuge 38 1 4 3 2 2 elr 4 0 38 1 4 3 2 2 4 2 2 subsumed 2 subsume 38 1 4 3 2 m 2 e 4 1 2 subsuming 38 1 4 3 2 on 2 4 2 2 substitutionary 2 substitution 38 1 4 3 2 2 i 4 1 2 substitute 38 1 4 3 2 tu 2 t 4 1 2 substituent 38 1 4 3 2 nti 2 a 4 1 2 substantive 38 1 4 3 2 2 4 2 2 substantiate 2 substantial 38 1 4 3 2 2 ai 4 1 2 substrate 38 1 4 3 2 t 2 4 2 2 subsistent 2 subsist 38 1 4 3 2 2 4 2 2 subsidy 2 subsidiary 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 2 itu 4 1 2 subservient 38 1 4 3 2 2 4 3 2 submitting 2 submitted 2 submittal 38 1 4 3 2 t 2 t 4 1 2 submit 38 1 4 3 2 2 i 4 1 2 submersible 38 1 4 3 2 im 2 4 2 2 subliminal 2 sublimate 38 1 4 3 2 ct 2 i 4 2 2 subjects 2 subject 38 1 4 3 2 2 e 4 1 2 subjunctive 38 1 4 3 2 2 jlmstuv 4 3 2 subrogation 2 subpoena 2 sub 38 1 4 3 2 2 bcdefgilmnprstz 4 1 2 suave 38 1 4 3 2 2 4 2 2 Styrofoam 2 styrene 38 1 4 3 2 2 4 3 2 stylites 2 stylish 2 styli 38 1 4 3 2 2 ie 4 1 2 stylus 38 1 4 3 2 2 lr 4 3 2 Styx 2 stymie 2 Stygian 38 1 4 3 2 t 2 4 2 2 Stuttgart 2 stutter 38 1 4 3 2 2 4 4 2 Sturm 2 sturgeon 2 sturdy 2 Sturbridge 38 1 4 3 2 2 f 4 1 2 stupendous 38 1 4 3 2 2 4 2 2 stupefy 2 stupefaction 38 1 4 3 2 2 e 4 2 2 stupor 2 stupid 38 1 4 3 2 2 4 4 2 stunt 2 stunk 2 stung 2 stun 38 1 4 3 2 2 4 3 2 stumpy 2 stumpage 2 stump 38 1 4 3 2 2 p 4 1 2 stumble 38 1 4 3 2 f 2 4 2 2 stuffy 2 stuff 38 1 4 3 2 o 2 4 2 2 studious 2 studio 38 1 4 3 2 2 4 2 2 student 2 Studebaker 38 1 4 3 2 2 ei 4 2 2 study 2 stud 38 1 4 3 2 2 4 2 2 stuck 2 stucco 38 1 4 3 2 2 4 3 2 stubby 2 stubborn 2 stubble 38 1 4 3 2 2 b 4 1 2 stub 38 1 4 3 2 2 bcdfmnprt 4 4 2 Stuyvesant 2 stultify 2 Stuart 2 Stu 38 1 4 3 2 2 t 4 1 2 struck 38 1 4 3 2 ur 2 4 2 2 structure 2 structural 38 1 4 3 2 2 c 4 4 2 strut 2 strung 2 strum 2 struggle 38 1 4 3 2 2 4 2 2 strophe 2 strop 38 1 4 3 2 2 4 3 2 strongroom 2 stronghold 2 strong 38 1 4 3 2 2 g 4 1 2 strontium 38 1 4 3 2 2 4 2 2 Stromberg 2 Strom 38 1 4 3 2 2 4 2 2 stroboscopic 2 strobe 38 1 4 3 2 2 bmnp 4 4 2 strove 2 stroll 2 stroke 2 strode 38 1 4 3 2 e 2 4 2 2 striven 2 strive 38 1 4 3 2 2 4 4 2 stripy 2 striptease 2 stripe 2 strip 38 1 4 3 2 g 2 4 4 2 strings 2 stringy 2 stringent 2 string 38 1 4 3 2 e 2 4 2 2 strikebreak 2 strike 38 1 4 3 2 e 2 4 2 2 strident 2 stride 38 1 4 3 2 2 4 3 2 stricture 2 stricter 2 strict 38 1 4 3 2 2 4 2 2 Strickland 2 stricken 38 1 4 3 2 2 kt 4 0 38 1 4 3 2 2 cdknpv 4 2 2 strife 2 striate 38 1 4 3 2 s 2 4 2 2 stressful 2 stress 38 1 4 3 2 to 2 4 2 2 streptomycin 2 streptococcus 38 1 4 3 2 th 2 4 2 2 strengthen 2 strength 38 1 4 3 2 2 g 4 1 2 strenuous 38 1 4 3 2 t 2 4 3 2 streets 2 streetcar 2 street 38 1 4 3 2 2 m 4 1 2 streak 38 1 4 3 2 2 4 3 2 streamside 2 streamline 2 stream 38 1 4 3 2 2 aenps 4 2 2 strewn 2 stretch 38 1 4 3 2 2 bintw 4 6 2 stray 2 Strauss 2 strap 2 straggle 2 strafe 2 straddle 38 1 4 3 2 2 4 3 2 strawflower 2 strawberry 2 straw 38 1 4 3 2 spher 2 4 2 2 stratospheric 2 stratosphere 38 1 4 3 2 2 4 2 2 strategist 2 strategic 38 1 4 3 2 g 2 i 4 1 2 strategy 38 1 4 3 2 2 4 2 2 stratagem 2 strata 38 1 4 3 2 2 aeo 4 4 2 stratum 2 Stratton 2 stratify 2 Stratford 38 1 4 3 2 2 4 3 2 strangulate 2 strangle 2 strange 38 1 4 3 2 2 g 4 1 2 strand 38 1 4 3 2 ht 2 4 5 2 straightway 2 straightforward 2 straighten 2 straightaway 2 straight 38 1 4 3 2 2 g 4 2 2 strait 2 strain 38 1 4 3 2 ism 2 4 2 2 strabismus 2 strabismic 38 1 4 3 2 2 aeiou 4 1 2 strychnine 38 1 4 3 2 2 4 2 2 stowaway 2 stowage 38 1 4 3 2 2 a 4 1 2 stow 38 1 4 3 2 2 4 3 2 storyteller 2 storyboard 2 story 38 1 4 3 2 2 4 3 2 stormy 2 stormbound 2 storm 38 1 4 3 2 2 4 5 2 Storey 2 storeroom 2 storekeep 2 storehouse 2 store 38 1 4 3 2 2 emy 4 2 2 stork 2 storage 38 1 4 3 2 2 4 7 2 stopwatch 2 stoppage 2 stopover 2 stopgap 2 stopcock 2 stopband 2 stop 38 1 4 3 2 2 4 4 2 stoop 2 stool 2 stooge 2 stood 38 1 4 3 2 2 w 4 3 2 Stonehenge 2 stonecrop 2 stone 38 1 4 3 2 2 4 2 2 stoneware 2 stonewall 38 1 4 3 2 2 a 4 1 2 stonewort 38 1 4 3 2 2 e 4 1 2 stony 38 1 4 3 2 2 4 2 2 stomp 2 stomach 38 1 4 3 2 2 4 2 2 stolen 2 stole 38 1 4 3 2 2 e 4 1 2 stolid 38 1 4 3 2 e 2 4 2 2 Stokes 2 stoke 38 1 4 3 2 c 2 4 2 2 stoichiometry 2 stoic 38 1 4 3 2 2 k 4 1 2 stochastic 38 1 4 3 2 ol 2 4 2 2 Stockholm 2 stockholder 38 1 4 3 2 2 h 4 7 2 stocky 2 Stockton 2 stockroom 2 stockpile 2 stockbroker 2 stockade 2 stock 38 1 4 3 2 2 ciklmnoprw 4 3 2 stove 2 stout 2 stodgy 38 1 4 3 2 2 4 3 2 stirrup 2 Stirling 2 stir 38 1 4 3 2 2 4 3 2 stipulate 2 stipple 2 stipend 38 1 4 3 2 2 4 3 2 stinky 2 stinkpot 2 stink 38 1 4 3 2 2 4 2 2 stingy 2 sting 38 1 4 3 2 2 gk 4 1 2 stint 38 1 4 3 2 2 t 4 1 2 stimulant 38 1 4 3 2 2 4 2 2 stimulatory 2 stimulate 38 1 4 3 2 ul 2 a 4 2 2 stimulus 2 stimuli 38 1 4 3 2 2 4 3 2 stillwater 2 stillbirth 2 still 38 1 4 3 2 2 4 2 2 stiletto 2 stile 38 1 4 3 2 2 el 4 1 2 stilt 38 1 4 3 2 ma 2 4 2 2 stigmata 2 stigma 38 1 4 3 2 2 4 2 2 stiffen 2 stiff 38 1 4 3 2 2 f 4 1 2 stifle 38 1 4 3 2 k 2 l 4 4 2 sticky 2 sticktight 2 stickpin 2 stick 38 1 4 3 2 e 2 4 2 2 stickleback 2 stickle 38 1 4 3 2 2 cfglmnpr 4 1 2 stitch 38 1 4 3 2 2 4 2 2 stewardess 2 steward 38 1 4 3 2 r 2 d 4 1 2 Stewart 38 1 4 3 2 2 a 4 1 2 stew 38 1 4 3 2 2 4 2 2 Stevenson 2 Stevens 38 1 4 3 2 2 s 4 1 2 Steven 38 1 4 3 2 e 2 n 4 2 2 stevedore 2 Steve 38 1 4 3 2 2 4 2 2 Stetson 2 stethoscope 38 1 4 3 2 2 4 5 2 sternum 2 Sterno 2 Sternberg 2 sternal 2 stern 38 1 4 3 2 o 2 4 3 2 stereoscopy 2 stereography 2 stereo 38 1 4 3 2 2 en 4 4 2 steroid 2 sterling 2 sterile 2 steradian 38 1 4 3 2 2 4 2 2 Stephenson 2 Stephens 38 1 4 3 2 n 2 s 4 1 2 Stephen 38 1 4 3 2 n 2 4 2 2 stephanotis 2 Stephanie 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 h 4 7 2 stepwise 2 stepson 2 steprelation 2 steppe 2 stepmother 2 stepchild 2 step 38 1 4 3 2 raph 2 4 2 2 stenography 2 stenographer 38 1 4 3 2 2 g 4 1 2 stenotype 38 1 4 3 2 2 4 2 2 stencil 2 stench 38 1 4 3 2 2 co 4 0 38 1 4 3 2 la 2 4 2 2 stellar 2 Stella 38 1 4 3 2 n 2 4 3 2 Steiner 2 Steinberg 2 stein 38 1 4 3 2 e 2 4 3 2 steeplechase 2 steeplebush 2 steeple 38 1 4 3 2 2 l 4 2 2 steepen 2 steep 38 1 4 3 2 2 4 4 2 steely 2 steelmake 2 Steele 2 steel 38 1 4 3 2 2 lp 4 4 2 steeve 2 steer 2 Steen 2 steed 38 1 4 3 2 2 dlmr 4 1 2 steak 38 1 4 3 2 2 4 3 2 Stearns 2 stearic 2 stearate 38 1 4 3 2 2 4 4 2 steaming 2 steamy 2 steamboat 2 steam 38 1 4 3 2 h 2 4 2 2 stealthy 2 stealth 38 1 4 3 2 2 t 4 1 2 steal 38 1 4 3 2 2 4 3 2 steady 2 steadfast 2 stead 38 1 4 3 2 2 aeilnprtvw 4 4 2 Steuben 2 stem 2 Stegosaurus 2 Stefan 38 1 4 3 2 2 4 3 2 stays 2 stayed 2 stay 38 1 4 3 2 2 4 2 2 Staunton 2 staunch 38 1 4 3 2 2 n 4 1 2 Stauffer 38 1 4 3 2 2 4 2 2 statutory 2 statute 38 1 4 3 2 2 4 2 2 statuette 2 statue 38 1 4 3 2 2 et 4 3 2 status 2 stature 2 statuary 38 1 4 3 2 r 2 4 2 2 stationary 2 stationarity 38 1 4 3 2 n 2 a 4 2 2 stationmaster 2 stationery 38 1 4 3 2 2 o 4 2 2 statistician 2 static 38 1 4 3 2 2 rs 4 4 2 stated 2 statewide 2 Staten 2 state 38 1 4 3 2 n 2 4 2 2 statesmanlike 2 statesman 38 1 4 3 2 2 m 4 1 2 states 38 1 4 3 2 2 4 2 2 stateroom 2 stater 38 1 4 3 2 2 eiu 4 2 2 stator 2 Statler 38 1 4 3 2 2 4 2 2 stasis 2 stash 38 1 4 3 2 2 4 2 2 starve 2 starvation 38 1 4 3 2 2 4 6 2 starts 2 starting 2 started 2 startup 2 startle 2 start 38 1 4 3 2 2 4 2 2 starling 2 starlight 38 1 4 3 2 2 i 4 1 2 starlet 38 1 4 3 2 2 4 2 2 Starkey 2 stark 38 1 4 3 2 h 2 4 2 2 starchy 2 starch 38 1 4 3 2 2 ckltv 4 8 2 starship 2 Starr 2 stargaze 2 starfish 2 stare 2 stardom 2 starboard 2 star 38 1 4 3 2 e 2 4 2 2 Stapleton 2 staple 38 1 4 3 2 2 4 2 2 staphylococcus 2 staph 38 1 4 3 2 2 hl 4 0 38 1 4 3 2 2 4 2 2 stannous 2 stannic 38 1 4 3 2 2 a 4 7 2 standstill 2 standpoint 2 standoff 2 Standish 2 standeth 2 standby 2 stand 38 1 4 3 2 2 4 2 2 stanchion 2 stanch 38 1 4 3 2 2 h 4 1 2 stance 38 1 4 3 2 2 cdn 4 7 2 stanza 2 Stanton 2 Stanley 2 stank 2 Stanhope 2 Stanford 2 Stan 38 1 4 3 2 2 4 2 2 stampede 2 stamp 38 1 4 3 2 na 2 4 2 2 staminate 2 stamina 38 1 4 3 2 2 ip 4 3 2 stammer 2 Stamford 2 stamen 38 1 4 3 2 2 4 2 2 stallion 2 stall 38 1 4 3 2 2 4 3 2 Staley 2 stalemate 2 stale 38 1 4 3 2 2 el 4 4 2 stalwart 2 stalk 2 Stalin 2 stalactite 38 1 4 3 2 2 4 2 2 stairwell 2 stairway 38 1 4 3 2 2 w 4 2 2 staircase 2 stair 38 1 4 3 2 2 r 4 2 2 stain 2 staid 38 1 4 3 2 a 2 4 2 2 stagnate 2 stagnant 38 1 4 3 2 2 4 3 2 stagestruck 2 stagecoach 2 stage 38 1 4 3 2 2 en 4 2 2 stagy 2 stag 38 1 4 3 2 f 2 4 2 2 Stafford 2 staff 38 1 4 3 2 i 2 4 2 2 stadium 2 stadia 38 1 4 3 2 2 4 3 2 Stacy 2 stack 2 staccato 38 1 4 3 2 2 l 4 2 2 stabile 2 stab 38 1 4 3 2 2 4 2 2 stablemen 2 stableman 38 1 4 3 2 e 2 m 4 1 2 stable 38 1 4 3 2 2 bcdfgilmnprstuy 4 3 2 stave 2 stake 2 Stahl 38 1 4 3 2 2 aeioruy 4 1 2 St 38 1 4 3 2 2 4 3 2 SSW 2 SST 2 SSE 38 1 4 3 2 2 4 2 2 squirmy 2 squirm 38 1 4 3 2 2 4 2 2 squirehood 2 squire 38 1 4 3 2 2 em 4 2 2 squirt 2 squirrel 38 1 4 3 2 2 r 4 5 2 squishy 2 squint 2 squill 2 squid 2 Squibb 38 1 4 3 2 2 4 2 2 squeeze 2 squeegee 38 1 4 3 2 2 k 4 2 2 squeamish 2 squeal 38 1 4 3 2 2 4 2 2 squeaky 2 squeak 38 1 4 3 2 2 ae 4 1 2 squelch 38 1 4 3 2 2 dlstw 4 4 2 square 2 squander 2 squamous 2 squabble 38 1 4 3 2 2 4 4 2 squawroot 2 squawk 2 squawbush 2 squaw 38 1 4 3 2 2 4 2 2 squatter 2 squatted 38 1 4 3 2 2 e 4 1 2 squatting 38 1 4 3 2 2 t 4 1 2 squat 38 1 4 3 2 h 2 4 3 2 squashy 2 squashberry 2 squash 38 1 4 3 2 2 4 2 2 squall 2 squalid 38 1 4 3 2 2 4 2 2 squadron 2 squad 38 1 4 3 2 u 2 aei 4 0 38 1 4 3 2 2 4 2 2 spyglass 2 spy 38 1 4 3 2 2 z 4 2 2 zigging 2 zig 38 1 4 3 2 2 4 2 2 sputter 2 sputnik 38 1 4 3 2 2 4 5 2 spurt 2 spurn 2 spurious 2 spurge 2 spur 38 1 4 3 2 2 4 2 2 spunk 2 spun 38 1 4 3 2 2 4 2 2 spumoni 2 spume 38 1 4 3 2 2 mnrt 4 1 2 spud 38 1 4 3 2 2 4 3 2 sprung 2 sprue 2 spruce 38 1 4 3 2 2 4 2 2 sprout 2 Sproul 38 1 4 3 2 2 u 4 1 2 sprocket 38 1 4 3 2 2 t 4 5 2 springy 2 Springfield 2 springe 2 springboard 2 spring 38 1 4 3 2 2 4 2 2 springtime 2 springtail 38 1 4 3 2 2 g 4 2 2 sprint 2 sprinkle 38 1 4 3 2 2 4 2 2 sprightly 2 sprig 38 1 4 3 2 2 gn 4 1 2 sprite 38 1 4 3 2 2 4 2 2 spree 2 spread 38 1 4 3 2 2 4 5 2 spray 2 sprawl 2 sprang 2 sprain 2 Sprague 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 spout 2 spouse 38 1 4 3 2 2 4 3 2 spotty 2 spotlight 2 spot 38 1 4 3 2 2 4 2 2 sportswriter 2 sportswrite 38 1 4 3 2 it 2 e 4 1 2 sportswriting 38 1 4 3 2 2 r 4 1 2 sportswear 38 1 4 3 2 2 4 2 2 sportsmen 2 sportsman 38 1 4 3 2 2 mw 4 0 38 1 4 3 2 2 s 4 2 2 sporty 2 sport 38 1 4 3 2 2 t 4 2 2 spore 2 sporadic 38 1 4 3 2 2 4 2 2 spoonful 2 spoon 38 1 4 3 2 2 4 2 2 spooky 2 spook 38 1 4 3 2 2 kn 4 2 2 spool 2 spoof 38 1 4 3 2 ane 2 4 2 2 spontaneous 2 spontaneity 38 1 4 3 2 2 4 2 2 spongy 2 sponge 38 1 4 3 2 2 gt 4 1 2 sponsor 38 1 4 3 2 2 4 2 2 spokesmen 2 spokesman 38 1 4 3 2 2 m 4 1 2 spokesperson 38 1 4 3 2 2 s 4 2 2 spoken 2 spoke 38 1 4 3 2 2 e 4 1 2 Spokane 38 1 4 3 2 l 2 4 2 2 spoilage 2 spoil 38 1 4 3 2 2 iknortu 4 0 38 1 4 3 2 2 4 2 2 splutter 2 splurge 38 1 4 3 2 tch 2 4 2 2 splotchy 2 splotch 38 1 4 3 2 2 4 2 2 splintery 2 splint 38 1 4 3 2 2 t 4 1 2 spline 38 1 4 3 2 2 n 4 2 2 split 2 splice 38 1 4 3 2 2 4 2 2 splenetic 2 splendid 38 1 4 3 2 n 2 4 2 2 spleenwort 2 spleen 38 1 4 3 2 2 en 4 0 38 1 4 3 2 2 sy 4 1 2 splat 38 1 4 3 2 2 4 2 2 splayed 2 splay 38 1 4 3 2 h 2 4 2 2 splashy 2 splash 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 spiteful 2 spite 38 1 4 3 2 2 e 4 4 2 spitz 2 spittle 2 spitfire 2 spit 38 1 4 3 2 t 2 4 2 2 spiritual 2 spirit 38 1 4 3 2 2 i 4 3 2 Spiro 2 spire 2 spiral 38 1 4 3 2 2 4 2 2 spinoff 2 spinodal 38 1 4 3 2 2 4 2 2 spinneret 2 spinnaker 38 1 4 3 2 2 4 2 2 spinal 2 spinach 38 1 4 3 2 2 ano 4 5 2 spiny 2 spinster 2 spine 2 spindle 2 spin 38 1 4 3 2 2 4 2 2 spilt 2 spill 38 1 4 3 2 2 4 2 2 spikenard 2 spike 38 1 4 3 2 2 e 4 1 2 spiky 38 1 4 3 2 er 2 4 3 2 spidery 2 spiderwort 2 spider 38 1 4 3 2 2 e 4 2 2 spicy 2 Spica 38 1 4 3 2 2 4 2 2 spicebush 2 spice 38 1 4 3 2 2 cdklnrt 4 2 2 spigot 2 Spiegel 38 1 4 3 2 id 2 4 2 2 spheroidal 2 spheroid 38 1 4 3 2 r 2 o 4 3 2 spherule 2 spheric 2 sphere 38 1 4 3 2 2 4 2 2 sphalerite 2 sphagnum 38 1 4 3 2 2 ae 4 1 2 sphinx 38 1 4 3 2 2 4 2 2 spermatophyte 2 sperm 38 1 4 3 2 2 4 2 2 Zurich 2 zucchini 38 1 4 3 2 ast 2 4 2 2 Zoroastrian 2 Zoroaster 38 1 4 3 2 2 o 4 1 2 Zorn 38 1 4 3 2 2 l 4 2 2 zoom 2 zoo 38 1 4 3 2 b 2 4 2 2 zombie 2 Zomba 38 1 4 3 2 iac 2 4 2 2 zodiacal 2 zodiac 38 1 4 3 2 2 dmor 4 3 2 zounds 2 zone 2 Zoe 38 1 4 3 2 2 noprg 4 3 2 Ziegler 2 Zimmerman 2 zilch 38 1 4 3 2 con 2 4 2 2 zirconium 2 zircon 38 1 4 3 2 2 4 2 2 zippy 2 zip 38 1 4 3 2 n 2 4 2 2 Zionism 2 Zion 38 1 4 3 2 2 4 2 2 zing 2 zinc 38 1 4 3 2 2 iouae 4 4 2 zygote 2 z's 2 zloty 2 z 38 1 4 3 2 2 m 4 1 2 Sperry 38 1 4 3 2 er 2 4 2 2 Spencerian 2 Spencer 38 1 4 3 2 2 cd 4 1 2 spent 38 1 4 3 2 l 2 4 3 2 spellcheck 2 spellbound 2 spell 38 1 4 3 2 2 4 6 2 speedy 2 speedwell 2 speedup 2 speedometer 2 speedboat 2 speed 38 1 4 3 2 2 d 4 1 2 speech 38 1 4 3 2 la 2 4 2 2 speculate 2 specular 38 1 4 3 2 cop 2 4 3 2 spectroscopy 2 spectroscopic 2 spectroscope 38 1 4 3 2 ra 2 p 4 1 2 spectrogram 38 1 4 3 2 h 2 4 2 2 spectrography 2 spectrograph 38 1 4 3 2 2 gs 4 2 2 spectrophotometer 2 spectrometer 38 1 4 3 2 2 4 2 2 spectral 2 spectra 38 1 4 3 2 2 ao 4 1 2 spectrum 38 1 4 3 2 2 c 4 1 2 spectator 38 1 4 3 2 2 4 2 2 spectacular 2 spectacle 38 1 4 3 2 2 ar 4 1 2 Spector 38 1 4 3 2 2 4 2 2 speckle 2 speck 38 1 4 3 2 2 i 4 1 2 specify 38 1 4 3 2 2 4 2 2 species 2 specie 38 1 4 3 2 2 ef 4 3 2 specious 2 specimen 2 special 38 1 4 3 2 2 iktu 4 1 2 spec 38 1 4 3 2 2 kr 4 0 38 1 4 3 2 2 4 3 2 spearmint 2 spearhead 2 spear 38 1 4 3 2 2 4 2 2 speakeasy 2 speak 38 1 4 3 2 2 acelnr 4 2 2 spew 2 sped 38 1 4 3 2 2 cnrsty 4 8 2 spawn 2 spavin 2 Spaulding 2 spalding 2 Spain 2 spaghetti 2 spade 2 spa 38 1 4 3 2 2 4 2 2 spayed 2 spay 38 1 4 3 2 2 4 6 2 spatula 2 spatterdock 2 spatlum 2 spatial 2 spate 2 spat 38 1 4 3 2 2 4 2 2 spastic 2 spasm 38 1 4 3 2 a 2 4 2 2 Spartan 2 Sparta 38 1 4 3 2 2 4 4 2 sparky 2 Sparkman 2 sparkle 2 spark 38 1 4 3 2 2 kt 4 6 2 sparse 2 sparrow 2 sparling 2 sparge 2 spare 2 spar 38 1 4 3 2 2 4 3 2 Spanish 2 spaniel 2 Spaniard 38 1 4 3 2 2 i 4 3 2 spangle 2 spandrel 2 span 38 1 4 3 2 2 s 4 3 2 spacetime 2 spacecraft 2 space 38 1 4 3 2 2 e 4 1 2 spacious 38 1 4 3 2 2 aehiloruy 4 0 38 1 4 3 2 2 4 3 2 soybean 2 soya 2 soy 38 1 4 3 2 2 4 3 2 sown 2 sowbelly 2 sow 38 1 4 3 2 reign 2 4 2 2 sovereignty 2 sovereign 38 1 4 3 2 2 ei 4 1 2 sovkhoz 38 1 4 3 2 st 2 4 2 2 southwestern 2 southwest 38 1 4 3 2 2 e 4 1 2 southward 38 1 4 3 2 n 2 4 2 2 southernmost 2 southern 38 1 4 3 2 st 2 4 2 2 southeastern 2 southeast 38 1 4 3 2 2 ar 4 1 2 Southey 38 1 4 3 2 2 ew 4 5 2 southpaw 2 southland 2 southbound 2 Southampton 2 south 38 1 4 3 2 2 h 4 1 2 soutane 38 1 4 3 2 2 c 4 4 2 sourwood 2 sourdough 2 sourberry 2 sour 38 1 4 3 2 d 2 4 3 2 sounds 2 soundproof 2 sound 38 1 4 3 2 2 4 2 2 soulful 2 soul 38 1 4 3 2 h 2 4 2 2 sought 2 sough 38 1 4 3 2 2 glnrt 4 5 2 souvenir 2 Sousa 2 soup 2 souffle 2 sou 38 1 4 3 2 2 4 3 2 sorted 2 sortie 2 sort 38 1 4 3 2 w 2 4 2 2 sorrowful 2 sorrow 38 1 4 3 2 2 o 4 2 2 sorry 2 sorrel 38 1 4 3 2 s 2 4 2 2 Sorenson 2 Sorensen 38 1 4 3 2 2 n 4 1 2 sore 38 1 4 3 2 2 ert 4 7 2 sorption 2 sorority 2 sorghum 2 sordid 2 sorcery 2 sorb 2 sora 38 1 4 3 2 or 2 4 2 2 sophomoric 2 sophomore 38 1 4 3 2 le 2 4 2 2 Sophocles 2 Sophoclean 38 1 4 3 2 2 cm 4 0 38 1 4 3 2 2 s 4 2 2 Sophie 2 Sophia 38 1 4 3 2 2 4 2 2 sophistry 2 sophisticate 38 1 4 3 2 2 t 4 1 2 sophism 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 h 4 2 2 soprano 2 sop 38 1 4 3 2 ay 2 4 2 2 soothsayer 2 soothsay 38 1 4 3 2 2 s 4 2 2 soothe 2 sooth 38 1 4 3 2 2 h 4 1 2 soot 38 1 4 3 2 2 t 4 1 2 soon 38 1 4 3 2 2 4 3 2 sonorous 2 sonority 2 Sonora 38 1 4 3 2 2 r 4 2 2 Sonoma 2 sonogram 38 1 4 3 2 2 4 2 2 sonny 2 sonnet 38 1 4 3 2 2 4 2 2 songbook 2 songbag 38 1 4 3 2 2 b 4 2 2 songful 2 song 38 1 4 3 2 2 4 3 2 sonata 2 sonar 2 sonant 38 1 4 3 2 2 agno 4 3 2 Sony 2 sonic 2 son 38 1 4 3 2 e 2 4 2 2 Sommerfeld 2 sommelier 38 1 4 3 2 h 2 4 2 2 somewhere 2 somewhat 38 1 4 3 2 2 i 4 1 2 something 38 1 4 3 2 2 4 3 2 Somerset 2 somersault 2 Somers 38 1 4 3 2 2 s 4 1 2 Somerville 38 1 4 3 2 ne 2 4 2 2 someone'll 2 someone 38 1 4 3 2 ody 2 4 2 2 somebody'll 2 somebody 38 1 4 3 2 2 bortw 4 4 2 someplace 2 somehow 2 someday 2 some 38 1 4 3 2 2 4 2 2 sombre 2 somber 38 1 4 3 2 2 l 4 2 2 somatic 2 soma 38 1 4 3 2 2 4 2 2 Somali 2 somal 38 1 4 3 2 2 abem 4 1 2 somnolent 38 1 4 3 2 2 4 2 2 solvent 2 solve 38 1 4 3 2 2 e 4 1 2 solvate 38 1 4 3 2 2 4 2 2 solution 2 solute 38 1 4 3 2 2 t 4 1 2 soluble 38 1 4 3 2 2 4 3 2 Solon 2 Solomon 2 solo 38 1 4 3 2 2 4 2 2 solitary 2 solitaire 38 1 4 3 2 2 a 4 2 2 solitude 2 soliton 38 1 4 3 2 2 i 4 3 2 solidus 2 solidarity 2 solid 38 1 4 3 2 it 2 o 4 3 2 solicitude 2 solicitation 2 solicit 38 1 4 3 2 2 4 2 2 solicitous 2 solicitor 38 1 4 3 2 2 cdt 4 2 2 solipsism 2 soliloquy 38 1 4 3 2 2 4 4 2 solenoid 2 solemn 2 solecism 2 sole 38 1 4 3 2 er 2 4 2 2 soldiery 2 soldier 38 1 4 3 2 2 i 4 2 2 solder 2 sold 38 1 4 3 2 2 4 2 2 solar 2 solace 38 1 4 3 2 2 adeiouv 4 2 2 solstice 2 Sol 38 1 4 3 2 2 4 3 2 soiree 2 soil 2 soignee 38 1 4 3 2 2 4 2 2 softwood 2 software 38 1 4 3 2 2 w 4 3 2 soften 2 softball 2 soft 38 1 4 3 2 2 t 4 3 2 Sofia 2 soffit 2 sofa 38 1 4 3 2 2 4 4 2 sodium 2 sodden 2 soda 2 sod 38 1 4 3 2 at 2 4 2 2 Socratic 2 Socrates 38 1 4 3 2 2 4 2 2 sockeye 2 socket 38 1 4 3 2 2 e 4 1 2 sock 38 1 4 3 2 2 4 3 2 sociometry 2 sociology 2 socioeconomic 38 1 4 3 2 t 2 4 3 2 society 2 Societe 2 societal 38 1 4 3 2 2 4 2 2 social 2 sociable 38 1 4 3 2 2 aeo 4 0 38 1 4 3 2 2 ikr 4 2 2 soccer 2 Soc 38 1 4 3 2 i 2 4 2 2 sobriquet 2 sobriety 38 1 4 3 2 2 r 4 2 2 sober 2 sob 38 1 4 3 2 2 4 2 2 soapsud 2 soapstone 38 1 4 3 2 2 s 4 2 2 soapy 2 soap 38 1 4 3 2 2 p 4 2 2 soar 2 soak 38 1 4 3 2 2 abcdfilmnopruvwy 4 3 2 sojourn 2 soggy 2 so 38 1 4 3 2 2 4 2 2 Snyder 2 snyaptic 38 1 4 3 2 l 2 4 2 2 snuggly 2 snuggle 38 1 4 3 2 2 g 4 1 2 snug 38 1 4 3 2 f 2 4 2 2 snuffle 2 snuff 38 1 4 3 2 2 fg 4 1 2 snub 38 1 4 3 2 2 4 2 2 snowflake 2 snowfall 38 1 4 3 2 2 f 4 4 2 snowy 2 snowstorm 2 snowball 2 snow 38 1 4 3 2 2 4 3 2 snort 2 snorkel 2 snore 38 1 4 3 2 2 4 2 2 snoopy 2 snoop 38 1 4 3 2 2 p 4 1 2 snook 38 1 4 3 2 2 b 4 1 2 snob 38 1 4 3 2 2 4 2 2 snobbish 2 snobbery 38 1 4 3 2 2 borw 4 2 2 snout 2 snotty 38 1 4 3 2 2 4 2 2 snippy 2 snippet 38 1 4 3 2 2 p 4 2 2 snipe 2 snip 38 1 4 3 2 2 4 2 2 sniffle 2 sniff 38 1 4 3 2 2 f 4 1 2 snifter 38 1 4 3 2 2 fp 4 4 2 snivel 2 snigger 2 Snider 2 snick 38 1 4 3 2 2 4 2 2 sneeze 2 sneer 38 1 4 3 2 k 2 4 2 2 sneaky 2 sneak 38 1 4 3 2 2 ae 4 1 2 snell 38 1 4 3 2 2 gkpr 4 5 2 snazzy 2 snatch 2 snail 2 snafu 2 snack 38 1 4 3 2 2 4 3 2 snarl 2 snark 2 snare 38 1 4 3 2 2 4 2 2 snappy 2 snappish 38 1 4 3 2 2 p 4 4 2 snapshot 2 snapdragon 2 snapback 2 snap 38 1 4 3 2 e 2 4 3 2 snakeroot 2 snakebird 2 snake 38 1 4 3 2 2 4 2 2 snagging 2 snag 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 4 2 2 Smythe 2 Smyrna 38 1 4 3 2 2 4 2 2 smutty 2 smut 38 1 4 3 2 2 4 2 2 smuggle 2 smug 38 1 4 3 2 g 2 4 2 2 smudgy 2 smudge 38 1 4 3 2 2 dgt 4 1 2 Smucker 38 1 4 3 2 h 2 4 2 2 smoothbore 2 smooth 38 1 4 3 2 2 t 4 1 2 smooch 38 1 4 3 2 2 s 4 2 2 smokehouse 2 smoke 38 1 4 3 2 2 4 2 2 smokestack 2 smokescreen 38 1 4 3 2 2 e 4 1 2 smoky 38 1 4 3 2 2 ko 4 3 2 smother 2 smolder 2 smog 38 1 4 3 2 2 4 5 2 smithy 2 Smithson 2 Smithfield 2 smithereens 2 smith 38 1 4 3 2 2 h 4 1 2 smitten 38 1 4 3 2 2 t 4 2 2 smirk 2 smile 38 1 4 3 2 2 l 4 1 2 smelt 38 1 4 3 2 2 l 4 1 2 smear 38 1 4 3 2 2 l 4 4 2 smattering 2 smash 2 smart 2 smack 38 1 4 3 2 l 2 e 4 4 2 smalltime 2 smallpox 2 smallish 2 small 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 4 3 2 slurry 2 slurp 2 slur 38 1 4 3 2 2 4 3 2 slump 2 slumber 2 slum 38 1 4 3 2 i 2 4 2 2 sluggish 2 slugging 38 1 4 3 2 2 g 4 1 2 slug 38 1 4 3 2 2 gmr 4 3 2 slung 2 sluice 2 sludge 38 1 4 3 2 2 4 2 2 slowdown 2 slow 38 1 4 3 2 n 2 4 2 2 Slovenia 2 sloven 38 1 4 3 2 2 e 4 1 2 Slovakia 38 1 4 3 2 2 4 2 2 slough 2 slouch 38 1 4 3 2 2 4 2 2 slothful 2 sloth 38 1 4 3 2 2 h 4 1 2 slot 38 1 4 3 2 2 4 3 2 sloppy 2 slope 2 slop 38 1 4 3 2 n 2 4 2 2 sloganeer 2 slogan 38 1 4 3 2 2 a 4 2 2 slogging 2 slog 38 1 4 3 2 n 2 4 2 2 Sloane 2 Sloan 38 1 4 3 2 2 agptuvw 4 5 2 slosh 2 sloop 2 sloe 2 Slocum 2 slob 38 1 4 3 2 er 2 4 2 2 slivery 2 sliver 38 1 4 3 2 2 4 2 2 slither 2 slit 38 1 4 3 2 2 4 2 2 slippery 2 slippage 38 1 4 3 2 2 p 4 1 2 slip 38 1 4 3 2 g 2 4 2 2 slingshot 2 sling 38 1 4 3 2 2 4 3 2 slimy 2 slime 2 slim 38 1 4 3 2 2 4 2 2 slide 2 slid 38 1 4 3 2 2 4 2 2 slick 2 slice 38 1 4 3 2 2 cdmnptvg 4 0 38 1 4 3 2 gh 2 4 2 2 sleight 2 sleigh 38 1 4 3 2 2 4 2 2 sleety 2 sleet 38 1 4 3 2 2 4 3 2 sleepy 2 sleepwalk 2 sleep 38 1 4 3 2 2 pt 4 2 2 sleeve 2 sleek 38 1 4 3 2 2 g 4 1 2 sled 38 1 4 3 2 e 2 4 2 2 sledgehammer 2 sledge 38 1 4 3 2 2 dei 4 4 2 slew 2 sleuth 2 slept 2 slender 38 1 4 3 2 2 cnptuv 4 8 2 slay 2 slash 2 slam 2 slake 2 slain 2 slag 2 sladang 2 slab 38 1 4 3 2 2 4 2 2 slavish 2 Slavic 38 1 4 3 2 2 4 2 2 slavery 2 slave 38 1 4 3 2 2 ei 4 2 2 Slavonic 2 Slav 38 1 4 3 2 ghter 2 4 2 2 slaughterhouse 2 slaughter 38 1 4 3 2 2 4 2 2 slater 2 slate 38 1 4 3 2 2 e 4 1 2 slat 38 1 4 3 2 2 4 2 2 slapstick 2 slap 38 1 4 3 2 er 2 4 2 2 slanderous 2 slander 38 1 4 3 2 2 d 4 2 2 slant 2 slang 38 1 4 3 2 k 2 4 2 2 slacken 2 slack 38 1 4 3 2 2 aeiou 4 1 2 sly 38 1 4 3 2 a 2 4 3 2 skyway 2 skywave 2 skyward 38 1 4 3 2 2 4 2 2 skyline 2 skylight 38 1 4 3 2 2 i 4 1 2 skylark 38 1 4 3 2 2 lw 4 6 2 skyscrape 2 skyrocket 2 skyjack 2 skyhook 2 Skye 2 sky 38 1 4 3 2 2 l 4 1 2 skulk 38 1 4 3 2 2 4 3 2 skullduggery 2 skullcap 2 skull 38 1 4 3 2 2 l 4 1 2 skunk 38 1 4 3 2 2 4 2 2 skittle 2 skit 38 1 4 3 2 2 4 2 2 skirt 2 skirmish 38 1 4 3 2 2 4 3 2 Skippy 2 skipjack 2 skip 38 1 4 3 2 2 4 3 2 skinny 2 skindive 2 skin 38 1 4 3 2 2 4 2 2 skimpy 2 skimp 38 1 4 3 2 2 p 4 2 2 skimmer 2 skim 38 1 4 3 2 l 2 4 3 2 skillful 2 skillet 2 skill 38 1 4 3 2 2 4 2 2 skiddy 2 skid 38 1 4 3 2 2 dlmnprt 4 2 2 skiff 2 ski 38 1 4 3 2 ch 2 4 4 2 sketchy 2 sketchpad 2 sketchbook 2 sketch 38 1 4 3 2 et 2 4 2 2 skeleton 2 skeletal 38 1 4 3 2 2 lt 4 3 2 skew 2 skeptic 2 skeet 38 1 4 3 2 t 2 e 4 1 2 skat 38 1 4 3 2 2 4 2 2 skater 2 skate 38 1 4 3 2 2 aeiuy 4 1 2 Skopje 38 1 4 3 2 2 e 4 1 2 sizzle 38 1 4 3 2 en 2 4 2 2 sixteenth 2 sixteen 38 1 4 3 2 2 e 4 3 2 sixty 2 sixtieth 2 sixth 38 1 4 3 2 2 t 4 3 2 sixgun 2 sixfold 2 six 38 1 4 3 2 2 a 4 2 2 situs 2 situ 38 1 4 3 2 2 u 4 2 2 site 2 sit 38 1 4 3 2 ph 2 4 2 2 Sisyphus 2 Sisyphean 38 1 4 3 2 2 4 2 2 Sistine 2 sister 38 1 4 3 2 2 ty 4 3 2 siskin 2 sisal 2 sis 38 1 4 3 2 2 4 2 2 siren 2 sire 38 1 4 3 2 2 e 4 3 2 sirs 2 Sirius 2 sir 38 1 4 3 2 id 2 4 2 2 sinusoidal 2 sinusoid 38 1 4 3 2 2 o 4 1 2 sinus 38 1 4 3 2 2 s 4 1 2 sinuous 38 1 4 3 2 2 4 2 2 sinkhole 2 sink 38 1 4 3 2 st 2 4 2 2 sinistral 2 sinister 38 1 4 3 2 2 4 2 2 singleton 2 singlet 38 1 4 3 2 e 2 t 4 2 2 singlehanded 2 single 38 1 4 3 2 2 4 2 2 Singapore 2 singable 38 1 4 3 2 2 al 4 4 2 singular 2 singsong 2 singe 2 sing 38 1 4 3 2 2 4 2 2 sinewy 2 sinew 38 1 4 3 2 2 w 4 1 2 sine 38 1 4 3 2 2 r 4 1 2 since 38 1 4 3 2 2 e 4 1 2 Sinclair 38 1 4 3 2 2 cegiku 4 5 2 sinter 2 sinh 2 sinful 2 Sinai 2 sin 38 1 4 3 2 ane 2 4 2 2 simultaneous 2 simultaneity 38 1 4 3 2 l 2 t 4 2 2 simulcast 2 simulate 38 1 4 3 2 i 2 4 2 2 simplicity 2 simplicial 38 1 4 3 2 2 cf 4 1 2 simplistic 38 1 4 3 2 2 4 5 2 simplex 2 simpleton 2 simpleminded 2 simplectic 2 simple 38 1 4 3 2 2 ei 4 1 2 simply 38 1 4 3 2 2 l 4 2 2 Simpson 2 simper 38 1 4 3 2 n 2 4 2 2 Simonson 2 Simon 38 1 4 3 2 2 4 2 2 Simmons 2 simmer 38 1 4 3 2 l 2 4 3 2 similitude 2 simile 2 similar 38 1 4 3 2 2 imopu 4 2 2 Sims 2 sima 38 1 4 3 2 er 2 4 5 2 silvery 2 silverware 2 silversmith 2 Silverman 2 silver 38 1 4 3 2 2 4 4 2 silty 2 siltstone 2 siltation 2 silt 38 1 4 3 2 2 4 2 2 silly 2 sill 38 1 4 3 2 2 4 4 2 silky 2 silkworm 2 silken 2 silk 38 1 4 3 2 n 2 4 2 2 silicone 2 silicon 38 1 4 3 2 2 4 2 2 silicide 2 silicic 38 1 4 3 2 2 4 2 2 silicate 2 silica 38 1 4 3 2 c 2 aio 4 1 2 siliceous 38 1 4 3 2 2 4 3 2 Silas 2 silane 2 silage 38 1 4 3 2 2 aikltv 4 3 2 silo 2 silhouette 2 silent 38 1 4 3 2 r 2 4 2 2 Signora 2 Signor 38 1 4 3 2 f 2 4 2 2 signify 2 significant 38 1 4 3 2 2 4 2 2 signature 2 signal 38 1 4 3 2 2 aio 4 4 2 signpost 2 signet 2 signboard 2 sign 38 1 4 3 2 2 4 2 2 Sigmund 2 sigma 38 1 4 3 2 2 t 4 1 2 sigh 38 1 4 3 2 ee 2 4 3 2 sightseer 2 sightseeing 2 sightsee 38 1 4 3 2 2 s 4 1 2 sight 38 1 4 3 2 2 hmn 4 0 38 1 4 3 2 2 4 2 2 sienna 2 Siena 38 1 4 3 2 2 e 4 3 2 Siegmund 2 Sieglinda 2 Siegfried 38 1 4 3 2 2 4 2 2 Siegel 2 siege 38 1 4 3 2 2 gn 4 4 2 sieve 2 siesta 2 sierra 2 Siemens 38 1 4 3 2 2 blmrsw 4 4 2 sidetrack 2 sidecar 2 sidearm 2 side 38 1 4 3 2 2 4 2 2 sidewise 2 sidewinder 38 1 4 3 2 2 l 4 1 2 sideway 38 1 4 3 2 2 4 2 2 sidewall 2 sidewalk 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 ep 2 4 2 2 sidestepping 2 sidestep 38 1 4 3 2 2 t 4 2 2 sideshow 2 sidesaddle 38 1 4 3 2 2 4 2 2 siderite 2 sidereal 38 1 4 3 2 2 4 2 2 sidemen 2 sideman 38 1 4 3 2 2 4 2 2 sideline 2 sidelight 38 1 4 3 2 2 i 4 1 2 sidelong 38 1 4 3 2 2 4 2 2 sideboard 2 sideband 38 1 4 3 2 2 e 4 2 2 Sidney 2 sidle 38 1 4 3 2 e 2 4 2 2 sicklewort 2 sickle 38 1 4 3 2 2 l 4 4 2 sickroom 2 sickish 2 sicken 2 sick 38 1 4 3 2 l 2 4 2 2 Sicily 2 Sicilian 38 1 4 3 2 2 ik 4 1 2 sic 38 1 4 3 2 2 4 2 2 sibling 2 Sibley 38 1 4 3 2 2 l 4 4 2 sibyl 2 sibilant 2 Siberia 2 sib 38 1 4 3 2 2 m 4 2 2 Sian 2 sial 38 1 4 3 2 2 4 2 2 Siamese 2 SIAM 38 1 4 3 2 2 abcdeglmnrstxz 4 5 2 siva 2 sip 2 Sioux 2 Sikorsky 2 sift 38 1 4 3 2 2 4 2 2 Shylock 2 shy 38 1 4 3 2 le 2 4 2 2 shuttlecock 2 shuttle 38 1 4 3 2 2 4 2 2 shutout 2 shutoff 38 1 4 3 2 2 ot 4 2 2 shutdown 2 shut 38 1 4 3 2 2 4 2 2 shunt 2 shun 38 1 4 3 2 fle 2 4 2 2 shuffleboard 2 shuffle 38 1 4 3 2 der 2 4 2 2 shuddery 2 shudder 38 1 4 3 2 2 dfnt 4 3 2 Shulman 2 shuck 2 Shu 38 1 4 3 2 k 2 4 2 2 shrunken 2 shrunk 38 1 4 3 2 2 4 2 2 shrugging 2 shrug 38 1 4 3 2 2 4 2 2 shrubbery 2 shrub 38 1 4 3 2 2 bgn 4 0 38 1 4 3 2 2 4 2 2 shrove 2 shroud 38 1 4 3 2 e 2 4 2 2 shrivel 2 shrive 38 1 4 3 2 2 4 2 2 shrinkage 2 shrink 38 1 4 3 2 2 k 4 1 2 shrine 38 1 4 3 2 l 2 4 2 2 shrilly 2 shrill 38 1 4 3 2 2 lnv 4 4 2 shrimp 2 shrike 2 shrift 2 shriek 38 1 4 3 2 2 4 3 2 shrewish 2 shrewd 2 shrew 38 1 4 3 2 2 w 4 2 2 Shreveport 2 shred 38 1 4 3 2 2 4 2 2 shrapnel 2 shrank 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 showplace 2 showpiece 38 1 4 3 2 2 4 2 2 showmen 2 showman 38 1 4 3 2 2 mp 4 7 2 showy 2 showroom 2 shown 2 showdown 2 showcase 2 showboat 2 show 38 1 4 3 2 e 2 4 2 2 shovel 2 shove 38 1 4 3 2 d 2 4 3 2 shouldn't 2 shoulder 2 should 38 1 4 3 2 2 l 4 1 2 shout 38 1 4 3 2 2 4 3 2 shotgun 2 shotbush 2 shot 38 1 4 3 2 2 4 2 2 shortstop 2 shortsighted 38 1 4 3 2 2 4 2 2 shortcut 2 shortcoming 38 1 4 3 2 2 cse 4 5 2 shortish 2 shorthand 2 shortfall 2 shortage 2 short 38 1 4 3 2 2 4 2 2 shoreline 2 shore 38 1 4 3 2 2 et 4 0 38 1 4 3 2 2 4 3 2 shopworn 2 shopkeep 2 shop 38 1 4 3 2 2 4 4 2 shoot 2 shook 2 shoofly 2 shoo 38 1 4 3 2 2 4 5 2 shoestring 2 shoemake 2 shoelace 2 shoehorn 2 shoe 38 1 4 3 2 2 4 2 2 shoddy 2 shod 38 1 4 3 2 k 2 4 2 2 Shockley 2 shock 38 1 4 3 2 2 cdeoprtuvw 4 3 2 shone 2 shoji 2 shoal 38 1 4 3 2 r 2 4 2 2 shivery 2 shiver 38 1 4 3 2 2 e 4 1 2 shiv 38 1 4 3 2 2 4 2 2 shirtmake 2 shirt 38 1 4 3 2 2 t 4 3 2 Shirley 2 shirk 2 shire 38 1 4 3 2 2 4 2 2 shipmate 2 shipman 38 1 4 3 2 2 a 4 1 2 shipmen 38 1 4 3 2 2 4 2 2 Shipley 2 shiplap 38 1 4 3 2 ild 2 4 2 2 shipbuilding 2 shipbuild 38 1 4 3 2 2 u 4 1 2 shipboard 38 1 4 3 2 2 blm 4 4 2 shipyard 2 shipwreck 2 shipshape 2 ship 38 1 4 3 2 2 4 6 2 shiny 2 Shinto 2 shingle 2 shine 2 shinbone 2 shin 38 1 4 3 2 2 4 2 2 shimmy 2 shim 38 1 4 3 2 2 4 2 2 Shiloh 2 shill 38 1 4 3 2 t 2 4 2 2 shifty 2 shift 38 1 4 3 2 2 flmnprv 4 4 2 shitepoke 2 shish 2 shield 2 shibboleth 38 1 4 3 2 2 4 2 2 Sherwood 2 Sherwin 38 1 4 3 2 2 4 2 2 sherry 2 Sherrill 38 1 4 3 2 2 4 2 2 sheriff 2 Sheridan 38 1 4 3 2 2 irw 4 4 2 Sherman 2 Sherlock 2 sherbet 2 Sheraton 38 1 4 3 2 2 4 3 2 Sheppard 2 shepherd 2 Shepard 38 1 4 3 2 an 2 4 2 2 shenanigan 2 Shenandoah 38 1 4 3 2 2 4 2 2 Shelton 2 shelter 38 1 4 3 2 2 4 2 2 Shelley 2 shell 38 1 4 3 2 2 4 2 2 she'll 2 she'd 38 1 4 3 2 2 lt 4 4 2 shelve 2 shelf 2 Sheldon 2 Shelby 38 1 4 3 2 2 4 2 2 Sheila 2 sheik 38 1 4 3 2 2 4 2 2 sheepskin 2 sheep 38 1 4 3 2 2 p 4 4 2 sheet 2 sheer 2 sheen 2 Sheehan 38 1 4 3 2 2 4 2 2 Shedir 2 shed 38 1 4 3 2 h 2 4 2 2 sheathe 2 sheath 38 1 4 3 2 2 4 2 2 Shearer 2 shear 38 1 4 3 2 2 rt 4 3 2 sheave 2 sheaf 2 Shea 38 1 4 3 2 2 adeil'npr 4 2 2 Sheffield 2 she 38 1 4 3 2 2 cdfgklmnprtvw 4 4 2 shay 2 Shasta 2 shah 2 shabby 38 1 4 3 2 2 4 3 2 Shawnee 2 shawl 2 shaw 38 1 4 3 2 e 2 4 2 2 shaven 2 shave 38 1 4 3 2 r 2 4 2 2 shatterproof 2 shatter 38 1 4 3 2 t 2 e 4 1 2 Shattuck 38 1 4 3 2 2 4 2 2 sharpen 2 Sharpe 38 1 4 3 2 2 e 4 2 2 sharpshoot 2 sharp 38 1 4 3 2 2 4 4 2 shares 2 shareholder 2 sharecrop 2 share 38 1 4 3 2 2 ep 4 4 2 Sharon 2 shark 2 Shari 2 shard 38 1 4 3 2 2 4 2 2 Shapiro 2 shape 38 1 4 3 2 2 4 2 2 shanty 2 Shantung 38 1 4 3 2 2 t 4 4 2 shan't 2 Shannon 2 shank 2 Shanghai 38 1 4 3 2 2 4 2 2 shameful 2 shameface 38 1 4 3 2 2 f 4 1 2 shame 38 1 4 3 2 2 e 4 4 2 shamrock 2 shampoo 2 shamble 2 sham 38 1 4 3 2 2 4 2 2 shallow 2 shallot 38 1 4 3 2 2 o 4 1 2 shall 38 1 4 3 2 2 l 4 2 2 shalom 2 shale 38 1 4 3 2 2 s 4 4 2 shaken 2 shakedown 2 shakeable 2 shake 38 1 4 3 2 2 4 2 2 Shakespearean 2 Shakespeare 38 1 4 3 2 pear 2 e 4 1 2 Shakespearian 38 1 4 3 2 2 e 4 2 2 shaky 2 shako 38 1 4 3 2 2 4 2 2 shaggy 2 shagging 38 1 4 3 2 2 g 4 2 2 shagbark 2 shag 38 1 4 3 2 2 4 3 2 shaft 2 Shaffer 2 Shafer 38 1 4 3 2 w 2 4 2 2 shadowy 2 shadow 38 1 4 3 2 2 o 4 5 2 shady 2 shadflower 2 shade 2 shadbush 2 shad 38 1 4 3 2 k 2 4 2 2 shackle 2 shack 38 1 4 3 2 2 aeioruy 4 1 2 Shmuel 38 1 4 3 2 ple 2 4 2 2 sextuplet 2 sextuple 38 1 4 3 2 2 u 4 4 2 sexton 2 sextillion 2 sextet 2 Sextans 38 1 4 3 2 2 t 4 3 2 sexy 2 sexual 2 sex 38 1 4 3 2 2 4 2 2 Seward 2 sewage 38 1 4 3 2 2 a 4 3 2 sewn 2 sewerage 2 sew 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 l 2 4 3 2 severalty 2 severalfold 2 several 38 1 4 3 2 2 ae 4 2 2 Severn 2 sever 38 1 4 3 2 2 t 4 2 2 sevenfold 2 seven 38 1 4 3 2 en 2 4 2 2 seventeenth 2 seventeen 38 1 4 3 2 2 e 4 3 2 seventy 2 seventieth 2 seventh 38 1 4 3 2 2 e 4 1 2 Seville 38 1 4 3 2 2 t 4 6 2 setup 2 setscrew 2 Seton 2 Seth 2 setback 2 set 38 1 4 3 2 2 4 2 2 session 2 sesame 38 1 4 3 2 2 4 2 2 servomechanism 2 servo 38 1 4 3 2 e 2 m 4 3 2 serviceberry 2 serviceable 2 service 38 1 4 3 2 2 4 2 2 servicemen 2 serviceman 38 1 4 3 2 2 c 4 3 2 servitor 2 servile 2 serviette 38 1 4 3 2 2 ioe 4 1 2 servant 38 1 4 3 2 2 4 2 2 serpentine 2 serpent 38 1 4 3 2 en 2 t 4 1 2 Serpens 38 1 4 3 2 2 4 2 2 seriatim 2 serial 38 1 4 3 2 2 a 4 4 2 serious 2 serine 2 serif 2 series 38 1 4 3 2 e 2 4 3 2 Sergei 2 sergeant 2 serge 38 1 4 3 2 ipit 2 4 2 2 serendipity 2 serendipitous 38 1 4 3 2 n 2 d 4 2 2 serene 2 serenade 38 1 4 3 2 2 p 4 2 2 seraglio 2 sera 38 1 4 3 2 2 4 2 2 seraphim 2 serape 38 1 4 3 2 2 aegipv 4 5 2 serum 2 serology 2 sermon 2 serf 2 Serbia 38 1 4 3 2 2 4 2 2 sequitur 2 sequin 38 1 4 3 2 2 ns 4 1 2 sequel 38 1 4 3 2 t 2 4 2 2 sequestration 2 sequester 38 1 4 3 2 t 2 4 2 2 sequential 2 sequent 38 1 4 3 2 2 ei 4 1 2 Sequoia 38 1 4 3 2 2 u 4 1 2 seq 38 1 4 3 2 2 4 2 2 sepulchral 2 sepuchral 38 1 4 3 2 2 4 2 2 septum 2 septuagenarian 38 1 4 3 2 2 4 2 2 septillion 2 septic 38 1 4 3 2 2 4 2 2 septennial 2 September 38 1 4 3 2 2 4 2 2 septate 2 septa 38 1 4 3 2 2 aeiu 4 1 2 sept 38 1 4 3 2 2 r 4 1 2 sepal 38 1 4 3 2 a 2 4 2 2 separate 2 separable 38 1 4 3 2 2 atu 4 2 2 Sepoy 2 sepia 38 1 4 3 2 2 4 3 2 sentinel 2 sentiment 2 sentient 38 1 4 3 2 n 2 4 2 2 sentential 2 sentence 38 1 4 3 2 2 ei 4 2 2 sentry 2 sent 38 1 4 3 2 2 4 2 2 sensuous 2 sensual 38 1 4 3 2 r 2 4 2 2 sensory 2 sensor 38 1 4 3 2 2 4 2 2 sensitive 2 sensible 38 1 4 3 2 2 iou 4 2 2 sense 2 sensate 38 1 4 3 2 r 2 4 3 2 senorita 2 Senora 2 senor 38 1 4 3 2 2 4 2 2 senior 2 senile 38 1 4 3 2 2 4 2 2 Senegal 2 Seneca 38 1 4 3 2 t 2 4 2 2 senatorial 2 senate 38 1 4 3 2 2 aeiostd 4 1 2 sen 38 1 4 3 2 2 4 2 2 Semitic 2 Semite 38 1 4 3 2 2 r 4 1 2 seminal 38 1 4 3 2 2 4 3 2 seminary 2 seminarian 2 seminar 38 1 4 3 2 2 a 4 1 2 Seminole 38 1 4 3 2 2 nt 4 2 2 Semiramis 2 semi 38 1 4 3 2 2 4 2 2 semaphore 2 semantic 38 1 4 3 2 2 ai 4 3 2 semper 2 semester 2 semblance 38 1 4 3 2 2 4 4 2 sells 2 selling 2 sellout 2 sell 38 1 4 3 2 2 4 4 2 Selfridge 2 selfish 2 selfadjoint 2 self 38 1 4 3 2 2 4 2 2 selenium 2 selenite 38 1 4 3 2 2 4 2 2 selenate 2 Selena 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 t 2 m 4 3 2 Selectric 2 selector 2 select 38 1 4 3 2 2 4 2 2 selectmen 2 selectman 38 1 4 3 2 2 cn 4 0 38 1 4 3 2 2 efl 4 6 2 Selwyn 2 selves 2 seltzer 2 Selma 2 Selkirk 2 seldom 38 1 4 3 2 2 4 2 2 seizure 2 seize 38 1 4 3 2 raph 2 4 2 2 seismography 2 seismograph 38 1 4 3 2 2 g 4 1 2 seismology 38 1 4 3 2 m 2 o 4 1 2 seismic 38 1 4 3 2 2 sz 4 1 2 Seidel 38 1 4 3 2 ega 2 4 2 2 segregate 2 segregant 38 1 4 3 2 ent 2 4 2 2 segmentation 2 segment 38 1 4 3 2 2 mr 4 2 2 Segundo 2 Segovia 38 1 4 3 2 2 4 2 2 seepage 2 seep 38 1 4 3 2 2 4 4 2 seedy 2 seedling 2 seedbed 2 seed 38 1 4 3 2 2 dpm 4 7 2 seethe 2 seersucker 2 seen 2 seek 2 seeing 2 seeable 2 see 38 1 4 3 2 2 t 4 1 2 seduce 38 1 4 3 2 i 2 4 2 2 seductive 2 seduction 38 1 4 3 2 2 c 4 1 2 sedulous 38 1 4 3 2 io 2 4 2 2 seditious 2 sedition 38 1 4 3 2 ent 2 a 4 1 2 sediment 38 1 4 3 2 2 4 2 2 sedimentation 2 sedimentary 38 1 4 3 2 2 mt 4 0 38 1 4 3 2 2 4 2 2 seder 2 sedentary 38 1 4 3 2 2 4 2 2 sedate 2 sedan 38 1 4 3 2 2 aeiu 4 1 2 sedge 38 1 4 3 2 2 r 4 1 2 secular 38 1 4 3 2 2 4 4 2 sector 2 section 2 sectarian 2 sect 38 1 4 3 2 2 4 2 2 secretive 2 secretion 38 1 4 3 2 a 2 4 2 2 secretariat 2 secretarial 38 1 4 3 2 r 2 i 4 1 2 secretary 38 1 4 3 2 2 ai 4 2 2 secrete 2 secret 38 1 4 3 2 e 2 t 4 1 2 secrecy 38 1 4 3 2 nd 2 4 4 2 seconds 2 secondhand 2 secondary 2 second 38 1 4 3 2 u 2 4 2 2 seclusion 2 seclude 38 1 4 3 2 2 4 2 2 secession 2 secede 38 1 4 3 2 2 elortu 4 2 2 secant 2 sec 38 1 4 3 2 2 4 2 2 seaweed 2 seaward 38 1 4 3 2 2 4 3 2 Seattle 2 seater 2 seat 38 1 4 3 2 n 2 4 2 2 seasonal 2 season 38 1 4 3 2 2 o 4 2 2 seaside 2 seashore 38 1 4 3 2 h 2 4 3 2 searching 2 searchlight 2 search 38 1 4 3 2 2 c 4 1 2 sear 38 1 4 3 2 2 4 2 2 seance 2 Sean 38 1 4 3 2 2 4 5 2 seamy 2 seamstress 2 seamen 2 seaman 2 seam 38 1 4 3 2 2 4 2 2 sealant 2 seal 38 1 4 3 2 2 4 2 2 seagull 2 Seagram 38 1 4 3 2 2 4 2 2 seafood 2 seafare 38 1 4 3 2 2 fglmnrstw 4 6 2 seaquake 2 seaport 2 seahorse 2 seacoast 2 seaboard 2 sea 38 1 4 3 2 2 acdegilmnpqrstvwx 4 4 2 Seymour 2 Seoul 2 Sebastian 2 SE 38 1 4 3 2 h 2 4 2 2 Scythia 2 scythe 38 1 4 3 2 2 t 4 1 2 Scylla 38 1 4 3 2 2 4 2 2 scutum 2 scuttle 38 1 4 3 2 2 4 2 2 scurry 2 scurrilous 38 1 4 3 2 2 r 4 1 2 scurvy 38 1 4 3 2 r 2 4 2 2 sculpture 2 sculptural 38 1 4 3 2 2 u 4 2 2 sculptor 2 sculpt 38 1 4 3 2 2 t 4 1 2 sculpin 38 1 4 3 2 2 p 4 1 2 scull 38 1 4 3 2 f 2 4 2 2 scuffle 2 scuff 38 1 4 3 2 2 flrt 4 3 2 scum 2 scud 2 scuba 38 1 4 3 2 2 4 2 2 scrutiny 2 scrutable 38 1 4 3 2 lo 2 4 2 2 scrupulous 2 scrupulosity 38 1 4 3 2 2 u 4 1 2 scruple 38 1 4 3 2 2 pt 4 3 2 scruffy 2 scrumptious 2 scrub 38 1 4 3 2 2 l 4 3 2 scrounge 2 scrotum 2 scrooge 38 1 4 3 2 r 2 4 2 2 scripture 2 scriptural 38 1 4 3 2 2 u 4 2 2 scription 2 script 38 1 4 3 2 2 t 4 1 2 Scripps 38 1 4 3 2 2 4 2 2 scrimmage 2 scrim 38 1 4 3 2 2 4 3 2 Scribners 2 scribe 2 scribble 38 1 4 3 2 2 bmp 4 1 2 scriven 38 1 4 3 2 2 4 2 2 screwbean 2 screwball 38 1 4 3 2 2 b 4 3 2 screwworm 2 screwdriver 2 screw 38 1 4 3 2 2 4 2 2 screenplay 2 screen 38 1 4 3 2 h 2 4 2 2 screechy 2 screech 38 1 4 3 2 2 cn 4 1 2 screed 38 1 4 3 2 2 ew 4 1 2 scream 38 1 4 3 2 2 mptw 4 3 2 Scranton 2 scraggly 2 scrabble 38 1 4 3 2 2 4 2 2 scrawny 2 scrawl 38 1 4 3 2 ch 2 4 2 2 scratchy 2 scratch 38 1 4 3 2 2 4 3 2 scrape 2 scrapbook 2 scrap 38 1 4 3 2 2 4 2 2 scramble 2 scram 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 scourge 2 scour 38 1 4 3 2 2 r 4 2 2 scout 2 scoundrel 38 1 4 3 2 2 4 4 2 Scotty 2 Scottsdale 2 Scottish 2 Scott 38 1 4 3 2 m 2 4 2 2 Scotsmen 2 Scotsman 38 1 4 3 2 2 st 4 4 2 Scotland 2 Scotia 2 scotch 2 Scot 38 1 4 3 2 io 2 4 2 2 scorpion 2 Scorpio 38 1 4 3 2 2 4 2 2 scornful 2 scorn 38 1 4 3 2 2 4 3 2 scorecard 2 scoreboard 2 score 38 1 4 3 2 2 enp 4 2 2 scoria 2 scorch 38 1 4 3 2 2 4 3 2 scops 2 scopic 2 scope 38 1 4 3 2 2 4 2 2 scoot 2 scoop 38 1 4 3 2 2 oprtu 4 3 2 scowl 2 scold 2 scoff 38 1 4 3 2 ero 2 4 2 2 sclerotic 2 sclerosis 38 1 4 3 2 i 2 4 2 2 scientist 2 scientific 38 1 4 3 2 n 2 t 4 1 2 science 38 1 4 3 2 2 e 4 6 2 scissor 2 scion 2 scintillate 2 scimitar 2 sciatica 2 Sci 38 1 4 3 2 2 4 2 2 Schwartz 2 Schwab 38 1 4 3 2 2 a 4 1 2 Schweitzer 38 1 4 3 2 l 2 4 2 2 Schuylkill 2 Schuyler 38 1 4 3 2 a 2 4 2 2 Schumann 2 Schumacher 38 1 4 3 2 2 4 2 2 Schulz 2 Schultz 38 1 4 3 2 2 lmy 4 2 2 Schuster 2 Schubert 38 1 4 3 2 oed 2 4 2 2 Schroedinger 2 Schroeder 38 1 4 3 2 2 bgm 4 5 2 schoolwork 2 schoolteacher 2 schoolroom 2 schoolhouse 2 school 38 1 4 3 2 a 2 4 3 2 schoolmate 2 schoolmaster 2 schoolmarm 38 1 4 3 2 irl 2 4 2 2 schoolgirlish 2 schoolgirl 38 1 4 3 2 o 2 4 2 2 schoolboy 2 schoolbook 38 1 4 3 2 2 l 4 1 2 schooner 38 1 4 3 2 a 2 4 2 2 scholastic 2 scholar 38 1 4 3 2 2 lo 4 3 2 Schottky 2 Schofield 2 Schoenberg 38 1 4 3 2 2 4 2 2 schnapps 2 Schnabel 38 1 4 3 2 2 a 4 1 2 Schneider 38 1 4 3 2 i 2 4 2 2 Schmitt 2 Schmidt 38 1 4 3 2 2 4 2 2 Schlitz 2 schlieren 38 1 4 3 2 2 i 4 2 2 Schloss 2 Schlesinger 38 1 4 3 2 hreni 2 4 2 2 schizophrenic 2 schizophrenia 38 1 4 3 2 o 2 p 4 2 2 schizomycetes 2 schizoid 38 1 4 3 2 2 4 2 2 schist 2 schism 38 1 4 3 2 2 sz 4 1 2 Schiller 38 1 4 3 2 2 t 4 1 2 schema 38 1 4 3 2 2 4 2 2 schematic 2 schemata 38 1 4 3 2 2 a 4 1 2 scheme 38 1 4 3 2 2 m 4 4 2 scherzo 2 Schenectady 2 schelling 2 schedule 38 1 4 3 2 2 4 3 2 Schantz 2 Schafer 2 Schaefer 38 1 4 3 2 2 aeilmnoruw 4 0 38 1 4 3 2 2 e 4 3 2 scent 2 scenic 2 scenario 38 1 4 3 2 2 4 2 2 scenery 2 scene 38 1 4 3 2 2 n 4 1 2 sceptic 38 1 4 3 2 er 2 4 2 2 scattergun 2 scatterbrain 38 1 4 3 2 2 t 4 2 2 scathe 2 scat 38 1 4 3 2 2 4 2 2 scarlet 2 Scarlatti 38 1 4 3 2 2 4 2 2 scarface 2 scarf 38 1 4 3 2 2 4 2 2 scarecrow 2 scare 38 1 4 3 2 2 efl 4 7 2 scary 2 scarves 2 Scarsdale 2 scarify 2 scarce 2 Scarborough 2 scar 38 1 4 3 2 la 2 4 2 2 scapular 2 scapula 38 1 4 3 2 2 u 4 1 2 scapegoat 38 1 4 3 2 2 4 2 2 scanty 2 scant 38 1 4 3 2 2 4 2 2 scandium 2 Scandinavia 38 1 4 3 2 l 2 4 2 2 scandalous 2 scandal 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 2 dt 4 1 2 scan 38 1 4 3 2 2 4 2 2 scamp 2 scam 38 1 4 3 2 2 4 2 2 scalar 2 Scala 38 1 4 3 2 2 a 4 4 2 scalp 2 scallop 2 scale 2 scald 38 1 4 3 2 2 4 4 2 scabrous 2 scabious 2 scabbard 2 scab 38 1 4 3 2 2 blmnprt 4 3 2 scavenge 2 scaup 2 scaffold 38 1 4 3 2 2 aehiloruy 4 2 2 SCM 2 SC 38 1 4 3 2 2 4 2 2 Saxony 2 Saxon 38 1 4 3 2 2 n 4 1 2 saxophone 38 1 4 3 2 2 o 4 2 2 saxifrage 2 sax 38 1 4 3 2 2 4 2 2 sawtooth 2 sawtimber 38 1 4 3 2 2 4 2 2 sawfly 2 sawfish 38 1 4 3 2 2 ft 4 5 2 sawyer 2 sawmill 2 sawdust 2 sawbelly 2 saw 38 1 4 3 2 2 4 2 2 Savoyard 2 savoy 38 1 4 3 2 2 y 4 1 2 Savonarola 38 1 4 3 2 2 gn 4 0 38 1 4 3 2 2 4 2 2 savant 2 Savannah 38 1 4 3 2 e 2 4 2 2 savagery 2 savage 38 1 4 3 2 2 aoi 4 2 2 savvy 2 save 38 1 4 3 2 e 2 4 2 2 sauterne 2 saute 38 1 4 3 2 2 4 2 2 Sault 2 Saul 38 1 4 3 2 2 4 2 2 Saudi 2 Saud 38 1 4 3 2 2 e 4 1 2 saucy 38 1 4 3 2 2 4 2 2 saucepan 2 sauce 38 1 4 3 2 2 cdlt 4 3 2 sausage 2 Saunders 2 sauerkraut 38 1 4 3 2 2 4 3 2 saturnine 2 Saturnalia 2 Saturn 38 1 4 3 2 2 t 4 1 2 saturable 38 1 4 3 2 e 2 4 2 2 saturater 2 saturate 38 1 4 3 2 r 2 an 4 1 2 Saturday 38 1 4 3 2 ct 2 4 2 2 satisfactory 2 satisfaction 38 1 4 3 2 f 2 ay 4 1 2 satisfied 38 1 4 3 2 2 4 2 2 satiric 2 satire 38 1 4 3 2 2 4 2 2 satiate 2 satiable 38 1 4 3 2 2 ars 4 2 2 satin 2 satiety 38 1 4 3 2 n 2 4 2 2 satanic 2 satan 38 1 4 3 2 2 aiu 4 3 2 satyr 2 satellite 2 sat 38 1 4 3 2 at 2 4 2 2 Saskatoon 2 Saskatchewan 38 1 4 3 2 2 4 2 2 sashay 2 sash 38 1 4 3 2 2 hk 4 1 2 sassafras 38 1 4 3 2 2 4 2 2 sarsparilla 2 sarsaparilla 38 1 4 3 2 2 4 2 2 sardonic 2 sardine 38 1 4 3 2 2 4 2 2 sarcoma 2 sarcophagus 38 1 4 3 2 s 2 4 2 2 sarcastic 2 sarcasm 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 6 2 Saratoga 2 Sarasota 2 Saran 2 Sarah 2 Saracen 2 Sara 38 1 4 3 2 2 acds 4 2 2 sari 2 Sargent 38 1 4 3 2 2 4 2 2 sappy 2 sapphire 38 1 4 3 2 en 2 4 2 2 sapient 2 sapiens 38 1 4 3 2 2 ip 4 4 2 sapsucker 2 saponify 2 sapling 2 sap 38 1 4 3 2 2 4 2 2 Santayana 2 Santa 38 1 4 3 2 2 a 4 2 2 Santo 2 Santiago 38 1 4 3 2 2 4 2 2 sanitary 2 sanitarium 38 1 4 3 2 a 2 r 4 1 2 sanitate 38 1 4 3 2 2 t 4 1 2 sanicle 38 1 4 3 2 2 4 2 2 sanguineous 2 sanguine 38 1 4 3 2 in 2 e 4 1 2 sanguinary 38 1 4 3 2 2 u 4 2 2 sangaree 2 sang 38 1 4 3 2 2 4 2 2 sandpiper 2 sandpile 38 1 4 3 2 2 i 4 1 2 sandpaper 38 1 4 3 2 r 2 4 2 2 Sanderson 2 sanderling 38 1 4 3 2 2 4 3 2 Sandburg 2 sandblast 2 sandbag 38 1 4 3 2 l 2 4 2 2 sandalwood 2 sandal 38 1 4 3 2 2 abepw 4 8 2 sandy 2 Sandusky 2 sandstone 2 Sandra 2 sandman 2 Sandia 2 sandhill 2 sand 38 1 4 3 2 2 4 4 2 sanctity 2 sanction 2 sanctimonious 2 sanctify 38 1 4 3 2 2 i 4 1 2 sanctuary 38 1 4 3 2 2 4 2 2 Sancho 2 Sanchez 38 1 4 3 2 2 ht 4 0 38 1 4 3 2 ori 2 4 2 2 sanatorium 2 sanatoria 38 1 4 3 2 2 t 4 1 2 Sana 38 1 4 3 2 2 acdgit 4 7 2 sans 2 sank 2 Sanhedrin 2 Sanford 2 sane 2 Sanborn 2 San 38 1 4 3 2 el 2 4 2 2 Samuelson 2 Samuel 38 1 4 3 2 2 4 2 2 Sampson 2 sample 38 1 4 3 2 2 4 2 2 samovar 2 Samoa 38 1 4 3 2 2 opu 4 6 2 Samson 2 Sammy 2 same 2 samba 2 samarium 2 Sam 38 1 4 3 2 2 gt 4 1 2 Salvador 38 1 4 3 2 2 4 2 2 Salvatore 2 salvation 38 1 4 3 2 e 2 4 2 2 salvageable 2 salvage 38 1 4 3 2 2 a 4 2 2 salvo 2 salve 38 1 4 3 2 2 4 2 2 salutation 2 salutary 38 1 4 3 2 2 a 4 1 2 salute 38 1 4 3 2 2 t 4 1 2 salubrious 38 1 4 3 2 2 4 4 2 salty 2 saltwater 2 saltbush 2 salt 38 1 4 3 2 n 2 4 2 2 saloonkeep 2 saloon 38 1 4 3 2 2 o 4 1 2 salon 38 1 4 3 2 on 2 4 3 2 salmonella 2 salmonberry 2 salmon 38 1 4 3 2 2 4 3 2 sally 2 sallow 2 Salle 38 1 4 3 2 a 2 4 3 2 salivate 2 salivary 2 saliva 38 1 4 3 2 2 4 2 2 Salish 2 Salisbury 38 1 4 3 2 2 4 2 2 saline 2 Salina 38 1 4 3 2 2 nsv 4 1 2 salient 38 1 4 3 2 2 4 2 2 salesmen 2 salesman 38 1 4 3 2 2 m 4 5 2 salesperson 2 saleslady 2 Salesian 2 salesgirl 2 sales 38 1 4 3 2 2 s 4 3 2 Salerno 2 Salem 2 sale 38 1 4 3 2 2 4 2 2 salami 2 salamander 38 1 4 3 2 2 m 4 4 2 salary 2 salad 2 salacious 2 Salaam 38 1 4 3 2 2 aeilmotuv 4 3 2 salsify 2 Salk 2 Sal 38 1 4 3 2 2 4 4 2 sailor 2 sailfish 2 sailboat 2 sail 38 1 4 3 2 2 l 4 3 2 saint 2 Saigon 2 said 38 1 4 3 2 ta 2 4 2 2 Sagittarius 2 sagittal 38 1 4 3 2 2 t 4 1 2 Saginaw 38 1 4 3 2 2 4 2 2 sagebrush 2 sage 38 1 4 3 2 i 2 4 2 2 sagacity 2 sagacious 38 1 4 3 2 2 c 4 1 2 saga 38 1 4 3 2 2 aei 4 4 2 saguaro 2 sago 2 sagging 2 sag 38 1 4 3 2 2 4 5 2 safely 2 safety 2 safekeeping 2 safeguard 2 safe 38 1 4 3 2 2 e 4 2 2 saffron 2 safari 38 1 4 3 2 2 4 2 2 sadist 2 sadism 38 1 4 3 2 2 s 4 1 2 Sadie 38 1 4 3 2 e 2 4 2 2 saddlebag 2 saddle 38 1 4 3 2 2 l 4 1 2 sadden 38 1 4 3 2 2 di 4 2 2 Sadler 2 sad 38 1 4 3 2 eg 2 4 2 2 sacrilegious 2 sacrilege 38 1 4 3 2 ic 2 4 2 2 sacrificial 2 sacrifice 38 1 4 3 2 2 fl 4 0 38 1 4 3 2 2 m 4 1 2 sacral 38 1 4 3 2 ent 2 4 2 2 Sacramento 2 sacrament 38 1 4 3 2 2 ai 4 2 2 sacrosanct 2 sacred 38 1 4 3 2 2 4 2 2 Sachs 2 sachem 38 1 4 3 2 2 hr 4 3 2 sack 2 saccharine 2 sac 38 1 4 3 2 n 2 4 2 2 Sabine 2 Sabina 38 1 4 3 2 at 2 4 2 2 sabbatical 2 sabbath 38 1 4 3 2 2 bi 4 3 2 sabra 2 sabotage 2 sable 38 1 4 3 2 2 bcdfgilmnprstuvwxy 4 4 2 Sao 2 sake 2 Sahara 2 sa 38 1 4 3 2 2 acehIklmnopqStuwy 4 7 2 Szilard 2 svelte 2 s's 2 Sri 2 sforzando 2 SD 2 s 38 1 4 3 2 2 4 2 2 Ryder 2 Rydberg 38 1 4 3 2 2 d 4 2 2 rye 2 Ryan 38 1 4 3 2 2 4 2 2 Rutledge 2 Rutland 38 1 4 3 2 2 4 2 2 Rutherford 2 ruthenium 38 1 4 3 2 2 e 4 2 2 ruthless 2 Ruth 38 1 4 3 2 2 hl 4 5 2 rutty 2 rutile 2 Rutgers 2 rutabaga 2 rut 38 1 4 3 2 2 4 5 2 rusty 2 rustproof 2 rustle 2 rustic 2 rust 38 1 4 3 2 2 4 2 2 russet 2 Russell 38 1 4 3 2 2 e 4 4 2 russula 2 Russo 2 Russia 2 Russ 38 1 4 3 2 2 4 2 2 Rushmore 2 rush 38 1 4 3 2 2 hst 4 2 2 rusk 2 ruse 38 1 4 3 2 2 4 2 2 rupture 2 rupee 38 1 4 3 2 2 4 2 2 runty 2 runt 38 1 4 3 2 2 4 3 2 running 2 Runnymede 2 runneth 38 1 4 3 2 2 4 2 2 Runge 2 rung 38 1 4 3 2 2 4 2 2 runaway 2 runabout 38 1 4 3 2 2 agnt 4 7 2 Runyon 2 runway 2 runoff 2 runic 2 rune 2 rundown 2 run 38 1 4 3 2 2 4 3 2 rumpus 2 rumple 2 rump 38 1 4 3 2 2 4 2 2 rummy 2 rummage 38 1 4 3 2 2 mp 4 6 2 ruminant 2 Rumford 2 rumen 2 rumble 2 Rumania 2 rum 38 1 4 3 2 n 2 4 3 2 ruinous 2 ruination 2 ruin 38 1 4 3 2 2 4 2 2 ruffle 2 ruffian 38 1 4 3 2 2 f 4 2 2 Rufus 2 rufous 38 1 4 3 2 2 4 2 2 rueful 2 rue 38 1 4 3 2 2 4 2 2 Rudyard 2 Rudy 38 1 4 3 2 l 2 4 2 2 Rudolph 2 Rudolf 38 1 4 3 2 ment 2 4 2 2 rudimentary 2 rudiment 38 1 4 3 2 2 4 2 2 ruddy 2 rudder 38 1 4 3 2 2 dioy 4 1 2 rude 38 1 4 3 2 2 4 3 2 Rubin 2 rubidium 2 rubicund 38 1 4 3 2 2 4 2 2 Ruben 2 Rube 38 1 4 3 2 2 4 3 2 rubble 2 rubbish 2 rubbery 38 1 4 3 2 2 bei 4 4 2 ruby 2 rubric 2 rubdown 2 rub 38 1 4 3 2 2 bdefimnpstl 4 4 2 rural 2 rug 2 ruckus 2 Ruanda 38 1 4 3 2 l 2 4 2 2 royalty 2 royal 38 1 4 3 2 2 a 4 2 2 Royce 2 Roy 38 1 4 3 2 2 4 2 2 Rowley 2 Rowland 38 1 4 3 2 2 4 2 2 Rowena 2 Rowe 38 1 4 3 2 2 el 4 3 2 rowdy 2 rowboat 2 row 38 1 4 3 2 2 4 3 2 routine 2 route 2 rout 38 1 4 3 2 2 4 3 2 roustabout 2 Rousseau 2 rouse 38 1 4 3 2 2 4 2 2 roundhouse 2 roundhead 38 1 4 3 2 d 2 h 4 6 2 roundworm 2 roundup 2 roundtable 2 roundoff 2 roundabout 2 round 38 1 4 3 2 2 h 4 1 2 rouge 38 1 4 3 2 2 4 7 2 roughly 2 roughshod 2 roughneck 2 roughish 2 roughen 2 roughcast 2 rough 38 1 4 3 2 2 gnst 4 1 2 roulette 38 1 4 3 2 nd 2 4 2 2 rotunda 2 rotund 38 1 4 3 2 2 4 3 2 rototill 2 rotor 2 rotogravure 38 1 4 3 2 2 4 2 2 Rothschild 2 Roth 38 1 4 3 2 2 4 2 2 rotary 2 Rotarian 38 1 4 3 2 2 r 4 1 2 rotate 38 1 4 3 2 2 ahou 4 4 2 rotten 2 rotenone 2 ROTC 2 rot 38 1 4 3 2 2 4 2 2 rostrum 2 roster 38 1 4 3 2 t 2 4 2 2 rosette 2 Rosetta 38 1 4 3 2 2 4 2 2 Rosenblum 2 Rosenberg 38 1 4 3 2 2 b 4 3 2 Rosenzweig 2 Rosenthal 2 Rosen 38 1 4 3 2 u 2 4 2 2 rosebush 2 rosebud 38 1 4 3 2 2 bnt 4 3 2 rosemary 2 Roseland 2 rose 38 1 4 3 2 2 4 3 2 rosary 2 Rosalie 2 Rosa 38 1 4 3 2 2 aet 4 2 2 rosy 2 Ross 38 1 4 3 2 velt 2 4 2 2 Rooseveltian 2 Roosevelt 38 1 4 3 2 2 e 4 1 2 roost 38 1 4 3 2 2 4 5 2 rooms 2 roomy 2 roommate 2 roomful 2 room 38 1 4 3 2 2 4 3 2 rooky 2 rookie 2 rook 38 1 4 3 2 2 4 2 2 rooftree 2 rooftop 38 1 4 3 2 2 t 4 1 2 roof 38 1 4 3 2 2 fkms 4 2 2 root 2 rood 38 1 4 3 2 2 4 4 2 Ronnie 2 rondo 2 Ronald 2 Ron 38 1 4 3 2 2 4 2 2 Romeo 2 Rome 38 1 4 3 2 n 2 4 5 2 romantic 2 Romano 2 Romania 2 romance 2 Roman 38 1 4 3 2 2 ae 4 2 2 Romulus 2 romp 38 1 4 3 2 2 n 4 1 2 rollick 38 1 4 3 2 2 i 4 2 2 rollback 2 roll 38 1 4 3 2 2 l 4 2 2 role 2 Roland 38 1 4 3 2 2 4 2 2 roister 2 roil 38 1 4 3 2 2 4 2 2 rogue 2 Roger 38 1 4 3 2 2 4 3 2 Roentgen 2 roebuck 2 roe 38 1 4 3 2 2 4 3 2 rodeo 2 rodent 2 rode 38 1 4 3 2 2 e 4 4 2 Rodriguez 2 Rodney 2 Rodgers 2 rod 38 1 4 3 2 2 4 2 2 rocket 2 Rockefeller 38 1 4 3 2 2 4 2 2 rockaway 2 rockabye 38 1 4 3 2 2 ae 4 7 2 rocky 2 Rockwell 2 Rockland 2 Rockies 2 Rockford 2 rockbound 2 rock 38 1 4 3 2 2 k 4 2 2 rococo 2 Rochester 38 1 4 3 2 t 2 4 2 2 robotics 2 robot 38 1 4 3 2 n 2 4 2 2 Robinson 2 robin 38 1 4 3 2 t 2 4 4 2 Robertson 2 Roberto 2 Roberta 2 Robert 38 1 4 3 2 2 r 4 1 2 robe 38 1 4 3 2 2 4 2 2 robbin 2 robbery 38 1 4 3 2 2 beio 4 2 2 robust 2 rob 38 1 4 3 2 2 d 4 4 2 roast 2 roar 2 roam 2 roach 38 1 4 3 2 2 4 2 2 roadster 2 roadside 38 1 4 3 2 2 4 2 2 roadblock 2 roadbed 38 1 4 3 2 2 bs 4 3 2 roadway 2 roadhouse 2 road 38 1 4 3 2 2 abcdegilmnostuwy 4 3 2 Roxbury 2 rove 2 rope 38 1 4 3 2 2 4 5 2 riverside 2 riverine 2 riverfront 2 riverbank 2 river 38 1 4 3 2 2 r 4 2 2 rivet 2 riven 38 1 4 3 2 l 2 4 2 2 rivalry 2 rival 38 1 4 3 2 2 ae 4 2 2 rivulet 2 Riviera 38 1 4 3 2 2 4 5 2 Ritz 2 ritual 2 Ritter 2 rite 2 Ritchie 38 1 4 3 2 2 4 2 2 risky 2 risk 38 1 4 3 2 2 4 3 2 rises 2 risen 2 rise 38 1 4 3 2 2 ek 4 1 2 risible 38 1 4 3 2 2 4 2 2 ripen 2 ripe 38 1 4 3 2 2 e 4 5 2 ripple 2 ripoff 2 Ripley 2 riparian 2 rip 38 1 4 3 2 2 4 2 2 riotous 2 riot 38 1 4 3 2 2 t 4 2 2 Riordan 2 Rio 38 1 4 3 2 2 4 3 2 ringside 2 ringlet 2 ring 38 1 4 3 2 2 g 4 3 2 rinse 2 rink 2 Rinehart 38 1 4 3 2 2 4 3 2 rimy 2 rime 2 rim 38 1 4 3 2 2 4 2 2 rilly 2 rill 38 1 4 3 2 2 l 4 1 2 Riley 38 1 4 3 2 t 2 4 5 2 rightward 2 rightmost 2 rightful 2 righteous 2 right 38 1 4 3 2 2 4 2 2 Riggs 2 rigging 38 1 4 3 2 2 gho 4 4 2 rigid 2 Rigel 2 Riga 2 rig 38 1 4 3 2 2 4 2 2 riflemen 2 rifleman 38 1 4 3 2 e 2 m 4 1 2 rifle 38 1 4 3 2 2 l 4 2 2 rift 2 riffle 38 1 4 3 2 mann 2 4 2 2 Riemannian 2 Riemann 38 1 4 3 2 cul 2 4 2 2 ridiculous 2 ridicule 38 1 4 3 2 2 4 2 2 ridgepole 2 ridge 38 1 4 3 2 2 e 4 1 2 Ridgway 38 1 4 3 2 2 4 3 2 riddle 2 ridden 2 riddance 38 1 4 3 2 2 dgi 4 2 2 ride 2 rid 38 1 4 3 2 2 4 2 2 ricochet 2 Rico 38 1 4 3 2 t 2 4 3 2 rickety 2 Rickettsia 2 rickets 38 1 4 3 2 2 e 4 2 2 rickshaw 2 rick 38 1 4 3 2 rd 2 4 2 2 Richardson 2 Richard 38 1 4 3 2 2 a 4 4 2 Richter 2 Richmond 2 Richfield 2 rich 38 1 4 3 2 2 hko 4 2 2 rice 2 Rica 38 1 4 3 2 2 4 2 2 ribosome 2 ribose 38 1 4 3 2 2 s 4 2 2 ribonucleic 2 riboflavin 38 1 4 3 2 2 o 4 3 2 ribbon 2 ribald 2 rib 38 1 4 3 2 2 bcdefglmnopstv 4 2 2 Riyadh 2 RI 38 1 4 3 2 hm 2 4 2 2 rhythmic 2 rhythm 38 1 4 3 2 2 t 4 1 2 rhyme 38 1 4 3 2 2 4 2 2 rhombic 2 rhombi 38 1 4 3 2 b 2 i 4 1 2 rhombus 38 1 4 3 2 2 4 3 2 rhodonite 2 rhodolite 2 rhododendron 38 1 4 3 2 2 4 2 2 Rhodesia 2 Rhodes 38 1 4 3 2 2 s 4 1 2 Rhode 38 1 4 3 2 2 eo 4 2 2 rhodium 2 Rhoda 38 1 4 3 2 2 dm 4 1 2 rho 38 1 4 3 2 2 4 2 2 rhinoceros 2 rhino 38 1 4 3 2 2 4 2 2 rhinestone 2 Rhine 38 1 4 3 2 n 2 eo 4 0 38 1 4 3 2 ti 2 4 2 2 rheumatism 2 rheumatic 38 1 4 3 2 m 2 a 4 1 2 rheum 38 1 4 3 2 oric 2 4 2 2 rhetorician 2 rhetoric 38 1 4 3 2 2 4 2 2 rheostat 2 rheology 38 1 4 3 2 i 2 4 2 2 rhenium 2 Rhenish 38 1 4 3 2 2 notu 4 2 2 rhesus 2 Rhea 38 1 4 3 2 psod 2 4 2 2 rhapsody 2 rhapsodic 38 1 4 3 2 2 aeioy 4 1 2 rhubarb 38 1 4 3 2 2 4 2 2 Reynolds 2 Reykjavik 38 1 4 3 2 2 4 2 2 revving 2 revved 38 1 4 3 2 tion 2 4 2 2 revolutionary 2 revolution 38 1 4 3 2 2 u 4 2 2 revolve 2 revolt 38 1 4 3 2 2 l 4 2 2 revoke 2 revocable 38 1 4 3 2 2 4 2 2 revive 2 revival 38 1 4 3 2 on 2 4 2 2 revisionary 2 revision 38 1 4 3 2 2 4 2 2 revisal 2 revisable 38 1 4 3 2 2 ai 4 1 2 revise 38 1 4 3 2 2 sve 4 1 2 revile 38 1 4 3 2 2 4 2 2 reversion 2 reversible 38 1 4 3 2 2 i 4 2 2 reverse 2 reversal 38 1 4 3 2 2 4 2 2 reverent 2 reverend 38 1 4 3 2 2 n 4 1 2 revere 38 1 4 3 2 2 es 4 5 2 revery 2 revert 2 reverie 2 reverberate 2 rever 38 1 4 3 2 2 4 2 2 revenue 2 revenge 38 1 4 3 2 t 2 4 2 2 revelatory 2 revelation 38 1 4 3 2 2 a 4 2 2 revelry 2 revel 38 1 4 3 2 2 lnr 4 2 2 revet 2 reveal 38 1 4 3 2 2 eiov 4 2 2 revulsion 2 rev 38 1 4 3 2 2 4 2 2 Reuben 2 Reub 38 1 4 3 2 2 b 4 1 2 Reuters 38 1 4 3 2 ss 2 4 2 2 retrogressive 2 retrogress 38 1 4 3 2 r 2 e 4 1 2 retrograde 38 1 4 3 2 2 4 2 2 retrofitting 2 retrofitted 38 1 4 3 2 it 2 t 4 1 2 retrofit 38 1 4 3 2 2 fg 4 4 2 retrovision 2 retrospect 2 retrorocket 2 retroactive 38 1 4 3 2 v 2 4 2 2 retrieve 2 retrieval 38 1 4 3 2 2 e 4 1 2 retribution 38 1 4 3 2 2 io 4 1 2 retract 38 1 4 3 2 e 2 4 2 2 retiree 2 retire 38 1 4 3 2 2 4 2 2 retinal 2 retina 38 1 4 3 2 2 a 4 1 2 retinue 38 1 4 3 2 2 u 4 1 2 reticent 38 1 4 3 2 l 2 4 2 2 reticulum 2 reticulate 38 1 4 3 2 2 cnr 4 0 38 1 4 3 2 nti 2 4 2 2 retentive 2 retention 38 1 4 3 2 2 4 2 2 retardation 2 retardant 38 1 4 3 2 d 2 a 4 1 2 retard 38 1 4 3 2 iat 2 4 2 2 retaliatory 2 retaliate 38 1 4 3 2 2 4 2 2 retain 2 retail 38 1 4 3 2 2 ilr 4 0 38 1 4 3 2 2 aeiru 4 3 2 retort 2 retch 2 ret 38 1 4 3 2 2 4 2 2 resurrect 2 resurgent 38 1 4 3 2 2 4 2 2 resumption 2 resume 38 1 4 3 2 t 2 4 3 2 results 2 resultant 2 result 38 1 4 3 2 2 lmr 4 1 2 resuscitate 38 1 4 3 2 in 2 4 2 2 restraint 2 restrain 38 1 4 3 2 2 a 4 2 2 restroom 2 restrict 38 1 4 3 2 rati 2 4 2 2 restorative 2 restoration 38 1 4 3 2 2 4 2 2 restive 2 restitution 38 1 4 3 2 ura 2 4 2 2 restaurateur 2 restaurant 38 1 4 3 2 2 aior 4 2 2 restful 2 rest 38 1 4 3 2 2 4 2 2 responsive 2 responsible 38 1 4 3 2 2 i 4 1 2 response 38 1 4 3 2 2 4 2 2 respondent 2 respond 38 1 4 3 2 n 2 ds 4 0 38 1 4 3 2 2 a 4 1 2 respire 38 1 4 3 2 t 2 o 4 1 2 respiration 38 1 4 3 2 r 2 4 2 2 respiratory 2 respirator 38 1 4 3 2 2 r 4 1 2 respite 38 1 4 3 2 ct 2 4 2 2 respectful 2 respect 38 1 4 3 2 2 eio 4 1 2 resplendent 38 1 4 3 2 2 4 2 2 resort 2 resorcinol 38 1 4 3 2 a 2 4 2 2 resonate 2 resonant 38 1 4 3 2 2 u 4 1 2 resolve 38 1 4 3 2 t 2 4 2 2 resolution 2 resolute 38 1 4 3 2 2 lnru 4 0 38 1 4 3 2 2 4 2 2 resistive 2 resistible 38 1 4 3 2 t 2 i 4 3 2 resistor 2 resistant 2 resist 38 1 4 3 2 2 4 2 2 resiny 2 resin 38 1 4 3 2 n 2 4 2 2 resignation 2 resign 38 1 4 3 2 2 eu 4 0 38 1 4 3 2 2 4 2 2 residuary 2 residual 38 1 4 3 2 2 a 4 2 2 residuum 2 residue 38 1 4 3 2 2 n 4 1 2 reside 38 1 4 3 2 t 2 4 2 2 residential 2 resident 38 1 4 3 2 2 dgns 4 1 2 resilient 38 1 4 3 2 2 4 3 2 reservoir 2 reserve 2 reservation 38 1 4 3 2 2 v 4 1 2 reserpine 38 1 4 3 2 t 2 4 2 2 resentful 2 resent 38 1 4 3 2 bl 2 4 3 2 resembling 2 resemble 2 resemblant 38 1 4 3 2 2 mnr 4 1 2 research 38 1 4 3 2 2 4 2 2 rescue 2 rescind 38 1 4 3 2 2 ceioptu 4 0 38 1 4 3 2 it 2 4 2 2 requisition 2 requisite 38 1 4 3 2 2 sr 4 1 2 requited 38 1 4 3 2 u 2 i 4 1 2 request 38 1 4 3 2 2 4 2 2 repute 2 reputation 38 1 4 3 2 si 2 4 2 2 repulsive 2 repulsion 38 1 4 3 2 lic 2 4 2 2 republican 2 republic 38 1 4 3 2 2 blt 4 2 2 repugnant 2 repudiate 38 1 4 3 2 il 2 4 2 2 reptilian 2 reptile 38 1 4 3 2 2 4 2 2 reprise 2 reprisal 38 1 4 3 2 2 s 4 2 2 reprimand 2 reprieve 38 1 4 3 2 2 s 4 1 2 reprehensible 38 1 4 3 2 i 2 4 2 2 repressive 2 repression 38 1 4 3 2 2 se 4 0 38 1 4 3 2 2 ei 4 1 2 reproach 38 1 4 3 2 t 2 4 5 2 reports 2 reporting 2 reported 2 reportorial 2 report 38 1 4 3 2 2 r 4 1 2 repository 38 1 4 3 2 ca 2 4 2 2 replicate 2 replica 38 1 4 3 2 2 4 2 2 replete 2 replenish 38 1 4 3 2 2 ei 4 1 2 replaceable 38 1 4 3 2 2 4 2 2 repetitious 2 repetition 38 1 4 3 2 iti 2 o 4 1 2 repetitive 38 1 4 3 2 to 2 4 2 2 repertory 2 repertoire 38 1 4 3 2 t 2 4 2 2 repentant 2 repent 38 1 4 3 2 2 4 2 2 repellent 2 repelled 38 1 4 3 2 2 e 4 1 2 repelling 38 1 4 3 2 2 l 4 1 2 repel 38 1 4 3 2 2 t 4 1 2 repeal 38 1 4 3 2 2 4 2 2 repeater 2 repeat 38 1 4 3 2 2 alnrt 4 0 38 1 4 3 2 2 4 2 2 repartee 2 reparation 38 1 4 3 2 rm 2 4 2 2 repairmen 2 repairman 38 1 4 3 2 2 ir 4 0 38 1 4 3 2 2 aelortu 4 1 2 rep 38 1 4 3 2 2 4 2 2 rental 2 rent 38 1 4 3 2 2 4 4 2 renown 2 renovate 2 renounce 2 Renoir 38 1 4 3 2 2 4 3 2 renewal 2 renegotiable 2 Rene 38 1 4 3 2 2 4 2 2 rendezvous 2 render 38 1 4 3 2 2 e 4 2 2 rendition 2 rend 38 1 4 3 2 2 4 4 2 Renault 2 renal 2 renaissance 2 Rena 38 1 4 3 2 2 adeot 4 2 2 renunciate 2 Rensselaer 38 1 4 3 2 2 4 2 2 Remus 2 remunerate 38 1 4 3 2 se 2 4 2 2 remorseful 2 remorse 38 1 4 3 2 2 rv 4 2 2 remote 2 remonstrate 38 1 4 3 2 2 4 3 2 remitting 2 remitted 2 remittance 38 1 4 3 2 2 t 4 1 2 remit 38 1 4 3 2 s 2 4 2 2 remission 2 remiss 38 1 4 3 2 2 i 4 1 2 Remington 38 1 4 3 2 sce 2 4 2 2 reminiscent 2 reminisce 38 1 4 3 2 2 nst 4 0 38 1 4 3 2 b 2 4 2 2 remembrance 2 remember 38 1 4 3 2 2 i 4 1 2 remedy 38 1 4 3 2 a 2 4 2 2 remedial 2 remediable 38 1 4 3 2 2 dm 4 0 38 1 4 3 2 2 ni 4 1 2 remark 38 1 4 3 2 2 4 2 2 remand 2 reman 38 1 4 3 2 2 aeiou 4 2 2 remnant 2 Rembrandt 38 1 4 3 2 io 2 4 3 2 religious 2 religiosity 2 religion 38 1 4 3 2 2 4 2 2 relieve 2 relief 38 1 4 3 2 2 4 2 2 relict 2 relic 38 1 4 3 2 2 ceg 4 4 2 relish 2 reliquary 2 relinquish 2 reliant 38 1 4 3 2 2 a 4 1 2 relevant 38 1 4 3 2 2 t 4 1 2 relaxation 38 1 4 3 2 2 aei 4 1 2 reluctant 38 1 4 3 2 i 2 4 2 2 rejoinder 2 rejoice 38 1 4 3 2 2 o 4 1 2 reject 38 1 4 3 2 2 4 5 2 reinstate 2 Reinhold 2 reinforce 2 reindeer 2 rein 38 1 4 3 2 burs 2 4 2 2 reimburse 2 reimbursable 38 1 4 3 2 2 mn 4 4 2 Reilly 2 reign 2 Reid 2 Reich 38 1 4 3 2 ars 2 4 2 2 rehearse 2 rehearsal 38 1 4 3 2 2 e 4 1 2 rehabilitate 38 1 4 3 2 2 a 4 1 2 Regulus 38 1 4 3 2 2 t 4 1 2 regular 38 1 4 3 2 2 4 2 2 regulatory 2 regulate 38 1 4 3 2 2 l 4 1 2 regurgitate 38 1 4 3 2 2 4 3 2 regretting 2 regretted 2 regrettable 38 1 4 3 2 2 t 4 2 2 regretful 2 regret 38 1 4 3 2 s 2 i 4 1 2 regress 38 1 4 3 2 2 4 2 2 regressive 2 regression 38 1 4 3 2 e 2 st 4 0 38 1 4 3 2 2 4 4 2 registration 2 registrar 2 registrant 2 registrable 38 1 4 3 2 r 2 a 4 1 2 registry 38 1 4 3 2 2 t 4 1 2 Regis 38 1 4 3 2 a 2 4 2 2 Reginald 2 Regina 38 1 4 3 2 e 2 n 4 1 2 regime 38 1 4 3 2 2 4 2 2 regimentation 2 regiment 38 1 4 3 2 2 t 4 1 2 regimen 38 1 4 3 2 2 mnso 4 0 38 1 4 3 2 2 l 4 2 2 regatta 2 regard 38 1 4 3 2 2 4 3 2 regalia 2 regale 2 regal 38 1 4 3 2 2 airu 4 1 2 regent 38 1 4 3 2 2 4 2 2 refute 2 refutation 38 1 4 3 2 e 2 4 2 2 refugee 2 refuge 38 1 4 3 2 2 gt 4 1 2 refusal 38 1 4 3 2 2 c 4 1 2 refrain 38 1 4 3 2 t 2 o 4 1 2 refract 38 1 4 3 2 2 4 2 2 refractory 2 refractometer 38 1 4 3 2 2 a 4 1 2 refrigerate 38 1 4 3 2 t 2 4 3 2 reflector 2 reflectance 2 reflect 38 1 4 3 2 e 2 c 4 1 2 reflexive 38 1 4 3 2 2 r 4 1 2 refectory 38 1 4 3 2 2 4 3 2 referring 2 referred 2 referral 38 1 4 3 2 2 4 2 2 referential 2 referent 38 1 4 3 2 2 4 2 2 referendum 2 referenda 38 1 4 3 2 2 dt 4 1 2 reference 38 1 4 3 2 2 4 2 2 refereeing 2 referee 38 1 4 3 2 2 en 4 0 38 1 4 3 2 2 er 4 1 2 refer 38 1 4 3 2 2 elru 4 1 2 reformatory 38 1 4 3 2 e 2 4 2 2 Reeves 2 reeve 38 1 4 3 2 2 4 3 2 reedy 2 reedbuck 2 reed 38 1 4 3 2 2 dv 4 4 2 Reese 2 reel 2 reek 2 reef 38 1 4 3 2 2 e 4 1 2 reducible 38 1 4 3 2 2 c 4 1 2 redundant 38 1 4 3 2 2 4 2 2 Redstone 2 redstart 38 1 4 3 2 2 t 4 1 2 redshank 38 1 4 3 2 2 mf 4 0 38 1 4 3 2 2 4 2 2 reddish 2 redden 38 1 4 3 2 2 4 2 2 redbud 2 redbird 38 1 4 3 2 ct 2 4 2 2 redactor 2 redact 38 1 4 3 2 2 abdesur 4 9 2 redwood 2 redtop 2 redpoll 2 redound 2 redneck 2 Redmond 2 redhead 2 redcoat 2 red 38 1 4 3 2 2 4 2 2 recuse 2 recusant 38 1 4 3 2 2 4 2 2 recurring 2 recurred 38 1 4 3 2 2 r 4 2 2 recursion 2 recur 38 1 4 3 2 2 rs 4 2 2 recuperate 2 recumbent 38 1 4 3 2 r 2 4 2 2 rectory 2 rector 38 1 4 3 2 2 4 2 2 rectify 2 rectifier 38 1 4 3 2 2 f 4 2 2 rectitude 2 rectilinear 38 1 4 3 2 ng 2 4 2 2 rectangular 2 rectangle 38 1 4 3 2 2 aio 4 0 38 1 4 3 2 2 4 2 2 recruit 2 recriminate 38 1 4 3 2 2 4 3 2 reconnaissance 2 recondite 2 reconcile 38 1 4 3 2 2 nr 4 2 2 recovery 2 recompense 38 1 4 3 2 2 4 3 2 recluse 2 recline 2 reclamation 38 1 4 3 2 2 4 2 2 reckon 2 reck 38 1 4 3 2 a 2 4 2 2 recitative 2 recital 38 1 4 3 2 2 4 2 2 reciprocate 2 reciprocal 38 1 4 3 2 oc 2 a 4 1 2 reciprocity 38 1 4 3 2 2 r 4 2 2 recipient 2 recipe 38 1 4 3 2 2 pt 4 1 2 Recife 38 1 4 3 2 2 4 2 2 recessive 2 recession 38 1 4 3 2 s 2 i 4 1 2 recess 38 1 4 3 2 2 4 2 2 receptive 2 reception 38 1 4 3 2 t 2 i 4 2 2 receptor 2 receptacle 38 1 4 3 2 2 v 4 1 2 receipt 38 1 4 3 2 2 ipsn 4 0 38 1 4 3 2 2 eiklortu 4 3 2 recycle 2 recherche 2 recalcitrant 38 1 4 3 2 2 4 3 2 rebutting 2 rebutted 2 rebuttal 38 1 4 3 2 2 t 4 1 2 rebut 38 1 4 3 2 2 t 4 1 2 rebuke 38 1 4 3 2 2 4 2 2 rebellious 2 rebellion 38 1 4 3 2 2 o 4 1 2 rebelling 38 1 4 3 2 2 i 4 1 2 rebelled 38 1 4 3 2 2 l 4 1 2 rebel 38 1 4 3 2 2 l 4 1 2 Rebecca 38 1 4 3 2 2 eu 4 1 2 reb 38 1 4 3 2 2 4 2 2 realty 2 realtor 38 1 4 3 2 2 t 4 4 2 really 2 realm 2 realisable 2 real 38 1 4 3 2 2 4 3 2 ready 2 readout 2 read 38 1 4 3 2 2 th 4 0 38 1 4 3 2 2 4 2 2 reactionary 2 reactant 38 1 4 3 2 2 cdls 4 5 2 reave 2 rear 2 reap 2 ream 2 Reagan 38 1 4 3 2 2 abcdefghijlmnpqstuvy 4 4 2 Rex 2 reward 2 reredos 2 re 38 1 4 3 2 r 2 4 2 2 razorback 2 razor 38 1 4 3 2 2 o 4 1 2 raze 38 1 4 3 2 2 4 4 2 Raytheon 2 Raymond 2 Rayleigh 2 ray 38 1 4 3 2 2 4 4 2 Rawlinson 2 rawhide 2 rawboned 2 raw 38 1 4 3 2 2 4 2 2 ravish 2 ravine 38 1 4 3 2 2 4 2 2 ravenous 2 raven 38 1 4 3 2 2 n 4 2 2 ravel 2 rave 38 1 4 3 2 2 ei 4 1 2 ravage 38 1 4 3 2 2 4 2 2 Raul 2 raucous 38 1 4 3 2 e 2 4 2 2 rattlesnake 2 rattle 38 1 4 3 2 2 l 4 1 2 rattail 38 1 4 3 2 2 4 3 2 rationale 2 ratiocinate 2 ratio 38 1 4 3 2 2 o 4 1 2 ratify 38 1 4 3 2 2 4 3 2 rates 2 rater 2 rate 38 1 4 3 2 2 eit 4 3 2 rather 2 rata 2 rat 38 1 4 3 2 2 4 2 2 Rastus 2 raster 38 1 4 3 2 2 4 2 2 raspberry 2 rasp 38 1 4 3 2 2 pt 4 4 2 Rasmussen 2 rash 2 rascal 2 rasa 38 1 4 3 2 2 4 2 2 rarefy 2 rare 38 1 4 3 2 2 e 4 1 2 Raritan 38 1 4 3 2 2 4 2 2 rapture 2 rapt 38 1 4 3 2 2 4 2 2 rapprochement 2 rapport 38 1 4 3 2 2 4 2 2 rapier 2 rapid 38 1 4 3 2 2 ipt 4 4 2 Raphael 2 rape 2 rapacious 2 rap 38 1 4 3 2 2 4 2 2 ransom 2 ransack 38 1 4 3 2 n 2 4 2 2 Rankine 2 Rankin 38 1 4 3 2 2 i 4 2 2 rankle 2 rank 38 1 4 3 2 2 4 2 2 rangeland 2 range 38 1 4 3 2 2 e 4 3 2 rangy 2 Rangoon 2 rang 38 1 4 3 2 2 4 2 2 random 2 Randolph 38 1 4 3 2 2 o 4 3 2 randy 2 Randall 2 Rand 38 1 4 3 2 2 4 2 2 rancho 2 ranch 38 1 4 3 2 2 h 4 2 2 rancorous 2 rancid 38 1 4 3 2 2 cdgks 4 3 2 rant 2 Ranier 2 ran 38 1 4 3 2 2 4 3 2 rampart 2 rampant 2 rampage 38 1 4 3 2 2 a 4 1 2 ramp 38 1 4 3 2 2 4 2 2 Raman 2 Ramada 38 1 4 3 2 2 ap 4 6 2 Ramsey 2 ramrod 2 Ramo 2 ramify 2 ramble 2 ram 38 1 4 3 2 2 4 4 2 Ralston 2 Ralph 2 rally 2 Raleigh 38 1 4 3 2 2 4 2 2 rakish 2 rake 38 1 4 3 2 2 4 2 2 rajah 2 raj 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 7 2 rainy 2 rainstorm 2 rainfall 2 raindrop 2 raincoat 2 rainbow 2 rain 38 1 4 3 2 2 4 6 2 railway 2 railroad 2 raillery 2 railhead 2 railbird 2 rail 38 1 4 3 2 2 lns 4 1 2 raid 38 1 4 3 2 2 4 5 2 ragweed 2 ragout 2 ragging 2 rage 2 rag 38 1 4 3 2 2 4 2 2 raffish 2 raffia 38 1 4 3 2 2 i 4 1 2 Rafferty 38 1 4 3 2 2 f 4 2 2 raft 2 Rafael 38 1 4 3 2 2 4 2 2 radius 2 radium 38 1 4 3 2 emi 2 4 2 2 radiochemistry 2 radiochemical 38 1 4 3 2 2 h 4 1 2 radiocarbon 38 1 4 3 2 2 4 2 2 radioastronomy 2 radioactive 38 1 4 3 2 2 ac 4 7 2 radiotherapy 2 radiosonde 2 radiophysics 2 radiometer 2 radiology 2 radiography 2 radio 38 1 4 3 2 2 4 2 2 radices 2 radical 38 1 4 3 2 2 n 4 2 2 radiate 2 radial 38 1 4 3 2 2 4 2 2 radiant 2 radian 38 1 4 3 2 2 acou 4 3 2 radix 2 radish 2 radii 38 1 4 3 2 2 i 4 3 2 radon 2 Radcliffe 2 radar 38 1 4 3 2 t 2 4 3 2 rackety 2 racketeer 2 racket 38 1 4 3 2 2 e 4 1 2 rack 38 1 4 3 2 2 4 2 2 Rachmaninoff 2 Rachel 38 1 4 3 2 2 4 3 2 raceway 2 racetrack 2 race 38 1 4 3 2 2 ehk 4 3 2 racy 2 racial 2 raccoon 38 1 4 3 2 2 bi 4 1 2 rabat 38 1 4 3 2 2 4 3 2 Rabin 2 rabies 2 rabid 38 1 4 3 2 2 4 2 2 rabbit 2 rabbi 38 1 4 3 2 2 i 4 2 2 rabble 2 rabbet 38 1 4 3 2 2 bcdfgijklmnprstuvwyz 4 2 2 Raoul 2 Rae 38 1 4 3 2 2 aehiouy 4 9 2 Rwanda 2 RSVP 2 r's 2 RPM 2 RNA 2 R&D 2 Rd 2 RCA 2 r 38 1 4 3 2 2 4 2 2 quotation 2 quota 38 1 4 3 2 2 ai 4 1 2 quote 38 1 4 3 2 2 t 4 4 2 quorum 2 quonset 2 quod 2 quo 38 1 4 3 2 2 4 2 2 quizzical 2 quizzes 38 1 4 3 2 2 z 4 1 2 quiz 38 1 4 3 2 ot 2 4 2 2 quixotic 2 Quixote 38 1 4 3 2 2 4 4 2 quitting 2 Quito 2 quite 2 quit 38 1 4 3 2 2 4 2 2 quirky 2 quirk 38 1 4 3 2 2 k 4 2 2 quirt 2 Quirinal 38 1 4 3 2 2 4 2 2 quipping 2 quip 38 1 4 3 2 2 4 2 2 quintillion 2 quintic 38 1 4 3 2 2 i 4 3 2 quintus 2 quintet 2 quint 38 1 4 3 2 2 t 4 3 2 Quinn 2 quinine 2 quince 38 1 4 3 2 2 4 2 2 quillwort 2 quill 38 1 4 3 2 2 l 4 1 2 quilt 38 1 4 3 2 2 4 2 2 quietus 2 quiet 38 1 4 3 2 2 t 4 1 2 quiescent 38 1 4 3 2 2 4 3 2 quickstep 2 quicksilver 2 quicksand 38 1 4 3 2 k 2 sl 4 3 2 quickie 2 quicken 2 quick 38 1 4 3 2 2 celnprtxz 4 3 2 quiver 2 quid 2 quibble 38 1 4 3 2 on 2 4 3 2 questions 2 questionnaire 2 question 38 1 4 3 2 t 2 i 4 1 2 quest 38 1 4 3 2 2 4 2 2 query 2 querulous 38 1 4 3 2 2 4 2 2 queer 2 queen 38 1 4 3 2 2 ers 4 7 2 Quezon 2 queue 2 quetzal 2 quench 2 quell 2 Quebec 2 queasy 38 1 4 3 2 2 cdiklnrst 4 6 2 quay 2 quaver 2 quahog 2 quagmire 2 quaff 2 qua 38 1 4 3 2 2 4 2 2 quatrain 2 quaternary 38 1 4 3 2 2 4 2 2 quasiparticle 2 quasi 38 1 4 3 2 2 i 4 2 2 quash 2 quasar 38 1 4 3 2 2 4 2 2 quartzite 2 quartz 38 1 4 3 2 2 4 2 2 quartile 2 quartic 38 1 4 3 2 2 4 2 2 quartermaster 2 quarterback 38 1 4 3 2 2 r 4 1 2 quartet 38 1 4 3 2 2 eiz 4 1 2 quart 38 1 4 3 2 2 4 2 2 quarrymen 2 quarryman 38 1 4 3 2 2 m 4 1 2 quarry 38 1 4 3 2 l 2 4 2 2 quarrelsome 2 quarrel 38 1 4 3 2 2 ey 4 0 38 1 4 3 2 2 rt 4 2 2 quark 2 quarantine 38 1 4 3 2 2 4 3 2 quantities 2 quantity 2 quantitative 38 1 4 3 2 2 t 4 3 2 quantile 2 quantify 2 Quantico 38 1 4 3 2 2 i 4 2 2 quantum 2 quanta 38 1 4 3 2 2 t 4 1 2 quandary 38 1 4 3 2 2 t 4 1 2 qualify 38 1 4 3 2 2 4 2 2 quality 2 qualitative 38 1 4 3 2 2 i 4 1 2 qualm 38 1 4 3 2 e 2 4 2 2 Quakeress 2 quake 38 1 4 3 2 2 4 2 2 quaint 2 quail 38 1 4 3 2 p 2 4 2 2 quadrupole 2 quadruple 38 1 4 3 2 2 4 2 2 quadrillion 2 quadrille 38 1 4 3 2 2 l 4 1 2 quadrilateral 38 1 4 3 2 2 4 2 2 quadriceps 2 quadric 38 1 4 3 2 2 cl 4 2 2 quadrivium 2 quadripartite 38 1 4 3 2 2 nt 4 0 38 1 4 3 2 2 4 2 2 quadrature 2 quadratic 38 1 4 3 2 2 g 4 1 2 quadrant 38 1 4 3 2 2 4 2 2 quadrangular 2 quadrangle 38 1 4 3 2 2 aiu 4 1 2 quadrennial 38 1 4 3 2 2 r 4 1 2 quad 38 1 4 3 2 k 2 4 2 2 quackery 2 quack 38 1 4 3 2 2 aeio 4 0 38 1 4 3 2 2 u 4 4 2 q's 2 QED 2 Qatar 2 q 38 1 4 3 2 gor 2 4 2 2 Pythagorean 2 Pythagoras 38 1 4 3 2 h 2 a 4 1 2 python 38 1 4 3 2 en 2 4 2 2 pyroxenite 2 pyroxene 38 1 4 3 2 ys 2 4 2 2 pyrolysis 2 pyrolyse 38 1 4 3 2 2 lx 4 4 2 pyrotechnic 2 pyrophosphate 2 pyrometer 2 pyroelectric 38 1 4 3 2 2 4 3 2 pyrite 2 pyrimidine 2 pyridine 38 1 4 3 2 2 4 2 2 Pyrex 2 pyre 38 1 4 3 2 id 2 4 2 2 pyramidal 2 pyramid 38 1 4 3 2 2 m 4 1 2 pyracanth 38 1 4 3 2 2 aeio 4 1 2 Pyrrhic 38 1 4 3 2 m 2 4 2 2 pygmy 2 Pygmalion 38 1 4 3 2 2 grt 4 3 2 Pyongyang 2 Pyle 2 pyknotic 38 1 4 3 2 2 4 2 2 putty 2 putt 38 1 4 3 2 2 t 4 4 2 puts 2 Putnam 2 putative 2 put 38 1 4 3 2 y 2 4 2 2 pussycat 2 pussy 38 1 4 3 2 2 4 4 2 pushpin 2 pushout 2 pushbutton 2 push 38 1 4 3 2 2 hs 4 3 2 Pusey 2 Pusan 2 pus 38 1 4 3 2 y 2 4 2 2 purveyor 2 purvey 38 1 4 3 2 2 e 4 1 2 purview 38 1 4 3 2 2 4 3 2 pursuit 2 pursue 2 pursuant 38 1 4 3 2 2 u 4 2 2 purslane 2 purse 38 1 4 3 2 2 4 2 2 purposeful 2 purpose 38 1 4 3 2 s 2 e 4 1 2 purposive 38 1 4 3 2 2 o 4 1 2 purple 38 1 4 3 2 2 4 2 2 purloin 2 purl 38 1 4 3 2 an 2 4 2 2 puritanic 2 Puritan 38 1 4 3 2 2 4 2 2 purine 2 Purina 38 1 4 3 2 2 nt 4 1 2 purify 38 1 4 3 2 t 2 i 4 1 2 purgatory 38 1 4 3 2 2 4 2 2 purgative 2 purgation 38 1 4 3 2 2 a 4 1 2 purge 38 1 4 3 2 2 h 4 1 2 Purcell 38 1 4 3 2 as 2 4 2 2 purchase 2 purchasable 38 1 4 3 2 2 cgilpsv 4 3 2 purr 2 pure 2 Purdue 38 1 4 3 2 2 4 2 2 puppyish 2 puppy 38 1 4 3 2 t 2 4 2 2 puppeteer 2 puppet 38 1 4 3 2 2 ey 4 0 38 1 4 3 2 2 4 2 2 pupate 2 pupal 38 1 4 3 2 2 ap 4 2 2 pupil 2 pup 38 1 4 3 2 2 4 2 2 punky 2 punk 38 1 4 3 2 2 4 3 2 punitive 2 punish 2 Punic 38 1 4 3 2 it 2 4 2 2 punditry 2 pundit 38 1 4 3 2 2 4 2 2 punctuate 2 punctual 38 1 4 3 2 u 2 a 4 1 2 puncture 38 1 4 3 2 2 t 4 1 2 punch 38 1 4 3 2 2 cdik 4 5 2 puny 2 punt 2 punster 2 pungent 2 pun 38 1 4 3 2 in 2 4 2 2 pumpkinseed 2 pumpkin 38 1 4 3 2 2 k 4 1 2 pump 38 1 4 3 2 2 p 4 3 2 pummel 2 pumice 2 puma 38 1 4 3 2 2 4 2 2 pulsate 2 pulsar 38 1 4 3 2 2 a 4 1 2 pulse 38 1 4 3 2 2 4 2 2 pulpit 2 pulp 38 1 4 3 2 2 4 5 2 pullover 2 Pullman 2 pulley 2 pullback 2 pull 38 1 4 3 2 2 lps 4 4 2 pulverable 2 pulmonary 2 Pulitzer 2 Pulaski 38 1 4 3 2 2 4 2 2 Pugh 2 pug 38 1 4 3 2 f 2 4 5 2 puffy 2 puffin 2 puffery 2 puffball 2 puff 38 1 4 3 2 2 4 2 2 Puerto 2 puerile 38 1 4 3 2 2 r 4 1 2 pueblo 38 1 4 3 2 2 4 2 2 puddly 2 puddle 38 1 4 3 2 ng 2 4 2 2 puddingstone 2 pudding 38 1 4 3 2 d 2 il 4 0 38 1 4 3 2 2 4 2 2 puckish 2 puck 38 1 4 3 2 2 k 4 1 2 Puccini 38 1 4 3 2 2 el 4 1 2 pub 38 1 4 3 2 2 4 2 2 publication 2 public 38 1 4 3 2 i 2 c 4 1 2 publish 38 1 4 3 2 2 4 2 2 pubescent 2 puberty 38 1 4 3 2 2 bcdefglmnprst 4 3 2 puzzle 2 puke 2 puissant 38 1 4 3 2 lem 2 4 2 2 Ptolemy 2 Ptolemaic 38 1 4 3 2 2 4 2 2 ptarmigan 2 PTA 38 1 4 3 2 2 Ao 4 1 2 pterodactyl 38 1 4 3 2 h 2 io 4 2 2 psyche 2 psych 38 1 4 3 2 erap 2 4 3 2 psychotherapy 2 psychotherapist 2 psychotherapeutic 38 1 4 3 2 2 h 4 1 2 psychotic 38 1 4 3 2 2 4 3 2 psychosomatic 2 psychosis 2 psychoses 38 1 4 3 2 ysi 2 4 2 2 psychophysiology 2 psychophysic 38 1 4 3 2 th 2 4 2 2 psychopathic 2 psychopath 38 1 4 3 2 2 ah 4 1 2 psychopomp 38 1 4 3 2 2 4 2 2 psychoanalyst 2 psychoanalysis 38 1 4 3 2 aly 2 s 4 1 2 psychoanalytic 38 1 4 3 2 2 n 4 1 2 psychoacoustic 38 1 4 3 2 2 apst 4 4 2 psychometry 2 psychology 2 psychobiology 2 psycho 38 1 4 3 2 tr 2 i 4 1 2 psychiatry 38 1 4 3 2 2 4 2 2 psychiatrist 2 psychiatric 38 1 4 3 2 2 a 4 1 2 psychic 38 1 4 3 2 2 c 4 1 2 psyllium 38 1 4 3 2 l 2 4 2 2 psalter 2 psalm 38 1 4 3 2 2 ay 4 2 2 psi 2 pseudo 38 1 4 3 2 ent 2 4 2 2 prudential 2 prudent 38 1 4 3 2 2 d 4 3 2 Prussia 2 prurient 2 prune 38 1 4 3 2 m 2 a 4 1 2 proximity 38 1 4 3 2 2 4 2 2 proximate 2 proximal 38 1 4 3 2 2 i 4 1 2 proxy 38 1 4 3 2 2 4 3 2 prowl 2 prowess 2 prow 38 1 4 3 2 at 2 i 4 1 2 provocateur 38 1 4 3 2 2 4 2 2 provocative 2 provocation 38 1 4 3 2 2 c 4 2 2 provost 2 provoke 38 1 4 3 2 2 4 2 2 proviso 2 provision 38 1 4 3 2 c 2 4 2 2 provincial 2 province 38 1 4 3 2 2 e 4 1 2 providing 38 1 4 3 2 t 2 4 2 2 providential 2 provident 38 1 4 3 2 2 dns 4 0 38 1 4 3 2 2 nr 4 1 2 prove 38 1 4 3 2 b 2 4 2 2 proverbial 2 proverb 38 1 4 3 2 2 4 2 2 provenance 2 proven 38 1 4 3 2 2 eio 4 0 38 1 4 3 2 2 4 2 2 Proust 2 proud 38 1 4 3 2 i 2 4 2 2 protrusive 2 protrusion 38 1 4 3 2 2 s 4 1 2 protrude 38 1 4 3 2 2 u 4 1 2 protract 38 1 4 3 2 oa 2 4 2 2 protozoan 2 Protozoa 38 1 4 3 2 yp 2 4 2 2 prototypic 2 prototype 38 1 4 3 2 asm 2 4 2 2 protoplasmic 2 protoplasm 38 1 4 3 2 2 l 4 1 2 Protophyta 38 1 4 3 2 2 ptz 4 2 2 proton 2 protocol 38 1 4 3 2 2 4 2 2 protestation 2 protestant 38 1 4 3 2 t 2 a 4 1 2 protest 38 1 4 3 2 ly 2 4 2 2 proteolytic 2 proteolysis 38 1 4 3 2 r 2 4 2 2 protectorate 2 protector 38 1 4 3 2 t 2 o 4 1 2 protect 38 1 4 3 2 2 4 2 2 protease 2 protean 38 1 4 3 2 2 acos 4 2 2 protein 2 protege 38 1 4 3 2 2 4 2 2 protagonist 2 protactinium 38 1 4 3 2 2 aeor 4 2 2 protuberant 2 prothonotary 38 1 4 3 2 tut 2 4 2 2 prostitution 2 prostitute 38 1 4 3 2 2 i 4 3 2 prostrate 2 prosthetic 2 prostate 38 1 4 3 2 2 4 2 2 prosperous 2 prosper 38 1 4 3 2 t 2 4 3 2 prospectus 2 prospector 2 prospect 38 1 4 3 2 e 2 cr 4 0 38 1 4 3 2 2 4 2 2 prosody 2 prosodic 38 1 4 3 2 2 d 4 1 2 prosopopoeia 38 1 4 3 2 ut 2 4 3 2 prosecutor 2 prosecution 2 prosecute 38 1 4 3 2 2 c 4 2 2 Proserpine 2 prose 38 1 4 3 2 i 2 4 2 2 proscription 2 proscribe 38 1 4 3 2 2 r 4 1 2 proscenium 38 1 4 3 2 2 ceopt 4 1 2 prosaic 38 1 4 3 2 2 4 2 2 prorogue 2 prorate 38 1 4 3 2 l 2 4 2 2 propylene 2 propyl 38 1 4 3 2 cepti 2 4 2 2 proprioceptive 2 proprioception 38 1 4 3 2 t 2 4 3 2 propriety 2 proprietor 2 proprietary 38 1 4 3 2 i 2 eo 4 0 38 1 4 3 2 2 ei 4 2 2 proposal 2 propos 38 1 4 3 2 tion 2 4 2 2 proportionate 2 proportion 38 1 4 3 2 2 rs 4 1 2 proponent 38 1 4 3 2 i 2 4 2 2 propitious 2 propitiate 38 1 4 3 2 2 t 4 1 2 propionate 38 1 4 3 2 2 4 2 2 prophetic 2 prophet 38 1 4 3 2 e 2 t 4 2 2 prophesy 2 prophecy 38 1 4 3 2 2 t 4 1 2 proper 38 1 4 3 2 2 l 4 1 2 propel 38 1 4 3 2 2 4 2 2 propeller 2 propelled 38 1 4 3 2 2 e 4 2 2 propelling 2 propellant 38 1 4 3 2 2 lr 4 1 2 propensity 38 1 4 3 2 a 2 n 4 1 2 propagate 38 1 4 3 2 d 2 4 2 2 propagandist 2 propaganda 38 1 4 3 2 2 g 4 1 2 propane 38 1 4 3 2 2 aehiory 4 2 2 propulsion 2 prop 38 1 4 3 2 f 2 r 4 1 2 proof 38 1 4 3 2 e 2 4 2 2 pronounceable 2 pronounce 38 1 4 3 2 un 2 c 4 1 2 pronoun 38 1 4 3 2 2 o 4 4 2 pronunciation 2 pronto 2 prong 2 prone 38 1 4 3 2 t 2 4 2 2 promptitude 2 prompt 38 1 4 3 2 t 2 4 2 2 promotion 2 promote 38 1 4 3 2 u 2 4 2 2 promiscuous 2 promiscuity 38 1 4 3 2 2 c 4 1 2 promise 38 1 4 3 2 2 s 4 1 2 prominent 38 1 4 3 2 2 4 2 2 Prometheus 2 Promethean 38 1 4 3 2 h 2 e 4 1 2 promethium 38 1 4 3 2 2 t 4 1 2 promenade 38 1 4 3 2 2 eiop 4 2 2 promulgate 2 prom 38 1 4 3 2 g 2 4 2 2 prolongate 2 prolong 38 1 4 3 2 2 n 4 1 2 prologue 38 1 4 3 2 2 4 2 2 prolific 2 proliferate 38 1 4 3 2 2 f 4 2 2 prolix 2 proline 38 1 4 3 2 2 io 4 3 2 prolusion 2 proletariat 2 prolate 38 1 4 3 2 2 4 2 2 Prokofieff 2 prokaryote 38 1 4 3 2 ect 2 4 3 2 projector 2 projectile 2 project 38 1 4 3 2 2 4 2 2 prohibitive 2 prohibition 38 1 4 3 2 ibit 2 i 4 2 2 prohibitory 2 prohibit 38 1 4 3 2 2 4 2 2 progressive 2 progression 38 1 4 3 2 ss 2 i 4 1 2 progress 38 1 4 3 2 m 2 m 4 2 2 programs 2 program 38 1 4 3 2 2 r 4 1 2 programmed 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 os 2 4 2 2 prognosticate 2 prognosis 38 1 4 3 2 n 2 4 2 2 progeny 2 progenitor 38 1 4 3 2 2 enr 4 0 38 1 4 3 2 2 4 2 2 profusion 2 profuse 38 1 4 3 2 2 s 4 1 2 profundity 38 1 4 3 2 2 t 4 2 2 profile 2 proficient 38 1 4 3 2 r 2 4 2 2 professorial 2 professor 38 1 4 3 2 ss 2 o 4 2 2 profession 2 profess 38 1 4 3 2 2 eiu 4 5 2 profound 2 profligate 2 proffer 2 profane 2 Prof 38 1 4 3 2 c 2 eit 4 0 38 1 4 3 2 g 2 4 3 2 prodigy 2 prodigious 2 prodigal 38 1 4 3 2 2 iu 4 1 2 prod 38 1 4 3 2 2 4 2 2 proctor 2 Procter 38 1 4 3 2 ste 2 4 2 2 Procrustes 2 procrustean 38 1 4 3 2 2 u 4 2 2 procreate 2 procrastinate 38 1 4 3 2 2 4 2 2 proclamation 2 proclaim 38 1 4 3 2 2 a 4 1 2 proclivity 38 1 4 3 2 s 2 i 4 3 2 processed 2 processor 2 process 38 1 4 3 2 ur 2 e 4 1 2 procedural 38 1 4 3 2 2 ds 4 1 2 proceed 38 1 4 3 2 2 elrt 4 3 2 Procyon 2 procure 2 procaine 38 1 4 3 2 em 2 4 3 2 problems 2 problematic 2 problem 38 1 4 3 2 2 b 4 1 2 probate 38 1 4 3 2 2 al 4 1 2 probe 38 1 4 3 2 2 bcdfghjklmnoprstuvwx 4 1 2 pro 38 1 4 3 2 e 2 4 2 2 prizewinning 2 prize 38 1 4 3 2 2 4 2 2 private 2 privacy 38 1 4 3 2 2 a 4 3 2 privy 2 privilege 2 privet 38 1 4 3 2 2 4 2 2 prismatic 2 prism 38 1 4 3 2 2 m 4 4 2 pristine 2 prissy 2 prison 2 Priscilla 38 1 4 3 2 r 2 4 3 2 priory 2 priori 2 prior 38 1 4 3 2 2 4 3 2 printout 2 printmake 2 print 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 p 2 4 3 2 principle 2 Principia 2 principal 38 1 4 3 2 2 4 3 2 Princeton 2 princess 2 prince 38 1 4 3 2 2 ct 4 0 38 1 4 3 2 2 4 3 2 primed 2 primeval 2 prime 38 1 4 3 2 2 4 5 2 primate 2 primary 2 primal 2 primacy 2 prima 38 1 4 3 2 2 ae 4 4 2 primrose 2 primp 2 primitive 2 prim 38 1 4 3 2 2 4 2 2 priggish 2 prig 38 1 4 3 2 st 2 4 2 2 Priestley 2 priest 38 1 4 3 2 2 4 2 2 prickle 2 prick 38 1 4 3 2 2 ke 4 0 38 1 4 3 2 2 cegmnosvz 4 3 2 Pritchard 2 pride 2 Priam 38 1 4 3 2 nti 2 4 2 2 preventive 2 prevention 38 1 4 3 2 2 4 2 2 prevalent 2 prevail 38 1 4 3 2 2 ae 4 1 2 previous 38 1 4 3 2 2 4 3 2 pretty 2 Pretoria 2 pretentious 38 1 4 3 2 ti 2 4 2 2 presumptive 2 presumption 38 1 4 3 2 m 2 p 4 2 2 presuming 2 presume 38 1 4 3 2 2 4 2 2 Preston 2 presto 38 1 4 3 2 2 g 4 1 2 prestidigitate 38 1 4 3 2 2 4 2 2 prestigious 2 prestige 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 4 2 2 pressure 2 press 38 1 4 3 2 t 2 4 2 2 presidential 2 president 38 1 4 3 2 de 2 n 4 1 2 preside 38 1 4 3 2 2 n 4 1 2 preservation 38 1 4 3 2 ipti 2 4 2 2 prescriptive 2 prescription 38 1 4 3 2 2 r 4 1 2 Prescott 38 1 4 3 2 2 ceistu 4 1 2 Presbyterian 38 1 4 3 2 dera 2 4 2 2 preponderate 2 preponderant 38 1 4 3 2 2 n 4 1 2 preposterous 38 1 4 3 2 t 2 i 4 1 2 preparatory 38 1 4 3 2 2 4 2 2 preparative 2 preparation 38 1 4 3 2 r 2 a 4 1 2 prepare 38 1 4 3 2 2 ao 4 1 2 prep 38 1 4 3 2 2 e 4 2 2 premium 2 premise 38 1 4 3 2 r 2 4 2 2 premiere 2 premier 38 1 4 3 2 2 i 4 1 2 premonition 38 1 4 3 2 2 4 2 2 prelude 2 preliminary 38 1 4 3 2 2 4 2 2 preferring 2 preferred 38 1 4 3 2 n 2 4 2 2 preferential 2 preference 38 1 4 3 2 2 er 4 1 2 prefer 38 1 4 3 2 t 2 4 2 2 prefecture 2 prefect 38 1 4 3 2 2 cr 4 0 38 1 4 3 2 2 4 2 2 prefatory 2 prefab 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 pt 2 i 4 2 2 preemptor 2 preempt 38 1 4 3 2 2 4 2 2 preemptive 2 preemption 38 1 4 3 2 2 m 4 1 2 preen 38 1 4 3 2 2 at 4 0 38 1 4 3 2 2 4 2 2 predictor 2 predict 38 1 4 3 2 2 4 2 2 predicate 2 predicament 38 1 4 3 2 2 c 4 1 2 predilect 38 1 4 3 2 2 i 4 2 2 predecessor 2 predatory 38 1 4 3 2 ci 2 4 2 2 precocity 2 precocious 38 1 4 3 2 2 4 2 2 precision 2 precise 38 1 4 3 2 2 4 2 2 precipitate 2 precipitable 38 1 4 3 2 2 a 4 1 2 precipitous 38 1 4 3 2 i 2 t 4 1 2 precipice 38 1 4 3 2 2 ps 4 2 2 precious 2 precinct 38 1 4 3 2 2 4 3 2 precess 2 precept 2 precedent 38 1 4 3 2 2 4 2 2 precarious 2 Precambrian 38 1 4 3 2 2 aeio 4 1 2 preclude 38 1 4 3 2 ch 2 4 2 2 preachy 2 preach 38 1 4 3 2 2 acdeflmpstv 4 6 2 prey 2 prexy 2 prerogative 2 Prentice 2 prejudice 2 pregnant 38 1 4 3 2 2 4 2 2 prayerful 2 pray 38 1 4 3 2 2 4 2 2 prank 2 prance 38 1 4 3 2 e 2 4 2 2 praiseworthy 2 praise 38 1 4 3 2 2 s 4 1 2 prairie 38 1 4 3 2 ati 2 s 4 1 2 pragmatic 38 1 4 3 2 2 4 2 2 pragmatist 2 pragmatism 38 1 4 3 2 2 m 4 1 2 Prague 38 1 4 3 2 ti 2 c 4 2 2 practitioner 2 practise 38 1 4 3 2 2 a 4 1 2 practice 38 1 4 3 2 2 4 2 2 practical 2 practicable 38 1 4 3 2 2 cginy 4 6 2 Pravda 2 Pratt 2 praseodymium 2 pram 2 praecox 2 Prado 38 1 4 3 2 2 aeiou 4 2 2 pry 2 PR 38 1 4 3 2 2 4 3 2 powerhouse 2 powerful 2 power 38 1 4 3 2 2 r 4 1 2 Powell 38 1 4 3 2 er 2 4 3 2 powdery 2 powderpuff 2 powder 38 1 4 3 2 2 de 4 1 2 pow 38 1 4 3 2 2 4 2 2 pound 2 pounce 38 1 4 3 2 t 2 4 2 2 poultry 2 poultice 38 1 4 3 2 2 ln 4 4 2 pout 2 pour 2 Poughkeepsie 2 pouch 38 1 4 3 2 2 4 2 2 Potts 2 pottery 38 1 4 3 2 2 4 2 2 potentiometer 2 potential 38 1 4 3 2 nt 2 i 4 2 2 potentate 2 potent 38 1 4 3 2 2 4 2 2 potboil 2 potbelly 38 1 4 3 2 o 2 4 2 2 potatoes 2 potato 38 1 4 3 2 2 4 2 2 potassium 2 potash 38 1 4 3 2 2 st 4 1 2 potable 38 1 4 3 2 2 abet 4 6 2 potpourri 2 Potomac 2 potlatch 2 potion 2 pothole 2 pot 38 1 4 3 2 2 4 2 2 posture 2 postulate 38 1 4 3 2 ocess 2 4 2 2 postprocessor 2 postprocess 38 1 4 3 2 2 4 2 2 postposition 2 postpone 38 1 4 3 2 2 or 4 0 38 1 4 3 2 2 4 2 2 postorder 2 postoperative 38 1 4 3 2 2 4 3 2 postmaster 2 postmark 2 postman 38 1 4 3 2 2 a 4 3 2 postmultiply 2 postmortem 2 postmen 38 1 4 3 2 r 2 4 2 2 posteriori 2 posterior 38 1 4 3 2 ri 2 o 4 1 2 posterity 38 1 4 3 2 2 4 2 2 postcondition 2 postcard 38 1 4 3 2 2 4 2 2 postal 2 postage 38 1 4 3 2 2 acemopu 4 8 2 postwar 2 postscript 2 postlude 2 posthumous 2 postgraduate 2 postfix 2 postdoctoral 2 post 38 1 4 3 2 2 ms 4 1 2 posse 38 1 4 3 2 2 4 2 2 possessive 2 possession 38 1 4 3 2 s 2 i 4 2 2 possessor 2 possess 38 1 4 3 2 2 4 2 2 possemen 2 posseman 38 1 4 3 2 2 ei 4 1 2 possum 38 1 4 3 2 2 4 2 2 positive 2 position 38 1 4 3 2 t 2 i 4 2 2 positron 2 posit 38 1 4 3 2 2 4 4 2 posey 2 poseur 2 Poseidon 2 pose 38 1 4 3 2 2 eist 4 4 2 posy 2 Posner 2 posh 2 posable 38 1 4 3 2 2 4 2 2 Portuguese 2 Portugal 38 1 4 3 2 2 g 4 1 2 portulaca 38 1 4 3 2 2 4 2 2 portrayal 2 portray 38 1 4 3 2 t 2 4 2 2 portraiture 2 portrait 38 1 4 3 2 a 2 iy 4 0 38 1 4 3 2 2 4 2 2 portico 2 Portia 38 1 4 3 2 2 4 2 2 portentous 2 portent 38 1 4 3 2 2 t 4 1 2 portend 38 1 4 3 2 2 n 4 2 2 porterhouse 2 Porte 38 1 4 3 2 2 4 3 2 portable 2 portal 2 portage 38 1 4 3 2 2 aeiru 4 6 2 Portsmouth 2 Porto 2 portmanteau 2 portland 2 portfolio 2 port 38 1 4 3 2 2 4 2 2 porpoise 2 porphyry 38 1 4 3 2 2 4 2 2 porous 2 porosity 38 1 4 3 2 ograph 2 4 2 2 pornography 2 pornographer 38 1 4 3 2 2 4 4 2 porcupine 2 porcine 2 porch 2 porcelain 38 1 4 3 2 2 cnopt 4 3 2 porridge 2 pork 2 pore 38 1 4 3 2 s 2 4 2 2 populist 2 populism 38 1 4 3 2 2 t 4 2 2 popular 2 populace 38 1 4 3 2 l 2 ai 4 1 2 populous 38 1 4 3 2 2 4 2 2 poplin 2 poplar 38 1 4 3 2 2 lu 4 4 2 poppy 2 popish 2 pope 2 pop 38 1 4 3 2 2 4 2 2 Poole 2 pool 38 1 4 3 2 2 l 4 5 2 poor 2 poop 2 pooh 2 poodle 2 pooch 38 1 4 3 2 c 2 4 2 2 pontificate 2 pontific 38 1 4 3 2 2 i 4 1 2 pontiff 38 1 4 3 2 2 f 4 1 2 Pontiac 38 1 4 3 2 2 i 4 1 2 pont 38 1 4 3 2 r 2 4 2 2 ponderous 2 ponder 38 1 4 3 2 2 e 4 1 2 pond 38 1 4 3 2 2 h 4 1 2 Ponce 38 1 4 3 2 2 4 2 2 poncho 2 Ponchartrain 38 1 4 3 2 2 cdt 4 2 2 pony 2 pong 38 1 4 3 2 2 4 3 2 pompous 2 pomposity 2 pompon 38 1 4 3 2 2 4 2 2 pompey 2 Pompeii 38 1 4 3 2 2 4 2 2 pompano 2 pompadour 38 1 4 3 2 2 aeo 4 1 2 pomp 38 1 4 3 2 2 p 4 3 2 Pomona 2 pomegranate 2 pomade 38 1 4 3 2 2 4 3 2 polytypy 2 polytope 2 polytechnic 38 1 4 3 2 2 4 2 2 polyphony 2 Polyphemus 38 1 4 3 2 2 h 4 1 2 polyploidy 38 1 4 3 2 rph 2 4 2 2 polymorphic 2 polymorph 38 1 4 3 2 r 2 4 3 2 polymeric 2 polymerase 2 polymer 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 dr 2 a 4 1 2 polyhedron 38 1 4 3 2 2 4 2 2 polyhedral 2 polyhedra 38 1 4 3 2 2 e 4 1 2 Polyhymnia 38 1 4 3 2 n 2 4 2 2 polygonal 2 polygon 38 1 4 3 2 2 o 4 1 2 polygynous 38 1 4 3 2 2 ghmpt 4 2 2 polysaccharide 2 polynomial 38 1 4 3 2 2 4 2 2 polonium 2 polonaise 38 1 4 3 2 2 n 4 2 2 polopony 2 polo 38 1 4 3 2 2 4 3 2 pollution 2 pollute 2 pollutant 38 1 4 3 2 2 t 4 1 2 Pollux 38 1 4 3 2 2 4 2 2 polloi 2 pollock 38 1 4 3 2 2 ou 4 4 2 pollinate 2 pollen 2 Pollard 2 poll 38 1 4 3 2 2 4 2 2 polkadot 2 polka 38 1 4 3 2 2 a 4 1 2 Polk 38 1 4 3 2 c 2 4 6 2 politics 2 political 2 politico 2 politicking 2 politician 2 politic 38 1 4 3 2 2 i 4 3 2 polity 2 polite 2 Politburo 38 1 4 3 2 2 4 2 2 polish 2 polis 38 1 4 3 2 2 4 2 2 poliomyelitis 2 polio 38 1 4 3 2 2 e 4 2 2 policies 2 policy 38 1 4 3 2 2 m 4 1 2 police 38 1 4 3 2 2 4 2 2 policemen 2 policeman 38 1 4 3 2 2 cost 4 0 38 1 4 3 2 2 4 3 2 polemic 2 polecat 2 pole 38 1 4 3 2 ra 2 p 4 1 2 polarogram 38 1 4 3 2 h 2 4 2 2 polarography 2 polarograph 38 1 4 3 2 2 g 4 2 2 polaron 2 Polaroid 38 1 4 3 2 2 4 2 2 polariscope 2 Polaris 38 1 4 3 2 2 s 4 2 2 polariton 2 polarimeter 38 1 4 3 2 2 io 4 1 2 polar 38 1 4 3 2 2 r 4 1 2 Poland 38 1 4 3 2 2 aeikloy 4 1 2 pol 38 1 4 3 2 e 2 4 2 2 pokerface 2 poke 38 1 4 3 2 n 2 4 2 2 poisonous 2 poison 38 1 4 3 2 2 o 4 2 2 Poisson 2 poise 38 1 4 3 2 2 4 3 2 points 2 pointwise 2 point 38 1 4 3 2 2 t 4 2 2 poinsettia 2 Poincare 38 1 4 3 2 2 ns 4 2 2 poignant 2 poi 38 1 4 3 2 2 4 2 2 pogrom 2 pogo 38 1 4 3 2 2 4 3 2 poetry 2 poetic 2 poet 38 1 4 3 2 2 t 4 3 2 poesy 2 poem 2 Poe 38 1 4 3 2 2 4 2 2 podium 2 podia 38 1 4 3 2 2 i 4 2 2 podge 2 pod 38 1 4 3 2 et 2 4 3 2 pocketful 2 pocketbook 2 pocket 38 1 4 3 2 2 k 4 1 2 Pocono 38 1 4 3 2 2 cdegiklmnoprstuw 4 5 2 Poynting 2 poverty 2 POBox 2 poach 2 Po 38 1 4 3 2 2 4 2 2 pneumonia 2 pneumococcus 38 1 4 3 2 eum 2 o 4 1 2 pneumatic 38 1 4 3 2 2 4 4 2 plywood 2 plyscore 2 Plymouth 2 ply 38 1 4 3 2 2 4 2 2 plutonium 2 pluton 38 1 4 3 2 2 n 4 1 2 Pluto 38 1 4 3 2 2 o 4 1 2 Plutarch 38 1 4 3 2 2 4 2 2 plushy 2 plush 38 1 4 3 2 2 h 4 1 2 plus 38 1 4 3 2 2 4 3 2 plunk 2 plunge 2 plunder 38 1 4 3 2 2 4 2 2 plumbate 2 plumbago 38 1 4 3 2 2 a 4 1 2 plumb 38 1 4 3 2 2 b 4 5 2 plump 2 plummet 2 plume 2 plumage 2 plum 38 1 4 3 2 2 4 2 2 plugging 2 pluggable 38 1 4 3 2 2 g 4 2 2 plugboard 2 plug 38 1 4 3 2 k 2 4 2 2 plucky 2 pluck 38 1 4 3 2 2 cgmnst 4 2 2 plural 2 pluperfect 38 1 4 3 2 2 4 3 2 plowshare 2 plowman 2 plow 38 1 4 3 2 2 w 4 4 2 plover 2 plot 2 plop 2 plod 38 1 4 3 2 2 4 2 2 pliant 2 pliable 38 1 4 3 2 2 a 4 3 2 Pliocene 2 Pliny 2 plight 38 1 4 3 2 ra 2 4 2 2 pleural 2 pleura 38 1 4 3 2 2 4 2 2 plenty 2 plentiful 38 1 4 3 2 2 4 2 2 plenitude 2 plenipotentiary 38 1 4 3 2 2 it 4 2 2 plenum 2 plenary 38 1 4 3 2 2 4 2 2 Pleistocene 2 Pleiades 38 1 4 3 2 2 4 2 2 plebian 2 plebeian 38 1 4 3 2 2 s 4 3 2 pleat 2 plead 2 plea 38 1 4 3 2 2 e 4 2 2 pleasure 2 pleasant 38 1 4 3 2 2 abinu 4 3 2 Plexiglas 2 plethora 2 pledge 38 1 4 3 2 ri 2 4 2 2 playwriting 2 playwright 38 1 4 3 2 2 4 2 2 playboy 2 playback 38 1 4 3 2 2 bwe 4 11 2 playing 2 plays 2 playtime 2 playroom 2 playoff 2 playmate 2 playhouse 2 playground 2 playful 2 playa 2 play 38 1 4 3 2 2 4 2 2 Platonist 2 Platonism 38 1 4 3 2 i 2 s 4 1 2 platonic 38 1 4 3 2 2 n 4 2 2 platoon 2 Plato 38 1 4 3 2 ud 2 4 2 2 platitudinous 2 platitude 38 1 4 3 2 2 t 4 1 2 platinum 38 1 4 3 2 2 4 4 2 platen 2 platelet 2 plateau 2 plate 38 1 4 3 2 2 eio 4 4 2 platypus 2 Platte 2 platform 2 plat 38 1 4 3 2 2 4 2 2 plastisol 2 plastic 38 1 4 3 2 2 i 4 2 2 plastron 2 plaster 38 1 4 3 2 2 4 3 2 plasmon 2 plasma 2 plasm 38 1 4 3 2 2 mt 4 0 38 1 4 3 2 2 4 2 2 plantation 2 plantain 38 1 4 3 2 2 a 4 2 2 plants 2 plant 38 1 4 3 2 con 2 4 2 2 planoconvex 2 planoconcave 38 1 4 3 2 2 4 2 2 plankton 2 plank 38 1 4 3 2 2 4 2 2 planetarium 2 planetaria 38 1 4 3 2 r 2 i 4 1 2 planetary 38 1 4 3 2 2 a 4 3 2 planetoid 2 planetesimal 2 planet 38 1 4 3 2 2 t 4 2 2 planeload 2 plane 38 1 4 3 2 2 ekotn 4 4 2 plans 2 Planck 2 planar 2 plan 38 1 4 3 2 i 2 4 2 2 plaintive 2 plaintiff 38 1 4 3 2 2 t 4 2 2 Plainfield 2 plain 38 1 4 3 2 2 n 4 1 2 plaid 38 1 4 3 2 e 2 4 2 2 plaguey 2 plague 38 1 4 3 2 2 a 4 1 2 plagioclase 38 1 4 3 2 ris 2 4 2 2 plagiarist 2 plagiarism 38 1 4 3 2 2 iu 4 0 38 1 4 3 2 2 ae 4 1 2 placid 38 1 4 3 2 ta 2 4 2 2 placental 2 placenta 38 1 4 3 2 2 n 4 5 2 places 2 placeholder 2 placebo 2 placeable 2 place 38 1 4 3 2 te 2 4 2 2 placater 2 placate 38 1 4 3 2 2 cginsty 4 3 2 plaza 2 plausible 2 plaque 38 1 4 3 2 2 aeiouy 4 1 2 Pl 38 1 4 3 2 z 2 4 2 2 pizzicato 2 pizza 38 1 4 3 2 2 4 2 2 pixy 2 pixel 38 1 4 3 2 ot 2 4 2 2 pivotal 2 pivot 38 1 4 3 2 2 4 3 2 Pittston 2 Pittsfield 2 Pittsburgh 38 1 4 3 2 2 s 4 1 2 Pitt 38 1 4 3 2 2 4 2 2 pitiful 2 pitiable 38 1 4 3 2 2 4 2 2 pithy 2 pith 38 1 4 3 2 h 2 4 4 2 pitchstone 2 pitchfork 2 pitchblende 2 pitch 38 1 4 3 2 2 chit 4 7 2 pity 2 pituitary 2 Pitney 2 pitman 2 pitfall 2 piteous 2 pit 38 1 4 3 2 2 4 2 2 pistole 2 pistol 38 1 4 3 2 2 l 4 1 2 piston 38 1 4 3 2 2 o 4 1 2 pistachio 38 1 4 3 2 2 4 2 2 Pisces 2 Piscataway 38 1 4 3 2 2 ct 4 1 2 piss 38 1 4 3 2 2 4 2 2 pirouette 2 pirogue 38 1 4 3 2 2 4 3 2 pirate 2 Piraeus 2 piracy 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 u 2 4 2 2 pique 2 piquant 38 1 4 3 2 2 4 3 2 pipette 2 pipeline 2 pipe 38 1 4 3 2 2 e 4 2 2 pipsissewa 2 pip 38 1 4 3 2 2 4 2 2 pioneer 2 pion 38 1 4 3 2 2 n 4 2 2 pious 2 Piotr 38 1 4 3 2 2 4 3 2 pinto 2 pintail 2 pint 38 1 4 3 2 2 4 2 2 Pinsky 2 pinscher 38 1 4 3 2 a 2 4 2 2 pinnate 2 pinnacle 38 1 4 3 2 2 4 2 2 pinkish 2 pinkie 38 1 4 3 2 2 i 4 1 2 pink 38 1 4 3 2 2 4 2 2 pinhole 2 pinhead 38 1 4 3 2 2 4 3 2 Pinehurst 2 pineapple 2 pine 38 1 4 3 2 2 4 2 2 pincushion 2 pinch 38 1 4 3 2 2 cehknst 4 9 2 pinxter 2 pinwheel 2 pinpoint 2 pinochle 2 pinion 2 ping 2 pinball 2 pinafore 2 pin 38 1 4 3 2 p 2 4 2 2 pimple 2 pimp 38 1 4 3 2 2 4 2 2 pillow 2 pillory 38 1 4 3 2 2 4 2 2 pillar 2 pillage 38 1 4 3 2 2 ao 4 2 2 Pillsbury 2 pill 38 1 4 3 2 rim 2 4 2 2 pilgrimage 2 pilgrim 38 1 4 3 2 er 2 4 2 2 pilferage 2 pilfer 38 1 4 3 2 2 4 2 2 pilewort 2 pile 38 1 4 3 2 2 efgl 4 2 2 pilot 2 Pilate 38 1 4 3 2 ent 2 4 2 2 pigmentation 2 pigment 38 1 4 3 2 2 4 2 2 piggish 2 pigging 38 1 4 3 2 2 i 4 1 2 piggy 38 1 4 3 2 on 2 4 4 2 pigeonhole 2 pigeonfoot 2 pigeonberry 2 pigeon 38 1 4 3 2 2 egm 4 5 2 pigtail 2 pigskin 2 pigroot 2 pigpen 2 pig 38 1 4 3 2 2 4 2 2 piety 2 pietism 38 1 4 3 2 2 4 4 2 Pierson 2 Pierre 2 pierce 2 pier 38 1 4 3 2 e 2 4 3 2 piecewise 2 piecemeal 2 piece 38 1 4 3 2 2 crt 4 3 2 piezoelectric 2 Piedmont 2 pie 38 1 4 3 2 2 4 2 2 pidgin 2 piddle 38 1 4 3 2 re 2 4 2 2 picturesque 2 picture 38 1 4 3 2 2 u 4 1 2 pictorial 38 1 4 3 2 2 4 3 2 picosecond 2 picojoule 2 picofarad 38 1 4 3 2 2 4 2 2 picnicker 2 picnicked 38 1 4 3 2 2 e 4 1 2 picnicking 38 1 4 3 2 ic 2 k 4 1 2 picnic 38 1 4 3 2 2 4 2 2 Pickett 2 picket 38 1 4 3 2 2 4 2 2 Pickering 2 pickerel 38 1 4 3 2 2 rt 4 0 38 1 4 3 2 2 e 4 8 2 picky 2 pickup 2 pickoff 2 Pickman 2 pickle 2 Pickford 2 pickaxe 2 pick 38 1 4 3 2 2 4 2 2 piccolo 2 Piccadilly 38 1 4 3 2 2 4 3 2 picayune 2 Picasso 2 pica 38 1 4 3 2 2 acknot 4 0 38 1 4 3 2 2 i 4 1 2 piano 38 1 4 3 2 s 2 4 2 2 pianist 2 pianissimo 38 1 4 3 2 2 n 4 1 2 piazza 38 1 4 3 2 2 acdeglmnopqrstvxz 4 3 2 Pius 2 pike 2 pi 38 1 4 3 2 herap 2 4 2 2 physiotherapy 2 physiotherapist 38 1 4 3 2 2 t 4 3 2 physiology 2 physiognomy 2 physiochemical 38 1 4 3 2 2 4 2 2 physician 2 physic 38 1 4 3 2 i 2 co 4 2 2 physique 2 Physik 38 1 4 3 2 2 4 3 2 phylogeny 2 Phyllis 2 phyla 38 1 4 3 2 2 ls 4 2 2 phytoplankton 2 phycomycetes 38 1 4 3 2 ase 2 4 3 2 phraseology 2 phrasemake 2 phrase 38 1 4 3 2 y 2 4 2 2 photolytic 2 photolysis 38 1 4 3 2 2 4 2 2 photography 2 photogenic 38 1 4 3 2 o 2 gl 4 3 2 photon 2 photometry 2 photo 38 1 4 3 2 sce 2 4 2 2 phosphorescent 2 phosphoresce 38 1 4 3 2 r 2 e 4 4 2 phosphorylate 2 phosphorus 2 phosphoric 2 phosphor 38 1 4 3 2 2 4 2 2 phosphine 2 phosphide 38 1 4 3 2 h 2 io 4 1 2 phosphate 38 1 4 3 2 2 p 4 1 2 phosgene 38 1 4 3 2 2 4 3 2 phonon 2 phonology 2 phonograph 38 1 4 3 2 2 4 2 2 phonemic 2 phoneme 38 1 4 3 2 2 m 4 2 2 phonetic 2 phone 38 1 4 3 2 2 eo 4 3 2 phony 2 phonic 2 phon 38 1 4 3 2 i 2 4 2 2 phoenix 2 Phoenicia 38 1 4 3 2 2 n 4 1 2 phoebe 38 1 4 3 2 2 enst 4 1 2 phobic 38 1 4 3 2 o 2 4 2 2 phlox 2 phloem 38 1 4 3 2 oph 2 4 3 2 philosophy 2 philosophic 2 philosoph 38 1 4 3 2 2 s 4 2 2 philology 2 philodendron 38 1 4 3 2 2 4 2 2 Philippine 2 Philip 38 1 4 3 2 2 p 4 1 2 Philistine 38 1 4 3 2 throp 2 4 3 2 philanthropy 2 philanthropic 2 philanthrope 38 1 4 3 2 2 n 4 1 2 Philadelphia 38 1 4 3 2 2 aio 4 3 2 Phillip 2 philharmonic 2 Phil 38 1 4 3 2 2 l 4 2 2 Phipps 2 phi 38 1 4 3 2 l 2 4 2 2 phenylalanine 2 phenyl 38 1 4 3 2 2 lm 4 1 2 phenotype 38 1 4 3 2 2 4 2 2 phenomenon 2 phenomenology 38 1 4 3 2 2 4 2 2 phenomenal 2 phenomena 38 1 4 3 2 en 2 ao 4 0 38 1 4 3 2 2 4 2 2 phenolic 2 phenol 38 1 4 3 2 2 oy 4 0 38 1 4 3 2 2 n 4 2 2 Phelps 2 pheasant 38 1 4 3 2 2 glnr 4 1 2 phase 38 1 4 3 2 2 4 2 2 pharmacopoeia 2 pharmacology 38 1 4 3 2 mac 2 o 4 3 2 pharmacy 2 pharmacist 2 pharmaceutic 38 1 4 3 2 t 2 4 2 2 phantom 2 phantasy 38 1 4 3 2 2 4 2 2 phalanx 2 phalanger 38 1 4 3 2 a 2 n 4 1 2 phalarope 38 1 4 3 2 2 4 2 2 phagocyte 2 phage 38 1 4 3 2 2 aeilory 4 2 2 phthalate 2 PhD 38 1 4 3 2 2 4 2 2 Pfizer 2 pfennig 38 1 4 3 2 2 4 3 2 pewter 2 pewee 2 pew 38 1 4 3 2 2 4 2 2 petunia 2 petulant 38 1 4 3 2 2 4 2 2 petty 2 petticoat 38 1 4 3 2 2 4 3 2 petrology 2 petroleum 2 petrol 38 1 4 3 2 2 l 4 2 2 petroglyph 2 petrochemical 38 1 4 3 2 2 4 2 2 petrify 2 petri 38 1 4 3 2 2 io 4 1 2 petrel 38 1 4 3 2 t 2 4 3 2 petition 2 petite 2 petit 38 1 4 3 2 s 2 4 3 2 Peterson 2 Petersen 2 Petersburg 38 1 4 3 2 2 r 4 1 2 Pete 38 1 4 3 2 2 eirtu 4 3 2 pets 2 petal 2 pet 38 1 4 3 2 ent 2 4 2 2 pestilential 2 pestilent 38 1 4 3 2 2 l 4 1 2 pesticide 38 1 4 3 2 2 i 4 3 2 pestle 2 peste 2 pest 38 1 4 3 2 im 2 i 4 2 2 pessimum 2 pessimal 38 1 4 3 2 s 2 4 2 2 pessimist 2 pessimism 38 1 4 3 2 2 st 4 0 38 1 4 3 2 2 4 2 2 perversion 2 perverse 38 1 4 3 2 r 2 s 4 1 2 pervert 38 1 4 3 2 2 s 4 1 2 pervade 38 1 4 3 2 i 2 4 2 2 pervasive 2 pervasion 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 peruse 2 perusal 38 1 4 3 2 2 s 4 2 2 Peruvian 2 Peru 38 1 4 3 2 rb 2 4 2 2 perturbate 2 perturb 38 1 4 3 2 n 2 4 2 2 pertinent 2 pertinacious 38 1 4 3 2 2 iu 4 3 2 Perth 2 pertain 2 pert 38 1 4 3 2 i 2 4 2 2 persuasive 2 persuasion 38 1 4 3 2 a 2 s 4 1 2 persuade 38 1 4 3 2 2 4 2 2 perspire 2 perspiration 38 1 4 3 2 2 u 4 1 2 perspicacious 38 1 4 3 2 2 4 2 2 perspicuous 2 perspicuity 38 1 4 3 2 2 cr 4 0 38 1 4 3 2 2 i 4 1 2 perspective 38 1 4 3 2 2 l 4 2 2 personage 2 persona 38 1 4 3 2 n 2 a 4 3 2 personnel 2 personify 2 person 38 1 4 3 2 t 2 4 2 2 persistent 2 persist 38 1 4 3 2 2 s 4 3 2 persimmon 2 persiflage 2 Persia 38 1 4 3 2 2 cv 4 1 2 Perseus 38 1 4 3 2 er 2 4 2 2 persevere 2 perseverant 38 1 4 3 2 ut 2 4 3 2 persecutory 2 persecution 2 persecute 38 1 4 3 2 2 eiopu 4 1 2 Pershing 38 1 4 3 2 2 t 4 1 2 perpendicular 38 1 4 3 2 2 4 2 2 perpetuate 2 perpetual 38 1 4 3 2 2 a 4 1 2 perpetuity 38 1 4 3 2 2 u 4 1 2 perpetrate 38 1 4 3 2 2 e 4 1 2 perplex 38 1 4 3 2 t 2 4 2 2 permute 2 permutation 38 1 4 3 2 2 4 2 2 permitting 2 permitted 38 1 4 3 2 2 t 4 1 2 permit 38 1 4 3 2 si 2 4 3 2 permissive 2 permission 2 permissible 38 1 4 3 2 2 st 4 1 2 Permian 38 1 4 3 2 a 2 4 2 2 permeate 2 permeable 38 1 4 3 2 2 4 2 2 permanent 2 permalloy 38 1 4 3 2 2 aeiu 4 0 38 1 4 3 2 2 4 3 2 perky 2 Perkins 2 perk 38 1 4 3 2 ur 2 4 2 2 perjury 2 perjure 38 1 4 3 2 2 4 2 2 perish 2 periscope 38 1 4 3 2 r 2 4 2 2 periphery 2 peripheral 38 1 4 3 2 2 e 4 1 2 periphrastic 38 1 4 3 2 2 h 4 1 2 peripatetic 38 1 4 3 2 d 2 4 2 2 periodic 2 period 38 1 4 3 2 2 4 3 2 perilous 2 Perilla 2 peril 38 1 4 3 2 le 2 4 2 2 Pericles 2 Periclean 38 1 4 3 2 2 clops 4 5 2 periwinkle 2 peritectic 2 perimeter 2 perihelion 2 peridotite 38 1 4 3 2 e 2 4 2 2 perfumery 2 perfume 38 1 4 3 2 2 m 4 2 2 perfusion 2 perfunctory 38 1 4 3 2 2 a 4 1 2 perform 38 1 4 3 2 r 2 m 4 2 2 perforce 2 perforate 38 1 4 3 2 d 2 4 2 2 perfidy 2 perfidious 38 1 4 3 2 ct 2 4 2 2 perfectible 2 perfect 38 1 4 3 2 2 eiou 4 0 38 1 4 3 2 2 4 4 2 perestroika 2 Perez 2 perennial 2 peremptory 38 1 4 3 2 ssi 2 4 2 2 percussive 2 percussion 38 1 4 3 2 2 4 3 2 perchlorate 2 perchance 2 perch 38 1 4 3 2 2 np 4 1 2 perceive 38 1 4 3 2 2 4 3 2 perceptive 2 perception 2 perceptible 38 1 4 3 2 t 2 i 4 2 2 perceptual 2 percept 38 1 4 3 2 t 2 4 3 2 percentile 2 percentage 2 percent 38 1 4 3 2 2 ehu 4 3 2 Percy 2 percolate 2 Percival 38 1 4 3 2 2 cefijkmpstuv 4 9 2 Perry 2 perquisite 2 peroxide 2 pernicious 2 Perle 2 perhaps 2 Pergamon 2 perdition 2 per 38 1 4 3 2 i 2 4 2 2 PepsiCo 2 Pepsi 38 1 4 3 2 r 2 4 4 2 peppery 2 pepperoni 2 peppermint 2 peppergrass 38 1 4 3 2 2 e 4 1 2 peppy 38 1 4 3 2 2 ps 4 2 2 peptide 2 pep 38 1 4 3 2 2 4 3 2 Peoria 2 people 2 peony 38 1 4 3 2 2 4 2 2 penury 2 penurious 38 1 4 3 2 2 r 4 2 2 penumbra 2 penultimate 38 1 4 3 2 cost 2 4 2 2 pentecostal 2 Pentecost 38 1 4 3 2 2 o 4 1 2 pentagram 38 1 4 3 2 n 2 4 2 2 pentagonal 2 pentagon 38 1 4 3 2 2 g 4 1 2 pentane 38 1 4 3 2 2 ae 4 2 2 penthouse 2 pent 38 1 4 3 2 2 4 2 2 pensive 2 pension 38 1 4 3 2 2 i 4 1 2 Pensacola 38 1 4 3 2 2 4 2 2 pennyroyal 2 penny 38 1 4 3 2 2 4 2 2 pennant 2 penna 38 1 4 3 2 2 ay 4 2 2 Pennsylvania 2 Penn 38 1 4 3 2 2 4 2 2 penmen 2 penman 38 1 4 3 2 a 2 4 2 2 penitentiary 2 penitential 38 1 4 3 2 ent 2 i 4 1 2 penitent 38 1 4 3 2 2 t 4 3 2 penis 2 peninsula 2 penicillin 38 1 4 3 2 ra 2 4 2 2 penetrate 2 penetrable 38 1 4 3 2 2 t 4 1 2 Penelope 38 1 4 3 2 2 4 3 2 pendulum 2 pendant 2 pend 38 1 4 3 2 2 4 3 2 pencil 2 penchant 2 pence 38 1 4 3 2 2 4 2 2 penalty 2 penal 38 1 4 3 2 2 l 4 2 2 penates 2 penance 38 1 4 3 2 2 acdeimnstu 4 4 2 Penrose 2 Penh 2 penguin 2 pen 38 1 4 3 2 2 4 2 2 pemmican 2 Pembroke 38 1 4 3 2 i 2 4 2 2 pelvis 2 pelvic 38 1 4 3 2 2 4 2 2 peltry 2 pelt 38 1 4 3 2 2 4 2 2 pellet 2 pellagra 38 1 4 3 2 2 ltv 4 2 2 pelican 2 Pelham 38 1 4 3 2 2 4 2 2 Peggy 2 pegging 38 1 4 3 2 2 g 4 3 2 pegboard 2 Pegasus 2 peg 38 1 4 3 2 2 4 3 2 peepy 2 peephole 2 peep 38 1 4 3 2 2 p 4 4 2 peer 2 peel 2 peek 2 pee 38 1 4 3 2 tric 2 4 2 2 pediatrician 2 pediatric 38 1 4 3 2 2 a 4 2 2 pediment 2 pedigree 38 1 4 3 2 st 2 4 2 2 pedestrian 2 pedestal 38 1 4 3 2 2 gn 4 1 2 pedal 38 1 4 3 2 t 2 4 3 2 pedantry 2 pedantic 2 pedant 38 1 4 3 2 og 2 4 3 2 pedagogy 2 pedagogue 2 pedagogic 38 1 4 3 2 2 aei 4 2 2 Pedro 2 peddle 38 1 4 3 2 2 4 2 2 peculiar 2 peculate 38 1 4 3 2 2 l 4 1 2 pecuniary 38 1 4 3 2 oral 2 4 2 2 pectoralis 2 pectoral 38 1 4 3 2 2 tu 4 4 2 Pecos 2 peck 2 peccary 2 pecan 38 1 4 3 2 2 cklrs 4 5 2 peat 2 peanut 2 peafowl 2 Peabody 2 pea 38 1 4 3 2 2 4 2 2 Pease 2 peasant 38 1 4 3 2 2 4 3 2 pearlstone 2 pearlite 2 pearl 38 1 4 3 2 2 l 4 3 2 Pearson 2 Pearce 2 pear 38 1 4 3 2 2 4 2 2 Peale 2 peal 38 1 4 3 2 2 4 2 2 peaky 2 peak 38 1 4 3 2 2 4 2 2 Peachtree 2 peach 38 1 4 3 2 2 4 5 2 peacetime 2 peacemake 2 peaceful 2 peaceable 2 peace 38 1 4 3 2 2 eh 4 1 2 peacock 38 1 4 3 2 2 acdeglmnoprstw 4 4 2 Peugeot 2 Peking 2 pejorative 2 pebble 38 1 4 3 2 2 4 7 2 payroll 2 payoff 2 Payne 2 paymaster 2 payday 2 paycheck 2 pay 38 1 4 3 2 2 4 2 2 pawnshop 2 pawn 38 1 4 3 2 2 n 4 2 2 Pawtucket 2 paw 38 1 4 3 2 2 4 4 2 Pavlov 2 pavilion 2 pave 2 pavanne 38 1 4 3 2 ch 2 4 2 2 paunchy 2 paunch 38 1 4 3 2 2 4 2 2 Paulson 2 Paulsen 38 1 4 3 2 2 4 2 2 Pauline 2 Pauli 38 1 4 3 2 2 is 4 5 2 Paulus 2 Paulo 2 Paulette 2 Paula 2 Paul 38 1 4 3 2 2 ln 4 3 2 pause 2 pauper 2 paucity 38 1 4 3 2 r 2 4 2 2 Patterson 2 pattern 38 1 4 3 2 2 e 4 3 2 patty 2 Patton 2 Patti 38 1 4 3 2 2 4 3 2 patroness 2 patronage 2 patron 38 1 4 3 2 2 lm 4 1 2 patrol 38 1 4 3 2 2 4 2 2 patrolmen 2 patrolman 38 1 4 3 2 2 4 2 2 patrolling 2 patrolled 38 1 4 3 2 2 ln 4 0 38 1 4 3 2 2 acmo 4 1 2 patristic 38 1 4 3 2 t 2 4 2 2 patriotic 2 patriot 38 1 4 3 2 on 2 4 2 2 patrimony 2 patrimonial 38 1 4 3 2 a 2 4 2 2 patrician 2 Patricia 38 1 4 3 2 2 i 4 2 2 Patrick 2 Patrice 38 1 4 3 2 rch 2 4 3 2 patriarchy 2 patriarchal 2 patriarch 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 4 3 2 patio 2 patina 2 patient 38 1 4 3 2 en 2 4 3 2 pathogenic 2 pathogenesis 2 pathogen 38 1 4 3 2 2 g 4 2 2 pathos 2 pathology 38 1 4 3 2 2 o 4 3 2 pathway 2 pathetic 2 path 38 1 4 3 2 2 4 2 2 paternoster 2 paternal 38 1 4 3 2 2 n 4 2 2 Paterson 2 pater 38 1 4 3 2 t 2 4 2 2 patentee 2 patent 38 1 4 3 2 2 nr 4 1 2 pate 38 1 4 3 2 h 2 4 3 2 patchy 2 patchwork 2 patch 38 1 4 3 2 2 cehirt 4 3 2 Patsy 2 Patagonia 2 pat 38 1 4 3 2 r 2 4 2 2 pastoral 2 pastor 38 1 4 3 2 2 4 2 2 pastime 2 pastiche 38 1 4 3 2 2 4 2 2 Pasteur 2 pasteup 38 1 4 3 2 2 u 4 3 2 pastel 2 pasteboard 2 paste 38 1 4 3 2 2 eiou 4 3 2 pasty 2 pastry 2 past 38 1 4 3 2 2 4 2 2 passive 2 passivate 38 1 4 3 2 n 2 4 2 2 passionate 2 passion 38 1 4 3 2 2 ov 4 1 2 passing 38 1 4 3 2 2 4 4 2 passed 2 passerby 2 passenger 2 passe 38 1 4 3 2 e 2 4 2 2 passageway 2 passage 38 1 4 3 2 2 g 4 1 2 Passaic 38 1 4 3 2 2 aei 4 5 2 password 2 passport 2 Passover 2 passband 2 pass 38 1 4 3 2 2 4 2 2 paschal 2 Pascal 38 1 4 3 2 2 cst 4 3 2 Paso 2 pasha 2 Pasadena 38 1 4 3 2 la 2 r 4 1 2 particulate 38 1 4 3 2 p 2 a 4 1 2 participle 38 1 4 3 2 2 4 2 2 participate 2 participant 38 1 4 3 2 2 iu 4 1 2 particle 38 1 4 3 2 2 c 4 3 2 partition 2 partisan 2 partial 38 1 4 3 2 2 i 4 8 2 parts 2 party 2 partridge 2 partook 2 partner 2 Parthenon 2 partake 2 part 38 1 4 3 2 n 2 4 2 2 parsonage 2 parson 38 1 4 3 2 on 2 4 2 2 parsimony 2 parsimonious 38 1 4 3 2 2 m 4 1 2 Parsifal 38 1 4 3 2 2 ioe 4 2 2 parsnip 2 parsley 38 1 4 3 2 2 4 4 2 parry 2 parrot 2 Parrish 2 Parr 38 1 4 3 2 e 2 4 2 2 parolee 2 parole 38 1 4 3 2 2 l 4 2 2 parody 2 parochial 38 1 4 3 2 r 2 4 2 2 parliamentary 2 parliamentarian 38 1 4 3 2 ament 2 a 4 1 2 parliament 38 1 4 3 2 2 4 2 2 parlay 2 parlance 38 1 4 3 2 2 ai 4 1 2 parley 38 1 4 3 2 2 4 2 2 parkish 2 Parkinson 38 1 4 3 2 2 i 4 4 2 parkway 2 parkland 2 Parke 2 park 38 1 4 3 2 2 4 2 2 parishioner 2 parish 38 1 4 3 2 2 h 4 2 2 Parisian 2 Paris 38 1 4 3 2 2 s 4 2 2 parimutuel 2 pariah 38 1 4 3 2 2 4 2 2 parenthesis 2 parentheses 38 1 4 3 2 e 2 s 4 1 2 parenthetic 38 1 4 3 2 2 4 2 2 parental 2 parentage 38 1 4 3 2 t 2 ah 4 1 2 parent 38 1 4 3 2 2 n 4 3 2 Pareto 2 paregoric 2 pare 38 1 4 3 2 2 4 2 2 parch 2 parcel 38 1 4 3 2 t 2 4 2 2 parasitic 2 parasite 38 1 4 3 2 2 i 4 2 2 parasympathetic 2 parasol 38 1 4 3 2 2 4 2 2 paraphrase 2 paraphernalia 38 1 4 3 2 2 h 4 2 2 parapsychology 2 parapet 38 1 4 3 2 2 a 4 1 2 paranoid 38 1 4 3 2 2 4 2 2 paranoiac 2 paranoia 38 1 4 3 2 o 2 i 4 1 2 paranormal 38 1 4 3 2 gnet 2 4 2 2 paramagnetic 2 paramagnet 38 1 4 3 2 2 a 4 4 2 Paramus 2 paramount 2 paramilitary 2 parameter 38 1 4 3 2 l 2 4 2 2 parallelepiped 2 parallel 38 1 4 3 2 2 e 4 1 2 parallax 38 1 4 3 2 2 l 4 2 2 paralysis 2 paralinguistic 38 1 4 3 2 n 2 4 2 2 paragonite 2 paragon 38 1 4 3 2 2 o 4 2 2 Paraguay 2 paragraph 38 1 4 3 2 x 2 4 2 2 paradoxic 2 paradox 38 1 4 3 2 m 2 4 2 2 paradigmatic 2 paradigm 38 1 4 3 2 2 g 4 1 2 paradise 38 1 4 3 2 2 io 4 1 2 parade 38 1 4 3 2 ol 2 o 4 2 2 parabolic 2 parabola 38 1 4 3 2 id 2 4 2 2 paraboloidal 2 paraboloid 38 1 4 3 2 2 bdglmnps 4 5 2 paraxial 2 paratroop 2 parakeet 2 paraffin 2 parachute 38 1 4 3 2 2 aceiklorst 4 5 2 parvenu 2 parquet 2 pardon 2 parboil 2 par 38 1 4 3 2 r 2 4 2 2 papyrus 2 papyri 38 1 4 3 2 2 4 2 2 pappy 2 Pappas 38 1 4 3 2 2 4 2 2 paperwork 2 paperweight 38 1 4 3 2 r 2 w 4 4 2 papers 2 papery 2 paperback 2 paper 38 1 4 3 2 2 4 3 2 papaw 2 papal 2 papa 38 1 4 3 2 2 aepy 4 5 2 Papua 2 paprika 2 papoose 2 papillary 2 pap 38 1 4 3 2 mim 2 4 2 2 pantomimic 2 pantomime 38 1 4 3 2 s 2 4 2 2 pantheist 2 pantheism 38 1 4 3 2 e 2 i 4 2 2 panther 2 pantheon 38 1 4 3 2 2 ho 4 3 2 panty 2 pantry 2 pant 38 1 4 3 2 am 2 4 2 2 panoramic 2 panorama 38 1 4 3 2 2 r 4 1 2 panoply 38 1 4 3 2 2 4 2 2 panicky 2 panicked 38 1 4 3 2 c 2 k 4 2 2 panicle 2 panic 38 1 4 3 2 2 4 2 2 panel 2 pane 38 1 4 3 2 2 4 2 2 pandemonium 2 pandemic 38 1 4 3 2 2 m 4 1 2 pander 38 1 4 3 2 2 4 2 2 Pandanus 2 panda 38 1 4 3 2 2 ae 4 1 2 Pandora 38 1 4 3 2 ea 2 4 2 2 pancreatic 2 pancreas 38 1 4 3 2 2 r 4 2 2 Pancho 2 pancake 38 1 4 3 2 2 4 2 2 panama 2 panacea 38 1 4 3 2 2 acdeiot 4 5 2 pansy 2 panjandrum 2 panhandle 2 pang 2 pan 38 1 4 3 2 2 4 3 2 pamphlet 2 pamper 2 pampa 38 1 4 3 2 2 p 4 2 2 Pamela 2 Pam 38 1 4 3 2 2 4 2 2 Palomar 2 Palo 38 1 4 3 2 2 4 5 2 Palmyra 2 Palmolive 2 palmetto 2 palmate 2 palm 38 1 4 3 2 2 4 2 2 pallid 2 palliate 38 1 4 3 2 2 4 2 2 Palladian 2 palladia 38 1 4 3 2 di 2 a 4 1 2 palladium 38 1 4 3 2 2 ai 4 2 2 pallet 2 pall 38 1 4 3 2 drom 2 4 2 2 palindromic 2 palindrome 38 1 4 3 2 2 n 4 1 2 palisade 38 1 4 3 2 2 4 2 2 Paleozoic 2 Paleolithic 38 1 4 3 2 2 o 4 4 2 palette 2 Palestine 2 Palermo 2 pale 38 1 4 3 2 z 2 4 2 2 palazzo 2 palazzi 38 1 4 3 2 2 4 2 2 Palatine 2 palate 38 1 4 3 2 2 tz 4 1 2 palace 38 1 4 3 2 2 aeilmo 4 4 2 palsy 2 palpable 2 palfrey 2 pal 38 1 4 3 2 istan 2 4 2 2 Pakistani 2 Pakistan 38 1 4 3 2 2 4 2 2 pairwise 2 pair 38 1 4 3 2 2 4 2 2 paintbrush 2 paint 38 1 4 3 2 2 t 4 4 2 painstaking 2 painful 2 Paine 2 pain 38 1 4 3 2 2 nr 4 3 2 paisley 2 pail 2 paid 38 1 4 3 2 nt 2 4 2 2 pageantry 2 pageant 38 1 4 3 2 2 a 4 1 2 page 38 1 4 3 2 2 e 4 3 2 pagoda 2 paginate 2 pagan 38 1 4 3 2 2 4 3 2 paddy 2 paddock 2 paddle 38 1 4 3 2 2 d 4 3 2 padre 2 padlock 2 pad 38 1 4 3 2 2 4 2 2 Packard 2 package 38 1 4 3 2 2 a 4 2 2 packet 2 pack 38 1 4 3 2 2 s 4 1 2 pacific 38 1 4 3 2 2 4 2 2 pacifist 2 pacifism 38 1 4 3 2 f 2 i 4 1 2 pacify 38 1 4 3 2 2 4 3 2 pacesetting 2 pacemake 2 pace 38 1 4 3 2 2 eik 4 1 2 pact 38 1 4 3 2 2 4 2 2 Pabst 2 Pablo 38 1 4 3 2 2 bcdgiklmnprstuvwy 4 5 2 Paz 2 pax 2 Paoli 2 paean 2 pa 38 1 4 3 2 2 aefhilnorstuy 4 8 2 pc 2 PVC 2 p's 2 ppm 2 PM 2 PDP 2 PBS 2 p 38 1 4 3 2 2 4 2 2 ozone 2 Ozark 38 1 4 3 2 gen 2 4 2 2 oxygenate 2 oxygen 38 1 4 3 2 2 4 2 2 oxidate 2 oxidant 38 1 4 3 2 d 2 a 4 1 2 oxide 38 1 4 3 2 2 4 2 2 oxeye 2 oxen 38 1 4 3 2 l 2 4 2 2 oxalic 2 oxalate 38 1 4 3 2 2 aeiy 4 5 2 Oxnard 2 Oxonian 2 Oxford 2 oxcart 2 ox 38 1 4 3 2 2 4 2 2 owly 2 owl 38 1 4 3 2 2 4 2 2 Owens 2 owe 38 1 4 3 2 2 eln 4 1 2 ow 38 1 4 3 2 2 4 2 2 oviform 2 Ovid 38 1 4 3 2 2 4 2 2 overture 2 overt 38 1 4 3 2 2 t 4 2 2 overview 2 over 38 1 4 3 2 2 4 2 2 ovenbird 2 oven 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 2 4 4 2 ovate 2 ovary 2 oval 2 ova 38 1 4 3 2 2 aei 4 0 38 1 4 3 2 2 4 2 2 ouzo 2 ouzel 38 1 4 3 2 a 2 4 2 2 outlawry 2 outlandish 38 1 4 3 2 2 l 4 5 2 output 2 outside 2 outrageous 2 outermost 2 out 38 1 4 3 2 2 s 4 1 2 our 38 1 4 3 2 ht 2 4 2 2 oughtn't 2 ought 38 1 4 3 2 2 grtz 4 5 2 ouvre 2 oust 2 ounce 2 ouch 2 Ouagadougou 38 1 4 3 2 2 4 2 2 Ottoman 2 Otto 38 1 4 3 2 2 o 4 3 2 otter 2 Ottawa 2 Ott 38 1 4 3 2 2 4 2 2 Otis 2 otiose 38 1 4 3 2 e 2 r 4 1 2 Othello 38 1 4 3 2 2 4 2 2 otherworld 2 otherwise 38 1 4 3 2 2 w 4 2 2 others 2 other 38 1 4 3 2 2 hit 4 0 38 1 4 3 2 2 c 4 1 2 Ostrander 38 1 4 3 2 2 4 2 2 ostracod 2 ostracism 38 1 4 3 2 2 a 4 1 2 ostrich 38 1 4 3 2 2 no 4 0 38 1 4 3 2 th 2 4 3 2 osteopathy 2 osteopathic 2 osteopath 38 1 4 3 2 2 a 4 1 2 osteoporosis 38 1 4 3 2 2 p 4 1 2 osteology 38 1 4 3 2 2 4 2 2 ostentatious 2 ostensible 38 1 4 3 2 2 er 4 0 38 1 4 3 2 2 4 2 2 ossify 2 osseous 38 1 4 3 2 2 4 2 2 osmotic 2 osmosis 38 1 4 3 2 2 o 4 1 2 osmium 38 1 4 3 2 2 4 2 2 Osiris 2 osier 38 1 4 3 2 2 4 3 2 O'Sullivan 2 O'Shea 2 o's 38 1 4 3 2 t 2 4 2 2 oscillatory 2 oscillate 38 1 4 3 2 ll 2 a 4 1 2 oscilloscope 38 1 4 3 2 2 i 4 1 2 Oscar 38 1 4 3 2 orn 2 4 2 2 Osborne 2 Osborn 38 1 4 3 2 2 bcimst 4 6 2 Oswald 2 osprey 2 Oslo 2 Oshkosh 2 Osgood 2 Osaka 38 1 4 3 2 ell 2 4 2 2 Orwellian 2 Orwell 38 1 4 3 2 2 4 2 2 orthophosphate 2 orthopedic 38 1 4 3 2 2 4 2 2 orthography 2 orthogonal 38 1 4 3 2 2 4 2 2 orthodoxy 2 orthodox 38 1 4 3 2 ti 2 4 2 2 orthodontist 2 orthodontic 38 1 4 3 2 o 2 nx 4 0 38 1 4 3 2 2 dgp 4 3 2 orthorhombic 2 orthonormal 2 orthoclase 38 1 4 3 2 2 o 4 2 2 orthicon 2 orthant 38 1 4 3 2 2 h 4 1 2 Ortega 38 1 4 3 2 n 2 4 2 2 orphanage 2 orphan 38 1 4 3 2 h 2 a 4 2 2 Orphic 2 Orpheus 38 1 4 3 2 2 4 2 2 Orono 2 orography 38 1 4 3 2 2 m 4 1 2 ornate 38 1 4 3 2 ent 2 4 2 2 ornamentation 2 ornament 38 1 4 3 2 2 a 4 1 2 ornery 38 1 4 3 2 2 4 2 2 Orleans 2 Orlando 38 1 4 3 2 2 4 2 2 Orion 2 oriole 38 1 4 3 2 2 4 2 2 Orinoco 2 Orin 38 1 4 3 2 2 4 2 2 originate 2 original 38 1 4 3 2 in 2 a 4 1 2 origin 38 1 4 3 2 nt 2 4 3 2 oriented 2 oriental 2 orient 38 1 4 3 2 2 egno 4 1 2 orifice 38 1 4 3 2 2 n 4 1 2 orgasm 38 1 4 3 2 2 i 4 3 2 organometallic 2 organdy 2 organ 38 1 4 3 2 2 z 4 2 2 organismic 2 organic 38 1 4 3 2 2 a 4 2 2 orgy 2 orgiastic 38 1 4 3 2 te 2 4 2 2 Orestes 2 Oresteia 38 1 4 3 2 2 4 2 2 Oregon 2 oregano 38 1 4 3 2 2 gs 4 1 2 ore 38 1 4 3 2 na 2 4 4 2 ordinate 2 ordinary 2 ordinance 2 ordinal 38 1 4 3 2 2 r 4 1 2 ordeal 38 1 4 3 2 2 ei 4 2 2 ordnance 2 ordain 38 1 4 3 2 2 4 2 2 orchis 2 orchid 38 1 4 3 2 stra 2 4 3 2 orchestrate 2 orchestral 2 orchestra 38 1 4 3 2 h 2 ei 4 1 2 orchard 38 1 4 3 2 t 2 4 2 2 orbital 2 orbit 38 1 4 3 2 2 i 4 1 2 orb 38 1 4 3 2 2 4 2 2 oratorio 2 oratoric 38 1 4 3 2 r 2 i 4 1 2 oratory 38 1 4 3 2 2 o 4 1 2 orate 38 1 4 3 2 2 4 2 2 orangeroot 2 orange 38 1 4 3 2 g 2 e 4 1 2 orangutan 38 1 4 3 2 2 nt 4 2 2 oral 2 oracle 38 1 4 3 2 2 abcdegilnoptw 4 4 2 Orville 2 Orr 2 Orkney 2 or 38 1 4 3 2 2 4 2 2 opus 2 opulent 38 1 4 3 2 etr 2 4 2 2 optometry 2 optometrist 38 1 4 3 2 2 m 4 2 2 optoisolate 2 optoacoustic 38 1 4 3 2 s 2 4 2 2 optimist 2 optimism 38 1 4 3 2 2 4 2 2 optimal 2 optima 38 1 4 3 2 2 ai 4 1 2 optimum 38 1 4 3 2 2 mo 4 1 2 optic 38 1 4 3 2 alm 2 4 2 2 opthalmology 2 opthalmic 38 1 4 3 2 2 hio 4 1 2 opt 38 1 4 3 2 ss 2 i 4 2 2 oppressor 2 oppress 38 1 4 3 2 2 4 2 2 oppressive 2 oppression 38 1 4 3 2 2 e 4 1 2 opprobrium 38 1 4 3 2 t 2 4 2 2 opposition 2 opposite 38 1 4 3 2 2 i 4 2 2 oppose 2 opposable 38 1 4 3 2 2 s 4 2 2 opportune 2 opponent 38 1 4 3 2 2 or 4 1 2 Oppenheimer 38 1 4 3 2 ion 2 4 2 2 opinionate 2 opinion 38 1 4 3 2 2 n 4 2 2 opium 2 opiate 38 1 4 3 2 2 nt 4 2 2 operable 2 opera 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 2 2 operant 2 operand 38 1 4 3 2 2 a 4 2 2 operon 2 operetta 38 1 4 3 2 2 rn 4 2 2 Opel 2 OPEC 38 1 4 3 2 2 l 4 2 2 opaque 2 opacity 38 1 4 3 2 2 4 2 2 opalescent 2 opal 38 1 4 3 2 2 aeiptu 4 2 2 opossum 2 Ophiucus 38 1 4 3 2 2 4 3 2 ooze 2 oodles 2 oocyte 38 1 4 3 2 2 4 3 2 ontology 2 ontogeny 2 onto 38 1 4 3 2 2 o 4 1 2 Ontario 38 1 4 3 2 2 4 2 2 onslaught 2 onset 38 1 4 3 2 ush 2 4 2 2 onrushing 2 onrush 38 1 4 3 2 atopoei 2 4 2 2 onomatopoeic 2 onomatopoeia 38 1 4 3 2 2 m 4 1 2 Onondaga 38 1 4 3 2 ok 2 4 2 2 onlooking 2 onlooker 38 1 4 3 2 2 o 4 2 2 online 2 only 38 1 4 3 2 2 4 6 2 oneupmanship 2 onetime 2 oneself 2 onerous 2 Oneida 2 one 38 1 4 3 2 2 4 2 2 oncoming 2 oncology 38 1 4 3 2 2 o 4 1 2 once 38 1 4 3 2 2 celorst 4 7 2 onboard 2 onyx 2 onward 2 onus 2 onion 2 ongoing 2 on 38 1 4 3 2 2 4 2 2 omnipresent 2 omnipotent 38 1 4 3 2 i 2 p 4 2 2 omniscient 2 omnibus 38 1 4 3 2 2 4 2 2 omitting 2 omitted 38 1 4 3 2 2 t 4 1 2 omit 38 1 4 3 2 2 t 4 3 2 omission 2 ominous 2 omicron 38 1 4 3 2 2 4 3 2 omen 2 omelet 2 omega 38 1 4 3 2 uds 2 4 2 2 ombudsperson 2 ombudsman 38 1 4 3 2 2 4 2 2 Oman 2 Omaha 38 1 4 3 2 2 abein 4 0 38 1 4 3 2 mpi 2 4 2 2 Olympic 2 Olympia 38 1 4 3 2 2 4 2 2 Olson 2 Olsen 38 1 4 3 2 2 4 2 2 olivine 2 Olivia 38 1 4 3 2 2 4 2 2 Olivetti 2 olive 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 oligopoly 2 oligoclase 38 1 4 3 2 rch 2 4 2 2 oligarchy 2 oligarchic 38 1 4 3 2 2 gv 4 1 2 Olin 38 1 4 3 2 2 4 3 2 oleomargarine 2 olefin 2 oleander 38 1 4 3 2 2 4 2 2 oldster 2 Oldsmobile 38 1 4 3 2 n 2 4 2 2 Oldenburg 2 olden 38 1 4 3 2 2 es 4 2 2 oldy 2 old 38 1 4 3 2 2 4 2 2 Olav 2 Olaf 38 1 4 3 2 2 adeisy 4 2 2 Olga 2 olfactory 38 1 4 3 2 2 4 4 2 Oklahoma 2 Okinawa 2 okay 2 OK 38 1 4 3 2 2 m 4 4 2 oily 2 oilseed 2 oilcloth 2 oil 38 1 4 3 2 2 4 2 2 oilmen 2 oilman 38 1 4 3 2 2 l 4 1 2 oint 38 1 4 3 2 2 4 3 2 ohmmeter 2 ohmic 2 ohm 38 1 4 3 2 2 m 4 2 2 Ohio 2 oh 38 1 4 3 2 e 2 4 2 2 ogress 2 ogre 38 1 4 3 2 2 r 4 2 2 ogle 2 Ogden 38 1 4 3 2 n 2 4 2 2 oftentimes 2 often 38 1 4 3 2 2 e 4 1 2 oft 38 1 4 3 2 o 2 4 2 2 offshore 2 offshoot 38 1 4 3 2 t 2 4 2 2 offsetting 2 offset 38 1 4 3 2 2 eh 4 3 2 offstage 2 offspring 2 offsaddle 38 1 4 3 2 2 4 2 2 officious 2 officio 38 1 4 3 2 2 l 4 1 2 officiate 38 1 4 3 2 2 4 3 2 officials 2 officialdom 2 official 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 4 2 offices 2 officemate 2 officeholder 2 office 38 1 4 3 2 c 2 ei 4 0 38 1 4 3 2 2 4 5 2 offers 2 offering 2 offered 2 offertory 2 offer 38 1 4 3 2 2 4 3 2 offensive 2 offend 2 Offenbach 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 2 eis 4 5 2 offload 2 offhand 2 offbeat 2 offal 2 off 38 1 4 3 2 2 ft 4 1 2 of 38 1 4 3 2 ip 2 4 2 2 Oedipus 2 Oedipal 38 1 4 3 2 2 d 4 1 2 oersted 38 1 4 3 2 sse 2 4 2 2 Odyssey 2 Odysseus 38 1 4 3 2 2 4 2 2 odorous 2 odometer 38 1 4 3 2 2 4 3 2 O'Dwyer 2 O'Donnell 2 O'Dell 38 1 4 3 2 2 4 3 2 odium 2 odious 2 Odin 38 1 4 3 2 2 4 2 2 Odessa 2 ode 38 1 4 3 2 2 eioy 4 1 2 odd 38 1 4 3 2 2 4 4 2 octoroon 2 octopus 2 octogenarian 2 October 38 1 4 3 2 l 2 4 2 2 octillion 2 octile 38 1 4 3 2 2 4 2 2 octet 2 octennial 38 1 4 3 2 2 4 2 2 Octavia 2 octave 38 1 4 3 2 2 4 2 2 octant 2 octane 38 1 4 3 2 2 4 2 2 octahedral 2 octahedra 38 1 4 3 2 edr 2 a 4 1 2 octahedron 38 1 4 3 2 on 2 4 2 2 octagonal 2 octagon 38 1 4 3 2 2 ghnv 4 1 2 octal 38 1 4 3 2 2 aeio 4 1 2 Oct 38 1 4 3 2 nn 2 4 2 2 O'Connor 2 O'Connell 38 1 4 3 2 2 o 4 1 2 o'clock 38 1 4 3 2 2 CDS 4 5 2 O'Neill 2 O'Leary 2 O'Hare 2 o'er 2 O'Brien 38 1 4 3 2 n 2 i 4 3 2 oceanside 2 oceanography 2 ocean 38 1 4 3 2 2 4 2 2 oceanic 2 Oceania 38 1 4 3 2 2 a 4 1 2 ocelot 38 1 4 3 2 2 4 2 2 occurrent 2 occurred 38 1 4 3 2 2 e 4 1 2 occurring 38 1 4 3 2 2 r 4 1 2 occur 38 1 4 3 2 2 4 2 2 occupation 2 occupant 38 1 4 3 2 2 a 4 1 2 occupy 38 1 4 3 2 t 2 4 2 2 occultate 2 occult 38 1 4 3 2 2 lpr 4 0 38 1 4 3 2 i 2 4 2 2 occlusive 2 occlusion 38 1 4 3 2 u 2 s 4 1 2 occlude 38 1 4 3 2 ent 2 4 2 2 occidental 2 occident 38 1 4 3 2 2 d 4 1 2 occipital 38 1 4 3 2 2 ilu 4 1 2 occasion 38 1 4 3 2 2 cet 4 2 2 ocular 2 ocarina 38 1 4 3 2 2 o 4 1 2 obviate 38 1 4 3 2 2 i 4 1 2 obverse 38 1 4 3 2 u 2 4 2 2 obtrusive 2 obtrude 38 1 4 3 2 2 r 4 1 2 obtain 38 1 4 3 2 u 2 4 2 2 obstruent 2 obstruct 38 1 4 3 2 na 2 4 2 2 obstinate 2 obstinacy 38 1 4 3 2 2 ir 4 2 2 obstetric 2 obstacle 38 1 4 3 2 le 2 4 2 2 obsolete 2 obsolescent 38 1 4 3 2 2 4 2 2 obsessive 2 obsession 38 1 4 3 2 s 2 i 4 1 2 obsess 38 1 4 3 2 2 t 4 1 2 observant 38 1 4 3 2 2 4 2 2 observatory 2 observation 38 1 4 3 2 v 2 a 4 1 2 observe 38 1 4 3 2 u 2 4 2 2 obsequy 2 obsequious 38 1 4 3 2 2 qrs 4 0 38 1 4 3 2 2 4 2 2 obscure 2 obscene 38 1 4 3 2 2 ceot 4 1 2 obsidian 38 1 4 3 2 2 4 2 2 oboist 2 oboe 38 1 4 3 2 io 2 4 2 2 oblivious 2 oblivion 38 1 4 3 2 2 a 4 1 2 oblige 38 1 4 3 2 t 2 4 2 2 obligatory 2 obligate 38 1 4 3 2 2 gv 4 2 2 obliterate 2 oblique 38 1 4 3 2 2 i 4 2 2 oblong 2 oblate 38 1 4 3 2 t 2 4 5 2 object's 2 objects 2 objector 2 objectify 2 object 38 1 4 3 2 e 2 c 4 1 2 objet 38 1 4 3 2 uscat 2 4 2 2 obfuscatory 2 obfuscate 38 1 4 3 2 2 4 6 2 obey 2 obese 2 Oberlin 2 obelisk 2 obeisant 2 obedient 38 1 4 3 2 ura 2 4 2 2 obdurate 2 obduracy 38 1 4 3 2 2 defjlostv 4 2 2 obnoxious 2 obituary 38 1 4 3 2 2 4 3 2 oatmeal 2 oath 2 oat 38 1 4 3 2 2 4 2 2 oasis 2 oases 38 1 4 3 2 2 4 2 2 Oakley 2 Oakland 38 1 4 3 2 2 l 4 3 2 oakwood 2 oaken 2 oak 38 1 4 3 2 2 kst 4 2 2 oar 2 oaf 38 1 4 3 2 2 abc'defghiklmnoprstuvwxz 4 2 2 oyster 2 o 38 1 4 3 2 mania 2 4 2 2 nymphomaniac 2 nymphomania 38 1 4 3 2 ph 2 o 4 1 2 nymph 38 1 4 3 2 2 m 4 5 2 NYU 2 Nyquist 2 nylon 2 NYC 2 NY 38 1 4 3 2 2 4 2 2 nutritious 2 nutrition 38 1 4 3 2 i 2 o 4 1 2 nutritive 38 1 4 3 2 i 2 t 4 2 2 nutrient 2 nutria 38 1 4 3 2 2 r 4 6 2 nutshell 2 nutmeg 2 nuthatch 2 nutcrack 2 nutate 2 nut 38 1 4 3 2 e 2 4 2 2 nursery 2 nurse 38 1 4 3 2 2 s 4 1 2 nurture 38 1 4 3 2 mati 2 4 2 2 numismatist 2 numismatic 38 1 4 3 2 2 s 4 1 2 numinous 38 1 4 3 2 2 4 2 2 numerous 2 numerology 38 1 4 3 2 2 4 2 2 Numerische 2 numeric 38 1 4 3 2 2 4 3 2 numerate 2 numeral 2 numerable 38 1 4 3 2 r 2 aio 4 0 38 1 4 3 2 2 eib 4 0 38 1 4 3 2 l 2 4 3 2 Nullstellensatz 2 nullify 2 null 38 1 4 3 2 2 4 2 2 nugget 2 nugatory 38 1 4 3 2 2 4 2 2 nudge 2 nude 38 1 4 3 2 2 aio 4 1 2 nucleus 38 1 4 3 2 2 4 2 2 nucleolus 2 nucleoli 38 1 4 3 2 2 l 4 1 2 nucleotide 38 1 4 3 2 2 4 2 2 nucleic 2 nuclei 38 1 4 3 2 2 4 3 2 nucleate 2 nuclear 2 nucleant 38 1 4 3 2 l 2 e 4 1 2 nuclide 38 1 4 3 2 i 2 4 2 2 nubile 2 Nubia 38 1 4 3 2 2 bcdglmrt 4 6 2 nuzzle 2 nuptial 2 nun 2 nuisance 2 nuance 2 nu 38 1 4 3 2 2 4 4 2 nowise 2 nowhere 2 nowaday 2 now 38 1 4 3 2 2 4 2 2 Novosibirsk 2 novo 38 1 4 3 2 2 4 2 2 novitiate 2 novice 38 1 4 3 2 2 4 2 2 novelty 2 novel 38 1 4 3 2 2 l 4 1 2 November 38 1 4 3 2 2 4 2 2 Novak 2 nova 38 1 4 3 2 2 aeio 4 1 2 Nov 38 1 4 3 2 2 4 4 2 nouveau 2 nourish 2 noun 2 Nouakchott 38 1 4 3 2 i 2 4 2 2 notorious 2 notoriety 38 1 4 3 2 2 r 4 1 2 notocord 38 1 4 3 2 e 2 4 2 2 noticeable 2 notice 38 1 4 3 2 2 cf 4 1 2 notion 38 1 4 3 2 2 4 6 2 notepad 2 notes 2 noted 2 noteworthy 2 notebook 2 note 38 1 4 3 2 2 4 2 2 notate 2 notary 38 1 4 3 2 2 aeio 4 6 2 notwithstanding 2 Nottingham 2 Notre 2 nothing 2 notch 2 not 38 1 4 3 2 2 4 2 2 Nostrand 2 Nostradamus 38 1 4 3 2 2 a 4 1 2 nostril 38 1 4 3 2 lgi 2 4 2 2 nostalgic 2 nostalgia 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 2 b 4 1 2 nose 38 1 4 3 2 2 4 2 2 nosebleed 2 nosebag 38 1 4 3 2 2 et 4 0 38 1 4 3 2 2 4 2 2 Norway 2 Norwalk 38 1 4 3 2 2 a 4 2 2 Norwich 2 Norwegian 38 1 4 3 2 2 erw 4 5 2 Northumberland 2 northland 2 northbound 2 Northampton 2 north 38 1 4 3 2 st 2 4 2 2 northwestern 2 northwest 38 1 4 3 2 2 e 4 1 2 northward 38 1 4 3 2 2 4 2 2 Northrup 2 Northrop 38 1 4 3 2 2 4 2 2 northernmost 2 northern 38 1 4 3 2 2 n 4 1 2 northerly 38 1 4 3 2 st 2 4 2 2 northeastern 2 northeast 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 2 h 4 1 2 Norton 38 1 4 3 2 2 4 2 2 Normandy 2 Norman 38 1 4 3 2 2 4 3 2 normally 2 normalcy 2 normal 38 1 4 3 2 2 ln 4 2 2 normative 2 Norma 38 1 4 3 2 2 a 4 1 2 norm 38 1 4 3 2 2 4 2 2 Nordstrom 2 Nordhoff 38 1 4 3 2 2 dmtw 4 5 2 Norris 2 Norfolk 2 Noreen 2 Nora 2 nor 38 1 4 3 2 2 4 2 2 noontime 2 noon 38 1 4 3 2 2 n 4 3 2 noose 2 nook 2 noodle 38 1 4 3 2 2 4 2 2 nonetheless 2 none 38 1 4 3 2 2 4 2 2 nonchalant 2 nonce 38 1 4 3 2 2 ce 4 5 2 non-recursive 2 nonsensic 2 nonogenarian 2 nondescript 2 non 38 1 4 3 2 gra 2 4 2 2 nomograph 2 nomogram 38 1 4 3 2 2 4 2 2 nominate 2 nominal 38 1 4 3 2 n 2 a 4 1 2 nominee 38 1 4 3 2 d 2 4 2 2 nomadic 2 nomad 38 1 4 3 2 2 aio 4 1 2 nomenclature 38 1 4 3 2 2 4 3 2 nolo 2 Noll 2 Nolan 38 1 4 3 2 2 4 2 2 noisemake 2 noise 38 1 4 3 2 s 2 e 4 1 2 noisy 38 1 4 3 2 2 4 2 2 Noetherian 2 Noel 38 1 4 3 2 l 2 4 2 2 nodule 2 nodular 38 1 4 3 2 2 u 4 3 2 node 2 nodal 2 nod 38 1 4 3 2 turn 2 4 2 2 nocturne 2 nocturnal 38 1 4 3 2 dy 2 4 2 2 nobody'd 2 nobody 38 1 4 3 2 2 4 2 2 noblemen 2 nobleman 38 1 4 3 2 e 2 m 4 2 2 noblesse 2 noble 38 1 4 3 2 l 2 4 2 2 nobelium 2 Nobel 38 1 4 3 2 2 elo 4 1 2 nob 38 1 4 3 2 2 4 2 2 Noah 2 NOAA 38 1 4 3 2 2 abcdeilmnorstuvw 4 3 2 nozzle 2 noxious 2 no 38 1 4 3 2 2 4 2 2 NNW 2 NNE 38 1 4 3 2 2 e 4 1 2 nitroglycerine 38 1 4 3 2 n 2 4 2 2 nitrogenous 2 nitrogen 38 1 4 3 2 2 g 4 1 2 nitrous 38 1 4 3 2 2 4 3 2 nitrite 2 nitride 2 nitric 38 1 4 3 2 2 io 4 1 2 nitrate 38 1 4 3 2 2 r 4 3 2 nitty 2 nitpick 2 nit 38 1 4 3 2 2 4 2 2 Nippon 2 nipple 38 1 4 3 2 2 p 4 1 2 nip 38 1 4 3 2 b 2 4 2 2 niobium 2 Niobe 38 1 4 3 2 en 2 4 2 2 nineteenth 2 nineteen 38 1 4 3 2 2 e 4 2 2 ninety 2 ninetieth 38 1 4 3 2 2 t 4 4 2 Nineveh 2 ninefold 2 ninebark 2 nine 38 1 4 3 2 2 e 4 2 2 ninth 2 Nina 38 1 4 3 2 2 4 2 2 nimbus 2 nimble 38 1 4 3 2 2 b 4 1 2 NIMH 38 1 4 3 2 2 4 3 2 nilpotent 2 Nile 2 nil 38 1 4 3 2 2 4 2 2 Nikolai 2 Nikko 38 1 4 3 2 lis 2 4 2 2 nihilist 2 nihilism 38 1 4 3 2 2 i 4 1 2 NIH 38 1 4 3 2 ar 2 4 2 2 nightmarish 2 nightmare 38 1 4 3 2 2 4 2 2 nightclub 2 nightcap 38 1 4 3 2 2 cm 4 8 2 nighttime 2 nightshirt 2 nightingale 2 nighthawk 2 nightgown 2 nightfall 2 nightdress 2 night 38 1 4 3 2 2 t 4 1 2 nigh 38 1 4 3 2 2 4 3 2 niggle 2 nigger 2 niggardly 38 1 4 3 2 r 2 4 2 2 Nigeria 2 Niger 38 1 4 3 2 2 egh 4 0 38 1 4 3 2 s 2 4 2 2 Nielson 2 Nielsen 38 1 4 3 2 2 l 4 2 2 Nietzsche 2 niece 38 1 4 3 2 in 2 4 2 2 nicotine 2 nicotinamide 38 1 4 3 2 2 t 4 2 2 Nicosia 2 Nicodemus 38 1 4 3 2 2 4 3 2 nickname 2 nickel 2 nick 38 1 4 3 2 2 4 2 2 Nicholson 2 Nichols 38 1 4 3 2 l 2 s 4 2 2 Nicholls 2 Nicholas 38 1 4 3 2 2 o 4 2 2 nichrome 2 niche 38 1 4 3 2 2 4 2 2 nicety 2 nice 38 1 4 3 2 2 ehko 4 1 2 Nicaragua 38 1 4 3 2 2 4 3 2 Nibelung 2 nibble 2 nib 38 1 4 3 2 2 4 3 2 Niamey 2 Niagara 2 niacin 38 1 4 3 2 2 abceghklmnopt 4 2 2 Nixon 2 nirvana 38 1 4 3 2 n 2 4 2 2 Newtonian 2 newton 38 1 4 3 2 2 o 4 2 2 newts 2 newt 38 1 4 3 2 2 4 2 2 newspapermen 2 newspaperman 38 1 4 3 2 aper 2 m 4 1 2 newspaper 38 1 4 3 2 2 4 2 2 newsmen 2 newsman 38 1 4 3 2 2 mp 4 7 2 Newsweek 2 newsstand 2 newsreel 2 newsletter 2 newscast 2 newsboy 2 news 38 1 4 3 2 2 4 2 2 newlywed 2 newline 38 1 4 3 2 ound 2 4 2 2 Newfoundland 2 newfound 38 1 4 3 2 2 l 4 1 2 newest 38 1 4 3 2 2 4 2 2 newcomer 2 Newcastle 38 1 4 3 2 o 2 4 2 2 newborn 2 Newbold 38 1 4 3 2 2 bceflst 4 4 2 Newport 2 Newman 2 Newark 2 new 38 1 4 3 2 2 r 4 1 2 neve 38 1 4 3 2 2 4 2 2 Nevada 2 Neva 38 1 4 3 2 2 ae 4 1 2 Nevins 38 1 4 3 2 2 4 3 2 neutron 2 neutrino 2 neutral 38 1 4 3 2 2 r 4 1 2 neuter 38 1 4 3 2 2 4 2 2 neurosis 2 neuroses 38 1 4 3 2 2 4 3 2 neuropsychiatric 2 neurophysiology 2 neuropathology 38 1 4 3 2 2 4 2 2 neuronal 2 neuron 38 1 4 3 2 n 2 a 4 1 2 neuroanotomy 38 1 4 3 2 tom 2 4 2 2 neuroanatomy 2 neuroanatomic 38 1 4 3 2 2 anps 4 3 2 neurotic 2 neuromuscular 2 neurology 38 1 4 3 2 2 l 4 1 2 neurasthenic 38 1 4 3 2 2 4 2 2 neuralgia 2 neural 38 1 4 3 2 2 ao 4 1 2 neuritis 38 1 4 3 2 2 rt 4 1 2 Neumann 38 1 4 3 2 le 2 4 2 2 nettlesome 2 nettle 38 1 4 3 2 er 2 4 3 2 netherworld 2 Netherlands 2 nether 38 1 4 3 2 2 ht 4 2 2 network 2 net 38 1 4 3 2 2 4 4 2 nested 2 Nestor 2 nestle 2 nest 38 1 4 3 2 2 t 4 1 2 Ness 38 1 4 3 2 2 4 2 2 nervous 2 nerve 38 1 4 3 2 2 v 4 2 2 Nero 2 nereid 38 1 4 3 2 un 2 4 2 2 neptunium 2 Neptune 38 1 4 3 2 2 t 4 3 2 nephew 2 nepenthe 2 Nepal 38 1 4 3 2 2 4 2 2 neoprene 2 neophyte 38 1 4 3 2 t 2 4 2 2 neonate 2 neonatal 38 1 4 3 2 2 a 4 1 2 neon 38 1 4 3 2 2 4 2 2 neologism 2 neolithic 38 1 4 3 2 2 lnp 4 2 2 neodymium 2 neoclassic 38 1 4 3 2 2 4 2 2 Nelson 2 Nelsen 38 1 4 3 2 2 4 2 2 Nellie 2 Nell 38 1 4 3 2 2 ls 4 0 38 1 4 3 2 2 4 2 2 neither 2 Neil 38 1 4 3 2 o 2 4 3 2 Negroid 2 Negroes 2 Negro 38 1 4 3 2 tia 2 4 2 2 negotiate 2 negotiable 38 1 4 3 2 2 4 2 2 negligent 2 negligee 38 1 4 3 2 g 2 e 4 1 2 negligible 38 1 4 3 2 2 i 4 1 2 neglect 38 1 4 3 2 2 lor 4 1 2 negate 38 1 4 3 2 e 2 4 2 2 needlepoint 2 needle 38 1 4 3 2 2 l 4 8 2 needs 2 needing 2 needed 2 needy 2 needn't 2 needham 2 needful 2 need 38 1 4 3 2 2 d 4 1 2 nee 38 1 4 3 2 ar 2 4 4 2 nectary 2 nectarine 2 nectareous 2 nectar 38 1 4 3 2 an 2 c 4 1 2 necromantic 38 1 4 3 2 2 4 2 2 necromancy 2 necromancer 38 1 4 3 2 o 2 m 4 3 2 necrotic 2 necrosis 2 necropsy 38 1 4 3 2 2 4 2 2 neckline 2 necklace 38 1 4 3 2 2 l 4 2 2 necktie 2 neck 38 1 4 3 2 ss 2 i 4 1 2 necessary 38 1 4 3 2 t 2 4 2 2 necessity 2 necessitate 38 1 4 3 2 2 ekrt 4 0 38 1 4 3 2 2 4 3 2 nebular 2 nebulae 2 nebula 38 1 4 3 2 l 2 a 4 1 2 nebulous 38 1 4 3 2 2 u 4 1 2 Nebraska 38 1 4 3 2 2 e 4 2 2 neath 2 neat 38 1 4 3 2 2 4 5 2 nearing 2 nearly 2 nearsighted 2 nearby 2 near 38 1 4 3 2 2 rt 4 3 2 Neapolitan 2 Neanderthal 2 Neal 38 1 4 3 2 2 abcegiloprstuvw 4 6 2 next 2 nemesis 2 Nehru 2 Neff 2 Ned 2 ne 38 1 4 3 2 2 4 2 2 Ndjamena 2 ND 38 1 4 3 2 2 4 4 2 NCR 2 NCO 2 NCAA 2 NC 38 1 4 3 2 2 4 2 2 NBS 2 NBC 38 1 4 3 2 2 4 2 2 Nazism 2 Nazi 38 1 4 3 2 re 2 4 2 2 Nazareth 2 Nazarene 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 ga 2 4 2 2 navigate 2 navigable 38 1 4 3 2 2 4 2 2 navel 2 nave 38 1 4 3 2 2 4 2 2 naval 2 Navajo 38 1 4 3 2 2 aei 4 1 2 navy 38 1 4 3 2 i 2 4 2 2 nautilus 2 nautical 38 1 4 3 2 2 4 2 2 nauseate 2 nausea 38 1 4 3 2 e 2 a 4 1 2 nauseum 38 1 4 3 2 2 st 4 1 2 naughty 38 1 4 3 2 r 2 4 3 2 naturopath 2 nature 2 natural 38 1 4 3 2 n 2 4 4 2 nations 2 national 2 nationwide 2 nation 38 1 4 3 2 2 o 4 1 2 native 38 1 4 3 2 an 2 4 2 2 Nathaniel 2 Nathan 38 1 4 3 2 l 2 4 2 2 Natalie 2 natal 38 1 4 3 2 2 ahiu 4 5 2 natty 2 NATO 2 Natchez 2 Nate 2 Nat 38 1 4 3 2 2 4 2 2 nasty 2 nasturtium 38 1 4 3 2 2 4 3 2 Nashville 2 Nashua 2 Nash 38 1 4 3 2 2 4 2 2 nasal 2 NASA 38 1 4 3 2 2 Aht 4 2 2 Nassau 2 nascent 38 1 4 3 2 2 4 2 2 narrate 2 Narragansett 38 1 4 3 2 2 a 4 1 2 narrow 38 1 4 3 2 2 4 2 2 narcotic 2 narcosis 38 1 4 3 2 ss 2 4 2 2 narcissus 2 narcissist 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 cr 4 2 2 nary 2 Narbonne 38 1 4 3 2 leon 2 4 2 2 Napoleonic 2 Napoleon 38 1 4 3 2 2 o 4 3 2 Naples 2 napkin 2 nap 38 1 4 3 2 2 4 6 2 Nantucket 2 nanosecond 2 Nanking 2 Nanette 2 Nancy 2 Nan 38 1 4 3 2 2 e 4 1 2 naming 38 1 4 3 2 2 4 2 2 naked 2 Nakayama 38 1 4 3 2 e 2 4 2 2 naivete 2 naive 38 1 4 3 2 2 4 2 2 Nairobi 2 Nair 38 1 4 3 2 2 rv 4 2 2 nail 2 naiad 38 1 4 3 2 2 4 5 2 Nagy 2 Nagoya 2 nagging 2 Nagasaki 2 nag 38 1 4 3 2 i 2 4 2 2 nadir 2 Nadine 38 1 4 3 2 2 4 2 2 Nabisco 2 nab 38 1 4 3 2 2 bdgikmnprstuvz 4 3 2 nay 2 Naomi 2 NAACP 38 1 4 3 2 2 aBCdeiNOuY 4 11 2 NW 2 NV 2 NTIS 2 NSF 2 n's 2 NRC 2 NM 2 NJ 2 NH 2 Nguyen 2 n 38 1 4 3 2 h 2 4 3 2 mythology 2 mythic 2 myth 38 1 4 3 2 2 4 3 2 mystique 2 mystify 2 mystic 38 1 4 3 2 r 2 4 2 2 mystery 2 mysterious 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 t 4 1 2 myself 38 1 4 3 2 2 4 5 2 myrtle 2 myrrh 2 Myron 2 myriad 2 Myra 38 1 4 3 2 i 2 4 2 2 myopic 2 myopia 38 1 4 3 2 ardi 2 4 2 2 myocardium 2 myocardial 38 1 4 3 2 2 cp 4 3 2 myosin 2 myoglobin 2 myofibril 38 1 4 3 2 2 4 2 2 Mynheer 2 mynah 38 1 4 3 2 2 4 3 2 myeloid 2 myeline 2 myel 38 1 4 3 2 2 l 4 1 2 Myers 38 1 4 3 2 2 4 2 2 mycology 2 mycobacteria 38 1 4 3 2 nae 2 4 2 2 Mycenaean 2 Mycenae 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 cenorst 4 2 2 mylar 2 my 38 1 4 3 2 2 4 3 2 muzzle 2 Muzo 2 Muzak 38 1 4 3 2 2 4 2 2 mutuel 2 mutual 38 1 4 3 2 2 4 3 2 mutton 2 mutter 2 mutt 38 1 4 3 2 2 4 2 2 mutiny 2 mutineer 38 1 4 3 2 2 n 4 1 2 mutilate 38 1 4 3 2 2 nt 4 1 2 mutagen 38 1 4 3 2 2 4 2 2 mutatis 2 mutate 38 1 4 3 2 2 4 2 2 mutant 2 mutandis 38 1 4 3 2 2 aitu 4 1 2 mute 38 1 4 3 2 h 2 4 2 2 mustachio 2 mustache 38 1 4 3 2 2 c 4 2 2 mustard 2 mustang 38 1 4 3 2 2 a 4 3 2 musty 2 mustn't 2 must 38 1 4 3 2 i 2 4 2 2 muslin 2 muslim 38 1 4 3 2 x 2 4 2 2 muskoxen 2 muskox 38 1 4 3 2 2 4 3 2 musket 2 muskellunge 2 Muskegon 38 1 4 3 2 2 eo 4 3 2 muskrat 2 muskmelon 2 musk 38 1 4 3 2 c 2 4 4 2 musicology 2 musician 2 musicale 2 music 38 1 4 3 2 2 4 3 2 mushy 2 mushroom 2 mush 38 1 4 3 2 2 4 2 2 museum 2 muse 38 1 4 3 2 2 ou 4 2 2 muscle 2 Muscat 38 1 4 3 2 la 2 4 2 2 musculature 2 muscular 38 1 4 3 2 v 2 4 2 2 Muscovy 2 Muscovite 38 1 4 3 2 2 cehiklt 4 1 2 mussel 38 1 4 3 2 2 4 2 2 murre 2 Murray 38 1 4 3 2 2 4 2 2 murky 2 murk 38 1 4 3 2 2 4 2 2 Muriel 2 muriatic 38 1 4 3 2 er 2 4 2 2 murderous 2 murder 38 1 4 3 2 2 dikr 4 3 2 Murphy 2 murmur 2 mural 38 1 4 3 2 n 2 4 2 2 Muong 2 muon 38 1 4 3 2 2 4 2 2 municipal 2 Munich 38 1 4 3 2 2 c 4 2 2 munition 2 munificent 38 1 4 3 2 2 4 2 2 Muncie 2 munch 38 1 4 3 2 2 ci 4 3 2 Munson 2 mung 2 mundane 38 1 4 3 2 2 4 4 2 mummy 2 Mumford 2 mumble 2 mum 38 1 4 3 2 ud 2 4 2 2 multitudinous 2 multitude 38 1 4 3 2 2 t 4 1 2 multiplicand 38 1 4 3 2 i 2 4 2 2 multiplicative 2 multiplication 38 1 4 3 2 c 2 a 4 1 2 multiplicity 38 1 4 3 2 2 x 4 2 2 multiplet 2 multiple 38 1 4 3 2 2 4 2 2 multiplexor 2 multiplex 38 1 4 3 2 l 2 ei 4 0 38 1 4 3 2 i 2 pt 4 4 2 multi-purpose 2 multinomial 2 multifarious 2 multi 38 1 4 3 2 a 2 4 2 2 mulligatawny 2 mulligan 38 1 4 3 2 2 g 4 1 2 mullion 38 1 4 3 2 2 4 2 2 Mullen 2 mullein 38 1 4 3 2 2 ei 4 2 2 mullah 2 mull 38 1 4 3 2 2 4 2 2 mulct 2 mulch 38 1 4 3 2 2 clt 4 4 2 mulish 2 mule 2 mulberry 2 mulatto 38 1 4 3 2 2 4 2 2 muggy 2 mugging 38 1 4 3 2 2 g 4 2 2 mugho 2 mug 38 1 4 3 2 f 2 4 3 2 muffle 2 muffin 2 muff 38 1 4 3 2 2 4 2 2 muezzin 2 Mueller 38 1 4 3 2 e 2 4 2 2 muddlehead 2 muddle 38 1 4 3 2 2 l 4 2 2 muddy 2 Mudd 38 1 4 3 2 2 d 4 3 2 mudsling 2 mudguard 2 mud 38 1 4 3 2 2 4 5 2 mucus 2 mucosa 2 muck 2 mucilage 2 much 38 1 4 3 2 2 cdefglmnorstz 4 3 2 Mukden 2 Muir 2 mu 38 1 4 3 2 2 s 4 2 2 mr. 2 Mr 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 3 2 mouthpiece 2 mouthful 2 mouth 38 1 4 3 2 2 h 4 1 2 Mouton 38 1 4 3 2 2 4 3 2 mousy 2 moustache 2 mouse 38 1 4 3 2 n 2 4 2 2 mournful 2 mourn 38 1 4 3 2 in 2 4 4 2 mountainside 2 mountainous 2 mountaineer 2 mountain 38 1 4 3 2 2 a 4 1 2 mount 38 1 4 3 2 2 t 4 1 2 mound 38 1 4 3 2 2 4 2 2 Moulton 2 mould 38 1 4 3 2 2 lnrst 4 0 38 1 4 3 2 2 4 2 2 motto 2 mottle 38 1 4 3 2 r 2 4 3 2 Motorola 2 motorcycle 2 motor 38 1 4 3 2 2 4 2 2 motive 2 motivate 38 1 4 3 2 2 v 4 2 2 motion 2 motif 38 1 4 3 2 r 2 4 3 2 mothers 2 motherland 2 mother 38 1 4 3 2 2 e 4 1 2 moth 38 1 4 3 2 2 4 2 2 motet 2 motel 38 1 4 3 2 2 ehiot 4 2 2 motley 2 mot 38 1 4 3 2 2 4 2 2 mossy 2 moss 38 1 4 3 2 u 2 4 2 2 mosquito 2 mosque 38 1 4 3 2 2 4 2 2 Moses 2 Moser 38 1 4 3 2 2 eqs 4 4 2 most 2 Moslem 2 Moscow 2 mosaic 38 1 4 3 2 2 4 3 2 mortise 2 mortify 2 mortician 38 1 4 3 2 2 4 2 2 mortgagee 2 mortgage 38 1 4 3 2 ag 2 e 4 1 2 mortgagor 38 1 4 3 2 2 4 2 2 mortar 2 mortal 38 1 4 3 2 2 agi 4 3 2 Morton 2 mortem 2 mort 38 1 4 3 2 e 2 4 2 2 morsel 2 Morse 38 1 4 3 2 2 s 4 1 2 Morrill 38 1 4 3 2 2 4 4 2 Morristown 2 Morrissey 2 Morrison 2 morris 38 1 4 3 2 2 i 4 1 2 morrow 38 1 4 3 2 2 4 2 2 morphophonemic 2 morphology 38 1 4 3 2 2 4 2 2 morphism 2 morphine 38 1 4 3 2 m 2 4 2 2 morphemic 2 morpheme 38 1 4 3 2 h 2 eio 4 0 38 1 4 3 2 c 2 4 2 2 Morocco 2 Moroccan 38 1 4 3 2 2 c 4 2 2 morose 2 moron 38 1 4 3 2 2 4 2 2 moribund 2 Moriarty 38 1 4 3 2 2 4 3 2 morgue 2 morgen 2 Morgan 38 1 4 3 2 2 4 2 2 Moreland 2 morel 38 1 4 3 2 2 l 4 3 2 Moresby 2 moreover 2 more 38 1 4 3 2 2 l 4 5 2 Moravia 2 moratorium 2 morass 2 Moran 2 moraine 38 1 4 3 2 2 4 2 2 morale 2 moral 38 1 4 3 2 2 aegioprst 4 4 2 morn 2 Mormon 2 Morley 2 morbid 38 1 4 3 2 2 4 3 2 Moorish 2 Moore 2 moor 38 1 4 3 2 i 2 4 2 2 moonlit 2 moonlight 38 1 4 3 2 2 l 4 2 2 Mooney 2 moon 38 1 4 3 2 2 4 2 2 moody 2 mood 38 1 4 3 2 2 dnr 4 3 2 moot 2 moose 2 moo 38 1 4 3 2 2 4 2 2 Montreal 2 Montrachet 38 1 4 3 2 2 4 2 2 Montevideo 2 Monteverdi 38 1 4 3 2 2 v 4 3 2 Monterey 2 Montenegrin 2 monte 38 1 4 3 2 2 4 2 2 Montague 2 montage 38 1 4 3 2 2 g 4 1 2 Montana 38 1 4 3 2 2 aerh 4 7 2 Monty 2 Montpelier 2 Montmartre 2 Monticello 2 Montgomery 2 Montclair 2 Mont 38 1 4 3 2 o 2 4 2 2 monstrous 2 monstrosity 38 1 4 3 2 2 r 4 1 2 monster 38 1 4 3 2 2 t 4 3 2 monsoon 2 monsieur 2 Monsanto 38 1 4 3 2 o 2 4 2 2 Monrovia 2 Monroe 38 1 4 3 2 2 4 2 2 monotreme 2 monotonous 38 1 4 3 2 r 2 4 2 2 monomeric 2 monomer 38 1 4 3 2 2 e 4 1 2 monomial 38 1 4 3 2 g 2 4 2 2 monologue 2 monologist 38 1 4 3 2 2 o 4 1 2 monolith 38 1 4 3 2 am 2 4 2 2 monogamy 2 monogamous 38 1 4 3 2 2 4 3 2 monocular 2 monochromator 2 Monoceros 38 1 4 3 2 2 cglmt 4 3 2 monoxide 2 monopoly 2 Monongahela 38 1 4 3 2 y 2 4 2 2 monkeyflower 2 monkey 38 1 4 3 2 2 e 4 2 2 monkish 2 monk 38 1 4 3 2 or 2 4 3 2 monitoring 2 monitory 2 monitor 38 1 4 3 2 2 4 2 2 Monica 2 monic 38 1 4 3 2 2 ct 4 1 2 monies 38 1 4 3 2 o 2 4 2 2 mongoose 2 Mongolia 38 1 4 3 2 2 4 3 2 moneywort 2 moneymake 2 money 38 1 4 3 2 ar 2 4 2 2 monetary 2 monetarism 38 1 4 3 2 2 ty 4 1 2 monel 38 1 4 3 2 2 drs 4 3 2 monaural 2 Monaco 2 Mona 38 1 4 3 2 2 4 2 2 monastic 2 monastery 38 1 4 3 2 2 t 4 1 2 Monash 38 1 4 3 2 ch 2 4 3 2 monarchy 2 monarchic 2 monarch 38 1 4 3 2 2 4 2 2 monadic 2 monad 38 1 4 3 2 2 aegikorst 4 3 2 monument 2 Monmouth 2 Monday 38 1 4 3 2 nt 2 a 4 4 2 moments 2 momentum 2 momentous 2 moment 38 1 4 3 2 2 4 2 2 momentary 2 momenta 38 1 4 3 2 2 e 4 1 2 mommy 38 1 4 3 2 n 2 4 2 2 molybdenum 2 molybdenite 38 1 4 3 2 bd 2 e 4 1 2 molybdate 38 1 4 3 2 2 4 2 2 molten 2 molt 38 1 4 3 2 2 4 2 2 mollycoddle 2 Molly 38 1 4 3 2 2 4 2 2 mollify 2 Mollie 38 1 4 3 2 2 iy 4 2 2 mollusk 2 Moll 38 1 4 3 2 2 4 2 2 Moline 2 Moliere 38 1 4 3 2 ul 2 4 2 2 molecule 2 molecular 38 1 4 3 2 2 c 4 3 2 molest 2 molehill 2 mole 38 1 4 3 2 2 4 3 2 moldboard 2 Moldavia 2 mold 38 1 4 3 2 2 4 3 2 molasses 2 molar 2 molal 38 1 4 3 2 2 adeilty 4 2 2 Moluccas 2 Moloch 38 1 4 3 2 2 4 3 2 moisture 2 moisten 2 moist 38 1 4 3 2 2 t 4 1 2 Moiseyev 38 1 4 3 2 2 s 4 3 2 moire 2 Moines 2 moiety 38 1 4 3 2 2 4 2 2 Mohawk 2 Mohammedan 38 1 4 3 2 2 a 4 1 2 Mohr 38 1 4 3 2 2 4 2 2 Moen 2 Moe 38 1 4 3 2 2 4 2 2 modulate 2 modular 38 1 4 3 2 l 2 a 4 4 2 modulus 2 modulo 2 moduli 2 module 38 1 4 3 2 2 f 4 2 2 modish 2 modicum 38 1 4 3 2 t 2 4 3 2 modesty 2 Modesto 2 modest 38 1 4 3 2 2 4 2 2 modern 2 moderate 38 1 4 3 2 2 rs 4 3 2 modem 2 model 2 mode 38 1 4 3 2 2 eiu 4 1 2 modal 38 1 4 3 2 r 2 4 2 2 mockery 2 mockernut 38 1 4 3 2 2 e 4 3 2 mockup 2 mockingbird 2 mock 38 1 4 3 2 2 k 4 1 2 moccasin 38 1 4 3 2 l 2 4 3 2 mobility 2 mobile 2 Mobil 38 1 4 3 2 2 i 4 3 2 mobster 2 mobcap 2 mob 38 1 4 3 2 2 4 2 2 moat 2 moan 38 1 4 3 2 2 abcdehilmnorstuv 4 6 2 Mozart 2 Moyer 2 mow 2 mop 2 Mogadiscio 2 MO 38 1 4 3 2 2 4 2 2 mnemonic 2 MN 38 1 4 3 2 2 4 3 2 mixup 2 mixture 2 mix 38 1 4 3 2 2 4 2 2 mitten 2 mitt 38 1 4 3 2 2 4 2 2 mitre 2 mitral 38 1 4 3 2 2 4 2 2 mitosis 2 mitochondria 38 1 4 3 2 2 4 2 2 miterwort 2 mite 38 1 4 3 2 2 eort 4 3 2 mitigate 2 Mitchell 2 MIT 38 1 4 3 2 2 4 5 2 mistaken 2 misty 2 mistress 2 mistletoe 2 mist 38 1 4 3 2 u 2 4 2 2 Missouri 2 Missoula 38 1 4 3 2 sippi 2 4 2 2 Mississippian 2 Mississippi 38 1 4 3 2 n 2 4 2 2 missionary 2 mission 38 1 4 3 2 2 os 4 3 2 missing 2 missive 2 missile 38 1 4 3 2 2 iop 4 4 2 missed 2 Missy 2 misshapen 2 miss 38 1 4 3 2 gyn 2 4 2 2 misogyny 2 misogynist 38 1 4 3 2 r 2 4 2 2 misery 2 miser 38 1 4 3 2 2 l 4 1 2 miscegenation 38 1 4 3 2 lan 2 4 2 2 miscellany 2 miscellaneous 38 1 4 3 2 2 e 4 3 2 miscreant 2 mischievous 2 miscible 38 1 4 3 2 nthrop 2 4 2 2 misanthropic 2 misanthrope 38 1 4 3 2 2 aceost 4 2 2 mislaid 2 misnomer 38 1 4 3 2 2 c 4 3 2 Miranda 2 mirage 2 Mira 38 1 4 3 2 2 4 2 2 miraculous 2 miracle 38 1 4 3 2 2 a 4 5 2 mirth 2 mirror 2 Miriam 2 Mirfak 2 mire 38 1 4 3 2 2 m 4 1 2 minute 38 1 4 3 2 2 4 2 2 minutemen 2 minuteman 38 1 4 3 2 2 e 4 1 2 minutiae 38 1 4 3 2 2 4 2 2 minuscule 2 minus 38 1 4 3 2 2 4 2 2 minuet 2 minuend 38 1 4 3 2 2 est 4 0 38 1 4 3 2 rel 2 4 2 2 minstrelsy 2 minstrel 38 1 4 3 2 2 4 2 2 Minsky 2 Minsk 38 1 4 3 2 2 kt 4 0 38 1 4 3 2 2 4 4 2 minot 2 Minos 2 minor 2 Minoan 38 1 4 3 2 2 4 2 2 Minnesota 2 Minneapolis 38 1 4 3 2 2 e 4 2 2 minnow 2 Minnie 38 1 4 3 2 t 2 4 2 2 ministry 2 ministerial 38 1 4 3 2 2 4 3 2 minimax 2 minimal 2 minima 38 1 4 3 2 2 a 4 2 2 minimum 2 minim 38 1 4 3 2 2 ms 4 4 2 minion 2 minicomputer 2 miniature 2 mini 38 1 4 3 2 2 4 2 2 minesweeper 2 minestrone 38 1 4 3 2 l 2 4 2 2 mineralogy 2 mineral 38 1 4 3 2 2 a 4 1 2 Minerva 38 1 4 3 2 2 rs 4 2 2 minefield 2 mine 38 1 4 3 2 2 4 3 2 mindful 2 Mindanao 2 mind 38 1 4 3 2 e 2 4 2 2 mincemeat 2 mince 38 1 4 3 2 2 cdeinosu 4 5 2 mint 2 mink 2 mingle 2 minaret 2 min 38 1 4 3 2 2 4 2 2 mimicking 2 mimicked 38 1 4 3 2 2 k 4 1 2 mimic 38 1 4 3 2 2 c 4 1 2 Mimi 38 1 4 3 2 2 4 3 2 mimetic 2 mimesis 2 mimeograph 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 n 2 4 2 2 Miltonic 2 Milton 38 1 4 3 2 2 o 4 1 2 milt 38 1 4 3 2 n 2 4 4 2 millions 2 millionth 2 millionaire 2 million 38 1 4 3 2 2 o 4 4 2 millipede 2 millinery 2 Millikan 2 Millie 38 1 4 3 2 2 n 4 2 2 millenia 2 millenarian 38 1 4 3 2 i 2 4 2 2 millennium 2 millennia 38 1 4 3 2 2 n 4 1 2 millet 38 1 4 3 2 2 ei 4 3 2 millstone 2 Millard 2 mill 38 1 4 3 2 2 4 3 2 milky 2 milkweed 2 milk 38 1 4 3 2 a 2 4 2 2 militiamen 2 militia 38 1 4 3 2 2 r 4 2 2 militate 2 militant 38 1 4 3 2 s 2 4 2 2 militarist 2 militarism 38 1 4 3 2 2 i 4 1 2 military 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 2 t 4 1 2 milieu 38 1 4 3 2 2 4 2 2 milestone 2 Miles 38 1 4 3 2 2 s 4 2 2 mileage 2 mile 38 1 4 3 2 2 4 3 2 Mildred 2 mildew 2 mild 38 1 4 3 2 2 4 2 2 Milan 2 mila 38 1 4 3 2 2 adeiklt 4 3 2 Milwaukee 2 milord 2 milch 38 1 4 3 2 2 4 2 2 migratory 2 migrate 38 1 4 3 2 a 2 t 4 1 2 migrant 38 1 4 3 2 t 2 4 3 2 mighty 2 mightn't 2 might 38 1 4 3 2 2 hr 4 3 2 Miguel 2 mignon 2 mig 38 1 4 3 2 2 4 3 2 midwives 2 midwinter 2 midwife 38 1 4 3 2 t 2 4 2 2 Midwestern 2 Midwest 38 1 4 3 2 2 s 4 1 2 midweek 38 1 4 3 2 2 ei 4 1 2 midway 38 1 4 3 2 2 4 2 2 midstream 2 midst 38 1 4 3 2 ipm 2 4 2 2 midshipmen 2 midshipman 38 1 4 3 2 2 ht 4 3 2 midspan 2 midsection 2 midscale 38 1 4 3 2 e 2 4 2 2 midget 2 midge 38 1 4 3 2 o 2 4 2 2 Middletown 2 Middleton 38 1 4 3 2 2 4 2 2 middlemen 2 middleman 38 1 4 3 2 e 2 mt 4 4 2 middleweight 2 Middlesex 2 Middlebury 2 middle 38 1 4 3 2 2 l 4 1 2 midday 38 1 4 3 2 2 dgsw 4 9 2 midterm 2 midrange 2 midpoint 2 midnight 2 midmorn 2 midland 2 midband 2 Midas 2 mid 38 1 4 3 2 2 4 2 2 Micronesia 2 micron 38 1 4 3 2 o 2 n 4 5 2 microscopy 2 micrography 2 microcosm 2 microbial 2 micro 38 1 4 3 2 2 4 2 2 Mickey 2 Mickelson 38 1 4 3 2 2 e 4 1 2 Micky 38 1 4 3 2 l 2 4 5 2 Michelson 2 Michelin 2 Michele 2 Michelangelo 2 Michel 38 1 4 3 2 el 2 4 2 2 Michaelangelo 2 Michael 38 1 4 3 2 2 ae 4 1 2 michigan 38 1 4 3 2 2 hkr 4 2 2 mice 2 mica 38 1 4 3 2 ma 2 4 2 2 miasmal 2 miasma 38 1 4 3 2 2 s 4 1 2 Miami 38 1 4 3 2 2 acdglmnrstx 4 6 2 Mizar 2 Miocene 2 mike 2 miff 2 mien 2 mi 38 1 4 3 2 ic 2 4 2 2 Mexico 2 Mexican 38 1 4 3 2 le 2 4 2 2 mettlesome 2 mettle 38 1 4 3 2 oli 2 4 2 2 metropolitan 2 metropolis 38 1 4 3 2 2 p 4 2 2 metronome 2 metro 38 1 4 3 2 2 o 4 1 2 metric 38 1 4 3 2 2 4 2 2 metier 2 meticulous 38 1 4 3 2 l 2 4 2 2 methylene 2 methyl 38 1 4 3 2 2 4 2 2 Methuselah 2 Methuen 38 1 4 3 2 d 2 4 4 2 methods 2 methodology 2 methodic 2 method 38 1 4 3 2 2 n 4 1 2 methacrylate 38 1 4 3 2 2 4 2 2 methanol 2 methane 38 1 4 3 2 2 aouy 4 1 2 methionine 38 1 4 3 2 2 4 2 2 meteoritic 2 meteorite 38 1 4 3 2 2 t 4 1 2 meteoric 38 1 4 3 2 r 2 i 4 2 2 meteorology 2 meteor 38 1 4 3 2 2 o 4 2 2 meter 2 mete 38 1 4 3 2 hor 2 4 2 2 metaphoric 2 metaphor 38 1 4 3 2 s 2 4 2 2 metamorphosis 2 metamorphose 38 1 4 3 2 2 4 2 2 metamorphism 2 metamorphic 38 1 4 3 2 orph 2 io 4 0 38 1 4 3 2 2 4 2 2 metallurgist 2 metallurgic 38 1 4 3 2 rg 2 i 4 1 2 metallurgy 38 1 4 3 2 2 4 2 2 metalloid 2 metallography 38 1 4 3 2 2 4 2 2 metalliferous 2 metallic 38 1 4 3 2 2 iou 4 0 38 1 4 3 2 2 l 4 2 2 metalwork 2 metal 38 1 4 3 2 ol 2 i 4 1 2 metabole 38 1 4 3 2 2 4 3 2 metabolite 2 metabolism 2 metabolic 38 1 4 3 2 2 blmp 4 0 38 1 4 3 2 2 aehirt 4 3 2 Metzler 2 Metcalf 2 met 38 1 4 3 2 2 4 2 2 messieurs 2 Messiah 38 1 4 3 2 2 ia 4 4 2 messy 2 Messrs 2 messenger 2 mess 38 1 4 3 2 2 4 4 2 Mesozoic 2 Mesopotamia 2 meson 2 mesoderm 38 1 4 3 2 al 2 4 2 2 mescaline 2 mescal 38 1 4 3 2 2 cos 4 5 2 mesquite 2 mesmeric 2 mesh 2 mesenteric 2 mesa 38 1 4 3 2 2 4 2 2 merrymake 2 merry 38 1 4 3 2 2 m 4 3 2 Merritt 2 Merrill 2 Merriam 38 1 4 3 2 2 4 2 2 merriment 2 Merrimack 38 1 4 3 2 2 iy 4 0 38 1 4 3 2 2 4 2 2 merlin 2 Merle 38 1 4 3 2 2 4 2 2 meritorious 2 merit 38 1 4 3 2 i 2 4 2 2 meridional 2 meridian 38 1 4 3 2 2 dt 4 1 2 meringue 38 1 4 3 2 2 4 2 2 merge 2 merganser 38 1 4 3 2 2 4 4 2 merely 2 meretricious 2 Meredith 2 mere 38 1 4 3 2 2 aehu 4 3 2 mercy 2 Merck 2 merciful 38 1 4 3 2 2 4 2 2 mercuric 2 mercurial 38 1 4 3 2 r 2 i 4 1 2 mercury 38 1 4 3 2 an 2 4 2 2 merchant 2 merchandise 38 1 4 3 2 2 4 3 2 mercer 2 mercenary 2 Mercedes 38 1 4 3 2 2 4 2 2 Mercator 2 mercantile 38 1 4 3 2 2 cegilr 4 2 2 Mervin 2 mermaid 38 1 4 3 2 2 i 4 2 2 mentor 2 mental 38 1 4 3 2 ra 2 4 2 2 mensuration 2 mensurable 38 1 4 3 2 2 u 4 1 2 menstruate 38 1 4 3 2 2 4 3 2 meniscus 2 meningitis 2 menial 38 1 4 3 2 l 2 4 3 2 Mendelssohn 2 mendelevium 2 Mendel 38 1 4 3 2 ci 2 4 2 2 mendacity 2 mendacious 38 1 4 3 2 2 ae 4 1 2 mend 38 1 4 3 2 2 4 3 2 menarche 2 menagerie 2 menace 38 1 4 3 2 2 adist 4 8 2 Menzies 2 menu 2 Mennonite 2 Menlo 2 menhaden 2 menfolk 2 Menelaus 2 men 38 1 4 3 2 2 bn 4 0 38 1 4 3 2 d 2 4 2 2 memorandum 2 memoranda 38 1 4 3 2 2 4 2 2 memorable 2 memorabilia 38 1 4 3 2 2 a 4 2 2 memory 2 memorial 38 1 4 3 2 2 r 4 2 2 memoir 2 memo 38 1 4 3 2 2 e 4 1 2 membrane 38 1 4 3 2 2 bo 4 2 2 Memphis 2 memento 38 1 4 3 2 i 2 4 2 2 Melvin 2 Melville 38 1 4 3 2 2 ir 4 1 2 melody 38 1 4 3 2 ama 2 4 2 2 melodramatic 2 melodrama 38 1 4 3 2 2 4 2 2 melodious 2 melodic 38 1 4 3 2 2 d 4 1 2 melon 38 1 4 3 2 o 2 4 2 2 mellow 2 Mellon 38 1 4 3 2 2 4 3 2 Melissa 2 meliorate 2 Melinda 38 1 4 3 2 2 4 2 2 melanin 2 Melanie 38 1 4 3 2 2 i 4 4 2 melanoma 2 melange 2 Melanesia 2 melancholy 38 1 4 3 2 2 n 4 1 2 melamine 38 1 4 3 2 2 ailov 4 7 2 melt 2 Melpomene 2 melee 2 meld 2 Melcher 2 Melbourne 2 Mel 38 1 4 3 2 2 4 3 2 Meistersinger 2 meiosis 2 Meier 38 1 4 3 2 2 4 2 2 megaword 2 megawatt 38 1 4 3 2 omania 2 4 2 2 megalomaniac 2 megalomania 38 1 4 3 2 2 4 2 2 megabyte 2 megabit 38 1 4 3 2 2 blw 4 3 2 megavolt 2 megaton 2 megahertz 38 1 4 3 2 2 a 4 2 2 megohm 2 Meg 38 1 4 3 2 2 i 4 2 2 meets 2 meet 38 1 4 3 2 2 t 4 1 2 meek 38 1 4 3 2 2 4 2 2 medley 2 medlar 38 1 4 3 2 2 4 2 2 Mediterranean 2 meditate 38 1 4 3 2 cr 2 4 2 2 mediocrity 2 mediocre 38 1 4 3 2 2 4 2 2 medicine 2 medicinal 38 1 4 3 2 2 n 4 1 2 Medici 38 1 4 3 2 2 ia 4 2 2 medico 2 medic 38 1 4 3 2 2 4 4 2 mediate 2 median 2 medial 2 media 38 1 4 3 2 2 acot 4 1 2 medium 38 1 4 3 2 l 2 4 2 2 medallion 2 medal 38 1 4 3 2 2 ail 4 4 2 Medusa 2 Medford 2 Medea 2 meddle 38 1 4 3 2 2 4 2 2 mechanist 2 mechanism 38 1 4 3 2 ani 2 s 4 1 2 mechanic 38 1 4 3 2 2 h 4 2 2 mecum 2 Mecca 38 1 4 3 2 2 4 2 2 meaty 2 meat 38 1 4 3 2 2 4 2 2 measure 2 measle 38 1 4 3 2 2 4 2 2 meantime 2 meant 38 1 4 3 2 2 t 4 5 2 means 2 meanwhile 2 meaningful 2 meander 2 mean 38 1 4 3 2 2 4 3 2 mealy 2 mealtime 2 meal 38 1 4 3 2 2 o 4 1 2 mead 38 1 4 3 2 w 2 4 3 2 meadowsweet 2 meadowland 2 meadow 38 1 4 3 2 2 dlnst 4 1 2 meager 38 1 4 3 2 2 acdegilmnrstx 4 6 2 mezzo 2 Meyer 2 mew 2 Mephistopheles 2 Mekong 2 me 38 1 4 3 2 2 4 2 2 McNaughton 2 McNally 38 1 4 3 2 2 a 4 2 2 McNulty 2 McNeil 38 1 4 3 2 2 4 3 2 McMullen 2 McMillan 2 McMahon 38 1 4 3 2 2 4 2 2 McLeod 2 McLean 38 1 4 3 2 2 e 4 1 2 McLaughlin 38 1 4 3 2 n 2 4 2 2 McKinney 2 McKinley 38 1 4 3 2 2 4 2 2 McKenzie 2 McKenna 38 1 4 3 2 2 n 4 3 2 McKesson 2 McKeon 2 McKee 38 1 4 3 2 2 ei 4 2 2 McKnight 2 McKay 38 1 4 3 2 nt 2 4 2 2 McIntyre 2 McIntosh 38 1 4 3 2 2 4 2 2 McGraw 2 McGrath 38 1 4 3 2 2 a 4 1 2 McGregor 38 1 4 3 2 2 4 2 2 McGowan 2 McGovern 38 1 4 3 2 2 4 2 2 McGinnis 2 McGill 38 1 4 3 2 2 ior 4 2 2 McGuire 2 McGee 38 1 4 3 2 a 2 4 2 2 McFarland 2 McFadden 38 1 4 3 2 2 4 2 2 McDonnell 2 McDonald 38 1 4 3 2 2 n 4 2 2 McDowell 2 McDougall 38 1 4 3 2 2 o 4 2 2 McDermott 2 McDaniel 38 1 4 3 2 nel 2 4 2 2 McConnell 2 McConnel 38 1 4 3 2 2 n 4 2 2 McCoy 2 McCormick 38 1 4 3 2 2 4 2 2 McCluskey 2 McClure 38 1 4 3 2 2 u 4 2 2 McClellan 2 McClain 38 1 4 3 2 2 lr 4 3 2 McCauley 2 McCann 2 McCabe 38 1 4 3 2 t 2 4 2 2 McCarty 2 McCarthy 38 1 4 3 2 l 2 4 2 2 McCallum 2 McCall 38 1 4 3 2 2 alo 4 2 2 McCullough 2 McCracken 38 1 4 3 2 2 4 2 2 McAllister 2 McAdams 38 1 4 3 2 2 ACDFGIKLMN 4 4 2 McPherson 2 McHugh 2 McElroy 2 McBride 38 1 4 3 2 A 2 4 2 2 Mbabane 2 MBA 38 1 4 3 2 2 4 3 2 mazurka 2 maze 2 Mazda 38 1 4 3 2 2 4 2 2 mayoral 2 mayor 38 1 4 3 2 2 r 4 2 2 mayonnaise 2 Mayo 38 1 4 3 2 2 4 2 2 Mayflower 2 Mayfair 38 1 4 3 2 2 4 2 2 mayapple 2 Maya 38 1 4 3 2 2 afo 4 6 2 mayst 2 Maynard 2 mayhem 2 Mayer 2 maybe 2 may 38 1 4 3 2 ell 2 4 2 2 Maxwellian 2 maxwell 38 1 4 3 2 2 a 4 3 2 maximum 2 Maximilian 2 maxim 38 1 4 3 2 2 4 2 2 maximal 2 maxima 38 1 4 3 2 2 m 4 1 2 Maxine 38 1 4 3 2 2 iw 4 1 2 max 38 1 4 3 2 2 4 3 2 Mawr 2 mawkish 2 maw 38 1 4 3 2 2 4 2 2 Mavis 2 maverick 38 1 4 3 2 2 4 2 2 Mauritius 2 Mauritania 38 1 4 3 2 2 4 2 2 Mauricio 2 Maurice 38 1 4 3 2 2 ct 4 1 2 Maurine 38 1 4 3 2 2 i 4 1 2 Maureen 38 1 4 3 2 2 r 4 4 2 mauve 2 mausoleum 2 maul 2 maudlin 38 1 4 3 2 r 2 4 2 2 mature 2 maturate 38 1 4 3 2 2 e 4 4 2 Mattson 2 mattress 2 mattock 2 Matthew 38 1 4 3 2 2 4 2 2 Matsumoto 2 Matson 38 1 4 3 2 2 4 2 2 matron 2 matroid 38 1 4 3 2 2 acm 4 1 2 matrix 38 1 4 3 2 on 2 4 2 2 matrimony 2 matrimonial 38 1 4 3 2 2 4 2 2 matriculate 2 matrices 38 1 4 3 2 rch 2 4 2 2 matriarchal 2 matriarch 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 4 3 2 matins 2 matinee 2 matinal 38 1 4 3 2 2 n 4 2 2 Matisse 2 Matilda 38 1 4 3 2 2 4 2 2 Mathieu 2 Mathias 38 1 4 3 2 s 2 4 2 2 Mathewson 2 Mathews 38 1 4 3 2 ati 2 c 4 1 2 Mathematik 38 1 4 3 2 2 4 2 2 mathematician 2 mathematic 38 1 4 3 2 2 mw 4 0 38 1 4 3 2 2 ei 4 1 2 math 38 1 4 3 2 2 4 2 2 maternity 2 maternal 38 1 4 3 2 2 4 2 2 materiel 2 material 38 1 4 3 2 2 in 4 1 2 mater 38 1 4 3 2 2 r 4 2 2 Mateo 2 mate 38 1 4 3 2 h 2 4 4 2 matching 2 matchmake 2 matchbook 2 match 38 1 4 3 2 2 cehirstu 4 1 2 mat 38 1 4 3 2 2 4 2 2 mastiff 2 mastic 38 1 4 3 2 r 2 4 6 2 masters 2 mastery 2 masterpiece 2 mastermind 2 masterful 2 master 38 1 4 3 2 2 ei 4 3 2 masturbate 2 mastodon 2 mast 38 1 4 3 2 2 4 2 2 massive 2 massif 38 1 4 3 2 2 4 2 2 Massey 2 masseur 38 1 4 3 2 2 4 2 2 massacre 2 Massachusetts 38 1 4 3 2 2 c 4 1 2 massage 38 1 4 3 2 2 aei 4 1 2 mass 38 1 4 3 2 ue 2 4 2 2 masquerade 2 masque 38 1 4 3 2 2 4 2 2 Masonite 2 Masonic 38 1 4 3 2 2 i 4 2 2 masonry 2 mason 38 1 4 3 2 his 2 4 2 2 masochist 2 masochism 38 1 4 3 2 2 cn 4 0 38 1 4 3 2 r 2 4 2 2 Maseru 2 maser 38 1 4 3 2 2 4 2 2 masculine 2 mascara 38 1 4 3 2 2 ceoqst 4 2 2 mask 2 mash 38 1 4 3 2 2 4 2 2 Maryland 2 Mary 38 1 4 3 2 l 2 4 2 2 marvelous 2 marvel 38 1 4 3 2 2 e 4 1 2 Marvin 38 1 4 3 2 2 4 2 2 martyrdom 2 martyr 38 1 4 3 2 2 r 4 1 2 Marty 38 1 4 3 2 2 4 2 2 Martinique 2 martini 38 1 4 3 2 2 i 4 4 2 Martinson 2 martingale 2 Martinez 2 martin 38 1 4 3 2 2 4 2 2 Martian 2 martial 38 1 4 3 2 2 an 4 0 38 1 4 3 2 n 2 4 2 2 martensite 2 marten 38 1 4 3 2 2 eiy 4 2 2 Martha 2 mart 38 1 4 3 2 2 4 2 2 Marshall 2 marshal 38 1 4 3 2 2 l 4 1 2 Marsha 38 1 4 3 2 2 a 4 3 2 marshmallow 2 marshland 2 marsh 38 1 4 3 2 2 h 4 2 2 marsupial 2 Marseilles 38 1 4 3 2 w 2 4 2 2 marrowbone 2 marrow 38 1 4 3 2 2 a 4 2 2 Marriott 2 Marrietta 38 1 4 3 2 ge 2 4 2 2 marriageable 2 marriage 38 1 4 3 2 2 io 4 1 2 marry 38 1 4 3 2 2 4 4 2 Marquette 2 marquess 2 marquee 2 marque 38 1 4 3 2 u 2 e 4 1 2 marquis 38 1 4 3 2 2 4 2 2 marmot 2 marmalade 38 1 4 3 2 oro 2 4 2 2 Marlborough 2 Marlboro 38 1 4 3 2 2 b 4 3 2 Marlowe 2 marlin 2 Marlene 38 1 4 3 2 m 2 4 2 2 marksmen 2 marksman 38 1 4 3 2 v 2 4 2 2 Markovian 2 Markov 38 1 4 3 2 t 2 e 4 5 2 markets 2 marketing 2 marketwise 2 marketplace 2 market 38 1 4 3 2 2 eos 4 2 2 Markham 2 mark 38 1 4 3 2 or 2 4 3 2 Marjory 2 Marjorie 2 marjoram 38 1 4 3 2 2 4 2 2 maritime 2 marital 38 1 4 3 2 2 4 2 2 marionette 2 Marion 38 1 4 3 2 2 n 4 1 2 Mario 38 1 4 3 2 2 4 3 2 marinate 2 marinade 2 marina 38 1 4 3 2 2 a 4 3 2 Marino 2 marine 2 Marin 38 1 4 3 2 2 4 2 2 Marietta 2 Marie 38 1 4 3 2 2 4 2 2 Marianne 2 maria 38 1 4 3 2 2 aenot 4 4 2 marimba 2 Marilyn 2 marijuana 2 marigold 38 1 4 3 2 l 2 4 2 2 marginalia 2 marginal 38 1 4 3 2 n 2 a 4 1 2 margin 38 1 4 3 2 r 2 4 2 2 margarine 2 Margaret 38 1 4 3 2 2 ai 4 3 2 Marguerite 2 Margo 2 Margery 38 1 4 3 2 2 4 2 2 Marcello 2 Marcel 38 1 4 3 2 2 l 4 1 2 Marceau 38 1 4 3 2 2 e 4 6 2 Marcy 2 Marcus 2 Marco 2 Marcia 2 march 2 Marc 38 1 4 3 2 2 4 2 2 maraud 2 marathon 38 1 4 3 2 2 acgijklmqrstvy 4 6 2 Marx 2 maroon 2 mare 2 Mardi 2 marble 2 mar 38 1 4 3 2 2 4 2 2 maple 2 map 38 1 4 3 2 2 4 2 2 Maori 2 Mao 38 1 4 3 2 2 4 2 2 manumitted 2 manumit 38 1 4 3 2 i 2 t 4 1 2 manumission 38 1 4 3 2 2 m 4 5 2 manuscript 2 manure 2 manufacture 2 Manuel 2 manual 38 1 4 3 2 e 2 4 2 2 mantlepiece 2 mantle 38 1 4 3 2 2 4 2 2 mantissa 2 mantis 38 1 4 3 2 2 s 4 1 2 mantic 38 1 4 3 2 2 il 4 2 2 mantrap 2 mantel 38 1 4 3 2 2 4 2 2 manservant 2 manse 38 1 4 3 2 2 e 4 3 2 manslaughter 2 mansion 2 Mansfield 38 1 4 3 2 2 4 2 2 manor 2 manometer 38 1 4 3 2 2 e 4 2 2 manna 2 Mann 38 1 4 3 2 ula 2 4 2 2 manipulate 2 manipulable 38 1 4 3 2 st 2 4 2 2 manifestation 2 manifest 38 1 4 3 2 2 e 4 1 2 manifold 38 1 4 3 2 2 c 4 1 2 mania 38 1 4 3 2 2 4 2 2 maniacal 2 maniac 38 1 4 3 2 2 afp 4 4 2 Manitoba 2 Manila 2 manikin 2 manic 38 1 4 3 2 2 4 2 2 manhole 2 Manhattan 38 1 4 3 2 2 4 2 2 mangel 2 mange 38 1 4 3 2 2 e 4 2 2 mangle 2 manganese 38 1 4 3 2 2 4 2 2 maneuver 2 mane 38 1 4 3 2 2 4 3 2 mandrill 2 mandrel 2 mandrake 38 1 4 3 2 2 t 4 2 2 mandarin 2 mandamus 38 1 4 3 2 2 4 2 2 mandatory 2 mandate 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 2 r 4 5 2 manages 2 management 2 managed 2 manageable 2 manage 38 1 4 3 2 2 e 4 2 2 managing 2 Managua 38 1 4 3 2 2 g 4 3 2 manatee 2 Manama 2 mana 38 1 4 3 2 2 adeghinostu 4 9 2 manzanita 2 many 2 Manville 2 manpower 2 Manley 2 mankind 2 Manfred 2 Manchester 2 man 38 1 4 3 2 2 l 4 1 2 mamma 38 1 4 3 2 2 4 2 2 mammalian 2 mammal 38 1 4 3 2 2 a 4 1 2 mammoth 38 1 4 3 2 2 m 4 1 2 mambo 38 1 4 3 2 2 4 2 2 maltose 2 Malton 38 1 4 3 2 2 o 4 4 2 maltreat 2 Maltese 2 Malta 2 malt 38 1 4 3 2 2 4 2 2 malpractice 2 malposed 38 1 4 3 2 e 2 4 2 2 Maloney 2 Malone 38 1 4 3 2 2 n 4 1 2 malocclusion 38 1 4 3 2 2 4 2 2 malnutrition 2 malnourished 38 1 4 3 2 2 4 2 2 mallow 2 Mallory 38 1 4 3 2 2 4 2 2 mallet 2 malleable 38 1 4 3 2 2 eo 4 2 2 mallard 2 mall 38 1 4 3 2 n 2 4 2 2 malignant 2 malign 38 1 4 3 2 2 4 2 2 malicious 2 malice 38 1 4 3 2 2 cg 4 1 2 Mali 38 1 4 3 2 rm 2 4 2 2 malformed 2 malformation 38 1 4 3 2 2 o 4 2 2 malfunction 2 malfeasant 38 1 4 3 2 2 4 3 2 malevolent 2 maledict 2 male 38 1 4 3 2 2 4 2 2 Maldive 2 maldistribute 38 1 4 3 2 2 i 4 1 2 Malden 38 1 4 3 2 2 4 2 2 malcontent 2 malconduct 38 1 4 3 2 o 2 n 4 1 2 Malcolm 38 1 4 3 2 2 dry 4 5 2 Malawi 2 malaprop 2 malaise 2 Malagasy 2 Malabar 38 1 4 3 2 2 4 2 2 Malaysia 2 Malay 38 1 4 3 2 ia 2 4 2 2 malarial 2 malaria 38 1 4 3 2 pt 2 4 2 2 maladaptive 2 maladapt 38 1 4 3 2 2 a 4 3 2 malady 2 maladroit 2 maladjust 38 1 4 3 2 2 acdefilnopt 4 1 2 Malraux 38 1 4 3 2 2 e 4 1 2 making 38 1 4 3 2 st 2 4 2 2 majesty 2 majestic 38 1 4 3 2 2 e 4 1 2 major 38 1 4 3 2 2 4 2 2 maintenance 2 maintain 38 1 4 3 2 t 2 4 2 2 mainstream 2 mainstay 38 1 4 3 2 2 4 3 2 mainly 2 mainline 2 mainland 38 1 4 3 2 2 lst 4 2 2 Maine 2 main 38 1 4 3 2 2 4 2 2 mailmen 2 mailman 38 1 4 3 2 2 m 4 3 2 mailing 2 mailbox 2 mail 38 1 4 3 2 2 e 4 2 2 maidservant 2 maid 38 1 4 3 2 n 2 4 2 2 maidenhair 2 maiden 38 1 4 3 2 2 dln 4 3 2 maitre 2 maim 2 Maier 38 1 4 3 2 2 4 2 2 Mahoney 2 mahogany 38 1 4 3 2 yan 2 4 2 2 Mahayanist 2 Mahayana 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 Magnuson 2 magnum 38 1 4 3 2 2 4 2 2 magnify 2 magnificent 38 1 4 3 2 2 f 4 1 2 magnitude 38 1 4 3 2 2 4 2 2 magnetite 2 magnetic 38 1 4 3 2 2 i 4 3 2 magnetron 2 magneto 2 magnet 38 1 4 3 2 i 2 4 3 2 magnesium 2 magnesite 2 magnesia 38 1 4 3 2 2 st 4 0 38 1 4 3 2 2 n 4 2 2 magnate 2 magna 38 1 4 3 2 im 2 4 2 2 magnanimous 2 magnanimity 38 1 4 3 2 2 aeiu 4 1 2 magnolia 38 1 4 3 2 t 2 4 2 2 magistrate 2 magisterial 38 1 4 3 2 2 4 2 2 magician 2 magic 38 1 4 3 2 2 cs 4 1 2 magi 38 1 4 3 2 t 2 4 2 2 maggoty 2 maggot 38 1 4 3 2 2 o 4 1 2 Maggie 38 1 4 3 2 2 gin 4 7 2 Magruder 2 magpie 2 Magog 2 magma 2 magenta 2 Magdalene 2 magazine 38 1 4 3 2 2 4 3 2 maestro 2 Maelstrom 2 Mae 38 1 4 3 2 2 4 2 2 madstone 2 Madsen 38 1 4 3 2 2 4 2 2 madrigal 2 Madrid 38 1 4 3 2 2 i 4 1 2 Madras 38 1 4 3 2 2 4 2 2 madmen 2 madman 38 1 4 3 2 2 4 2 2 Madeline 2 Madeleine 38 1 4 3 2 2 l 4 2 2 Madeira 2 made 38 1 4 3 2 2 4 2 2 Maddox 2 madden 38 1 4 3 2 2 4 2 2 Madame 2 madam 38 1 4 3 2 2 m 4 1 2 Madagascar 38 1 4 3 2 2 ademrs 4 5 2 Madonna 2 Madison 2 madhouse 2 madcap 2 mad 38 1 4 3 2 2 4 2 2 macrostructure 2 macroscopic 38 1 4 3 2 olecul 2 4 2 2 macromolecule 2 macromolecular 38 1 4 3 2 o 2 ms 4 2 2 macrophage 2 macro 38 1 4 3 2 2 4 2 2 Mackinaw 2 Mackinac 38 1 4 3 2 n 2 a 4 1 2 mackintosh 38 1 4 3 2 2 4 3 2 Mackey 2 mackerel 2 MacKenzie 38 1 4 3 2 2 ei 4 1 2 mack 38 1 4 3 2 2 4 2 2 machinery 2 machine 38 1 4 3 2 2 e 4 1 2 machination 38 1 4 3 2 2 n 4 2 2 machismo 2 Machiavelli 38 1 4 3 2 2 i 4 2 2 macho 2 Mach 38 1 4 3 2 on 2 4 2 2 Macedonia 2 Macedon 38 1 4 3 2 2 d 4 1 2 mace 38 1 4 3 2 o 2 4 2 2 MacDougall 2 MacDonald 38 1 4 3 2 2 4 4 2 Macassar 2 MacArthur 2 macaque 2 macabre 38 1 4 3 2 2 aDehKr 4 6 2 Macon 2 MacMillan 2 macintosh 2 MacGregor 2 Macbeth 2 Mac 38 1 4 3 2 2 cdeghijklmnoprstuvwxyz 4 2 2 Mabel 2 ma 38 1 4 3 2 2 abceinoruys 4 5 2 Mt 2 m's 2 MPH 2 MD 2 m 38 1 4 3 2 2 4 2 2 lysergic 2 Lysenko 38 1 4 3 2 2 e 4 1 2 lysine 38 1 4 3 2 2 4 2 2 lyric 2 Lyra 38 1 4 3 2 h 2 4 2 2 Lynchburg 2 lynch 38 1 4 3 2 2 c 4 2 2 lynx 2 Lynn 38 1 4 3 2 2 4 2 2 lymphoma 2 lymphocyte 38 1 4 3 2 h 2 o 4 1 2 lymph 38 1 4 3 2 2 p 4 1 2 Lyman 38 1 4 3 2 2 mnrs 4 7 2 Lyon 2 Lyle 2 Lykes 2 lying 2 lye 2 Lydia 2 lycopodium 38 1 4 3 2 2 a 4 1 2 luxurious 38 1 4 3 2 2 4 2 2 luxuriate 2 luxuriant 38 1 4 3 2 r 2 i 4 1 2 luxury 38 1 4 3 2 2 4 2 2 Luxembourg 2 luxe 38 1 4 3 2 2 eu 4 1 2 lux 38 1 4 3 2 er 2 4 2 2 Lutheran 2 Luther 38 1 4 3 2 2 4 2 2 lutetium 2 lute 38 1 4 3 2 2 eh 4 2 2 Lutz 2 lutanist 38 1 4 3 2 2 4 4 2 lusty 2 lustrous 2 lustful 2 lust 38 1 4 3 2 2 t 4 3 2 lush 2 luscious 2 Lusaka 38 1 4 3 2 2 4 5 2 lurk 2 lurid 2 lure 2 lurch 2 Lura 38 1 4 3 2 2 4 2 2 lunge 2 lung 38 1 4 3 2 2 4 3 2 Lundquist 2 Lundberg 2 Lund 38 1 4 3 2 h 2 4 4 2 lunchtime 2 lunchroom 2 luncheon 2 lunch 38 1 4 3 2 2 rt 4 1 2 lunacy 38 1 4 3 2 2 4 2 2 lunatic 2 lunate 38 1 4 3 2 2 4 2 2 lunary 2 lunar 38 1 4 3 2 2 acdg 4 0 38 1 4 3 2 2 4 4 2 lumpy 2 Lumpur 2 lumpish 2 lump 38 1 4 3 2 2 4 2 2 luminous 2 luminosity 38 1 4 3 2 2 4 2 2 luminary 2 luminance 38 1 4 3 2 n 2 ao 4 1 2 luminescent 38 1 4 3 2 2 e 4 1 2 lumbar 38 1 4 3 2 2 4 2 2 lumbermen 2 lumberman 38 1 4 3 2 r 2 m 4 1 2 lumber 38 1 4 3 2 2 bip 4 2 2 lummox 2 lumen 38 1 4 3 2 2 4 2 2 lullaby 2 lull 38 1 4 3 2 2 l 4 1 2 lulu 38 1 4 3 2 e 2 4 3 2 lukewarm 2 lukemia 2 luke 38 1 4 3 2 2 4 2 2 lugging 2 luggage 38 1 4 3 2 2 4 2 2 luger 2 luge 38 1 4 3 2 2 eg 4 1 2 lug 38 1 4 3 2 t 2 4 2 2 Luftwaffe 2 Lufthansa 38 1 4 3 2 2 4 3 2 Ludwig 2 Ludlow 2 ludicrous 38 1 4 3 2 i 2 4 2 2 Lucretius 2 Lucretia 38 1 4 3 2 2 t 4 1 2 lucre 38 1 4 3 2 2 e 4 1 2 lucrative 38 1 4 3 2 2 4 2 2 lucky 2 luck 38 1 4 3 2 2 4 2 2 Lucian 2 Lucia 38 1 4 3 2 2 a 4 4 2 Lucius 2 Lucille 2 Lucifer 2 lucid 38 1 4 3 2 2 ikr 4 3 2 lucy 2 Lucerne 2 Lucas 38 1 4 3 2 2 r 4 2 2 Lubell 2 Lubbock 38 1 4 3 2 2 4 2 2 lubricity 2 lubricious 38 1 4 3 2 2 4 2 2 lubricate 2 lubricant 38 1 4 3 2 ic 2 ai 4 0 38 1 4 3 2 2 bcdfgklmnrstx 4 3 2 Luzon 2 lupine 2 Luis 38 1 4 3 2 2 4 3 2 L'vov 2 l's 2 l'oeil 38 1 4 3 2 l 2 4 2 2 loyalty 2 loyal 38 1 4 3 2 2 a 4 1 2 loy 38 1 4 3 2 2 4 3 2 lower 2 Lowell 2 Lowe 38 1 4 3 2 2 e 4 5 2 Lowry 2 lowland 2 lowdown 2 lowboy 2 low 38 1 4 3 2 2 4 2 2 Loveland 2 Lovelace 38 1 4 3 2 2 a 4 1 2 lovelorn 38 1 4 3 2 e 2 l 4 3 2 loves 2 lovebird 2 love 38 1 4 3 2 2 4 2 2 Louvre 2 louver 38 1 4 3 2 2 4 2 2 lousewort 2 louse 38 1 4 3 2 2 e 4 1 2 lousy 38 1 4 3 2 2 4 2 2 Lounsbury 2 lounge 38 1 4 3 2 s 2 4 5 2 Louisville 2 Louisiana 2 Louise 2 Louisa 2 Louis 38 1 4 3 2 peak 2 4 2 2 loudspeaking 2 loudspeaker 38 1 4 3 2 2 s 4 1 2 loud 38 1 4 3 2 2 dinsv 4 2 2 Lourdes 2 Lou 38 1 4 3 2 2 4 2 2 lottery 2 Lotte 38 1 4 3 2 2 e 4 1 2 Lottie 38 1 4 3 2 2 t 4 4 2 lots 2 lotus 2 lotion 2 lot 38 1 4 3 2 2 4 2 2 lossy 2 loss 38 1 4 3 2 2 s 4 3 2 lost 2 lose 2 losable 38 1 4 3 2 2 4 2 2 Lorenz 2 Loren 38 1 4 3 2 2 n 4 2 2 Lorelei 2 lore 38 1 4 3 2 2 4 2 2 lordosis 2 lord 38 1 4 3 2 2 de 4 2 2 Lorraine 2 Lorinda 38 1 4 3 2 i 2 4 2 2 loquacity 2 loquacious 38 1 4 3 2 ua 2 c 4 1 2 loquat 38 1 4 3 2 2 4 2 2 lopsided 2 lopseed 38 1 4 3 2 2 4 2 2 Lopez 2 lope 38 1 4 3 2 2 es 4 1 2 lop 38 1 4 3 2 e 2 4 4 2 loosestrife 2 loosen 2 looseleaf 2 loose 38 1 4 3 2 2 4 2 2 loophole 2 loop 38 1 4 3 2 2 4 2 2 Loomis 2 loom 38 1 4 3 2 2 4 6 2 looks 2 looking 2 looked 2 lookup 2 lookout 2 look 38 1 4 3 2 2 kmps 4 2 2 loot 2 loon 38 1 4 3 2 ud 2 4 2 2 longitudinal 2 longitude 38 1 4 3 2 2 t 4 1 2 longish 38 1 4 3 2 2 4 2 2 longhorn 2 longhand 38 1 4 3 2 2 hie 4 6 2 longue 2 longtime 2 longstanding 2 longleg 2 Longfellow 2 long 38 1 4 3 2 2 4 2 2 lonesome 2 lone 38 1 4 3 2 2 eg 4 1 2 London 38 1 4 3 2 2 a 4 1 2 Lomb 38 1 4 3 2 rd 2 4 2 2 Lombardy 2 Lombard 38 1 4 3 2 2 b 4 1 2 Lome 38 1 4 3 2 2 4 3 2 lolly 2 lollipop 2 loll 38 1 4 3 2 2 l 4 1 2 Lola 38 1 4 3 2 2 4 2 2 loincloth 2 loin 38 1 4 3 2 2 n 4 3 2 loiter 2 Lois 2 Loire 38 1 4 3 2 2 4 2 2 logician 2 logic 38 1 4 3 2 2 c 4 1 2 logistic 38 1 4 3 2 2 4 2 2 logging 2 loggerhead 38 1 4 3 2 ithm 2 4 2 2 logarithmic 2 logarithm 38 1 4 3 2 2 r 4 1 2 Logan 38 1 4 3 2 2 agi 4 4 2 logout 2 logjam 2 loge 2 log 38 1 4 3 2 t 2 4 2 2 lofty 2 loft 38 1 4 3 2 2 4 2 2 loess 2 Loeb 38 1 4 3 2 e 2 4 2 2 lodgepole 2 lodge 38 1 4 3 2 2 g 4 2 2 Lodowick 2 lodestone 38 1 4 3 2 2 4 2 2 locust 2 locus 38 1 4 3 2 2 s 4 1 2 locutor 38 1 4 3 2 ot 2 io 4 1 2 locomote 38 1 4 3 2 r 2 4 2 2 locomotory 2 locomotor 38 1 4 3 2 2 4 2 2 locomotive 2 locomotion 38 1 4 3 2 2 m 4 1 2 locoweed 38 1 4 3 2 2 4 2 2 Lockheed 2 Lockhart 38 1 4 3 2 2 h 4 8 2 Lockwood 2 lockup 2 locksmith 2 lockout 2 locknut 2 Lockian 2 Locke 2 lock 38 1 4 3 2 2 lt 4 0 38 1 4 3 2 2 4 2 2 locale 2 local 38 1 4 3 2 2 akou 4 1 2 loci 38 1 4 3 2 l 2 4 2 2 lobule 2 lobular 38 1 4 3 2 2 4 2 2 lobster 2 lobscouse 38 1 4 3 2 2 su 4 6 2 lobo 2 loblolly 2 lobe 2 lobby 2 lobar 2 lob 38 1 4 3 2 h 2 4 3 2 loathsome 2 loathe 2 loath 38 1 4 3 2 2 4 2 2 loamy 2 loam 38 1 4 3 2 2 mt 4 4 2 loaves 2 loan 2 loaf 2 load 38 1 4 3 2 2 abcdefgilmnopqrstuvwy 4 3 2 lozenge 2 Loki 2 lo 38 1 4 3 2 2 4 3 2 Lizzie 2 lizard 2 Liz 38 1 4 3 2 2 n 4 1 2 livid 38 1 4 3 2 2 r 4 4 2 liveth 2 livestock 2 liven 2 live 38 1 4 3 2 2 4 2 2 Liverpudlian 2 Liverpool 38 1 4 3 2 2 p 4 3 2 livery 2 liverwort 2 Livermore 38 1 4 3 2 2 ei 4 1 2 livre 38 1 4 3 2 rg 2 4 2 2 liturgy 2 liturgic 38 1 4 3 2 2 4 2 2 littoral 2 Litton 38 1 4 3 2 e 2 4 3 2 Littleton 2 littleneck 2 little 38 1 4 3 2 2 lo 4 1 2 litterbug 38 1 4 3 2 2 4 2 2 litigate 2 litigant 38 1 4 3 2 g 2 a 4 1 2 litigious 38 1 4 3 2 pher 2 4 2 2 lithospheric 2 lithosphere 38 1 4 3 2 raph 2 4 2 2 lithography 2 lithograph 38 1 4 3 2 2 gs 4 1 2 lithology 38 1 4 3 2 2 4 2 2 lithium 2 lithic 38 1 4 3 2 2 io 4 2 2 Lithuania 2 lithe 38 1 4 3 2 2 4 2 2 literature 2 literate 38 1 4 3 2 ra 2 t 4 3 2 literary 2 literal 2 literacy 38 1 4 3 2 2 ehitu 4 3 2 litmus 2 litany 2 lit 38 1 4 3 2 2 e 4 2 2 lists 2 list 38 1 4 3 2 2 t 4 6 2 Lissajous 2 lisp 2 lisle 2 Lise 2 Lisbon 2 Lisa 38 1 4 3 2 d 2 4 2 2 liquidate 2 liquid 38 1 4 3 2 2 f 4 1 2 liqueur 38 1 4 3 2 2 4 2 2 liquefy 2 liquefaction 38 1 4 3 2 u 2 ei 4 1 2 liquor 38 1 4 3 2 2 4 2 2 Lipscomb 2 Lipschitz 38 1 4 3 2 2 c 4 1 2 lipstick 38 1 4 3 2 2 s 4 4 2 Lipton 2 Lippincott 2 lipid 2 lip 38 1 4 3 2 2 4 2 2 lioness 2 Lionel 38 1 4 3 2 n 2 e 4 1 2 lion 38 1 4 3 2 2 4 2 2 Linotype 2 linoleum 38 1 4 3 2 2 4 2 2 linkage 2 link 38 1 4 3 2 2 4 2 2 lingual 2 lingua 38 1 4 3 2 2 a 4 1 2 linguist 38 1 4 3 2 r 2 4 2 2 lingerie 2 linger 38 1 4 3 2 2 eu 4 1 2 lingo 38 1 4 3 2 2 4 2 2 linemen 2 lineman 38 1 4 3 2 2 4 3 2 linear 2 lineal 2 lineage 38 1 4 3 2 2 am 4 6 2 lines 2 lineup 2 lineprinter 2 linen 2 linebacker 2 line 38 1 4 3 2 2 4 3 2 Lindstrom 2 Lindsey 2 Lindsay 38 1 4 3 2 erg 2 4 2 2 Lindbergh 2 Lindberg 38 1 4 3 2 2 bs 4 5 2 Lindquist 2 Lindholm 2 linden 2 Linda 2 Lind 38 1 4 3 2 2 degko 4 6 2 Linus 2 lint 2 linseed 2 liniment 2 Lincoln 2 Lin 38 1 4 3 2 2 4 4 2 limpkin 2 limpid 2 limpet 2 limp 38 1 4 3 2 t 2 4 5 2 limits 2 limiting 2 limited 2 limitate 2 limit 38 1 4 3 2 2 4 4 2 limestone 2 Limerick 2 limelight 2 lime 38 1 4 3 2 2 4 3 2 limbo 2 limbic 2 limb 38 1 4 3 2 2 beip 4 3 2 limousine 2 Lima 2 lim 38 1 4 3 2 2 4 2 2 Lilliputian 2 Lillian 38 1 4 3 2 2 i 4 1 2 Lilly 38 1 4 3 2 2 4 2 2 lilac 2 Lila 38 1 4 3 2 2 al 4 3 2 lily 2 lilt 2 Lilian 38 1 4 3 2 e 2 4 4 2 likely 2 likewise 2 liken 2 like 38 1 4 3 2 2 4 2 2 lignum 2 lignite 38 1 4 3 2 2 4 2 2 lighthouse 2 lighthearted 38 1 4 3 2 t 2 h 4 6 2 lightweight 2 lightproof 2 lightning 2 lightface 2 lighten 2 light 38 1 4 3 2 et 2 4 2 2 Liggett 2 Ligget 38 1 4 3 2 2 4 3 2 ligature 2 ligand 2 ligament 38 1 4 3 2 2 aghn 4 0 38 1 4 3 2 2 bs 4 4 2 lifetime 2 lifelong 2 lifeguard 2 life 38 1 4 3 2 2 4 2 2 lifestyle 2 lifespan 38 1 4 3 2 2 4 2 2 lifeboat 2 lifeblood 38 1 4 3 2 2 e 4 2 2 lift 2 LIFO 38 1 4 3 2 2 4 2 2 lieutenant 2 lieu 38 1 4 3 2 2 u 4 3 2 lien 2 Liechtenstein 2 lie 38 1 4 3 2 2 n 4 1 2 lice 38 1 4 3 2 2 4 3 2 licensor 2 licensee 2 licensable 38 1 4 3 2 2 s 4 1 2 licentious 38 1 4 3 2 2 e 4 3 2 licorice 2 lick 2 lichen 38 1 4 3 2 t 2 4 2 2 libretto 2 librettist 38 1 4 3 2 2 t 4 1 2 Libreville 38 1 4 3 2 2 r 4 1 2 librate 38 1 4 3 2 2 4 2 2 library 2 librarian 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 d 2 4 2 2 libido 2 libidinous 38 1 4 3 2 2 4 3 2 liberty 2 libertine 2 libertarian 38 1 4 3 2 2 4 2 2 liberate 2 liberal 38 1 4 3 2 2 at 4 1 2 Liberia 38 1 4 3 2 2 4 2 2 libelous 2 libel 38 1 4 3 2 2 lr 4 0 38 1 4 3 2 2 eir 4 2 2 Libya 2 libation 38 1 4 3 2 2 4 3 2 liar 2 liaison 2 liable 38 1 4 3 2 2 abcefgklmnopqstvz 4 1 2 lid 38 1 4 3 2 2 o 4 1 2 lexical 38 1 4 3 2 2 4 2 2 lexicon 2 lexicography 38 1 4 3 2 i 2 c 4 1 2 Lexington 38 1 4 3 2 2 4 3 2 lewis 2 lewd 2 lew 38 1 4 3 2 2 4 4 2 levity 2 Levitt 2 Leviticus 2 levitate 38 1 4 3 2 2 4 2 2 Levine 2 Levin 38 1 4 3 2 2 nt 4 2 2 Levis 2 Levi 38 1 4 3 2 2 4 2 2 leverage 2 lever 38 1 4 3 2 2 r 4 2 2 level 2 levee 38 1 4 3 2 2 ei 4 3 2 levy 2 levulose 2 Lev 38 1 4 3 2 2 4 2 2 leukemia 2 leucine 38 1 4 3 2 r 2 m 4 1 2 letterhead 38 1 4 3 2 2 4 2 2 lettermen 2 letterman 38 1 4 3 2 2 e 4 2 2 letting 2 lettuce 38 1 4 3 2 2 4 2 2 lethargy 2 lethal 38 1 4 3 2 2 a 4 1 2 Lethe 38 1 4 3 2 2 ht 4 3 2 lets 2 Letitia 2 let 38 1 4 3 2 2 4 2 2 Lester 2 lest 38 1 4 3 2 2 4 2 2 lessor 2 lesson 38 1 4 3 2 2 4 2 2 lessen 2 lessee 38 1 4 3 2 2 eo 4 1 2 less 38 1 4 3 2 2 st 4 4 2 Lesotho 2 Leslie 2 lesion 2 Lesbian 38 1 4 3 2 2 4 3 2 leprosy 2 lepidolite 2 leper 38 1 4 3 2 2 4 2 2 Leopold 2 leopard 38 1 4 3 2 2 4 2 2 leonine 2 Leonid 38 1 4 3 2 d 2 4 2 2 Leonardo 2 Leonard 38 1 4 3 2 2 r 4 1 2 Leona 38 1 4 3 2 2 ai 4 2 2 Leone 2 Leon 38 1 4 3 2 2 np 4 1 2 Leo 38 1 4 3 2 2 4 2 2 lentil 2 lenticular 38 1 4 3 2 2 i 4 2 2 Lenten 2 lent 38 1 4 3 2 2 4 2 2 Lenny 2 Lennox 38 1 4 3 2 2 4 2 2 Leningrad 2 Lenin 38 1 4 3 2 2 n 4 1 2 lenient 38 1 4 3 2 th 2 4 4 2 lengthy 2 lengthwise 2 lengthen 2 length 38 1 4 3 2 2 gint 4 5 2 lens 2 Lenore 2 lend 2 Lena 2 Len 38 1 4 3 2 n 2 4 2 2 lemonade 2 lemon 38 1 4 3 2 2 4 2 2 lemming 2 lemma 38 1 4 3 2 2 mo 4 1 2 Lemuel 38 1 4 3 2 moti 2 4 2 2 leitmotiv 2 leitmotif 38 1 4 3 2 h 2 4 2 2 Leighton 2 Leigh 38 1 4 3 2 2 gt 4 2 2 leisure 2 Leila 38 1 4 3 2 2 4 2 2 Lehman 2 Lehigh 38 1 4 3 2 m 2 4 2 2 leguminous 2 legume 38 1 4 3 2 ima 2 4 2 2 legitimate 2 legitimacy 38 1 4 3 2 lat 2 4 2 2 legislature 2 legislate 38 1 4 3 2 2 st 4 2 2 legion 2 legible 38 1 4 3 2 2 4 2 2 leggy 2 legging 38 1 4 3 2 d 2 4 3 2 Legendre 2 legendary 2 legend 38 1 4 3 2 2 n 4 1 2 legerdemain 38 1 4 3 2 2 4 2 2 legatee 2 legate 38 1 4 3 2 2 e 4 1 2 legato 38 1 4 3 2 2 t 4 2 2 legal 2 legacy 38 1 4 3 2 2 aegiu 4 2 2 leghorn 2 leg 38 1 4 3 2 t 2 4 5 2 lefty 2 leftward 2 leftover 2 leftmost 2 left 38 1 4 3 2 a 2 4 2 2 leeway 2 leeward 38 1 4 3 2 2 4 2 2 leery 2 leer 38 1 4 3 2 2 rw 4 5 2 Leeuwenhoek 2 leek 2 Leeds 2 leech 2 lee 38 1 4 3 2 2 4 2 2 ledge 2 led 38 1 4 3 2 2 4 2 2 lecture 2 lectionary 38 1 4 3 2 er 2 4 2 2 lechery 2 lecher 38 1 4 3 2 2 ht 4 0 38 1 4 3 2 2 4 2 2 Lebesgue 2 lebensraum 38 1 4 3 2 n 2 4 2 2 Lebanon 2 Lebanese 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 cdfknprstv 4 2 2 league 2 lea 38 1 4 3 2 2 4 2 2 Leavenworth 2 leaven 38 1 4 3 2 e 2 n 4 2 2 leaves 2 leave 38 1 4 3 2 her 2 4 5 2 leathery 2 leatherwork 2 leatherneck 2 leatherback 2 leather 38 1 4 3 2 2 4 2 2 leasehold 2 lease 38 1 4 3 2 2 e 4 2 2 least 2 leash 38 1 4 3 2 2 4 2 2 learn 2 Lear 38 1 4 3 2 2 4 3 2 leapt 2 leapfrog 2 leap 38 1 4 3 2 2 4 2 2 Leander 2 lean 38 1 4 3 2 2 4 3 2 leaky 2 leakage 2 leak 38 1 4 3 2 2 4 3 2 leafy 2 leaflet 2 leaf 38 1 4 3 2 2 m 4 1 2 leads 38 1 4 3 2 2 r 4 2 2 leadeth 2 leaden 38 1 4 3 2 2 es 4 2 2 leading 2 lead 38 1 4 3 2 h 2 4 2 2 leachate 2 leach 38 1 4 3 2 2 abcdefghimnopstuvwx 4 3 2 Leyden 2 Leroy 2 Leland 38 1 4 3 2 2 4 2 2 lazybones 2 lazy 38 1 4 3 2 2 y 4 2 2 laze 2 Lazarus 38 1 4 3 2 2 4 2 2 layout 2 layoff 38 1 4 3 2 2 4 2 2 laymen 2 layman 38 1 4 3 2 2 mo 4 4 2 layup 2 Layton 2 layette 2 lay 38 1 4 3 2 2 4 2 2 laxative 2 lax 38 1 4 3 2 2 4 2 2 lawsuit 2 Lawson 38 1 4 3 2 enc 2 4 2 2 lawrencium 2 Lawrence 38 1 4 3 2 2 4 2 2 lawman 2 lawmake 38 1 4 3 2 2 a 4 1 2 lawmen 38 1 4 3 2 iv 2 4 2 2 lawgiving 2 lawgiver 38 1 4 3 2 reak 2 4 2 2 lawbreaking 2 lawbreaker 38 1 4 3 2 2 bgmrs 4 4 2 lawyer 2 lawn 2 lawful 2 law 38 1 4 3 2 2 4 3 2 lavatory 2 lavabo 2 lava 38 1 4 3 2 2 a 4 3 2 Lavoisier 2 lavish 2 lavender 38 1 4 3 2 2 4 2 2 Laurentian 2 Laurent 38 1 4 3 2 2 t 4 1 2 Lauren 38 1 4 3 2 2 n 4 2 2 laurel 2 laureate 38 1 4 3 2 2 e 4 2 2 Laurie 2 laura 38 1 4 3 2 2 4 2 2 laundry 2 launder 38 1 4 3 2 2 d 4 1 2 launch 38 1 4 3 2 h 2 4 4 2 laughter 2 Laughlin 2 laughingstock 2 laugh 38 1 4 3 2 2 a 4 2 2 Lauderdale 2 laud 38 1 4 3 2 2 4 2 2 laudatory 2 laudanum 38 1 4 3 2 2 dgnr 4 2 2 Lausanne 2 Laue 38 1 4 3 2 2 4 2 2 lattice 2 latter 38 1 4 3 2 na 2 4 2 2 latitudinary 2 latitudinal 38 1 4 3 2 ud 2 i 4 1 2 latitude 38 1 4 3 2 2 4 2 2 Latinate 2 Latin 38 1 4 3 2 2 nt 4 0 38 1 4 3 2 2 4 3 2 Lathrop 2 lathe 2 lath 38 1 4 3 2 2 4 3 2 Lateran 2 lateral 2 latera 38 1 4 3 2 2 a 4 2 2 laterite 2 later 38 1 4 3 2 2 r 4 4 2 latest 2 latex 2 latent 2 late 38 1 4 3 2 2 ehit 4 4 2 Latvia 2 latus 2 Latrobe 2 latch 38 1 4 3 2 2 4 2 2 lasso 2 lass 38 1 4 3 2 2 4 2 2 lascivious 2 lascar 38 1 4 3 2 2 cs 4 4 2 Laszlo 2 last 2 lash 2 lase 38 1 4 3 2 e 2 4 2 2 larynges 2 laryngeal 38 1 4 3 2 n 2 g 4 1 2 larynx 38 1 4 3 2 a 2 4 3 2 larval 2 larvae 2 larva 38 1 4 3 2 2 4 3 2 Larson 2 Larsen 2 Lars 38 1 4 3 2 2 4 3 2 larkspur 2 Larkin 2 lark 38 1 4 3 2 e 2 s 4 3 2 larger 2 largemouth 2 large 38 1 4 3 2 2 4 2 2 Lares 2 Laredo 38 1 4 3 2 2 4 2 2 larch 2 larceny 38 1 4 3 2 2 cegksvy 4 4 2 Larry 2 lariat 2 lard 2 Laramie 38 1 4 3 2 l 2 4 2 2 lapelled 2 lapel 38 1 4 3 2 2 e 4 5 2 lapse 2 lappet 2 Laplace 2 lapidary 2 lap 38 1 4 3 2 2 4 4 2 Laotian 2 Laos 2 Laocoon 2 Lao 38 1 4 3 2 an 2 4 2 2 lanthanum 2 lanthanide 38 1 4 3 2 2 h 4 1 2 lantern 38 1 4 3 2 2 4 2 2 lanky 2 Lanka 38 1 4 3 2 2 4 2 2 languish 2 languid 38 1 4 3 2 2 i 4 1 2 language 38 1 4 3 2 2 u 4 4 2 Langmuir 2 Langley 2 Lange 2 Lang 38 1 4 3 2 2 4 2 2 landslide 2 landscape 38 1 4 3 2 2 s 4 8 2 landowner 2 landmark 2 landlord 2 Landis 2 landhold 2 landfill 2 landau 2 land 38 1 4 3 2 s 2 4 2 2 Lancaster 2 Lancashire 38 1 4 3 2 2 a 4 1 2 lance 38 1 4 3 2 2 cdgkt 4 3 2 Lansing 2 lane 2 Lana 38 1 4 3 2 2 4 5 2 lamprey 2 lampoon 2 lamplight 2 lampblack 2 lamp 38 1 4 3 2 na 2 4 2 2 laminate 2 laminar 38 1 4 3 2 t 2 4 2 2 lamentation 2 lament 38 1 4 3 2 2 n 4 2 2 lamellar 2 lame 38 1 4 3 2 2 d 4 2 2 lambert 2 lamb 38 1 4 3 2 r 2 4 2 2 Lamarck 2 Lamar 38 1 4 3 2 2 abeip 4 1 2 lam 38 1 4 3 2 e 2 4 3 2 lakeside 2 Lakehurst 2 lake 38 1 4 3 2 2 4 2 2 Laidlaw 2 laid 38 1 4 3 2 2 d 4 4 2 laity 2 laissez 2 lair 2 lain 38 1 4 3 2 ang 2 4 2 2 Lagrangian 2 Lagrange 38 1 4 3 2 2 4 2 2 Lagos 2 lagoon 38 1 4 3 2 2 or 4 4 2 Laguerre 2 lagging 2 lager 2 lag 38 1 4 3 2 2 4 2 2 ladyfern 2 lady 38 1 4 3 2 2 y 4 3 2 ladle 2 laden 2 lad 38 1 4 3 2 a 2 4 2 2 lacunae 2 lacuna 38 1 4 3 2 2 n 4 1 2 lacustrine 38 1 4 3 2 2 4 2 2 lactose 2 lactate 38 1 4 3 2 2 4 3 2 lackey 2 lackadaisic 2 lack 38 1 4 3 2 2 4 2 2 Lacerta 2 lacerate 38 1 4 3 2 2 r 4 2 2 lacewing 2 lace 38 1 4 3 2 2 ektu 4 6 2 lacy 2 lacrosse 2 lacquer 2 laconic 2 Lachesis 2 lac 38 1 4 3 2 ador 2 4 2 2 labradorite 2 Labrador 38 1 4 3 2 2 4 3 2 laborious 2 laboratory 2 labor 38 1 4 3 2 2 r 4 1 2 labour 38 1 4 3 2 2 4 2 2 lability 2 labile 38 1 4 3 2 2 4 2 2 labial 2 labia 38 1 4 3 2 2 al 4 0 38 1 4 3 2 2 ior 4 4 2 labyrinth 2 label 2 Laban 2 lab 38 1 4 3 2 2 bcdgikmnoprstuvwxyz 4 3 2 Lahore 2 Lafayette 2 la 38 1 4 3 2 2 aeio'uy 4 5 2 LCD 2 LTV 2 LSI 2 Lloyd 2 l 38 1 4 3 2 2 4 3 2 Kyoto 2 Kyle 2 KY 38 1 4 3 2 2 4 2 2 Kurt 2 Kurd 38 1 4 3 2 2 4 2 2 kudzu 2 kudo 38 1 4 3 2 2 dr 4 5 2 Kuwait 2 kumquat 2 kulak 2 Kuhn 2 Ku 38 1 4 3 2 2 4 3 2 Kruse 2 Kruger 2 Krueger 38 1 4 3 2 2 4 2 2 Kristin 2 Krishna 38 1 4 3 2 2 s 4 1 2 Krieger 38 1 4 3 2 2 4 3 2 Kresge 2 Kremlin 2 Krebs 38 1 4 3 2 2 ku 4 2 2 Kramer 2 kraft 38 1 4 3 2 2 4 2 2 kraut 2 Krause 38 1 4 3 2 2 4 2 2 Krakow 2 Krakatoa 38 1 4 3 2 2 aeiu 4 2 2 krypton 2 Kronecker 38 1 4 3 2 l 2 4 2 2 Kowalski 2 Kowalewski 38 1 4 3 2 2 a 4 1 2 Kowloon 38 1 4 3 2 2 4 2 2 Korea 2 Koran 38 1 4 3 2 2 4 2 2 Konrad 2 Kong 38 1 4 3 2 2 4 2 2 kolkhoz 2 kola 38 1 4 3 2 nig 2 4 2 2 Koenigsberg 2 Koenig 38 1 4 3 2 2 4 2 2 kodak 2 Kodachrome 38 1 4 3 2 2 a 4 1 2 Kodiak 38 1 4 3 2 h 2 4 2 2 Kochab 2 Koch 38 1 4 3 2 2 cdelnrw 4 8 2 Kovacs 2 kosher 2 Koppers 2 kombu 2 koinonia 2 kohlrabi 2 Kobayashi 2 koala 38 1 4 3 2 s 2 4 2 2 Knutson 2 Knutsen 38 1 4 3 2 s 2 4 2 2 Knudson 2 Knudsen 38 1 4 3 2 kle 2 4 2 2 knuckleball 2 knuckle 38 1 4 3 2 2 cdt 4 1 2 knurl 38 1 4 3 2 2 4 2 2 Knoxville 2 Knox 38 1 4 3 2 2 d 4 1 2 Knowles 38 1 4 3 2 ge 2 4 2 2 knowledgeable 2 knowledge 38 1 4 3 2 2 e 4 1 2 Knowlton 38 1 4 3 2 2 l 4 5 2 knows 2 known 2 knowhow 2 knoweth 2 know 38 1 4 3 2 2 4 2 2 knotty 2 Knott 38 1 4 3 2 2 t 4 1 2 knot 38 1 4 3 2 k 2 4 3 2 knockout 2 knockdown 2 knock 38 1 4 3 2 2 4 2 2 knobby 2 knob 38 1 4 3 2 2 bctwx 4 1 2 knoll 38 1 4 3 2 ht 2 4 2 2 Knightsbridge 2 knight 38 1 4 3 2 k 2 4 2 2 Knickerbocker 2 knick 38 1 4 3 2 2 cg 4 3 2 knives 2 knit 2 knife 38 1 4 3 2 2 4 3 2 kneel 2 kneecap 2 knee 38 1 4 3 2 2 e 4 3 2 knew 2 knelt 2 knead 38 1 4 3 2 2 p 4 2 2 Knauer 2 knack 38 1 4 3 2 2 4 2 2 knapsack 2 Knapp 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 Klein 2 kleenex 38 1 4 3 2 2 4 3 2 klaxon 2 Klaus 2 Klan 38 1 4 3 2 2 ae 4 3 2 klystron 2 Klux 2 Kline 38 1 4 3 2 2 4 2 2 kiwi 2 Kiwanis 38 1 4 3 2 2 4 2 2 kivu 2 kiva 38 1 4 3 2 n 2 4 2 2 kittenish 2 kitten 38 1 4 3 2 2 e 4 2 2 kitty 2 kittle 38 1 4 3 2 hen 2 4 2 2 kitchenette 2 kitchen 38 1 4 3 2 2 ct 4 3 2 kite 2 Kitakyushu 2 kit 38 1 4 3 2 2 4 3 2 Kirkpatrick 2 Kirkland 2 kirk 38 1 4 3 2 h 2 4 2 2 Kirchoff 2 Kirchner 38 1 4 3 2 2 ck 4 2 2 Kirov 2 Kirby 38 1 4 3 2 2 4 2 2 Kiowa 2 kiosk 38 1 4 3 2 2 4 2 2 kinky 2 kink 38 1 4 3 2 2 4 3 2 Kingston 2 Kingsley 2 Kingsbury 38 1 4 3 2 2 s 4 6 2 kingpin 2 kinglet 2 kingfisher 2 kingdom 2 kingbird 2 king 38 1 4 3 2 2 4 2 2 kinesthesis 2 kinesic 38 1 4 3 2 2 s 4 2 2 kinetic 2 kinematic 38 1 4 3 2 2 4 4 2 kindred 2 kindle 2 kindergarten 2 kind 38 1 4 3 2 2 degk 4 3 2 Kinshasha 2 Kinney 2 kin 38 1 4 3 2 2 4 2 2 Kimberly 2 Kimball 38 1 4 3 2 2 b 4 2 2 kimono 2 Kim 38 1 4 3 2 2 4 3 2 killjoy 2 killdeer 2 kill 38 1 4 3 2 2 l 4 2 2 kilohm 2 Kilgore 38 1 4 3 2 2 4 3 2 Kiewit 2 Kiev 2 Kieffer 38 1 4 3 2 p 2 p 4 1 2 kidnap 38 1 4 3 2 2 4 2 2 kidnapping 2 kidnapped 38 1 4 3 2 2 a 4 1 2 kidney 38 1 4 3 2 2 4 2 2 kiddie 2 Kidde 38 1 4 3 2 2 dn 4 1 2 kid 38 1 4 3 2 k 2 4 3 2 kickoff 2 kickback 2 kick 38 1 4 3 2 2 4 2 2 kibitz 2 kibbutzim 38 1 4 3 2 2 bcdelmnortvw 4 4 2 kiss 2 Kipling 2 Kikuyu 2 Kigali 38 1 4 3 2 2 4 3 2 Khartoum 2 khan 2 khaki 38 1 4 3 2 2 a 4 2 2 Khrushchev 2 Khmer 38 1 4 3 2 s 2 4 2 2 Keynesian 2 Keynes 38 1 4 3 2 2 e 4 1 2 keynote 38 1 4 3 2 2 nswb 4 4 2 keypunch 2 keyhole 2 Keyes 2 key 38 1 4 3 2 2 4 2 2 kettle 2 Kettering 38 1 4 3 2 2 4 2 2 ketosis 2 ketone 38 1 4 3 2 h 2 4 2 2 ketchup 2 ketch 38 1 4 3 2 2 cot 4 0 38 1 4 3 2 2 4 2 2 kestrel 2 Kessler 38 1 4 3 2 2 4 2 2 kerry 2 Kerr 38 1 4 3 2 2 4 3 2 Kernighan 2 kernel 2 kern 38 1 4 3 2 2 nr 4 4 2 kerygma 2 kerosene 2 Kermit 2 kerchief 38 1 4 3 2 2 4 2 2 kept 2 Kepler 38 1 4 3 2 2 4 2 2 Kenyon 2 Kenya 38 1 4 3 2 2 4 3 2 Kentucky 2 Kenton 2 Kent 38 1 4 3 2 2 4 5 2 Kenney 2 Kenneth 2 kennel 2 Kennedy 2 Kennecott 38 1 4 3 2 2 e 4 1 2 Kennan 38 1 4 3 2 2 nty 4 4 2 Kensington 2 keno 2 Kendall 2 ken 38 1 4 3 2 2 e 4 2 2 kelly 2 Kellogg 38 1 4 3 2 2 4 2 2 Kelley 2 Keller 38 1 4 3 2 2 l 4 3 2 Kelvin 2 Kelsey 2 kelp 38 1 4 3 2 2 4 2 2 Keenan 2 keen 38 1 4 3 2 2 4 2 2 keelson 2 keel 38 1 4 3 2 2 lnp 4 1 2 keeshond 38 1 4 3 2 t 2 4 2 2 Keats 2 Keaton 38 1 4 3 2 2 aelnprsty 4 5 2 Kevin 2 Kemp 2 Keith 2 keg 2 keddah 38 1 4 3 2 2 4 2 2 kayo 2 Kay 38 1 4 3 2 f 2 4 2 2 Kaufman 2 Kauffman 38 1 4 3 2 2 4 4 2 Kathy 2 Kathleen 2 Katherine 2 Katharine 38 1 4 3 2 2 h 4 5 2 Katz 2 Katowice 2 Katmandu 2 Katie 2 Kate 38 1 4 3 2 2 4 3 2 karate 2 Karamazov 2 Karachi 38 1 4 3 2 2 a 4 6 2 karyatid 2 Karp 2 Karol 2 karma 2 Karl 2 Karen 38 1 4 3 2 2 4 3 2 kappa 2 kapok 2 Kaplan 38 1 4 3 2 lin 2 4 2 2 kaolinite 2 kaolin 38 1 4 3 2 2 4 5 2 Kant 2 Kansas 2 Kankakee 2 kangaroo 2 Kane 38 1 4 3 2 2 4 3 2 Kampala 2 kamikaze 2 Kamchatka 38 1 4 3 2 2 4 2 2 Kalmuk 2 kalmia 38 1 4 3 2 d 2 4 2 2 kaleidoscope 2 kaleidescope 38 1 4 3 2 2 i 4 1 2 kale 38 1 4 3 2 2 em 4 1 2 Kalamazoo 38 1 4 3 2 ka 2 4 2 2 Kafkaesque 2 Kafka 38 1 4 3 2 u 2 4 2 2 Kabul 2 Kabuki 38 1 4 3 2 2 bflmnoprtuy 4 7 2 kazoo 2 kava 2 Kaskaskia 2 Kajar 2 kaiser 2 Kahn 2 Kaddish 38 1 4 3 2 2 aehilnoruy 4 4 2 kwashiorkor 2 KS 2 k's 2 k 38 1 4 3 2 tapos 2 4 2 2 juxtaposition 2 juxtapose 38 1 4 3 2 2 4 3 2 Jutish 2 jute 2 jut 38 1 4 3 2 2 4 2 2 Justinian 2 Justine 38 1 4 3 2 2 4 2 2 justiciable 2 justice 38 1 4 3 2 2 cn 4 1 2 justify 38 1 4 3 2 t 2 i 4 1 2 just 38 1 4 3 2 rudent 2 4 2 2 jurisprudential 2 jurisprudent 38 1 4 3 2 2 p 4 1 2 jurisdiction 38 1 4 3 2 2 s 4 1 2 juridic 38 1 4 3 2 2 4 2 2 Jurassic 2 Jura 38 1 4 3 2 2 ai 4 3 2 jury 2 juror 2 jure 38 1 4 3 2 2 4 2 2 junketeer 2 junkerdom 38 1 4 3 2 2 e 4 2 2 junky 2 junk 38 1 4 3 2 2 4 2 2 juniper 2 junior 38 1 4 3 2 2 4 2 2 Juneau 2 June 38 1 4 3 2 2 t 4 1 2 junco 38 1 4 3 2 2 4 3 2 juncture 2 junctor 2 junction 38 1 4 3 2 2 ceik 4 3 2 junta 2 Juno 2 jungle 38 1 4 3 2 2 4 2 2 jumpy 2 jump 38 1 4 3 2 2 4 2 2 jumbo 2 jumble 38 1 4 3 2 2 bp 4 0 38 1 4 3 2 2 4 2 2 Juliet 2 Julie 38 1 4 3 2 2 e 4 3 2 Julius 2 Julio 2 Julia 38 1 4 3 2 2 4 2 2 Jules 2 julep 38 1 4 3 2 2 ei 4 1 2 July 38 1 4 3 2 e 2 4 2 2 Jukes 2 juke 38 1 4 3 2 u 2 4 2 2 jujube 2 juju 38 1 4 3 2 c 2 4 2 2 juicy 2 juice 38 1 4 3 2 2 4 2 2 juggle 2 jugging 38 1 4 3 2 2 g 4 3 2 Jugoslavia 2 jugate 2 jug 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 2 4 2 2 judiciary 2 judicial 38 1 4 3 2 2 a 4 1 2 judicious 38 1 4 3 2 2 t 4 1 2 judicable 38 1 4 3 2 2 4 2 2 judicature 2 judicatory 38 1 4 3 2 2 c 4 1 2 Judith 38 1 4 3 2 2 4 2 2 Judas 2 Judaism 38 1 4 3 2 2 ai 4 6 2 Judy 2 Judson 2 judo 2 judge 2 Jude 2 Judd 38 1 4 3 2 ila 2 4 2 2 jubilate 2 jubilant 38 1 4 3 2 n 2 4 2 2 Juanita 2 Juan 38 1 4 3 2 2 abdgijklmnrstx 4 2 2 juvenile 2 Jupiter 38 1 4 3 2 2 4 6 2 joystick 2 joyride 2 joyous 2 joyful 2 Joyce 2 joy 38 1 4 3 2 l 2 4 2 2 jowly 2 jowl 38 1 4 3 2 a 2 4 2 2 Jovian 2 jovial 38 1 4 3 2 2 i 4 2 2 Jove 2 Jovanovich 38 1 4 3 2 2 4 2 2 journeymen 2 journeyman 38 1 4 3 2 y 2 m 4 1 2 journey 38 1 4 3 2 l 2 4 2 2 journalese 2 journal 38 1 4 3 2 n 2 ae 4 0 38 1 4 3 2 2 r 4 3 2 joust 2 jounce 2 joule 38 1 4 3 2 2 p 4 2 2 Josef 2 Jose 38 1 4 3 2 h 2 4 4 2 Josephus 2 Josephson 2 Josephine 2 Joseph 38 1 4 3 2 2 e 4 4 2 jostle 2 joss 2 Josiah 2 Joshua 38 1 4 3 2 s 2 4 2 2 Jorgenson 2 Jorgensen 38 1 4 3 2 e 2 n 4 1 2 Jorge 38 1 4 3 2 2 g 4 1 2 Jordan 38 1 4 3 2 2 4 2 2 Jonathan 2 Jonas 38 1 4 3 2 2 a 4 3 2 jonquil 2 Jones 2 Jon 38 1 4 3 2 2 4 2 2 jolly 2 Jolla 38 1 4 3 2 2 l 4 2 2 jolt 2 Joliet 38 1 4 3 2 n 2 4 2 2 joint 2 join 38 1 4 3 2 o 2 4 2 2 Johnstown 2 Johnston 38 1 4 3 2 2 t 4 2 2 Johnson 2 Johnsen 38 1 4 3 2 2 s 4 2 2 Johnny 2 John 38 1 4 3 2 n 2 ns 4 0 38 1 4 3 2 2 4 2 2 Johanson 2 Johansen 38 1 4 3 2 2 e 4 1 2 Johann 38 1 4 3 2 s 2 4 2 2 Johannesburg 2 Johannes 38 1 4 3 2 2 an 4 0 38 1 4 3 2 2 4 2 2 joggle 2 jogging 38 1 4 3 2 2 g 4 1 2 jog 38 1 4 3 2 2 4 3 2 joey 2 Joel 2 Joe 38 1 4 3 2 2 4 2 2 jocund 2 jocular 38 1 4 3 2 2 4 3 2 jockstrap 2 jockey 2 jock 38 1 4 3 2 2 ku 4 1 2 jocose 38 1 4 3 2 2 4 3 2 jobs 2 jobholder 2 job 38 1 4 3 2 2 n 4 1 2 Joan 38 1 4 3 2 2 4 2 2 Joanne 2 Joanna 38 1 4 3 2 2 n 4 1 2 Joaquin 38 1 4 3 2 2 abceghilnrsuvwy 4 3 2 jot 2 joke 2 Jo 38 1 4 3 2 ter 2 4 3 2 jittery 2 jitterbug 2 jitter 38 1 4 3 2 2 4 2 2 jinx 2 jingle 38 1 4 3 2 2 4 2 2 jimmy 2 Jimmie 38 1 4 3 2 2 m 4 2 2 Jimenez 2 Jim 38 1 4 3 2 2 4 2 2 jilt 2 Jill 38 1 4 3 2 2 4 2 2 jiggle 2 jigging 38 1 4 3 2 2 g 4 2 2 jigsaw 2 jig 38 1 4 3 2 2 glmnt 4 3 2 jive 2 jiffy 2 jibe 38 1 4 3 2 2 4 3 2 jewelry 2 Jewell 2 jewel 38 1 4 3 2 2 l 4 1 2 Jewett 38 1 4 3 2 2 e 4 2 2 Jewish 2 Jew 38 1 4 3 2 2 4 3 2 jettison 2 jetliner 2 jet 38 1 4 3 2 2 4 2 2 Jesus 2 Jesuit 38 1 4 3 2 2 i 4 2 2 Jesse 2 jess 38 1 4 3 2 2 4 2 2 Jessie 2 Jessica 38 1 4 3 2 2 su 4 1 2 jest 38 1 4 3 2 2 4 2 2 Jerome 2 Jeroboam 38 1 4 3 2 2 4 2 2 jerky 2 jerk 38 1 4 3 2 2 m 4 1 2 Jeres 38 1 4 3 2 2 4 2 2 Jeremy 2 Jeremiah 38 1 4 3 2 2 eko 4 4 2 Jerusalem 2 jersey 2 jerry 2 Jericho 38 1 4 3 2 pard 2 4 2 2 jeopardy 2 jeopard 38 1 4 3 2 2 4 3 2 Jennings 2 Jennifer 2 Jennie 38 1 4 3 2 2 i 4 1 2 jenny 38 1 4 3 2 2 n 4 2 2 Jensen 2 Jenkins 38 1 4 3 2 ly 2 4 2 2 jellyfish 2 jelly 38 1 4 3 2 un 2 4 2 2 jejunum 2 jejune 38 1 4 3 2 f 2 4 3 2 Jeffrey 2 Jefferson 2 Jeff 38 1 4 3 2 2 ln 4 0 38 1 4 3 2 2 4 2 2 Jeannie 2 jean 38 1 4 3 2 ous 2 4 2 2 jealousy 2 jealous 38 1 4 3 2 2 afjlnorstw 4 3 2 Jehovah 2 jeep 2 Jed 38 1 4 3 2 z 2 4 2 2 jazzy 2 jazz 38 1 4 3 2 2 4 2 2 jawbone 2 jaw 38 1 4 3 2 2 4 2 2 javelin 2 Java 38 1 4 3 2 n 2 4 2 2 jaunty 2 jaundice 38 1 4 3 2 2 4 2 2 jasper 2 Jason 38 1 4 3 2 2 4 3 2 Jarvin 2 jargon 2 jar 38 1 4 3 2 an 2 4 2 2 Japanese 2 Japan 38 1 4 3 2 2 4 2 2 Janus 2 January 38 1 4 3 2 or 2 4 2 2 janitorial 2 janitor 38 1 4 3 2 2 t 4 2 2 janissary 2 Janice 38 1 4 3 2 2 4 3 2 Janet 2 Janeiro 2 Jane 38 1 4 3 2 2 eiu 4 4 2 Jansenist 2 Janos 2 jangle 2 Jan 38 1 4 3 2 s 2 4 2 2 Jamestown 2 James 38 1 4 3 2 2 e 4 3 2 jamboree 2 Jamaica 2 jam 38 1 4 3 2 2 4 2 2 jake 2 Jakarta 38 1 4 3 2 2 4 2 2 Jaime 2 jail 38 1 4 3 2 2 4 3 2 jaguar 2 jagging 2 jag 38 1 4 3 2 ue 2 4 2 2 Jacques 2 Jacqueline 38 1 4 3 2 2 4 2 2 Jacobson 2 Jacobsen 38 1 4 3 2 2 4 3 2 Jacobite 2 Jacobian 2 Jacobi 38 1 4 3 2 b 2 is 4 3 2 Jacobus 2 Jacobean 2 Jacob 38 1 4 3 2 2 as 4 9 2 Jacky 2 jackpot 2 Jackman 2 jackknife 2 Jackie 2 jacket 2 jackdaw 2 jackboot 2 jack 38 1 4 3 2 on 2 4 2 2 Jacksonville 2 Jackson 38 1 4 3 2 2 4 2 2 jackass 2 jackanapes 38 1 4 3 2 2 koq 4 1 2 JACM 38 1 4 3 2 2 4 2 2 Jablonsky 2 jab 38 1 4 3 2 2 bcgikmnprsuvwz 4 4 2 jay 2 jalopy 2 Jaeger 2 jade 38 1 4 3 2 2 aeiou 4 3 2 j's 2 Jr 2 j 38 1 4 3 2 n 2 4 2 2 Ivanhoe 2 Ivan 38 1 4 3 2 2 a 4 4 2 ivy 2 ivory 2 Iverson 2 iv 38 1 4 3 2 2 4 3 2 it's 2 it'll 2 it'd 38 1 4 3 2 nera 2 4 2 2 itinerary 2 itinerant 38 1 4 3 2 2 4 2 2 iterate 2 item 38 1 4 3 2 2 4 2 2 italic 2 Italian 38 1 4 3 2 l 2 i 4 1 2 Italy 38 1 4 3 2 2 aei's 4 6 2 ITT 2 IT&T 2 Ito 2 Ithaca 2 itch 2 it 38 1 4 3 2 2 4 2 2 Istvan 2 Istanbul 38 1 4 3 2 u 2 e 4 1 2 issuant 38 1 4 3 2 2 4 2 2 Israelite 2 Israeli 38 1 4 3 2 ael 2 i 4 1 2 Israel 38 1 4 3 2 2 4 3 2 isotropy 2 isotope 2 isotherm 38 1 4 3 2 rph 2 4 2 2 isomorphic 2 isomorph 38 1 4 3 2 2 o 4 1 2 isomer 38 1 4 3 2 2 4 2 2 Isolde 2 isolate 38 1 4 3 2 2 h 4 1 2 isocline 38 1 4 3 2 ron 2 4 2 2 isochronous 2 isochronal 38 1 4 3 2 2 clmt 4 1 2 isopleth 38 1 4 3 2 2 m 4 1 2 island 38 1 4 3 2 2 4 3 2 Islamic 2 Islamabad 2 Islam 38 1 4 3 2 2 a 4 1 2 isle 38 1 4 3 2 g 2 4 2 2 isinglass 2 Ising 38 1 4 3 2 2 n 4 1 2 Isis 38 1 4 3 2 el 2 4 2 2 Isabella 2 Isabel 38 1 4 3 2 c 2 4 2 2 Isaacson 2 Isaac 38 1 4 3 2 2 ab 4 2 2 Isaiah 2 Isadore 38 1 4 3 2 2 ailorst 4 4 2 isn't 2 Isfahan 2 isentropic 2 is 38 1 4 3 2 in 2 4 3 2 Irving 2 Irvine 2 Irvin 38 1 4 3 2 a 2 t 4 2 2 irritant 2 irritable 38 1 4 3 2 2 t 4 1 2 irrigate 38 1 4 3 2 r 2 4 2 2 irreversible 2 irreverent 38 1 4 3 2 2 e 4 1 2 irrevocable 38 1 4 3 2 2 4 2 2 irresponsible 2 irrespective 38 1 4 3 2 t 2 4 2 2 irresolution 2 irresolute 38 1 4 3 2 l 2 u 4 1 2 irresolvable 38 1 4 3 2 2 op 4 1 2 irresistible 38 1 4 3 2 2 4 2 2 irreproducible 2 irreproachable 38 1 4 3 2 2 o 4 1 2 irrepressible 38 1 4 3 2 2 r 4 2 2 irreplaceable 2 irreparable 38 1 4 3 2 2 4 2 2 irremovable 2 irremediable 38 1 4 3 2 2 n 4 1 2 irredeemable 38 1 4 3 2 tis 2 4 2 2 irredentist 2 irredentism 38 1 4 3 2 2 e 4 1 2 irreducible 38 1 4 3 2 2 o 4 1 2 irreclaimable 38 1 4 3 2 2 4 2 2 irrecoverable 2 irreconcilable 38 1 4 3 2 2 cdmpsv 4 4 2 irretrievable 2 irrelevant 2 irregular 2 irrefutable 38 1 4 3 2 2 4 3 2 Irrawaddy 2 irrational 2 irradiate 38 1 4 3 2 2 aei 4 1 2 irruption 38 1 4 3 2 2 s 4 4 2 irony 2 ironwood 2 ironic 2 iron 38 1 4 3 2 2 4 2 2 ironstone 2 ironside 38 1 4 3 2 2 n 4 1 2 Iroquois 38 1 4 3 2 2 4 2 2 irksome 2 irk 38 1 4 3 2 2 4 2 2 Irishmen 2 Irishman 38 1 4 3 2 2 m 4 1 2 Irish 38 1 4 3 2 2 h 4 1 2 iris 38 1 4 3 2 2 s 4 1 2 iridium 38 1 4 3 2 2 4 3 2 Irene 2 Ireland 2 ire 38 1 4 3 2 2 4 4 2 irate 2 Iraq 2 Iran 2 Ira 38 1 4 3 2 2 aeikorv 4 4 2 Irwin 2 IRS 2 Irma 2 IR 38 1 4 3 2 2 4 2 2 ipso 2 ipsilateral 38 1 4 3 2 2 s 4 1 2 ipecac 38 1 4 3 2 spher 2 4 2 2 ionospheric 2 ionosphere 38 1 4 3 2 2 o 4 2 2 ionic 2 ion 38 1 4 3 2 2 4 2 2 iodine 2 iodinate 38 1 4 3 2 2 n 4 1 2 iodide 38 1 4 3 2 2 i 4 1 2 iodate 38 1 4 3 2 2 dn 4 3 2 Iowa 2 iota 2 Io 38 1 4 3 2 2 t 4 1 2 involuntary 38 1 4 3 2 2 4 3 2 involutorial 2 involution 2 involute 38 1 4 3 2 2 uv 4 0 38 1 4 3 2 2 l 4 3 2 invoke 2 invoice 2 invocate 38 1 4 3 2 2 4 2 2 invitee 2 invite 38 1 4 3 2 2 e 4 1 2 invitation 38 1 4 3 2 la 2 4 2 2 inviolate 2 inviolable 38 1 4 3 2 2 ot 4 5 2 invisible 2 invincible 2 invigorate 2 invidious 2 inviable 38 1 4 3 2 gat 2 4 2 2 investigatory 2 investigate 38 1 4 3 2 t 2 io 4 2 2 investment 2 invest 38 1 4 3 2 2 4 3 2 invertible 2 invertebrate 2 invert 38 1 4 3 2 2 4 2 2 inversion 2 inverse 38 1 4 3 2 2 st 4 1 2 Inverness 38 1 4 3 2 r 2 4 2 2 inventory 2 inventor 38 1 4 3 2 2 4 2 2 inventive 2 invention 38 1 4 3 2 t 2 io 4 1 2 invent 38 1 4 3 2 g 2 4 2 2 inveigle 2 inveigh 38 1 4 3 2 2 inrs 4 2 2 inveterate 2 invective 38 1 4 3 2 2 lrs 4 1 2 invade 38 1 4 3 2 i 2 4 2 2 invasive 2 invasion 38 1 4 3 2 ia 2 4 2 2 invariant 2 invariable 38 1 4 3 2 d 2 4 2 2 invalidate 2 invalid 38 1 4 3 2 2 i 4 1 2 invaluable 38 1 4 3 2 2 aeio 4 1 2 invulnerable 38 1 4 3 2 2 4 2 2 inure 2 inundate 38 1 4 3 2 2 4 2 2 intuitive 2 intuition 38 1 4 3 2 it 2 i 4 1 2 intuitable 38 1 4 3 2 i 2 4 2 2 intrusive 2 intrusion 38 1 4 3 2 2 s 4 1 2 intrude 38 1 4 3 2 er 2 4 2 2 introvert 2 introversion 38 1 4 3 2 uc 2 te 4 1 2 introducing 38 1 4 3 2 2 4 2 2 introductory 2 introduction 38 1 4 3 2 2 dv 4 3 2 introspect 2 introject 2 introit 38 1 4 3 2 a 2 4 2 2 intricate 2 intricacy 38 1 4 3 2 2 c 4 2 2 intrinsic 2 intrigue 38 1 4 3 2 2 n 4 1 2 intractable 38 1 4 3 2 si 2 4 2 2 intransitive 2 intransigent 38 1 4 3 2 2 aiou 4 1 2 intrepid 38 1 4 3 2 ica 2 4 2 2 intoxicate 2 intoxicant 38 1 4 3 2 2 4 2 2 intone 2 intonate 38 1 4 3 2 era 2 4 2 2 intolerant 2 intolerable 38 1 4 3 2 2 lnx 4 1 2 into 38 1 4 3 2 2 t 4 2 2 intimal 2 intimacy 38 1 4 3 2 e 2 4 2 2 intimater 2 intimate 38 1 4 3 2 m 2 a 4 1 2 intimidate 38 1 4 3 2 t 2 4 2 2 intestine 2 intestate 38 1 4 3 2 n 2 4 3 2 intervention 2 intervenor 2 intervene 38 1 4 3 2 2 e 4 2 2 interviewee 2 interval 38 1 4 3 2 i 2 4 2 2 interstitial 2 interstice 38 1 4 3 2 2 te 4 1 2 intersperse 38 1 4 3 2 2 4 2 2 interruption 2 interruptible 38 1 4 3 2 pt 2 i 4 1 2 interrupt 38 1 4 3 2 gat 2 4 2 2 interrogatory 2 interrogate 38 1 4 3 2 2 ou 4 1 2 interregnum 38 1 4 3 2 et 2 4 4 2 interpreter 2 interpretive 2 interpretation 2 interpret 38 1 4 3 2 l 2 a 4 1 2 Interpol 38 1 4 3 2 t 2 4 2 2 interpolatory 2 interpolate 38 1 4 3 2 2 or 4 0 38 1 4 3 2 2 a 4 2 2 internescine 2 intern 38 1 4 3 2 t 2 4 2 2 intermittent 2 intermit 38 1 4 3 2 2 i 4 1 2 intermediary 38 1 4 3 2 2 4 2 2 interior 2 interim 38 1 4 3 2 2 4 2 2 interference 2 interfere 38 1 4 3 2 2 e 4 1 2 interface 38 1 4 3 2 pt 2 4 3 2 interceptor 2 interception 2 intercept 38 1 4 3 2 2 e 4 3 2 interchangeably 2 intercom 2 intercalate 38 1 4 3 2 2 cfimnprsve 4 4 2 interlude 2 interject 2 interdict 2 inter 38 1 4 3 2 2 4 2 2 intention 2 intent 38 1 4 3 2 2 4 2 2 intensive 2 intensify 38 1 4 3 2 2 i 4 1 2 intense 38 1 4 3 2 2 4 3 2 intended 2 intendant 2 intend 38 1 4 3 2 2 dst 4 0 38 1 4 3 2 pera 2 4 2 2 intemperate 2 intemperance 38 1 4 3 2 nt 2 4 2 2 intelligentsia 2 intelligent 38 1 4 3 2 g 2 e 4 1 2 intelligible 38 1 4 3 2 ct 2 4 2 2 intellectual 2 intellect 38 1 4 3 2 l 2 ei 4 0 38 1 4 3 2 2 r 4 2 2 integument 2 integer 38 1 4 3 2 2 4 4 2 integrate 2 integrand 2 integral 2 integrable 38 1 4 3 2 2 a 4 1 2 integrity 38 1 4 3 2 2 glmnrs 4 0 38 1 4 3 2 2 4 3 2 intangible 2 intake 2 intact 38 1 4 3 2 2 aeioru 4 0 38 1 4 3 2 2 4 5 2 insurrect 2 insurmountable 2 insurgent 2 insure 2 insurance 38 1 4 3 2 2 4 2 2 insuppressible 2 insupportable 38 1 4 3 2 2 p 4 1 2 insuperable 38 1 4 3 2 2 4 2 2 insulate 2 insular 38 1 4 3 2 2 a 4 2 2 insult 2 insulin 38 1 4 3 2 f 2 4 2 2 insufficient 2 insufferable 38 1 4 3 2 2 4 2 2 insubstantial 2 insubordinate 38 1 4 3 2 2 bflpr 4 0 38 1 4 3 2 ent 2 4 2 2 instrumentation 2 instrument 38 1 4 3 2 t 2 4 2 2 instructor 2 instruct 38 1 4 3 2 u 2 cm 4 0 38 1 4 3 2 ut 2 4 2 2 institution 2 institute 38 1 4 3 2 ct 2 4 2 2 instinctual 2 instinct 38 1 4 3 2 l 2 4 2 2 instillation 2 instill 38 1 4 3 2 2 lnt 4 1 2 instigate 38 1 4 3 2 2 4 2 2 instep 2 instead 38 1 4 3 2 2 ln 4 1 2 instable 38 1 4 3 2 2 t 4 1 2 instance 38 1 4 3 2 l 2 4 3 2 installed 2 installation 2 install 38 1 4 3 2 2 aeir 4 0 38 1 4 3 2 r 2 4 2 2 inspire 2 inspiration 38 1 4 3 2 ct 2 4 2 2 inspector 2 inspect 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 nia 2 4 2 2 insomniac 2 insomnia 38 1 4 3 2 2 4 2 2 insolvent 2 insolvable 38 1 4 3 2 2 v 4 2 2 insoluble 2 insolent 38 1 4 3 2 2 lm 4 2 2 insouciant 2 insofar 38 1 4 3 2 t 2 4 3 2 insisting 2 insistent 2 insist 38 1 4 3 2 2 4 2 2 insinuate 2 insincere 38 1 4 3 2 i 2 4 2 2 insignificant 2 insignia 38 1 4 3 2 t 2 4 2 2 insightful 2 insight 38 1 4 3 2 2 hn 4 0 38 1 4 3 2 2 4 2 2 insidious 2 inside 38 1 4 3 2 2 dgns 4 1 2 insipid 38 1 4 3 2 si 2 4 2 2 insensitive 2 insensible 38 1 4 3 2 2 t 4 1 2 insecure 38 1 4 3 2 2 4 2 2 insecticide 2 insect 38 1 4 3 2 2 cnr 4 3 2 inset 2 inseparable 2 inseminate 38 1 4 3 2 2 4 2 2 inscription 2 inscribe 38 1 4 3 2 r 2 i 4 1 2 inscrutable 38 1 4 3 2 2 4 2 2 insatiable 2 insane 38 1 4 3 2 2 aceioptu 4 1 2 inshore 38 1 4 3 2 2 4 2 2 inquisitive 2 inquisition 38 1 4 3 2 it 2 i 4 1 2 inquisitor 38 1 4 3 2 2 4 2 2 inquiry 2 inquire 38 1 4 3 2 2 rs 4 0 38 1 4 3 2 u 2 i 4 1 2 inquest 38 1 4 3 2 ut 2 4 2 2 inputting 2 input 38 1 4 3 2 2 4 2 2 inorganic 2 inordinate 38 1 4 3 2 ra 2 4 2 2 inoperative 2 inoperable 38 1 4 3 2 2 e 4 1 2 inopportune 38 1 4 3 2 2 pr 4 1 2 inoculate 38 1 4 3 2 2 4 2 2 innumerable 2 innuendo 38 1 4 3 2 2 4 2 2 innocuous 2 innocent 38 1 4 3 2 2 c 4 1 2 innovate 38 1 4 3 2 2 4 2 2 innate 2 innards 38 1 4 3 2 2 aou 4 3 2 innkeeper 2 innermost 2 inn 38 1 4 3 2 a 2 4 2 2 inmate 2 Inman 38 1 4 3 2 2 4 3 2 inlay 2 inland 2 inlaid 38 1 4 3 2 2 a 4 1 2 inlet 38 1 4 3 2 2 4 2 2 inkling 2 ink 38 1 4 3 2 2 4 3 2 injury 2 injurious 2 injure 38 1 4 3 2 2 4 2 2 injunct 2 Injun 38 1 4 3 2 2 nr 4 2 2 injustice 2 injudicious 38 1 4 3 2 2 u 4 1 2 inject 38 1 4 3 2 ia 2 l 4 1 2 initiate 38 1 4 3 2 uit 2 4 2 2 iniquity 2 iniquitous 38 1 4 3 2 i 2 4 2 2 inimitable 2 inimical 38 1 4 3 2 2 mqt 4 0 38 1 4 3 2 man 2 4 2 2 inhumane 2 inhuman 38 1 4 3 2 ogene 2 4 2 2 inhomogeneous 2 inhomogeneity 38 1 4 3 2 2 m 4 2 2 inhospitable 2 inholding 38 1 4 3 2 r 2 4 2 2 inhibitory 2 inhibitor 38 1 4 3 2 bit 2 o 4 2 2 inhibition 2 inhibit 38 1 4 3 2 t 2 4 4 2 inherited 2 inheritor 2 inheritance 2 inherit 38 1 4 3 2 2 4 2 2 inherent 2 inhere 38 1 4 3 2 r 2 ei 4 0 38 1 4 3 2 2 bl 4 1 2 inharmonious 38 1 4 3 2 2 4 2 2 inhale 2 inhalation 38 1 4 3 2 it 2 a 4 1 2 inhabit 38 1 4 3 2 2 4 2 2 inhabitation 2 inhabitant 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 t 4 1 2 Ingram 38 1 4 3 2 2 4 2 2 ingratitude 2 ingratiate 38 1 4 3 2 2 i 4 1 2 ingrate 38 1 4 3 2 2 a 4 2 2 ingrown 2 ingredient 38 1 4 3 2 2 4 2 2 ingestion 2 ingestible 38 1 4 3 2 t 2 i 4 1 2 ingest 38 1 4 3 2 2 u 4 1 2 ingenious 38 1 4 3 2 2 4 2 2 ingenuous 2 ingenuity 38 1 4 3 2 2 ns 4 1 2 Ingersoll 38 1 4 3 2 2 er 4 3 2 ingot 2 inglorious 2 ingather 38 1 4 3 2 2 4 2 2 infusion 2 infusible 38 1 4 3 2 2 i 4 1 2 infuse 38 1 4 3 2 2 s 4 1 2 infuriate 38 1 4 3 2 2 4 4 2 infrastructure 2 infrared 2 infract 2 infra 38 1 4 3 2 2 a 4 2 2 infringe 2 infrequent 38 1 4 3 2 i 2 4 3 2 informative 2 information 2 Informatica 38 1 4 3 2 2 t 4 2 2 informant 2 informal 38 1 4 3 2 rm 2 a 4 1 2 inform 38 1 4 3 2 n 2 t 4 2 2 influenza 2 influence 38 1 4 3 2 2 4 2 2 influential 2 influent 38 1 4 3 2 2 e 4 1 2 influx 38 1 4 3 2 2 4 2 2 inflexible 2 inflect 38 1 4 3 2 2 mt 4 0 38 1 4 3 2 2 4 2 2 inflater 2 inflate 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 m 4 1 2 inflame 38 1 4 3 2 2 4 2 2 inflammatory 2 inflammation 38 1 4 3 2 a 2 t 4 1 2 inflammable 38 1 4 3 2 2 aeu 4 2 2 inflow 2 inflict 38 1 4 3 2 m 2 4 2 2 infirmary 2 infirm 38 1 4 3 2 2 4 2 2 infinitum 2 infinitude 38 1 4 3 2 2 4 2 2 infinitesimal 2 infinite 38 1 4 3 2 it 2 eu 4 2 2 infinity 2 infinitive 38 1 4 3 2 2 4 2 2 infimum 2 infima 38 1 4 3 2 2 mnr 4 5 2 infix 2 infiltrate 2 infighting 2 infield 2 infidel 38 1 4 3 2 t 2 4 2 2 infestation 2 infest 38 1 4 3 2 2 4 2 2 inferring 2 inferred 38 1 4 3 2 2 4 2 2 inferno 2 infernal 38 1 4 3 2 n 2 4 2 2 inferential 2 inference 38 1 4 3 2 2 enr 4 3 2 infertile 2 inferior 2 infer 38 1 4 3 2 icit 2 4 2 2 infelicity 2 infelicitous 38 1 4 3 2 t 2 4 2 2 infectious 2 infect 38 1 4 3 2 2 clrs 4 1 2 infeasible 38 1 4 3 2 2 mn 4 3 2 infatuate 2 infarct 2 infallible 38 1 4 3 2 2 4 2 2 infantrymen 2 infantryman 38 1 4 3 2 y 2 m 4 1 2 infantry 38 1 4 3 2 t 2 r 4 2 2 infantile 2 infant 38 1 4 3 2 2 4 2 2 infamy 2 infamous 38 1 4 3 2 2 aeiloru 4 0 38 1 4 3 2 2 4 2 2 inextricable 2 inextinguishable 38 1 4 3 2 c 2 4 2 2 inexplicit 2 inexplicable 38 1 4 3 2 2 i 4 1 2 inexplainable 38 1 4 3 2 2 r 4 2 2 inexpensive 2 inexpedient 38 1 4 3 2 2 4 2 2 inexpert 2 inexperience 38 1 4 3 2 2 el 4 2 2 inexpressible 2 inexpiable 38 1 4 3 2 2 pt 4 4 2 inexorable 2 inexhaustible 2 inexcusable 2 inexact 38 1 4 3 2 2 4 2 2 inestimable 2 inescapable 38 1 4 3 2 a 2 4 2 2 inertial 2 inertia 38 1 4 3 2 2 i 4 2 2 inertance 2 inert 38 1 4 3 2 2 t 4 1 2 ineradicable 38 1 4 3 2 2 4 2 2 inequity 2 inequitable 38 1 4 3 2 2 t 4 1 2 inequivalent 38 1 4 3 2 u 2 i 4 1 2 inequality 38 1 4 3 2 2 4 4 2 ineluctable 2 ineligible 2 inelegant 2 inelastic 38 1 4 3 2 c 2 4 2 2 inefficient 2 inefficacy 38 1 4 3 2 ct 2 4 2 2 ineffectual 2 ineffective 38 1 4 3 2 f 2 ei 4 1 2 ineffable 38 1 4 3 2 2 flqrsx 4 3 2 inevitable 2 inept 2 ineducable 38 1 4 3 2 2 4 3 2 industries 2 industrious 2 industrial 38 1 4 3 2 tr 2 i 4 1 2 industry 38 1 4 3 2 ge 2 4 2 2 indulgent 2 indulge 38 1 4 3 2 2 4 4 2 inductor 2 inductee 2 inductance 2 induct 38 1 4 3 2 2 t 4 2 2 inducible 2 induce 38 1 4 3 2 2 cls 4 1 2 indubitable 38 1 4 3 2 2 4 2 2 indoctrinate 2 Indochina 38 1 4 3 2 2 c 4 6 2 indorse 2 indoor 2 Indonesia 2 indomitable 2 indolent 2 Indoeuropean 38 1 4 3 2 ua 2 l 4 1 2 individuate 38 1 4 3 2 i 2 d 4 1 2 indivisible 38 1 4 3 2 in 2 4 2 2 indistinguishable 2 indistinct 38 1 4 3 2 s 2 4 2 2 indisposition 2 indispose 38 1 4 3 2 2 o 4 2 2 indisputable 2 indispensable 38 1 4 3 2 2 r 4 2 2 indiscoverable 2 indiscernible 38 1 4 3 2 2 4 2 2 indiscretion 2 indiscreet 38 1 4 3 2 2 e 4 1 2 indiscriminate 38 1 4 3 2 2 cpt 4 1 2 indissoluble 38 1 4 3 2 2 4 2 2 indirect 2 Indira 38 1 4 3 2 2 4 2 2 indignation 2 indignant 38 1 4 3 2 2 a 4 1 2 indignity 38 1 4 3 2 2 ns 4 0 38 1 4 3 2 ti 2 4 2 2 indigestion 2 indigestible 38 1 4 3 2 2 4 3 2 indigent 2 indigenous 2 indigene 38 1 4 3 2 2 en 4 1 2 indigo 38 1 4 3 2 2 4 2 2 indicate 2 indicant 38 1 4 3 2 2 a 4 2 2 indict 2 indices 38 1 4 3 2 2 n 4 1 2 India 38 1 4 3 2 a 2 4 2 2 Indianapolis 2 Indiana 38 1 4 3 2 2 acgrsv 4 3 2 indium 2 indifferent 2 Indies 38 1 4 3 2 2 cflnst 4 5 2 index 2 independent 2 indemnity 2 indeed 2 indebted 38 1 4 3 2 ermina 2 4 3 2 indeterminate 2 indeterminacy 2 indeterminable 38 1 4 3 2 2 4 2 2 indestructible 2 indescribable 38 1 4 3 2 t 2 4 3 2 indenture 2 indentation 2 indent 38 1 4 3 2 i 2 4 2 2 indelicate 2 indelible 38 1 4 3 2 n 2 4 2 2 indefinite 2 indefinable 38 1 4 3 2 2 i 4 2 2 indefensible 2 indefatigable 38 1 4 3 2 i 2 4 2 2 indecisive 2 indecision 38 1 4 3 2 2 s 4 1 2 indecipherable 38 1 4 3 2 2 i 4 2 2 indecomposable 2 indecent 38 1 4 3 2 2 eiou 4 2 2 indy 2 indwell 38 1 4 3 2 2 4 2 2 incurrer 2 incurred 38 1 4 3 2 2 e 4 1 2 incurring 38 1 4 3 2 2 r 4 2 2 incursion 2 incur 38 1 4 3 2 2 4 2 2 inculpable 2 inculcate 38 1 4 3 2 2 4 3 2 incubus 2 incubi 2 incubate 38 1 4 3 2 2 blr 4 1 2 incumbent 38 1 4 3 2 2 ad 4 1 2 increment 38 1 4 3 2 l 2 4 2 2 incredulous 2 incredulity 38 1 4 3 2 2 u 4 1 2 incredible 38 1 4 3 2 s 2 e 4 2 2 increasing 2 increasable 38 1 4 3 2 2 e 4 1 2 incriminate 38 1 4 3 2 2 4 3 2 incorruptible 2 incorrigible 2 incorrect 38 1 4 3 2 ora 2 4 2 2 incorporate 2 incorporable 38 1 4 3 2 2 pr 4 0 38 1 4 3 2 e 2 4 2 2 inconvertible 2 inconvenient 38 1 4 3 2 o 2 4 2 2 incontrovertible 2 incontrollable 38 1 4 3 2 2 r 4 1 2 incontestable 38 1 4 3 2 era 2 4 2 2 inconsiderate 2 inconsiderable 38 1 4 3 2 2 d 4 1 2 inconsistent 38 1 4 3 2 2 i 4 4 2 inconstant 2 inconspicuous 2 inconsolable 2 inconsequential 38 1 4 3 2 ru 2 4 2 2 incongruous 2 incongruity 38 1 4 3 2 2 4 2 2 inconclusive 2 inconceivable 38 1 4 3 2 2 cgstv 4 1 2 incondensable 38 1 4 3 2 ensi 2 4 2 2 incomprehension 2 incomprehensible 38 1 4 3 2 e 2 h 4 1 2 incompressible 38 1 4 3 2 et 2 4 2 2 incompletion 2 incomplete 38 1 4 3 2 2 4 2 2 incompatible 2 incomparable 38 1 4 3 2 2 alr 4 2 2 incomputable 2 incompetent 38 1 4 3 2 2 4 2 2 incommutable 2 incommunicable 38 1 4 3 2 nsura 2 4 2 2 incommensurate 2 incommensurable 38 1 4 3 2 2 eu 4 0 38 1 4 3 2 2 mp 4 2 2 income 2 incombustible 38 1 4 3 2 2 mnr 4 1 2 incoherent 38 1 4 3 2 i 2 4 2 2 inclusive 2 inclusion 38 1 4 3 2 2 sd 4 0 38 1 4 3 2 n 2 4 2 2 incline 2 inclination 38 1 4 3 2 2 iu 4 2 2 inclose 2 inclement 38 1 4 3 2 2 4 2 2 incisive 2 incise 38 1 4 3 2 ent 2 a 4 1 2 incident 38 1 4 3 2 2 ds 4 3 2 incite 2 incipient 2 incinerate 38 1 4 3 2 2 4 2 2 incestuous 2 incest 38 1 4 3 2 2 t 4 1 2 incessant 38 1 4 3 2 t 2 4 2 2 inceptor 2 inception 38 1 4 3 2 2 4 3 2 incentive 2 incense 2 incendiary 38 1 4 3 2 2 nps 4 0 38 1 4 3 2 2 4 2 2 incarnate 2 incarcerate 38 1 4 3 2 it 2 4 2 2 incapacity 2 incapacitate 38 1 4 3 2 a 2 c 4 1 2 incapable 38 1 4 3 2 2 4 2 2 incantation 2 incant 38 1 4 3 2 2 t 4 1 2 incandescent 38 1 4 3 2 2 npr 4 3 2 incautious 2 incalculable 2 Inca 38 1 4 3 2 2 aeiloru 4 2 2 inch 2 Inc 38 1 4 3 2 e 2 4 2 2 inbreed 2 inbred 38 1 4 3 2 2 4 2 2 inborn 2 inboard 38 1 4 3 2 2 or 4 0 38 1 4 3 2 ura 2 4 2 2 inaugurate 2 inaugural 38 1 4 3 2 2 g 4 2 2 inauspicious 2 inaudible 38 1 4 3 2 tenti 2 4 2 2 inattentive 2 inattention 38 1 4 3 2 2 4 2 2 inaptitude 2 inapt 38 1 4 3 2 2 r 4 2 2 inapplicable 2 inappeasable 38 1 4 3 2 2 4 2 2 inappropriate 2 inapproachable 38 1 4 3 2 2 o 4 1 2 inappreciable 38 1 4 3 2 2 pt 4 0 38 1 4 3 2 2 4 2 2 inanimate 2 inane 38 1 4 3 2 2 4 2 2 inalterable 2 inalienable 38 1 4 3 2 2 4 2 2 inadvisable 2 inadvertent 38 1 4 3 2 qua 2 4 2 2 inadequate 2 inadequacy 38 1 4 3 2 2 ev 4 1 2 inadmissible 38 1 4 3 2 2 4 2 2 inactive 2 inactivate 38 1 4 3 2 i 2 v 4 1 2 inaction 38 1 4 3 2 2 u 4 1 2 inaccessible 38 1 4 3 2 ra 2 4 2 2 inaccurate 2 inaccuracy 38 1 4 3 2 2 ct 4 0 38 1 4 3 2 2 cdlnptu 4 3 2 inasmuch 2 inarticulate 2 inability 38 1 4 3 2 2 abcdefghijklmnopqstuv 4 3 2 inward 2 inroad 2 in 38 1 4 3 2 2 4 2 2 impute 2 imputation 38 1 4 3 2 s 2 4 2 2 impulsive 2 impulse 38 1 4 3 2 2 lt 4 4 2 impure 2 impunity 2 impugn 2 impudent 38 1 4 3 2 2 4 2 2 improvise 2 improvisate 38 1 4 3 2 2 s 4 1 2 improvident 38 1 4 3 2 2 i 4 1 2 improve 38 1 4 3 2 2 e 4 1 2 impropriety 38 1 4 3 2 2 pv 4 2 2 impromptu 2 improbable 38 1 4 3 2 2 4 3 2 imprison 2 imprint 2 imprimatur 38 1 4 3 2 2 4 3 2 impressive 2 impression 2 impressible 38 1 4 3 2 2 i 4 2 2 impressed 2 impress 38 1 4 3 2 2 s 4 1 2 impresario 38 1 4 3 2 na 2 4 2 2 impregnate 2 impregnable 38 1 4 3 2 2 4 2 2 imprecise 2 imprecate 38 1 4 3 2 2 cgs 4 0 38 1 4 3 2 ctica 2 4 2 2 impractical 2 impracticable 38 1 4 3 2 2 aeio 4 1 2 imprudent 38 1 4 3 2 2 4 2 2 imposture 2 impost 38 1 4 3 2 2 t 4 3 2 impossible 2 imposition 2 impose 38 1 4 3 2 n 2 4 2 2 importune 2 importunate 38 1 4 3 2 2 4 2 2 importation 2 important 38 1 4 3 2 t 2 au 4 1 2 import 38 1 4 3 2 it 2 4 2 2 impolitic 2 impolite 38 1 4 3 2 2 lrs 4 4 2 impoverish 2 impound 2 impotent 2 imponderable 38 1 4 3 2 2 4 2 2 implicate 2 implicant 38 1 4 3 2 2 c 4 1 2 implied 38 1 4 3 2 ment 2 4 5 2 implementing 2 implementor 2 implementer 2 implementation 2 implement 38 1 4 3 2 2 n 4 2 2 implausible 2 implacable 38 1 4 3 2 t 2 4 2 2 implantation 2 implant 38 1 4 3 2 2 aei 4 1 2 implore 38 1 4 3 2 2 4 4 2 impish 2 impious 2 impinge 2 impiety 38 1 4 3 2 u 2 4 2 2 impetus 2 impetuous 38 1 4 3 2 2 4 2 2 imperturbable 2 impertinent 38 1 4 3 2 ona 2 4 2 2 impersonate 2 impersonal 38 1 4 3 2 2 4 2 2 impermissible 2 impermeable 38 1 4 3 2 2 4 4 2 imperishable 2 imperious 2 imperil 2 imperial 38 1 4 3 2 e 2 4 2 2 imperceptible 2 imperceivable 38 1 4 3 2 2 cimst 4 3 2 impervious 2 imperfect 2 imperate 38 1 4 3 2 2 4 2 2 impenetrable 2 impend 38 1 4 3 2 2 4 2 2 impeller 2 impelled 38 1 4 3 2 2 e 4 1 2 impelling 38 1 4 3 2 2 l 4 1 2 impel 38 1 4 3 2 2 4 3 2 impediment 2 impede 2 impedance 38 1 4 3 2 2 dlnrt 4 2 2 impeccable 2 impeach 38 1 4 3 2 2 4 2 2 impassive 2 impassion 38 1 4 3 2 s 2 i 4 2 2 impasse 2 impassable 38 1 4 3 2 t 2 4 3 2 impartial 2 impartation 2 impart 38 1 4 3 2 2 4 2 2 impalpable 2 impale 38 1 4 3 2 2 lrsi 4 2 2 impatient 2 impact 38 1 4 3 2 2 aeiloru 4 1 2 imp 38 1 4 3 2 2 4 2 2 immunoelectrophoresis 2 immune 38 1 4 3 2 2 n 4 1 2 immutable 38 1 4 3 2 2 4 2 2 immortal 2 immoral 38 1 4 3 2 t 2 4 2 2 immodesty 2 immodest 38 1 4 3 2 e 2 s 4 1 2 immoderate 38 1 4 3 2 il 2 4 2 2 immobility 2 immobile 38 1 4 3 2 2 bdr 4 1 2 immovable 38 1 4 3 2 ra 2 4 2 2 immigrate 2 immigrant 38 1 4 3 2 2 g 4 2 2 imminent 2 immiscible 38 1 4 3 2 s 2 4 2 2 immersion 2 immerse 38 1 4 3 2 ia 2 4 2 2 immediate 2 immediacy 38 1 4 3 2 2 dr 4 3 2 immense 2 immemorial 2 immeasurable 38 1 4 3 2 2 t 4 2 2 immanent 2 immaculate 38 1 4 3 2 2 4 2 2 immature 2 immaterial 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 ta 2 4 2 2 imitate 2 imitable 38 1 4 3 2 2 4 3 2 imbrue 2 imbroglio 2 Imbrium 38 1 4 3 2 2 r 4 4 2 imbue 2 imbibe 2 imbecile 2 imbalance 38 1 4 3 2 g 2 ei 4 0 38 1 4 3 2 2 4 2 2 imaginate 2 imaginary 38 1 4 3 2 n 2 a 4 1 2 imagine 38 1 4 3 2 2 4 3 2 imagery 2 imagen 2 image 38 1 4 3 2 2 abimp 4 0 38 1 4 3 2 r 2 4 2 2 illustrious 2 illustrate 38 1 4 3 2 2 o 4 1 2 illusive 38 1 4 3 2 n 2 4 2 2 illusionary 2 illusion 38 1 4 3 2 2 it 4 1 2 illusory 38 1 4 3 2 2 i 4 1 2 illume 38 1 4 3 2 n 2 4 2 2 illumine 2 illuminate 38 1 4 3 2 2 ms 4 0 38 1 4 3 2 era 2 4 2 2 illiterate 2 illiteracy 38 1 4 3 2 2 t 4 3 2 Illinois 2 illimitable 2 illicit 38 1 4 3 2 ima 2 4 2 2 illegitimate 2 illegitimacy 38 1 4 3 2 2 t 4 1 2 illegible 38 1 4 3 2 g 2 i 4 1 2 illegal 38 1 4 3 2 2 eiu 4 2 2 illogic 2 ill 38 1 4 3 2 2 4 5 2 I've 2 i's 2 I'm 2 I'll 2 I'd 38 1 4 3 2 a 2 4 2 2 Iliad 2 iliac 38 1 4 3 2 2 il 4 4 2 Ilyushin 2 Ilona 2 ileum 2 IL 38 1 4 3 2 2 4 2 2 iii 2 ii 38 1 4 3 2 2 4 2 2 ignorant 2 ignoramus 38 1 4 3 2 2 a 4 1 2 ignore 38 1 4 3 2 2 r 4 2 2 ignominious 2 ignoble 38 1 4 3 2 t 2 4 2 2 ignition 2 ignite 38 1 4 3 2 2 io 4 1 2 igneous 38 1 4 3 2 2 n 4 2 2 Igor 2 igloo 38 1 4 3 2 2 4 3 2 Ifni 2 iffy 2 if 38 1 4 3 2 ll 2 4 2 2 idyllic 2 idyll 38 1 4 3 2 l 2 4 2 2 idolatry 2 idol 38 1 4 3 2 2 4 2 2 idiotic 2 idiot 38 1 4 3 2 yncra 2 4 2 2 idiosyncratic 2 idiosyncrasy 38 1 4 3 2 2 4 2 2 idiomatic 2 idiom 38 1 4 3 2 o 2 mst 4 1 2 idiocy 38 1 4 3 2 l 2 4 2 2 ideology 2 ideolect 38 1 4 3 2 ti 2 4 3 2 identity 2 identify 2 identical 38 1 4 3 2 2 4 4 2 ideas 2 ideate 2 ideal 2 idea 38 1 4 3 2 2 ano 4 1 2 idempotent 38 1 4 3 2 2 4 2 2 Idaho 2 Ida 38 1 4 3 2 2 aeioy 4 2 2 idle 2 ID 38 1 4 3 2 2 4 2 2 icosahedral 2 icosahedra 38 1 4 3 2 ahedr 2 a 4 1 2 icosahedron 38 1 4 3 2 2 o 4 1 2 icon 38 1 4 3 2 clas 2 4 2 2 iconoclast 2 iconoclasm 38 1 4 3 2 2 ns 4 0 38 1 4 3 2 and 2 4 2 2 Icelandic 2 iceland 38 1 4 3 2 2 4 2 2 icebox 2 iceberg 38 1 4 3 2 2 bl 4 1 2 ice 38 1 4 3 2 2 eo 4 6 2 icy 2 icky 2 icicle 2 ichneumon 2 ICC 2 Icarus 38 1 4 3 2 2 4 2 2 ibis 2 ibid 38 1 4 3 2 2 4 2 2 ibex 2 Iberia 38 1 4 3 2 2 ei 4 2 2 Ibn 2 IBM 38 1 4 3 2 2 4 3 2 Ian 2 iambic 2 IA 38 1 4 3 2 2 abCdfgil'mnoprstv 4 6 2 Izvestia 2 ix 2 IQ 2 Ike 2 IEEE 2 i 38 1 4 3 2 2 4 2 2 hysteric 2 hysteria 38 1 4 3 2 2 4 2 2 hysteresis 2 hysterectomy 38 1 4 3 2 ter 2 ei 4 1 2 hysteron 38 1 4 3 2 2 4 2 2 hypothesis 2 hypotheses 38 1 4 3 2 2 s 4 1 2 hypothetic 38 1 4 3 2 lam 2 4 2 2 hypothalamus 2 hypothalamic 38 1 4 3 2 2 ae 4 1 2 hypothyroid 38 1 4 3 2 2 h 4 1 2 hypotenuse 38 1 4 3 2 2 4 2 2 hypocritic 2 hypocrite 38 1 4 3 2 i 2 t 4 1 2 hypocrisy 38 1 4 3 2 lor 2 4 2 2 hypochlorous 2 hypochlorite 38 1 4 3 2 2 hr 4 1 2 hypocycloid 38 1 4 3 2 2 ct 4 3 2 hypophyseal 2 hypodermic 2 hypoactive 38 1 4 3 2 o 2 4 2 2 hypnotic 2 hypnosis 38 1 4 3 2 en 2 4 2 2 hyphenate 2 hyphen 38 1 4 3 2 r 2 b 4 1 2 hypertensive 38 1 4 3 2 ol 2 o 4 2 2 hyperbolic 2 hyperbola 38 1 4 3 2 id 2 4 2 2 hyperboloidal 2 hyperboloid 38 1 4 3 2 2 ehno 4 0 38 1 4 3 2 2 4 2 2 hymnal 2 hymn 38 1 4 3 2 2 n 4 2 2 hymen 2 Hyman 38 1 4 3 2 o 2 4 2 2 hygroscopic 2 hygrometer 38 1 4 3 2 2 r 4 1 2 hygiene 38 1 4 3 2 2 4 2 2 hydroxylate 2 hydroxyl 38 1 4 3 2 2 l 4 1 2 hydroxy 38 1 4 3 2 2 y 4 1 2 hydroxide 38 1 4 3 2 2 4 2 2 hydrostatic 2 hydrosphere 38 1 4 3 2 bi 2 4 2 2 hydrophobic 2 hydrophobia 38 1 4 3 2 h 2 o 4 1 2 hydrophilic 38 1 4 3 2 2 4 2 2 hydrolysis 2 hydrology 38 1 4 3 2 en 2 4 2 2 hydrogenate 2 hydrogen 38 1 4 3 2 ori 2 4 2 2 hydrochloride 2 hydrochloric 38 1 4 3 2 2 l 4 1 2 hydrochemistry 38 1 4 3 2 2 h 4 1 2 hydrocarbon 38 1 4 3 2 2 cglpsx 4 8 2 hydrous 2 hydrothermal 2 hydronium 2 hydrometer 2 hydrofluoric 2 hydroelectric 2 hydrodynamic 2 hydro 38 1 4 3 2 2 n 4 3 2 hydraulic 2 hydrate 2 hydra 38 1 4 3 2 2 4 2 2 hydrant 2 hydrangea 38 1 4 3 2 2 ao 4 1 2 hydride 38 1 4 3 2 2 r 4 1 2 Hyde 38 1 4 3 2 2 4 4 2 Hyannis 2 hyaline 2 Hyades 2 hyacinth 38 1 4 3 2 2 adgmps 4 3 2 hying 2 hyena 2 hybrid 38 1 4 3 2 2 4 2 2 Huxtable 2 Huxley 38 1 4 3 2 s 2 4 2 2 Hutchinson 2 Hutchins 38 1 4 3 2 2 n 4 1 2 Hutchison 38 1 4 3 2 h 2 i 4 1 2 hutch 38 1 4 3 2 2 c 4 1 2 hut 38 1 4 3 2 2 4 2 2 Huston 2 hustle 38 1 4 3 2 and 2 m 4 2 2 husbandry 2 husband 38 1 4 3 2 2 4 2 2 husbandmen 2 husbandman 38 1 4 3 2 2 bt 4 2 2 husky 2 hush 38 1 4 3 2 2 4 3 2 hurty 2 hurtle 2 hurt 38 1 4 3 2 2 4 2 2 hurray 2 hurrah 38 1 4 3 2 2 a 4 2 2 hurry 2 hurricane 38 1 4 3 2 2 4 2 2 hurley 2 hurl 38 1 4 3 2 2 4 2 2 hurdle 2 Hurd 38 1 4 3 2 2 dlrt 4 3 2 Hurwitz 2 Hurst 2 Huron 38 1 4 3 2 2 4 4 2 Huntsville 2 Huntley 2 Huntington 2 hunt 38 1 4 3 2 r 2 4 2 2 Hungary 2 Hungarian 38 1 4 3 2 2 a 4 2 2 hungry 2 hung 38 1 4 3 2 red 2 4 3 2 hundredth 2 hundredfold 2 hundred 38 1 4 3 2 2 dgt 4 3 2 hunk 2 hunch 2 Hun 38 1 4 3 2 2 4 4 2 humpty 2 Humphrey 2 humpback 2 hump 38 1 4 3 2 2 4 3 2 hummock 2 hummingbird 2 Hummel 38 1 4 3 2 i 2 4 2 2 humility 2 humiliate 38 1 4 3 2 2 i 4 1 2 humid 38 1 4 3 2 2 4 2 2 humidistat 2 humidify 38 1 4 3 2 2 dl 4 0 38 1 4 3 2 2 4 2 2 Humboldt 2 humble 38 1 4 3 2 n 2 4 3 2 humanitarian 2 humane 2 human 38 1 4 3 2 2 abimp 4 4 2 humus 2 humorous 2 humerus 2 hum 38 1 4 3 2 2 4 2 2 hull 2 hulk 38 1 4 3 2 2 4 2 2 Hughes 2 Hugh 38 1 4 3 2 in 2 4 2 2 Huggins 2 hugging 38 1 4 3 2 2 gh 4 3 2 Hugo 2 huge 2 hug 38 1 4 3 2 f 2 4 2 2 Huffman 2 huff 38 1 4 3 2 2 4 2 2 Hudson 2 huddle 38 1 4 3 2 k 2 4 3 2 huckster 2 huckleberry 2 huck 38 1 4 3 2 2 be 4 2 2 hubris 2 hub 38 1 4 3 2 r 2 4 2 2 Hubert 2 Huber 38 1 4 3 2 2 4 4 2 hubby 2 hubbub 2 Hubbell 2 Hubbard 38 1 4 3 2 2 bcdfglmnrstx 4 3 2 huzzah 2 huh 2 hue 38 1 4 3 2 en 2 4 2 2 hoydenish 2 hoyden 38 1 4 3 2 2 d 4 2 2 Hoyt 2 hoy 38 1 4 3 2 o 2 4 2 2 howsomever 2 howsoever 38 1 4 3 2 2 4 3 2 however 2 Howell 2 Howe 38 1 4 3 2 2 es 4 4 2 howl 2 howdy 2 Howard 2 how 38 1 4 3 2 e 2 4 3 2 hover 2 hovel 2 hove 38 1 4 3 2 2 bw 4 5 2 houses 2 housekeep 2 household 2 housefly 2 house 38 1 4 3 2 2 4 2 2 housewives 2 housewife 38 1 4 3 2 2 i 4 1 2 housework 38 1 4 3 2 2 4 2 2 housebroken 2 housebreak 38 1 4 3 2 2 r 4 1 2 houseboat 38 1 4 3 2 2 e 4 1 2 Houston 38 1 4 3 2 2 4 3 2 hours 2 hourglass 2 hour 38 1 4 3 2 h 2 4 2 2 Houghton 2 hough 38 1 4 3 2 2 4 2 2 Houdini 2 Houdaille 38 1 4 3 2 2 dgrs 4 1 2 hound 38 1 4 3 2 2 4 2 2 hothouse 2 hothead 38 1 4 3 2 l 2 4 2 2 hotelman 2 hotel 38 1 4 3 2 2 4 2 2 hotbox 2 hotbed 38 1 4 3 2 2 beh 4 2 2 hotrod 2 hot 38 1 4 3 2 2 4 2 2 hostess 2 hostelry 38 1 4 3 2 2 e 4 4 2 hostler 2 hostile 2 hostage 2 host 38 1 4 3 2 a 2 4 2 2 hospital 2 hospitable 38 1 4 3 2 i 2 t 4 1 2 hospice 38 1 4 3 2 2 pt 4 2 2 hosiery 2 hose 38 1 4 3 2 2 4 2 2 Horton 2 horticulture 38 1 4 3 2 om 2 4 2 2 horsewomen 2 horsewoman 38 1 4 3 2 2 4 2 2 horsepower 2 horseplay 38 1 4 3 2 2 4 2 2 horsemen 2 horseman 38 1 4 3 2 l 2 4 2 2 horsefly 2 horseflesh 38 1 4 3 2 e 2 fmpw 4 6 2 horsetail 2 horseshoe 2 horsehair 2 horsedom 2 horseback 2 horse 38 1 4 3 2 2 4 3 2 horrify 2 horrid 2 horrible 38 1 4 3 2 2 i 4 2 2 horror 2 horrendous 38 1 4 3 2 2 4 3 2 Horowitz 2 horoscope 2 horology 38 1 4 3 2 2 4 2 2 Hornblower 2 hornblende 38 1 4 3 2 2 l 4 1 2 hornbeam 38 1 4 3 2 2 b 4 6 2 horny 2 hornwort 2 horntail 2 hornmouth 2 hornet 2 horn 38 1 4 3 2 zon 2 t 4 1 2 horizon 38 1 4 3 2 2 4 2 2 Horatio 2 Horace 38 1 4 3 2 2 ainorst 4 4 2 Horus 2 hormone 2 horehound 2 horde 38 1 4 3 2 ins 2 4 2 2 Hopkinsian 2 Hopkins 38 1 4 3 2 2 4 2 2 hopeful 2 hope 38 1 4 3 2 2 ek 4 3 2 hopscotch 2 hopple 2 hop 38 1 4 3 2 e 2 4 2 2 hooves 2 Hoover 38 1 4 3 2 2 4 2 2 Hoosier 2 hoosegow 38 1 4 3 2 2 4 2 2 hoopla 2 hoop 38 1 4 3 2 2 4 3 2 hookworm 2 hookup 2 hook 38 1 4 3 2 2 4 2 2 hoofmark 2 hoof 38 1 4 3 2 2 4 2 2 hoodlum 2 hood 38 1 4 3 2 2 dfkpsv 4 3 2 hoot 2 hooligan 2 hooch 38 1 4 3 2 r 2 i 4 1 2 honorary 38 1 4 3 2 2 4 2 2 honoraria 2 honorarium 38 1 4 3 2 2 a 4 2 2 honorific 2 honoree 38 1 4 3 2 2 r 4 1 2 Honolulu 38 1 4 3 2 2 4 7 2 Honeywell 2 honeysuckle 2 honeymoon 2 honeydew 2 honeycomb 2 honeybee 2 honey 38 1 4 3 2 t 2 4 2 2 honesty 2 honest 38 1 4 3 2 2 sy 4 1 2 hone 38 1 4 3 2 2 4 3 2 Honduras 2 hondo 2 Honda 38 1 4 3 2 2 deo 4 3 2 Honshu 2 honk 2 hong 38 1 4 3 2 orphi 2 4 2 2 homomorphism 2 homomorphic 38 1 4 3 2 og 2 4 3 2 homology 2 homologue 2 homologous 38 1 4 3 2 2 4 2 2 homogeneous 2 homogeneity 38 1 4 3 2 en 2 e 4 1 2 homogenate 38 1 4 3 2 2 glm 4 6 2 homozygous 2 homotopy 2 homosexual 2 homophobia 2 homonym 2 homo 38 1 4 3 2 id 2 4 2 2 homicide 2 homicidal 38 1 4 3 2 2 c 4 1 2 homily 38 1 4 3 2 2 4 2 2 homework 2 homeward 38 1 4 3 2 2 4 2 2 homestead 2 homesick 38 1 4 3 2 orph 2 4 2 2 homeomorphic 2 homeomorph 38 1 4 3 2 2 m 4 2 2 homeowner 2 homeopath 38 1 4 3 2 a 2 4 2 2 homemake 2 homemade 38 1 4 3 2 ild 2 4 2 2 homebuilding 2 homebuilder 38 1 4 3 2 2 u 4 1 2 homebound 38 1 4 3 2 2 bmosw 4 4 2 Homeric 2 homeland 2 homecoming 2 home 38 1 4 3 2 2 eio 4 3 2 homunculus 2 homage 2 Hom 38 1 4 3 2 2 4 2 2 holystone 2 Holyoke 38 1 4 3 2 2 4 2 2 holster 2 Holstein 38 1 4 3 2 t 2 e 4 1 2 Holst 38 1 4 3 2 ra 2 4 2 2 holography 2 hologram 38 1 4 3 2 2 4 2 2 Holocene 2 holocaust 38 1 4 3 2 2 cg 4 0 38 1 4 3 2 2 4 5 2 holmium 2 Holmes 2 Holmdel 2 Holman 2 Holm 38 1 4 3 2 2 4 3 2 Hollywood 2 hollyhock 2 holly 38 1 4 3 2 w 2 4 3 2 hollowware 2 Holloway 2 hollow 38 1 4 3 2 2 4 2 2 Hollister 2 Hollingsworth 38 1 4 3 2 r 2 4 2 2 Hollerith 2 holler 38 1 4 3 2 nd 2 4 2 2 Hollandaise 2 Holland 38 1 4 3 2 2 aeioy 4 0 38 1 4 3 2 2 4 2 2 holeable 2 hole 38 1 4 3 2 2 4 6 2 holds 2 holding 2 holdup 2 holdover 2 holden 2 hold 38 1 4 3 2 2 delmosy 4 4 2 holt 2 holiday 2 Holcomb 2 Holbrook 38 1 4 3 2 2 4 3 2 hogging 2 hogan 2 hog 38 1 4 3 2 f 2 4 2 2 Hoffman 2 Hoff 38 1 4 3 2 2 4 3 2 Hodges 2 hodgepodge 2 hodge 38 1 4 3 2 g 2 e 4 1 2 Hodgkin 38 1 4 3 2 2 4 2 2 hockey 2 hock 38 1 4 3 2 2 k 4 1 2 hoc 38 1 4 3 2 2 4 2 2 Hoboken 2 hobo 38 1 4 3 2 2 4 2 2 hobbyhorse 2 hobby 38 1 4 3 2 2 y 4 3 2 Hobbs 2 hobble 2 Hobbes 38 1 4 3 2 2 bo 4 2 2 Hobart 2 hob 38 1 4 3 2 2 4 4 2 hoarse 2 hoarfrost 2 hoard 2 hoar 38 1 4 3 2 2 4 3 2 hoagy 2 Hoagland 2 hoagie 38 1 4 3 2 2 gr 4 0 38 1 4 3 2 2 abcdfglmnoprstuvwy 4 4 2 Hokan 2 hoi 2 hoe 2 ho 38 1 4 3 2 er 2 4 2 2 hitherto 2 hither 38 1 4 3 2 h 2 4 2 2 Hitchcock 2 hitch 38 1 4 3 2 2 ch 4 3 2 Hitler 2 Hitachi 2 hit 38 1 4 3 2 2 4 3 2 historiography 2 historic 2 historian 38 1 4 3 2 2 i 4 1 2 history 38 1 4 3 2 hemi 2 4 2 2 histochemistry 2 histochemic 38 1 4 3 2 2 cr 4 2 2 histology 2 histogram 38 1 4 3 2 2 o 4 3 2 histrionic 2 histidine 2 histamine 38 1 4 3 2 2 t 4 3 2 hiss 2 Hispanic 2 his 38 1 4 3 2 2 4 2 2 hirsute 2 Hirsch 38 1 4 3 2 shi 2 4 2 2 Hiroshima 2 Hiroshi 38 1 4 3 2 2 4 2 2 hireling 2 hire 38 1 4 3 2 2 eos 4 1 2 Hiram 38 1 4 3 2 2 c 4 3 2 hippopotamus 2 hippodrome 2 hippo 38 1 4 3 2 rat 2 4 2 2 Hippocratic 2 Hippocrates 38 1 4 3 2 2 o 4 1 2 hippy 38 1 4 3 2 2 p 4 2 2 hipster 2 hip 38 1 4 3 2 2 4 2 2 hinterland 2 hint 38 1 4 3 2 2 4 6 2 hinder 2 Hindu 2 hindsight 2 hindrance 2 hindmost 2 hind 38 1 4 3 2 2 dt 4 3 2 Hinman 2 hinge 2 Hines 38 1 4 3 2 2 4 3 2 himself 2 Himalaya 2 him 38 1 4 3 2 2 4 2 2 Hilton 2 hilt 38 1 4 3 2 2 4 2 2 hillmen 2 hillman 38 1 4 3 2 2 m 4 8 2 hilly 2 hilltop 2 hillside 2 hillock 2 Hillel 2 Hillcrest 2 hillbilly 2 hill 38 1 4 3 2 ri 2 4 2 2 hilarity 2 hilarious 38 1 4 3 2 2 alt 4 3 2 hilum 2 Hildebrand 2 Hilbert 38 1 4 3 2 2 4 2 2 highwaymen 2 highwayman 38 1 4 3 2 ay 2 m 4 1 2 highway 38 1 4 3 2 2 4 3 2 highly 2 highlight 2 highland 38 1 4 3 2 2 4 2 2 highboy 2 highball 38 1 4 3 2 2 blw 4 7 2 high-level 2 higher 2 hightail 2 highroad 2 highhanded 2 highfalutin 2 high 38 1 4 3 2 2 h 4 1 2 Higgins 38 1 4 3 2 2 4 2 2 Hieronymus 2 hieroglyphic 38 1 4 3 2 2 r 4 1 2 hieratic 38 1 4 3 2 ch 2 4 3 2 hierarchy 2 hierarchic 2 hierarchal 38 1 4 3 2 r 2 ao 4 0 38 1 4 3 2 u 2 4 2 2 hideout 2 hideous 38 1 4 3 2 2 o 4 2 2 hideaway 2 hide 38 1 4 3 2 2 e 4 3 2 hidden 2 hidalgo 2 hid 38 1 4 3 2 k 2 4 4 2 hickory 2 Hickman 2 Hickey 2 hick 38 1 4 3 2 rn 2 4 2 2 Hibernia 2 hibernate 38 1 4 3 2 2 e 4 2 2 Hibbard 2 hibachi 38 1 4 3 2 2 4 2 2 hiatus 2 Hiatt 38 1 4 3 2 2 t 4 1 2 Hiawatha 38 1 4 3 2 2 abcdeglmnprst 4 5 2 hive 2 hike 2 hijack 2 hifalutin 2 hi 38 1 4 3 2 2 4 2 2 heyday 2 hey 38 1 4 3 2 on 2 4 2 2 hexagonal 2 hexagon 38 1 4 3 2 2 g 4 5 2 hexane 2 hexameter 2 hexafluoride 2 hexadecimal 2 hexachloride 38 1 4 3 2 2 a 4 1 2 hex 38 1 4 3 2 2 4 5 2 hewn 2 Hewlett 2 Hewitt 2 Hewett 2 hew 38 1 4 3 2 e 2 4 2 2 Heuser 2 Heusen 38 1 4 3 2 2 s 4 2 2 heuristic 2 Heublein 38 1 4 3 2 2 4 2 2 Hetty 2 Hettie 38 1 4 3 2 ro 2 gs 4 3 2 heterozygous 2 heterodyne 2 heterocyclic 38 1 4 3 2 2 4 2 2 heterostructure 2 heterosexual 38 1 4 3 2 ne 2 4 2 2 heterogeneous 2 heterogeneity 38 1 4 3 2 2 e 4 1 2 heterogamous 38 1 4 3 2 2 et 4 1 2 Hetman 38 1 4 3 2 2 4 3 2 Hessian 2 Hesse 2 Hess 38 1 4 3 2 ta 2 t 4 1 2 hesitant 38 1 4 3 2 e 2 4 2 2 hesitater 2 hesitate 38 1 4 3 2 2 is 4 2 2 Hester 2 Hesperus 38 1 4 3 2 z 2 4 2 2 Hertzog 2 hertz 38 1 4 3 2 e 2 4 2 2 Hershey 2 Hershel 38 1 4 3 2 2 h 4 3 2 herself 2 Herschel 2 hers 38 1 4 3 2 2 4 2 2 herringbone 2 Herr 38 1 4 3 2 e 2 4 2 2 herpetology 2 herpes 38 1 4 3 2 2 4 2 2 heroine 2 heroin 38 1 4 3 2 2 n 4 2 2 heroism 2 heroic 38 1 4 3 2 2 i 4 4 2 heron 2 heroes 2 Herodotus 2 hero 38 1 4 3 2 t 2 4 2 2 hermitian 2 Hermite 38 1 4 3 2 2 4 3 2 hermetic 2 Hermes 2 hermeneutic 38 1 4 3 2 n 2 4 2 2 Hermann 2 Herman 38 1 4 3 2 2 aei 4 1 2 Hermosa 38 1 4 3 2 ta 2 4 2 2 heritage 2 heritable 38 1 4 3 2 n 2 4 2 2 hereunto 2 hereunder 38 1 4 3 2 2 4 2 2 heretofore 2 hereto 38 1 4 3 2 2 o 4 1 2 heretic 38 1 4 3 2 2 4 2 2 hereinafter 2 hereinabove 38 1 4 3 2 n 2 a 4 2 2 hereinbelow 2 herein 38 1 4 3 2 it 2 4 2 2 heredity 2 hereditary 38 1 4 3 2 2 4 2 2 hereafter 2 hereabout 38 1 4 3 2 2 aditu 4 6 2 herewith 2 heresy 2 hereof 2 Hereford 2 hereby 2 here 38 1 4 3 2 2 4 2 2 herdsman 2 herd 38 1 4 3 2 ule 2 4 2 2 Hercules 2 Herculean 38 1 4 3 2 2 4 2 2 Herbert 2 herb 38 1 4 3 2 2 4 3 2 herald 2 Heraclitus 2 Hera 38 1 4 3 2 2 abcdeimoprst 4 3 2 Hernandez 2 Herkimer 2 her 38 1 4 3 2 ti 2 4 2 2 hepatitis 2 hepatica 38 1 4 3 2 2 a 4 2 2 heptane 2 Hepburn 38 1 4 3 2 2 4 2 2 Henrietta 2 Henri 38 1 4 3 2 2 i 4 1 2 henry 38 1 4 3 2 ick 2 4 2 2 Hendrickson 2 Hendrick 38 1 4 3 2 2 r 4 1 2 Henderson 38 1 4 3 2 m 2 4 2 2 henchmen 2 henchman 38 1 4 3 2 2 4 2 2 henceforth 2 hence 38 1 4 3 2 2 eh 4 0 38 1 4 3 2 2 cdr 4 5 2 henpeck 2 Henley 2 henequen 2 henbane 2 hen 38 1 4 3 2 2 4 2 2 Hempstead 2 hemp 38 1 4 3 2 rh 2 4 2 2 hemorrhoid 2 hemorrhage 38 1 4 3 2 2 r 4 3 2 hemosiderin 2 hemolytic 2 hemoglobin 38 1 4 3 2 pher 2 4 2 2 hemispheric 2 hemisphere 38 1 4 3 2 2 s 4 1 2 Hemingway 38 1 4 3 2 2 iop 4 3 2 hemlock 2 hematite 2 hem 38 1 4 3 2 2 4 4 2 helps 2 helpmate 2 helpful 2 help 38 1 4 3 2 m 2 4 2 2 helmsmen 2 helmsman 38 1 4 3 2 2 s 4 4 2 Helmut 2 Helmholtz 2 helmet 2 helm 38 1 4 3 2 2 4 2 2 Hellenic 2 hellebore 38 1 4 3 2 2 e 4 6 2 hello 2 hellish 2 hellgrammite 2 hellfire 2 hellbender 2 hell 38 1 4 3 2 2 4 2 2 he'll 2 he'd 38 1 4 3 2 2 4 2 2 heliotrope 2 heliocentric 38 1 4 3 2 2 4 2 2 helicopter 2 helical 38 1 4 3 2 2 co 4 2 2 helix 2 helium 38 1 4 3 2 n 2 4 3 2 Helene 2 Helena 2 Helen 38 1 4 3 2 2 eilmp 4 4 2 Helvetica 2 Helsinki 2 Helga 2 held 38 1 4 3 2 2 4 3 2 heirarchy 2 heiress 2 heir 38 1 4 3 2 2 4 3 2 Heinz 2 Heinrich 2 Heine 38 1 4 3 2 2 4 2 2 heighten 2 height 38 1 4 3 2 h 2 t 4 1 2 heigh 38 1 4 3 2 2 gnr 4 2 2 Heisenberg 2 Heidelberg 38 1 4 3 2 e 2 4 2 2 hegemony 2 Hegelian 38 1 4 3 2 t 2 4 2 2 hefty 2 heft 38 1 4 3 2 2 4 2 2 heel 2 heed 38 1 4 3 2 nis 2 4 2 2 hedonist 2 hedonism 38 1 4 3 2 e 2 4 2 2 hedgehog 2 hedge 38 1 4 3 2 2 go 4 0 38 1 4 3 2 2 4 2 2 hector 2 hectic 38 1 4 3 2 2 4 3 2 Heckman 2 heckle 2 heck 38 1 4 3 2 t 2 4 2 2 hecatomb 2 Hecate 38 1 4 3 2 2 akt 4 1 2 Hecuba 38 1 4 3 2 2 4 2 2 Hebrew 2 Hebraic 38 1 4 3 2 2 4 2 2 hebephrenic 2 Hebe 38 1 4 3 2 2 er 4 0 38 1 4 3 2 2 4 2 2 heavyweight 2 heavy 38 1 4 3 2 2 n 4 1 2 heave 38 1 4 3 2 2 4 2 2 heavenward 2 heaven 38 1 4 3 2 2 ey 4 0 38 1 4 3 2 n 2 4 2 2 heathenish 2 heathen 38 1 4 3 2 2 e 4 2 2 Heathkit 2 heath 38 1 4 3 2 2 h 4 2 2 heater 2 heat 38 1 4 3 2 2 4 2 2 heartbreak 2 heartbeat 38 1 4 3 2 2 b 4 5 2 hearty 2 hearth 2 heartfelt 2 hearten 2 heart 38 1 4 3 2 2 4 3 2 Hearst 2 hearse 2 hearsay 38 1 4 3 2 2 st 4 3 2 hearken 2 heard 2 hear 38 1 4 3 2 h 2 4 3 2 healthy 2 healthful 2 health 38 1 4 3 2 2 t 4 3 2 Healy 2 Healey 2 heal 38 1 4 3 2 2 lsw 4 10 2 header 2 heady 2 headroom 2 headquarter 2 headphone 2 headmaster 2 headdress 2 headboard 2 headache 2 head 38 1 4 3 2 2 4 3 2 headway 2 headwater 2 headwall 38 1 4 3 2 2 a 4 1 2 headwind 38 1 4 3 2 2 4 3 2 headstrong 2 headstone 2 headstand 38 1 4 3 2 2 4 2 2 headsmen 2 headsman 38 1 4 3 2 2 mt 4 1 2 headset 38 1 4 3 2 2 n 4 1 2 headlight 38 1 4 3 2 2 i 4 1 2 headland 38 1 4 3 2 2 dlrtv 4 1 2 heap 38 1 4 3 2 2 abcdefgil'mnprstuwxy 4 1 2 he 38 1 4 3 2 2 4 2 2 hazelnut 2 hazel 38 1 4 3 2 2 l 4 1 2 haze 38 1 4 3 2 rd 2 4 2 2 hazardous 2 hazard 38 1 4 3 2 2 ae 4 1 2 hazy 38 1 4 3 2 2 4 2 2 Haydn 2 Hayden 38 1 4 3 2 2 d 4 6 2 hayward 2 haystack 2 Haynes 2 hayfield 2 Hayes 2 hay 38 1 4 3 2 horn 2 4 2 2 Hawthorne 2 hawthorn 38 1 4 3 2 2 4 2 2 Hawkins 2 hawk 38 1 4 3 2 ii 2 4 2 2 Hawaiian 2 Hawaii 38 1 4 3 2 2 akt 4 2 2 Hawley 2 haw 38 1 4 3 2 2 4 2 2 haven't 2 haven 38 1 4 3 2 2 n 4 1 2 have 38 1 4 3 2 2 ei 4 2 2 havoc 2 Havana 38 1 4 3 2 2 4 2 2 haunt 2 haunch 38 1 4 3 2 2 4 2 2 haulage 2 haul 38 1 4 3 2 2 4 2 2 haughty 2 Haugen 38 1 4 3 2 2 gln 4 1 2 Hausdorff 38 1 4 3 2 e 2 4 2 2 Hattiesburg 2 Hattie 38 1 4 3 2 2 i 4 1 2 Hatteras 38 1 4 3 2 2 4 2 2 Hathaway 2 hath 38 1 4 3 2 2 4 3 2 hater 2 hateful 2 hate 38 1 4 3 2 h 2 4 3 2 hatchway 2 hatchet 2 hatch 38 1 4 3 2 2 ceht 4 3 2 hatred 2 Hatfield 2 hat 38 1 4 3 2 2 4 2 2 hasten 2 haste 38 1 4 3 2 2 e 4 3 2 hasty 2 Hastings 2 hast 38 1 4 3 2 2 4 2 2 hashish 2 hash 38 1 4 3 2 2 ht 4 4 2 hassle 2 hasp 2 hasn't 2 has 38 1 4 3 2 t 2 4 2 2 harvestman 2 harvest 38 1 4 3 2 2 s 4 1 2 Harvey 38 1 4 3 2 2 e 4 1 2 Harvard 38 1 4 3 2 2 4 4 2 Hartman 2 Hartley 2 Hartford 2 hart 38 1 4 3 2 h 2 4 2 2 harshen 2 harsh 38 1 4 3 2 2 s 4 3 2 Harrington 2 Harriman 2 Harriet 38 1 4 3 2 2 4 3 2 Harrison 2 Harrisburg 2 Harris 38 1 4 3 2 2 i 4 2 2 harry 2 harrow 38 1 4 3 2 2 4 4 2 Harpy 2 harpsichord 2 harpoon 2 harp 38 1 4 3 2 2 4 2 2 harmonica 2 harmonic 38 1 4 3 2 2 c 4 1 2 harmonious 38 1 4 3 2 n 2 i 4 2 2 harmony 2 Harmon 38 1 4 3 2 2 o 4 2 2 harmful 2 harm 38 1 4 3 2 2 4 2 2 Harley 2 Harlem 38 1 4 3 2 2 e 4 1 2 Harlan 38 1 4 3 2 2 4 3 2 harem 2 harelip 2 hare 38 1 4 3 2 2 4 2 2 hardworking 2 hardwood 38 1 4 3 2 2 o 4 1 2 hardware 38 1 4 3 2 2 4 2 2 hardtop 2 hardtack 38 1 4 3 2 2 4 2 2 hardboiled 2 hardboard 38 1 4 3 2 2 o 4 1 2 hardbake 38 1 4 3 2 2 btwe 4 6 2 hardy 2 hardscrabble 2 Hardin 2 hardhat 2 hardcopy 2 hard 38 1 4 3 2 in 2 4 2 2 harbinger 2 Harbin 38 1 4 3 2 2 4 2 2 harass 2 harangue 38 1 4 3 2 2 abdelmprstv 4 4 2 Harold 2 harness 2 hark 2 Harcourt 38 1 4 3 2 n 2 4 3 2 happened 2 happenstance 2 happen 38 1 4 3 2 2 e 4 1 2 happy 38 1 4 3 2 d 2 4 2 2 haploidy 2 haploid 38 1 4 3 2 o 2 i 4 1 2 haplology 38 1 4 3 2 2 lp 4 3 2 Hapsburg 2 haphazard 2 hap 38 1 4 3 2 2 4 2 2 Hanson 2 hansom 38 1 4 3 2 2 4 2 2 Hansen 2 Hansel 38 1 4 3 2 2 eo 4 1 2 Hans 38 1 4 3 2 er 2 4 2 2 Hanoverian 2 Hanover 38 1 4 3 2 2 v 4 1 2 Hanoi 38 1 4 3 2 2 4 2 2 Hannah 2 Hanna 38 1 4 3 2 2 a 4 1 2 Hannibal 38 1 4 3 2 2 4 2 2 Hanlon 2 Hanley 38 1 4 3 2 2 4 2 2 Hankel 2 hank 38 1 4 3 2 2 4 2 2 hangover 2 hangout 38 1 4 3 2 2 4 2 2 hangmen 2 hangman 38 1 4 3 2 2 4 2 2 hangar 2 hangable 38 1 4 3 2 2 amo 4 1 2 hang 38 1 4 3 2 2 4 2 2 handymen 2 handyman 38 1 4 3 2 2 m 4 1 2 handy 38 1 4 3 2 it 2 4 2 2 handwritten 2 handwrite 38 1 4 3 2 2 r 4 1 2 handwaving 38 1 4 3 2 2 4 6 2 handstand 2 handspike 2 handsome 2 handshake 2 handset 2 hands 38 1 4 3 2 a 2 4 2 2 handmaiden 2 handmade 38 1 4 3 2 2 4 3 2 handlebar 2 handleable 2 handle 38 1 4 3 2 2 e 4 1 2 handline 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 m 2 4 2 2 handicraftsmen 2 handicraftsman 38 1 4 3 2 aft 2 s 4 1 2 handicraft 38 1 4 3 2 p 2 p 4 1 2 handicap 38 1 4 3 2 2 4 2 2 handicapper 2 handicapped 38 1 4 3 2 2 e 4 1 2 handicapping 38 1 4 3 2 2 c 4 1 2 handiwork 38 1 4 3 2 2 4 2 2 handcuff 2 handclasp 38 1 4 3 2 2 4 2 2 handbook 2 handbag 38 1 4 3 2 2 bcilmswy 4 7 2 handout 2 handkerchief 2 handhold 2 handgun 2 handful 2 Handel 2 hand 38 1 4 3 2 2 dgklnos 4 5 2 Hanukkah 2 Hanford 2 Haney 2 Hancock 2 Han 38 1 4 3 2 2 4 3 2 Hampton 2 Hampshire 2 hamper 38 1 4 3 2 2 4 2 2 Hammond 2 hammock 38 1 4 3 2 2 o 4 1 2 hammerhead 38 1 4 3 2 2 4 2 2 Hamlin 2 hamlet 38 1 4 3 2 urg 2 4 2 2 hamburger 2 Hamburg 38 1 4 3 2 2 blmp 4 4 2 hamster 2 Hamilton 2 Hamal 2 ham 38 1 4 3 2 2 4 2 2 Halverson 2 halve 38 1 4 3 2 2 e 4 1 2 halvah 38 1 4 3 2 2 4 2 2 Halstead 2 Halsey 38 1 4 3 2 2 4 3 2 halogen 2 halocarbon 2 halo 38 1 4 3 2 w 2 4 2 2 Halloween 2 hallow 38 1 4 3 2 2 4 2 2 Halley 2 hallelujah 38 1 4 3 2 2 eo 4 4 2 hallway 2 hallucinate 2 hallmark 2 hall 38 1 4 3 2 2 4 4 2 halite 2 Halifax 2 halide 2 halibut 38 1 4 3 2 2 4 4 2 halfway 2 halfhearted 2 halfback 2 half 38 1 4 3 2 2 4 2 2 Haley 2 hale 38 1 4 3 2 2 efilosv 4 5 2 halt 2 Halpern 2 halma 2 halcyon 2 Hal 38 1 4 3 2 i 2 4 2 2 Haitian 2 Haiti 38 1 4 3 2 2 4 5 2 hairy 2 hairpin 2 hairdo 2 haircut 2 hair 38 1 4 3 2 to 2 4 2 2 hailstorm 2 hailstone 38 1 4 3 2 2 s 4 1 2 hail 38 1 4 3 2 2 lrt 4 3 2 Haines 2 haiku 2 Haifa 38 1 4 3 2 2 4 2 2 haggle 2 haggard 38 1 4 3 2 2 4 2 2 Hager 2 Hagen 38 1 4 3 2 2 eg 4 2 2 Hague 2 Hagstrom 38 1 4 3 2 2 4 2 2 hadron 2 Hadrian 38 1 4 3 2 2 4 2 2 haddock 2 Haddad 38 1 4 3 2 2 dr 4 5 2 hadn't 2 Hadley 2 Hades 2 Hadamard 2 had 38 1 4 3 2 2 4 7 2 hacksaw 2 hackney 2 hackmatack 2 hackle 2 Hackett 2 hackberry 2 hack 38 1 4 3 2 2 k 4 1 2 hacienda 38 1 4 3 2 a 2 4 2 2 habituate 2 habitual 38 1 4 3 2 2 4 2 2 habitation 2 habitat 38 1 4 3 2 2 t 4 1 2 habitant 38 1 4 3 2 2 au 4 1 2 habit 38 1 4 3 2 2 t 4 1 2 Habib 38 1 4 3 2 2 r 4 1 2 habeas 38 1 4 3 2 2 4 2 2 Haberman 2 haberdashery 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 2 2 Haas 2 Haag 38 1 4 3 2 2 abcdgilmnprstuvwyz 4 3 2 Hahn 2 hafnium 2 ha 38 1 4 3 2 2 aeiouy 4 3 2 h's 2 Hrothgar 2 h 38 1 4 3 2 2 4 3 2 gyroscope 2 gyrocompass 2 gyro 38 1 4 3 2 2 o 4 2 2 gyrfalcon 2 gyrate 38 1 4 3 2 2 4 3 2 gypsy 2 gypsum 2 gypsite 38 1 4 3 2 2 s 4 1 2 gyp 38 1 4 3 2 2 n 4 1 2 gym 38 1 4 3 2 s 2 t 4 1 2 gymnasium 38 1 4 3 2 2 4 2 2 gymnastic 2 gymnast 38 1 4 3 2 2 a 4 1 2 gymnosperm 38 1 4 3 2 2 mpr 4 0 38 1 4 3 2 2 4 2 2 Gwyn 2 Gwen 38 1 4 3 2 2 4 2 2 Guyana 2 guy 38 1 4 3 2 2 4 5 2 guttural 2 gutsy 2 Guthrie 2 Gutenberg 2 gut 38 1 4 3 2 2 4 3 2 Gustavus 2 Gustave 2 Gustav 38 1 4 3 2 2 v 4 1 2 Gustafson 38 1 4 3 2 2 a 4 3 2 gusty 2 gusto 2 gust 38 1 4 3 2 2 t 4 3 2 gusset 2 gush 2 Gus 38 1 4 3 2 2 4 3 2 guru 2 Gurkha 2 gurgle 38 1 4 3 2 2 4 2 2 gunsling 2 gunshot 38 1 4 3 2 2 4 2 2 gunpowder 2 gunplay 38 1 4 3 2 2 4 2 2 gunny 2 gunnery 38 1 4 3 2 2 4 2 2 gunmen 2 gunman 38 1 4 3 2 2 4 2 2 gunky 2 gunk 38 1 4 3 2 2 4 2 2 gunfire 2 gunfight 38 1 4 3 2 2 i 4 1 2 gunflint 38 1 4 3 2 2 fkmnps 4 3 2 Gunther 2 Gunderson 2 gun 38 1 4 3 2 2 4 6 2 gumshoe 2 gumption 2 gummy 2 gumdrop 2 gumbo 2 gum 38 1 4 3 2 2 4 5 2 gully 2 gullible 2 gullet 2 Gullah 2 gull 38 1 4 3 2 2 l 4 3 2 gulp 2 gulf 2 gules 38 1 4 3 2 2 4 2 2 guilty 2 guilt 38 1 4 3 2 2 4 2 2 guillotine 2 guillemot 38 1 4 3 2 2 4 3 2 guildsman 2 guildhall 2 guild 38 1 4 3 2 2 dlt 4 2 2 Guilford 2 guile 38 1 4 3 2 2 4 4 2 guidepost 2 guideline 2 guidebook 2 guide 38 1 4 3 2 2 e 4 1 2 guidance 38 1 4 3 2 2 dl 4 5 2 guitar 2 guise 2 guinea 2 guignol 2 Guiana 38 1 4 3 2 2 4 2 2 guesswork 2 guess 38 1 4 3 2 2 s 4 1 2 guest 38 1 4 3 2 2 4 3 2 guerrilla 2 guernsey 2 guerdon 38 1 4 3 2 2 rs 4 2 2 Guenther 2 Guelph 38 1 4 3 2 a 2 4 2 2 guardian 2 Guardia 38 1 4 3 2 2 i 4 2 2 guardhouse 2 guard 38 1 4 3 2 nt 2 e 4 1 2 guaranty 38 1 4 3 2 e 2 4 2 2 guaranteeing 2 guarantee 38 1 4 3 2 2 ad 4 0 38 1 4 3 2 2 4 2 2 guanine 2 guanidine 38 1 4 3 2 2 i 4 1 2 guano 38 1 4 3 2 2 nr 4 2 2 Guatemala 2 Guam 38 1 4 3 2 2 aeilmnrsty 4 5 2 guzzle 2 Guggenheim 2 guffaw 2 gubernatorial 2 GU 38 1 4 3 2 2 4 2 2 Grumman 2 grumble 38 1 4 3 2 2 4 2 2 grubby 2 grub 38 1 4 3 2 2 bm 4 4 2 grunt 2 gruff 2 gruesome 2 grudge 38 1 4 3 2 2 4 2 2 grownup 2 grown 38 1 4 3 2 2 n 4 4 2 growing 2 growth 2 growl 2 grow 38 1 4 3 2 e 2 4 3 2 Grover 2 grovel 2 grove 38 1 4 3 2 2 4 3 2 groups 2 groupoid 2 group 38 1 4 3 2 d 2 s 4 2 2 groundwork 2 ground 38 1 4 3 2 2 4 2 2 groundskeep 2 groundsel 38 1 4 3 2 2 np 4 1 2 grout 38 1 4 3 2 2 4 2 2 Groton 2 grotesque 38 1 4 3 2 2 4 3 2 Grossman 2 Grosset 2 gross 38 1 4 3 2 2 s 4 2 2 Grosvenor 2 grosbeak 38 1 4 3 2 2 4 2 2 groove 2 groom 38 1 4 3 2 er 2 4 2 2 grocery 2 grocer 38 1 4 3 2 2 4 2 2 groat 2 groan 38 1 4 3 2 2 acostuvw 4 4 2 grope 2 grommet 2 groin 2 groggy 38 1 4 3 2 zl 2 4 2 2 grizzly 2 grizzle 38 1 4 3 2 2 4 2 2 gritty 2 grit 38 1 4 3 2 2 4 2 2 gristmill 2 grist 38 1 4 3 2 2 t 4 2 2 Griswold 2 grisly 38 1 4 3 2 2 4 3 2 grippe 2 gripe 2 grip 38 1 4 3 2 2 4 2 2 grindstone 2 grind 38 1 4 3 2 2 d 4 1 2 grin 38 1 4 3 2 2 4 2 2 Grimes 2 grime 38 1 4 3 2 2 4 2 2 Grimaldi 2 grimace 38 1 4 3 2 2 ae 4 2 2 Grimm 2 grim 38 1 4 3 2 l 2 4 3 2 grillwork 2 grille 2 grill 38 1 4 3 2 fi 2 4 2 2 Griffith 2 griffin 38 1 4 3 2 2 4 3 2 grievous 2 grieve 2 grievance 38 1 4 3 2 2 v 4 1 2 grief 38 1 4 3 2 2 4 3 2 gridiron 2 griddle 2 grid 38 1 4 3 2 2 deflmnpstz 4 0 38 1 4 3 2 2 4 3 2 greylag 2 greyhound 2 grey 38 1 4 3 2 2 4 2 2 Gretchen 2 Greta 38 1 4 3 2 2 4 3 2 Grenoble 2 Grendel 2 grenade 38 1 4 3 2 2 4 4 2 Gregory 2 Gregg 2 gregarious 2 Greg 38 1 4 3 2 2 4 3 2 greenwood 2 Greenwich 2 greenware 38 1 4 3 2 2 4 2 2 greensward 2 Greensboro 38 1 4 3 2 2 4 2 2 greenery 2 Greene 38 1 4 3 2 2 4 2 2 Greenberg 2 Greenbelt 38 1 4 3 2 2 e 4 2 2 Greenbriar 2 Greenblatt 38 1 4 3 2 2 besw 4 6 2 Greenland 2 greenish 2 greenhouse 2 greengrocer 2 Greenfield 2 green 38 1 4 3 2 2 4 2 2 greedy 2 greed 38 1 4 3 2 2 dn 4 4 2 greet 2 Greer 2 Greek 2 Greece 38 1 4 3 2 2 st 4 0 38 1 4 3 2 2 4 3 2 greater 2 greatcoat 2 great 38 1 4 3 2 2 4 2 2 greasy 2 grease 38 1 4 3 2 2 aegnty 4 5 2 grew 2 Gresham 2 gremlin 2 Grecian 2 grebe 38 1 4 3 2 2 cdfimnpstvyz 4 2 2 graham 2 grab 38 1 4 3 2 2 4 4 2 graywacke 2 Grayson 2 graybeard 2 gray 38 1 4 3 2 2 4 2 2 gravitate 2 gravid 38 1 4 3 2 2 s 4 4 2 graveyard 2 graven 2 gravel 2 grave 38 1 4 3 2 2 4 2 2 gravestone 2 Graves 38 1 4 3 2 2 ei 4 1 2 gravy 38 1 4 3 2 it 2 4 2 2 gratuity 2 gratuitous 38 1 4 3 2 2 4 3 2 gratitude 2 gratis 2 gratify 38 1 4 3 2 2 4 3 2 grater 2 grateful 2 grate 38 1 4 3 2 2 eiu 4 1 2 grata 38 1 4 3 2 2 4 3 2 grassy 2 grassland 2 grass 38 1 4 3 2 2 s 4 1 2 grasp 38 1 4 3 2 2 4 2 2 graphite 2 graphic 38 1 4 3 2 2 i 4 2 2 grapheme 2 graph 38 1 4 3 2 2 4 3 2 grapevine 2 grapefruit 2 grape 38 1 4 3 2 2 eh 4 1 2 grapple 38 1 4 3 2 2 4 2 2 granulate 2 granular 38 1 4 3 2 l 2 a 4 1 2 granule 38 1 4 3 2 2 4 3 2 grantor 2 grantee 2 grant 38 1 4 3 2 t 2 4 2 2 granitic 2 granite 38 1 4 3 2 2 4 2 2 grandstand 2 grandson 38 1 4 3 2 a 2 4 2 2 grandparent 2 grandpa 38 1 4 3 2 2 4 2 2 grandniece 2 grandnephew 38 1 4 3 2 2 4 2 2 grandmother 2 grandma 38 1 4 3 2 2 4 2 2 grandiose 2 grandiloquent 38 1 4 3 2 hild 2 4 2 2 grandchildren 2 grandchild 38 1 4 3 2 2 cimnps 4 4 2 grandfather 2 grandeur 2 granddaughter 2 grand 38 1 4 3 2 2 ditu 4 4 2 Granville 2 granola 2 granny 2 granary 38 1 4 3 2 2 4 2 2 grammarian 2 grammar 38 1 4 3 2 ma 2 r 4 1 2 grammatic 38 1 4 3 2 2 4 2 2 grainy 2 grain 38 1 4 3 2 2 n 4 1 2 grail 38 1 4 3 2 2 4 2 2 graft 2 Graff 38 1 4 3 2 a 2 4 2 2 graduate 2 gradual 38 1 4 3 2 2 u 4 5 2 Grady 2 gradient 2 grade 2 gradate 2 grad 38 1 4 3 2 2 4 2 2 graceful 2 grace 38 1 4 3 2 2 e 4 2 2 grackle 2 gracious 38 1 4 3 2 2 aeiou 4 1 2 gryphon 38 1 4 3 2 ern 2 4 5 2 government 2 governor 2 governess 2 governance 2 govern 38 1 4 3 2 2 4 2 2 gourmet 2 gourd 38 1 4 3 2 2 r 4 5 2 gout 2 Gould 2 gouge 2 Gouda 2 Goucher 38 1 4 3 2 2 4 2 2 Gottfried 2 gotten 38 1 4 3 2 2 4 2 2 Gothic 2 Gotham 38 1 4 3 2 2 ht 4 1 2 got 38 1 4 3 2 2 4 2 2 gossip 2 gossamer 38 1 4 3 2 2 4 2 2 goshawk 2 gosh 38 1 4 3 2 2 hs 4 2 2 gospel 2 gosling 38 1 4 3 2 2 4 2 2 gorgeous 2 gorge 38 1 4 3 2 2 e 4 1 2 gorgon 38 1 4 3 2 2 4 2 2 Goren 2 gore 38 1 4 3 2 2 4 2 2 Gordon 2 Gordian 38 1 4 3 2 2 deg 4 7 2 gorbachev 2 gory 2 Gorton 2 gorse 2 Gorky 2 gorilla 2 Gorham 38 1 4 3 2 2 4 2 2 gopher 2 GOP 38 1 4 3 2 e 2 4 2 2 gooseberry 2 goose 38 1 4 3 2 2 4 2 2 goofy 2 goof 38 1 4 3 2 2 4 2 2 Goodyear 2 goody 38 1 4 3 2 i 2 4 2 2 Goodwin 2 goodwill 38 1 4 3 2 2 wy 4 5 2 Goodrich 2 Goodman 2 Goode 2 goodbye 2 good 38 1 4 3 2 2 dfs 4 1 2 goober 38 1 4 3 2 ale 2 4 2 2 Gonzalez 2 Gonzales 38 1 4 3 2 2 z 4 3 2 gong 2 gone 2 gondola 38 1 4 3 2 2 efs 4 4 2 Goldwater 2 Goldman 2 Goldberg 2 gold 38 1 4 3 2 2 4 2 2 Goldstine 2 Goldstein 38 1 4 3 2 2 t 4 1 2 goldsmith 38 1 4 3 2 i 2 4 2 2 goldfish 2 goldfinch 38 1 4 3 2 n 2 4 4 2 goldenseal 2 goldenrod 2 goldeneye 2 golden 38 1 4 3 2 2 d 4 4 2 golly 2 Goliath 2 golf 2 Goleta 38 1 4 3 2 2 4 4 2 gogo 2 Gogh 2 goggle 2 gog 38 1 4 3 2 2 4 2 2 Goethe 2 goes 38 1 4 3 2 i 2 4 2 2 godwit 2 Godwin 38 1 4 3 2 2 4 2 2 godson 2 godsend 38 1 4 3 2 2 4 2 2 Godfrey 2 godfather 38 1 4 3 2 2 4 2 2 goddess 2 Goddard 38 1 4 3 2 2 dfsw 4 5 2 godparent 2 godmother 2 godkin 2 godhead 2 god 38 1 4 3 2 le 2 4 2 2 gobbledygook 2 gobble 38 1 4 3 2 2 b 4 2 2 goblet 2 gob 38 1 4 3 2 2 4 4 2 goat 2 goal 2 goad 2 Goa 38 1 4 3 2 2 abdeglnoprstuv 4 4 2 going 2 gown 2 Goff 2 go 38 1 4 3 2 2 o 4 1 2 gnome 38 1 4 3 2 n 2 4 2 2 gnomonic 2 gnomon 38 1 4 3 2 2 m 4 1 2 gnostic 38 1 4 3 2 2 4 4 2 gnaw 2 gnat 2 gnash 2 gnarl 38 1 4 3 2 2 ao 4 3 2 gnu 2 GNP 2 gneiss 38 1 4 3 2 2 4 2 2 GMT 2 GM 38 1 4 3 2 2 eo 4 1 2 glycine 38 1 4 3 2 2 4 2 2 glycol 2 glycogen 38 1 4 3 2 r 2 i 4 1 2 glycerol 38 1 4 3 2 2 n 4 1 2 glyceride 38 1 4 3 2 2 4 3 2 glycerine 2 glycerinate 2 glycerin 38 1 4 3 2 2 c 4 1 2 glyph 38 1 4 3 2 2 4 2 2 glutamic 2 glutamine 38 1 4 3 2 m 2 i 4 1 2 glutamate 38 1 4 3 2 2 a 4 3 2 glutton 2 glutinous 2 glut 38 1 4 3 2 2 4 2 2 gluey 2 glue 38 1 4 3 2 2 et 4 2 2 glum 2 glucose 38 1 4 3 2 t 2 4 2 2 glottis 2 glottal 38 1 4 3 2 s 2 4 4 2 glossy 2 glossolalia 2 glossary 2 gloss 38 1 4 3 2 2 a 4 2 2 glorious 2 glorify 38 1 4 3 2 2 4 2 2 Gloriana 2 Gloria 38 1 4 3 2 2 i 4 1 2 glory 38 1 4 3 2 m 2 4 2 2 gloomy 2 gloom 38 1 4 3 2 2 4 2 2 glomerular 2 glom 38 1 4 3 2 l 2 4 3 2 globulin 2 globule 2 globular 38 1 4 3 2 2 u 4 3 2 globe 2 global 2 glob 38 1 4 3 2 2 bmorst 4 4 2 glow 2 glove 2 Gloucester 2 gloat 38 1 4 3 2 2 4 2 2 glitter 2 glitch 38 1 4 3 2 2 4 2 2 glisten 2 glissade 38 1 4 3 2 2 4 2 2 glimpse 2 glimmer 38 1 4 3 2 2 4 2 2 glide 2 Glidden 38 1 4 3 2 2 dmst 4 2 2 glint 2 glib 38 1 4 3 2 a 2 4 2 2 Glendale 2 Glenda 38 1 4 3 2 2 d 4 2 2 Glenn 2 glen 38 1 4 3 2 2 4 2 2 gleeful 2 glee 38 1 4 3 2 2 4 3 2 Gleason 2 glean 2 gleam 38 1 4 3 2 2 aen 4 0 38 1 4 3 2 2 cdmnsu 4 2 2 glaze 2 glare 38 1 4 3 2 co 2 4 2 2 glaucous 2 glaucoma 38 1 4 3 2 2 4 2 2 glasswort 2 glassware 38 1 4 3 2 2 w 4 3 2 glassy 2 glassine 2 glass 38 1 4 3 2 2 s 4 3 2 glasnost 2 Glaswegian 2 Glasgow 38 1 4 3 2 2 4 2 2 glandular 2 gland 38 1 4 3 2 2 d 4 2 2 glans 2 glance 38 1 4 3 2 2 4 2 2 glamorous 2 glamor 38 1 4 3 2 o 2 r 4 1 2 glamour 38 1 4 3 2 2 4 2 2 gladiolus 2 gladiator 38 1 4 3 2 2 4 2 2 gladdy 2 gladden 38 1 4 3 2 2 di 4 4 2 Gladys 2 Gladstone 2 glade 2 glad 38 1 4 3 2 i 2 a 4 2 2 glacis 2 glacier 38 1 4 3 2 2 4 2 2 glaciate 2 glacial 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 e 4 1 2 giving 38 1 4 3 2 2 4 2 2 Giuseppe 2 Giuliano 38 1 4 3 2 2 4 2 2 girlish 2 girlie 38 1 4 3 2 2 i 4 1 2 girl 38 1 4 3 2 2 4 2 2 girdle 2 gird 38 1 4 3 2 2 dl 4 2 2 girth 2 giraffe 38 1 4 3 2 2 4 2 2 Ginsburg 2 Ginsberg 38 1 4 3 2 2 b 4 1 2 ginseng 38 1 4 3 2 2 4 3 2 gingko 2 gingham 2 ginger 38 1 4 3 2 2 gs 4 6 2 Gino 2 Ginn 2 ginmill 2 ginkgo 2 Gina 2 gin 38 1 4 3 2 2 4 2 2 Gimbel 2 gimbal 38 1 4 3 2 2 b 4 1 2 gimpy 38 1 4 3 2 2 4 2 2 Gillette 2 Gillespie 38 1 4 3 2 2 e 4 2 2 Gilligan 2 gill 38 1 4 3 2 2 4 2 2 Giles 2 Gilead 38 1 4 3 2 ert 2 4 2 2 Gilbertson 2 gilbert 38 1 4 3 2 2 bel 4 6 2 gilt 2 Gilmore 2 gild 2 Gilchrist 2 gila 2 Gil 38 1 4 3 2 2 4 2 2 giggle 2 gigging 38 1 4 3 2 2 4 5 2 gigawatt 2 gigavolt 2 gigantic 2 gigahertz 2 gigacycle 38 1 4 3 2 2 ag 4 1 2 gig 38 1 4 3 2 2 4 2 2 gift 2 Gifford 38 1 4 3 2 2 4 2 2 giddy 2 giddap 38 1 4 3 2 2 d 4 1 2 Gideon 38 1 4 3 2 2 eo 4 2 2 gibby 2 Gibbs 38 1 4 3 2 2 4 2 2 gibbous 2 gibbon 38 1 4 3 2 2 4 2 2 gibbet 2 gibberish 38 1 4 3 2 2 b 4 4 2 Gibson 2 Gibraltar 2 giblet 2 gibe 38 1 4 3 2 2 n 4 1 2 Giacomo 38 1 4 3 2 t 2 4 2 2 giantess 2 giant 38 1 4 3 2 2 abdfglmnruv 4 2 2 gist 2 Giovanni 38 1 4 3 2 l 2 4 2 2 ghoulish 2 ghoul 38 1 4 3 2 2 u 4 1 2 ghost 38 1 4 3 2 2 4 3 2 ghetto 2 gherkin 2 Ghent 38 1 4 3 2 2 4 2 2 ghastly 2 Ghana 38 1 4 3 2 2 aeo 4 0 38 1 4 3 2 2 y 4 1 2 getting 38 1 4 3 2 2 t 4 3 2 gets 2 getaway 2 get 38 1 4 3 2 2 4 2 2 Gestapo 2 gestalt 38 1 4 3 2 t 2 a 4 2 2 gesture 2 gesticulate 38 1 4 3 2 2 4 2 2 gerundive 2 gerundial 38 1 4 3 2 nd 2 i 4 1 2 gerund 38 1 4 3 2 a 2 4 2 2 germinate 2 germinal 38 1 4 3 2 id 2 4 2 2 germicide 2 germicidal 38 1 4 3 2 2 cn 4 0 38 1 4 3 2 2 4 2 2 germanium 2 Germanic 38 1 4 3 2 n 2 i 4 4 2 Germany 2 Germantown 2 germane 2 German 38 1 4 3 2 2 ai 4 1 2 germ 38 1 4 3 2 ard 2 4 2 2 Gerhardt 2 Gerhard 38 1 4 3 2 2 4 2 2 gerbil 2 Gerber 38 1 4 3 2 2 l 4 2 2 Gerard 2 geranium 38 1 4 3 2 d 2 4 2 2 Geraldine 2 Gerald 38 1 4 3 2 2 abhmu 4 4 2 Gertrude 2 Gershwin 2 Gerry 2 geriatric 38 1 4 3 2 2 4 2 2 Georgetown 2 George 38 1 4 3 2 g 2 e 4 1 2 Georgia 38 1 4 3 2 ysic 2 4 2 2 geophysics 2 geophysical 38 1 4 3 2 2 h 4 1 2 geopolitic 38 1 4 3 2 et 2 4 2 2 geometrician 2 geometer 38 1 4 3 2 raph 2 4 2 2 geography 2 geographer 38 1 4 3 2 2 s 4 1 2 geodetic 38 1 4 3 2 2 4 2 2 geodesy 2 geodesic 38 1 4 3 2 2 e 4 1 2 geoduck 38 1 4 3 2 2 h 4 1 2 geocentric 38 1 4 3 2 mi 2 4 2 2 geochemistry 2 geochemical 38 1 4 3 2 2 e 4 1 2 geochronology 38 1 4 3 2 2 cdgmpr 4 2 2 geology 2 Geoffrey 38 1 4 3 2 2 4 2 2 genus 2 genuine 38 1 4 3 2 2 4 2 2 gentlemen 2 gentleman 38 1 4 3 2 e 2 m 4 1 2 gentle 38 1 4 3 2 2 4 2 2 gentility 2 gentile 38 1 4 3 2 2 l 4 1 2 gentian 38 1 4 3 2 2 il 4 3 2 gentry 2 genteel 2 gent 38 1 4 3 2 2 4 2 2 genotype 2 Genoa 38 1 4 3 2 2 4 2 2 genitive 2 genital 38 1 4 3 2 2 t 4 4 2 genius 2 genii 2 genie 2 genial 38 1 4 3 2 2 4 2 2 Genevieve 2 Geneva 38 1 4 3 2 2 4 2 2 genesis 2 Genesco 38 1 4 3 2 2 4 2 2 generous 2 generosity 38 1 4 3 2 2 lt 4 1 2 genera 38 1 4 3 2 2 ao 4 1 2 generic 38 1 4 3 2 2 rsv 4 3 2 genetic 2 genealogy 2 gene 38 1 4 3 2 2 eiotu 4 2 2 genre 2 gender 38 1 4 3 2 n 2 4 2 2 Gemini 2 geminate 38 1 4 3 2 2 i 4 3 2 gemstone 2 Gemma 2 gem 38 1 4 3 2 in 2 4 3 2 gelatinous 2 gelatine 2 gelatin 38 1 4 3 2 2 t 4 1 2 gelable 38 1 4 3 2 2 a 4 2 2 geld 2 gel 38 1 4 3 2 2 4 2 2 Geigy 2 Geiger 38 1 4 3 2 2 g 4 1 2 geisha 38 1 4 3 2 2 4 2 2 geese 2 gee 38 1 4 3 2 2 eilmnorst 4 5 2 geyser 2 Gegenschein 2 gecko 2 gear 2 GE 38 1 4 3 2 e 2 4 3 2 gazette 2 gazelle 2 gaze 38 1 4 3 2 2 4 2 2 Gaylord 2 gay 38 1 4 3 2 k 2 4 2 2 gawky 2 gawk 38 1 4 3 2 2 4 2 2 gavel 2 gave 38 1 4 3 2 2 e 4 2 2 gavotte 2 Gavin 38 1 4 3 2 s 2 4 2 2 Gaussian 2 gauss 38 1 4 3 2 t 2 4 2 2 gauntlet 2 gaunt 38 1 4 3 2 2 4 3 2 Gaulle 2 gauleiter 2 Gaul 38 1 4 3 2 2 4 2 2 gaugeable 2 gauge 38 1 4 3 2 2 e 4 1 2 Gauguin 38 1 4 3 2 he 2 4 2 2 gaucherie 2 gauche 38 1 4 3 2 2 cglns 4 3 2 gauze 2 gaur 2 gaudy 38 1 4 3 2 2 4 3 2 gateway 2 Gates 2 gate 38 1 4 3 2 2 e 4 3 2 gator 2 Gatlinburg 2 gather 38 1 4 3 2 om 2 4 2 2 gastronomy 2 gastronome 38 1 4 3 2 o 2 n 4 1 2 gastrointestinal 38 1 4 3 2 2 r 4 1 2 Gaston 38 1 4 3 2 2 4 2 2 Gaspee 2 gasp 38 1 4 3 2 2 pt 4 9 2 gassy 2 gasoline 2 gaslight 2 gasket 2 gasify 2 gash 2 gaseous 2 Gascony 2 gas 38 1 4 3 2 2 4 2 2 Garth 2 garter 38 1 4 3 2 son 2 4 2 2 Garrisonian 2 garrison 38 1 4 3 2 2 i 4 3 2 Garry 2 garrulous 2 Garrett 38 1 4 3 2 e 2 4 2 2 garnet 2 garner 38 1 4 3 2 2 4 2 2 garlic 2 garland 38 1 4 3 2 2 4 2 2 garish 2 Garibaldi 38 1 4 3 2 2 4 2 2 gargle 2 gargantuan 38 1 4 3 2 n 2 4 2 2 gardenia 2 garden 38 1 4 3 2 2 e 4 1 2 Gardner 38 1 4 3 2 2 4 3 2 garble 2 garbage 2 garb 38 1 4 3 2 2 bdgilnrt 4 6 2 Gary 2 Garvey 2 Garfield 2 Garcia 2 garage 2 gar 38 1 4 3 2 2 4 2 2 gape 2 gap 38 1 4 3 2 2 4 2 2 gantry 2 gantlet 38 1 4 3 2 et 2 4 2 2 Gannett 2 gannet 38 1 4 3 2 2 4 2 2 ganglion 2 gangling 38 1 4 3 2 2 i 4 1 2 gangland 38 1 4 3 2 2 l 4 5 2 gangway 2 gangster 2 gangplank 2 Ganges 2 gang 38 1 4 3 2 2 gnt 4 2 2 Ganymede 2 gander 38 1 4 3 2 2 4 3 2 games 2 gamecock 2 game 38 1 4 3 2 2 4 2 2 gambit 2 Gambia 38 1 4 3 2 2 i 4 2 2 gambol 2 gamble 38 1 4 3 2 2 be 4 4 2 gamut 2 gamma 2 gamin 2 gam 38 1 4 3 2 n 2 i 4 1 2 galvanometer 38 1 4 3 2 2 4 2 2 galvanism 2 galvanic 38 1 4 3 2 2 a 4 1 2 Galveston 38 1 4 3 2 2 4 2 2 gallus 2 Gallup 38 1 4 3 2 2 4 2 2 gallows 2 Galloway 38 1 4 3 2 2 4 2 2 gallonage 2 gallon 38 1 4 3 2 2 nw 4 1 2 gallop 38 1 4 3 2 2 4 3 2 gallivant 2 gallium 2 gallinule 38 1 4 3 2 2 4 2 2 galley 2 gallery 38 1 4 3 2 t 2 4 2 2 gallantry 2 gallant 38 1 4 3 2 2 n 4 1 2 Gallagher 38 1 4 3 2 2 aeiou 4 3 2 gallstone 2 gallberry 2 gall 38 1 4 3 2 2 4 3 2 galenite 2 galena 2 Galen 38 1 4 3 2 2 n 4 1 2 gale 38 1 4 3 2 2 4 2 2 Galatia 2 Galatea 38 1 4 3 2 t 2 4 2 2 galactose 2 galactic 38 1 4 3 2 2 ct 4 3 2 galaxy 2 Galapagos 2 gala 38 1 4 3 2 2 aelv 4 6 2 Galway 2 Galt 2 Galois 2 Galilee 2 Galbreath 2 gal 38 1 4 3 2 2 4 2 2 Gaithersburg 2 gait 38 1 4 3 2 s 2 4 2 2 Gainesville 2 Gaines 38 1 4 3 2 2 e 4 2 2 gainful 2 gain 38 1 4 3 2 2 4 2 2 gaillardia 2 Gail 38 1 4 3 2 2 lnt 4 1 2 gaiety 38 1 4 3 2 2 4 2 2 gaggle 2 gagging 38 1 4 3 2 2 g 4 3 2 gagwriter 2 gage 2 gag 38 1 4 3 2 f 2 4 2 2 gaffe 2 gaff 38 1 4 3 2 et 2 4 2 2 gadgetry 2 gadget 38 1 4 3 2 2 g 4 4 2 gadwall 2 gadolinium 2 gadfly 2 gad 38 1 4 3 2 iel 2 4 2 2 Gabrielle 2 Gabriel 38 1 4 3 2 2 4 2 2 gabbro 2 gabble 38 1 4 3 2 2 br 4 5 2 Gabon 2 gable 2 Gaberones 2 gabardine 2 gab 38 1 4 3 2 2 bdfgilmnprstuvwyz 4 3 2 GAO 2 Gaelic 2 GA 38 1 4 3 2 2 aehilMnoruwy 4 4 2 GSA 2 g's 2 GPO 2 g 38 1 4 3 2 z 2 4 2 2 fuzzy 2 fuzz 38 1 4 3 2 2 4 2 2 future 2 futile 38 1 4 3 2 2 4 2 2 fussy 2 fuss 38 1 4 3 2 2 4 4 2 fusion 2 fusillade 2 fusiform 2 fusible 38 1 4 3 2 2 4 2 2 fuselage 2 fuse 38 1 4 3 2 2 eis 4 1 2 fusty 38 1 4 3 2 e 2 r 4 1 2 furthest 38 1 4 3 2 2 m 4 1 2 further 38 1 4 3 2 o 2 4 2 2 furthermost 2 furthermore 38 1 4 3 2 2 h 4 1 2 furtive 38 1 4 3 2 2 4 3 2 furry 2 furrow 2 furrier 38 1 4 3 2 2 4 2 2 furniture 2 furnish 38 1 4 3 2 2 i 4 1 2 furnace 38 1 4 3 2 2 4 2 2 furlough 2 furlong 38 1 4 3 2 2 o 4 1 2 furl 38 1 4 3 2 2 lnrt 4 6 2 furze 2 fury 2 Furman 2 furious 2 furbish 2 fur 38 1 4 3 2 2 4 2 2 funny 2 funnel 38 1 4 3 2 2 4 3 2 fungicide 2 fungible 2 fungi 38 1 4 3 2 2 i 4 3 2 fungus 2 fungoid 2 fungal 38 1 4 3 2 r 2 4 2 2 funereal 2 funeral 38 1 4 3 2 2 4 3 2 funds 2 fundamental 2 fund 38 1 4 3 2 r 2 4 2 2 functorial 2 functor 38 1 4 3 2 on 2 a 4 2 2 functions 2 function 38 1 4 3 2 t 2 io 4 0 38 1 4 3 2 2 cdegn 4 2 2 funk 2 fun 38 1 4 3 2 ga 2 4 2 2 fumigate 2 fumigant 38 1 4 3 2 2 i 4 3 2 fume 2 fumble 2 fum 38 1 4 3 2 2 4 4 2 fully 2 Fullerton 2 fullback 2 full 38 1 4 3 2 2 l 4 5 2 Fulton 2 fulsome 2 fulminate 2 fulfill 2 fulcrum 38 1 4 3 2 i 2 4 2 2 Fujitsu 2 Fuji 38 1 4 3 2 2 4 3 2 fugue 2 fugitive 2 fugal 38 1 4 3 2 2 hk 4 0 38 1 4 3 2 2 cgjlmnrstz 4 2 2 fuel 2 fudge 38 1 4 3 2 2 4 2 2 FTC 2 Ft 38 1 4 3 2 2 4 2 2 Frye 2 fry 38 1 4 3 2 ate 2 4 2 2 frustrater 2 frustrate 38 1 4 3 2 t 2 r 4 1 2 frustum 38 1 4 3 2 t 2 4 3 2 fruition 2 fruitful 2 fruit 38 1 4 3 2 2 is 4 3 2 frugal 2 Fruehauf 2 fructose 38 1 4 3 2 e 2 4 2 2 frozen 2 froze 38 1 4 3 2 2 4 2 2 frowzy 2 frown 38 1 4 3 2 h 2 4 2 2 frothy 2 froth 38 1 4 3 2 it 2 4 2 2 frostbitten 2 frostbite 38 1 4 3 2 t 2 b 4 2 2 frosty 2 frost 38 1 4 3 2 m 2 4 2 2 frontiersmen 2 frontiersman 38 1 4 3 2 er 2 s 4 1 2 frontier 38 1 4 3 2 2 4 2 2 frontal 2 frontage 38 1 4 3 2 t 2 ai 4 1 2 front 38 1 4 3 2 2 nstwz 4 5 2 from 2 frolic 2 frog 2 frock 2 fro 38 1 4 3 2 ol 2 4 2 2 frivolous 2 frivolity 38 1 4 3 2 2 4 3 2 Fritz 2 fritter 2 fritillary 38 1 4 3 2 l 2 4 2 2 frilly 2 frill 38 1 4 3 2 d 2 4 2 2 Frigidaire 2 frigid 38 1 4 3 2 t 2 4 3 2 frightful 2 frighten 2 fright 38 1 4 3 2 2 hi 4 2 2 Frigga 2 frigate 38 1 4 3 2 2 4 2 2 Friedrich 2 Friedman 38 1 4 3 2 2 dn 4 1 2 frieze 38 1 4 3 2 2 4 3 2 friction 2 Frick 2 fricative 38 1 4 3 2 2 4 2 2 friar 2 friable 38 1 4 3 2 2 acegltvsd 4 2 2 frizzle 2 fringe 38 1 4 3 2 2 4 2 2 Freya 2 Frey 38 1 4 3 2 d 2 4 2 2 Freudian 2 Freud 38 1 4 3 2 2 4 2 2 Fresno 2 Fresnel 38 1 4 3 2 2 4 2 2 freshmen 2 freshman 38 1 4 3 2 2 m 4 3 2 freshwater 2 freshen 2 fresh 38 1 4 3 2 o 2 4 2 2 frescoes 2 fresco 38 1 4 3 2 2 chn 4 0 38 1 4 3 2 h 2 m 4 1 2 French 38 1 4 3 2 2 4 2 2 Frenchmen 2 Frenchman 38 1 4 3 2 2 c 4 2 2 frenzy 2 frenetic 38 1 4 3 2 2 4 2 2 freewheel 2 freeway 38 1 4 3 2 2 4 2 2 Freetown 2 freethink 38 1 4 3 2 2 4 2 2 freemen 2 freeman 38 1 4 3 2 2 4 2 2 freehold 2 freehand 38 1 4 3 2 2 4 2 2 freedmen 2 Freedman 38 1 4 3 2 2 m 4 1 2 freedom 38 1 4 3 2 2 dhmtw 4 6 2 freeze 2 freestone 2 Freeport 2 freeing 2 freeboot 2 free 38 1 4 3 2 2 4 2 2 Fredericksburg 2 Frederick 38 1 4 3 2 ric 2 k 4 2 2 Fredericton 2 Frederic 38 1 4 3 2 2 4 2 2 Freddy 2 Freddie 38 1 4 3 2 2 de 4 3 2 Fredrickson 2 Fredholm 2 Fred 38 1 4 3 2 k 2 4 2 2 freakish 2 freak 38 1 4 3 2 2 adensuy 4 5 2 fret 2 frequent 2 freon 2 freight 2 freckle 38 1 4 3 2 2 cgimntuz 4 2 2 fray 2 Fraser 38 1 4 3 2 2 4 2 2 frazzle 2 Frazier 38 1 4 3 2 2 4 2 2 fraudulent 2 fraud 38 1 4 3 2 2 d 4 2 2 fraught 2 Frau 38 1 4 3 2 ern 2 4 2 2 fraternity 2 fraternal 38 1 4 3 2 rt 2 4 2 2 frankfurter 2 Frankfurt 38 1 4 3 2 2 u 4 1 2 Frankfort 38 1 4 3 2 2 f 4 3 2 franklin 2 Frankel 2 frank 38 1 4 3 2 2 4 2 2 Francoise 2 franco 38 1 4 3 2 2 4 2 2 Francisco 2 Franciscan 38 1 4 3 2 2 c 4 1 2 Francis 38 1 4 3 2 2 s 4 2 2 francium 2 Francine 38 1 4 3 2 2 4 2 2 Frances 2 France 38 1 4 3 2 2 eio 4 3 2 franchise 2 franca 2 franc 38 1 4 3 2 2 ck 4 4 2 Franz 2 frantic 2 frangipani 2 Fran 38 1 4 3 2 2 4 2 2 framework 2 frame 38 1 4 3 2 2 e 4 1 2 frambesia 38 1 4 3 2 l 2 4 2 2 frailty 2 frail 38 1 4 3 2 2 4 2 2 fragmentation 2 fragmentary 38 1 4 3 2 ent 2 a 4 1 2 fragment 38 1 4 3 2 2 m 4 2 2 fragrant 2 fragile 38 1 4 3 2 t 2 i 4 1 2 fracture 38 1 4 3 2 o 2 n 4 1 2 fractious 38 1 4 3 2 2 4 2 2 fractionate 2 fraction 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 4 2 2 foxhound 2 foxhole 38 1 4 3 2 2 o 4 1 2 Foxhall 38 1 4 3 2 2 h 4 4 2 foxy 2 foxtail 2 foxglove 2 fox 38 1 4 3 2 en 2 4 2 2 fourteenth 2 fourteen 38 1 4 3 2 2 e 4 1 2 fourth 38 1 4 3 2 2 4 2 2 foursquare 2 foursome 38 1 4 3 2 2 st 4 3 2 Fourier 2 fourfold 2 four 38 1 4 3 2 in 2 4 2 2 fountainhead 2 fountain 38 1 4 3 2 2 a 4 1 2 fount 38 1 4 3 2 2 4 4 2 foundry 2 foundling 2 foundation 2 found 38 1 4 3 2 2 dt 4 0 38 1 4 3 2 2 4 2 2 foulmouth 2 foul 38 1 4 3 2 2 lnr 4 1 2 fought 38 1 4 3 2 er 2 4 2 2 fosterite 2 foster 38 1 4 3 2 2 i 4 1 2 Foss 38 1 4 3 2 l 2 4 2 2 fossiliferous 2 fossil 38 1 4 3 2 2 st 4 0 38 1 4 3 2 2 4 2 2 fortune 2 fortunate 38 1 4 3 2 2 n 4 1 2 fortuitous 38 1 4 3 2 2 4 2 2 fortress 2 fortran 38 1 4 3 2 2 4 5 2 fortitude 2 fortiori 2 fortin 2 fortify 2 fortieth 38 1 4 3 2 2 4 4 2 forthwith 2 forthright 2 forthcome 2 forth 38 1 4 3 2 2 4 2 2 Fortescue 2 forte 38 1 4 3 2 2 ehiru 4 3 2 forty 2 fortnight 2 fort 38 1 4 3 2 ke 2 4 2 2 forsaken 2 forsake 38 1 4 3 2 2 a 4 3 2 Forsythe 2 forswear 2 forsook 38 1 4 3 2 la 2 4 4 2 formulate 2 formulaic 2 formulae 2 formula 38 1 4 3 2 2 4 2 2 Formica 2 formic 38 1 4 3 2 2 c 4 1 2 formidable 38 1 4 3 2 2 4 2 2 formatting 2 formatted 38 1 4 3 2 2 t 4 2 2 formate 2 format 38 1 4 3 2 2 4 2 2 formaldehyde 2 formal 38 1 4 3 2 2 lt 4 1 2 formant 38 1 4 3 2 2 aiue 4 3 2 forms 2 Formosa 2 form 38 1 4 3 2 2 4 2 2 forklift 2 fork 38 1 4 3 2 t 2 4 2 2 forgotten 2 forgot 38 1 4 3 2 ve 2 4 2 2 forgiven 2 forgive 38 1 4 3 2 2 4 2 2 forgetting 2 forgettable 38 1 4 3 2 2 t 4 2 2 forgetful 2 forget 38 1 4 3 2 2 t 4 2 2 forgery 2 forge 38 1 4 3 2 2 eio 4 1 2 forgave 38 1 4 3 2 t 2 4 2 2 forfeiture 2 forfeit 38 1 4 3 2 e 2 i 4 1 2 forfend 38 1 4 3 2 t 2 4 2 2 forestry 2 forest 38 1 4 3 2 2 s 4 4 2 forever 2 forensic 2 foreign 2 fore 38 1 4 3 2 2 4 2 2 Fordham 2 ford 38 1 4 3 2 2 4 3 2 forces 2 forceful 2 force 38 1 4 3 2 2 e 4 1 2 forcible 38 1 4 3 2 r 2 4 2 2 forborne 2 forbore 38 1 4 3 2 2 4 2 2 forbidding 2 forbidden 38 1 4 3 2 d 2 d 4 1 2 forbid 38 1 4 3 2 r 2 4 2 2 forbearance 2 forbear 38 1 4 3 2 2 a 4 1 2 Forbes 38 1 4 3 2 2 eio 4 1 2 forbade 38 1 4 3 2 2 4 2 2 foray 2 forage 38 1 4 3 2 2 abcdefgkmst 4 4 2 forward 2 forum 2 forlorn 2 for 38 1 4 3 2 2 4 2 2 foppish 2 fop 38 1 4 3 2 2 4 2 2 footwork 2 footwear 38 1 4 3 2 t 2 4 2 2 footstool 2 footstep 38 1 4 3 2 2 4 2 2 footpath 2 footpad 38 1 4 3 2 2 a 4 1 2 footprint 38 1 4 3 2 2 4 2 2 footmen 2 footman 38 1 4 3 2 2 4 2 2 footbridge 2 football 38 1 4 3 2 2 bmpswe 4 5 2 footnote 2 foothill 2 footfall 2 footage 2 foot 38 1 4 3 2 2 4 5 2 fooled 2 foolproof 2 foolish 2 foolhardy 2 fool 38 1 4 3 2 2 4 2 2 foodstuff 2 food 38 1 4 3 2 2 dlt 4 0 38 1 4 3 2 ine 2 4 2 2 Fontainebleau 2 Fontaine 38 1 4 3 2 2 a 4 1 2 font 38 1 4 3 2 2 4 2 2 fondle 2 fond 38 1 4 3 2 2 dt 4 0 38 1 4 3 2 w 2 e 4 2 2 following 2 follow 38 1 4 3 2 c 2 4 2 2 follicular 2 follicle 38 1 4 3 2 2 io 4 1 2 folly 38 1 4 3 2 2 4 2 2 folksy 2 folksong 38 1 4 3 2 2 s 4 2 2 folklore 2 folk 38 1 4 3 2 2 4 2 2 foliate 2 foliage 38 1 4 3 2 2 a 4 1 2 folio 38 1 4 3 2 2 4 2 2 foldout 2 fold 38 1 4 3 2 2 dikl 4 1 2 Foley 38 1 4 3 2 2 4 3 2 foist 2 foil 2 foible 38 1 4 3 2 2 4 2 2 foggy 2 fogging 38 1 4 3 2 2 g 4 3 2 fogy 2 Fogarty 2 fog 38 1 4 3 2 s 2 4 2 2 focussed 2 focus 38 1 4 3 2 2 u 4 2 2 foci 2 focal 38 1 4 3 2 2 m 4 1 2 foal 38 1 4 3 2 2 4 3 2 foamy 2 foamflower 2 foam 38 1 4 3 2 2 acgilnoprsux 4 7 2 foyer 2 fowl 2 fovea 2 Fomalhaut 2 foe 2 fodder 2 fob 38 1 4 3 2 2 4 2 2 FMC 2 FM 38 1 4 3 2 2 4 5 2 flyway 2 Flynn 2 flyer 2 flycatcher 2 fly 38 1 4 3 2 2 4 2 2 flutter 2 flute 38 1 4 3 2 2 4 2 2 fluster 2 flush 38 1 4 3 2 2 4 2 2 fluoride 2 fluoridate 38 1 4 3 2 2 d 4 2 2 fluorite 2 fluorine 38 1 4 3 2 sce 2 4 3 2 fluorescent 2 fluorescein 2 fluoresce 38 1 4 3 2 r 2 ei 4 2 2 fluorspar 2 fluorocarbon 38 1 4 3 2 f 2 4 2 2 fluffy 2 fluff 38 1 4 3 2 2 4 2 2 fluent 2 flue 38 1 4 3 2 2 efost 4 8 2 flux 2 flurry 2 flung 2 fluke 2 fluid 2 fluctuate 2 flub 2 flu 38 1 4 3 2 r 2 4 2 2 flowery 2 flowerpot 38 1 4 3 2 2 e 4 3 2 flown 2 flowchart 2 flow 38 1 4 3 2 2 4 3 2 floury 2 flourish 2 flour 38 1 4 3 2 2 4 2 2 flounder 2 flounce 38 1 4 3 2 2 nr 4 1 2 flout 38 1 4 3 2 2 4 2 2 flotilla 2 flotation 38 1 4 3 2 2 4 3 2 Floridian 2 Florida 2 florid 38 1 4 3 2 2 d 4 3 2 florist 2 florin 2 florican 38 1 4 3 2 n 2 4 2 2 Florentine 2 Florence 38 1 4 3 2 2 4 2 2 floral 2 flora 38 1 4 3 2 2 aei 4 0 38 1 4 3 2 2 4 2 2 floppy 2 flop 38 1 4 3 2 2 4 2 2 floorboard 2 floor 38 1 4 3 2 2 l 4 2 2 floodgate 2 flood 38 1 4 3 2 i 2 4 2 2 floodlit 2 floodlight 38 1 4 3 2 2 dr 4 0 38 1 4 3 2 2 4 2 2 flogging 2 flog 38 1 4 3 2 2 4 3 2 flock 2 flocculate 2 floc 38 1 4 3 2 2 cgoprtuw 4 4 2 Floyd 2 floe 2 float 2 Flo 38 1 4 3 2 tio 2 4 2 2 flirtatious 2 flirtation 38 1 4 3 2 t 2 a 4 1 2 flirt 38 1 4 3 2 2 4 3 2 flippant 2 flipflop 2 flip 38 1 4 3 2 2 4 3 2 flinty 2 flintlock 2 flint 38 1 4 3 2 2 t 4 2 2 fling 2 flinch 38 1 4 3 2 2 nprc 4 3 2 flit 2 flimsy 2 flight 38 1 4 3 2 r 2 4 2 2 flexure 2 flexural 38 1 4 3 2 2 u 4 2 2 flexible 2 flex 38 1 4 3 2 ch 2 4 2 2 Fletcher 2 fletch 38 1 4 3 2 h 2 4 2 2 fleshy 2 flesh 38 1 4 3 2 i 2 4 2 2 flemish 2 Fleming 38 1 4 3 2 2 4 4 2 fleet 2 fleeing 2 fleece 2 flee 38 1 4 3 2 2 4 2 2 fledgling 2 fledge 38 1 4 3 2 2 g 4 1 2 fled 38 1 4 3 2 2 4 3 2 fleawort 2 fleabane 2 flea 38 1 4 3 2 2 ademstx 4 2 2 flew 2 fleck 38 1 4 3 2 2 4 3 2 flaxseed 2 flaxen 2 flax 38 1 4 3 2 2 4 2 2 flautist 2 flaunt 38 1 4 3 2 2 4 2 2 flatus 2 flatulent 38 1 4 3 2 e 2 4 2 2 flattery 2 flatten 38 1 4 3 2 2 tu 4 6 2 flatworm 2 flatland 2 flatiron 2 flathead 2 flatbed 2 flat 38 1 4 3 2 2 4 4 2 flashy 2 flashlight 2 flashback 2 flash 38 1 4 3 2 2 h 4 1 2 flask 38 1 4 3 2 2 4 5 2 flannel 2 flank 2 flange 2 Flanders 2 Flanagan 38 1 4 3 2 2 4 5 2 flammable 2 flamingo 2 flame 2 flamboyant 2 flam 38 1 4 3 2 2 4 3 2 flaky 2 flake 2 flak 38 1 4 3 2 2 4 2 2 flair 2 flail 38 1 4 3 2 t 2 4 2 2 flagstone 2 Flagstaff 38 1 4 3 2 2 4 2 2 flageolet 2 flagellate 38 1 4 3 2 2 es 4 5 2 flagrant 2 flagpole 2 Flagler 2 flagging 2 flag 38 1 4 3 2 2 gikmnstux 4 5 2 flaw 2 flare 2 flap 2 flack 2 flabbergast 38 1 4 3 2 2 aeiouy 4 1 2 FL 38 1 4 3 2 2 4 2 2 fizzle 2 Fizeau 38 1 4 3 2 2 4 4 2 fixed 2 fixture 2 fixate 2 fix 38 1 4 3 2 e 2 4 2 2 fivefold 2 five 38 1 4 3 2 2 4 3 2 Fitzroy 2 Fitzpatrick 2 Fitzgerald 38 1 4 3 2 h 2 4 2 2 Fitchburg 2 Fitch 38 1 4 3 2 2 cz 4 2 2 fitful 2 fit 38 1 4 3 2 2 4 2 2 fisticuff 2 fist 38 1 4 3 2 2 4 2 2 fission 2 fissile 38 1 4 3 2 2 i 4 1 2 fissure 38 1 4 3 2 2 4 2 2 Fiske 2 Fisk 38 1 4 3 2 2 4 2 2 fishermen 2 fisherman 38 1 4 3 2 r 2 m 4 1 2 fishery 38 1 4 3 2 2 e 4 4 2 fishy 2 fishpond 2 fishmonger 2 fish 38 1 4 3 2 2 h 4 1 2 fiscal 38 1 4 3 2 2 4 2 2 Fischer 2 Fischbein 38 1 4 3 2 2 chkst 4 0 38 1 4 3 2 t 2 4 2 2 firsthand 2 first 38 1 4 3 2 2 4 3 2 firms 2 firmware 2 firm 38 1 4 3 2 2 4 2 2 firework 2 firewood 38 1 4 3 2 2 o 4 1 2 firewall 38 1 4 3 2 2 4 2 2 Firestone 2 fireside 38 1 4 3 2 2 4 3 2 fireproof 2 firepower 2 fireplace 38 1 4 3 2 2 4 2 2 firemen 2 fireman 38 1 4 3 2 2 4 3 2 firebug 2 firebreak 2 fireboat 38 1 4 3 2 2 bmpsw 4 6 2 firelight 2 firehouse 2 firefly 2 firecracker 2 firearm 2 fire 38 1 4 3 2 2 ems 4 1 2 fir 38 1 4 3 2 2 4 4 2 finny 2 Finnish 2 Finnegan 2 Finn 38 1 4 3 2 2 4 2 2 Finley 2 Finland 38 1 4 3 2 2 s 4 3 2 finite 2 finicky 2 finial 38 1 4 3 2 er 2 4 4 2 fingertip 2 fingerprint 2 fingernail 2 finger 38 1 4 3 2 s 2 4 2 2 finessing 2 finesse 38 1 4 3 2 2 s 4 2 2 finery 2 fine 38 1 4 3 2 2 4 2 2 financier 2 financial 38 1 4 3 2 c 2 i 4 1 2 finance 38 1 4 3 2 2 4 3 2 finally 2 finale 2 final 38 1 4 3 2 2 ln 4 0 38 1 4 3 2 2 aegilnd 4 3 2 fink 2 finch 2 fin 38 1 4 3 2 2 4 2 2 filthy 2 filth 38 1 4 3 2 2 h 4 2 2 filtrate 2 filter 38 1 4 3 2 2 4 5 2 filmy 2 filmstrip 2 filmmake 2 filmdom 2 film 38 1 4 3 2 2 e 4 3 2 filly 2 fillip 2 fill 38 1 4 3 2 2 4 4 2 Filipino 2 filigree 2 filibuster 2 filial 38 1 4 3 2 2 4 2 2 filet 2 file 38 1 4 3 2 ment 2 4 2 2 filamentary 2 filament 38 1 4 3 2 2 aeilmt 4 2 2 filch 2 filbert 38 1 4 3 2 2 4 2 2 figurate 2 figural 38 1 4 3 2 r 2 ae 4 1 2 figurine 38 1 4 3 2 2 u 4 3 2 fight 2 figaro 2 fig 38 1 4 3 2 en 2 4 2 2 fifteenth 2 fifteen 38 1 4 3 2 2 e 4 3 2 fifty 2 fiftieth 2 fifth 38 1 4 3 2 2 t 4 2 2 FIFO 2 fife 38 1 4 3 2 2 4 2 2 fiery 2 fierce 38 1 4 3 2 d 2 4 2 2 fiendish 2 fiend 38 1 4 3 2 d 2 s 4 2 2 fieldwork 2 field 38 1 4 3 2 2 4 2 2 fiefdom 2 fief 38 1 4 3 2 2 flnr 4 1 2 fiesta 38 1 4 3 2 2 4 2 2 fidelity 2 fide 38 1 4 3 2 l 2 e 4 1 2 fiddling 38 1 4 3 2 2 de 4 2 2 fiducial 2 fidget 38 1 4 3 2 i 2 4 3 2 fictive 2 fictitious 2 fiction 38 1 4 3 2 2 t 4 2 2 fickle 2 fiche 38 1 4 3 2 2 4 2 2 fibrous 2 fibrosis 38 1 4 3 2 2 o 4 2 2 fibrin 2 fibration 38 1 4 3 2 r 2 4 2 2 Fiberglas 2 fiberboard 38 1 4 3 2 2 er 4 2 2 Fibonacci 2 fib 38 1 4 3 2 2 n 4 2 2 fiat 2 fiasco 38 1 4 3 2 ce 2 4 2 2 fiancee 2 fiance 38 1 4 3 2 2 abcdeFglnrstvxz 4 0 38 1 4 3 2 er 2 4 2 2 feverish 2 fever 38 1 4 3 2 2 4 2 2 feudatory 2 feudal 38 1 4 3 2 d 2 a 4 1 2 feud 38 1 4 3 2 2 4 2 2 fettle 2 fetter 38 1 4 3 2 2 4 2 2 fetish 2 fetid 38 1 4 3 2 2 it 4 4 2 fetus 2 fete 2 fetch 2 fetal 38 1 4 3 2 v 2 4 2 2 festive 2 festival 38 1 4 3 2 2 i 4 1 2 fest 38 1 4 3 2 2 t 4 1 2 fescue 38 1 4 3 2 2 4 2 2 ferrule 2 ferruginous 38 1 4 3 2 agnet 2 4 2 2 ferromagnetic 2 ferromagnet 38 1 4 3 2 2 m 4 2 2 ferrous 2 ferroelectric 38 1 4 3 2 2 4 3 2 ferrite 2 ferris 2 ferric 38 1 4 3 2 2 4 3 2 ferret 2 Ferrer 2 Ferreira 38 1 4 3 2 2 eiou 4 1 2 ferry 38 1 4 3 2 ci 2 4 2 2 ferocity 2 ferocious 38 1 4 3 2 2 4 3 2 fernery 2 Fernando 2 fern 38 1 4 3 2 2 4 3 2 fermium 2 fermion 2 Fermi 38 1 4 3 2 nt 2 4 2 2 fermentation 2 ferment 38 1 4 3 2 2 ei 4 1 2 Fermat 38 1 4 3 2 2 mnor 4 5 2 fervent 2 fertile 2 Ferguson 2 Ferdinand 2 Ferber 38 1 4 3 2 e 2 4 2 2 fencepost 2 fence 38 1 4 3 2 2 c 4 4 2 fenugreek 2 Fenton 2 fennel 2 fend 38 1 4 3 2 2 4 2 2 feminist 2 feminism 38 1 4 3 2 ni 2 s 4 1 2 feminine 38 1 4 3 2 2 i 4 2 2 femur 2 female 38 1 4 3 2 n 2 4 3 2 felony 2 felonious 2 felon 38 1 4 3 2 2 4 2 2 fellow 2 fell 38 1 4 3 2 2 i 4 1 2 Felice 38 1 4 3 2 2 4 2 2 felicity 2 felicitous 38 1 4 3 2 2 t 4 1 2 Felicia 38 1 4 3 2 2 c 4 2 2 Felix 2 feline 38 1 4 3 2 2 4 2 2 feldspar 2 Feldman 38 1 4 3 2 2 dilo 4 2 2 felt 2 felsite 38 1 4 3 2 2 4 2 2 feint 2 feign 38 1 4 3 2 2 4 2 2 feedback 2 feed 38 1 4 3 2 2 dl 4 4 2 feet 2 Feeney 2 feeble 2 fee 38 1 4 3 2 ra 2 4 2 2 federate 2 federal 38 1 4 3 2 2 e 4 2 2 Fedora 2 fed 38 1 4 3 2 2 4 2 2 February 2 febrile 38 1 4 3 2 2 r 4 1 2 Feb 38 1 4 3 2 d 2 4 2 2 featherbedding 2 featherbed 38 1 4 3 2 2 e 4 1 2 featherbrain 38 1 4 3 2 er 2 b 4 4 2 feathery 2 featherweight 2 feathertop 2 feather 38 1 4 3 2 2 h 4 2 2 feature 2 feat 38 1 4 3 2 2 4 2 2 feast 2 feasible 38 1 4 3 2 2 4 3 2 fearsome 2 fearful 2 fear 38 1 4 3 2 2 rst 4 1 2 fealty 38 1 4 3 2 2 abdeilmnrstuv 4 3 2 few 2 fecund 2 Fe 38 1 4 3 2 tte 2 4 2 2 Fayetteville 2 Fayette 38 1 4 3 2 2 e 4 1 2 fay 38 1 4 3 2 t 2 4 3 2 Faustus 2 Faustian 2 Faust 38 1 4 3 2 2 4 2 2 fauna 2 faun 38 1 4 3 2 2 4 2 2 faulty 2 fault 38 1 4 3 2 2 t 4 1 2 Faulkner 38 1 4 3 2 2 lns 4 1 2 faucet 38 1 4 3 2 2 4 2 2 fatty 2 fatten 38 1 4 3 2 2 4 2 2 Fatima 2 fatigue 38 1 4 3 2 2 4 2 2 fathom 2 father 38 1 4 3 2 2 4 2 2 fateful 2 fate 38 1 4 3 2 2 ehit 4 3 2 fatuous 2 fatal 2 fat 38 1 4 3 2 2 e 4 2 2 fastidious 2 fast 38 1 4 3 2 i 2 cs 4 1 2 fascinate 38 1 4 3 2 2 4 2 2 fascist 2 fascism 38 1 4 3 2 2 4 2 2 fasciculate 2 fascicle 38 1 4 3 2 2 ct 4 1 2 fashion 38 1 4 3 2 he 2 4 2 2 farthest 2 farther 38 1 4 3 2 2 4 4 2 farmland 2 Farmington 2 farmhouse 2 farm 38 1 4 3 2 2 4 2 2 farewell 2 fare 38 1 4 3 2 2 4 2 2 farcical 2 farce 38 1 4 3 2 d 2 4 2 2 Faraday 2 farad 38 1 4 3 2 2 acemt 4 11 2 farsighted 2 Farrell 2 faro 2 Farnsworth 2 Farley 2 Farkas 2 farina 2 Fargo 2 farfetched 2 Farber 2 far 38 1 4 3 2 s 2 i 4 2 2 fantasy 2 fantastic 38 1 4 3 2 2 4 2 2 fantasist 2 fantasia 38 1 4 3 2 2 a 4 1 2 fantod 38 1 4 3 2 2 4 2 2 fangled 2 fang 38 1 4 3 2 2 4 2 2 fanfold 2 fanfare 38 1 4 3 2 2 4 2 2 fancy 2 fanciful 38 1 4 3 2 2 cfgt 4 4 2 fanout 2 Fanny 2 fanatic 2 fan 38 1 4 3 2 2 i 4 1 2 family 38 1 4 3 2 2 a 4 1 2 familism 38 1 4 3 2 2 4 2 2 familiar 2 familial 38 1 4 3 2 2 l 4 2 2 famish 2 famine 38 1 4 3 2 2 i 4 2 2 famous 2 fame 38 1 4 3 2 2 4 3 2 Falstaff 2 falsify 2 false 38 1 4 3 2 2 4 3 2 fallow 2 fallout 2 falloff 38 1 4 3 2 c 2 4 2 2 fallacy 2 fallacious 38 1 4 3 2 2 ao 4 3 2 fallible 2 fallen 2 fall 38 1 4 3 2 on 2 4 2 2 falconry 2 falcon 38 1 4 3 2 2 cls 4 2 2 falter 2 Falmouth 38 1 4 3 2 h 2 4 2 2 faithful 2 faith 38 1 4 3 2 2 4 2 2 Fairfield 2 Fairfax 38 1 4 3 2 2 f 4 7 2 fairly 2 fairy 2 fairway 2 Fairport 2 fairgoer 2 Fairchild 2 fair 38 1 4 3 2 2 4 2 2 faint 2 fain 38 1 4 3 2 2 sei 4 2 2 failure 2 fail 38 1 4 3 2 2 4 3 2 failsoft 2 failsafe 2 fails 38 1 4 3 2 2 lnrt 4 0 38 1 4 3 2 2 4 2 2 Fahrenheit 2 Fahey 38 1 4 3 2 2 4 2 2 fadeout 2 fade 38 1 4 3 2 2 e 4 1 2 fad 38 1 4 3 2 2 4 3 2 factory 2 factorial 2 factor 38 1 4 3 2 2 r 4 1 2 facto 38 1 4 3 2 2 o 4 3 2 factual 2 factious 2 fact 38 1 4 3 2 2 4 2 2 facilitate 2 facile 38 1 4 3 2 2 l 4 1 2 facial 38 1 4 3 2 2 4 2 2 facetious 2 facet 38 1 4 3 2 2 t 4 3 2 faces 2 faceplate 2 face 38 1 4 3 2 2 eit 4 3 2 faculty 2 facsimile 2 facade 38 1 4 3 2 ic 2 4 2 2 fabricate 2 fabric 38 1 4 3 2 2 r 4 4 2 fabulous 2 fable 2 Fabian 2 Faber 38 1 4 3 2 2 bcdhilmnrstuyk 4 6 2 faze 2 fawn 2 fag 2 Fafnir 2 faery 2 FAA 38 1 4 3 2 2 aeilMorTu 4 7 2 fjord 2 f's 2 FPC 2 FDA 2 FCC 2 FBI 2 f 38 1 4 3 2 2 4 2 2 Ezra 2 Ezekiel 38 1 4 3 2 2 4 3 2 eyelid 2 eyelet 2 eyelash 38 1 4 3 2 2 4 2 2 eyebrow 2 eyebright 38 1 4 3 2 2 r 4 1 2 eyeball 38 1 4 3 2 e 2 bls 4 5 2 eyewitness 2 eyepiece 2 eyeglass 2 eyeful 2 eye 38 1 4 3 2 2 4 2 2 exultation 2 exultant 38 1 4 3 2 t 2 a 4 1 2 exult 38 1 4 3 2 2 4 2 2 exude 2 exudate 38 1 4 3 2 2 dl 4 1 2 exuberant 38 1 4 3 2 i 2 4 2 2 extrusive 2 extrusion 38 1 4 3 2 2 s 4 1 2 extrude 38 1 4 3 2 ver 2 4 2 2 extrovert 2 extroversion 38 1 4 3 2 a 2 4 2 2 extricate 2 extricable 38 1 4 3 2 2 c 4 1 2 extrinsic 38 1 4 3 2 2 4 2 2 extremal 2 extrema 38 1 4 3 2 m 2 ae 4 1 2 extremum 38 1 4 3 2 2 cdv 4 7 2 extraterrestrial 2 extrapolate 2 extraordinary 2 extraneous 2 extramarital 2 extralegal 2 extra 38 1 4 3 2 agan 2 4 2 2 extravaganza 2 extravagant 38 1 4 3 2 it 2 4 2 2 extradition 2 extradite 38 1 4 3 2 2 4 2 2 extractor 2 extract 38 1 4 3 2 2 t 4 1 2 extracellular 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 l 4 1 2 extol 38 1 4 3 2 2 4 2 2 extoller 2 extolled 38 1 4 3 2 2 e 4 1 2 extolling 38 1 4 3 2 2 l 4 1 2 extort 38 1 4 3 2 2 4 2 2 extinguish 2 extinct 38 1 4 3 2 2 n 4 1 2 extirpate 38 1 4 3 2 2 4 3 2 external 2 exterminate 2 exterior 38 1 4 3 2 2 4 3 2 extensive 2 extension 2 extensible 38 1 4 3 2 2 i 4 1 2 extensor 38 1 4 3 2 2 4 2 2 extendible 2 extend 38 1 4 3 2 2 ds 4 2 2 extenuate 2 extent 38 1 4 3 2 por 2 4 2 2 extempore 2 extemporaneous 38 1 4 3 2 2 mnr 4 0 38 1 4 3 2 2 eior 4 1 2 extant 38 1 4 3 2 2 4 3 2 expurgate 2 expunge 2 expulsion 38 1 4 3 2 ss 2 i 4 2 2 expressway 2 express 38 1 4 3 2 2 4 3 2 expressive 2 expression 2 expressible 38 1 4 3 2 2 e 4 1 2 expropriate 38 1 4 3 2 r 2 4 2 2 expository 2 expositor 38 1 4 3 2 t 2 o 4 2 2 exposition 2 exposit 38 1 4 3 2 2 i 4 2 2 exposure 2 expose 38 1 4 3 2 t 2 4 2 2 exportation 2 export 38 1 4 3 2 ent 2 i 4 1 2 exponent 38 1 4 3 2 a 2 4 2 2 exponentiate 2 exponential 38 1 4 3 2 2 nrs 4 1 2 expound 38 1 4 3 2 i 2 4 2 2 explosive 2 explosion 38 1 4 3 2 t 2 4 2 2 exploratory 2 exploration 38 1 4 3 2 2 a 4 1 2 explore 38 1 4 3 2 t 2 4 2 2 exploitation 2 exploit 38 1 4 3 2 2 irs 4 1 2 explode 38 1 4 3 2 2 4 2 2 explicate 2 explicable 38 1 4 3 2 c 2 a 4 1 2 explicit 38 1 4 3 2 2 n 4 1 2 explain 38 1 4 3 2 at 2 4 2 2 explanatory 2 explanation 38 1 4 3 2 2 aio 4 1 2 expletive 38 1 4 3 2 2 4 2 2 expire 2 expiration 38 1 4 3 2 2 4 2 2 expiate 2 expiable 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 2 4 2 2 expertise 2 expert 38 1 4 3 2 2 em 4 0 38 1 4 3 2 ent 2 4 2 2 experimentation 2 experiment 38 1 4 3 2 n 2 c 4 1 2 experiential 38 1 4 3 2 2 it 4 0 38 1 4 3 2 2 4 2 2 expensive 2 expense 38 1 4 3 2 2 4 2 2 expenditure 2 expend 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 2 4 3 2 expelling 2 expelled 2 expellable 38 1 4 3 2 2 l 4 1 2 expel 38 1 4 3 2 o 2 4 2 2 expeditious 2 expedition 38 1 4 3 2 2 i 4 1 2 expedite 38 1 4 3 2 i 2 t 4 1 2 expedient 38 1 4 3 2 t 2 ao 4 3 2 expecting 2 expected 2 expect 38 1 4 3 2 ra 2 4 2 2 expectorate 2 expectorant 38 1 4 3 2 2 4 2 2 expectation 2 expectant 38 1 4 3 2 2 cdlnr 4 0 38 1 4 3 2 2 n 4 1 2 expatiate 38 1 4 3 2 2 s 4 1 2 expand 38 1 4 3 2 2 4 3 2 expansive 2 expansion 2 expansible 38 1 4 3 2 2 i 4 1 2 expanse 38 1 4 3 2 2 aeiloru 4 0 38 1 4 3 2 c 2 4 2 2 exotica 2 exotic 38 1 4 3 2 2 i 4 1 2 exothermic 38 1 4 3 2 is 2 4 3 2 exorcist 2 exorcism 2 exorcise 38 1 4 3 2 2 c 4 1 2 exorbitant 38 1 4 3 2 m 2 4 2 2 exogamy 2 exogamous 38 1 4 3 2 2 a 4 1 2 exogenous 38 1 4 3 2 2 grt 4 3 2 exoskeleton 2 exonerate 2 exodus 38 1 4 3 2 n 2 t 4 1 2 existence 38 1 4 3 2 t 2 e 4 1 2 exist 38 1 4 3 2 2 s 4 3 2 exit 2 exile 2 exigent 38 1 4 3 2 m 2 4 2 2 exhume 2 exhumation 38 1 4 3 2 rt 2 4 2 2 exhortation 2 exhort 38 1 4 3 2 it 2 4 3 2 exhibitor 2 exhibition 2 exhibit 38 1 4 3 2 2 b 4 1 2 exhilarate 38 1 4 3 2 2 u 4 1 2 exhale 38 1 4 3 2 2 4 3 2 exhaustive 2 exhaustion 2 exhaustible 38 1 4 3 2 st 2 i 4 1 2 exhaust 38 1 4 3 2 2 aiou 4 0 38 1 4 3 2 is 2 4 2 2 exercise 2 exercisable 38 1 4 3 2 2 c 4 1 2 exert 38 1 4 3 2 2 4 2 2 exemption 2 exempt 38 1 4 3 2 2 a 4 1 2 exemplify 38 1 4 3 2 r 2 4 2 2 exemplary 2 exemplar 38 1 4 3 2 p 2 lt 4 0 38 1 4 3 2 e 2 4 2 2 exegete 2 exegesis 38 1 4 3 2 2 ru 4 0 38 1 4 3 2 2 v 4 1 2 execution 38 1 4 3 2 t 2 i 4 3 2 executrix 2 executor 2 execute 38 1 4 3 2 a 2 4 2 2 execrate 2 execrable 38 1 4 3 2 2 cgmr 4 1 2 Exeter 38 1 4 3 2 2 4 2 2 excuse 2 excusable 38 1 4 3 2 s 2 4 2 2 excursus 2 excursion 38 1 4 3 2 pat 2 4 2 2 exculpatory 2 exculpate 38 1 4 3 2 2 lrs 4 0 38 1 4 3 2 2 t 4 1 2 excrescent 38 1 4 3 2 2 4 3 2 excretory 2 excretion 2 excrete 38 1 4 3 2 2 e 4 1 2 excruciate 38 1 4 3 2 2 4 2 2 excoriate 2 excommunicate 38 1 4 3 2 n 2 4 2 2 exclusionary 2 exclusion 38 1 4 3 2 i 2 o 4 1 2 exclusive 38 1 4 3 2 2 s 4 1 2 exclude 38 1 4 3 2 2 m 4 1 2 exclaim 38 1 4 3 2 at 2 4 2 2 exclamatory 2 exclamation 38 1 4 3 2 2 au 4 0 38 1 4 3 2 t 2 4 2 2 excitatory 2 excitation 38 1 4 3 2 2 a 4 2 2 exciton 2 excite 38 1 4 3 2 2 4 3 2 excision 2 excise 2 excisable 38 1 4 3 2 2 st 4 0 38 1 4 3 2 nge 2 4 2 2 exchangeable 2 exchange 38 1 4 3 2 2 a 4 1 2 exchequer 38 1 4 3 2 s 2 4 2 2 excessive 2 excess 38 1 4 3 2 t 2 4 2 2 exception 2 except 38 1 4 3 2 2 4 2 2 excellent 2 excelled 38 1 4 3 2 2 e 4 1 2 excelling 38 1 4 3 2 2 l 4 2 2 excelsior 2 excel 38 1 4 3 2 2 lps 4 2 2 excerpt 2 exceed 38 1 4 3 2 2 ehiloru 4 1 2 excavate 38 1 4 3 2 2 clms 4 1 2 exaggerate 38 1 4 3 2 perate 2 4 2 2 exasperater 2 exasperate 38 1 4 3 2 n 2 4 2 2 examine 2 examination 38 1 4 3 2 2 ip 4 1 2 exam 38 1 4 3 2 t 2 4 2 2 exaltation 2 exalt 38 1 4 3 2 2 4 2 2 exact 2 exacerbate 38 1 4 3 2 2 acehioptu 4 2 2 Exxon 2 exquisite 38 1 4 3 2 tion 2 4 2 2 evolutionary 2 evolution 38 1 4 3 2 2 u 4 1 2 evolve 38 1 4 3 2 a 2 4 2 2 evocate 2 evocable 38 1 4 3 2 2 cl 4 1 2 evoke 38 1 4 3 2 2 4 2 2 evildoer 2 evil 38 1 4 3 2 ent 2 4 2 2 evidential 2 evident 38 1 4 3 2 2 dl 4 2 2 evince 2 evict 38 1 4 3 2 2 4 7 2 everywhere 2 everything 2 everyone 2 everyman 2 everyday 2 everybody 2 every 38 1 4 3 2 2 4 2 2 evergreen 2 Everglades 38 1 4 3 2 2 4 2 2 Everett 2 Eveready 38 1 4 3 2 2 egy 4 3 2 everlasting 2 Everhart 2 ever 38 1 4 3 2 a 2 4 2 2 eventuate 2 eventual 38 1 4 3 2 2 u 4 3 2 eventide 2 eventful 2 event 38 1 4 3 2 2 t 4 3 2 evensong 2 evenhanded 2 even 38 1 4 3 2 2 nr 4 2 2 Evelyn 2 eve 38 1 4 3 2 2 lns 4 4 2 evaporate 2 evade 2 evacuate 2 Eva 38 1 4 3 2 i 2 4 2 2 evasive 2 evasion 38 1 4 3 2 2 4 3 2 Evansville 2 Evanston 2 Evans 38 1 4 3 2 el 2 4 2 2 evangelic 2 evangel 38 1 4 3 2 2 gs 4 1 2 evanescent 38 1 4 3 2 ua 2 t 4 1 2 evaluable 38 1 4 3 2 2 aeio 4 1 2 evzone 38 1 4 3 2 2 4 2 2 Euterpe 2 eutectic 38 1 4 3 2 2 e 4 1 2 euthanasia 38 1 4 3 2 2 a 4 1 2 Europe 38 1 4 3 2 p 2 e 4 2 2 europium 2 Europa 38 1 4 3 2 2 4 2 2 Euripides 2 Euridyce 38 1 4 3 2 2 io 4 3 2 Eurydice 2 eureka 2 Eurasia 38 1 4 3 2 2 4 2 2 euphoric 2 euphoria 38 1 4 3 2 r 2 i 4 1 2 euphorbia 38 1 4 3 2 mis 2 4 2 2 euphemist 2 euphemism 38 1 4 3 2 h 2 eo 4 1 2 Euphrates 38 1 4 3 2 r 2 4 2 2 Eulerian 2 Euler 38 1 4 3 2 2 e 4 1 2 eulogy 38 1 4 3 2 2 4 2 2 eugenic 2 Eugenia 38 1 4 3 2 en 2 i 4 1 2 Eugene 38 1 4 3 2 2 l 4 3 2 eucre 2 Eucharist 2 eucalyptus 38 1 4 3 2 id 2 4 2 2 Euclidean 2 Euclid 38 1 4 3 2 2 cglprt 4 3 2 Eunice 2 Eumenides 2 eukaryote 38 1 4 3 2 2 4 2 2 etiquette 2 etiology 38 1 4 3 2 l 2 4 2 2 ethylene 2 ethyl 38 1 4 3 2 2 4 2 2 ethos 2 ethology 38 1 4 3 2 2 4 2 2 ethnology 2 ethnography 38 1 4 3 2 2 o 4 1 2 ethnic 38 1 4 3 2 2 4 2 2 Ethiopia 2 ethic 38 1 4 3 2 2 4 2 2 ethereal 2 ether 38 1 4 3 2 2 r 4 1 2 Ethel 38 1 4 3 2 n 2 4 3 2 ethanol 2 ethane 2 Ethan 38 1 4 3 2 2 aeinoy 4 0 38 1 4 3 2 rn 2 4 2 2 eternity 2 eternal 38 1 4 3 2 2 4 2 2 etch 2 etc 38 1 4 3 2 2 cehi 4 5 2 etymology 2 etude 2 Etruscan 2 eta 2 et 38 1 4 3 2 ar 2 4 2 2 estuary 2 estuarine 38 1 4 3 2 2 4 2 2 estoppal 2 estop 38 1 4 3 2 2 p 4 1 2 Estonia 38 1 4 3 2 ma 2 4 2 2 estimate 2 estimable 38 1 4 3 2 2 4 4 2 Estes 2 ester 2 Estella 2 esteem 38 1 4 3 2 2 bt 4 0 38 1 4 3 2 2 aeiou 4 3 2 estrange 2 Esther 2 EST 38 1 4 3 2 2 4 3 2 essential 2 essence 2 Essen 38 1 4 3 2 2 n 4 1 2 Essex 38 1 4 3 2 2 e 4 1 2 essay 38 1 4 3 2 s 2 4 2 2 espouse 2 espousal 38 1 4 3 2 2 u 4 1 2 Esposito 38 1 4 3 2 2 oe 4 3 2 esprit 2 esplanade 2 espionage 38 1 4 3 2 2 4 2 2 esoteric 2 esophagi 38 1 4 3 2 2 ahr 4 2 2 escutcheon 2 escort 38 1 4 3 2 2 4 2 2 escrow 2 escritoire 38 1 4 3 2 e 2 4 3 2 eschew 2 Escherichia 2 escheat 38 1 4 3 2 2 p 4 2 2 escalate 2 escadrille 38 1 4 3 2 2 4 2 2 escapee 2 escape 38 1 4 3 2 2 e 4 1 2 escapade 38 1 4 3 2 2 copst 4 3 2 esquire 2 Esmark 2 Eskimo 38 1 4 3 2 2 4 2 2 e's 2 e'er 38 1 4 3 2 t 2 4 2 2 eruption 2 erupt 38 1 4 3 2 it 2 4 2 2 erudition 2 erudite 38 1 4 3 2 2 dp 4 0 38 1 4 3 2 2 4 2 2 Erskine 2 ersatz 38 1 4 3 2 2 4 3 2 error 2 erroneous 2 Errol 38 1 4 3 2 2 4 3 2 erratum 2 erratic 2 errata 38 1 4 3 2 2 t 4 1 2 errand 38 1 4 3 2 2 4 2 2 errantry 2 errant 38 1 4 3 2 2 nt 4 0 38 1 4 3 2 2 ao 4 1 2 err 38 1 4 3 2 ic 2 4 2 2 erotica 2 erotic 38 1 4 3 2 2 4 3 2 erosive 2 erosion 2 erosible 38 1 4 3 2 2 i 4 1 2 Eros 38 1 4 3 2 2 4 2 2 erodible 2 erode 38 1 4 3 2 2 dst 4 0 38 1 4 3 2 st 2 4 2 2 Ernestine 2 Ernest 38 1 4 3 2 2 e 4 2 2 Ernst 2 Ernie 38 1 4 3 2 2 4 4 2 Ericsson 2 Erickson 2 Erich 2 Eric 38 1 4 3 2 2 c 4 2 2 Erik 2 Erie 38 1 4 3 2 2 4 3 2 ergodic 2 ergative 2 erg 38 1 4 3 2 2 4 2 2 erect 2 ere 38 1 4 3 2 2 dst 4 1 2 era 38 1 4 3 2 o 2 4 2 2 Eratosthenes 2 Erato 38 1 4 3 2 2 4 5 2 erasure 2 Erastus 2 Erasmus 2 erase 2 erasable 38 1 4 3 2 ica 2 4 2 2 eradicate 2 eradicable 38 1 4 3 2 2 aeginorsu 4 5 2 Erwin 2 Ervin 2 Erlenmeyer 2 ERDA 2 erbium 38 1 4 3 2 2 4 2 2 equivocal 2 equivalent 38 1 4 3 2 2 4 2 2 equitation 2 equitable 38 1 4 3 2 2 a 4 1 2 equity 38 1 4 3 2 2 4 2 2 equipping 2 equipped 38 1 4 3 2 2 4 2 2 equipotent 2 equipoise 38 1 4 3 2 2 op 4 2 2 equipment 2 equip 38 1 4 3 2 2 4 2 2 equinox 2 equinoctial 38 1 4 3 2 2 o 4 1 2 equine 38 1 4 3 2 2 4 2 2 equilibrium 2 equilibria 38 1 4 3 2 br 2 i 4 1 2 equilibrate 38 1 4 3 2 2 i 4 1 2 equilateral 38 1 4 3 2 2 lnptv 4 1 2 equidistant 38 1 4 3 2 2 t 4 3 2 equanimity 2 equal 2 equable 38 1 4 3 2 2 4 2 2 equatorial 2 equate 38 1 4 3 2 u 2 ai 4 1 2 equestrian 38 1 4 3 2 2 4 3 2 Epstein 2 Epsom 2 epsilon 38 1 4 3 2 h 2 4 2 2 epochal 2 epoch 38 1 4 3 2 2 c 4 1 2 epoxy 38 1 4 3 2 i 2 4 2 2 epithelium 2 epithelial 38 1 4 3 2 e 2 l 4 1 2 epithet 38 1 4 3 2 2 x 4 1 2 epitaph 38 1 4 3 2 2 4 2 2 epitaxy 2 epitaxial 38 1 4 3 2 2 ah 4 1 2 epitome 38 1 4 3 2 2 4 3 2 epistolatory 2 epistle 2 epistemology 38 1 4 3 2 d 2 4 2 2 episodic 2 episode 38 1 4 3 2 opa 2 l 4 1 2 episcopate 38 1 4 3 2 2 4 2 2 Episcopalian 2 episcopal 38 1 4 3 2 2 cot 4 0 38 1 4 3 2 s 2 4 2 2 epiphysis 2 epiphyseal 38 1 4 3 2 h 2 y 4 1 2 Epiphany 38 1 4 3 2 2 4 2 2 epilogue 2 epileptic 38 1 4 3 2 2 4 2 2 epigrammatic 2 epigram 38 1 4 3 2 a 2 m 4 1 2 epigraph 38 1 4 3 2 2 r 4 1 2 epigenetic 38 1 4 3 2 mi 2 4 2 2 epidermis 2 epidermic 38 1 4 3 2 i 2 4 2 2 epidemiology 2 epidemic 38 1 4 3 2 e 2 mr 4 0 38 1 4 3 2 2 uy 4 1 2 epic 38 1 4 3 2 cl 2 4 2 2 epicyclic 2 epicycle 38 1 4 3 2 re 2 4 2 2 Epicurean 2 epicure 38 1 4 3 2 2 cdglpst 4 1 2 epimorphism 38 1 4 3 2 2 ms 4 0 38 1 4 3 2 2 4 2 2 Ephesus 2 Ephesian 38 1 4 3 2 er 2 i 4 1 2 ephemeral 38 1 4 3 2 2 4 2 2 ephemeris 2 ephemerides 38 1 4 3 2 2 e 4 1 2 Ephraim 38 1 4 3 2 2 4 2 2 epaulet 2 EPA 38 1 4 3 2 2 Ahios 4 0 38 1 4 3 2 2 4 3 2 eosine 2 eohippus 2 Eocene 38 1 4 3 2 ym 2 4 3 2 enzymology 2 enzyme 2 enzymatic 38 1 4 3 2 2 4 3 2 environ 2 envious 2 enviable 38 1 4 3 2 lop 2 4 2 2 envelope 2 envelop 38 1 4 3 2 2 ei 4 2 2 envy 2 envoy 38 1 4 3 2 cia 2 4 2 2 enunciate 2 enunciable 38 1 4 3 2 era 2 4 2 2 enumerate 2 enumerable 38 1 4 3 2 2 mn 4 0 38 1 4 3 2 preneur 2 4 2 2 entrepreneurial 2 entrepreneur 38 1 4 3 2 n 2 4 2 2 entrant 2 entranceway 38 1 4 3 2 2 ae 4 2 2 entry 2 entropy 38 1 4 3 2 2 4 2 2 entourage 2 entomology 38 1 4 3 2 e 2 4 2 2 entirety 2 entire 38 1 4 3 2 2 r 4 2 2 entity 2 entice 38 1 4 3 2 2 4 2 2 enthusiastic 2 enthusiast 38 1 4 3 2 sias 2 t 4 1 2 enthusiasm 38 1 4 3 2 2 u 4 1 2 enthalpy 38 1 4 3 2 2 r 4 1 2 entendre 38 1 4 3 2 2 4 3 2 entertain 2 enterprise 2 enter 38 1 4 3 2 2 ehior 4 0 38 1 4 3 2 2 4 3 2 enstatite 2 ensemble 2 ensconce 38 1 4 3 2 2 4 2 2 enrollee 2 Enrico 38 1 4 3 2 uir 2 4 2 2 enquiry 2 enquire 38 1 4 3 2 m 2 4 2 2 enormous 2 enormity 38 1 4 3 2 2 r 4 4 2 enough 2 Enos 2 enol 2 Enoch 38 1 4 3 2 ma 2 4 2 2 enigmatic 2 enigma 38 1 4 3 2 2 g 4 1 2 Enid 38 1 4 3 2 2 4 2 2 Englishmen 2 Englishman 38 1 4 3 2 sh 2 m 4 1 2 English 38 1 4 3 2 2 4 2 2 Englewood 2 Engle 38 1 4 3 2 nd 2 4 2 2 Englander 2 England 38 1 4 3 2 2 aei 4 0 38 1 4 3 2 ne 2 4 2 2 engineer 2 engine 38 1 4 3 2 2 il 4 3 2 Engel 2 engage 2 Eng 38 1 4 3 2 rc 2 4 2 2 enforcible 2 enforceable 38 1 4 3 2 2 o 4 1 2 enfant 38 1 4 3 2 2 4 2 2 energy 2 energetic 38 1 4 3 2 2 g 4 1 2 enervate 38 1 4 3 2 2 r 4 1 2 enemy 38 1 4 3 2 he 2 4 2 2 endothermic 2 endothelial 38 1 4 3 2 m 2 4 2 2 endogamy 2 endogamous 38 1 4 3 2 2 a 4 1 2 endogenous 38 1 4 3 2 2 gt 4 5 2 endow 2 endosperm 2 endorse 2 endomorphism 2 endoderm 38 1 4 3 2 2 o 4 5 2 endure 2 endpoint 2 Endicott 2 endgame 2 end 38 1 4 3 2 mb 2 4 2 2 encumbrance 2 encumber 38 1 4 3 2 2 4 2 2 encryption 2 encroach 38 1 4 3 2 i 2 4 2 2 encomium 2 encomia 38 1 4 3 2 2 m 4 1 2 encore 38 1 4 3 2 2 oru 4 5 2 encyclopedic 2 enclave 2 enchantress 2 encephalitis 2 encapsulate 38 1 4 3 2 2 cdefgioqrstuvz 4 6 2 enmity 2 enlargeable 2 enjoinder 2 enhance 2 enamel 2 en 38 1 4 3 2 i 2 4 2 2 emulsion 2 emulsify 38 1 4 3 2 l 2 s 4 1 2 emulate 38 1 4 3 2 2 4 2 2 empower 2 emporium 38 1 4 3 2 y 2 e 4 1 2 employ 38 1 4 3 2 2 o 4 1 2 emplace 38 1 4 3 2 r 2 4 2 2 empiric 2 empire 38 1 4 3 2 sema 2 4 2 2 emphysematous 2 emphysema 38 1 4 3 2 2 s 4 1 2 emphatic 38 1 4 3 2 2 4 2 2 emphasis 2 emphases 38 1 4 3 2 2 ay 4 0 38 1 4 3 2 2 hilo 4 5 2 empyrean 2 empty 2 empress 2 emperor 2 empathy 38 1 4 3 2 2 4 3 2 emotion 2 Emory 2 emolument 38 1 4 3 2 2 4 2 2 Emmanuel 2 emma 38 1 4 3 2 2 a 4 1 2 Emmett 38 1 4 3 2 2 4 2 2 emitter 2 emitted 38 1 4 3 2 2 e 4 2 2 emitting 2 emittance 38 1 4 3 2 2 t 4 1 2 emit 38 1 4 3 2 2 4 2 2 emissivity 2 emission 38 1 4 3 2 s 2 i 4 1 2 emissary 38 1 4 3 2 2 4 4 2 Emily 2 Emilio 2 Emile 2 Emil 38 1 4 3 2 ra 2 4 2 2 emigrate 2 emigrant 38 1 4 3 2 2 glst 4 2 2 emirate 2 eminent 38 1 4 3 2 t 2 4 2 2 emeritus 2 emeriti 38 1 4 3 2 e 2 4 2 2 emergent 2 emerge 38 1 4 3 2 2 gi 4 3 2 Emery 2 Emerson 2 emerald 38 1 4 3 2 2 r 4 1 2 emendable 38 1 4 3 2 o 2 4 3 2 embryonic 2 embryology 2 embryo 38 1 4 3 2 er 2 4 2 2 embroidery 2 embroider 38 1 4 3 2 i 2 d 4 1 2 embroil 38 1 4 3 2 ce 2 4 2 2 embraceable 2 embrace 38 1 4 3 2 2 aoy 4 1 2 embrittle 38 1 4 3 2 2 4 2 2 embody 2 embodiment 38 1 4 3 2 2 d 4 4 2 embower 2 embouchure 2 emboss 2 embolden 38 1 4 3 2 em 2 4 2 2 emblematic 2 emblem 38 1 4 3 2 2 d 4 1 2 embed 38 1 4 3 2 2 4 2 2 embedder 2 embedded 38 1 4 3 2 2 e 4 2 2 embedding 2 embeddable 38 1 4 3 2 2 d 4 3 2 embezzle 2 ember 2 embellish 38 1 4 3 2 2 r 4 4 2 embattle 2 embassy 2 embank 2 embalm 38 1 4 3 2 o 2 4 2 2 embargoes 2 embargo 38 1 4 3 2 2 g 4 3 2 embarrass 2 embark 2 embarcadero 38 1 4 3 2 2 aelor 4 0 38 1 4 3 2 2 4 3 2 Emanuel 2 emancipate 2 emanate 38 1 4 3 2 2 nc 4 1 2 emasculate 38 1 4 3 2 2 abeimopu 4 2 2 emcee 2 em 38 1 4 3 2 2 4 2 2 elysian 2 Elysee 38 1 4 3 2 2 s 4 1 2 Ely 38 1 4 3 2 2 4 2 2 elution 2 elute 38 1 4 3 2 2 t 4 4 2 elusive 2 elude 2 elucidate 2 eluate 38 1 4 3 2 2 4 2 2 Elsinore 2 Elsie 38 1 4 3 2 2 4 3 2 elsewhere 2 Elsevier 2 else 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 4 2 eloquent 2 elope 2 elongate 2 Eloise 38 1 4 3 2 2 4 5 2 Elmsford 2 Elmira 2 Elmhurst 2 Elmer 2 elm 38 1 4 3 2 2 4 2 2 Ellison 2 Ellis 38 1 4 3 2 2 o 4 2 2 ellipsis 2 ellipse 38 1 4 3 2 d 2 4 2 2 ellipsoidal 2 ellipsoid 38 1 4 3 2 2 i 4 1 2 ellipsometer 38 1 4 3 2 2 s 4 1 2 elliptic 38 1 4 3 2 t 2 4 2 2 Elliott 2 Elliot 38 1 4 3 2 2 ops 4 0 38 1 4 3 2 2 i 4 5 2 Ellwood 2 Ellsworth 2 Ellen 2 Ella 2 ell 38 1 4 3 2 2 4 2 2 Elkhart 2 elk 38 1 4 3 2 abeth 2 4 2 2 Elizabethan 2 Elizabeth 38 1 4 3 2 2 4 3 2 elision 2 Elisha 2 Elisabeth 38 1 4 3 2 2 szm 4 8 2 elite 2 Eliot 2 Elinor 2 Elijah 2 eligible 2 elide 2 elicit 2 Eli 38 1 4 3 2 n 2 4 2 2 eleventh 2 eleven 38 1 4 3 2 2 e 4 1 2 elevate 38 1 4 3 2 hant 2 4 2 2 elephantine 2 elephant 38 1 4 3 2 ent 2 4 2 2 elementary 2 element 38 1 4 3 2 2 4 3 2 elegy 2 elegiac 2 elegant 38 1 4 3 2 hor 2 4 2 2 electrophorus 2 electrophoresis 38 1 4 3 2 2 i 4 1 2 electron 38 1 4 3 2 2 4 2 2 electrolytic 2 electrolyte 38 1 4 3 2 y 2 t 4 1 2 electrolysis 38 1 4 3 2 h 2 4 2 2 electroencephalography 2 electroencephalograph 38 1 4 3 2 ncephalogra 2 p 4 1 2 electroencephalogram 38 1 4 3 2 ardiogra 2 4 2 2 electrocardiograph 2 electrocardiogram 38 1 4 3 2 2 celnp 4 2 2 electrode 2 electro 38 1 4 3 2 2 4 2 2 electrician 2 electric 38 1 4 3 2 2 c 4 1 2 electrify 38 1 4 3 2 2 4 2 2 electret 2 electress 38 1 4 3 2 2 eio 4 1 2 Electra 38 1 4 3 2 2 4 2 2 electorate 2 electoral 38 1 4 3 2 r 2 a 4 1 2 elector 38 1 4 3 2 t 2 or 4 1 2 elect 38 1 4 3 2 2 4 2 2 Eleazar 2 Eleanor 38 1 4 3 2 2 acgmpv 4 1 2 Elena 38 1 4 3 2 2 4 2 2 eldest 2 elder 38 1 4 3 2 2 e 4 1 2 Eldon 38 1 4 3 2 2 4 2 2 elbow 2 Elba 38 1 4 3 2 t 2 4 2 2 elastomer 2 elastic 38 1 4 3 2 2 s 4 5 2 elate 2 elapse 2 elan 2 Elaine 2 elaborate 38 1 4 3 2 2 abdeiklmosuy 4 5 2 elves 2 Elton 2 Elgin 2 elfin 2 el 38 1 4 3 2 2 4 3 2 Ektachrome 2 Ekstrom 2 eke 38 1 4 3 2 ct 2 4 2 2 ejector 2 eject 38 1 4 3 2 2 e 4 1 2 ejaculate 38 1 4 3 2 2 4 2 2 Eisner 2 Eisenhower 38 1 4 3 2 2 4 2 2 einsteinium 2 Einsteinian 38 1 4 3 2 stein 2 i 4 1 2 Einstein 38 1 4 3 2 en 2 4 2 2 eighteenth 2 eighteen 38 1 4 3 2 t 2 e 4 5 2 eighty 2 eightieth 2 eighth 2 eightfold 2 eight 38 1 4 3 2 n 2 sv 4 1 2 eigenfunction 38 1 4 3 2 2 4 2 2 eigenvector 2 eigenvalue 38 1 4 3 2 2 4 2 2 eigenstate 2 eigenspace 38 1 4 3 2 2 eh 4 0 38 1 4 3 2 e 2 4 2 2 eidetic 2 eider 38 1 4 3 2 2 dgns 4 3 2 either 2 Eire 2 Eileen 38 1 4 3 2 2 4 2 2 Ehrlich 2 eh 38 1 4 3 2 pt 2 4 2 2 Egyptian 2 Egypt 38 1 4 3 2 e 2 4 3 2 egret 2 egress 2 egregious 38 1 4 3 2 is 2 4 2 2 egotist 2 egotism 38 1 4 3 2 2 t 4 2 2 egocentric 2 ego 38 1 4 3 2 2 4 4 2 eggshell 2 eggplant 2 egghead 2 egg 38 1 4 3 2 2 4 2 2 Egan 2 egalitarian 38 1 4 3 2 2 agory 4 0 38 1 4 3 2 2 aeilo 4 1 2 effusive 38 1 4 3 2 i 2 4 2 2 effluvium 2 effluvia 38 1 4 3 2 2 v 4 1 2 effluent 38 1 4 3 2 resce 2 4 2 2 efflorescent 2 effloresce 38 1 4 3 2 2 ou 4 0 38 1 4 3 2 2 a 4 1 2 efficient 38 1 4 3 2 c 2 4 2 2 efficacy 2 efficacious 38 1 4 3 2 2 c 4 1 2 Effie 38 1 4 3 2 t 2 u 4 3 2 effects 2 effective 2 effect 38 1 4 3 2 a 2 4 2 2 effectuate 2 effectual 38 1 4 3 2 2 c 4 3 2 effete 2 efferent 2 effeminate 38 1 4 3 2 ce 2 4 2 2 effaceable 2 efface 38 1 4 3 2 2 f 4 1 2 eft 38 1 4 3 2 i 2 4 2 2 eerily 2 eerie 38 1 4 3 2 2 4 2 2 eelgrass 2 eel 38 1 4 3 2 2 lr 4 1 2 EEOC 38 1 4 3 2 n 2 4 2 2 Edwina 2 Edwin 38 1 4 3 2 rd 2 i 4 1 2 Edward 38 1 4 3 2 2 4 2 2 Edwardine 2 Edwardian 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 a 2 t 4 1 2 educable 38 1 4 3 2 2 c 4 1 2 Eduardo 38 1 4 3 2 n 2 d 4 1 2 Edmonton 38 1 4 3 2 s 2 4 2 2 Edmondson 2 Edmonds 38 1 4 3 2 2 o 4 1 2 Edmund 38 1 4 3 2 r 2 4 3 2 editors 2 editorial 2 editor 38 1 4 3 2 2 o 4 3 2 edition 2 Edith 2 edit 38 1 4 3 2 2 4 2 2 edify 2 edifice 38 1 4 3 2 2 ft 4 4 2 Edison 2 Edinburgh 2 edict 2 edible 38 1 4 3 2 2 4 3 2 edgewise 2 Edgerton 2 edge 38 1 4 3 2 2 e 4 3 2 edgy 2 edging 2 Edgar 38 1 4 3 2 2 4 3 2 Eden 2 edematous 2 edelweiss 38 1 4 3 2 2 4 2 2 eddy 2 Eddie 38 1 4 3 2 2 degimuw 4 3 2 EDT 2 Edna 2 Ed 38 1 4 3 2 eni 2 4 2 2 ecumenist 2 ecumenic 38 1 4 3 2 2 m 4 1 2 Ecuador 38 1 4 3 2 o 2 4 2 2 ectopic 2 ectoderm 38 1 4 3 2 ta 2 4 2 2 ecstatic 2 ecstasy 38 1 4 3 2 2 c 4 1 2 economist 38 1 4 3 2 tric 2 4 2 2 Econometrica 2 econometric 38 1 4 3 2 om 2 ei 4 1 2 economy 38 1 4 3 2 2 4 2 2 ecology 2 Ecole 38 1 4 3 2 2 ln 4 1 2 ecosystem 38 1 4 3 2 p 2 4 2 2 ecliptic 2 eclipse 38 1 4 3 2 2 i 4 3 2 eclogue 2 eclectic 2 eclat 38 1 4 3 2 2 4 2 2 echoes 2 echo 38 1 4 3 2 2 4 2 2 echinoderm 2 echidna 38 1 4 3 2 2 io 4 1 2 echelon 38 1 4 3 2 2 l 4 1 2 eccentric 38 1 4 3 2 es 2 4 2 2 ecclesiastic 2 Eccles 38 1 4 3 2 2 chlostu 4 0 38 1 4 3 2 2 4 4 2 ebullient 2 ebony 2 Eben 2 ebb 38 1 4 3 2 drop 2 4 2 2 eavesdropping 2 eavesdrop 38 1 4 3 2 e 2 s 4 1 2 eave 38 1 4 3 2 2 4 2 2 eater 2 eaten 38 1 4 3 2 2 e 4 2 2 Eaton 2 eat 38 1 4 3 2 2 4 2 2 easygoing 2 easy 38 1 4 3 2 2 4 2 2 Eastwood 2 eastward 38 1 4 3 2 rn 2 4 2 2 easternmost 2 eastern 38 1 4 3 2 2 ew 4 4 2 Eastman 2 Eastland 2 eastbound 2 east 38 1 4 3 2 2 4 2 2 easel 2 ease 38 1 4 3 2 2 etyi 4 0 38 1 4 3 2 v 2 4 2 2 earthmoving 2 earthmover 38 1 4 3 2 2 o 4 1 2 earthmen 38 1 4 3 2 n 2 4 2 2 earthenware 2 earthen 38 1 4 3 2 h 2 em 4 4 2 earthy 2 earthworm 2 earthquake 2 earth 38 1 4 3 2 2 i 4 2 2 earnest 2 earn 38 1 4 3 2 2 ntl 4 7 2 earwig 2 earsplitting 2 earring 2 earphone 2 earmark 2 eardrum 2 ear 38 1 4 3 2 2 e 4 2 2 eagle 2 Eagan 38 1 4 3 2 2 grstv 4 1 2 each 38 1 4 3 2 2 abcdefghijklmnopqr'stuvxyz 4 2 2 ewe 2 e 38 1 4 3 2 2 4 3 2 dysprosium 2 dysplasia 2 dyspeptic 38 1 4 3 2 2 p 4 2 2 dystrophy 2 dysentery 38 1 4 3 2 2 ms 4 0 38 1 4 3 2 t 2 4 3 2 dynasty 2 dynastic 2 dynast 38 1 4 3 2 2 i 4 1 2 dynamo 38 1 4 3 2 2 4 3 2 dynamite 2 dynamism 2 dynamic 38 1 4 3 2 2 a 4 1 2 dyne 38 1 4 3 2 2 4 2 2 dyeing 2 dye 38 1 4 3 2 d 2 4 2 2 dyadic 2 dyad 38 1 4 3 2 2 aens 4 3 2 Dylan 2 Dyke 2 dying 38 1 4 3 2 2 4 2 2 dwindle 2 Dwight 38 1 4 3 2 l 2 4 2 2 dwelt 2 dwell 38 1 4 3 2 r 2 4 2 2 dwarves 2 dwarf 38 1 4 3 2 2 aei 4 1 2 Dwyer 38 1 4 3 2 2 4 2 2 dutiful 2 dutiable 38 1 4 3 2 h 2 m 4 2 2 dutchess 2 Dutch 38 1 4 3 2 2 4 2 2 Dutchmen 2 Dutchman 38 1 4 3 2 2 ci 4 2 2 duty 2 Dutton 38 1 4 3 2 2 4 3 2 dusty 2 dustbin 2 dust 38 1 4 3 2 2 4 2 2 dusky 2 dusk 38 1 4 3 2 nb 2 4 2 2 Dusenbury 2 Dusenberg 38 1 4 3 2 2 ekt 4 1 2 Dusseldorf 38 1 4 3 2 2 4 2 2 Durkin 2 Durkee 38 1 4 3 2 2 4 2 2 duress 2 Durer 38 1 4 3 2 2 n 4 2 2 duration 2 durable 38 1 4 3 2 2 4 2 2 Durango 2 durance 38 1 4 3 2 2 aek 4 4 2 Durward 2 Durrell 2 during 2 Durham 38 1 4 3 2 2 4 2 2 duplicate 2 duplicable 38 1 4 3 2 c 2 a 4 1 2 duplicity 38 1 4 3 2 2 i 4 1 2 duplex 38 1 4 3 2 2 l 4 2 2 DuPont 2 dupe 38 1 4 3 2 pol 2 4 2 2 duopoly 2 duopolist 38 1 4 3 2 2 4 2 2 Dunlop 2 Dunlap 38 1 4 3 2 2 4 2 2 Dunkirk 2 dunk 38 1 4 3 2 2 4 2 2 dungeon 2 dung 38 1 4 3 2 2 4 2 2 Dunedin 2 dune 38 1 4 3 2 2 4 2 2 dunce 2 Duncan 38 1 4 3 2 2 cegkl 4 4 2 Dunn 2 Dunham 2 Dunbar 2 dun 38 1 4 3 2 2 4 4 2 dumped 2 dumpy 2 Dumpty 2 dump 38 1 4 3 2 2 4 2 2 dumbbell 2 dumb 38 1 4 3 2 2 bp 4 2 2 dummy 2 Duma 38 1 4 3 2 2 4 2 2 dully 2 dull 38 1 4 3 2 2 l 4 4 2 duly 2 Duluth 2 dulse 2 dulcet 38 1 4 3 2 2 4 3 2 dugout 2 Dugan 2 dug 38 1 4 3 2 f 2 4 3 2 Duffy 2 duffel 2 duff 38 1 4 3 2 2 4 4 2 dues 2 duet 2 duel 2 due 38 1 4 3 2 2 4 2 2 Dudley 2 dud 38 1 4 3 2 2 4 3 2 ductwork 2 ductile 2 duct 38 1 4 3 2 2 4 2 2 duckling 2 duck 38 1 4 3 2 2 kt 4 2 2 duchess 2 ducat 38 1 4 3 2 2 4 2 2 dubitable 2 dubious 38 1 4 3 2 2 i 4 3 2 Dublin 2 Dubhe 2 dub 38 1 4 3 2 2 4 2 2 Duane 2 dual 38 1 4 3 2 2 abcdefglmnoprst 4 3 2 Duquesne 2 duke 2 du 38 1 4 3 2 2 4 3 2 Dryden 2 dryad 2 dry 38 1 4 3 2 k 2 4 3 2 drunken 2 drunkard 2 drunk 38 1 4 3 2 2 4 4 2 Drummond 2 drumlin 2 drumhead 2 drum 38 1 4 3 2 2 4 3 2 drugstore 2 drugging 2 drug 38 1 4 3 2 ge 2 4 2 2 drudgery 2 drudge 38 1 4 3 2 2 dgmn 4 3 2 Drury 2 druid 2 drub 38 1 4 3 2 2 4 2 2 drowsy 2 drowse 38 1 4 3 2 2 s 4 1 2 drown 38 1 4 3 2 2 4 2 2 dross 2 drosophila 38 1 4 3 2 2 4 4 2 dropout 2 droplet 2 drophead 2 drop 38 1 4 3 2 2 4 2 2 droopy 2 droop 38 1 4 3 2 2 p 4 1 2 drool 38 1 4 3 2 2 opsw 4 5 2 drove 2 drought 2 drone 2 dromedary 2 droll 38 1 4 3 2 zl 2 4 2 2 drizzly 2 drizzle 38 1 4 3 2 2 e 4 1 2 driving 38 1 4 3 2 2 4 2 2 drippy 2 drip 38 1 4 3 2 2 4 2 2 dribble 2 drib 38 1 4 3 2 2 bpvz 4 4 2 Driscoll 2 drink 2 drill 2 drift 38 1 4 3 2 s 2 4 3 2 dressy 2 dressmake 2 dress 38 1 4 3 2 2 dm 4 1 2 dreary 38 1 4 3 2 2 4 4 2 dreamy 2 dreamt 2 dreamboat 2 dream 38 1 4 3 2 2 4 3 2 dreadnought 2 dreadful 2 dread 38 1 4 3 2 2 as 4 6 2 Dreyfuss 2 Drexel 2 drew 2 drench 2 dreg 2 dredge 38 1 4 3 2 2 4 2 2 drawbridge 2 drawback 38 1 4 3 2 2 b 4 3 2 drawn 2 drawl 2 draw 38 1 4 3 2 e 2 4 2 2 drapery 2 drape 38 1 4 3 2 2 4 2 2 dramatist 2 dramatic 38 1 4 3 2 2 i 4 1 2 dramaturgy 38 1 4 3 2 2 t 4 1 2 drama 38 1 4 3 2 2 a 4 1 2 dram 38 1 4 3 2 n 2 4 2 2 drainage 2 drain 38 1 4 3 2 2 4 3 2 dragonhead 2 dragonfly 2 dragon 38 1 4 3 2 2 n 4 1 2 dragoon 38 1 4 3 2 2 o 4 3 2 dragnet 2 dragging 2 drag 38 1 4 3 2 2 4 2 2 draftsmen 2 draftsman 38 1 4 3 2 2 m 4 1 2 draftsperson 38 1 4 3 2 t 2 s 4 3 2 drafty 2 draftee 2 draft 38 1 4 3 2 2 fgimpw 4 5 2 drastic 2 drank 2 drake 2 Draco 2 drab 38 1 4 3 2 2 aeiouy 4 1 2 Dr 38 1 4 3 2 e 2 n 4 1 2 doze 38 1 4 3 2 2 4 2 2 downwind 2 downward 38 1 4 3 2 2 4 2 2 downtrodden 2 downtrend 38 1 4 3 2 2 r 4 2 2 downturn 2 downtown 38 1 4 3 2 2 4 2 2 downstream 2 downstairs 38 1 4 3 2 2 t 4 3 2 downspout 2 downslope 2 downside 38 1 4 3 2 2 4 2 2 downpour 2 downplay 38 1 4 3 2 2 pstw 4 9 2 downright 2 downhill 2 downgrade 2 downfall 2 Downey 2 downdraft 2 downcast 2 downbeat 2 down 38 1 4 3 2 2 n 4 6 2 dowry 2 Dowling 2 dowitcher 2 dowel 2 dowager 2 Dow 38 1 4 3 2 e 2 4 3 2 dovetail 2 dovekie 2 dove 38 1 4 3 2 as 2 4 2 2 Douglass 2 Douglas 38 1 4 3 2 2 4 3 2 doughnut 2 Dougherty 2 dough 38 1 4 3 2 2 hl 4 1 2 Doug 38 1 4 3 2 2 lt 4 0 38 1 4 3 2 2 4 2 2 doubtful 2 doubt 38 1 4 3 2 2 e 4 1 2 doubloon 38 1 4 3 2 2 t 4 3 2 doubleheader 2 Doubleday 2 double 38 1 4 3 2 2 4 2 2 doubleton 2 doublet 38 1 4 3 2 2 bg 4 3 2 douse 2 dour 2 douce 38 1 4 3 2 2 4 2 2 dote 2 dot 38 1 4 3 2 2 4 5 2 Dostoevsky 2 dossier 2 dosimeter 2 dose 2 dosage 38 1 4 3 2 th 2 4 2 2 Dorothy 2 Dorothea 38 1 4 3 2 2 4 2 2 dormitory 2 dormant 38 1 4 3 2 2 4 3 2 Doris 2 Doric 2 Doria 38 1 4 3 2 2 4 2 2 Dorchester 2 Dorcas 38 1 4 3 2 2 4 2 2 Dorado 2 Dora 38 1 4 3 2 2 acimo 4 3 2 Dortmund 2 Dorset 2 Doreen 38 1 4 3 2 2 4 3 2 Doppler 2 dope 2 dopant 38 1 4 3 2 2 4 2 2 doormen 2 doorman 38 1 4 3 2 ep 2 4 2 2 doorkeeper 2 doorkeep 38 1 4 3 2 2 e 4 1 2 doorknob 38 1 4 3 2 2 kms 4 3 2 doorway 2 doorbell 2 door 38 1 4 3 2 2 4 2 2 doomsday 2 doom 38 1 4 3 2 2 4 2 2 Doolittle 2 Dooley 38 1 4 3 2 2 lmr 4 1 2 doodle 38 1 4 3 2 2 4 2 2 Donovan 2 donor 38 1 4 3 2 2 4 2 2 Donner 2 Donnelly 38 1 4 3 2 2 e 4 2 2 donnybrook 2 Donna 38 1 4 3 2 2 4 2 2 Doneck 2 done 38 1 4 3 2 d 2 4 2 2 Donaldson 2 Donald 38 1 4 3 2 2 l 4 2 2 donate 2 Donahue 38 1 4 3 2 2 aeno 4 3 2 don't 2 donkey 2 don 38 1 4 3 2 2 4 3 2 Dominick 2 Dominican 2 Dominic 38 1 4 3 2 2 c 4 2 2 Dominique 2 dominion 38 1 4 3 2 2 4 2 2 dominate 2 dominant 38 1 4 3 2 2 ai 4 3 2 domino 2 Domingo 2 domineer 38 1 4 3 2 2 n 4 1 2 domicile 38 1 4 3 2 2 4 2 2 domestic 2 Domesday 38 1 4 3 2 2 s 4 2 2 Domenico 2 dome 38 1 4 3 2 2 ei 4 1 2 domain 38 1 4 3 2 2 4 2 2 doltish 2 dolt 38 1 4 3 2 it 2 4 2 2 dolomitic 2 dolomite 38 1 4 3 2 2 m 4 1 2 Dolores 38 1 4 3 2 2 a 4 3 2 dolly 2 dollop 2 doll 38 1 4 3 2 2 4 2 2 doleful 2 dole 38 1 4 3 2 2 elot 4 4 2 dolphin 2 doldrum 2 dolce 2 Dolan 38 1 4 3 2 2 4 2 2 dogtrot 2 dogtooth 38 1 4 3 2 i 2 4 2 2 dogmatism 2 dogmatic 38 1 4 3 2 a 2 t 4 1 2 dogma 38 1 4 3 2 2 4 2 2 doggone 2 dogging 38 1 4 3 2 2 4 2 2 dogberry 2 dogbane 38 1 4 3 2 2 bgmt 4 6 2 dogwood 2 dogleg 2 doghouse 2 dogfish 2 Doge 2 dog 38 1 4 3 2 2 s 4 1 2 doe 38 1 4 3 2 2 4 2 2 dodecahedral 2 dodecahedra 38 1 4 3 2 cahedr 2 a 4 1 2 dodecahedron 38 1 4 3 2 2 e 4 5 2 Dodson 2 dodo 2 dodge 2 Dodd 2 DOD 38 1 4 3 2 2 4 2 2 documentation 2 documentary 38 1 4 3 2 ment 2 a 4 1 2 document 38 1 4 3 2 2 4 2 2 doctrinal 2 doctrinaire 38 1 4 3 2 in 2 a 4 1 2 doctrine 38 1 4 3 2 r 2 a 4 1 2 doctor 38 1 4 3 2 2 4 2 2 doctorate 2 doctoral 38 1 4 3 2 2 or 4 0 38 1 4 3 2 2 4 4 2 dockyard 2 dockside 2 docket 2 dock 38 1 4 3 2 2 ktu 4 1 2 docile 38 1 4 3 2 2 4 2 2 Dobbs 2 Dobbin 38 1 4 3 2 2 b 4 2 2 dobson 2 doberman 38 1 4 3 2 2 bcdeglmnoprstuvwz 4 5 2 doing 2 Doyle 2 Doherty 2 doff 2 do 38 1 4 3 2 2 4 2 2 Dnieper 2 DNA 38 1 4 3 2 e 2 4 2 2 dixieland 2 Dixie 38 1 4 3 2 2 i 4 1 2 Dixon 38 1 4 3 2 rce 2 4 2 2 divorcee 2 divorce 38 1 4 3 2 2 4 3 2 divisive 2 division 2 divisible 38 1 4 3 2 2 i 4 1 2 divisor 38 1 4 3 2 2 4 2 2 divine 2 divination 38 1 4 3 2 e 2 4 2 2 dividend 2 divide 38 1 4 3 2 2 dns 4 0 38 1 4 3 2 t 2 4 2 2 divestiture 2 divest 38 1 4 3 2 n 2 4 2 2 diversionary 2 diversion 38 1 4 3 2 2 o 4 1 2 diversify 38 1 4 3 2 2 i 4 1 2 diverse 38 1 4 3 2 e 2 4 2 2 divergent 2 diverge 38 1 4 3 2 2 gs 4 1 2 divert 38 1 4 3 2 2 rs 4 1 2 dive 38 1 4 3 2 2 4 3 2 divan 2 divalent 2 diva 38 1 4 3 2 2 aeio 4 1 2 divulge 38 1 4 3 2 2 4 2 2 ditty 2 ditto 38 1 4 3 2 2 t 4 2 2 dither 2 ditch 38 1 4 3 2 rb 2 4 2 2 disturbance 2 disturb 38 1 4 3 2 ut 2 i 4 1 2 distributor 38 1 4 3 2 2 4 2 2 distributive 2 distribution 38 1 4 3 2 2 b 4 1 2 district 38 1 4 3 2 2 i 4 1 2 distraught 38 1 4 3 2 2 4 2 2 distinguish 2 distinct 38 1 4 3 2 l 2 4 2 2 distillery 2 distillate 38 1 4 3 2 2 ln 4 0 38 1 4 3 2 2 4 3 2 distant 2 distal 2 distaff 38 1 4 3 2 2 airu 4 1 2 distort 38 1 4 3 2 2 4 2 2 dissipate 2 dissident 38 1 4 3 2 2 m 4 2 2 dissertation 2 dissension 38 1 4 3 2 2 4 2 2 disseminate 2 dissemble 38 1 4 3 2 2 ei 4 2 2 dissuade 2 dissociate 38 1 4 3 2 2 4 2 2 disruptive 2 disruption 38 1 4 3 2 upt 2 i 4 1 2 disrupt 38 1 4 3 2 ui 2 4 2 2 disquisition 2 disquietude 38 1 4 3 2 t 2 4 2 2 dispute 2 disputant 38 1 4 3 2 sa 2 4 2 2 disposal 2 disposable 38 1 4 3 2 2 4 3 2 dispersive 2 dispersion 2 dispersible 38 1 4 3 2 s 2 i 4 2 2 disperse 2 dispersal 38 1 4 3 2 2 4 3 2 dispensate 2 dispensary 2 dispensable 38 1 4 3 2 s 2 a 4 1 2 dispense 38 1 4 3 2 2 l 4 1 2 dispel 38 1 4 3 2 2 4 2 2 dispelling 2 dispelled 38 1 4 3 2 2 lnr 4 0 38 1 4 3 2 ra 2 4 2 2 disparate 2 disparage 38 1 4 3 2 2 aeou 4 1 2 display 38 1 4 3 2 ey 2 4 2 2 Disneyland 2 Disney 38 1 4 3 2 2 4 2 2 dismissal 2 dismal 38 1 4 3 2 a 2 4 2 2 dishwater 2 dishwasher 38 1 4 3 2 2 w 4 2 2 dishevel 2 dish 38 1 4 3 2 2 4 2 2 disgustful 2 disgruntle 38 1 4 3 2 ain 2 4 2 2 disdainful 2 disdain 38 1 4 3 2 2 4 3 2 discussion 2 discussant 2 discuss 38 1 4 3 2 s 2 s 4 1 2 discus 38 1 4 3 2 2 4 2 2 discriminatory 2 discriminate 38 1 4 3 2 mina 2 t 4 2 2 discriminant 2 discriminable 38 1 4 3 2 2 t 4 2 2 discrepant 2 discreet 38 1 4 3 2 on 2 4 2 2 discretionary 2 discretion 38 1 4 3 2 2 i 4 1 2 discrete 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 4 2 discovery 2 discordant 2 discomfit 2 discoid 38 1 4 3 2 n 2 4 2 2 discipline 2 disciplinary 38 1 4 3 2 pl 2 i 4 1 2 disciple 38 1 4 3 2 rn 2 4 2 2 discernible 2 discern 38 1 4 3 2 2 eioru 4 2 2 discarded 2 disc 38 1 4 3 2 2 4 5 2 disappears 2 disagree 2 disastrous 2 disambiguate 2 disaccharide 38 1 4 3 2 2 acdghmnpqrst 4 7 2 disyllable 2 disulfide 2 disk 2 disjunct 2 disembowel 2 disburse 2 Dis 38 1 4 3 2 2 4 2 2 dirty 2 dirt 38 1 4 3 2 i 2 4 2 2 directrix 2 directrices 38 1 4 3 2 r 2 4 3 2 directory 2 directorate 2 director 38 1 4 3 2 t 2 or 4 3 2 directed 2 directly 2 direct 38 1 4 3 2 2 c 4 1 2 dire 38 1 4 3 2 2 et 4 3 2 Dirichlet 2 dirge 2 Dirac 38 1 4 3 2 2 4 2 2 diplomatic 2 diplomat 38 1 4 3 2 a 2 t 4 2 2 diplomacy 2 diploma 38 1 4 3 2 d 2 4 2 2 diploidy 2 diploid 38 1 4 3 2 o 2 im 4 0 38 1 4 3 2 th 2 4 2 2 diphthong 2 diphtheria 38 1 4 3 2 2 hl 4 2 2 dipole 2 dip 38 1 4 3 2 2 4 2 2 diorite 2 diorama 38 1 4 3 2 2 4 2 2 diopter 2 Diophantine 38 1 4 3 2 ys 2 4 2 2 Dionysus 2 Dionysian 38 1 4 3 2 es 2 4 2 2 diocese 2 diocesan 38 1 4 3 2 2 cnpr 4 2 2 dioxide 2 diode 38 1 4 3 2 er 2 4 2 2 dinnerware 2 dinnertime 38 1 4 3 2 2 4 4 2 dingy 2 dingo 2 dinghy 2 ding 38 1 4 3 2 2 gn 4 5 2 dint 2 dinosaur 2 dine 2 Dinah 2 din 38 1 4 3 2 ti 2 4 2 2 diminutive 2 diminution 38 1 4 3 2 n 2 u 4 1 2 diminish 38 1 4 3 2 2 4 3 2 dimethyl 2 dimension 2 dime 38 1 4 3 2 2 ei 4 2 2 dimple 2 dim 38 1 4 3 2 2 4 2 2 dilution 2 dilute 38 1 4 3 2 2 t 4 1 2 diluent 38 1 4 3 2 2 4 2 2 Dillon 2 dill 38 1 4 3 2 2 4 2 2 dilettante 2 dilemma 38 1 4 3 2 2 t 4 1 2 dilapidate 38 1 4 3 2 2 4 3 2 dilatory 2 dilate 2 dilatation 38 1 4 3 2 2 aelu 4 2 2 dilogarithm 2 diligent 38 1 4 3 2 ss 2 4 2 2 digression 2 digress 38 1 4 3 2 2 e 4 1 2 digram 38 1 4 3 2 2 4 2 2 dignity 2 dignitary 38 1 4 3 2 i 2 t 4 1 2 dignify 38 1 4 3 2 l 2 4 2 2 digitalis 2 digital 38 1 4 3 2 t 2 a 4 1 2 digit 38 1 4 3 2 2 4 3 2 digestive 2 digestion 2 digestible 38 1 4 3 2 st 2 i 4 1 2 digest 38 1 4 3 2 2 einr 4 2 2 digging 2 dig 38 1 4 3 2 2 eiru 4 0 38 1 4 3 2 2 4 3 2 diffusive 2 diffusion 2 diffusible 38 1 4 3 2 s 2 i 4 1 2 diffuse 38 1 4 3 2 act 2 4 2 2 diffractometer 2 diffract 38 1 4 3 2 ult 2 4 2 2 difficulty 2 difficult 38 1 4 3 2 2 c 4 1 2 diffident 38 1 4 3 2 2 or 4 0 38 1 4 3 2 a 2 4 3 2 differentiate 2 differential 2 differentiable 38 1 4 3 2 nt 2 i 4 2 2 differently 2 different 38 1 4 3 2 2 e 4 1 2 differ 38 1 4 3 2 morphi 2 4 2 2 diffeomorphism 2 diffeomorphic 38 1 4 3 2 2 f 4 1 2 difluoride 38 1 4 3 2 2 4 8 2 Dietz 2 diety 2 Dietrich 2 dietician 2 diethylstilbestrol 2 dietetic 2 dietary 2 diet 38 1 4 3 2 2 4 2 2 dielectric 2 dieldrin 38 1 4 3 2 2 lt 4 6 2 diesel 2 diem 2 diehard 2 Diego 2 Diebold 2 die 38 1 4 3 2 2 4 5 2 Dido 2 didn't 2 diddle 2 didactic 2 did 38 1 4 3 2 on 2 4 2 2 dictionary 2 diction 38 1 4 3 2 2 t 4 1 2 dicta 38 1 4 3 2 2 4 2 2 dictatorial 2 dictate 38 1 4 3 2 2 ai 4 1 2 dictum 38 1 4 3 2 2 4 3 2 dickey 2 Dickerson 2 dickens 38 1 4 3 2 2 e 4 4 2 Dickson 2 Dickinson 2 dickcissel 2 dick 38 1 4 3 2 2 4 2 2 dichotomy 2 dichondra 38 1 4 3 2 2 o 4 1 2 dichloride 38 1 4 3 2 2 hkt 4 2 2 dicotyledon 2 dice 38 1 4 3 2 2 bcglmnpt 4 2 2 diary 2 diadem 38 1 4 3 2 2 4 3 2 diatomic 2 diatomaceous 2 diatom 38 1 4 3 2 2 m 4 1 2 diatonic 38 1 4 3 2 e 2 4 2 2 diathesis 2 diathermy 38 1 4 3 2 2 ho 4 0 38 1 4 3 2 2 4 2 2 diaphragm 2 diaphanous 38 1 4 3 2 2 h 4 2 2 diapason 2 diaper 38 1 4 3 2 2 4 3 2 Dianne 2 Diane 2 Diana 38 1 4 3 2 gneti 2 4 2 2 diamagnetism 2 diamagnetic 38 1 4 3 2 2 a 4 2 2 diamond 2 diameter 38 1 4 3 2 ct 2 4 2 2 dialectic 2 dialect 38 1 4 3 2 2 e 4 4 2 dialysis 2 dialup 2 dialogue 2 dial 38 1 4 3 2 am 2 4 2 2 diagrammatic 2 diagram 38 1 4 3 2 os 2 t 4 3 2 diagnosis 2 diagnose 2 diagnosable 38 1 4 3 2 ic 2 4 2 2 diagnostician 2 diagnostic 38 1 4 3 2 2 nr 4 1 2 diagonal 38 1 4 3 2 2 4 2 2 diacritic 2 diachronic 38 1 4 3 2 2 e 4 2 2 diabolic 2 diabase 38 1 4 3 2 t 2 4 2 2 diabetic 2 diabetes 38 1 4 3 2 2 acdefglmnoprstvx 4 4 2 dizzy 2 diurnal 2 dihedral 2 dibble 38 1 4 3 2 a 2 4 2 2 dharma 2 Dhabi 38 1 4 3 2 o 2 4 2 2 dextrous 2 dextrose 38 1 4 3 2 r 2 4 2 2 dexterity 2 dexter 38 1 4 3 2 t 2 er 4 0 38 1 4 3 2 2 4 6 2 dewy 2 Dewitt 2 Dewey 2 dewdrop 2 dewar 2 dew 38 1 4 3 2 2 4 2 2 devout 2 devour 38 1 4 3 2 2 4 2 2 devotee 2 devote 38 1 4 3 2 2 e 4 1 2 devotion 38 1 4 3 2 2 4 2 2 Devonshire 2 Devon 38 1 4 3 2 2 ntu 4 2 2 devolve 2 devoid 38 1 4 3 2 e 2 4 2 2 devisee 2 devise 38 1 4 3 2 2 4 2 2 devilish 2 devil 38 1 4 3 2 2 4 2 2 deviate 2 deviant 38 1 4 3 2 2 als 4 2 2 devious 2 device 38 1 4 3 2 2 ioe 4 1 2 devastate 38 1 4 3 2 er 2 4 2 2 deuterium 2 deuterate 38 1 4 3 2 2 t 4 2 2 deus 2 deuce 38 1 4 3 2 ct 2 4 2 2 detractor 2 detract 38 1 4 3 2 2 a 4 2 2 Detroit 2 detriment 38 1 4 3 2 a 2 4 2 2 detonate 2 detonable 38 1 4 3 2 2 n 4 2 2 detoxify 2 detour 38 1 4 3 2 t 2 4 2 2 detestation 2 detest 38 1 4 3 2 2 4 2 2 deterrent 2 deterred 38 1 4 3 2 2 e 4 1 2 deterring 38 1 4 3 2 2 4 2 2 determinate 2 determinant 38 1 4 3 2 in 2 a 4 1 2 determine 38 1 4 3 2 2 mr 4 3 2 deteriorate 2 detergent 2 deter 38 1 4 3 2 t 2 4 3 2 detention 2 detente 2 detent 38 1 4 3 2 t 2 4 2 2 detector 2 detect 38 1 4 3 2 2 cnrs 4 0 38 1 4 3 2 2 i 4 1 2 detach 38 1 4 3 2 2 4 4 2 d's 2 d'oeuvre 2 d'etat 2 d'art 38 1 4 3 2 2 4 2 2 detain 2 detail 38 1 4 3 2 2 aeor 4 0 38 1 4 3 2 2 4 2 2 desultory 2 desuetude 38 1 4 3 2 ct 2 4 2 2 destructor 2 destruct 38 1 4 3 2 2 u 4 1 2 destroy 38 1 4 3 2 2 n 4 1 2 destitute 38 1 4 3 2 2 4 3 2 destiny 2 destine 2 destinate 38 1 4 3 2 2 ir 4 0 38 1 4 3 2 2 4 2 2 dessicate 2 dessert 38 1 4 3 2 2 4 2 2 despotic 2 despot 38 1 4 3 2 d 2 4 2 2 despondent 2 despond 38 1 4 3 2 2 nt 4 1 2 despoil 38 1 4 3 2 2 4 3 2 despite 2 despise 2 despicable 38 1 4 3 2 ra 2 4 2 2 desperate 2 desperado 38 1 4 3 2 2 eio 4 1 2 despair 38 1 4 3 2 ate 2 4 2 2 desolater 2 desolate 38 1 4 3 2 2 l 4 1 2 desorption 38 1 4 3 2 2 4 2 2 desirous 2 desire 38 1 4 3 2 n 2 4 4 2 designs 2 designed 2 designate 2 design 38 1 4 3 2 erat 2 4 2 2 desideratum 2 desiderata 38 1 4 3 2 2 dgr 4 1 2 desist 38 1 4 3 2 2 4 2 2 deserve 2 desert 38 1 4 3 2 rate 2 4 2 2 desecrater 2 desecrate 38 1 4 3 2 2 cr 4 1 2 desegregate 38 1 4 3 2 2 4 2 2 descriptive 2 description 38 1 4 3 2 t 2 i 4 1 2 descriptor 38 1 4 3 2 i 2 pb 4 0 38 1 4 3 2 2 4 3 2 descendent 2 descendant 2 descend 38 1 4 3 2 n 2 d 4 1 2 descent 38 1 4 3 2 2 4 2 2 Descartes 2 descant 38 1 4 3 2 2 aer 4 0 38 1 4 3 2 2 ceiopstu 4 3 2 Desmond 2 desk 2 Des 38 1 4 3 2 i 2 4 2 2 derriere 2 derrick 38 1 4 3 2 gat 2 4 2 2 derogatory 2 derogate 38 1 4 3 2 2 4 2 2 derive 2 derivate 38 1 4 3 2 i 2 4 2 2 derisive 2 derision 38 1 4 3 2 2 sv 4 1 2 deride 38 1 4 3 2 2 4 4 2 derelict 2 Derek 2 deregulate 2 dereference 38 1 4 3 2 y 2 4 2 2 Derbyshire 2 derby 38 1 4 3 2 2 4 3 2 derate 2 derange 2 derail 38 1 4 3 2 2 abeior 4 1 2 dervish 38 1 4 3 2 t 2 4 3 2 deputy 2 depute 2 deputation 38 1 4 3 2 v 2 4 2 2 deprive 2 deprivation 38 1 4 3 2 2 4 3 2 depressive 2 depression 2 depressible 38 1 4 3 2 s 2 i 4 3 2 depressor 2 depressant 2 depress 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 a 2 4 2 2 depreciate 2 depreciable 38 1 4 3 2 t 2 4 2 2 deprecatory 2 deprecate 38 1 4 3 2 2 cs 4 0 38 1 4 3 2 2 ei 4 1 2 deprave 38 1 4 3 2 r 2 4 2 2 depository 2 depositor 38 1 4 3 2 t 2 o 4 3 2 deposition 2 depositary 2 deposit 38 1 4 3 2 2 i 4 1 2 depose 38 1 4 3 2 t 2 4 3 2 deportee 2 deportation 2 deport 38 1 4 3 2 2 rs 4 1 2 depot 38 1 4 3 2 2 4 2 2 deploy 2 deplore 38 1 4 3 2 t 2 4 2 2 depletion 2 deplete 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 nd 2 4 2 2 dependent 2 depend 38 1 4 3 2 rt 2 m 4 2 2 departure 2 depart 38 1 4 3 2 2 aeloru 4 2 2 depth 2 depict 38 1 4 3 2 yribo 2 4 2 2 deoxyribose 2 deoxyribonucleic 38 1 4 3 2 2 x 4 1 2 deodorant 38 1 4 3 2 2 4 2 2 denude 2 denudation 38 1 4 3 2 2 d 4 2 2 denunciate 2 denumerable 38 1 4 3 2 2 4 5 2 denture 2 Denton 2 dentistry 2 dental 2 dent 38 1 4 3 2 2 4 2 2 densitometer 2 dense 38 1 4 3 2 2 4 2 2 denounce 2 denouement 38 1 4 3 2 ti 2 4 2 2 denotative 2 denotation 38 1 4 3 2 2 a 4 1 2 denote 38 1 4 3 2 2 tu 4 1 2 denominate 38 1 4 3 2 2 4 2 2 Denny 2 Dennis 38 1 4 3 2 2 4 2 2 denial 2 deniable 38 1 4 3 2 2 a 4 3 2 denied 2 denizen 2 denigrate 38 1 4 3 2 b 2 4 2 2 Denebola 2 Deneb 38 1 4 3 2 rit 2 4 2 2 dendritic 2 dendrite 38 1 4 3 2 2 deinostu 4 5 2 deny 2 Denver 2 Denmark 2 denature 2 den 38 1 4 3 2 2 4 2 2 demurrer 2 demurred 38 1 4 3 2 2 e 4 1 2 demurring 38 1 4 3 2 2 r 4 2 2 demure 2 demur 38 1 4 3 2 2 r 4 1 2 demultiplex 38 1 4 3 2 tra 2 4 2 2 demonstrate 2 demonstrable 38 1 4 3 2 2 4 2 2 demonic 2 demoniac 38 1 4 3 2 2 is 4 1 2 demon 38 1 4 3 2 i 2 4 2 2 demolition 2 demolish 38 1 4 3 2 ra 2 t 4 1 2 democracy 38 1 4 3 2 2 4 2 2 democratic 2 democrat 38 1 4 3 2 2 cln 4 4 2 demountable 2 demote 2 demography 2 demodulate 38 1 4 3 2 2 4 2 2 demitting 2 demitted 38 1 4 3 2 2 t 4 1 2 demit 38 1 4 3 2 2 4 2 2 demise 2 demiscible 38 1 4 3 2 2 st 4 2 2 demijohn 2 demigod 38 1 4 3 2 t 2 4 2 2 dementia 2 demented 38 1 4 3 2 2 n 4 2 2 demerit 2 demean 38 1 4 3 2 2 grn 4 0 38 1 4 3 2 2 4 2 2 demark 2 demarcate 38 1 4 3 2 2 4 2 2 demagogue 2 demagnify 38 1 4 3 2 2 aeiou 4 2 2 demystify 2 Dempsey 38 1 4 3 2 i 2 4 2 2 delusive 2 delusion 38 1 4 3 2 2 s 4 3 2 deluxe 2 deluge 2 delude 38 1 4 3 2 2 4 2 2 deltoid 2 delta 38 1 4 3 2 2 4 3 2 Delphinus 2 delphinium 2 delphine 38 1 4 3 2 hi 2 n 4 2 2 Delphic 2 Delphi 38 1 4 3 2 2 4 2 2 Della 2 dell 38 1 4 3 2 er 2 4 3 2 delivery 2 deliverance 2 deliver 38 1 4 3 2 i 2 4 2 2 delirium 2 delirious 38 1 4 3 2 uesce 2 4 2 2 deliquescent 2 deliquesce 38 1 4 3 2 a 2 4 2 2 delineate 2 delineament 38 1 4 3 2 2 e 4 1 2 delinquent 38 1 4 3 2 it 2 4 2 2 delimitation 2 delimit 38 1 4 3 2 ht 2 4 2 2 delightful 2 delight 38 1 4 3 2 2 t 4 1 2 delicacy 38 1 4 3 2 e 2 4 2 2 delicatessen 2 delicate 38 1 4 3 2 2 a 4 2 2 delicti 2 delicious 38 1 4 3 2 2 cgmnqrvb 4 2 2 Delilah 2 Delia 38 1 4 3 2 2 4 3 2 deleted 2 deleterious 2 delete 38 1 4 3 2 2 e 4 1 2 deletion 38 1 4 3 2 a 2 4 2 2 delegate 2 delegable 38 1 4 3 2 ta 2 4 2 2 delectate 2 delectable 38 1 4 3 2 2 cgt 4 0 38 1 4 3 2 2 4 2 2 Delano 2 Delaney 38 1 4 3 2 2 n 4 2 2 delay 2 Delaware 38 1 4 3 2 2 aeilptu 4 6 2 delve 2 delouse 2 Delmarva 2 Delhi 2 Delft 2 Del 38 1 4 3 2 2 4 2 2 deject 2 deja 38 1 4 3 2 2 4 3 2 deity 2 deign 2 deify 38 1 4 3 2 2 4 2 2 dehydrate 2 dehumidify 38 1 4 3 2 m 2 4 2 2 degumming 2 degum 38 1 4 3 2 2 4 2 2 degree 2 degrease 38 1 4 3 2 d 2 4 2 2 degrade 2 degradation 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 nera 2 4 2 2 degenerate 2 degeneracy 38 1 4 3 2 s 2 4 2 2 degassing 2 degas 38 1 4 3 2 2 aeru 4 0 38 1 4 3 2 2 4 2 2 defray 2 defraud 38 1 4 3 2 2 a 4 1 2 defrost 38 1 4 3 2 2 4 2 2 deformation 2 deform 38 1 4 3 2 st 2 4 2 2 deforestation 2 deforest 38 1 4 3 2 2 em 4 0 38 1 4 3 2 2 r 4 1 2 defocus 38 1 4 3 2 ct 2 4 2 2 deflector 2 deflect 38 1 4 3 2 te 2 4 2 2 deflater 2 deflate 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 definitive 2 definition 38 1 4 3 2 t 2 ie 4 0 38 1 4 3 2 2 ie 4 0 38 1 4 3 2 i 2 4 2 2 deficit 2 deficient 38 1 4 3 2 2 cn 4 1 2 defiant 38 1 4 3 2 2 4 3 2 deferring 2 deferred 2 deferrable 38 1 4 3 2 2 r 4 2 2 deferent 2 defer 38 1 4 3 2 2 i 4 1 2 defense 38 1 4 3 2 2 4 2 2 defendant 2 defend 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 2 4 2 2 defector 2 defect 38 1 4 3 2 2 t 4 1 2 defecate 38 1 4 3 2 2 cnr 4 1 2 defeat 38 1 4 3 2 2 u 4 1 2 deface 38 1 4 3 2 2 aeilor 4 3 2 defy 2 defunct 2 deft 38 1 4 3 2 2 4 2 2 deerstalker 2 deerskin 38 1 4 3 2 2 s 4 2 2 Deere 2 deer 38 1 4 3 2 2 4 2 2 deepen 2 deep 38 1 4 3 2 2 pr 4 3 2 deem 2 deed 2 Dee 38 1 4 3 2 2 4 2 2 deductible 2 deduct 38 1 4 3 2 c 2 t 4 2 2 deducible 2 deduce 38 1 4 3 2 2 u 4 1 2 dedicate 38 1 4 3 2 t 2 4 2 2 decryption 2 decrypt 38 1 4 3 2 2 p 4 1 2 decry 38 1 4 3 2 2 e 4 2 2 decrement 2 decrease 38 1 4 3 2 2 4 2 2 decreeing 2 decree 38 1 4 3 2 2 ey 4 0 38 1 4 3 2 2 4 5 2 decorum 2 decorticate 2 decorous 2 decorate 2 decor 38 1 4 3 2 ol 2 4 2 2 deconvolve 2 deconvolution 38 1 4 3 2 rol 2 l 4 1 2 decontrol 38 1 4 3 2 2 4 2 2 decontrolling 2 decontrolled 38 1 4 3 2 2 tv 4 0 38 1 4 3 2 ess 2 4 2 2 decompression 2 decompress 38 1 4 3 2 s 2 4 3 2 decomposition 2 decompose 2 decomposable 38 1 4 3 2 p 2 or 4 1 2 decompile 38 1 4 3 2 2 4 2 2 decollimate 2 decolletage 38 1 4 3 2 2 l 4 1 2 decolonize 38 1 4 3 2 2 lmnr 4 2 2 decouple 2 decode 38 1 4 3 2 2 4 2 2 decline 2 declination 38 1 4 3 2 2 n 4 1 2 declivity 38 1 4 3 2 2 mr 4 2 2 declassify 2 declaim 38 1 4 3 2 t 2 io 4 0 38 1 4 3 2 r 2 4 2 2 declaratory 2 declarator 38 1 4 3 2 2 4 2 2 declarative 2 declaration 38 1 4 3 2 2 a 4 1 2 declare 38 1 4 3 2 at 2 4 2 2 declamatory 2 declamation 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 i 2 o 4 1 2 decisive 38 1 4 3 2 a 2 4 2 2 decimate 2 decimal 38 1 4 3 2 2 e 4 2 2 deciding 2 deciduous 38 1 4 3 2 2 dms 4 3 2 decipher 2 decile 2 decibel 38 1 4 3 2 ti 2 4 2 2 deceptive 2 deception 38 1 4 3 2 2 4 2 2 decent 2 decennial 38 1 4 3 2 2 4 2 2 deceitful 2 deceit 38 1 4 3 2 2 t 4 1 2 deceive 38 1 4 3 2 2 inp 4 5 2 decertify 2 December 2 decelerate 2 decedent 2 decease 38 1 4 3 2 2 4 2 2 Decatur 2 decathlon 38 1 4 3 2 e 2 4 2 2 decadent 2 decade 38 1 4 3 2 2 dt 4 3 2 decay 2 decant 2 decal 38 1 4 3 2 2 aeilor 4 3 2 deck 2 Decca 2 Dec 38 1 4 3 2 2 4 2 2 debutante 2 debut 38 1 4 3 2 2 g 4 1 2 debug 38 1 4 3 2 2 4 2 2 debugger 2 debugged 38 1 4 3 2 2 e 4 1 2 debugging 38 1 4 3 2 2 gt 4 2 2 Debussy 2 debunk 38 1 4 3 2 2 4 2 2 debtor 2 debt 38 1 4 3 2 2 4 2 2 debris 2 debrief 38 1 4 3 2 2 i 4 1 2 Debra 38 1 4 3 2 2 4 2 2 Deborah 2 debonair 38 1 4 3 2 it 2 4 2 2 debility 2 debilitate 38 1 4 3 2 2 l 4 1 2 debit 38 1 4 3 2 2 4 2 2 Debby 2 Debbie 38 1 4 3 2 2 rtu 4 2 2 debase 2 debacle 38 1 4 3 2 ch 2 4 2 2 debauchery 2 debauch 38 1 4 3 2 e 2 4 2 2 debater 2 debate 38 1 4 3 2 2 4 2 2 debarring 2 debar 38 1 4 3 2 2 abiortu 4 1 2 debenture 38 1 4 3 2 h 2 4 3 2 deathward 2 deathbed 2 death 38 1 4 3 2 2 4 4 2 dearth 2 dearie 2 Dearborn 2 dear 38 1 4 3 2 2 4 3 2 Deanna 2 Deane 2 dean 38 1 4 3 2 2 4 4 2 deals 2 dealt 2 deallocate 2 deal 38 1 4 3 2 2 4 2 2 deafen 2 deaf 38 1 4 3 2 2 4 2 2 deadlock 2 deadline 38 1 4 3 2 2 l 4 4 2 deadwood 2 deadhead 2 deaden 2 dead 38 1 4 3 2 2 o 4 1 2 deactivate 38 1 4 3 2 n 2 4 2 2 deaconess 2 deacon 38 1 4 3 2 2 cdflnrt 4 0 38 1 4 3 2 2 abcdefghijlmnoprstuvwx 4 2 2 dey 2 De 38 1 4 3 2 2 4 2 2 dazzle 2 daze 38 1 4 3 2 n 2 4 2 2 Daytona 2 Dayton 38 1 4 3 2 2 o 4 1 2 daytime 38 1 4 3 2 2 4 2 2 daybreak 2 daybed 38 1 4 3 2 2 bt 4 4 2 days 2 daylight 2 daydream 2 day 38 1 4 3 2 2 4 2 2 Dawson 2 dawn 38 1 4 3 2 2 4 2 2 Davison 2 Davis 38 1 4 3 2 2 4 2 2 Davidson 2 David 38 1 4 3 2 2 ds 4 2 2 davit 2 Davies 38 1 4 3 2 2 4 2 2 davenport 2 Dave 38 1 4 3 2 2 ei 4 1 2 Davy 38 1 4 3 2 hin 2 4 2 2 dauphine 2 dauphin 38 1 4 3 2 h 2 4 2 2 daughter 2 Daugherty 38 1 4 3 2 2 gp 4 2 2 daunt 2 daub 38 1 4 3 2 2 4 4 2 dates 2 dater 2 dateline 2 date 38 1 4 3 2 2 4 2 2 database 2 data 38 1 4 3 2 2 ae 4 2 2 datum 2 Datsun 38 1 4 3 2 2 4 2 2 dashboard 2 dash 38 1 4 3 2 2 h 4 1 2 dastard 38 1 4 3 2 in 2 4 2 2 Darwinian 2 Darwin 38 1 4 3 2 2 4 2 2 Dartmouth 2 dart 38 1 4 3 2 2 4 2 2 Darry 2 Darrell 38 1 4 3 2 2 4 2 2 darling 2 Darlene 38 1 4 3 2 2 4 3 2 darkle 2 darken 2 dark 38 1 4 3 2 2 klrtw 4 5 2 DARPA 2 darn 2 Darius 2 dare 2 Dar 38 1 4 3 2 2 4 2 2 dapple 2 dapper 38 1 4 3 2 2 p 4 1 2 Daphne 38 1 4 3 2 b 2 4 2 2 Danubian 2 Danube 38 1 4 3 2 l 2 4 2 2 Danielson 2 Daniel 38 1 4 3 2 2 e 4 1 2 Danish 38 1 4 3 2 r 2 4 2 2 dangerous 2 danger 38 1 4 3 2 2 e 4 2 2 dangle 2 dang 38 1 4 3 2 2 4 2 2 dandy 2 dandelion 38 1 4 3 2 2 dgiu 4 9 2 Danzig 2 Dante 2 Danny 2 dank 2 Dane 2 dance 2 Danbury 2 Dana 2 Dan 38 1 4 3 2 2 4 2 2 dampen 2 damp 38 1 4 3 2 2 4 2 2 damnation 2 damn 38 1 4 3 2 2 4 2 2 damask 2 Damascus 38 1 4 3 2 2 s 4 1 2 damage 38 1 4 3 2 2 anp 4 4 2 damsel 2 Damon 2 dame 2 dam 38 1 4 3 2 2 4 2 2 dally 2 Dallas 38 1 4 3 2 2 4 2 2 Daley 2 dale 38 1 4 3 2 2 el 4 4 2 Dalzell 2 Daly 2 Dalton 2 Dalhousie 38 1 4 3 2 2 4 2 2 Dakota 2 Dakar 38 1 4 3 2 2 4 2 2 daisy 2 dais 38 1 4 3 2 2 4 2 2 dairymen 2 dairyman 38 1 4 3 2 y 2 m 4 2 2 Dairylea 2 dairy 38 1 4 3 2 2 rs 4 3 2 dainty 2 Daimler 2 Dailey 38 1 4 3 2 2 4 2 2 dahlia 2 Dahl 38 1 4 3 2 2 l 4 1 2 Dahomey 38 1 4 3 2 f 2 4 2 2 daffy 2 daffodil 38 1 4 3 2 2 4 4 2 Dade 2 daddy 2 Dada 2 dad 38 1 4 3 2 yl 2 4 2 2 dactylic 2 dactyl 38 1 4 3 2 2 t 4 2 2 dachshund 2 Dacca 38 1 4 3 2 2 4 2 2 dabble 2 dab 38 1 4 3 2 2 bcdfhiklmnprstuvwyz 4 2 2 dagger 2 Daedalus 38 1 4 3 2 2 ae'hinoruwy 4 3 2 Djakarta 2 DC 2 d 38 1 4 3 2 h 2 4 2 2 Czechoslovakia 2 Czech 38 1 4 3 2 2 c 4 1 2 Czerniak 38 1 4 3 2 r 2 4 2 2 czarina 2 czar 38 1 4 3 2 2 ae 4 1 2 CZ 38 1 4 3 2 o 2 4 4 2 cytosine 2 cytoplasm 2 cytolysis 2 cytochemistry 38 1 4 3 2 t 2 4 2 2 cysteine 2 cyst 38 1 4 3 2 l 2 4 2 2 Cyrillic 2 Cyril 38 1 4 3 2 2 i 4 1 2 Cyrus 38 1 4 3 2 2 4 2 2 Cypriot 2 Cyprian 38 1 4 3 2 r 2 i 4 2 2 Cyprus 2 cypress 38 1 4 3 2 2 i 4 1 2 Cynthia 38 1 4 3 2 ind 2 4 2 2 cylindric 2 cylinder 38 1 4 3 2 2 4 2 2 cyclotron 2 cyclotomic 38 1 4 3 2 2 4 2 2 Cyclops 2 cyclopean 38 1 4 3 2 2 pt 4 2 2 cyclorama 2 cyclone 38 1 4 3 2 2 4 2 2 cyclist 2 cyclic 38 1 4 3 2 2 io 4 2 2 cycle 2 Cyclades 38 1 4 3 2 2 l 4 1 2 cycad 38 1 4 3 2 n 2 ai 4 0 38 1 4 3 2 2 4 2 2 cyanide 2 cyanic 38 1 4 3 2 2 4 2 2 cyanate 2 Cyanamid 38 1 4 3 2 2 aclnprst 4 2 2 Cygnus 2 cybernetic 38 1 4 3 2 e 2 4 2 2 cuttlefish 2 cuttlebone 38 1 4 3 2 2 l 4 1 2 cutthroat 38 1 4 3 2 2 4 3 2 cutover 2 cutout 2 cutoff 38 1 4 3 2 2 4 2 2 cutlet 2 cutler 38 1 4 3 2 2 e 4 1 2 cutlass 38 1 4 3 2 2 lot 4 6 2 cutworm 2 cutset 2 cute 2 cutback 2 cutaneous 2 cut 38 1 4 3 2 2 e 4 3 2 customhouse 2 customary 2 custom 38 1 4 3 2 2 i 4 1 2 custody 38 1 4 3 2 a 2 4 2 2 custodian 2 custodial 38 1 4 3 2 2 dm 4 0 38 1 4 3 2 2 o 4 1 2 Custer 38 1 4 3 2 2 i 4 1 2 Cushman 38 1 4 3 2 2 4 2 2 cushion 2 Cushing 38 1 4 3 2 2 ht 4 1 2 cusp 38 1 4 3 2 2 4 2 2 curvature 2 curvaceous 38 1 4 3 2 2 a 4 2 2 curvilinear 2 curve 38 1 4 3 2 i 2 4 2 2 curtain 2 curtail 38 1 4 3 2 2 a 4 3 2 curtsey 2 Curtis 2 curt 38 1 4 3 2 r 2 4 2 2 cursory 2 cursor 38 1 4 3 2 2 o 4 2 2 cursive 2 curse 38 1 4 3 2 2 4 2 2 curricular 2 curricula 38 1 4 3 2 cul 2 a 4 1 2 curriculum 38 1 4 3 2 n 2 4 2 2 currant 2 Curran 38 1 4 3 2 2 aie 4 1 2 curry 38 1 4 3 2 2 4 3 2 curlicue 2 curlew 2 curl 38 1 4 3 2 2 4 3 2 curious 2 curiosity 2 curio 38 1 4 3 2 2 o 4 3 2 curium 2 curie 2 curia 38 1 4 3 2 2 4 2 2 curdle 2 curd 38 1 4 3 2 2 4 2 2 curbside 2 curb 38 1 4 3 2 2 bdilrstve 4 3 2 curfew 2 curate 2 cur 38 1 4 3 2 2 4 2 2 cuprous 2 cupric 38 1 4 3 2 d 2 4 2 2 cupidity 2 Cupid 38 1 4 3 2 2 ir 4 3 2 cupful 2 cupboard 2 cup 38 1 4 3 2 ing 2 4 2 2 Cunningham 2 cunning 38 1 4 3 2 2 n 4 2 2 CUNY 2 Cunard 38 1 4 3 2 l 2 4 2 2 cumulus 2 cumulate 38 1 4 3 2 in 2 4 2 2 Cummins 2 Cummings 38 1 4 3 2 er 2 4 2 2 cumbersome 2 Cumberland 38 1 4 3 2 2 bmu 4 1 2 cumin 38 1 4 3 2 er 2 4 2 2 culvert 2 Culver 38 1 4 3 2 r 2 4 2 2 culture 2 cultural 38 1 4 3 2 va 2 4 2 2 cultivate 2 cultivable 38 1 4 3 2 2 iu 4 1 2 cult 38 1 4 3 2 2 4 2 2 culpable 2 culpa 38 1 4 3 2 2 a 4 1 2 culprit 38 1 4 3 2 2 ptv 4 4 2 culminate 2 cull 2 culinary 2 Culbertson 38 1 4 3 2 f 2 4 2 2 cufflink 2 cuff 38 1 4 3 2 l 2 4 2 2 cuddly 2 cuddle 38 1 4 3 2 2 d 4 2 2 cudgel 2 cud 38 1 4 3 2 2 4 2 2 cucumber 2 cuckoo 38 1 4 3 2 2 4 5 2 cubic 2 cube 2 cubbyhole 2 Cuba 2 cub 38 1 4 3 2 2 bcdflmnprst 4 2 2 cuisine 2 cue 38 1 4 3 2 graph 2 4 2 2 crystallography 2 crystallographer 38 1 4 3 2 2 4 2 2 crystallite 2 crystalline 38 1 4 3 2 2 io 4 0 38 1 4 3 2 tal 2 l 4 1 2 crystal 38 1 4 3 2 h 2 4 2 2 cryptography 2 cryptographer 38 1 4 3 2 gra 2 p 4 1 2 cryptogram 38 1 4 3 2 2 4 2 2 cryptanalyst 2 cryptanalysis 38 1 4 3 2 naly 2 s 4 1 2 cryptanalytic 38 1 4 3 2 t 2 ao 4 2 2 cryptic 2 crypt 38 1 4 3 2 2 4 2 2 cryostat 2 cryogenic 38 1 4 3 2 2 ops 4 1 2 cry 38 1 4 3 2 2 4 4 2 crust 2 Crusoe 2 crush 2 crusade 38 1 4 3 2 2 4 2 2 crumple 2 crump 38 1 4 3 2 2 4 2 2 crumble 2 crumb 38 1 4 3 2 2 bp 4 1 2 crummy 38 1 4 3 2 2 4 2 2 cruise 2 Cruickshank 38 1 4 3 2 l 2 4 2 2 cruelty 2 cruel 38 1 4 3 2 2 4 3 2 crude 2 cruddy 2 crud 38 1 4 3 2 i 2 f 4 2 2 crucible 2 crucial 38 1 4 3 2 x 2 4 2 2 crucifixion 2 crucifix 38 1 4 3 2 2 i 4 1 2 crucify 38 1 4 3 2 2 cdeims 4 5 2 Cruz 2 crux 2 crutch 2 crupper 2 crunch 38 1 4 3 2 2 4 2 2 crowberry 2 crowbait 38 1 4 3 2 2 b 4 5 2 crown 2 Crowley 2 crowfoot 2 crowd 2 crow 38 1 4 3 2 2 4 2 2 croupier 2 crouch 38 1 4 3 2 ch 2 4 2 2 crotchety 2 crotch 38 1 4 3 2 2 4 2 2 crossway 2 crosswalk 38 1 4 3 2 2 a 4 2 2 crosswort 2 crosswise 38 1 4 3 2 2 4 2 2 crossbill 2 crossbar 38 1 4 3 2 2 bw 4 9 2 crosstalk 2 crossroad 2 crosspoint 2 crossover 2 crosslink 2 crosshatch 2 crosscut 2 crossarm 2 cross 38 1 4 3 2 2 s 4 1 2 Crosby 38 1 4 3 2 2 4 2 2 croon 2 crook 38 1 4 3 2 2 4 2 2 crony 2 crone 38 1 4 3 2 well 2 4 2 2 Cromwellian 2 Cromwell 38 1 4 3 2 dil 2 4 2 2 crocodilian 2 crocodile 38 1 4 3 2 2 4 2 2 Crockett 2 crockery 38 1 4 3 2 2 e 4 1 2 crock 38 1 4 3 2 2 ko 4 2 2 crocus 2 crochet 38 1 4 3 2 2 4 2 2 Croatia 2 croak 38 1 4 3 2 2 acmnostuw 4 4 2 croydon 2 crop 2 Croix 2 croft 38 1 4 3 2 2 c 4 1 2 critique 38 1 4 3 2 ri 2 4 2 2 criterion 2 criteria 38 1 4 3 2 2 ei 4 1 2 critter 38 1 4 3 2 2 4 2 2 crisscross 2 criss 38 1 4 3 2 2 4 2 2 Crispin 2 crisp 38 1 4 3 2 2 ps 4 2 2 crisis 2 crises 38 1 4 3 2 2 4 2 2 crinkle 2 cringe 38 1 4 3 2 2 4 2 2 Crimea 2 crime 38 1 4 3 2 2 e 4 3 2 crimson 2 crimp 2 criminal 38 1 4 3 2 2 mnst 4 3 2 cripple 2 cricket 2 crib 38 1 4 3 2 2 4 2 2 crewmen 2 crewman 38 1 4 3 2 2 m 4 3 2 crewel 2 crewcut 2 crew 38 1 4 3 2 n 2 4 2 2 cretinous 2 cretin 38 1 4 3 2 2 4 2 2 Cretan 2 Cretaceous 38 1 4 3 2 2 ai 4 1 2 Crete 38 1 4 3 2 2 4 3 2 Crestview 2 crestfallen 2 crest 38 1 4 3 2 en 2 4 2 2 crescent 2 crescendo 38 1 4 3 2 2 ct 4 1 2 cress 38 1 4 3 2 2 4 2 2 crept 2 crepe 38 1 4 3 2 2 4 3 2 creosote 2 Creon 2 Creole 38 1 4 3 2 at 2 4 2 2 crematory 2 cremate 38 1 4 3 2 2 4 2 2 creepy 2 creep 38 1 4 3 2 2 4 2 2 creekside 2 creek 38 1 4 3 2 2 4 2 2 creedal 2 creed 38 1 4 3 2 2 dkp 4 0 38 1 4 3 2 l 2 4 2 2 credulous 2 credulity 38 1 4 3 2 2 4 2 2 creditor 2 credit 38 1 4 3 2 2 t 4 1 2 credible 38 1 4 3 2 n 2 t 4 1 2 credenza 38 1 4 3 2 2 4 2 2 credential 2 credent 38 1 4 3 2 2 eiu 4 1 2 credo 38 1 4 3 2 2 kmt 4 1 2 crease 38 1 4 3 2 2 ei 4 1 2 creature 38 1 4 3 2 2 4 3 2 creamy 2 creamery 2 cream 38 1 4 3 2 2 4 2 2 creaky 2 creak 38 1 4 3 2 2 ademopstw 4 2 2 crevice 2 creche 38 1 4 3 2 2 bcfgmnpstvwyz 4 2 2 Craig 2 cradle 38 1 4 3 2 2 4 2 2 crazy 2 craze 38 1 4 3 2 2 4 2 2 crayon 2 crayfish 38 1 4 3 2 2 4 2 2 crawlspace 2 crawl 38 1 4 3 2 2 l 4 2 2 Crawford 2 craw 38 1 4 3 2 2 4 2 2 craven 2 crave 38 1 4 3 2 2 e 4 1 2 cravat 38 1 4 3 2 e 2 4 2 2 crater 2 crate 38 1 4 3 2 2 4 2 2 crass 2 crash 38 1 4 3 2 2 4 2 2 crappie 2 crap 38 1 4 3 2 2 4 4 2 cranky 2 crankshaft 2 crankcase 2 crank 38 1 4 3 2 2 4 2 2 cranium 2 crania 38 1 4 3 2 2 ik 4 6 2 Cranston 2 cranny 2 Cranford 2 crane 2 Crandall 2 cranberry 38 1 4 3 2 2 4 3 2 cramp 2 Cramer 2 cram 38 1 4 3 2 2 4 2 2 craggy 2 crag 38 1 4 3 2 e 2 4 2 2 craftsperson 2 craftspeople 38 1 4 3 2 2 4 2 2 craftsmen 2 craftsman 38 1 4 3 2 2 mp 4 0 38 1 4 3 2 t 2 s 4 2 2 crafty 2 craft 38 1 4 3 2 k 2 4 3 2 crackpot 2 crackle 2 crack 38 1 4 3 2 2 4 2 2 crabapple 2 crab 38 1 4 3 2 2 aeiouy 4 1 2 CRT 38 1 4 3 2 2 4 2 2 cpu 2 CPA 38 1 4 3 2 2 4 2 2 cozy 2 cozen 38 1 4 3 2 2 4 3 2 coypu 2 coyote 2 coy 38 1 4 3 2 2 4 2 2 coxcomb 2 cox 38 1 4 3 2 2 4 3 2 cowpox 2 cowpony 2 cowpoke 38 1 4 3 2 2 o 4 2 2 cowpunch 2 cowpea 38 1 4 3 2 2 4 2 2 cowmen 2 cowman 38 1 4 3 2 2 4 2 2 cowlick 2 cowl 38 1 4 3 2 2 4 3 2 cowhide 2 cowherd 2 cowhand 38 1 4 3 2 2 4 3 2 cowboy 2 cowbird 2 cowbell 38 1 4 3 2 d 2 4 2 2 cowardice 2 coward 38 1 4 3 2 2 r 4 1 2 Cowan 38 1 4 3 2 2 abhlmp 4 4 2 cowslip 2 cowry 2 coworker 2 cow 38 1 4 3 2 2 4 2 2 covetous 2 covet 38 1 4 3 2 2 4 2 2 coverall 2 coverage 38 1 4 3 2 2 a 4 5 2 covering 2 covered 2 covert 2 coverlet 2 cover 38 1 4 3 2 2 4 3 2 Coventry 2 covenant 2 coven 38 1 4 3 2 2 nrt 4 1 2 cove 38 1 4 3 2 2 r 4 1 2 covalent 38 1 4 3 2 a 2 4 2 2 covariate 2 covariant 38 1 4 3 2 2 i 4 1 2 covary 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 4 2 2 cousin 2 couscous 38 1 4 3 2 2 4 2 2 courtesy 2 courtesan 38 1 4 3 2 2 s 4 1 2 courteous 38 1 4 3 2 2 e 4 6 2 courtyard 2 courtroom 2 Courtney 2 courtier 2 courthouse 2 court 38 1 4 3 2 ge 2 4 2 2 courageous 2 courage 38 1 4 3 2 2 at 4 2 2 course 2 courier 38 1 4 3 2 2 4 4 2 coupon 2 couple 2 coupe 2 coup 38 1 4 3 2 2 4 2 2 countywide 2 county 38 1 4 3 2 2 4 2 2 countrymen 2 countryman 38 1 4 3 2 2 m 4 3 2 countrywide 2 countryside 2 country 38 1 4 3 2 2 yi 4 0 38 1 4 3 2 2 4 2 2 countersunk 2 countersink 38 1 4 3 2 o 2 4 2 2 counterproposal 2 counterproductive 38 1 4 3 2 i 2 4 2 2 counterpoise 2 counterpoint 38 1 4 3 2 2 or 4 1 2 counterpart 38 1 4 3 2 2 4 2 2 countermen 2 counterman 38 1 4 3 2 2 4 2 2 counterflow 2 counterfeit 38 1 4 3 2 2 4 3 2 counterattack 2 counterargument 2 counteract 38 1 4 3 2 2 afmps 4 5 2 countervail 2 counterintuitive 2 counterexample 2 counterclockwise 2 counterbalance 38 1 4 3 2 2 r 4 1 2 countenance 38 1 4 3 2 2 ery 4 3 2 counting 2 countdown 2 count 38 1 4 3 2 el 2 4 2 2 counselor 2 counsel 38 1 4 3 2 il 2 mw 4 1 2 council 38 1 4 3 2 om 2 4 2 2 councilwomen 2 councilwoman 38 1 4 3 2 2 4 2 2 councilmen 2 councilman 38 1 4 3 2 2 cst 4 0 38 1 4 3 2 2 4 2 2 couldn't 2 could 38 1 4 3 2 2 d 4 2 2 Coulter 2 coulomb 38 1 4 3 2 2 4 2 2 cough 2 cougar 38 1 4 3 2 2 glnprs 4 2 2 couturier 2 couch 38 1 4 3 2 n 2 4 5 2 cottony 2 cottonwood 2 cottonseed 2 cottonmouth 2 cotton 38 1 4 3 2 2 4 2 2 cottage 2 cotta 38 1 4 3 2 2 ao 4 2 2 cotty 2 Cottrell 38 1 4 3 2 2 t 4 6 2 cotyledon 2 cotoneaster 2 cotman 2 cotillion 2 cotangent 2 cot 38 1 4 3 2 2 4 5 2 costs 2 costume 2 Costello 2 Costa 2 cost 38 1 4 3 2 2 4 3 2 cosmos 2 cosmopolitan 2 cosmology 38 1 4 3 2 2 o 4 2 2 cosmic 2 cosmetic 38 1 4 3 2 2 4 2 2 coset 2 cosec 38 1 4 3 2 2 emt 4 7 2 cosy 2 Cossack 2 cosponsor 2 cosine 2 cosh 2 Cosgrove 2 cos 38 1 4 3 2 2 4 3 2 Corvus 2 corvette 2 Corvallis 38 1 4 3 2 2 4 2 2 coruscate 2 corundum 38 1 4 3 2 2 4 2 2 cortex 2 cortege 38 1 4 3 2 2 e 4 2 2 Cortland 2 cortical 38 1 4 3 2 2 4 2 2 corruption 2 corruptible 38 1 4 3 2 t 2 i 4 1 2 corrupt 38 1 4 3 2 2 p 4 1 2 corrugate 38 1 4 3 2 i 2 4 2 2 corrosive 2 corrosion 38 1 4 3 2 2 4 2 2 corrodible 2 corrode 38 1 4 3 2 or 2 4 2 2 corroboree 2 corroborate 38 1 4 3 2 2 bds 4 0 38 1 4 3 2 nd 2 4 2 2 corrigendum 2 corrigenda 38 1 4 3 2 2 e 4 1 2 corrigible 38 1 4 3 2 2 g 4 1 2 corridor 38 1 4 3 2 pond 2 4 2 2 correspondent 2 correspond 38 1 4 3 2 t 2 4 2 2 corrector 2 correct 38 1 4 3 2 2 cs 4 1 2 correlate 38 1 4 3 2 l 2 4 2 2 corralled 2 corral 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 corpuscular 2 corpus 38 1 4 3 2 2 s 4 1 2 corpulent 38 1 4 3 2 2 4 2 2 corpsmen 2 corpsman 38 1 4 3 2 2 m 4 2 2 corpse 2 corps 38 1 4 3 2 2 t 4 2 2 corporal 2 corpora 38 1 4 3 2 r 2 a 4 1 2 corporeal 38 1 4 3 2 2 osu 4 1 2 Corp 38 1 4 3 2 2 4 2 2 coronet 2 coroner 38 1 4 3 2 2 4 4 2 coronate 2 coronary 2 Coronado 2 corona 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 2 n 4 2 2 coroutine 2 corollary 38 1 4 3 2 2 4 2 2 cornflower 2 cornfield 38 1 4 3 2 2 4 2 2 Cornelius 2 Cornelia 38 1 4 3 2 2 i 4 1 2 Cornell 38 1 4 3 2 2 lr 4 2 2 cornet 2 cornea 38 1 4 3 2 2 ef 4 8 2 corny 2 Cornwall 2 cornucopia 2 cornstarch 2 cornmeal 2 cornish 2 cornbread 2 corn 38 1 4 3 2 2 4 2 2 corkscrew 2 cork 38 1 4 3 2 th 2 4 2 2 Corinthian 2 Corinth 38 1 4 3 2 2 n 4 2 2 Coriolanus 2 coriander 38 1 4 3 2 2 4 2 2 Corey 2 core 38 1 4 3 2 2 4 2 2 cordite 2 cordial 38 1 4 3 2 2 i 4 4 2 corduroy 2 cordon 2 cordage 2 cord 38 1 4 3 2 e 2 4 2 2 Corbett 2 corbel 38 1 4 3 2 l 2 4 3 2 coralline 2 coralberry 2 coral 38 1 4 3 2 2 abdeiknoprtuv 4 3 2 corsage 2 cormorant 2 Corcoran 38 1 4 3 2 u 2 4 2 2 coquina 2 coquette 38 1 4 3 2 2 4 4 2 copywriter 2 copyright 2 copybook 2 copy 38 1 4 3 2 2 4 3 2 coproduct 2 coprinus 2 copra 38 1 4 3 2 er 2 4 4 2 coppery 2 copperhead 2 Copperfield 2 copperas 38 1 4 3 2 nic 2 4 2 2 Copernicus 2 Copernican 38 1 4 3 2 2 r 4 3 2 Copenhagen 2 Copeland 2 cope 38 1 4 3 2 2 epry 4 5 2 copter 2 copolymer 2 coplanar 2 copious 2 cop 38 1 4 3 2 2 4 3 2 coorespondence 2 Coors 2 coordinate 38 1 4 3 2 2 4 2 2 cooperate 2 coop 38 1 4 3 2 2 4 5 2 Coolidge 2 coolheaded 2 Cooley 2 coolant 2 cool 38 1 4 3 2 2 4 2 2 cookery 2 Cooke 38 1 4 3 2 2 e 4 4 2 cooky 2 cookie 2 cookbook 2 cook 38 1 4 3 2 2 klpr 4 3 2 coot 2 coon 2 coo 38 1 4 3 2 2 4 2 2 convulsive 2 convulsion 38 1 4 3 2 ls 2 i 4 1 2 convulse 38 1 4 3 2 t 2 4 2 2 convolution 2 convolute 38 1 4 3 2 2 u 4 1 2 convolve 38 1 4 3 2 2 l 4 3 2 convoy 2 convoke 2 convocate 38 1 4 3 2 2 4 3 2 convivial 2 convince 2 convict 38 1 4 3 2 2 4 3 2 conveyor 2 conveyance 2 convey 38 1 4 3 2 2 4 2 2 convertible 2 convert 38 1 4 3 2 2 4 2 2 conversation 2 conversant 38 1 4 3 2 2 a 4 2 2 conversion 2 converse 38 1 4 3 2 e 2 4 2 2 convergent 2 converge 38 1 4 3 2 2 gst 4 0 38 1 4 3 2 2 4 2 2 convention 2 convent 38 1 4 3 2 2 ti 4 1 2 convene 38 1 4 3 2 2 nry 4 2 2 convex 2 convect 38 1 4 3 2 2 l 4 1 2 Convair 38 1 4 3 2 esce 2 4 2 2 convalescent 2 convalesce 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 2 2 contusion 2 contumacy 38 1 4 3 2 2 4 2 2 controversy 2 controversial 38 1 4 3 2 er 2 s 4 1 2 controvertible 38 1 4 3 2 2 l 4 1 2 control 38 1 4 3 2 2 4 2 2 controller 2 controlled 38 1 4 3 2 2 e 4 2 2 controlling 2 controllable 38 1 4 3 2 2 lv 4 0 38 1 4 3 2 2 4 2 2 contrive 2 contrivance 38 1 4 3 2 2 4 2 2 contrition 2 contrite 38 1 4 3 2 ut 2 o 4 2 2 contribution 2 contribute 38 1 4 3 2 r 2 4 2 2 contributory 2 contributor 38 1 4 3 2 2 btv 4 0 38 1 4 3 2 2 bcdlrv 4 2 2 contrast 2 contraption 38 1 4 3 2 n 2 4 2 2 contravention 2 contravene 38 1 4 3 2 2 e 4 1 2 contravariant 38 1 4 3 2 2 4 2 2 contrary 2 contrariety 38 1 4 3 2 2 4 2 2 contralto 2 contralateral 38 1 4 3 2 tin 2 4 2 2 contradistinguish 2 contradistinct 38 1 4 3 2 t 2 4 2 2 contradictory 2 contradict 38 1 4 3 2 i 2 cs 4 0 38 1 4 3 2 2 4 4 2 contracts 2 contractual 2 contractor 2 contract 38 1 4 3 2 pti 2 4 2 2 contraceptive 2 contraception 38 1 4 3 2 2 et 4 0 38 1 4 3 2 a 2 4 2 2 contrabass 2 contraband 38 1 4 3 2 2 aio 4 1 2 contretemps 38 1 4 3 2 2 4 2 2 contour 2 contort 38 1 4 3 2 2 4 2 2 continuous 2 continuo 38 1 4 3 2 2 4 4 2 continuation 2 continuant 2 continual 2 continua 38 1 4 3 2 2 aoei 4 1 2 continuum 38 1 4 3 2 nt 2 4 2 2 continental 2 continent 38 1 4 3 2 2 eu 4 1 2 contingent 38 1 4 3 2 u 2 4 2 2 contiguous 2 contiguity 38 1 4 3 2 2 gn 4 0 38 1 4 3 2 t 2 4 2 2 contextual 2 context 38 1 4 3 2 t 2 4 2 2 contestant 2 contest 38 1 4 3 2 o 2 4 2 2 contentious 2 contention 38 1 4 3 2 2 i 4 2 2 contents 2 content 38 1 4 3 2 2 t 4 1 2 contend 38 1 4 3 2 p 2 ot 4 1 2 contemplate 38 1 4 3 2 2 4 3 2 contemptuous 2 contemptible 2 contempt 38 1 4 3 2 ra 2 4 2 2 contemporary 2 contemporaneous 38 1 4 3 2 2 mnsx 4 0 38 1 4 3 2 2 gmi 4 1 2 contact 38 1 4 3 2 ina 2 4 2 2 contaminate 2 contaminant 38 1 4 3 2 io 2 4 2 2 contagious 2 contagion 38 1 4 3 2 2 aeioru 4 0 38 1 4 3 2 ti 2 4 2 2 consumptive 2 consumption 38 1 4 3 2 2 pe 4 3 2 consumable 2 consuming 2 consummate 38 1 4 3 2 2 at 4 1 2 consul 38 1 4 3 2 i 2 4 2 2 consultative 2 consultation 38 1 4 3 2 2 t 4 1 2 consultant 38 1 4 3 2 2 a 4 1 2 consult 38 1 4 3 2 2 4 2 2 consulate 2 consular 38 1 4 3 2 2 lm 4 0 38 1 4 3 2 t 2 i 4 2 2 constructor 2 construct 38 1 4 3 2 2 c 4 1 2 construe 38 1 4 3 2 ct 2 4 2 2 constrictor 2 constrict 38 1 4 3 2 in 2 4 2 2 constraint 2 constrain 38 1 4 3 2 2 aiu 4 0 38 1 4 3 2 2 4 2 2 constitutive 2 constitution 38 1 4 3 2 2 i 4 1 2 constitute 38 1 4 3 2 tu 2 t 4 1 2 constituent 38 1 4 3 2 2 4 2 2 consternate 2 constellate 38 1 4 3 2 nt 2 i 4 1 2 constant 38 1 4 3 2 n 2 4 2 2 Constantinople 2 Constantine 38 1 4 3 2 2 aeir 4 0 38 1 4 3 2 2 t 4 1 2 conspiracy 38 1 4 3 2 or 2 4 2 2 conspiratorial 2 conspirator 38 1 4 3 2 2 a 4 1 2 conspire 38 1 4 3 2 i 2 r 4 1 2 conspicuous 38 1 4 3 2 t 2 4 2 2 consortium 2 consort 38 1 4 3 2 ant 2 4 2 2 consonantal 2 consonant 38 1 4 3 2 2 4 3 2 consolidate 2 console 2 consolation 38 1 4 3 2 2 lnr 4 0 38 1 4 3 2 t 2 4 2 2 consistent 2 consist 38 1 4 3 2 n 2 4 3 2 consignor 2 consignee 2 consign 38 1 4 3 2 er 2 4 4 2 considering 2 considered 2 considerate 2 consider 38 1 4 3 2 2 dgs 4 0 38 1 4 3 2 t 2 io 4 0 38 1 4 3 2 r 2 4 2 2 conservatory 2 conservator 38 1 4 3 2 2 4 3 2 conservative 2 conservatism 2 conservation 38 1 4 3 2 v 2 a 4 1 2 conserve 38 1 4 3 2 uent 2 4 2 2 consequential 2 consequent 38 1 4 3 2 2 4 2 2 consent 2 consensus 38 1 4 3 2 2 4 2 2 consecutive 2 consecrate 38 1 4 3 2 2 cnqr 4 0 38 1 4 3 2 ipt 2 4 2 2 conscription 2 conscript 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 4 2 2 conscious 2 conscionable 38 1 4 3 2 n 2 4 2 2 conscientious 2 conscience 38 1 4 3 2 2 ir 4 0 38 1 4 3 2 nguine 2 4 2 2 consanguineous 2 consanguine 38 1 4 3 2 2 aceioptu 4 0 38 1 4 3 2 a 2 4 2 2 Conrail 2 Conrad 38 1 4 3 2 2 r 4 1 2 conquest 38 1 4 3 2 2 4 2 2 conqueror 2 conquer 38 1 4 3 2 u 2 e 4 1 2 conquistador 38 1 4 3 2 ti 2 4 2 2 connotative 2 connotation 38 1 4 3 2 2 a 4 1 2 connote 38 1 4 3 2 2 t 4 2 2 Connors 2 connoisseur 38 1 4 3 2 2 4 2 2 connive 2 connivance 38 1 4 3 2 2 v 4 1 2 Connie 38 1 4 3 2 t 2 i 4 2 2 connector 2 connect 38 1 4 3 2 2 c 4 1 2 Conner 38 1 4 3 2 2 eio 4 3 2 connubial 2 Connally 2 conn 38 1 4 3 2 ct 2 4 2 2 conjuncture 2 conjunct 38 1 4 3 2 a 2 4 3 2 conjugate 2 conjugacy 2 conjugal 38 1 4 3 2 2 gn 4 1 2 conjure 38 1 4 3 2 in 2 4 2 2 conjoint 2 conjoin 38 1 4 3 2 ctur 2 4 2 2 conjecture 2 conjectural 38 1 4 3 2 2 eou 4 0 38 1 4 3 2 er 2 4 2 2 coniferous 2 conifer 38 1 4 3 2 2 f 4 1 2 conic 38 1 4 3 2 om 2 4 2 2 congresswomen 2 congresswoman 38 1 4 3 2 2 4 2 2 congressmen 2 congressman 38 1 4 3 2 s 2 mw 4 2 2 congressional 2 congress 38 1 4 3 2 2 s 4 1 2 congregate 38 1 4 3 2 tulat 2 4 2 2 congratulatory 2 congratulate 38 1 4 3 2 2 ae 4 1 2 congruent 38 1 4 3 2 2 4 2 2 Congolese 2 Congo 38 1 4 3 2 2 ns 4 1 2 congeal 38 1 4 3 2 2 4 2 2 congestive 2 congestion 38 1 4 3 2 t 2 i 4 1 2 congest 38 1 4 3 2 2 4 2 2 congenital 2 congenial 38 1 4 3 2 2 i 4 1 2 congener 38 1 4 3 2 2 eor 4 1 2 conglomerate 38 1 4 3 2 2 4 2 2 confusion 2 confuse 38 1 4 3 2 i 2 4 2 2 Confucius 2 Confucian 38 1 4 3 2 2 cs 4 1 2 confute 38 1 4 3 2 nt 2 4 2 2 confrontation 2 confront 38 1 4 3 2 2 o 4 1 2 confrere 38 1 4 3 2 2 4 3 2 conformation 2 conformance 2 conformal 38 1 4 3 2 m 2 a 4 1 2 conform 38 1 4 3 2 2 r 4 2 2 confound 2 confocal 38 1 4 3 2 2 4 3 2 confluent 2 conflict 2 conflagrate 38 1 4 3 2 2 4 2 2 confiscatory 2 confiscate 38 1 4 3 2 ca 2 t 4 1 2 confiscable 38 1 4 3 2 t 2 4 2 2 confirmatory 2 confirmation 38 1 4 3 2 m 2 a 4 1 2 confirm 38 1 4 3 2 ur 2 4 2 2 configure 2 configuration 38 1 4 3 2 2 ae 4 0 38 1 4 3 2 t 2 4 2 2 confidential 2 confident 38 1 4 3 2 2 n 4 1 2 confide 38 1 4 3 2 nt 2 4 2 2 confidante 2 confidant 38 1 4 3 2 2 dgrs 4 1 2 confine 38 1 4 3 2 s 2 4 3 2 confessor 2 confession 2 confess 38 1 4 3 2 2 4 3 2 conferring 2 conferred 2 conferrable 38 1 4 3 2 2 4 2 2 conference 2 conferee 38 1 4 3 2 2 er 4 1 2 confer 38 1 4 3 2 era 2 4 2 2 confederate 2 confederacy 38 1 4 3 2 t 2 4 2 2 confectionery 2 confect 38 1 4 3 2 2 cdrs 4 0 38 1 4 3 2 2 eiloru 4 1 2 confabulate 38 1 4 3 2 2 4 4 2 coney 2 Conestoga 2 coneflower 2 cone 38 1 4 3 2 2 t 4 2 2 conducive 2 conduce 38 1 4 3 2 2 4 3 2 conductor 2 conductance 2 conduct 38 1 4 3 2 2 c 4 1 2 conduit 38 1 4 3 2 2 4 2 2 condone 2 condolence 38 1 4 3 2 2 4 2 2 condition 2 condiment 38 1 4 3 2 2 mns 4 0 38 1 4 3 2 cen 2 4 2 2 condescension 2 condescend 38 1 4 3 2 s 2 4 3 2 condensible 2 condense 2 condensate 38 1 4 3 2 n 2 a 4 1 2 condemn 38 1 4 3 2 t 2 4 2 2 condemnatory 2 condemnate 38 1 4 3 2 2 eiou 4 0 38 1 4 3 2 2 4 2 2 concurrent 2 concurred 38 1 4 3 2 2 e 4 1 2 concurring 38 1 4 3 2 2 r 4 1 2 concur 38 1 4 3 2 2 r 4 2 2 concussion 2 concubine 38 1 4 3 2 et 2 4 2 2 concretion 2 concrete 38 1 4 3 2 d 2 4 2 2 concordant 2 concord 38 1 4 3 2 2 r 4 3 2 concourse 2 concomitant 2 concoct 38 1 4 3 2 i 2 4 2 2 conclusive 2 conclusion 38 1 4 3 2 2 s 4 1 2 conclude 38 1 4 3 2 2 u 4 1 2 conclave 38 1 4 3 2 2 4 2 2 concision 2 concise 38 1 4 3 2 iat 2 4 2 2 conciliatory 2 conciliate 38 1 4 3 2 2 ls 4 1 2 concierge 38 1 4 3 2 sion 2 4 2 2 concessionaire 2 concession 38 1 4 3 2 2 4 2 2 concertina 2 concerti 38 1 4 3 2 2 i 4 3 2 concerto 2 concertmaster 2 concert 38 1 4 3 2 2 t 4 1 2 concern 38 1 4 3 2 t 2 4 3 2 conceptual 2 conception 2 concept 38 1 4 3 2 tr 2 4 2 2 concentric 2 concentrate 38 1 4 3 2 2 4 2 2 conceive 2 conceit 38 1 4 3 2 2 inprs 4 2 2 concede 2 conceal 38 1 4 3 2 2 4 2 2 concave 2 concatenate 38 1 4 3 2 2 aeiloru 4 1 2 conch 38 1 4 3 2 2 4 2 2 Conant 2 Conakry 38 1 4 3 2 2 acdefgijnqrstv 4 6 2 cony 2 Conway 2 conundrum 2 Conley 2 Conklin 2 con 38 1 4 3 2 2 ea 4 0 38 1 4 3 2 s 2 i 4 1 2 compulsory 38 1 4 3 2 2 4 2 2 compulsive 2 compulsion 38 1 4 3 2 2 lt 4 0 38 1 4 3 2 2 4 2 2 comptroller 2 Compton 38 1 4 3 2 2 hs 4 0 38 1 4 3 2 2 4 3 2 compressive 2 compression 2 compressible 38 1 4 3 2 s 2 i 4 2 2 compressor 2 compress 38 1 4 3 2 en 2 s 4 1 2 comprehend 38 1 4 3 2 i 2 4 3 2 comprehensive 2 comprehension 2 comprehensible 38 1 4 3 2 2 e 4 2 2 compromise 2 comprise 38 1 4 3 2 t 2 4 3 2 compositor 2 composition 2 composite 38 1 4 3 2 2 i 4 3 2 composure 2 compost 2 compose 38 1 4 3 2 ent 2 4 2 2 componentry 2 component 38 1 4 3 2 2 ns 4 3 2 compound 2 compote 2 comport 38 1 4 3 2 ent 2 4 2 2 complimentary 2 compliment 38 1 4 3 2 2 4 2 2 complicity 2 complicate 38 1 4 3 2 2 cm 4 2 2 compline 2 compliant 38 1 4 3 2 2 4 2 2 complexion 2 complex 38 1 4 3 2 2 e 4 1 2 completion 38 1 4 3 2 ent 2 a 4 1 2 complement 38 1 4 3 2 2 4 2 2 complementary 2 complementarity 38 1 4 3 2 2 r 4 1 2 complementation 38 1 4 3 2 2 mtx 4 0 38 1 4 3 2 2 i 4 1 2 complacent 38 1 4 3 2 2 4 3 2 complaint 2 complainant 2 complain 38 1 4 3 2 2 n 4 1 2 complaisant 38 1 4 3 2 2 aei 4 1 2 comply 38 1 4 3 2 l 2 4 2 2 compile 2 compilation 38 1 4 3 2 2 4 2 2 competitive 2 competition 38 1 4 3 2 t 2 i 4 1 2 competitor 38 1 4 3 2 2 4 2 2 competent 2 compete 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 2 2 compensatory 2 compensate 38 1 4 3 2 a 2 t 4 1 2 compensable 38 1 4 3 2 i 2 4 2 2 compendium 2 compendia 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 2 l 4 1 2 compel 38 1 4 3 2 2 4 3 2 compelling 2 compelled 2 compellable 38 1 4 3 2 2 lnt 4 0 38 1 4 3 2 2 cnrst 4 1 2 Compagnie 38 1 4 3 2 2 4 2 2 compatriot 2 compatible 38 1 4 3 2 on 2 4 2 2 compassionate 2 compassion 38 1 4 3 2 s 2 i 4 1 2 compass 38 1 4 3 2 t 2 4 2 2 comparator 2 comparative 38 1 4 3 2 2 a 4 3 2 compartment 2 comparison 2 compare 38 1 4 3 2 2 o 4 1 2 companies 38 1 4 3 2 2 i 4 1 2 company 38 1 4 3 2 t 2 4 2 2 compactify 2 compact 38 1 4 3 2 2 aeilortu 4 0 38 1 4 3 2 2 4 2 2 commute 2 commutate 38 1 4 3 2 2 i 4 2 2 commune 2 communal 38 1 4 3 2 a 2 t 4 2 2 communicant 2 communicable 38 1 4 3 2 2 c 4 3 2 community 2 communique 2 communion 38 1 4 3 2 2 nt 4 0 38 1 4 3 2 eal 2 4 2 2 commonwealth 2 commonweal 38 1 4 3 2 2 w 4 3 2 commonplace 2 commonality 2 common 38 1 4 3 2 2 i 4 1 2 commodore 38 1 4 3 2 2 4 2 2 commodity 2 commodious 38 1 4 3 2 2 dn 4 1 2 commotion 38 1 4 3 2 om 2 4 2 2 committeewomen 2 committeewoman 38 1 4 3 2 2 4 2 2 committeemen 2 committeeman 38 1 4 3 2 2 mw 4 2 2 committees 2 committee 38 1 4 3 2 2 e 4 1 2 committed 38 1 4 3 2 2 4 2 2 committal 2 committable 38 1 4 3 2 2 ae 4 1 2 committing 38 1 4 3 2 2 t 4 1 2 commit 38 1 4 3 2 r 2 4 2 2 commissary 2 commissariat 38 1 4 3 2 2 a 4 1 2 commission 38 1 4 3 2 2 s 4 1 2 commiserate 38 1 4 3 2 2 st 4 1 2 commingle 38 1 4 3 2 c 2 4 2 2 commercial 2 commerce 38 1 4 3 2 2 4 2 2 commentator 2 commentary 38 1 4 3 2 2 a 4 1 2 comment 38 1 4 3 2 ura 2 4 2 2 commensurate 2 commensurable 38 1 4 3 2 2 a 4 1 2 commend 38 1 4 3 2 t 2 4 2 2 commendatory 2 commendation 38 1 4 3 2 2 dst 4 0 38 1 4 3 2 2 nr 4 1 2 commemorate 38 1 4 3 2 2 n 4 1 2 comma 38 1 4 3 2 d 2 4 4 2 commando 2 commandeer 2 commandant 2 command 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 n 4 1 2 comic 38 1 4 3 2 2 4 3 2 cometh 2 cometary 2 comet 38 1 4 3 2 2 4 2 2 -- 2 - 38 1 4 3 2 2 4 2 2 comedy 2 comedian 38 1 4 3 2 2 dt 4 2 2 comeback 2 come 38 1 4 3 2 sti 2 4 2 2 combustion 2 combustible 38 1 4 3 2 t 2 o 4 1 2 combinate 38 1 4 3 2 ri 2 4 2 2 combinatoric 2 combinatorial 38 1 4 3 2 n 2 a 4 1 2 combine 38 1 4 3 2 t 2 4 3 2 combatted 2 combatant 2 combat 38 1 4 3 2 2 aiu 4 1 2 comb 38 1 4 3 2 2 4 3 2 comatose 2 Comanche 2 coma 38 1 4 3 2 2 abeimp 4 2 2 comrade 2 comfort 38 1 4 3 2 2 4 2 2 columnar 2 column 38 1 4 3 2 2 i 4 1 2 Columbus 38 1 4 3 2 2 4 2 2 columbine 2 Columbia 38 1 4 3 2 m 2 bn 4 0 38 1 4 3 2 2 4 3 2 coltsfoot 2 coltish 2 colt 38 1 4 3 2 s 2 4 4 2 colossus 2 colossi 2 Colosseum 2 colossal 38 1 4 3 2 2 t 4 1 2 Colorado 38 1 4 3 2 2 4 2 2 coloratura 2 colorate 38 1 4 3 2 2 a 4 3 2 colors 2 colorimeter 2 color 38 1 4 3 2 2 4 2 2 colonist 2 colonial 38 1 4 3 2 2 i 4 4 2 colony 2 colonnade 2 colonel 2 colon 38 1 4 3 2 b 2 4 2 2 Colombo 2 Colombia 38 1 4 3 2 2 mnrs 4 1 2 Cologne 38 1 4 3 2 2 4 2 2 collusion 2 collude 38 1 4 3 2 2 a 4 1 2 colloquium 38 1 4 3 2 2 4 2 2 colloquial 2 colloquia 38 1 4 3 2 2 i 4 1 2 colloquy 38 1 4 3 2 2 u 4 1 2 Colloq 38 1 4 3 2 2 q 4 2 2 colloidal 2 collocation 38 1 4 3 2 2 4 2 2 Collins 2 collinear 38 1 4 3 2 2 4 2 2 Collier 2 collie 38 1 4 3 2 2 en 4 3 2 collision 2 collimate 2 collide 38 1 4 3 2 a 2 4 2 2 collegiate 2 collegian 38 1 4 3 2 2 i 4 1 2 college 38 1 4 3 2 t 2 4 3 2 collector 2 collectible 2 collect 38 1 4 3 2 2 cg 4 2 2 collet 2 colleague 38 1 4 3 2 2 gprt 4 1 2 collaborate 38 1 4 3 2 e 2 4 2 2 collateral 2 collate 38 1 4 3 2 2 4 3 2 collard 2 collarbone 2 collar 38 1 4 3 2 s 2 4 2 2 collapsible 2 collapse 38 1 4 3 2 e 2 4 2 2 collagen 2 collage 38 1 4 3 2 2 aeiou 4 0 38 1 4 3 2 2 4 3 2 coliseum 2 coliform 2 colicky 38 1 4 3 2 2 4 5 2 coleus 2 Colette 2 Coleridge 2 Coleman 2 Cole 38 1 4 3 2 2 4 3 2 colatitude 2 colander 2 cola 38 1 4 3 2 2 aeilotu 4 5 2 colza 2 Colgate 2 cold 2 Colby 2 col 38 1 4 3 2 t 2 4 2 2 coincidental 2 coincident 38 1 4 3 2 ide 2 n 4 1 2 coincide 38 1 4 3 2 2 c 4 2 2 coinage 2 coin 38 1 4 3 2 2 n 4 2 2 coil 2 coiffure 38 1 4 3 2 2 4 3 2 cohosh 2 cohort 2 cohomology 38 1 4 3 2 2 rs 4 1 2 Cohen 38 1 4 3 2 i 2 4 2 2 cohesive 2 cohesion 38 1 4 3 2 e 2 4 2 2 coherent 2 cohere 38 1 4 3 2 2 eo 4 1 2 Cohn 38 1 4 3 2 a 2 4 2 2 cognizant 2 cognizable 38 1 4 3 2 i 2 4 2 2 cognitive 2 cognition 38 1 4 3 2 2 tz 4 0 38 1 4 3 2 2 4 2 2 cognate 2 cognac 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 2 n 4 3 2 cogitate 2 cogent 2 cog 38 1 4 3 2 2 4 3 2 coffeepot 2 coffeecup 2 coffee 38 1 4 3 2 2 e 4 2 2 Coffey 2 coffer 38 1 4 3 2 2 e 4 2 2 Coffman 2 coffin 38 1 4 3 2 2 f 4 1 2 cofactor 38 1 4 3 2 st 2 4 2 2 coexistent 2 coexist 38 1 4 3 2 2 i 4 1 2 coextensive 38 1 4 3 2 2 4 3 2 coercive 2 coercion 2 coercible 38 1 4 3 2 c 2 i 4 1 2 coerce 38 1 4 3 2 2 4 3 2 coeducation 2 coeditor 2 coed 38 1 4 3 2 2 drx 4 2 2 coequal 2 coefficient 38 1 4 3 2 2 4 2 2 codon 2 codomain 38 1 4 3 2 2 4 2 2 codify 2 codicil 38 1 4 3 2 2 4 5 2 codeword 2 codetermine 2 codeposit 2 codebreak 2 code 38 1 4 3 2 2 4 2 2 coddle 2 Coddington 38 1 4 3 2 2 deio 4 5 2 Cody 2 codpiece 2 codfish 2 coda 2 cod 38 1 4 3 2 2 4 4 2 cocoon 2 coconut 2 cocoa 2 coco 38 1 4 3 2 e 2 4 3 2 cockleshell 2 cocklebur 2 cockle 38 1 4 3 2 2 l 4 9 2 cocky 2 cocktail 2 cocksure 2 cockroach 2 cockpit 2 cockeye 2 cockcrow 2 cockatoo 2 cock 38 1 4 3 2 an 2 4 2 2 Cochrane 2 Cochran 38 1 4 3 2 2 r 4 2 2 cochlea 2 cochineal 38 1 4 3 2 2 4 2 2 cocaine 2 coca 38 1 4 3 2 2 ahko 4 1 2 coccidiosis 38 1 4 3 2 e 2 4 2 2 cobblestone 2 cobble 38 1 4 3 2 2 l 4 1 2 Cobb 38 1 4 3 2 2 b 4 4 2 cobweb 2 cobra 2 Cobol 2 cobalt 38 1 4 3 2 2 4 2 2 coaxial 2 coax 38 1 4 3 2 2 4 3 2 coattail 2 Coates 2 coat 38 1 4 3 2 t 2 4 3 2 coastline 2 coastal 2 coast 38 1 4 3 2 se 2 4 2 2 coarsen 2 coarse 38 1 4 3 2 sce 2 4 2 2 coalescent 2 coalesce 38 1 4 3 2 2 e 4 2 2 coalition 2 coal 38 1 4 3 2 ula 2 4 2 2 coagulate 2 coagulable 38 1 4 3 2 h 2 m 4 2 2 coachwork 2 coach 38 1 4 3 2 2 4 2 2 coachmen 2 coachman 38 1 4 3 2 2 cglrstx 4 2 2 coauthor 2 coadjutor 38 1 4 3 2 2 abcdefghilmnopqrstuvwxyz 4 2 2 coke 2 CO 38 1 4 3 2 2 4 2 2 Clytemnestra 2 Clyde 38 1 4 3 2 2 4 2 2 clutter 2 clutch 38 1 4 3 2 2 4 2 2 clumsy 2 clump 38 1 4 3 2 2 4 3 2 clubroom 2 clubhouse 2 club 38 1 4 3 2 2 bmt 4 5 2 cluster 2 clung 2 Cluj 2 clue 2 cluck 38 1 4 3 2 2 4 3 2 cloudy 2 cloudburst 2 cloud 38 1 4 3 2 2 d 4 1 2 clout 38 1 4 3 2 2 4 2 2 clothesmen 2 clothesman 38 1 4 3 2 2 m 4 3 2 clothesline 2 clotheshorse 2 clothesbrush 38 1 4 3 2 2 s 4 1 2 clothe 38 1 4 3 2 2 e 4 4 2 Clotho 2 clothier 2 clothbound 2 cloth 38 1 4 3 2 2 h 4 2 2 cloture 2 clot 38 1 4 3 2 2 4 5 2 closed 2 closes 2 closeup 2 closet 2 close 38 1 4 3 2 2 e 4 2 2 closing 2 closure 38 1 4 3 2 2 4 2 2 clonic 2 clone 38 1 4 3 2 2 4 2 2 clogging 2 clog 38 1 4 3 2 2 4 2 2 cloddish 2 clod 38 1 4 3 2 2 4 3 2 clockwork 2 clockwise 2 clockwatcher 38 1 4 3 2 k 2 w 4 1 2 clock 38 1 4 3 2 k 2 4 2 2 cloakroom 2 cloak 38 1 4 3 2 2 acdgnstu 4 6 2 cloy 2 clown 2 clove 2 clomp 2 cloister 2 clobber 38 1 4 3 2 2 b 4 1 2 clip 38 1 4 3 2 2 4 2 2 Clinton 2 Clint 38 1 4 3 2 c 2 4 2 2 clinician 2 clinic 38 1 4 3 2 2 4 2 2 clinging 2 cling 38 1 4 3 2 2 git 4 2 2 clink 2 clinch 38 1 4 3 2 2 t 4 2 2 climax 2 climactic 38 1 4 3 2 2 4 3 2 climatology 2 climatic 2 climate 38 1 4 3 2 2 a 4 2 2 clime 2 climb 38 1 4 3 2 2 4 3 2 Clifford 2 cliffhang 2 cliff 38 1 4 3 2 2 f 4 1 2 Clifton 38 1 4 3 2 nt 2 4 2 2 clientele 2 client 38 1 4 3 2 2 4 2 2 click 2 cliche 38 1 4 3 2 2 cefmnp 4 4 2 Clive 2 clitoris 2 clique 2 Clio 38 1 4 3 2 e 2 4 2 2 clever 2 Cleveland 38 1 4 3 2 y 2 m 4 1 2 clergy 38 1 4 3 2 2 4 2 2 clergymen 2 clergyman 38 1 4 3 2 2 g 4 2 2 clerk 2 cleric 38 1 4 3 2 2 4 2 2 Clemson 2 clement 38 1 4 3 2 2 nrv 4 1 2 cleat 38 1 4 3 2 2 4 2 2 cleave 2 cleavage 38 1 4 3 2 2 4 4 2 Clearwater 2 clearheaded 2 clearance 2 clear 38 1 4 3 2 2 4 3 2 cleanup 2 cleanse 2 clean 38 1 4 3 2 2 amrv 4 2 2 clench 2 cleft 38 1 4 3 2 2 dimnprstuy 4 1 2 claw 38 1 4 3 2 2 4 2 2 Clayton 2 clay 38 1 4 3 2 rophobi 2 4 2 2 claustrophobic 2 claustrophobia 38 1 4 3 2 2 4 2 2 Clausen 2 clause 38 1 4 3 2 2 et 4 2 2 Clausius 2 Claus 38 1 4 3 2 2 i 4 1 2 Claude 38 1 4 3 2 2 4 2 2 Claudio 2 Claudia 38 1 4 3 2 2 ds 4 0 38 1 4 3 2 ter 2 4 2 2 clattery 2 clatter 38 1 4 3 2 2 4 2 2 classify 2 classificatory 38 1 4 3 2 2 f 4 1 2 classic 38 1 4 3 2 2 i 4 4 2 classy 2 classroom 2 classmate 2 class 38 1 4 3 2 2 s 4 2 2 clasp 2 clash 38 1 4 3 2 2 4 2 2 Clarke 2 Clark 38 1 4 3 2 2 4 3 2 clarity 2 clarinet 2 clarify 38 1 4 3 2 2 4 2 2 Clarendon 2 Clarence 38 1 4 3 2 2 n 4 3 2 claret 2 Claremont 2 Clare 38 1 4 3 2 2 eik 4 1 2 Clara 38 1 4 3 2 2 4 3 2 Clapeyron 2 clapboard 2 clap 38 1 4 3 2 2 4 5 2 clannish 2 clank 2 clang 2 clandestine 2 clan 38 1 4 3 2 2 4 5 2 clamshell 2 clamp 2 clammy 2 clamber 2 clam 38 1 4 3 2 2 4 2 2 clairvoyant 2 Claire 38 1 4 3 2 2 4 2 2 claimant 2 claim 38 1 4 3 2 2 mr 4 0 38 1 4 3 2 2 4 2 2 cladophora 2 clad 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 4 2 2 civilian 2 civil 38 1 4 3 2 2 l 4 1 2 civic 38 1 4 3 2 2 i 4 1 2 civet 38 1 4 3 2 2 4 3 2 citywide 2 cityscape 2 city 38 1 4 3 2 2 4 2 2 citron 2 Citroen 38 1 4 3 2 2 o 4 3 2 citrus 2 citric 2 citrate 38 1 4 3 2 2 z 4 1 2 cities 38 1 4 3 2 2 4 2 2 citation 2 citadel 38 1 4 3 2 2 airy 4 2 2 cite 2 cit 38 1 4 3 2 ent 2 4 3 2 circumvented 2 circumvention 2 circumvent 38 1 4 3 2 an 2 c 4 1 2 circumstantial 38 1 4 3 2 2 4 2 2 circumsphere 2 circumspect 38 1 4 3 2 ri 2 4 2 2 circumscription 2 circumscribe 38 1 4 3 2 2 cpt 4 0 38 1 4 3 2 ren 2 4 2 2 circumferential 2 circumference 38 1 4 3 2 2 e 4 1 2 circumflex 38 1 4 3 2 i 2 s 4 1 2 circumcircle 38 1 4 3 2 2 4 2 2 circumcision 2 circumcise 38 1 4 3 2 2 cfsv 4 2 2 circumpolar 2 circumlocution 38 1 4 3 2 2 4 2 2 circulatory 2 circulate 38 1 4 3 2 a 2 t 4 2 2 circular 2 circulant 38 1 4 3 2 t 2 4 3 2 circuitry 2 circuitous 2 circuit 38 1 4 3 2 2 ilm 4 1 2 circus 38 1 4 3 2 e 2 4 2 2 circlet 2 circle 38 1 4 3 2 c 2 lu 4 2 2 Circe 2 circa 38 1 4 3 2 a 2 4 2 2 cinnamon 2 cinnabar 38 1 4 3 2 a 2 4 2 2 cinematic 2 cinema 38 1 4 3 2 2 m 4 1 2 Cinerama 38 1 4 3 2 r 2 4 2 2 Cinderella 2 cinder 38 1 4 3 2 2 e 4 1 2 Cindy 38 1 4 3 2 2 4 2 2 Cincinnati 2 cinch 38 1 4 3 2 2 cden 4 1 2 cinquefoil 38 1 4 3 2 ia 2 4 2 2 ciliate 2 cilia 38 1 4 3 2 ar 2 4 2 2 cigarette 2 cigar 38 1 4 3 2 ro 2 4 2 2 Ciceronian 2 Cicero 38 1 4 3 2 2 e 4 1 2 cicada 38 1 4 3 2 2 cglnrtv 4 4 2 cistern 2 cipher 2 cider 2 CIA 38 1 4 3 2 2 4 2 2 chutney 2 chute 38 1 4 3 2 h 2 gimw 4 2 2 churchyard 2 church 38 1 4 3 2 om 2 4 2 2 churchwomen 2 churchwoman 38 1 4 3 2 2 4 2 2 churchmen 2 churchman 38 1 4 3 2 ll 2 4 2 2 Churchillian 2 Churchill 38 1 4 3 2 o 2 4 2 2 churchgoing 2 churchgoer 38 1 4 3 2 2 c 4 1 2 churn 38 1 4 3 2 2 4 2 2 chunky 2 chunk 38 1 4 3 2 2 k 4 1 2 Chungking 38 1 4 3 2 2 4 3 2 chump 2 chummy 2 chum 38 1 4 3 2 2 4 2 2 chugging 2 chug 38 1 4 3 2 k 2 4 3 2 chuckwalla 2 chuckle 2 chuck 38 1 4 3 2 2 4 2 2 chubby 2 chub 38 1 4 3 2 2 bcgmnrt 4 1 2 chuff 38 1 4 3 2 s 2 4 3 2 chrysolite 2 Chrysler 2 chrysanthemum 38 1 4 3 2 raph 2 4 2 2 chronography 2 chronograph 38 1 4 3 2 2 g 4 1 2 chronology 38 1 4 3 2 c 2 4 2 2 chronicle 2 chronic 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 ai 4 2 2 chromosphere 2 chrome 38 1 4 3 2 2 4 2 2 chromium 2 chromic 38 1 4 3 2 t 2 io 4 1 2 chromate 38 1 4 3 2 h 2 4 2 2 chromatography 2 chromatograph 38 1 4 3 2 gra 2 p 4 1 2 chromatogram 38 1 4 3 2 2 4 2 2 chromatin 2 chromatic 38 1 4 3 2 2 mn 4 0 38 1 4 3 2 s 2 t 4 1 2 Chris 38 1 4 3 2 h 2 4 2 2 Christopher 2 Christoph 38 1 4 3 2 2 p 4 1 2 Christoffel 38 1 4 3 2 2 4 2 2 Christine 2 Christina 38 1 4 3 2 n 2 4 3 2 Christianson 2 Christiana 2 Christian 38 1 4 3 2 2 an 4 1 2 Christie 38 1 4 3 2 2 4 2 2 Christenson 2 Christensen 38 1 4 3 2 n 2 s 4 2 2 Christendom 2 christen 38 1 4 3 2 2 eio 4 3 2 Christy 2 Christmas 2 Christ 38 1 4 3 2 2 ioy 4 0 38 1 4 3 2 2 4 2 2 chowder 2 chow 38 1 4 3 2 e 2 4 2 2 chosen 2 chose 38 1 4 3 2 graph 2 4 2 2 choreography 2 choreograph 38 1 4 3 2 2 o 4 1 2 chore 38 1 4 3 2 2 4 2 2 chordate 2 chordata 38 1 4 3 2 2 t 4 1 2 chordal 38 1 4 3 2 2 a 4 1 2 chord 38 1 4 3 2 l 2 4 2 2 chorale 2 choral 38 1 4 3 2 2 ade 4 3 2 chorus 2 chortle 2 chorine 38 1 4 3 2 2 4 3 2 choppy 2 Chopin 2 chop 38 1 4 3 2 s 2 4 2 2 choosy 2 choose 38 1 4 3 2 2 4 2 2 Chomsky 2 chomp 38 1 4 3 2 2 4 2 2 cholesterol 2 cholera 38 1 4 3 2 2 e 4 1 2 cholinesterase 38 1 4 3 2 e 2 4 2 2 chokeberry 2 choke 38 1 4 3 2 2 4 2 2 choirmaster 2 choir 38 1 4 3 2 2 r 4 1 2 choice 38 1 4 3 2 2 4 3 2 Choctaw 2 chocolate 2 chock 38 1 4 3 2 2 ciklmoprsw 4 1 2 Chou 38 1 4 3 2 a 2 4 2 2 chloroplatinate 2 chloroplast 38 1 4 3 2 2 l 4 1 2 chlorophyll 38 1 4 3 2 2 p 4 1 2 chloroform 38 1 4 3 2 2 4 2 2 chlorine 2 chloride 38 1 4 3 2 or 2 io 4 2 2 chlordane 2 chlorate 38 1 4 3 2 lr 2 4 2 2 chivalry 2 chivalrous 38 1 4 3 2 2 a 4 1 2 chive 38 1 4 3 2 2 4 2 2 chiton 2 chit 38 1 4 3 2 2 4 2 2 Chisholm 2 chisel 38 1 4 3 2 2 p 4 1 2 chiropractor 38 1 4 3 2 2 4 4 2 Chippendale 2 chipmunk 2 chipboard 2 chip 38 1 4 3 2 2 4 2 2 Chinese 2 chine 38 1 4 3 2 h 2 4 2 2 chinchilla 2 chinch 38 1 4 3 2 2 4 2 2 Chinamen 2 Chinaman 38 1 4 3 2 2 m 4 2 2 Chinatown 2 china 38 1 4 3 2 2 ace 4 4 2 chinquapin 2 Chinook 2 chink 2 chin 38 1 4 3 2 2 r 4 1 2 chime 38 1 4 3 2 2 4 2 2 chimeric 2 chimera 38 1 4 3 2 2 e 4 3 2 chimpanzee 2 chimney 2 Chimique 38 1 4 3 2 2 4 2 2 chilly 2 chill 38 1 4 3 2 2 4 4 2 children 2 childish 2 childbirth 2 child 38 1 4 3 2 2 dl 4 3 2 chili 2 Chile 2 chilblain 38 1 4 3 2 2 4 2 2 chignon 2 chigger 38 1 4 3 2 f 2 4 3 2 chieftain 2 chiefdom 2 chief 38 1 4 3 2 2 4 4 2 chickweed 2 chicken 2 chickadee 2 chick 38 1 4 3 2 2 4 2 2 Chicano 2 chicanery 38 1 4 3 2 o 2 4 2 2 Chicagoan 2 Chicago 38 1 4 3 2 2 gn 4 0 38 1 4 3 2 2 ak 4 2 2 chicory 2 chic 38 1 4 3 2 n 2 4 2 2 chianti 2 Chiang 38 1 4 3 2 2 aceglmnprstv 4 3 2 chiffon 2 chide 2 chi 38 1 4 3 2 o 2 4 2 2 chevron 2 Chevrolet 38 1 4 3 2 2 r 4 2 2 chevy 2 chevalier 38 1 4 3 2 r 2 4 2 2 Chesterton 2 Chester 38 1 4 3 2 2 e 4 2 2 chestnut 2 chest 38 1 4 3 2 2 t 4 3 2 chess 2 Cheshire 2 Chesapeake 38 1 4 3 2 b 2 4 2 2 cherubim 2 cherub 38 1 4 3 2 2 u 4 5 2 Cheryl 2 chert 2 cherry 2 Cherokee 2 cherish 38 1 4 3 2 2 4 3 2 chenille 2 Cheney 2 Chen 38 1 4 3 2 2 s 4 1 2 chemic 38 1 4 3 2 2 4 2 2 chemistry 2 chemist 38 1 4 3 2 r 2 4 2 2 chemisorption 2 chemisorb 38 1 4 3 2 2 ot 4 1 2 chemise 38 1 4 3 2 2 i 4 1 2 chemotherapy 38 1 4 3 2 2 c 4 1 2 cheese 38 1 4 3 2 2 4 2 2 cheesecloth 2 cheesecake 38 1 4 3 2 2 e 4 1 2 cheesy 38 1 4 3 2 2 4 4 2 cheery 2 cheerleader 2 cheerful 2 cheer 38 1 4 3 2 2 4 3 2 cheeky 2 cheekbone 2 cheek 38 1 4 3 2 2 krs 4 1 2 cheetah 38 1 4 3 2 2 4 2 2 checksumming 2 checksummed 38 1 4 3 2 um 2 m 4 1 2 checksum 38 1 4 3 2 rb 2 4 2 2 checkerboard 2 checkerberry 38 1 4 3 2 k 2 es 4 6 2 checkup 2 checkpoint 2 checkout 2 checklist 2 checkbook 2 check 38 1 4 3 2 2 t 4 1 2 cheap 38 1 4 3 2 2 4 2 2 cheater 2 cheat 38 1 4 3 2 2 acemnrsv 4 4 2 Cheyenne 2 chew 2 chelate 2 chef 38 1 4 3 2 2 dfilmnoprstu 4 3 2 chaw 2 chagrin 2 Chablis 38 1 4 3 2 2 4 4 2 Chautauqua 2 Chauncey 2 chauffeur 2 Chaucer 38 1 4 3 2 2 4 3 2 chatty 2 chattel 2 Chattanooga 38 1 4 3 2 au 2 4 2 2 chateaux 2 chateau 38 1 4 3 2 2 et 4 2 2 Chatham 2 chat 38 1 4 3 2 2 4 2 2 chastity 2 chastise 38 1 4 3 2 2 i 4 1 2 chaste 38 1 4 3 2 2 t 4 3 2 chassis 2 chasm 2 chase 38 1 4 3 2 2 4 2 2 chartreuse 2 Chartres 38 1 4 3 2 2 e 4 1 2 chartroom 38 1 4 3 2 2 r 4 2 2 Charta 2 chart 38 1 4 3 2 tte 2 4 2 2 Charlottesville 2 Charlotte 38 1 4 3 2 2 s 4 2 2 Charley 2 Charlemagne 38 1 4 3 2 2 4 2 2 Charleston 2 Charles 38 1 4 3 2 2 eo 4 1 2 Charlie 38 1 4 3 2 2 4 2 2 charity 2 charitable 38 1 4 3 2 ma 2 4 2 2 charismatic 2 charisma 38 1 4 3 2 2 st 4 1 2 chariot 38 1 4 3 2 e 2 4 3 2 charges 2 chargeable 2 charge 38 1 4 3 2 cter 2 4 2 2 characteristic 2 character 38 1 4 3 2 2 agilt 4 6 2 Charybdis 2 Charon 2 charm 2 chard 2 charcoal 2 char 38 1 4 3 2 2 4 2 2 Chaplin 2 chaplain 38 1 4 3 2 on 2 4 2 2 chaperone 2 chaperon 38 1 4 3 2 2 r 4 1 2 chapel 38 1 4 3 2 2 el 4 4 2 chapter 2 Chapman 2 chaparral 2 chap 38 1 4 3 2 2 4 3 2 chaotic 2 chaos 2 Chao 38 1 4 3 2 2 4 4 2 chantry 2 Chantilly 2 chantey 2 chant 38 1 4 3 2 2 4 5 2 changes 2 changed 2 changeover 2 changeable 2 change 38 1 4 3 2 2 e 4 2 2 changing 2 Chang 38 1 4 3 2 2 4 2 2 chandler 2 chandelier 38 1 4 3 2 2 e 4 1 2 chancy 38 1 4 3 2 2 l 4 3 2 chances 2 chancery 2 chance 38 1 4 3 2 2 4 2 2 chancellor 2 chancel 38 1 4 3 2 2 cdgt 4 2 2 chanson 2 channel 38 1 4 3 2 2 4 2 2 Champaign 2 champagne 38 1 4 3 2 2 a 4 3 2 Champlain 2 champion 2 champ 38 1 4 3 2 2 4 2 2 chamomile 2 chamois 38 1 4 3 2 er 2 4 3 2 chambermaid 2 chamberlain 2 chamber 38 1 4 3 2 2 bop 4 2 2 chamfer 2 chameleon 38 1 4 3 2 2 4 3 2 chalky 2 chalkline 2 chalk 38 1 4 3 2 2 4 2 2 chalcocite 2 chalcedony 38 1 4 3 2 2 ck 4 3 2 Chalmers 2 challenge 2 chalice 38 1 4 3 2 om 2 4 2 2 chairwomen 2 chairwoman 38 1 4 3 2 2 4 2 2 chairmen 2 chairman 38 1 4 3 2 2 mw 4 3 2 chairperson 2 chairlady 2 chair 38 1 4 3 2 2 r 4 2 2 chaise 2 chain 38 1 4 3 2 2 4 2 2 chaff 2 chafe 38 1 4 3 2 2 4 2 2 Chadwick 2 Chad 38 1 4 3 2 2 aeiloru 4 0 38 1 4 3 2 2 4 2 2 Cetus 2 cetera 38 1 4 3 2 2 4 3 2 Cessna 2 cession 2 cessation 38 1 4 3 2 2 s 4 2 2 cesium 2 Cesare 38 1 4 3 2 2 4 2 2 cervix 2 Cervantes 38 1 4 3 2 2 4 2 2 certify 2 certificate 38 1 4 3 2 2 f 4 2 2 certitude 2 certiorari 38 1 4 3 2 in 2 4 2 2 certainty 2 certain 38 1 4 3 2 2 ai 4 0 38 1 4 3 2 2 4 2 2 cerium 2 cerise 38 1 4 3 2 2 4 2 2 ceremonious 2 ceremonial 38 1 4 3 2 on 2 i 4 1 2 ceremony 38 1 4 3 2 a 2 4 2 2 cerebrate 2 cerebral 38 1 4 3 2 2 r 4 1 2 cerebellum 38 1 4 3 2 2 bm 4 3 2 cereus 2 Ceres 2 cereal 38 1 4 3 2 mi 2 4 2 2 ceramium 2 ceramic 38 1 4 3 2 2 aeitv 4 3 2 cerulean 2 CERN 2 Cerberus 38 1 4 3 2 2 4 2 2 century 2 centum 38 1 4 3 2 2 4 2 2 centrifugate 2 centrifugal 38 1 4 3 2 ug 2 a 4 1 2 centrifuge 38 1 4 3 2 2 f 4 2 2 centrist 2 centric 38 1 4 3 2 2 ie 4 2 2 centroid 2 central 38 1 4 3 2 2 4 2 2 centipede 2 centigrade 38 1 4 3 2 2 4 3 2 centerpiece 2 centerline 2 center 38 1 4 3 2 2 4 2 2 centennial 2 centenary 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 2 eiru 4 2 2 centaur 2 cent 38 1 4 3 2 2 4 2 2 census 2 censure 38 1 4 3 2 r 2 4 2 2 censorial 2 censor 38 1 4 3 2 2 ou 4 0 38 1 4 3 2 2 st 4 1 2 Cenozoic 38 1 4 3 2 e 2 4 2 2 cemetery 2 cement 38 1 4 3 2 2 4 2 2 cellulose 2 celluloid 38 1 4 3 2 l 2 o 4 1 2 cellular 38 1 4 3 2 2 u 4 3 2 cellophane 2 cellar 2 cell 38 1 4 3 2 t 2 4 2 2 celestial 2 celesta 38 1 4 3 2 2 4 2 2 celery 2 celerity 38 1 4 3 2 2 r 4 1 2 Celebes 38 1 4 3 2 2 4 2 2 celebrate 2 celebrant 38 1 4 3 2 2 a 4 1 2 celebrity 38 1 4 3 2 2 brs 4 0 38 1 4 3 2 n 2 4 2 2 Celanese 2 celandine 38 1 4 3 2 2 ael 4 3 2 Celtic 2 Celsius 2 Celia 38 1 4 3 2 2 4 4 2 Cedric 2 cedilla 2 cede 2 cedar 38 1 4 3 2 l 2 4 2 2 Cecilia 2 Cecil 38 1 4 3 2 2 i 4 1 2 Cecropia 38 1 4 3 2 2 cdlmnrst 4 5 2 Cezanne 2 Ceylon 2 Cepheus 2 ceil 2 cease 38 1 4 3 2 2 4 3 2 Cayuga 2 Cayley 2 cayenne 38 1 4 3 2 2 4 2 2 cavilling 2 cavil 38 1 4 3 2 2 l 4 2 2 Caviness 2 caviar 38 1 4 3 2 n 2 4 2 2 cavernous 2 cavern 38 1 4 3 2 2 4 2 2 cavemen 2 caveman 38 1 4 3 2 2 mr 4 3 2 Cavendish 2 caveat 2 cave 38 1 4 3 2 l 2 4 3 2 cavalry 2 cavalier 2 cavalcade 38 1 4 3 2 2 aei 4 1 2 cavort 38 1 4 3 2 2 4 2 2 cautionary 2 caution 38 1 4 3 2 io 2 n 4 1 2 cautious 38 1 4 3 2 2 4 2 2 causate 2 causal 38 1 4 3 2 2 ae 4 2 2 causing 2 caustic 38 1 4 3 2 2 4 2 2 caulk 2 cauliflower 38 1 4 3 2 2 a 4 2 2 caucus 2 Cauchy 38 1 4 3 2 s 2 4 2 2 Caucasus 2 Caucasian 38 1 4 3 2 2 clst 4 1 2 caught 38 1 4 3 2 2 4 2 2 cattlemen 2 cattleman 38 1 4 3 2 e 2 m 4 1 2 cattle 38 1 4 3 2 2 l 4 1 2 cattail 38 1 4 3 2 2 4 2 2 catsup 2 Catskill 38 1 4 3 2 on 2 4 2 2 cationic 2 cation 38 1 4 3 2 2 4 2 2 cathodic 2 cathode 38 1 4 3 2 2 d 4 1 2 catholic 38 1 4 3 2 2 4 2 2 Catherwood 2 Catherine 38 1 4 3 2 2 r 4 2 2 catheter 2 cathedral 38 1 4 3 2 2 eo 4 2 2 Cathy 2 catharsis 38 1 4 3 2 2 4 2 2 caterpillar 2 cater 38 1 4 3 2 or 2 4 2 2 category 2 categoric 38 1 4 3 2 2 gr 4 2 2 catenate 2 catechism 38 1 4 3 2 h 2 4 4 2 catchy 2 catchword 2 catchup 2 catch 38 1 4 3 2 oni 2 4 2 2 catatonic 2 catatonia 38 1 4 3 2 troph 2 4 2 2 catastrophic 2 catastrophe 38 1 4 3 2 2 4 2 2 catalyst 2 catalysis 38 1 4 3 2 2 s 4 1 2 catalytic 38 1 4 3 2 2 y 4 3 2 catalpa 2 catalogue 2 Catalina 38 1 4 3 2 2 lst 4 4 2 catawba 2 cataract 2 catapult 2 cataclysmic 38 1 4 3 2 2 acehist 4 5 2 catnip 2 catkin 2 catfish 2 catbird 2 cat 38 1 4 3 2 al 2 4 2 2 casualty 2 casual 38 1 4 3 2 2 4 2 2 Castillo 2 castigate 38 1 4 3 2 2 4 2 2 casteth 2 caste 38 1 4 3 2 2 ei 4 5 2 Castro 2 castor 2 castle 2 castanet 2 cast 38 1 4 3 2 2 4 2 2 Cassius 2 Cassiopeia 38 1 4 3 2 2 4 2 2 cassette 2 casserole 38 1 4 3 2 2 ei 4 2 2 cassock 2 Cassandra 38 1 4 3 2 2 4 2 2 casket 2 cask 38 1 4 3 2 2 4 4 2 cashmere 2 cashier 2 cashew 2 cash 38 1 4 3 2 2 4 5 2 Casey 2 casework 2 casein 2 casebook 2 case 38 1 4 3 2 a 2 4 2 2 cascara 2 cascade 38 1 4 3 2 2 cehkstu 4 3 2 casino 2 casbah 2 Casanova 38 1 4 3 2 e 2 4 2 2 carven 2 carve 38 1 4 3 2 raph 2 4 2 2 cartography 2 cartographer 38 1 4 3 2 2 g 4 2 2 cartoon 2 carton 38 1 4 3 2 lag 2 4 2 2 cartilaginous 2 cartilage 38 1 4 3 2 2 4 3 2 Cartesian 2 cartel 2 carte 38 1 4 3 2 2 eio 4 4 2 cartwheel 2 cartridge 2 Carthage 2 cart 38 1 4 3 2 2 4 2 2 carryover 2 carry 38 1 4 3 2 2 4 2 2 carrot 2 Carroll 38 1 4 3 2 2 4 3 2 carrion 2 Carrie 2 carriage 38 1 4 3 2 2 4 2 2 Carrara 2 carrageen 38 1 4 3 2 2 aioy 4 3 2 Carruthers 2 carrel 2 Carr 38 1 4 3 2 t 2 4 2 2 carpentry 2 carpenter 38 1 4 3 2 2 n 4 1 2 carpet 38 1 4 3 2 2 e 4 3 2 carport 2 Carpathia 2 carp 38 1 4 3 2 n 2 4 4 2 Carolinian 2 Carolingian 2 Caroline 2 Carolina 38 1 4 3 2 2 i 4 2 2 Carolyn 2 carol 38 1 4 3 2 2 l 4 2 2 carouse 2 carob 38 1 4 3 2 2 4 3 2 carney 2 Carnegie 2 carne 38 1 4 3 2 2 4 3 2 carnation 2 carnal 2 carnage 38 1 4 3 2 2 ae 4 1 2 carnival 38 1 4 3 2 2 4 2 2 carmine 2 Carmichael 38 1 4 3 2 2 4 2 2 Carmen 2 Carmela 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 2 4 2 2 carload 2 Carlo 38 1 4 3 2 2 4 2 2 Carlisle 2 Carlin 38 1 4 3 2 2 io 4 6 2 Carlyle 2 Carlton 2 Carlson 2 Carleton 2 Carla 2 Carl 38 1 4 3 2 2 4 3 2 caribou 2 Caribbean 2 Carib 38 1 4 3 2 2 b 4 1 2 caricature 38 1 4 3 2 2 4 2 2 cargoes 2 cargo 38 1 4 3 2 2 o 4 1 2 Cargill 38 1 4 3 2 2 4 2 2 caretaker 2 caret 38 1 4 3 2 2 u 4 1 2 carefree 38 1 4 3 2 2 4 2 2 career 2 careen 38 1 4 3 2 2 eft 4 4 2 Carey 2 careworn 2 caress 2 care 38 1 4 3 2 2 4 3 2 cardiovascular 2 cardiology 2 cardiod 38 1 4 3 2 2 o 4 3 2 cardinal 2 Cardiff 2 cardiac 38 1 4 3 2 2 i 4 3 2 cardboard 2 cardamom 2 card 38 1 4 3 2 en 2 4 2 2 carcinogenic 2 carcinogen 38 1 4 3 2 no 2 g 4 1 2 carcinoma 38 1 4 3 2 2 i 4 1 2 carcass 38 1 4 3 2 2 4 2 2 carburetor 2 carbuncle 38 1 4 3 2 y 2 4 2 2 carboxylic 2 carboxy 38 1 4 3 2 2 4 2 2 carbonium 2 carbonic 38 1 4 3 2 2 4 2 2 carbonate 2 carbonaceous 38 1 4 3 2 2 ai 4 4 2 carbonyl 2 Carbone 2 Carbondale 2 carbon 38 1 4 3 2 2 nx 4 4 2 carboy 2 carborundum 2 Carboloy 2 carbohydrate 38 1 4 3 2 2 4 2 2 carbine 2 carbide 38 1 4 3 2 2 iou 4 0 38 1 4 3 2 2 4 5 2 caraway 2 caravan 2 caramel 2 Caracas 2 carabao 38 1 4 3 2 2 abcdegilmnoprtv 4 3 2 Caruso 2 Carson 2 car 38 1 4 3 2 2 4 2 2 captive 2 captivate 38 1 4 3 2 2 4 2 2 captious 2 caption 38 1 4 3 2 2 ov 4 0 38 1 4 3 2 in 2 4 2 2 captaincy 2 captain 38 1 4 3 2 2 ai 4 2 2 capture 2 captor 38 1 4 3 2 2 4 2 2 capstone 2 capstan 38 1 4 3 2 2 t 4 2 2 capsule 2 capsize 38 1 4 3 2 ic 2 4 3 2 Capricorn 2 capricious 2 caprice 38 1 4 3 2 l 2 4 2 2 Capitoline 2 capitol 38 1 4 3 2 2 4 2 2 capital 2 capita 38 1 4 3 2 2 ao 4 1 2 capitulate 38 1 4 3 2 2 t 4 2 2 Capistrano 2 capillary 38 1 4 3 2 2 4 4 2 Capetown 2 caper 2 capella 2 cape 38 1 4 3 2 2 4 2 2 capacitate 2 capacitance 38 1 4 3 2 2 a 4 3 2 capacity 2 capacitor 2 capacitive 38 1 4 3 2 ci 2 t 4 1 2 capacious 38 1 4 3 2 2 aeirst 4 4 2 capybara 2 Caputo 2 capo 2 cap 38 1 4 3 2 as 2 4 3 2 canvass 2 canvasback 2 canvas 38 1 4 3 2 2 4 2 2 Cantonese 2 canton 38 1 4 3 2 2 n 4 2 2 cantor 2 canto 38 1 4 3 2 2 4 2 2 cantilever 2 canticle 38 1 4 3 2 2 4 2 2 canterelle 2 Canterbury 38 1 4 3 2 2 r 4 1 2 canteen 38 1 4 3 2 2 4 2 2 cantaloupe 2 Cantabrigian 38 1 4 3 2 2 aeio 4 2 2 cantle 2 cant 38 1 4 3 2 2 4 2 2 canonic 2 canon 38 1 4 3 2 2 n 4 3 2 canopy 2 Canoga 2 canoe 38 1 4 3 2 2 4 2 2 cannonball 2 cannon 38 1 4 3 2 2 n 4 1 2 cannot 38 1 4 3 2 2 4 2 2 cannister 2 cannibal 38 1 4 3 2 2 4 2 2 cannery 2 cannel 38 1 4 3 2 2 4 2 2 cannabis 2 canna 38 1 4 3 2 2 aeio 4 1 2 canny 38 1 4 3 2 er 2 4 2 2 cankerworm 2 canker 38 1 4 3 2 2 4 2 2 canister 2 Canis 38 1 4 3 2 2 s 4 1 2 canine 38 1 4 3 2 e 2 4 4 2 candlewick 2 candlestick 2 candlelight 2 candle 38 1 4 3 2 2 4 2 2 candidate 2 candidacy 38 1 4 3 2 d 2 a 4 2 2 Candide 2 candid 38 1 4 3 2 la 2 4 2 2 candelabra 2 candela 38 1 4 3 2 2 eil 4 1 2 candy 38 1 4 3 2 2 4 2 2 cancerous 2 cancer 38 1 4 3 2 2 l 4 1 2 cancel 38 1 4 3 2 2 4 3 2 cancelling 2 cancelled 2 cancellate 38 1 4 3 2 e 2 lr 4 0 38 1 4 3 2 2 4 2 2 Canadian 2 Canada 38 1 4 3 2 2 d 4 4 2 Canaveral 2 canary 2 canal 2 Canaan 38 1 4 3 2 2 acdiknotv 4 6 2 canyon 2 can't 2 Canfield 2 cane 2 Canberra 2 can 38 1 4 3 2 2 4 2 2 campanile 2 campaign 38 1 4 3 2 2 a 4 7 2 campus 2 campsite 2 campion 2 campground 2 campfire 2 Campbell 2 camp 38 1 4 3 2 l 2 4 2 2 Camille 2 camilla 38 1 4 3 2 2 l 4 1 2 Camino 38 1 4 3 2 2 4 2 2 Cameroun 2 Cameron 38 1 4 3 2 2 m 4 1 2 camera 38 1 4 3 2 2 4 2 2 cameramen 2 cameraman 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 Camelot 2 camelopard 38 1 4 3 2 2 o 4 3 2 camellia 2 camelback 2 camel 38 1 4 3 2 2 lr 4 2 2 cameo 2 came 38 1 4 3 2 i 2 4 3 2 Cambridge 2 cambric 2 Cambrian 38 1 4 3 2 2 r 4 2 2 Cambodia 2 camber 38 1 4 3 2 2 beip 4 4 2 camouflage 2 Camden 2 camaraderie 2 cam 38 1 4 3 2 2 4 2 2 Calvert 2 calve 38 1 4 3 2 2 e 4 2 2 Calvin 2 Calvary 38 1 4 3 2 2 4 2 2 calumny 2 calumniate 38 1 4 3 2 m 2 n 4 1 2 Calumet 38 1 4 3 2 ri 2 4 3 2 calorimeter 2 calorie 2 caloric 38 1 4 3 2 raph 2 4 2 2 calligraphy 2 calligraph 38 1 4 3 2 2 g 4 3 2 calling 2 Callisto 2 calliope 38 1 4 3 2 2 4 4 2 callable 2 Callahan 2 Callaghan 2 calla 38 1 4 3 2 2 ai 4 5 2 calls 2 called 2 callus 2 callous 2 call 38 1 4 3 2 2 4 2 2 caliphate 2 caliph 38 1 4 3 2 2 h 4 1 2 caliper 38 1 4 3 2 orni 2 4 2 2 californium 2 California 38 1 4 3 2 2 r 4 1 2 caliber 38 1 4 3 2 2 4 2 2 calibre 2 calibrate 38 1 4 3 2 2 bfp 4 2 2 calisthenic 2 calico 38 1 4 3 2 2 4 2 2 calfskin 2 calf 38 1 4 3 2 d 2 4 2 2 calendrical 2 calendar 38 1 4 3 2 2 n 4 1 2 Caleb 38 1 4 3 2 r 2 4 2 2 caldera 2 Calder 38 1 4 3 2 2 e 4 1 2 Caldwell 38 1 4 3 2 2 a 4 2 2 calculus 2 calculi 38 1 4 3 2 2 4 2 2 calculate 2 calculable 38 1 4 3 2 2 l 4 1 2 Calcutta 38 1 4 3 2 2 4 3 2 calcium 2 calcite 2 calcify 38 1 4 3 2 2 iu 4 1 2 calcareous 38 1 4 3 2 t 2 4 2 2 calamity 2 calamitous 38 1 4 3 2 2 i 4 1 2 calamus 38 1 4 3 2 2 m 4 1 2 Calais 38 1 4 3 2 2 acdefilouv 4 6 2 calypso 2 calm 2 Calkins 2 Calhoun 2 Calgary 2 Cal 38 1 4 3 2 2 4 2 2 Cairo 2 cairn 38 1 4 3 2 2 4 2 2 Caine 2 Cain 38 1 4 3 2 2 nr 4 1 2 caiman 38 1 4 3 2 2 4 2 2 cahoot 2 Cahill 38 1 4 3 2 e 2 4 2 2 cagey 2 cage 38 1 4 3 2 e 2 4 2 2 cafeteria 2 cafe 38 1 4 3 2 2 4 2 2 cadenza 2 cadent 38 1 4 3 2 2 n 4 1 2 cadet 38 1 4 3 2 2 4 2 2 caddy 2 caddis 38 1 4 3 2 ver 2 4 2 2 cadaverous 2 cadaver 38 1 4 3 2 2 ade 4 4 2 Cady 2 cadre 2 cadmium 2 Cadillac 38 1 4 3 2 2 4 2 2 cactus 2 cacti 38 1 4 3 2 phon 2 4 2 2 cacophony 2 cacophonist 38 1 4 3 2 2 4 2 2 cache 2 cachalot 38 1 4 3 2 2 hot 4 3 2 CACM 2 cackle 2 cacao 38 1 4 3 2 t 2 4 3 2 cabinetry 2 cabinetmake 2 cabinet 38 1 4 3 2 n 2 e 4 1 2 cabin 38 1 4 3 2 2 4 3 2 cabaret 2 cabana 2 cabal 38 1 4 3 2 2 ai 4 5 2 Cabot 2 cable 2 cabdriver 2 cabbage 2 cab 38 1 4 3 2 2 bcdfghilmnprstuvy 4 5 2 caw 2 cake 2 cajole 2 Caesar 2 CA 38 1 4 3 2 2 aehilOpruyz 4 7 2 CT 2 csnet 2 c's 2 cf 2 CDC 2 CBS 2 c 38 1 4 3 2 anti 2 4 2 2 Byzantium 2 Byzantine 38 1 4 3 2 2 4 2 2 byword 2 byway 38 1 4 3 2 2 4 2 2 Byronic 2 Byron 38 1 4 3 2 2 n 4 1 2 byroad 38 1 4 3 2 2 o 4 2 2 Byrne 2 Byrd 38 1 4 3 2 2 4 2 2 bypath 2 bypass 38 1 4 3 2 2 a 4 1 2 byproduct 38 1 4 3 2 2 4 2 2 byline 2 bylaw 38 1 4 3 2 2 lprwz 4 5 2 byte 2 bystander 2 bygone 2 bye 2 by 38 1 4 3 2 z 2 4 5 2 buzzy 2 buzzword 2 buzzing 2 Buzzard 2 buzz 38 1 4 3 2 2 4 2 2 Buxton 2 Buxtehude 38 1 4 3 2 2 t 4 1 2 buxom 38 1 4 3 2 2 4 2 2 butyric 2 butyrate 38 1 4 3 2 2 r 4 1 2 butyl 38 1 4 3 2 2 4 2 2 Buttrick 2 buttress 38 1 4 3 2 2 4 3 2 buttonweed 2 buttonhole 2 button 38 1 4 3 2 2 n 4 1 2 buttock 38 1 4 3 2 2 4 3 2 butterfly 2 Butterfield 2 butterfat 38 1 4 3 2 2 f 4 5 2 buttery 2 butternut 2 buttermilk 2 buttercup 2 butterball 38 1 4 3 2 2 r 4 1 2 butte 38 1 4 3 2 2 eor 4 1 2 butt 38 1 4 3 2 2 4 2 2 buteo 2 butene 38 1 4 3 2 h 2 4 2 2 butchery 2 butch 38 1 4 3 2 2 4 2 2 butane 2 butadiene 38 1 4 3 2 2 acety 4 2 2 butler 2 but 38 1 4 3 2 2 4 3 2 bustle 2 bustard 2 bust 38 1 4 3 2 2 4 2 2 businessmen 2 businessman 38 1 4 3 2 ness 2 m 4 2 2 businesses 2 business 38 1 4 3 2 2 4 6 2 bushy 2 bushwhack 2 Bushnell 2 bushmaster 2 bushel 2 bush 38 1 4 3 2 2 hit 4 5 2 busy 2 buss 2 Busch 2 busboy 2 bus 38 1 4 3 2 2 4 3 2 Burtt 2 Burton 2 Burt 38 1 4 3 2 2 4 2 2 bursty 2 burst 38 1 4 3 2 2 t 4 1 2 bursitis 38 1 4 3 2 2 4 3 2 burrow 2 Burroughs 2 burro 38 1 4 3 2 2 o 4 1 2 Burr 38 1 4 3 2 2 4 7 2 burnt 2 Burnside 2 burnout 2 burnish 2 Burnham 2 Burnett 2 burn 38 1 4 3 2 2 4 2 2 Burmese 2 Burma 38 1 4 3 2 2 4 2 2 burley 2 burlesque 38 1 4 3 2 2 e 4 4 2 burly 2 Burlington 2 burlap 2 burl 38 1 4 3 2 nd 2 4 2 2 Burgundy 2 Burgundian 38 1 4 3 2 ar 2 4 3 2 burglary 2 burglarproof 2 burglar 38 1 4 3 2 2 4 2 2 burgess 2 burgeon 38 1 4 3 2 2 elu 4 2 2 burgher 2 burg 38 1 4 3 2 2 4 2 2 burette 2 buret 38 1 4 3 2 u 2 c 4 1 2 bureau 38 1 4 3 2 2 4 2 2 bureaucratic 2 bureaucrat 38 1 4 3 2 ra 2 t 4 1 2 bureaucracy 38 1 4 3 2 2 at 4 0 38 1 4 3 2 n 2 4 2 2 burdensome 2 burden 38 1 4 3 2 2 e 4 1 2 burdock 38 1 4 3 2 2 deglmnrst 4 7 2 bury 2 Burundi 2 burp 2 Burke 2 burial 2 Burch 2 burbank 38 1 4 3 2 y 2 4 2 2 buoyant 2 buoy 38 1 4 3 2 2 4 2 2 bunkmate 2 bunk 38 1 4 3 2 2 4 2 2 bungle 2 bungalow 38 1 4 3 2 2 4 4 2 bundy 2 Bundoora 2 bundle 2 Bundestag 38 1 4 3 2 2 dgk 4 6 2 Bunyan 2 bunt 2 Bunsen 2 bunny 2 bunch 2 bun 38 1 4 3 2 2 4 2 2 bumptious 2 bump 38 1 4 3 2 le 2 4 2 2 bumblebee 2 bumble 38 1 4 3 2 2 bp 4 1 2 bum 38 1 4 3 2 2 4 2 2 bullyboy 2 bully 38 1 4 3 2 2 4 2 2 bullhide 2 bullhead 38 1 4 3 2 2 4 2 2 bullfrog 2 bullfinch 38 1 4 3 2 t 2 4 2 2 bulletin 2 bullet 38 1 4 3 2 o 2 4 2 2 bulldoze 2 bulldog 38 1 4 3 2 2 defhy 4 5 2 bullwhack 2 bullseye 2 bullock 2 bullish 2 bull 38 1 4 3 2 2 4 3 2 bulky 2 bulkhead 2 bulk 38 1 4 3 2 2 4 2 2 bulge 2 Bulgaria 38 1 4 3 2 2 4 2 2 bulblet 2 bulb 38 1 4 3 2 2 bgkl 4 2 2 bulwark 2 bulrush 38 1 4 3 2 2 4 3 2 built-in 2 builtin 2 built 38 1 4 3 2 2 i 4 2 2 buildup 2 build 38 1 4 3 2 2 dt 4 0 38 1 4 3 2 2 l 4 1 2 Buick 38 1 4 3 2 2 4 2 2 buggy 2 bugging 38 1 4 3 2 2 g 4 4 2 bugle 2 bugeyed 2 bugaboo 2 bug 38 1 4 3 2 f 2 e 4 4 2 buffoon 2 bufflehead 2 buffalo 2 buff 38 1 4 3 2 n 2 4 2 2 Buenos 2 Buena 38 1 4 3 2 2 4 2 2 budgetary 2 budget 38 1 4 3 2 e 2 t 4 1 2 budge 38 1 4 3 2 s 2 4 2 2 Buddhist 2 Buddhism 38 1 4 3 2 2 i 4 1 2 Buddha 38 1 4 3 2 2 h 4 2 2 buddy 2 Budd 38 1 4 3 2 2 dg 4 3 2 Budweiser 2 Budapest 2 bud 38 1 4 3 2 2 4 2 2 buckskin 2 buckshot 38 1 4 3 2 e 2 4 2 2 Buckley 2 buckle 38 1 4 3 2 2 4 2 2 bucketfull 2 bucket 38 1 4 3 2 2 t 4 1 2 buckeye 38 1 4 3 2 2 els 4 7 2 buckwheat 2 buckthorn 2 Bucknell 2 buckhorn 2 buckboard 2 buckaroo 2 buck 38 1 4 3 2 2 a 4 2 2 Buchwald 2 Buchenwald 38 1 4 3 2 2 4 2 2 Bucharest 2 Buchanan 38 1 4 3 2 2 hk 4 1 2 bucolic 38 1 4 3 2 2 4 2 2 bubble 2 bub 38 1 4 3 2 2 bcdefgilmnorstxzy 4 1 2 Bujumbura 38 1 4 3 2 hyt 2 4 2 2 bryophyte 2 bryophyta 38 1 4 3 2 2 p 4 1 2 bryozoa 38 1 4 3 2 n 2 4 2 2 Bryant 2 Bryan 38 1 4 3 2 2 ao 4 2 2 Bryn 2 Bryce 38 1 4 3 2 2 4 2 2 brute 2 brutal 38 1 4 3 2 2 4 4 2 brushy 2 brushwork 2 brushfire 2 brush 38 1 4 3 2 2 h 4 2 2 Brussels 2 brusque 38 1 4 3 2 2 4 6 2 brunt 2 Brunswick 2 Bruno 2 Brunhilde 2 brunette 2 brunch 38 1 4 3 2 2 4 2 2 bruit 2 bruise 38 1 4 3 2 2 e 4 1 2 Bruckner 38 1 4 3 2 2 4 2 2 brucellosis 2 Bruce 38 1 4 3 2 2 cinst 4 2 2 Brumidi 2 Bruegel 38 1 4 3 2 2 4 3 2 brownish 2 brownie 2 Brownian 38 1 4 3 2 2 4 2 2 Brownell 2 Browne 38 1 4 3 2 2 ei 4 1 2 brown 38 1 4 3 2 2 n 4 3 2 browse 2 browbeaten 2 brow 38 1 4 3 2 2 4 2 2 brouhaha 2 brought 38 1 4 3 2 2 4 2 2 brother 2 brothel 38 1 4 3 2 h 2 e 4 1 2 broth 38 1 4 3 2 2 4 2 2 broomcorn 2 broom 38 1 4 3 2 2 4 2 2 Brooklyn 2 Brookline 38 1 4 3 2 2 l 4 4 2 brookside 2 Brookhaven 2 Brooke 2 brook 38 1 4 3 2 2 4 2 2 broody 2 brood 38 1 4 3 2 2 dkm 4 0 38 1 4 3 2 2 4 2 2 bronzy 2 bronze 38 1 4 3 2 2 h 4 1 2 bronco 38 1 4 3 2 2 i 4 1 2 bronchus 38 1 4 3 2 2 o 4 3 2 bronchitis 2 bronchial 2 bronchi 38 1 4 3 2 l 2 4 2 2 bronchiole 2 bronchiolar 38 1 4 3 2 2 cz 4 2 2 Bronx 2 Brontosaurus 38 1 4 3 2 2 4 2 2 bromine 2 bromide 38 1 4 3 2 2 i 4 2 2 Bromley 2 Bromfield 38 1 4 3 2 e 2 4 3 2 brokerage 2 broken 2 broke 38 1 4 3 2 2 4 2 2 brockle 2 Brock 38 1 4 3 2 2 k 4 3 2 brochure 2 broccoli 2 brocade 38 1 4 3 2 2 d 4 1 2 broach 38 1 4 3 2 2 4 6 2 Broadway 2 broadside 2 broadloom 2 broaden 2 broadcast 2 broad 38 1 4 3 2 2 ackmnotuw 4 2 2 broil 2 Broglie 38 1 4 3 2 2 4 3 2 brittle 2 Britten 2 Brittany 38 1 4 3 2 2 n 4 1 2 Britain 38 1 4 3 2 nic 2 4 2 2 Britannica 2 Britannic 38 1 4 3 2 2 at 4 3 2 Briton 2 British 2 britches 38 1 4 3 2 2 4 2 2 Bristol 2 bristle 38 1 4 3 2 2 t 4 2 2 brisk 2 Brisbane 38 1 4 3 2 2 4 2 2 brinkmanship 2 brink 38 1 4 3 2 2 4 2 2 brindle 2 Brindisi 38 1 4 3 2 2 dkg 4 2 2 briny 2 brine 38 1 4 3 2 2 4 3 2 brimstone 2 brimful 2 brim 38 1 4 3 2 l 2 4 2 2 Brillouin 2 brilliant 38 1 4 3 2 2 4 3 2 Brighton 2 brighten 2 bright 38 1 4 3 2 2 t 4 1 2 Brigham 38 1 4 3 2 2 4 2 2 brigadier 2 brigade 38 1 4 3 2 2 d 4 1 2 brigantine 38 1 4 3 2 2 ah 4 2 2 Briggs 2 brig 38 1 4 3 2 f 2 4 2 2 briefcase 2 brief 38 1 4 3 2 2 4 2 2 bridgework 2 Bridgewater 38 1 4 3 2 2 4 2 2 Bridgetown 2 Bridget 38 1 4 3 2 e 2 tw 4 4 2 Bridgeport 2 bridgehead 2 bridgeable 2 bridge 38 1 4 3 2 2 4 3 2 bridesmaid 2 bridegroom 2 bride 38 1 4 3 2 2 eg 4 2 2 bridle 2 bridal 38 1 4 3 2 ay 2 4 2 2 bricklaying 2 bricklayer 38 1 4 3 2 2 l 4 2 2 brickbat 2 brick 38 1 4 3 2 2 k 4 1 2 Brice 38 1 4 3 2 e 2 4 2 2 bribery 2 bribe 38 1 4 3 2 2 4 2 2 briar 2 Brian 38 1 4 3 2 2 abcdeglmnst 4 0 38 1 4 3 2 2 4 3 2 Brewster 2 brewery 2 brew 38 1 4 3 2 2 4 2 2 brevet 2 breve 38 1 4 3 2 2 e 4 1 2 brevity 38 1 4 3 2 2 4 3 2 Brett 2 Breton 2 brethren 38 1 4 3 2 2 4 2 2 Brenner 2 Brennan 38 1 4 3 2 a 2 4 2 2 Brendan 2 Brenda 38 1 4 3 2 2 dn 4 1 2 Brent 38 1 4 3 2 2 4 2 2 bremsstrahlung 2 Bremen 38 1 4 3 2 2 4 2 2 breezy 2 breeze 38 1 4 3 2 2 z 4 2 2 breed 2 breech 38 1 4 3 2 2 dkst 4 2 2 bream 2 breach 38 1 4 3 2 h 2 4 4 2 breathy 2 breathtaking 2 breathe 2 breath 38 1 4 3 2 t 2 4 3 2 breastwork 2 breastplate 2 breast 38 1 4 3 2 2 4 2 2 breakaway 2 breakage 38 1 4 3 2 2 a 4 8 2 breakwater 2 breakup 2 breakthrough 2 breakpoint 2 breakoff 2 breakfast 2 breakdown 2 break 38 1 4 3 2 2 4 5 2 breadth 2 breadroot 2 breadfruit 2 breadboard 2 bread 38 1 4 3 2 2 aemntvw 4 3 2 Brest 2 bred 2 breccia 38 1 4 3 2 2 cdghiknsvz 4 6 2 bray 2 brawl 2 Braun 2 bratwurst 2 bramble 2 brae 38 1 4 3 2 2 4 2 2 Brazilian 2 Brazil 38 1 4 3 2 2 l 4 1 2 brazier 38 1 4 3 2 2 i 4 2 2 Brazzaville 2 brazen 38 1 4 3 2 2 4 2 2 bravery 2 brave 38 1 4 3 2 2 e 4 3 2 bravura 2 bravo 2 bravado 38 1 4 3 2 2 4 3 2 brassy 2 brassiere 2 brass 38 1 4 3 2 2 s 4 2 2 Brasilia 2 brash 38 1 4 3 2 2 4 2 2 brandywine 2 brandy 38 1 4 3 2 2 4 2 2 Brandenburg 2 Brandeis 38 1 4 3 2 2 ey 4 4 2 Brandt 2 Brandon 2 brandish 2 brand 38 1 4 3 2 2 dc 4 3 2 brant 2 Braniff 2 bran 38 1 4 3 2 e 2 4 2 2 brakeman 2 brake 38 1 4 3 2 2 4 5 2 brainy 2 brainwash 2 brainstorm 2 Brainard 2 brain 38 1 4 3 2 2 n 4 2 2 Braille 2 braid 38 1 4 3 2 2 4 2 2 Brahmsian 2 Brahms 38 1 4 3 2 m 2 s 4 1 2 Brahmaputra 38 1 4 3 2 2 4 2 2 bragging 2 Bragg 38 1 4 3 2 2 g 4 1 2 brag 38 1 4 3 2 2 4 6 2 Brady 2 Bradshaw 2 Bradley 2 Bradford 2 Bradbury 2 brad 38 1 4 3 2 2 ek 4 1 2 bract 38 1 4 3 2 2 4 2 2 bracket 2 bracken 38 1 4 3 2 2 e 4 1 2 brackish 38 1 4 3 2 2 4 2 2 bracelet 2 brace 38 1 4 3 2 2 aeiouy 4 0 38 1 4 3 2 2 4 2 2 Boylston 2 Boyle 38 1 4 3 2 2 4 2 2 boycott 2 Boyce 38 1 4 3 2 2 cl 4 4 2 boyish 2 Boyd 2 boyar 2 boy 38 1 4 3 2 2 4 4 2 boxy 2 boxwood 2 boxcar 2 box 38 1 4 3 2 2 4 2 2 bowmen 2 bowman 38 1 4 3 2 2 4 2 2 bowline 2 bowl 38 1 4 3 2 2 4 2 2 Bowen 2 bowel 38 1 4 3 2 2 4 2 2 Bowdoin 2 Bowditch 38 1 4 3 2 2 delm 4 4 2 bowstring 2 bowie 2 bowfin 2 bow 38 1 4 3 2 2 4 2 2 boutique 2 bout 38 1 4 3 2 eois 2 4 2 2 bourgeoisie 2 bourgeois 38 1 4 3 2 2 4 2 2 bourbon 2 Bourbaki 38 1 4 3 2 2 bg 4 1 2 bourn 38 1 4 3 2 2 4 2 2 boundary 2 bound 38 1 4 3 2 2 4 2 2 bouncy 2 bounce 38 1 4 3 2 2 cd 4 1 2 bounty 38 1 4 3 2 2 4 2 2 boulevard 2 boulder 38 1 4 3 2 h 2 4 2 2 bought 2 bough 38 1 4 3 2 2 glnrt 4 4 2 boustrophedon 2 bouquet 2 bouffant 2 Boucher 38 1 4 3 2 li 2 4 2 2 botulism 2 botulin 38 1 4 3 2 m 2 4 2 2 bottommost 2 bottom 38 1 4 3 2 e 2 4 2 2 bottleneck 2 bottle 38 1 4 3 2 2 lo 4 0 38 1 4 3 2 2 4 2 2 bothersome 2 both 38 1 4 3 2 n 2 i 4 1 2 botany 38 1 4 3 2 2 4 2 2 botanist 2 botanic 38 1 4 3 2 2 ahtu 4 3 2 Botswana 2 botfly 2 botch 38 1 4 3 2 2 4 2 2 bosonic 2 boson 38 1 4 3 2 2 n 4 1 2 bosom 38 1 4 3 2 2 o 4 5 2 Boswell 2 Boston 2 boss 2 Bose 2 Bosch 38 1 4 3 2 o 2 4 2 2 borrow 2 Borroughs 38 1 4 3 2 2 4 3 2 borough 2 borosilicate 2 boron 38 1 4 3 2 2 4 2 2 Borneo 2 borne 38 1 4 3 2 2 e 4 1 2 born 38 1 4 3 2 2 4 2 2 Boris 2 boric 38 1 4 3 2 2 4 2 2 Boreas 2 Borealis 38 1 4 3 2 2 a 4 2 2 boredom 2 bore 38 1 4 3 2 2 4 2 2 borderline 2 borderland 38 1 4 3 2 2 l 4 1 2 border 38 1 4 3 2 e 2 r 4 3 2 Borden 2 bordello 2 Bordeaux 38 1 4 3 2 2 4 2 2 borax 2 borate 38 1 4 3 2 2 adeinor 4 1 2 Borg 38 1 4 3 2 trap 2 4 2 2 bootstrapping 2 bootstrap 38 1 4 3 2 2 4 2 2 bootlegging 2 bootlegger 38 1 4 3 2 eg 2 g 4 1 2 bootleg 38 1 4 3 2 2 ls 4 4 2 booty 2 booth 2 Bootes 2 boot 38 1 4 3 2 2 4 2 2 boorish 2 boor 38 1 4 3 2 2 4 2 2 Boone 2 boon 38 1 4 3 2 2 4 2 2 boomerang 2 boom 38 1 4 3 2 el 2 4 2 2 bookshelves 2 bookshelf 38 1 4 3 2 2 h 4 2 2 bookstore 2 bookseller 38 1 4 3 2 2 4 2 2 bookish 2 bookie 38 1 4 3 2 2 is 4 8 2 booky 2 bookplate 2 booklet 2 bookkeep 2 bookend 2 bookcase 2 bookbind 2 book 38 1 4 3 2 2 kmnrt 4 6 2 booze 2 boost 2 boolean 2 boogie 2 booby 2 boo 38 1 4 3 2 2 4 2 2 Bonneville 2 bonnet 38 1 4 3 2 2 e 4 2 2 Bonnie 2 Bonn 38 1 4 3 2 2 4 2 2 bonito 2 Boniface 38 1 4 3 2 2 4 2 2 bongo 2 bong 38 1 4 3 2 m 2 4 2 2 bondsmen 2 bondsman 38 1 4 3 2 2 s 4 2 2 bondage 2 bond 38 1 4 3 2 2 4 4 2 Bonaventure 2 Bonaparte 2 bonanza 2 bona 38 1 4 3 2 2 adginu 4 5 2 bonze 2 bony 2 bonfire 2 bone 2 bon 38 1 4 3 2 t 2 4 2 2 bombastic 2 bombast 38 1 4 3 2 2 s 4 2 2 Bombay 2 bombard 38 1 4 3 2 b 2 a 4 2 2 bombproof 2 bomb 38 1 4 3 2 2 4 3 2 Boltzmann 2 Bolton 2 bolt 38 1 4 3 2 2 e 4 1 2 Bolshoi 38 1 4 3 2 vi 2 s 4 1 2 Bolshevik 38 1 4 3 2 2 4 2 2 Bolshevist 2 Bolshevism 38 1 4 3 2 2 h 4 1 2 bolster 38 1 4 3 2 2 4 3 2 bolometer 2 Bologna 2 bolo 38 1 4 3 2 v 2 4 2 2 Bolivia 2 bolivar 38 1 4 3 2 2 4 2 2 boletus 2 bole 38 1 4 3 2 2 4 2 2 boldface 2 bold 38 1 4 3 2 2 deiost 4 0 38 1 4 3 2 2 4 3 2 boisterous 2 Boise 2 Bois 38 1 4 3 2 2 s 4 1 2 boil 38 1 4 3 2 2 4 2 2 Bohr 2 Bohemia 38 1 4 3 2 2 4 3 2 boggy 2 boggle 2 bogging 38 1 4 3 2 y 2 4 2 2 bogeymen 2 bogey 38 1 4 3 2 2 eg 4 4 2 bogy 2 bogus 2 Bogota 2 bog 38 1 4 3 2 2 4 2 2 Boeotia 2 Boeing 38 1 4 3 2 uild 2 4 2 2 bodybuilding 2 bodybuilder 38 1 4 3 2 2 b 4 2 2 bodyguard 2 body 38 1 4 3 2 2 y 4 4 2 Bodleian 2 bodice 2 bodhisattva 2 bode 38 1 4 3 2 2 4 2 2 bock 2 Boca 38 1 4 3 2 2 4 2 2 bobbin 2 Bobbie 38 1 4 3 2 2 i 4 2 2 bobby 2 bobble 38 1 4 3 2 2 b 4 3 2 bobolink 2 bobcat 2 bob 38 1 4 3 2 2 rst 4 1 2 boa 38 1 4 3 2 2 4 2 2 boatmen 2 boatman 38 1 4 3 2 2 m 4 5 2 boatyard 2 boatswain 2 boatload 2 boathouse 2 boat 38 1 4 3 2 t 2 4 3 2 boasts 2 boastful 2 boast 38 1 4 3 2 2 4 2 2 boardinghouse 2 board 38 1 4 3 2 2 d 4 1 2 boar 38 1 4 3 2 2 abcdeghilmnorstuwxy 4 2 2 bovine 2 bop 38 1 4 3 2 er 2 4 2 2 blustery 2 bluster 38 1 4 3 2 2 t 4 1 2 blush 38 1 4 3 2 2 4 3 2 blurt 2 blurry 2 blur 38 1 4 3 2 2 4 2 2 blunt 2 blunder 38 1 4 3 2 2 4 2 2 Blumenthal 2 Blum 38 1 4 3 2 2 4 2 2 bluegrass 2 bluegill 38 1 4 3 2 2 4 2 2 bluebook 2 bluebonnet 38 1 4 3 2 2 4 2 2 bluebird 2 bluebill 38 1 4 3 2 2 io 4 3 2 bluebush 2 blueberry 2 blueback 38 1 4 3 2 2 bg 4 6 2 bluet 2 bluestocking 2 blueprint 2 bluejacket 2 bluefish 2 blue 38 1 4 3 2 2 emnrs 4 5 2 blutwurst 2 bluish 2 bluff 2 bludgeon 2 blubber 38 1 4 3 2 2 4 4 2 blowup 2 blown 2 blowfish 2 blow 38 1 4 3 2 2 4 2 2 blotch 2 blot 38 1 4 3 2 2 4 3 2 Bloomington 2 Bloomfield 2 bloom 38 1 4 3 2 2 s 4 6 2 bloody 2 bloodroot 2 bloodline 2 bloodhound 2 bloodbath 2 blood 38 1 4 3 2 2 4 3 2 bloodstream 2 bloodstone 2 bloodstain 38 1 4 3 2 2 4 2 2 bloodshot 2 bloodshed 38 1 4 3 2 2 ht 4 0 38 1 4 3 2 2 dm 4 1 2 bloop 38 1 4 3 2 d 2 4 2 2 blonde 2 blond 38 1 4 3 2 2 4 2 2 Blomquist 2 Blomberg 38 1 4 3 2 2 4 2 2 blockage 2 blockade 38 1 4 3 2 2 a 4 3 2 blocky 2 blockhouse 2 block 38 1 4 3 2 2 k 4 2 2 Bloch 2 bloc 38 1 4 3 2 2 cmnotw 4 5 2 blouse 2 blossom 2 bloke 2 blob 2 bloat 38 1 4 3 2 2 4 2 2 blitz 2 blithe 38 1 4 3 2 2 4 2 2 blissful 2 bliss 38 1 4 3 2 2 s 4 1 2 blister 38 1 4 3 2 2 4 2 2 blindfold 2 blind 38 1 4 3 2 2 d 4 2 2 Blinn 2 blink 38 1 4 3 2 2 nst 4 4 2 blizzard 2 blip 2 blimp 2 blight 38 1 4 3 2 2 s 4 1 2 blest 38 1 4 3 2 2 4 2 2 Blenheim 2 blend 38 1 4 3 2 2 4 2 2 Bleeker 2 bleed 38 1 4 3 2 2 4 4 2 bleat 2 bleary 2 bleak 2 bleach 38 1 4 3 2 2 aens 4 3 2 blew 2 blemish 2 bled 38 1 4 3 2 2 cdimnstz 4 3 2 blare 2 Blake 2 blab 38 1 4 3 2 2 4 2 2 blazon 2 blaze 38 1 4 3 2 2 4 4 2 Blatz 2 blather 2 blatant 2 blat 38 1 4 3 2 2 4 2 2 blastula 2 blast 38 1 4 3 2 hem 2 4 3 2 blasphemy 2 blasphemous 2 blaspheme 38 1 4 3 2 2 pt 4 0 38 1 4 3 2 2 4 2 2 blanket 2 blank 38 1 4 3 2 2 4 2 2 blandish 2 bland 38 1 4 3 2 2 h 4 1 2 blanc 38 1 4 3 2 2 4 3 2 Blanche 2 Blanchard 2 blanch 38 1 4 3 2 2 cdk 4 0 38 1 4 3 2 e 2 4 2 2 blameworthy 2 blame 38 1 4 3 2 2 4 2 2 Blair 2 Blaine 38 1 4 3 2 er 2 4 3 2 bladderwort 2 bladdernut 2 bladder 38 1 4 3 2 2 d 4 1 2 blade 38 1 4 3 2 2 4 2 2 Blackstone 2 blacksmith 38 1 4 3 2 a 2 4 2 2 Blackman 2 blackmail 38 1 4 3 2 2 4 2 2 blackbody 2 blackboard 38 1 4 3 2 2 o 4 4 2 Blackburn 2 blackbird 2 blackberry 2 blackball 38 1 4 3 2 k 2 bms 4 7 2 blackness 2 Blackwell 2 blackout 2 blackjack 2 Blackfeet 2 blacken 2 black 38 1 4 3 2 2 aeiou 4 2 2 Blythe 2 Blvd 38 1 4 3 2 2 4 3 2 Bizet 2 bizarre 2 biz 38 1 4 3 2 2 4 2 2 bivariate 2 bivalve 38 1 4 3 2 2 a 4 1 2 bivouac 38 1 4 3 2 m 2 4 2 2 bituminous 2 bitumen 38 1 4 3 2 2 4 2 2 bitternut 2 bittern 38 1 4 3 2 2 n 4 2 2 bittersweet 2 bitterroot 38 1 4 3 2 2 r 4 1 2 bitten 38 1 4 3 2 2 e 4 1 2 bitt 38 1 4 3 2 2 tu 4 6 2 bits 2 bitwise 2 bitnet 2 bite 2 bitch 2 bit 38 1 4 3 2 a 2 4 2 2 bistate 2 bistable 38 1 4 3 2 r 2 4 2 2 Bismark 2 Bismarck 38 1 4 3 2 2 a 4 1 2 bismuth 38 1 4 3 2 op 2 4 2 2 bishopric 2 bishop 38 1 4 3 2 2 4 2 2 bisexual 2 bisect 38 1 4 3 2 2 ehmt 4 4 2 Bissau 2 bisque 2 bison 2 biscuit 38 1 4 3 2 h 2 4 4 2 birthright 2 birthplace 2 birthday 2 birth 38 1 4 3 2 2 4 5 2 birdwatch 2 birdseed 2 birdie 2 birdbath 2 bird 38 1 4 3 2 2 dt 4 5 2 Birmingham 2 Birgit 2 birefringent 2 birch 2 biracial 38 1 4 3 2 rti 2 4 2 2 bipartite 2 bipartisan 38 1 4 3 2 2 a 4 2 2 bipolar 2 biplane 38 1 4 3 2 2 4 2 2 biotite 2 biotic 38 1 4 3 2 2 i 4 1 2 biota 38 1 4 3 2 etr 2 4 2 2 biometry 2 Biometrika 38 1 4 3 2 2 mt 4 4 2 biopsy 2 biology 2 biography 2 biochemic 38 1 4 3 2 2 4 2 2 binomial 2 binocular 38 1 4 3 2 am 2 4 2 2 Binghamton 2 Bingham 38 1 4 3 2 2 h 4 3 2 bingle 2 binge 2 bing 38 1 4 3 2 2 4 5 2 bindings 2 bindweed 2 bindle 2 bindery 2 bind 38 1 4 3 2 2 4 2 2 binaural 2 binary 38 1 4 3 2 2 adgo 4 3 2 binuclear 2 Bini 2 bin 38 1 4 3 2 2 4 3 2 bimonthly 2 bimolecular 2 bimodal 38 1 4 3 2 talli 2 4 2 2 bimetallism 2 bimetallic 38 1 4 3 2 2 eo 4 1 2 Bimini 38 1 4 3 2 n 2 4 3 2 billions 2 billionth 2 billion 38 1 4 3 2 2 o 4 3 2 Billiken 2 Billie 2 billiard 38 1 4 3 2 2 i 4 5 2 billy 2 billow 2 billet 2 billboard 2 bill 38 1 4 3 2 n 2 4 2 2 bilingual 2 bilinear 38 1 4 3 2 2 4 3 2 bilayer 2 bilateral 2 bilabial 38 1 4 3 2 2 ail 4 5 2 Biltmore 2 bilk 2 bilharziasis 2 bilge 2 bile 38 1 4 3 2 cti 2 4 2 2 bijective 2 bijection 38 1 4 3 2 2 e 4 1 2 bijouterie 38 1 4 3 2 t 2 4 2 2 bigotry 2 bigot 38 1 4 3 2 2 o 4 3 2 Biggs 2 Bigelow 2 big 38 1 4 3 2 2 4 2 2 bifurcate 2 bifocal 38 1 4 3 2 i 2 4 2 2 biennium 2 biennial 38 1 4 3 2 n 2 n 4 1 2 bien 38 1 4 3 2 2 4 2 2 bidirectional 2 bidiagonal 38 1 4 3 2 2 4 2 2 biddy 2 bidden 38 1 4 3 2 2 di 4 2 2 bide 2 bid 38 1 4 3 2 n 2 4 2 2 biconnected 2 biconcave 38 1 4 3 2 2 4 2 2 bicarbonate 2 bicameral 38 1 4 3 2 2 ao 4 4 2 bicycle 2 bicker 2 bichromate 2 bicep 38 1 4 3 2 2 4 2 2 bibliophile 2 bibliography 38 1 4 3 2 2 o 4 1 2 biblical 38 1 4 3 2 2 i 4 1 2 Bible 38 1 4 3 2 2 l 4 2 2 bibb 2 bib 38 1 4 3 2 2 4 4 2 biaxial 2 bias 2 bianco 2 Bialystok 38 1 4 3 2 2 abcdefgjlmnoprstvz 4 2 2 bikini 2 biharmonic 38 1 4 3 2 2 4 2 2 Bhutan 2 bhoy 38 1 4 3 2 2 4 2 2 beyond 2 bey 38 1 4 3 2 2 4 2 2 bewitch 2 bewilder 38 1 4 3 2 2 4 2 2 beware 2 bewail 38 1 4 3 2 2 ai 4 1 2 bewhisker 38 1 4 3 2 2 r 4 1 2 bevel 38 1 4 3 2 2 4 2 2 Beverly 2 beverage 38 1 4 3 2 2 e 4 1 2 bevy 38 1 4 3 2 2 4 2 2 betwixt 2 between 38 1 4 3 2 2 e 4 2 2 Betty 2 bettor 38 1 4 3 2 2 4 2 2 Betsy 2 Betsey 38 1 4 3 2 th 2 4 2 2 betrothal 2 betroth 38 1 4 3 2 y 2 4 2 2 betrayal 2 betray 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 betony 2 betoken 38 1 4 3 2 2 4 2 2 Bethesda 2 bethel 38 1 4 3 2 2 e 4 3 2 bethought 2 Bethlehem 2 beth 38 1 4 3 2 l 2 4 2 2 Betelgeuse 2 betel 38 1 4 3 2 2 4 2 2 betatron 2 beta 38 1 4 3 2 2 aehorstw 4 2 2 betide 2 bet 38 1 4 3 2 ell 2 4 2 2 bestselling 2 bestseller 38 1 4 3 2 w 2 4 2 2 bestowal 2 bestow 38 1 4 3 2 2 4 2 2 bestirring 2 bestir 38 1 4 3 2 2 r 4 1 2 bestial 38 1 4 3 2 2 ios 4 2 2 bestubble 2 best 38 1 4 3 2 2 4 2 2 Bessemer 2 Bessel 38 1 4 3 2 2 e 4 2 2 Bessie 2 Bess 38 1 4 3 2 2 4 2 2 bespectacled 2 bespeak 38 1 4 3 2 2 e 4 1 2 bespoke 38 1 4 3 2 2 4 2 2 besiege 2 beside 38 1 4 3 2 2 t 4 1 2 beseech 38 1 4 3 2 2 4 2 2 besetting 2 beset 38 1 4 3 2 2 eipst 4 2 2 besotted 2 besmirch 38 1 4 3 2 l 2 4 2 2 beryllium 2 beryl 38 1 4 3 2 a 2 4 2 2 Bertrand 2 Bertram 38 1 4 3 2 2 4 2 2 Bertha 2 berth 38 1 4 3 2 2 hr 4 2 2 Bertie 2 Bert 38 1 4 3 2 2 4 2 2 berry 2 Berra 38 1 4 3 2 2 4 2 2 Berniece 2 Bernie 38 1 4 3 2 2 e 4 2 2 Bernini 2 Bernice 38 1 4 3 2 2 4 2 2 Bernet 2 berne 38 1 4 3 2 d 2 4 3 2 Bernardo 2 Bernardino 2 Bernard 38 1 4 3 2 2 r 4 1 2 Bernadine 38 1 4 3 2 2 aei 4 4 2 Bernstein 2 Bernoulli 2 Bernhard 2 Bern 38 1 4 3 2 2 4 2 2 Bermuda 2 Berman 38 1 4 3 2 i 2 4 3 2 Berlitz 2 Berlioz 2 Berlin 38 1 4 3 2 l 2 4 2 2 berkelium 2 Berkeley 38 1 4 3 2 2 e 4 2 2 Berkshire 2 Berkowitz 38 1 4 3 2 b 2 4 2 2 beriberi 2 beribbon 38 1 4 3 2 2 4 2 2 Bergstrom 2 Bergson 38 1 4 3 2 2 4 2 2 Berglund 2 Bergland 38 1 4 3 2 2 ls 4 4 2 Bergman 2 Bergen 2 bergamot 2 berg 38 1 4 3 2 2 4 2 2 bereave 2 Berea 38 1 4 3 2 2 a 4 4 2 beret 2 Berenices 2 bereft 2 Beresford 38 1 4 3 2 2 egiklmnrty 4 3 2 Berwick 2 berserk 2 berate 38 1 4 3 2 ue 2 4 2 2 bequest 2 bequeath 38 1 4 3 2 2 4 2 2 Beowulf 2 Beograd 38 1 4 3 2 2 4 2 2 benzene 2 Benzedrine 38 1 4 3 2 2 e 4 1 2 Benz 38 1 4 3 2 2 4 2 2 benthic 2 Bentham 38 1 4 3 2 2 h 4 3 2 Benton 2 Bentley 2 bent 38 1 4 3 2 2 4 3 2 Benny 2 Bennington 2 Bennett 38 1 4 3 2 g 2 4 2 2 benign 2 benight 38 1 4 3 2 al 2 4 2 2 Bengali 2 Bengal 38 1 4 3 2 2 ei 4 0 38 1 4 3 2 a 2 4 2 2 beneficiary 2 beneficial 38 1 4 3 2 2 4 2 2 beneficent 2 benefice 38 1 4 3 2 2 ct 4 0 38 1 4 3 2 2 i 4 1 2 benefactor 38 1 4 3 2 t 2 i 4 1 2 Benedict 38 1 4 3 2 2 4 2 2 benediction 2 Benedictine 38 1 4 3 2 i 2 c 4 1 2 Benedikt 38 1 4 3 2 2 df 4 3 2 benevolent 2 Benelux 2 beneath 38 1 4 3 2 2 4 2 2 Bendix 2 bend 38 1 4 3 2 h 2 4 2 2 benchmark 2 bench 38 1 4 3 2 2 cdegintz 4 3 2 Benson 2 Benjamin 2 Ben 38 1 4 3 2 2 4 3 2 beman 2 bemadden 2 BEMA 38 1 4 3 2 2 A 4 2 2 bemuse 2 bemoan 38 1 4 3 2 2 4 2 2 belvidere 2 belvedere 38 1 4 3 2 2 4 2 2 Beltsville 2 belt 38 1 4 3 2 2 n 4 3 2 below 2 belove 2 Beloit 38 1 4 3 2 2 4 3 2 bellyfull 2 bellyache 2 belly 38 1 4 3 2 2 4 2 2 bellmen 2 bellman 38 1 4 3 2 2 4 2 2 Bellini 2 Bellingham 38 1 4 3 2 2 n 4 2 2 belligerent 2 bellicose 38 1 4 3 2 2 4 4 2 Bellatrix 2 Bellamy 2 belladonna 2 Bella 38 1 4 3 2 2 aimy 4 8 2 bellwether 2 bellum 2 bellow 2 bellhop 2 bellflower 2 belle 2 bellboy 2 bell 38 1 4 3 2 2 v 4 2 2 belief 2 belie 38 1 4 3 2 2 e 4 1 2 belittle 38 1 4 3 2 2 4 2 2 Belgium 2 Belgian 38 1 4 3 2 2 i 4 1 2 Belgrade 38 1 4 3 2 2 4 2 2 belfry 2 Belfast 38 1 4 3 2 2 4 2 2 belate 2 Bela 38 1 4 3 2 2 afgilotv 4 5 2 belying 2 Belshazzar 2 Belmont 2 belch 2 bel 38 1 4 3 2 2 4 4 2 Beirut 2 being 2 beige 2 Beijing 38 1 4 3 2 2 4 2 2 beheld 2 behead 38 1 4 3 2 2 v 4 1 2 behalf 38 1 4 3 2 2 ie 4 0 38 1 4 3 2 2 ae 4 2 2 behold 2 behind 38 1 4 3 2 2 4 2 2 begun 2 beguile 38 1 4 3 2 2 4 2 2 begotten 2 begonia 38 1 4 3 2 2 4 2 2 beginning 2 beginner 38 1 4 3 2 n 2 n 4 1 2 begin 38 1 4 3 2 r 2 4 2 2 beggary 2 beggar 38 1 4 3 2 2 a 4 1 2 begging 38 1 4 3 2 t 2 4 2 2 begetting 2 beget 38 1 4 3 2 2 egiou 4 3 2 begrudge 2 began 2 beg 38 1 4 3 2 e 2 4 2 2 beforehand 2 before 38 1 4 3 2 2 4 2 2 befogging 2 befog 38 1 4 3 2 2 gr 4 1 2 befoul 38 1 4 3 2 t 2 4 2 2 befitting 2 befit 38 1 4 3 2 ll 2 4 2 2 befallen 2 befall 38 1 4 3 2 2 aio 4 2 2 befuddle 2 befell 38 1 4 3 2 2 4 3 2 beetle 2 Beethoven 2 beet 38 1 4 3 2 2 4 3 2 beefy 2 beefsteak 2 beef 38 1 4 3 2 h 2 4 3 2 beechwood 2 Beecham 2 beech 38 1 4 3 2 2 4 2 2 beebread 2 Beebe 38 1 4 3 2 2 bcft 4 5 2 beer 2 beep 2 been 2 beehive 2 bee 38 1 4 3 2 r 2 4 2 2 bedspring 2 bedspread 38 1 4 3 2 2 p 4 2 2 bedstraw 2 bedside 38 1 4 3 2 2 4 2 2 bedroom 2 bedrock 38 1 4 3 2 2 o 4 2 2 bedridden 2 bedraggle 38 1 4 3 2 2 4 2 2 bedimming 2 bedimmed 38 1 4 3 2 m 2 m 4 1 2 bedim 38 1 4 3 2 2 4 2 2 Bedford 2 bedfast 38 1 4 3 2 2 firs 4 6 2 bedtime 2 bedpost 2 bedlam 2 bedbug 2 bedazzle 2 bed 38 1 4 3 2 2 4 5 2 Becky 2 beckon 2 Beckman 2 becket 2 beck 38 1 4 3 2 2 4 3 2 because 2 became 2 becalm 38 1 4 3 2 2 ak 4 2 2 become 2 Bechtel 38 1 4 3 2 f 2 4 2 2 beautify 2 beautiful 38 1 4 3 2 2 i 4 2 2 beauty 2 beauteous 38 1 4 3 2 2 t 4 5 2 beaux 2 Beauregard 2 Beaumont 2 Beaujolais 2 beau 38 1 4 3 2 2 4 2 2 beatify 2 beatific 38 1 4 3 2 2 f 4 1 2 beatitude 38 1 4 3 2 2 4 2 2 beater 2 beaten 38 1 4 3 2 2 ei 4 3 2 Beatrice 2 beatnik 2 beat 38 1 4 3 2 t 2 4 2 2 beastie 2 beast 38 1 4 3 2 2 4 2 2 Beardsley 2 beard 38 1 4 3 2 2 d 4 3 2 bearish 2 bearberry 2 bear 38 1 4 3 2 2 4 3 2 beady 2 beadle 2 bead 38 1 4 3 2 2 h 4 1 2 beacon 38 1 4 3 2 2 4 2 2 beachhead 2 beach 38 1 4 3 2 2 cdrstu 4 4 2 beaver 2 bean 2 beam 2 beak 38 1 4 3 2 2 acdefghilmnoqrstvwy 4 4 2 bezel 2 beplaster 2 bebop 2 be 38 1 4 3 2 2 4 2 2 Bayonne 2 bayonet 38 1 4 3 2 2 n 4 1 2 bayou 38 1 4 3 2 2 o 4 7 2 Bayreuth 2 Bayport 2 Baylor 2 Bayesian 2 Bayda 2 bayberry 2 bay 38 1 4 3 2 2 4 2 2 bawdy 2 bawd 38 1 4 3 2 2 d 4 1 2 bawl 38 1 4 3 2 2 4 2 2 Baudelaire 2 baud 38 1 4 3 2 2 d 4 5 2 bauxite 2 Bausch 2 Bauhaus 2 Bauer 2 bauble 38 1 4 3 2 2 4 2 2 battlefront 2 battlefield 38 1 4 3 2 e 2 f 4 2 2 battleground 2 battle 38 1 4 3 2 2 4 3 2 battery 2 batten 2 Battelle 38 1 4 3 2 2 el 4 2 2 battalion 2 batt 38 1 4 3 2 2 4 2 2 Bator 2 baton 38 1 4 3 2 o 2 4 2 2 bathroom 2 bathrobe 38 1 4 3 2 2 r 4 5 2 Bathurst 2 bathtub 2 bathos 2 bathe 2 bath 38 1 4 3 2 2 4 4 2 bater 2 Bateman 2 bateau 2 bate 38 1 4 3 2 h 2 4 2 2 Batchelder 2 batch 38 1 4 3 2 2 cehot 4 4 2 batwing 2 batik 2 Batavia 2 bat 38 1 4 3 2 2 4 3 2 bastion 2 baste 2 bastard 38 1 4 3 2 2 4 2 2 bassinet 2 bassi 38 1 4 3 2 2 i 4 4 2 basswood 2 basso 2 Bassett 2 bass 38 1 4 3 2 t 2 4 2 2 basketball 2 basket 38 1 4 3 2 2 e 4 1 2 bask 38 1 4 3 2 2 4 3 2 basilisk 2 basilar 2 basil 38 1 4 3 2 2 lc 4 3 2 basis 2 basin 2 basidiomycetes 38 1 4 3 2 2 4 3 2 bashful 2 bashaw 2 bash 38 1 4 3 2 2 4 2 2 basepoint 2 baseplate 38 1 4 3 2 2 4 2 2 basemen 2 baseman 38 1 4 3 2 2 4 2 2 baseline 2 Basel 38 1 4 3 2 2 4 2 2 baseband 2 baseball 38 1 4 3 2 2 a 4 1 2 baseboard 38 1 4 3 2 2 blmp 4 2 2 based 2 base 38 1 4 3 2 l 2 4 2 2 basalt 2 basal 38 1 4 3 2 2 aehikst 4 1 2 basophilic 38 1 4 3 2 2 4 2 2 Barton 2 Bartok 38 1 4 3 2 2 4 2 2 Bartholomew 2 Barth 38 1 4 3 2 2 n 4 1 2 barter 38 1 4 3 2 d 2 4 2 2 bartender 2 bartend 38 1 4 3 2 2 eho 4 1 2 Bartlett 38 1 4 3 2 2 4 2 2 Barrymore 2 Barry 38 1 4 3 2 2 4 3 2 Barrington 2 barrier 2 barricade 38 1 4 3 2 t 2 4 2 2 barrette 2 Barrett 38 1 4 3 2 2 t 4 3 2 barren 2 barrel 2 barre 38 1 4 3 2 2 4 2 2 barracuda 2 barrack 38 1 4 3 2 2 c 4 1 2 barrage 38 1 4 3 2 2 aeiy 4 2 2 barrow 2 Barr 38 1 4 3 2 2 4 2 2 baronet 2 baroness 38 1 4 3 2 2 e 4 3 2 barony 2 baronial 2 baron 38 1 4 3 2 2 n 4 2 2 baroque 2 barometer 38 1 4 3 2 2 4 2 2 Barnett 2 Barnet 38 1 4 3 2 2 t 4 2 2 Barney 2 Barnes 38 1 4 3 2 2 4 3 2 Barnard 2 barnacle 2 Barnabas 38 1 4 3 2 2 ae 4 4 2 barnyard 2 barnstorm 2 Barnhard 2 barn 38 1 4 3 2 2 4 2 2 Barlow 2 barley 38 1 4 3 2 2 4 2 2 barkeep 2 bark 38 1 4 3 2 2 4 2 2 barium 2 baritone 38 1 4 3 2 2 4 2 2 barge 2 bargain 38 1 4 3 2 2 4 2 2 barefoot 2 barefaced 38 1 4 3 2 2 f 4 1 2 bare 38 1 4 3 2 2 4 2 2 Barclay 2 Barcelona 38 1 4 3 2 t 2 4 2 2 barbiturate 2 barbital 38 1 4 3 2 2 4 2 2 barberry 2 barber 38 1 4 3 2 2 r 4 2 2 barbell 2 barbecue 38 1 4 3 2 2 4 3 2 barbarism 2 barbaric 2 barbarian 38 1 4 3 2 2 i 4 2 2 barbarous 2 Barbara 38 1 4 3 2 2 r 4 1 2 Barbados 38 1 4 3 2 2 aei 4 3 2 barbudo 2 Barbour 2 barb 38 1 4 3 2 2 bcegiklnort 4 5 2 barycentric 2 Barstow 2 barfly 2 bard 2 bar 38 1 4 3 2 2 4 2 2 baptistery 2 Baptiste 38 1 4 3 2 2 e 4 1 2 Baptist 38 1 4 3 2 2 4 2 2 baptismal 2 baptism 38 1 4 3 2 tis 2 mt 4 0 38 1 4 3 2 2 4 2 2 Bantus 2 Bantu 38 1 4 3 2 2 u 4 2 2 banter 2 bantam 38 1 4 3 2 upt 2 4 2 2 bankruptcy 2 bankrupt 38 1 4 3 2 2 r 4 2 2 banks 2 bank 38 1 4 3 2 s 2 4 2 2 banister 2 banish 38 1 4 3 2 2 4 2 2 bangle 2 Bangladesh 38 1 4 3 2 2 l 4 4 2 Bangui 2 Bangor 2 bangkok 2 bang 38 1 4 3 2 2 4 3 2 baneful 2 baneberry 2 bane 38 1 4 3 2 2 4 2 2 bandwidth 2 bandwagon 38 1 4 3 2 t 2 4 2 2 bandstop 2 bandstand 38 1 4 3 2 2 sw 4 6 2 bandy 2 bandpass 2 bandit 2 bandgap 2 bandage 2 band 38 1 4 3 2 2 4 3 2 banana 2 banal 2 Banach 38 1 4 3 2 2 adegikt 4 5 2 banshee 2 banquet 2 banjo 2 Banbury 2 ban 38 1 4 3 2 2 4 3 2 bamboo 2 Bambi 2 Bamberger 38 1 4 3 2 2 b 4 2 2 Bamako 2 bam 38 1 4 3 2 ore 2 4 2 2 Baltimorean 2 Baltimore 38 1 4 3 2 i 2 m 4 1 2 Baltic 38 1 4 3 2 a 2 4 2 2 balsam 2 balsa 38 1 4 3 2 2 4 2 2 balmy 2 balm 38 1 4 3 2 2 4 2 2 ballot 2 balloon 38 1 4 3 2 2 4 2 2 balletomane 2 ballet 38 1 4 3 2 2 t 4 1 2 ballerina 38 1 4 3 2 2 4 3 2 ballast 2 Ballard 2 ballad 38 1 4 3 2 2 aeo 4 4 2 ballyhoo 2 ballroom 2 ballfield 2 ball 38 1 4 3 2 2 4 3 2 balky 2 Balkan 2 balk 38 1 4 3 2 2 4 2 2 Balinese 2 Bali 38 1 4 3 2 2 4 3 2 baleful 2 baleen 2 bale 38 1 4 3 2 2 4 4 2 baldy 2 Baldwin 2 baldpate 2 bald 38 1 4 3 2 2 deiklmst 4 6 2 Balzac 2 balustrade 2 Balfour 2 balcony 2 Balboa 2 balance 38 1 4 3 2 2 r 4 2 2 Bakelite 2 bake 38 1 4 3 2 2 4 2 2 bakery 2 Bakersfield 38 1 4 3 2 2 e 4 3 2 Baku 2 baklava 2 Bakhtiari 38 1 4 3 2 2 4 3 2 bailiff 2 Bailey 2 bail 38 1 4 3 2 2 l 4 3 2 bait 2 Baird 2 bainite 38 1 4 3 2 2 4 3 2 Bahrein 2 Bahama 2 bah 38 1 4 3 2 2 4 3 2 baggy 2 bagging 2 baggage 38 1 4 3 2 2 g 4 5 2 bagpipe 2 Bagley 2 Baghdad 2 bagatelle 2 bag 38 1 4 3 2 f 2 4 2 2 baffle 2 Baffin 38 1 4 3 2 2 4 2 2 Baden 2 bade 38 1 4 3 2 2 e 4 5 2 badminton 2 badland 2 badinage 2 badge 2 bad 38 1 4 3 2 2 4 2 2 bacterial 2 bacteria 38 1 4 3 2 eri 2 a 4 1 2 bacterium 38 1 4 3 2 2 r 4 1 2 backwater 38 1 4 3 2 2 a 4 1 2 backwood 38 1 4 3 2 2 4 3 2 backstop 2 backstitch 2 backstage 38 1 4 3 2 2 t 4 2 2 backspace 2 backside 38 1 4 3 2 a 2 4 2 2 backplate 2 backplane 38 1 4 3 2 2 l 4 1 2 backpack 38 1 4 3 2 2 4 2 2 backlog 2 backlash 38 1 4 3 2 o 2 4 2 2 backbone 2 backboard 38 1 4 3 2 2 blpsw 4 9 2 backyard 2 backup 2 backtrack 2 backorder 2 backhand 2 background 2 backfill 2 backdrop 2 back 38 1 4 3 2 ll 2 4 2 2 bacillus 2 bacilli 38 1 4 3 2 2 4 2 2 bachelor 2 Bach 38 1 4 3 2 2 a 4 1 2 Bacchus 38 1 4 3 2 2 4 2 2 baccarat 2 baccalaureate 38 1 4 3 2 2 chikt 4 1 2 bacon 38 1 4 3 2 2 bey 4 2 2 baboon 2 Babcock 38 1 4 3 2 t 2 4 2 2 babysitting 2 babysit 38 1 4 3 2 2 i 4 1 2 babysat 38 1 4 3 2 2 s 4 2 2 Babylon 2 baby 38 1 4 3 2 2 4 2 2 Babel 2 babe 38 1 4 3 2 2 4 2 2 babble 2 babbitt 38 1 4 3 2 2 bcdfghiklmnprstuwy 4 3 2 bazaar 2 Baxter 2 Bavaria 38 1 4 3 2 2 aehiloruy 4 6 2 BTL 2 BSTJ 2 b's 2 BP 2 BMW 2 b 38 1 4 3 2 ec 2 4 2 2 Aztecan 2 Aztec 38 1 4 3 2 muth 2 4 2 2 azimuthal 2 azimuth 38 1 4 3 2 2 it 4 4 2 azure 2 Azerbaijan 2 azalea 2 AZ 38 1 4 3 2 2 4 2 2 Ayers 2 aye 38 1 4 3 2 2 e 4 1 2 Aylesbury 38 1 4 3 2 2 4 2 2 axon 2 axolotl 38 1 4 3 2 2 4 2 2 axisymmetric 2 axis 38 1 4 3 2 2 4 2 2 axiomatic 2 axiom 38 1 4 3 2 2 m 4 1 2 axiology 38 1 4 3 2 2 os 4 1 2 axial 38 1 4 3 2 2 io 4 3 2 axle 2 axe 2 ax 38 1 4 3 2 2 4 2 2 awesome 2 awe 38 1 4 3 2 2 kr 4 3 2 away 2 awash 2 await 38 1 4 3 2 2 4 2 2 aware 2 award 38 1 4 3 2 e 2 4 2 2 awaken 2 awake 38 1 4 3 2 2 ae 4 7 2 awry 2 awoke 2 awn 2 awl 2 awkward 2 awhile 2 awful 38 1 4 3 2 d 2 4 2 2 avoidance 2 avoid 38 1 4 3 2 2 a 4 1 2 avocet 38 1 4 3 2 2 4 2 2 avocate 2 avocado 38 1 4 3 2 2 ci 4 3 2 avow 2 Avon 2 Avogadro 38 1 4 3 2 2 t 4 1 2 aviary 38 1 4 3 2 2 4 2 2 aviatrix 2 aviate 38 1 4 3 2 2 a 4 4 2 Aviv 2 Avis 2 avionic 2 avid 38 1 4 3 2 2 4 2 2 aversion 2 averse 38 1 4 3 2 2 4 2 2 averring 2 averred 38 1 4 3 2 2 rsa 4 3 2 Avery 2 avert 2 aver 38 1 4 3 2 2 4 3 2 avenue 2 Aventine 2 avenge 38 1 4 3 2 2 nr 4 2 2 Avesta 2 Ave 38 1 4 3 2 2 ri 4 1 2 avalanche 38 1 4 3 2 ic 2 4 2 2 avaricious 2 avarice 38 1 4 3 2 2 aeio 4 0 38 1 4 3 2 mn 2 4 2 2 autumnal 2 autumn 38 1 4 3 2 om 2 4 3 2 autonomy 2 autonomous 2 autonomic 38 1 4 3 2 2 4 3 2 automotive 2 automorphism 2 automobile 38 1 4 3 2 t 2 i 4 4 2 automaton 2 automate 2 automata 2 automat 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 autocratic 2 autocrat 38 1 4 3 2 a 2 t 4 1 2 autocracy 38 1 4 3 2 2 4 2 2 autocorrelate 2 autocollimate 38 1 4 3 2 2 or 4 1 2 autoclave 38 1 4 3 2 2 cmn 4 6 2 autotransformer 2 autosuggestible 2 autopsy 2 autograph 2 autobiography 2 auto 38 1 4 3 2 s 2 4 2 2 autistic 2 autism 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 ta 2 4 2 2 authoritative 2 authoritarian 38 1 4 3 2 r 2 i 4 1 2 author 38 1 4 3 2 ntic 2 4 2 2 authenticate 2 authentic 38 1 4 3 2 2 hiou 4 0 38 1 4 3 2 li 2 4 3 2 australite 2 Australis 2 Australia 38 1 4 3 2 2 a 4 1 2 Austria 38 1 4 3 2 2 4 2 2 austere 2 austenite 38 1 4 3 2 2 er 4 1 2 Austin 38 1 4 3 2 ic 2 4 2 2 auspicious 2 auspices 38 1 4 3 2 2 pt 4 1 2 Auschwitz 38 1 4 3 2 2 4 2 2 aurora 2 aurochs 38 1 4 3 2 2 4 2 2 Auriga 2 auric 38 1 4 3 2 2 4 2 2 aureomycin 2 Aurelius 38 1 4 3 2 2 4 2 2 aural 2 aura 38 1 4 3 2 2 aeio 4 0 38 1 4 3 2 t 2 4 2 2 auntie 2 aunt 38 1 4 3 2 t 2 4 4 2 Augustus 2 Augustine 2 Augusta 2 august 38 1 4 3 2 2 s 4 1 2 augur 38 1 4 3 2 ent 2 4 2 2 augmentation 2 augment 38 1 4 3 2 2 4 2 2 auger 2 Augean 38 1 4 3 2 2 emu 4 2 2 augite 2 Aug 38 1 4 3 2 r 2 4 3 2 auditory 2 auditorium 2 auditor 38 1 4 3 2 2 o 4 2 2 audition 2 audit 38 1 4 3 2 2 4 3 2 audiovisual 2 audiotape 2 audio 38 1 4 3 2 2 ot 4 2 2 audience 2 audible 38 1 4 3 2 ci 2 4 2 2 audacity 2 audacious 38 1 4 3 2 2 ai 4 2 2 Audubon 2 Audrey 38 1 4 3 2 ion 2 4 2 2 auctioneer 2 auction 38 1 4 3 2 2 t 4 1 2 Auckland 38 1 4 3 2 2 4 3 2 auburn 2 Aubrey 2 Auberge 38 1 4 3 2 2 bcdgnrst 4 3 2 auxiliary 2 auk 2 Auerbach 38 1 4 3 2 2 4 2 2 Atwood 2 Atwater 38 1 4 3 2 ut 2 i 4 1 2 attribute 38 1 4 3 2 2 4 2 2 attributive 2 attribution 38 1 4 3 2 2 b 4 1 2 attrition 38 1 4 3 2 2 i 4 1 2 attract 38 1 4 3 2 2 4 2 2 Attica 2 attic 38 1 4 3 2 2 c 4 2 2 attitude 2 attire 38 1 4 3 2 t 2 4 2 2 attestation 2 attest 38 1 4 3 2 i 2 4 2 2 attentive 2 attention 38 1 4 3 2 2 4 3 2 attendee 2 attendant 2 attend 38 1 4 3 2 2 dt 4 1 2 attenuate 38 1 4 3 2 2 ns 4 1 2 attempt 38 1 4 3 2 2 ci 4 0 38 1 4 3 2 n 2 4 2 2 attainder 2 attain 38 1 4 3 2 2 h 4 1 2 attack 38 1 4 3 2 2 4 2 2 attache 2 attach 38 1 4 3 2 2 aeir 4 2 2 attune 2 attorney 38 1 4 3 2 2 4 2 2 atrophy 2 atrophic 38 1 4 3 2 2 h 4 1 2 Atropos 38 1 4 3 2 i 2 4 2 2 atrocity 2 atrocious 38 1 4 3 2 2 cp 4 0 38 1 4 3 2 2 o 4 1 2 Atreus 38 1 4 3 2 2 4 2 2 atone 2 atonal 38 1 4 3 2 2 4 2 2 atomic 2 atom 38 1 4 3 2 2 mn 4 1 2 atop 38 1 4 3 2 ospher 2 4 2 2 atmospheric 2 atmosphere 38 1 4 3 2 t 2 i 4 2 2 atlantes 2 Atlanta 38 1 4 3 2 2 4 2 2 Atlantica 2 atlantic 38 1 4 3 2 2 c 4 1 2 Atlantis 38 1 4 3 2 a 2 n 4 1 2 atlas 38 1 4 3 2 ins 2 4 2 2 Atkinson 2 Atkins 38 1 4 3 2 et 2 4 2 2 athletic 2 athlete 38 1 4 3 2 2 4 3 2 Athens 2 Athenian 2 Athena 38 1 4 3 2 s 2 4 2 2 atheist 2 atheism 38 1 4 3 2 2 in 4 0 38 1 4 3 2 2 el 4 2 2 athwart 2 Athabascan 38 1 4 3 2 is 2 4 2 2 atavistic 2 atavism 38 1 4 3 2 2 v 4 1 2 Atalanta 38 1 4 3 2 2 ahklmortw 4 5 2 atypic 2 AT&T 2 ate 2 Atchison 2 at 38 1 4 3 2 chron 2 4 2 2 asynchrony 2 asynchronous 38 1 4 3 2 tot 2 4 2 2 asymptotic 2 asymptote 38 1 4 3 2 2 p 4 1 2 asymmetry 38 1 4 3 2 2 mn 4 1 2 asylum 38 1 4 3 2 n 2 4 2 2 asunder 2 Asuncion 38 1 4 3 2 hysic 2 4 2 2 astrophysics 2 astrophysical 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 m 2 4 3 2 astronomy 2 astronomic 2 astronomer 38 1 4 3 2 ut 2 4 2 2 astronautic 2 astronaut 38 1 4 3 2 2 np 4 0 38 1 4 3 2 2 4 2 2 astringent 2 astride 38 1 4 3 2 2 4 3 2 astray 2 astral 2 astraddle 38 1 4 3 2 2 aio 4 0 38 1 4 3 2 2 4 2 2 Astoria 2 Astor 38 1 4 3 2 2 r 4 2 2 astound 2 astonish 38 1 4 3 2 gmat 2 4 2 2 astigmatic 2 astigmat 38 1 4 3 2 id 2 4 2 2 asteroidal 2 asteroid 38 1 4 3 2 2 4 2 2 asterisk 2 asteria 38 1 4 3 2 r 2 io 4 2 2 astern 2 aster 38 1 4 3 2 2 4 2 2 astatine 2 Astarte 38 1 4 3 2 2 aeior 4 3 2 astute 2 ASTM 2 asthma 38 1 4 3 2 ri 2 4 2 2 Assyriology 2 Assyria 38 1 4 3 2 2 4 2 2 assure 2 assurance 38 1 4 3 2 2 4 2 2 assumption 2 assume 38 1 4 3 2 2 mr 4 1 2 assuage 38 1 4 3 2 ia 2 t 4 1 2 associable 38 1 4 3 2 2 c 4 2 2 assort 2 assonant 38 1 4 3 2 t 2 4 2 2 assistant 2 assist 38 1 4 3 2 ila 2 4 2 2 Assimilate 2 assimilable 38 1 4 3 2 n 2 4 4 2 assigning 2 assignee 2 assignation 2 assign 38 1 4 3 2 u 2 4 2 2 assiduous 2 assiduity 38 1 4 3 2 2 dgms 4 0 38 1 4 3 2 s 2 4 2 2 assessor 2 assess 38 1 4 3 2 bl 2 4 2 2 assemble 2 assemblage 38 1 4 3 2 2 ms 4 3 2 asset 2 assert 2 assent 38 1 4 3 2 sin 2 4 2 2 assassinate 2 assassin 38 1 4 3 2 2 l 4 1 2 assai 38 1 4 3 2 2 4 2 2 assailant 2 assail 38 1 4 3 2 2 is 4 3 2 assay 2 assault 2 Assam 38 1 4 3 2 2 aeiouy 4 1 2 ass 38 1 4 3 2 2 4 2 2 aspirate 2 aspirant 38 1 4 3 2 2 a 4 2 2 aspirin 2 aspire 38 1 4 3 2 2 r 4 1 2 aspidistra 38 1 4 3 2 2 4 3 2 asphyxiate 2 aspheric 2 asphalt 38 1 4 3 2 2 4 2 2 aspersion 2 asperity 38 1 4 3 2 2 r 4 2 2 aspen 2 aspect 38 1 4 3 2 r 2 a 4 1 2 aspartic 38 1 4 3 2 g 2 4 2 2 asparagus 2 asparagine 38 1 4 3 2 2 aehi 4 1 2 asplenium 38 1 4 3 2 2 e 4 3 2 asking 2 askance 2 ask 38 1 4 3 2 2 4 2 2 Asiatic 2 Asia 38 1 4 3 2 2 a 4 3 2 asinine 2 Asilomar 2 aside 38 1 4 3 2 2 4 3 2 Ashmolean 2 ashmen 2 ashman 38 1 4 3 2 2 4 2 2 Ashley 2 Ashland 38 1 4 3 2 2 4 3 2 Asheville 2 Asher 2 ashen 38 1 4 3 2 2 elm 4 5 2 ashy 2 ashtray 2 ashore 2 ashame 2 ash 38 1 4 3 2 i 2 4 2 2 ascription 2 ascribe 38 1 4 3 2 2 n 4 2 2 ascetic 2 ascertain 38 1 4 3 2 2 d 4 2 2 ascent 2 ascension 38 1 4 3 2 2 4 2 2 ascendant 2 ascend 38 1 4 3 2 2 er 4 2 2 ASCII 2 ascomycetes 38 1 4 3 2 2 chikpstuy 4 5 2 asocial 2 asleep 2 aseptic 2 asbestos 2 as 38 1 4 3 2 2 4 2 2 arum 2 Aruba 38 1 4 3 2 2 4 2 2 artistry 2 artisan 38 1 4 3 2 c 2 e 4 1 2 artificial 38 1 4 3 2 2 i 4 1 2 artifact 38 1 4 3 2 2 u 4 2 2 article 2 artichoke 38 1 4 3 2 lat 2 4 2 2 articulatory 2 articulate 38 1 4 3 2 2 cfs 4 2 2 artillery 2 Artie 38 1 4 3 2 2 4 2 2 Arthur 2 arthritis 38 1 4 3 2 2 o 4 1 2 arterial 38 1 4 3 2 2 4 2 2 arteriolosclerosis 2 arteriole 38 1 4 3 2 2 l 4 1 2 arteriosclerosis 38 1 4 3 2 2 i 4 1 2 artery 38 1 4 3 2 is 2 4 2 2 artemisia 2 Artemis 38 1 4 3 2 2 mr 4 0 38 1 4 3 2 2 ehi 4 5 2 arty 2 artwork 2 Arturo 2 artful 2 art 38 1 4 3 2 n 2 ai 4 0 38 1 4 3 2 2 4 2 2 arsenide 2 arsenic 38 1 4 3 2 2 4 2 2 arsenate 2 arsenal 38 1 4 3 2 2 e 4 2 2 arson 2 arsine 38 1 4 3 2 2 4 3 2 arrowroot 2 arrowhead 2 arrow 38 1 4 3 2 a 2 4 2 2 arrogate 2 arrogant 38 1 4 3 2 2 gw 4 1 2 arroyo 38 1 4 3 2 v 2 4 2 2 arrive 2 arrival 38 1 4 3 2 2 4 2 2 arrest 2 arrear 38 1 4 3 2 2 n 4 4 2 array 2 arraign 2 Arragon 2 arrack 38 1 4 3 2 ge 2 4 2 2 arrangeable 2 arrange 38 1 4 3 2 2 aeio 4 1 2 Arrhenius 38 1 4 3 2 2 4 2 2 arpeggio 2 ARPA 38 1 4 3 2 2 4 2 2 arouse 2 arousal 38 1 4 3 2 2 s 4 1 2 around 38 1 4 3 2 a 2 4 2 2 aromatic 2 aroma 38 1 4 3 2 2 mu 4 1 2 arose 38 1 4 3 2 2 4 3 2 Armour 2 Armonk 2 armoire 38 1 4 3 2 2 4 2 2 armistice 2 armillaria 38 1 4 3 2 2 4 2 2 Armco 2 armchair 38 1 4 3 2 2 4 2 2 armature 2 Armata 38 1 4 3 2 2 4 2 2 armadillo 2 armada 38 1 4 3 2 2 dt 4 2 2 armament 2 Armageddon 38 1 4 3 2 2 acios 4 7 2 army 2 armpit 2 armload 2 armhole 2 armful 2 Armenia 2 arm 38 1 4 3 2 n 2 4 2 2 Arlene 2 Arlen 38 1 4 3 2 2 e 4 1 2 Arlington 38 1 4 3 2 nsa 2 4 2 2 Arkansas 2 Arkansan 38 1 4 3 2 2 a 4 1 2 ark 38 1 4 3 2 l 2 4 2 2 Aristotelian 2 Aristotelean 38 1 4 3 2 2 e 4 1 2 Aristotle 38 1 4 3 2 ra 2 t 4 1 2 aristocracy 38 1 4 3 2 2 4 2 2 aristocratic 2 aristocrat 38 1 4 3 2 o 2 ct 4 0 38 1 4 3 2 2 4 2 2 arisen 2 arise 38 1 4 3 2 2 et 4 0 38 1 4 3 2 2 4 2 2 Arianism 2 Ariadne 38 1 4 3 2 2 as 4 4 2 Arizona 2 arithmetic 2 Aries 2 arid 38 1 4 3 2 ti 2 4 2 2 argumentative 2 argumentation 38 1 4 3 2 ent 2 a 4 1 2 argument 38 1 4 3 2 2 m 4 2 2 Argus 2 argue 38 1 4 3 2 2 4 3 2 Argonne 2 Argonaut 2 argon 38 1 4 3 2 2 n 4 2 2 argot 2 argo 38 1 4 3 2 2 4 3 2 Argive 2 arginine 2 argillaceous 38 1 4 3 2 2 iou 4 1 2 Argentina 38 1 4 3 2 2 4 2 2 arenaceous 2 arena 38 1 4 3 2 2 a 4 1 2 aren't 38 1 4 3 2 2 4 2 2 areawide 2 areaway 38 1 4 3 2 2 w 4 1 2 area 38 1 4 3 2 2 an 4 3 2 Ares 2 Arequipa 2 are 38 1 4 3 2 n 2 4 2 2 ardent 2 Arden 38 1 4 3 2 2 e 4 1 2 arduous 38 1 4 3 2 n 2 4 2 2 arctangent 2 arctan 38 1 4 3 2 2 a 4 2 2 Arcturus 2 arctic 38 1 4 3 2 in 2 4 2 2 arcsine 2 arcsin 38 1 4 3 2 2 4 2 2 archive 2 archival 38 1 4 3 2 r 2 4 2 2 architecture 2 architectural 38 1 4 3 2 ect 2 u 4 2 2 architectonic 2 architect 38 1 4 3 2 2 tv 4 3 2 archipelago 2 Archimedes 2 Archibald 38 1 4 3 2 yp 2 4 2 2 archetypical 2 archetype 38 1 4 3 2 2 t 4 2 2 archery 2 archenemy 38 1 4 3 2 2 4 2 2 archaism 2 archaic 38 1 4 3 2 2 i 4 2 2 archangel 2 archae 38 1 4 3 2 2 aei 4 4 2 archfool 2 archdiocese 2 archbishop 2 arch 38 1 4 3 2 os 2 4 2 2 arccosine 2 arccos 38 1 4 3 2 2 4 2 2 arcane 2 arcana 38 1 4 3 2 2 4 2 2 Arcadia 2 arcade 38 1 4 3 2 2 dn 4 0 38 1 4 3 2 2 achst 4 3 2 arclength 2 arcing 2 arc 38 1 4 3 2 re 2 4 2 2 arboretum 2 arboreal 38 1 4 3 2 t 2 r 4 1 2 arbiter 38 1 4 3 2 a 2 4 3 2 arbitrate 2 arbitrary 2 arbitrage 38 1 4 3 2 2 io 4 1 2 arbutus 38 1 4 3 2 hn 2 4 2 2 arachnid 2 Arachne 38 1 4 3 2 2 i 4 3 2 Araby 2 arabesque 2 Arab 38 1 4 3 2 2 4 2 2 Arabic 2 Arabia 38 1 4 3 2 2 bc 4 0 38 1 4 3 2 2 abcdegiklmoprstu 4 4 2 aryl 2 Arnold 2 arhat 2 AR 38 1 4 3 2 2 4 2 2 Aquinas 2 Aquila 38 1 4 3 2 2 4 2 2 aqueous 2 aqueduct 38 1 4 3 2 2 r 4 2 2 aquatic 2 aqua 38 1 4 3 2 iu 2 4 2 2 Aquarius 2 aquarium 38 1 4 3 2 u 2 aei 4 0 38 1 4 3 2 2 4 2 2 aptitude 2 apt 38 1 4 3 2 2 4 2 2 apropos 2 apron 38 1 4 3 2 2 4 2 2 April 2 apricot 38 1 4 3 2 2 io 4 0 38 1 4 3 2 ima 2 4 3 2 approximate 2 approximant 2 approximable 38 1 4 3 2 2 4 2 2 approve 2 approval 38 1 4 3 2 ria 2 4 2 2 appropriate 2 appropriable 38 1 4 3 2 2 pvx 4 2 2 approbation 2 approach 38 1 4 3 2 i 2 4 2 2 apprehensive 2 apprehension 38 1 4 3 2 en 2 s 4 1 2 apprehend 38 1 4 3 2 ia 2 4 2 2 appreciate 2 appreciable 38 1 4 3 2 2 ch 4 1 2 apprentice 38 1 4 3 2 is 2 4 2 2 appraise 2 appraisal 38 1 4 3 2 2 aeo 4 1 2 apprise 38 1 4 3 2 it 2 4 2 2 apposition 2 apposite 38 1 4 3 2 nt 2 e 4 1 2 appoint 38 1 4 3 2 2 4 2 2 appointee 2 appointe 38 1 4 3 2 2 is 4 1 2 apport 38 1 4 3 2 a 2 t 4 2 2 applicant 2 applicable 38 1 4 3 2 2 c 4 2 2 applique 2 appliance 38 1 4 3 2 2 4 4 2 Appleton 2 applejack 2 Appleby 2 apple 38 1 4 3 2 u 2 4 2 2 applause 2 applaud 38 1 4 3 2 2 aei 4 1 2 apply 38 1 4 3 2 2 4 2 2 appendix 2 appendices 38 1 4 3 2 d 2 i 4 2 2 appendage 2 append 38 1 4 3 2 la 2 4 2 2 appellate 2 appellant 38 1 4 3 2 2 rs 4 1 2 appeal 38 1 4 3 2 2 4 2 2 appease 2 appeasable 38 1 4 3 2 2 4 2 2 appearance 2 appear 38 1 4 3 2 2 aln 4 2 2 appetite 2 appertain 38 1 4 3 2 2 lr 4 1 2 appanage 38 1 4 3 2 2 4 2 2 apparent 2 apparel 38 1 4 3 2 2 e 4 2 2 apparition 2 apparatus 38 1 4 3 2 2 4 2 2 appall 2 Appalachia 38 1 4 3 2 2 aelor 4 1 2 Appian 38 1 4 3 2 he 2 4 3 2 apotheosis 2 apothegm 2 apothecary 38 1 4 3 2 t 2 4 4 2 apostrophe 2 apostolic 2 apostle 2 apostate 38 1 4 3 2 g 2 4 3 2 apology 2 apologia 2 apologetic 38 1 4 3 2 o 2 4 2 2 Apollonian 2 Apollo 38 1 4 3 2 2 lo 4 0 38 1 4 3 2 2 ar 4 0 38 1 4 3 2 ypha 2 4 2 2 apocryphal 2 Apocrypha 38 1 4 3 2 lyp 2 4 2 2 apocalyptic 2 apocalypse 38 1 4 3 2 2 clst 4 1 2 apogee 38 1 4 3 2 2 4 2 2 apiece 2 apices 38 1 4 3 2 si 2 4 2 2 aphasic 2 aphasia 38 1 4 3 2 2 a 4 4 2 Aphrodite 2 aphorism 2 aphid 2 aphelion 38 1 4 3 2 2 4 2 2 aperture 2 aperiodic 38 1 4 3 2 2 r 4 2 2 apex 2 ape 38 1 4 3 2 2 rt 4 1 2 apache 38 1 4 3 2 2 4 2 2 apathy 2 apathetic 38 1 4 3 2 2 h 4 1 2 apatite 38 1 4 3 2 t 2 4 2 2 apartheid 2 apart 38 1 4 3 2 2 aehioprt 4 2 2 apse 2 aplomb 38 1 4 3 2 2 4 2 2 A&P 2 A&M 38 1 4 3 2 2 4 2 2 anywhere 2 anyway 38 1 4 3 2 ody 2 4 2 2 anybody'd 2 anybody 38 1 4 3 2 2 bw 4 5 2 anything 2 anyplace 2 anyone 2 anyhow 2 any 38 1 4 3 2 i 2 4 2 2 anxious 2 anxiety 38 1 4 3 2 2 4 2 2 antonym 2 Antony 38 1 4 3 2 2 y 4 2 2 Antonio 2 Anton 38 1 4 3 2 ne 2 4 2 2 Antoinette 2 Antoine 38 1 4 3 2 2 in 4 0 38 1 4 3 2 emit 2 4 2 2 antisemitic 2 antisemite 38 1 4 3 2 2 r 4 1 2 antiquated 38 1 4 3 2 2 4 2 2 antiquary 2 antiquarian 38 1 4 3 2 u 2 a 4 2 2 antiquity 2 antique 38 1 4 3 2 2 4 2 2 antipathy 2 antipasto 38 1 4 3 2 2 a 4 3 2 antipode 2 antiphonal 2 antiperspirant 38 1 4 3 2 2 4 2 2 antigorite 2 Antigone 38 1 4 3 2 2 o 4 1 2 antigen 38 1 4 3 2 pat 2 4 2 2 anticipatory 2 anticipate 38 1 4 3 2 2 i 4 1 2 antic 38 1 4 3 2 2 cgpqs 4 5 2 antithetic 2 Antioch 2 antimony 2 Antietam 2 anti 38 1 4 3 2 po 2 4 3 2 anthropomorphic 2 anthropology 2 anthropogenic 38 1 4 3 2 c 2 4 2 2 anthracnose 2 anthracite 38 1 4 3 2 2 ao 4 0 38 1 4 3 2 2 4 2 2 Anthony 2 anthology 38 1 4 3 2 2 4 2 2 anther 2 anthem 38 1 4 3 2 2 eor 4 0 38 1 4 3 2 na 2 4 2 2 antennae 2 antenna 38 1 4 3 2 2 n 4 7 2 anterior 2 antelope 2 antedate 2 antecedent 2 antebellum 2 anteater 2 ante 38 1 4 3 2 tic 2 4 2 2 Antarctica 2 antarctic 38 1 4 3 2 2 c 4 1 2 Antares 38 1 4 3 2 onis 2 4 2 2 antagonist 2 antagonism 38 1 4 3 2 2 gr 4 2 2 Antaeus 2 antacid 38 1 4 3 2 2 aehio 4 3 2 Antwerp 2 antler 2 ant 38 1 4 3 2 lm 2 4 2 2 Anselmo 2 Anselm 38 1 4 3 2 2 e 4 2 2 answer 2 ANSI 38 1 4 3 2 2 4 2 2 anorthite 2 anorthic 38 1 4 3 2 h 2 i 4 1 2 anorthosite 38 1 4 3 2 2 t 4 1 2 anorexia 38 1 4 3 2 ym 2 4 2 2 anonymous 2 anonymity 38 1 4 3 2 l 2 4 2 2 anomaly 2 anomalous 38 1 4 3 2 2 a 4 1 2 anomie 38 1 4 3 2 2 4 2 2 anodic 2 anode 38 1 4 3 2 2 dmnr 4 1 2 another 38 1 4 3 2 2 4 2 2 annulling 2 annulled 38 1 4 3 2 2 l 4 4 2 annulus 2 annuli 2 annular 2 annul 38 1 4 3 2 2 l 4 4 2 annunciate 2 annum 2 annuity 2 annual 38 1 4 3 2 2 4 2 2 annoyance 2 annoy 38 1 4 3 2 2 yu 4 1 2 annotate 38 1 4 3 2 2 4 3 2 anniversary 2 annihilate 2 Annie 38 1 4 3 2 2 4 4 2 annex 2 Annette 2 anneal 2 Anne 38 1 4 3 2 2 4 2 2 Annalen 2 Annale 38 1 4 3 2 2 e 4 1 2 annal 38 1 4 3 2 2 l 4 2 2 Annapolis 2 Anna 38 1 4 3 2 2 aeiou 4 1 2 Ann 38 1 4 3 2 2 4 2 2 ankle 2 Ankara 38 1 4 3 2 trop 2 4 2 2 anisotropy 2 anisotropic 38 1 4 3 2 2 4 2 2 aniseikonic 2 anise 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 n 2 4 2 2 anionic 2 anion 38 1 4 3 2 2 d 4 2 2 animate 2 animal 38 1 4 3 2 ver 2 4 2 2 animadvert 2 animadversion 38 1 4 3 2 2 a 4 2 2 animosity 2 animism 38 1 4 3 2 2 mos 4 3 2 Anita 2 aniline 2 ani 38 1 4 3 2 2 4 2 2 anhydrite 2 anhydride 38 1 4 3 2 dr 2 i 4 1 2 anhydrous 38 1 4 3 2 2 y 4 2 2 Anheuser 2 anharmonic 38 1 4 3 2 2 4 3 2 Angus 2 angular 2 anguish 38 1 4 3 2 t 2 4 2 2 angstrom 2 angst 38 1 4 3 2 2 4 2 2 Angora 2 Angola 38 1 4 3 2 2 4 2 2 Anglophobia 2 Anglo 38 1 4 3 2 2 4 2 2 angling 2 Anglican 38 1 4 3 2 2 4 2 2 Angles 2 angle 38 1 4 3 2 2 eio 4 0 38 1 4 3 2 2 4 2 2 angiosperm 2 Angie 38 1 4 3 2 2 l 4 1 2 anger 38 1 4 3 2 2 i 4 5 2 Angelo 2 angelfish 2 Angeles 2 Angela 2 angel 38 1 4 3 2 2 4 2 2 Angeline 2 Angelina 38 1 4 3 2 2 4 2 2 Angelica 2 angelic 38 1 4 3 2 2 cn 4 0 38 1 4 3 2 2 eilosu 4 1 2 angry 38 1 4 3 2 dot 2 4 2 2 anecdote 2 anecdotal 38 1 4 3 2 2 c 4 3 2 anew 2 anent 2 anemone 38 1 4 3 2 m 2 4 2 2 Andromeda 2 Andromache 38 1 4 3 2 2 4 4 2 Andrew 2 Andrei 2 Andrea 2 Andre 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 4 2 2 Andover 2 Andorra 38 1 4 3 2 2 4 2 2 andesite 2 andesine 38 1 4 3 2 2 i 4 1 2 Andes 38 1 4 3 2 s 2 4 2 2 Anderson 2 Andersen 38 1 4 3 2 2 rs 4 1 2 Andean 38 1 4 3 2 2 eor 4 2 2 Andy 2 and 38 1 4 3 2 2 4 2 2 ancillary 2 ancient 38 1 4 3 2 2 4 3 2 anchorite 2 anchorage 2 anchor 38 1 4 3 2 o 2 r 4 1 2 anchovy 38 1 4 3 2 st 2 ro 4 0 38 1 4 3 2 2 4 2 2 ancestry 2 ancestral 38 1 4 3 2 2 ehi 4 0 38 1 4 3 2 2 4 2 2 anatomy 2 anatomic 38 1 4 3 2 2 m 4 1 2 Anatole 38 1 4 3 2 2 o 4 1 2 anathema 38 1 4 3 2 mo 2 4 2 2 anastomotic 2 anastomosis 38 1 4 3 2 gmat 2 4 2 2 anastigmatic 2 anastigmat 38 1 4 3 2 t 2 io 4 1 2 Anastasia 38 1 4 3 2 ch 2 4 3 2 anarchy 2 anarchic 2 anarch 38 1 4 3 2 2 4 3 2 analyst 2 analysis 2 analyses 38 1 4 3 2 2 s 4 2 2 analyze 2 analytic 38 1 4 3 2 g 2 4 3 2 analogy 2 analogue 2 analogous 38 1 4 3 2 2 oy 4 2 2 analgesic 2 analeptic 38 1 4 3 2 2 4 2 2 anagram 2 anaglyph 38 1 4 3 2 ronis 2 4 2 2 anachronistic 2 anachronism 38 1 4 3 2 2 h 4 1 2 anaconda 38 1 4 3 2 2 4 2 2 Anabel 2 Anabaptist 38 1 4 3 2 2 bcglrst 4 5 2 anaplasmosis 2 anamorphic 2 Anaheim 2 anaerobic 2 ana 38 1 4 3 2 2 acdeghiknostxy 4 3 2 anvil 2 anus 2 an 38 1 4 3 2 2 4 2 2 amygdaloid 2 amy 38 1 4 3 2 2 4 2 2 amuse 2 amulet 38 1 4 3 2 2 4 2 2 amplitude 2 amplify 38 1 4 3 2 2 i 4 2 2 amply 2 ample 38 1 4 3 2 2 io 4 0 38 1 4 3 2 l 2 4 2 2 amphibology 2 amphibole 38 1 4 3 2 2 4 2 2 amphibious 2 amphibian 38 1 4 3 2 2 b 4 1 2 amphioxis 38 1 4 3 2 2 i 4 1 2 amphetamine 38 1 4 3 2 2 4 3 2 ampersand 2 ampere 2 amperage 38 1 4 3 2 2 r 4 1 2 Ampex 38 1 4 3 2 2 ehl 4 2 2 amputate 2 amp 38 1 4 3 2 2 4 3 2 amort 2 amorphous 2 amoral 38 1 4 3 2 g 2 4 2 2 amongst 2 among 38 1 4 3 2 ba 2 4 2 2 amoebae 2 amoeba 38 1 4 3 2 2 enru 4 3 2 Amos 2 amok 2 Amoco 38 1 4 3 2 2 4 2 2 ammoniac 2 ammonia 38 1 4 3 2 i 2 a 4 1 2 ammonium 38 1 4 3 2 2 n 4 1 2 ammo 38 1 4 3 2 2 4 2 2 ammeter 2 Ammerman 38 1 4 3 2 2 eo 4 2 2 ammunition 2 Amman 38 1 4 3 2 o 2 4 2 2 aminobenzoic 2 amino 38 1 4 3 2 2 4 3 2 amidst 2 amide 2 amid 38 1 4 3 2 2 dn 4 5 2 amity 2 amiss 2 amigo 2 amicable 2 ami 38 1 4 3 2 hyst 2 4 2 2 amethystine 2 amethyst 38 1 4 3 2 2 n 4 1 2 America 38 1 4 3 2 c 2 a 4 1 2 americium 38 1 4 3 2 2 i 4 1 2 Amerada 38 1 4 3 2 2 4 2 2 amende 2 amend 38 1 4 3 2 2 d 4 1 2 amen 38 1 4 3 2 i 2 4 2 2 ameliorate 2 Amelia 38 1 4 3 2 2 lnrt 4 1 2 Ames 38 1 4 3 2 2 4 2 2 ambush 2 ambuscade 38 1 4 3 2 a 2 4 2 2 ambulatory 2 ambulant 38 1 4 3 2 2 ls 4 0 38 1 4 3 2 a 2 4 2 2 ambrosial 2 ambrosia 38 1 4 3 2 os 2 i 4 1 2 ambrose 38 1 4 3 2 2 4 2 2 ambling 2 amble 38 1 4 3 2 io 2 4 2 2 ambitious 2 ambition 38 1 4 3 2 u 2 4 2 2 ambiguous 2 ambiguity 38 1 4 3 2 2 gt 4 4 2 ambivalent 2 ambient 2 ambidextrous 2 ambiance 38 1 4 3 2 2 ilru 4 2 2 amber 2 ambassador 38 1 4 3 2 2 4 2 2 Amazon 2 amaze 38 1 4 3 2 ur 2 4 2 2 amateurish 2 amateur 38 1 4 3 2 2 e 4 1 2 amatory 38 1 4 3 2 2 4 2 2 Amarillo 2 amaranth 38 1 4 3 2 2 4 2 2 amanuensis 2 amanita 38 1 4 3 2 gam 2 4 2 2 amalgamate 2 amalgam 38 1 4 3 2 2 lnrtz 4 3 2 amass 2 Amadeus 2 AMA 38 1 4 3 2 2 abeimopuy 4 5 2 Amtrak 2 Amsterdam 2 amra 2 Amherst 2 am 38 1 4 3 2 ol 2 4 3 2 alveolus 2 alveoli 2 alveolar 38 1 4 3 2 2 4 2 2 Alvarez 2 Alva 38 1 4 3 2 2 ae 4 1 2 Alvin 38 1 4 3 2 2 in 4 1 2 alum 38 1 4 3 2 2 4 2 2 alumnae 2 alumna 38 1 4 3 2 2 a 4 2 2 alumnus 2 alumni 38 1 4 3 2 na 2 4 2 2 aluminate 2 alumina 38 1 4 3 2 2 m 4 1 2 alundum 38 1 4 3 2 uis 2 4 2 2 altruist 2 altruism 38 1 4 3 2 2 4 3 2 Alton 2 altogether 2 alto 38 1 4 3 2 2 4 2 2 altitude 2 altimeter 38 1 4 3 2 2 4 2 2 although 2 althea 38 1 4 3 2 2 a 4 1 2 altern 38 1 4 3 2 r 2 n 4 4 2 alterman 2 altercate 2 alterate 2 alter 38 1 4 3 2 2 4 2 2 altar 2 Altair 38 1 4 3 2 2 aehior 4 0 38 1 4 3 2 2 4 2 2 Alsop 2 also 38 1 4 3 2 2 o 4 1 2 Alsatian 38 1 4 3 2 2 b 4 2 2 alphanumeric 2 alpha 38 1 4 3 2 et 2 4 2 2 alphabetic 2 alphabet 38 1 4 3 2 2 a 4 2 2 Alphonse 2 Alpheratz 38 1 4 3 2 2 4 2 2 Alpert 2 alpenstock 38 1 4 3 2 2 eh 4 2 2 alpine 2 alp 38 1 4 3 2 2 4 2 2 alongside 2 along 38 1 4 3 2 2 g 4 1 2 alone 38 1 4 3 2 2 n 4 5 2 aloud 2 aloof 2 aloha 2 aloft 2 aloe 38 1 4 3 2 2 4 2 2 almost 2 almond 38 1 4 3 2 2 4 4 2 almanac 2 almagest 2 Almaden 2 alma 38 1 4 3 2 2 ao 4 1 2 almighty 38 1 4 3 2 2 4 3 2 Allyn 2 allyl 2 ally 38 1 4 3 2 i 2 4 2 2 alluvium 2 alluvial 38 1 4 3 2 i 2 4 2 2 allusive 2 allusion 38 1 4 3 2 2 sv 4 2 2 allure 2 allude 38 1 4 3 2 2 4 2 2 Allstate 2 allspice 38 1 4 3 2 2 4 4 2 allowed 2 allows 2 allowance 2 allow 38 1 4 3 2 2 4 2 2 allotting 2 allotted 38 1 4 3 2 2 t 4 2 2 allotropic 2 allot 38 1 4 3 2 a 2 4 2 2 allocate 2 allocable 38 1 4 3 2 2 ctw 4 1 2 alloy 38 1 4 3 2 2 4 2 2 Allison 2 Allis 38 1 4 3 2 2 s 4 3 2 alliterate 2 alligator 2 alliance 38 1 4 3 2 2 4 2 2 alleyway 2 alley 38 1 4 3 2 g 2 4 2 2 allergy 2 allergic 38 1 4 3 2 2 4 2 2 Allentown 2 Allen 38 1 4 3 2 2 or 4 4 2 allegiant 2 Allegheny 2 allege 2 allegate 38 1 4 3 2 2 4 2 2 allegro 2 Allegra 38 1 4 3 2 r 2 4 2 2 allegory 2 allegoric 38 1 4 3 2 2 gnry 4 3 2 alleviate 2 allemand 2 allele 38 1 4 3 2 2 4 3 2 allay 2 Allan 2 Allah 38 1 4 3 2 2 aeiosuy 4 1 2 all 38 1 4 3 2 2 4 2 2 alkaline 2 alkali 38 1 4 3 2 al 2 i 4 1 2 alkaloid 38 1 4 3 2 2 4 2 2 Alistair 2 Alison 38 1 4 3 2 2 4 2 2 align 2 alight 38 1 4 3 2 n 2 4 2 2 alienate 2 alien 38 1 4 3 2 2 4 2 2 Alicia 2 Alice 38 1 4 3 2 2 s 4 1 2 alia 38 1 4 3 2 2 acegs 4 8 2 alizarin 2 alive 2 aliquot 2 aliphatic 2 alimony 2 alike 2 alibi 2 Ali 38 1 4 3 2 ithm 2 4 2 2 algorithmic 2 algorithm 38 1 4 3 2 2 r 4 2 2 Algonquin 2 Algol 38 1 4 3 2 2 4 2 2 alginate 2 Algiers 38 1 4 3 2 2 4 2 2 Algeria 2 Alger 38 1 4 3 2 ra 2 4 2 2 algebraic 2 algebra 38 1 4 3 2 2 br 4 1 2 Algenib 38 1 4 3 2 2 e 4 2 2 algal 2 alga 38 1 4 3 2 2 4 2 2 algaecide 2 algae 38 1 4 3 2 2 aeio 4 0 38 1 4 3 2 2 4 2 2 Alfredo 2 Alfred 38 1 4 3 2 e 2 d 4 1 2 alfresco 38 1 4 3 2 2 r 4 2 2 alfonso 2 alfalfa 38 1 4 3 2 2 4 3 2 Alexandria 2 Alexandre 2 Alexandra 38 1 4 3 2 nd 2 r 4 1 2 Alexander 38 1 4 3 2 2 a 4 3 2 Alexis 2 Alexei 2 Alex 38 1 4 3 2 2 4 2 2 Aleck 2 Alec 38 1 4 3 2 2 cx 4 4 2 alewife 2 alert 2 aleph 2 ale 38 1 4 3 2 i 2 4 2 2 aldrin 2 Aldrich 38 1 4 3 2 2 r 4 3 2 Alden 2 aldehyde 2 Aldebaran 38 1 4 3 2 2 4 2 2 aldermen 2 alderman 38 1 4 3 2 2 m 4 1 2 alder 38 1 4 3 2 2 er 4 0 38 1 4 3 2 ol 2 4 2 2 alcoholic 2 alcohol 38 1 4 3 2 2 h 4 3 2 alcove 2 Alcott 2 Alcoa 38 1 4 3 2 2 o 4 3 2 Alcmena 2 alchemy 2 Alcestis 38 1 4 3 2 2 4 2 2 albumin 2 album 38 1 4 3 2 2 m 4 1 2 Albuquerque 38 1 4 3 2 2 4 2 2 Albright 2 Albrecht 38 1 4 3 2 2 4 3 2 Alberto 2 Alberta 2 Albert 38 1 4 3 2 2 t 4 1 2 Alberich 38 1 4 3 2 2 r 4 1 2 albeit 38 1 4 3 2 a 2 4 2 2 Albanian 2 Albania 38 1 4 3 2 2 i 4 1 2 Albany 38 1 4 3 2 2 n 4 3 2 albatross 2 albacore 2 alba 38 1 4 3 2 2 aeru 4 1 2 alb 38 1 4 3 2 2 4 2 2 Alamo 2 Alameda 38 1 4 3 2 2 4 2 2 Alabamian 2 Alabama 38 1 4 3 2 a 2 m 4 1 2 alabaster 38 1 4 3 2 2 bm 4 6 2 Alaska 2 alarm 2 alan 2 alai 2 alacrity 2 ala 38 1 4 3 2 2 abcdefgiklmopstuvw 4 4 2 alyssum 2 already 2 Alhambra 2 AL 38 1 4 3 2 2 4 4 2 Akron 2 akin 2 Akers 2 AK 38 1 4 3 2 a 2 4 2 2 Ajax 2 ajar 38 1 4 3 2 2 4 2 2 airstrip 2 airspeed 38 1 4 3 2 2 4 3 2 airport 2 airplane 2 airpark 38 1 4 3 2 2 4 3 2 airmass 2 airman 2 airmail 38 1 4 3 2 2 a 4 1 2 airmen 38 1 4 3 2 2 4 2 2 airline 2 airlift 38 1 4 3 2 2 i 4 1 2 airlock 38 1 4 3 2 2 4 4 2 airframe 2 airflow 2 airfield 2 airfare 38 1 4 3 2 2 4 2 2 Aires 2 airedale 38 1 4 3 2 2 eflmps 4 7 2 airy 2 airway 2 airtight 2 airdrop 2 aircraft 2 airborne 2 air 38 1 4 3 2 2 4 2 2 Ainu 2 ain't 38 1 4 3 2 2 4 2 2 aileron 2 aile 38 1 4 3 2 2 e 4 2 2 ailanthus 2 ail 38 1 4 3 2 2 e 4 2 2 Aida 2 aid 38 1 4 3 2 2 4 2 2 Aides 2 aide 38 1 4 3 2 2 dlnr 4 4 2 Aitken 2 aisle 2 aim 2 Aiken 38 1 4 3 2 2 4 2 2 ahem 2 ahead 38 1 4 3 2 2 e 4 3 2 ahoy 2 Ahmedabad 2 ah 38 1 4 3 2 2 u 4 1 2 Agricola 38 1 4 3 2 ltur 2 4 2 2 agriculture 2 agricultural 38 1 4 3 2 2 c 4 1 2 agrimony 38 1 4 3 2 e 2 4 5 2 agreement 2 agreed 2 agreeing 2 agreeable 2 agree 38 1 4 3 2 2 ei 4 1 2 agrarian 38 1 4 3 2 2 4 2 2 agony 2 agone 38 1 4 3 2 2 n 4 2 2 agouti 2 ago 38 1 4 3 2 2 4 2 2 agnostic 2 agnomen 38 1 4 3 2 2 4 2 2 Agnew 2 Agnes 38 1 4 3 2 2 eo 4 0 38 1 4 3 2 2 4 3 2 agitate 2 aging 2 agile 38 1 4 3 2 2 4 2 2 aggressive 2 aggression 38 1 4 3 2 s 2 i 4 1 2 aggressor 38 1 4 3 2 2 s 4 1 2 aggregate 38 1 4 3 2 2 e 4 2 2 aggrieve 2 aggravate 38 1 4 3 2 2 u 4 1 2 agglomerate 38 1 4 3 2 tin 2 4 2 2 agglutinin 2 agglutinate 38 1 4 3 2 2 lr 4 0 38 1 4 3 2 2 4 3 2 agency 2 agent 2 agenda 38 1 4 3 2 2 n 4 2 2 Agee 2 age 38 1 4 3 2 2 it 4 2 2 agave 2 Agamemnon 38 1 4 3 2 2 4 2 2 Agatha 2 agate 38 1 4 3 2 n 2 4 2 2 against 2 again 38 1 4 3 2 2 aeginor 4 4 2 Agway 2 ague 2 agleam 2 aghast 38 1 4 3 2 2 4 2 2 afterword 2 afterward 38 1 4 3 2 r 2 w 4 8 2 afterthought 2 afternoon 2 aftermath 2 afterlife 2 afterimage 2 afterglow 2 aftereffect 2 after 38 1 4 3 2 2 e 4 1 2 aft 38 1 4 3 2 2 4 4 2 afro 2 Africa 2 afresh 2 afraid 38 1 4 3 2 e 2 4 3 2 aforethought 2 aforesaid 2 aforementioned 38 1 4 3 2 2 r 4 1 2 afoot 38 1 4 3 2 2 4 2 2 afloat 2 aflame 38 1 4 3 2 2 4 3 2 afire 2 afield 2 aficionado 38 1 4 3 2 han 2 4 2 2 Afghanistan 2 Afghan 38 1 4 3 2 2 4 2 2 affront 2 affricate 38 1 4 3 2 st 2 4 2 2 afforestation 2 afforest 38 1 4 3 2 r 2 e 4 1 2 afford 38 1 4 3 2 2 4 2 2 affluent 2 afflict 38 1 4 3 2 ti 2 4 2 2 affirmative 2 affirmation 38 1 4 3 2 m 2 a 4 1 2 affirm 38 1 4 3 2 2 r 4 5 2 affix 2 affine 2 affiliate 2 affidavit 2 affiance 38 1 4 3 2 t 2 4 3 2 affectionate 2 affectate 2 affect 38 1 4 3 2 2 c 4 1 2 afferent 38 1 4 3 2 2 4 2 2 affair 2 affable 38 1 4 3 2 2 aeilor 4 0 38 1 4 3 2 2 fgilort 4 1 2 afar 38 1 4 3 2 het 2 4 2 2 aesthetic 2 aesthete 38 1 4 3 2 2 t 4 1 2 Aeschylus 38 1 4 3 2 2 4 2 2 aerospace 2 aerosol 38 1 4 3 2 2 4 2 2 aerobic 2 Aerobacter 38 1 4 3 2 2 bs 4 3 2 aeronautic 2 aerogene 2 aerodynamic 38 1 4 3 2 2 o 4 2 2 aerial 2 aerate 38 1 4 3 2 l 2 4 2 2 Aeolus 2 aeolian 38 1 4 3 2 e 2 4 2 2 Aeneid 2 Aeneas 38 1 4 3 2 2 4 2 2 aegis 2 Aegean 38 1 4 3 2 2 gnors 4 0 38 1 4 3 2 ca 2 4 2 2 advocate 2 advocacy 38 1 4 3 2 r 2 4 2 2 advisory 2 advisor 38 1 4 3 2 2 4 2 2 advisee 2 advise 38 1 4 3 2 2 eo 4 1 2 advisable 38 1 4 3 2 2 s 4 1 2 advice 38 1 4 3 2 2 4 2 2 advertise 2 advert 38 1 4 3 2 2 4 2 2 adverse 2 adversary 38 1 4 3 2 2 4 2 2 adverbial 2 adverb 38 1 4 3 2 2 bst 4 0 38 1 4 3 2 t 2 u 4 2 2 adventitious 2 advent 38 1 4 3 2 r 2 4 2 2 adventurous 2 adventure 38 1 4 3 2 2 nr 4 0 38 1 4 3 2 n 2 t 4 1 2 advance 38 1 4 3 2 age 2 4 2 2 advantageous 2 advantage 38 1 4 3 2 2 aeio 4 0 38 1 4 3 2 r 2 4 3 2 adultery 2 adulterous 2 adulterate 38 1 4 3 2 2 e 4 1 2 adult 38 1 4 3 2 l 2 t 4 1 2 adulate 38 1 4 3 2 ti 2 4 2 2 adsorptive 2 adsorption 38 1 4 3 2 2 4 2 2 adsorbate 2 adsorb 38 1 4 3 2 or 2 bp 4 0 38 1 4 3 2 2 4 2 2 Adriatic 2 Adrian 38 1 4 3 2 2 a 4 2 2 adrift 2 Adrienne 38 1 4 3 2 nal 2 4 2 2 adrenaline 2 adrenal 38 1 4 3 2 2 ei 4 1 2 adroit 38 1 4 3 2 2 4 2 2 adorn 2 adore 38 1 4 3 2 2 4 2 2 adoptive 2 adoption 38 1 4 3 2 t 2 i 4 1 2 adopt 38 1 4 3 2 h 2 4 2 2 Adolphus 2 Adolph 38 1 4 3 2 2 p 4 1 2 adolescent 38 1 4 3 2 2 lpr 4 3 2 Adonis 2 adobe 2 ado 38 1 4 3 2 ni 2 4 2 2 admonition 2 admonish 38 1 4 3 2 2 nrstx 4 0 38 1 4 3 2 2 4 2 2 admixture 2 admix 38 1 4 3 2 2 4 3 2 admitting 2 admitted 2 admittance 38 1 4 3 2 2 t 4 1 2 admit 38 1 4 3 2 si 2 4 2 2 admission 2 admissible 38 1 4 3 2 2 l 4 1 2 admiration 38 1 4 3 2 2 4 2 2 admiralty 2 admiral 38 1 4 3 2 2 a 4 1 2 admire 38 1 4 3 2 ist 2 r 4 1 2 administer 38 1 4 3 2 2 4 3 2 administration 2 administratrix 2 administrate 38 1 4 3 2 a 2 t 4 1 2 administrable 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 4 2 2 adjudicate 2 adjudge 38 1 4 3 2 2 d 4 3 2 adjutant 2 adjust 2 adjunct 38 1 4 3 2 n 2 4 2 2 adjoint 2 adjoin 38 1 4 3 2 2 i 4 1 2 adjourn 38 1 4 3 2 ct 2 4 2 2 adjectival 2 adject 38 1 4 3 2 2 eou 4 1 2 adjacent 38 1 4 3 2 2 4 4 2 Adirondack 2 adipic 2 adieu 2 adiabatic 38 1 4 3 2 i 2 4 2 2 adhesive 2 adhesion 38 1 4 3 2 e 2 4 2 2 adherent 2 adhere 38 1 4 3 2 e 2 rs 4 0 38 1 4 3 2 ua 2 4 2 2 adequate 2 adequacy 38 1 4 3 2 2 4 2 2 adenosine 2 adenoma 38 1 4 3 2 2 o 4 2 2 adenine 2 Aden 38 1 4 3 2 2 4 3 2 Adelia 2 Adele 2 Adelaide 38 1 4 3 2 2 lnq 4 1 2 adept 38 1 4 3 2 ess 2 4 3 2 Addressograph 2 addressee 2 address 38 1 4 3 2 i 2 o 4 1 2 additive 38 1 4 3 2 2 4 2 2 Addison 2 Addis 38 1 4 3 2 2 st 4 2 2 adding 2 addict 38 1 4 3 2 2 n 4 1 2 added 38 1 4 3 2 2 eir 4 3 2 adduce 2 addle 2 add 38 1 4 3 2 t 2 4 3 2 adaptive 2 adaptation 2 adapt 38 1 4 3 2 2 4 3 2 Adamson 2 adamant 2 Adam 38 1 4 3 2 2 4 2 2 adagio 2 adage 38 1 4 3 2 2 gmp 4 2 2 Adair 2 Ada 38 1 4 3 2 2 adehijmorsuv 4 4 2 adposition 2 Adler 2 Adkins 2 ad 38 1 4 3 2 2 4 3 2 acute 2 acumen 2 acuity 38 1 4 3 2 a 2 l 4 2 2 actuate 2 actuarial 38 1 4 3 2 2 4 2 2 actor 2 Acton 38 1 4 3 2 2 io 4 0 38 1 4 3 2 2 4 2 2 actinometer 2 actinolite 38 1 4 3 2 2 4 3 2 actinium 2 actinide 2 actinic 38 1 4 3 2 2 nov 4 0 38 1 4 3 2 2 iou 4 3 2 actress 2 Actaeon 2 act 38 1 4 3 2 l 2 4 2 2 acrylic 2 acrylate 38 1 4 3 2 a 2 t 4 1 2 acrobacy 38 1 4 3 2 2 4 2 2 acrobatic 2 acrobat 38 1 4 3 2 2 b 4 3 2 across 2 acropolis 2 acronym 38 1 4 3 2 2 4 2 2 acreage 2 acre 38 1 4 3 2 2 eoy 4 1 2 acrid 38 1 4 3 2 2 4 2 2 acquitting 2 acquittal 38 1 4 3 2 2 t 4 1 2 acquit 38 1 4 3 2 iti 2 4 2 2 acquisitive 2 acquisition 38 1 4 3 2 sce 2 4 2 2 acquiescent 2 acquiesce 38 1 4 3 2 2 est 4 1 2 acquire 38 1 4 3 2 int 2 4 2 2 acquaintance 2 acquaint 38 1 4 3 2 u 2 ai 4 0 38 1 4 3 2 2 4 3 2 acoustic 2 acorn 2 acolyte 38 1 4 3 2 2 4 2 2 acme 2 ACM 38 1 4 3 2 owledge 2 4 2 2 acknowledgeable 2 acknowledge 38 1 4 3 2 2 n 4 2 2 Ackley 2 Ackerman 38 1 4 3 2 d 2 4 3 2 acidulous 2 acidic 2 acid 38 1 4 3 2 2 4 3 2 aching 2 Achilles 2 achieve 38 1 4 3 2 2 i 4 2 2 achromatic 2 ache 38 1 4 3 2 2 4 4 2 acetylene 2 acetone 2 acetic 2 acetate 38 1 4 3 2 bi 2 4 2 2 acerbity 2 acerbic 38 1 4 3 2 2 rt 4 1 2 ace 38 1 4 3 2 t 2 i 4 1 2 accusatory 38 1 4 3 2 2 4 2 2 accusative 2 accusation 38 1 4 3 2 2 a 4 2 2 accustom 2 accuse 38 1 4 3 2 a 2 4 2 2 accurate 2 accuracy 38 1 4 3 2 2 rs 4 2 2 accumulate 2 acculturate 38 1 4 3 2 2 4 2 2 accrue 2 accrual 38 1 4 3 2 it 2 4 2 2 accreditate 2 accredit 38 1 4 3 2 2 d 4 1 2 accretion 38 1 4 3 2 2 eu 4 1 2 Accra 38 1 4 3 2 t 2 4 3 2 accounts 2 accountant 2 account 38 1 4 3 2 2 n 4 1 2 accouter 38 1 4 3 2 d 2 i 4 2 2 accordant 2 accord 38 1 4 3 2 i 2 4 2 2 accomplish 2 accomplice 38 1 4 3 2 n 2 i 4 1 2 accompany 38 1 4 3 2 2 4 2 2 accompanist 2 accompaniment 38 1 4 3 2 2 al 4 0 38 1 4 3 2 2 p 4 1 2 accommodate 38 1 4 3 2 2 mru 4 2 2 accost 2 accolade 38 1 4 3 2 2 4 2 2 acclamation 2 acclaim 38 1 4 3 2 2 a 4 1 2 acclimate 38 1 4 3 2 ent 2 4 2 2 accidental 2 accident 38 1 4 3 2 2 d 4 1 2 accipiter 38 1 4 3 2 2 lnps 4 1 2 accede 38 1 4 3 2 2 4 2 2 accession 2 accessible 38 1 4 3 2 s 2 i 4 2 2 accessory 2 access 38 1 4 3 2 t 2 4 4 2 accepted 2 acceptor 2 acceptant 2 accept 38 1 4 3 2 a 2 4 2 2 accentuate 2 accentual 38 1 4 3 2 t 2 u 4 1 2 accent 38 1 4 3 2 er 2 4 2 2 accelerometer 2 accelerate 38 1 4 3 2 2 eiloru 4 0 38 1 4 3 2 2 e 4 1 2 Acadia 38 1 4 3 2 m 2 i 4 1 2 academy 38 1 4 3 2 2 c 4 1 2 academia 38 1 4 3 2 2 4 2 2 academician 2 academic 38 1 4 3 2 2 d 4 2 2 Acapulco 2 acanthus 38 1 4 3 2 2 acehikmoqrtu 4 2 2 acyclic 2 AC 38 1 4 3 2 2 4 2 2 Abyssinia 2 abyss 38 1 4 3 2 s 2 s 4 1 2 abysmal 38 1 4 3 2 2 4 2 2 abutting 2 abutted 38 1 4 3 2 2 t 4 1 2 abut 38 1 4 3 2 2 4 3 2 abusive 2 abuse 2 abusable 38 1 4 3 2 2 st 4 2 2 abundant 2 abuilding 38 1 4 3 2 ct 2 4 2 2 abstractor 2 abstract 38 1 4 3 2 2 a 4 1 2 abstruse 38 1 4 3 2 2 r 4 3 2 abstinent 2 abstention 2 abstain 38 1 4 3 2 ti 2 4 2 2 absorptive 2 absorption 38 1 4 3 2 2 4 2 2 absorbent 2 absorb 38 1 4 3 2 2 bp 4 0 38 1 4 3 2 2 u 4 1 2 absolve 38 1 4 3 2 t 2 4 2 2 absolution 2 absolute 38 1 4 3 2 2 lr 4 0 38 1 4 3 2 e 2 4 2 2 absenteeism 2 absentee 38 1 4 3 2 nt 2 e 4 3 2 absentminded 2 absentia 2 absent 38 1 4 3 2 2 i 4 1 2 abscess 38 1 4 3 2 ssa 2 4 2 2 abscissae 2 abscissa 38 1 4 3 2 2 ceot 4 2 2 absurd 2 absinthe 38 1 4 3 2 2 4 2 2 abrogate 2 abroad 38 1 4 3 2 dg 2 4 2 2 abridgment 2 abridge 38 1 4 3 2 a 2 4 2 2 abreast 2 abreact 38 1 4 3 2 2 ms 4 2 2 Abraham 2 abrade 38 1 4 3 2 i 2 4 2 2 abrasive 2 abrasion 38 1 4 3 2 2 4 2 2 Abramson 2 Abram 38 1 4 3 2 2 aeio 4 1 2 abrupt 38 1 4 3 2 e 2 4 4 2 abovementioned 2 aboveground 2 aboveboard 2 above 38 1 4 3 2 2 4 2 2 about 2 abound 38 1 4 3 2 gin 2 4 2 2 aborigine 2 aboriginal 38 1 4 3 2 2 i 4 2 2 abort 2 aborning 38 1 4 3 2 ina 2 4 2 2 abominate 2 abominable 38 1 4 3 2 i 2 4 2 2 abolition 2 abolish 38 1 4 3 2 2 lmruv 4 3 2 abode 2 aboard 2 Abo 38 1 4 3 2 2 4 2 2 abnormal 2 Abner 38 1 4 3 2 2 4 2 2 ablaze 2 ablate 38 1 4 3 2 2 a 4 2 2 ablution 2 able 38 1 4 3 2 2 4 2 2 Abidjan 2 abide 38 1 4 3 2 2 d 4 2 2 abilities 2 Abigail 38 1 4 3 2 orre 2 4 2 2 abhorrent 2 abhorred 38 1 4 3 2 an 2 4 2 2 abeyant 2 abeyance 38 1 4 3 2 2 4 2 2 abetting 2 abetted 38 1 4 3 2 2 t 4 1 2 abet 38 1 4 3 2 a 2 4 2 2 aberrate 2 aberrant 38 1 4 3 2 2 r 4 2 2 Abernathy 2 Aberdeen 38 1 4 3 2 2 4 3 2 Abelson 2 Abelian 2 Abel 38 1 4 3 2 2 lrty 4 2 2 abed 2 Abe 38 1 4 3 2 m 2 4 2 2 abdominal 2 abdomen 38 1 4 3 2 2 o 4 2 2 abduct 2 abdicate 38 1 4 3 2 t 2 4 2 2 Abbott 2 abbot 38 1 4 3 2 2 4 2 2 abbey 2 abbe 38 1 4 3 2 2 eor 4 1 2 abbas 38 1 4 3 2 2 cs 4 5 2 abate 2 abandon 2 abalone 2 Ababa 2 ABA 38 1 4 3 2 2 4 2 2 abash 2 abase 38 1 4 3 2 2 4 2 2 abacus 2 aback 38 1 4 3 2 2 Abdehilnorsuy 4 2 2 abject 2 abc 38 1 4 3 2 2 4 2 2 Aaron 2 Aarhus 38 1 4 3 2 2 4 2 2 AAAS 2 AAA 38 1 4 3 2 2 Ar 4 0 38 1 4 3 2 2 AbcdefghijklMn&pqrstuvwxyz 4 3 2 a's 2 aorta 2 a 38 1 4 54 2 glowing 2 mostly 2 appears 2 reading 2 warning 2 lowercase 2 faux 2 picked 2 letters 2 singer 2 logged 2 teleport 2 becomes 2 refuses 2 disturbed 2 technically 2 entries 2 randomly 2 seriously 2 probabilities 2 choosing 2 stranger 2 similarities 2 letter 2 mostly 2 profusely 2 writer 2 liking 2 reasoned 2 shortened 2 spelling 2 abbreviated 2 humor 2 evidence 2 firmly 2 direction 2 posting 2 disconnected 2 timing 2 grammatically 2 assuming 2 permissions 2 correctly 2 caller 2 containing 2 generating 2 unhelpful 2 regardless 2 occurence 2 replaced 2 capitalised 2 precede 2 pules 2 neftehkefeh 38 5 4 0 38 5 4 3 2 2 4 2 2 procedures 2 procedure 38 1 4 3 2 2 4 2 2 quoting 2 quotient 38 1 4 3 2 eviat 2 4 2 2 abbreviation 2 abbreviate 38 1 4 3 2 2 4 2 2 evaluation 2 evaluate 38 1 4 3 2 2 4 3 2 introduced 2 introduces 2 introduce 38 1 4 3 2 2 4 3 2 defined 2 defines 2 define 38 1 4 3 2 2 e 4 1 2 own 38 1 4 3 2 2 4 2 2 properties 2 property 38 1 4 3 2 r 2 4 2 2 ancestors 2 ancestor 38 1 4 3 2 lt 2 4 2 2 defaults 2 default 38 1 4 3 2 e 2 4 2 2 unclear 2 uncle 38 1 4 3 2 2 4 2 2 manner 2 mannequin 38 1 4 3 2 2 i 4 1 2 modify 38 1 4 3 2 2 c 4 1 2 modified 38 1 4 3 2 2 4 2 2 reduced 2 reduce 38 1 4 3 2 or 2 4 2 2 behavior 2 behavioral 38 1 4 3 2 2 4 2 2 Newell 2 newel 38 1 4 3 2 2 4 2 2 behaves 2 behave 38 1 4 3 2 2 4 2 2 severely 2 severe 38 1 4 3 2 n 2 4 2 2 container 2 contain 38 1 4 3 2 2 4 2 2 blessed 2 bless 38 1 4 3 2 s 2 4 2 2 release 2 releasable 38 1 4 3 2 h 2 4 2 2 toughened 2 tough 38 1 4 3 2 2 e 4 1 2 removal 38 1 4 3 2 r 2 4 2 2 improperly 2 improper 38 1 4 3 2 2 4 2 2 satisfying 2 satisfy 38 1 4 3 2 2 4 2 2 notifies 2 notify 38 1 4 3 2 2 4 2 2 securing 2 security 38 1 4 3 2 g 2 4 2 2 belonging 2 belong 38 1 4 3 2 2 4 2 2 smelly 2 smell 38 1 4 3 2 2 4 2 2 temporarily 2 temporary 38 1 4 3 2 r 2 4 2 2 eagerly 2 eager 38 1 4 3 2 2 4 2 2 chirps 2 chirp 38 1 4 3 2 us 2 4 2 2 obviously 2 obvious 38 1 4 3 2 h 2 4 2 2 branches 2 branch 38 1 4 3 2 n 2 a 4 1 2 option 38 1 4 3 2 2 r 4 1 2 owned 38 1 4 3 2 on 2 4 2 2 mentioned 2 mention 38 1 4 3 2 2 4 2 2 listed 2 listen 38 1 4 3 2 2 4 2 2 supplied 2 supplicate 38 1 4 3 2 2 4 2 2 removes 2 remove 38 1 4 3 2 ng 2 4 2 2 seemingly 2 seeming 38 1 4 3 2 2 4 2 2 shorter 2 shorten 38 1 4 3 2 f 2 4 2 2 solidifies 2 solidify 38 1 4 3 2 2 4 2 2 fiddlestick 2 fiddle 38 1 4 3 2 k 2 4 2 2 flickers 2 flick 38 1 4 3 2 ht 2 4 2 2 slightly 2 slight 38 1 4 3 2 2 4 2 2 pleased 2 please 38 1 4 3 2 2 4 2 2 teaches 2 teach 38 1 4 3 2 l 2 4 2 2 optionally 2 optional 38 1 4 3 2 2 4 2 2 functional 2 functionary 38 1 4 3 2 2 4 2 2 centre 2 centrex 38 1 4 3 2 2 4 2 2 parsecs 2 parse 38 1 4 3 2 2 4 2 2 personality 2 personal 38 1 4 3 2 2 4 2 2 aliases 2 alias 38 1 4 3 2 2 4 2 2 owners 2 owner 38 1 4 3 2 og 2 4 2 2 zoologist 2 zoology 38 1 4 3 2 h 2 e 4 1 2 finish 38 1 4 3 2 2 4 2 2 completely 2 complete 38 1 4 3 2 2 4 2 2 fakir 2 fake 38 1 4 3 2 2 4 2 2 initialize 2 initial 38 1 4 3 2 2 4 2 2 cured 2 cure 38 1 4 3 2 ation 2 4 2 2 modifications 2 modification 38 1 4 3 2 inat 2 4 2 2 eliminating 2 eliminate 38 1 4 3 2 2 4 2 2 unfriendly 2 unfortunately 38 1 4 3 2 2 4 2 2 actually 2 actual 38 1 4 3 2 2 4 2 2 easier 2 easily 38 1 4 3 2 2 4 2 2 faster 2 fasten 38 1 4 3 2 r 2 4 2 2 impaired 2 impair 38 1 4 3 2 2 4 2 2 simplified 2 simplify 38 1 4 3 2 v 2 4 2 2 subjective 2 subjectivity 38 1 4 3 2 r 2 e 4 1 2 interferometer 38 1 4 3 2 2 4 2 2 specification 2 specifically 38 1 4 3 2 t 2 4 2 2 alternative 2 alternate 38 1 4 3 2 2 4 5 2 presently 2 presenting 2 presented 2 present 2 presentation 38 1 4 3 2 2 4 2 2 existential 2 existent 38 1 4 3 2 2 4 2 2 extremely 2 extreme 38 1 4 3 2 l 2 4 2 2 carefully 2 careful 38 1 4 3 2 nt 2 4 2 2 currently 2 current 38 1 4 3 2 2 4 2 2 definitely 2 definite 38 1 4 3 2 ich 2 4 2 2 sandwiches 2 sandwich 38 1 4 3 2 bl 2 4 2 2 reasonably 2 reasonable 38 1 4 3 2 2 4 4 2 instantly 2 instantiate 2 instantaneous 2 instant 38 1 4 3 2 2 4 2 2 finishes 2 finished 38 1 4 3 2 rew 2 4 2 2 unscrew 2 unscrews 38 1 4 3 2 nt 2 4 2 2 represents 2 representative 38 1 4 3 2 2 a 4 1 2 implicit 38 1 4 3 2 e 2 4 2 2 generated 2 generate 38 1 4 3 2 2 4 2 2 fridge 2 Friday 38 1 4 3 2 2 4 2 2 filled 2 fillet 38 1 4 3 2 2 4 2 2 neatest 2 neater 38 1 4 3 2 d 2 4 2 2 backwards 2 backward 38 1 4 3 2 2 4 2 2 basically 2 basic 38 1 4 3 2 e 2 4 2 2 circumstances 2 circumstance 38 1 4 3 2 l 2 4 2 2 incidentally 2 incidental 38 1 4 3 2 ent 2 4 2 2 conveniently 2 convenient 38 1 4 3 2 erate 2 4 2 2 deliberately 2 deliberate 38 1 4 3 2 2 4 2 2 whilst 2 while 38 1 4 3 2 2 4 2 2 applications 2 applicate 38 1 4 3 2 2 4 2 2 criticism 2 critic 38 1 5 38 5 0 3 38 1 4 4 2 2 Abc-deFGhIjKlmNopQrszTuvwyX 4 0 4 0 38 0 5 38 4 4 2 2 Mr. Spell 2 spell 38 5 2 For help on using the speller, use 'help spelling' and 'help @spell'. 38 5 4 2 0 1299340 0 750753035 2 1 #35 sequence utilities 16 38 -1 -1 -1 1 -1 39 17 add remove 38 173 -1 contains 38 173 -1 complement 38 173 -1 union intersection 38 173 -1 tostr 38 173 -1 for 38 173 -1 extract 38 173 -1 tolist 38 173 -1 from_list 38 173 -1 from_sorted_list 38 173 -1 first 38 173 -1 last 38 173 -1 size 38 173 -1 from_string 38 173 -1 firstn 38 173 -1 lastn 38 173 -1 range 38 173 -1 0 4 5 38 4 4 3 2 sequence utilities 2 seq_utils 2 squ 38 5 4 35 2 A sequence is a set of integers (*) 2 This package supplies the following verbs: 2 2 :add (seq,f,t) => seq with [f..t] interval added 2 :remove (seq,f,t) => seq with [f..t] interval removed 2 :range (f,t) => sequence corresponding to [f..t] 2 {} => empty sequence 2 :contains (seq,n) => n in seq 2 :size (seq) => number of elements in seq 2 :first (seq) => first integer in seq or E_NONE 2 :firstn (seq,n) => first n integers in seq (as a sequence) 2 :last (seq) => last integer in seq or E_NONE 2 :lastn (seq,n) => last n integers in seq (as a sequence) 2 2 :complement(seq) => [-2147483648..2147483647] - seq 2 :union (seq,seq,...) 2 :intersect(seq,seq,...) 2 2 :extract(seq,array) => array[@seq] 2 :for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor 2 2 :tolist(seq) => list corresponding to seq 2 :tostr(seq) => contents of seq as a string 2 :from_list(list) => sequence corresponding to list 2 :from_sorted_list(list) => sequence corresponding to list (assumed sorted) 2 :from_string(string) => sequence corresponding to string 2 2 For boolean expressions, note that 2 the representation of the empty sequence is {} (boolean FALSE) and 2 all non-empty sequences are represented as nonempty lists (boolean TRUE). 2 2 The representation used works better than the usual list implementation for sets consisting of long uninterrupted ranges of integers. 2 For sparse sets of integers the representation is decidedly non-optimal (though it never takes more than double the space of the usual list representation). 2 2 (*) Actually what this package implements is sets of integers-mod-2^32, but this assumes the underlying machine on which the server runs has 32-bit integers. If not, you need to change this.maxneg to be the largest negative ("smallest"?) integer available. 38 5 4 2 0 10857 0 750671620 2 1 #36 Quota-Log 0 38 -1 -1 -1 46 -1 31 1 init_for_core 38 173 -1 0 18 4 0 38 5 0 0 38 1 4 0 38 0 0 1 38 5 2 %n (%#) can't send to moderated list %t (%[#t]) directly. 38 5 4 0 38 5 4 0 38 5 4 1 1 2 38 1 4 2 1 2 1 36 38 1 0 2592000 38 5 0 0 38 1 4 0 38 0 5 38 5 5 38 5 5 38 4 4 3 2 Quota-Log 2 Quota_Log 2 QL 38 1 2 Record of whose quota has been messed with and why. 38 5 4 2 0 79287 0 750753799 2 1 #37 you 16 38 -1 -1 -1 77 -1 -1 3 verb_sub 38 173 -1 say_action 38 165 -1 fixpos 38 173 -1 1 conjugations 16 4 4 4 2 2 is 2 are 4 2 2 was 2 were 4 2 2 does 2 do 4 2 2 has 2 have 38 1 2 2nd 38 5 2 Yours 38 5 2 yours 38 5 2 Your 38 5 2 your 38 5 2 Yourself 38 5 2 yourself 38 5 2 You 38 5 2 you 38 5 2 You 38 5 2 you 38 5 5 38 4 4 1 2 you 38 5 4 1 2 an object useful for pronoun substitution 38 5 4 2 0 3130 0 750752033 2 1 #38 Hacker 19 38 -1 -1 -1 59 -1 71 0 0 62 5 38 1 5 38 5 5 38 5 5 38 5 5 38 5 4 0 38 1 5 2 0 5 38 5 5 2 0 0 2147483647 2 1 0 0 38 5 5 38 5 5 38 1 5 38 1 5 38 0 5 38 1 5 38 5 0 0 2 1 5 38 1 1 18105 38 4 5 2 0 5 2 0 5 38 5 4 0 38 4 5 38 5 4 0 38 4 5 38 4 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 4 2 0 0 0 0 38 4 4 1 4 2 0 1 4 9 0 745871896 2 Moriah (#50459) 2 Quinn (#19845), Won_Hong_Lao (#31829), Cpt.Vader (#50739), Dagard (#49807), and Hacker (#18105) 2 dungeons 2 2 Sending this cause we're all owners of the Groovie LRPG Dungeon (#5804).. I've completed an improved version that includes options of search, details, and more.. if you'd like more info.. go to #9200 and type about here.. there are more detailed help on topics you can see after that (about here will point you in the right direction.) 2 Anyway, enjoy. _M 2 2 P.S. I've hacked a generic dungeon thing (#3637) to use specially in these dungeons.. look #3637 for details. 38 4 0 2147483647 2 1 0 10633 2 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 1 -1 38 5 5 2 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 0 2 1 5 38 4 5 38 4 4 1 2 Hacker 2 1 2 You see a player who should type '@describe me as ...'. 38 5 4 2 0 2337 0 750753172 2 1 #39 Generic Database 144 38 -1 -1 -1 1 41 32 19 find find_key 38 173 -1 find_exact 38 173 -1 find_all find_all_keys 38 173 -1 _only 38 173 -1 _every 38 173 -1 _every_key 38 173 -1 insert 38 173 -1 delete 38 173 -1 delete2 38 173 -1 set_node 38 173 -1 make_node 2 173 -1 kill_node 2 173 -1 clearall 2 173 -1 clearall_big 38 173 -1 _kill_subtrees 38 173 -1 depth 38 173 -1 count_entries 38 173 -1 count_chars 38 173 -1 count 38 153 3 3 node_perms data 7 2 r 38 5 0 4 38 1 4 4 2 2 4 0 4 0 38 0 5 38 4 4 1 2 Generic Database 38 5 2 A generic `database' (well, really more like a string-indexed array if you want the truth...). See `help $generic_db' for details. 38 5 4 2 0 17561 0 750753121 2 1 #40 Everyman 19 38 -1 -1 -1 6 -1 33 4 eval 2 165 -1 moveto 38 173 -1 eval_d 2 165 -1 call_verb 2 173 -1 0 57 4 0 38 1 5 2 0 5 38 5 2 $no_one 2 0 0 2147483647 2 1 0 0 38 5 5 38 5 5 38 1 5 38 1 5 38 0 5 38 1 5 38 5 4 0 2 1 5 38 1 5 38 4 5 2 0 5 2 0 5 38 5 4 0 38 4 5 38 5 5 38 4 5 38 4 5 38 5 5 38 5 5 38 5 5 38 5 2 ... no one out there to see it. 38 5 5 38 5 4 1 1 -1 38 5 5 38 5 5 38 5 5 38 4 5 38 4 0 2147483647 2 1 0 0 2 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 1 -1 38 5 5 2 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 0 2 1 5 38 4 5 38 4 4 4 2 Everyman 2 everyone 2 no_one 2 noone 2 1 2 ... He never even got to go to Disneyland. 38 5 4 2 0 3164 0 750671045 2 1 #41 Player Database 16 38 -1 -1 -1 39 -1 27 5 load 38 173 -1 check 38 45 -1 init_for_core 38 173 -1 available 38 173 -1 suspend_restart 38 173 -1 6 stupid_names frozen reserved H e n 13 4 27 2 with 2 using 2 at 2 to 2 in 2 into 2 on 2 onto 2 upon 2 out 2 from 2 inside 2 over 2 through 2 under 2 underneath 2 beneath 2 behind 2 beside 2 for 2 about 2 is 2 as 2 off 2 of 2 me 2 you 38 5 0 0 38 5 4 0 38 1 4 4 2 2 4 2 2 Hacker 2 housekeeper 4 2 1 38 1 71 38 1 4 4 2 very 2 4 2 2 everyone 2 Everyman 4 2 1 40 1 40 38 1 4 4 2 o 2 4 2 2 noone 2 no_one 4 2 1 40 1 40 38 1 5 38 5 5 38 1 4 4 2 2 Hen 4 1 2 Wizard 4 1 1 2 38 0 5 38 4 4 3 2 player_db 2 plyrdb 2 pdb 38 5 4 2 2 A database containing all player names and aliases. 2 See `help $player_db' for more information. 38 5 4 2 0 589212 0 750670166 2 1 #42 permissions utilities 24 2 -1 -1 -1 1 -1 60 4 controls 2 173 -1 apply 38 173 -1 caller 2 173 -1 controls_prop controls_property 2 165 -1 0 4 5 2 4 5 2 5 5 2 5 4 2 0 1842 0 750665281 2 1 #43 gender utilities 16 38 -1 -1 -1 1 -1 77 8 set 2 165 -1 add 2 173 -1 get_pronoun 38 165 -1 get_conj*ugation 38 165 -1 _verb_plural 38 173 -1 _verb_singular 38 165 -1 _do 38 165 -1 pronoun_sub 2 173 -1 15 is_plural have be pronouns genders ps po pp pq pr psc poc ppc pqc prc 19 4 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 38 5 4 11 2 has 2 has 2 has 2 has 2 has 2 has 2 have 2 have 2 have 2 have 2 have 38 5 4 11 2 is 2 is 2 is 2 is 2 is 2 is 2 are 2 am 2 are 2 are 2 are 38 5 4 10 2 ps 2 po 2 pp 2 pq 2 pr 2 psc 2 poc 2 ppc 2 pqc 2 prc 38 5 4 10 2 neuter 2 male 2 female 2 either 2 Spivak 2 splat 2 plural 2 egotistical 2 royal 2 2nd 38 5 4 10 2 it 2 he 2 she 2 s/he 2 e 2 *e 2 they 2 I 2 we 2 you 38 5 4 10 2 it 2 him 2 her 2 him/her 2 em 2 h* 2 them 2 me 2 us 2 you 38 5 4 10 2 its 2 his 2 her 2 his/her 2 eir 2 h* 2 their 2 my 2 our 2 your 38 5 4 10 2 its 2 his 2 hers 2 his/hers 2 eirs 2 h*s 2 theirs 2 mine 2 ours 2 yours 38 5 4 10 2 itself 2 himself 2 herself 2 (him/her)self 2 eirself 2 h*self 2 themselves 2 myself 2 ourselves 2 yourself 38 5 4 10 2 It 2 He 2 She 2 S/He 2 E 2 *E 2 They 2 I 2 We 2 You 38 5 4 10 2 It 2 Him 2 Her 2 Him/Her 2 Em 2 H* 2 Them 2 Me 2 Us 2 You 38 5 4 10 2 Its 2 His 2 Her 2 His/Her 2 Eir 2 H* 2 Their 2 My 2 Our 2 Your 38 5 4 10 2 Its 2 His 2 Hers 2 His/Hers 2 Eirs 2 H*s 2 Theirs 2 Mine 2 Ours 2 Yours 38 5 4 10 2 Itself 2 Himself 2 Herself 2 (Him/Her)self 2 Eirself 2 H*self 2 Themselves 2 Myself 2 Ourselves 2 Yourself 38 5 5 38 4 4 1 2 Gender_Utilities 38 5 4 18 2 Defines the list of standard genders, the default pronouns for each, and routines for adding or setting pronoun properties on any gendered object. 2 2 Properties: 2 .genders -- list of standard genders 2 .pronouns -- list of pronoun properties 2 .ps .po .pp .pq .pr .psc .poc .ppc .pqc .prc 2 -- lists of pronouns for each of the standard genders 2 2 If foo is of gender this.gender[n], 2 then the default pronoun foo.p is this.p[n] 2 (where p is one of ps/po/pp/pq...) 2 2 Verbs: 2 :set(object,newgender) -- changes pronoun properties to match new gender. 2 :add(object[,perms[,owner]]) -- adds pronoun properties to object. 2 2 :get_pronoun (which,object) -- return pronoun for a given object 2 :get_conj*ugation(verbspec,object) -- return appropriately conjugated verb 38 5 4 2 0 14567 0 750669693 2 1 #44 time utilities 16 38 -1 -1 -1 1 -1 47 16 day 38 13 -1 month 38 13 -1 ampm 38 13 -1 to_seconds 38 173 -1 sun 38 173 -1 from_ctime 38 173 -1 dhms dayshoursminutesseconds 38 173 -1 english_time 38 173 -1 from_day 38 173 -1 from_month 38 173 -1 dst_midnight 38 173 -1 time_sub 38 173 -1 mmddyy ddmmyy 38 173 -1 parse_english_time_interval 38 173 -1 seconds_until_date 38 165 -1 seconds_until_time 38 165 -1 12 monthlens timezones stsd ctcd ct corr dayabbrs days months monthabbrs zones time_units 16 4 12 0 31 0 28 0 31 0 30 0 31 0 30 0 31 0 31 0 30 0 31 0 30 0 31 38 5 4 15 4 2 2 AuEST 0 -10 4 2 2 AuCST 0 -9 4 2 2 AuWST 0 -8 4 2 2 WET 0 -1 4 2 2 GMT 0 0 4 2 2 AST 0 4 4 2 2 EDT 0 4 4 2 2 EST 0 5 4 2 2 CDT 0 5 4 2 2 CST 0 6 4 2 2 MDT 0 6 4 2 2 MST 0 7 4 2 2 PDT 0 7 4 2 2 PST 0 8 4 2 2 HST 0 10 38 5 0 2427 38 5 0 7276 38 5 0 7934 38 5 0 -122 38 5 4 7 2 Sun 2 Mon 2 Tue 2 Wed 2 Thu 2 Fri 2 Sat 38 5 4 7 2 Sunday 2 Monday 2 Tuesday 2 Wednesday 2 Thursday 2 Friday 2 Saturday 38 5 4 12 2 January 2 February 2 March 2 April 2 May 2 June 2 July 2 August 2 September 2 October 2 November 2 December 38 5 4 12 2 Jan 2 Feb 2 Mar 2 Apr 2 May 2 Jun 2 Jul 2 Aug 2 Sep 2 Oct 2 Nov 2 Dec 38 5 4 5 4 2 4 4 2 est 2 edt 2 Massachusetts 2 MA 0 10800 4 2 4 2 2 cst 2 cdt 0 7200 4 2 4 2 2 mst 2 mdt 0 3600 4 2 4 5 2 pst 2 pdt 2 California 2 CA 2 Lambda 0 0 4 2 4 1 2 gmt 0 28800 38 5 4 7 4 4 0 31536000 2 year 2 years 2 yrs 4 5 0 2678400 2 month 2 months 2 mnths 2 mo 4 5 0 604800 2 week 2 weeks 2 wk 2 wks 4 5 0 86400 2 day 2 days 2 dy 2 dys 4 5 0 3600 2 hour 2 hours 2 hr 2 hrs 4 5 0 60 2 minute 2 minutes 2 min 2 mins 4 5 0 1 2 second 2 seconds 2 sec 2 secs 38 5 5 38 4 4 2 2 time utilities 2 time 38 5 4 30 2 Converting from seconds-since-1970 2 dhms (time) => string ...DD:HH:MM:SS 2 english_time (time[, reference time)=> string of y, m, d, m, s 2 2 Converting to seconds 2 to_seconds ("hh:mm:ss") => seconds since 00:00:00 2 from_ctime (ctime) => corresponding time-since-1970 2 from_day (day_of_week, which) => time-since-1970 for the given day* 2 from_month (month, which) => time-since-1970 for the given month* 2 (* the first midnight of that day/month) 2 parse_english_time_interval("n1 u1 n2 u2...") 2 => seconds in interval 2 seconds_until_time("hh:mm:ss") => number of seconds from now until then 2 seconds_until_date("month",day,"hh:mm:ss",flag 2 => number of seconds from now until then 2 (see verb help for details) 2 2 Converting to some standard English formats 2 day ([c]time) => what day it is 2 month ([c]time) => what month it is 2 ampm ([c]time[, precision]) => what time it is, with am or pm 2 mmddyy ([c]time) => date in format MM/DD/YY 2 ddmmyy ([c]time) => date in format DD/MM/YY 2 2 Substitution 2 time_sub (string, time) => substitute time information 2 2 Miscellaneous 2 sun ([time]) => angle between sun and zenith 2 dst_midnight (time) 38 5 4 2 0 26541 0 750668627 2 1 #45 Editor Help 16 38 -1 -1 -1 32 -1 30 0 43 summary edit-index emote say delete insert view depublish perish unpublish publish mode enter quit unsubscribe subscribe reply-to moo find edit compile save showlists subject to also-to who print send list next prev subst join fill move copy what abort done pause ranges cc 48 4 11 2 You are inside an editor. Do 2 2 look -- for list of commands 2 what -- to find out what you're editing. 2 list -- to list out some portion of the text 2 say / emote -- to add new text to whatever you're editing 2 2 help edit-index -- for a full list of editor help topics 2 help editors -- for a general discussion about editors 2 help moo -- for the general MOO help summary (i.e., what you get by 2 typing `help' with no arguments from outside the editor). 38 5 4 2 2 *index* 2 Editor Help Topics 38 5 4 19 2 Syntax: emote <text> 2 :<text> 2 2 (EDITOR) 2 Appends <text> to the end of the line before the insertion point. 2 The second form is equivalent to the first except that it doesn't strip leading blanks off of <text> (just as with the normal `emote' and `:' commands). 2 The insertion point is left unmoved. 2 2 >list . 2 _37_ Hello there 2 ^38^ Oh, I'm fine. 2 >:, how are you 2 Appended to line 37. 2 >:? 2 Appended to line 37. 2 >list . 2 _37_ Hello there, how are you? 2 ^38^ Oh, I'm fine. 2 38 5 4 17 2 Syntax: say <text> 2 "<text> 2 2 (EDITOR) 2 Adds <text> to whatever you are editing. 2 The second form is equivalent to the first except in that it doesn't strip leading blanks off of <text> (just as with the normal `say' and `"' commands). 2 2 The added text appears as a new line at the insertion point. The insertion point, in turn, gets moved so as to be after the added text. For example: 2 2 >"first line 2 Line 1 added. 2 >" second line" 2 Line 2 added. 2 >list 2 1: first line 2 __2_ second line" 2 ^^^^ 38 5 4 5 2 Syntax: del*ete [<range>] 2 2 (EDITOR) 2 Deletes the specified range of lines 2 <range> defaults to the line *before* the current insertion point. 38 5 4 21 2 Syntax: ins*ert [<ins>] ["<text>] 2 . (`.' == `insert' without arguments) 2 2 (EDITOR) 2 Many editor commands refer to an "insertion point" which is (usually) the place right below where the most recent line was inserted. The insertion point should really be thought of as sitting *between* lines. In listings, the line above the insertion point is marked with `_' while the one below is marked with `^'. 2 2 The `insert' command, when given an argument, sets the insertion point. 2 If <text> is provided, a new line will be created and inserted as with `say'. 2 <ins>, both here and in other commands that require specifying an insertion point (e.g., copy/move), can be one of 2 2 ^n above line n 2 n above line n 2 _n below line n 2 $ at the end 2 ^$ before the last line 2 n^$ n lines before the end 2 . the current insertion point (i.e., `insert .' is a no-op) 2 +n n lines below the current insertion point. 2 -n n lines above the current insertion point. 2 2 For the truly perverse, there are other combinations that also work due to artifacts of the parsing process, but these might go away... 38 5 4 10 2 Syntax: view <player> [<range>] [nonum] 2 view 2 2 Prints some subset of the specified player's text. 2 Said player must have previously made his text readable with `publish'. 2 <ranges> are specified as in other commands (see `help ranges'). 2 References to the insertion point refer to wherever the other player has set his/her insertion point; you have no control over it. 2 The default range is as in list. 2 2 If no arguments are given, this lists all of the players that have published anything in this editor. 38 5 4 2 2 *forward* 2 unpublish 38 5 4 2 2 *forward* 2 unpublish 38 5 4 5 2 Syntax: unpub*lish 2 depub*lish 2 perish 2 2 This command reverses the effects of `publish', making your text readable only by you. 38 5 4 6 2 Syntax: pub*lish 2 2 By default, only you (and wizards) can read the text you are editing. 2 This command makes your text readable by the entire world (see `help view'). 2 This is useful if you need help from someone or if you just want to show off your programming acumen. 2 Use `unpublish' to make your text private again. 38 5 4 12 2 (NOTE EDITOR) 2 Syntax: mode 2 mode string 2 mode list 2 2 There are (currently) two modes the note editor can be in. 2 One is string mode, in which if the text being edited is one line or less, 2 it will be saved as a single string (or an empty string) rather than as a list. 2 The other is list mode, in which text is always saved as a list of strings. 2 The mode is set when the text is first loaded (string mode if the text is a string, list mode otherwise), but can be changed using this command. 2 2 The first form above (i.e., without any arguments) reports the current mode. 38 5 4 12 2 Syntax: enter 2 2 (EDITOR) 2 Enters a sequence of lines at the insertion point (see `help insert'). 2 This is similar to .program in that every line you type after the `enter' command is inserted verbatim into the text until you type a line with a single period (`.') on it. This command is essentially for if you don't like the idea of putting " at the beginning of each line you type. The only exceptions, i.e., lines that are not entered verbatim (aside from the `.' line), are 2 2 - If you type a line whose sole text is `@abort', 2 that aborts this command without making any changes to the text. 2 - Any line whose first nonblank character is `.' and has additional text 2 is entered but with its first `.' stripped off. 2 2 Thus, to enter a line whose text is `@abort', you could enter it as `.@abort'. 38 5 4 7 2 Syntax: q*uit 2 done 2 pause 2 2 (EDITOR) 2 Leaves the editor. If you have unsaved text it will be there when you return (and in fact you will not be able to do anything else with this editor until you 'abort' or save the text). 2 38 5 4 9 2 Syntax: unsubscribe from <list-name> 2 unsubscribe <name>... from <list-name> 2 2 (MAILROOM) 2 Remove yourself from the given mailing list. 2 The second form removes arbitrary people from a mailing list. 2 You can only do this if you own whatever is being removed or you own the list. 2 2 Use the `who' command to determine if you are on a given mailing list. 38 5 4 11 2 Syntax: subscribe to <list-name> 2 subscribe [<name>...] to <list-name> 2 2 (MAILROOM) 2 Add yourself to the given mailing list. 2 The second form adds arbitrary people to a mailing list. 2 You can only do this if you own the list or if it is listed as [Public] and you own whatever is being added. 2 2 The first form of this command is probably obsolete since if <list-name> is public, you can already read it via `@mail on *<list-name>' and it's much better for the MOO if you do so. `@mail-option +sticky' makes this even easier. 2 2 Use the `who' command to determine if you are on a given mailing list. 38 5 4 11 2 Syntax: reply-to [<recipients>] 2 2 (MAIL ROOM) 2 Reports the current contents of the Reply-to: field of your message. 2 With arguments, adds (or changes) the Reply-to: field. 2 2 When someone @answers a message, the Reply-to: field is checked first when determining to whom the reply should be sent --- see `help @answer'. 2 2 To clear the Reply-to: field, do 2 2 reply-to "" 38 5 4 2 2 *pass* 2 38 5 4 9 2 Syntax: f*ind /<str>[/[c][<ins>]] 2 /<str>[/[c][<ins>]] 2 2 Searches for the first line after <ins> containing <str>. <ins> defaults to the current insertion point (see `help insert' for how to specify other places). With the first form, any character (not just `/') may be used as a delimiter. 2 For the second form, you must use '/'. 2 2 The 'c' flag, if given, indicates that case is to be ignored while searching. 2 2 [Bug: With the second form, there are problems if the search string contains quotes, backslashes or a run of spaces. The first whitespace will always be treated as a single space. Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'. Unfortunately it will not be possible to fix this until we get a new command parser.] 38 5 4 17 2 (VERB EDITOR) 2 Syntax: edit <object>:<verb> 2 2 Changes what verb you are editing and loads the code for that verb 2 into the editor. 2 Equivalent to @edit <object>:<verb>. 2 2 (NOTE EDITOR) 2 Syntax: edit <note-object> 2 edit <object>.<property> 2 2 Changes to a different note or a different object text property and 2 loads its text into the editor. 2 These are equivalent to @notedit <note> or @notedit <object>.<property> 2 respectively. 2 2 For both the verb-editor and note-editor commands, <object> will match on the room you came from, though if the room you came from was another editor, then all bets are off... 38 5 4 5 2 Syntax: compile [as <object>:<verb>] 2 2 (VERB EDITOR) 2 Installs the new program into the system if there are no syntax errors. 2 If a new object:verb is specified and actually turns out to exist, that <object>:<verb> becomes the default for subsequent compilations. 38 5 4 5 2 Syntax: save [<note-object>] 2 save [<object>.<property>] 2 2 (NOTE EDITOR) 2 Installs the freshly edited text. If <note> or <object>.<property> is specified, text is installed on that note or property instead of the original one. In addition the new note or property becomes the default for future save commands. 38 5 4 4 2 Syntax: showlists 2 2 (MAIL ROOM) 2 Print a list of the publically available mailing lists/archives and other non-player entities that can receive mail. 38 5 4 4 2 Syntax: subj*ect [<text>] 2 2 (MAIL ROOM) 2 Specifies a Subject: line for your message. If <text> is "", the Subject: line is removed. 38 5 4 6 2 Syntax: to [<recipients>] 2 2 (MAIL ROOM) 2 Specifies a new set of recipients (the To: line) for your message. 2 Recipient names not beginning with * are matched against the list of players. 2 Recipient names beginning with * are interpreted as mailing-lists/archives/other types of non-person addresses and are matched against all such publically available objects (see `help showlists'). If the list you want to use isn't in the database (i.e., isn't located in the database ($mail_agent)) you need to refer to it by object id. 38 5 4 7 2 Syntax: also-to [<recipients>] 2 2 Synonym: cc 2 2 (MAIL ROOM) 2 Adds additional recipients to the To: line of your message. 2 Same rules apply as for the `to' command. 38 5 4 7 2 Syntax: who 2 who <rcpt>... 2 2 (MAIL ROOM) 2 Invokes $mail_agent's mail-forwarding tracer and determines who (or what) is actually going to receive your message. The resulting list will not include destinations that will simply forward the message without :receive_message()'ing a copy for themselves. 2 2 The second form expands an arbitrary list of recipients, for if e.g., you're curious about the members of particular mailing list. 38 5 4 6 2 Syntax: pri*nt 2 2 Display your text without line numbers. 2 2 (MAIL ROOM) 2 Display your message including headers. 38 5 4 8 2 Syntax: send 2 2 (MAIL ROOM) 2 Send the message, then exit the mail room if all of the addresses on the To: line turn out to be valid and usable (you can use the `who' command to check these in advance, though the status of recipients may change without warning). 2 If the To: line turns out to contain invalid recipients or recipients that are not usable by you, the message will not be sent and you will remain in the mail room. 2 It may be, however, that valid addresses on your To: line will forward to other addresses that are bogus; you'll receive warnings about these, but in this case your message will still be delivered to those addresses that are valid. 2 2 Note that there may be particularly long delays when sending to recipients with large forwarding/notification lists or when sending on occasions when the MOO is heavily loaded in general. In such a case, it is possible to continue editing the message while the send is in progress; any such edits affect only the text in the editor. In particular, the text of the message currently being sent remains as it was when you first typed the send command. However, any editing will mark the text as "changed" meaning that you will need to explicitly `abort' or `quit' in order to leave the mail room even if the send concludes successfully. 38 5 4 8 2 Syntax: lis*t [<range>] [nonum] 2 2 Prints some subset of the current verb text. 2 The default range is some reasonable collection of lines around the current insertion point: currently this is 8_-8^, ie., 8 lines above the insertion point to 8 lines below it unless this runs up against the beginning or end of file, in which case we just take the first or last 16 lines, or just 1-$ if there aren't that many. (See `help ranges' for how to specify line numbers and ranges.) 2 2 `nonum' prints without line numbers. 2 2 Yes, window heights will be customizable some day. 38 5 4 4 2 Syntax: n*ext [n] ["<text>] 2 2 Moves the insertion point down n lines. If <text> is provided, inserts a new line there just like `say'. 2 Equivalent to `insert +n'. As one might expect, n defaults to 1. 38 5 4 4 2 Syntax: p*rev [n] ["<text>] 2 2 Moves the insertion point up n lines. If <text> is provided, a new line is inserted as with `say'. 2 Equivalent to `insert -n'. As one might expect, n defaults to 1. 38 5 4 13 2 Syntax: s*ubst/<str1>/<str2>[/[g][c][<range>]] 2 2 Substitutes <str2> for <str1>, in all of the lines of <range>. 2 Any character (not just `/') may be used to delimit the strings. 2 If <str1> is blank, <str2> is inserted at the beginning of the line. 2 (For inserting a string at the end of a line use emote/:). 2 2 Normally, only one substitution is done per line in the specified range, but if the 'g' flag is given, *all* instances of <str1> are replaced. 2 The 'c' flag indicates that case is not significant when searching for substitution instances. 2 <range> defaults to the line *before* the insertion point. 2 2 You do *not* need a space between the verb and the delimeter before <str1>. 2 [Bug: If you omit the space and the first whitespace in <str1> is a run of more than one space, those spaces get treated as one. Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'. The fix on this will have to wait for a new command parser.] 38 5 4 4 2 Syntax: join [<range>] 2 joinliteral [<range>] 2 2 combines the lines in the specified range. Normally, spaces are inserted and double space appears after periods and colons, but 'joinliteral' (abbreviates to 'joinl') supresses this and joins the lines as is. <range> defaults to the two lines surrounding the insertion point. 38 5 4 3 2 Syntax: fill [<range>] [@ c] 2 2 combines the specified lines as in join and then splits them so that no line is more than c characters (except in cases of pathological lines with very long words). c defaults to 70. <range> defaults to the single line preceding the insertion point. 38 5 4 6 2 Syntax: m*ove [<range>] to <ins> 2 2 Moves the range of lines to place specified by <ins>. 2 If <ins> happens to be the current insertion point, the insertion point is moved to the end of the freshly moved lines. If the range of lines contains the insertion point, the insertion point is carried over to the range's new location. 2 2 See `help insert' for a list of possibilities for <ins>. 38 5 4 7 2 Syntax: c*opy [<range>] to <ins> 2 2 Copies the specified range of lines to place given by <ins>. 2 If <ins> happens to be the current insertion point, the insertion 2 point moves to the end of the inserted lines. 2 2 See `help insert' for a list of possibilities for <ins>. 38 5 4 3 2 Syntax: w*hat 2 2 Prints information about the editing session. 38 5 4 3 2 Syntax: abort 2 2 Abandons this editing session and any changes. 38 5 4 2 2 *forward* 2 quit 38 5 4 2 2 *forward* 2 quit 38 5 4 20 2 Most editor commands act upon a particular range of lines. 2 Essentially, one needs to specify a first line and a last line. 2 Line numbers may be given in any of the following forms 2 2 n (i.e., the nth line of text) 2 n^ n-th line after/below the current insertion point 2 n_ n-th line before/above the current insertion point 2 n$ n-th line before the end. 2 2 In the latter three, n defaults to 1, so that `^' by itself refers to the line below the current (i.e., the line that gets `^' printed before it), and likewise for `_' while `$' refers to the last line. Note that the usage depends on whether you are specifying a line or an insertion point (space between lines). `^5' is the space above/before line 5, while `5^' is the fifth line after/below the current insertion point. 2 2 Ranges of lines may be specified in any of the 2 following ways: 2 2 <line> just that line 2 from <line> to <line> what it says; the following two forms are equivalent: 2 <line>-<line> 2 <line> <line> 2 2 With the `from l to l' form, either the from or the to can be left off and it will default to whatever is usual for that command (usually a line above or below the insertion point). Actually I was thinking of punting the `from'/`to' specifications entirely because they're so verbose. Opinions? 38 5 4 2 2 *forward* 2 also-to 38 5 5 38 5 5 38 4 4 1 2 Editor Help 38 5 0 0 38 5 4 2 0 20847 0 750669214 2 1 #46 Generic Mail Recipient 144 38 -1 -1 -1 1 36 43 33 set_aliases 38 173 -1 look_self 38 173 -1 is_writable_by 38 173 -1 is_readable_by 38 173 -1 is_usable_by 38 165 -1 mail_notify 38 173 -1 mail_forward 38 173 -1 moderator_forward 38 173 -1 add_forward 38 173 -1 delete_forward 38 173 -1 add_notify 38 173 -1 delete_notify 38 173 -1 receive_message 38 173 -1 ok 38 173 -1 ok_write 38 173 -1 parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_all_msgs exists_num_eq 38 173 -1 length_date_gt 38 173 -1 rm_message_seq 38 173 -1 undo_rmm expunge_rmm renumber 38 173 -1 own_messages_filter 38 173 -1 messages 38 173 -1 date_sort 38 173 -1 _fix_last_msg_date 38 173 -1 moderator_notify 38 173 -1 msg_summary_line 38 173 -1 __check 38 173 -1 __fix 2 173 -1 init_for_core 2 173 -1 initialize 2 173 -1 mail_name 38 173 -1 mail_names 38 173 -1 expire_old_messages 2 173 -1 moveto 38 173 -1 14 moderator_notify last_msg_date messages_going moderated moderator_forward writers readers mail_notify mail_forward expire_period last_used_time messages rmm_own_msgs guests_can_send_here 18 4 0 38 5 0 0 38 1 4 0 38 0 4 0 38 5 2 %n (%#) can't send to moderated list %t (%[#t]) directly. 38 5 4 0 38 5 4 0 38 5 4 0 38 1 2 %t (%[#t]) is a generic recipient. 38 1 0 2592000 38 5 0 0 38 1 4 0 38 0 0 0 38 5 0 0 38 5 5 38 4 4 1 2 Generic Mail Recipient 38 1 2 This can either be a mailing list or a mail folder, depending on what mood you're in... 38 5 4 2 0 17791 0 750669071 2 1 #47 Mail Distribution Center 16 38 -1 31 -1 1 -1 46 46 resolve_addr 38 173 -1 sends_to 38 173 -1 send_message 38 173 -1 raw_send 2 173 -1 mail_forward mail_notify 38 173 -1 touch 38 173 -1 look_self 38 173 -1 acceptable 38 173 -1 check_names 38 173 -1 match 38 173 -1 match_recipient 38 173 -1 match_failed 38 173 -1 make_message 38 173 -1 name 38 173 -1 name_list 38 173 -1 parse_address_field 38 173 -1 display_seq_full 2 173 -1 display_seq_headers 2 173 -1 rm_message_seq 2 165 -1 undo_rmm 2 173 -1 expunge_rmm list_rmm 2 173 -1 renumber 2 173 -1 msg_summary_line 38 173 -1 msg_summary_line(slow) 38 173 -1 parse_message_seq 2 173 -1 _parse_from _parse_to 38 173 -1 _parse_date 38 173 -1 new_message_num 2 173 -1 length_all_msgs 2 173 -1 length_date_le 2 173 -1 length_date_gt 2 173 -1 length_num_le 2 173 -1 exists_num_eq 2 173 -1 from_msg_seq 2 173 -1 %from_msg_seq 2 173 -1 to_msg_seq 2 173 -1 %to_msg_seq 2 173 -1 subject_msg_seq 2 173 -1 body_msg_seq 2 173 -1 messages_in_seq 2 173 -1 __convert_new 2 173 -1 to_text 38 173 -1 is_readable_by is_writable_by is_usable_by 38 173 -1 raw_send(new) 2 169 -1 reserved_pattern 38 173 -1 is_recipient 38 165 -1 3 options reserved_patterns total_recipients 7 4 11 2 include 2 noinclude 2 all 2 sender 2 nosubject 2 expert 2 enter 2 sticky 2 @mail 2 manymsgs 2 replyto 38 5 4 2 4 2 2 ^Petition:%|^Ballot:%|^P:%|^B: 1 33842 4 2 2 ^Dispute:%|^D: 1 223 38 1 4 10 0 47906 0 2662 0 511 0 174 0 75 0 30 0 25 0 9 0 12 0 94 38 5 5 38 4 4 2 2 Mail Distribution Center 2 Postmaster 38 5 4 5 2 This is the database of mailing-list/mail-folder objects. 2 The basic procedure for creating a new list/folder is to create a child of $mail_recipient (Generic Mail Recipient) assign it a suitable name&aliases, set a suitable .mail_forward/.mail_notify (or create suitable :mail_forward() and :mail_notify() verbs) and then teleport it here. 2 2 Avaliable aliases: 2 38 5 4 2 0 53086 0 750669068 2 1 #48 Mail Room 16 38 -1 -1 -1 51 -1 -1 25 working_on 38 165 -1 parse_invoke 38 173 -1 init_session 38 173 -1 pri*nt 38 25 -1 message_with_headers 38 173 -1 subj*ect: 38 89 -2 set_subject 38 173 -1 to*: 38 89 -2 also*-to: cc*: 38 89 -2 parse_recipients 38 173 -1 recipient_names 38 173 -1 make_message 38 173 -1 name_list 38 173 -1 parse_msg_headers 38 173 -1 check_answer_flags 38 173 -1 reply-to*: replyto*: 38 89 -2 send 2 9 -1 who 38 29 -1 showlists 38 25 -1 subsc*ribe 38 89 1 unsubsc*ribe 38 89 5 parse_msg_headers(slow) 38 173 -1 retain_session_on_exit 38 173 -1 no_littering_msg 38 173 -1 local_editing_info 38 173 -1 4 replytos recipients subjects sending 42 4 0 38 0 4 0 38 0 4 0 38 0 4 0 38 0 4 0 38 1 4 0 38 1 4 2 4 12 2 say 2 emote 2 lis*t 2 ins*ert 2 n*ext,p*rev 2 enter 2 del*ete 2 f*ind 2 s*ubst 2 m*ove,c*opy 2 join*l 2 fill 4 11 2 w*hat 2 subj*ect 2 to 2 also-to 2 reply-to 2 showlists,unsubscribe 2 who 2 pri*nt 2 send 2 abort 2 q*uit,done,pause 38 5 1 45 38 5 2 Message body is empty. 38 5 4 8 4 2 2 subj*ect 2 [<text>] 4 2 2 to 2 [<rcpt>..] 4 2 2 also-to 2 [<rcpt>..] 4 2 2 reply-to 2 [<rcpt>..] 4 2 2 who 2 [<rcpt>..] 4 2 2 pri*nt 2 4 2 2 send 2 4 2 2 showlists,unsubscribe 2 38 5 0 0 38 1 0 1 38 5 2 You need to either SEND it or ABORT it before you can start another message. 38 5 4 8 4 2 2 sending 0 0 4 2 2 replytos 4 0 4 2 2 recipients 4 0 4 2 2 subjects 2 4 2 2 texts 4 0 4 2 2 changes 0 0 4 2 2 inserting 0 1 4 2 2 readable 0 0 38 1 2 %N flattens out into a largish 29 cent postage stamp and floats away. 38 5 2 A largish 29 cent postage stamp floats into the room and fattens up into %n. 38 5 4 4 2 Saving your message so that you can finish it later. 2 To come back, give the `@send' command with no arguments. 2 Please come back and SEND or ABORT if you don't intend to be working on this 2 message in the immediate future. Keep Our MOO Clean! No Littering! 38 5 5 38 5 5 38 5 2 You're not editing anything! 38 5 4 0 38 0 4 0 38 1 4 0 38 0 4 0 38 0 4 0 38 1 2 %L [mailing] 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 1 38 5 4 0 38 4 1 -1 38 5 0 1570767528 38 5 5 38 4 5 38 5 5 38 5 5 38 4 4 1 2 Mail Room 38 5 5 38 5 4 2 0 31126 0 750668673 2 1 #49 Note Editor 16 38 -1 -1 -1 51 -1 48 11 e*dit 38 25 -1 save 38 25 -1 init_session 38 173 -1 working_on 38 173 -1 parse_invoke 38 173 -1 note_text 2 165 -1 set_note_text 2 165 -1 note_match_failed 38 173 -1 w*hat 38 9 -1 mode 38 25 -1 local_editing_info 38 173 -1 2 strmode objects 40 4 0 38 1 4 0 38 5 4 0 38 1 4 0 38 1 4 2 4 12 2 say 2 emote 2 lis*t 2 ins*ert 2 n*ext,p*rev 2 enter 2 del*ete 2 f*ind 2 s*ubst 2 m*ove,c*opy 2 join*l 2 fill 4 6 2 w*hat 2 mode 2 e*dit 2 save 2 abort 2 q*uit,done,pause 38 5 1 45 38 5 2 Note is devoid of text. 38 5 4 3 4 2 2 e*dit 2 <note> 4 2 2 save 2 [<note>] 4 2 2 mode 2 [string|list] 38 5 0 0 38 1 5 38 5 2 You need to ABORT or SAVE this note before editing any other. 38 5 4 6 4 2 2 strmode 0 0 4 2 2 objects 0 0 4 2 2 texts 0 0 4 2 2 changes 0 0 4 2 2 inserting 0 1 4 2 2 readable 0 0 38 1 2 A small swarm of 3x5 index cards arrives, engulfs %n, and carries %o away. 38 5 2 A small swarm of 3x5 index cards blows in and disperses, revealing %n. 38 5 4 3 2 Partially edited text will be here when you get back. 2 To return, give the `@notedit' command with no arguments. 2 Please come back and SAVE or ABORT if you don't intend to be working on this text in the immediate future. Keep Our MOO Clean! No Littering! 38 5 2 Note has not been modified since the last save. 38 5 2 There are changes. 38 5 2 Use the EDIT command to select a note. 38 5 4 0 38 0 4 0 38 1 4 0 38 0 4 0 38 0 4 0 38 1 2 %L [editing notes] 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 1 38 5 4 0 38 4 1 -1 38 5 0 1141642826 38 5 4 0 38 4 5 38 5 5 38 5 5 38 4 4 2 2 Note Editor 2 nedit 38 5 5 38 5 4 2 0 18255 0 750668592 2 1 #50 Verb Editor 16 38 -1 -1 -1 51 -1 49 10 e*dit 38 25 -1 com*pile 38 73 -2 working_on 38 173 -1 init_session 38 173 -1 parse_invoke 38 173 -1 fetch_verb_code 2 165 -1 set_verb_code 2 165 -1 local_editing_info 2 173 -1 verb_name 2 165 -1 verb_args 2 165 -1 2 objects verbnames 40 4 0 38 0 4 0 38 0 4 0 38 1 4 0 38 1 4 2 4 12 2 say 2 emote 2 lis*t 2 ins*ert 2 n*ext,p*rev 2 enter 2 del*ete 2 f*ind 2 s*ubst 2 m*ove,c*opy 2 join*l 2 fill 4 5 2 w*hat 2 e*dit 2 com*pile 2 abort 2 q*uit,done,pause 38 5 1 45 38 5 2 Verb body is empty. 38 5 4 2 4 2 2 e*dit 2 <obj>:<verb> 4 2 2 com*pile 2 [as <obj>:<verb>] 38 5 0 0 38 1 5 38 5 2 You need to either COMPILE or ABORT this verb before you can start on another. 38 5 4 6 4 2 2 objects 0 0 4 2 2 verbnames 0 0 4 2 2 texts 0 0 4 2 2 changes 0 0 4 2 2 inserting 0 1 4 2 2 readable 0 0 38 1 2 You hear the bips of keyclick, the sliding of mice and the hum of computers in the distance as %n fades slowly out of view, heading towards them. 38 5 2 There are the light bips of keyclick and the sliding of mice as %n fades into view, shoving %r away from the console, which promptly fades away. 38 5 4 3 2 Keeping your verb for later work. 2 To return, give the `@edit' command with no arguments. 2 Please come back and COMPILE or ABORT if you don't intend to be working on this verb in the immediate future. Keep Our MOO Clean! No Littering! 38 5 2 The verb has no pending changes. 38 5 2 You have changed the verb since last successful compile. 38 5 2 First, you have to select a verb to edit with the EDIT command. 38 5 4 0 38 0 4 0 38 1 4 0 38 0 4 0 38 0 4 0 38 1 2 %L [editing verbs] 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 1 38 5 4 0 38 4 1 -1 38 5 0 472956876 38 5 4 0 38 4 5 38 5 5 38 5 5 38 4 4 4 2 Verb Editor 2 vedit 2 verbedit 2 verb edit 38 5 5 38 5 4 2 0 22976 0 750668212 2 1 #51 Generic Editor 144 38 -1 -1 -1 3 50 11 66 say 38 93 -2 emote 38 93 -2 enter 38 25 -1 lis*t view 38 89 -2 ins*ert n*ext p*revious . 38 25 -1 del*ete 38 89 -2 f*ind 38 93 -2 s*ubst 38 93 -2 m*ove c*opy 38 89 -2 join*literal 38 89 -2 fill 38 89 -2 pub*lish perish unpub*lish depub*lish 38 9 -1 w*hat 38 13 -1 abort 38 9 -1 done q*uit pause 38 13 -1 huh2 2 173 -1 insertion 38 173 -1 set_insertion 38 173 -1 changed retain_session_on_exit 38 173 -1 set_changed 38 173 -1 origin 38 173 -1 set_origin 38 173 -1 readable 38 173 -1 set_readable 38 173 -1 text 38 165 -1 load 38 173 -1 working_on 38 173 -1 ok 38 173 -1 loaded 38 173 -1 list_line 38 173 -1 insert_line 38 173 -1 append_line 38 173 -1 join_lines 38 173 -1 parse_number 38 173 -1 parse_range 38 173 -1 parse_insert 38 173 -1 parse_subst 38 173 -1 invoke 38 173 -1 suck_in 38 173 -1 new_session 2 173 -1 kill_session 2 173 -1 reset_session 2 173 -1 kill_all_sessions 2 173 -1 acceptable 38 173 -1 enterfunc 38 173 -1 exitfunc 38 173 -1 @flush 38 105 -2 @stateprop 38 153 11 @rmstateprop 38 153 5 initialize 38 173 -1 init_for_core 2 173 -1 set_stateprops 38 165 -1 description 38 173 -1 commands_info 38 173 -1 match_object 38 173 -1 who_location_msg 38 165 -1 nothing_loaded_msg no_text_msg change_msg no_change_msg no_littering_msg depart_msg return_msg previous_session_msg 38 173 -1 announce announce_all announce_all_but tell_contents 38 173 -1 fill_string 38 173 -1 here_huh 38 173 -1 match 2 173 -1 get_room 38 173 -1 invoke_local_editor 2 173 -1 _stateprop_length 2 173 -1 print 2 9 -1 accept 38 173 -1 21 readable times commands2 help no_text_msg commands invoke_task exit_on_abort previous_session_msg stateprops depart_msg return_msg no_littering_msg no_change_msg change_msg nothing_loaded_msg texts active changes inserting original 38 4 0 38 1 4 0 38 1 4 2 4 11 2 say 2 emote 2 lis*t 2 ins*ert 2 n*ext,p*rev 2 del*ete 2 f*ind 2 s*ubst 2 m*ove,c*opy 2 join*l 2 fill 4 3 2 w*hat 2 abort 2 q*uit,done,pause 38 5 1 45 38 5 2 There are no lines of text. 38 5 4 15 4 2 2 say 2 <text> 4 2 2 emote 2 <text> 4 2 2 lis*t 2 [<range>] [nonum] 4 2 2 ins*ert 2 [<ins>] ["<text>] 4 2 2 n*ext,p*rev 2 [n] ["<text>] 4 2 2 del*ete 2 [<range>] 4 2 2 f*ind 2 /<str>[/[c][<range>]] 4 2 2 s*ubst 2 /<str1>/<str2>[/[g][c][<range>]] 4 2 2 m*ove,c*opy 2 [<range>] to <ins> 4 2 2 join*l 2 [<range>] 4 2 2 fill 2 [<range>] [@<col>] 4 2 2 w*hat 2 4 2 2 abort 2 4 2 2 q*uit,done,pause 2 4 2 2 enter 2 38 5 0 0 38 1 0 0 38 5 2 38 5 4 4 4 2 2 texts 0 0 4 2 2 changes 0 0 4 2 2 inserting 0 1 4 2 2 readable 0 0 38 1 2 %N heads off to the Generic Editing Room. 38 5 2 %N comes back from the Generic Editing Room. 38 5 2 Keeping your [whatever] for later work. Since this the Generic Editor, you have to do your own :set_changed(0) so that we'll know to get rid of whatever it you're working on when you leave. Please don't litter... especially in the Generic Editor. 38 5 2 There have been no changes since the last save. 38 5 2 Text has been altered since the last save. 38 5 2 You're not currently editing anything. 38 5 4 0 38 0 4 0 38 1 4 0 38 0 4 0 38 0 4 0 38 1 2 %L [editing] 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 1 38 5 4 0 38 4 1 13310 38 5 0 1308305860 38 5 5 38 4 5 38 5 5 38 5 5 38 4 4 3 2 Generic Editor 2 gedit 2 edit 38 5 4 0 38 5 4 2 0 51150 0 750668204 2 1 #52 matching utilities 16 38 -1 -1 -1 1 -1 54 6 match 38 173 -1 match_nth 38 173 -1 match_verb 2 173 -1 match_list 38 173 -1 parse_ordinal_reference parse_ordref 38 173 -1 parse_possessive_reference 38 173 -1 3 ordn ordw ordinal_regexp 7 4 10 2 first 2 second 2 third 2 fourth 2 fifth 2 sixth 2 seventh 2 eighth 2 ninth 2 tenth 38 5 4 10 2 1st 2 2nd 2 3rd 2 4th 2 5th 2 6th 2 7th 2 8th 2 9th 2 10th 38 5 2 %<%(first%|second%|third%|fourth%|fifth%|sixth%|seventh%|eighth%|ninth%|tenth%|1st%|2nd%|3rd%|4th%|5th%|6th%|7th%|8th%|9th%|10th%)%> 38 5 5 38 4 4 1 2 matching utilities 38 5 5 38 5 4 2 0 8330 0 750666659 2 1 #53 object utilities 16 2 -1 -1 -1 1 -1 44 25 has_property 2 165 -1 all_properties 2 165 -1 has_verb 2 165 -1 has_callable_verb 2 165 -1 all_verbs 2 165 -1 match_verb 2 165 -1 isa 38 173 -1 ancestors 38 173 -1 descendants descendents 38 173 -1 descendants_suspended descendents_suspended 2 173 -1 ordered_descendants 38 173 -1 branches 38 173 -1 branches_suspended 2 173 -1 leaves 38 173 -1 leaves_suspended 2 173 -1 contains 38 173 -1 all_contents 38 173 -1 findable_properties 2 173 -1 owned_properties 2 173 -1 property_conflicts 2 165 -1 descendants_with_property_suspended 2 165 -1 locations 2 173 -1 all_properties_suspended 2 165 -1 connected 38 165 -1 isoneof 38 173 -1 0 4 5 2 4 4 1 2 object utilities 2 5 4 26 2 These routines are useful for finding out information about individual objects. 2 2 Examining everything an object has defined on it: 2 all_verbs (object) => like it says 2 all_properties (object) => likewise 2 findable_properties(object) => tests to see if caller can "find" them 2 owned_properties (object[, owner]) => tests for ownership 2 2 Investigating inheritance: 2 ancestors(object[,object...]) => all ancestors 2 descendants (object) => all descendants 2 ordered_descendants(object) => descendants, in a different order 2 leaves (object) => descendants with no children 2 branches (object) => descendants with children 2 isa (object,class) => true iff object is a descendant of class (or ==) 2 2 Considering containment: 2 contains (obj1, obj2) => Does obj1 contain obj2 (nested)? 2 all_contents (object) => return all the (nested) contents of object 2 2 Verifying verbs and properties: 2 has_property(object,pname) => false/true according as object.(pname) exists 2 has_verb (object,vname) => false/{#obj} according as object:(vname) exists 2 has_callable_verb => same, but verb must be callable from a program 2 match_verb (object,vname) => false/{location, newvname} 2 (identify location and usable name of verb) 2 5 4 2 0 14459 0 750666798 2 1 #54 lock utilities 16 2 -1 -1 -1 1 -1 28 11 init_scanner 2 173 -1 scan_token 2 173 -1 canonicalize_spaces 2 173 -1 parse_keyexp 2 173 -1 parse_E 2 173 -1 parse_A 2 173 -1 eval_key 2 173 -1 match_object 2 173 -1 unparse_key 2 173 -1 eval_key_new 2 173 -1 parse_A_new 2 173 -1 4 player input_index input_length input_string 8 1 49888 2 5 0 3 2 5 0 2 2 5 2 me 2 5 5 2 4 4 1 2 lock utilities 2 5 5 2 5 4 2 0 9518 0 750666718 2 1 #55 generic letter 144 2 -1 -1 -1 9 -1 -1 3 burn 2 41 -1 burn_succeeded_msg oburn_succeeded_msg burn_failed_msg oburn_failed_msg 2 173 -1 do_burn 2 165 -1 4 oburn_succeeded_msg oburn_failed_msg burn_failed_msg burn_succeeded_msg 19 2 stares at %t; %[tps] bursts into flame and disappears, leaving no ash. 2 5 0 0 2 5 2 %T might be damp. In any case, %[tps] won't burn. 2 5 2 %T burns with a smokeless flame and leaves no ash. 2 5 5 2 5 5 38 4 5 38 5 5 2 5 5 2 5 5 2 5 5 2 5 5 38 5 5 38 5 5 38 5 2 This is a private letter. 38 5 5 38 4 4 1 2 generic letter 38 5 2 Some writing on the letter explains that you should 'read letter', and when you've finished, 'burn letter'. 38 5 4 2 0 1793 0 750666085 2 1 #56 list utilities 16 38 -1 -1 -1 1 -1 5 30 make 38 173 -1 range 38 173 -1 map_prop*erty 2 173 -1 map_verb 2 173 -1 map_arg 2 173 -1 map_builtin 2 173 -1 find_insert 38 173 -1 remove_duplicates 38 173 -1 arrayset 38 173 -1 setremove_all 38 173 -1 append 38 173 -1 reverse 38 173 -1 _reverse 38 173 -1 compress 38 173 -1 sort 38 173 -1 sort_suspended 2 173 -1 slice 38 173 -1 assoc 38 165 -1 iassoc 38 165 -1 iassoc_suspended 2 165 -1 assoc_prefix 38 173 -1 iassoc_prefix 38 173 -1 iassoc_sorted 38 173 -1 sort_alist 38 173 -1 sort_alist_suspended 2 173 -1 randomly_permute 38 173 -1 count 2 173 -1 flatten 38 173 -1 longest shortest 38 173 -1 check_nonstring_tell_lines 38 173 -1 1 nonstring_tell_lines 5 4 0 38 1 5 38 4 4 1 2 list_utilities 38 5 4 31 2 append (list,list,..) => result of concatenating the given lists 2 reverse (list) => reversed list 2 remove_duplicates (list) => list with all duplicates removed 2 compress (list) => list with consecutive duplicates removed 2 setremove_all (list,elt) => list with all occurrences of elt removed 2 find_insert (sortedlist,e) => index of first element > e in sortedlist 2 sort (list[,keys]) => sorted list 2 count (elt,list) => count of elt found in list. 2 flatten (list) => flatten all recursive lists into one list 2 2 make (n[,e]) => list of n copies of e 2 range (m,n) => {m,m+1,...,n} 2 2 arrayset (list,val,i[,j,k...]) => array modified so that list[i][j][k]==val 2 2 -- Mapping functions (take a list and do something to each element): 2 2 map_prop ({o...},prop) => list of o.(prop) for all o 2 map_verb ({o...},verb[,args) => list of o:(verb)(@args) for all o 2 map_arg ([n,]obj,verb,{a...},args) => list of obj:(verb)(a,@args) for all a 2 2 -- Association list functions -- 2 2 An association list (alist) is a list of pairs (2-element lists), though the following functions have been generalized for lists of n-tuples (n-element lists). In each case i defaults to 1. 2 2 assoc (targ,alist[,i]) => 1st tuple in alist whose i-th element is targ 2 iassoc (targ,alist[,i]) => index of same. 2 assoc_prefix (targ,alist[,i]) => ... whose i-th element has targ as a prefix 2 iassoc_prefix(targ,alist[,i]) => index of same. 2 slice (alist[,i]) => list of i-th elements 2 sort_alist (alist[,i]) => alist sorted on i-th elements. 38 5 4 2 0 22960 0 750665820 2 1 #57 command utilities 16 2 -1 -1 -1 1 -1 56 18 object_match_failed 2 173 -1 player_match_result player_match_failed 2 173 -1 read 2 165 -1 read_lines 2 165 -1 yes_or_no 2 165 -1 read_lines_escape 2 173 -1 suspend 2 173 -1 running_out_of_time 38 173 -1 suspend_if_needed 2 173 -1 dump_lines 38 173 -1 explain_syntax 2 173 -1 do_huh 2 165 -1 suspend_database_add 2 173 -1 suspend_database_remove 2 173 -1 suspend_database_cleanup 2 173 -1 task_info 2 173 -1 suspend_database_display 2 173 -1 init_for_core 2 173 -1 1 suspend_database 5 4 0 2 0 5 2 4 5 2 5 4 31 2 $command_utils is the repository for verbs that are of general usefulness to authors of all sorts of commands. For more details about any of these verbs, use `help $command_utils:<verb-name>'. 2 2 Detecting and Handling Failures in Matching 2 ------------------------------------------- 2 :object_match_failed(match_result, name) 2 Test whether or not a :match_object() call failed and print messages if so. 2 :player_match_failed(match_result, name) 2 Test whether or not a :match_player() call failed and print messages if so. 2 :player_match_result(match_results, names) 2 ...similar to :player_match_failed, but does a whole list at once. 2 2 Reading Input from the Player 2 ----------------------------- 2 :read() -- Read one line of input from the player and return it. 2 :yes_or_no([prompt]) 2 -- Prompt for and read a `yes' or `no' answer. 2 :read_lines() -- Read zero or more lines of input from the player. 2 :dump_lines(lines) 2 -- Return list of lines quoted so that feeding them to 2 :read_lines() will reproduce the original lines. 2 2 Utilities for Suspending 2 ------------------------ 2 :running_out_of_time() 2 -- Return true if we're low on ticks or seconds. 2 :suspend_if_needed(time) 2 -- Suspend (and return true) if we're running out of time. 2 2 Client Support for Lengthy Commands 2 ----------------------------------- 2 :suspend(args) -- Handle PREFIX and SUFFIX for clients in long commands. 2 5 4 2 0 24431 0 750665769 2 1 #58 generic wizard 16 2 -1 -1 -1 59 2 38 30 @chown 2 81 -2 @shout 2 89 -2 @grant @grants* @transfer 2 89 1 @programmer 2 25 -1 make-core-database 2 25 -1 @shutdown 2 89 -2 @dump-d*atabase 2 9 -1 @who-calls 2 89 -2 mcd_2 2 13 -1 @toad @toad! @toad!! 2 89 -2 @untoad @detoad 2 89 -2 @quota 2 81 12 @players 2 89 -2 kill_aux_wizard_parse 2 173 -1 @grepcore @egrepcore 2 89 -2 @net-who @@who 2 89 -2 @make-player 2 89 -2 @abort-sh*utdown 2 89 -2 toad_msg toad_victim_msg programmer_msg programmer_victim_msg newt_msg newt_victim_msg 2 173 -1 moveto 2 165 -1 @newt 2 17 -1 @unnewt @denewt @get-better 2 81 -2 @register 2 89 -2 @new-password @newpassword 2 89 12 @log 2 89 -2 @guests 2 25 -1 @rn mail_catch_up check_mail_lists current_message set_current_message get_current_message make_current_message kill_current_message 2 13 -1 @blacklist @graylist @redlist @unblacklist @ungraylist @unredlist @spooflist @unspooflist 2 89 -2 @corify 2 81 13 @make-guest 2 25 -1 8 newt_victim_msg newt_msg public_identity programmer_msg programmer_victim_msg toad_victim_msg toad_msg mail_identity 70 2 2 5 2 %n @newts %d (%[#d]) 2 5 1 -1 2 5 2 %d is now a programmer. 2 5 2 You are now a programmer. 2 5 2 Have a nice life... 2 5 2 %n @toads %d (%[#d]) 2 5 1 -1 2 4 5 38 1 5 2 5 5 2 5 5 2 5 5 2 5 5 38 1 5 2 0 5 2 5 5 2 0 5 2 1 1 25 2 5 5 2 5 5 38 1 5 38 1 5 38 0 5 38 1 5 2 5 5 2 1 5 38 1 5 2 4 5 2 0 5 2 0 5 2 5 5 2 4 5 2 5 5 2 4 5 2 4 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 4 5 2 4 5 2 1 5 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 1 11 2 5 2 really impossible password to type 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 1 5 2 4 5 2 4 4 1 2 player 2 1 2 You see a wizard who chooses not to reveal its true appearance. 2 5 4 2 0 75799 0 750665764 2 1 #59 generic programmer 144 2 -1 -1 -1 4 58 -1 29 @prop*erty 2 81 -2 @chmod 2 81 -2 @args 2 81 -2 eval*-d 2 81 -2 @rmprop*erty 2 81 -2 @verb 2 81 -2 @rmverb 2 17 -1 @list 2 81 -2 @forked 2 17 -1 @kill 2 17 -1 @edit 38 89 -2 @copy @copy-x 2 81 1 _kill_task_message 2 173 -1 @prog*ram 2 81 -2 @setenv 2 81 -2 @pros*pectus pros*pectus 2 85 -2 @d*isplay 2 17 -1 @db*size 2 9 -1 @gethelp 2 85 -2 @grep @egrep 2 81 -2 @s*how 2 89 -2 @check-p*roperty 2 17 -1 set_eval_env 2 165 -1 @clearp*roperty @clprop*erty 2 17 -1 @disown @disinherit 2 89 -2 eval_cmd_string 2 173 -1 @dump 2 81 -2 #* 2 89 -2 eval_value_to_string 2 173 -1 4 eval_subs eval_time eval_ticks eval_env 62 4 0 38 1 0 0 2 5 0 0 2 5 2 2 5 5 2 5 5 38 1 5 2 0 5 2 5 5 2 0 5 2 1 4 4 1 24 1 30 1 22 1 23 2 5 5 2 5 5 38 1 5 38 1 5 38 0 5 38 1 5 2 5 5 2 1 5 38 1 5 2 4 5 2 0 5 2 0 5 2 5 5 2 4 5 2 5 5 2 4 5 2 4 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 4 5 2 4 5 2 1 0 0 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 1 11 2 5 5 2 0 5 2 5 5 2 5 5 2 5 5 2 5 5 2 5 5 2 1 5 2 4 5 2 4 4 2 2 generic 2 programmer 2 1 2 You see a player who is too experienced to have any excuse for not having a description. 2 5 4 2 0 66107 0 750665750 2 1 #60 code utilities 16 38 -1 -1 -1 1 -1 57 48 eval_d 2 85 -2 1 2 165 -1 tonum 38 173 -1 toobj 38 173 -1 toerr 38 173 -1 error_name 38 173 -1 show_object 2 165 -1 show_property 2 165 -1 show_verbdef 2 165 -1 explain_verb_syntax 2 173 -1 verb_p*erms verb_permi*ssions 2 173 -1 verb_loc*ation 38 173 -1 verb_documentation 2 165 -1 set_verb_documentation 2 173 -1 parse_propref 2 173 -1 parse_verbref 2 173 -1 parse_argspec 38 173 -1 prepositions 38 173 -1 short_prep 38 173 -1 full_prep 38 173 -1 get_prep 38 165 -1 _fix_preps 38 165 1 find_verb_named 2 165 -1 find_last_verb_named 2 165 -1 find_callable_verb_named 2 165 -1 verbname_match(new) 38 173 -1 find_verbs_containing 2 173 -1 _find_verbs_containing 2 165 -1 find_verbs_matching 2 173 -1 _find_verbs_matching 2 165 -1 _grep_verb_code 2 165 -1 _egrep_verb_code 2 165 -1 _parse_audit_args 38 173 -1 help_db_list 2 165 -1 help_db_search 38 165 -1 corify_object 38 165 -1 substitute 2 173 -1 inside_quotes 2 173 -1 verb_or_property 2 165 -1 task_valid 2 165 -1 task_owner 2 173 -1 argstr 2 173 -1 verbname_match 38 173 -1 show_who_listing 2 165 -1 _egrep_verb_code_all 2 173 -1 _grep_verb_code_all 2 173 -1 _grep_verb_code_all 38 173 -1 verb_usage 2 165 -1 10 prepositions _version _multi_preps _other_preps_n _other_preps _short_preps _all_preps builtin_props error_names error_list 14 4 15 2 with/using 2 at/to 2 in front of 2 in/inside/into 2 on top of/on/onto/upon 2 out of/from inside/from 2 over 2 through 2 under/underneath/beneath 2 behind 2 beside 2 for/about 2 is 2 as 2 off/off of 38 5 2 1.7.6 38 5 4 7 2 off 2 from 2 out 2 on 2 on top 2 in 2 in front 38 5 4 13 0 1 0 2 0 4 0 4 0 5 0 5 0 5 0 6 0 6 0 9 0 9 0 12 0 15 38 5 4 13 2 using 2 at 2 inside 2 into 2 on top of 2 onto 2 upon 2 out of 2 from inside 2 underneath 2 beneath 2 about 2 off of 38 5 4 15 2 with 2 to 2 in front of 2 in 2 on 2 from 2 over 2 through 2 under 2 behind 2 beside 2 for 2 is 2 as 2 off 38 5 4 28 2 with 2 using 2 at 2 to 2 in front of 2 in 2 inside 2 into 2 on top of 2 on 2 onto 2 upon 2 out of 2 from inside 2 from 2 over 2 through 2 under 2 underneath 2 beneath 2 behind 2 beside 2 for 2 about 2 is 2 as 2 off 2 off of 38 5 4 9 2 name 2 r 2 w 2 f 2 programmer 2 wizard 2 owner 2 location 2 contents 2 1 4 15 2 E_NONE 2 E_TYPE 2 E_DIV 2 E_PERM 2 E_PROPNF 2 E_VERBNF 2 E_VARNF 2 E_INVIND 2 E_RECMOVE 2 E_MAXREC 2 E_RANGE 2 E_ARGS 2 E_NACC 2 E_INVARG 2 E_QUOTA 38 5 4 15 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3 10 3 11 3 12 3 13 3 14 38 5 5 38 4 4 2 2 code 2 utils 38 5 4 45 2 parse_propref("foo.bar") => {"foo","bar"} (or 0 if arg. isn't a property ref.) 2 parse_verbref("foo:bar") => {"foo","bar"} (or 0 if arg. isn't a verb ref.) 2 parse_argspec("any","in","front","of","this","baz"...) 2 => {{"any", "in front of", "this"},{"baz"...}} 2 (or string if args don't parse) 2 2 tonum(string) => number (or E_TYPE if string is not a number) 2 toobj(string) => object (or E_TYPE if string is not an object) 2 toerr(number or string) => error value (or 1 if out of range or unrecognized) 2 error_name(error value) => name of error (e.g., error_name(E_PERM) => "E_PERM") 2 2 verb_perms() => the current task_perms (as set by set_task_perms()). 2 verb_location() => the object where the current verb is defined. 2 verb_documentation([object,verbname]) => documentation at beginning of 2 verb code, if any -- default is the calling verb 2 2 Preposition routines 2 2 prepositions() => full list of prepostions 2 full_prep ("in") => "in/inside/into" 2 short_prep("into") => "in" 2 short_prep("in/inside/into") => "in" 2 get_prep ("off", "of", "the", "table") => {"off of", "the", "table"} 2 2 Verb routines 2 2 verbname_match (fullname,name) => can `name' be used to call `fullname' 2 find_verb_named (object,name[,n]) => verb number or -1 if not found 2 find_callable_verb_named (object,name[,n]) => verb number or -1 if not found 2 find_verbs_containing (pattern[,object|objlist]) 2 2 Verbs that do the actual dirty work for @show: 2 2 show_object (object) 2 show_property(object,propname) 2 show_verbdef (object,verbname) 2 2 Dirty work for explain_syntax 2 2 explain_verb_syntax(thisname,verbname,@verbargs) 2 2 A random but useful verb 2 2 verb_or_property(object,name[,@args]) => result of verb or property call, 2 or E_PROPNF 38 5 4 2 0 52654 0 750665678 2 1 #61 Help Database 16 38 -1 -1 -1 32 -1 45 8 player_quota 2 173 -1 prog_quota 2 173 -1 get_topic 2 165 -1 find_topics 2 165 -1 full_index 38 173 -1 index_list 38 165 -1 wizard_list 2 165 -1 dump_topic 38 173 -1 175 @locations @uptime @mailoptions @sort-owned @verify-owned @add-owned @mail-options wizard-list @wrap full-index index gen-index mail-forwarding @pagelength @more programming @forward @subscribe @rn @unsubscribe @skip negative_quota zombie-messages message-sequences common_quota @recreate @linelength room-messages @unrmmail @gaglist :: @comment @remove-entrance @remove-exit @parents @contents spoofing privacy @realm @resident @examine security @sweep @paranoid @check @reply @eject @quit whereis @suggest @idea @bug @typo @renumber @notedit editors @prev @unlock_for_open @lock_for_open @opacity container-messages @memory " : @lastlog @version miscellaneous insert information ? put remove burn letters decrypt encrypt delete erase write read examine hand key-representation keys @unlock @lock locking thing-messages throw take @messages pronouns exit-messages messages descriptions @describe @add-entrance @add-exit topology @classes @audit @count @quota @create tinymud @next @answer @rmmail @read @send mail @gripe creation @mail @listgag @ungag @gag go @password @sethome @who introduction give news gagging @dig @move inventory @entrances @exits @gender @recycle @rename containers notes look drop get manipulation help rooms movement home communication say whisper page emote building players summary @edit-options @editoptions @add-feature @remove-feature @features features @dump me @rmalias @addalias commands name alias @setprop @set @peek @subscribed @request-character player-names @registerme @netforward @eject! gopher 180 4 7 2 Syntax: @locations object 2 2 Prints out the names and object numbers of all containing objects. 2 2 Example: 2 @locations ur-Rog 2 ur-Rog(#6349) ur-Rog's Display Case(#6355) Editorial Boardroom(#5747) 38 5 4 4 2 Syntax: @uptime 2 2 The @uptime command displays the amount of time since the last restart of the server. 2 Note to programmers: The last restart time of the server is stored in $last_restart_time. 38 5 4 2 2 *forward* 2 @mail-options 38 1 4 3 2 Syntax: @sort-owned 2 2 Sorts your .owned_objects property so @audit shows up sorted. See help @audit for more information. 38 5 4 3 2 Syntax: @verify-owned 2 2 Checks that all the objects in your .owned_objects property are actually owned by you, and effects repairs if needed. See help @audit for more information. 38 5 4 3 2 Syntax: @add-owned <object> 2 2 Adds an object to your .owned_objects property in case it managed not to get updated properly upon creation of that object. Checks to ensure that the objects is really owned by you and otherwise belongs in your .owned_objects property. See help @audit for more information. 38 5 4 55 2 Syntax: @mail-option 2 @mail-option <option> 2 2 Synonym: @mailoption 2 2 The first form displays all of your mail options 2 The second displays just that one option, which may be either `@mail', `replyto', or one of the flags listed below. The mail options control various annoying details of your mail reading and mail editing commands. 2 2 The remaining forms of this command are for setting your mail options: 2 2 @mail-option +<flag> 2 @mail-option -<flag> 2 @mail-option !<flag> (equivalent to -<flag>) 2 2 These respectively set and reset the specified flag 2 2 -include @reply's start out with a blank message body 2 +include @reply's start with original message included 2 -all @reply's go to sender only 2 +all @reply's go to sender and all original recipients 2 -nosubject @send forces you to provide a Subject: line 2 +nosubject allow entering the mail editor without giving a subject line 2 -enter start each mail editing session in the usual command mode. 2 +enter start each mail editing session with an implicit `enter' command 2 -expert novice mail user (various annoying messages will be printed) 2 +expert expert mail user (suppress printing of annoying messages) 2 -sticky each mail command applies by default to one's own collection 2 +sticky each mail command applies by default to the same message 2 collection that the previous successful command did 2 -netmail mail to you accumulates in your MOO mailbox 2 +netmail mail to you is actually forwarded to your registered email 2 address, if you have one. 2 2 For "sticky", `mail command' is one of @mail, @read, @prev, @next, @answer. 2 All flags default to the `-' settings. 2 2 Next, we have 2 2 @mail-option manymsgs [is] <number> 2 @mail-option manymsgs=<number> 2 @mail-option -manymsgs 2 2 The first two forms specify that if you give a @mail or @read command asking for <number> or more messages, you will first be given a yes-or-no prompt to continue, the idea being that you many not actually have wanted to see that many messages. The third form turns off this behavior. 2 2 @mail-option @mail [is] <message-sequence> 2 2 The "@mail" option determines what message-sequence the @mail command uses by 2 default. Initially, this is "last:15", but other reasonable choices include 2 "new" and "1-last" 2 2 @mail-option replyto [is] <recipient> [<recipient>...] 2 @mail-option -replyto 2 2 The first form specifies that a Reply-To: field is to be placed in all messages constructed by @send or @answer. Note this can still be changed before sending via the mail room's reply-to command. 2 The second form resets this option so that no Reply-to: is initially inserted. 38 5 4 4 2 *subst* 2 2 %;this:wizard_list() 2 38 5 4 2 2 *forward* 2 @linelength 38 1 4 1 2 *full_index* 38 5 4 1 2 *index_list* 38 5 4 2 2 *index* 2 General Help Topics 38 5 4 30 2 There are 3 personal properties that you can use to customize how your mail is composed and forwarded 2 2 .mail_forward 2 -- list of objects that will receive any mail that gets sent to you. 2 Objects on this list should either be players or descendants of 2 $mail_recipient. 2 If this list is nonempty, you will not receive any mail yourself unless 2 you are on it. E.g., if Rog is #4292 and ur-Rog is #6349 2 2 #6349.mail_forward={} -- usual case; ur-Rog gets his own mail. 2 #6349.mail_forward={#4292} -- Rog gets ur-Rog's mail instead. 2 #6349.mail_forward={#6349,#4292} -- ur-Rog gets mail and Rog gets a copy. 2 #6349.mail_forward={#-1} -- ur-Rog's mail disappears without a trace. 2 2 .mail_notify 2 -- list of objects to be notified whenever mail is sent to you. 2 This list may include anything that has a :notify_mail() verb. 2 Notification will take place regardless of whether or how your mail 2 is forwarded. 2 2 Thus, in the previous example 2 2 #4292.mail_notify={#6349} --- means that ur-Rog will be told 2 whenever Rog is sent new mail. 2 2 .mail_options 2 -- this controls lots of miscellaneous things. Use the @mail-option command 2 to view and set these options (see `help @mail-option') 2 2 See `help mail-resolve' for more detail on how mail forwarding and mail notification work. See `help MR-subscribing' for information on how to change .mail_forward and .mail_notify on $mail_recipient children, where they are !c properties. 38 5 4 21 2 Syntax: @pagelength <number> 2 @pagelength 2 2 If the lines you see scroll off the top of your screen too quickly for you to 2 read and your client program is such that any lines scrolling off the top are 2 gone forever, you can use the @pagelength command to invoke page buffering to 2 limit the number of lines sent at a time. E.g., if your terminal has a 24 line 2 screen, you can do @pagelength 24 and output will stop every 24 lines if you 2 don't type any other commands. 2 2 You will need to use the @more command to continue reading output once it 2 has been stopped. Make sure you read `help @more' before setting @pagelength. 2 2 @pagelength 0 means no page buffering will be done by the MOO. 2 2 By default the MOO will assume you have an infinitely wide terminal screen, so 2 you may wish to set @linelength as well, and ensure wrapping is on with @wrap 2 on. (See help @linelength and help @wrap.) As with word wrapping, you are 2 best off running a client that can do its own page buffering; the MOO server's 2 page buffering is inherently slower and many MUD's do not have page buffering 2 at all. 2 1 4 19 2 *subst* 2 Syntax: @more 2 @more rest 2 @more flush 2 2 If you have @pagelength set (see `help @pagelength') and some combination of events or commands produces sufficiently many lines of output, you will see a message of the form 2 2 %[strsub(player.more_msg,"%%n","37")] 2 2 indicating (in this case) 37 more lines of text waiting to be read. 2 At this point, you should give one of the @more commands above. 2 2 @more without arguments prints sufficiently many lines to fill your screen, 2 assuming you've set @pagelength correctly, unless there are not that many 2 lines left to print. 2 2 @more rest will print all of the remaining lines, regardless of your @pagelength setting. 2 2 @more flush discards all remaining lines 2 1 4 3 2 MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects. 2 2 Not every player is allowed to program in MOO, including (at the moment, anyway) you. If you would like to be, find a wizard and convince them that you've got good ideas that the MOO needs. Good luck! 38 5 4 3 2 Syntax: @forward <msg> [on *<collection>] to <recipient> [<recipient>...] 2 2 Takes the indicated message in your (or some other) message collection, creates a new message whose body is the original message (both headers and body) and sends it on to the given recipients. 38 5 4 24 2 Syntax: @subscribe *<collection> [with notification] 2 @subscribe 2 2 The first form of this command does two things: 2 2 (1) it sets up a current message and a last-read-time for the given mail 2 collection so that when next you log in, you will be informed about new 2 mail that has appeared there. Note that this happens automatically 2 whenever you @read messages on a given collection, so if this much is 2 all you care about, you don't need to use this command; just do, e.g., 2 @read last on *<collection> 2 2 (2) if you added the "with notification clause, adds you to the .mail_notify 2 list for that collection, so that you will be notified *immediately* 2 whenever new mail is sent there. 2 2 You can only @subscribe to collections that are readable by you. 2 The second form of the command gives a list of collections available to you. 2 2 Note that this is entirely different from the Mail Room `subscribe' command 2 which actually adds you to the .mail_forward list for a given collection/ 2 mailing-list, so that mail sent to the list actually shows up in your own 2 mail collection. 2 We're probably going to phase out the Mail Room `subscribe' command... 38 5 4 5 2 Syntax: @rn 2 2 For each collection of mail messages that you read other from your own, a last-read-time is kept. This command tells you which collections (out of all those you have ever read) have recently had messages added to them, i.e., more recently than when you last did a @read, @prev, @next, or @skip on that collection. 2 2 Etymologists' note: If you thought @rn had anything to do with the popular UNIX newsreading program `rn', it's just your imagination. 38 5 4 2 2 *forward* 2 @skip 38 5 4 8 2 Syntax: @skip [<collection>...] 2 @unsubscribe [<collection>...] 2 2 For each collection of mail messages that you read other from your own, a current message and a last-read-time is kept. Normally, if you neglect to actually @read any messages on a collection other from your own, @rn (or :check_mail_lists) will continue to remind you that they are there. 2 2 The @skip command indicates that you're not interested in reading the rest of the messages that currently exist in that given collection. 2 2 The @unsubscribe command flushes the current-message/last-read-time information completely, indicating that you are not only uninterested in the rest of the messages on that collection, but also likewise uninterested in anything else that may appear on that collection later on. @unsubscribe also removes you from the collection's .mail_notify list. 38 5 4 10 2 *subst* 2 We recently reduced the initial quota for new players to %[$help:player_quota()]. 2 Those of you who were around before this are covered by a grandfather clause 2 i.e., you get to keep your over-quota objects. However this means that 2 your quota for creating new objects may now be *more than* used up, i.e., 2 negative. In particular, this means that if you recycle an object, 2 you will not be able to @create one in its place. 2 2 You can, however, re-use your over-quota objects by using the @recreate 2 command instead (see `help recreate'). 38 5 4 2 2 *forward* 2 @unrmmail 38 5 4 45 2 Certain mail commands, including @mail, @read, and @rmmail, allow a <message-sequence> argument that indicates to which messages in one's collection the command is to apply. Any combination of the following may appear as a <message-sequence> argument to any of the various mail commands (@mail, @read, @answer, @rmm). 2 2 17 message number 17 if there is one (and likewise for other integers) 2 17..23 all messages numbered between 17 and 23 (inclusive), if any. 2 cur the current message 2 prev the message before 2 next the message after 2 last the final message if any (`$' is a synonym for `last') 2 2 You may use as many of these at once as sanity permits, e.g., 2 2 @mail cur 1..5 last 2 2 which will display the header for your current message, your messages in the range 1..5, and your last message. Though some of these ranges may overlap, the header for any given message is only shown once in any event. 2 2 In addition, there are other message-sequence arguments that act as filters 2 on whatever precedes them 2 2 before:<date> messages strictly before the given date 2 after:<date> messages strictly after the given date 2 since:<date> messages on or after the given date 2 until:<date> messages on or before the given date 2 from:<player>[|<player...] messages from the given player(s) 2 to:<recip>[|<recip>...] messages to the given recipient(s) 2 subject:<string> messages with <string> in the subject 2 body:<string> messages with <string> in the body (SLOW!!!) 2 first:<number> the first <number> messages 2 last:<number> the last <number> messages 2 2 <date> is either a weekday, an dd-Month, dd-Month-yy or dd-Month-yyyy date 2 <recip> is either <player> or *<$mail_recipient kid> 2 2 Examples: 2 2 @read from:G7|Gemba read all messages from G7 or Gemba 2 @rmm to:yduJ|*Core remove messages that are to yduJ or to *Core 2 @mail since:1-Jan before:1-Feb show messages dated in January 2 @mail since:Tues show messages dated on or after Tuesday 2 @rmm subject:manners remove msgs with `manners' in the subject: 2 @mail subject:"stupid idiots" (search string contains a space => need "'s) 2 @rmm to:yduJ to:*Core remove messages that are to yduJ and *Core 2 @mail from:Haakon last:5 show the last 5 messages from Haakon 2 @mail last:10 body:fribble show those of the last 10 messages having 2 `fribble' in the body (one should always try 2 to narrow body searches in this way). 38 5 4 7 2 Syntax: @quota 2 2 Each player has a limit as to how many objects that player may create, called their 'quota'. Every object they create lowers the quota by one and every object they recycle increases it by one. If the quota goes to zero, then that player may not create any more objects (unless, of course, they recycle some first). 2 2 The @quota command prints out your current quota. 2 2 The quota mechanism is intended to solve a long-standing problem in many MUDs: database bloat. The problem is that a large number of people build a large number of dull objects and areas that are subsequently never used or visited. The database becomes quite large and difficult to manage without getting substantially more interesting. With the quota system, we can make it possible for players to experiment and learn while simultaneously keeping random building to acceptable levels. 2 1 4 5 2 Usage: @recreate <object> as <parent> named <name spec> 2 2 This is a combination of @create and @chparent. It takes an existing object, completely strips it of any verbs, properties, and values for inherited properties. This object is then reshaped into a child of the parent specified, as though @create had been called, but retaining the same object number as the original. 2 2 The <parent> and <name spec> arguments are as in @create. 38 5 4 22 2 Syntax: @wrap <on|off> 2 @wrap 2 2 @linelength <number> 2 @linelength 2 2 If the lines you see get cut off at the edge of your screen (you don't have 2 word-wrap), you can get LambdaMOO to split lines for you. The @linelength 2 command tells the MOO how many columns you have on your screen--you probably 2 want @linelength 79--and "@wrap on" tells the MOO you want it to do word- 2 wrap. 2 2 It's better if you can fix this problem without LambdaMOO's help, though, 2 because the MOO's solution will be slower than a local solution, and 2 because not all MUDs are willing to do word-wrap. 2 2 If you don't want the MOO to split lines for you, there might still be some 2 use for the @linelength command. Certain commands, like @who and @check, 2 print truncated lines so they can print in neat columns. The default for 2 these is generally about 79 columns, which looks fine if you have an 2 eighty-column screen. If your screen is a different width, though, you 2 can set @linelength and some of these commands will react accordingly. 38 5 4 13 2 *subst* 2 A few different messages can be set on a room object (see 'help messages' for instructions on doing so); they are printed to various audiences when a player or other object is ejected from the room. (See 'help @eject'.) The standard pronoun substitutions are made on each message before it is printed; see 'help pronouns' for details. 2 2 The default message is given in brackets after each name below: 2 2 @ejection [%[$room.ejection_msg]] 2 Printed to the player doing the ejecting. 2 2 @victim_ejection [%[$room.victim_ejection_msg]] 2 Printed to the object being ejected. 2 2 @oejection [%[$room.oejection_msg]] 2 Printed to others in the room from which the object is being ejected. 38 5 4 13 2 Syntax: @unrmmail [list|expunge] [on *<collection>] 2 2 When you do @rmmail on a particular message collection, the messages removed don't go away immediately, but are rather saved elsewhere. These "zombie" messages can be brought back or examined using the @UNrmmail command. 2 2 Without `list' or `expunge', @unrmm restores the zombie messages, thus undoing the effect of the most recent @rmmail command. Only the most recent @rmmail can be undone in this way; messages deleted by any previous @rmmail commands on this same collection are lost and gone forever. 2 2 The `list' option merely lists the headers of the zombie messages without actually restoring them. 2 2 The `expunge' option banishes the zombie messages forever. 2 2 Note that the message numbers used by zombie messages are held in reserve against the possibility that you might @unrmm them some day; with such messages around, new messages received will be given higher numbers than you might have expected. @renumber does an implicit @unrmm expunge. 2 2 `@unrmmail' and `@unrmmail expunge' on collections other than your own are only allowed when you have write access. Likewise, `@unrmmail list' on other collections is only possible when they are readable by you. 38 5 4 2 2 *forward* 2 @listgag 38 5 4 2 2 *forward* 2 emote 38 5 4 2 2 *forward* 2 @typo 38 5 4 3 2 Syntax: @remove-entrance <entrance> 2 2 Remove the specified entrance from the current entrances list of the room. Entrance may be either the name or object number of an entrance to this room. 38 5 4 3 2 Syntax: @remove-exit <exit> 2 2 Remove the specified exit from the current exits list of the room. Exit may be either the name or object number of an exit from this room. 38 5 4 8 2 Syntax: @parents object 2 2 A quick way to find out the ancestry of an object. Prints out the names and object numbers of all ancestors. 2 2 Example: 2 @parents Haakon 2 Haakon(#2) generic wizard(#218) generic programmer(#217) generic 2 player(#6) Root Class(#1) 38 5 4 8 2 Syntax: @contents object 2 2 A quick way to find out the contents of an object. Prints out the names and object numbers of all direct contents. This can be useful when you need to refer to something by object number because something is wrong with its aliases. 2 2 Example: 2 @contents here 2 The Entrance Hall(#19) contains: 2 Strasbourg Clock(#71) mirror at about head height(#7444) 38 5 4 5 2 *forward* 2 summary 2 2 Type 'help <topic>' for information on a particular topic. 2 38 5 4 2 2 *forward* 2 security 38 1 4 15 2 Some things you should be aware of: 2 2 -*-*- OMNISCIENT WIZARDS AND SYSADMINS: -*-*- 2 Wizards can look at absolutely *anything* in the MOO database. 2 The arch-wizard and the sysadmin for the MOO-server host have complete access not only to the MOO database itself but to many other possibly-relevant things. 2 The above mentioned parties (wizards et al), while they will endeavor to be discreet about anything incidental that turns up, nevertheless reserve the right look at anything they want, if only for the sake of being able to resolve technical problems. 2 2 -*-*- LOGGING: -*-*- 2 Some client programs (the "client" is the program you use to connect to the MOO, e.g., telnet, tinytalk, tinyfugue, emacs with mud.el...) are capable of logging everything that happens to the corresponding player. In fact, with some clients this happens by default. If a given player's client has logging enabled and said player is either in the room with you or is monitoring an object that is in the room with you, then *everything* you say and emote gets recorded. Also, if you are in a room owned by someone else, all bets are off. There is *no way* that the MOO server can know about what client a given player is using; thus, anyone who can hear you is a potential logger. 2 2 In and of itself this would not be a problem --- indeed, logs are often useful for reference purposes. However, there is no guarantee that the log will not end up someplace where you'd rather it didn't, e.g., posted on the rec.games.mud Usenet newsgroup. While it considered bad form (i.e., rude) to circulate or post a log without having the permission of at least the major participants in the activities logged, there is not a whole lot we can do on the technical side to prevent it from happening. 2 2 Be aware of the problem. The @sweep command (see `help @sweep') attempts to determine what players can be listening at any given moment. If anything, it errs on the side of paranoia. Even so, it doesn't cover *all* possible avenues of eavesdropping, and there's no hope for it covering the situations like the one where someone manages to convince one of the participants in your discussion who kept a log that it really doesn't need to be kept private after all. 2 2 If you've got something really sensitive to discuss, you are best off doing it by encrypted email or in person. 38 5 4 17 2 Syntax: @realm [owners] [from root] [missing descendants] 2 2 Displays a part of the parenting tree of objects on the MOO, i.e. all 2 the descendants of a given object owned by particular players. 2 2 owners: a list of players whose objects you are interested in. If 2 one of these is * or !, @realm will display objects only if 2 they belong to players you didn't mention. (defaults to you) 2 root: the object which is an ancestor of all the objects you are 2 interested in. (defaults to $root_class). 2 descendants: a list of objects (descendants of root) which you are not 2 interested in. Neither they nor their descendants will be 2 displayed. 2 2 @realm also displays the objects which are ancestors of root, and, if it 2 is not redundant, the owners of all objects. @realm has a habit of 2 running out of ticks if you try displaying large chunks of the MOO. 38 5 4 13 2 Syntax: @resident player 2 @resident !player 2 @resident 2 2 Adds or removes a player from the residents list of a room. The residents list controls who is allowed to use @sethome in that room. This defaults to just the owner of the room; by manipulating the residents list you may allow additional players to use that room as their home. 2 2 @resident player adds that player to the list. 2 @resident !player removes that player from the list. 2 @resident with no arguments simply displays the current list (which may be "none", indicating no additional people besides the owner may use that room as their home). 2 2 See also help @sethome. 2 2 Hints for programmers: The verb $room:accept_for_abode is called by @sethome. By overriding this verb you can give different criteria to @sethome. It should return 1 for allowed and 0 for denied. 38 5 4 12 2 Syntax: @examine <object> 2 @exam <object> 2 2 Prints several useful pieces of information about the named object, including the following: 2 + its full name, aliases, and object number 2 + its owner's name and object number 2 + its description 2 + its key expression (if it is locked and if you own it) 2 + its contents and their object numbers 2 + the 'obvious' verbs defined on it 2 2 [Note to programmers: the 'obvious' verbs are those that are readable and that can be invoked as commands. To keep a verb off this list, either make it unreadable (see 'help @chmod') or, if it shouldn't be used as a command, give it 'args' of 'this none this' (see 'help @args').] 38 5 4 5 2 There are several commands available to determine the origins of messages and to check that your communications with other players are secure. Help is available on the following topics: 2 2 @paranoid -- keeping a record of messages your character hears. 2 @check -- looking at that record to determine responsibility for messages. 2 @sweep -- checking who is listening in on your conversation. 38 5 4 3 2 Syntax: @sweep 2 2 Used when you wish to have a private conversation, and are concerned someone may be listening in. @sweep tries to list the avenues by which information may be leaving the room. In a manner analogous to @check, it assumes that you don't want to hear about your own verbs, or those belonging to wizards, who presumably wouldn't stoop to bugging. 38 5 4 6 2 Syntax: @paranoid 2 @paranoid off 2 @paranoid immediate 2 @paranoid <number> 2 2 In immediate mode, the monitor prepends everything you hear with the name of the character it considers responsible for the message. Otherwise, it keeps records of the last <number> (defaults to 20) lines you have heard. These records can be accessed by the @check command. 38 5 4 23 2 Syntax: @check <options> 2 2 where <options> is one or more of: 2 -- the number of lines to be displayed 2 -- a player's name, someone to be "trusted" during the assignment of responsibility for the message. 2 -- a player's named prefixed by !, someone not to be "trusted". 2 2 @check-full <options> 2 where <options is either 2 -- the number of lines to be displayed 2 -- a search string: only lines containing that string will be displayed. 2 2 Used when you are suspicious about the origin of some of the messages your character has just heard. 2 2 Output from @check is in columns that contain, in order, the monitor's best guess as to: 2 what object the message came from, 2 what verb on that object that was responsible, 2 whose permissions that verb was running with, and 2 the beginning of the actual message. 2 2 Output from @check-full is in columns that contains a description of all the verbs that were responsible for the noise heard, not just the best guess as to who was responsible. 2 2 @check operates by examining the list of verbs that were involved in delivering the message, and assigning responsibility to the first owner it sees who is not "trusted". By default, it trusts you and all the wizards. It uses the records maintained by @paranoid, so you must have used that command before you received the message. 38 5 4 2 2 *forward* 2 @answer 38 5 4 11 2 Syntax: @eject[!] <object> [from <place>] 2 2 This command is used to remove unwanted objects from places you own. Players thus removed are unceremoniously dumped in their homes (unless that's this room, in which case they are dumped in the default player starting place). Other kinds of objects are checked for a .home property and sent there if possible, otherwise they get thrown into #-1. Unlike @move, @eject does *not* check to see if the object wants to be moved, and with the destination being what it is, there is no question of the destination refusing the move, either. Generally, you should only resort to @eject if @move doesn't work. 2 2 `@eject <object>' removes <object> from the current room, whereas `@eject <object> from <place>' removes the object from the specified location (in most cases, <place> will need to be specified as an object number). In either case, this command only works if you own the room/entity from which the object is being ejected. 2 2 `@eject ... from me' suffices to get rid of some unwanted object in your inventory. 2 2 The verbs @eject! and @eject!! are provided for those rare situations in which @eject does not work. @eject! does not check for .home properties, sending the offending object to #-1 immediately, but with a notification. @eject!! is just like @eject! but provides no notification to the object. 2 2 See 'help room-messages' for a list of messages one can set regarding the @eject command. 38 5 4 3 2 Syntax: @quit 2 2 Disconnect from the MOO. This breaks your network connection and leaves your player sleeping. Disconnecting in most parts of the MOO automatically returns your player to its designated home (see 'help home'). 38 1 4 4 2 Syntax: whereis [<player> [<player>...]] 2 @whereis [<player> [<player>...]] 2 2 Returns the current location of each of the specified players, or of all players if not arguments given. 38 5 4 2 2 *forward* 2 @typo 38 5 4 2 2 *forward* 2 @typo 38 5 4 2 2 *forward* 2 @typo 38 5 4 12 2 Syntax: @typo [<text>] 2 @bug [<text>] 2 @suggest [<text>] 2 @idea [<text>] 2 @comment [<text>] 2 2 If <text> is given, a one-line message is sent to the owner of the room, presumably about something that you've noticed. If <text> is not given, we assume you have more to say than can fit comfortably on a single line; the usual mail editor is invoked. The convention is that @typo is for typographical errors on the room or objects found therein, @bug is for anomalous or nonintuitive behaviour of some sort, @idea/@suggest for any particular brainstorms or criticisms you might happen to have, and @comment for anything else. 2 2 If you're sending a bug report to someone because you got an error traceback when you used some object of theirs, please give them enough information to work on the problem. In particular, please tell them *exactly* what you typed and *all* of the error messages that were printed to you, including the entire traceback, up to the line `(End of traceback.)'. Without this information, it is nearly impossible for the programmer to discover, let alone fix, the problem. 2 2 The usual mail editor is only invoked for this command when in rooms that allow free entry, i.e., rooms that are likely to allow you back after you are done editing your message. Otherwise these commands will require <text> and only let you do one-line messages. 2 Most adventuring scenario rooms fall into this latter category. 38 5 4 5 2 Syntax: @renumber [<collection>] 2 2 Renumbers the messages in your collection to go from 1 to however many you have at the moment. The optional argument allows you to renumber the messages stored in some other collection (@renumber, like @rmmail, requires write access). 2 2 Note that if you have zombie messages from a previous @rmmail command (see `help zombie-messages'), these will be expunged. 38 5 4 8 2 Syntax: @notedit <note-object> 2 @notedit <object>.<property> 2 2 Enters the MOO Note Editor to edit the text on the named object 2 For the first form, <note-object> must be a descendant of $note. 2 For the second form, <object>.<property> can be any string-valued or text-valued (i.e., list of strings) property on any object. 2 2 See 'help editors' for more detail. 38 5 4 40 2 One can always enter an editor by teleporting to it, or you can use one of the commands provided 2 2 @edit <object>:<verb> invokes the Verb Editor (edits verb code) 2 @notedit <note_object> invokes the Note Editor (edits note text) 2 @notedit <object>.<prop> invokes the Note Editor (edits text property) 2 @send <list of recipients> invokes the Mailer (edits a mail msg) 2 @answer [<msg_number>] [<flags>...] invokes the Mailer (edits a reply) 2 2 This will transport you to one of several special rooms that have editing commands available. These editors are admittedly not as good as EMACS, but for those with no other editing capability on their host systems, they are better than nothing. 2 2 There is a generic editor that provides basic editing commands that are applicable to all editors. Documentation for these commands can be obtained by typing `help <topic>' within the editor: 2 2 abort emote/: pause send (M) 2 also-to (M) fill prev showlists (M) 2 compile (V) insert print (M) subject (M) 2 copy join quit subst 2 delete list ranges to (M) 2 done move save (N) what 2 edit (V,N) next say/" who (M) 2 2 In addition, individual editors provide their own additional commands for loading text from places, saving text to places, and various other specialized functions which are denoted in the above list with (M),(N),(V) according as they apply to the mail editor, the note editor, or the verb editor, respectively. 2 2 Note that a given editor only allows you one session at a time (ie. one verb, one note, or one mail message). If you leave an editor without either aborting or compiling/saving/sending the item you're working on, that editor remembers what you are doing next time you enter it, whether you enter it by teleporting or by using the appropriate command. Note that editors are periodically flushed so anything left there for sufficiently long will eventually go away. 2 2 A player may have his own .edit_options property which is a list containing one or more (string) flags from the following list 2 2 quiet_insert 2 suppresses those annoying "Line n added." or "Appended..." messages 2 that one gets in response to 'say' or 'emote'. This is useful if you're 2 entering a long list of lines, perhaps via some macro on your client, 2 and you don't want to see an equally long list of "Line n added..." 2 messages. What you do want, however is some indication that this all 2 got through, which is why the "." command is an abbreviation for insert. 2 2 eval_subs 2 Enables the verb editor to process your eval_subs property when 2 compiling your verb. See `help eval' for more information about 2 the eval_subs property. 2 2 There will be more options, some day. 38 5 4 3 2 Syntax: @prev [on <collection>] 2 2 Print the 'previous' message in a given email collection (defaults to your own). The mail system's notion of your 'current message' for that collection is decremented. Thus, e.g., one can review all of one's previous messages one-by-one simply by typing '@prev' repeatedly. 38 5 4 6 2 Syntax: 2 @unlock_for_open <container> 2 2 Clears the lock which restricts who may open <container>. See 'help locking' for general information about locking. 2 2 See 'help containers' for information on containers. 38 5 4 6 2 Syntax: 2 @lock_for_open <container> with <key expression> 2 2 Set the lock on <container> which restricts who can open it. See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions. 2 2 See 'help containers' for information on containers. 38 5 4 9 2 Syntax: 2 @opacity <container> is <integer> 2 2 The opacity can take on one of three values: 2 0: The container is transparent and you can always see into it. 2 1: The container is opaque, and you cannot see into it when closed 2 2: The container is a black hole, and you can never see into it whether closed or open. 2 2 The default @opacity is 1. 38 5 4 49 2 *subst* 2 Several kinds of messages can be set on a container object; they are printed to various audiences at certain times whenever an attempt is made to use the container. The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character. The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details. 2 2 The default message is given in brackets after each name below: 2 2 @empty[%[$container.empty_msg]] 2 Printed in place of the contents list when the container is empty. 2 2 @open [%[$container.open_msg]] 2 Printed to the player who successfully opens the container. 2 2 @oopen [%[$container.oopen_msg]] 2 Printed to others in the same room if the player successfully opens the container. 2 2 @open_fail [%[$container.open_fail_msg]] 2 Printed to the player who cannot open the container. 2 2 @oopen_fail [%[$container.oopen_fail_msg]] 2 Printed to others in the room when a player fails to open a container. 2 2 @close [%[$container.close_msg]] 2 Printed to the player who closes a container. 2 2 @oclose [%[$container.oclose_msg]] 2 Printed to others in the room when a player closes a container. 2 2 @put [%[$container.put_msg]] 2 Printed to a player when an object is successfully placed in a container. 2 2 @oput [%[$container.oput_msg]] 2 Printed to others in the room when a player successfully places an object in a container. 2 2 @put_fail [%[$container.put_fail_msg]] 2 Printed when a player fails to put an object in a container. 2 2 @oput_fail [%[$container.oput_fail_msg]] 2 Printed to others in the room when a player fails to place an object in a container. 2 2 @remove [%[$container.remove_msg]] 2 Printed when a player succeeds in removing an object from a container. 2 2 @oremove [%[$container.oremove_msg]] 2 Printed to others in the room when a player succeeds in removing an object from a container. 2 2 @remove_fail [%[$container.remove_fail_msg]] 2 Printed when a player fails to remove an object from a container. 2 2 @oremove_fail [%[$container.oremove_fail_msg]] 2 Printed to others in the room when a player fails to remove an object from a container. 38 5 4 3 2 Syntax: @memory 2 2 Prints out all information available on the current memory-usage behavior of the MOO server. Probably only a wizard, if anyone, cares about this. 38 1 4 2 2 *forward* 2 say 38 1 4 2 2 *forward* 2 emote 38 1 4 6 2 Syntax: @lastlog 2 @lastlog <player> 2 2 The first form prints out a list of all players, roughly sorted by how long it's been since that player last connected to the MOO. For each player, the precise time of their last connection is printed. 2 2 The second form only shows the last-connection time for the named player. 38 1 4 3 2 Syntax: @version 2 2 Prints out the version number for the currently-executing MOO server. 38 1 4 4 2 Here are a few commands of occasional utility that didn't fit into any of the neat categories for the rest of the help system: 2 2 @version -- printing the MOO server version number 2 @lastlog -- finding out when some player last connected to the MOO 38 1 4 2 2 *forward* 2 put 38 1 4 2 2 *forward* 2 help 38 1 4 2 2 *forward* 2 help 38 1 4 4 2 Syntax: put <object> into <container> 2 insert <object> in <container> 2 2 Moves the named object into the named container. Sometimes the owners of the object and/or the container will not allow you to do this. 38 1 4 2 2 *forward* 2 take 38 1 4 3 2 Syntax: burn <letter> 2 2 Destroy the named letter irretrievably. Only players who can read the letter can do this. 38 1 4 1 2 A letter is a special kind of note (see 'help notes') with the added feature that it can be recycled by anyone who can read it. This is often useful for notes from one player to another. You create the letter as a child of the generic letter, $letter (see 'help @create' and 'help write'), encrypt it so that only you and the other player can read it (see 'help encrypt') and then either give it to the player in question or leave it where they will find it. Once they've read it, they can use the 'burn' command to recycle the letter; see 'help burn' for details. 38 1 4 3 2 Syntax: decrypt <note> 2 2 Removes any restriction on who may read the named note or letter. Only the owner of a note may do this. 38 1 4 3 2 Syntax: encrypt <note> with <key-expression> 2 2 Restricts the set of players who can read the named note or letter to those for whom the given key expression is true. See 'help keys' for information on the syntax and semantics of key expressions. Only the owner of a note may do this. 38 1 4 3 2 Syntax: delete <line-number> from <note> 2 2 Removes a single line of text from a note. The first line of text is numbered 1, the second is 2, and so on. Only the owner of a note may do this. 38 1 4 3 2 Syntax: erase <note> 2 2 Deletes all of the text written on a note or letter. Only the owner of a note may do this. 38 1 4 3 2 Syntax: write "<any text>" on <note> 2 2 Adds a line of text to the named note or letter. Only the owner of a note may do this. 38 1 4 3 2 Syntax: read <note> 2 2 Prints the text written on the named object, usually a note or letter. Some notes are encrypted so that only certain players may read them. 38 1 4 10 2 Syntax: examine <object> 2 exam <object> 2 2 Prints several useful pieces of information about the named object, including the following: 2 + its full name, object number, and aliases 2 + its owner's name 2 + its description 2 + its key expression (if it is locked and if you own it) 2 + its contents 2 + the 'obvious' verbs defined on it 38 1 4 2 2 *forward* 2 give 38 1 4 10 2 The representation of key expressions is very simple and makes it easy to construct new keys on the fly. 2 2 Objects are represented by their object numbers and all other kinds of key expressions are represented by lists. These lists have as their first element a string drawn from the following set: 2 "&&" "||" "!" "?" 2 For the first two of these, the list should be three elements long; the second and third elements are the representations of the key expressions on the left- and right-hand sides of the appropriate operator. In the third case, "!", the list should be two elements long; the second element is again a representation of the operand. Finally, in the "?" case, the list is also two elements long but the second element must be an object number. 2 2 As an example, the key expression 2 #45 && ?#46 && (#47 || !#48) 2 would be represented as follows: 2 {"&&", {"&&", #45, {"?", #46}}, {"||", #47, {"!", #48}}} 38 1 4 24 2 LambdaMOO supports a simple but powerful notation for specifying locks on objects, encryption on notes, and other applications. The idea is to describe a constraint that must be satisfied concerning what some object must be or contain in order to use some other object. 2 2 The constraint is given in the form of a logical expression, made up of object numbers connected with the operators 'and', 'or', and 'not' (written '&&', '||', and '!', for compatibility with the MOO programming language). When writing such expressions, though, one usually does not use object numbers directly, but rather gives their names, as with most MOO commands. 2 2 These logical expressions (called 'key expressions') are always evaluated in the context of some particular 'candidate' object, to see if that object meets the constraint. To do so, we consider the candidate object, along with every object it contains (and the ones those objects contain, and so on), to be 'true' and all other objects to be 'false'. 2 2 As an example, suppose the player Munchkin wanted to lock the exit leading to his home so that only he and the holder of his magic wand could use it. Further, suppose that Munchkin was object #999 and the wand was #1001. Munchkin would use the '@lock' command to lock the exit with the following key expression: 2 me || magic wand 2 and the system would understand this to mean 2 #999 || #1001 2 That is, players could only use the exit if they were (or were carrying) either #999 or #1001. 2 2 To encrypt a note so that it could only be read by Munchkin or someone carrying his book, his bell, and his candle, Munchkin would use the 'encrypt' command with the key expression 2 me || (bell && book && candle) 2 2 Finally, to keep players from taking a large gold coffin through a particularly narrow exit, Munchkin would use this key expression: 2 ! coffin 2 That is, the expression would be false for any object that was or was carrying the coffin. 2 2 There is one other kind of clause that can appear in a key expression: 2 ? <object> 2 This is evaluated by testing whether the given object is unlocked for the candidate object; if so, this clause is true, and otherwise, it is false. This allows you to have several locks all sharing some single other one; when the other one is changed, all of the locks change their behavior simultaneously. 2 2 [Note to programmers: The internal representation of key expressions, as stored in .key on every object, for example, is very simple and easy to construct on the fly. For details, see 'help key-representation'.] 38 1 4 3 2 Syntax: @unlock <object> 2 2 Clear any lock that might exist on the given object. See 'help locking' for general information about locking. 38 1 4 5 2 Syntax: @lock <object> with <key expression> 2 2 Set a lock on <object> to restrict its use. See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions. 2 2 N.B. In the case of rooms, you are actually better off setting room.free_entry to 0 thus preventing teleportation and then @locking the various entrances. The problem with @locking the room itself is that this can make it impossible to drop objects in the room. 38 1 4 21 2 It is frequently useful to restrict the use of some object. For example, one might want to keep people from using a particular exit unless they're carrying a bell, a book, and a candle. Alternatively, one might allow anyone to use the exit unless they're carrying that huge golden coffin in the corner. LambdaMOO supports a general locking mechanism designed to make such restrictions easy to implement, usually without any programming. 2 2 Every object supports a notion of being 'locked' with respect to certain other objects. For example, the exit above might be locked for any object that was carrying the coffin object but unlocked for all other objects. In general, if some object 'A' is locked for another object, 'B', then 'B' is usually prevented from using 'A'. Of course, the meaning of 'use' in this context depends upon the kind of object. 2 2 The various standard classes of objects use locking as follows: 2 + Rooms and containers refuse to allow any object inside them if they're locked for it. 2 + Exits refuse to transport any object that they're locked for. 2 + Things (including notes and letters) cannot be moved to locations that they're locked for. 2 2 There are two sides to locking: 2 + How is it specified whether one object is locked for another one? 2 + What is the effect of an object being locked? 2 Note that these two questions are entirely independent: one could invent a brand-new way to specify locking, but the effect of an exit being locked would be unchanged. 2 2 [Note to programmers: the interface between these two sides is the verb x:is_unlocked_for(y), which is called by x to determine if it is locked for the object y. The way in which 'is_unlocked_for' is implemented is entirely independent of the ways in which x uses its results. Note that you can play on either side of this interface with your own objects, either defining new implementations of 'is_unlocked_for' that match your particular circumstances or having your objects interpret their being locked in new ways.] 2 2 There is a default way to specify locks on objects; the following help topics cover the relevant commands: 2 2 @lock -- setting a lock on an object 2 @unlock -- clearing the lock on an object 2 keys -- describes the language used to describe lock keys 38 1 4 28 2 *subst* 2 Several kinds of messages can be set on 'things', objects that have $thing as an ancestor (see 'help messages' for instructions on doing so). They are printed to various audiences under various circumstances when an attempt is made to 'take' or 'drop' a thing. The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character. The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details. 2 2 The default message is given in brackets after each name below: 2 2 @take_failed [%[$thing.take_failed_msg]] 2 Printed to a player who fails to take the object. 2 2 @otake_failed [%[$thing.otake_failed_msg]] 2 Printed to others in the same room if a player fails to take the object. 2 2 @take_succeeded [%[$thing.take_succeeded_msg]] 2 Printed to a player who succeeds in taking the object. 2 2 @otake_succeeded [%[$thing.otake_succeeded_msg]] 2 Printed to others in the same room if a player succeeds in taking the object. 2 2 @drop_failed [%[$thing.drop_failed_msg]] 2 Printed to a player who fails to drop the object. 2 2 @odrop_failed [%[$thing.odrop_failed_msg]] 2 Printed to others in the same room if a player fails to drop the object. 2 2 @drop_succeeded [%[$thing.drop_succeeded_msg]] 2 Printed to a player who succeeds in dropping the object. 2 2 @odrop_succeeded [%[$thing.odrop_succeeded_msg]] 2 Printed to others in the room if a player succeeds in dropping the object. 38 1 4 2 2 *forward* 2 drop 38 1 4 9 2 Syntax: take <object> 2 get <object> 2 take <object> from <container> 2 get <object> from <container> 2 remove <object> from <container> 2 2 The first two forms pick up the named object and place it in your inventory. Sometimes the owner of the object won't allow it to be picked up for some reason. 2 2 The remaining forms move the named object from inside the named container (see 'help containers') into your inventory. As before, sometimes the owner of an object will not allow you to do this. 38 1 4 3 2 Syntax: @messages <object> 2 2 List all of the messages that can be set on the named object and their current values. See 'help messages' for more details. 38 1 4 67 2 Some kinds of messages are not printed directly to players; they are allowed to contain special characters marking places to include the appropriate pronoun for some player. For example, a builder might have a doorway that's very short, so that people have to crawl to get through it. When they do so, the builder wants a little message like this to be printed: 2 2 Balthazar crawls through the little doorway, bruising his knee. 2 2 The problem is the use of 'his' in the message; what if the player in question is female? The correct setting of the 'oleave' message on that doorway is as follows: 2 2 "crawls through the little doorway, bruising %p knee." 2 2 The '%p' in the message will be replaced by either 'his', 'her', or 'its', depending upon the gender of the player. 2 2 As it happens, you can also refer to elements of the command line (e.g., direct and indirect objects) the object issuing the message, and the location where this is all happening. In addition one can refer to arbitrary string properties on these objects, or get the object numbers themselves. 2 2 The complete set of substitutions is as follows: 2 2 %% => `%' (just in case you actually want to talk about percentages). 2 Names: 2 %n => the player 2 %t => this object (i.e., the object issuing the message,... usually) 2 %d => the direct object from the command line 2 %i => the indirect object from the command line 2 %l => the location of the player 2 Pronouns: 2 %s => subject pronoun: either `he', `she', or `it' 2 %o => object pronoun: either `him', `her', or `it' 2 %p => posessive pronoun (adj): either `his', `her', or `its' 2 %q => posessive pronoun (noun): either `his', `hers', or `its' 2 %r => reflexive pronoun: either `himself', `herself', or `itself' 2 General properties: 2 %(foo) => player.foo 2 %[tfoo], %[dfoo], %[ifoo], %[lfoo] 2 => this.foo, dobj.foo, iobj.foo, and player.location.foo 2 Object numbers: 2 %# => player's object number 2 %[#t], %[#d], %[#i], %[#l] 2 => object numbers for this, direct obj, indirect obj, and location. 2 2 In addition there is a set of capitalized substitutions for use at the 2 beginning of sentences. These are, respectively, 2 2 %N, %T, %D, %I, %L for object names, 2 %S, %O, %P, %Q, %R for pronouns, and 2 %(Foo), %[dFoo] (== %[Dfoo] == %[DFoo]),... for general properties 2 2 Note: there is a special exception for player .name's which are assumed to 2 already be capitalized as desired. 2 2 There may be situations where the standard algorithm, i.e., upcasing the first letter, yields something incorrect, in which case a "capitalization" for a particular string property can be specified explicitly. If your object has a ".foo" property that is like this, you need merely add a ".fooc" (in general .(propertyname+"c")) specifying the correct capitalization. This will also work for player .name's if you want to specify a capitalization that is different from your usual .name 2 2 Example: 2 Rog makes a hand-grenade with a customizable explode message. 2 Suppose someone sets grenade.explode_msg to: 2 2 "%N(%#) drops %t on %p foot. %T explodes. 2 %L is engulfed in flames." 2 2 If the current location happens to be #3443 ("yduJ's Hairdressing Salon"), 2 the resulting substitution may produce, eg., 2 2 "Rog(#4292) drops grenade on his foot. Grenade explodes. 2 YduJ's Hairdressing Salon is engulfed in flames." 2 2 which contains an incorrect capitalization. 2 yduJ may remedy this by setting #3443.namec="yduJ's Hairdressing Salon". 2 2 Note for programmers: 2 In programs, use $string_utils:pronoun_sub(). 2 %n actually calls player:title() while %(name) refers to player.name directly. 38 1 4 22 2 *subst* 2 Several kinds of messages can be set on an exit object (see 'help messages' for instructions on doing so); they are printed to various audiences at certain times whenever an attempt is made to go through the exit. The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character. The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details. 2 2 The default message is given in brackets after each name below: 2 2 @leave [%[$exit.leave_msg]] 2 Printed to the player just before they successfully use the exit. 2 2 @oleave [%[$exit.oleave_msg||"has left."]] 2 Printed to others in the source room when a player successfully uses the exit. 2 2 @arrive [%[$exit.arrive_msg]] 2 Printed to the player just after they successfully use the exit. 2 2 @oarrive [%[$exit.oarrive_msg||"has arrived."]] 2 Printed to others in the destination room when a player successfully uses the exit. 2 2 @nogo [%[$exit.nogo_msg||"You can't go that way."]] 2 Printed to the player when they fail in using the exit. 2 2 @onogo [%[$exit.onogo_msg]] 2 Printed to others when a player fails in using the exit. 38 1 4 18 2 Most objects have messages that are printed when a player succeeds or fails in manipulating the object in some way. Of course, the kinds of messages printed are specific to the kinds of manipulations and those, in turn, are specific to the kind of object. Regardless of the kind of object, though, there is a uniform means for listing the kinds of messages that can be set and then for setting them. 2 2 The '@messages' command prints out all of the messages you can set on any object you own. Type 'help @messages' for details. 2 2 To set a particular message on one of your objects use a command with this form: 2 @<message-name> <object> is "<message>" 2 where '<message-name>' is the name of the message being set, <object> is the name or number of the object on which you want to set that message, and <message> is the actual text. 2 2 For example, consider the 'leave' message on an exit; it is printed to a player when they successfully use the exit to leave a room. To set the 'leave' message on the exit 'north' from the current room, use the command 2 @leave north is "You wander in a northerly way out of the room." 2 2 [Note to programmers: This class of commands automatically applies to any property whose name ends in '_msg'. Thus, in the example above, the command is setting the 'leave_msg' property of the named exit. You can get such a command to work on new kinds of objects simply by giving the appropriate properties names that end in '_msg'. Additionally, in many cases the _msg property is accompanied by a _msg verb, which defaultly returns the named property, but which is available to be customized in more complex ways than allowed by simple string substitution. You should check for the particular property you're considering whether the verb form exists (typically with @list).] 2 2 The following help topics describe the uses of the various messages available on standard kinds of objects: 2 2 container-messages -- the messages on objects that can contain other objects 2 exit-messages -- the messages on exit objects 2 thing-messages -- the messages on objects that can be taken and dropped 38 1 4 5 2 Most objects have one or more descriptive pieces of text associated with them; these texts are printed under various circumstances depending on the kind of text. For example, every object has a 'description' text that is printed whenever a player looks at the object. The following help topics discuss the commands for manipulating these descriptive texts on your objects: 2 2 @rename -- setting the name and aliases of your objects 2 @describe -- setting what others see when they look at your objects 2 messages -- listing and setting the other descriptive texts on an object 38 1 4 13 2 Syntax: @describe <object> as <description> 2 2 Sets the description string of <object> to <description>. This is the string that is printed out whenever someone uses the 'look' command on <object>. To describe yourself, use 'me' as the <object>. 2 2 Example: 2 Munchkin types this: 2 @describe me as "A very fine fellow, if a bit on the short side." 2 People who type 'look Munchkin' now see this: 2 A very fine fellow, if a bit on the short side. 2 2 Note for programmers: 2 The description of an object is kept in its .description property. 2 For descriptions of more than one paragraph, .description can be a list of strings. 38 1 4 3 2 Syntax: @add-entrance <exit-object-number> 2 2 Add the exit with the given object number as a recognized entrance to the current room (that is, one whose use is not considered teleportation). Usually, @dig does this for you, but it doesn't if you don't own the room in question. Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-entrance command to link it up. 38 1 4 3 2 Syntax: @add-exit <exit-object-number> 2 2 Add the exit with the given object number as a conventional exit from the current room (that is, an exit that can be invoked simply by typing its name, like 'east'). Usually, @dig does this for you, but it doesn't if you don't own the room in question. Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-exit command to link it up. 38 1 4 8 2 The topology of the MOO universe is determined by the rooms that exist and the exits that connect them. Several commands are available for creating and discovering the topology of the MOO. Help on them is available under the following topics: 2 2 @dig -- creating new rooms and exits 2 @add-exit -- adding other players' exits from your rooms 2 @add-entrance -- adding other player's entrances to your rooms 2 @exits -- listing all of the conventional exits from your rooms 2 @entrances -- listing all of the conventional entrances to your rooms 2 @resident -- listing or changing the residents of your rooms 38 1 4 8 2 Syntax: @classes 2 @classes <class-name> ... 2 2 The wizards have identified several useful classes of objects in the database. The @classes command is used to see which classes exist and what their member objects are. 2 2 The first form simply lists all of the defined classes along with short descriptions of the membership of each. 2 2 The second form prints an indented listing of that subset of the object parent/child hierarchy containing the objects in the class(es) you specify. 38 1 4 27 2 Syntax: @audit [<player>] [for <string>] [from <number>] [to <number>] 2 2 `@audit' prints a report of all of the objects you own. 2 `@audit player' prints the same report for another player. 2 2 The `for' string restricts the search to objects whose names begin with that string. 2 It is also possible to restrict the range of object numbers to include only those above a given number (`from') or below a given number (`to'). 2 2 All forms of @audit print a report: 2 2 #14 Gemba [The Pool] 2 #144 Popgun [Gemba] 2 #1479 Cockatoo *[The Living Room] 2 #1673 Bottom of Swimming Pool 2 #2147 Cavern <-*west 2 #2148 tunnel Bottom of Swimming ->Cavern 2 2 The first column is the object's number, the second its name. The third column shows the object's location: Gemba is in The Pool, and is carrying the Popgun (#144). 2 For exits, the third column shows source ->dest. 2 For rooms, the third column shows any entrances owned by someone else. 2 Object location, exit sources and destinations owned by another player are preceded by a *. 2 2 @audit uses a property .owned_objects on the player, for speed. This property is updated at the time of each object creation and destruction and ownership change. The verb @auditdb (same args as @audit) actually searches through the entire database for objects. 2 2 See also @verify-owned, @sort-owned, and @add-owned. 2 2 See also @prospectus, which gives some additional information. 38 1 4 3 2 Syntax: @count 2 2 Prints out the number of objects you own. Do not be surprised if this is one larger than you think it should be: remember that your player object is owned by you as well, even though you didn't create it in the usual way. 38 1 4 4 2 *forward* 2 common_quota 2 2 To get a larger quota, talk to a wizard. They will take a look at what you've done with the objects you've built so far and make a determination about whether or not it would be a net gain for the MOO community if you were to build some more things. If so, they will increase your quota; if not, they will try to explain some ways in which you could build things that were more useful, entertaining, or otherwise interesting to other players. Wizards may be more impressed by objects which are interactive and employ a fair number of verbs. 38 1 4 12 2 Syntax: @create <class-name> named "<names>" 2 @create <parent-object> named "<names>" 2 2 The main command for creating objects other than rooms and exits (for them, see 'help @dig'; it's much more convenient). 2 2 The first argument specifies the 'parent' of the new object: loosely speaking, the 'kind' of object you're creating. <class-name> is one of the four standard classes of objects: $note, $letter, $thing, or $container. As time goes on, more 'standard classes' may be added. If the parent you have in mind for your new object isn't one of these, you may use the parent's name (if it's in the same room as you) or else its object number (e.g., #4562). 2 2 The <names> are given in the same format as in the @rename command: 2 <name-and-alias>,<alias>,...,<alias> [preferred] 2 <name>:<alias>,...,<alias> [not preferred] 2 2 See 'help @rename' for a discussion of the difference between a name and an alias. 38 1 4 45 2 This is yduJ's table of tinymud commands and their equivalents in LambdaMOO. A longer document, with discussions of the different verbs and how they have changed, is available via FTP from parcftp.xerox.com as pub/MOO/contrib/TinyMUD-LambdaMOO-equivs. All the commands mentioned here have help nodes on LambdaMOO. 2 2 The following commands are basically the same in MOO and MUD. 2 2 drop(throw), get(take), go, help, home, inventory, look, news, say (",:) 2 2 2 The following commands have no equivalent: 2 2 kill, rob, score, @force 2 2 2 The following commands have the same names and do similar things, but are changed in some way (both syntactic and semantic differences, sometimes quite substantial differences): 2 2 @examine, give, page, read, whisper, @create, @dig, 2 @lock, @password, @unlock, @describe 2 2 2 The following commands have rough equivalents in LambdaMOO but the name is different: 2 2 TinyMUD name LambdaMOO name 2 ------------ -------------- 2 QUIT @quit 2 gripe @gripe 2 goto/move go 2 WHO @who 2 @fail @take_failed, @nogo, @drop_failed 2 @find @audit 2 @link @dig, @sethome, @add-exit, @add-entrance 2 @name @rename 2 @ofail @otake_failed, @onogo, @odrop_failed 2 @open @dig 2 @osuccess @oleave, @oarrive, @otake_succeeded, 2 @odrop_succeeded 2 @success @leave, @arrive, @take_succeeded 2 @drop_succeeded 2 @teleport @move 2 2 2 Here are some commands for which no equivalent exists, or for which the equivalent is a complicated set of actions. 2 2 @set, @stats, @unlink 2 2 2 Documentation on most of the LambdaMOO commands mentioned above can be acquired using 'help <command-name>'. A notable exception is the commands like @oarrive and @take_failed that set textual messages on objects. These are described under 'help messages'. 38 1 4 3 2 Syntax: @next [on <collection>] 2 2 Print the `next' message in a given email collection (defaults to your own). The mail system's notion of your 'current message' for that collection is incremented. Thus, e.g., one can read all of one's new messages one-by-one simply by typing '@next' repeatedly. 38 1 4 13 2 Syntax: @answer [<message-number>] [sender] [all] [include] [noinclude] 2 2 Synonym: @reply 2 2 Prepares for you to compose a MOO email message to the players who either received or composed the indicated message from your collection. The usual editor is invoked (see `help editors' for details). The subject line for the new message will be initialized from that of the indicated message. If you leave off the message number, the reply will be to your current message, if that exists. In fact you may give a general message-sequence (see `help message-sequences') argument here, provided that it indicates only a single message (e.g., `@answer last:1') 2 2 If there is a Reply-to: field in the message you are @answer'ing, its contents will be used to initialize the To: line of your reply. Otherwise, a To: line is determined depending on whether you specified `sender' or `all' in the command line (or your .mail_options). 2 2 `include' includes the text of the original message in your reply, `noinclude' does not. 2 2 `sender', `all', `include', and `noinclude' can each be abbreviated (e.g., `@answer i'). 2 2 Defaults are `sender' and `noinclude', but you can change this by setting your .mail-options (see `help mail-options'). 38 5 4 10 2 Syntax: @rmmail [<message-sequence>] [from *<recipient>] 2 2 Deletes the indicated messages from your MOO email collection. 2 By default, your current message is deleted. 2 See `help message-sequence' for the full list of possible arguments. 2 You get the message numbers for use here by typing the '@mail' command. 2 2 There is no confirmation for this action, so be careful. While it is true that @unrmmail will be able to bring back the messages deleted by the last @rmm, any messages deleted before then are really gone, i.e., irrecoverable. See `help @unrmmail' for more information. 2 2 This command may be used on other mail recipients (children of $mail_recipient), but only ones to which you have write access (you either have to own it or be on good terms with whoever does...). 38 5 4 14 2 Syntax: @read <message-number> 2 @read 2 @peek ... 2 2 Prints the contents of the indiciated messages from your MOO email collection. You get the message numbers for use here by typing the '@mail' command, which prints a table of contents for your entire MOO email collection. If no arguments are given to @read, then the 'current message' in your collection is printed. In any case, the 'current message' after @read finishes is the last one printed. 2 2 The most general form of the @read command is 2 2 @read <message-sequence> [on *<collection>] 2 2 where <message-sequence> is as described in `help message-sequences'. 2 As with the @mail command you may @read messages on any publically readable collection (child of $mail_recipient). 2 2 The @peek command is a variant of @read that works no differently except that it refrains from setting your `current message'. This is useful, for example, if you want to see some particular message on a collection without losing track of where you are in it. 38 5 4 10 2 Syntax: @send <recipient> [<recipient> ...] [subj[ect]="<subject>"] 2 2 Prepares for you to compose a MOO email message to the recipients named on the command line. A recipient can be specified by giving a player name or object-id, or a '*' followed by the name or object-id of some non-player mail recipient (e.g., a mailing list or a mail folder) -- a list of such non-player recipients is available from within the mailroom with the 'showlists' command. 2 2 The usual editor is invoked. 2 You will be prompted for a subject line if you did not specify one in the @send command (see `help mail_options' for how to avoid this). 2 Use `say' (") to insert lines in the body of your message. 2 See `help editors' for details. 2 2 Giving this command without arguments resumes editing the previous unsent draft message if one exists. 38 5 4 33 2 The MOO email system allows you to send and receive messages to and from other players. It provides commands to view and manage your own collection of saved messages and, in addition, to browse through other collections that may be available (e.g.,archives of public mailing lists). Help is available on the following commands: 2 2 @mail -- seeing a table of contents for a collection of email messages 2 @read -- reading individual messages 2 @next -- reading the 'next' message 2 @prev -- reading the 'previous' message 2 2 @send -- composing and sending a message to other players 2 @answer -- replying to one of the messages in a collection 2 @forward -- resending one of the messages in a collection somewhere else 2 2 @rmmail -- discarding some subset of a collection 2 @unrmmail -- undoing the most recent @rmm on a collection 2 @renumber -- renumbering the messages in a collection 2 2 @mail-option -- describes and sets various customization flags 2 2 help mail-forwarding 2 -- describes mail forwarding 2 help message-sequences 2 -- describes message-sequences arguments to @mail, @read, @rmm, and @answer. 2 2 For viewing collections other from your own, the following commands are useful: 2 2 @rn -- list those collections that have new messages on them 2 @subscribe -- indicate that you want @rn to report on a given collection 2 and add yourself to its .mail_notify list 2 @skip -- ignore any remaining new messages in a given collection 2 @unsubscribe -- ignore a given collection entirely from now on 2 and remove yourself from its .mail_notify list 2 @unsubscribed-- show the mailing lists that you aren't subscribed to. 2 @subscribed -- like @rn, but shows all lists that you are subscribed to 2 even if they have no new activity 38 5 4 13 2 Syntax: @gripe <anything> ... 2 2 Puts you into the MOO mail system to register a complaint (or, conceivably, a compliment) with the wizards. The rest of the command line (the <anything> ... part) is used as the subject line for the message. More information on using the MOO mail system is given once you're in it. 2 2 You may hear back from the wizards eventually; see 'help @mail' for how to read their reply. 2 2 Example: 2 Munchkin types: 2 @gripe The little bird 2 "How come I can't ever see the little bird in the cuckoo clock? 2 " -- A frustrated player 2 send 2 and, somewhat later, the wizards reply with a note about being sure to look while the clock is chiming. 38 5 4 11 2 The primary means for players to extend the MOO is for them to create new objects with interesting behavior. There are convenient commands for creating and recycling objects and for keeping track of the objects you've created. Help is available on these commands in the following topics: 2 2 @dig -- conveniently building new rooms and exits 2 @create -- making other kinds of objects 2 @recycle -- destroying objects you no longer want 2 @quota -- determining how many more objects you can build 2 @count -- determining how many objects you already own 2 @audit -- listing all of your objects 2 @classes -- listing all of the public classes available for your use 2 @realm -- listing the parenting tree for objects owned by one or more players 2 @move -- moving your objects from place to place 38 1 4 16 2 Syntax: @mail 2 @mail new (to see recent messages) 2 @mail 1-$ (to see *all* messages) 2 2 Shows a table of contents for your MOO email message collection. You are notified when you connect to the MOO if there are any such messages. A little arrow indicates the mail system's notion of your 'current message'. 2 The first form lists all of your messages or the last 15 if you have more than that many; the second form lists only those messages after your `current message'. The third form shows your entire collection. 2 2 If you have a large number of mail messages, you can give arguments so that @mail only lists the messages you're interested in. You can also list messages residing on mail recipients which are public or for which you have read access. 2 The general format is 2 2 @mail <message-sequence> [on *<recipient>] 2 2 <recipient> must name some child of $mail_recipient (e.g., a mailing list); 2 <message-sequence> can be a sequence of message numbers; you can also scan the recipient for articles that fit a given description, as specified in `help message-sequences'. 2 2 Note that if you view mail on some other recipient and have "sticky" in your .mail_options (see `help mail-options'), all further mail commands (e.g., @read, @next, @rmm,...) will apply to that recipient. In this case use `@mail on me' to go back to looking at your own mail. 38 1 4 4 2 Syntax: @listgag 2 @gaglist 2 2 Shows you a list of the players and objects currently on your 'gag list'. You don't see any messages that result from actions initiated by the players or objects on this list. In particular, you will not hear them if they try to speak, emote, or whisper to you. See 'help gagging' for an explanation of gagging in general. 38 1 4 9 2 Syntax: @ungag <player or object> 2 @ungag everyone 2 2 Remove the given player or object (or, in the second form, everyone) from your 'gag list'. You will once again see any messages that result from actions initiated by the ungagged player(s) or objects. In particular, you will once again be able to hear them if they speak, emote, or whisper to you. See 'help gagging' for an explanation of gagging in general. 2 2 Example: 2 Munchkin types: 2 @ungag Grover 2 and is once again able to hear Grover's witty remarks. Sigh... 38 1 4 12 2 Syntax: @gag <player or object> [<player or object>...] 2 2 Add the given players to your 'gag list'. You will no longer see any messages that result from actions initiated by these players. In particular, you will not hear them if they try to speak, emote, or whisper to you. See 'help gagging' for an explanation of gagging in general. 2 2 Example: 2 Munchkin types: 2 @gag Grover 2 and no longer hears anything that Grover says. What a relief! 2 2 If you specify an object, then any text originating from that object will not be printed. Example: Noisy Robot prints "Hi there" every 15 seconds. In order to avoid seeing that, Munchkin types: 2 @gag Noisy 2 and no longer hears that robot! (Munchkin must be in the same room as Noisy Robot for this to work, or know its object number.) 38 1 4 8 2 Syntax: go <direction> ... 2 2 Invokes the named exits in the named order, moving through many rooms in a single command. 2 2 Example: 2 Munchkin types: 2 go n e e u e e s e 2 and moves quite rapidly from the Living Room all the way to the Bovine Illuminati Atrium, all in one command. 38 1 4 7 2 Syntax: @password <old-password> <new-password> 2 2 Changes your player's password (as typed in the 'connect' command when you log in to the MOO) to <new-password>. For security reasons, you are required to type your current (soon to be old) password as the first argument. 2 2 Your password is stored in an encrypted form in the MOO database; in principle, not even the wizards can tell what it is, though they can change it, of course. It is recommended that your password not be your name or a common word; MOO passwords have been stolen or cracked in the past and characters have been made unhappy by such theft. Your password is your security; choose a safe one. 2 2 Only the first 8 characters of a password are significant. 38 1 4 3 2 Syntax: @sethome 2 2 Sets your designated home (see `help home') to be the room you're in now. If the current room wouldn't allow you to teleport in, then the `@sethome' command nicely refuses to set your home there. This avoids later, perhaps unpleasant, surprises. Additionally, your home must be a room that will allow you to stay there. Rooms which you own will do this, as will rooms to which you have been added as a resident. See the @resident command for help on adding someone as a resident to a room you own. 38 1 4 9 2 *subst* 2 Syntax: @who 2 @who <player> [<player> ... ] 2 2 The first form lists all of the currently-connected players, along with the amount of time they've been connected, the amount of time they've been idle, and their present location in the MOO. 2 2 The second form, in which a list of player names is given, shows information for just those players. For any listed players that are not connected, we show the last login time instead of the connect/idle times. 2 2 @who refers to the @who_location message (see 'help messages') on each player's location in order to determine what should be printed in the location column. Pronoun substitutions are done on this string in the usual manner (see 'help pronouns'). The default value is "%[$room.who_location_msg]" (i.e., the room name). 38 1 4 17 2 LambdaMOO is a kind of virtual reality, in which players move about from place to place manipulating their environment in what we hope are amusing, entertaining, or enlightening ways. 2 2 LambdaMOO is more of a pastime than a game in the usual sense; there is no `score' kept, there are no specific goals to attain in general, and there's no competition involved. LambdaMOO participants explore the virtual world, talk to the other participants, try out the weird gadgets that others have built, and create new places and things for others to encounter and enjoy. 2 2 Most commands have the form of simple English sentences: 2 <verb> 2 <verb> <direct object> 2 <verb> <direct object> <preposition> <indirect object> 2 Don't use English articles (e.g. 'a', 'an', or 'the') in your commands; the MOO won't understand them. You can refer to yourself as 'me' and the room you're in as 'here'. 2 2 The first five kinds of commands you'll want to know are listed below. Type 'help <topic-name>' for details on any of them: 2 2 look -- getting a description of the current room or any other object 2 say -- speaking to the other players in the same room as you 2 @who -- showing which players are currently connected to the MOO 2 movement -- how to move around in the MOO, from room to room 2 @quit -- disconnecting from the MOO 38 1 4 4 2 Syntax: give <object> to <player> 2 hand <object> to <player> 2 2 Move an object from your contents to that of another player. This doesn't change the ownership of the object. Some players may refuse to accept gifts and some objects may refuse to be given. 38 5 4 3 2 Syntax: news 2 2 Read the latest edition of the LambdaMOO Times, which carries articles concerning recent changes to the MOO server or to the main public classes, or whatever the wizards feel like writing about. 38 5 4 5 2 Occasionally, you may run into a situation in which you'd rather not hear from certain other players. It might be that they're being annoying, or just that whatever they're doing makes a lot of noise. Gagging a player will stop you from hearing the results of any task initiated by that player. You can also gag a specific object, if you want to hear what the owner of that object says, but not the output from their noisy robot. The commands to use gagging are listed below; detailed help is available on each of them: 2 2 @gag -- add one or more players to your gag list 2 @ungag -- remove a player from your gag list 2 @listgag -- list the players you currently have gagged 38 5 4 24 2 Syntax: @dig "<new-room-name>" 2 @dig <exit-spec> to "<new-room-name>" 2 @dig <exit-spec> to <old-room-object-number> 2 2 This is the basic building tool. The first form of the command creates a new room with the given name. The new room is not connected to anywhere else; it is floating in limbo. The @dig command tells you its object number, though, so you can use the @move command to get there easily. 2 2 The second form of the command not only creates the room, but one or two exits linking your current location to (and possibly from) the new room. An <exit-spec> has one of the following two forms: 2 <names> 2 <names>|<names> 2 where the first form is used when you only want to create one exit, from your current room to the new room, and the second form when you also want an exit back, from the new room to your current room. In any case, the <names> piece is just a list of names for the exit, separated by commas; these are the names of the commands players can type to use the exit. It is usually a good idea to include explicitly the standard abbreviations for direction names (e.g., 'n' for 'north', 'se' for 'southeast', etc.). DO NOT put spaces in the names of exits; they are useless in MOO. 2 2 The third form of the command is just like the second form except that no new room is created; you instead specify by object number the other room to/from which the new exits will connect. 2 2 NOTE: You must own the room at one end or the other of the exits you create. If you own both, everything is hunky-dorey. If you own only one end, then after creating the exits you should write down their object numbers. You must then get the owner of the other room to use @add-exit and @add-entrance to link your new exits to their room. 2 2 Examples: 2 @dig "The Conservatory" 2 creates a new room named "The Conservatory" and prints out its object number. 2 @dig north,n to "The North Pole" 2 creates a new room and also an exit linking the player's current location to the new room; players would say either 'north' or 'n' to get from here to the new room. No way to get back from that room is created. 2 @dig west,w|east,e,out to "The Department of Auto-Musicology" 2 creates a new room and two exits, one taking players from here to the new room (via the commands 'west' or 'w') and one taking them from the new room to here (via 'east', 'e', or 'out'). 2 @dig up,u to #7164 2 creates an exit leading from the player's current room to #7164, which must be an existing room. 38 5 4 5 2 Syntax: @move <thing> to <place> 2 2 Move the specified object to the specified location. This is not guaranteed to work; in particular, the object must agree to be moved and the destination must agree to allow the object in. This is usually the case, however. The special case where <thing> is 'me' is useful for teleporting yourself around. 2 2 If @move doesn't work and you own the room where the object is located, try using @eject instead. 38 5 4 4 2 Syntax: inventory 2 i 2 2 Prints a list showing every object you're carrying. 38 5 4 3 2 Syntax: @entrances 2 2 Prints a list of all recognized entrances to the current room (but only if you own the room). A recognized entrance is one whose use is not considered to be teleportation. 38 5 4 3 2 Syntax: @exits 2 2 Prints a list of all conventional exits from the current room (but only if you own the room). A conventional exit is one that can be used simply by typing its name, like 'east'. 38 5 4 8 2 Syntax: @gender <gender> 2 @gender 2 2 The first form, with an argument, defines your player to have the gender <gender>. If <gender> is one of the standard genders (e.g., 'male', 'female', 'neuter',...), your various pronouns will also be set appropriately, making exits and certain other objects behave more pleasantly for you. 2 2 The second form tells you the current definition of your player's gender, your current pronouns, and the complete list of standard genders. 2 2 It should be noted that some of the "genders" on the standard gender list need verb conjugation in order to work properly and much of the MOO isn't set up for this (...yet). For example, you should expect to see `they is' a fair amount if you @gender yourself `plural'. 38 5 4 3 2 Syntax: @recycle <object-name-or-number> 2 2 Destroys the indicated object utterly and irretrievably. Naturally, you may only do this to objects that you own. 38 5 4 21 2 Syntax: @rename <object> to [name-and-alias],<alias>,...,<alias> 2 @rename <object> to [name]:<alias>,...,<alias> 2 @rename <object>:<verb> to <new-verb-name> 2 2 The first two forms are used to change the name and aliases of an object. The name is what will be used in most printed descriptions of the object. The aliases are the names by which players can refer to the object in commands. Typically you want to include the name in the aliases, as the MOO parser only checks .aliases when matching, so the first syntax is generally preferred. 2 2 If you leave out the "name" part of the list, @rename will leave the object's name as it is, and only change the aliases. 2 2 Note that for renaming players, more stringent rules apply. See `help player-names'. Certain other kinds of objects (e.g., mail recipients) also enforce their own rules w.r.t what they can be named. 2 2 Examples: 2 Munchkin names his dog: 2 @rename #4237 to "Rover the Wonder Dog":Rover,dog 2 Now we'll see 'Rover the Wonder Dog' if we're in the same room as him and we can refer to him as either 'Rover' or just 'dog' in our commands, like 'pet dog'. Note, however, that it will be impossible to use "Rover the Wonder Dog" to rever to the dog: if you don't include the name in the aliases, confusion can result. It might have been better to start off with 2 @rename #4237 to "Rover the Wonder Dog",Rover,dog 2 2 Since he didn't, Munchkin now changes his dog's aliases: 2 @rename #4237 to ,Rover,dog,Rover the Wonder Dog 2 The name remains the same--we still see 'Rover the Wonder Dog'--but now any of 'Rover', 'dog', or 'Rover the Wonder Dog' can be used to refer to him. This can help reduce confusion. 2 2 The third form of the @rename command is for use by programmers, to change the name of a verb they own. If the <new-verb-name> contains spaces, the verb will have multiple names, one for each space-separated word. 38 5 4 15 2 Containers are objects that allow you to store other objects inside them. The following help topics cover verbs that can be used with containers: 2 2 put -- putting an object into a container 2 remove -- taking an object out of a container 2 2 Containers may be open or closed, using the verbs 'open container' and 'close container'. Containers have a separate lock to determine if a player may open them. See the following help topics: 2 2 @lock_for_open -- setting the lock for opening a container 2 @unlock_for_open -- clearing the lock 2 2 You can make a container by creating a child of the standard container, $container (see 'help @create'). 2 2 Containers have a large number of messages which get printed when players act upon them. See 'help container-messages' for more information. 2 2 Containers have opacity. See 'help @opacity' for more information. 38 1 4 15 2 Notes are objects that can have text written on them to be read later. They are useful for leaving messages to people, or for documenting your creations. 2 2 The following help topics cover verbs that can be used with notes: 2 2 read -- reading the text on the note 2 write -- adding text to a note 2 erase -- removing all the text from a note 2 delete -- deleting one line of text from a note 2 2 @notedit -- general editing on the text of a note 2 2 encrypt -- restricting who can read a note 2 decrypt -- undoing a previous encryption 2 2 You can make a note by creating a child of the standard note, $note (see 'help @create'). Note that, like most objects, only the owner of a note can recycle it. If you'd like to make it possible for a reader of your note to destroy it (this is a common desire for notes to other individual players), then you might want to look at 'help letters'. 38 5 4 11 2 Syntax: look 2 look <object> 2 look <object> in <container> 2 2 Show a description of something. 2 2 The first form, with no arguments, shows you the name and description of the room you're in, along with a list of the other objects that are there. 2 2 The second form lets you look at a specific object. Most objects have descriptions that may be read this way. You can look at your own description using 'look me'. You can set the description for an object or room, including yourself, with the 'describe' command (see 'help describe'). 2 2 The third form shows you the description of an object that is inside some other object, including objects being carried by another player. 38 5 4 4 2 Syntax: drop <object> 2 throw <object> 2 2 Remove an object you are carrying from your inventory and put it in your current room. Occasionally you may find that the owner of the room won't allow you to do this. 38 5 4 2 2 *forward* 2 take 38 5 4 17 2 Objects usually have verbs defined on them that allow players to manipulate and use them in various ways. Standard ones are: 2 2 get -- pick an object up and place it in your inventory 2 drop -- remove an object from your inventory and place it in the room 2 put -- take an object from your inventory and place it in a container 2 give -- hand an object to some other player 2 look -- see what an object looks like 2 2 You can see what objects you're carrying with the 'inventory' command; see 'help inventory' for details. 2 2 Some specialized objects will have other commands. The programmer of the object will usually provide some way for you to find out what the commands are. One way that works for most objects is the 'examine' command; see 'help examine' for details. 2 2 The following specialized objects have help entries you should consult: 2 2 notes -- objects that allow text to be written on them and read later 2 letters -- notes that a recipient can burn after reading 2 containers -- objects that may contain other objects 38 5 4 18 2 Syntax: help 2 help <topic> 2 help index 2 2 Print out entries from the online documentation system. The commands `?' and `information' (usually abbreviated `info') are synonyms for `help'. 2 2 The first form prints out a summary table of contents for the entire help system. 2 2 The second form prints out the documentation available on the given topic. Many help system entries contain references to other entries accessible in this way. The topic name may be abbreviated; if there is no topic exactly matching the name you give, the help system checks for topics for which the name is a prefix, perhaps with the addition or omission of an initial `@', or perhaps with some confusion beween dashes (-) and underscores (_), e.g., 2 `bui' instead of `building', 2 `who' instead of `@who', 2 `@wri' instead of `write', 2 `add_ent' instead of `@add-entrance', 2 `unlock-' instead of `@unlock_for_open' 2 2 If the abbreviation you give is ambiguous, you will be presented with a list of the matching complete topic names. 2 2 The `help index' commands prints out a list of indices for the various help databases. Each index gives a list of topics available on that database. It is sometimes easier to find the topics you're interested in this way, rather than tracing through the chain of cross references. 38 1 4 1 2 Rooms may be made by builders, using the DIG verb. By default, all rooms are instances of _the_ room, $room, or #3, which you can examine to see how it works. If you require a room to have a more specific behaviour, you can make a subclass of room. 38 1 4 5 2 The descriptions of most rooms outline the directions in which exits exist. Typical directions include the eight compass points ('north', 'south', 'east', 'west', 'northeast', 'southeast', 'northwest', and 'southwest'), 'up', 'down', and 'out'. 2 2 To go in a particular direction, simply type the name of that direction (e.g, 'north', 'up'). The name of the direction can usually be abbreviated to one or two characters (e.g., 'n', 'sw'). You can also type 'go <direction>' to move; this is particularly useful if you know you're going to type several movement commands in a row (see 'help go'). 2 2 In addition to such vanilla movement, some areas may contain objects allowing teleportation and almost all areas permit the use of the 'home' command to teleport you to your designated home (see 'help home' for more details). 38 1 4 6 2 *subst* 2 Syntax: home 2 2 Instantly teleports you to your designated home room. 2 Initially, this room is %[tostr($player_start.name," (",$player_start,")")]. 2 You can change your designated home; see 'help @sethome' for details. 38 1 4 15 2 There are several commands available to allow you to communicate with your fellow MOOers. Help is available on the following communication-related topics: 2 2 say -- talking to the other connected players in the room 2 whisper -- talking privately to someone in the same room 2 page -- yelling to someone anywhere in the MOO 2 emote -- non-verbal communication with others in the same room 2 gagging -- screening out noise generated by certain other players 2 news -- reading the wizards' most recent set of general announcements 2 @gripe -- sending complaints to the wizards 2 @typo @bug @idea @suggest 2 -- sending complaints/ideas to the owner of the current room 2 whereis -- locating other players 2 @who -- finding out who is currently logged in 2 mail -- the MOO email system 2 security -- the facilities for detecting forged messages and eavesdropping. 38 1 4 12 2 Syntax: say <anything> ... 2 "<anything> ... 2 2 Says <anything> out loud, so that everyone in the same room hears it. This is so commonly used that there's a special abbreviation for it: any command-line beginning with a double-quote ('"') is treated as a 'say' command. 2 2 Example: 2 Munchkin types this: 2 "This is a great MOO! 2 Munchkin sees this: 2 You say, "This is a great MOO!" 2 Others in the same room see this: 2 Munchkin says, "This is a great MOO!" 38 1 4 2 2 whisper "<text>" to <player> 2 sends the message "<yourname> whispers, "<text>" to you " to <player>, if they are in the room. 38 1 4 27 2 *subst* 2 Syntax: page <player> [[with] <text>] 2 2 Sends a message to a connected player, telling them your location and, optionally, <text>. 2 2 Example: 2 Munchkin types: 2 page Frebble with "Where are you?" 2 Frebble sees: 2 You sense that Munchkin is looking for you in the Kitchen. 2 He pages, "Where are you?" 2 Munchkin sees: 2 Your message has been received. 2 2 Advanced Features: 2 Page refers to the following messages on the players involved (see 'help messages'): 2 2 @page_origin [%[$player.page_origin_msg]] 2 Determines how the recipient is told of your location. 2 2 @page_echo [%[$player.page_echo_msg]] 2 Determines the response received by anyone who pages you. 2 2 @page_absent [%[$player.page_absent_msg]] 2 Determines the response received by anyone who tries to page you when you aren't connected. 2 2 All of these undergo the usual pronoun substitutions (see 'help pronouns') except that in both cases the direct object (%d) refers to the recipent of the page and the indirect object (%i) refers to the sender. You should only change these messages if you want to add to the Virtual Reality feel of the MOO for your character. 38 1 4 18 2 Syntax: emote <anything> ... 2 :<anything> ... 2 ::<anything> ... 2 2 Announces <anything> to everyone in the same room, prepending your name. This is commonly used to express various non-verbal forms of communication. In fact, it is so commonly used that there's a special abbreviation for it: any command-line beginning with ':' is treated as an 'emote' command. 2 2 The alternate form, '::' (less commonly 'emote :'), does not insert the space between the player name and the text. 2 2 Examples: 2 Munchkin types this: 2 :wishes he were much taller... 2 Everyone in the same room sees this: 2 Munchkin wishes he were much taller... 2 2 Munchkin types this: 2 ::'s eyes are green. 2 Everyone in the same room sees this: 2 Munchkin's eyes are green. 38 1 4 6 2 There are a number of commands available to players for building new parts of the MOO. Help on them is available under the following topics: 2 2 creation -- making, unmaking, and listing your rooms, exits, and other objects 2 topology -- making and listing the connections between rooms and exits 2 descriptions -- setting the names and descriptive texts for new objects 2 locking -- controlling use of and access to your objects 38 1 4 8 2 There are a number of commands for modifying various characteristics of the object representing you in the MOO, your 'player'. Help on them is available in the following topics: 2 2 @describe -- setting what others see when they look at you 2 @gender -- changing your player's gender 2 @password -- changing your player's password 2 @sethome -- changing your designated home room 2 @rename -- changing your name and/or aliases 2 @linelength -- adding word-wrap to the lines you see 38 1 4 18 2 Help is available on the following general topics: 2 2 introduction -- what's going on here and some basic commands 2 index -- index into the help system 2 2 players -- setting characteristics of yourself 2 movement -- moving yourself between rooms 2 communication -- communicating with other players 2 manipulation -- moving or using other objects 2 miscellaneous -- commands that don't fit anywhere else 2 2 building -- extending the MOO 2 programming -- writing code in the MOO programming language 2 editors -- editing text and code in the MOO 2 2 @pagelength -- what to do if lines scroll off your screen too fast 2 @linelength -- what to do if lines are truncated 2 tinymud -- a list of equivalences between MOO and TinyMUD concepts/commands 38 5 4 21 2 Syntax: @edit-option 2 @edit-option <option> 2 2 Synonym: @editoption 2 2 The edit options customize the behavior of the various editors (mail editor, verb editor, etc...) to your particular taste. The first form of this command displays all of your edit options. The second form displays just that one option, one of the flags listed below. 2 2 The remaining forms of this command are for setting your edit options: 2 2 @edit-option +<flag> 2 @edit-option -<flag> 2 @edit-option !<flag> (equivalent to -<flag>) 2 2 These respectively set and reset the specified flag 2 2 -quiet_insert insert (") and append (:) echo back the line numbers 2 +quiet_insert insert (") and append (:) produce no output 2 -eval_subs (VERB EDITOR) ignore .eval_subs when compiling verbs 2 +eval_subs (VERB EDITOR) apply .eval_subs to verbs being compiled 2 -local Use in-MOO text editors. 2 +local Ship text to client for local editing. 38 5 4 2 2 *forward* 2 @edit-options 38 5 4 4 2 Usage: @add-feature <object> 2 @remove-feature <object> 2 2 Add or remove a feature from your list. A feature is an object which provides additional commands you can use. For more information, see `help features'. 38 5 4 2 2 *forward* 2 @add-feature 38 5 4 3 2 Usage: @features [<name>] [for <player>] 2 2 List all of <player>'s features matching <name>, or all of <player>'s features if <name> is not supplied. <player> defaults to you. See `help features' for more information. 38 5 4 3 2 Features are objects that provide you with commands not covered by the ordinary player objects. The advantage of using features is that you can mix and match the things you like; whereas if you like a command that's defined on a player class, you have to also get all the commands it defines, and all the commands its ancestors define. 2 2 You can list your features with the @features command, and add or remove features from your list with the @add-feature and @remove-feature commands. 38 5 4 7 2 Syntax: @dump <object> [with [id=#<id>] [noprops] [noverbs] [create]] 2 2 This spills out all the properties and verbs on an object, calling suspend at appropriate intervals. 2 id=#<id> -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO) 2 noprops -- don't show properties. 2 noverbs -- don't show verbs. 2 create -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it. 2 1 4 1 2 The MOO helps those who help themselves. Try starting with `help summary'. 38 5 4 7 2 Syntax: @rmalias <alias>[,...,<alias>] from <object> 2 @rmalias <alias>[,...,<alias>] from <object>:<verb> 2 2 The first form is used to remove aliases from an object. If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases. Otherwise, only commas will be assumed to be separations. 2 Note that @rmalias will not affect the object's name, only its aliases. 2 2 The second form is for use by programmers, to remove aliases from a verb they own. All spaces and commas are assumed to be separations between unwanted aliases. 38 5 4 22 2 Syntax: @addalias <alias>[,...,<alias>] to <object> 2 @addalias <alias>[,...,<alias>] to <object>:<verb> 2 2 The first form is used to add aliases to an object's list of aliases. You can separate multiple aliases with commas. The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added. 2 2 Example: 2 Muchkin wants to add new aliases to Rover the Wonder Dog: 2 @addalias Dog,Wonder Dog to Rover 2 Since Rover the Wonder Dog already has the alias "Dog" but does not have the alias "Wonder Dog", Munchkin sees: 2 Rover the Wonder Dog(#4237) already has the alias Dog. 2 Alias Wonder Dog added to Rover the Wonder Dog(#4237). 2 2 If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified. 2 2 Example: 2 Munchkin wants to add his nicknames to his own list of aliases: 2 @addalias Foobar Davey to me 2 @Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database. Unfortunately, DaveTheMan is already using the alias "Davey" so Munchkin sees: 2 DaveTheMan(#5432) is already using the alias Davey 2 Alias Foobar added to Munchkin(#1523). 2 2 The second form of the @addalias command is for use by programmers, to add aliases to a verb they own. All commas and spaces are assumed to be separations between aliases. 38 5 4 5 2 *forward* 2 summary 2 2 Type 'help <topic>' for information on a particular topic. 2 38 5 4 4 2 Every object (including players, rooms, exits) has a name and a set of aliases. The object name is commonly used to display an object in various contexts. The object aliases are used to refer to an object when players type commands. 2 Help is available on the following commands: 2 @rename -- change the names or aliases of an object or yourself. 2 @addalias, @rmalias -- add and remove aliases. 38 5 4 2 2 *forward* 2 name 38 5 4 4 2 Syntax: @set <object>.<prop-name> to <value> 2 2 Changes the value of the specified object's property to the given value. 2 You must have permission to modify the property, either because you own the property or if it is writable. 38 5 4 3 2 *forward* 2 @setprop 2 @set is a valid abbreviation for @setprop. 38 5 4 2 2 *forward* 2 @read 38 5 4 3 2 Syntax: @subscribed 2 2 Like @rn, but shows you ALL mailing lists to which you are subscribed, even those which have new messages. 38 5 4 5 2 Usage: @request <player-name> for <email-address> 2 2 This command available to Guest characters only. 2 2 The @request command requests a new character, registered for your email address. Please use your primary address for this, as your password will be sent to the address provided. 38 5 4 6 2 *subst* 2 A player name must be a single word, must not contain any spaces, backslashes, or quotes, nor can it begin with the characters #, *, (, or ). Finally it cannot be one that is in use by any other player nor any of the words on the following list: 2 2 %;;lns={};for l in ($string_utils:columnize({@$player_db.stupid_names,@$player_db.reserved},6)) lns={@lns," "+l}; endfor return lns; 2 2 Note that these rules apply as well to your single-word aliases, since those can equally well be used to refer to you in commands that match on player names (@who, whereis, ...). There are no restrictions on your multi-word aliases, however the commands that expect player names will not recognize them. 38 5 4 6 2 @registerme as <email-address> 2 This verb changes your registered email_address property. It will modify the registration, and then, to validate the email address, it will assign a new password and mail the password to the given email_address. 2 If, for some reason, this is a problem for you, contact a wizard or registrar to get your email address changed. 2 2 @registerme 2 Prints your registered email address. 38 5 4 14 2 Syntax: @netforward <message-number> 2 @netforward 2 @netforward <message-sequence> on *collection 2 2 Forwards the contents of the indiciated messages from your MOO email collection to your registered email address. You get the message numbers for use here by typing the '@mail' command, which prints a table of contents for your entire MOO email collection. If no arguments are given to @netforward, then the 'current message' in your collection is sent. In any case, the 'current message' after @netforward finishes is not affected. 2 2 The most general form of the @netforward command is 2 2 @netforward <message-sequence> [on *<collection>] 2 2 where <message-sequence> is as described in `help message-sequences'. 2 As with the @mail command you may @netforward messages on any publically readable collection (child of $mail_recipient). 2 2 If you do not have a valid registered email address, you will not be able to use this command and must first @registerme or get a wizard to register your address. `help @registerme' for details. 38 5 4 2 2 *forward* 2 @eject 38 5 4 3 2 Gopher is an internet service for information retrieval. There are many gopher servers across the internet, providing a wide variety of information of all sorts: network news, weather, and White House press releases, campus class information, and scientific papers. 2 2 The programmer interface to Gopher is contained in the object $gopher (`help $gopher'). 38 5 5 38 5 5 38 4 4 0 38 5 4 9 2 The object $help is the main help database. For every help topic there is a corresponding property on $help, interpreted as follows: 2 2 $help.(topic) = string - one-line help text. 2 $help.(topic) = {"*verb*",@args} - call this:verb(args,{}) to get text 2 $help.(topic) = any other list - multi-line help text 2 2 There is also a "" property which applies in the case of `help' typed without any arguments. 2 2 See the description of $generic_help for more detail. 38 5 4 2 0 130276 0 750665652 2 1 #62 Recycling Center 16 38 -1 -1 -1 5 -1 74 11 _recreate 2 173 -1 _recycle 2 173 -1 _create 2 165 -1 addhist 2 173 -1 show*-history 2 37 -1 request 2 153 5 setup_toad 2 173 -1 add_orphan 38 173 -1 remove_orphan 38 173 -1 valid 2 173 -1 init_for_core 2 173 -1 4 orphans announce_removal_msg nhist history 16 4 0 38 1 2 38 5 0 50 38 0 4 0 38 0 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 4 4 2 2 Recycling Center 2 Center 38 5 2 Object reuse. Call $recycler:_create() to create an object (semantics the same as create()), $recycler:_recycle() to recycle an object. Will create a new object if nothing available in its contents. Note underscores, to avoid builtin :recycle() verb called when objects are recycled. Uses $building_utils:recreate() to prepare objects. 38 5 4 2 0 8518 0 750667114 2 1 #63 Generic Garbage Object 16 2 -1 -1 -1 -1 -1 -1 4 description 2 173 -1 look_self 2 173 -1 title titlec 2 173 -1 tell 2 173 -1 1 aliases 1 4 1 2 garbage 2 1 #64 Mail Options 16 38 -1 -1 -1 67 -1 65 12 actual 38 173 -1 parse_@mail 38 173 -1 parse_sticky parse_manymsgs 38 173 -1 parse_replyto 38 173 -1 show_manymsgs 38 173 -1 show_sticky 38 173 -1 show_@mail 38 173 -1 show_replyto 38 173 -1 show 38 173 -1 check_replyto 38 173 -1 show_netmail 2 173 -1 check_netmail 2 173 -1 8 show_include show_all show_nosubject show_expert show_enter type_manymsgs type_@mail type_replyto 16 4 2 2 Original message will not be included in replies 2 Original message will be included in replies 38 5 4 2 2 Replies will go to original sender only. 2 Replies will go to original sender and all previous recipients. 38 5 4 2 2 Mail editor will initially require a subject line. 2 Mail editor will not initially require a subject line. 38 5 4 2 2 Novice mail user... 2 Expert mail user... 38 5 4 2 2 Mail editor will not start with an implicit `enter' command. 2 Mail editor will start with an implicit `enter' command. 38 5 4 1 0 0 38 5 4 2 0 2 4 1 0 2 38 5 4 2 0 1 4 1 0 1 38 5 4 10 2 include 2 all 2 nosubject 2 expert 2 enter 2 sticky 2 @mail 2 manymsgs 2 replyto 2 netmail 38 1 2 !include!noinclude!all!sender!nosubject!expert!enter!sticky!@mail!manymsgs!replyto!netmail! 38 1 4 2 2 noinclude 2 sender 38 1 5 38 5 5 38 4 4 1 2 Mail Options 38 5 2 Options for mailing 38 5 4 2 0 5996 0 750669227 2 1 #65 Edit Options 16 38 -1 -1 -1 67 -1 66 0 3 show_quiet_insert show_eval_subs show_local 11 4 2 2 Report line numbers on insert or append. 2 No echo on insert or append. 38 5 4 2 2 Ignore .eval_subs when compiling verbs. 2 Use .eval_subs when compiling verbs. 38 5 4 2 2 Use in-MOO text editors. 2 Ship text to client for local editing. 38 5 4 3 2 quiet_insert 2 eval_subs 2 local 38 1 2 !quiet_insert!eval_subs!local! 38 1 5 38 1 0 20 38 5 5 38 4 4 1 2 Edit Options 38 5 5 38 5 4 2 0 741 0 750668540 2 1 #66 Display Options 16 38 -1 -1 -1 67 -1 68 0 3 show_blank_tnt show_shortprep show_thisonly 11 4 2 2 Treat `this none this' verbs like the others. 2 Blank out the args on `this none this' verbs. 38 5 4 2 2 Display prepositions in full. 2 Use short forms of prepositions. 38 5 4 2 2 ./: will show ancestor properties/verbs if none on this. 2 ./: will not show ancestor properties/verbs. 38 5 4 3 2 blank_tnt 2 shortprep 2 thisonly 38 1 2 !blank_tnt!shortprep!thisonly! 38 1 4 0 38 1 5 38 5 5 38 4 4 1 2 Display Options 38 5 5 38 5 4 2 0 801 0 750669753 2 1 #67 Generic Option Package 144 38 -1 -1 -1 1 64 69 12 get 38 173 -1 set 38 173 -1 parse 38 173 -1 _name 38 173 -1 add_name 38 173 -1 remove_name 38 173 -1 show 38 173 -1 actual 38 173 -1 istype 38 173 -1 islistof 38 173 -1 desc_type 38 173 -1 parsechoice 38 173 -1 4 names _namelist extras namewidth 8 4 0 38 1 2 ! 38 1 4 0 38 1 0 15 38 5 5 38 4 4 1 2 Generic Option Package 38 5 2 an option package in need of a description. See `help $generic_option'... 38 5 4 2 0 14525 0 750671739 2 1 #68 List Options 0 38 -1 -1 -1 67 -1 -1 2 actual 38 173 -1 show 38 173 -1 2 show_parentheses show_nonumbers 10 4 2 2 Parenthesize expressions in listings only as needed. 2 Fully parenthesize expressions in listings. 38 5 4 2 2 Include line numbers. 2 Omit line numbers. 38 5 4 2 2 parentheses 2 nonumbers 38 1 2 !parentheses!nonumbers!numbers! 38 1 4 1 2 numbers 38 1 0 20 38 5 5 38 4 4 1 2 List Options 38 5 5 38 5 4 2 0 1059 0 750751246 2 1 #69 Error Generator 16 2 -1 -1 -1 1 -1 72 18 raise 38 173 -1 E_NONE 38 173 -1 E_TYPE 38 173 -1 E_DIV 38 173 -1 E_PERM 38 173 -1 E_PROPNF 38 173 -1 E_VERBNF 38 173 -1 E_VARNF 38 173 -1 E_INVIND 38 173 -1 E_RECMOVE 38 173 -1 E_MAXREC 38 173 -1 E_RANGE 38 173 -1 E_ARGS 38 173 -1 E_NACC 38 173 -1 E_INVARG 38 173 -1 E_QUOTA 2 173 -1 acceptable 38 173 -1 name 38 173 -1 1 names 5 4 15 2 E_NONE 2 E_TYPE 2 E_DIV 2 E_PERM 2 E_PROPNF 2 E_VERBNF 2 E_VARNF 2 E_INVIND 2 E_RECMOVE 2 E_MAXREC 2 E_RANGE 2 E_ARGS 2 E_NACC 2 E_INVARG 2 E_QUOTA 2 5 5 2 4 4 1 2 Error Generator 2 5 4 3 2 Object to automatically generate errors. 2 2 raise(error) actually raises the error. 2 5 4 2 0 2145 0 750665657 2 1 #70 Site-Locks 0 38 -1 -1 -1 46 -1 -1 1 init_for_core 38 173 -1 0 18 4 0 38 5 0 751048546 38 1 4 0 38 0 0 1 38 5 2 %n (%#) can't send to moderated list %t (%[#t]) directly. 38 5 4 0 38 5 4 0 38 5 4 1 1 2 38 1 4 2 1 2 1 70 38 1 0 2592000 38 5 0 0 38 1 4 0 38 0 5 38 5 5 38 5 5 38 4 4 1 2 Site-Locks 38 1 2 Notes on annoying sites. 38 5 4 2 0 54872 0 750754235 2 1 #71 housekeeper 19 38 -1 -1 -1 59 -1 -1 20 look_self 38 173 -1 cleanup 38 165 -1 replace 38 165 -1 cleanup_list 38 21 -1 add_cleanup 38 93 -2 remove_cleanup 38 29 -1 controls 38 173 -1 continuous 38 165 -1 litterbug 38 173 -1 is_watching 38 173 -1 send_home 38 173 -1 moveit 2 173 -1 ejectit 2 173 -1 is_object_cleaned 38 173 -1 is_litter 38 173 -1 init_for_core 2 173 -1 clean_status 38 173 -1 is_cleaning 38 173 -1 time 38 173 -1 acceptable 2 173 -1 11 recycle_bins owners cleaning litter eschews public_places task requestors destination clean testing 73 4 0 38 5 4 1 1 2 38 5 1 -1 38 5 4 0 38 5 4 0 38 5 4 0 38 5 0 0 38 5 4 0 38 5 4 0 38 5 4 0 38 1 0 0 38 5 4 0 38 1 5 38 5 5 38 5 2 here=player.location;me=player 38 5 5 38 5 4 0 38 1 4 2 0 743752457 2 golden 2 0 5 38 5 5 2 0 0 745055032 2 1 0 0 38 5 5 38 5 5 38 1 5 38 1 5 38 0 5 38 1 0 276800495 38 5 4 1 1 36830 2 1 0 -80 38 1 1 36830 38 4 5 2 0 5 2 0 5 38 5 4 0 38 4 5 38 5 4 0 38 4 0 0 38 4 2 The housekeeper is too busy putting away all of the junk all over LambdaMoo that there isn't time to listen to pages and stuff like that so your page isn't listened to, too bad. 38 5 2 the housekeeper's 38 5 2 The housekeeper's 38 5 5 38 5 5 38 5 5 38 5 4 2 1 122 1 9082 38 5 5 38 5 4 0 38 5 4 2 0 2 0 0 38 4 5 38 4 0 745054858 2 1 0 21 2 0 5 38 5 2 'Self 38 5 2 The housekeeper's 38 5 2 The housekeeper 38 5 2 The housekeeper 38 5 2 'self 38 5 2 the housekeeper's 38 5 2 the housekeeper 38 5 2 the housekeeper 38 5 1 11 38 5 2 Impossible password to type 2 0 5 38 5 0 0 38 5 5 38 5 5 38 5 5 38 5 0 0 2 1 5 38 4 5 38 4 4 1 2 housekeeper 2 1 2 A very clean, neat, tidy person who doesn't mind lugging players and their gear all over the place. 38 5 4 2 0 24335 0 751015510 2 1 #72 Network Utilities 16 2 -1 -1 -1 1 -1 75 15 parse_address 2 173 -1 local_domain 2 173 -1 open 2 165 -1 close 2 165 -1 sendmail 2 29 -1 trust 2 173 -1 init_for_core 2 173 -1 raw_sendmail 2 21 -1 invalid_email_address 2 173 -1 invalid_hostname 2 173 -1 email_will_fail 2 173 -1 read 2 173 -1 is_open 38 165 -1 incoming_connection 2 173 -1 return_address_for 2 173 -1 16 site large_domains open_connections connect_connections_to postmaster port MOO_name valid_host_regexp maildrop trusts reply_address active valid_email_regexp invalid_userids debugging ignore 20 2 yoursite 2 1 4 0 2 1 4 0 2 1 4 0 2 0 2 postmastername@yourhost 2 5 0 7777 2 5 2 YourMOO 2 5 2 ^%([-a-z0-9]+%.%)+%(gov%|edu%|com%|org%|int%|mil%|net%|%nato%|arpa%|[a-z][a-z]%)$ 2 5 2 localhost 2 5 4 0 2 1 2 moomailreplyto@yourhost 2 5 0 0 2 5 2 ^[-a-z0-9_!.%]+$ 2 5 4 7 2 2 sysadmin 2 root 2 postmaster 2 system 2 operator 2 bin 2 5 0 0 2 5 4 0 2 1 0 0 2 4 4 1 2 Network Utilities 2 5 4 74 2 Utilities for dealing with network connections 2 --------------- 2 Creating & tracking hosts: 2 2 :open(host, port [, connect-connection-to]) => connection 2 open a network connection (using open_network_connection). 2 If 'connect-connection-to' is a player object, the 2 connection will be connected to that object when it 2 gets the first line of input. 2 2 :close(connection) 2 closes the connection & cleans up data 2 2 ------------------ 2 Parsing network things: 2 2 :invalid_email_address(email) 2 return "" or string saying why 'email' is invalid. 2 uses .valid_email_regexp 2 2 :invalid_hostname(host) 2 return "" or string saying why 'host' doesn't look 2 like a valid internet host name 2 2 :local_domain(host) 2 returns the 'important' part of a host name, e.g. 2 golden.parc.xerox.com => parc.xerox.com 2 2 ------------------- 2 Sending mail 2 2 :sendmail(to, subject, @lines) 2 send mail to the email address 'to' with indicated subject. 2 header fields like 'from', 'date', etc. are filled in. 2 lines can start with additional header lines. 2 2 :raw_sendmail(to, @lines) 2 used by :sendmail. Send mail to given user at host, just 2 as specified, no error checking. 2 2 ================================================================ 2 Parameters: 2 2 .active If 0, disabled sending of mail. 2 2 .site Where does this MOO run? 2 (Maybe MOOnet will use it later). 2 2 .port The network port this MOO listens on. 2 2 .large_domains 2 A list of sites where more than 2 levels of host name are 2 significant, e.g., if you want 'parc.xerox.com' to be 2 different than 'cinops.xerox.com', put "xerox.com" as an 2 element in .large_domains. 2 2 .postmaster 2 Email address to which problems with MOO mail should 2 go. This should be a real email address that someone reads. 2 2 .maildrop 2 Hostname to connect to for dropping off mail. Usually can 2 just be "localhost". 2 2 .reply_address 2 If a MOO character sends email, where does a reply go? 2 Inserted in 'From:' for mail from characters without 2 registration addresses. 2 2 .trusts 2 List of (non-wizard) programmers who can call 2 :open, :sendmail, :close 2 2 2 5 4 2 0 15287 0 751017525 2 1 #73 Generic BigList Resident 144 38 -1 -1 -1 1 -1 22 6 _make 2 173 -1 _kill 2 173 -1 _get 38 173 -1 _put 38 173 -1 _genprop 38 173 -1 _ord 38 173 -1 3 _genprop mowner _mgr 7 2 38 5 1 4292 38 5 1 5533 38 5 5 38 4 4 3 2 biglist 2 resident 2 gblr 38 5 4 1 2 This is the object you want to use as a parent in order to @create a place for your biglists to live. Suitably sick souls may wish to reimplement :_genprop and :_kill to reclaim unused properties (this :_kill just throws them away and this :_genprop just relentlessly advances.... who cares). Anyway, you'll need to look at $biglist before this will make sense. 38 5 4 2 0 2160 0 750668560 2 1 #74 Generic Feature Object 144 38 -1 -1 -1 5 -1 76 8 help_msg 38 173 -1 look_self 38 173 -1 using this 38 173 -1 examine_commands_ok 2 173 -1 set_feature_ok 38 165 -1 hidden_verbs 38 173 -1 set_feature_verbs 38 165 -1 initialize 38 165 -1 4 warehouse help_msg feature_verbs feature_ok 16 1 24300 38 1 2 The Generic Feature Object--not to be used as a feature object. 38 5 4 1 2 Using 38 1 0 1 38 1 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 4 4 4 2 Generic Feature Object 2 Generic .Features_Huh Object 2 Feature Object 2 .Features_Huh Object 38 5 2 This is the Generic Feature Object. It is not meant to be used as a feature object itself, but is handy for making new feature objects. 38 5 4 2 0 4356 0 750671636 2 1 #75 Gopher utilities 16 2 -1 -1 -1 1 -1 -1 17 get_now 2 165 -1 parse 2 173 -1 show_text 2 165 -1 type 2 173 -1 summary 2 173 -1 get 2 173 -1 clear_cache 2 173 -1 unparse 2 173 -1 interpret_error 2 173 -1 trusted 2 173 -1 _textp 2 173 -1 _mail_text 2 173 -1 init_for_core 2 173 -1 display_cache 2 45 -1 get_cache 2 173 -1 cache_entry 2 173 -1 help_msg 2 173 -1 5 cache_requests cache_times cache_values limit cache_timeout 9 4 0 2 1 4 0 2 1 4 0 2 1 0 2000 2 5 0 900 2 1 0 0 2 4 4 1 2 Gopher utilities 2 5 4 30 2 An interface to Gopher internet services. 2 Copyright (c) 1992,1993 Grump,JoeFeedback@LambdaMOO. 2 2 This object contains just the raw verbs for getting data from gopher servers and parsing the results. Look at #50122 (Generic Gopher Slate) for one example of a user interface. 2 2 :get(site, port, selection) 2 Get data from gopher server: returns a list of strings, or an error if it couldn't connect. Results are cached. 2 2 :get_now(site, port, selection) 2 Used by $gopher:get. Arguments are the same: this actually gets the 2 data without checking the cache. (Don't call this, since the 2 caching is important to reduce lag.) 2 2 :show_text(who, start, end, site, port, selection) 2 Requires wiz-perms to call. 2 like who:notify_lines($gopher:get(..node..)[start..end]) 2 2 :clear_cache() 2 Erase the gopher cache. 2 2 :parse(string) 2 Takes a directory line as returned by $gopher:get, and return a list 2 {host, port, selector, label} 2 host, port, and selector are what you send to :get. 2 label is a string, where the first character is the type code. 2 2 :type(char) 2 returns the name of the gopher type indicated by the character, e.g. 2 $gopher:type("I") => "image" 2 2 5 4 2 0 19537 0 750671906 2 1 #76 NNTP 16 38 -1 -1 -1 5 -1 -1 27 open 38 165 -1 article head body 38 165 -1 check_id 38 165 -1 nntp_read 38 165 -1 init_for_core 38 13 -1 close 38 5 -1 fetch_article fetch_body fetch_head 38 165 -1 @update 38 33 -1 fixup_headers 38 173 -1 get_connection 38 165 -1 release_connection 38 165 -1 post 38 173 -1 posting_ok 38 173 -1 check_cache 38 173 -1 reorder_cache 38 173 -1 insert_cache 38 173 -1 log_error 38 173 -1 flush_cache 38 173 -1 expire_cache 38 173 -1 @expire @expire-task @expire-kill 38 41 -1 expire_task 38 173 -1 fetch_newnews 38 165 -1 newnews 38 165 -1 read_line 2 173 -1 send_line 2 173 -1 fetch_xhdr 38 173 -1 xhdr 38 173 -1 24 host port cache_times cache_values cache_requests error_log debug last_groups_update newsgroups timeformat connect_max connections in_use posting_allowed posting_ok cache_limit help_msg line_limit timeout distributions expiry expire_task expire_delay xhdr_enabled 36 2 38 5 0 119 38 5 4 0 38 5 4 0 38 5 4 0 38 5 4 0 38 5 0 0 38 5 0 100000000 38 5 4 0 38 5 2 $y$1$3 $H$M$S 38 5 0 0 38 5 4 0 38 5 4 0 38 5 0 1 38 5 4 2 1 6924 1 122 38 5 0 10 38 5 4 3 2 The MOO NNTP agent fetches and posts USENET news articles. It is designed to be used primarily as a programmer's tool, especially in situations where it is necessary, from a hypertext document, to refer to a news article. 2 The interface consists primarily of two verbs: #33339:fetch_{article,head,body}, which fetch an article, the header of an article, or the body of an article respectively, and #33339:post which posts an item to a newsgroup (if posting is enabled and the user is either a wizard or trusted to post news.) 2 For help on individual verbs, type "help #33339:fetch_article", or "help #33339:post". 38 5 0 2000 38 5 0 30 38 5 4 0 38 5 0 432000 38 5 0 0 38 5 0 172800 38 5 0 1 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 5 38 5 0 0 38 4 4 3 2 NNTP 2 Newsboy 2 Newsie 38 5 2 A lot like Dennis the Menace, with a bag of newspapers slung over one shoulder. 38 5 4 2 0 24905 0 751014194 2 1 #77 Generic Gendered Object 144 2 -1 -1 -1 1 37 35 2 set_gender 2 173 -1 @gen*der 2 105 12 11 gender pqc pq ppc pp prc pr poc po psc ps 15 2 neuter 2 5 2 its 2 5 2 its 2 5 2 Its 2 5 2 its 2 5 2 Itself 2 5 2 itself 2 5 2 It 2 5 2 it 2 5 2 It 2 5 2 it 2 5 0 0 2 4 4 1 2 Generic Gendered Object 2 5 5 2 5 4 2 0 2160 0 750669757 2 1 #0:0 "...This code should only be run as a server task..."; if (callers()) return E_PERM; endif if (typeof(h = $network:incoming_connection(player)) == OBJ) "connected to an object"; return h; elseif (h) "A runaway? What's this for? -- #122 9/29/93"; return 0; endif host = $string_utils:connection_hostname(connection_name(player)); if ($login:redlisted(host)) boot_player(player); server_log(tostr("REDLISTED: ", player, " from ", host)); return 0; elseif ((length(connected_players()) >= $login.max_connections) && (!(host in $login.unlimited_hosts))) notify(player, $login.connection_limit_msg); boot_player(player); server_log(tostr("CONNECTION LIMIT EXCEEDED: ", player, " from ", host)); return 0; endif args = $login:parse_command(@args); return $login:(args[1])(@listdelete(args, 1)); . #0:1 callers() || ($last_restart_time = time()); . #0:2 saved = {#0}; for p in (properties(#0)) v = #0.(p); if ((typeof(v) == OBJ) && valid(v)) saved = setadd(saved, v); endif endfor for o in (saved) p = parent(o); while (valid(p)) saved = setadd(saved, p); p = parent(p); endwhile endfor return $list_utils:sort(saved); . #0:3 if (caller_perms().wizard) pass(); if ("server_started" in verbs(this)) code = {"callers() || ($last_restart_time = time());"}; set_verb_code(this, "server_started", code); endif $shutdown_message = ""; $shutdown_time = 0; $dump_interval = 3600; $gripe_recipients = {player}; $class_registry = {{"generics", "Generic objects intended for use as the parents of new objects", {$room, $exit, $thing, $note, $letter, $container, $root_class, $player, $prog, $wiz, $generic_editor, $mail_recipient, $mail_agent}}, {"utilities", "Objects holding useful general-purpose verbs", {$string_utils, $gender_utils, $trig_utils, $time_utils, $match_utils, $object_utils, $lock_utils, $list_utils, $command_utils, $code_utils, $perm_utils, $building_utils}}}; endif . #0:4 user = args[1]; fork (0) user:confunc(); endfork user.location:confunc(user); . #0:5 user = args[1]; fork (0) user.location:disfunc(user); endfork user:disfunc(); . #1:0 if (typeof(this.owner.owned_objects) == LIST) this.owner.owned_objects = setadd(this.owner.owned_objects, this); endif if ((caller == this) || $perm_utils:controls(caller_perms(), this)) this.object_size = {0, 0}; this.key = 0; else return E_PERM; endif . #1:1 if ((caller == this) || $perm_utils:controls(caller_perms(), this)) if (typeof(this.owner.owned_objects) == LIST) this.owner.owned_objects = setremove(this.owner.owned_objects, this); endif else return E_PERM; endif . #1:2 "set_name(newname) attempts to change this.name to newname"; " => E_PERM if you don't own this or aren't its parent, or are a player trying to do an end-run around $player_db..."; if ((!caller_perms().wizard) && (is_player(this) || ((caller_perms() != this.owner) && (this != caller)))) return E_PERM; else return (typeof(e = (this.name = args[1])) != ERR) || e; endif . #1:3 return this.name; . #1:4 return $object_utils:has_property(this, "namec") ? this.namec | $string_utils:capitalize(this:title()); . #1:5 "set_aliases(alias_list) attempts to change this.aliases to alias_list"; " => E_PERM if you don't own this or aren't its parent"; " => E_TYPE if alias_list is not a list"; " => E_INVARG if any element of alias_list is not a string"; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; elseif (typeof(aliases = args[1]) != LIST) return E_TYPE; else for s in (aliases) if (typeof(s) != STR) return E_INVARG; endif endfor this.aliases = aliases; return 1; endif . #1:6 c = this:contents(); return $string_utils:match(args[1], c, "name", c, "aliases"); . #1:7 ":match_object(string [,who])"; args[2..1] = {this}; return $string_utils:match_object(@args); . #1:8 "set_description(newdesc) attempts to change this.description to newdesc"; " => E_PERM if you don't own this or aren't its parent"; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; elseif (typeof(desc = args[1]) in {LIST, STR}) this.description = desc; return 1; else return E_TYPE; endif . #1:9 return this.description; . #1:10 desc = this:description(); if (desc) player:tell_lines(desc); else player:tell("You see nothing special."); endif . #1:11 player:tell("The examine command has been renamed to @examine. Please use @examine."); . #1:12 if (is_player(this)) notify(this, args[1]); endif . #1:13 this:notify(tostr(@args)); . #1:14 lines = args[1]; if (typeof(lines) == LIST) for line in (lines) this:tell(line); endfor else this:tell(lines); endif . #1:15 set_task_perms(caller_perms()); return this:acceptable(@args); . #1:16 set_task_perms(this.owner); return move(this, args[1]); . #1:17 "eject(victim) --- usable by the owner of this to remove victim from this.contents. victim goes to its home if different from here, or $nothing or $player_start according as victim is a player."; "eject_basic(victim) --- victim goes to $nothing or $player_start according as victim is a player; victim:moveto is not called."; what = args[1]; nice = (verb != "eject_basic"); perms = caller_perms(); if ((!perms.wizard) && (perms != this.owner)) return E_PERM; elseif ((!(what in this.contents)) || what.wizard) return 0; endif if (nice && ($object_utils:has_property(what, "home") && ((typeof(what.home) == OBJ) && ((what.home != this) && (is_player(what) ? what.home:accept_for_abode(what) | what.home:acceptable(what)))))) where = what.home; else where = (is_player(what) ? $player_start | $nothing); endif if (nice) fork (0) "...Some objects like to know they've been moved..."; "... this is the best we can do. Remember :moveto() may be broken."; what:moveto(where); endfork endif return move(what, where); . #1:18 return (this.key == 0) || $lock_utils:eval_key(this.key, args[1]); . #1:19 set_task_perms(valid(caller_perms()) ? caller_perms() | player); $command_utils:do_huh(verb, args); . #1:20 ":set_message(msg_name,new_value)"; "Does the actual dirty work of @<msg_name> object is <new_value>"; "changing the raw value of the message msg_name to be new_value."; "Both msg_name and new_value should be strings, though their interpretation is up to the object itself."; " => error value (use E_PROPNF if msg_name isn't recognized)"; " => string error message if something else goes wrong."; " => 1 (true non-string) if the message is successfully set"; " => 0 (false non-error) if the message is successfully `cleared'"; if (!((caller == this) || $perm_utils:controls(caller_perms(), this))) return E_PERM; else return (this.(args[1] + "_msg") = args[2]) && 1; endif . #1:21 "do_examine(examiner)"; "the guts of examine"; "call a series of verbs and report their return values to the player"; who = args[1]; "if (caller == this || caller == who)"; if (caller == who) "set_task_perms();"; who:notify_lines(this:examine_names(who) || {}); "this:examine_names(who);"; who:notify_lines(this:examine_owner(who) || {}); "this:examine_owner(who);"; who:notify_lines(this:examine_desc(who) || {}); "this:examine_desc(who);"; who:notify_lines(this:examine_key(who) || {}); "this:examine_key(who);"; who:notify_lines(this:examine_contents(who) || {}); who:notify_lines(this:examine_verbs(who) || {}); else return E_PERM; endif . #1:22 "examine_key(examiner)"; "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to."; "the default will only tell the key to a wizard or this object's owner."; who = args[1]; if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0)) return {tostr("Key: ", $lock_utils:unparse_key(this.key))}; "who:notify(tostr(\"Key: \", $lock_utils:unparse_key(this.key)));"; endif . #1:23 "examine_names(examiner)"; "Return a list of strings to be told to the player, indicating the name and aliases (and, by default, the object number) of this."; return {tostr(this.name, " (aka ", $string_utils:english_list({tostr(this), @this.aliases}), ")")}; . #1:24 "examine_desc(who) - return the description, probably"; "who is the player examining"; "this should probably go away"; desc = this:description(); if (desc) if (typeof(desc) != LIST) desc = {desc}; endif return desc; else return {"(No description set.)"}; endif . #1:25 "examine_contents(examiner)"; "by default, calls :tell_contents."; "Should probably go away."; who = args[1]; "if (caller == this && $object_utils:has_verb(this, \"tell_contents\"))"; if (caller == this) this:tell_contents(this.contents, this.ctype); endif . #1:26 "Return a list of strings to be told to the player. Standard format says \"Obvious verbs:\" followed by a series of lines explaining syntax for each usable verb."; if (caller != this) return E_PERM; endif who = args[1]; name = dobjstr; vrbs = {}; commands_ok = this:examine_commands_ok(who); dull_classes = {$root_class, $room, $player, $prog, $builder}; what = this; hidden_verbs = this:hidden_verbs(who); while (what != $nothing) $command_utils:suspend_if_needed(0); if (!(what in dull_classes)) for i in [0..length(verbs(what)) - 1] $command_utils:suspend_if_needed(0); info = verb_info(what, tostr(i)); syntax = verb_args(what, tostr(i)); if (this:examine_verb_ok(what, i, info, syntax, commands_ok, hidden_verbs)) dobj = syntax[1]; prep = syntax[2]; iobj = syntax[3]; if (syntax == {"any", "any", "any"}) prep = "none"; endif if (prep != "none") for x in ($string_utils:explode(prep, "/")) if (length(x) <= length(prep)) prep = x; endif endfor endif "This is the correct way to handle verbs ending in *"; vname = info[3]; while (i = index(vname, "* ")) vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]); endwhile if (vname[i = length(vname)] == "*") vname = (vname[1..i - 1] + "<anything>"); endif vname = strsub(vname, " ", "/"); rest = ""; if (prep != "none") rest = (" " + ((prep == "any") ? "<anything>" | prep)); if (iobj != "none") rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>"); endif endif if (dobj != "none") rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest); endif vrbs = setadd(vrbs, (" " + vname) + rest); endif endfor endif what = parent(what); endwhile if ($code_utils:verb_or_property(this, "help_msg")) vrbs = {@vrbs, tostr(" help ", dobjstr)}; endif return vrbs && {"Obvious verbs:", @vrbs}; . #1:27 ":get_message(msg_name)"; "Use this to obtain a given user-customizable message's raw value, i.e., the value prior to any pronoun-substitution or incorporation of any variant elements --- the value one needs to supply to :set_message()."; "=> error (use E_PROPNF if msg_name isn't recognized)"; "=> string or list-of-strings raw value"; "=> {2, @(list of {msg_name_n,rawvalue_n} pairs to give to :set_message)}"; "=> {1, other kind of raw value}"; "=> {E_NONE, error message} "; if (!((caller == this) || $perm_utils:controls(caller_perms(), this))) return E_PERM; elseif (((t = typeof(msg = this.(msgname = (args[1] + "_msg")))) in {ERR, STR}) || ((t == LIST) && (typeof(msg[1]) == STR))) return msg; else return {1, msg}; endif . #1:28 this.location:(verb)(@args); . #1:29 if (caller_perms().wizard) vnum = 0; while (vnum <= (length(verbs(this)) - 1)) $command_utils:suspend_if_needed(0); info = verb_info(this, tostr(vnum))[3]; if (index(info, "(old)")) delete_verb(this, tostr(vnum)); else vnum = (vnum + 1); endif endwhile endif . #1:30 "Returns a list of the objects that are apparently inside this one. Don't confuse this with .contents, which is a property kept consistent with .location by the server. This verb should be used in `VR' situations, for instance when looking in a room, and does not necessarily have anything to do with the value of .contents (although the default implementation does). `Non-VR' commands (like @contents) should look directly at .contents."; return this.contents; . #1:31 "examine_verb_ok(loc, index, info, syntax, commands_ok, hidden_verbs)"; "loc is the object that defines the verb; index is which verb on the object; info is verb_info; syntax is verb_args; commands_ok is determined by this:commands_ok, probably, but passed in so we don't have to calculate it for each verb."; "hidden_verbs is passed in for the same reasons. It should be a list, each of whose entries is either a string with the full verb name to be hidden (e.g., \"d*rop th*row\") or a list of the form {verb location, full verb name, args}."; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) loc = args[1]; info = args[3]; vname = info[3]; syntax = args[4]; hidden_verbs = args[6]; return (((((syntax[2..3] != {"none", "this"}) && (!index(vname, "("))) && (args[5] || ("this" in syntax))) && verb_code(loc, tostr(args[2]))) && (!(vname in hidden_verbs))) && (!({loc, vname, syntax} in hidden_verbs)); else return E_PERM; endif . #1:32 "return 1 if the object can hear a :tell, or cares. Useful for active objects that want to stop when nothing is listening."; return 0; . #1:33 "hidden_verbs(who)"; "returns a list of verbs on this that should be hidden from examine"; "the player who's examining is passed in, so objects can hide verbs from specific players"; "verbs are returned as {location, full_verb_name, args} or just full_verb_name. full_verb name is what shows up in verb_info(object, verb)[2], for example \"d*op th*row\"."; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) hidden = {}; what = this; while (what != $nothing) for i in [0..length(verbs(what)) - 1] info = verb_info(what, tostr(i)); if (!index(info[2], "r")) hidden = setadd(hidden, {what, info[3], verb_args(what, tostr(i))}); endif endfor what = parent(what); endwhile return hidden; else return E_PERM; endif . #1:34 "examine_owner(examiner)"; "Return a list of strings to be told to the player, indicating who owns this."; return {tostr("Owned by ", this.owner.name, ".")}; . #1:35 return; . #1:37 return 0; "intended as a 'quiet' way to determine if :accept will succeed. Currently, some objects have a noisy :accept verb since it is the only thing that a builtin move() call is guaranteed to call."; "if you want to tell, before trying, whether :accept will fail, use :acceptable instead. Normally, they'll do the same thing."; . #3:0 this:look_self(player.brief); this:announce(player.name, " has connected."); . #3:1 fork (300) if ((((valid(player) && (!(player in connected_players()))) && ((player.last_connect_time + 300) < time())) && (this != player.home)) && (player.location != player.home)) fork (0) "This is forked so that it's protected from aborts due to errors in the player's :moveto verb."; if (player.location != player.home) move(player, $player_start); endif endfork start = player.location; player:moveto(player.home); if (player.location != start) start:announce("The housekeeper arrives to cart ", player.name, " off to bed."); endif if (player.location == player.home) player.home:announce("The housekeeper arrives to drop off ", player.name, ", who is sound asleep."); endif endif endfork this:announce(player.name, " has disconnected."); . #3:2 player:tell("You say, \"", argstr, "\""); this:announce(player.name, " says, \"", argstr, "\""); . #3:3 if ((argstr != "") && (argstr[1] == ":")) this:announce_all(player.name, argstr[2..length(argstr)]); else this:announce_all(player.name, " ", argstr); endif . #3:4 for dude in (setremove(this:contents(), player)) dude:tell(@args); endfor . #3:5 what = args[1]; if (what) yes = $failed_match; for e in (this.exits) if (valid(e) && (what in {e.name, @e.aliases})) if (yes == $failed_match) yes = e; elseif (yes != e) return $ambiguous_match; endif endif endfor return yes; else return $nothing; endif . #3:6 set_task_perms(caller_perms()); return (this.exits = setadd(this.exits, args[1])) != E_PERM; . #3:7 contents = args[1]; ctype = args[2]; if ((!this.dark) && (contents != {})) if (ctype == 0) player:tell("Contents:"); for thing in (contents) player:tell(" ", thing:title()); endfor elseif (ctype == 1) for thing in (contents) if (is_player(thing)) player:tell(thing:title(), " is here."); else player:tell("You see ", thing:title(), " here."); endif endfor elseif (ctype == 2) player:tell("You see ", $string_utils:title_list(contents), " here."); elseif (ctype == 3) players = (things = {}); for x in (contents) if (is_player(x)) players = {@players, x}; else things = {@things, x}; endif endfor if (things) player:tell("You see ", $string_utils:title_list(things), " here."); endif if (players) player:tell($string_utils:title_listc(players), (length(players) == 1) ? " is" | " are", " here."); endif endif endif . #3:8 if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this)) player:tell("Sorry, only the owner of a room may list its exits."); elseif (this.exits == {}) player:tell("This room has no conventional exits."); else for exit in (this.exits) player:tell(exit.name, " (", exit, ") leads to ", valid(exit.dest) ? exit.dest.name | "???", " (", exit.dest, ") via {", $string_utils:from_list(exit.aliases, ", "), "}."); endfor endif . #3:9 player:tell(this:title()); if (!(args && args[1])) pass(); endif this:tell_contents(setremove(this:contents(), player), this.ctype); . #3:10 what = args[1]; return this:is_unlocked_for(what) && (((this.free_entry || ((what == this.blessed_object) && (task_id() == this.blessed_task))) || (what.owner == this.owner)) || ((typeof(this.residents) == LIST) && (what in this.residents))); . #3:11 set_task_perms(caller_perms()); return (this.entrances = setadd(this.entrances, args[1])) != E_PERM; . #3:12 if (caller in this.entrances) this.blessed_object = args[1]; this.blessed_task = task_id(); endif . #3:13 if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this)) player:tell("Sorry, only the owner of a room may list its entrances."); elseif (this.entrances == {}) player:tell("This room has no conventional entrances."); else for exit in (this.entrances) player:tell(exit.name, " (", exit, ") comes from ", valid(exit.source) ? exit.source.name | "???", " (", exit.source, ") via {", $string_utils:from_list(exit.aliases, ", "), "}."); endfor endif . #3:14 if ((!args) || (!(dir = args[1]))) player:tell("You need to specify a direction."); return E_INVARG; elseif (valid(exit = player.location:match_exit(dir))) exit:invoke(); if (length(args) > 1) "Now give objects in the room we just passed through a chance to act."; suspend(0); player.location:go(@listdelete(args, 1)); endif elseif (exit == $failed_match) player:tell("You can't go that way (", dir, ")."); else player:tell("I don't know which direction `", dir, "' you mean."); endif . #3:15 if ((dobjstr == "") && (!prepstr)) this:look_self(); elseif ((prepstr != "in") && (prepstr != "on")) if ((!dobjstr) && (prepstr == "at")) dobjstr = iobjstr; iobjstr = ""; else dobjstr = (dobjstr + (prepstr && ((dobjstr && " ") + prepstr))); dobjstr = (dobjstr + (iobjstr && ((dobjstr && " ") + iobjstr))); endif dobj = this:match_object(dobjstr); if (!$command_utils:object_match_failed(dobj, dobjstr)) dobj:look_self(); endif elseif (!iobjstr) player:tell(verb, " ", prepstr, " what?"); else iobj = this:match_object(iobjstr); if (!$command_utils:object_match_failed(iobj, iobjstr)) if (dobjstr == "") iobj:look_self(); elseif ((thing = iobj:match(dobjstr)) == $failed_match) player:tell("I don't see any \"", dobjstr, "\" ", prepstr, " ", iobj.name, "."); elseif (thing == $ambiguous_match) player:tell("There are several things ", prepstr, " ", iobj.name, " one might call \"", dobjstr, "\"."); else thing:look_self(); endif endif endif . #3:16 for dude in (this:contents()) dude:tell(@args); endfor . #3:17 text = listdelete(args, 1); contents = this:contents(); for l in (args[1]) contents = setremove(contents, l); endfor for listener in (contents) listener:tell(@text); endfor . #3:18 object = args[1]; if (is_player(object)) player = object; this:look_self(player.brief); endif if (object == this.blessed_object) this.blessed_object = #-1; endif . #3:19 return; . #3:20 exit = args[1]; if (caller != exit) set_task_perms(caller_perms()); endif return (this.exits = setremove(this.exits, exit)) != E_PERM; . #3:21 exit = args[1]; if (caller != exit) set_task_perms(caller_perms()); endif return (this.entrances = setremove(this.entrances, exit)) != E_PERM; . #3:22 set_task_perms(player); if (!dobjstr) player:tell("Usage: @add-exit <exit-number>"); return; endif exit = this:match_object(dobjstr); if ($command_utils:object_match_failed(exit, dobjstr)) return; endif if (!($exit in $object_utils:ancestors(exit))) player:tell("That doesn't look like an exit object to me..."); return; endif dest = exit.dest; source = exit.source; if (dest == E_PERM) player:tell("You can't read the exit's destination to check that it's consistent!"); return; elseif (source == E_PERM) player:tell("You can't read that exit's source to check that it's consistent!"); return; elseif (source != this) player:tell("That exit wasn't made to be attached here; it was made as an exit from ", source.name, " (", source, ")."); return; elseif (((typeof(dest) != OBJ) || (!valid(dest))) || (!($room in $object_utils:ancestors(dest)))) player:tell("That exit doesn't lead to a room!"); return; endif if (!this:add_exit(exit)) player:tell("Sorry, but you must not have permission to add exits to this room."); else player:tell("You have added ", exit, " as an exit that goes to ", exit.dest.name, " (", exit.dest, ") via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), "."); endif . #3:23 set_task_perms(player); if (!dobjstr) player:tell("Usage: @add-entrance <exit-number>"); return; endif exit = this:match_object(dobjstr); if ($command_utils:object_match_failed(exit, dobjstr)) return; endif if (!($exit in $object_utils:ancestors(exit))) player:tell("That doesn't look like an exit object to me..."); return; endif dest = exit.dest; if (dest == E_PERM) player:tell("You can't read the exit's destination to check that it's consistent!"); return; elseif (dest != this) player:tell("That exit doesn't lead here!"); return; endif if (!this:add_entrance(exit)) player:tell("Sorry, but you must not have permission to add entrances to this room."); else player:tell("You have added ", exit, " as an entrance that gets here via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), "."); endif . #3:24 "Make a mild attempt to keep people and objects from ending up in #-1 when people recycle a room"; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) "... first try spilling them out onto the floor of enclosing room if any"; if (valid(this.location)) for x in (this.contents) x:moveto(this.location); endfor endif "... try sending them home..."; for x in (this.contents) if (is_player(x)) if ((typeof(x.home) == OBJ) && valid(x.home)) x:moveto(x.home); endif if (x.location == this) move(x, $player_start); endif elseif (valid(x.owner)) x:moveto(x.owner); endif endfor pass(@args); else return E_PERM; endif . #3:25 exit = this:match_exit(verb); if (valid(exit)) exit:invoke(); elseif (exit == $failed_match) player:tell("You can't go that way."); else player:tell("I don't know which direction `", verb, "' you mean."); endif . #3:26 set_task_perms(player); if ($command_utils:object_match_failed(dobj, dobjstr)) return; elseif (dobj.location != this) player:tell(dobj.name, "(", dobj, ") is not here."); return; elseif (!$perm_utils:controls(player, this)) player:tell("You are not the owner of this room."); return; elseif (dobj.wizard) player:tell("Sorry, you can't ", verb, " a wizard."); dobj:tell(player.name, " tried to ", verb, " you."); return; endif iobj = this; player:tell(this:ejection_msg()); this:((verb == "@eject") ? "eject" | "eject_basic")(dobj); if (verb != "@eject!!") dobj:tell(this:victim_ejection_msg()); endif this:announce_all_but({player, dobj}, this:oejection_msg()); . #3:27 return $string_utils:pronoun_sub(this.(verb)); . #3:28 who = args[1]; return (valid(who) && ((this.free_home || $perm_utils:controls(who, this)) || ((typeof(residents = this.residents) == LIST) ? who in this.residents | (who == this.residents)))) && this:acceptable(who); . #3:29 if (!$perm_utils:controls(player, this)) player:tell("You must own this room to manipulate the legal residents list. Try contacting ", this.owner.name, "."); else if (typeof(this.residents) != LIST) this.residents = {this.residents}; endif if (!dobjstr) "First, remove !valid objects from this room..."; for x in (this.residents) if (!valid(x)) player:tell("Warning: removing ", x, ", an invalid object, from the residents list."); this.residents = setremove(this.residents, x); endif endfor player:tell("Allowable residents in this room: ", $string_utils:english_list($list_utils:map_prop(this.residents, "name"), "no one"), "."); return; elseif (dobjstr[1] == "!") notflag = 1; dobjstr = dobjstr[2..length(dobjstr)]; else notflag = 0; endif result = $string_utils:match_player_or_object(dobjstr); if (!result) return; else "a one element list was returned to us if it won."; result = result[1]; if (notflag) if (!(result in this.residents)) player:tell(result.name, " doesn't appear to be in the residents list of ", this.name, "."); else this.residents = setremove(this.residents, result); player:tell(result.name, " removed from the residents list of ", this.name, "."); endif else if (result in this.residents) player:tell(result.name, " is already an allowed resident of ", this.name, "."); else this.residents = {@this.residents, result}; player:tell(result.name, " added to the residents list of ", this.name, "."); endif endif endif endif . #3:30 target = {@this:contents(), @this:exits()}; return $string_utils:match(args[1], target, "name", target, "aliases"); . #3:31 set_task_perms(player); if (!dobjstr) player:tell("Usage: @remove-exit <exit>"); return; endif exit = this:match_object(dobjstr); if (!(exit in this.exits)) if ($command_utils:object_match_failed(exit, dobjstr)) return; endif player:tell("Couldn't find \"", dobjstr, "\" in the exits list of ", this.name, "."); return; elseif (!this:remove_exit(exit)) player:tell("Sorry, but you do not have permission to remove exits from this room."); else name = (valid(exit) ? exit.name | "<recycled>"); player:tell("Exit ", exit, " (", name, ") removed from exit list of ", this.name, " (", this, ")."); endif . #3:32 set_task_perms(player); if (!dobjstr) player:tell("Usage: @remove-entrance <entrance>"); return; endif entrance = $string_utils:match(dobjstr, this.entrances, "name", this.entrances, "aliases"); if (!valid(entrance)) "Try again to parse it. Maybe they gave object number. Don't complain if it's invalid though; maybe it's been recycled in some nefarious way."; entrance = this:match_object(dobjstr); endif if (!(entrance in this.entrances)) player:tell("Couldn't find \"", dobjstr, "\" in the entrances list of ", this.name, "."); return; elseif (!this:remove_entrance(entrance)) player:tell("Sorry, but you do not have permission to remove entrances from this room."); else name = (valid(entrance) ? entrance.name | "<recycled>"); player:tell("Entrance ", entrance, " (", name, ") removed from entrance list of ", this.name, " (", this, ")."); endif . #3:33 if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this)) return pass(@args); else return E_PERM; endif . #3:34 return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg, args[1]) | ""; . #3:35 if ((caller == this) || $perm_utils:controls(caller_perms(), this)) return this.(verb); else return E_PERM; endif . #3:36 exits = {}; for exit in (this.exits) if (exit.obvious) exits = setadd(exits, exit); endif endfor return exits; . #3:37 ":here_huh(verb,args) -- room-specific :huh processing. This should return 1 if it finds something interesting to do and 0 otherwise; see $command_utils:do_huh."; "For the generic room, we check for the case of the caller specifying an exit for which a corresponding verb was never defined."; set_task_perms(caller_perms()); if (args[2] || ($failed_match == (exit = this:match_exit(verb = args[1])))) "... okay, it's not an exit. we give up..."; return 0; elseif (valid(exit)) exit:invoke(); else "... ambiguous exit ..."; player:tell("I don't know which direction `", verb, "' you mean."); endif return 1; . #3:38 this:(verb[6..length(verb)])(@args); . #3:39 return this == args[1].location; . #3:40 "examine_key(examiner)"; "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to."; "the default will only tell the key to a wizard or this object's owner."; who = args[1]; if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0)) return {tostr(this:title(), " will accept only objects matching the following key:"), tostr(" ", $lock_utils:unparse_key(this.key))}; endif . #3:41 "examine_contents(who)"; if (caller == this) this:tell_contents(this.contents, this.ctype); endif . #4:0 if ((dobjstr == "") || (dobj == player)) q = player.ownership_quota; total = ((typeof(player.owned_objects) == LIST) ? length(setremove(player.owned_objects, player)) | 0); if (q == 0) player:notify(tostr("You can't create any more objects", (total < 1) ? "." | tostr(" until you recycle some of the ", total, " you already own."))); else player:notify(tostr("You can create ", q, " new object", (q == 1) ? "" | "s", (total == 0) ? "." | tostr(" without recycling any of the ", total, " that you already own."))); endif else set_task_perms(player); dobj = $string_utils:match_player(dobjstr); if (!valid(dobj)) player:notify("Show whose quota?"); return; endif q = dobj.ownership_quota; if (typeof(q) == ERR) player:notify(tostr(q)); else player:notify(tostr(dobj.name, "'s quota is currently ", q, ".")); endif endif . #4:1 set_task_perms(player); nargs = length(args); pos = ("named" in args); if ((pos <= 1) || (pos == nargs)) pos = ("called" in args); endif if ((pos <= 1) || (pos == nargs)) player:notify("Usage: @create <parent-class> named [name:]alias,...,alias"); player:notify(" or: @create <parent-class> named name-and-alias,alias,...,alias"); player:notify(""); player:notify("where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room."); player:notify("You can use \"called\" instead of \"named\""); return; endif parentstr = $string_utils:from_list(args[1..pos - 1], " "); namestr = $string_utils:from_list(args[pos + 1..nargs], " "); if (parentstr[1] == "$") parent = #0.(parentstr[2..length(parentstr)]); if (typeof(parent) != OBJ) player:notify(tostr("\"", parentstr, "\" does not name an object.")); return; endif else parent = player:my_match_object(parentstr); if ($command_utils:object_match_failed(parent, parentstr)) return; endif endif object = player:_create(parent); if (typeof(object) == ERR) player:notify(tostr(object)); return; endif move(object, player); $building_utils:set_names(object, namestr); if ((other_names = setremove(object.aliases, object.name)) != {}) aka = ((" (aka " + $string_utils:english_list(other_names)) + ")"); else aka = ""; endif player:notify(tostr("You now have ", object.name, aka, " with object number ", object, " and parent ", parent.name, " (", parent, ").")); . #4:2 set_task_perms(player); dobj = player:my_match_object(dobjstr); if (dobj == $nothing) player:notify(tostr("Usage: ", verb, " <object>")); elseif ($command_utils:object_match_failed(dobj, dobjstr)) "...bogus object..."; elseif (player == dobj) player:notify("You don't *really* want to commit suicide, do you?"); else name = dobj.name; result = player:_recycle(dobj); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr(name, " (", dobj, ") recycled.")); endif endif . #4:3 "@recreate <object> as <parent-class> named [name:]alias,alias,..."; " effectively recycles and creates <object> all over again."; set_task_perms(player); named = ("named" in args); as = (prepstr in args); if ((named <= (as + 1)) || (named == length(args))) player:notify_lines({tostr("Usage: ", verb, " <object> as <parent-class> named [name:]alias,...,alias"), "", "where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room. The [name:]alias... specification is as in @create."}); return; elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr)) return; elseif (is_player(dobj)) player:notify("You really *don't* want to do that!"); return; endif parentstr = $string_utils:from_list(args[as + 1..named - 1], " "); namestr = $string_utils:from_list(args[named + 1..length(args)], " "); if (parentstr[1] == "$") parent = #0.(parentstr[2..length(parentstr)]); if (typeof(parent) != OBJ) player:notify(tostr("\"", parentstr, "\" does not name an object.")); return; endif else parent = player:my_match_object(parentstr); if ($command_utils:object_match_failed(parent, parentstr)) return; endif endif if (!(e = $building_utils:recreate(dobj, parent))) player:notify(tostr(e)); return; endif move(dobj, player); $building_utils:set_names(dobj, namestr); if ((other_names = setremove(dobj.aliases, dobj.name)) != {}) aka = ((" (aka " + $string_utils:english_list(other_names)) + ")"); else aka = ""; endif player:notify(tostr("Object number ", dobj, " is now ", dobj.name, aka, " with parent ", parent.name, " (", parent, ").")); . #4:4 set_task_perms(player); nargs = length(args); if (nargs == 1) room = args[1]; exit_spec = ""; elseif ((nargs >= 3) && (args[2] == "to")) exit_spec = args[1]; room = $string_utils:from_list(args[3..nargs], " "); else player:notify(tostr("Usage: ", verb, " <new-room-name>")); player:notify(tostr(" or ", verb, " <exit-description> to <new-room-name-or-old-room-object-number>")); return; endif if (room != tostr(other_room = toobj(room))) other_room = player:_create($room); if (typeof(other_room) == ERR) player:notify(tostr(other_room)); return; endif other_room.name = room; other_room.aliases = {room}; move(other_room, $nothing); player:notify(tostr(other_room.name, " (", other_room, ") created.")); elseif (nargs == 1) player:notify("You can't dig a room that already exists!"); return; elseif ((!valid(player.location)) || (!($room in $object_utils:ancestors(player.location)))) player:notify(tostr("You may only use the ", verb, " command from inside a room.")); return; elseif ((!valid(other_room)) || (!($room in $object_utils:ancestors(other_room)))) player:notify(tostr(other_room, " doesn't look like a room to me...")); return; endif if (exit_spec) exits = $string_utils:explode(exit_spec, "|"); if ((length(exits) < 1) || (length(exits) > 2)) player:notify("The exit-description must have the form"); player:notify(" [name:]alias,...,alias"); player:notify("or [name:]alias,...,alias|[name:]alias,...,alias"); return; endif to_ok = $building_utils:make_exit(exits[1], player.location, other_room, player.recreate_enabled); if (to_ok && (length(exits) == 2)) $building_utils:make_exit(exits[2], other_room, player.location, player.recreate_enabled); endif endif . #4:5 "Usage: @audit [player] [from <start>] [to <end>] [for <matching string>]"; dobj = $string_utils:match_player(dobjstr); if (!dobjstr) dobj = player; elseif ($command_utils:player_match_result(dobj, dobjstr)[1]) return; endif dobjwords = $string_utils:words(dobjstr); if (args[1..length(dobjwords)] == dobjwords) args = args[length(dobjwords) + 1..length(args)]; endif if (!(parse_result = $code_utils:_parse_audit_args(@args))) player:notify(tostr("Usage: ", verb, " [player] [from <start>] [to <end>] [for <match>]")); return; endif return $building_utils:do_audit(dobj, @parse_result); . #4:6 if (!dobjstr) dobj = player; elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1]) return; endif set_task_perms(player); if (typeof(dobj.owned_objects) == LIST) count = length(dobj.owned_objects); player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s.")); else player:notify(tostr(dobj.name, " is not enrolled in the object ownership system. Use @countDB instead.")); endif . #4:7 if (!dobjstr) dobj = player; elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1]) return; endif set_task_perms(player); count = 0; for i in [1..tonum(max_object())] if ($command_utils:running_out_of_time()) player:notify("Counting..."); suspend(5); endif o = toobj(i); if (valid(o) && (o.owner == dobj)) count = (count + 1); endif endfor player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s.")); . #4:8 "$player:owned_objects -- sorts a players .owned_objects property in ascending"; "order so it looks nice on @audit."; if (player != this) return E_PERM; endif if (typeof(player.owned_objects) == LIST) ret = $list_utils:sort(player.owned_objects); if (typeof(ret) == LIST) player.owned_objects = ret; player:tell("Your .owned_objects list has been sorted."); return 1; else player:tell("Something went wrong. .owned_obejcts not sorted."); return 0; endif else player:tell("You are not enrolled in .owned_objects scheme, sorry."); endif . #4:9 if (player != this) player:tell("Permission Denied"); return E_PERM; endif if (!valid(dobj)) player:tell("Don't understand `", dobjstr, "' as an object to add."); elseif (dobj.owner != player) player:tell("You don't own ", dobj.name, "."); elseif (dobj in player.owned_objects) player:tell(dobj.name, " is already recorded in your .owned_objects."); else player.owned_objects = setadd(player.owned_objects, dobj); player:tell("Added ", dobj, " to your .owned_objects."); endif . #4:10 for x in (player.owned_objects) if ((!valid(x)) || (x.owner != player)) player.owned_objects = setremove(player.owned_objects, x); if (valid(x)) player:tell("Removing ", x.name, "(", x, "), owned by ", valid(x.owner) ? x.owner.name | "<recycled player>", " from your .owned_objects property."); else player:tell("Removing invalid object ", x, " from your .owned_objects property."); endif endif endfor player:tell(".owned_objects property verified."); . #4:11 set_task_perms(player); dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) return; endif res = (dobj.key = 0); if (typeof(res) == ERR) player:notify(tostr(res, ".")); else player:notify(tostr("Unlocked ", dobj.name, ".")); endif . #4:12 set_task_perms(player); dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) return; endif key = $lock_utils:parse_keyexp(iobjstr, player); if (typeof(key) == STR) player:notify("That key expression is malformed:"); player:notify(tostr(" ", key)); else res = (dobj.key = key); if (typeof(res) == ERR) player:notify(tostr(res, ".")); else player:notify(tostr("Locked ", dobj.name, " to this key:")); player:notify(tostr(" ", $lock_utils:unparse_key(key))); endif endif . #4:13 "Usage: @message <message-name> [<message>] [on <object>]"; "Add a message property to an object (default is player), and optionally"; "set its value. For use by non-programmers, who aren't allowed to add"; "properties generally."; "To undo the effects of this, use @unmessage."; set_task_perms(player); dobjwords = $string_utils:words(dobjstr); if (!dobjwords) player:notify(tostr("Usage: ", verb, " <message-name> [<message>] [on <object>]")); return; endif object = (valid(iobj) ? iobj | player); name = this:_messagify(dobjwords[1]); value = dobjstr[length(dobjwords[1]) + 2..length(dobjstr)]; nickname = ("@" + name[1..length(name) - 4]); e = add_property(object, name, value, {player, "rc"}); if (typeof(e) != ERR) player:notify(tostr(nickname, " on ", object.name, " is now \"", object.(name), "\".")); elseif (e != E_INVARG) player:notify(tostr(e)); elseif ($object_utils:has_property(object, name)) "object already has property"; player:notify(tostr(object.name, " already has a ", nickname, " message.")); else player:notify(tostr("Unable to add ", nickname, " message to ", object.name, ": ", e)); endif . #4:14 "Usage: @unmessage <message-name> [from <object>]"; "Remove a message property from an object (default is player)."; set_task_perms(player); if ((!dobjstr) || (length($string_utils:words(dobjstr)) > 1)) player:notify(tostr("Usage: ", verb, " <message-name> [from <object>]")); return; endif object = (valid(iobj) ? iobj | player); name = this:_messagify(dobjstr); nickname = ("@" + name[1..length(name) - 4]); e = delete_property(object, name); if (e == E_PROPNF) player:notify(tostr("No ", nickname, " message found on ", object.name, ".")); elseif (typeof(e) == ERR) player:notify(tostr(e)); else player:notify(tostr(nickname, " message removed from ", object.name, ".")); endif . #4:15 "Given any of several formats people are likely to use for a @message"; "property, return the canonical form (\"foobar_msg\")."; name = args[1]; if (name[1] == "@") name = name[2..length(name)]; endif if ((length(name) < 4) || (name[length(name) - 3..length(name)] != "_msg")) name = (name + "_msg"); endif return name; . #4:16 "'@kids <obj>' - List the children of an object. This is handy for seeing whether anybody's actually using your carefully-wrought public objects."; thing = player:my_match_object(dobjstr); if (!$command_utils:object_match_failed(thing, dobjstr)) kids = children(thing); if (kids) player:notify(tostr(thing:title(), "(", thing, ") has ", length(kids), " kid", (length(kids) == 1) ? "" | "s", ".")); player:notify(tostr($string_utils:names_of(kids))); else player:notify(tostr(thing:title(), "(", thing, ") has no kids.")); endif endif . #4:17 "'@contents <obj> - list the contents of an object, with object numbers. This verb is by yduJ."; set_task_perms(player); if (!dobjstr) dobj = player.location; else dobj = player:my_match_object(dobjstr); endif if ($command_utils:object_match_failed(dobj, dobjstr)) else if ($object_utils:has_verb(dobj, "contents")) contents = dobj:contents(); else contents = dobj.contents; endif if (contents) player:notify(tostr(dobj:title(), "(", dobj, ") contains:")); player:notify(tostr($string_utils:names_of(contents))); else player:notify(tostr(dobj:title(), "(", dobj, ") contains nothing.")); endif endif . #4:18 "'@parents <thing>' - List <thing> and its ancestors, all the way back to the Root Class (#1)."; set_task_perms(player); if (!dobjstr) player:notify(tostr("Usage: ", verb, " <object>")); return; else o = player:my_match_object(dobjstr); endif if (!$command_utils:object_match_failed(o, dobjstr)) player:notify($string_utils:names_of({o, @$object_utils:ancestors(o)})); endif . #4:19 "@locations <thing> - List <thing> and its containers, all the way back to the outermost one."; set_task_perms(player); if (!dobjstr) what = player; elseif ((!valid(what = player:my_match_object(dobjstr))) && (!valid(what = $string_utils:match_player(dobjstr)))) $command_utils:object_match_failed(dobj, dobjstr); return; endif player:notify($string_utils:names_of({what, @$object_utils:locations(what)})); . #4:20 "$class_registry is in the following format:"; " { {name, description, members}, ... }"; "where `name' is the name of a particular class of objects, `description' is a one-sentence description of the membership of the class, and `members' is a list of object numbers, the members of the class."; ""; if (args) members = {}; for name in (args) class = $list_utils:assoc_prefix(name, $class_registry); if (class) for o in (class[3]) members = setadd(members, o); endfor else player:tell("There is no defined class of objects named `", name, "'; type `@classes' to see a complete list of defined classes."); return; endif endfor printed = {}; for o in (members) what = o; while (valid(what)) printed = setadd(printed, what); what = parent(what); endwhile endfor player:tell("Members of the class", (length(args) > 1) ? "es" | "", " named ", $string_utils:english_list(args), ":"); player:tell(); set_task_perms(player); this:classes_2($root_class, "", members, printed); player:tell(); else "List all class names and descriptions"; player:tell("The following classes of objects have been defined:"); for class in ($class_registry) name = class[1]; description = class[2]; player:tell(); player:tell("-- ", name, ": ", description); endfor player:tell(); player:tell("Type `@classes <name>' to see the members of the class with the given <name>."); endif . #4:21 root = args[1]; indent = args[2]; members = args[3]; printed = args[4]; if (root in members) player:tell(indent, root.name, " (", root, ")"); else player:tell(indent, "<", root.name, " (", root, ")>"); endif indent = (indent + " "); set_task_perms(caller_perms()); for c in (children(root)) $command_utils:suspend_if_needed(10); if (c in printed) this:classes_2(c, indent, members, printed); endif endfor . #4:22 set_task_perms(caller_perms()); if (this.recreate_enabled) return $recycler:(verb)(@args); else return create(@args); endif . #4:23 set_task_perms(caller_perms()); if (this.recreate_enabled) return $recycler:(verb)(@args); else return recycle(@args); endif . #4:24 set_task_perms(player); if ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr)) "...bogus object..."; elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr)) "...bogus new parent..."; elseif ((this != player) && (!$object_utils:isa(player, $player))) "...They chparented to #1 and want to chparent back to $prog. Probably for some nefarious purpose..."; player:notify("You don't seem to already be a valid player class. Perhaps chparenting away from the $player hierarchy was not such a good idea. Permission denied."); elseif (is_player(object) && (!$object_utils:isa(parent, $player))) player:notify(tostr(object, " is a player and ", parent, " is not a player class.")); player:notify("You really *don't* want to do this. Trust me."); elseif (typeof(result = chparent(object, parent)) != ERR) player:notify("Parent changed."); elseif ((result == E_INVARG) && (valid(object) && valid(parent))) player:notify(tostr("Some property existing on ", parent, " is defined on ", object, " or one of its descendants.")); player:notify(tostr("Try @check-chparent ", dobjstr, " to ", iobjstr)); else player:notify(tostr(result)); endif . #4:25 "Copied from generic programmer (#217):@check-chparent by ur-Rog (#6349) Sun Nov 8 22:13:53 1992 PST"; "@check-chparent object to newparent"; "checks for property name conflicts that would make @chparent bomb."; set_task_perms(player); if (!(dobjstr && iobjstr)) player:notify(tostr("Usage: ", verb, " <object> to <newparent>")); elseif ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr)) "...bogus object..."; elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr)) "...bogus new parent..."; elseif (player != this) player:notify(tostr(E_PERM)); elseif (typeof(result = $object_utils:property_conflicts(object, parent)) == ERR) player:notify(tostr(result)); elseif (result) su = $string_utils; player:notify(""); player:notify(su:left("Property", 30) + "Also Defined on"); player:notify(su:left("--------", 30) + "---------------"); for r in (result) player:notify(su:left(tostr(parent, ".", r[1]), 30) + su:from_list(listdelete(r, 1), " ")); $command_utils:suspend_if_needed(0); endfor else player:notify("No property conflicts found."); endif . #4:26 "Syntax: @set <object>.<prop-name> to <value>"; ""; "Changes the value of the specified object's property to the given value."; "You must have permission to modify the property, either because you own the property or if it is writable."; set_task_perms(player); if (this != player) return player:tell(E_PERM); endif l = $code_utils:parse_propref(dobjstr); if (l) dobj = player:my_match_object(l[1], player.location); if ($command_utils:object_match_failed(dobj, l[1])) return; endif prop = l[2]; to_i = ("to" in args); at_i = ("at" in args); i = ((to_i && at_i) ? min(to_i, at_i) | (to_i || at_i)); iobjstr = argstr[$string_utils:word_start(argstr)[i][2] + 1..length(argstr)]; iobjstr = $string_utils:trim(iobjstr); if (!iobjstr) val = (dobj.(prop) = ""); iobjstr = "\"\""; elseif (iobjstr[1] == "\"") val = (dobj.(prop) = iobjstr); iobjstr = (("\"" + iobjstr) + "\""); else val = $string_utils:to_value(iobjstr); if (!val[1]) player:tell("Could not parse: ", iobjstr); return; endif val = (dobj.(prop) = val[2]); endif player:tell("Property ", dobj, ".", prop, " set to ", $string_utils:print(val), "."); else player:tell("Property ", dobjstr, " not found."); endif . #5:0 set_task_perms(callers() ? caller_perms() | player); if (this.location == player) player:tell("You already have that!"); elseif (this.location != player.location) player:tell("I don't see that here."); else this:moveto(player); if (this.location == player) player:tell(this:take_succeeded_msg() || "Taken."); if (msg = this:otake_succeeded_msg()) player.location:announce(player.name, " ", msg); endif else player:tell(this:take_failed_msg() || "You can't pick that up."); if (msg = this:otake_failed_msg()) player.location:announce(player.name, " ", msg); endif endif endif . #5:1 set_task_perms(callers() ? caller_perms() | player); if (this.location != player) player:tell("You don't have that."); elseif (!player.location:acceptable(this)) player:tell("You can't drop that here."); else this:moveto(player.location); if (this.location == player.location) player:tell_lines(this:drop_succeeded_msg() || "Dropped."); if (msg = this:odrop_succeeded_msg()) player.location:announce(player.name, " ", msg); endif else player:tell_lines(this:drop_failed_msg() || "You can't seem to drop that here."); if (msg = this:odrop_failed_msg()) player.location:announce(player.name, " ", msg); endif endif endif . #5:2 where = args[1]; "if (!valid(where) || this:is_unlocked_for(where))"; if (this:is_unlocked_for(where)) pass(where); endif . #5:3 set_task_perms(caller_perms()); return $string_utils:pronoun_sub(this.(verb)); . #5:4 set_task_perms(callers() ? caller_perms() | player); if (this.location != player) player:tell("You don't have that!"); elseif (!valid(player.location)) player:tell("I see no \"", iobjstr, "\" here."); elseif ($command_utils:object_match_failed(who = player.location:match_object(iobjstr), iobjstr)) elseif (who.location != player.location) player:tell("I see no \"", iobjstr, "\" here."); elseif (who == player) player:tell("Give it to yourself?"); else this:moveto(who); if (this.location == who) player:tell("You hand ", this:title(), " to ", who:title(), "."); who:tell(player:titlec(), " ", $gender_utils:get_conj("hands/hand", player), " you ", this:title(), "."); else player:tell(who:titlec(), " ", $gender_utils:get_conj("does/do", who), " not want that item."); endif endif . #5:5 "examine_key(examiner)"; "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to."; "the default will only tell the key to a wizard or this object's owner."; who = args[1]; if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0)) return {tostr(this:title(), " can only be moved to locations matching this key:"), tostr(" ", $lock_utils:unparse_key(this.key))}; endif . #6:0 if (caller_perms().wizard) pass(); this.home = ((this in {$no_one, $hacker}) ? $nothing | $player_start); if (a = $list_utils:assoc(this, {{$prog, {$prog_help, $builtin_function_help, $verb_help, $core_help}}, {$wiz, $wiz_help}})) this.help = a[2]; else this.help = 0; endif if (this != $player) for p in ({"last_connect_place", "all_connect_places"}) clear_property(this, p); endfor endif endif . #6:1 if (valid(caller_perms()) && (caller != this)) return E_PERM; endif nm = (this:length_all_msgs() - this:length_date_le(this:get_current_message()[2])); if (nm) this:notify(tostr("You have new mail (", nm, " message", (nm == 1) ? "" | "s", ").", this:mail_option("expert") ? "" | " Type 'help mail' for info on reading it.")); endif this:mail_catch_up(); this:check_mail_lists(); this:("@last-connection")(); $news:check(); . #6:2 if (valid(caller_perms()) && (caller != this)) return E_PERM; endif this:expunge_rmm(); this.last_disconnect_time = time(); return; . #6:3 if ((caller == this) || $perm_utils:controls(caller_perms(), this)) this.help = 0; return pass(@args); else return E_PERM; endif . #6:4 set_task_perms(caller_perms()); if ((!is_player(this)) || caller_perms().wizard) pass(@args); return; endif "...start off with a wizard shout..."; for p in (connected_players()) if (p.wizard) p:tell($string_utils:pronoun_sub("%N (%#) is currently trying to recycle %t (%[#t])")); endif endfor "...Okay here's the fun part."; "...Doing kill_task(task_id()) doesn't work because the server can"; "...figure out that it's okay to go ahead and recycle once the task finishes."; "...Evidently, suspend() confuses the server sufficiently that it forgets to"; "...do the recycle once the task finishes or dies. Now of course, we don't"; "...want suspended tasks hanging around indefinitely, so we fork something"; "...off to kill it. This seems to work..."; t = task_id(); fork (1) kill_task(t); endfork "...let him think he succeeded (should we do this ?)...no."; "...boot_player(this)"; "...emergency life support..."; suspend(1073741823); "...code not reached --- the patient lives..."; "...keep this around for posterity..."; if (is_player(this)) for a in (this.aliases) $player_db:delete(a); endfor $player_db:delete(this.name); endif pass(@args); . #6:5 return !is_player(args[1]); . #6:6 "Extra parsing of player commands. Called by $command_utils:do_huh."; "This version of my_huh just handles features."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) "Standard permissions check."; return E_PERM; endif "verb - obvious pass - would be args"; "plist - list of prepspecs that this command matches"; "dlist and ilist - likewise for dobjspecs, iobjspecs"; verb = args[1]; pass = args[2]; plist = {"any", prepstr ? $code_utils:full_prep(prepstr) | "none"}; dlist = (dobjstr ? {"any"} | {"none", "any"}); ilist = (iobjstr ? {"any"} | {"none", "any"}); for fobj in (this.features) if (!$recycler:valid(fobj)) this:remove_feature(fobj); elseif (valid(loc = $object_utils:has_callable_verb(fobj, verb)[1])) vargs = verb_args(loc, verb); if ((vargs[2] in plist) && ((vargs[1] in dlist) && (vargs[3] in ilist))) "(got rid of notify_huh - should write a @which command)"; "if (this.notify_huh)"; "player:notify(tostr(\"Using \", what.name, \" (\", what, \")\"));"; "endif"; set_task_perms(this); fobj:(verb)(@pass); "Problem with verbs of the same name. If we use which=vrb in the loop instead, we have a problem with verbs that use the variable verb."; return 1; endif endif if ($command_utils:running_out_of_time()) player:tell("You have too many features. Parsing your command runs out of ticks while checking ", fobj.name, " (", fobj, ")."); return 1; endif endfor . #6:7 ":last_huh(verb,args) final attempt to parse a command..."; set_task_perms(caller_perms()); verb = args[1]; args = args[2]; if ((verb[1] == "@") && (prepstr == "is")) "... set or show _msg property ..."; set_task_perms(player); $last_huh:(verb)(@args); elseif (verb in {"give", "hand", "get", "take", "drop", "throw"}) $last_huh:(verb)(@args); else return 0; endif return 1; . #6:8 ":my_match_object(string [,location])"; return $string_utils:match_object(@{@args, this.location}[1..2], this); . #6:9 c = args[1]; if (c) longear = {}; gear = {}; width = player:linelen(); half = (width / 2); player:tell("Carrying:"); for thing in (c) cx = tostr(" ", thing:title()); if (length(cx) > half) longear = {@longear, cx}; else gear = {@gear, cx}; endif endfor player:tell_lines($string_utils:columnize(gear, 2, width)); player:tell_lines(longear); endif . #6:10 return $object_utils:has_property(this, "namec") ? this.namec | this:title(); . #6:11 line = args[1]; if (this.pagelen) if (!(this in connected_players())) "...drop it on the floor..."; return 0; elseif ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return E_PERM; endif "...need wizard perms if this and this.owner are different, since..."; "...only this can notify() and only this.owner can read .linebuffer..."; if ((player == this) && (this.linetask[2] != task_id())) "...player has started a new task..."; "....linetask[2] is the taskid of the most recent player task..."; if (this.linetask[2] != this.linetask[1]) this.linesleft = (this.pagelen - 2); endif this.linetask[2] = task_id(); endif "... digest the current line..."; if (this.linelen > 0) lbuf = {@this.linebuffer, @this:linesplit(line, this.linelen)}; else lbuf = {@this.linebuffer, line}; endif "... print out what we can..."; if (this.linesleft) howmany = min(this.linesleft, length(lbuf)); for l in (lbuf[1..howmany]) notify(this, l); endfor this.linesleft = (this.linesleft - howmany); lbuf[1..howmany] = {}; endif if (lbuf) "...see if we need to say ***More***"; if (this.linetask[1] != this.linetask[2]) "....linetask[1] is the taskid of the most recent player task"; "... for which ***More*** was printed..."; this.linetask[1] = this.linetask[2]; fork (0) notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer)))); endfork endif llen = length(lbuf); if (llen > 500) "...way too much saved text, flush some of it..."; lbuf[1..llen - 100] = {"*** buffer overflow, lines flushed ***"}; endif endif this.linebuffer = lbuf; else if (caller != this) set_task_perms(caller_perms()); endif if (this.linelen > 0) for l in (this:linesplit(line, this.linelen)) notify(this, l); endfor else notify(this, line); endif endif . #6:12 if ($perm_utils:controls(caller_perms(), this) || (caller == this)) set_task_perms(caller_perms()); for line in ((typeof(lines = args[1]) != LIST) ? {lines} | lines) this:notify(tostr(line)); endfor else return E_PERM; endif . #6:13 ":linesplit(line,len) => list of substrings of line"; "used by :notify to split up long lines if .linelen>0"; line = args[1]; len = args[2]; cline = {}; while (length(line) > len) cutoff = rindex(line[1..len], " "); if (nospace = (cutoff < ((4 * len) / 5))) cutoff = (len + 1); nospace = (line[cutoff] != " "); endif cline = {@cline, line[1..cutoff - 1]}; line = ((nospace ? " " | "") + line[cutoff..length(line)]); endwhile return {@cline, line}; . #6:14 return abs(this.linelen); . #6:15 if (player != this) "... somebody's being sneaky..."; "... Can't do set_task_perms(player) since we need to be `this'..."; "... to notify and `this.owner' to change +c properties..."; return; elseif (!(lbuf = this.linebuffer)) this.linesleft = (this.pagelen - 2); notify(this, "*** No more ***"); elseif (index("flush", dobjstr || "x") == 1) this.linesleft = (this.pagelen - 2); notify(this, tostr("*** Flushed *** ", length(lbuf), " lines")); this.linebuffer = {}; elseif ((index("rest", dobjstr || "x") == 1) || (!this.pagelen)) this.linesleft = (this.pagelen - 2); for l in (lbuf) notify(this, l); endfor this.linebuffer = {}; else howmany = min(this.pagelen - 2, llen = length(lbuf = this.linebuffer)); for l in (lbuf[1..howmany]) notify(this, l); endfor this.linesleft = ((this.pagelen - 2) - howmany); this.linebuffer = lbuf[howmany + 1..llen]; if (howmany < llen) notify(this, strsub(this.more_msg, "%n", tostr(llen - howmany))); this.linetask[1] = task_id(); endif endif this.linetask[2] = task_id(); . #6:16 if (player != this) "... someone is being sneaky..."; "... Can't do set_task_perms(player) since we need to be `this'..."; "... to notify and `this.owner' to change +c properties..."; return; endif linelen = player.linelen; if (!(prepstr in {"on", "off"})) player:notify("Usage: @wrap on|off"); player:notify(tostr("Word wrap is currently ", (linelen > 0) ? "on" | "off", ".")); return; endif player.linelen = (abs(linelen) * ((prepstr == "on") ? 1 | -1)); player:notify(tostr("Word wrap is now ", prepstr, ".")); . #6:17 if (callers() ? (caller != this) && (!$perm_utils:controls(caller_perms(), this)) | (player != this)) "... somebody is being sneaky ..."; return; endif curlen = player.linelen; wrap = (curlen > 0); wrapstr = (wrap ? "on" | "off"); if (!dobjstr) player:notify(tostr("Usage: ", verb, " <number>")); player:notify(tostr("Current line length is ", abs(curlen), ". Word wrapping is ", wrapstr, ".")); return; endif newlen = tonum(dobjstr); if (newlen < 0) player:notify("Line length can't be a negative number."); return; elseif (newlen < 10) player:notify("You don't want your linelength that small. Setting it to 10."); newlen = 10; endif this:set_linelength(newlen); player:notify(tostr("Line length is now ", abs(player.linelen), ". Word wrapping is ", wrapstr, ".")); if (!wrap) player:notify("To enable word wrapping, type `@wrap on'."); endif . #6:18 "@pagelength number -- sets page buffering to that many lines (or 0 to turn off page buffering)"; if (player != this) "... somebody is being sneaky ..."; "... Can't do set_task_perms(player) since we need to be `this'..."; "... to notify and `this.owner' to change +c properties..."; return; elseif (!dobjstr) notify(player, tostr("Usage: ", verb, " <number>")); notify(player, tostr("Current page length is ", player.pagelen, ".")); return; elseif (0 > (newlen = tonum(dobjstr))) notify(player, "Page length can't be a negative number."); return; elseif (newlen == 0) player.pagelen = 0; notify(player, "Page buffering off."); elseif (newlen < 5) player.pagelen = 5; notify(player, "Too small. Setting it to 5."); else notify(player, tostr("Page length is now ", player.pagelen = newlen, ".")); endif if (this.linebuffer) notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer)))); player.linetask = {task_id(), task_id()}; player.linesleft = 0; else player.linetask = {0, task_id()}; player.linesleft = (player.pagelen - 2); endif . #6:19 if (this.gaglist || this.paranoid) "Check the above first, default case, to save ticks. Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings."; if (this:gag_p()) return; endif if (this.paranoid == 1) if (((len = length(this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, args}})) * 2) > (this.lines * 3)) this.responsible = this.responsible[(len - this.lines) + 1..len]; endif elseif (this.paranoid == 2) z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3]; args = {"(", z.name, " ", z, ") ", @args}; else this.responsible = {}; endif endif pass(@args); . #6:20 if (player in this.gaglist) return 1; elseif (this.gaglist) for x in (callers()) if (valid(x[1])) if (x[1] in this.gaglist) return 1; endif endif endfor endif return 0; . #6:21 ":set_gaglist(@newlist) => this.gaglist = newlist"; if (!((caller == this) || $perm_utils:controls(caller_perms(), this))) return E_PERM; else return this.gaglist = args; endif . #6:22 set_task_perms(player); if (player != this) player:notify("Permission denied."); return; endif if (!args) player:notify(tostr("Usage: ", verb, " <player or object> [<player or object>...]")); return; endif victims = $string_utils:match_player_or_object(@args); changed = 0; for p in (victims) if (p in player.gaglist) player:notify(tostr("You are already gagging ", p.name, ".")); elseif (p == player) player:notify("Gagging yourself is a bad idea."); else changed = 1; player:set_gaglist(@setadd(this.gaglist, p)); endif endfor if (changed) this:("@listgag")("but don't fork"); endif . #6:23 set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (!this.gaglist) player:notify(tostr("You are ", callers() ? "no longer gagging anything." | "not gagging anything right now.")); else player:notify(tostr("You are ", callers() ? "now" | "currently", " gagging ", $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", this.gaglist)), ".")); endif gl = {}; if (!args) for p in (players()) if ((typeof(p.gaglist) == LIST) && (this in p.gaglist)) gl = {@gl, p}; endif $command_utils:suspend_if_needed(0); endfor if (gl || (!callers())) player:notify(tostr($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", gl), "No one"), " appear", (length(gl) <= 1) ? "s" | "", " to be gagging you.")); endif endif . #6:24 if ((player != this) || ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))) player:notify("Permission denied."); elseif (dobjstr == "") player:notify(tostr("Usage: ", verb, " <player> or ", verb, " everyone")); elseif (dobjstr == "everyone") this.gaglist = {}; player:notify("You are no longer gagging anyone or anything."); else if (valid(dobj)) match = dobj; elseif ((match = toobj(dobjstr)) > #0) else match = $string_utils:match(dobjstr, this.gaglist, "name", this.gaglist, "aliases"); endif if (match == $failed_match) player:notify(tostr("You don't seem to be gagging anything named ", dobjstr, ".")); elseif (match == $ambiguous_match) player:notify(tostr("I don't know which \"", dobjstr, "\" you mean.")); else this.gaglist = setremove(this.gaglist, match); player:notify(tostr(valid(match) ? match.name | match, " removed from gag list.")); endif this:("@listgag")("but don't fork"); endif . #6:25 record = args[1]; trust = args[2]; mistrust = args[3]; s = {this, "???", this}; for w in (record) if (((s[3].wizard || (s[3] in trust)) && (!(s[3] in mistrust))) || (s[1] == this)) s = w; else return s; endif endfor return s; . #6:26 if (typeof(this.responsible) != LIST) this:notify("Hey, someone was mucking about with your .responsible property, and it was probably you. Don't do it again."); this.responsible = {}; return; endif if (length(verb) <= 6) "@check, not @check-full"; n = 5; trust = {this, $no_one}; "... trust no one, my friend.... no one.... --Herod"; mistrust = {}; for k in (args) if (z = $code_utils:tonum(k)) n = z; elseif (k[1] == "!") mistrust = listappend(mistrust, $string_utils:match_player(k[2..length(k)])); else trust = listappend(trust, $string_utils:match_player(k)); endif endfor msg_width = (player:linelen() - 60); for q in ((n > (y = length(z = this.responsible))) ? z | z[(y - n) + 1..y]) msg = tostr(@q[2]); if (length(msg) > msg_width) msg = msg[1..msg_width]; endif s = this:whodunnit(q[1], trust, mistrust); text = (valid(s[1]) ? s[1].name | "** NONE **"); this:notify(tostr($string_utils:left(tostr((length(text) > 13) ? text[1..13] | text, " (", s[1], ")"), 20), $string_utils:left(s[2], 15), $string_utils:left(tostr((length(s[3].name) > 13) ? s[3].name[1..13] | s[3].name, " (", s[3], ")"), 20), msg)); endfor this:notify("*** finished ***"); this.responsible = z; else "@check-full, from @traceback by APHiD"; matches = {}; if (length(match = argstr) == 0) player:notify(tostr("Usage: ", verb, " <string> --or-- ", verb, " <number>")); return; endif if (!(responsible = player.responsible)) player:notify("No text has been saved by the monitor. (See `help @paranoid')."); else if (typeof(x = $code_utils:tonum(argstr)) == ERR) for line in (responsible) if (index(tostr(@line[length(line)]), argstr)) matches = {@matches, line}; endif endfor else matches = this.responsible[((l = length(this.responsible)) - x) + 1..l]; endif if (matches) linelen = player:linelen(); string_utils = $string_utils; list_utils = $list_utils; for match in (matches) $command_utils:suspend_if_needed(3); text = tostr(@match[length(match)]); player:notify("Traceback for:"); player:notify(text); verbwidth = 0; for verbitem in (list_utils:slice(mm = listdelete(mm = match[1], length(mm)), 2)) verbwidth = max(verbwidth, length(verbitem)); endfor numwidth = (((linelen - verbwidth) / 4) - 1); widths = {numwidth, verbwidth, numwidth, numwidth, numwidth}; top = (l = (between = "")); for x in [1..5] top = ((top + between) + string_utils:left({"This", "Verb", "Programmer", "VerbLocation", "Player"}[x], -widths[x])); l = ((l + between) + string_utils:space(widths[x], "-")); between = " "; endfor player:notify(top); player:notify(l); for line in (listdelete(mm = match[1], length(mm))) output = {}; for bit in [1..5] output = {@output, string_utils:left((typeof(word = line[bit]) == STR) ? word | tostr(word, "(", valid(word) ? list_utils:shortest({word.name, @word.aliases}) | ((word == $nothing) ? "invalid" | ((word == $ambiguous_match) ? "ambiguous match" | "Error")), ")"), -widths[bit]), " "}; endfor player:notify(string_utils:trimr(tostr(@output))); endfor player:notify(l); endfor player:notify("**** finished ****"); else player:notify(tostr("No matches for \"", argstr, "\" found.")); endif endif endif . #6:27 if ((args == {}) || ((typ = args[1]) == "")) this.lines = 20; this.paranoid = 1; this:notify("Anti-spoofer on and keeping 20 lines."); elseif (index("immediate", typ)) this.lines = 0; this.paranoid = 2; this:notify("Anti-spoofer now in immediate mode."); elseif (index("off", typ) || (typ == "0")) this.paranoid = 0; this.lines = 0; this:notify("Anti-spoofer off."); elseif ((tostr(y = tonum(typ)) != typ) || (y < 0)) this:notify(tostr("Usage: ", verb, " <lines to be kept> to turn on your anti-spoofer.")); this:notify(tostr(" ", verb, " off to turn it off.")); this:notify(tostr(" ", verb, " immediate to use immediate mode.")); else this.paranoid = 1; this.lines = (y = min(y, 30)); this:notify(tostr("Anti-spoofer on and keeping ", y, " lines.")); endif . #6:28 buggers = 1; found_listener = 0; here = this.location; for thing in (setremove(here.contents, this)) tellwhere = $object_utils:has_verb(thing, "tell"); notifywhere = $object_utils:has_verb(thing, "notify"); if (thing in connected_players()) this:notify(tostr(thing.name, " (", thing, ") is listening.")); found_listener = 1; elseif ($object_utils:has_callable_verb(thing, "sweep_msg") && (typeof(msg = thing:sweep_msg()) == STR)) this:notify(tostr(thing.name, " (", thing, ") ", msg, ".")); found_listener = 1; elseif (tellwhere && (((owner = verb_info(tellwhere[1], "tell")[1]) != this) && (!owner.wizard))) this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")")); found_listener = 1; elseif (notifywhere && (((owner = verb_info(notifywhere[1], "notify")[1]) != this) && (!owner.wizard))) this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")")); found_listener = 1; endif endfor buggers = {}; for v in ({"announce", "announce_all", "announce_all_but", "say", "emote", "huh", "here_huh", "huh2", "whisper"}) vwhere = $object_utils:has_verb(here, v); if (vwhere && (((owner = verb_info(vwhere[1], v)[1]) != this) && (!owner.wizard))) buggers = setadd(buggers, owner); endif endfor if (buggers != {}) if ($object_utils:has_verb(here, "sweep_msg") && (typeof(msg = here:sweep_msg()) == STR)) this:notify(tostr(here.name, " (", here, ") ", msg, ".")); else this:notify(tostr(here.name, " (", here, ") may have been bugged by ", $string_utils:english_list($list_utils:map_prop(buggers, "name")), ".")); endif elseif (!found_listener) this:notify("Communications look secure."); endif . #6:29 this:tell(player.name, " whispers, \"", dobjstr, "\""); player:tell("You whisper, \"", dobjstr, "\" to ", this.name, "."); . #6:30 nargs = length(args); if (nargs < 1) player:notify(tostr("Usage: ", verb, " <player> [with <message>]")); return; endif who = $string_utils:match_player(args[1]); if ($command_utils:player_match_result(who, args[1])[1]) return; elseif (who in this.gaglist) player:tell("You have ", who:title(), " @gagged. If you paged ", who.po, ", ", who.ps, " wouldn't be able to answer you."); return; endif "for pronoun_sub's benefit..."; dobj = who; iobj = player; header = player:page_origin_msg(); text = ""; if (nargs > 1) if ((args[2] == "with") && (nargs > 2)) msg_start = 3; else msg_start = 2; endif msg = $string_utils:from_list(args[msg_start..nargs], " "); text = tostr($string_utils:pronoun_sub(($string_utils:index_delimited(header, player.name) ? "%S" | "%N") + " %<pages>, \""), msg, "\""); endif result = (text ? who:receive_page(header, text) | who:receive_page(header)); if (result == 2) "not connected"; player:tell((typeof(msg = who:page_absent_msg()) == STR) ? msg | $string_utils:pronoun_sub("%n is not currently logged in.", who)); else player:tell(who:page_echo_msg()); endif . #6:31 "called by $player:page. Two args, the page header and the text, all pre-processed by the page command. Could be extended to provide haven abilities, multiline pages, etc. Indeed, at the moment it just does :tell_lines, so we already do have multiline pages, if someone wants to take advantage of it."; "Return codes:"; " 1: page was received"; " 2: player is not connected"; " 0: page refused"; "If a specialization wants to refuse a page, it should return 0 to say it was refused. If it uses pass(@args) it should propagate back up the return value. It is possible that this code should interact with gagging and return 0 if the page was gagged."; if (this:is_listening()) this:tell_lines(args); return 1; else return 2; endif . #6:32 "set_task_perms(this.owner)"; return (msg = this.(verb)) ? $string_utils:pronoun_sub(this.(verb), this) | ""; . #6:33 if (c = player:contents()) this:tell_contents(c); else player:tell("You are empty-handed."); endif . #6:34 pass(); if (!(this in connected_players())) player:tell($gender_utils:pronoun_sub("%{:He} %{!is} sleeping.", this)); elseif ((idle = idle_seconds(this)) < 60) player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake and %{!looks} alert.", this)); else time = $string_utils:from_seconds(idle); player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake, but %{!has} been staring off into space for ", this), time, "."); endif if (c = this:contents()) this:tell_contents(c); endif . #6:35 start = this.location; if (start == this.home) player:tell("You're already home!"); return; elseif (typeof(this.home) != OBJ) player:tell("You've got a weird home, pal. I've reset it to the default one."); this.home = $player_start; elseif (!valid(this.home)) player:tell("Oh no! Your home's been recycled. Time to look around for a new one."); this.home = $player_start; else player:tell("You click your heels three times."); endif this:moveto(this.home); if (!valid(start)) elseif (start == this.location) start:announce(player.name, " learns that you can never go home..."); else start:announce(player.name, " goes home."); endif if (this.location == this.home) this.location:announce(player.name, " comes home."); elseif (this.location == start) player:tell("Either home doesn't want you, or you don't really want to go."); else player:tell("Wait a minute! This isn't your home..."); if (valid(this.location)) this.location:announce(player.name, " arrives, looking quite bewildered."); endif endif . #6:36 set_task_perms(this); here = this.location; if (!$object_utils:has_callable_verb(here, "accept_for_abode")) player:notify("This is a pretty odd place. You should make your home in an actual room."); elseif (here:accept_for_abode(this)) this.home = here; player:notify(tostr(here.name, " is your new home.")); else player:notify(tostr("This place doesn't want to be your home. Contact ", here.owner.name, " to be added to the residents list of this place, or choose another place as your home.")); endif . #6:37 player:tell("This is not a pick-up joint!"); this:tell(player.name, " tried to pick you up."); . #6:38 set_task_perms((caller == this) ? this | $no_one); dobj = this:my_match_object(dobjstr); iobj = this:my_match_object(iobjstr); if ($command_utils:object_match_failed(dobj, dobjstr) || ((iobj != $nothing) && $command_utils:object_match_failed(iobj, iobjstr))) return; endif if ((!$perm_utils:controls(this, dobj)) && (this != dobj)) player:tell("You may only @move your own things."); return; endif old_loc = dobj.location; if (old_loc == iobj) player:tell(dobj.name, " is already ", valid(iobj) ? "in " + iobj.name | "nowhere", "."); return; endif dobj:moveto(iobj); if (dobj.location == iobj) player:tell("Moved."); if (is_player(dobj)) if (valid(old_loc)) old_loc:announce_all(dobj.name, " disappears suddenly for parts unknown."); if (dobj != player) dobj:tell("You have been moved by ", player.name, "."); endif endif if (valid(dobj.location)) dobj.location:announce(dobj.name, " materializes out of thin air."); endif endif elseif (dobj.location == old_loc) if ($object_utils:contains(dobj, iobj)) player:tell(iobj.name, " is inside of ", dobj.name, "!"); else player:tell($string_utils:pronoun_sub("Either %d doesn't want to go, or %i doesn't want to accept %[dpo].")); endif elseif (dobj == player) player:tell("You have been deflected from your original destination."); else player:tell($string_utils:pronoun_sub("%D has been deflected from %[dpp] original destination.")); endif . #6:39 set_task_perms(player); if (iobjstr == "here") iobj = player.location; elseif (iobjstr == "me") iobj = player; elseif ($command_utils:object_match_failed(iobj, iobjstr)) return; endif if (!$perm_utils:controls(player, iobj)) player:notify(tostr("You are not the owner of ", iobj.name, ".")); return; endif if (dobjstr == "me") dobj = player; elseif (($failed_match == (dobj = $string_utils:literal_object(dobjstr))) && $command_utils:object_match_failed(dobj = iobj:match(dobjstr), dobjstr)) return; endif if (dobj.location != iobj) player:notify(tostr(dobj.name, "(", dobj, ") is not in ", iobj.name, "(", iobj, ").")); return; endif if (dobj.wizard) player:notify(tostr("Sorry, you can't ", verb, " a wizard.")); dobj:tell(player.name, " tried to ", verb, " you."); return; endif iobj:((verb == "@eject") ? "eject" | "eject_basic")(dobj); player:notify($object_utils:has_callable_verb(iobj, "ejection_msg") ? iobj:ejection_msg() | $room:ejection_msg()); if (verb != "@eject!!") dobj:tell($object_utils:has_callable_verb(iobj, "victim_ejection_msg") ? iobj:victim_ejection_msg() | $room:victim_ejection_msg()); endif iobj:announce_all_but({player, dobj}, $object_utils:has_callable_verb(iobj, "oejection_msg") ? iobj:oejection_msg() | $room:oejection_msg()); . #6:40 if (!args) them = connected_players(); else who = $command_utils:player_match_result($string_utils:match_player(args), args); if (length(who) <= 1) if (!who[1]) player:notify("Where is who?"); endif return; elseif (who[1]) player:notify(""); endif them = listdelete(who, 1); endif lmax = (rmax = 0); for p in (them) player:notify($string_utils:pronoun_sub("%N (%#) is in %l (%[#l]).", p)); endfor . #6:41 if (caller != player) return E_PERM; endif plyrs = (args ? listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1) | connected_players()); if (!plyrs) return; endif $code_utils:show_who_listing(plyrs); . #6:42 "@wizards [all]"; if (caller != player) return E_PERM; endif if (args) $code_utils:show_who_listing($wiz_utils:all_wizards()); else $code_utils:show_who_listing($wiz_utils:connected_wizards()) || player:notify("No wizards currently logged in."); endif . #6:43 set_task_perms(callers() ? caller_perms() | player); "...this code explicitly relies on being !d in several places..."; if ((index(verb, "?") != 1) || (length(verb) <= 1)) what = $string_utils:trimr(argstr); elseif (argstr) what = tostr(verb[2..length(verb)], " ", $string_utils:trimr(argstr)); else what = verb[2..length(verb)]; endif "...find a db that claims to know about `what'..."; dblist = $code_utils:help_db_list(); result = $code_utils:help_db_search(what, dblist); if (!result) "... note: all of the last-resort stuff..."; "... is now located on $help:find_topics/get_topic..."; "$wiz_utils:missed_help(what, result)"; player:notify(tostr("Sorry, but no help is available on `", what, "'.")); elseif (result[1] == $ambiguous_match) "$wiz_utils:missed_help(what, result)"; player:notify_lines(tostr("Sorry, but the topic-name `", what, "' is ambiguous. I don't know which of the following topics you mean:")); for x in ($string_utils:columnize($help:sort_topics(result[2]), 3, 60)) player:notify(tostr(" ", x)); endfor else help = result[1]; topic = result[2]; if (topic != what) player:notify(tostr("Showing help on `", topic, "':")); player:notify("----"); endif dblist = dblist[1 + (help in dblist)..length(dblist)]; if (1 == (text = help:get_topic(topic, dblist))) "...get_topic took matters into its own hands..."; elseif (text) "...these can get long..."; for line in ((typeof(text) == LIST) ? text | {text}) if (typeof(line) != STR) player:notify("Odd results from help -- complain to a wizard."); else player:notify(line); endif $command_utils:suspend_if_needed(0); endfor else player:notify(tostr("Help DB ", help, " thinks it knows about `", what, "' but something's messed up.")); player:notify(tostr("Tell ", help.owner.wizard ? "" | tostr(help.owner.name, " (", help.owner, ") or "), "a wizard.")); endif endif . #6:44 $news:read(); . #6:45 if (typeof(mf = this.(verb)) == STR) return $string_utils:pronoun_sub(mf, @args); else return mf; endif . #6:46 ":receive_message(msg,from)"; if ((!$perm_utils:controls(caller_perms(), this)) && (caller != this)) return E_PERM; endif if (this:mail_option("netmail")) msg = args[1]; message = {"Forwarded: " + msg[4], "Original-date: " + ctime(msg[1]), "Original-From: " + msg[2], "Original-To: " + msg[3], ((("Reply-To: " + args[2].name) + "@") + $network.moo_name) + ".moo.mud.org"}; for x in (msg[5..length(msg)]) message = {@message, @$generic_editor:fill_string(x, this:linelen())}; endfor if (this:send_self_netmail(message, @listdelete(args, 1)) == 0) return 0; endif endif set_task_perms(this.owner); new = this:new_message_num(); ncur = ((new <= 1) ? 0 | min(this:current_message(this), new)); this:set_current_message(this, ncur); new = max(new, ncur + 1); this.messages = {@this.messages, {new, args[1]}}; "... new-mail notification is now done directly by $mail_agent:raw_send"; "... see :notify_mail..."; return new; . #6:47 ":display_message(preamble,msg) --- prints msg to player."; vb = (((this._mail_task == task_id()) || (caller == $mail_editor)) ? "notify_lines" | "tell_lines"); preamble = args[1]; player:(vb)({@(typeof(preamble) == LIST) ? preamble | {preamble}, @args[2], "--------------------------"}); . #6:48 "parse_message_seq(strings,cur) => msg_seq"; "messages_in_seq(msg_seq); => text of messages in msg_seq"; "display_seq_headers(msg_seq[,current]) :displays summary lines of those msgs"; "rmm_message_seq(msg_seq) => string giving msg numbers removed"; "undo_rmm() => msg_seq of restored messages"; "expunge_rmm() => number of messages expunged"; "list_rmm() => number of messages awaiting expunge"; "renumber(cur) => {number of messages in folder, new_cur}"; ""; "See the corresponding routines on $mail_agent."; if ((caller == $mail_agent) || $perm_utils:controls(caller_perms(), this)) set_task_perms(this.owner); return $mail_agent:(verb)(@args); else return E_PERM; endif . #6:49 return $mail_agent:msg_summary_line(@args); . #6:50 return $mail_agent:to_text(@args); . #6:51 ":notify_mail(from,recipients[,msgnums])"; " used by $mail_agent:raw_send to notify this player about mail being sent"; " from <from> to <recipients>. <msgnums> if given gives the message number(s) assigned (in the event that the corresponding recipient actually kept the mail)"; if (!$object_utils:connected(this)) return; elseif (!((caller in {this, $mail_agent}) || $perm_utils:controls(caller_perms(), this))) return E_PERM; else from = args[1]; recipients = args[2]; msgnums = {@args, {}}[3]; "... msgnums may be shorter than recipients or may have some slots filled"; "... with 0's if msg numbers are not available for some recipients."; if ((t = (this in recipients)) && ((length(msgnums) >= t) && msgnums[t])) "... you are getting the mail and moreover your :receive_message kept it."; namelist = $string_utils:english_list($list_utils:map_arg($mail_agent, "name", setremove(recipients, this)), ""); this:notify(tostr("You have new mail (", msgnums[t], ") from ", from.name, " (", from, ")", namelist ? " which was also sent to " + namelist | "", ".")); if (!this:mail_option("expert")) this:notify(tostr("Type `help mail' for info on reading it.")); endif else "... vanilla notification; somebody got sent mail and you're finding out."; namelist = $string_utils:english_list({@t ? {"You"} | {}, @$list_utils:map_arg($mail_agent, "name", setremove(recipients, this))}, ""); this:notify(tostr(namelist, (length(recipients) == 1) ? " has" | " have", " just been sent new mail by ", from.name, " (", from, ").")); endif endif . #6:52 "runs the old->new format conversion on every message in this.messages."; " => 1 if successful"; " => 0 if anything toward happened during a suspension"; " (e.g., new message received, someone deleted stuff) "; " in which case this.messages is left as if this routine were never run."; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; endif msgs = {}; i = 1; for m in (oldmsgs = this.messages) msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}}; if ($command_utils:running_out_of_time()) player:notify(tostr("...", i, " ", this)); suspend(0); if (oldmsgs != this.messages) return 0; endif endif i = (i + 1); endfor this.messages = msgs; return 1; . #6:53 ":current_message([recipient])"; " => current message number for the given recipient (defaults to this)."; " => 0 if we have no record of that recipient."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) $error:raise(E_PERM); elseif ((!args) || (args[1] == this)) return this.current_message[1]; elseif (a = $list_utils:assoc(args[1], this.current_message)) return a[2]; else return 0; endif . #6:54 ":get_current_message([recipient])"; " => {msg_num, last_read_date} for the given recipient."; " => 0 if we have no record of that recipient."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) $error:raise(E_PERM); elseif ((!args) || (args[1] == this)) return this.current_message[1..2]; elseif (a = $list_utils:assoc(args[1], this.current_message)) return a[2..3]; else return 0; endif . #6:55 ":set_current_message(recipient[,number[,date]])"; "Returns the new {number,last-read-date} pair for recipient."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return $error:raise(E_PERM); endif recip = args[1]; number = {@args, E_NONE}[2]; date = {@args, 0, 0}[3]; cm = this.current_message; if (recip == this) this.current_message[2] = max(date, cm[2]); if (number != E_NONE) this.current_message[1] = number; endif return this.current_message[1..2]; elseif (i = $list_utils:iassoc(recip, cm)) return (this.current_message[i] = {recip, (number == E_NONE) ? cm[i][2] | number, max(date, cm[i][3])})[2..3]; else entry = {recip, (number != E_NONE) && number, date}; this.current_message = {@cm, entry}; return entry[2..3]; endif . #6:56 ":make_current_message(recipient)"; "starts a new current_message record for recipient"; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return $error:raise(E_PERM); elseif (((recip = args[1]) != this) && (!$list_utils:assoc(recip, cm = this.current_message))) this.current_message = listappend(cm, {recip, 0, 0}); endif . #6:57 ":kill_current_message(recipient)"; "entirely forgets current message for this recipient..."; "Returns true iff successful."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return $error:raise(E_PERM); else return ((recip = args[1]) != this) && ((i = $list_utils:iassoc(recip, cm = this.current_message)) && (this.current_message = listdelete(cm, i))); endif . #6:58 ":current_folder() => default folder to use, always an object, usually `this'"; set_task_perms(caller_perms()); return ((!this:mail_option("sticky")) || this.current_folder) && this; . #6:59 set_task_perms(caller_perms()); return this.current_folder = args[1]; . #6:60 ":parse_folder_spec(verb,args,expected_preposition[,allow_trailing_args_p])"; " => {folder, msg_seq_args, trailing_args}"; set_task_perms(caller_perms()); folder = this:current_folder(); if (!prepstr) return {folder, args[2], {}}; endif verb = args[1]; prep = args[3]; extra = {@args, 0}[4]; args = args[2]; p = (prepstr in args); if (prepstr != prep) "...unexpected preposition..."; if (extra && (!index(prepstr, " "))) return {folder, args[1..p - 1], args[p..length(args)]}; else player:tell("Usage: ", verb, " [<message numbers>] [", prep, " <folder/list-name>]"); endif elseif (!((p < length(args)) && (fname = args[p + 1]))) "...preposition but no iobj..."; player:tell(verb, " ", $string_utils:from_list(args, " "), " WHAT?"); elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(fname), fname)) "...bogus mail folder..."; else return {folder, args[1..p - 1], args[p + 2..length(args)]}; endif return 0; . #6:61 ":parse_mailread_cmd(verb,args,default,prep[,trailer])"; " handles anything of the form `VERB message_seq [PREP folder ...]'"; " default is the default msg-seq to use if none given"; " prep is the expected prepstr (assumes prepstr is set), usually `on'"; " trailer, if present and true, indicates trailing args are permitted."; " returns {recipient object, message_seq, current_msg,\"...\"} or 0"; set_task_perms(caller_perms()); if (!(pfs = this:parse_folder_spec(@listdelete(args, 3)))) return 0; endif verb = args[1]; default = args[3]; extra = {@args, 0}[5]; folder = pfs[1]; cur = (this:get_current_message(folder) || {0}); if (typeof(pms = folder:parse_message_seq(pfs[2], @cur)) == LIST) rest = {@listdelete(pms, 1), @pfs[3]}; if ((!extra) && rest) "...everything should have been gobbled by :parse_message_seq..."; player:tell("I don't understand `", rest[1], "'"); return 0; elseif (pms[1]) "...we have a nonempty message sequence..."; return {folder, pms[1], cur, rest}; elseif (used = ((length(pfs[2]) + 1) - length(pms))) "...:parse_message_seq used some words, but didn't get anything out of it"; pms = (("%f %<has> no `" + $string_utils:from_list(pfs[2][1..used], " ")) + "' messages."); elseif (typeof(pms = folder:parse_message_seq(default, @cur)) == LIST) "...:parse_message_seq used nothing, try the default; wow it worked"; return {folder, pms[1], cur, rest}; endif elseif (typeof(pms) == ERR) player:tell($mail_agent:name(folder), " is not readable by you."); if (!$object_utils:isa(folder, $mail_recipient)) player:tell("Use * to indicate a non-player mail recipient."); endif return 0; endif if (folder == this) subst = {{"%f's", "Your"}, {"%f", "You"}, {"%<has>", "have"}}; elseif (is_player(folder)) subst = {{"%f", folder.name}, {"%<has>", $gender_utils:get_conj("has", folder)}}; else subst = {{"%f", $mail_agent:name(folder)}, {"%<has>", "has"}}; endif player:tell($string_utils:substitute(pms, {@subst, {"%%", "%"}})); return 0; . #6:62 "@mail <msg-sequence> --- as in help @mail"; "@mail <msg-sequence> on <recipient> --- shows mail on mailing list or player."; set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (p = this:parse_mailread_cmd("@mail", args, this:mail_option("@mail") || "last:15", "on")) this:set_current_folder(folder = p[1]); msg_seq = p[2]; seq_size = $seq_utils:size(msg_seq); if ((lim = player:mail_option("manymsgs")) && ((lim <= seq_size) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " message headers. Continue?"))))) player:notify(tostr("Aborted. @mailoption manymsgs=", lim)); return; endif if (1 != seq_size) player:notify(tostr(seq_size, " messages", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":")); endif folder:display_seq_headers(msg_seq, @p[3]); endif . #6:63 "@read <msg>... -- as in help @read"; "@read <msg>... on *<recipient> -- reads messages on recipient."; "@peek ... -- like @read, but don't set current message"; set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (p = this:parse_mailread_cmd("@read", args, "", "on")) this:set_current_folder(folder = p[1]); msg_seq = p[2]; if ((lim = player:mail_option("manymsgs")) && ((lim <= (seq_size = $seq_utils:size(msg_seq))) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " messages. Continue?"))))) player:notify(tostr("Aborted. @mailoption manymsgs=", lim)); return; endif this._mail_task = task_id(); if (cur = folder:display_seq_full(msg_seq, tostr("Message %d", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":"))) if (verb != "@peek") this:set_current_message(folder, @cur); endif endif endif . #6:64 set_task_perms(player); if (dobjstr) player:notify(tostr("Usage: ", verb, " [on <recipient>]")); else this:("@read")(verb[2..5], @args); endif . #6:65 "@rmm <message-sequence> [from <recipient>]. Use @unrmm if you screw up."; " Beware, though. @unrmm can only undo the most recent @rmm."; set_task_perms(player); if (!(p = this:parse_mailread_cmd("@rmm", args, "cur", "from"))) "...parse failed, we've already complained..."; elseif ((!prepstr) && ((p[1] != this) && (!$command_utils:yes_or_no(("@rmmail from " + $mail_agent:name(p[1])) + ". Continue?")))) "...wasn't the folder player was expecting..."; player:notify("@rmmail aborted."); else this:set_current_folder(folder = p[1]); e = folder:rm_message_seq(p[2]); if (typeof(e) == ERR) player:notify(tostr(e)); else count = (((n = $seq_utils:size(p[2])) == 1) ? "." | tostr(" (", n, " messages).")); fname = ((folder == this) ? "" | (" from " + $mail_agent:name(folder))); player:notify(tostr("Deleted ", e, fname, count)); endif endif . #6:66 set_task_perms(player); if (!dobjstr) folder = this:current_folder(); elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr)) return; endif cur = this:current_message(folder); fname = $mail_agent:name(folder); if (typeof(h = folder:renumber(cur)) == ERR) player:notify(tostr(h)); else if (!h[1]) player:notify(tostr("No messages on ", fname, ".")); else player:notify(tostr("Messages on ", fname, " renumbered 1-", h[1], ".")); this:set_current_folder(folder); if (h[2] && this:set_current_message(folder, h[2])) player:notify(tostr("Current message is now ", h[2], ".")); endif endif endif . #6:67 "@unrmm [on <recipient>] -- undoes the previous @rmm on that recipient."; set_task_perms(player); if (!(p = this:parse_folder_spec("@unrmm", args, "on"))) return; endif dobjstr = $string_utils:from_list(p[2], " "); if (!dobjstr) do = "undo_rmm"; elseif (index("expunge", dobjstr) == 1) do = "expunge_rmm"; elseif (index("list", dobjstr) == 1) do = "list_rmm"; else player:notify(tostr("Usage: ", verb, " [expunge|list] [on <recipient>]")); return; endif this:set_current_folder(folder = p[1]); if (msg_seq = folder:(do)()) if (do == "undo_rmm") player:notify(tostr($seq_utils:size(msg_seq), " messages restored to ", $mail_agent:name(folder), ".")); folder:display_seq_headers(msg_seq, 0); else player:notify(tostr(msg_seq, " zombie message", (msg_seq == 1) ? " " | "s ", (do == "expunge_rmm") ? "expunged from " | "on ", $mail_agent:name(folder), ".")); endif elseif (typeof(msg_seq) == ERR) player:notify(tostr(msg_seq)); else player:notify(tostr("No messages to ", (do == "expunge_rmm") ? "expunge from " | "restore to ", $mail_agent:name(folder))); endif . #6:68 if (args && (args[1] == "to")) args = listdelete(args, 1); endif subject = {}; for a in (args) if (((i = index(a, "=")) > 3) && (index("subject", a[1..i - 1]) == 1)) args = setremove(args, a); a[1..i] = ""; subject = {a}; endif endfor $mail_editor:invoke(args, verb, @subject); . #6:69 "@answer <msg> [on *<recipient>] [<flags>...]"; set_task_perms(who = (valid(caller_perms()) ? caller_perms() | player)); if (p = this:parse_mailread_cmd(verb, args, "", "on", 1)) if ($seq_utils:size(p[2]) != 1) player:notify("You can only answer *one* message at a time."); elseif (LIST != typeof(flags_replytos = $mail_editor:check_answer_flags(@p[4]))) player:notify_lines({tostr("Usage: ", verb, " [message-# [on <recipient>]] [flags...]"), "where flags include any of:", " all reply to everyone", " sender reply to sender only", " include include the original message in your reply", " noinclude don't include the original in your reply"}); else this:set_current_folder(p[1]); $mail_editor:invoke(2, verb, p[1]:messages_in_seq(p[2])[1][2], @flags_replytos); endif endif . #6:70 "@forward <msg> [on *<recipient>] to <recipient> [<recipient>...]"; set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (!(p = this:parse_mailread_cmd(verb, args, "", "on", 1))) "...lose..."; return; elseif ($seq_utils:size(sequence = p[2]) != 1) player:notify("You can only forward *one* message at a time."); return; elseif ((length(p[4]) < 2) || (p[4][1] != "to")) player:notify(tostr("Usage: ", verb, " [<message>] [on <folder>] to <recip>...")); return; endif recips = {}; for rs in (listdelete(p[4], 1)) if ($mail_agent:match_failed(r = $mail_agent:match_recipient(rs), rs)) return; endif recips = {@recips, r}; endfor this:set_current_folder(folder = p[1]); m = folder:messages_in_seq(sequence)[1]; msgnum = m[1]; msgtxt = m[2]; from = msgtxt[2]; if (msgtxt[4] != " ") subject = tostr("[", from, ": ", msgtxt[4], "]"); elseif ((h = ("" in msgtxt)) && (h < length(msgtxt))) subject = tostr("[", from, ": `", msgtxt[h + 1][1..min(20, length(msgtxt[h + 1]))], "']"); else subject = tostr("[", from, "]"); endif result = $mail_agent:send_message(player, recips, subject, $mail_agent:to_text(@msgtxt)); if (!result) player:notify(tostr(result)); elseif (result[1]) player:notify(tostr("Message ", msgnum, @(folder == this) ? {} | {" on ", $mail_agent:name(folder)}, " @forwarded to ", $mail_agent:name_list(@listdelete(result, 1)), ".")); else player:notify("Message not sent."); endif . #6:71 $mail_editor:invoke($gripe_recipients, "@gripe", "@gripe: " + argstr); . #6:72 subject = tostr($string_utils:capitalize(verb[2..length(verb)]), ": ", (loc = this.location).name, "(", loc, ")"); if (this != player) return E_PERM; elseif (argstr) result = $mail_agent:send_message(this, {loc.owner}, subject, argstr); if (result && result[1]) player:notify(tostr("Your ", verb, " sent to ", $mail_agent:name_list(@listdelete(result, 1)), ". Input is appreciated, as always.")); else player:notify(tostr("Huh? This room's owner (", loc.owner, ") is invalid? Tell a wizard...")); endif return; elseif (!($object_utils:isa(loc, $room) && loc.free_entry)) player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "This room may not let you back in if you go to the Mail Room."}); elseif ($object_utils:isa(loc, $generic_editor)) player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "Sending you to the Mail Room from an editor is usually a bad idea."}); else $mail_editor:invoke({tostr(loc.owner)}, verb, subject); endif if (verb == "@bug") player:notify("For a @bug report, be sure to mention exactly what it was you typed to trigger the error..."); endif . #6:73 "@skip [*<folder/mailing_list>...]"; " sets your last-read time for the given lists to now, indicating your"; " disinterest in any new messages that might have appeared recently."; set_task_perms(player); current_folder = this:current_folder(); for a in (args || {0}) if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = this:current_folder())) "...bogus folder name, done... No, try anyway."; if (this:kill_current_message(this:my_match_object(a))) player:notify("Invalid folder, but found it subscribed anyway. Removed."); endif else lseq = folder:length_all_msgs(); unread = ((n = this:get_current_message(folder)) ? folder:length_date_gt(n[2]) | lseq); this:set_current_message(folder, lseq && folder:messages_in_seq({lseq, lseq + 1})[1][1], time()); player:notify(tostr(unread ? tostr("Ignoring ", unread) | "No", " unread message", (unread != 1) ? "s" | "", " on ", $mail_agent:name(folder))); if (current_folder == folder) this:set_current_folder(this); endif endif endfor . #6:74 "@subscribe *<folder/mailing_list>"; " causes you to be notified when new mail arrives on this list"; "@subscribe"; " just lists available mailing lists."; set_task_perms(player); if (!dobjstr) ml = $list_utils:slice(player.current_message[3..length(player.current_message)]); for c in ({@$mail_agent.contents, @this.mail_lists}) $command_utils:suspend_if_needed(0); if ((c:is_usable_by(player) || c:is_readable_by(player)) && ((verb != "@unsubscribed") || (!(c in ml)))) c:look_self(); endif endfor player:notify(tostr("-------- end of ", verb, " -------")); return; elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr)) return; elseif (folder == this) player:notify("You don't need to @subscribe to yourself"); return; elseif ($object_utils:isa(folder, $mail_recipient) ? !folder:is_readable_by(this) | (!$perm_utils:controls(this, folder))) player:notify("That mailing list is not readable by you."); return; endif this:make_current_message(folder); notification = (iobjstr && (iobjstr[1] == "n")); if ($object_utils:isa(folder, $mail_recipient) && notification) folder:add_notify(this); endif len = folder:length_all_msgs(); player:notify(tostr($mail_agent:name(folder), " has ", len, " message", (len == 1) ? "" | "s", ".", notification ? " You will be notified immediately when new messages are posted." | " Notification of new messages will be printed when you connect.")); this:set_current_folder(folder); . #6:75 set_task_perms((caller == this) ? this.owner | caller_perms()); new_cm = (head = {}); for n in (this.current_message) if (typeof(n) != LIST) head = {@head, n}; elseif ($object_utils:isa(folder = n[1], $mail_recipient) && folder:is_readable_by(this)) "...set current msg to be the last one you could possibly have read."; if (n[3] < folder.last_msg_date) i = folder:length_date_le(n[3]); n[2] = (i && folder:messages_in_seq(i)[1]); endif new_cm = listappend(new_cm, n, $list_utils:iassoc_sorted(n[3], new_cm, 3)); endif endfor this.current_message = {@head, @$list_utils:reverse(new_cm)}; this:set_current_folder(this); . #6:76 set_task_perms((caller == this) ? this.owner | caller_perms()); which = {}; cm = this.current_message; cm[1..2] = ((verb == "@rn") ? {{this, @cm[1..2]}} | {}); all = (verb == "@subscribed"); for n in (cm) rcpt = n[1]; if ($mail_agent:is_recipient(rcpt)) if ((nmsgs = n[1]:length_date_gt(n[3])) || all) which = {@which, {n[1], nmsgs}}; endif else player:notify(tostr("Bogus recipient ", rcpt, " removed from .current_message.")); this.current_message = setremove(this.current_message, n); endif $command_utils:suspend_if_needed(0); endfor if (which) player:notify((verb == "@subscribed") ? "You are subscribed to the following lists:" | "There is new activity on the following lists:"); for w in (which) name = ((w[1] == this) ? " me" | $mail_agent:name(w[1])); player:notify(tostr($string_utils:left(" " + name, 40), " ", w[2], " new message", (w[2] == 1) ? "" | "s")); endfor elseif (verb == "@rn") player:notify("No new activity on any of your lists."); elseif (verb == "@subscribed") player:notify("You aren't subscribed to any mailing lists."); endif return which; . #6:77 ":mail_option(name)"; "Returns the value of the specified mail option"; if ((caller in {this, $mail_editor, $mail_agent}) || $perm_utils:controls(caller_perms(), this)) return $mail_options:get(this.mail_options, args[1]); else return E_PERM; endif . #6:78 ":display_option(name) => returns the value of the specified @display option"; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) return $display_options:get(this.display_options, args[1]); else return E_PERM; endif . #6:79 ":edit_option(name) => returns the value of the specified edit option"; if ((caller == this) || ($object_utils:isa(caller, $generic_editor) || $perm_utils:controls(caller_perms(), this))) return $edit_options:get(this.edit_options, args[1]); else return E_PERM; endif . #6:80 ":list_option(name) => returns the value of the specified @list option"; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) return $list_options:get(this.list_options, args[1]); else return E_PERM; endif . #6:81 ":set_edit_option(oname,value)"; ":set_display_option(oname,value)"; ":set_mail_option(oname,value)"; "Changes the value of the named option."; "Returns a string error if something goes wrong."; if (!((caller == this) || $perm_utils:controls(caller_perms(), this))) return tostr(E_PERM); endif "...this is kludgy, but it saves me from writing the same verb 3 times."; "...there's got to be a better way to do this..."; verb[1..4] = ""; foo_options = (verb + "s"); "..."; if (typeof(s = #0.(foo_options):set(this.(foo_options), @args)) == STR) return s; elseif (s == this.(foo_options)) return 0; else this.(foo_options) = s; return 1; endif . #6:82 "@<what>-option <option> [is] <value> sets <option> to <value>"; "@<what>-option <option>=<value> sets <option> to <value>"; "@<what>-option +<option> sets <option> (usually equiv. to <option>=1"; "@<what>-option -<option> resets <option> (equiv. to <option>=0)"; "@<what>-option !<option> resets <option> (equiv. to <option>=0)"; "@<what>-option <option> displays value of <option>"; set_task_perms(player); what = {"mail", "edit", "display"}[index("med", verb[2])]; options = (what + "_options"); option_pkg = #0.(options); set_option = (("set_" + what) + "_option"); if (!args) player:notify_lines({("Current " + what) + " options:", "", @option_pkg:show(this.(options), option_pkg.names)}); return; elseif (typeof(presult = option_pkg:parse(args)) == STR) player:notify(presult); return; else if (length(presult) > 1) if (typeof(sresult = this:(set_option)(@presult)) == STR) player:notify(sresult); return; elseif (!sresult) player:notify("No change."); return; endif endif player:notify_lines(option_pkg:show(this.(options), presult[1])); endif . #6:83 "set_name(newname) attempts to change this.name to newname"; " => E_PERM if you don't own this"; " => E_INVARG if the name is already taken or prohibited for some reason"; " => E_NACC if the player database is not taking new names right now."; " => E_ARGS if the name is too long (controlled by $login.max_player_name)"; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; elseif (!is_player(this)) "we don't worry about the names of player classes."; set_task_perms(caller_perms()); return pass(@args); elseif ($player_db.frozen) return E_NACC; elseif (length(name = args[1]) > $login.max_player_name) return E_ARGS; elseif (!($player_db:available(name) in {this, 1})) return E_INVARG; else old = this.name; this.name = name; if ((name != old) && (!(old in this.aliases))) $player_db:delete(old); endif $player_db:insert(name, this); return 1; endif . #6:84 "set_aliases(alias_list)"; "For changing player aliases, we check to make sure that none of the aliases match existing player names/aliases. Aliases containing spaces are not entered in the $player_db and so are not subject to this restriction ($string_utils:match_player will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch)."; "Also we make sure that the .name is included in the .alias list. In any situation where .name and .aliases are both being changed, do the name change first."; " => E_PERM if you don't own this"; " => E_NACC if the player database is not taking new aliases right now."; " => E_TYPE if alias_list is not a list"; " => E_INVARG if any element of alias_list is not a string"; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; elseif (!is_player(this)) "we don't worry about the names of player classes."; return pass(@args); elseif ($player_db.frozen) return E_NACC; elseif (typeof(aliases = args[1]) != LIST) return E_TYPE; elseif ((length(aliases) > 30) && (length(aliases) > length(this.aliases))) return E_INVARG; else for a in (aliases) if (typeof(a) != STR) return E_INVARG; endif if ((!index(a, " ")) && (!($player_db:available(a) in {this, 1}))) aliases = setremove(aliases, a); endif endfor aliases = setadd(aliases, this.name); old = this.aliases; this.aliases = aliases; for a in (old) if (!(a in aliases)) $player_db:delete2(a, this); endif endfor for a in (aliases) if (!index(a, " ")) $player_db:insert(a, this); endif endfor return 1; endif . #6:85 if ((player != caller) || (player != this)) return; endif set_task_perms(player); spec = $code_utils:parse_verbref(dobjstr); if (spec) object = this:my_match_object(spec[1]); if (!$command_utils:object_match_failed(object, spec[1])) vname = spec[2]; info = verb_info(object, vname); if (info == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else result = set_verb_info(object, vname, listset(info, iobjstr, 3)); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify("Verb name changed."); endif endif endif else object = this:my_match_object(dobjstr); if (!$command_utils:object_match_failed(object, dobjstr)) old_name = object.name; old_aliases = object.aliases; if (e = $building_utils:set_names(object, iobjstr)) if (strcmp(object.name, old_name) == 0) name_message = tostr("Name of ", object, " (", old_name, ") is unchanged"); else name_message = tostr("Name of ", object, " changed to \"", object.name, "\""); endif aliases = $string_utils:from_value(object.aliases, 1); if (object.aliases == old_aliases) alias_message = tostr(". Aliases are unchanged (", aliases, ")."); else alias_message = tostr(", with aliases ", aliases, "."); endif player:notify(name_message + alias_message); elseif (e == E_INVARG) player:notify("That particular name change not allowed (see help @rename)."); elseif (e == E_NACC) player:notify("Oops. You can't update that name right now; try again in a few minutes."); elseif (e == E_ARGS) player:notify(tostr("Sorry, name too long. Maximum number of characters in a name: ", $login.max_player_name)); else player:notify(tostr(e)); endif endif endif . #6:86 "Syntax: @addalias <alias>[,...,<alias>] to <object>"; " @addalias <alias>[,...,<alias>] to <object>:<verb>"; ""; "The first form is used to add aliases to an object's list of aliases. You can separate multiple aliases with commas. The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added."; ""; "Example:"; "Muchkin wants to add new aliases to Rover the Wonder Dog:"; " @addalias Dog,Wonder Dog to Rover"; "Since Rover the Wonder Dog already has the alias \"Dog\" but does not have the alias \"Wonder Dog\", Munchkin sees:"; " Rover the Wonder Dog(#4237) already has the alias Dog."; " Alias Wonder Dog added to Rover the Wonder Dog(#4237)."; ""; "If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified."; ""; "Example:"; "Munchkin wants to add his nicknames to his own list of aliases:"; " @addalias Foobar Davey to me"; "@Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database. Unfortunately, DaveTheMan is already using the alias \"Davey\" so Munchkin sees:"; " DaveTheMan(#5432) is already using the alias Davey"; " Alias Foobar added to Munchkin(#1523)."; ""; "The second form of the @addalias command is for use by programmers, to add aliases to a verb they own. All commas and spaces are assumed to be separations between aliases."; if (player != this) return; endif set_task_perms(player); spec = $code_utils:parse_verbref(iobjstr); if (spec) object = player:my_match_object(spec[1]); if (!$command_utils:object_match_failed(object, spec[1])) vname = spec[2]; info = verb_info(object, vname); if (info == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else old_aliases = $string_utils:explode(info[3]); used = {}; for alias in (new_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " ")))) if (alias in old_aliases) used = {@used, alias}; new_aliases = setremove(new_aliases, alias); endif endfor if (used) player:notify(tostr(object.name, "(", object, "):", vname, " already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), ".")); endif if (new_aliases) info = listset(info, aliases = $string_utils:from_list({@old_aliases, @new_aliases}, " "), 3); result = set_verb_info(object, vname, info); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to verb ", object.name, "(", object, "):", vname)); player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\"")); endif endif endif endif else object = player:my_match_object(iobjstr); if (!$command_utils:object_match_failed(object, iobjstr)) old_aliases = object.aliases; used = {}; for alias in (new_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(is_player(object) ? strsub(dobjstr, " ", ",") | dobjstr, ",")))) if (alias in old_aliases) used = {@used, alias}; new_aliases = setremove(new_aliases, alias); elseif (is_player(object) && valid(someone = $player_db:find_exact(alias))) player:notify(tostr(someone.name, "(", someone, ") is already using the alias ", alias, ".")); new_aliases = setremove(new_aliases, alias); endif endfor if (used) player:notify(tostr(object.name, "(", object, ") already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), ".")); endif if (new_aliases) if ((e = object:set_aliases(aliases = {@old_aliases, @new_aliases})) && (object.aliases == {@old_aliases, @new_aliases})) player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to ", object.name, "(", object, ").")); player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(aliases, 1))); elseif (e || (e == E_INVARG)) player:notify("That particular name change not allowed (see help @rename or help @addalias)."); elseif (e == E_NACC) player:notify("Oops. You can't update that object's aliases right now; try again in a few minutes."); else player:notify(tostr(e)); endif endif endif endif . #6:87 "Syntax: @rmalias <alias>[,...,<alias>] from <object>"; " @rmalias <alias>[,...,<alias>] from <object>:<verb>"; ""; "The first form is used to remove aliases from an object. If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases. Otherwise, only commas will be assumed to be separations."; "[5/10/93 Nosredna: flushed above is_player feature"; "Note that @rmalias will not affect the object's name, only its aliases."; ""; "The second form is for use by programmers, to remove aliases from a verb they own. All spaces and commas are assumed to be separations between unwanted aliases."; if (player != this) return; endif set_task_perms(player); spec = $code_utils:parse_verbref(iobjstr); if (spec) object = player:my_match_object(spec[1]); if (!$command_utils:object_match_failed(object, spec[1])) vname = spec[2]; info = verb_info(object, vname); if (info == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else old_aliases = $string_utils:explode(info[3]); not_used = {}; for alias in (bad_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " ")))) if (!(alias in old_aliases)) not_used = {@not_used, alias}; bad_aliases = setremove(bad_aliases, alias); else old_aliases = setremove(old_aliases, alias); endif endfor if (not_used) player:notify(tostr(object.name, "(", object, "):", vname, " does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), ".")); endif if (bad_aliases && old_aliases) info = listset(info, aliases = $string_utils:from_list(old_aliases, " "), 3); result = set_verb_info(object, vname, info); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from verb ", object.name, "(", object, "):", vname)); player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\"")); endif elseif (!old_aliases) player:notify("You have to leave a verb with at least one alias."); endif endif endif else object = player:my_match_object(iobjstr); if (!$command_utils:object_match_failed(object, iobjstr)) old_aliases = object.aliases; not_used = {}; for alias in (bad_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(dobjstr, ",")))) "removed is_player(object) ? strsub(dobjstr, \" \", \",\") | --Nosredna"; if (!(alias in old_aliases)) not_used = {@not_used, alias}; bad_aliases = setremove(bad_aliases, alias); else old_aliases = setremove(old_aliases, alias); endif endfor if (not_used) player:notify(tostr(object.name, "(", object, ") does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), ".")); endif if (bad_aliases) if (e = object:set_aliases(old_aliases)) player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from ", object.name, "(", object, ").")); player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(old_aliases, 1))); elseif (e == E_INVARG) player:notify("That particular name change not allowed (see help @rename or help @rmalias)."); elseif (e == E_NACC) player:notify("Oops. You can't update that object's aliases right now; try again in a few minutes."); else player:notify(tostr(e)); endif endif endif endif . #6:88 set_task_perms(player); dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) "...lose..."; elseif (e = dobj:set_description(iobjstr)) player:notify("Description set."); else player:notify(tostr(e)); endif . #6:89 set_task_perms(player); if (dobjstr == "") player:notify(tostr("Usage: ", verb, " <object>")); return; endif dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) return; endif found_one = 0; props = $object_utils:all_properties(dobj); if (typeof(props) == ERR) player:notify("You can't read the messages on that."); return; endif for pname in (props) len = length(pname); if ((len > 4) && (pname[len - 3..len] == "_msg")) found_one = 1; msg = dobj.(pname); if (msg == E_PERM) value = "isn't readable by you."; elseif (!msg) value = "isn't set."; elseif (typeof(msg) != STR) value = "is corrupted! **"; else value = ("is " + $string_utils:print(msg)); endif player:notify(tostr("@", pname[1..len - 4], " ", dobjstr, " ", value)); endif endfor if (!found_one) player:notify("That object doesn't have any messages to set."); endif . #6:90 $note_editor:invoke(dobjstr, verb); . #6:91 if (typeof(player.password) != STR) if (length(args) != 1) return player:notify(tostr("Usage: ", verb, " <new-password>")); else new_password = args[1]; endif elseif (length(args) != 2) player:notify(tostr("Usage: ", verb, " <old-password> <new-password>")); return; elseif (player.password != crypt(tostr(args[1]), player.password)) player:notify("That's not your old password."); return; else new_password = args[2]; endif player.password = crypt(tostr(new_password)); player:notify("New password set."); . #6:92 "@last-c reports when and from where you last connected."; "@last-c all adds the 10 most recent places you connected from."; "@last-c confunc is like `@last-c' but is silent on first login."; opts = {"all", "confunc"}; i = 0; if (caller != this) return E_PERM; elseif (args && ((length(args) > 1) || (!(i = $string_utils:find_prefix(args[1], opts))))) this:notify(tostr("Usage: ", verb, " [all]")); return; endif opt_all = (i && (opts[i] == "all")); opt_confunc = (i && (opts[i] == "confunc")); if (!(prev = this.previous_connection)) this:notify("Something was broken when you logged in; tell a wizard."); elseif (prev[1] == 0) opt_confunc || this:notify("Your previous connection was before we started keeping track."); elseif (prev[1] > time()) this:notify("This is your first time connected."); else this:notify(tostr("Last connected ", ctime(prev[1]), " from ", prev[2])); if (opt_all) this:notify("Previous connections have been from the following sites:"); for l in (this.all_connect_places) this:notify(" " + l); endfor endif endif . #6:93 "set_gender(newgender) attempts to change this.gender to newgender"; " => E_PERM if you don't own this or aren't its parent"; " => Other return values as from $gender_utils:set."; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; else result = $gender_utils:set(this, args[1]); this.gender = ((typeof(result) == STR) ? result | args[1]); return result; endif . #6:94 set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (!args) player:notify(tostr("Your gender is currently ", this.gender, ".")); player:notify($string_utils:pronoun_sub("Your pronouns: %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R")); player:notify(tostr("Available genders: ", $string_utils:english_list($gender_utils.genders, "", " or "))); else result = this:set_gender(args[1]); quote = ((result == E_NONE) ? "\"" | ""); player:notify(tostr("Gender set to ", quote, this.gender, quote, ".")); if (typeof(result) != ERR) player:notify($string_utils:pronoun_sub("Your pronouns: %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R")); elseif (result != E_NONE) player:notify(tostr("Couldn't set pronouns: ", result)); else player:notify("Pronouns unchanged."); endif endif . #6:95 "set_brief(value)"; "set_brief(value, anything)"; "If <anything> is given, add value to the current value; otherwise, just set the value."; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; else if (length(args) == 1) this.brief = args[1]; else this.brief = (this.brief + args[1]); endif endif . #6:96 "@mode <mode>"; "Current modes are brief and verbose."; "General verb for setting player `modes'."; "Modes are coded right here in the verb."; if (caller != this) player:tell("You can't set someone else's modes."); return E_PERM; endif modes = {"brief", "verbose"}; mode = modes[$string_utils:find_prefix(dobjstr, modes)]; if (!mode) player:tell("Unknown mode \"", dobjstr, "\". Known modes:"); for mode in (modes) player:tell(" ", mode); endfor return 0; elseif (mode == "brief") this:set_brief(1); elseif (mode == "verbose") this:set_brief(0); endif player:tell($string_utils:capitalize(mode), " mode set."); return 1; . #6:97 "This verb should probably go away once 'examine' is in place."; if (dobjstr == "") player:notify(tostr("Usage: ", verb, " <object>")); return; endif what = $string_utils:match_object(dobjstr, player.location); if ($command_utils:object_match_failed(what, dobjstr)) return; endif player:notify(tostr(what.name, " (", what, ") is owned by ", valid(what.owner) ? what.owner.name | "a recycled player", " (", what.owner, ").")); player:notify(tostr("Aliases: ", $string_utils:english_list(what.aliases))); desc = what:description(); if (desc) player:notify_lines(desc); else player:notify("(No description set.)"); endif if ($perm_utils:controls(player, what)) player:notify(tostr("Key: ", $lock_utils:unparse_key(what.key))); endif contents = what.contents; if (contents) player:notify("Contents:"); for item in (contents) player:notify(tostr(" ", item.name, " (", item, ")")); endfor endif "Use dobjstr, not shortest alias."; name = dobjstr; "name = what.name;"; "if (typeof(what.aliases) == LIST && what.aliases != {})"; "for alias in (what.aliases)"; "if (length(alias) <= length(name))"; "name = alias;"; "endif"; "endfor"; "endif"; vrbs = {}; commands_ok = (what in {player, player.location}); dull_classes = {$root_class, $room, $player, $prog}; what = what; printed_working_msg = 0; while (what != $nothing) if ($command_utils:running_out_of_time()) if (!printed_working_msg) player:notify("Working on list of obvious verbs..."); printed_working_msg = 1; endif suspend(0); endif if (!(what in dull_classes)) for i in [0..length(verbs(what)) - 1] if ($command_utils:running_out_of_time()) if (!printed_working_msg) player:notify("Working on list of obvious verbs..."); printed_working_msg = 1; endif suspend(0); endif info = verb_info(what, tostr(i)); syntax = verb_args(what, tostr(i)); if ((index(info[2], "r") && ((syntax[2..3] != {"none", "this"}) && (commands_ok || ("this" in syntax)))) && verb_code(what, tostr(i))) dobj = syntax[1]; prep = syntax[2]; iobj = syntax[3]; if (syntax == {"any", "any", "any"}) prep = "none"; endif if (prep != "none") for x in ($string_utils:explode(prep, "/")) if (length(x) <= length(prep)) prep = x; endif endfor endif "This is the correct way to handle verbs ending in *"; vname = info[3]; while (i = index(vname, "* ")) vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]); endwhile if (vname[i = length(vname)] == "*") vname = (vname[1..i - 1] + "<anything>"); endif vname = strsub(vname, " ", "/"); rest = ""; if (prep != "none") rest = (" " + ((prep == "any") ? "<anything>" | prep)); if (iobj != "none") rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>"); endif endif if (dobj != "none") rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest); endif vrbs = setadd(vrbs, (" " + vname) + rest); endif endfor endif what = parent(what); endwhile if (vrbs) player:notify("Obvious Verbs:"); player:notify_lines(vrbs); printed_working_msg && player:notify("(End of list.)"); elseif (printed_working_msg) player:notify("No obvious verbs found."); endif . #6:98 set_task_perms(player); if (!dobjstr) player:notify(tostr("Usage: ", verb, " <object>")); return E_INVARG; endif what = player.location:match_object(dobjstr); if ($command_utils:object_match_failed(what, dobjstr)) return; endif what:do_examine(player); . #6:99 "Add a feature to this player's features list. Caller must be this or have suitable permissions (this or wizardly)."; "If this is a nonprogrammer, then ask feature if it is feature_ok (that is, if it has a verb :feature_ok which returns a true value, or a property .feature_ok which is true)."; "After adding feature, call feature:feature_add(this)."; "Returns true if successful, E_INVARG if not a valid object, and E_PERM if !feature_ok or if caller doesn't have permission."; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) feature = args[1]; if ((typeof(feature) != OBJ) || (!valid(feature))) return E_INVARG; "Not a valid object."; endif if ($code_utils:verb_or_property(feature, "feature_ok", this)) "The object is willing to be a feature."; if (typeof(this.features) == LIST) "If list, we can simply setadd the feature."; this.features = setadd(this.features, feature); else "If not, we erase the old value and create a new list."; this.features = {feature}; endif "Tell the feature it's just been added."; feature:feature_add(this); return 1; "We're done."; else return E_PERM; "Feature isn't feature_ok."; endif else return E_PERM; "Caller doesn't have permission."; endif . #6:100 "Remove a feature from this player's features list. Caller must be this, or have permissions of this, a wizard, or feature.owner."; "Returns true if successful, E_PERM if caller didn't have permission."; feature = args[1]; if (((caller == this) || $perm_utils:controls(caller_perms(), this)) || (caller_perms() == feature.owner)) if (typeof(this.features) == LIST) "If this is a list, we can just setremove..."; this.features = setremove(this.features, feature); "Otherwise, we leave it alone."; endif "Let the feature know it's been removed."; feature:feature_remove(this); return 1; "We're done."; else return E_PERM; "Caller didn't have permission."; endif . #6:101 "Usage: @add-feature <feature object>"; "Add an object to your features list."; set_task_perms(player); if (dobjstr) if (!$command_utils:object_match_failed(dobj, dobjstr)) if (dobj in player.features) player:tell(dobjstr, " is already one of your features."); elseif (player:add_feature(dobj)) player:tell(dobj, " (", dobj.name, ") added as a feature."); else player:tell("You can't seem to add ", dobj, " (", dobj.name, ") to your features list."); endif endif else player:tell("Usage: @add-feature <object>"); endif . #6:102 "Usage: @remove-feature <feature object>"; "Remove an object from your .features list."; set_task_perms(player); if (dobjstr) features = player.features; if (!valid(dobj)) dobj = $string_utils:match(dobjstr, features, "name", features, "aliases"); endif if (!$command_utils:object_match_failed(dobj, dobjstr)) if (dobj in features) player:remove_feature(dobj); player:tell(dobj, " (", dobj.name, ") removed from your features list."); else player:tell(dobjstr, " is not one of your features."); endif endif else player:tell("Usage: @remove-feature <object>"); endif . #6:103 "Usage: @features [<name>] for <player>"; "List the feature objects matching <name> used by <player>."; if (!iobjstr) player:tell("Usage: @features [<name>] for <player>"); return; elseif ($command_utils:player_match_failed(whose = $string_utils:match_player(iobjstr), iobjstr)) return; endif features = {}; for feature in (whose.features) if (!valid(feature)) this:remove_feature(feature); elseif ((!dobjstr) || ((dobjstr in feature.aliases) || ((pref = $string_utils:find_prefix(dobjstr, feature.aliases)) || (pref == $ambiguous_match)))) features = listappend(features, feature); endif endfor if (features) len = (max(length("Feature"), length(tostr(max_object()))) + 1); player:tell($string_utils:left("Feature", len), "Name"); player:tell($string_utils:left("-------", len), "----"); for feature in (features) player:tell($string_utils:left(tostr(feature), len), feature.name); endfor player:tell($string_utils:left("-------", len), "----"); cstr = (((tostr(length(features)) + " feature") + ((length(features) > 1) ? "s" | "")) + " found"); if (whose != this) cstr = (((((cstr + " on ") + whose.name) + " (") + tostr(whose)) + ")"); endif if (dobjstr) cstr = (((cstr + " matching \"") + dobjstr) + "\""); endif cstr = (cstr + "."); player:tell(cstr); elseif (dobjstr) player:tell("No features found on ", whose.name, " (", whose, ") matching \"", dobjstr, "\"."); else player:tell("No features found on ", whose.name, " (", whose, ")."); endif . #6:104 "Usage: @features [<name>]"; "List the feature objects matching <name> used by player."; iobjstr = player.name; iobj = player; this:("@features")(); . #6:105 stats = memory_usage(); if (!stats) player:notify("Sorry, but no memory-usage statistics are available for this server."); return; endif su = $string_utils; player:notify("Block Size # In Use # Free Bytes In Use Bytes Free"); player:notify("---------- -------- -------- ------------ ----------"); nused = (nfree = (bytesused = (bytesfree = 0))); kilo = 1024; meg = (kilo * kilo); for x in (stats) if (x[2..3] != {0, 0}) bsize = x[1]; if ((bsize % meg) == 0) bsize = tostr(bsize / meg, " M"); elseif ((bsize % kilo) == 0) bsize = tostr(bsize / kilo, " K"); endif bused = (x[1] * x[2]); bfree = (x[1] * x[3]); player:notify(tostr(su:left(bsize, 10), " ", su:right(su:group_number(x[2]), 8), " ", su:right(su:group_number(x[3]), 8), " ", su:right(su:group_number(bused), 12), " ", su:right(su:group_number(bfree), 10))); nused = (nused + x[2]); nfree = (nfree + x[3]); bytesused = (bytesused + bused); bytesfree = (bytesfree + bfree); endif endfor player:notify(""); player:notify(tostr(su:left("Totals:", 10), " ", su:right(su:group_number(nused), 8), " ", su:right(su:group_number(nfree), 8), " ", su:right(su:group_number(bytesused), 12), " ", su:right(su:group_number(bytesfree), 10))); player:notify(""); player:notify(tostr("Total Memory Size: ", su:group_number(bytesused + bytesfree), " bytes.")); . #6:106 player:notify(tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code.")); . #6:107 player:notify(tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), ".")); . #6:108 boot_player(player); "-- argh, let the player decide; #3:disfunc() takes care of this --Rog"; "player:moveto(player.home)"; . #6:109 return this == args[1]; . #6:110 "return true if player is active. This verb is !d"; return typeof(idle_seconds(this)) != ERR; . #6:111 if (args[1] == #-1) return E_INVARG; this:notify("You are now in #-1, The Void. Type `home' to get back."); endif set_task_perms(caller_perms()); pass(@args); . #6:112 return this.location:(verb)(@args); "temporarily let player:announce be noisy to player"; if (verb == "announce_all_but") if (this in args[1]) return; endif args = args[2..length(args)]; endif this:tell("(from within you) ", @args); . #6:113 "Return a true value if this needs linewrapping."; "default is true if .linelen > 0"; return this.linelen > 0; . #6:114 "Usage: @set-note-{string | text} {#xx | #xx.pname}"; " ...lines of text..."; " ."; ""; "For use by clients' local editors, to save new text for a note or object property. See $note_editor:local_editing_info() for details."; set_task_perms(player); text = $command_utils:read_lines(1); if ((verb == "@set-note-string") && (length(text) <= 1)) text = (text ? text[1] | ""); endif if (spec = $code_utils:parse_propref(argstr)) o = toobj(spec[1]); p = spec[2]; e = (o.(p) = text); if (e != text) player:tell("Error: ", e); else player:tell("Set ", p, " property of ", o.name, " (", o, ")."); endif elseif (typeof(note = $code_utils:toobj(argstr)) == OBJ) e = note:set_text(text); if (typeof(e) == ERR) player:tell("Error: ", e); else player:tell("Set text of ", note.name, " (", note, ")."); endif else player:tell("Error: Malformed argument to ", verb, ": ", argstr); endif . #6:115 "Copied from Generic Player Class With Additional Features of Dubious Utility (#7069):verb_sub by ur-Rog (#6349) Tue Nov 10 15:03:38 1992 PST"; text = args[1]; if (a = $list_utils:assoc(text, this.verb_subs)) return a[2]; else return $gender_utils:get_conj(text, this); endif . #6:116 if ($perm_utils:controls(caller_perms(), this)) return this.(verb); else return E_PERM; endif . #6:117 lines = args[1]; if (typeof(lines) != LIST) lines = {lines}; endif if (this.gaglist || this.paranoid) "Check the above first, default case, to save ticks. Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings."; if (this:gag_p()) return; endif if (this.paranoid == 2) z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3]; lines = {((("[start text by " + z.name) + " (") + tostr(z)) + ")]", @lines, ((("[end text by " + z.name) + " (") + tostr(z)) + ")]"}; elseif (this.paranoid == 1) this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, lines}}; if (((len = length(this.responsible)) * 2) > (this.lines * 3)) this.responsible = this.responsible[(len - this.lines) + 1..len]; endif else this.responsible = {}; endif endif "don't gather stats for now: $list_utils:check_nonstring_tell_lines(lines)"; this:notify_lines(lines); . #6:118 "Copied from generic room (#3):@lastlog by Haakon (#2) Wed Dec 30 13:30:02 1992 PST"; if (dobjstr != "") dobj = $string_utils:match_player(dobjstr); if (!valid(dobj)) player:tell("Who?"); return; endif folks = {dobj}; else folks = players(); endif day = (week = (month = (ever = (never = {})))); a_day = ((24 * 60) * 60); a_week = (7 * a_day); a_month = (30 * a_day); now = time(); for x in (folks) when = x.last_connect_time; how_long = (now - when); if ((when == 0) || (when > now)) never = {@never, x}; elseif (how_long < a_day) day = {@day, x}; elseif (how_long < a_week) week = {@week, x}; elseif (how_long < a_month) month = {@month, x}; else ever = {@ever, x}; endif endfor for entry in ({{day, "the last day"}, {week, "the last week"}, {month, "the last 30 days"}, {ever, "recorded history"}}) if (entry[1]) player:tell("Players who have connected within ", entry[2], ":"); for x in (entry[1]) player:tell(" ", x.name, " last connected ", ctime(x.last_connect_time), "."); endfor endif endfor if (never) player:tell("Players who have never connected:"); player:tell(" ", $string_utils:english_list($list_utils:map_prop(never, "name"))); endif . #6:119 "Set linelength. Linelength must be an integer >= 10."; "If wrap is currently off (i.e. linelength is less than 0), maintains sign. That is, this function *takes* an absolute value, and coerces the sign to be appropriate."; "If you want to override the dwimming of wrap, pass in a second argument."; "returns E_PERM if not allowed, E_INVARG if linelength is too low, otherwise the linelength."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return E_PERM; elseif (abs(len = args[1]) < 10) return E_INVARG; elseif (length(args) > 1) this.linelen = len; else "DWIM here."; this.linelen = ((this.linelen > 0) ? len | (-len)); return len; endif . #6:120 "Set pagelength. Must be an integer >= 5, or 0 to turn pagelength off."; "Returns E_PERM if you shouldn't be doing this, E_INVARG if it's too low, otherwise, what it got set to."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return E_PERM; elseif (((len = args[1]) < 5) && (len != 0)) return E_INVARG; else return this.pagelen = len; endif . #6:121 "set_home(newhome) attempts to change this.home to newhome"; "E_TYPE if newhome doesn't have a callable :accept_for_abode verb."; "E_INVARG if newhome won't accept you as a resident."; "E_PERM if you don't own this and aren't its parent."; "1 if it works."; newhome = args[1]; if ((caller == this) || $perm_utils:controls(caller_perms(), this)) if ($object_utils:has_callable_verb(newhome, "accept_for_abode")) if (newhome:accept_for_abode(this)) return (typeof(e = (this.home = args[1])) != ERR) || e; else return E_INVARG; endif else return E_TYPE; endif else return E_PERM; endif . #6:122 "@unsubscribe [*<folder/mailing_list> ...]"; "entirely removes the record of your current message for the named folders,"; "indicating your disinterest in anything that might appear there in the future."; set_task_perms(player); unsubscribed = {}; current_folder = this:current_folder(); for a in (args || {0}) if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = current_folder)) "...bogus folder name, done... No, try anyway."; if (this:kill_current_message(this:my_match_object(a))) player:notify("Invalid folder, but found it subscribed anyway. Removed."); endif elseif (folder == this) player:notify(tostr("You can't ", verb, " yourself.")); else if (!this:kill_current_message(folder)) player:notify(tostr("You weren't subscribed to ", $mail_agent:name(folder))); if ($object_utils:isa(folder, $mail_recipient)) result = folder:delete_notify(this); if ((typeof(result) == LIST) && (result[1] == this)) player:notify("Removed you from the mail notifications list."); endif endif else unsubscribed = {@unsubscribed, folder}; if ($object_utils:isa(folder, $mail_recipient)) folder:delete_notify(this); endif endif endif endfor if (unsubscribed) player:notify(tostr("Forgetting about ", $string_utils:english_list($list_utils:map_arg($mail_agent, "name", unsubscribed)))); if (current_folder in unsubscribed) this:set_current_folder(this); endif endif . #6:123 "@registerme as <email-address> -- enter a new email address for player"; " will change the database entry, assign a new password, and mail the new password to the player at the given email address."; if (player != this) return player:notify(tostr(E_PERM)); endif who = this; if ($object_utils:isa(this, $guest)) who:notify("Sorry, guests should use the '@request' command to request a character."); return; endif connection = $string_utils:connection_hostname(connection_name(who)); if (!argstr) if (who.email_address) player:tell("You are currently registered as: ", who.email_address); else player:tell("You are not currently registered."); endif player:tell("Use @registerme as <address> to change this."); return; elseif (((prepstr != "as") || (!iobjstr)) || dobjstr) player:tell("Usage: @registerme as <address>"); return; endif email = iobjstr; if (reason = $wiz_utils:check_reregistration(this.name, email, connection)) if (reason[1] == "-") if (!$command_utils:yes_or_no(reason[2..length(reason)] + ". Automatic registration not allowed. Ask to be registered at this address anyway?")) who:notify("Okay."); return; endif else return who:notify(tostr(reason, " Please try again.")); endif endif if ($network.active && (!reason)) if (!$command_utils:yes_or_no(tostr("If you continue, your password will be changed, the new password mailed to `", email, "'. Do you want to continue?"))) return who:notify("Registration terminated."); endif password = $wiz_utils:random_password(5); old = (who.email_address || "[ unregistered ]"); who:notify(tostr("Registering you, and changing your password and mailing new one to ", email, ".")); result = $network:sendmail(email, tostr("Your ", $network.MOO_Name, " character, ", who.name), "Reply-to: " + $login.registration_address, @$generic_editor:fill_string(tostr("Your ", $network.MOO_name, " character, ", $string_utils:nn(who), " has been registered to this email address (", email, "), and a new password assigned. The new password is `", password, "'. Please keep your password secure. You can change your password with the @password command."), 75)); if (result != 0) who:notify(tostr("Mail sending did not work: ", reason, ". Reregistration terminated.")); return; endif who:notify(tostr("Mail with your new password forwarded. If you do not get it, send regular email to ", $login.registration_address, " with your character name.")); $mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, "reg " + $string_utils:nn(this), {email, tostr("formerly ", old)}); $registration_db:add(this, email, "Reregistered at " + ctime()); this.email_address = email; who.password = crypt(password); else who:notify("No automatic reregistration: your request will be forwarded."); if (typeof(curreg = $registration_db:find(email)) == LIST) additional_info = {"Current registration information for this email address:", @$registration_db:describe_registration(curreg)}; else additional_info = {}; endif $mail_agent:send_message(this, $registration_db.registrar, "Registration request", {((("Reregistration request from " + $string_utils:nn(who)) + " connected via ") + connection) + ":", "", (("@register " + who.name) + " ") + email, ("@new-password " + who.name) + " is ", "", "Reason this request was forwarded:", reason, @additional_info}); endif . #6:124 ":ctime([NUM time]) => STR as the function."; "May be hacked by players and player-classes to reflect differences in time-zone."; return ctime(@args); . #6:125 ":send_self_netmail(msg [ ,from ])"; "return 0 if successful, otherwise error."; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; elseif (error = $network:invalid_email_address(this.email_address)) return "Invalid email address: " + error; else msg = args[1]; if (length(args) > 1) from = args[2]; this:notify(tostr("Receiving mail from ", from:title(), " (", from, ") and forwarding it to your .email_address.")); endif oplayer = player; player = this; error = $network:sendmail(this.email_address, @msg); if (error && (length(args) > 1)) this:notify(tostr("Mail sending failed: ", error)); endif player = oplayer; return error; endif . #6:126 "@netforward <msg>... -- as in help on @netforward"; "@netforward <msg>... on *<recipient> -- netforwards messages on recipient."; "This command forwards mail-messages to your registered email-address."; if (player != this) return player:tell(E_PERM); endif if (reason = $network:email_will_fail(email = player.email_address)) return player:notify(tostr("Cannot forward mail to your email address: ", reason)); endif set_task_perms(valid(caller_perms()) ? caller_perms() | player); if (p = player:parse_mailread_cmd("@read", args, "", "on")) player:set_current_folder(folder = p[1]); msg_seq = p[2]; folderstr = ((folder == player) ? "" | tostr(" from *", folder.name, "(", folder, ")")); if (!$command_utils:yes_or_no(tostr("You are about to forward ", seq_size = $seq_utils:size(msg_seq), " message(s)", folderstr, " to your registered email-address, ", email, ". Continue?"))) player:notify(tostr("@Netforward cancelled.")); return; endif player._mail_task = task_id(); netmail = {}; linelen = player:linelen(); maxmsg = (minmsg = 0); for msg in (folder:messages_in_seq(msg_seq)) minmsg = (minmsg ? min(msg[1], minmsg) | msg[1]); maxmsg = (maxmsg ? max(msg[1], maxmsg) | msg[1]); lines = {tostr("Message ", msg[1], folderstr, ":"), tostr("Date: ", ctime(msg[2][1])), "From: " + msg[2][2], "To: " + msg[2][3], @(length(subj = msg[2][4]) > 1) ? {"Subject: " + subj} | {}}; for line in (msg[2][5..length(msg[2])]) lines = {@lines, @$generic_editor:fill_string(line, linelen)}; $command_utils:suspend_if_needed(0); endfor netmail = {@netmail, @lines, "", "--------------------------", "", ""}; endfor reason = player:send_self_netmail({header = tostr($network.MOO_name, " Message(s) ", minmsg, @(minmsg != maxmsg) ? {" - ", maxmsg} | {}, folderstr), @netmail}); player:notify((reason == 0) ? tostr("@netforward of ", header, " completed.") | tostr("@netforward failed: ", reason, ".")); endif . #6:127 "Syntax: @@sendmail"; "This is intended for use with client editors. You probably don't want to try using this command manually."; "Reads a formatted mail message, extracts recipients, subject line and/or reply-to header and sends message without going to the mailroom. Example:"; ""; "@@send"; "To: Rog (#4292)"; "Subject: random"; ""; "first line"; "second line"; "."; ""; "Currently, header lines must have the same format as in an actual message."; set_task_perms(player); if (args) player:notify(tostr("The ", verb, " command takes no arguments.")); $command_utils:read_lines(); return; elseif (this != player) player:notify(tostr("You can't use ", this.pp, " ", verb, " verb.")); $command_utils:read_lines(); return; endif msg = $command_utils:read_lines(); end_head = (("" in msg) || (length(msg) + 1)); from = this; subject = ""; replyto = ""; rcpts = {}; body = msg[end_head + 1..length(msg)]; for i in [1..end_head - 1] line = msg[i]; if (index(line, "Subject:") == 1) subject = $string_utils:trim(line[9..length(line)]); elseif (index(line, "To:") == 1) if (!(rcpts = $mail_agent:parse_address_field(line))) player:notify("No recipients found in To: line"); return; endif elseif (index(line, "Reply-to:") == 1) if ((!(replyto = $mail_agent:parse_address_field(line))) && $string_utils:trim(line[10..length(line)])) player:notify("No address found in Reply-to: line"); return; endif elseif (index(line, "From:") == 1) "... :send_message() bombs if designated sender != player ..."; if (!(from = $mail_agent:parse_address_field(line))) player:notify("No sender found in From: line"); return; elseif (length(from) > 1) player:notify("Multiple senders?"); return; endif from = from[1]; elseif (i = index(line, ":")) player:notify(tostr("Unknown header \"", line[1..i], "\"")); return; else player:notify("Blank line must separate headers from body."); return; endif endfor if (!rcpts) player:notify("No To: line found."); elseif (!(subject || body)) player:notify("Blank message not sent."); else player:notify("Sending..."); result = $mail_agent:send_message(from, rcpts, replyto ? subject | {subject, replyto}, body); if (e = (result && result[1])) if (length(result) == 1) player:notify("Mail actually went to no one."); else player:notify(tostr("Mail actually went to ", $mail_agent:name_list(@listdelete(result, 1)), ".")); endif else player:notify(tostr((typeof(e) == ERR) ? e | ("Bogus recipients: " + $string_utils:from_list(result[2])))); player:notify("Mail not sent."); endif endif . #7:0 this:move(player); . #7:1 "Copied from generic exit (#7):move(new) by Haakon (#2) Sat Aug 14 12:54:22 1993 PDT"; "Copied from generic exit (#7):move by Haakon (#2) Sat Aug 14 12:43:38 1993 PDT"; what = args[1]; "if (what.location != this.source)"; " player:tell(\"You can't go that way.\")"; " return"; "endif"; unlocked = this:is_unlocked_for(what); if (unlocked) this.dest:bless_for_entry(what); endif if (unlocked && this.dest:acceptable(what)) start = what.location; if (msg = this:leave_msg(what)) what:tell_lines(msg); endif what:moveto(this.dest); if (what.location != start) "Don't print oleave messages if WHAT didn't actually go anywhere..."; this:announce_msg(start, what, (this:oleave_msg(what) || this:defaulting_oleave_msg(what)) || "has left."); endif if (what.location == this.dest) "Don't print arrive messages if WHAT didn't really end up there..."; if (msg = this:arrive_msg(what)) what:tell_lines(msg); endif this:announce_msg(what.location, what, this:oarrive_msg(what) || "has arrived."); endif else if (msg = this:nogo_msg(what)) what:tell_lines(msg); else what:tell("You can't go that way."); endif if (msg = this:onogo_msg(what)) this:announce_msg(what.location, what, msg); endif endif . #7:2 if ((caller == this) || $perm_utils:controls(caller_perms(), this)) "... relies on -d..."; this.source:remove_exit(this); this.dest:remove_entrance(this); return pass(@args); else return E_PERM; endif . #7:3 msg = this.(verb); return msg ? $string_utils:pronoun_sub(msg, @args) | ""; . #7:4 if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp))) return (typeof(e = (this.name = args[1])) != ERR) || e; else return E_PERM; endif . #7:5 if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp))) if (typeof(e = (this.aliases = args[1])) == ERR) return e; else return 1; endif else return E_PERM; endif . #7:6 "This is intended to be called only by exits, for announcing various oxxx messages. First argument is room to announce in. Second argument is as in $room:announce_all_but's first arg, who not to announce to. Rest args are what to say. If the final arg is a list, prepends all the other rest args to the first line and emits the lines separately."; where = args[1]; whobut = args[2]; nargs = length(args); last = args[nargs]; if (typeof(last) == LIST) where:announce_all_but(whobut, @args[3..nargs - 1], last[1]); for line in (last[2..length(last)]) where:announce_all_but(whobut, line); endfor else where:announce_all_but(@args[3..nargs]); endif . #7:7 for k in ({this.name, @this.aliases}) if (k in {"east", "west", "south", "north", "northeast", "southeast", "southwest", "northwest", "out", "up", "down", "nw", "sw", "ne", "se", "in"}) return ("goes " + k) + "."; elseif (k in {"leave", "out", "exit"}) return "leaves"; endif endfor if ((index(this.name, "an ") == 1) || (index(this.name, "a ") == 1)) return ("leaves for " + this.name) + "."; else return ("leaves for the " + this.name) + "."; endif . #7:8 if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this)) return pass(@args); else return E_PERM; endif . #7:9 "examine_key(examiner)"; "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to."; "the default will only tell the key to a wizard or this object's owner."; who = args[1]; if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0)) return {tostr(this:title(), " will only transport objects matching this key:"), tostr(" ", $lock_utils:unparse_key(this.key))}; endif . #7:10 ":announce_msg(place, what, msg)"; " announce msg in place (except to what). Prepend with what:title if it isn't part of the string"; msg = args[3]; what = args[2]; title = what:titlec(); if (index(msg, title) != 1) msg = tostr(title, " ", msg); endif args[1]:announce_all_but({what}, msg); . #8:0 if ((this.location != player) && (this.location != player.location)) player:tell("You can't get at ", this.name, "."); elseif (dobj == $nothing) player:tell("What do you want to put ", prepstr, " ", this.name, "?"); elseif ($command_utils:object_match_failed(dobj, dobjstr)) elseif (!this.opened) player:tell(this.name, " is closed."); else dobj:moveto(this); if (dobj.location == this) player:tell(this:put_msg()); if (msg = this:oput_msg()) player.location:announce(player.name, " ", msg); endif else player:tell(this:put_fail_msg()); if (msg = this:oput_fail_msg()) player.location:announce(player.name, " ", msg); endif endif endif . #8:1 if (!this.opened) player:tell(this.name, " is not open."); elseif (this.dark) player:tell("You can't see into ", this.name, " to remove anything."); elseif ((dobj = this:match_object(dobjstr)) == $nothing) player:tell("What do you want to take from ", this.name, "?"); elseif ($command_utils:object_match_failed(dobj, dobjstr)) elseif (!(dobj in this:contents())) player:tell(dobj.name, " isn't in ", this.name, "."); else dobj:moveto(player); if (dobj.location == player) player:tell(this:remove_msg()); if (msg = this:oremove_msg()) player.location:announce(player.name, " ", msg); endif else dobj:moveto(this.location); if (dobj.location == this.location) player:tell(this:remove_msg()); if (msg = this:oremove_msg()) player.location:announce(player.name, " ", msg); endif player:tell("You can't pick up ", dobj.name, ", so it tumbles onto the floor."); else player:tell(this:remove_fail_msg()); if (msg = this:oremove_fail_msg()) player.location:announce(player.name, " ", msg); endif endif endif endif . #8:2 pass(); if (!this.dark) this:tell_contents(); endif . #8:3 return !is_player(args[1]); . #8:4 if (this.opened) player:tell("It's already open."); "elseif (this:is_openable_by(player))"; elseif (this:is_openable_by(callers() ? caller_perms() | player)) this:set_opened(1); player:tell(this:open_msg()); if (msg = this:oopen_msg()) player.location:announce(player.name, " ", msg); endif else player:tell(this:open_fail_msg()); if (msg = this:oopen_fail_msg()) player.location:announce(player.name, " ", msg); endif endif . #8:5 set_task_perms(player); key = $lock_utils:parse_keyexp(iobjstr, player); if (typeof(key) == STR) player:tell("That key expression is malformed:"); player:tell(" ", key); else res = (this.open_key = key); if (typeof(res) == ERR) player:tell(res, "."); else player:tell("Locked opening of ", this.name, " with this key:"); player:tell(" ", $lock_utils:unparse_key(key)); endif endif . #8:6 return (this.open_key == 0) || $lock_utils:eval_key(this.open_key, args[1]); . #8:7 if (!this.opened) player:tell("It's already closed."); else this:set_opened(0); player:tell(this:close_msg()); if (msg = this:oclose_msg()) player.location:announce(player.name, " ", msg); endif endif . #8:8 set_task_perms(player); res = (dobj.open_key = 0); if (typeof(res) == ERR) player:tell(res, "."); else player:tell("Unlocked ", dobj.name, " for opening."); endif . #8:9 if (this.contents) player:tell("Contents:"); for thing in (this.contents) player:tell(" ", thing:title()); endfor elseif (msg = this:empty_msg()) player:tell(msg); endif . #8:10 if (!$perm_utils:controls(caller.owner, this)) return E_PERM; else this.opened = (opened = (!(!args[1]))); this.dark = (this.opaque > opened); return opened; endif . #8:11 if (!$perm_utils:controls(player, this)) player:tell("Can't set opacity of something you don't own."); elseif ((iobjstr != "0") && (!tonum(iobjstr))) player:tell("Opacity must be an integer (0, 1, 2)."); else player:tell("Opacity changed: Now " + {"transparent.", "opaque.", "a black hole."}[1 + this:set_opaque(tonum(iobjstr))]); endif . #8:12 if (!$perm_utils:controls(caller.owner, this)) return E_PERM; elseif (typeof(number = args[1]) != NUM) return E_INVARG; else number = ((number < 0) ? 0 | ((number > 2) ? 2 | number)); this.dark = (number > this.opened); return this.opaque = number; endif . #8:13 return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | ""; . #9:0 if (!this:is_readable_by(valid(caller_perms()) ? caller_perms() | player)) player:tell("Sorry, but it seems to be written in some code that you can't read."); else this:look_self(); player:tell(); for line in (this:text()) player:tell(line); endfor player:tell(); player:tell("(You finish reading.)"); endif . #9:1 if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player)) this:set_text({}); player:tell("Note erased."); else player:tell("You can't erase this note."); endif . #9:2 if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player)) this:set_text({@this.text, dobjstr}); player:tell("Line added to note."); else player:tell("You can't write on this note."); endif . #9:3 if (!this:is_writable_by(player)) player:tell("You can't modify this note."); elseif (!dobjstr) player:tell("You must tell me which line to delete."); else line = tonum(dobjstr); if (line < 0) line = ((line + length(this.text)) + 1); endif if ((line <= 0) || (line > length(this.text))) player:tell("Line out of range."); else this:set_text(listdelete(this.text, line)); player:tell("Line deleted."); endif endif . #9:4 set_task_perms(player); key = $lock_utils:parse_keyexp(iobjstr, player); if (typeof(key) == STR) player:tell("That key expression is malformed:"); player:tell(" ", key); else res = (this.encryption_key = key); if (typeof(res) == ERR) player:tell(res, "."); else player:tell("Encrypted ", this.name, " with this key:"); player:tell(" ", $lock_utils:unparse_key(key)); endif endif . #9:5 set_task_perms(player); res = (dobj.encryption_key = 0); if (typeof(res) == ERR) player:tell(res, "."); else player:tell("Decrypted ", dobj.name, "."); endif . #9:6 cp = caller_perms(); if ($perm_utils:controls(cp, this) || this:is_readable_by(cp)) return this.text; else return E_PERM; endif . #9:7 key = this.encryption_key; return (!key) || $lock_utils:eval_key(key, args[1]); . #9:8 cp = caller_perms(); newtext = args[1]; if ($perm_utils:controls(cp, this) || this:is_writable_by(cp)) if (typeof(newtext) == LIST) this.text = newtext; else return E_TYPE; endif else return E_PERM; endif . #9:9 who = args[1]; wr = this.writers; if ($perm_utils:controls(who, this)) return 1; elseif (typeof(wr) == LIST) return who in wr; else return wr; endif . #9:10 "Usage: mailme <note>"; " uses $network to sends the text of this note to your REAL internet email address."; if (!this:is_readable_by(player)) player:tell("Sorry, but it seems to be written in some code that you can't read."); elseif (!player.email_address) player:tell("Sorry, you don't have a registered email address."); return; elseif (!$network.active) player:tell("Sorry, internet mail is disabled."); elseif (!(text = this:text())) player:tell($string_utils:pronoun_sub("%T is empty--there wouldn't be any point to mailing it.")); return; endif player:tell("Mailing ", this:title(), " to ", player.email_address, "."); player:tell("... ", length(text), " lines ..."); suspend(0); $network:sendmail(player.email_address, this:titlec(), @text); . #10:0 raw = ctime(this.last_write_time); " 111111111122222"; "123456789012345678901234"; "Fri Nov 30 14:31:21 1990"; date = ((raw[1..10] + ",") + raw[20..24]); return strsub(this.description, "%d", date); . #10:1 pass(@args); pos = (player in this.readers); if (pos) this.readtimes[pos] = time(); elseif (!$object_utils:isa(player, $guest)) this.readers = {@this.readers, player}; this.readtimes = {@this.readtimes, time()}; endif . #10:2 who = caller; pos = (who in this.readers); if (pos) if (this.readtimes[pos] < this.last_write_time) this:announce_new_edition(who); endif else who:notify("Don't forget to take a look at the newspaper. Type 'news' to see it."); endif . #10:3 if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this)) this.last_write_time = time(); for p in (connected_players()) this:announce_new_edition(p); endfor if (callers() == {}) player:notify("The newspaper has been marked as newly-edited."); endif else player:notify("Permission denied."); endif . #10:4 if (caller_perms().wizard) pass(); this:set_text({"There's no news unless you write it."}); this.description = "It's the latest issue of the MOO Herald-Examiner, dated %d."; this.take_failed_msg = "Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up."; this.readtimes = (this.readers = (this.writers = {})); else return E_PERM; endif . #10:5 if (caller == this) args[1]:notify("There's a new edition of the newspaper. Type 'news' to see it."); endif . #10:6 if (!$perm_utils:controls(player, this)) player:tell("Sorry, you can't hack on the newspaper."); else original = length(this.readers); newplayers = {}; newtimes = {}; index = 0; for p in (this.readers) index = (index + 1); if (valid(p) && is_player(p)) newplayers = {@newplayers, p}; newtimes = {@newtimes, this.readtimes[index]}; endif $command_utils:suspend_if_needed(0); endfor this.readers = newplayers; this.readtimes = newtimes; player:tell("Done. Removed ", original - length(this.readtimes), " bogus readers."); endif . #10:7 if (this:is_writable_by(caller_perms())) this.last_write_time = time(); return pass(@args); else return E_PERM; endif . #11:0 junk = {}; while (1) for x in (junk) $command_utils:suspend_if_needed(0); if (x in this.contents) "This is old junk that's still around five minutes later. Clean it up."; if (!valid(x.owner)) move(x, $nothing); #2:tell(">**> Cleaned up orphan object `", x.name, "' (", x, "), owned by ", x.owner, ", to #-1."); elseif (!$object_utils:contains(x, x.owner)) move(x, x.owner); x.owner:tell("You shouldn't leave junk in ", this.name, "; ", x.name, " (", x, ") has been moved to your inventory."); #2:tell(">**> Cleaned up `", x.name, "' (", x, "), owned by `", x.owner.name, "' (", x.owner, "), to ", x.owner, "."); endif endif endfor junk = {}; for x in (this.contents) if ((seconds_left() < 2) || (ticks_left() < 1000)) suspend(0); endif if (!is_player(x)) junk = {@junk, x}; endif endfor suspend(5 * 60); endwhile . #11:1 who = args[1]; if (who.home == this) move(who, $limbo); this:announce("You hear a quiet popping sound; ", who.name, " has disconnected."); else pass(who); endif . #11:2 who = args[1]; if ($limbo:acceptable(who)) move(who, $limbo); else pass(who); endif . #11:3 m = pass(@args); if (m == $failed_match) "... it might be a player off in the body bag..."; m = $string_utils:match_player(args[1]); if (valid(m) && (!(m.location in {this, this.body_bag}))) return $failed_match; endif endif return m; . #11:4 if (!caller_perms().wizard) return E_PERM; endif for v in ({"turn", "open"}) delete_verb($player_start, v); endfor for p in ({"out"}) delete_property($player_start, p); endfor for p in ($object_utils:all_properties($room)) clear_property($player_start, p); endfor $player_start.name = "The First Room"; $player_start.aliases = {}; $player_start.description = "This is all there is right now."; $player_start.exits = ($player_start.entrances = {}); . #12:0 if (caller != #0) return E_PERM; else clist = {}; for i in [0..length(verbs(this)) - 1] if ((verb_args(this, tostr(i)) == {"any", "none", "any"}) && index((info = verb_info(this, tostr(i)))[2], "x")) vname = $string_utils:explode(info[3])[1]; star = index(vname + "*", "*"); clist = {@clist, $string_utils:uppercase(vname[1..star - 1]) + strsub(vname[star..length(vname)], "*", "")}; endif endfor notify(player, "I don't understand that. Valid commands at this point are"); notify(player, " " + $string_utils:english_list(setremove(clist, "?"), "", " or ")); return 0; endif . #12:1 if (caller != #0) return E_PERM; else msg = this.welcome_message; version = server_version(); for line in ((typeof(msg) == LIST) ? msg | {msg}) if (typeof(line) == STR) notify(player, strsub(line, "%v", version)); endif endfor this:check_player_db(); this:check_for_shutdown(); return 0; endif . #12:2 masked = ($login.who_masks_wizards ? $wiz_utils:connected_wizards() | {}); if (caller != #0) return E_PERM; elseif (!args) $code_utils:show_who_listing($set_utils:difference(connected_players(), masked)) || this:notify("No one logged in."); else plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1); $code_utils:show_who_listing(plyrs, $set_utils:intersection(plyrs, masked)); endif return 0; . #12:3 you_lose_msg = "Either that player does not exist, or has a different password."; if (caller != #0) return E_PERM; "...caller isn't :do_login_command..."; elseif (!(length(args) in {1, 2})) notify(player, tostr("Usage: ", verb, " <existing-player-name> <password>")); elseif (!valid(candidate = (orig_candidate = this:_match_player(name = strsub(args[1], " ", "_"))))) notify(player, you_lose_msg); "...unknown player..."; elseif ((typeof(candidate.password) == STR) && ((length(candidate.password) < 2) || (crypt({@args, ""}[2], candidate.password[1..2]) != candidate.password))) notify(player, you_lose_msg); "...bad password..."; server_log(tostr("FAILED CONNECT: ", args[1], " (", candidate, ") on ", connection_name(player), ($string_utils:connection_hostname(connection_name(player)) in candidate.all_connect_places) ? "" | "******")); elseif ((parent(candidate) == $guest) && (!valid(candidate = candidate:defer()))) notify(player, (candidate == #-2) ? "Sorry, guest characters are not allowed from your site." | "Sorry, all of our guest characters are in use right now."); else if (candidate != orig_candidate) notify(player, tostr("Okay,... ", name, " is in use. Logging you in as `", candidate.name, "'")); endif this:record_connection(candidate); return candidate; endif return 0; . #12:4 if (caller != #0) return E_PERM; "... caller isn't :do_login_command()..."; elseif (!this:player_creation_enabled(player)) notify(player, this:registration_string()); "... we've disabled player creation ..."; elseif (length(args) != 2) notify(player, tostr("Usage: ", verb, " <new-player-name> <new-password>")); elseif ($player_db.frozen) notify(player, "Sorry, can't create any new players right now. Try again in a few minutes."); elseif ((!(name = args[1])) || (name == "<>")) notify(player, "You can't have a blank name!"); if (name) notify(player, "Also, don't use angle brackets (<>)."); endif elseif ((name[1] == "<") && (name[length(name)] == ">")) notify(player, "Try that again but without the angle brackets, e.g.,"); notify(player, tostr(" ", verb, " ", name[2..length(name) - 1], " ", strsub(strsub(args[2], "<", ""), ">", ""))); notify(player, "This goes for other commands as well."); elseif (index(name, " ")) notify(player, "Sorry, no spaces are allowed in player names. Use dashes or underscores."); "... lots of routines depend on there not being spaces in player names..."; elseif ((!$player_db:available(name)) || (this:_match_player(name) != $failed_match)) notify(player, "Sorry, that name is not available. Please choose another."); "... note the :_match_player call is not strictly necessary..."; "... it is merely there to handle the case that $player_db gets corrupted."; elseif (!(password = args[2])) notify(player, "You must set a password for your player."); else new = create($player_class, $nothing); set_player_flag(new, 1); new.name = name; new.aliases = {name}; new.programmer = $player_class.programmer; new.password = crypt(password); new.last_connect_time = $maxint; "Last disconnect time is creation time, until they login."; new.last_disconnect_time = time(); "make sure the owership quota isn't clear!"; new.ownership_quota = new.ownership_quota; this:record_connection(new); move(new, $player_start); $player_db:insert(name, new); return new; endif return 0; . #12:5 if (caller != #0) return E_PERM; else boot_player(player); return 0; endif . #12:6 if (caller != #0) return E_PERM; else notify(player, tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), ".")); return 0; endif . #12:7 if (caller != #0) return E_PERM; else notify(player, tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code.")); return 0; endif . #12:8 ":parse_command(@args) => {verb, args}"; "Given the args from #0:do_login_command,"; " returns the actual $login verb to call and the args to use."; "Commands available to not-logged-in users should be located on this object and given the verb_args \"any none any\""; if (caller != #0) return E_PERM; endif if (!args) return {this.blank_command, @args}; elseif ((verb = args[1]) && ((verb_args(this, verb) == {"any", "none", "any"}) && index(verb_info(this, verb)[2], "x"))) return args; else return {this.bogus_command, @args}; endif . #12:9 when = ($shutdown_time - time()); if (when >= 0) line = "***************************************************************************"; notify(player, ""); notify(player, ""); notify(player, line); notify(player, line); notify(player, "****"); notify(player, ("**** WARNING: The server will shut down in " + $time_utils:english_time(when - (when % 60))) + "."); for piece in ($generic_editor:fill_string($shutdown_message, 60)) notify(player, "**** " + piece); endfor notify(player, "****"); notify(player, line); notify(player, line); notify(player, ""); notify(player, ""); endif . #12:10 if ($player_db.frozen) line = "***************************************************************************"; notify(player, ""); notify(player, line); notify(player, "***"); for piece in ($generic_editor:fill_string("The character-name matcher is currently being reloaded. This means your character name might not be recognized even though it still exists. Don't panic. You can either wait for the reload to finish or you can connect using your object number if you remember it (e.g., `connect #1234 yourpassword').", 65)) notify(player, "*** " + piece); endfor if (this:player_creation_enabled(player)) notify(player, "*** This also means that character creation is disabled."); endif notify(player, "***"); notify(player, line); notify(player, ""); endif . #12:11 ":_match_player(name)"; "This is the matching routine used by @connect."; "returns either a valid player corresponding to name or $failed_match."; name = args[1]; if (valid(candidate = $string_utils:literal_object(name)) && is_player(candidate)) return candidate; endif ".....uncomment this to trust $player_db and have `connect' recognize aliases"; if (valid(candidate = $player_db:find_exact(name)) && is_player(candidate)) return candidate; endif ".....uncomment this if $player_db gets hosed and you want by-name login"; ". for candidate in (players())"; ". if (candidate.name == name)"; ". return candidate; "; ". endif "; ". endfor "; "....."; return $failed_match; . #12:12 set_task_perms(caller_perms()); notify(player, args[1]); . #12:13 "keeps bad things from happening if someone brings this object into a room and talks to it."; return 0; . #12:14 "Accepts a player object. If player creation is enabled for that player object, then return true. Otherwise, return false."; "Default implementation checks the player's connecting host via $login:blacklisted to decide."; if (caller_perms().wizard) return this.create_enabled && (!this:blacklisted($string_utils:connection_hostname(connection_name(args[1])))); else return E_PERM; endif . #12:15 return $string_utils:subst(this.(verb), {{"%e", this.registration_address}, {"%%", "%"}}); . #12:16 if (caller_perms().wizard) pass(); this.max_connections = 999999; this.unlimited_hosts = {"localhost"}; this.bogus_command = "?"; this.blank_command = "help"; this.create_enabled = 1; this.registration_address = ""; this.registration_string = "Character creation is disabled."; this.newt_registration_string = "Your character is temporarily hosed."; this.welcome_message = {"Welcome to the LambdaCore database.", "", "Type 'connect wizard' to log in.", "", "You will probably want to change this text, which is stored in $login.welcome_message."}; this.redlist = (this.blacklist = (this.graylist = (this.spooflist = {{}, {}}))); this.who_masks_wizards = 0; if ("monitor" in properties(this)) delete_property(this, "monitor"); endif if ("monitor" in verbs(this)) delete_verb(this, "monitor"); endif if ("special_action" in verbs(this)) set_verb_code(this, "special_action", {}); endif endif . #12:17 . #12:18 ":blacklisted(hostname) => is hostname on the .blacklist"; ":graylisted(hostname) => is hostname on the .graylist"; ":redlisted(hostname) => is hostname on the .redlist"; sitelist = this.(this:listname(verb)); if (!caller_perms().wizard) return E_PERM; elseif (((hostname = args[1]) in sitelist[1]) || (hostname in sitelist[2])) return 1; elseif ($site_db:domain_literal(hostname)) for lit in (sitelist[1]) if ((index(hostname, lit) == 1) && ((hostname + ".")[length(lit) + 1] == ".")) return 1; endif endfor else for dom in (sitelist[2]) if (index(dom, "*")) "...we have a wildcard; let :match_string deal with it..."; if ($string_utils:match_string(hostname, dom)) return 1; endif else "...tail of hostname ..."; if ((r = rindex(hostname, dom)) && ((("." + hostname)[r] == ".") && (((r - 1) + length(dom)) == length(hostname)))) return 1; endif endif endfor endif return 0; . #12:19 if (!caller_perms().wizard) return E_PERM; endif where = args[1]; lname = this:listname(verb); which = (1 + (!$site_db:domain_literal(where))); this.(lname)[which] = setadd(this.(lname)[which], where); return 1; . #12:20 if (!caller_perms().wizard) return E_PERM; endif where = args[1]; lname = this:listname(verb); which = (1 + (!$site_db:domain_literal(where))); if (where in this.(lname)[which]) this.(lname)[which] = setremove(this.(lname)[which], where); return 1; else return E_INVARG; endif . #12:21 return {"???", "blacklist", "graylist", "redlist", "spooflist"}[1 + index("bgrs", (args[1] || "?")[1])]; . #12:22 ":record_connection(plyr) update plyr's connection information"; "to reflect impending login."; if (!caller_perms().wizard) return E_PERM; else plyr = args[1]; plyr.first_connect_time = min(time(), plyr.first_connect_time); plyr.previous_connection = {plyr.last_connect_time, $string_utils:connection_hostname(plyr.last_connect_place)}; plyr.last_connect_time = time(); plyr.last_connect_place = (cn = connection_name(player)); chost = $string_utils:connection_hostname(cn); acp = setremove(plyr.all_connect_places, chost); plyr.all_connect_places = {chost, @acp[1..min(length(acp), 15)]}; if (parent(plyr) != $guest) $site_db:add(plyr, chost); endif endif . #12:23 if (caller != #0) return E_PERM; elseif (!args) $code_utils:show_who_listing(connected_players()) || this:notify("No one logged in."); else plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1); $code_utils:show_who_listing(plyrs); endif return 0; . #13:0 "{last_huh} @<msg_name> <object> is [<text>]"; "If <text> is given calls <object>:set_message(<msg_name>,<text>),"; "otherwise prints the value of the specified message property"; set_task_perms(caller_perms()); nargs = length(args); pos = ("is" in args); if (pos == 1) player:notify(tostr("Usage: ", verb, " <object> is <message>")); return; endif dobjstr = $string_utils:from_list(args[1..pos - 1], " "); message = $string_utils:from_list(args[pos + 1..nargs], " "); msg_name = verb[2..length(verb)]; dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) "... oh well ..."; elseif (pos == nargs) if (E_PROPNF == (get = dobj.(msg_name + "_msg"))) player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message.")); elseif (typeof(get) == ERR) player:notify(tostr(get)); elseif (!get) player:notify("Message is not set."); else player:notify(tostr("The \"", msg_name, "\" message of ", dobj.name, " (", dobj, "):")); player:notify(tostr(get)); endif else set = dobj:set_message(msg_name, message); if (set) if (typeof(set) == STR) player:notify(set); else player:notify(tostr("You set the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ").")); endif elseif (set == E_PROPNF) player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message to set.")); elseif (typeof(set) == ERR) player:notify(tostr(set)); else player:notify(tostr("You clear the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ").")); endif endif . #13:1 "{last_huh} give any to any"; "a give \"verb\" that works for non-$things."; set_task_perms(caller_perms()); if (((verb == "give") && (dobjstr == "up")) && (!prepstr)) player:tell("Try this instead: @quit"); elseif (dobj == $nothing) player:tell("What do you want to give?"); elseif (iobj == $nothing) player:tell("To whom/what do you want to give it?"); elseif ($command_utils:object_match_failed(dobj, dobjstr) || $command_utils:object_match_failed(iobj, iobjstr)) "...lose..."; elseif (dobj.location != player) player:tell("You don't have that!"); elseif (iobj.location != player.location) player:tell("I don't see ", iobj.name, " here."); else dobj:moveto(iobj); if (dobj.location == iobj) player:tell("You give ", dobj:title(), " to ", iobj.name, "."); iobj:tell(player.name, " gives you ", dobj:title(), "."); else player:tell("Either that doesn't want to be given away or ", iobj.name, " doesn't want it."); endif endif . #13:2 "{last_huh} get/take any"; "a take \"verb\" that works for non-$things."; set_task_perms(caller_perms()); if (dobj == $nothing) player:tell(verb, " what?"); elseif ($command_utils:object_match_failed(dobj, dobjstr)) "...lose..."; elseif (dobj.location == player) player:tell("You already have that!"); elseif (dobj.location != player.location) player:tell("I don't see that here."); else dobj:moveto(player); if (dobj.location == player) player:tell("Taken."); player.location:announce(player.name, " takes ", dobj.name, "."); else player:tell("You can't pick that up."); endif endif . #13:3 "{last_huh} drop/throw any"; "a drop \"verb\" that works for non-$things."; set_task_perms(caller_perms()); if (dobj == $nothing) player:tell(verb, " what?"); elseif ($command_utils:object_match_failed(dobj, dobjstr)) "...lose..."; elseif (dobj.location != player) player:tell("You don't have that."); elseif (!player.location:acceptable(dobj)) player:tell("You can't drop that here."); else dobj:moveto(player.location); if (dobj.location == player.location) player:tell_lines((verb[1] == "d") ? "Dropped." | "Thrown."); player.location:announce(player.name, (verb[1] == "d") ? " dropped " | " threw away ", dobj.name, "."); else player:tell_lines("You can't seem to drop that here."); endif endif . #14:0 ":enter(who,islogin,time,site)"; "adds an entry to the connection log for a given guest (caller)."; if ($object_utils:isa(caller, $guest)) $guest_log.connections = {{caller, @args}, @$guest_log.connections[1..min(99, length($guest_log.connections))]}; else return E_PERM; endif . #14:1 set_task_perms(caller_perms()); howmany = min({@args, 0}[1] || $maxint, length($guest_log.connections)); if (!caller_perms().wizard) player:notify("Sorry."); else current = {}; listing = {}; last = 0; for c in ($guest_log.connections[1..howmany]) if (c[2]) "...login..."; if (a = $list_utils:assoc(c[1], current)) listing[a[2]][3] = c[3]; current = setremove(current, a); else listing = {@listing, {c[1], c[4], c[3], -idle_seconds(c[1])}}; last = (last + 1); endif else "...logout..."; listing = {@listing, {c[1], c[4], 0, c[3]}}; last = (last + 1); if (i = $list_utils:iassoc(c[1], current)) current[i][2] = last; else current = {@current, {c[1], last}}; endif endif endfor su = $string_utils; player:notify(su:left(su:left(su:left("Guest", 20) + "Connected", 36) + "Idle/Disconn.", 52) + "From"); player:notify(su:left(su:left(su:left("-----", 20) + "---------", 36) + "-------------", 52) + "----"); for l in (listing) on = (l[3] ? (ct = ctime(l[3]))[1..3] + ct[9..19] | "earlier"); off = ((l[4] > 0) ? (ct = ctime(l[4]))[1..3] + ct[9..19] | (" " + $string_utils:from_seconds(-l[4]))); player:notify(su:left(su:left(su:right(tostr(strsub(l[1].name, "uest", "."), " (", l[1], ") "), 20) + on, 36) + off, 52) + l[2]); endfor endif . #14:2 if (caller_perms().wizard) pass(@args); this.connections = {}; endif . #15:0 ":length(tree) => number of leaves in tree."; return args[1] ? args[1][2] | 0; . #15:1 ":find_nth(tree,n) => nth leaf of tree. Assumes n in [1..tree[2]]"; return this:_find_nth(caller, @args); . #15:2 ":_find_ord(tree,n,comp) "; " => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false."; "returns 0 if true for all leaves."; return args[1] ? this:_find_ord(caller, @args) | 0; . #15:3 ":set_nth(tree,n,value) => tree"; "modifies tree so that nth leaf == value"; if (((n = args[2]) < 1) || ((!(tree = args[1])) || (tree[2] < n))) return E_RANGE; else this:_set_nth(caller, @args); return (n != 1) ? tree | listset(tree, caller:_ord(args[3]), 3); endif . #15:4 ":kill(tree[,leafverb]) deletes tree and _kills all of the nodes that it uses."; "if leafverb is given, caller:leafverb is called on all leaves in tree."; if (tree = args[1]) lverb = {@args, ""}[2]; this:_skill(caller, (typeof(tree) == LIST) ? tree[1] | tree, lverb); endif "... otherwise nothing to do..."; . #15:5 ":insert_after(tree,subtree,n)"; ":insert_before(tree,subtree,n)"; " inserts subtree after (before) the nth leaf of tree,"; " returning the resulting tree."; subtree = args[2]; if (tree = args[1]) if (subtree) where = (args[3] - (verb == "insert_before")); if (where <= 0) return this:_merge(caller, subtree, tree); elseif (where >= tree[2]) return this:_merge(caller, tree, subtree); else s = this:_split(caller, caller:_get(tree[1])[1], where, tree); return this:_merge(caller, this:_merge(caller, s[1], subtree), s[2]); endif else return tree; endif else return subtree; endif . #15:6 ":extract_range(tree,first,last) => {newtree,extraction}"; return this:_extract(caller, @args); . #15:7 ":delete_range(tree,first,last[,leafkill]) => newtree"; extract = this:_extract(caller, @args); if (die = extract[2]) this:_skill(caller, die[1], {@args, ""}[4]); endif return extract[1]; . #15:8 ":keep_range(tree,first,last[,leafkill]) => range"; extract = this:_extract(caller, @args); if (die = extract[1]) this:_skill(caller, die[1], {@args, ""}[4]); endif return extract[2]; . #15:9 ":insert_last(tree,insert) => newtree"; "insert a new leaf to be inserted at the righthand end of the tree"; tree = args[1]; insert = args[2]; if (!tree) return {caller:_make(0, {insert}), 1, caller:_ord(insert)}; endif hgt = caller:_get(tree[1]); rspine = {{tree, plen = length(kids = hgt[2])}}; for i in [1..hgt[1]] parent = kids[plen]; kids = caller:_get(parent[1])[2]; plen = length(kids); rspine = {{parent, plen}, @rspine}; endfor iord = caller:_ord(insert); for h in [1..length(rspine)] "... tree is the plen'th (rightmost) child of parent..."; if (rspine[h][2] < this.maxfanout) parent = rspine[h][1]; hgp = caller:_get(parent[1]); caller:_put(parent[1], @listset(hgp, {@hgp[2], insert}, 2)); for p in (rspine[h + 1..length(rspine)]) rkid = listset(parent, parent[2] + 1, 2); parent = p[1]; hgp = caller:_get(parent[1]); caller:_put(parent[1], @listset(hgp, listset(hgp[2], rkid, p[2]), 2)); endfor return listset(tree, tree[2] + 1, 2); endif insert = {caller:_make(h - 1, {insert}), 1, iord}; endfor return {caller:_make(length(rspine), {tree, insert}), tree[2] + 1, tree[3]}; . #15:10 ":start(tree,first,last) => {list of leaf nodes, @handle}"; "handle is of the form {{node,next,size}...}"; if (tree = args[1]) before = max(0, args[2] - 1); howmany = (min(args[3], tree[2]) - before); if (howmany <= 0) return {}; else spine = {}; for h in [1..caller:_get(tree[1])[1]] ik = this:_listfind_nth(kids = caller:_get(tree[1])[2], before); newh = (kids[ik[1]][2] - ik[2]); if (newh < howmany) spine = {{tree[1], ik[1] + 1, howmany - newh}, @spine}; howmany = newh; endif tree = kids[ik[1]]; before = ik[2]; endfor return {caller:_get(tree[1])[2][before + 1..before + howmany], @spine}; endif else return {}; endif . #15:11 ":next(@handle) => {list of more leaf nodes, @newhandle}"; if (args) spine = listdelete(args, 1); node = args[1][1]; n = args[1][2]; size = args[1][3]; for h in [1..caller:_get(node)[1]] nnode = caller:_get(node)[2][n]; if (size > nnode[2]) spine = {{node, n + 1, size - nnode[2]}, @spine}; size = nnode[2]; endif n = 1; node = nnode[1]; endfor return {caller:_get(node)[2][n..size], @spine}; else return {}; endif . #15:12 ":_find_nth(home,tree,n) => nth leaf of tree."; "...Assumes n in [1..tree[2]]"; if (caller != this) return E_PERM; endif home = args[1]; tree = args[2]; n = args[3]; if ((p = home:_get(tree[1]))[1]) for k in (p[2]) if (n > k[2]) n = (n - k[2]); else return this:_find_nth(home, k, n); endif endfor return E_RANGE; else return p[2][n]; endif . #15:13 ":_find_ord(home,tree,n,comp) "; " => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false."; "returns 0 if true for all leaves."; if (caller != this) return E_PERM; endif home = args[1]; tree = args[2]; n = args[3]; comp = args[4]; if ((p = home:_get(tree[1]))[1]) sz = tree[2]; for i in [-length(p[2])..-1] k = p[2][-i]; sz = (sz - k[2]); if (!home:(comp)(n, k[3])) return sz + this:_find_ord(home, k, n, comp); endif endfor return 0; else for i in [1..r = length(p[2])] if (home:(comp)(n, home:_ord(p[2][i]))) return i - 1; endif endfor return r; endif . #15:14 ":_set_nth(home,tree,n,value) => tree[n] = value"; "Assumes n in [1..tree[2]]"; if (caller != this) return E_PERM; endif home = args[1]; tree = args[2]; n = args[3]; value = args[4]; if ((p = home:_get(tree[1]))[1]) ik = this:_listfind_nth(p[2], n - 1); this:_set_nth(home, p[2][ik[1]], ik[2] + 1, value); if (!ik[2]) p[2][ik[1]][3] = home:_ord(value); home:_put(tree[1], @p); endif else p[2][n] = value; home:_put(tree[1], @p); endif . #15:15 ":_skill(home,node,leafverb)"; "home:_kill's node and all descendants, home:(leafverb)'s all leaves"; if (caller != this) return E_PERM; endif home = args[1]; hgn = (home:_get(node = args[2]) || {0, {}}); lverb = args[3]; if (hgn[1]) for kid in (hgn[2]) this:_skill(home, kid[1], lverb); endfor elseif (lverb) for kid in (hgn[2]) home:(lverb)(kid); endfor endif home:_kill(node); . #15:16 ":_extract(home,tree,first,last) => {newtree,extraction}"; if (caller != this) return E_PERM; endif home = args[1]; if (!(tree = args[2])) return {{}, {}}; endif before = max(0, args[3] - 1); end = min(tree[2], args[4]); if ((end <= 0) || (before >= end)) return {tree, {}}; endif height = home:_get(tree[1])[1]; if (end < tree[2]) r = this:_split(home, height, end, tree); if (before) l = this:_split(home, height, before, r[1]); extract = l[2]; newtree = this:_merge(home, l[1], r[2]); else extract = r[1]; newtree = r[2]; endif elseif (before) l = this:_split(home, height, before, tree); extract = l[2]; newtree = l[1]; else return {{}, tree}; endif return {this:_scrunch(home, newtree), this:_scrunch(home, extract)}; . #15:17 "_merge(home,ltree,rtree) => newtree"; "assumes ltree and rtree to be nonempty."; if (caller != this) return E_PERM; endif home = args[1]; lnode = args[2]; rnode = args[3]; lh = home:_get(lnode[1])[1]; rh = home:_get(rnode[1])[1]; if (lh > rh) return this:_rmerge(home, lnode, rnode); endif for h in [lh + 1..rh] lnode[1] = home:_make(h, {lnode}); endfor m = this:_smerge(home, rh, lnode, rnode); return (length(m) <= 1) ? m[1] | {home:_make(rh + 1, m), m[1][2] + m[2][2], m[1][3]}; . #15:18 "_smerge(home, height, ltree, rtree) =>{ltree[,rtree]}"; "assumes ltree and rtree are at the given height."; "merges the trees if the combined number of children is <= maxfanout"; "otherwise returns two trees where ltree is guaranteed minfanout children and rtree is guaranteed the minimum of minfanout and however many children it started with."; if (caller != this) return E_PERM; endif home = args[1]; height = args[2]; ltree = args[3]; rtree = args[4]; llen = length(lkids = home:_get(ltree[1])[2]); rlen = length(rkids = home:_get(rtree[1])[2]); if (height) m = this:_smerge(home, height - 1, lkids[llen], rkids[1]); mlen = length(mkids = {@listdelete(lkids, llen), @m, @listdelete(rkids, 1)}); if (mlen <= this.maxfanout) home:_put(ltree[1], height, mkids); home:_kill(rtree[1]); ltree[2] = (ltree[2] + rtree[2]); return {ltree}; else S = max(llen - 1, (mlen + 1) / 2); home:_put(ltree[1], height, mkids[1..S]); home:_put(rtree[1], height, mkids[S + 1..length(mkids)]); xfer = (-lkids[llen][2]); for k in (mkids[llen..S]) xfer = (xfer + k[2]); endfor ltree[2] = (ltree[2] + xfer); rtree[2] = (rtree[2] - xfer); rtree[3] = mkids[S + 1][3]; return {ltree, rtree}; endif elseif ((llen * 2) >= this.maxfanout) return {ltree, rtree}; elseif (this.maxfanout < (llen + rlen)) T = (((rlen - llen) + 1) / 2); home:_put(ltree[1], 0, {@lkids, @rkids[1..T]}); home:_put(rtree[1], 0, rkids[T + 1..rlen]); ltree[2] = (ltree[2] + T); rtree[2] = (rtree[2] - T); rtree[3] = home:_ord(rkids[T + 1]); return {ltree, rtree}; else home:_put(ltree[1], 0, {@lkids, @rkids}); home:_kill(rtree[1]); ltree[2] = (ltree[2] + rtree[2]); return {ltree}; endif . #15:19 "_split(home, height,lmax,ltree[,@rtrees]}) => {ltree,[mtree,]@rtrees}"; "ltree is split after the lmax'th leaf, the righthand portion grafted onto the leftmost of the rtrees, if possible. Otherwise we create a new tree mtree, stealing from rtrees[1] if necessary."; "Assumes 1<=lmax<ltree[2]"; if (caller != this) return E_PERM; endif home = args[1]; height = args[2]; lmax = args[3]; ltree = args[4]; rtrees = args[5..length(args)]; llen = length(lkids = home:_get(ltree[1])[2]); rlen = length(rkids = (rtrees ? home:_get(rtrees[1][1])[2] | {})); if (height) ik = this:_listfind_nth(lkids, lmax); if (ik[2]) llast = ik[1]; m = this:_split(home, height - 1, ik[2], lkids[llast], @lkids[llast + 1..llen], @rkids); lkids[llast] = m[1]; mkids = listdelete(m, 1); else llast = (ik[1] - 1); mkids = {@lkids[ik[1]..llen], @rkids}; endif home:_put(ltree[1], height, lkids[1..llast]); mlen = length(mkids); if ((((mlen - rlen) * 2) >= this.maxfanout) || (!rtrees)) "...residue left over from splitting ltree can stand by itself..."; return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen - rlen]), ltree[2] - lmax, mkids[1][3]}, @rtrees}; elseif (mlen <= this.maxfanout) "...residue left over from splitting ltree fits in rtrees[1]..."; home:_put(rtrees[1][1], height, mkids); rtrees[1][2] = ((ltree[2] - lmax) + rtrees[1][2]); rtrees[1][3] = mkids[1][3]; return {listset(ltree, lmax, 2), @rtrees}; else "...need to steal from rtrees[1]..."; if (llast < llen) msize = (ltree[2] - lmax); R = ((mlen - rlen) + 1); else msize = 0; R = 1; endif for k in (mkids[R..mlen / 2]) msize = (msize + k[2]); endfor home:_put(rtrees[1][1], height, mkids[(mlen / 2) + 1..mlen]); rtrees[1][2] = ((rtrees[1][2] + ltree[2]) - (lmax + msize)); rtrees[1][3] = mkids[(mlen / 2) + 1][3]; return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen / 2]), msize, mkids[1][3]}, @rtrees}; endif else home:_put(ltree[1], 0, lkids[1..lmax]); if ((((llen - lmax) * 2) >= this.maxfanout) || (!rtrees)) "...residue left over from splitting ltree can stand by itself..."; return {listset(ltree, lmax, 2), {home:_make(0, lkids[lmax + 1..llen]), llen - lmax, home:_ord(lkids[lmax + 1])}, @rtrees}; elseif ((mlen = ((rlen + llen) - lmax)) <= this.maxfanout) "...residue left over from splitting ltree fits in rtrees[1]..."; home:_put(rtrees[1][1], 0, {@lkids[lmax + 1..llen], @rkids}); rtrees[1][2] = mlen; rtrees[1][3] = home:_ord(lkids[lmax + 1]); return {listset(ltree, lmax, 2), @rtrees}; else "...need to steal from rtrees[1]..."; home:_put(rtrees[1][1], 0, rkids[(R = (((rlen - llen) + lmax) / 2)) + 1..rlen]); rtrees[1][2] = ((mlen + 1) / 2); rtrees[1][3] = home:_ord(rkids[R + 1]); return {listset(ltree, lmax, 2), {home:_make(0, {@lkids[lmax + 1..llen], @rkids[1..R]}), mlen / 2, home:_ord(lkids[lmax + 1])}, @rtrees}; endif endif . #15:20 ":_rmerge(home, tree, insertree) => newtree "; "(newtree is tree with insertree appended to the right)"; "insertree is assumed to be of height < tree"; if (caller != this) return E_PERM; endif home = args[1]; tree = args[2]; insert = args[3]; if (!tree) return insert; elseif (!insert) return tree; endif iheight = home:_get(insert[1])[1]; rspine = {}; for i in [iheight + 1..home:_get(tree[1])[1]] kids = home:_get(tree[1])[2]; tlen = length(kids); rspine = {{tree, tlen}, @rspine}; tree = kids[tlen]; endfor isize = insert[2]; m = this:_smerge(home, iheight, tree, insert); for h in [1..length(rspine)] plen = rspine[h][2]; parent = rspine[h][1]; hgp = home:_get(parent[1]); if (((length(m) - 1) + plen) > this.maxfanout) home:_put(parent[1], @listset(hgp, listset(hgp[2], m[1], plen), 2)); parent[2] = ((parent[2] + isize) - m[2][2]); m = {parent, listset(m[2], home:_make(h + iheight, {m[2]}), 1)}; else home:_put(parent[1], @listset(hgp, {@hgp[2][1..plen - 1], @m}, 2)); for p in (rspine[h + 1..length(rspine)]) parent[2] = (parent[2] + isize); tree = parent; parent = p[1]; hgp = home:_get(parent[1]); home:_put(parent[1], @listset(hgp, listset(hgp[2], tree, p[2]), 2)); endfor return listset(parent, parent[2] + isize, 2); endif endfor return {home:_make((length(rspine) + iheight) + 1, m), m[1][2] + m[2][2], m[1][3]}; . #15:21 ":_scrunch(home,tree) => newtree"; "decapitates single-child nodes from the top of the tree, returns new root."; if (caller != this) return E_PERM; endif if (tree = args[2]) home = args[1]; while ((n = home:_get(tree[1]))[1] && (length(n[2]) == 1)) home:_kill(tree[1]); tree = n[2][1]; endwhile endif return tree; . #15:22 "_listfind_nth(nodelist,key) => {i,k} where i is the smallest i such that the sum of the first i elements of intlist is > key, and k==key - sum(first i-1 elements)."; "1 <= i <= length(intlist)+1"; lst = args[1]; key = args[2]; for i in [1..length(lst)] key = (key - lst[i][2]); if (0 > key) return {i, key + lst[i][2]}; endif endfor return {length(lst) + 1, key}; . #15:23 if (caller != this) return E_PERM; endif . #15:24 return $perm_utils:controls(caller_perms(), this) ? this:(args[1])(@listdelete(args, 1)) | E_PERM; . #16:0 gp = this._genprop; ngp = ""; for i in [1..length(gp)] if (gp[i] != "z") ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[index("abcdefghijklmnopqrstuvwxy", gp[i])]) + gp[i + 1..length(gp)]); return " " + (this._genprop = ngp); endif ngp = (ngp + "a"); endfor return " " + (this._genprop = (ngp + "a")); . #16:1 ":_make(...) => new node with value {...}"; if (!(caller in {this._mgr, this})) return E_PERM; endif prop = this:_genprop(); add_property(this, prop, args, {this.mowner, ""}); return prop; . #16:2 ":_kill(node) destroys the given node."; if (!(caller in {this, this._mgr})) return E_PERM; endif delete_property(this, args[1]); . #16:3 return (caller == this._mgr) ? this.(args[1]) | E_PERM; . #16:4 return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM; . #16:5 return args[1][2..3]; . #16:6 ":_makemsg(ord,msg) => leafnode for msg"; "msg = $mail_agent:__convert_new(@args[2])"; msg = args[2]; if (caller != this) return E_PERM; elseif (h = ("" in msg)) return {this:_make(@msg[h + 1..length(msg)]), args[1], @msg[1..h - 1]}; else return {0, args[1], @msg}; endif . #16:7 if (caller != this._mgr) return E_PERM; elseif (node = args[1][1]) this:_kill(node); endif . #16:8 return args[2]; . #16:9 return args[3]; . #16:10 return args[3..length(args)]; . #16:11 return {@args[3..length(args)], @args[1] ? {"", @this.(args[1])} | {}}; . #16:12 return args[1] < args[2][1]; . #16:13 return args[1] < args[2][2]; . #16:14 if (!this:is_writable_by(caller_perms())) return E_PERM; else new = this:new_message_num(); msgtree = this.messages; for m in (args) msgtree = this._mgr:insert_last(msgtree, this:_makemsg(new, m[2])); new = (new + 1); if ($command_utils:running_out_of_time()) this.messages = msgtree; player:tell("... ", new); suspend(0); msgtree = this.messages; new = this:new_message_num(); endif endfor this.messages = msgtree; this.last_used_time = time(); return 1; endif . #16:15 if (!this:is_writable_by(caller_perms())) return E_PERM; else this.messages = this._mgr:insert_last(this.messages, msg = this:_makemsg(new = this:new_message_num(), args[1])); this.last_msg_date = this:_message_date(@msg); this.last_used_time = time(); return new; endif . #16:16 if (!this:ok(caller, caller_perms())) return E_PERM; elseif (typeof(seq = args[1]) != LIST) x = this._mgr:find_nth(this.messages, seq); return {this:_message_num(@x), this:_message_text(@x)}; else msgs = {}; while (seq) handle = this._mgr:start(this.messages, seq[1], seq[2] - 1); while (handle) for x in (handle[1]) msgs = {@msgs, {this:_message_num(@x), this:_message_text(@x)}}; endfor handle = this._mgr:next(@listdelete(handle, 1)); $command_utils:suspend_if_needed(0); endwhile seq = seq[3..length(seq)]; endwhile return msgs; endif . #16:17 ":display_seq_headers(msg_seq[,cur[,last_read_date]])"; "This is the default header display routine."; "Prints a list of headers of messages on this to player. msg_seq is the handle returned by this:parse_message_seq(...). cur is the player's current message. last_read_date is the date of the last of the already-read messages."; if (!this:ok(caller, caller_perms())) return E_PERM; endif getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr"); seq = args[1]; cur = {@args, 0}[2]; last_old = {@args, $maxint, $maxint}[3]; width = player:linelen(); while (seq) handle = this._mgr:start(this.messages, seq[1], seq[2] - 1); while (handle) for x in (handle[1]) $command_utils:suspend_if_needed(0); line = tostr($string_utils:right(x[2], 4, (cur == x[2]) ? ">" | " "), (x[3] > last_old) ? ":+ " | ": ", this:msg_summary_line(@this:(getmsg)(@x))); player:tell(line[1..min(width, length(line))]); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile seq = seq[3..length(seq)]; endwhile player:tell("----+"); . #16:18 ":display_seq_full(msg_seq[,preamble]) => {cur}"; "This is the default message display routine."; "Prints the indicated messages on folder to player. msg_seq is the handle returned by folder:parse_message_seq(...). Returns the number of the final message in the sequence (to be the new current message number)."; if (!this:ok(caller, caller_perms())) return E_PERM; endif seq = args[1]; preamble = {@args, ""}[2]; cur = (date = 0); while (seq) handle = this._mgr:start(this.messages, seq[1], seq[2] - 1); while (handle) for x in (handle[1]) cur = this:_message_num(@x); date = this:_message_date(@x); player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@this:_message_text(@x))); endfor handle = this._mgr:next(@listdelete(handle, 1)); $command_utils:suspend_if_needed(0); endwhile seq = seq[3..length(seq)]; endwhile return {cur, date}; . #16:19 if (!this:ok(caller, caller_perms())) return E_PERM; endif len = 0; getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr"); for s in (this.messages_going) len = (len + s[2][2]); handle = this._mgr:start(s[2], 1, s[2][2]); while (handle) for x in (handle[1]) player:tell($string_utils:right(this:_message_num(@x), 4), ": ", this:msg_summary_line(@this:(getmsg)(@x))); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor if (len) player:tell("----+"); endif return len; . #16:20 if (!this:ok_write(caller, caller_perms())) return E_PERM; endif msgtree = this.messages; seq = {}; last = 0; for s in (this.messages_going) msgtree = this._mgr:insert_after(msgtree, s[2], last + s[1]); seq = {@seq, (last + s[1]) + 1, (last = ((last + s[1]) + s[2][2])) + 1}; endfor this.messages = msgtree; this.messages_going = {}; this:_fix_last_msg_date(); return seq; . #16:21 if (!this:ok_write(caller, caller_perms())) return E_PERM; endif len = 0; for s in (this.messages_going) len = (len + s[2][2]); this._mgr:kill(s[2], "_killmsg"); endfor this.messages_going = {}; return len; . #16:22 seq = args[1]; if (!(this:ok_write(caller, caller_perms()) || (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args))))) return E_PERM; endif msgtree = this.messages; save = (nums = {}); onext = 1; rmmed = 0; for i in [1..length(seq) / 2] if ($command_utils:suspend_if_needed(0)) player:tell("... rmm ", onext); suspend(0); endif start = seq[(2 * i) - 1]; next = seq[2 * i]; x = this._mgr:extract_range(msgtree, start - rmmed, (next - 1) - rmmed); msgtree = x[1]; zmsgs = x[2]; save = {@save, {start - onext, zmsgs}}; nums = {@nums, this:_message_num(@this._mgr:find_nth(zmsgs, 1)), this:_message_num(@this._mgr:find_nth(zmsgs, zmsgs[2])) + 1}; onext = next; rmmed = ((rmmed + next) - start); endfor tmg = this.messages_going; this.messages_going = save; fork (0) for s in (tmg) this._mgr:kill(s[2], "_killmsg"); endfor endfork this.messages = msgtree; this:_fix_last_msg_date(); return $seq_utils:tostr(nums); . #16:23 ":renumber([cur]) renumbers caller.messages, doing a suspend() if necessary."; " => {number of messages,new cur}."; if (!this:ok_write(caller, caller_perms())) return E_PERM; endif cur = {@args, 0}[1]; this:expunge_rmm(); "... blow away @rmm'ed messages since there's no way to tell what their new numbers should be..."; if (!(msgtree = this.messages)) return {0, 0}; endif if (cur) cur = (this._mgr:find_ord(msgtree, cur - 1, "_lt_msgnum") + 1); endif while (1) "...find first out-of-sequence message..."; n = 1; subtree = msgtree; if (msgtree[3][1] == 1) while ((node = this.(subtree[1]))[1]) "...subtree[3][1]==n..."; kids = node[2]; n = (n + subtree[2]); i = length(kids); while ((n = (n - kids[i][2])) != kids[i][3][1]) i = (i - 1); endwhile subtree = kids[i]; endwhile leaves = node[2]; n = (((firstn = n) + length(leaves)) - 1); while (n != leaves[(n - firstn) + 1][2]) n = (n - 1); endwhile n = (n + 1); endif "... n == first out-of-sequence ..."; "...renumber as many messages as we have time for..."; while ((n <= msgtree[2]) && (!$command_utils:running_out_of_time())) msg = this._mgr:find_nth(msgtree, n); msgtree = this._mgr:set_nth(msgtree, n, listset(msg, n, 2)); n = (n + 1); endwhile this.messages = msgtree; if (n > msgtree[2]) return {n - 1, cur}; endif player:tell("...(renumbering to ", n - 1, ")"); suspend(0); "...start over... may have received new mail, rmm'ed stuff, etc..."; "...so who knows what's there now?..."; if (this.messages_going) player:tell("Renumber aborted."); return; endif msgtree = this.messages; endwhile . #16:24 return this:ok(caller, caller_perms()) ? this.messages ? this.messages[2] | 0 | E_PERM; . #16:25 return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgnum") | E_PERM; . #16:26 return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgdate") | E_PERM; . #16:27 return this:ok(caller, caller_perms()) ? (i = this._mgr:find_ord(this.messages, args[1], "_lt_msgnum")) && ((this:_message_num(@this._mgr:find_nth(this.messages, i)) == args[1]) && i) | E_PERM; . #16:28 new = ((msgtree = this.messages) ? this:_message_num(@this._mgr:find_nth(msgtree, msgtree[2])) + 1 | 1); if (rmsgs = this.messages_going) lbrm = rmsgs[length(rmsgs)][2]; return max(new, this:_message_num(@this._mgr:find_nth(lbrm, lbrm[2])) + 1); else return new; endif . #16:29 ":from_msg_seq(object or list)"; " => msg_seq of messages from any of these senders"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif if (typeof(plist = args[1]) != LIST) plist = {plist}; endif mask = {@args, {1, this.messages[2] + 1}}[2]; fseq = {}; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) fromline = msg[4]; if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist) fseq = $seq_utils:add(fseq, i, i); endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or ")); . #16:30 ":%from_msg_seq(string or list of strings)"; " => msg_seq of messages with one of these strings in the from line"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif if (typeof(nlist = args[1]) != LIST) nlist = {nlist}; endif fseq = {}; mask = {@args, {1, this.messages[2] + 1}}[2]; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) fromline = (" " + msg[4]); for n in (nlist) if (index(fromline, n)) fseq = $seq_utils:add(fseq, i, i); endif endfor i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or ")); . #16:31 ":to_msg_seq(object or list) => msg_seq of messages to those people"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif if (typeof(plist = args[1]) != LIST) plist = {plist}; endif seq = {}; mask = {@args, {1, this.messages[2] + 1}}[2]; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) toline = msg[5]; for r in ($mail_agent:parse_address_field(toline)) if (r in plist) seq = $seq_utils:add(seq, i, i); endif endfor i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or ")); . #16:32 ":%to_msg_seq(string or list of strings)"; " => msg_seq of messages containing one of strings in the to line"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif if (typeof(nlist = args[1]) != LIST) nlist = {nlist}; endif seq = {}; mask = {@args, {1, this.messages[2] + 1}}[2]; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) toline = (" " + msg[5]); for n in (nlist) if (index(toline, n)) seq = $seq_utils:add(seq, i, i); endif endfor i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or ")); . #16:33 ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif target = args[1]; seq = {}; mask = {@args, {1, this.messages[2] + 1}}[2]; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) if (((subject = msg[6]) != " ") && index(subject, target)) seq = $seq_utils:add(seq, i, i); endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return seq || (("%f %<has> no messages with subjects containing `" + target) + "'"); . #16:34 ":body_msg_seq(target) => msg_seq of messages with target in the body"; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!this.messages) return {}; endif target = args[1]; seq = {}; mask = {@args, {1, this.messages[2] + 1}}[2]; for m in [1..length(mask) / 2] handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1); while (handle) for msg in (handle[1]) if (msg[1] && (body = this.(msg[1]))) l = length(body); while ((!index(body[l], target)) && (l = (l - 1))) $command_utils:suspend_if_needed(0); endwhile if (l) seq = $seq_utils:add(seq, i, i); endif endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor handle = this._mgr:next(@listdelete(handle, 1)); endwhile endfor return seq || tostr("%f %<has> no messages containing `", target, "' in the body."); . #16:35 return E_VERBNF; . #16:36 msgtree = this.messages; this.last_msg_date = ((msgtree && this:_message_hdr(@this._mgr:find_nth(msgtree, msgtree[2]))[1]) || 0); . #16:37 if (!this:ok_write(caller, caller_perms())) return E_PERM; endif doit = (args && args[1]); msgtree = this.messages; for n in [1..msgtree[2]] msg = this._mgr:find_nth(msgtree, n); msg = {@msg[1..2], @$mail_agent:__convert_new(@msg[3..length(msg)])}; if (doit) msgtree = this._mgr:set_nth(msgtree, n, msg); endif if ($command_utils:running_out_of_time()) suspend(0); if (this.messages != msgtree) player:notify("urk. someone played with this folder."); return 0; endif endif endfor return 1; . #16:38 if (caller_perms().wizard) pass(); this._mgr = $biglist; this.mowner = $mail_recipient.owner; endif . #16:39 if (this:ok(caller, caller_perms())) date = args[1]; return (this.last_msg_date <= date) ? 0 | (this.messages[2] - this._mgr:find_ord(this.messages, args[1], "_lt_msgdate")); else return E_PERM; endif . #17:0 what = args[1]; return is_player(what) && (!(what in connected_players())); . #17:1 who = args[1]; move(who, $player_start); $player_start:announce_all_but({who}, who.name, " has connected."); . #17:2 return $player_start:who_location_msg(@args); . #18:0 return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM; . #18:1 ":add(player,email[,comment])"; if (!caller_perms().wizard) return E_PERM; endif who = args[1]; email = args[2]; comment = args[3..length(args)]; l = this:find_exact(email); if (l == $failed_match) this:insert(email, {{who, @comment}}); elseif (i = $list_utils:iassoc(who, l)) this:insert(email, listset(l, {who, @comment}, i)); else this:insert(email, {@l, {who, @comment}}); endif . #18:2 if (caller_perms().wizard) pass(); this:clearall(); this.registrar = #2; endif . #18:3 "suspicious(address)"; "Determine whether an address appears to be another player in disguise."; "returns a list of similar addresses."; ""; "at the moment,"; " foo@bar.baz.bing.boo"; "is considered 'similar' to anything matching"; " foo@*.bing.boo"; if (!caller_perms().wizard) return E_PERM; endif parsed = $network:parse_address(address = args[1]); userid = parsed[1]; site = parsed[2]; exact = ((!site) && this:find_exact(address)); if (!site) site = $network.site; endif site = $network:local_domain(site); sitelen = length(site); others = this:find_all_keys(userid + "@"); for other in (others) if (other[(length(other) - sitelen) + 1..length(other)] != site) others = setremove(others, other); endif endfor if (exact) others = listinsert(others, address); endif return others; . #18:4 "suspicious_userid(userid)"; "Return yes if userid is root or postmaster or something like that."; return args[1] in {"", "sysadmin", "root", "postmaster", "bin", "SYSTEM", "OPERATOR"}; "Thinking about ruling out hyphenated names, on the grounds that they're probably mailing lists."; . #18:5 "Returns a list of strings describing the registration data for an email address. Args[1] should be the result of this:find."; result = {}; for x in (args[1]) name = ((valid(x[1]) && is_player(x[1])) ? x[1].name | "<recycled>"); email = ((valid(x[1]) && is_player(x[1])) ? x[1].email_address | "<???>"); result = {@result, tostr(" ", name, " (", x[1], ") current email: ", email, (length(x) > 1) ? (" [" + x[2]) + "]" | "")}; endfor return result; . #19:0 ":display_seq_headers(msg_seq[,cur])"; if (!this:ok(caller, caller_perms())) return E_PERM; endif player:tell(" WHEN BY WHO EMAIL-ADDRESS"); pass(@args); . #19:1 when = ctime(args[1])[5..10]; from = args[2]; by = $string_utils:left(from[1..index(from, " (") - 1], -9); subject = args[4]; who = subject[1..(open = index(subject, " (")) - 1]; if ((close = rindex(subject, ")")) > open) who = (who[1..min(9, length(who))] + subject[open..close]); endif who = $string_utils:left(who, 18); line = args[("" in args) + 1]; email = line[1..index(line + " ", " ") - 1]; if (!index(email, "@")) email = "??"; endif return tostr(when, " ", by, " ", who, " ", email); . #19:2 if (caller_perms().wizard) pass(); "this:rm_message_seq({1, 1 + this:length_all_msgs()})"; "this:expunge_rmm()"; for p in (properties(this)) $command_utils:suspend_if_needed(0); if (p && (p[1] == " ")) delete_property(this, p); endif endfor this.messages = (this.messages_going = {}); this._genprop = ""; this.mail_forward = {player, this}; this.mail_notify = {player}; for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"}) this.(p) = $mail_recipient.(p); endfor this.moderated = 1; else return E_PERM; endif . #19:3 "Copied from Generic Mail Recipient (#6419):is_usable_by by Rog (#4292) Tue Mar 2 10:02:32 1993 PST"; return (!this.moderated) || ((this:is_writable_by(who = args[1]) || (who in this.moderated)) || who.wizard); . #20:0 "space(len,fill) returns a string of length abs(len) consisting of copies of fill. If len is negative, fill is anchored on the right instead of the left."; n = args[1]; if (typeof(n) == STR) n = length(n); endif if (" " != (fill = {@args, " "}[2])) fill = (fill + fill); fill = (fill + fill); fill = (fill + fill); elseif ((n = abs(n)) < 70) return " "[1..n]; else fill = " "; endif m = ((n - 1) / length(fill)); while (m) fill = (fill + fill); m = (m / 2); endwhile return (n > 0) ? fill[1..n] | fill[((f = length(fill)) + 1) + n..f]; . #20:1 text = args[1]; len = args[2]; fill = (((length(args) >= 3) && args[3]) || " "); abslen = abs(len); out = tostr(text); if (length(out) < abslen) return out + this:space(length(out) - abslen, fill); else return (len > 0) ? out | out[1..abslen]; endif . #20:2 text = args[1]; len = args[2]; fill = (((length(args) >= 3) && args[3]) || " "); abslen = abs(len); out = tostr(text); if (length(out) < abslen) return this:space(abslen - length(out), fill) + out; else return (len > 0) ? out | out[1..abslen]; endif . #20:3 text = args[1]; len = args[2]; lfill = (((length(args) >= 3) && args[3]) || " "); rfill = ((length(args) >= 4) ? args[4] | lfill); out = tostr(text); abslen = abs(len); if (length(out) < abslen) return (this:space((abslen - length(out)) / 2, lfill) + out) + this:space(((abslen - length(out)) + 1) / -2, rfill); else return (len > 0) ? out | out[1..abslen]; endif . #20:4 "columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'."; items = args[1]; n = args[2]; width = ((length(args) >= 3) ? args[3] | 79); height = (((length(items) + n) - 1) / n); items = {@items, @$list_utils:make((height * n) - length(items), "")}; colwidths = {}; for col in [1..n - 1] colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n)); endfor result = {}; for row in [1..height] line = tostr(items[row]); for col in [1..n - 1] line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]); endfor result = listappend(result, line[1..min(length(line), width)]); endfor return result; . #20:5 "$string_utils:from_list(list [, separator])"; "Return a string being the concatenation of the string representations of the elements of LIST, each pair separated by the string SEPARATOR, which defaults to the empty string."; LIST = args[1]; if (length(args) <= 1) return tostr(@LIST); elseif (LIST) separator = args[2]; result = tostr(LIST[1]); for elt in (listdelete(LIST, 1)) result = tostr(result, separator, elt); endfor return result; else return ""; endif . #20:6 "Prints the argument (must be a list) as an english list, e.g. {1, 2, 3} is printed as \"1, 2, and 3\", and {1, 2} is printed as \"1 and 2\"."; "Optional arguments are treated as follows:"; " Second argument is the string to use when the empty list is given. The default is \"nothing\"."; " Third argument is the string to use in place of \" and \". A typical application might be to use \" or \" instead."; " Fourth argument is the string to use instead of a comma (and space). Gary_Severn's deranged mind actually came up with an application for this. You can ask him."; " Fifth argument is a string to use after the penultimate element before the \" and \". The default is to have a comma without a space."; things = args[1]; nthings = length(things); if (length(args) > 1) nothingstr = args[2]; else nothingstr = "nothing"; endif if (length(args) > 2) andstr = args[3]; else andstr = " and "; endif if (length(args) > 3) commastr = args[4]; else commastr = ", "; endif if (length(args) > 4) finalcommastr = args[5]; else finalcommastr = ","; endif if (nthings == 0) return nothingstr; elseif (nthings == 1) return tostr(things[1]); elseif (nthings == 2) return tostr(things[1], andstr, things[2]); else ret = ""; for k in [1..nthings - 1] if (k == (nthings - 1)) commastr = finalcommastr; endif ret = tostr(ret, things[k], commastr); endfor return tostr(ret, andstr, things[nthings]); endif . #20:7 "Return a string of the names and object numbers of the objects in a list."; line = ""; for item in (args[1]) if ((typeof(item) == OBJ) && valid(item)) line = ((((line + item.name) + "(") + tostr(item)) + ") "); endif endfor return $string_utils:trimr(line); . #20:8 minute = 60; hour = (60 * minute); day = (24 * hour); secs = args[1]; if (secs > day) count = (secs / day); unit = "day"; article = "a"; elseif (secs > hour) count = (secs / hour); unit = "hour"; article = "an"; elseif (secs > minute) count = (secs / minute); unit = "minute"; article = "a"; else count = secs; unit = "second"; article = "a"; endif if (count == 1) time = tostr(article, " ", unit); else time = tostr(count, " ", unit, "s"); endif return time; . #20:9 ":trim (string [, space]) -- remove leading and trailing spaces"; ""; "`space' should be a character (single-character string); it defaults to \" \". Returns a copy of string with all leading and trailing copies of that character removed. For example, $string_utils:trim(\"***foo***\", \"*\") => \"foo\"."; string = args[1]; space = {@args, " "}[2]; m = match(string, tostr("[^", space, "]%(.*[^", space, "]%)?%|$")); return string[m[1]..m[2]]; . #20:10 ":triml(string [, space]) -- remove leading spaces"; ""; "`space' should be a character (single-character string); it defaults to \" \". Returns a copy of string with all leading copies of that character removed. For example, $string_utils:triml(\"***foo***\", \"*\") => \"foo***\"."; string = args[1]; what = {@args, " "}[2]; return string[match(string, tostr("[^", what, "]%|$"))[1]..length(string)]; . #20:11 ":trimr(string [, space]) -- remove trailing spaces"; ""; "`space' should be a character (single-character string); it defaults to \" \". Returns a copy of string with all trailing copies of that character removed. For example, $string_utils:trimr(\"***foo***\", \"*\") => \"***foo\"."; string = args[1]; what = {@args, " "}[2]; return string[1..rmatch(string, tostr("[^", what, "]%|^"))[2]]; . #20:12 ":strip_chars(string,chars) => string with chars removed"; subject = args[1]; stripped = args[2]; for i in [1..length(stripped)] subject = strsub(subject, stripped[i], ""); endfor return subject; . #20:13 ":strip_all_but(string,keep) => string with chars not in `keep' removed."; "`keep' is used in match() so if it includes ], ^, or -,"; "] should be first, ^ should be other from first, and - should be last."; string = args[1]; wanted = (("[" + args[2]) + "]+"); output = ""; while (m = match(string, wanted)) output = (output + string[m[1]..m[2]]); string = string[m[2] + 1..length(string)]; endwhile return output; . #20:14 "lowercase(string) -- returns a lowercase version of the string."; "uppercase(string) -- returns the uppercase version of the string."; string = args[1]; from = (caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); to = (lower = "abcdefghijklmnopqrstuvwxyz"); if (verb == "uppercase") from = lower; to = caps; endif for i in [1..26] string = strsub(string, from[i], to[i], 1); endfor return string; . #20:15 "capitalizes its argument."; if ((string = args[1]) && (i = index("abcdefghijklmnopqrstuvwxyz", string[1], 1))) string[1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i]; endif return string; . #20:16 "Matches args[1] against literal objects: #xxxxx or $variables. Returns the object if successful, $failed_match else."; string = args[1]; if (!string) return $nothing; elseif ((string[1] == "#") && (E_TYPE != (object = $code_utils:toobj(string)))) return object; elseif ((string[1] == "$") && ($object_utils:has_property(#0, pn = string[2..length(string)]) && (typeof(object = #0.(pn)) == OBJ))) return object; else return $failed_match; endif . #20:17 "$string_utils:match(string [, obj-list, prop-name]*)"; "Each obj-list should be a list of objects or a single object, which is treated as if it were a list of that object. Each prop-name should be string naming a property on every object in the corresponding obj-list. The value of that property in each case should be either a string or a list of strings."; "The argument string is matched against all of the strings in the property values."; "If it exactly matches exactly one of them, the object containing that property is returned. If it exactly matches more than one of them, $ambiguous_match is returned."; "If there are no exact matches, then partial matches are considered, ones in which the given string is a prefix of some property string. Again, if exactly one match is found, the object with that property is returned, and if there is more than one match, $ambiguous_match is returned."; "Finally, if there are no exact or partial matches, then $failed_match is returned."; subject = args[1]; if (subject == "") return $nothing; endif no_exact_match = (no_partial_match = 1); for i in [1..length(args) / 2] prop_name = args[(2 * i) + 1]; for object in ((typeof(olist = args[2 * i]) == LIST) ? olist | {olist}) if (valid(object)) if (typeof(str_list = object.(prop_name)) != LIST) str_list = {str_list}; endif if (subject in str_list) if (no_exact_match) no_exact_match = object; elseif (no_exact_match != object) return $ambiguous_match; endif else for string in (str_list) if (index(string, subject) != 1) elseif (no_partial_match) no_partial_match = object; elseif (no_partial_match != object) no_partial_match = $ambiguous_match; endif endfor endif endif endfor endfor return no_exact_match && (no_partial_match && $failed_match); . #20:18 "* wildcard matching. Returns a list of what the *s actually matched. Won't cath every match, if there are several ways to parse it."; "Example: $string_utils:match_string(\"Jack waves to Jill\",\"* waves to *\") returns {\"Jack\", \"Jill\"}"; "Optional arguments: numbers are interpreted as case-sensitivity, strings as alternative wildcards."; wild = "*"; case = (ret = {}); what = (args[1] + "&^%$"); targ = (args[2] + "&^%$"); for y in (args[3..length(args)]) if (typeof(y) == STR) wild = y; elseif (typeof(y) == NUM) case = {y}; endif endfor while (targ != "") if (z = index(targ, wild)) part = targ[1..z - 1]; else z = length(targ); part = targ; endif n = ((part == "") ? 1 | index(what, part, @case)); if (n) ret = listappend(ret, what[1..n - 1]); what = what[(z + n) - 1..length(what)]; targ = targ[z + 1..length(targ)]; else return 0; endif endwhile if (ret == {}) return what == ""; elseif (ret == {""}) return 1; elseif (ret[1] == "") return ret[2..length(ret)]; else return 0; endif . #20:19 ":match_object(string,location[,someone])"; "Returns the object matching the given string for someone, on the assumption that s/he is in the given location. `someone' defaults to player."; "This first tries :literal_object(string), \"me\"=>someone,\"here\"=>location, then player:match(string) and finally location:match(string) if location is valid."; "This is the default algorithm for use by room :match_object() and player :my_match_object() verbs. Player verbs that are calling this directly should probably be calling :my_match_object instead."; string = args[1]; here = args[2]; who = {@args, player}[3]; if ($failed_match != (object = this:literal_object(string))) return object; elseif (string == "me") return who; elseif (string == "here") return here; elseif ((valid(pobject = who:match(string)) && (string in {@pobject.aliases, pobject.name})) || (!valid(here))) "...exact match in player or room is bogus..."; return pobject; elseif ((valid(hobject = here:match(string)) && (string in {@hobject.aliases, hobject.name})) || (pobject == $failed_match)) "...exact match in room or match in player failed completely..."; return hobject; else return pobject; endif . #20:20 "match_player(name,name,...) => {obj,obj,...}"; "match_player(name[,meobj]) => obj"; "match_player({name,...}[,meobj]) => {obj,...}"; "objs returned are either players, $failed_match, $ambiguous_match, or $nothing in the case of an empty string."; "meobj (what to return for instances of `me') defaults to player; if given and isn't actually a player, `me' => $failed_match"; retstr = 0; me = player; if ((length(args) < 2) || (typeof(me = args[2]) == OBJ)) me = ((valid(me) && is_player(me)) ? me | $failed_match); if (typeof(args[1]) == STR) strings = {args[1]}; retstr = 1; "return a string, not a list"; else strings = args[1]; endif else strings = args; me = player; endif found = {}; for astr in (strings) if (!astr) aobj = $nothing; elseif (astr == "me") aobj = me; elseif (valid(aobj = $string_utils:literal_object(astr)) && is_player(aobj)) "astr is a valid literal object number of some player, so we are done."; else aobj = $player_db:find(astr); endif found = {@found, aobj}; endfor return retstr ? found[1] | found; . #20:21 "Accepts any number of strings, attempts to match those strings first against objects in the room, and if no objects by those names exist, matches against player names (and \"#xxxx\" style strings regardless of location). Returns a list of valid objects so found."; "Unlike $string_utils:match_player, does not include in the list the failed and ambiguous matches; instead has built-in error messages for such objects. This should probably be improved. Volunteers?"; if (!args) return; endif unknowns = {}; objs = {}; "We have to do something icky here. Parallel walk the victims and args lists. When it's a valid object, then it's a player. If it's an invalid object, try to get an object match from the room. If *that* fails, complain."; for i in [1..length(args)] if (valid(o = player.location:match_object(args[i]))) objs = {@objs, o}; else unknowns = {@unknowns, args[i]}; endif endfor victims = $string_utils:match_player(unknowns); for i in [1..length(victims)] if (!valid(victims[i])) player:tell("Could not find ", unknowns[i], " as either an object or a player."); else objs = {@objs, victims[i]}; endif endfor return objs; . #20:22 "find_prefix(prefix, string-list) => list index of something starting with prefix, or 0 or $ambiguous_match."; subject = args[1]; choices = args[2]; answer = 0; for i in [1..length(choices)] if (index(choices[i], subject) == 1) if (answer == 0) answer = i; else answer = $ambiguous_match; endif endif endfor return answer; . #20:23 "index_delimited(string,target[,case_matters]) is just like the corresponding call to the builtin index() but instead only matches on occurences of target delimited by word boundaries (i.e., not preceded or followed by an alphanumeric)"; args[2] = (("%(%W%|^%)" + $string_utils:regexp_quote(args[2])) + "%(%W%|$%)"); return (m = match(@args)) ? m[3][1][2] + 1 | 0; . #20:24 "Usage: is_numeric(string)"; "Is string numeric (composed of one or more digits possibly preceded by a minus sign)?"; "Return true or false"; return match(args[1], "^ *[-+]?[0-9]+ *$"); digits = "1234567890"; if (!(string = args[1])) return 0; endif if (string[1] == "-") string = string[2..length(string)]; endif for i in [1..length(string)] if (!index(digits, string[i])) return 0; endif endfor return 1; . #20:25 ":short_ordinal(1) => \"1st\",:short_ordinal(2) => \"2nd\",etc..."; string = tostr(n = args[1]); n = (abs(n) % 100); if (((n / 10) != 1) && ((n % 10) in {1, 2, 3})) return string + {"st", "nd", "rd"}[n % 10]; else return string + "th"; endif . #20:26 "$string_utils:group_number(n [, sep_char])"; ""; "Converts N to a string, inserting commas (or copies of SEP_CHAR, if given) every three digits, counting from the right. For example, $string_utils:group_number(1234567890) returns the string \"1,234,567,890\"."; n = args[1]; comma = ((length(args) > 1) ? args[2] | ","); result = ""; sign = ((n < 0) ? "-" | ""); n = tostr(abs(n)); while ((len = length(n)) > 3) result = ((comma + n[len - 2..len]) + result); n = n[1..len - 3]; endwhile return (sign + n) + result; . #20:27 "$string_utils:english_number(n) -- convert the number N into English"; ""; "Produces a string containing the English phrase naming the given number. For example, $string_utils:english_number(-1234) returns the string `negative one thousand two hundred thirty-four'."; NUM = tonum(args[1]); if (NUM == 0) return "zero"; endif labels = {"", " thousand", " million", " billion"}; numstr = ""; mod = abs(NUM); for n in [1..4] div = (mod % 1000); if (div) hun = (div / 100); ten = (div % 100); outstr = (this:english_tens(ten) + labels[n]); if (hun) outstr = (((this:english_ones(hun) + " hundred") + (ten ? " " | "")) + outstr); endif if (numstr) numstr = ((outstr + " ") + numstr); else numstr = outstr; endif endif mod = (mod / 1000); endfor return ((NUM < 0) ? "negative " | "") + numstr; . #20:28 "$string_utils:english_ordinal(n) -- convert the number N into an english ordinal (1 => \"first\", etc...)"; NUM = tonum(args[1]); if (NUM == 0) return "zeroth"; elseif (NUM % 100) hundreds = ((abs(NUM) > 100) ? this:english_number((NUM / 100) * 100) + " " | ((NUM < 0) ? "negative " | "")); NUM = (abs(NUM) % 100); specials = {1, 2, 3, 5, 8, 9, 12, 20, 30, 40, 50, 60, 70, 80, 90}; ordinals = {"first", "second", "third", "fifth", "eighth", "ninth", "twelfth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth"}; if (i = (NUM in specials)) return hundreds + ordinals[i]; elseif ((NUM > 20) && (i = ((NUM % 10) in specials))) return ((hundreds + this:english_tens((NUM / 10) * 10)) + "-") + ordinals[i]; else return (hundreds + this:english_number(NUM)) + "th"; endif else return this:english_number(NUM) + "th"; endif . #20:29 NUM = args[1]; ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; return ones[NUM + 1]; . #20:30 NUM = args[1]; teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; others = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; if (NUM < 10) return this:english_ones(NUM); elseif (NUM < 20) return teens[NUM - 9]; else return (others[(NUM / 10) - 1] + ((NUM % 10) ? "-" | "")) + this:english_ones(NUM % 10); endif . #20:31 "subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])"; " => returns string with all instances of the strings redex<n> replaced respectively by the strings repl<n>. If the optional argument `case' is given and nonzero, the search for instances of redex<n> is case sensitive."; " Substitutions are done in parallel, i.e., instances of redex<n> that appear in any of the replacement strings are ignored. In the event that two redexes overlap, whichever is leftmost in `string' takes precedence. For two redexes beginning at the same position, the longer one takes precedence."; ""; "subst(\"hoahooaho\",{{\"ho\",\"XhooX\"},{\"hoo\",\"mama\"}}) => \"XhooXamamaaXhooX\""; "subst(\"Cc: banana\",{{\"a\",\"b\"},{\"b\",\"c\"},{\"c\",\"a\"}},1) => \"Ca: cbnbnb\""; if (typeof(ostr = args[1]) != STR) return ostr; endif case = {@args, 0}[3]; len = length(ostr); " - - - find the first instance of each substitution - -"; indices = {}; substs = {}; for s in (args[2]) if (i = index(ostr, s[1], case)) fi = ($list_utils:find_insert(indices, i = (i - len)) - 1); while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1])))) "...give preference to longer redexes..."; fi = (fi - 1); endwhile indices = listappend(indices, i, fi); substs = listappend(substs, s, fi); endif endfor "- - - - - perform substitutions - "; nstr = ""; while (substs) ind = (len + indices[1]); sub = substs[1]; indices = listdelete(indices, 1); substs = listdelete(substs, 1); if (ind > 0) nstr = ((nstr + ostr[1..ind - 1]) + sub[2]); ostr = ostr[ind + length(sub[1])..len]; len = length(ostr); endif if (next = index(ostr, sub[1], case)) fi = ($list_utils:find_insert(indices, next = (next - len)) - 1); while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1])))) "...give preference to longer redexes..."; fi = (fi - 1); endwhile indices = listappend(indices, next, fi); substs = listappend(substs, sub, fi); endif endwhile return nstr + ostr; . #20:32 "subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])"; "Just like :substitute() but it uses index_delimited() instead of index()"; if (typeof(ostr = args[1]) != STR) return ostr; endif case = {@args, 0}[3]; len = length(ostr); " - - - find the first instance of each substitution - -"; indices = {}; substs = {}; for s in (args[2]) if (i = this:index_delimited(ostr, s[1], case)) fi = ($list_utils:find_insert(indices, i = (i - len)) - 1); while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1])))) "...give preference to longer redexes..."; fi = (fi - 1); endwhile indices = listappend(indices, i, fi); substs = listappend(substs, s, fi); endif endfor "- - - - - perform substitutions - "; nstr = ""; while (substs) ind = (len + indices[1]); sub = substs[1]; indices = listdelete(indices, 1); substs = listdelete(substs, 1); if (ind > 0) nstr = ((nstr + ostr[1..ind - 1]) + sub[2]); ostr = ostr[ind + length(sub[1])..len]; len = length(ostr); endif if (next = this:index_delimited(ostr, sub[1], case)) fi = ($list_utils:find_insert(indices, next = (next - len)) - 1); while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1])))) "...give preference to longer redexes..."; fi = (fi - 1); endwhile indices = listappend(indices, next, fi); substs = listappend(substs, sub, fi); endif endwhile return nstr + ostr; . #20:33 "cap_property(what,prop[,ucase]) returns what.(prop) but capitalized if either ucase is true or the prop name specified is capitalized."; "If prop is blank, returns what:title()."; "If prop is bogus or otherwise irretrievable, returns the error."; "If capitalization is indicated, we return what.(prop+\"c\") if that exists, else we capitalize what.(prop) in the usual fashion. There is a special exception for is_player(what)&&prop==\"name\" where we just return what.name if no .namec is provided --- ie., a player's .name is never capitalized in the usual fashion."; "If args[1] is a list, calls itself on each element of the list and returns $string_utils:english_list(those results)."; set_task_perms(caller_perms()); if (typeof(what = args[1]) == LIST) nargs = listdelete(args, 1); result = {}; for who in (what) result = {@result, this:_cap_property(who, @nargs)}; endfor return $string_utils:english_list(result); endif prop = args[2]; ucase = ((prop && (strcmp(prop, "a") < 0)) || ((length(args) >= 3) && args[3])); if (!prop) return valid(what) ? ucase ? what:titlec() | what:title() | ((ucase ? "N" | "n") + "othing"); elseif ((!ucase) || (typeof(s = what.(prop + "c")) == ERR)) if (prop == "name") s = (valid(what) ? what.name | "nothing"); ucase = (ucase && (!is_player(what))); else s = ($object_utils:has_property(what, prop) ? what.(prop) | $player.(prop)); endif if ((((ucase && s) && (typeof(s) == STR)) && ((z = strcmp(s[1], "`")) < 27)) && (z > 0)) s = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[z] + s[2..length(s)]); endif endif return (typeof(s) == ERR) ? s | tostr(s); . #20:34 "Pronoun (and other things) substitution. See 'help pronouns' for details."; "syntax: $string_utils:pronoun_sub(text[,who[,thing[,location]]])"; "%s,%o,%p,%q,%r => <who>'s pronouns. <who> defaults to player."; "%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, <thing>, location and %"; "<thing> defaults to caller; <location> defaults to who.location"; "%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions."; " %[#n], %[#d], ... => <who>, dobj, etc.'s object number"; "%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc.."; "%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>."; "%<d:foo> -> whatever <dobj> does when normal people foo."; who = ((length(args) >= 2) ? args[2] | player); thing = ((length(args) >= 3) ? args[3] | caller); where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing)); set_task_perms($no_one); if (typeof(args[1]) == LIST) plines = {}; for line in (args[1]) plines = {@plines, this:(verb)(line, who, thing, where)}; endfor return plines; endif old = tostr(args[1]); new = ""; objspec = "nditl"; objects = {who, (length(args) >= 5) ? args[5] | dobj, (length(args) >= 6) ? args[6] | iobj, thing, where}; prnspec = "sopqrSOPQR"; prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"}; oldlen = length(old); while ((prcnt = index(old, "%")) && (prcnt < oldlen)) s = old[k = (prcnt + 1)]; if ((s == "<") && (gt = index(old[k + 2..length(old)], ">"))) "handling %<verb> "; gt = ((gt + k) + 1); vb = old[k + 1..gt - 1]; vbs = who; if ((length(vb) > 2) && (vb[2] == ":")) " %<d:verb>"; vbs = objects[index(objspec, vb[1]) || 1]; vb = vb[3..length(vb)]; endif vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs)); new = ((new + old[1..prcnt - 1]) + vb); k = gt; else cp_args = {}; if (brace = index("([", s)) if (!(w = index(old[k + 1..oldlen], ")]"[brace]))) return new + old; else p = old[prcnt + 2..(k = (k + w)) - 1]; if (brace == 1) "%(property)"; cp_args = {who, p}; elseif (p[1] == "#") "%[#n] => object number"; s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]")); elseif (!(o = index(objspec, p[1]))) s = (("[" + p) + "]"); else " %[dproperty] "; cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0}; endif endif elseif (o = index(objspec, s)) cp_args = {objects[o], "", strcmp(s, "a") < 0}; elseif (w = index(prnspec, s, 1)) cp_args = {who, prprops[w]}; elseif (s == "#") s = tostr(who); elseif (s != "%") s = ("%" + s); endif new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")")))); endif old = old[k + 1..oldlen]; oldlen = (oldlen - k); endwhile return new + old; . #20:35 "$string_utils:pronoun_sub_secure(string[,who[,thing[,location]]], default)"; "Do pronoun_sub on string with the arguments given (see help"; "string_utils:pronoun_sub for more information). Return pronoun_subbed"; "<default> if the subbed string does not contain <who>.name (<who>"; "defaults to player)."; len = length(args); who = ((len > 2) ? args[2] | player); default = args[len]; result = this:pronoun_sub(@args[1..len - 1]); return this:index_delimited(result, who.name) ? result | this:pronoun_sub(@{default, @args[2..len - 1]}); . #20:36 " pronoun_quote(string) => quoted_string"; " pronoun_quote(list of strings) => list of quoted_strings"; " pronoun_quote(list of {key,string} pairs) => list of {key,quoted_string} pairs"; ""; "Here `quoted' means quoted in the sense of $string_utils:pronoun_sub, i.e., given a string X, the corresponding `quoted' string Y is such that pronoun_sub(Y) => X. For example, pronoun_quote(\"--%Spam%--\") => \"--%%Spam%%--\". This is for including literal text into a string that will eventually be pronoun_sub'ed, i.e., including it in such a way that the pronoun_sub will not expand anything in the included text."; ""; "The 3rd form above (with {key,string} pairs) is for use with $string_utils:substitute(). If you have your own set of substitutions to be done in parallel with the pronoun substitutions, do"; ""; " msg=$string_utils:substitute(msg,$string_utils:pronoun_quote(your_substs));"; " msg=$string_utils:pronoun_sub(msg);"; if (typeof(what = args[1]) == STR) return strsub(what, "%", "%%"); else ret = {}; for w in (what) if (typeof(w) == LIST) ret = listappend(ret, listset(w, strsub(w[2], "%", "%%"), 2)); else ret = listappend(ret, strsub(w, "%", "%%")); endif endfor return ret; endif . #20:37 "Pronoun (and other things) substitution. See 'help pronouns' for details."; "syntax: $string_utils:pronoun_sub(text[,who[,thing[,location]]])"; "%s,%o,%p,%q,%r => <who>'s pronouns. <who> defaults to player."; "%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, this, <who>.location and %"; "%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions."; " %[#n], %[#d], ... => <who>, dobj, etc.'s object number"; "%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc.."; "%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>."; "%<d:foo> -> whatever <dobj> does when normal people foo."; who = ((length(args) >= 2) ? args[2] | player); thing = ((length(args) >= 3) ? args[3] | caller); where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing)); if (typeof(args[1]) == LIST) plines = {}; for line in (args[1]) plines = {@plines, this:(verb)(line, who, thing, where)}; endfor return plines; endif old = tostr(args[1]); new = ""; objspec = "nditl"; objects = {who, dobj, iobj, thing, where}; prnspec = "sopqrSOPQR"; prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"}; oldlen = length(old); while ((prcnt = index(old, "%")) && (prcnt < oldlen)) s = old[k = (prcnt + 1)]; if ((s == "<") && (gt = index(old[k + 2..length(old)], ">"))) "handling %<verb> "; gt = ((gt + k) + 1); vb = old[k + 1..gt - 1]; vbs = who; if ((length(vb) > 2) && (vb[2] == ":")) " %<d:verb>"; vbs = objects[index(objspec, vb[1]) || 1]; vb = vb[3..length(vb)]; endif vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs)); new = ((new + old[1..prcnt - 1]) + vb); k = gt; else cp_args = {}; if (brace = index("([", s)) if (!(w = index(old[k + 1..oldlen], ")]"[brace]))) return new + old; else p = old[prcnt + 2..(k = (k + w)) - 1]; if (brace == 1) "%(property)"; cp_args = {who, p}; elseif (p[1] == "#") "%[#n] => object number"; s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]")); elseif (!(o = index(objspec, p[1]))) s = (("[" + p) + "]"); else " %[dproperty] "; cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0}; endif endif elseif (o = index(objspec, s)) cp_args = {objects[o], "", strcmp(s, "a") < 0}; elseif (w = index(prnspec, s, 1)) cp_args = {who, prprops[w]}; elseif (s == "#") s = tostr(who); elseif (s != "%") s = ("%" + s); endif new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")")))); endif old = old[k + 1..oldlen]; oldlen = (oldlen - k); endwhile return new + old; . #20:38 " #0.string_utils:explode(subject [, break])"; " Return a list of those substrings of subject separated by runs of break[1]."; " break defaults to space."; if (length(args) >= 2) break = args[2][1]; else break = " "; endif subject = (args[1] + break); parts = {}; while (subject) if ((i = index(subject, break)) > 1) parts = {@parts, subject[1..i - 1]}; endif subject = subject[i + 1..length(subject)]; endwhile return parts; . #20:39 "This breaks up the argument string into words, the resulting list being obtained exactly the way the command line parser obtains `args' from `argstr'."; rest = args[1]; "...trim leading blanks..."; rest[1..match(rest, "^ *")[2]] = ""; if (!rest) return {}; endif quote = 0; toklist = {}; token = ""; pattern = " +%|\\.?%|\""; while (m = match(rest, pattern)) "... find the next occurence of a special character, either"; "... a block of spaces, a quote or a backslash escape sequence..."; "notify(#4292,tostr(\"match(\",#20:print(rest),\",\",#20:print(pattern),\") => \",#20:print(m)))"; char = rest[m[1]]; token = (token + rest[1..m[1] - 1]); if (char == " ") toklist = {@toklist, token}; token = ""; elseif (char == "\"") "... beginning or end of quoted string..."; "... within a quoted string spaces aren't special..."; pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\""); elseif (m[1] < m[2]) "... char has to be a backslash..."; "... include next char literally if there is one"; token = (token + rest[m[2]]); endif rest[1..m[2]] = ""; endwhile return (rest || (char != " ")) ? {@toklist, token + rest} | toklist; . #20:40 "This breaks up the argument string into words, returning a list of indices into argstr corresponding to the starting points of each of the arguments."; rest = args[1]; "... find first nonspace..."; wstart = match(rest, "[^ ]%|$")[1]; wbefore = (wstart - 1); rest[1..wbefore] = ""; if (!rest) return {}; endif quote = 0; wslist = {}; pattern = " +%|\\.?%|\""; while (m = match(rest, pattern)) "... find the next occurence of a special character, either"; "... a block of spaces, a quote or a backslash escape sequence..."; char = rest[m[1]]; if (char == " ") wslist = {@wslist, {wstart, (wbefore + m[1]) - 1}}; wstart = ((wbefore + m[2]) + 1); elseif (char == "\"") "... beginning or end of quoted string..."; "... within a quoted string spaces aren't special..."; pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\""); endif rest[1..m[2]] = ""; wbefore = (wbefore + m[2]); endwhile return (rest || (char != " ")) ? {@wslist, {wstart, wbefore + length(rest)}} | wslist; . #20:41 ":to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof)."; "Returns {1,value} or {0,error_message} according as the attempt was successful or not."; result = this:_tolist(string = (args[1] + "}")); if (result[1] && (result[1] != $string_utils:space(result[1]))) return {0, tostr("after char ", length(string) - result[1], ": ", result[2])}; elseif (typeof(result[1]) == NUM) return {0, "missing } or \""}; elseif (length(result[2]) > 1) return {0, "comma unexpected."}; elseif (result[2]) return {1, result[2][1]}; else return {0, "missing expression"}; endif . #20:42 ":prefix_to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof)."; "Returns {rest-of-string,value} or {0,error_message} according as the attempt was successful or not."; alen = length(args[1]); slen = length(string = this:triml(args[1])); if (!string) return {0, "empty string"}; elseif (w = index("{\"", string[1])) result = this:({"_tolist", "_unquote"}[w])(string[2..slen]); if (typeof(result[1]) != NUM) return result; elseif (result[1] == 0) return {0, "missing } or \""}; else return {0, result[2], (alen - result[1]) + 1}; endif else thing = string[1..tlen = (index(string + " ", " ") - 1)]; if (typeof(s = this:_toscalar(thing)) != STR) return {string[tlen + 1..slen], s}; else return {0, s, (alen - slen) + 1}; endif endif . #20:43 "_tolist(string) --- auxiliary for :to_value()"; rest = this:triml(args[1]); vlist = {}; if (!rest) return {0, {}}; elseif (rest[1] == "}") return {rest[2..length(rest)], {}}; endif while (1) rlen = length(rest); if (w = index("{\"", rest[1])) result = this:({"_tolist", "_unquote"}[w])(rest[2..rlen]); if (typeof(result[1]) == NUM) return result; endif vlist = {@vlist, result[2]}; rest = result[1]; else thing = rest[1..tlen = (min(index(rest + ",", ","), index(rest + "}", "}")) - 1)]; if (typeof(s = this:_toscalar(thing)) == STR) return {rlen, s}; endif vlist = {@vlist, s}; rest = rest[tlen + 1..rlen]; endif if (!rest) return {0, vlist}; elseif (rest[1] == "}") return {rest[2..length(rest)], vlist}; elseif (rest[1] == ",") rest = this:triml(rest[2..length(rest)]); else return {length(rest), ", or } expected"}; endif endwhile . #20:44 "_unquote(string) (auxiliary for :to_value())"; "reads string as if it were preceded by a quote, reading up to the closing quote if any, then returns the corresponding unquoted string."; " => {0, string unquoted} if there is no closing quote"; " => {original string beyond closing quote, string unquoted} otherwise"; rest = args[1]; result = ""; while (m = match(rest, "\\.?%|\"")) "Find the next special character"; if (rest[pos = m[1]] == "\"") return {rest[pos + 1..length(rest)], result + rest[1..pos - 1]}; endif result = ((result + rest[1..pos - 1]) + rest[pos + 1..m[2]]); rest = rest[m[2] + 1..length(rest)]; endwhile return {0, result + rest}; . #20:45 ":_toscalar(string) --- auxiliary for :tovalue"; " => value if string represents a number, object or error"; " => string error message otherwise"; thing = args[1]; if (!thing) return "missing value"; elseif (match(thing, "^#?[-+]?[0-9]+ *$")) return (thing[1] == "#") ? toobj(thing) | tonum(thing); elseif (thing[1] == "E") return (e = $code_utils:toerr(thing)) ? tostr("unknown error code `", thing, "'") | e; elseif (thing[1] == "#") return tostr("bogus objectid `", thing, "'"); else return tostr("`", thing[1], "' unexpected"); endif . #20:46 ":parse_command(cmd_line[,player])"; " => {verb, {dobj, dobjstr}, {prep, prepstr}, {iobj, iobjstr}, {args, argstr},"; " dobjset, prepset, iobjset}"; "This mimics the action of the builtin parser, returning what the values of the builtin variables `verb', `dobj', `dobjstr', `prepstr', `iobj', `iobjstr', `args', and `argstr' would be if `player' had typed `cmd_line'. "; "`prep' is the shortened version of the preposition found."; ""; "`dobjset' and `iobjset' are subsets of {\"any\",\"none\"} and are used to determine possible matching verbs, i.e., the matching verb must either be on `dobj' and have verb_args[1]==\"this\" or else it has verb_args[1] in `dobjset'; likewise for `iobjset' and verb_args[3]; similarly we must have verb_args[2] in `prepset'."; c = args[1]; who = ((length(args) > 1) ? args[2] | player); y = $string_utils:words(c); if (y == {}) return {}; endif vrb = y[1]; y = y[2..length(y)]; as = ((y == {}) ? "" | c[length(vrb) + 2..length(c)]); n = 1; while ((!(gp = $code_utils:get_prep(@y[n..length(y)]))[1]) && (n < length(y))) n = (n + 1); endwhile "...."; really = player; player = who; loc = who.location; if (ps = gp[1]) ds = $string_utils:from_list(y[1..n - 1], " "); is = $string_utils:from_list(listdelete(gp, 1), " "); io = (valid(loc) ? loc:match_object(is) | $string_utils:match_object(is, loc)); else ds = $string_utils:from_list(y, " "); is = ""; io = $nothing; endif do = (valid(loc) ? loc:match_object(ds) | $string_utils:match_object(ds, loc)); player = really; "...."; dset = {"any", @(ds == "") ? {"none"} | {}}; "\"this\" must be handled manually."; pset = {"any", @ps ? {$code_utils:full_prep(ps)} | {"none"}}; iset = {"any", @(is == "") ? {"none"} | {}}; return {vrb, {do, ds}, {$code_utils:short_prep(ps), ps}, {io, is}, {y, as}, {dset, pset, iset}}; . #20:47 "$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])"; "Print the given value into a string."; value = args[1]; if (length(args) < 2) quote_strings = 0; list_depth = 1; else quote_strings = args[2]; if (length(args) < 3) list_depth = 1; else list_depth = args[3]; endif endif if (typeof(value) == LIST) if (value) if (list_depth) result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1)); for v in (listdelete(value, 1)) result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1)); endfor return result + "}"; else return "{...}"; endif else return "{}"; endif elseif (quote_strings) if (typeof(value) == STR) result = "\""; while (q = (index(value, "\"") || index(value, "\\"))) if (value[q] == "\"") q = min(q, index(value + "\\", "\\")); endif result = (((result + value[1..q - 1]) + "\\") + value[q]); value = value[q + 1..length(value)]; endwhile return (result + value) + "\""; elseif (typeof(value) == ERR) return $code_utils:error_name(value); else return tostr(value); endif else return tostr(value); endif . #20:48 "$string_utils:print(value)"; "Print the given value into a string. == from_value(value,1,-1)"; value = args[1]; if (typeof(value) == LIST) if (value) result = ("{" + this:print(value[1])); for val in (listdelete(value, 1)) result = tostr(result, ", ", this:print(val)); endfor return result + "}"; else return "{}"; endif elseif (typeof(value) == STR) result = "\""; while (q = (index(value, "\"") || index(value, "\\"))) if (value[q] == "\"") q = min(q, index(value + "\\", "\\")); endif result = (((result + value[1..q - 1]) + "\\") + value[q]); value = value[q + 1..length(value)]; endwhile return (result + value) + "\""; elseif (typeof(value) == ERR) return $code_utils:error_name(value); else return tostr(value); endif . #20:49 "$string_utils:print_suspended(value)"; "Identical to $string_utils:print(value) except that we suspend where needed."; set_task_perms(caller_perms()); value = args[1]; if (typeof(value) == LIST) if (value) result = ("{" + this:print_suspended(value[1])); for val in (listdelete(value, 1)) result = tostr(result, ", ", this:print_suspended(val)); $command_utils:suspend_if_needed(0); endfor return result + "}"; else return "{}"; endif elseif (typeof(value) == STR) result = "\""; while (q = (index(value, "\"") || index(value, "\\"))) if (value[q] == "\"") q = min(q, index(value + "\\", "\\")); endif result = tostr(result, value[1..q - 1], "\\", value[q]); value = value[q + 1..length(value)]; $command_utils:suspend_if_needed(0); endwhile return (result + value) + "\""; elseif (typeof(value) == ERR) return $code_utils:error_name(value); else return tostr(value); endif . #20:50 if ((len = length(args[1])) > 50) return this:reverse(args[1][(len / 2) + 1..len]) + this:reverse(args[1][1..len / 2]); endif index = len; result = ""; while (index > 0) result = (result + args[1][index]); index = (index - 1); endwhile return result; . #20:51 ":char_list(string) => string as a list of characters."; " e.g., :char_list(\"abad\") => {\"a\",\"b\",\"a\",\"d\"}"; if (30 < (len = length(string = args[1]))) return {@this:char_list(string[1..len / 2]), @this:char_list(string[(len / 2) + 1..len])}; else l = {}; for c in [1..len] l = {@l, string[c]}; endfor return l; endif . #20:52 ":regexp_quote(string)"; " => string with all of the regular expression special characters quoted with %"; string = args[1]; quoted = ""; while (m = rmatch(string, "[][$^.*+?].*")) quoted = (("%" + string[m[1]..m[2]]) + quoted); string = string[1..m[1] - 1]; endwhile return string + quoted; . #20:53 "Takes the output from connection_name() and returns just the host string portion of it. Assumes you are using bsd_network style connection names."; s = args[1]; return s[rindex(s, " ") + 1..length(s)]; . #20:54 "This is the function that should actually be called to get the host name from a connection name. The archwizard should change _bsd so as to be calling the verb appropriate for his/her network interface."; return this:connection_hostname_bsd(@args); . #20:55 "$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])"; "Print the given value into a string."; set_task_perms(caller_perms()); value = args[1]; if (length(args) < 2) quote_strings = 0; list_depth = 1; else quote_strings = args[2]; if (length(args) < 3) list_depth = 1; else list_depth = args[3]; endif endif if (typeof(value) == LIST) if (value) if (list_depth) result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1)); for v in (listdelete(value, 1)) $command_utils:suspend_if_needed(0); result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1)); endfor return result + "}"; else return "{...}"; endif else return "{}"; endif elseif (quote_strings) if (typeof(value) == STR) result = "\""; while (q = (index(value, "\"") || index(value, "\\"))) $command_utils:suspend_if_needed(0); if (value[q] == "\"") q = min(q, index(value + "\\", "\\")); endif result = (((result + value[1..q - 1]) + "\\") + value[q]); value = value[q + 1..length(value)]; endwhile return (result + value) + "\""; elseif (typeof(value) == ERR) return $code_utils:error_name(value); else return tostr(value); endif else return tostr(value); endif . #20:56 ":end_expression(string[,stop_at])"; " assumes string starts with an expression; returns the index of the last char in expression or 0 if string appears not to be an expression. Expression ends at any character from stop_at which occurs at top level."; string = args[1]; stop_at = {@args, " "}[2]; gone = 0; paren_stack = ""; inquote = 0; search = (top_level_search = (("[][{}()\"" + strsub(stop_at, "]", "")) + "]")); paren_search = "[][{}()\"]"; while (m = match(string, search)) char = string[m[1]]; string[1..m[2]] = ""; gone = (gone + m[2]); if (char == "\"") "...skip over quoted string..."; char = "\\"; while (char == "\\") if (!(m = match(string, "%(\\.?%|\"%)"))) return 0; endif char = string[m[1]]; string[1..m[2]] = ""; gone = (gone + m[2]); endwhile elseif (index("([{", char)) "... push parenthesis..."; paren_stack[1..0] = char; search = paren_search; elseif (i = index(")]}", char)) if (paren_stack && ("([{"[i] == paren_stack[1])) "... pop parenthesis..."; paren_stack[1..1] = ""; search = (paren_stack ? paren_search | top_level_search); else "...parenthesis mismatch..."; return 0; endif else "... stop character ..."; return gone - 1; endif endwhile return (!paren_stack) && (gone + length(string)); . #20:57 ":first_word(string) => {first word, rest of string} or {}"; rest = args[1]; "...trim leading blanks..."; rest[1..match(rest, "^ *")[2]] = ""; if (!rest) return {}; endif quote = 0; token = ""; pattern = " +%|\\.?%|\""; while (m = match(rest, pattern)) "... find the next occurence of a special character, either"; "... a block of spaces, a quote or a backslash escape sequence..."; char = rest[m[1]]; token = (token + rest[1..m[1] - 1]); if (char == " ") rest[1..m[2]] = ""; return {token, rest}; elseif (char == "\"") "... beginning or end of quoted string..."; "... within a quoted string spaces aren't special..."; pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\""); elseif (m[1] < m[2]) "... char has to be a backslash..."; "... include next char literally if there is one"; token = (token + rest[m[2]]); endif rest[1..m[2]] = ""; endwhile return {token + rest, ""}; . #20:58 ":common(first,second) => length of longest common prefix"; first = args[1]; second = args[2]; r = min(length(first), length(second)); l = 1; while (r >= l) h = ((r + l) / 2); if (first[l..h] == second[l..h]) l = (h + 1); else r = (h - 1); endif endwhile return r; . #20:59 "wr_utils:title_list/title_listc(<obj-list>[, @<args>)"; "Creates an english list out of the titles of the objects in <obj-list>. Optional <args> are passed on to $string_utils:english_list."; "title_listc uses :titlec() for the first item."; titles = $list_utils:map_verb(args[1], "title"); if (verb[length(verb)] == "c") if (titles) titles[1] = args[1][1]:titlec(); elseif (length(args) > 1) args[2] = $string_utils:capitalize(args[2]); else args = listappend(args, "Nothing"); endif endif return $string_utils:english_list(titles, @args[2..length(args)]); . #20:60 "name_and_number(object [,sepr]) => \"ObjectName (#object)\""; "Return name and number for object. Second argument is optional separator (for those who want no space, use \"\")"; what = args[1]; sepr = ((length(args) > 1) ? args[2] | " "); name = (valid(what) ? what.name | {"<invalid>", "$nothing", "$ambiguous_match", "$failed_match"}[1 + (what in {#-1, #-2, #-3})]); return tostr(name, sepr, "(", what, ")"); . #20:61 ":name_and_number_list(object|list-of-objects[, @english-list-args])"; "construct a list of the given objects in the form \"Munchkin (#xxx)\". See $string_utils:english_list for the meanings of the optional english-list-args."; nnlist = {}; for o in ((typeof(objects = args[1]) == LIST) ? objects | {objects}) nnlist = {@nnlist, this:nn(o)}; endfor return this:english_list(nnlist, @listdelete(args, 1)); . #20:62 "Copied from string utilities (#20):columnize by Rog (#4292) Sun Dec 20 22:59:33 1992 PST"; "columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'."; items = args[1]; n = args[2]; width = ((length(args) >= 3) ? args[3] | 79); height = (((length(items) + n) - 1) / n); items = {@items, @$list_utils:make((height * n) - length(items), "")}; colwidths = {}; for col in [1..n - 1] colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n)); endfor result = {}; for row in [1..height] line = tostr(items[row]); for col in [1..n - 1] line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]); endfor $command_utils:suspend_if_needed(0); result = listappend(result, line[1..min(length(line), width)]); endfor return result; . #20:63 ":a_or_an(<noun>) => \"a\" or \"an\""; "To accomodate personal variation (e.g., \"an historical book\"), a player can override this by having a personal a_or_an verb. If that verb returns 0 instead of a string, the standard algorithm is used."; noun = args[1]; if ($object_utils:has_verb(player, "a_or_an") && ((custom_result = player:a_or_an(noun)) != 0)) return custom_result; endif if (noun in this.use_article_a) return "a"; endif if (noun in this.use_article_an) return "an"; endif a_or_an = "a"; if (noun != "") if (index("aeiou", noun[1])) a_or_an = "an"; "unicycle, unimplemented, union, united, unimpressed, unique"; if ((((noun[1] == "u") && (length(noun) > 2)) && (noun[2] == "n")) && ((index("aeiou", noun[3]) == 0) || (((noun[3] == "i") && (length(noun) > 3)) && (index("aeioubcghqwyz", noun[4]) || ((length(noun) > 4) && index("eiy", noun[5])))))) a_or_an = "a"; endif endif endif return a_or_an; "Ported by Mickey with minor tweaks from a Moo far far away."; "Last modified Sun Aug 1 22:53:07 1993 EDT by BabyBriar (#2)."; . #20:64 "index_all(string,target) -- returns list of positions of target in string."; "Usage: $string_utils:index_all(<string,pattern>)"; " $string_utils:index_all(\"aaabacadae\",\"a\")"; if (length(args) != 2) return E_ARGS; elseif ((typeof(args[1]) != STR) || typeof(args[2] != STR)) return E_TYPE; else line = args[1]; pattern = args[2]; where = {}; place = -1; length = length(line); next = 0; while ((place = index(line[next + 1..length], pattern)) != 0) where = {@where, place + next}; next = (((place + next) + length(pattern)) - 1); endwhile return where; endif . #20:65 "Copied from Puff (#1449):match_stringlist Tue Oct 19 08:18:13 1993 PDT"; "$string_utils:match_stringlist(string, {list of strings})"; "The list of strings should be just that, a list of strings. The first string is matched against the list of strings."; "If it exactly matches exactly one of them, the index of the match is returned. If it exactly matches more than one of them, $ambiguous_match is returned."; "If there are no exact matches, then partial matches are considered, ones in which the given string is a prefix of one of the strings."; "Again, if exactly one match is found, the index of that string is returned, and if more than one match is found, $ambiguous match is returned."; "Finally, if there are no exact or partial matches, then $failed_match is returned."; if (((length(args) < 2) || (args[1] == "")) || (length(args[2]) < 1)) return $nothing; endif subject = args[1]; stringlist = args[2]; matches = {}; "First check for exact matches."; for i in [1..length(stringlist)] if (subject == stringlist[i]) matches = {@matches, i}; endif endfor "Now return a match, or $ambiguous, or check for partial matches."; if (length(matches) == 1) return matches[1]; elseif (length(matches) > 1) return $ambiguous_match; elseif (length(matches) == 0) "Checking for partial matches is almost identical to checking for exact matches, but we use index(list[i], target) instead of list[i] == target to see if they match."; for i in [1..length(stringlist)] if (index(stringlist[i], subject) == 1) matches = {@matches, i}; endif endfor if (length(matches) == 1) return matches[1]; elseif (length(matches) > 1) return $ambiguous_match; elseif (length(matches) == 0) return $failed_match; endif endif . #21:0 "make_exit(spec, source, dest,[really-create-or-recycle])"; "Uses $recycler by default; supplying really-create as 0 suppresses this."; "Returns the object number as a list if successful, 0 if not."; set_task_perms(caller_perms()); spec = args[1]; source = args[2]; dest = args[3]; if (length(args) > 3) recreate_enabled = args[4]; else recreate_enabled = 1; endif if (recreate_enabled) exit = $recycler:_create($exit); else exit = create($exit); endif if (typeof(exit) == ERR) player:tell(exit); return; endif $building_utils:set_names(exit, spec); exit.source = source; exit.dest = dest; source_ok = source:add_exit(exit); dest_ok = dest:add_entrance(exit); move(exit, $nothing); via = $string_utils:from_value(setadd(exit.aliases, exit.name), 1); if (source_ok) player:tell("Exit from ", source.name, " (", source, ") to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, "."); if (!dest_ok) player:tell("However, I couldn't add ", exit, " as a legal entrance to ", dest.name, ". You may have to get its owner, ", dest.owner.name, " to add it for you."); endif return {exit}; elseif (dest_ok) player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ". However, I couldn't add ", exit, " as a legal exit from ", source.name, ". Get its owner, ", source.owner.name, " to add it for you."); return {exit}; elseif (0) "I considered using this for awhile. -- Lambda"; player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ". However, I couldn't add ", exit, " as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ". Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you."); return 0; else if (recreate_enabled) $recycler:_recycle(exit); else recycle(exit); endif player:tell("I couldn't add a new exit as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ". Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you."); return 0; endif . #21:1 "$building_utils:set_names(object, spec)"; set_task_perms(caller_perms()); object = args[1]; names = this:parse_names(args[2]); name = (names[1] || object.name); return object:set_name(name) && object:set_aliases(names[2]); . #21:2 ":recreate(object,newparent) -- effectively recycle and recreate the specified object as a child of parent. Returns true if successful."; object = args[1]; parent = args[2]; who = caller_perms(); if (!(valid(object) && valid(parent))) return E_INVARG; elseif (who.wizard) "no problemo"; elseif ((who != object.owner) || ((who != parent.owner) && (!parent.f))) return E_PERM; endif "Chparent any children to their grandparent instead of orphaning them horribly. Have to do the chparent with wizperms, in case the children are owned by others, so do this before set_task_perms."; for c in (children(object)) chparent(c, parent(object)); endfor set_task_perms(who); if ($object_utils:has_callable_verb(object, "recycle")) object:recycle(); endif chparent(object, #-1); for p in (properties(object)) delete_property(object, p); endfor for v in (verbs(object)) delete_verb(object, "0"); endfor for item in (object.contents) move(item, #-1); endfor chparent(object, parent); object.name = ""; if ($object_utils:has_verb(parent, "initialize")) object:initialize(); endif object.r = 0; object.f = 0; object.w = 0; return 1; . #21:3 "transfer_ownership(object, oldowner, newowner)"; "Transfer ownership of object from oldowner to newowner."; if (!((caller == this) || caller_perms().wizard)) return E_PERM; endif what = args[1]; if (valid(from = args[2]) && (typeof(from.owned_objects) == LIST)) from.owned_objects = setremove(from.owned_objects, what); endif if (valid(to = args[3]) && (typeof(from.owned_objects) == LIST)) to.owned_objects = setadd(to.owned_objects, what); $wiz_utils:set_owner(what, to); endif . #21:4 "$building_utils:parse_names(spec)"; "Return {name, {alias, alias, ...}} from name,alias,alias or name:alias,alias"; spec = args[1]; if (!(colon = index(spec, ":"))) aliases = $string_utils:explode(spec, ","); name = aliases[1]; else aliases = $string_utils:explode(spec[colon + 1..length(spec)], ","); name = spec[1..colon - 1]; endif return {name, $list_utils:map_arg($string_utils, "trim", aliases)}; . #21:5 cl = {$player, $room, $exit, $note, $container, $thing}; cs = {"p", "R", "E", "N", "C", "T"}; if (is_player(OBJ = args[1])) return "P"; endif while (valid(OBJ)) if (i = (OBJ in cl)) return cs[i]; endif OBJ = parent(OBJ); endwhile return " "; . #21:6 o = args[1]; if ((length(args) == 2) && args[2]) kids = 0; for k in (children(o)) $command_utils:suspend_if_needed(0); if (k.owner != o.owner) kids = 2; elseif (kids == 0) kids = 1; endif endfor "The verbs() call below might fail, but that's OK"; v = verbs(o); if (v) vstr = tostr("[", $string_utils:right(length(v), 3), "] "); else vstr = " "; endif if (o.r && o.f) r = "f"; elseif (o.r) r = "r"; elseif (o.f) r = "F"; else r = " "; endif vstr = tostr(" kK"[kids + 1], r, $building_utils:audit_object_category(o), vstr); else vstr = ""; endif if (valid(o.location)) loc = (((((o.location.owner == o.owner) ? " " | "*") + "[") + o.location.name) + "]"); elseif ($object_utils:has_property(o, "dest") && $object_utils:has_property(o, "source")) if (typeof(o.source) != OBJ) source = " <non-object> "; elseif (!valid(o.source)) source = "<invalid>"; else source = o.source.name; if (o.source.owner != o.owner) source = ("*" + source); endif endif if (typeof(o.dest) != OBJ) destin = " <non-object> "; elseif (!valid(o.dest)) destin = "<invalid>"; else destin = o.dest.name; if (o.dest.owner != o.owner) destin = ("*" + destin); endif endif srclen = ((length(source) < 20) ? length(source) | 19); destlen = ((length(destin) < 20) ? length(destin) | 19); loc = (((" " + source[1..srclen]) + "->") + destin[1..destlen]); elseif ($object_utils:isa(o, $room)) loc = ""; for x in (o.entrances) if (((((typeof(x) == OBJ) && valid(x)) && (x.owner != o.owner)) && $object_utils:has_property(x, "dest")) && (x.dest == o)) loc = (((loc + (loc ? ", " | "")) + "<-*") + x.name); endif endfor else loc = " [Nowhere]"; endif if (length(loc) > 41) loc = (loc[1..37] + "..]"); endif namelen = ((length(o.name) < 30) ? length(o.name) | 29); return tostr(vstr, $string_utils:right(o, 6), " ", $string_utils:left(o.name[1..namelen], 30), loc); . #21:7 ":do_audit(who, start, end, match)"; "audit who, with objects from start to end that match 'match'"; ":do_prospectus(...)"; "same, but with verb counts"; who = args[1]; start = args[2]; end = args[3]; match = args[4]; player:tell(tostr("Objects owned by ", who.name, " (from #", start, " to #", end, match ? " matching " + match | "", ")", ":")); count = 0; if (typeof(who.owned_objects) == LIST) for o in (who.owned_objects) $command_utils:suspend_if_needed(0); if ((tonum(o) >= start) && (tonum(o) <= end)) count = (count + this:do_audit_item(o, match, verb == "do_prospectus")); endif endfor else for i in [start..end] $command_utils:suspend_if_needed(0); count = (count + this:do_audit_item(o, match, verb == "do_prospectus")); endfor endif player:tell($string_utils:left(tostr("-- ", count, " object", (count == 1) ? "." | "s."), player:linelen() - 1, "-")); . #21:8 o = args[1]; match = args[2]; pros = args[3]; found = (match ? 0 | 1); names = {o.name, @o.aliases}; while (names && (!found)) if (index(names[1], match) == 1) found = 1; endif names = listdelete(names, 1); endwhile if (found) player:tell(this:object_audit_string(o, pros)); return 1; endif return 0; . #22:0 if ($code_utils:parse_verbref(what = args[1])) "... hey wow, I found it!..."; return {what}; else return {}; endif . #22:1 "Help facility for verbs that people have bothered to document. If the argument is a verb specification, this retrieves the code and prints any documentation lines that might be at the beginning. Returns true if the arg can actually be interpreted as a verb specification, whether or not it is a correct one."; set_task_perms(caller_perms()); if (!(spec = $code_utils:parse_verbref(args[1]))) return 0; elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1])) return 1; elseif (!(hv = $object_utils:has_verb(object, spec[2]))) return "That object does not define that verb."; elseif (typeof(verbdoc = $code_utils:verb_documentation(object = hv[1], spec[2])) == ERR) return tostr(verbdoc); elseif (typeof(info = verb_info(object, spec[2])) == ERR) return tostr(info); else objverb = tostr(object.name, "(", object, "):", strsub(info[3], " ", "/")); if (verbdoc) return {tostr("Information about ", objverb), "----", @verbdoc}; else return tostr("No information about ", objverb); endif endif . #22:2 set_task_perms(caller_perms()); if (!(spec = $code_utils:parse_verbref(args[1]))) return E_INVARG; elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1])) return E_INVARG; elseif (!(hv = $object_utils:has_verb(object, spec[2]))) return E_VERBNF; elseif (typeof(vd = $code_utils:verb_documentation(hv[1], spec[2])) != LIST) return vd; else return {tostr(";$code_utils:set_verb_documentation(", $code_utils:corify_object(hv[1]), ",", $string_utils:print(spec[2]), ",$command_utils:read_lines())"), @$command_utils:dump_lines(vd)}; endif . #23:0 if (!args) l = {}; for p in (properties(#0)) if ((p[max(1, length(p) - 5)..length(p)] == "_utils") && #0.(p).description) l = {@l, "$" + p}; endif endfor return {@pass(@args), @l}; elseif (ts = pass(@args)) return ts; elseif ((what = args[1])[1] != "$") return {}; elseif (ts = pass("$generic_" + what[2..length(what)])) return ts; elseif ((r = rindex(w = strsub(what[2..length(what)], "-", "_"), "_utils")) && ((r == (length(w) - 5)) && (valid(#0.(w)) && #0.(w).description))) return {what}; else return {}; endif . #23:1 topic = args[1]; if ((topic == (("$" + topic[2..length(topic) - 5]) + "utils")) && (valid(#0.(w = strsub(topic[2..length(topic)], "-", "_"))) && (uhelp = #0.(w):description()))) return {tostr("General information on $", w, ":"), "----", @uhelp}; else return pass(@args); endif . #23:2 if ((E_PROPNF != (text = pass(@args))) || ((args[1][1] != "$") || ((!((uprop = args[1][2..length(args[1])]) in properties(#0))) || (typeof(uobj = #0.(uprop)) != OBJ)))) return text; else udesc = uobj.description; return {tostr(";;$", uprop, ".description = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(udesc) == LIST) ? udesc | {udesc})}; endif . #24:0 text = args[1]; for i in [1..length($code_utils.error_list)] text = {@text, tostr(" ", $string_utils:left($code_utils.error_names[i], 15), $code_utils.error_list[i])}; endfor return text; . #24:1 text = args[1]; for p in ($code_utils:prepositions()) text = {@text, tostr($string_utils:space(4), p)}; endfor return text; . #26:0 ":set_programmer(victim[,mail from]) => 1 or error."; "Sets victim.programmer, chparents victim to $prog if necessary, and sends mail to $new_prog_log, mail is from optional second arg or caller_perms()."; whodunnit = caller_perms(); mailfrom = ((length(args) == 2) ? args[2] | whodunnit); if (!whodunnit.wizard) return E_PERM; elseif (!(valid(victim = args[1]) && (is_player(victim) && $object_utils:isa(victim, $player)))) return E_INVARG; elseif (victim.programmer) return E_NONE; elseif (typeof(e = (victim.programmer = 1)) == ERR) return e; else oldquota = victim.ownership_quota; if (!$object_utils:isa(victim, $prog)) if (typeof(e = chparent(victim, $prog)) == ERR) "...this isn't really supposed to happen but it could..."; player:notify(tostr("chparent(", victim, ",", $prog, ") failed: ", e)); player:notify("Check for common properties."); endif else player:notify(tostr(victim.name, " was already a child of ", parent(victim).name, " (", parent(victim), ")")); endif if ($object_utils:has_property($local, "second_char_registry") && (victim in $local.second_char_registry.secondary)) "don't increment quota for 2nd chars when programmering"; victim.ownership_quota = oldquota; else victim.ownership_quota = (oldquota + (this.default_programmer_quota - this.default_player_quota)); endif $mail_agent:send_message(mailfrom, {$new_prog_log, victim}, tostr("@programmer ", victim.name, " (", victim, ")"), tostr("I just gave ", victim.name, " a programmer bit.")); return 1; endif . #26:1 ":set_player(victim[,nochown]) => 1 or error"; "Set victim's player flag, (maybe) chown to itself, add name and aliases to $player_db."; " E_NONE == already a player,"; " E_NACC == player_db is frozen,"; " E_RECMOVE == name is unavailable"; if (!caller_perms().wizard) return E_PERM; elseif (!(valid(victim = args[1]) && $object_utils:isa(victim, $player))) return E_INVARG; elseif (is_player(victim)) return E_NONE; elseif ($player_db.frozen) return E_NACC; elseif (!$player_db:available(name = victim.name)) return E_RECMOVE; else set_player_flag(victim, 1); if ($object_utils:isa(victim, $prog)) victim.programmer = 1; else victim.programmer = $player.programmer; endif if (!{@args, 0}[2]) $wiz_utils:set_owner(victim, victim); endif $player_db:insert(name, victim); for a in (setremove(aliases = victim.aliases, name)) if (index(a, " ")) "..ignore .."; elseif ($player_db:available(a) in {this, 1}) $player_db:insert(a, victim); else aliases = setremove(aliases, a); endif endfor victim.aliases = setadd(aliases, name); return 1; endif . #26:2 ":set_owner(object,newowner[,suspendok]) does object.owner=newowner, taking care of c properties as well. This should be used anyplace one is contemplating doing object.owner=newowner, since the latter leaves ownership of c properties unchanged. (--Rog thinks this is a server bug)."; if (!valid(object = args[1])) return E_INVIND; elseif (!caller_perms().wizard) return E_PERM; elseif (!(valid(newowner = args[2]) && is_player(newowner))) return E_INVARG; endif suspendok = {@args, 0}[3]; oldowner = object.owner; object.owner = newowner; for pname in ($object_utils:all_properties(object)) if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2))) suspend(0); endif perms = property_info(object, pname)[2]; if (index(perms, "c")) set_property_info(object, pname, {newowner, perms}); endif endfor if ($object_utils:isa(oldowner, $player)) if (is_player(oldowner) && (object != oldowner)) oldowner.ownership_quota = (oldowner.ownership_quota + 1); endif if (typeof(oldowner.owned_objects) == LIST) oldowner.owned_objects = setremove(oldowner.owned_objects, object); endif endif if ($object_utils:isa(newowner, $player)) if (object != newowner) newowner.ownership_quota = (newowner.ownership_quota - 1); endif if (typeof(newowner.owned_objects) == LIST) newowner.owned_objects = setadd(newowner.owned_objects, object); endif endif return 1; . #26:3 ":set_property_owner(object,prop,newowner[,suspendok]) changes the ownership of object.prop to newowner. If the property is !c, changes the ownership on all of the descendents as well. Otherwise, we just chown the property on the object itself and give a warning if newowner!=object.owner (--Rog thinks this is a server bug that one is able to do this at all...)."; if (!caller_perms().wizard) return E_PERM; elseif (!(info = property_info(object = args[1], pname = args[2]))) "... handles E_PROPNF and invalid object errors..."; return info; elseif (!is_player(newowner = args[3])) return E_INVARG; elseif (index(info[2], "c")) if ({@args, 0}[4] / 2) "...(recursive call)..."; "...child property is +c while parent is -c??...RUN AWAY!!"; return E_NONE; else set_property_info(object, pname, listset(info, newowner, 1)); return (newowner == object.owner) || E_NONE; endif else set_property_info(object, pname, listset(info, newowner, 1)); if ((suspendok = ({@args, 0}[4] % 2)) && ((ticks_left() < 10000) || (seconds_left() < 2))) suspend(0); endif suspendok = (2 + suspendok); for c in (children(object)) this:set_property_owner(c, pname, newowner, suspendok); endfor return 1; endif . #26:4 ":unset_player(victim[,newowner]) => 1 or error"; "Reset victim's player flag, chown victim to newowner (if given), remove all of victim's names and aliases from $player_db."; if (!caller_perms().wizard) return E_PERM; elseif (!valid(victim = args[1])) return E_INVARG; elseif (!is_player(victim)) return E_NONE; endif if (length(args) >= 2) $wiz_utils:set_owner(victim, args[2]); endif victim.programmer = 0; victim.wizard = 0; set_player_flag(victim, 0); if ($player_db.frozen) player:tell("Warning: player_db is in the middle of a :load()."); endif $player_db:delete2(victim.name, victim); for a in (victim.aliases) $player_db:delete2(a, victim); endfor return 1; . #26:5 ":set_property_flags(object,prop,flags[,suspendok]) changes the permissions on object.prop to flags. Unlike a mere set_property_info, this changes the flags on all descendant objects as well. We also change the ownership on the descendent properties where necessary."; object = args[1]; pname = args[2]; flags = args[3]; suspendok = {@args, 0}[4]; perms = caller_perms(); if (!(info = property_info(object, pname))) "... handles E_PROPNF and invalid object errors..."; return info; elseif ($set_utils:difference($string_utils:char_list(flags), {"r", "w", "c"})) "...not r, w, or c?..."; return E_INVARG; elseif ((pinfo = property_info(parent(object), pname)) && (flags != pinfo[2])) "... property doesn't actually live here..."; "... only allowed to correct so that this property matches parent..."; return E_INVARG; elseif (!(perms.wizard || (info[1] == perms))) "... you have to own the property..."; return E_PERM; elseif (!(((!(c = index(flags, "c"))) == (!index(info[2], "c"))) || $perm_utils:controls(perms, object))) "... if you're changing the c flag, you have to own the object..."; return E_PERM; else if (c) set_property_info(object, pname, {object.owner, kflags = flags}); else set_property_info(object, pname, kflags = listset(info, flags, 2)); endif for kid in (children(object)) this:_set_property_flags(kid, pname, kflags, suspendok); endfor return 1; endif . #26:6 "_set_property_flags(object, pname, {owner, flags} or something+\"c\", suspendok)"; "auxiliary to :set_property_flags... don't call this directly."; if (caller != this) return E_PERM; endif if (args[4] && $command_utils:running_out_of_time(0)) suspend(0); endif object = args[1]; if (typeof(args[3]) != LIST) set_property_info(object, args[2], {object.owner, args[3]}); else set_property_info(@args[1..3]); endif for kid in (children(object)) this:_set_property_flags(@listset(args, kid, 1)); endfor . #26:7 "Generate a random password of length args[1]. Alternates vowels and consonants, for maximum pronounceability. Uses its own list of consonants which exclude F and C and K to prevent generating obscene sounding passwords."; vowels = "aeiouy"; consonants = "bdghjlmnpqrstvwxz"; len = tonum(args[1]); if (len) alt = (random(2) - 1); s = ""; for i in [1..len] s = (s + (alt ? vowels[random(6)] | consonants[random(17)])); alt = (!alt); endfor return s; else return E_INVARG; endif . #26:8 ":queued_tasks(player) => list of queued tasks for that player."; "shouldn't the server builtin should work this way? oh well"; set_task_perms(caller_perms()); if (typeof(e = set_task_perms(who = args[1])) == ERR) return e; elseif (who.wizard) tasks = {}; for t in (queued_tasks()) if (t[5] == who) tasks = {@tasks, t}; endif endfor return tasks; else return queued_tasks(); endif . #26:10 "Return 1 if args[1] is a newted player. 0 if not, or if some error. Maybe should do better in the error case. Feel free :-)"; if (!caller_perms().wizard) return E_PERM; else "return verb_code($wiz_utils, \"newt_confunc\") == verb_code(args[1], \"confunc\")"; return verb_info(args[1], "confunc")[1].wizard && (!args[1].wizard); endif . #26:11 player:notify_lines({"", $login:newt_registration_string(), ""}); set_task_perms(this); boot_player(player); . #26:12 if (!caller_perms().wizard) return E_PERM; else player:tell("Beginning initialize_owned: ", ctime()); for n in [0..tonum(max_object())] o = toobj(n); if (valid(o)) if ($object_utils:isa(owner = o.owner, $player) && (typeof(owner.owned_objects) == LIST)) owner.owned_objects = setadd(owner.owned_objects, o); endif endif $command_utils:suspend_if_needed(0); endfor player:tell("Done adding, beginning verification pass."); this:verify_owned_objects(); player:tell("Finished: ", ctime()); endif . #26:13 if (!caller_perms().wizard) return E_PERM; else for p in (players()) if (typeof(p.owned_objects) == LIST) for o in (p.owned_objects) if (((typeof(o) != OBJ) || (!valid(o))) || (o.owner != p)) p.owned_objects = setremove(p.owned_objects, o); if (((typeof(o) == OBJ) && valid(o)) && (typeof(o.owner.owned_objects) == LIST)) o.owner.owned_objects = setadd(o.owner.owned_objects, o); endif endif $command_utils:suspend_if_needed(0); endfor endif endfor endif . #26:14 ":connected_wizards() => list of currently connected wizards and players mentioned in .public_identity properties as being wizard counterparts."; wizzes = $object_utils:leaves($wiz); wlist = {}; for w in (wizzes) if (w.wizard) if (connected_seconds(w)) wlist = setadd(wlist, w); endif if (connected_seconds(w.public_identity)) wlist = setadd(wlist, w.public_identity); endif endif endfor return wlist; . #26:15 ":all_wizards() => list of all wizards and players mentioned in .public_identity properties as being wizard counterparts."; wizzes = $object_utils:leaves($wiz); wlist = {}; for w in (wizzes) if (w.wizard) if (is_player(w)) wlist = setadd(wlist, w); endif if (is_player(w.public_identity)) wlist = setadd(wlist, w.public_identity); endif endif endfor return wlist; . #26:16 ":rename_all_instances(object,oldname,newname)"; "Used to rename all instances of an unwanted verb (like recycle or disfunc)"; "if said verb is actually defined on the object itself"; if (caller_perms().wizard) found = 0; object = args[1]; objverb = args[1..2]; newname = args[3]; while (info = verb_info(@objverb)) set_verb_info(@objverb, listset(info, newname, 3)); found = 1; endwhile return found; else return E_PERM; endif . #26:17 miss = args[1]; if (!(index = (miss in this.missed_help_strings))) this.missed_help_strings = {miss, @this.missed_help_strings}; this.missed_help_counters = {{0, 0}, @this.missed_help_counters}; index = 1; endif which = (args[2] ? 2 | 1); this.missed_help_counters[index][which] = (this.missed_help_counters[index][which] + 1); . #26:18 mhs = this.missed_help_strings; cnt = this.missed_help_counters; "save values first, so subsequent changes during suspends wont affect it"; thresh = (args ? args[1] | 5); strs = {}; for i in [1..length(mhs)] $command_utils:suspend_if_needed(0); if ((cnt[i][1] + cnt[i][2]) > thresh) strs = {@strs, ((($string_utils:right(tostr(cnt[i][1]), 5) + " ") + $string_utils:right(tostr(cnt[i][2]), 5)) + " ") + mhs[i]}; endif endfor sorted = $list_utils:sort_suspended(0, strs); len = length(sorted); player:tell(" miss ambig word"); for x in [1..len] $command_utils:suspend_if_needed(0); player:tell(sorted[(len - x) + 1]); endfor player:tell(" - - - - - - - - -"); . #26:19 if (caller_perms().wizard) pass(); this.missed_help_counters = (this.missed_help_strings = {}); endif . #26:20 ":show_netwho_listing(tell,player_list)"; " prints a listing of the indicated players showing connect sites."; if (!caller_perms().wizard) return E_PERM; endif who = args[1]; if (!(unsorted = args[2])) return; endif su = $string_utils; alist = {}; footnotes = {}; nwidth = length("Player name"); for u in (unsorted) $command_utils:suspend_if_needed(0); if (u.programmer) pref = "% "; footnotes = setadd(footnotes, "prog"); else pref = " "; endif if (u in connected_players()) lctime = ctime(time() - connected_seconds(u)); where = connection_name(u); else lctime = ctime(u.last_connect_time); where = u.last_connect_place; endif name = u.name; if (length(name) > 15) name = (name[1..13] + ".."); endif u3 = {tostr(pref, u.name, " (", u, ")"), lctime[5..10] + lctime[20..24]}; nwidth = max(length(u3[1]), nwidth); where = $string_utils:connection_hostname(where); if ($login:blacklisted(where)) where = ("(*) " + where); footnotes = setadd(footnotes, "black"); elseif ($login:graylisted(where)) where = ("(+) " + where); footnotes = setadd(footnotes, "gray"); endif alist = {@alist, {@u3, where}}; endfor alist = $list_utils:sort_alist_suspended(0, alist, 3); $command_utils:suspend_if_needed(0); headers = {"Player name", "Last Login", "From Where"}; before = {0, nwidth + 3, (nwidth + length(ctime(0))) - 11}; tell1 = (" " + headers[1]); tell2 = (" " + su:space(headers[1], "-")); for j in [2..3] tell1 = (su:left(tell1, before[j]) + headers[j]); tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-")); endfor who:notify(tell1); who:notify(tell2); for a in (alist) $command_utils:suspend_if_needed(0); tell1 = a[1]; for j in [2..3] tell1 = (su:left(tell1, before[j]) + a[j]); endfor who:notify(tell1[1..min(length(tell1), 79)]); endfor if (footnotes) who:notify(""); if ("prog" in footnotes) who:notify(" % == programmer."); endif if ("black" in footnotes) who:notify("(*) == blacklisted site."); endif if ("gray" in footnotes) who:notify("(+) == graylisted site."); endif endif . #26:21 ":show_netwho_from_listing(tell,site)"; "@net-who from hoststring prints all players who have connected from that host or host substring. Substring can include *'s, e.g. @net-who from *.foo.edu."; if (!caller_perms().wizard) return E_PERM; endif tellwho = args[1]; su = $string_utils; if (!index(where = args[2], "*")) "Oh good... search for users from a site... the fast way. No wild cards."; nl = 0; bozos = {}; sites = $site_db:find_all_keys(where); while (sites) s = sites; sites = {}; for domain in (s) for b in ($site_db:find_exact(domain)) if (typeof(b) == STR) sites = setadd(sites, (b + ".") + domain); else bozos = setadd(bozos, b); nl = max(length(tostr(b, (valid(b) && is_player(b)) ? b.name | "*** recreated ***")), nl); endif endfor endfor endwhile if (bozos) tellwho:notify(tostr(su:left(" Player", nl + 7), "From")); tellwho:notify(tostr(su:left(" ------", nl + 7), "----")); for who in (bozos) st = su:left(tostr((valid(who) && is_player(who)) ? (who.programmer ? "% " | " ") + who.name | "", " (", who, ")"), nl + 7); comma = 0; if ($object_utils:isa(who, $player) && is_player(who)) for p in ({who.email_address || "*Unregistered*", @who.all_connect_places}) if (comma && (length(p) >= (78 - length(st)))) tellwho:notify(tostr(st, ",")); st = (su:space(nl + 7) + p); else st = tostr(st, comma ? ", " | "", p); endif comma = 1; $command_utils:suspend_if_needed(0); endfor else st = (st + (valid(who) ? "*** recreated ***" | "*** recycled ***")); endif tellwho:notify(st); endfor tellwho:notify(""); tellwho:notify(tostr(length(bozos), " player", (length(bozos) == 1) ? "" | "s", " found.")); else tellwho:notify(tostr("No sites matching `", where, "'")); endif else "User typed 'from'. Go search for users from this site. (SLOW!)"; howmany = 0; for who in (players()) $command_utils:suspend_if_needed(0); matches = {}; for name in (who.all_connect_places) if ((index(where, "*") && su:match_string(name, where)) || ((!index(where, "*")) && index(name, where))) matches = {@matches, name}; endif endfor if (matches) howmany = (howmany + 1); tellwho:notify(tostr(who.name, " (", who, "): ", su:english_list(matches))); endif endfor tellwho:notify(tostr(howmany || "No", " matches found.")); endif . #26:22 ":check_player_request(name [,email [,connection]])"; " check if the request for player and email address is valid;"; " return empty string if it valid, or else a string saying why not."; " The result starts with - if this is a 'send email, don't try again' situation."; ":check_reregistration(name, email, connection)"; " name is ignored, only check the 'email' parts"; if (!caller_perms().wizard) return E_PERM; "accesses registration information -- wiz only"; endif name = args[1]; if (verb == "check_reregistration") "don't check player name"; elseif (!name) return "A blank name isn't allowed."; elseif (name == "<>") return "Names with angle brackets aren't allowed."; elseif (index(name, " ")) return "Names with spaces are not allowed. Use dashes or underscores."; elseif (match(name, "^<.*>$")) return tostr("Try using ", name[2..length(name)], " instead of ", name, "."); elseif ($player_db.frozen) return "New players cannot be created at the moment, try again later."; elseif (!$player_db:available(name)) return ("The name '" + name) + "' is not available."; elseif ($login:_match_player(name) != $failed_match) return ("The name '" + name) + "' doesn't seem to be available."; endif if (length(args) == 1) "no email address supplied."; return ""; endif address = args[2]; if ($registration_db:suspicious_address(address)) return "-There has already been a character with that or a similar email address."; endif if (reason = $network:invalid_email_address(address)) return reason; endif parsed = $network:parse_address(address); if ($registration_db:suspicious_userid(parsed[1])) return tostr("-Automatic registration from an account named ", parsed[1], " is not allowed."); endif connection = ((length(args) > 2) ? args[3] | parsed[2]); if ((connection[max(length(connection) - 2, 1)..length(connection)] == ".uk") && (parsed[2][1..3] == "uk.")) return tostr("Addresses must be in internet form. Try ", parsed[1], "@", $string_utils:from_list($list_utils:reverse($string_utils:explode(parsed[2], ".")), "."), "."); elseif (match(connection, "^[0-9.]+$")) return "-The system cannot resolve the name of the system you're connected from."; elseif ((a = $network:local_domain(connection)) != (b = $network:local_domain(parsed[2]))) return tostr("-The connection is from '", a, "' but the mail address is '", b, "'; these don't seem to be the same place."); elseif ($login:spooflisted(parsed[2])) return tostr("-Automatic registration is not allowed from ", parsed[2], "."); endif return ""; . #26:23 "create a player named NAME with email address ADDRESS; return {object, password}."; "assumes $wiz_utils:check_player_request() has been called and it passes."; if (!caller_perms().wizard) return E_PERM; endif name = args[1]; address = args[2]; new = create($player_class, $nothing); new.name = name; new.aliases = {name}; new.password = crypt(password = $wiz_utils:random_password(6)); new.last_connect_time = $maxint; "Last disconnect time is creation time, until they login."; new.last_disconnect_time = time(); new.ownership_quota = $wiz_utils.default_player_quota; if (!(ERR = $wiz_utils:set_player(new))) return player:tell("An error, ", ERR, " occurred while trying to make ", new, " a player. The database is probably inconsistent."); endif new.email_address = address; $registration_db:add(new, address, @args[3..length(args)]); move(new, $player_start); new.programmer = $player_class.programmer; return {new, password}; . #26:24 ":send_new_player_mail(preface, name, address, character#, password)"; " used by $wiz:@make-player and $guest:@request"; if (!caller_perms().wizard) return E_PERM; endif preface = args[1]; name = args[2]; address = args[3]; new = args[4]; password = args[5]; msg = {preface}; msg = {@msg, tostr("A character has been created, with name \"", name, "\" and password \"", password, "\". (Passwords are case sensitive.)")}; msg = {@msg, tostr($network.moo_name, " is at ", $network.site, ", port ", $network.port, ".")}; msg = {@msg, "Read the help if you haven't used MOO before. A tutorial available through the @tutorial command. Try paging the character HELP if you can't find what you need in the help system or tutorial."}; msg = {@msg, "A programmer's manual and various other pieces of documentation are available via ftp from ", " parcftp.xerox.com, directory /pub/MOO"}; msg = {@msg, "Keep your password secure; do not let anyone else connect as you. Remember, you are responsible for what your character does. If you no longer want your character, do not give it to anyone else. You can change your password after you connect with the @password command."}; msg = {@msg, "After you connect, type `help manners' in order to see the policy on the code of conduct expected."}; msg2 = {}; for x in (msg) msg2 = {@msg2, "", @$generic_editor:fill_string(x, 75)}; endfor return $network:sendmail(address, (("Your " + $network.moo_name) + " character, ") + name, "Reply-to: " + $login.registration_address, @msg2); . #26:25 "do_maker_player(name,email,[comment])"; "Common code for @make-player"; "If no password is given, generates a random password for the player."; "Email-address is stored in $registration_db and on the player object."; if (!caller_perms().wizard) return E_PERM; endif name = args[1]; email = args[2]; comments = $string_utils:from_list(args[3..length(args)], " "); reason = $wiz_utils:check_player_request(name, email); if (others = $registration_db:find_exact(email)) player:notify(email + " is the registered address of the following characters:"); for x in (others) player:notify(tostr(valid(x[1]) ? x[1].name | "<recycled>", (valid(x[1]) && (!is_player(x[1]))) ? " {nonplayer}" | "", " (", x[1], ") ", (length(x) > 1) ? ("[" + tostr(@x[2..length(x)])) + "]" | "")); endfor if (!reason) reason = "Already registered."; endif endif if (reason) player:notify(reason); if (!$command_utils:yes_or_no("Create character anyway? ")) player:notify("Okay."); return; endif endif new = $wiz_utils:make_player(name, email, comments); player:notify(tostr(name, " (", new[1], ") created with password `", new[2], "' for ", email, comments ? (" [" + comments) + "]" | "")); $mail_agent:send_message(player, $new_player_log, tostr(name, " (", new[1], ")"), tostr(email, comments ? " " + comments | "")); if ($network.active) if ($command_utils:yes_or_no(("Send email to " + email) + " with password? ")) player:notify(tostr("Sending the password to ", email, ".")); if ((result = $wiz_utils:send_new_player_mail(tostr("From ", player.name, "@", $network.moo_name, ":"), name, email, new[1], new[2])) == 0) player:notify(tostr("Mail sent successfully to ", email, ".")); else player:tell("Cannot send mail: ", result); endif else player:notify("Okay."); endif else player:notify("Sorry, the network isn't active."); endif . #26:26 "do_register(name, email_address [,comments])"; "change player's email address."; if (!caller_perms().wizard) return E_PERM; endif whostr = args[1]; email = args[2]; comments = $string_utils:from_list(args[3..length(args)]); whostr = args[1]; who = $string_utils:match_player(whostr); if ($command_utils:player_match_failed(who, whostr)) return; endif if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who))) player:notify(tostr("Must be a full name or an object number: ", who.name, "(", who, ")")); return; endif if (reason = $network:invalid_email_address(email)) player:notify(reason); if (!$command_utils:yes_or_no("Register anyway?")) return player:notify("re-registration aborted."); endif endif if (comments) $registration_db:add(who, email, comments); else $registration_db:add(who, email); endif old = who.email_address; who.email_address = email; player:notify(tostr(who.name, " (", who, ") formerly ", old ? old | "unregistered", ", registered at ", email, ". ", comments ? (" [" + comments) + "]" | "")); . #26:27 "do_new_password(who, [password])"; if (!caller_perms().wizard) return E_PERM; endif whostr = args[1]; who = $string_utils:match_player(whostr); if ($command_utils:player_match_failed(who, whostr)) return; endif if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who))) player:notify(tostr("Must be a full name or an object number: ", who.name, "(", who, ")")); return; endif whostr = $string_utils:nn(who); player:notify(tostr("About to change password for ", whostr, ". Old encrypted password is \"", who.password, "\"")); if ((length(args) > 1) && (password = args[2])) password = args[2]; else password = $wiz_utils:random_password(6); endif who.password = crypt(password); player:notify(tostr(whostr, " new password is `", password, "'.")); if (!who.email_address) player:notify(tostr(whostr, " doesn't have a registered email_address, cannot mail password; tell them some some other way.")); elseif ((who.last_connect_time == $maxint) && $command_utils:yes_or_no(tostr(who.name, " has never logged in. Send mail with the password as though this were a new player request?"))) if ((result = $wiz_utils:send_new_player_mail(tostr("From ", player.name, "@", $network.moo_name, ":"), who.name, who.email_address, who, password)) == 0) player:tell("Mail sent."); else player:tell("Trouble sending mail: ", result); endif elseif ($command_utils:yes_or_no(tostr("Email new password to ", whostr, "?"))) player:notify("Sending the password via email."); if ((result = $network:sendmail(who.email_address, ("Your " + $network.moo_name) + " password", ("The password for your " + $network.moo_name) + " character:", " " + whostr, "has been changed. The new password is:", " " + password, "", "Please note that passwords are case sensitive.")) == 0) player:tell("Mail sent."); else player:tell("Trouble sending mail: ", result); endif else player:tell("No mail sent."); endif . #27:0 return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM; . #27:1 ":add(player,site)"; if (!caller_perms().wizard) return E_PERM; endif who = args[1]; domain = args[2]; if (this:domain_literal(domain)) "... just enter it..."; l = this:find_exact(domain); if (l == $failed_match) this:insert(domain, {who}); elseif (!(who in l)) this:insert(domain, setadd(l, who)); endif else "...an actual domain name; add player to list for that domain..."; "...then add domain itself to list for the next larger domain; repeat..."; "... Example: domain == foo.bar.edu: "; "... enter #who on foo.bar.edu list"; "... enter `foo' on bar.edu list"; "... enter `bar' on edu list"; if (!(dot = index(domain, "."))) dot = (length(domain) + 1); domain = tostr(domain, ".", this.domain); endif prev = who; while ($failed_match == (l = this:find_exact(domain))) this:insert(domain, {prev}); if (dot) prev = domain[1..dot - 1]; domain = domain[dot + 1..length(domain)]; else return; endif dot = index(domain, "."); endwhile if (!(prev in l)) this:insert(domain, {@l, prev}); endif return; endif . #27:2 ":load([start]) -- reloads site_db with the connection places of all players."; "This routine calls suspend() if it runs out of time."; "WIZARDLY"; "...needs to be able to read .all_connect_places"; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; endif plist = players(); if (!args) this:clearall(); elseif (i = (args[1] in plist)) plist[1..i - 1] = {}; else return E_INVARG; endif for p in (plist) if (valid(p) && (is_player(p) && (!$object_utils:isa(p, $guest)))) "... player may be recycled or toaded during the suspend(),..."; "... guests login from everywhere..."; for c in (p.all_connect_places) this:add(p, c); if ($command_utils:running_out_of_time()) player:tell("...", p); suspend(0); endif endfor endif endfor . #27:3 ":domain_literal(string)"; " => true iff string is a domain literal (i.e., numeric IP address)."; if (10 <= (len = length(hnum = strsub(args[1], ".", "")))) return tonum(hnum[1..9]) && tonum(hnum[6..len]); else return tonum(hnum); endif "SLEAZY CODE ALERT"; "... what I wanted to do was return tonum(strsub(args[1],\".\",\"\"))"; "... but on a 32-bit machine, this has a 1 in 4294967296 chance of failing"; "... (e.g., on \"42.94.967.296\", though I'll grant this particular example"; "... entails some very strange subnetting on net 42, to say the least)."; "... So we do something that is guaranteed to work so long as internet"; "... addresses stay under 32 bits --- a while yet..."; ""; "... As soon as we're sure match() is working, this will become a one-liner:"; return match(args[1], "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+"); . #27:4 if (caller_perms().wizard) pass(); this:clearall(); this.domain = "localdomain"; endif . #28:0 "sin(x) -- given x in degrees, sin(x) will return the value of the sine"; "function at x times 10000"; x = (((args[1] + 45) % 360) - 45); if (x < 0) return -this:sin(-x); elseif (x > 225) return -this:xcos(x - 270); elseif (x > 135) return -this:xsin(x - 180); elseif (x > 45) return this:xcos(x - 90); else return this:xsin(x); endif . #28:1 "cos(x) -- given x in degrees, cos(x) will return cosine evaluated at x"; "times 10000"; return this:sin(90 - args[1]); . #28:2 "tan(x) -- given x in degrees, tan(x) will calculate the tangent at x"; "times 10000"; return (this:sin(args[1]) * 10000) / this:cos(args[1]); . #28:3 "xsin(x) -- calculates the taylor approximation for the sine function"; x = args[1]; if ((x * x) > this.taylor) return ((this:xsin(x / 2) * this:xcos((x + 1) / 2)) + (this:xsin((x + 1) / 2) * this:xcos(x / 2))) / 10000; else return (x * (17453000 - ((x * x) * 886))) / 100000; endif . #28:4 "xcos(x) -- calculates the taylor approximation for the cosine function"; x = args[1]; if ((x * x) > this.taylor) return ((this:xcos(x / 2) * this:xcos((x + 1) / 2)) - (this:xsin(x / 2) * this:xsin((x + 1) / 2))) / 10000; else return (1000000000 - ((x * x) * (152309 + ((4 * x) * x)))) / 100000; endif . #28:5 "factorial(n) -- returns n factorial for 0 <= n (<= 12)."; if ((number = args[1]) < 0) return E_INVARG; endif fact = 1; for i in [2..number] fact = (fact * i); endfor return fact; . #28:6 "pow(x,n) -- returns x raised to the nth power. n must be >= 0."; if ((power = args[2]) < 0) return E_INVARG; endif n = args[1]; if (power % 2) ret = n; else ret = 1; endif while (power = (power / 2)) n = (n * n); if (power % 2) ret = (ret * n); endif endwhile return ret; . #28:7 "fibonacci(n) -- calculates the fibonacci numbers to the nth term"; "and returns them in a list. n must be >= 0."; x0 = 0; x1 = 1; if ((n = args[1]) < 0) return E_INVARG; elseif (n == 0) return {x0}; else x = {x0, x1}; for i in [2..n] len = length(x); x = {@x, x[len - 1] + x[len]}; endfor return x; endif . #28:8 "geometric(x,n) -- calculates the value of the geometric series at x to "; "the nth term. i.e., approximates 1/(1-x) when |x| < 1. this, of course,"; "is impossible in MOO, but someone may find it useful in some way."; "n defaults to 5. n must be >= 0."; n = args[1]; order = ((length(args) > 1) ? args[2] | 5); x = 1; for i in [1..order] x = (x + this:pow(n, i)); endfor return x; . #28:9 "divmod(n,d) => {q,r} such that n = dq + r"; " handles negative numbers correctly 0<=r<d if d>0, -d<r<=0 if d<0."; n = args[1]; d = args[2]; r = (((n % d) + d) % d); q = ((n - r) / d); return {q, r}; . #28:10 "combinations(n,r) -- returns the number of ways one can choose r"; "objects from n distinct choices."; "C(n,r) = n!/[r!(n-r)!]"; " overflow may occur if n>29..."; n = args[1]; r = args[2]; if (0 > (r = min(r, n - r))) return 0; else c = 1; n = (n + 1); for i in [1..r] c = ((c * (n - i)) / i); endfor return c; endif . #28:11 "permutations(n,r) -- returns the number of ways possible for one to"; "order r objects given n distinct locations."; "P(n,r) = n!/(n-r)!"; n = args[1]; r = args[2]; return this:factorial(n) / this:factorial(n - r); . #28:12 "simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- given two endpoints, a and b,"; "and the functions value at a, (a+b)/2, and b, this will calculate"; "a numerical approximation of the integral using simpson's rule."; "the answer is returned as {integer,fraction}"; point = args[1]; fcn = args[2]; return this:parts((point[2] - point[1]) * ((fcn[1] + (4 * fcn[2])) + fcn[3]), 6); . #28:13 "parts(n,q[,i]) -- returns a decomposition of n by q into integer and"; "floating point parts with i = the number of digits after the decimal."; "i defaults to 5."; "warning: it is quite easy to hit maxint which results in unpredictable"; " results"; parts = {(n = args[1]) / (q = args[2]), n % q}; i = ((length(args) > 2) ? args[3] | 5); return {parts[1], (parts[2] * this:pow(10, i)) / q}; . #28:14 return sqrt(args[1]); "sqrt(n) => largest integer <= square root of n. Uses Newton's method."; "obsolete now; left for documentation purposes."; n = args[1]; if (n < 0) return E_RANGE; elseif (n) x1 = n; while (x1 > (x2 = ((x1 + (n / x1)) / 2))) x1 = x2; endwhile return x1; else return 0; endif . #28:15 "arctan(y/x) == arctan(x,y) => angle in degrees."; if (length(args) < 2) sin = args[1]; cos = 10000; else sin = args[2]; cos = args[1]; endif if (sin < 0) return -this:arctan(cos, -sin); elseif (cos < 0) return 180 - this:arctan(-cos, sin); elseif (sin > cos) return 90 - this:arctan(sin, cos); else tan = ((sin * 10000) / cos); a = $list_utils:find_insert(this.tangents, tan - 1); if ((this.tangents[a] - tan) < (tan - {0, @this.tangents}[a])) return a; else return a - 1; endif endif . #28:16 "div(n,d) => q such that n = dq + r and (0<=r<d if d>0, -d<r<=0 if d<0)."; return this:divmod(@args)[1]; . #28:17 "A correct mod function."; "mod(n,d) => r such that n = dq + r and (0<=r<d if d>0 or -d<r<=0 if d<0)."; n = args[1]; d = args[2]; return ((n % d) + d) % d; . #28:18 "returns 10000 exp (x/10000)"; "The accuracy seems to be ~0.1% for 0<x<4"; x = args[1]; if (x < 0) z = this:(verb)(-x); #78:tell("->", x, " ", z); return (100000000 + (z / 2)) / z; elseif (x > 1000) z = this:(verb)(x / 2); if (z > 1073741823) return $maxint; "maxint for overflows"; elseif (z > 460000) z = (((z + 5000) / 10000) * z); elseif (z > 30000) z = (((((z + 50) / 100) * z) + 50) / 100); else z = (((z * z) + 5000) / 10000); endif if (x % 2) return z + ((z + 5000) / 10000); else return z; endif else return ((10000 + x) + (((x * x) + 10000) / 20000)) + ((((x * x) * x) + 300000000) / 600000000); endif . #28:19 "random(): returns a random number in the following manner:"; "random(n > 0) will return a number in the range 0 to n"; "random(n < 0) will return a number in the range n to 0"; prob = args[1]; mod = ((prob < 0) ? -1 | 1); return (mod * random(abs(prob + mod))) - mod; . #28:20 "random_range(range [,mean]): returns a random number within the given"; "range from the mean. if the mean isn't given, it defaults to 0"; "e.g., random_range(10) => -10..10"; " random_range(10,4) => -6..14"; range = args[1]; mean = ((length(args) > 1) ? args[2] | 0); return mean + (((random(2) == 1) ? -1 | 1) * this:random(range)); . #28:21 "is_prime(number) returns 1 if the number is prime or 0 if it isn't."; "of course, only positive numbers are candidates for primality."; number = args[1]; if (number == 2) return 1; elseif ((number < 2) || ((number % 2) == 0)) return 0; else choice = 3; while (((denom = (choice * choice)) <= number) && (denom > 0)) if ((seconds_left() < 2) || (ticks_left() < 25)) suspend(0); endif if ((number % choice) == 0) return 0; endif choice = (choice + 2); endwhile endif return 1; . #28:22 bl1 = this:BLFromInt(args[1]); bl2 = this:BLFromInt(args[2]); blOut = {}; for i in [1..32] blOut = {@blOut, bl1[i] && bl2[i]}; endfor return this:IntFromBL(blOut); . #28:23 bl1 = this:BLFromInt(args[1]); bl2 = this:BLFromInt(args[2]); blOut = {}; for i in [1..32] blOut = {@blOut, bl1[i] || bl2[i]}; endfor return this:IntFromBL(blOut); . #28:24 bl1 = this:BLFromInt(args[1]); bl2 = this:BLFromInt(args[2]); blOut = {}; for i in [1..32] blOut = {@blOut, bl1[i] != bl2[i]}; endfor return this:IntFromBL(blOut); . #28:25 return -(1 + args[1]); ""; "... here's what it used to be ..."; bl1 = this:BLFromInt(args[1]); blOut = {}; for i in [1..32] blOut = {@blOut, !bl1[i]}; endfor return this:IntFromBL(blOut); . #28:26 x = args[1]; l = {}; firstbit = (x < 0); if (firstbit) x = (x + $minint); endif for i in [1..31] l = {x % 2, @l}; x = (x / 2); endfor return {firstbit, @l}; . #28:27 bl = args[1]; x = 0; for l in (bl) x = (x * 2); x = (x + l); endfor return x; . #28:28 "gcd(num1,num2): find the greatest common divisor of the two numbers"; "using the division algorithm. the absolute values of num1 and num2 are"; "used without loss of generality."; num1 = abs(args[1]); num2 = abs(args[2]); max = max(num1, num2); min = min(num1, num2); if (r1 = (max % min)) while (r2 = (min % r1)) min = r1; r1 = r2; endwhile return r1; else return min; endif . #28:29 "lcm(num1,num2): find the least common multiple of the two numbers."; "we shall use the positive lcm value without loss of generality."; "since we have gcd already, we'll just use lcm*gcd = num1*num2"; num1 = abs(args[1]); num2 = abs(args[2]); return (num1 * num2) / this:gcd(num1, num2); . #28:30 "are_rel_prime(num1,num2): returns 1 if num1 and num2 are relatively"; "prime."; "since we have gcd, this is pretty easy."; if (this:gcd(args[1], args[2]) == 1) return 1; else return 0; endif . #28:31 "Call with first arg either a number or a string, being the number"; "desired for conversion. capital letters denote values from 10-35;"; "lowercase letters from 36 to 61. Maximal base is 62."; "You will be unable to use the extra 26 lowercases as separate unless"; "you pass a nonzero fourth argument. Passing zero or none uses the"; "default value, which is to have AAAA=aaaa."; "The second and third arguments should be the base of the number and"; "the base you want it in, respectively."; "Any of the arguments can be strings or nums, but high-base numbers"; "will need to be strings. This returns a string."; "Any problems, talk to Ozymandias."; sensitive = 0; if (length(args) < 3) return E_INVARG; elseif (length(args) == 4) sensitive = tonum(args[4]); endif result = 0; thenum = tostr(args[1]); origbase = tonum(args[2]); newbase = tonum(args[3]); if ((((origbase < 2) || (newbase < 2)) || (origbase > 62)) || (newbase > 62)) return E_INVARG; endif for which in [1..length(thenum)] value = index(this.base_alphabet, thenum[which], sensitive); if ((!value) || (value > origbase)) return E_INVARG; endif result = (((result * origbase) + value) - 1); endfor thestring = ""; if (result < 0) return E_INVARG; endif while (result) if ((which = ((result % newbase) + 1)) <= length(this.base_alphabet)) thestring = (this.base_alphabet[which] + thestring); else return E_INVARG; endif result = (result / newbase); endwhile return thestring; . #28:32 "exp(x[,n]) -- calculates an nth order taylor approximation for e^x."; "n defaults to 5. Any n given must be >= 0. you need to divide the result"; "the answer will be returned as {integer part,fractional part}"; x = args[1]; n = ((length(args) > 1) ? args[2] | 5); ex = (nfact = 1); for i in [0..n - 1] j = (n - i); ex = ((ex * x) + (nfact = (nfact * j))); endfor return this:parts(ex, nfact); . #28:33 ":norm(a,b,c,d...) => sqrt(a^2+b^2+c^2+...)"; m = max(max(@args), -min(@args)); logm = length(tostr(m)); if (logm <= 4) s = 0; for a in (args) s = (s + (a * a)); endfor return sqrt(s); else factor = tonum("1" + "0000000"[1..logm - 4]); s = 0; for a in (args) a = (a / factor); s = (s + (a * a)); endfor return sqrt(s) * factor; endif . #28:34 ":sum(num, num, num ...) => Total of all arguments added together."; total = 0; for number in ((typeof(x = args[1]) == LIST) ? x | args) total = (total + number); endfor return total; . #29:0 "Returns the set union of all of the lists provided as arguments."; if (!args) return {}; endif set = args[1]; for l in (listdelete(args, 1)) for x in (l) set = setadd(set, x); endfor endfor return set; . #29:1 "Returns the set intersection of all the lists provided as arguments."; if (!args) return {}; endif max = 0; result = args[1]; for set in (listdelete(args, 1)) if (length(result) < length(set)) set1 = result; set2 = set; else set1 = set; set2 = result; endif for x in (set1) if (!(x in set2)) set1 = setremove(set1, x); endif endfor result = set1; endfor return result; . #29:2 "Usage: diff(set 1, set 2, ..., set n)"; "Returns all elements of set 1 that are not in sets 2..n"; set = args[1]; for l in (listdelete(args, 1)) for x in (l) set = setremove(set, x); endfor endfor return set; . #29:3 "True if the first list given is a superset of all subsequent lists."; "False otherwise. {} is a superset of {} and nothing else; anything is"; "a superset of {}. If only one list is given, return true."; super = (args ? args[1] | {}); for l in (listdelete(args, 1)) for x in (l) if (!(x in super)) return 0; endif endfor endfor return 1; . #29:4 "Usage: exclusive_or(set, set, ...)"; "Return the set of all elements that are in exactly one of the input sets"; "For two sets, this is the equivalent of (A u B) - (A n B)."; if (!args) return {}; endif set = (so_far = args[1]); for l in (listdelete(args, 1)) for x in (l) if (x in so_far) set = setremove(set, x); else set = setadd(set, x); endif endfor so_far = {@so_far, @l}; endfor return set; . #29:5 "Usage: diff(set 1, set 2, ..., set n)"; "Returns all elements of set 1 that are not in sets 2..n"; set = args[1]; for l in (listdelete(args, 1)) for x in (l) set = setremove(set, x); $command_utils:suspend_if_needed(0); endfor endfor return set; . #29:6 "True if the two lists given contain the same elements."; "False otherwise."; set1 = args[1]; set2 = args[2]; while (set1) elt = set1[1]; set1 = listdelete(set1, 1); if (elt in set2) set2 = setremove(set2, elt); while (elt in set2) set2 = setremove(set2, elt); endwhile while (elt in set1) set1 = setremove(set1, elt); endwhile else return 0; endif endwhile if (set2) return 0; else return 1; endif . #30:0 pass(); $prog.help = this; . #31:0 if (caller_perms().wizard) pass(); this:rm_message_seq({1, 1 + this:length_all_msgs()}); this:expunge_rmm(); this.mail_forward = {player, this}; this.mail_notify = {player}; for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"}) this.(p) = $mail_recipient.(p); endfor this.moderated = 1; else return E_PERM; endif . #31:1 if (!this:is_writable_by(caller_perms())) return E_PERM; else if (msgs = this.messages) new = (msgs[length(msgs)][1] + 1); else new = 1; endif if (rmsgs = this.messages_going) lbrm = rmsgs[length(rmsgs)][2]; new = max(new, lbrm[length(lbrm)][1] + 1); endif m = args[1]; if (index(m[4], "@programmer ") == 1) m = {m[1], toobj(args[2]), o = toobj(m[4][index(m[4], "(") + 1..index(m[4], ")") - 1]), o.name}; endif this.messages = {@msgs, {new, m}}; this.last_msg_date = m[1]; this.last_used_time = time(); return new; endif . #31:2 ":display_seq_headers(msg_seq[,cur])"; ":display_seq_full(msg_seq[,cur]) => {cur}"; if (!this:ok(caller, caller_perms())) return E_PERM; endif cur = {@args, 0}[2]; read_date = {@args, $maxint, $maxint}[3]; last = (ldate = 0); player:tell(" WHEN WHO BY"); for x in (msgs = this:messages_in_seq(args[1])) msgnum = $string_utils:right(last = x[1], 4, (cur == x[1]) ? ">" | " "); ldate = x[2][1]; if (typeof(x[2][2]) != OBJ) hdr = this:msg_summary_line(@x[2]); else hdr = tostr(ctime(ldate)[5..16], " ", $string_utils:left(tostr(x[2][4], " (", x[2][3], ")"), 30), valid(w = x[2][2]) ? w.name | "??", " (", x[2][2], ")"); endif player:tell(msgnum, (ldate > read_date) ? ":+ " | ": ", hdr); $command_utils:suspend_if_needed(0); endfor if (verb == "display_seq_full") return {last, ldate}; else player:tell("----+"); endif . #31:3 ":from_msg_seq(object or list[,mask])"; " => msg_seq of messages from any of these senders"; if (!this:ok(caller, caller_perms())) return E_PERM; endif if (typeof(plist = args[1]) != LIST) plist = {plist}; endif i = 1; fseq = {}; mask = {@args, {1}}[2]; for msg in (this.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) if (msg[2][2] in plist) fseq = $seq_utils:add(fseq, i, i); endif else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or ")); . #31:4 ":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people"; if (!this:ok(caller, caller_perms())) return E_PERM; endif if (typeof(plist = args[1]) != LIST) plist = {plist}; endif i = 1; fseq = {}; mask = {@args, {1}}[2]; for msg in (this.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) if (msg[2][3] in plist) fseq = $seq_utils:add(fseq, i, i); endif else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(plist, "no one", " or ")); . #31:5 ":%to_msg_seq/subject_msg_seq(string or list of strings[,mask])"; " => msg_seq of messages containing one of strings in the to line"; if (!this:ok(caller, caller_perms())) return E_PERM; endif if (typeof(nlist = args[1]) != LIST) nlist = {nlist}; endif i = 1; fseq = {}; mask = {@args, {1}}[2]; for msg in (this.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) if (msg[2][4] in nlist) fseq = $seq_utils:add(fseq, i, i); endif else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(nlist, "no one", " or ")); . #31:6 return this.name + " doesn't understand %%from:"; . #32:0 "WIZARDLY"; if (args) "...check for an exact match first..."; search = args[1]; if (property_info(parent(this), search)) if (property_info(this, " " + search)) return {search}; endif elseif (property_info(this, search)) return {search}; endif "...search for partial matches, allowing for"; "...confusion between topics that do and don't start with @, and"; ".. confusion between - and _ characters."; props = properties(this); topics = {}; if (search[1] == "@") search = search[2..length(search)]; endif search = strsub(search, "-", "_"); if (!search) "...don't try searching for partial matches if the string is empty or @"; "...we'd get *everything*..."; return {}; endif for prop in (props) if (((i = index(strsub(prop, "-", "_"), search)) == 1) || ((i == 2) && index(" @", prop[1]))) topics = {@topics, (prop[1] == " ") ? prop[2..length(prop)] | prop}; endif endfor return topics; else "...return list of all topics..."; props = setremove(properties(this), ""); for p in ($object_utils:all_properties(parent(this))) if (i = ((" " + p) in props)) props = {p, @listdelete(props, i)}; endif endfor return props; endif . #32:1 "WIZARDLY"; topic = args[1]; dblist = {@args, {}}[2]; text = (this.(topic) || this.(" " + topic)); if (typeof(text) == LIST) if (text && (text[1] == (("*" + (vb = strsub(text[1], "*", ""))) + "*"))) text = this:(vb)(listdelete(text, 1), dblist); endif endif return text; . #32:2 ":sort_topics(list_of_topics) -- sorts the given list of strings, assuming that they're help-system topic names"; buckets = "abcdefghijklmnopqrstuvwxyz"; keys = (names = $list_utils:make(length(buckets) + 1, {})); for name in (setremove(args[1], "")) key = (index(".@", name[1]) ? name[2..length(name)] + " " | name); k = (index(buckets, key[1]) + 1); bucket = keys[k]; i = $list_utils:find_insert(bucket, key); keys[k] = listinsert(bucket, key, i); names[k] = listinsert(names[k], name, i); $command_utils:suspend_if_needed(0); endfor return $list_utils:append(@names); . #32:3 ":columnize(@list_of_strings) -- prints the given list of strings in 4 columns."; sorted = {@args, "", "", ""}; n = (length(sorted) / 4); su = $string_utils; index = {}; for i in [1..n] index = {@index, tostr(su:left(sorted[i], 20), su:left(sorted[i + n], 20), su:left(sorted[i + (2 * n)], 20), sorted[i + (3 * n)])}; $command_utils:suspend_if_needed(0); endfor return index; . #32:4 "{\"*forward*\", topic, @rest} => text for topic from this help db."; "{\"*pass*\", topic, @rest} => text for topic from next help db."; "In both cases the text of @rest is appended. "; "@rest may in turn begin with a *<verb>*"; text = args[1]; dblist = {@args, {}}[2]; if (verb == "forward") first = this:get_topic(text[1], dblist); elseif ((result = $code_utils:help_db_search(text[1], dblist)) && ((db = result[1]) != $ambiguous_match)) first = db:get_topic(result[2], dblist[(db in dblist) + 1..length(dblist)]); else first = {}; endif if (2 <= (len = length(text))) if (text[2] == (("*" + (vb = strsub(text[2], "*", ""))) + "*")) return {@first, @this:(vb)(text[3..len], dblist)}; else return {@first, @text[2..len]}; endif else return first; endif . #32:5 "{\"*subst*\", @text} => text with the following substitutions:"; " \"...%[expr]....\" => \"...\"+value of expr (assumed to be a string)+\"....\""; " \"%;expr\" => @(value of expr (assumed to be a list of strings))"; newlines = {}; for old in (args[1]) new = ""; bomb = 0; while ((prcnt = index(old, "%")) && (prcnt < length(old))) new = (new + old[1..prcnt - 1]); code = old[prcnt + 1]; old = old[prcnt + 2..length(old)]; if (code == "[") prog = ""; while ((b = index(old + "]", "]")) > (p = index(old + "%", "%"))) prog = ((prog + old[1..p - 1]) + old[p + 1]); old = old[p + 2..length(old)]; endwhile prog = (prog + old[1..b - 1]); old = old[b + 1..length(old)]; value = $no_one:eval_d(prog); if (value[1]) new = tostr(new, value[2]); else new = tostr(new, $string_utils:print(value[2])); bomb = 1; endif elseif ((code != ";") || new) new = ((new + "%") + code); else value = $no_one:eval_d(old); if (value[1] && (typeof(r = value[2]) == LIST)) newlines = {@newlines, @r[1..length(r) - 1]}; new = tostr(r[length(r)]); else new = tostr(new, $string_utils:print(value[2])); bomb = 1; endif old = ""; endif endwhile if (bomb) newlines = {@newlines, new + old, tostr("@@@ Helpfile alert: Previous line is messed up; notify ", this.owner.wizard ? "" | tostr(this.owner.name, " (", this.owner, ") or "), "a wizard. @@@")}; else newlines = {@newlines, new + old}; endif endfor return newlines; . #32:6 "{\"*index*\" [, title]}"; "This produces a columnated list of topics in this help db, headed by title."; $command_utils:suspend_if_needed(0); title = (args[1] ? args[1][1] | tostr(this.name, " (", this, ")")); su = $string_utils; return {"", title, su:from_list($list_utils:map_arg(su, "space", su:explode(title), "-"), " "), @this:columnize(@this:sort_topics(this:find_topics()))}; . #32:7 pass(@args); if ($perm_utils:controls(caller_perms(), this)) this.r = 1; this.f = 0; endif . #32:8 "{\"*verbdoc*\", \"object\", \"verbname\"} use documentation for this verb"; set_task_perms(this.owner); if (!valid(object = $string_utils:match_object(args[1][1], player.location))) return E_INVARG; elseif (!(hv = $object_utils:has_verb(object, vname = args[1][2]))) return E_VERBNF; else return $code_utils:verb_documentation(hv[1], vname); endif . #32:9 if (typeof(text = this.(fulltopic = args[1])) == ERR) return text; else return {tostr(";;", $code_utils:corify_object(this), ".(", $string_utils:print(fulltopic), ") = $command_utils:read_lines()"), @$command_utils:dump_lines(text)}; endif . #33:0 player:tell("Sorry, but guest characters are not allowed to change their passwords."); . #33:1 if (!caller_perms().wizard) return; endif player = this; this:notify(tostr("Sorry, but you've been here for ", $string_utils:from_seconds(connected_seconds(this)), " and someone else wants to be a guest now. Feel free to come back", @$login:player_creation_enabled(player) ? {" or even create your own character if you want..."} | ($login.registration_address ? {" or send mail to ", $login.registration_address, " to obtain a character of your own."} | {"."}))); fork (0) oldloc = this.location; move(this, #-1); move(this, this.home); "..force enterfunc to be called so that the newbie gets a room description."; if ($object_utils:isa(oldloc, $room)) oldloc:announce("In the distance you hear someone's alarm clock going off."); if (oldloc != this.location) oldloc:announce(this.name, " wavers and vanishes into insubstantial mist."); else oldloc:announce(this.name, " undergoes a wrenching personality shift."); endif endif endfork . #33:2 this:log_disconnect(); fork (0) if (this.location != this.home) this:room_announce("The housekeeper arrives to remove ", this.name, "."); move(this, this.home); endif for x in ({"paranoid", "lines", "responsible", "linelen", "linebuffer", "brief", "gaglist", "rooms", "pagelen", "current_message", "current_folder", "messages", "request"}) if ($object_utils:has_property($guest, x)) clear_property(this, x); endif endfor this:set_description(this.default_description); this:set_gender(this.default_gender); for x in (this.contents) this:eject(x); endfor for x in (this.features) if (!(x in $guest.features)) this:remove_feature(x); endif endfor for x in ($guest.features) if (!(x in this.features)) this:add_feature(x); endif endfor this:clear_refusals(); for x in ($object_utils:descendants($generic_editor)) if (loc = (this in x.active)) x:kill_session(loc); endif endfor endfork pass(@args); . #33:3 "Called by #0:connect_player when this object is about to be used as the next guest character. Usually returns `this', but if for some reason some other guest character should be used, that player object is returned instead"; if (!caller_perms().wizard) "...caller is not :do_login_command; doesn't matter what we return..."; return this; elseif ($login:blacklisted($string_utils:connection_hostname(connection_name(player)))) return #-2; elseif (!(this in connected_players())) "...not logged in, no problemo..."; return this; endif longest = 900; "...guests get 15 minutes before they can be dislodged..."; candidate = #-1; free = {}; for g in (children($guest)) if (!is_player(g)) "...a toaded guest?..."; elseif (!(g in connected_players())) "...yay; found an unused guest..."; free = {@free, g}; elseif ((t = connected_seconds(g)) > longest) longest = t; candidate = g; endif endfor if (free) candidate = free[random(length(free))]; elseif (valid(candidate)) "...someone's getting bumped..."; candidate:boot(); endif return candidate; . #33:4 return; . #33:5 if ($login:player_creation_enabled(player)) player:tell("First @quit, then connect to the MOO again and, rather than doing `connect guest' do `create <name> <password>'"); else player:tell($login:registration_string()); endif . #33:6 return pass(@args); . #33:7 ":log(islogin,time,where) adds an entry to the connection log for this guest."; if (caller != this) return E_PERM; elseif (length(this.connect_log) < this.max_connect_log) this.connect_log = {args, @this.connect_log}; else this.connect_log = {args, @this.connect_log[1..this.max_connect_log - 1]}; endif . #33:8 if (valid(caller_perms()) && (caller != this)) return E_PERM; else $guest_log:enter(1, time(), $string_utils:connection_hostname(connection_name(this))); ret = pass(@args); this:tell_lines($string_utils:pronoun_sub(this.extra_confunc_msg)); return ret; endif . #33:9 if (caller != this) return E_PERM; else cname = (connection_name(this) || this.last_connect_place); $guest_log:enter(0, time(), $string_utils:connection_hostname(cname)); endif . #33:10 if (!valid(caller_perms())) player:tell("Sorry, that information is not available."); endif . #33:11 "Compute an encrypted hash of the guest's (last) connection, using 'crypt'. Basically, you can't tell where the guest came from, but it is unlikely that two guests will have the same hash"; "You can use guest:connection_name_hash(seed) as a string to identify whether two guests are from the same place."; hash = tonum(caller_perms()); host = $string_utils:connection_hostname(this.last_connect_place); for i in [1..length(host)] hash = ((hash * 14) + index($string_utils.ascii, host[i])); endfor return crypt(tostr(hash), @args); . #33:12 if (caller_perms() != this) return E_PERM; else return pass(@args); endif . #33:13 return pass(@args); . #33:14 return pass(@args); "only for setting permission"; . #33:15 "Usage: @request <name> for <email-address>"; if (player != this) return player:tell(E_PERM); endif name = dobjstr; address = iobjstr; connection = $string_utils:connection_hostname(connection_name(player)); if (this.request) return player:tell("Sorry, you appear to have already requested a character."); endif if (index(address = iobjstr, " ")) return player:notify_lines($code_utils:verb_usage()); elseif (reason = $wiz_utils:check_player_request(name, address, connection)) if (reason[1] == "-") reason = (reason[2..length(reason)] + " Please "); else reason = (reason + " Please try again, or, to register another way, "); endif player:tell(reason, " mail to ", $login.registration_address, " with the character name you want."); return; endif while (typeof(answer = $command_utils:yes_or_no(("Generally, only one character per real person is allowed. For more details, read `help multiple-characters'. Do you already have (or have you already requested) a " + $network.moo_name) + " character?")) == ERR) endwhile if (answer) return player:tell("Character request processing ended."); endif if (!$network.active) $mail_agent:send_message(this, $registration_db.registrar, "Player request", {"Player request from " + connection, ":", "", (("@make-player " + name) + " ") + address}); player:tell("Request for new character ", name, " email address '", address, "' accepted. Please be patient until the registrar gets around to it. If you don't get email within a week, please send regular email to ", $login.registration_address, "."); elseif ($player_db.frozen) player:tell("Sorry, can't create any new players right now. Try again in a few minutes."); else new = $wiz_utils:make_player(name, address); password = new[2]; new = new[1]; player:tell("Character ", name, " (", new, ") created, mailing password to ", address, "; you should get the mail very soon."); player:tell("If you do not get it, please do NOT request another character. Send regular email to ", $login.registration_address, ", with the name of the character you requested."); $mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, tostr(name, " (", new, ")"), {address, (" Automatically created at request of player from " + connection) + "."}); $wiz_utils:send_new_player_mail(tostr("A guest connected from ", connection, " at ", ctime(), " requested a character on ", $network.moo_name, " for email address ", address, "."), name, address, new, password); this.request = 1; return; endif . #33:16 if (caller_perms().wizard) this.extra_confunc_msg = ""; this.features = {}; endif . #33:17 "disallow guests from setting aliases on themselves"; if ($perm_utils:controls(caller_perms(), this)) return pass(@args); else return E_PERM; endif . #34:0 return ((this.description + " There are ") + tostr(this.entries)) + " words in the online dictionary."; . #34:1 return (this:find_exact(args[1]) != $failed_match) || (args[1] in player.dict); . #34:2 source = args[1]; data = {}; ref = $code_utils:parse_propref(source); if (ref) "User entered a prop. Deal with it."; thing = ref[1]; prop = ref[2]; thing = $string_utils:match_object(thing, player.location); if (!valid(thing)) player:tell("No such object: ", ref[1]); data = $failed_match; elseif ((!prop) || (thing.(tostr(prop)) == E_PROPNF)) player:tell("There is no such property `", prop, "' on object ", thing, "."); data = $failed_match; else data = thing.(tostr(prop)); if (typeof(data) == STR) data = {data}; endif $command_utils:suspend_if_needed(3); if (typeof(data) == ERR) player:tell("Error: ", tostr(data)); data = $failed_match; elseif (typeof(data) != LIST) player:tell("Spellchecker needs a string or list as input."); data = $failed_match; endif endif else ref = $code_utils:parse_verbref(source); if (ref) "User entered a verb. Deal with it."; thing = ref[1]; verb = ref[2]; thing = $string_utils:match_object(thing, player.location); if (!valid(thing)) player:tell("No such object: ", ref[1]); data = $failed_match; elseif (verb_info(thing, verb) == E_VERBNF) player:tell("There is no such verb `", verb, "' on object ", thing, "."); data = $failed_match; else data = verb_code(thing, verb); for i in [1..length(data)] if (!index(data[i], "\"")) data[i] = ""; else data[i] = data[i][index(data[i], "\"") + 1..length(data[i])]; data[i] = data[i][1..rindex(data[i], "\"") - 1]; foo = ""; while (index(data[i], "\"")) foo = (foo + data[i][1..index(data[i], "\"") - 1]); foo = (foo + " "); data[i] = data[i][index(data[i], "\"") + 1..length(data[i])]; data[i] = data[i][index(data[i], "\"") + 1..length(data[i])]; endwhile if (foo == "") foo = data[i]; else foo = (foo + data[i]); endif data[i] = $string_utils:trim(foo); endif endfor endif else "User entered word/phrase on command line."; data = {argstr}; endif endif for i in [1..length(data)] $command_utils:suspend_if_needed(1); if (typeof(data[i]) != STR) data[i] = ""; endif data[i] = this:strip_chars(data[i], "!@#$%^&*()_+1234567890={}[]`<>?:;,./|\"~'"); endfor return data; . #34:3 nastyword = args[1]; guesses = {}; "Transpose adjacent characters"; nastyword = (nastyword + " "); for i in [1..length(nastyword) - 1] foo = (((nastyword[1..i - 1] + nastyword[i + 1]) + nastyword[i]) + nastyword[i + 2..length(nastyword)]); foo = $string_utils:trim(foo); if (this:valid(foo)) guesses = listappend(guesses, foo); endif if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor nastyword = $string_utils:trim(nastyword); "Erase each character - check for an extra typoed character"; for i in [1..length(nastyword)] foo = (nastyword[1..i - 1] + nastyword[i + 1..length(nastyword)]); if (this:valid(foo)) guesses = listappend(guesses, foo); endif if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor "Alter one character"; for i in [1..length(nastyword)] for ii in ({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "'", "-"}) foo = ((nastyword[1..i - 1] + ii) + nastyword[i + 1..length(nastyword)]); if (this:valid(foo)) guesses = listappend(guesses, foo); endif endfor if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor "insert one character"; for i in [1..length(nastyword)] for ii in ({"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "'", "-"}) foo = ((nastyword[1..i - 1] + ii) + nastyword[i..length(nastyword)]); if (this:valid(foo)) guesses = listappend(guesses, foo); endif endfor if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor "Get some close matches from the database verbs themselves"; if ((foo = this:find_all(nastyword)) != ERR) if ((foo != $failed_match) && (foo != $ambiguous_match)) if (length(foo) < 6) for i in (foo) guesses = listappend(guesses, i); endfor endif endif endif "Clean up and go home"; guesses = $list_utils:remove_duplicates(guesses); guesses = $list_utils:sort(guesses); return guesses; . #34:4 subject = args[1]; stripped = args[2]; for i in [1..length(stripped)] if ((ticks_left() < 500) || (seconds_left() < 1)) suspend(0); endif if (stripped[i] != "'") subject = strsub(subject, stripped[i], " "); else subject = ((" " + subject) + " "); subject = strsub(subject, " '", " "); subject = strsub(subject, "' ", " "); endif endfor return subject; . #34:5 if ((ticks_left() < 1000) || (seconds_left() < 3)) suspend(0); endif return pass(@args); . #34:6 "sort({x1,x3,x2},{1,3,2}) => {x1,x2,x3}"; lst = args[1]; unsorted_keys = ((use_sorted_lst = (length(args) >= 2)) ? args[2] | lst); sorted_lst = (sorted_keys = {}); for e in (unsorted_keys) l = $list_utils:find_insert(sorted_keys, e); sorted_keys = listinsert(sorted_keys, e, l); if (use_sorted_lst) sorted_lst = listinsert(sorted_lst, lst[length(sorted_keys)], l); endif if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor return sorted_lst || sorted_keys; . #34:7 info = this.(" " + args[1]); prefix = (args[1] + info[1]); r = info[3]; for i in [1..length(branches = info[2])] for new in (this:_every_key(prefix + branches[i])) r = setadd(r, new); if ((ticks_left() < 500) || (seconds_left() < 2)) this:_suspend(0); endif endfor endfor return r; . #34:8 if (caller == this) suspend(@args); endif . #34:9 "N.B. use :add_word/:remove_word to actually change the contents of this db"; ":insert(string) -- see $generic_db:insert"; ":delete(string) -- see $generic_db:delete"; ":delete2(string) -- see $generic_db:delete2"; if (caller == this) $command_utils:suspend_if_needed(0); return pass(@args); else return E_PERM; endif . #34:10 ":add_word(string) -- adds word to the spell database"; "Returns true iff this word wasn't already there."; cp = caller_perms(); if ((caller == this) || ((cp in this.trusted) || $perm_utils:controls(cp, this))) result = this:insert(@args); result || (this.entries = (this.entries + 1)); return !result; else return E_PERM; endif . #34:11 ":remove_word(string) -- removes word from the spell database"; "Returns true iff word was actually there to be removed."; cp = caller_perms(); if ((caller == this) || ((cp in this.trusted) || $perm_utils:controls(cp, this))) result = this:delete(@args); result && (this.entries = (this.entries - 1)); return result; else return E_PERM; endif . #34:12 ":submit(word) -- add a word to this.submitted"; this.submitted = {@this.submitted, args[1]}; . #34:13 "This breaks up the argument string into words, the resulting list being obtained exactly the way the command line parser obtains `args' from `argstr'."; rest = (" " + args[1]); rlen = length(rest); spchars = " \\\""; next = {1, 0, 0}; quote = (pos = 0); toklist = {}; token = ""; while (1) if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif "Find the next special character"; for i in [1..3] next[i] = (((n = (next[i] - pos)) > 0) ? n | (index(rest, spchars[i]) || (rlen + 1))); endfor first_special = 1; for i in [2..3] if (next[i] < next[first_special]) first_special = i; endif endfor pos = next[first_special]; char = spchars[first_special]; "Add previous nonspecial characters to token"; token = (token + rest[1..pos - 1]); "Deal with special character"; if ((pos > rlen) || (char == " ")) toklist = {@toklist, token}; token = ""; while ((pos < rlen) && (rest[pos + 1] == " ")) pos = (pos + 1); endwhile if (pos >= rlen) return listdelete(toklist, 1); endif elseif ((char == "\\") && (pos < rlen)) token = (token + rest[pos = (pos + 1)]); elseif (char == "\"") quote = (!quote); next[1] = (quote ? (rlen + pos) + 1 | 0); endif rest = rest[pos + 1..rlen]; rlen = (rlen - pos); endwhile . #34:14 "$spell:purge_entire_database - a nasty verb that will zap the whole dictionary."; "usage: eval $spell:purge_entire_database() "; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif if (!player.wizard) return E_PERM; endif player:tell("WARNING: This will ERASE all the entries in the online dictionary! IF YOU ARE SURE YOU WISH TO DO THIS, TYPE `PURGE' NOW. Any other input with abort the command."); input = $command_utils:read(); if (input != "purge") player:tell("ABORTED. Database left as is."); else this:clearall_big(@args); endif . #34:15 "returns a random word from the dictionary. maybe useful for games and things"; "that need a unique word. accepts no arguments."; word = ""; while (word == "") x = random(26); y = random(26); if (seconds_left() < 2) suspend(0); endif lettera = $string_utils.alphabet[x]; letterb = $string_utils.alphabet[y]; foo = $spell:find_all(lettera + letterb); if (foo != {}) word = foo[random(length(foo))]; endif endwhile return word; . #34:16 return this.description; . #34:17 if (!caller_perms().wizard) return; endif $spell.trusted = {}; . #34:18 if (!(player in this.trusted)) player:tell("Sorry, you can't do that."); return E_PERM; endif this.submitted = {}; player:tell("$spell.submitted = {};"); . #35:0 " add(seq,start,end) => seq with range added."; "remove(seq,start,end) => seq with range removed."; " both assume start<=end."; seq = args[1]; start = args[2]; s = ((start == $minint) ? 1 | $list_utils:find_insert(seq, start - 1)); e = $list_utils:find_insert(seq, after = (args[3] + 1)); remove = (verb == "remove"); return {@seq[1..s - 1], @((s + remove) % 2) ? {start} | {}, @((e + remove) % 2) ? {after} | {}, @seq[e..length(seq)]}; . #35:1 ":contains(seq,elt) => true iff elt is in seq."; return ($list_utils:find_insert(@args) + 1) % 2; . #35:2 ":complement(seq) => the sequence containing all integers *not* in seq."; seq = args[1]; if (seq && (seq[1] == $minint)) return listdelete(seq, 1); else return {$minint, @seq}; endif . #35:3 ":union(seq1,seq2,...) => union of all sequences..."; ":intersection(seq1,seq2,...) => intersection of all sequences..."; intersect = (verb != "union"); if ({} in args) if (intersect) return {}; else args = $list_utils:setremove_all(args, {}); endif endif if ((alen = length(args)) <= 1) return args ? args[1] | (intersect ? {$minint} | {}); else if (intersect) args = $list_utils:map_arg(this, "complement", args); endif lens = {length(args[1])}; for a in (listdelete(args, 1)) lens = {@lens, length(a)}; endfor args = $list_utils:sort(args, lens); lens = $list_utils:sort(lens); for ll in [-length(lens)..-2] second = args[2]; for i in [1..length(first = args[1]) / 2] second = this:add(second, first[(2 * i) - 1], first[2 * i] - 1); endfor if (length(first) % 2) s = $list_utils:find_insert(second, (start = first[length(first)]) - 1); second = {@second[1..s - 1], @(s % 2) ? {start} | {}}; endif i = $list_utils:find_insert(lens = lens[3..-ll], slen = length(second)); lens = listinsert(lens, slen, i); args = listinsert(args[3..-ll], second, i); endfor return intersect ? this:complement(second) | second; endif . #35:4 if (!(seq = args[1])) return "empty"; endif e = tostr((seq[1] == $minint) ? "" | seq[1]); for i in [2..length(seq)] e = (e + ((i % 2) ? tostr(", ", seq[i]) | ((seq[i] == (seq[i - 1] + 1)) ? "" | tostr("..", seq[i] - 1)))); endfor return e + ((length(seq) % 2) ? ".." | ""); . #35:5 ":for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor"; if (typeof(n = args[1]) == NUM) args = listdelete(args, 1); seq = args[1]; else seq = n; n = 1; endif if (seq[1] == $minint) return E_RANGE; endif object = args[2]; vname = args[3]; args = args[4..length(args)]; for r in [1..length(seq) / 2] for i in [seq[(2 * r) - 1]..seq[2 * r] - 1] if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR) return; endif endfor endfor if (length(seq) % 2) i = seq[length(seq)]; while (1) if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR) return; endif i = (i + 1); endwhile endif . #35:6 "extract(seq,array) => list of elements of array with indices in seq."; if (alen = length(array = args[2])) e = $list_utils:find_insert(seq = args[1], 1); s = $list_utils:find_insert(seq, alen); seq = {@(e % 2) ? {} | {1}, @seq[e..s - 1], @(s % 2) ? {} | {alen + 1}}; ret = {}; for i in [1..length(seq) / 2] $command_utils:suspend_if_needed(0); ret = {@ret, @array[seq[(2 * i) - 1]..seq[2 * i] - 1]}; endfor return ret; else return {}; endif . #35:7 seq = args[1]; if (!seq) return {}; else if (length(seq) % 2) seq = {@seq, $minint}; endif l = {}; for i in [1..length(seq) / 2] for j in [seq[(2 * i) - 1]..seq[2 * i] - 1] l = {@l, j}; endfor endfor return l; endif . #35:8 ":fromlist(list) => corresponding sequence."; return this:from_sorted_list($list_utils:sort(args[1])); . #35:9 ":from_sorted_list(sorted_list) => corresponding sequence."; if (!(lst = args[1])) return {}; else seq = {i = lst[1]}; next = (i + 1); for i in (listdelete(lst, 1)) if (i != next) seq = {@seq, next, i}; endif next = (i + 1); endfor return (next == $minint) ? seq | {@seq, next}; endif . #35:10 return (seq = args[1]) ? seq[1] | E_NONE; . #35:11 return (seq = args[1]) ? ((len = length(seq)) % 2) ? $minint - 1 | (seq[len] - 1) | E_NONE; . #35:12 ":size(seq) => number of elements in seq"; " for sequences consisting of more than half of the 4294967298 available integers, this returns a negative number, which can either be interpreted as (cardinality - 4294967298) or -(size of complement sequence)"; n = 0; for i in (seq = args[1]) n = (i - n); endfor return (length(seq) % 2) ? $minint - n | n; . #35:13 ":from_string(string) => corresponding sequence or E_INVARG"; " string should be a comma separated list of numbers and"; " number..number ranges"; su = $string_utils; if (!(words = su:explode(su:strip_chars(args[1], " "), ","))) return {}; endif parts = {}; for word in (words) to = index(word, ".."); if ((!to) && su:is_numeric(word)) part = {tonum(word), tonum(word) + 1}; elseif (to) if (to == 1) start = $minint; elseif (su:is_numeric(start = word[1..to - 1])) start = tonum(start); else return E_INVARG; endif end = word[to + 2..length(word)]; if (!end) part = {start}; elseif (!su:is_numeric(end)) return E_INVARG; elseif ((end = tonum(end)) >= start) part = {start, end + 1}; else part = {}; endif else return E_INVARG; endif parts = {@parts, part}; endfor return this:union(@parts); . #35:14 ":firstn(seq,n) => first n elements of seq as a sequence."; if ((n = args[2]) <= 0) return {}; endif l = length(seq = args[1]); s = 1; while (s <= l) n = (n + seq[s]); if ((s >= l) || (n <= seq[s + 1])) return {@seq[1..s], n}; endif n = (n - seq[s + 1]); s = (s + 2); endwhile return seq; . #35:15 ":lastn(seq,n) => last n elements of seq as a sequence."; n = args[2]; if ((l = length(seq = args[1])) % 2) return {$minint - n}; else s = l; while (s) n = (seq[s] - n); if (n >= seq[s - 1]) return {n, @seq[s..l]}; endif n = (seq[s - 1] - n); s = (s - 2); endwhile return seq; endif . #35:16 ":range(start,end) => sequence corresponding to [start..end] range"; return ((start = args[1]) <= (end = args[2])) ? {start, end + 1} | {}; . #36:0 if (caller_perms().wizard) pass(); delete_verb(this, "is_readable_by"); delete_verb(this, "is_usable_by"); delete_verb(this, "mail_notify"); "...remove references to ARB..."; this:rm_message_seq({1, 1 + this:length_all_msgs()}); this:expunge_rmm(); this.mail_forward = {player, this}; this.mail_notify = {player}; for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"}) this.(p) = $mail_recipient.(p); endfor this.moderated = 1; else return E_PERM; endif . #37:0 return $gender_utils:get_conj(args[1], this); x = args[1]; len = length(x); if ((len > 3) && (rindex(x, "n't") == (len - 3))) return this:verb_sub(x[1..len - 3]) + "n't"; endif for y in (this.conjugations) if (x == y[1]) return y[2]; endif endfor for y in ({{"ches", "ch"}, {"ies", "y"}, {"sses", "ss"}, {"shes", "sh"}, {"s", ""}}) if ((len > length(y[1])) && (rindex(x, y[1]) == ((len - length(y[1])) + 1))) return x[1..len - length(y[1])] + y[2]; endif endfor return x; . #37:1 "$you:say_action(message [,who [,thing, [,where]]])."; "announce 'message' with pronoun substitution as if it were just "; " where:announce_all($string_utils:pronoun_sub(message, who, thing, where)); "; "except that who (player), dobj, and iobj get modified messages, with the appropriate use of 'you' instead of their name."; "who default player"; "thing default object that called this verb"; "where default who.location"; msg = args[1]; who = ((length(args) >= 2) ? args[2] | player); thing = ((length(args) >= 3) ? args[3] | caller); where = ((length(args) >= 4) ? args[4] | who.location); you = this; if (typeof(msg) == LIST) tell = ""; for x in (msg) tell = (tell + ((typeof(x) == STR) ? x | x[random(length(x))])); endfor else tell = msg; endif who:tell($string_utils:pronoun_sub(this:fixpos(tell, "%n"), you, thing, where)); if ($object_utils:has_callable_verb(where, "announce_all_but")) where:announce_all_but({dobj, who, iobj}, $string_utils:pronoun_sub(tell, who, thing, where)); endif if (valid(dobj) && (dobj != who)) x = dobj; dobj = you; x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%d"), who, thing, where)); dobj = x; endif if (valid(iobj) && (!(iobj in {who, dobj}))) x = iobj; iobj = you; x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%i"), who, thing, where)); iobj = x; endif . #37:2 which = (args[2] + "'s"); return strsub(strsub(args[1], which, "your"), $string_utils:uppercase(which), "Your"); . #39:0 "find(string[,n]) => datum corresponding to string with the search starting at node \" \"+string[1..n], n defaults to 0 (root node), $ambiguous_match or $failed_match"; "find_key(string[,n]) is like :find but returns the full string key rather than the associated datum. Note that if several string keys present in the db share a common prefix, :find_key(prefix) will return $ambiguous_match, but if there is a unique datum associated with all of these strings :find(prefix) will return it rather than $ambiguous_match."; "Assumes n<=length(string)"; rest = (search = args[1]); sofar = {@args, 0}[2]; prefix = search[1..sofar]; rest[1..sofar] = ""; info = this.(" " + prefix); data = ((verb == "find") ? this.data | 3); if (i = (search in info[3])) "...exact match for one of the strings in this node..."; return info[data][i]; elseif (index(info[1], rest) == 1) "...ambiguous iff there's more than one object represented in this node.."; return this:_only(prefix, data); elseif (index(rest, info[1]) != 1) "...search string doesn't agree with common portion..."; return $failed_match; elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)])) "...search string follows one of continuations leading to other nodes..."; return this:(verb)(search, nsofar); else "...search string may partially match one of the strings in this node..."; for i in [1..length(exacts = info[3])] if (index(exacts[i], search) == 1) return info[data][i]; endif endfor return $failed_match; endif . #39:1 rest = (search = args[1]); sofar = {@args, 0}[2]; prefix = search[1..sofar]; rest[1..sofar] = ""; info = this.(" " + prefix); if (i = (search in info[3])) return info[this.data][i]; elseif ((length(rest) <= (common = length(info[1]))) || (rest[1..common] != info[1])) return $failed_match; elseif (index(info[2], search[(sofar + common) + 1])) return this:find_exact(search, (sofar + common) + 1); else return $failed_match; endif . #39:2 ":find_all(string [,n=0])"; "assumes n <= length(string)"; rest = (search = args[1]); sofar = {@args, 0}[2]; prefix = search[1..sofar]; rest[1..sofar] = ""; info = this.(" " + prefix); data = ((verb == "find_all") ? this.data | 3); if (index(info[1], rest) == 1) "...return entire subtree."; return this:((data == 3) ? "_every_key" | "_every")(prefix); elseif (index(rest, info[1]) != 1) "...common portion doesn't agree."; return {}; elseif (index(info[2], rest[1 + (common = length(info[1]))])) "...matching strings are in a subnode."; return this:(verb)(search, (sofar + common) + 1); else "...matching string is in info[3]. length(rest) > common,"; "...so there will be at most one matching string."; for i in [1..length(info[3])] if (index(info[3][i], search) == 1) return {info[data][i]}; endif endfor return {}; endif . #39:3 ":_only(prefix,data) => if all strings in this node have the same datum, return it, otherwise, return $ambiguous_match."; prefix = args[1]; data = args[2]; info = this.(" " + prefix); if (data == 3) "... life is much simpler if there's no separate datum."; "... if there's more than one string here, we barf."; if (info[2] || (length(info[3]) > 1)) return $ambiguous_match; elseif (info[3]) return info[3][1]; else "..this can only happen with the root node of an empty db."; return $failed_match; endif elseif (info[2]) what = this:_only(tostr(prefix, info[1], info[2][1]), data); if (what == $ambiguous_match) return what; endif elseif (info[data]) what = info[data][1]; info[data] = listdelete(info[data], 1); else "..this can only happen with the root node of an empty db."; return $failed_match; endif for x in (info[data]) if (what != x) return $ambiguous_match; endif endfor for i in [2..length(info[2])] if (what != this:_only(tostr(prefix, info[1], info[2][i]), data)) return $ambiguous_match; endif endfor return what; . #39:4 info = this.(" " + args[1]); prefix = (args[1] + info[1]); r = $list_utils:remove_duplicates(info[4]); for i in [1..length(branches = info[2])] for new in (this:_every(prefix + branches[i])) r = setadd(r, new); endfor endfor return r; . #39:5 info = this.(" " + args[1]); prefix = (args[1] + info[1]); r = info[3]; for i in [1..length(branches = info[2])] for new in (this:_every_key(prefix + branches[i])) r = setadd(r, new); endfor endfor return r; . #39:6 ":insert([n,]string,datum) -- inserts <string,datum> correspondence into tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)."; "Assumes length(string) >= n"; "Returns {old_datum} (or 1) if there was a <string,old_datum> correspondence there before, otherwise returns 0"; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif has_datum = (this.data > 3); if (typeof(sofar = args[1]) == NUM) search = args[2]; datum = (has_datum ? args[3] | 0); else search = sofar; sofar = 0; datum = (has_datum ? args[2] | 0); endif prefix = search[1..sofar]; info = this.(" " + prefix); if (i = (search in info[3])) "... exact match ..."; if (has_datum) previous = {info[this.data][i]}; info[this.data][i] = datum; this:set_node(prefix, @info); return previous; else return 1; endif endif rest = search; rest[1..sofar] = ""; if (index(rest, info[1]) != 1) "... find where new string disagrees with common portion..."; c = ($string_utils:common(rest, info[1]) + 1); "... make a new node with a shorter common portion...."; this:make_node(prefix + info[1][1..c], @listset(info, info[1][c + 1..length(info[1])], 1)); this:set_node(prefix, info[1][1..c - 1], info[1][c], {search}, @has_datum ? {{datum}} | {}); return 0; elseif (rest == info[1]) ".. new string == common portion, insert..."; info[3] = {@info[3], search}; if (has_datum) info[this.data] = {@info[this.data], datum}; endif this:set_node(prefix, @info); return 0; elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)])) "... new string matches pre-existing continuation. insert in subnode...."; return this:insert(nsofar, search, datum); else "... new string may blow away one of the exact matches (i.e., matches one of them up to the first character beyond the common portion) in which case we need to create a new subnode...."; s = search[1..nsofar]; for m in (info[3]) if (index(m, s) == 1) i = (m in info[3]); "... we know m != search ..."; "... string m has been blown away. create new node ..."; cbegin = (cafter = (length(s) + 1)); cend = $string_utils:common(search, m); this:make_node(s, m[cbegin..cend], "", {search, m}, @has_datum ? {{datum, info[this.data][i]}} | {}); this:set_node(prefix, info[1], info[2] + s[nsofar], listdelete(info[3], i), @has_datum ? {listdelete(info[this.data], i)} | {}); return 0; endif endfor "... new string hasn't blown away any of the exact matches, insert it as a new exact match..."; info[3] = {search, @info[3]}; if (has_datum) info[this.data] = {datum, @info[this.data]}; endif this:set_node(prefix, @info); return 0; endif . #39:7 ":delete(string[,n]) deletes any <string,something> pair from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)"; "Returns {something} if such a pair existed, otherwise returns 0"; "If that node is not the root node and ends up containing only one string and no subnodes, we kill it and return {something,string2,something2} where <string2,something2> is the remaining pair."; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif rest = (search = args[1]); sofar = {@args, 0}[2]; prefix = search[1..sofar]; rest[1..sofar] = ""; info = this.(" " + prefix); if (i = (search in info[3])) previous = {info[this.data][i]}; info[3] = listdelete(info[3], i); if (this.data > 3) info[this.data] = listdelete(info[this.data], i); endif elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)])))) "... hmm string isn't in here..."; return 0; elseif ((previous = this:delete(search, d)) && (length(previous) > 1)) i = index(info[2], search[d]); info[2][i..i] = ""; info[3] = {previous[2], @info[3]}; if (this.data > 3) info[this.data] = {previous[3], @info[this.data]}; endif previous = previous[1..1]; else return previous; endif if ((!prefix) || ((length(info[3]) + length(info[2])) != 1)) this:set_node(prefix, @info); return previous; elseif (info[3]) this:kill_node(prefix); return {@previous, info[3][1], info[this.data][1]}; else sub = this.(" " + (p = tostr(prefix, info[1], info[2]))); this:kill_node(p); this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1)); return previous; endif . #39:8 ":delete2(string,datum[,n]) deletes the pair <string,datum> from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)"; "Similar to :delete except that if the entry for that string has a different associated datum, it will not be removed. "; ":delete2(string,datum) is equivalent to "; " "; " if(this:find_exact(string)==datum) "; " this:delete(string); "; " endif"; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif rest = (search = args[1]); datum = args[2]; sofar = {@args, 0}[3]; prefix = search[1..sofar]; rest[1..sofar] = ""; info = this.(" " + prefix); if (i = (search in info[3])) previous = {info[this.data][i]}; if (previous[1] != datum) return previous; endif info[3] = listdelete(info[3], i); if (this.data > 3) info[this.data] = listdelete(info[this.data], i); endif elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)])))) "... hmm string isn't in here..."; return 0; elseif ((previous = this:delete2(search, datum, d)) && (length(previous) > 1)) i = index(info[2], search[d]); info[2][i..i] = ""; info[3] = {previous[2], @info[3]}; if (this.data > 3) info[this.data] = {previous[3], @info[this.data]}; endif previous = previous[1..1]; else return previous; endif if ((!prefix) || ((length(info[3]) + length(info[2])) != 1)) this:set_node(prefix, @info); return previous; elseif (info[3]) this:kill_node(prefix); return {@previous, info[3][1], info[this.data][1]}; else sub = this.(" " + (p = tostr(prefix, info[1], info[2]))); this:kill_node(p); this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1)); return previous; endif . #39:9 return (caller != this) ? E_PERM | (this.(" " + args[1]) = listdelete(args, 1)); . #39:10 "WIZARDLY"; return (caller != this) ? E_PERM | add_property(this, " " + args[1], listdelete(args, 1), {$generic_db.owner, this.node_perms}); . #39:11 "WIZARDLY"; return (caller != this) ? E_PERM | delete_property(this, " " + args[1]); . #39:12 "WIZARDLY"; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif if (args && ((d = args[1]) in {3, 4})) this.data = d; endif for p in (properties(this)) if ((p[1] == " ") && (p != " ")) delete_property(this, p); endif "... there should be a better way...."; "...This is bad as it leaves the db in an inconsistent state..."; $command_utils:suspend_if_needed(0); endfor this:set_node("", "", "", {}, @(this.data > 3) ? {{}} | {}); . #39:13 if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif this:_kill_subtrees("", 0); this:clearall(@args); . #39:14 ":_kill_subtree(node,count)...wipes out all subtrees"; "...returns count + number of nodes removed..."; if (!($perm_utils:controls(caller_perms(), this) || (caller == this))) return E_PERM; endif info = this.(" " + (prefix = args[1])); count = args[2]; if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("...", count); suspend(0); endif for i in [1..length(info[2])] count = (this:_kill_subtrees(n = tostr(prefix, info[1], info[2][i]), count) + 1); this:kill_node(n); endfor return count; . #39:15 info = this.(" " + (prefix = (args || {""})[1])); depth = 0; string = prefix; if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("...", prefix); suspend(0); endif for i in [1..length(info[2])] if ((r = this:depth(tostr(prefix, info[1], info[2][i])))[1] > depth) depth = r[1]; string = r[2]; endif endfor return {depth + 1, string}; . #39:16 info = this.(" " + (prefix = args[1])); count = (length(info[3]) + args[2]); if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("...", count); suspend(0); endif for i in [1..length(info[2])] count = this:count_entries(tostr(prefix, info[1], info[2][i]), count); endfor return count; . #39:17 info = this.(" " + (prefix = args[1])); count = args[2]; for s in (info[3]) count = (count + length(s)); endfor if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("...", count); suspend(0); endif for i in [1..length(info[2])] count = this:count_chars(tostr(prefix, info[1], info[2][i]), count); endfor return count; . #39:18 "count [entries|chars] in <db>"; " reports on the number of distinct string keys or the number of characters"; " in all string keys in the db"; if (index("entries", dobjstr) == 1) player:tell(this:count_entries("", 0), " strings in ", this.name, "(", this, ")"); elseif (index("chars", dobjstr) == 1) player:tell(this:count_chars("", 0), " chars in ", this.name, "(", this, ")"); else player:tell("Usage: ", verb, " entries|chars in <db>"); endif . #40:0 "eval(code)"; "Evaluate code with $no_one's permissions (so you won't damage anything)."; "If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code. This means that subsequent lines will not be evaluated at all."; "If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value. This is how to do multi-line evals."; set_task_perms(this); exp = args[1]; if (exp[1] != ";") return eval(tostr("this=", caller, "; return ", exp, ";")); else return eval(tostr("this=", caller, ";", exp, ";")); endif . #40:1 return 0; . #40:2 ":eval_d(code)"; "exactly like :eval except that the d flag is unset"; "Evaluate code with $no_one's permissions (so you won't damage anything)."; "If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code. This means that subsequent lines will not be evaluated at all."; "If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value. This is how to do multi-line evals."; set_task_perms(this); exp = args[1]; if (exp[1] != ";") return $code_utils:eval_d(tostr("this=", caller, "; return ", exp, ";")); else return $code_utils:eval_d(tostr("this=", caller, ";", exp, ";")); endif . #40:3 "call_verb(object, verb name, args)"; "Call verb with $no_one's permissions (so you won't damage anything)."; "One could do this with $no_one:eval, but ick."; set_task_perms(this); return args[1]:(args[2])(@args[3]); . #41:0 ":load() -- reloads the player_db with the names of all existing players."; "This routine calls suspend() if it runs out of time."; ".frozen is set to 1 while the load is in progress so that other routines are warned and don't try to do any updates. Sometimes, an update is unavoidable (e.g., player gets recycled) in which case the offending routine should set .frozen to 2, causing the load to start over at the beginning."; if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return E_PERM; endif this:clearall(); this.frozen = 1; for p in (players()) this:suspend_restart(p); "... note that if a player is recycled or toaded during the suspension,..."; "... it won't be removed from the for loop iteration; thus this test: "; if (valid(p) && is_player(p)) if (typeof(po = this:find_exact(p.name)) == ERR) player:tell(p.name, ": ", po); return; elseif (po != p) if (valid(po) && is_player(po)) player:tell("name `", p.name, "' for ", p, " subsumes alias for ", po.name, "(", po, ")."); endif this:insert(p.name, p); endif for a in (p.aliases) this:suspend_restart(p); if (index(a, " ")) "don't bother"; elseif (typeof(ao = this:find_exact(a)) == ERR) player:tell(a, ": ", ao); return; elseif (!(valid(ao) && is_player(ao))) this:insert(a, p); elseif (ao != p) player:tell("alias `", a, "' for ", p.name, "(", p, ") used by ", ao.name, "(", ao, ")."); endif endfor endif endfor this.frozen = 0; . #41:1 ":check() -- checks for recycled and toaded players that managed not to get expunged from the db."; for p in (properties($player_db)) if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("...", p); suspend(0); endif if (p[1] == " ") nlist = this.(p)[3]; olist = this.(p)[4]; for i in [1..length(nlist)] if (valid(olist[i]) && (is_player(olist[i]) && (nlist[i] in olist[i].aliases))) else player:tell(".", p[2..length(p)], " <- ", nlist[i], " ", olist[i]); endif endfor endif endfor player:tell("done."); . #41:2 if (caller_perms().wizard) pass(); this.reserved = {}; this:load(); endif . #41:3 ":available(name) => 1 if a name is available for use, or the object id of whoever is currently using it, or 0 if the name is otherwise forbidden."; "If $player_db is not .frozen and :available returns 1, then $player:set_name will succeed."; name = args[1]; if ((name in this.stupid_names) || (name in this.reserved)) return 0; elseif ((((!name) || index(name, " ")) || index(name, "\\")) || index(name, "\"")) return 0; elseif (index("*#()", name[1])) return 0; elseif (valid(who = this:find_exact(name)) && is_player(who)) return who; else return 1; endif . #41:4 "used during :load to do the usual out-of-time check."; "if someone makes a modification during the suspension (indicated by this.frozen being set to 2), we have to restart the entire load."; if (caller != this) return E_PERM; elseif ($command_utils:running_out_of_time()) player:tell("...", args[1]); suspend(0); if (this.frozen != 1) player:tell("...argh... restarting $player_db:load..."); fork (0) this:load(); endfork kill_task(task_id()); endif endif . #42:0 "@perm_utils:controls(who, what)"; "Is WHO allowed to hack on WHAT?"; return (args[1] == args[2].owner) || args[1].wizard; . #42:1 ":apply(permstring,mods) => new permstring."; "permstring is a permissions string, mods is a concatenation of strings of the form +<letters>, !<letters>, or -<letters>, where <letters> is a string of letters as might appear in a permissions string (`+' adds the specified permissions, `-' or `!' removes them; `-' and `!' are entirely equivalent)."; perms = args[1]; mods = args[2]; if ((!mods) || (!index("!-+", mods[1]))) return mods; endif i = 1; while (i <= length(mods)) if (mods[i] == "+") while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i]))) if (!index(perms, mods[i])) perms = (perms + mods[i]); endif endwhile else "mods[i] must be ! or -"; while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i]))) perms = strsub(perms, mods[i], ""); endwhile endif endwhile return perms; . #42:2 stage = 1; c = callers(); while (((stage = (stage + 1)) < length(c)) && (c[stage][1] == c[1][1])) endwhile return c[stage]; . #42:3 "controls_prop(who, what, propname)"; "Is WHO allowed to hack on WHAT's PROPNAME?"; return (args[1] == property_info(args[2], args[3])[1]) || args[1].wizard; . #43:0 "$gender_utils:set(object,gender) --- sets the pronoun properties of object."; "gender is a string: one of the strings in $gender_utils.genders, the list of rcognized genders. If the gender change is successful, the (full) name of the gender (e.g., \"male\") is returned. E_NONE is returned if gender does not match any recognized gender. Any other error encountered (e.g., E_PERM, E_PROPNF) is likewise returned and the object's pronoun properties are left unaltered."; set_task_perms(caller_perms()); if (this == (object = args[1])) return E_DIV; elseif (gnum = $string_utils:find_prefix(gender = args[2], this.genders)) gender = this.genders[gnum]; else return E_NONE; endif save = {}; prons = this.pronouns; for p in (prons) save = {@save, e = object.(p)}; if ((typeof(e) != STR) || (typeof(e = (object.(p) = this.(p)[gnum])) == ERR)) for i in [1..length(save) - 1] object.(prons[i]) = save[i]; endfor return e; endif endfor return gender; . #43:1 "$gender_utils:add(object[,perms[,owner]])"; "--- adds pronoun properties to object if they're not already there."; " perms default to \"rc\", owner defaults to the object owner."; set_task_perms(caller_perms()); object = args[1]; perms = ((length(args) >= 2) ? args[2] | "rc"); owner = ((length(args) >= 3) ? args[3] | object.owner); prons = this.pronouns; e = 1; for p in (prons) if (!$object_utils:has_property(object, p)) e = add_property(object, p, "", {owner, perms}); if (typeof(e) == ERR) player:tell("Couldn't add ", object, ".", p, ": ", e); return; endif elseif ((typeof(object.(p)) != STR) && (typeof(e = (object.(p) = "")) == ERR)) player:tell("Couldn't reset ", object, ".", p, ": ", e); return; elseif (!object.(p)) e = 0; endif endfor if ((!e) && (ERR == typeof(e = this:set(object, "neuter")))) player:tell("Couldn't initialize pronouns: ", e); endif . #43:2 "get_pronoun(key,object) => pronoun corresponding to object."; "key can be one of s,o,p,q,r,S,O,P,Q,R to refer to the pronoun properties relatively directly or it can be something of the form \"he/she\" or \"He/She\"."; "Next the object is checked for the desired pronoun property. If that doesn't exist, we look at object.gender and infer the pronoun from the corresponding $gender_utils property. If .gender doesn't exist or the object itself is invalid, we use the corresponding property on $player."; key = args[1]; if (key[1] == ":") key = key[2..length(key)]; endif if ((length(key) == 1) && (i = index("sopqrSOPQR", key, 1))) prop = this.pronouns[i]; else search = "$1:he$s:she$1:he/she$2:him$2:him/her$3:his/her$4:hers$4:his/hers$5:himself$5:herself$5:himself/herself"; i = index(search, (":" + key) + "$"); if (!i) return ""; endif cap = (strcmp("a", key) > 0); prop = this.pronouns[tonum(search[i - 1]) + (5 * cap)]; endif if (!valid(object = ((length(args) >= 2) ? args[2] | player))) return $player.(prop); elseif (STR == typeof(p = object.(prop))) return p; elseif ((STR == typeof(g = object.gender)) && (i = (g in this.genders))) return this.(prop)[i]; else return $player.(prop); endif . #43:3 "get_conj(verbspec,object) => verb conjugated according to object."; "verbspec can be one of \"singular/plural\", \"singular\", \"singular/\", or \"/plural\", e.g., \"is/are\", \"is\", \"is/\", or \"/are\"."; "The object is checked to see whether it is singular or plural. This is inferred from its .gender property. If .gender doesn't exist or the object itself is invalid, we assume singular."; spec = args[1]; i = index(spec + "/", "/"); sing = spec[1..i - 1]; if (i < length(spec)) plur = spec[i + 1..length(spec)]; else plur = ""; endif cap = (strcmp("a", (i == 1) ? spec[2] | spec) > 0); if (((valid(object = ((length(args) >= 2) ? args[2] | player)) && (STR == typeof(g = object.gender))) && (i = (g in this.genders))) && this.is_plural[i]) vb = (plur || this:_verb_plural(sing, i)); else vb = (sing || this:_verb_singular(plur, i)); endif if (cap) return $string_utils:capitalize(vb); else return vb; endif . #43:4 if (typeof(st = args[1]) != STR) return E_INVARG; endif len = length(st); if ((len >= 3) && (rindex(st, "n't") == (len - 2))) return this:_verb_plural(st[1..len - 3], args[2]) + "n't"; elseif (i = (st in {"has", "is"})) return this.({"have", "be"}[i])[args[2]]; elseif (st == "was") return (args[2] > 6) ? "were" | st; elseif ((len <= 3) || (st[len] != "s")) return st; elseif (st[len - 1] != "e") return st[1..len - 1]; elseif ((r = (rindex(st, "sses") || rindex(st, "zzes"))) && (r == (len - 3))) return st[1..len - 3]; elseif (((st[len - 2] == "h") && index("cs", st[len - 3])) || index("ox", st[len - 2])) return st[1..len - 2]; "washes => wash, belches => belch, boxes => box"; "used to have || ((st[len - 2] == \"s\") && (!index(\"aeiouy\", st[len - 3])))"; "so that <consonant>ses => <consonant>s"; "known examples: none"; "counterexample: browses => browse"; elseif (st[len - 2] == "i") return st[1..len - 3] + "y"; else return st[1..len - 1]; endif . #43:5 if (typeof(st = args[1]) != STR) return E_INVARG; endif len = length(st); if ((len >= 3) && (rindex(st, "n't") == (len - 2))) return this:_verb_singular(st[1..len - 3], args[2]) + "n't"; elseif (i = (st in {"have", "are"})) return this.({"have", "be"}[i])[args[2]]; elseif ((st[len] == "y") && (!index("aeiou", st[len - 1]))) return st[1..len - 1] + "ies"; elseif (index("sz", st[len]) && index("aeiou", st[len - 1])) return (st + st[len]) + "es"; elseif (index("osx", st[len]) || ((len > 1) && (index("chsh", st[len - 1..len]) % 2))) return st + "es"; else return st + "s"; endif . #43:6 "_do(cap,object,modifiers...)"; cap = args[1]; object = args[2]; if (!(modifiers = args[3])) if (typeof(object) != OBJ) return tostr(object); elseif (!valid(object)) return (cap ? "N" | "n") + "othing"; else return cap ? object:titlec() | object:title(); endif elseif (modifiers[1] == ".") len = length(modifiers); if (i = index(modifiers[2..len], ".")) i = (i + 1); elseif (!(i = ((index(modifiers, ":") || index(modifiers, "#")) || index(modifiers, "!")))) i = (len + 1); endif if (typeof(o = object.(modifiers[2..i - 1])) == ERR) return tostr("%(", o, ")"); else return this:_do(cap || (strcmp("a", modifiers[2]) > 0), o, modifiers[i..len]); endif elseif (modifiers[1] == ":") if (typeof(object) != OBJ) return tostr("%(", E_TYPE, ")"); elseif (p = this:get_pronoun(modifiers, object)) return p; else return tostr("%(", modifiers, "??)"); endif elseif (modifiers[1] == "#") return tostr(object); elseif (modifiers[1] == "!") return this:get_conj(modifiers[2..length(modifiers)], object); else i = ((((index(modifiers, ".") || index(modifiers, ":")) || index(modifiers, "#")) || index(modifiers, "!")) || (length(modifiers) + 1)); s = modifiers[1..i - 1]; if (j = (s in {"dobj", "iobj", "this"})) return this:_do(cap, {dobj, iobj, callers()[2][1]}[j], modifiers[i..length(modifiers)]); else return tostr("%(", s, "??)"); endif endif . #43:7 "Experimental pronoun substitution. The official version is on $string_utils."; "syntax: :pronoun_sub(text[,who])"; "experimental version that accomodates Aladdin's style..."; set_task_perms($no_one); who = ((length(args) >= 2) ? args[2] | player); if (typeof(args[1]) == LIST) plines = {}; for line in (args[1]) plines = {@plines, this:pronoun_sub(line, who)}; endfor return plines; endif old = tostr(args[1]); new = ""; here = (valid(who) ? who.location | $nothing); objspec = "nditl"; objects = {who, dobj, iobj, caller, here}; prnspec = "sopqrSOPQR"; prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"}; oldlen = length(old); while ((prcnt = index(old, "%")) && (prcnt < oldlen)) cp_args = {}; s = old[k = (prcnt + 1)]; if (brace = index("([{", s)) if (!(w = index(old[k + 1..oldlen], ")]}"[brace]))) return new + old; elseif (brace == 3) s = this:_do(0, who, old[prcnt + 2..(k = (k + w)) - 1]); else p = old[prcnt + 2..(k = (k + w)) - 1]; if (brace == 1) cp_args = {who, p}; elseif (p[1] == "#") s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]")); elseif (!(o = index(objspec, p[1]))) s = (("[" + p) + "]"); else cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0}; endif endif elseif (o = index(objspec, s)) cp_args = {objects[o], "", strcmp(s, "a") < 0}; elseif (w = index(prnspec, s, 1)) cp_args = {who, prprops[w]}; elseif (s == "#") s = tostr(who); elseif (s != "%") s = ("%" + s); endif new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")")))); old = old[k + 1..oldlen]; oldlen = (oldlen - k); endwhile return new + old; . #44:0 "Given a time() or ctime()-style date, this returns the full name of the day."; if (typeof(args[1]) == NUM) time = ctime(args[1]); elseif (typeof(args[1]) == STR) time = args[1]; else return E_TYPE; endif dayabbr = $string_utils:explode(time)[1]; return this.days[dayabbr in this.dayabbrs]; . #44:1 "Given a time() or ctime()-style date, this returns the full name"; "of the month."; if (typeof(args[1]) == NUM) time = ctime(args[1]); elseif (typeof(args[1]) == STR) time = args[1]; else return E_TYPE; endif monthabbr = $string_utils:explode(time)[2]; return this.months[monthabbr in this.monthabbrs]; . #44:2 "Return a time in the form [h]h[:mm[:ss]] {a.m.|p.m.}. Args are"; "[1] either a time()- or a ctime()-style date, and"; "[2] (optional) the precision desired--1 for hours, 2 for minutes,"; " 3 for seconds. If not given, precision defaults to minutes"; if (typeof(args[1]) == NUM) time = ctime(args[1]); elseif (typeof(args[1]) == STR) time = args[1]; else return E_TYPE; endif if (length(args) > 1) precision = args[2]; else precision = 2; endif time = $string_utils:explode(time)[4]; hour = tonum(time[1..2]); if (hour == 0) time = (("12" + time[3..(precision * 3) - 1]) + " a.m."); elseif (hour == 12) time = (time[1..(precision * 3) - 1] + " p.m."); elseif (hour > 12) time = ((tostr(hour - 12) + time[3..(precision * 3) - 1]) + " p.m."); else time = ((tostr(hour) + time[3..(precision * 3) - 1]) + " a.m."); endif return time; . #44:3 "Given string hh:mm:ss ($string_utils:explode(ctime(time))[4]), this returns"; "the number of seconds elapsed since 00:00:00. I can't remember why I"; "created this verb, but I'm sure it serves some useful purpose."; return (((60 * 60) * tonum(args[1][1..2])) + (60 * tonum(args[1][4..5]))) + tonum(args[1][7..8]); . #44:4 r = 10000; h = ((r * r) + (r / 2)); time = ((args == {}) ? time() | args[1]); t = (((time + 120) % 86400) / 240); s = ((5 * ((time - 14957676) % 31556952)) / 438291); phi = ((s + t) + this.corr); cs = $trig_utils:cos(s); spss = (((($trig_utils:sin(phi) * $trig_utils:sin(s)) + h) / r) - r); cpcs = (((($trig_utils:cos(phi) * cs) + h) / r) - r); return (((((this.stsd * cs) - (this.ctcd * cpcs)) - (this.ct * spss)) + h) / r) - r; . #44:5 "Given a string such as returned by ctime(), return the corresponding time-in-seconds-since-1970 time returned by time(), or E_DIV if the format is wrong in some essential way."; words = $string_utils:explode(args[1]); if (length(words) == 5) "Arrgh! the old ctime() didn't return a time zone, yet it arbitrarily decides whether it's standard or daylight savings time. URK!!!!!"; words = listappend(words, "PST"); endif if ((((length(words) != 6) || (length(hms = $string_utils:explode(words[4], ":")) != 3)) || (!(month = (words[2] in this.monthabbrs)))) || (!(zone = $list_utils:assoc(words[6], this.timezones)))) return E_DIV; endif year = tonum(words[5]); day = (({-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + tonum(words[3])) + (year * 366)); zone = zone[2]; return (((((((((((((day - ((day + 1038) / 1464)) - ((day + 672) / 1464)) - ((day + 306) / 1464)) - ((day + 109740) / 146400)) - ((day + 73140) / 146400)) - ((day + 36540) / 146400)) - 719528) * 24) + tonum(hms[1])) + zone) * 60) + tonum(hms[2])) * 60) + tonum(hms[3]); . #44:6 s = args[1]; if (s < 0) return "-" + this:(verb)(-s); endif m = (s / 60); s = (s % 60); if (m) ss = tostr((s < 10) ? ":0" | ":", s); h = (m / 60); m = (m % 60); if (h) ss = tostr((m < 10) ? ":0" | ":", m, ss); d = (h / 24); h = (h % 24); return tostr(@d ? {d, (h < 10) ? ":0" | ":"} | {}, h, ss); else return tostr(m, ss); endif else return tostr(s); endif . #44:7 "english_time(time [,reference time]): returns the time as a string of"; "years, months, days, minutes and seconds using the reference time as the"; "start time and incrementing forwards. it can be given in either ctime() or"; "time() format. if a reference time is not given, it is set to time()."; "suspend(0)"; if ((_time = args[1]) < 1) return "0 seconds"; endif reftime = ((length(args) > 1) ? args[2] | time()); _ctime = ((typeof(reftime) == NUM) ? ctime(reftime) | reftime); seclist = {60, 60, 24}; units = {"year", "month", "day", "hour", "minute", "second"}; timelist = {}; for unit in (seclist) timelist = {_time % unit, @timelist}; _time = (_time / unit); endfor months = 0; month = (_ctime[5..7] in $time_utils.monthabbrs); year = tonum(_ctime[21..24]); "the following should really be a verb/property. attribution: the "; "algorithm used is from the eminently eminent g7."; monthlen = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; while (_time >= (days = (monthlen[month] + (((month == 2) && ((year % 4) == 0)) && (!((year % 400) in {100, 200, 300})))))) _time = (_time - days); months = (months + 1); if ((month = (month + 1)) > 12) year = (year + 1); month = 1; endif endwhile timelist = {months / 12, months % 12, _time, @timelist}; for unit in (units) i = (unit in units); if (timelist[i] > 0) units[i] = (((tostr(timelist[i]) + " ") + units[i]) + ((timelist[i] == 1) ? "" | "s")); else units = listdelete(units, i); timelist = listdelete(timelist, i); endif endfor "suspend(0)"; return $string_utils:english_list(units); . #44:8 "from_day(day_of_week,which)"; "numeric time (seconds since 1970) corresponding to midnight (PST) of the given weekday. Use either the name of the day or a 1..7 number (1==Sunday,...)"; " which==-1 => use most recent such day."; " which==+1 => use first upcoming such day."; " which==0 => use closest such day."; "larger (absolute) values for which specify a certain number of weeks into the future or past."; if (!(tonum(day = args[1]) || (day = $string_utils:find_prefix(day, this.days)))) return E_DIV; endif delta = {288000, 374400, 460800, 547200, 28800, 115200, 201600}[tonum(day)]; time = (time() - delta); dir = {@args, 0}[2]; if (dir) time = ((time / 604800) + ((dir > 0) ? dir | (dir + 1))); else time = ((time + 302400) / 604800); endif return (time * 604800) + delta; . #44:9 "from_month(month,which[,d])"; "numeric time (seconds since 1970) corresponding to midnight (PST) of the dth (first) day of the given month. Use either the month name or a 1..12 number (1==January,...)"; " which==-1 => use most recent such month."; " which==+1 => use first upcoming such month."; " which==0 => use closest such month."; "larger (absolute) values for which specify a certain number of years into the future or past."; if (!(tonum(month = args[1]) || (month = $string_utils:find_prefix(month, this.months)))) return E_DIV; endif delta = (({0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + {@args, 1}[3]) - 1); day = ((time() - 28800) / 86400); day = ((day - ((day + 672) / 1461)) - delta); dir = {@args, 0}[2]; if (dir) day = (((day / 365) + dir) + (dir <= 0)); else day = (((2 * day) + 365) / 730); endif day = ((day * 365) + delta); day = (day + ((day + 671) / 1460)); return (day * 86400) + 28800; . #44:10 "Takes a time that is midnight PST and converts it to the nearest PDT midnight time if it's during that part of the year where we use PDT."; time = args[1]; return time - (3600 * (((tonum(ctime(time)[12..13]) + 12) % 24) - 12)); . #44:11 "Works like pronoun substitution, but substitutes time stuff."; "Call with time_sub(string, time). returns a string."; "time is an optional integer in time() format. If omitted, time() is used."; "Macros which are unknown are ignored. $Q -> the empty string."; "Terminal $ are ignored."; "$H -> hour #. $M -> min #. $S -> second #. 24-hour format, fixed width."; "$h, $m, $s same x/c have not-fixed format. 00:03:24 vs. 0:3:24"; "$O/$o -> numeric hour in 12-hour format."; "$D -> long day name. $d -> short day name."; "$N -> long month name. $n -> short month name."; "$Y -> long year # (e.g. '1991'). $y -> short year # (e.g. '91')"; "$Z -> the time zone (added in by r'm later)"; "$P/$p -> AM/PM, or am/pm."; "$T -> date number. $t -> date number with no extra whitespace etc."; "$1 -> Month in fixed-width numeric format (01-12) (added by dpk)"; "$2 -> Month in nonfixed numeric format (1-12)"; "$3 -> Date in fixed-width format, 0-fill"; "$$ -> $."; ""; "This verb stolen from Ozymandias's #4835:time_subst."; res = ""; thestr = args[1]; if (length(args) > 1) thetime = tonum(args[2]); else thetime = time(); endif if ((typeof(thestr) != STR) || (typeof(thetime) != NUM)) player:tell("Bad arguments to time_subst."); return; endif itslength = length(thestr); if (!itslength) return ""; endif done = 0; cctime = ctime(thetime); while (dollar = index(thestr, "$")) res = (res + thestr[1..dollar - 1]); if (dollar == length(thestr)) return res; endif thechar = thestr[dollar + 1]; thestr[1..dollar + 1] = ""; if (thechar == "$") res = (res + "$"); elseif (!strcmp(thechar, "h")) res = (res + $string_utils:trim(tostr(tonum(cctime[12..13])))); elseif (thechar == "H") res = (res + cctime[12..13]); elseif (!strcmp(thechar, "m")) res = (res + $string_utils:trim(tostr(tonum(cctime[15..16])))); elseif (thechar == "M") res = (res + cctime[15..16]); elseif (!strcmp(thechar, "s")) res = (res + $string_utils:trim(tostr(tonum(cctime[18..19])))); elseif (thechar == "S") res = (res + cctime[18..19]); elseif (!strcmp(thechar, "D")) res = (res + $time_utils:day(thetime)); elseif (thechar == "d") res = (res + cctime[1..3]); elseif (!strcmp(thechar, "N")) res = (res + $time_utils:month(thetime)); elseif (thechar == "n") res = (res + cctime[5..7]); elseif (!strcmp(thechar, "T")) res = (res + cctime[9..10]); elseif (thechar == "t") res = (res + $string_utils:trim(cctime[9..10])); elseif (thechar == "O") res = (res + tostr(((tonum(cctime[12..13]) + 11) % 12) + 1)); elseif (!strcmp(thechar, "p")) res = (res + ((tonum(cctime[12..13]) >= 12) ? "pm" | "am")); elseif (thechar == "P") res = (res + ((tonum(cctime[12..13]) >= 12) ? "PM" | "AM")); elseif (!strcmp(thechar, "y")) res = (res + cctime[23..24]); elseif (thechar == "Y") res = (res + cctime[21..24]); elseif (thechar == "Z") res = (res + cctime[26..28]); elseif (thechar == "1") res = (res + $string_utils:right(tostr($string_utils:explode(cctime)[2] in this.monthabbrs), 2, "0")); elseif (thechar == "2") res = (res + tostr($string_utils:explode(cctime)[2] in this.monthabbrs)); elseif (thechar == "3") res = (res + $string_utils:subst(cctime[9..10], {{" ", "0"}})); endif endwhile return res + thestr; . #44:12 "Copied from Archer (#52775):mmddyy Tue Apr 6 17:04:26 1993 PDT"; "Given a time() or ctime()-style date and an optional separator, this returns the MM/DD/YY or DD/MM/YY form of the date (depending on the verb called.) The default seperator is '/'"; if (typeof(args[1]) == NUM) time = ctime(args[1]); elseif (typeof(args[1]) == STR) time = args[1]; else return E_TYPE; endif date = $string_utils:explode(time); day = tonum(date[3]); month = (date[2] in $time_utils.monthabbrs); year = date[5]; daystr = ((day < 10) ? "0" + tostr(day) | tostr(day)); monthstr = ((month < 10) ? "0" + tostr(month) | tostr(month)); yearstr = tostr(year)[3..4]; divstr = ((length(args) == 1) ? "/" | args[2]); if (verb == "mmddyy") return tostr(monthstr, divstr, daystr, divstr, yearstr); else return tostr(daystr, divstr, monthstr, divstr, yearstr); endif . #44:13 "$time_utils:parse_english_time_interval(n1,u1,n2,u2,...)"; "or $time_utils:parse_english_time_interval(\"n1 u1[,] [and] n2[,] u2 [and] ...\")"; "There must be an even number of arguments, all of which must be strings,"; " or there must be just one argument which is the entire string to be parsed."; "The n's are are numeric strings, and the u's are unit names."; "The known units are in $time_utils.time_units,"; " which must be kept sorted with bigger times at the head."; "Returns the time represented by those words."; "For example,"; " $time_utils:parse_english_time_interval(\"30\",\"secs\",\"2\",\"minutes\",\"31\",\"seconds\") => 181"; if ((length(args) == 1) && index(args[1], " ")) return $time_utils:parse_english_time_interval(@$string_utils:words(args[1])); endif a = $list_utils:setremove_all(args, "and"); nargs = length(a); if (nargs % 2) return E_ARGS; endif nsec = 0; n = 0; for i in [1..nargs] if ((i % 2) == 1) if ($string_utils:is_numeric(a[i])) n = tonum(a[i]); elseif (a[i] in {"a", "an"}) n = 1; elseif (a[i] in {"no"}) n = 0; else return E_INVARG; endif else unit = a[i]; if (unit[length(unit)] == ",") unit = unit[1..length(unit) - 1]; endif ok = 0; for entry in ($time_utils.time_units) if ((!ok) && (unit in entry[2..length(entry)])) nsec = (nsec + (entry[1] * n)); ok = 1; endif endfor if (!ok) return E_INVARG; endif endif endfor return nsec; . #44:14 "Copied from Ballroom Complex (#29992):from_date by Keelah! (#30246) Tue Jul 13 19:42:32 1993 PDT"; ":seconds_until_date(month,day,time,which)"; "month is a string or the numeric representation of the month, day is a number, time is a string in the following format, hh:mm:ss."; "which==-1 => use most recent such month."; "which==+1 => use first upcoming such month."; "which==0 => use closest such month."; "This will return the number of seconds until the month, day and time given to it."; "Written by Keelah, on July 5, 1993."; month = args[1]; day = args[2]; which = args[4]; time = args[3]; converted = 0; converted = (converted + $time_utils:from_month(month, which, day)); current = this:seconds_until_time("12:00:00"); get_seconds = this:seconds_until_time(time); if (get_seconds < 0) get_seconds = ((get_seconds + 39600) - current); else get_seconds = ((get_seconds + 39600) - current); endif converted = ((converted + get_seconds) - time()); return converted; . #44:15 "Copied from Ballroom Complex (#29992):seconds_until by Keelah! (#30246) Tue Jul 13 19:42:37 1993 PDT"; ":seconds_until_time(hh:mm:ss)"; "Given the string hh:mm:ss, this returns the number of seconds until that hh:mm:ss. If the hh:mm:ss is before the current time(), the number returned is a negative, else the number is a positive."; "Written by Keelah, on July 4, 1993."; current = $time_utils:to_seconds(ctime()[12..19]); time = $time_utils:to_seconds(args[1]); return tonum(time) - tonum(current); . #46:0 "For changing mailing list aliases, we check to make sure that none of the aliases match existing mailing list aliases. Aliases containing spaces are not used in addresses and so are not subject to this restriction ($mail_agent:match will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch)."; " => E_PERM if you don't own this"; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; elseif (this.location != $mail_agent) "... we don't care..."; return pass(@args); else for a in (aliases = args[1]) if (index(a, " ")) "... we don't care..."; elseif (rp = $mail_agent:reserved_pattern(a)) player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]); aliases = setremove(aliases, a); elseif (valid(p = $mail_agent:match(a, #-1)) && ((p != this) && (a in p.aliases))) player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")"); aliases = setremove(aliases, a); endif endfor if (aliases) return pass(aliases); else return 1; endif endif . #46:1 namelist = ("*" + ((names = this:mail_names()) ? $string_utils:from_list(names, ", *") | tostr(this))); if (typeof(fwd = this:mail_forward()) != LIST) fwd = {}; endif if (this:is_writable_by(player)) if (player in fwd) read = " [Writable/Subscribed]"; else read = " [Writable]"; endif elseif (typeof(this.readers) != LIST) read = tostr(" [Public", (player in fwd) ? "/Subscribed]" | "]"); elseif (player in fwd) read = " [Subscribed]"; elseif (this:is_readable_by(player)) read = " [Readable]"; else read = ""; endif if (this:is_usable_by($no_one)) mod = ""; elseif (this:is_usable_by(player)) mod = " [Approved]"; else mod = " [Moderated]"; endif player:tell(namelist, " (", this, ")", read, mod); d = this:description(); if (typeof(d) == STR) d = {d}; endif for l in (d) if (length(l) <= 75) ls = {l}; else ls = $generic_editor:fill_string(l, 76); endif for line in (ls) player:tell(" ", line); endfor endfor . #46:2 return $perm_utils:controls(who = args[1], this) || (who in this.writers); . #46:3 return (typeof(this.readers) != LIST) || (((who = args[1]) in this.readers) || (this:is_writable_by(who) || $mail_agent:sends_to(1, this, who))); . #46:4 who = args[1]; if (this.moderated) return (who in this.moderated) || (this:is_writable_by(who) || who.wizard); else return this.guests_can_send_here || (!$object_utils:isa(who, $guest)); endif . #46:5 if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard)) return this:moderator_notify(@args); else return this.(verb); endif . #46:6 if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard)) return this:moderator_forward(@args); elseif (typeof(mf = this.(verb)) == STR) return $string_utils:pronoun_sub(mf, @args); else return mf; endif . #46:7 if (typeof(mf = this.(verb)) == STR) return $string_utils:pronoun_sub(mf, args ? args[1] | $player); else return mf; endif . #46:8 ":add_forward(recip[,recip...]) adds new recipients to this list. Returns a string error message or a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient, string => other kind of failure)"; if (caller == $mail_editor) perms = player; else perms = caller_perms(); endif result = {}; forward_self = ((!this.mail_forward) || (this in this.mail_forward)); for recip in (args) if ((!valid(recip)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip))))) r = E_INVARG; elseif ($perm_utils:controls(perms, this) || ((typeof(this.readers) != LIST) && $perm_utils:controls(perms, recip))) this.mail_forward = setadd(this.mail_forward, recip); r = recip; else r = E_PERM; endif result = listappend(result, r); endfor if ((length(this.mail_forward) > 1) && ($nothing in this.mail_forward)) this.mail_forward = setremove(this.mail_forward, $nothing); endif if (forward_self) this.mail_forward = setadd(this.mail_forward, this); endif return result; . #46:9 ":delete_forward(recip[,recip...]) removes recipients to this list. Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)"; if (caller == $mail_editor) perms = player; else perms = caller_perms(); endif result = {}; forward_self = ((!this.mail_forward) || (this in this.mail_forward)); for recip in (args) if (!(recip in this.mail_forward)) r = E_INVARG; elseif (((!valid(recip)) || $perm_utils:controls(perms, recip)) || $perm_utils:controls(perms, this)) if (recip == this) forward_self = 0; endif this.mail_forward = setremove(this.mail_forward, recip); r = recip; else r = E_PERM; endif result = listappend(result, r); endfor if (!(forward_self || this.mail_forward)) this.mail_forward = {$nothing}; elseif (this.mail_forward == {this}) this.mail_forward = {}; endif return result; . #46:10 ":add_notify(recip[,recip...]) adds new notifiees to this list. Returns a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient)"; if (caller == $mail_editor) perms = player; else perms = caller_perms(); endif result = {}; for recip in (args) if ((!valid(recip)) || (recip == this)) r = E_INVARG; elseif ($perm_utils:controls(perms, this) || (this:is_readable_by(perms) && $perm_utils:controls(perms, recip))) this.mail_notify = setadd(this.mail_notify, recip); r = recip; else r = E_PERM; endif result = listappend(result, r); endfor return result; . #46:11 ":delete_notify(recip[,recip...]) removes notifiees from this list. Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)"; if (caller == $mail_editor) perms = player; else perms = caller_perms(); endif result = {}; rmthis = 0; for recip in (args) if (!(recip in this.mail_notify)) r = E_INVARG; elseif ((!valid(recip)) || ($perm_utils:controls(perms, recip) || $perm_utils:controls(perms, this))) if (recip == this) rmthis = 1; endif this.mail_notify = setremove(this.mail_notify, recip); r = recip; else r = E_PERM; endif result = listappend(result, r); endfor return result; . #46:12 if (!this:ok_write(caller, caller_perms())) return E_PERM; else this.messages = {@this.messages, {new = this:new_message_num(), args[1]}}; this.last_msg_date = args[1][1]; this.last_used_time = time(); return new; endif . #46:13 ":ok(caller,callerperms) => true iff caller can do read operations"; return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_readable_by(args[2])); . #46:14 ":ok_write(caller,callerperms) => true iff caller can do write operations"; return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_writable_by(args[2])); . #46:15 ":parse_message_seq(strings,cur) => msg_seq"; ""; ":from_msg_seq(olist) => msg_seq of messages from those people"; ":%from_msg_seq(strings) => msg_seq of messages with strings in the From: line"; ":to_msg_seq(olist) => msg_seq of messages to those people"; ":%to_msg_seq(strings) => msg_seq of messages with strings in the To: line"; ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:"; ":body_msg_seq(target) => msg_seq of messages with target in the body"; ":new_message_num() => number that the next incoming message will receive."; ":length_num_le(num) => number of messages in folder numbered <= num"; ":length_date_le(date) => number of messages in folder dated <= date"; ":length_all_msgs() => number of messages in folder"; ":exists_num_eq(num) => index of message in folder numbered == num, or 0"; ""; ":display_seq_headers(msg_seq[,cur]) display message summary lines"; ":display_seq_full(msg_seq[,preamble]) display entire messages"; " => number of final message displayed"; ":list_rmm() displays contents of .messages_going."; " => the number of messages in .messages_going."; ""; ":messages_in_seq(msg_seq) => list of messages in msg_seq on folder"; ""; "See the corresponding routines on $mail_agent for more detail."; return this:ok(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM; . #46:16 ":length_date_le(date) => number of messages in folder dated > date"; ""; if (this:ok(caller, caller_perms())) date = args[1]; return (this.last_msg_date <= date) ? 0 | $mail_agent:(verb)(date); else return E_PERM; endif . #46:17 ":rm_message_seq(msg_seq) removes the given sequence of from folder"; " => string giving msg numbers removed"; "See the corresponding routine on $mail_agent."; if (this:ok_write(caller, caller_perms())) return $mail_agent:(verb)(@args); elseif (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args))) return $mail_agent:(verb)(@listset(args, seq, 1)); else return E_PERM; endif . #46:18 ":rm_message_seq(msg_seq) removes the given sequence of from folder"; " => string giving msg numbers removed"; ":list_rmm() displays contents of .messages_going."; " => number of messages in .messages_going."; ":undo_rmm() restores previously deleted messages from .messages_going."; " => msg_seq of restored messages"; ":expunge_rmm() destroys contents of .messages_going once and for all."; " => number of messages in .messages_going."; ":renumber([cur]) renumbers all messages"; " => {number of messages,new cur}."; ""; "See the corresponding routines on $mail_agent."; return this:ok_write(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM; . #46:19 ":own_messages_filter(who,msg_seq) => subsequence of msg_seq consisting of those messages that <who> is actually allowed to remove (on the assumption that <who> is not one of the allowed writers of this folder."; if (!this.rmm_own_msgs) return E_PERM; elseif ((typeof(seq = this:from_msg_seq({args[1]}, args[2])) != LIST) || (seq != args[2])) return {}; else return seq; endif . #46:20 "NOTE: this routine is obsolete, use :messages_in_seq()"; ":messages(num) => returns the message numbered num."; ":messages() => returns the entire list of messages (can be SLOW)."; if (!this:ok(caller, caller_perms())) return E_PERM; elseif (!args) return this:messages_in_seq({1, this:length_all_msgs() + 1}); elseif (!(n = this:exists_num_eq(args[1]))) return E_RANGE; else return this:messages_in_seq(n)[2]; endif . #46:21 if (!this:ok_write(caller, caller_perms())) return E_PERM; endif date_seq = {}; for msg in (this.messages) date_seq = {@date_seq, msg[2][1]}; endfor msg_order = $list_utils:sort($list_utils:range(n = length(msgs = this.messages)), date_seq); newmsgs = {}; for i in [1..n] if ($command_utils:suspend_if_needed(0)) player:tell("...", i); endif newmsgs = {@newmsgs, {i, msgs[msg_order[i]][2]}}; endfor if (length(this.messages) != n) "...shit, new mail received,... start again..."; fork (0) this:date_sort(); endfork else this.messages = newmsgs; this.last_used_time = newmsgs[length(newmsgs)][2][1]; endif . #46:22 mlen = this:length_all_msgs(); this.last_msg_date = (mlen && this:messages_in_seq(mlen)[2][1]); . #46:23 return this.(verb); . #46:24 return $mail_agent:msg_summary_line(@args); . #46:25 for m in (this.messages) $mail_agent:__convert_new(@m[2]); $command_utils:suspend_if_needed(0); endfor . #46:26 if (!this:ok_write(caller, caller_perms())) return E_PERM; endif msgs = {}; i = 1; for m in (oldmsgs = this.messages) msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}}; if ($command_utils:running_out_of_time()) player:notify(tostr("...", i, " ", this)); suspend(0); if (oldmsgs != this.messages) return 0; endif endif i = (i + 1); endfor this.messages = msgs; return 1; . #46:27 if (caller_perms().wizard) pass(); if (!(this in {$mail_recipient, $big_mail_recipient})) "...generic mail recipients stay in #-1..."; move(this, $mail_agent); endif endif . #46:28 if ($perm_utils:controls(caller_perms(), this)) this.mail_forward = {}; return pass(@args); endif . #46:29 return this.aliases[1]; . #46:30 names = {}; for a in (this.aliases) if (!index(a, " ")) names = setadd(names, strsub(a, "_", "-")); endif endfor return names; . #46:31 if (caller_perms().wizard || (caller_perms() == this.owner)) "Passed security check..."; if (this.expire_period && (n = this:length_date_le(time() - this.expire_period))) this:rm_message_seq($seq_utils:range(1, n)); return this:expunge_rmm(); endif else return E_PERM; endif . #46:32 if (this:is_writable_by(caller_perms()) || this:is_writable_by(caller)) pass(@args); else return E_PERM; endif . #47:0 "resolve(name,from,seen,prevrcpts,prevnotifs) => {rcpts,notifs} or E_INVARG"; "resolve(list,from,seen,prevrcpts,prevnotifs) => {bogus,rcpts,notifs}"; "Given either an address (i.e., objectid) or a list of such, traces down all .mail_forward lists and .mail_notify to determine where a message should actually go and who should be told about it. Both forms take previous lists of recipients/notifications and add only those addresses that weren't there before. `seen' is the stack of addresses we are currently resolving (for detecting loops). The first form returns E_INVARG if `name' is invalid. The second form returns all invalid addresses in the `bogus' list but still does the appropriate search on the remaining addresses."; recip = args[1]; from = args[2]; if (length(args) == 2) args = {@args, {}, {}, {}}; endif seen = args[3]; sofar = args[4..5]; if (typeof(recip) == LIST) bogus = {}; for r in (recip) result = this:resolve_addr(r, from, seen, @sofar); if (result) sofar = result; else bogus = setadd(bogus, r); endif endfor return {bogus, @sofar}; else fwd = (include_recip = 0); if ((recip == $nothing) || (recip in seen)) return sofar; elseif ((!valid(recip)) || ((!(is_player(recip) || $object_utils:isa(recip, $mail_recipient))) || (typeof(fwd = recip:mail_forward(from)) != LIST))) "recip is a non-player non-mailing-list/folder or forwarding is screwed."; if (typeof(fwd) == STR) player:tell(fwd); endif return E_INVARG; elseif (fwd) if (r = (recip in fwd)) include_recip = 1; fwd = listdelete(fwd, r); endif result = this:resolve_addr(fwd, recip, setadd(seen, recip), @sofar); if (bogus = result[1]) player:tell(recip.name, "(", recip, ")'s .mail_forward list includes the following bogus entr", (length(bogus) > 1) ? "ies: " | "y: ", $string_utils:english_list(bogus)); endif sofar = result[2..3]; else include_recip = 1; endif if ((ticks_left() < 1000) || (seconds_left() < 2)) suspend(0); endif biffs = sofar[2]; for n in (this:mail_notify(recip, from)) if (valid(n)) if (i = $list_utils:iassoc_suspended(n, biffs)) biffs[i] = setadd(biffs[i], recip); else biffs = {{n, recip}, @biffs}; endif endif if ((ticks_left() < 1000) || (seconds_left() < 2)) suspend(0); endif endfor return {include_recip ? setadd(sofar[1], recip) | sofar[1], biffs}; endif . #47:1 "sends_to(from,addr,rcpt[,seen]) ==> true iff mail sent to addr passes through rcpt."; if ((addr = args[2]) == (rcpt = args[3])) return 1; elseif (!(addr in (seen = ((length(args) >= 4) ? args[4] | {})))) seen = {@seen, addr}; for a in ((typeof(fwd = this:mail_forward(addr, @args[1] ? {} | {args[1]})) == LIST) ? fwd | {}) if (this:sends_to(addr, a, rcpt, seen)) return 1; endif $command_utils:suspend_if_needed(0); endfor endif return 0; . #47:2 "send_message(from,rcpt-list,hdrs,msg) -- formats and sends a mail message. hders is either the text of the subject line, or a {subject,{reply-to,...}} list."; "Return E_PERM if from isn't owned by the caller."; "Return {0, @invalid_rcpts} if rcpt-list contains any invalid addresses. No mail is sent in this case."; "Return {1, @actual_rcpts} if successful."; from = args[1]; to = args[2]; hdrs = args[3]; msg = args[4]; if ($perm_utils:controls(caller_perms(), from)) text = $mail_agent:make_message(from, to, hdrs, msg); return this:raw_send(text, to, from); else return E_PERM; endif . #47:3 "WIZARDLY"; "raw_send(text,rcpts,sender) -- does the actual sending of a message. Assumes that text has already been formatted correctly. Decides who to send it to and who wants to be notified about it and does so."; "Return {E_PERM} if the caller is not entitled to use this verb."; "Return {0, @invalid_rcpts} if rcpts contains any invalid addresses. No mail is sent in this case."; "Return {1, @actual_rcpts} if successful."; text = args[1]; rcpts = args[2]; from = args[3]; if (typeof(rcpts) != LIST) rcpts = {rcpts}; endif if (!(caller in {$mail_agent, $mail_editor})) return {E_PERM}; elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1]) return {0, bogus}; else this:touch(rcpts); actual_rcpts = resolve[2]; biffs = resolve[3]; results = {}; for recip in (actual_rcpts) if ((ticks_left() < 10000) || (seconds_left() < 2)) player:notify(tostr("...", recip)); suspend(1); endif if (typeof(e = recip:receive_message(text, from)) in {ERR, STR}) "...receive_message bombed..."; player:notify(tostr(recip, ":receive_message: ", e)); e = 0; elseif ((!is_player(recip)) || (!e)) "...not a player or receive_message isn't giving out the message number"; "...no need to force a notification..."; elseif (i = $list_utils:iassoc(recip, biffs)) "...player-recipient was already getting a notification..."; "...make sure notification includes a mention of him/her/itself."; if (!(recip in listdelete(biffs[i], 1))) biffs[i][2..1] = {recip}; endif else "...player-recipient wasn't originally being notified at all..."; biffs = {{recip, recip}, @biffs}; endif results = {@results, e}; endfor fork (0) for b in (biffs) if ((ticks_left() < 10000) || (seconds_left() < 2)) suspend(1); endif if ($object_utils:has_callable_verb(b[1], "notify_mail")) mnums = {}; for r in (listdelete(b, 1)) mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]}; endfor b[1]:notify_mail(from, listdelete(b, 1), mnums); endif endfor endfork if ((len = length(actual_rcpts)) > 10) len = 10; endif if (len) this.total_recipients[len] = (this.total_recipients[len] + 1); endif return {1, @actual_rcpts}; endif . #47:4 who = args[1]; if ($object_utils:has_verb(who, verb)) return who:(verb)(@listdelete(args, 1)); else return {}; endif . #47:5 "touch(name or list,seen) => does .last_used_time = time() if we haven't already touched this in the last hour"; recip = args[1]; seen = ((length(args) >= 2) ? args[2] | {}); if (typeof(recip) == LIST) for r in (recip) result = this:touch(r, seen); $command_utils:suspend_if_needed(0); endfor else if (((!valid(recip)) || (recip in seen)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip))))) "recip is neither a player nor a mailing list/folder"; else if (fwd = this:mail_forward(recip)) this:touch(fwd, {@seen, recip}); endif if (!is_player(recip)) recip.last_used_time = time(); endif endif endif . #47:6 player:tell_lines(this.description); for c in (this.contents) c:look_self(); endfor . #47:7 "Only allow mailing lists/folders in here and only if their names aren't already taken."; what = args[1]; return ($object_utils:isa(what, $mail_recipient) && this:check_names(@what.aliases)) && (what:description() != parent(what):description()); . #47:8 "...make sure the list has at least one usable name."; "...make sure none of the aliases are already taken."; ok = 0; for a in (args) if (index(a, " ")) elseif (rp = $mail_agent:reserved_pattern(a)) player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]); return 0; elseif (valid(p = $mail_agent:match(a, #-1)) && (a in p.aliases)) player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")"); return 0; else ok = 1; endif endfor return ok; . #47:9 ":match(string) => mailing list object in here that matches string."; ":match(string,player) => similar but also matches against player's private mailing lists (as kept in .mail_lists)."; if (!(string = args[1])) return $nothing; elseif (string[1] == "*") string = string[2..length(string)]; endif if (valid(o = $string_utils:literal_object(string)) && ($mail_recipient in $object_utils:ancestors(o))) return o; elseif (rp = this:reserved_pattern(string)) return rp[2]:match_mail_recipient(string); else if (valid(who = {@args, player}[2]) && (typeof(use = who.mail_lists) == LIST)) use = {@this.contents, @use}; else use = this.contents; endif partial = 1; string = strsub(string, "_", "-"); for l in (use) if (string in l.aliases) return l; endif if (partial != $ambiguous_match) for a in (l.aliases) if ((index(a, string) == 1) && (!index(a, " "))) if (partial) partial = l; elseif (partial != l) partial = $ambiguous_match; endif endif endfor endif endfor return partial && $failed_match; endif . #47:10 ":match_recipient(string[,meobj]) => $player or $mail_recipient object that matches string. Optional second argument (defaults to player) is returned in the case string==\"me\" and is also used to obtain a list of private $mail_recipients to match against."; string = args[1]; if (!string) return $nothing; elseif ((string[1] == "*") && (string != "*")) return this:match(@args); elseif (string[1] == "`") args[1][1..1] = ""; return $string_utils:match_player(@args); elseif (valid(o = $string_utils:match_player(@args)) || (o == $ambiguous_match)) return o; else return this:match(@args); endif . #47:11 match_result = args[1]; string = args[2]; cmd_id = ({@args, ""}[3] || ""); if (match_result == $nothing) player:tell(cmd_id, "You must specify a valid mail recipient."); elseif (match_result == $failed_match) player:tell(cmd_id, "There is no mail recipient called \"", string, "\"."); elseif (match_result == $ambiguous_match) if ((nostar = (index(string, "*") != 1)) && (lst = $player_db:find_all(string))) player:tell(cmd_id, "\"", string, "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), "."); else player:tell(cmd_id, "I don't know which \"", nostar ? "*" | "", string, "\" you mean."); endif elseif (!valid(match_result)) player:tell(cmd_id, match_result, " does not exist."); else return 0; endif return 1; . #47:12 ":make_message(sender,recipients,subject/replyto,body)"; " => message in the form as it will get sent."; from = args[1]; fromline = tostr(valid(from) ? from.name | "???", " (", from, ")"); if (typeof(recips = args[2]) != LIST) recips = {recips}; endif recips = this:name_list(@recips); if (typeof(hdrs = args[3]) != LIST) subj = hdrs; replyto = (valid(from) && ((!is_player(from)) && ((!$object_utils:isa(from, $mail_recipient)) && this:name(from.owner)))); else subj = hdrs[1]; replyto = ({@hdrs, 0}[2] && this:name_list(@hdrs[2])); endif body = args[4]; if (typeof(body) != LIST) body = (body ? {body} | {}); endif return {time(), fromline, recips, subj || " ", @replyto ? {"Reply-to: " + replyto} | {}, "", @body}; . #47:13 what = args[1]; return tostr(strsub(strsub($object_utils:isa(what, $player) ? what.name | tostr("*", what:mail_name()), "(", ""), ")", ""), " (", what, ")"); . #47:14 return $string_utils:english_list($list_utils:map_arg(this, "name", args), "no one"); . #47:15 ":parse_address_field(string) => list of objects"; "This is the standard routine for parsing address lists that appear in From:, To: and Reply-To: lines"; objects = {}; string = args[1]; while (e = index(string, ")")) if ((s = rindex(string[1..e], "(#")) && (#0 != (o = toobj(string[s + 2..e - 1])))) objects = {@objects, o}; endif string = string[e + 1..length(string)]; endwhile return objects; . #47:16 ":display_seq_full(msg_seq[,preamble]) => {cur, last-read-date}"; "This is the default message display routine."; "Prints entire messages on folder (caller) to player. msg_seq is the handle returned by :parse_message_seq(...) and indicates which messages should be printed. preamble, if given will precede the output of the message itself, in which case the message number will be substituted for \"%d\". Returns the number of the final message in the sequence (which can be then used as the new current message number)."; set_task_perms(caller_perms()); preamble = {@args, ""}[2]; cur = (date = 0); for x in (msgs = caller:messages_in_seq(args[1])) cur = x[1]; date = x[2][1]; player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@x[2])); if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor return {cur, date}; . #47:17 ":display_seq_headers(msg_seq[,cur[,last_read_date]])"; "This is the default header display routine."; "Prints a list of headers of messages on caller to player. msg_seq is the handle returned by caller:parse_message_seq(...). cur is the player's current message. last_read_date is the date of the last of the already-read messages."; set_task_perms(caller_perms()); cur = {@args, 0}[2]; last_old = {@args, $maxint, $maxint}[3]; width = (player:linelen() || 79); for x in (msgs = caller:messages_in_seq(args[1])) line = tostr($string_utils:right(x[1], 4, (cur == x[1]) ? ">" | " "), (x[2][1] > last_old) ? ":+ " | ": ", caller:msg_summary_line(@x[2])); player:tell(line[1..min(width, length(line))]); if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor player:tell("----+"); . #47:18 ":rm_message_seq(msg_seq) removes the given sequence of from folder (caller)"; "...removed messages are saved in .messages_going for possible restoration."; set_task_perms(caller_perms()); old = caller.messages; new = (save = (nums = {})); next = 1; for i in [1..length(seq = args[1]) / 2] if ((ticks_left() < 500) || (seconds_left() < 2)) player:tell("... rmm ", old[next][1] - 1); suspend(0); endif start = seq[(2 * i) - 1]; new = {@new, @old[next..start - 1]}; save = {@save, {start - next, old[start..(next = seq[2 * i]) - 1]}}; nums = {@nums, old[start][1], old[next - 1][1] + 1}; endfor new = {@new, @old[next..length(old)]}; caller.messages_going = save; caller.messages = new; if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date")) caller:_fix_last_msg_date(); endif return $seq_utils:tostr(nums); . #47:19 ":undo_rmm() restores previously deleted messages in .messages_going to .messages."; set_task_perms(caller_perms()); old = caller.messages; new = (seq = {}); last = 0; next = 1; for s in (caller.messages_going) new = {@new, @old[last + 1..last + s[1]], @s[2]}; last = (last + s[1]); seq = {@seq, next + s[1], next = (length(new) + 1)}; endfor caller.messages = {@new, @old[last + 1..length(old)]}; caller.messages_going = {}; if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date")) caller:_fix_last_msg_date(); endif return seq; . #47:20 ":list_rmm() displays contents of .messages_going."; ":expunge_rmm() destroys contents of .messages_going once and for all."; "... both return the number of messages in .messages_going."; set_task_perms(caller_perms()); msgs = (seq = {}); for s in (caller.messages_going) msgs = {@msgs, @s[2]}; endfor if (verb == "expunge_rmm") caller.messages_going = {}; else for x in (msgs) player:tell($string_utils:right(x[1], 4), ": ", caller:msg_summary_line(@x[2])); if ((ticks_left() < 500) || (seconds_left() < 2)) suspend(0); endif endfor if (msgs) player:tell("----+"); endif endif return length(msgs); . #47:21 ":renumber([cur]) -- assumes caller is a $mail_recipient or a $player."; "...renumbers caller.messages, doing a suspend() if necessary."; "...returns {number of messages,new cur}."; set_task_perms(caller_perms()); cur = {@args, 0}[1]; caller.messages_going = {}; "... blow away @rmm'ed messages since there's no way to tell what their new numbers should be..."; msgs = caller.messages; if (cur) cur = $list_utils:iassoc_sorted(cur, msgs); endif while (1) "...find first out-of-sequence message..."; l = 0; r = ((len = length(msgs)) + 1); while ((r - 1) > l) if (msgs[i = ((r + l) / 2)][1] > i) r = i; else l = i; endif endwhile "... r == first out-of-sequence, l == last in-sequence, l+1 == r ..."; if (l >= len) return {l, cur}; endif "...renumber as many messages as we have time for..."; chunk = {}; while (((r <= len) && (ticks_left() > 3000)) && (seconds_left() > 2)) for x in (msgs[r..min(r + 9, len)]) chunk = {@chunk, {r, x[2]}}; r = (r + 1); endfor endwhile caller.messages = {@msgs[1..l], @chunk, @msgs[r..len]}; if (chunk) player:tell("...(renumbering ", l + 1, " -- ", r - 1, ")"); suspend(0); else player:tell("You lose. This message collection is just too big."); return; endif "... have to be careful since new mail may be received at this point..."; msgs = caller.messages; endwhile . #47:22 ":msg_summary_line(@msg) => date/from/subject as a single string."; body = (("" in {@args, ""}) + 1); if ((body > length(args)) || (!(subject = args[body]))) subject = "(None.)"; endif date = ctime(args[1])[5..16]; from = args[2]; if (args[4] != " ") subject = args[4]; endif return tostr(date, " ", $string_utils:left(from, 20), " ", subject); . #47:23 ":msg_summary_line(@msg) => date/from/subject as a single string."; blank = ("" in {@args, ""}); if ((blank < length(args)) && args[blank + 1]) if (length(args[blank + 1]) <= 28) subject = args[blank + 1]; else subject = (args[blank + 1][1..25] + "..."); endif else subject = "(None.)"; endif if (typeof(args[1]) == NUM) date = ctime(args[1])[5..16]; start = 2; else date = "?Date?"; start = 1; endif if ((start == 2) && (index(args[2], "From:") != 1)) from = args[2]; if (args[4] != " ") subject = args[4]; endif else from = "?From?"; for line in (args[start..blank - 1]) if (index(line, "Date:") == 1) date = $string_utils:triml(line[6..length(line)])[5..16]; elseif (index(line, "From:") == 1) from = $string_utils:triml(line[6..length(line)]); elseif (index(line, "Subject:") == 1) s = $string_utils:triml(line[9..length(line)]); if (s != "(None.)") subject = s; endif endif endfor endif (subject && (length(subject) > 32)) && (subject = subject[1..32]); return tostr(date, " ", $string_utils:left(from, 20), " ", subject); . #47:24 "parse_message_seq(strings,cur[,last_old])"; "This is the default <message-sequence> parsing routine for those mail commands that refer to sequences of messages (@mail, @read,...) on a folder."; " caller (the folder) is assumed to be a $mail_recipient or a player."; " strings is the <message-sequence> portion of the arg list."; " cur is the number of the player's current message for this folder."; "Returns a handle (msg_seq) that will be understood by caller:display_seq_full() or caller:display_seq_headers()."; set_task_perms(caller_perms()); if (!(nummsgs = caller:length_all_msgs())) return "%f %<has> no messages."; elseif (typeof(strings = args[1]) != LIST) strings = {strings}; endif cur = {@args, 0}[2]; last_old = {@args, 0, 0}[3]; seq = (result = {}); mode = #0; "... changes to 0 if we start seeing message numbers, to 1 if we see masks..."; keywords = ":from:%from:to:%to:subject:body:before:after:since:until:first:last"; keyalist = {{1, "from"}, {6, "%from"}, {12, "to"}, {15, "%to"}, {19, "subject"}, {27, "body"}, {32, "before"}, {39, "after"}, {45, "since"}, {51, "until"}, {57, "first"}, {63, "last"}}; strnum = 0; for string in (strings) strnum = (strnum + 1); $command_utils:suspend_if_needed(0); if (string && ((c = index(string, ":")) && ((k = index(keywords, ":" + string[1..c - 1])) && (k == rindex(keywords, ":" + string[1..c - 1]))))) "...we have a mask to apply..."; keywd = $list_utils:assoc(k, keyalist)[2]; if (mode == #0) seq = {1, nummsgs + 1}; endif mode = 1; if (k <= 27) "...from, subject, to, body..."; pattern = string[c + 1..length(string)]; if (keywd in {"subject", "body"}) elseif (keywd[1] == "%") pattern = $string_utils:explode(pattern, "|"); else pattern = this:((keywd == "to") ? "_parse_to" | "_parse_from")(pattern); if (typeof(pattern) == STR) return pattern; endif endif seq = caller:(keywd + "_msg_seq")(pattern, seq); if (typeof(seq) == STR) if (strnum == 1) return seq; else seq = {}; endif endif elseif (k <= 51) "...before, since, after, until..."; if (typeof(date = this:_parse_date(string[c + 1..length(string)])) != NUM) return tostr("Bad date `", string, "': ", date); endif s = caller:length_date_le((keywd in {"before", "since"}) ? date - 1 | (date + 86399)); if (keywd in {"before", "until"}) seq = $seq_utils:remove(seq, s + 1, nummsgs); else seq = $seq_utils:remove(seq, 1, s); endif else "...first, last..."; if (n = tonum(string[c + 1..length(string)])) seq = $seq_utils:(keywd + "n")(seq, n); else return tostr("Bad number in `", string, "'"); endif endif else "...continue building the present sequence..."; if (mode) seq && (result = $seq_utils:union(result, seq)); seq = {}; endif mode = 0; if (!string) "...default case for @read and @answer: get the current message but skip to the next one if it's not there..."; if (cur) i = min(caller:length_num_le(cur - 1) + 1, nummsgs); seq = $seq_utils:add(seq, i, i); else return "%f %<has> no current message"; endif elseif (string == "next") if ((i = (caller:length_num_le(cur) + 1)) <= nummsgs) seq = $seq_utils:add(seq, i, i); else return "%f %<has> no next message."; endif elseif (string == "prev") if (i = caller:length_num_le(cur - 1)) seq = $seq_utils:add(seq, i, i); else return "%f %<has> no previous message."; endif elseif (string == "new") s = (last_old ? caller:length_date_le(last_old) | caller:length_num_le(cur)); if (s < nummsgs) seq = $seq_utils:add(seq, s + 1, nummsgs); else return "%f %<has> no new messages."; endif elseif (n = (tonum(string) || (((string in {"last", "$"}) && -1) || ((string == "cur") && cur)))) if (n <= 0) seq = $seq_utils:add(seq, max(0, nummsgs + n) + 1, nummsgs); elseif (i = caller:exists_num_eq(n)) seq = $seq_utils:add(seq, i, i); else return (string == "cur") ? "%f's current message has been removed." | tostr("%f %<has> no message numbered `", string, "'."); endif elseif (((i = index(string, "..")) > 1) || ((i = index(string, "-")) > 1)) if ((start = tonum(sst = string[1..i - 1])) > 0) s = caller:length_num_le(start - 1); elseif (sst in {"next", "prev", "cur"}) s = max(0, caller:length_num_le(cur - (sst != "next")) - (sst == "prev")); elseif (sst in {"last", "$"}) s = (nummsgs - 1); else return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]}; endif j = ((string[i] == ".") ? i + 2 | (i + 1)); if ((end = tonum(est = string[j..length(string)])) > 0) e = caller:length_num_le(end); elseif (est in {"next", "prev", "cur"}) e = min(nummsgs, caller:length_num_le(cur - (est == "prev")) + (est == "next")); elseif (est in {"last", "$"}) e = nummsgs; else return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]}; endif if (s < e) seq = $seq_utils:add(seq, s + 1, e); else return tostr("%f %<has> no messages in range ", string, "."); endif elseif (string == "cur") return "%f %<has> no current message."; else return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]}; endif endif endfor return {$seq_utils:union(result, seq)}; . #47:25 ":_parse_from(string with |'s in it) => object list"; ":_parse_to(string with |'s in it) => object list"; " for from:string and to:string items in :parse_message_seq"; if (verb == "_parse_to") match_obj = (fail_obj = this); match_verb = "match_recipient"; fail_verb = "match_failed"; else match_obj = $string_utils; match_verb = "match_player"; fail_obj = $command_utils; fail_verb = "player_match_failed"; endif plist = {}; for w in ($string_utils:explode(args[1], "|")) if (fail_obj:(fail_verb)(p = match_obj:(match_verb)(w), w)) p = $string_utils:literal_object(w); if ((p == $failed_match) || (!$command_utils:yes_or_no("Continue? "))) return "Bad address list: " + args[1]; endif endif plist = setadd(plist, p); endfor return plist; . #47:26 words = $string_utils:explode(args[1], "-"); if (length(words) == 1) time = $time_utils:from_day(words[1], -1); if (typeof(time) == ERR) time = "weekday expected."; endif elseif ((!words) || ((length(words) > 3) || ((!tonum(words[1])) || (E_TYPE == (year = $code_utils:tonum({@words, "-1"}[3])))))) time = "Date should be of the form `5-Jan', `5-Jan-92', `Wed',`Wednesday'"; else day = tonum(words[1]); time = $time_utils:dst_midnight($time_utils:from_month(words[2], -1, day)); if (length(words) == 3) thisyear = tonum(ctime(time)[21..24]); if (100 > year) year = ((thisyear + 50) - (((thisyear - year) + 50) % 100)); endif time = $time_utils:dst_midnight($time_utils:from_month(words[2], (year - thisyear) - (year <= thisyear), day)); endif endif return time; . #47:27 ":new_message_num() => number that the next incoming message will receive."; set_task_perms(caller_perms()); new = ((msgs = caller.messages) ? msgs[length(msgs)][1] + 1 | 1); if (rmsgs = caller.messages_going) lbrm = rmsgs[length(rmsgs)][2]; return max(new, lbrm[length(lbrm)][1] + 1); else return new; endif . #47:28 set_task_perms(caller_perms()); return length(caller.messages); . #47:29 set_task_perms(caller_perms()); date = args[1]; msgs = caller.messages; if ((r = length(caller.messages)) < 25) for l in [1..r] if (msgs[l][2][1] > date) return l - 1; endif endfor return r; else l = 1; while (l <= r) if (date < msgs[i = ((r + l) / 2)][2][1]) r = (i - 1); else l = (i + 1); endif endwhile return r; endif . #47:30 set_task_perms(caller_perms()); date = args[1]; msgs = caller.messages; if ((len = length(caller.messages)) < 25) for r in [0..len - 1] if (msgs[len - r][2][1] <= date) return r; endif endfor return len; else l = 1; r = len; while (l <= r) if (date < msgs[i = ((r + l) / 2)][2][1]) r = (i - 1); else l = (i + 1); endif endwhile return len - r; endif . #47:31 ":length_num_le(num) => number of messages in folder numbered <= num"; set_task_perms(caller_perms()); return $list_utils:iassoc_sorted(args[1], caller.messages); . #47:32 ":exists_num_eq(num) => index of message in folder numbered == num"; set_task_perms(caller_perms()); return (i = $list_utils:iassoc_sorted(args[1], caller.messages)) && ((caller.messages[i][1] == args[1]) && i); . #47:33 ":from_msg_seq(object or list[,mask])"; " => msg_seq of messages from any of these senders"; set_task_perms(caller_perms()); if (typeof(plist = args[1]) != LIST) plist = {plist}; endif mask = {@args, {1}}[2]; i = 1; fseq = {}; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) fromline = msg[2][2]; if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist) fseq = $seq_utils:add(fseq, i, i); endif else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or ")); . #47:34 ":%from_msg_seq(string or list of strings[,mask])"; " => msg_seq of messages with one of these strings in the from line"; set_task_perms(caller_perms()); if (typeof(nlist = args[1]) != LIST) nlist = {nlist}; endif i = 1; fseq = {}; mask = {@args, {1}}[2]; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) fromline = (" " + msg[2][2]); for n in (nlist) if (index(fromline, n)) fseq = $seq_utils:add(fseq, i, i); endif endfor else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or ")); . #47:35 ":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people"; set_task_perms(caller_perms()); if (typeof(plist = args[1]) != LIST) plist = {plist}; endif mask = {@args, {1}}[2]; i = 1; seq = {}; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) toline = msg[2][3]; for r in ($mail_agent:parse_address_field(toline)) if (r in plist) seq = $seq_utils:add(seq, i, i); endif endfor else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or ")); . #47:36 ":%to_msg_seq(string or list of strings[,mask])"; " => msg_seq of messages containing one of strings in the to line"; set_task_perms(caller_perms()); if (typeof(nlist = args[1]) != LIST) nlist = {nlist}; endif i = 1; seq = {}; mask = {@args, {1}}[2]; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) toline = (" " + msg[2][3]); for n in (nlist) if (index(toline, n)) seq = $seq_utils:add(seq, i, i); endif endfor else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or ")); . #47:37 ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:"; set_task_perms(caller_perms()); target = args[1]; i = 1; seq = {}; mask = {@args, {1}}[2]; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ((length(mask) < 2) || (i < mask[2])) subject = msg[2][4]; if (index(subject, target)) seq = $seq_utils:add(seq, i, i); endif else mask = mask[3..length(mask)]; endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return seq || (("%f %<has> no messages with subjects containing `" + target) + "'"); . #47:38 ":body_msg_seq(target[,mask]) => msg_seq of messages with target in the body"; set_task_perms(caller_perms()); target = args[1]; i = 1; seq = {}; mask = {@args, {1}}[2]; for msg in (caller.messages) if ((!mask) || (i < mask[1])) elseif ({@mask, $maxint}[2] <= i) mask = mask[3..length(mask)]; elseif ((bstart = ("" in (msg = msg[2]))) && ((l = length(msg)) > bstart)) while ((!index(msg[l], target)) && ((l = (l - 1)) > bstart)) $command_utils:suspend_if_needed(0); endwhile if (l > bstart) seq = $seq_utils:add(seq, i, i); endif endif i = (i + 1); $command_utils:suspend_if_needed(0); endfor return seq || tostr("%f %<has> no messages containing `", target, "' in the body."); . #47:39 ":messages_in_seq(msg_seq) => list of messages in msg_seq on folder (caller)"; set_task_perms(caller_perms()); if (typeof(msgs = args[1]) != LIST) return caller.messages[msgs]; elseif (length(msgs) == 2) return caller.messages[msgs[1]..msgs[2] - 1]; else return $seq_utils:extract(msgs, caller.messages); endif . #47:40 ":__convert_new(@msg) => msg in new format (if it isn't already)"; " ^ don't forget the @ here."; "If the msg is already in the new format it passes through unchanged."; "If the msg format is unrecognizable, warnings are printed."; if (typeof(date = args[1]) != NUM) date = 0; start = 1; else start = 2; if (!((colon = index(args[2], ":")) && (args[2][1..colon] in {"From:", "To:", "Subject:"}))) return args; endif endif from = (to = 0); subject = " "; blank = ("" in {@args, ""}); newhdr = {}; for line in (args[start..blank - 1]) if (index(line, "Date:") == 1) if (date) player:notify("Warning: two dates?"); endif date = $time_utils:from_ctime(line[6..length(line)]); elseif (index(line, "From:") == 1) if (from) player:notify("Warning: two from-lines?"); endif from = $string_utils:triml(line[6..length(line)]); elseif (index(line, "To:") == 1) if (to) player:notify("Warning: two to-lines?"); endif to = $string_utils:triml(line[6..length(line)]); elseif (index(line, "Subject:") == 1) subject = $string_utils:triml(line[9..length(line)]); else newhdr = {@newhdr, line}; endif endfor if (!from) player:notify("Warning: no from-line."); endif if (!to) player:notify("Warning: no to-line."); endif return {date, from, to, subject, @newhdr, @args[blank..length(args)]}; . #47:41 ":to_text(@msg) => message in text form (suitable for printing)"; return {"Date: " + ctime(args[1]), "From: " + args[2], "To: " + args[3], @(args[4] == " ") ? {} | {"Subject: " + args[4]}, @args[5..length(args)]}; . #47:42 what = args[1]; if ($object_utils:isa(what, $mail_recipient)) return what:(verb)(@listdelete(args, 1)); else "...it's a player:"; "... anyone can send mail to it."; "... only the player itself or a wizard can read it."; return (verb == "is_usable_by") || $perm_utils:controls(args[2], what); endif . #47:43 "WIZARDLY"; "raw_send(text,rcpts,sender) -- does the actual sending of a message. Assumes that text has already been formatted correctly. Decides who to send it to and who wants to be notified about it and does so."; "Return {E_PERM} if the caller is not entitled to use this verb."; "Return {0, @invalid_rcpts} if rcpts contains any invalid addresses. No mail is sent in this case."; "Return {1, @actual_rcpts} if successful."; text = args[1]; rcpts = args[2]; from = args[3]; if (typeof(rcpts) != LIST) rcpts = {rcpts}; endif if (!(caller in {$mail_agent, $mail_editor})) return {E_PERM}; elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1]) return {0, bogus}; else this:touch(rcpts); actual_rcpts = resolve[2]; biffs = resolve[3]; results = {}; for recip in (actual_rcpts) if ((ticks_left() < 1000) || (seconds_left() < 5)) player:notify(tostr("...", recip)); suspend(0); endif if (typeof(e = recip:receive_message(text, from)) in {ERR, STR}) "...receive_message bombed..."; player:notify(tostr(recip, ":receive_message: ", e)); e = 0; elseif ((!is_player(recip)) || (!e)) "...not a player or receive_message isn't giving out the message number"; "...no need to force a notification..."; elseif (i = $list_utils:iassoc(recip, biffs)) "...player-recipient was already getting a notification..."; "...make sure notification includes a mention of him/her/itself."; if (!(recip in listdelete(biffs[i], 1))) biffs[i][2..1] = {recip}; endif else "...player-recipient wasn't originally being notified at all..."; biffs = {{recip, recip}, @biffs}; endif results = {@results, e}; endfor fork (0) for b in (biffs) if ((ticks_left() < 1000) || (seconds_left() < 5)) suspend(0); endif if ($object_utils:has_callable_verb(b[1], "notify_mail")) mnums = {}; for r in (listdelete(b, 1)) mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]}; endfor b[1]:notify_mail(from, listdelete(b, 1), mnums); endif endfor endfork return {1, @actual_rcpts}; endif . #47:44 ":reserved_pattern(string)"; " if string matches one of the reserved patterns for mailing list names, "; " we return that element of .reserved_patterns."; string = args[1]; for p in (this.reserved_patterns) if (match(string, p[1])) return p; endif endfor return 0; . #47:45 return valid(what = args[1]) && (($player in (ances = $object_utils:ancestors(what))) || ($mail_recipient in ances)); . #48:0 return this:ok(who = args[1]) && tostr("a letter ", this.sending[who] ? "(in transit) " | "", "to ", this:recipient_names(who), (subject = this.subjects[who]) && tostr(" entitled \"", subject, "\"")); . #48:1 "invoke(rcptstrings,verb[,subject]) for a @send"; "invoke(1,verb,rcpts,subject,replyto,body) if no parsing is needed"; "invoke(2,verb,msg,flags,replytos) for an @answer"; if (!(which = args[1])) player:tell_lines({tostr("Usage: ", args[2], " <list-of-recipients>"), tostr(" ", args[2], " to continue with a previous draft")}); elseif (typeof(which) == LIST) "...@send..."; if (rcpts = this:parse_recipients({}, which)) if (replyto = player:mail_option("replyto")) replyto = this:parse_recipients({}, replyto, ".mail_options: "); endif if (0 == (subject = {@args, 0}[3])) if (player:mail_option("nosubject")) subject = ""; else player:tell("Subject:"); subject = $command_utils:read(); endif endif return {rcpts, subject, replyto, {}}; endif elseif (which == 1) return args[3..6]; elseif (!(to_subj = this:parse_msg_headers(msg = args[3], flags = args[4]))) else include = {}; if ("include" in flags) prefix = "> "; for line in ($mail_agent:to_text(@msg)) if (!line) prefix = "> "; endif include = {@include, @this:fill_string("> " + line, 70, prefix)}; endfor endif return {@to_subj, args[5], include}; endif return 0; . #48:2 if (this:ok(who = args[1])) this.sending[who] = 0; this.recipients[who] = args[2]; this.subjects[who] = args[3]; this.replytos[who] = (args[4] || {}); this:load(who, args[5]); this.active[who]:tell("Composing ", this:working_on(who)); p = this.active[who]; if (p:mail_option("enter") && (!args[5])) if (typeof(lines = $command_utils:read_lines()) == ERR) p:tell(lines); else this:insert_line(p in this.active, lines, 0); endif endif endif . #48:3 if (!dobjstr) plyr = player; elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(dobjstr), dobjstr)[1]) return; endif if (typeof(msg = this:message_with_headers(plyr in this.active)) != LIST) if (player == plyr) player:tell(msg); else player:tell(plyr.name, "(", plyr, ") has not published anything here."); endif return; else player:display_message({((plyr == player) ? "Your" | tostr(plyr.name, "(", plyr, ")'s")) + " message so far:", ""}, player:msg_text(@msg)); endif . #48:4 return (this:readable(who = args[1]) || this:ok(who)) && $mail_agent:make_message(this.active[who], this.recipients[who], {this.subjects[who], this.replytos[who]}, this:text(who)); . #48:5 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (!argstr) player:tell(this.subjects[who]); elseif (ERR == typeof(subj = this:set_subject(who, argstr))) player:tell(subj); else player:tell(subj ? ("Setting the subject line for your message to \"" + subj) + "\"." | "Deleting the subject line for your message."); endif . #48:6 if (!(fuckup = this:ok(who = args[1]))) return fuckup; else this.subjects[who] = (subj = args[2]); this:set_changed(who, 1); return subj; endif . #48:7 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (!args) player:tell("Your message is currently to ", this:recipient_names(who), "."); else this.recipients[who] = this:parse_recipients({}, args); this:set_changed(who, 1); player:tell("Your message is now to ", this:recipient_names(who), "."); endif . #48:8 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); else this.recipients[who] = this:parse_recipients(this.recipients[who], args); this:set_changed(who, 1); player:tell("Your message is now to ", this:recipient_names(who), "."); endif . #48:9 "parse_recipients(prev_list,list_of_strings) -- parses list of strings and adds any resulting player objects to prev_list. Optional 3rd arg is prefixed to any mismatch error messages"; recips = args[1]; cmd_id = ({@args, ""}[3] || ""); for s in ((typeof(l = args[2]) == LIST) ? l | {l}) if (typeof(s) != STR) if ($mail_agent:is_recipient(s)) recips = setadd(recips, s); else player:tell(cmd_id, s, " is not a valid mail recipient."); endif elseif (!$mail_agent:match_failed(md = $mail_agent:match_recipient(s), s, cmd_id)) recips = setadd(recips, md); endif endfor return recips; . #48:10 return this:ok(who = args[1]) && $mail_agent:name_list(@this.recipients[who]); . #48:11 return $mail_agent:make_message(@args); . #48:12 "(obsolete verb... see $mail_agent:name_list)"; return $mail_agent:(verb)(@args[1]); . #48:13 "parse_msg_headers(msg,flags)"; " parses msg to extract reply recipients and construct a subject line"; " if the \"all\" flag is present, reply goes to all of the original recipients"; " returns a list {recipients, subjectline} or 0 in case of error."; msg = args[1]; replyall = ("all" in args[2]); objects = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | "")); for line in (msg[5..("" in {@msg, ""}) - 1]) if (rt = (index(line, "Reply-to:") == 1)) objects = $mail_agent:parse_address_field(line); endif endfor recips = {}; for o in (objects) if (o == #0) player:tell("Sorry, but I can't parse the header of that message."); return 0; elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o))))) player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient."); elseif (o != player) recips = setadd(recips, o); endif endfor subject = msg[4]; if (subject == " ") subject = ""; elseif (subject && (index(subject, "Re: ") != 1)) subject = ("Re: " + subject); endif return {recips, subject}; . #48:14 flags = {}; for o in ({"all", "include"}) if (player:mail_option(o)) flags = {@flags, o}; endif endfor reply_to = (player:mail_option("replyto") || {}); flaglist = "+1#include -1#noinclude +2#all -2#sender 0#replyto "; for a in (args) if (i = index(a, "=")) value = a[i + 1..length(a)]; a = a[1..i - 1]; else value = ""; endif if ((typeof(a) != STR) || ((i = index(flaglist, "#" + a)) < 3)) player:tell("Unrecognized answer/reply option: ", a); return 0; elseif (i != rindex(flaglist, "#" + a)) player:tell("Ambiguous answer/reply option: ", a); return 0; elseif (j = (index("0123456789", flaglist[i - 1]) - 1)) if (value) player:tell("Flag does not take a value: ", a); return 0; endif f = {"include", "all"}[j]; flags = ((flaglist[i - 2] == "+") ? setadd(flags, f) | setremove(flags, f)); elseif ((!value) || (value = this:parse_recipients({}, $string_utils:explode(value), "replyto flag: "))) reply_to = (value || {}); endif endfor return {flags, reply_to}; . #48:15 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); else if (args) this.replytos[who] = (rt = this:parse_recipients({}, args)); this:set_changed(who, 1); else rt = this.replytos[who]; endif player:tell(rt ? ("Replies will go to " + $mail_agent:name_list(@this.replytos[who])) + "." | "Reply-to field is empty."); endif . #48:16 "WIZARDLY"; if (!(who = this:loaded(player))) player:notify(this:nothing_loaded_msg()); elseif (!(recips = this.recipients[who])) player:notify("Umm... your message isn't addressed to anyone."); elseif (this.sending[who]) player:notify("Again? ... relax... it'll get there eventually."); else msg = this:message_with_headers(who); this.sending[who] = (old_sending = task_id()); this:set_changed(who, 0); player:notify("Sending..."); "... this sucker can suspend BIG TIME..."; result = $mail_agent:raw_send(msg, recips, player); "... the world changes..."; who = (player in this.active); if (who && (this.sending[who] == old_sending)) "... same editing session; no problemo..."; previous = ""; this.sending[who] = 0; else "... uh oh, different session... tiptoe quietly out..."; "... Don't mess with the session."; previous = "(prior send) "; endif if (!(e = result[1])) player:notify(tostr(previous, (typeof(e) == ERR) ? e | ("Bogus recipients: " + $string_utils:from_list(result[2])))); player:notify(tostr(previous, "Mail not sent.")); previous || this:set_changed(who, 1); elseif (length(result) == 1) player:notify(tostr(previous, "Mail not actually sent to anyone.")); previous || this:set_changed(who, 1); else player:notify(tostr(previous, "Mail actually sent to ", $mail_agent:name_list(@listdelete(result, 1)))); if (previous) "...don't even think about it..."; elseif (player.location == this) if (ticks_left() < 10000) suspend(0); endif this:done(); elseif (!this:changed(who)) "... player is gone, no further edits..."; this:kill_session(who); endif endif endif . #48:17 if (dobjstr) if (!(recips = this:parse_recipients({}, args))) "parse_recipients has already complained about anything it doesn't like"; return; endif elseif (caller != player) return E_PERM; elseif (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; else recips = this.recipients[who]; endif resolve = $mail_agent:resolve_addr(recips, player); if (resolve[1]) player:tell("Bogus addresses: ", $string_utils:english_list(resolve[1])); else player:tell(dobjstr ? ("Mail to " + $mail_agent:name_list(@recips)) + " actually goes to " | "Your mail will actually go to ", $mail_agent:name_list(@resolve[2])); endif . #48:18 player:tell_lines({"Available aliases:", ""}); for c in ((dobjstr == "all") ? $object_utils:descendants($mail_recipient) | $mail_agent.contents) if (c:is_usable_by(player) || c:is_readable_by(player)) c:look_self(); endif endfor . #48:19 player:tell("This command is obsolete. Use @subscribe instead. See `help @subscribe'"); return; if (!iobjstr) player:tell("Usage: ", verb, " [<list-of-people/lists>] to <list>"); return; elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr)) return; endif rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"}); recips = this:parse_recipients({}, rstrs); outcomes = iobj:add_forward(@recips); if (typeof(outcomes) != LIST) player:tell(outcomes); return; endif added = {}; for r in [1..length(recips)] if ((t = typeof(e = outcomes[r])) == OBJ) added = setadd(added, recips[r]); else player:tell(verb, " ", recips[r].name, " to ", iobj.name, ": ", e); endif endfor if (added) player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", added)), " added to ", iobj.name, " (", iobj, ")"); endif . #48:20 if (!iobjstr) player:tell("Usage: ", verb, " [<list-of-people/lists>] from <list>"); return; elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr)) return; endif rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"}); recips = this:parse_recipients({}, rstrs); outcomes = iobj:delete_forward(@recips); if (typeof(outcomes) != LIST) player:tell(outcomes); return; endif removed = {}; for r in [1..length(recips)] if (typeof(e = outcomes[r]) == ERR) player:tell(verb, " ", recips[r].name, " from ", iobj.name, ": ", (e == E_INVARG) ? "Not on list." | e); else removed = setadd(removed, recips[r]); endif endfor if (removed) player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", removed)), " removed from ", iobj.name, " (", iobj, ")"); endif . #48:21 "parse_msg_headers(msg,flags)"; " parses msg to extract reply recipients and construct a subject line"; " if the \"all\" flag is present, reply goes to all of the original recipients"; " returns a list {recipients, subjectline} or 0 in case of error."; msg = args[1]; replyall = ("all" in args[2]); recipients = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | "")); subject = msg[4]; if (subject == " ") subject = ""; endif noreplyto = 1; for line in (msg[1..("" in msg) || length(msg)]) if (typeof(line) != STR) "Skip it"; elseif (index(line, "Subject:") == 1) subject = $string_utils:triml(line[9..length(line)]); elseif ((rt = (index(line, "Reply-to:") == 1)) || (noreplyto && ((index(line, "From:") == 1) || (replyall && (index(line, "To:") == 1))))) if (rt) noreplyto = 0; recipients = {}; endif recipients = {@recipients, @$mail_agent:parse_address_field(line)}; endif endfor if (subject && (index(subject, "Re: ") != 1)) subject = ("Re: " + subject); endif recips = {}; for o in (recipients) if (o == #0) player:tell("Sorry, but I can't parse the header of that message."); return 0; elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o))))) player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient."); elseif (o != player) recips = setadd(recips, o); endif endfor return {recips, subject}; . #48:22 return this:ok(who = args[1]) && (this.sending[who] || pass(@args)); . #48:23 "recall that this only gets called if :retain_session_on_exit returns true"; return (this:ok(who = (player in this.active)) && (!this:changed(who))) ? {"Your message is in transit."} | this.(verb); . #48:24 lines = {"To: " + (toline = $mail_agent:name_list(@args[1])), "Subject: " + $string_utils:trim(subject = args[2])}; if (args[3]) lines = {@lines, "Reply-to: " + $mail_agent:name_list(@args[3])}; endif lines = {@lines, "", @args[4]}; return {tostr("MOOMail", subject ? ("(" + subject) + ")" | (("-to(" + toline) + ")")), lines, "@@sendmail"}; . #49:0 if (this:changed(who = (player in this.active))) player:tell("You are still editing ", this:working_on(who), ". Please type ABORT or SAVE first."); elseif (spec = this:parse_invoke(dobjstr, verb)) this:init_session(who, @spec); endif . #49:1 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; endif if (!dobjstr) note = this.objects[who]; elseif (1 == (note = this:note_match_failed(dobjstr))) return; else this.objects[who] = note; endif text = this:text(who); strmode = ((length(text) <= 1) && this.strmode[who]); if (strmode) text = (text ? text[1] | ""); endif if (ERR == typeof(result = this:set_note_text(note, text))) player:tell("Text not saved to ", this:working_on(who), ": ", result); if ((result == E_TYPE) && (typeof(note) == OBJ)) player:tell("Do `mode list' and try saving again."); elseif (!dobjstr) player:tell("Use `save' with an argument to save the text elsewhere."); endif else player:tell("Text written to ", this:working_on(who), strmode ? " as a single string." | "."); this:set_changed(who, 0); endif . #49:2 if (this:ok(who = args[1])) this.strmode[who] = (strmode = (typeof(text = args[3]) == STR)); this:load(who, strmode ? text ? {text} | {} | text); this.objects[who] = args[2]; player:tell("Now editing ", this:working_on(who), ".", strmode ? " [string mode]" | ""); endif . #49:3 if (!(who = args[1])) return "????"; endif spec = this.objects[who]; if (typeof(spec) == LIST) object = spec[1]; prop = spec[2]; else object = spec; prop = 0; endif return valid(object) ? tostr("\"", object.name, "\"(", object, ")", prop ? "." + prop | "") | tostr(prop ? ("." + prop) + " on " | "", "invalid object (", object, ")"); . #49:4 ":parse_invoke(string,verb)"; " string is the actual commandline string indicating what we are to edit"; " verb is the command verb that is attempting to invoke the editor"; if (!(string = args[1])) player:tell_lines({("Usage: " + args[2]) + " <note> (where <note> is some note object)", (" " + args[2]) + " (continues editing an unsaved note)"}); elseif (1 == (note = this:note_match_failed(string))) elseif (ERR == typeof(text = this:note_text(note))) player:tell("Couldn't retrieve text: ", text); else return {note, text}; endif return 0; . #49:5 "WIZARDLY"; if ((caller != $note_editor) || (caller_perms() != $note_editor.owner)) return E_PERM; endif set_task_perms(player); if (typeof(spec = args[1]) == OBJ) text = spec:text(); else text = spec[1].(spec[2]); endif if (((tt = typeof(text)) in {ERR, STR}) || ((tt == LIST) && ((!text) || (typeof(text[1]) == STR)))) return text; else return E_TYPE; endif . #49:6 "WIZARDLY"; if ((caller != $note_editor) || (caller_perms() != $note_editor.owner)) return E_PERM; endif set_task_perms(player); if (typeof(spec = args[1]) == OBJ) return spec:set_text(args[2]); else return spec[1].(spec[2]) = args[2]; endif . #49:7 if (pp = $code_utils:parse_propref(string = args[1])) object = pp[1]; prop = pp[2]; else object = string; prop = 0; endif if ($command_utils:object_match_failed(note = player:my_match_object(object, this:get_room(player)), object)) elseif (prop) if (!$object_utils:has_property(note, prop)) player:tell(object, " has no \".", prop, "\" property."); else return {note, prop}; endif elseif ((!$object_utils:has_callable_verb(note, "text")) || (!$object_utils:has_callable_verb(note, "set_text"))) player:tell(object, "(", note, ") doesn't look like a note."); else return note; endif return 1; . #49:8 pass(@args); if ((who = this:loaded(player)) && this.strmode[who]) player:tell("Text will be stored as a single string instead of a list when possible."); endif . #49:9 "mode [string|list]"; if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; endif if (index("string", dobjstr) == 1) this.strmode[who] = (mode = 1); player:tell("Now in string mode:"); elseif (index("list", dobjstr) == 1) this.strmode[who] = (mode = 0); player:tell("Now in list mode:"); elseif (dobjstr) player:tell("Unrecognized mode: ", dobjstr); player:tell("Should be one of `string' or `list'"); return; else player:tell("Currently in ", mode = (this.strmode[who] ? "string " | "list "), "mode:"); endif if (mode) player:tell(" store text as a single string instead of a list when possible."); else player:tell(" always store text as a list of strings."); endif . #49:10 what = args[1]; text = args[2]; cmd = ((typeof(text) == STR) ? "@set-note-string" | "@set-note-text"); name = ((typeof(what) == OBJ) ? what.name | tostr(what[1].name, ".", what[2])); note = ((typeof(what) == OBJ) ? what | tostr(what[1], ".", what[2])); return {name, text, tostr(cmd, " ", note)}; . #50:0 if (!args) player:tell("edit what?"); else this:invoke(argstr, verb); endif . #50:1 pas = {{}, {}}; if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; elseif (!args) object = this.objects[who]; vname = this.verbnames[who]; if (typeof(vname) == LIST) vargs = listdelete(vname, 1); vname = vname[1]; else vargs = {}; endif changeverb = 0; elseif ((args[1] != "as") || ((length(args) < 2) || ((!(spec = $code_utils:parse_verbref(args[2]))) || ((typeof(pas = $code_utils:parse_argspec(@args[3..length(args)])) != LIST) || pas[2])))) if (typeof(pas) != LIST) player:tell(pas); elseif (pas[2]) player:tell("I don't understand \"", $string_utils:from_list(pas[2], " "), "\""); endif player:tell("Usage: ", verb, " [as <object>:<verb>]"); return; elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1])) return; else vname = spec[2]; vargs = (pas[1] && {@pas[1], "none", "none"}[1..3]); if (vargs) vargs[2] = ($code_utils:full_prep(vargs[2]) || vargs[2]); endif changeverb = 1; endif if (vargs) vnum = $code_utils:find_verb_named(object, vname); while ((vnum >= 0) && (verb_args(object, tostr(vnum)) != vargs)) vnum = $code_utils:find_verb_named(object, vname, vnum + 1); endwhile if (vnum < 0) player:tell("There is no ", object, ":", vname, " verb with args (", $string_utils:from_list(vargs, " "), ")."); if (!changeverb) player:tell("Use 'compile as ...' to write your code to another verb."); endif return; endif objverbname = tostr(object, ":", vname, " (", $string_utils:from_list(vargs, " "), ")"); else vnum = -1; objverbname = tostr(object, ":", ($code_utils:tonum(vname) == E_TYPE) ? vname | this:verb_name(object, vname)); endif "..."; "...perform eval_subs on verb code if necessary..."; "..."; if (player.eval_subs && player:edit_option("eval_subs")) verbcode = {}; for x in (this:text(who)) verbcode = {@verbcode, $code_utils:substitute(x, player.eval_subs)}; endfor else verbcode = this:text(who); endif "..."; "...write it out..."; "..."; if (result = this:set_verb_code(object, (vnum >= 0) ? tostr(vnum) | vname, verbcode)) player:tell(objverbname, " not compiled because:"); for x in (result) player:tell(" ", x); endfor elseif (typeof(result) == ERR) player:tell({result, ("You do not have write permission on " + objverbname) + ".", ("The verb " + objverbname) + " does not exist (!?!)", ("The object " + tostr(object)) + " does not exist (!?!)"}[1 + (result in {E_PERM, E_VERBNF, E_INVARG})]); if (!changeverb) player:tell("Do 'compile as <object>:<verb>' to write your code to another verb."); endif changeverb = 0; else player:tell(objverbname, verbcode ? " successfully compiled." | " verbcode removed."); this:set_changed(who, 0); endif if (changeverb) this.objects[who] = object; this.verbnames[who] = (vargs ? {vname, @vargs} | vname); endif . #50:2 if (!(fuckup = this:ok(who = args[1]))) return fuckup; else object = this.objects[who]; verbname = this.verbnames[who]; if (typeof(verbname) == LIST) return tostr(object, ":", verbname[1], " (", $string_utils:from_list(listdelete(verbname, 1), " "), ")"); else return tostr(object, ":", this:verb_name(object, verbname), " (", this:verb_args(object, verbname), ")"); endif endif "return this:ok(who = args[1]) && tostr(this.objects[who]) + \":\" + this.verbnames[who];"; . #50:3 if (this:ok(who = args[1])) object = args[2]; vname = args[3]; this:load(who, args[4]); this.verbnames[who] = vname; this.objects[who] = object; this.active[who]:tell("Now editing ", this:working_on(who), "."); "this.active[who]:tell(\"Now editing \", object, \":\", vname, \".\");"; endif . #50:4 ":parse_invoke(string,v)"; " string is the commandline string to parse to obtain the obj:verb to edit"; " v is the actual command verb used to invoke the editor"; " => {object, verbname, verb_code} or error"; vref = $string_utils:words(args[1]); if ((!vref) || (!(spec = $code_utils:parse_verbref(vref[1])))) player:tell("Usage: ", args[2], " object:verb"); return; endif if (argspec = listdelete(vref, 1)) if (typeof(pas = $code_utils:parse_argspec(@argspec)) == LIST) if (pas[2]) player:tell("I don't understand \"", $string_utils:from_list(pas[2], " "), "\""); return; endif argspec = {@pas[1], "none", "none"}[1..3]; argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]); else player:tell(pas); return; endif endif if (!$command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1])) vnum = $code_utils:find_verb_named(object, vname = spec[2], 0); if (argspec) while ((vnum >= 0) && (verb_args(object, tostr(vnum)) != argspec)) vnum = $code_utils:find_verb_named(object, vname, vnum + 1); endwhile if (vnum >= 0) code = this:fetch_verb_code(object, tostr(vnum)); else code = E_VERBNF; endif else code = this:fetch_verb_code(object, tostr(vnum)); endif if (typeof(code) == ERR) player:tell((code != E_VERBNF) ? code | "That object does not define that verb", argspec ? " with those args." | "."); return code; else return {object, argspec ? {vname, @argspec} | vname, code}; endif endif return 0; . #50:5 "WIZARDLY"; if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner)) return E_PERM; else set_task_perms(player); return verb_code(args[1], args[2], 1); endif . #50:6 "WIZARDLY"; if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner)) return E_PERM; else set_task_perms(player); return set_verb_code(args[1], args[2], args[3]); endif . #50:7 if (caller == $verb_editor) set_task_perms(player); endif object = args[1]; vname = args[2]; if (typeof(vname) == LIST) vargs = tostr(" ", vname[2], " ", $code_utils:short_prep(vname[3]), " ", vname[4]); vname = vname[1]; else vargs = ""; endif code = args[3]; name = tostr(object.name, ":", vname); "... so the next 2 lines are actually wrong, since verb_info won't"; "... necessarily retrieve the correct verb if we have more than one"; "... matching the given same name; anyway, if parse_invoke understood vname,"; "... so will @program. I suspect these were put here because in the"; "... old scheme of things, vname was always a number."; "vname = strsub($string_utils:explode(verb_info(object, vname)[3])[1], \"*\", \"\")"; "vargs = verb_args(object, vname)"; ""; return {name, code, tostr("@program ", object, ":", vname, vargs)}; . #50:8 "verb_name(object, vname)"; "Find vname on object and return its full name (quoted)."; "This is useful for when we're working with verb numbers."; if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner)) return E_PERM; else set_task_perms(player); given = args[2]; if (typeof(info = verb_info(args[1], given)) == ERR) return tostr(given, "[", info, "]"); elseif (info[3] == given) return given; else return tostr(given, "/\"", info[3], "\""); endif endif . #50:9 "verb_name(object, vname)"; "Find vname on object and return its full name (quoted)."; "This is useful for when we're working with verb numbers."; if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner)) return E_PERM; else set_task_perms(player); return $string_utils:from_list(verb_args(args[1], args[2]), " "); endif . #51:0 if ((caller != player) && (caller_perms() != player)) return E_PERM; endif if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); else this:insert_line(who, argstr); endif . #51:1 if ((caller != player) && (caller_perms() != player)) return E_PERM; endif if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); else this:append_line(who, argstr); endif . #51:2 if (!this:loaded(player)) player:tell(this:nothing_loaded_msg()); else lines = $command_utils:read_lines(); if (typeof(lines) == ERR) player:notify(tostr(lines)); return; endif this:insert_line(this:loaded(player), lines, 0); endif . #51:3 nonum = 0; if (verb == "view") if (!args) l = {}; for i in [1..length(this.active)] if (this.readable[i]) l = {@l, this.active[i]}; endif endfor if (l) player:tell("Players having readable texts in this editor: ", $string_utils:names_of(l)); else player:tell("No one has published anything in this editor."); endif return; elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(args[1]), args[1])[1]) "...no such player"; return; elseif ((!(who = this:loaded(plyr))) || (!this:readable(who))) player:tell(plyr.name, "(", plyr, ") has not published anything in this editor."); return; endif args = listdelete(args, 1); elseif (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; endif len = length(this.texts[who]); ins = this.inserting[who]; window = 8; if (len < (2 * window)) default = {"1-$"}; elseif (ins <= window) default = {tostr("1-", 2 * window)}; else default = {tostr(window, "_-", window, "^"), tostr(2 * window, "$-$")}; endif if (typeof(range = this:parse_range(who, default, @args)) != LIST) player:tell(tostr(range)); elseif (range[3] && (!(nonum = ("nonum" == $string_utils:trim(range[3]))))) player:tell("Don't understand this: ", range[3]); elseif (nonum) player:tell_lines(this.texts[who][range[1]..range[2]]); else for line in [range[1]..range[2]] this:list_line(who, line); if ($command_utils:running_out_of_time()) suspend(0); if (!(who = this:loaded(player))) player:tell("ack! something bad happened during a suspend..."); return; endif endif endfor if ((ins > len) && (len == range[2])) player:tell("^^^^"); endif endif . #51:4 if (i = index(argstr, "\"")) text = argstr[i + 1..length(argstr)]; argstr = argstr[1..i - 1]; else text = 0; endif spec = $string_utils:trim(argstr); if (index("next", verb) == 1) verb = "next"; spec = ("+" + (spec || "1")); elseif (index("prev", verb) == 1) verb = "prev"; spec = ("-" + (spec || "1")); else spec = (spec || "."); endif if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (ERR == typeof(number = this:parse_insert(who, spec))) if (verb in {"next", "prev"}) player:tell("Argument must be a number."); else player:tell("You must specify an integer or `$' for the last line."); endif elseif ((number > (max = (length(this.texts[who]) + 1))) || (number < 1)) player:tell("That would take you out of range (to line ", number, "?)."); else this.inserting[who] = number; if (typeof(text) == STR) this:insert_line(who, text); else if (verb != "next") (number > 1) ? this:list_line(who, number - 1) | player:tell("____"); endif if (verb != "prev") (number < max) ? this:list_line(who, number) | player:tell("^^^^"); endif endif endif . #51:5 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST) player:tell(range); elseif (range[3]) player:tell("Junk at end of cmd: ", range[3]); else player:tell_lines((text = this.texts[who])[from = range[1]..to = range[2]]); player:tell("---Line", (to > from) ? "s" | "", " deleted. Insertion point is before line ", from, "."); this.texts[who] = {@text[1..from - 1], @text[to + 1..length(text)]}; if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif this.inserting[who] = from; endif . #51:6 if (callers() && (caller != this)) return E_PERM; endif if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (typeof(subst = this:parse_subst(argstr && (argstr[1] + argstr), "c", "Empty search string?")) != LIST) player:tell(tostr(subst)); elseif (typeof(start = (subst[4] ? this:parse_insert(who, subst[4]) | this.inserting[who])) == ERR) player:tell("Starting from where?", subst[4] ? (" (can't parse " + subst[4]) + ")" | ""); else search = subst[2]; case = (!index(subst[3], "c", 1)); text = this.texts[who]; tlen = length(text); while ((start <= tlen) && (!index(text[start], search, case))) start = (start + 1); endwhile if (start > tlen) player:tell("`", search, "' not found."); else this.inserting[who] = (start + 1); this:list_line(who, start); endif endif . #51:7 if (callers() && (caller != this)) return E_PERM; endif if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (typeof(subst = this:parse_subst(argstr)) != LIST) player:tell(tostr(subst)); elseif (typeof(range = this:parse_range(who, {"_", "1"}, @$string_utils:explode(subst[4]))) != LIST) player:tell(range); elseif (range[3]) player:tell("Junk at end of cmd: ", range[3]); else fromstr = subst[1]; tostr = subst[2]; global = index(subst[3], "g", 1); case = (!index(subst[3], "c", 1)); munged = {}; text = this.texts[who]; changed = {}; for line in [from = range[1]..to = range[2]] t = (t0 = text[line]); if (!fromstr) t = (tostr + t); elseif (global) t = strsub(t, fromstr, tostr, case); elseif (i = index(t, fromstr, case)) t = ((t[1..i - 1] + tostr) + t[i + length(fromstr)..length(t)]); endif if (strcmp(t0, t)) changed = {@changed, line}; endif munged = {@munged, t}; endfor if (!changed) player:tell("No changes in line", (from == to) ? tostr(" ", from) | tostr("s ", from, "-", to), "."); else this.texts[who] = {@text[1..from - 1], @munged, @text[to + 1..length(text)]}; if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif for line in (changed) this:list_line(who, line); endfor endif endif . #51:8 verb = ((is_move = (verb[1] == "m")) ? "move" | "copy"); if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; endif wargs = args; t = (to_pos = 0); while (t = ("to" in (wargs = wargs[t + 1..length(wargs)]))) to_pos = (to_pos + t); endwhile range_args = args[1..to_pos - 1]; if ((!to_pos) || (ERR == typeof(dest = this:parse_insert(who, $string_utils:from_list(wargs, " "))))) player:tell(verb, " to where? "); elseif ((dest < 1) || (dest > ((last = length(this.texts[who])) + 1))) player:tell("Destination (", dest, ") out of range."); elseif (("from" in range_args) || ("to" in range_args)) player:tell("Don't use that kind of range specification with this command."); elseif (typeof(range = this:parse_range(who, {"_", "^"}, @args[1..to_pos - 1])) != LIST) player:tell(range); elseif (range[3]) player:tell("Junk before `to': ", range[3]); elseif ((is_move && (dest >= range[1])) && (dest <= (range[2] + 1))) player:tell("Destination lies inside range of lines to be moved."); else from = range[1]; to = range[2]; ins = this.inserting[who]; text = this.texts[who]; if (!is_move) this.texts[who] = {@text[1..dest - 1], @text[from..to], @text[dest..last]}; if (ins >= dest) this.inserting[who] = (((ins + to) - from) + 1); endif else "oh shit... it's a move"; if (dest < from) newtext = {@text[1..dest - 1], @text[from..to], @text[dest..from - 1], @text[to + 1..last]}; if ((ins >= dest) && (ins <= to)) ins = ((ins > from) ? (ins - from) + dest | (((ins + to) - from) + 1)); endif else newtext = {@text[1..from - 1], @text[to + 1..dest - 1], @text[from..to], @text[dest..last]}; if ((ins > from) && (ins < dest)) ins = ((ins <= to) ? ((ins + dest) - to) - 1 | (((ins - to) + from) - 1)); endif endif this.texts[who] = newtext; this.inserting[who] = ins; endif if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif player:tell("Lines ", is_move ? "moved." | "copied."); endif . #51:9 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (typeof(range = this:parse_range(who, {"_-^", "_", "^"}, @args)) != LIST) player:tell(range); elseif (range[3]) player:tell("Junk at end of cmd: ", range[3]); elseif (!(result = this:join_lines(who, @range[1..2], length(verb) <= 4))) player:tell((result == 0) ? "Need at least two lines to join." | result); else this:list_line(who, range[1]); endif . #51:10 fill_column = 70; if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST) player:tell(range); elseif (range[3] && ((range[3][1] != "@") || ((fill_column = tonum(range[3][2..length(range[3])])) < 10))) player:tell("Usage: fill [<range>] [@ column] (where column >= 10)."); else join = this:join_lines(who, @range[1..2], 1); newlines = this:fill_string((text = this.texts[who])[from = range[1]], fill_column); if (fill = (((nlen = length(newlines)) > 1) || (newlines[1] != text[from]))) this.texts[who] = {@text[1..from - 1], @newlines, @text[from + 1..length(text)]}; if (((insert = this.inserting[who]) > from) && (nlen > 1)) this.inserting[who] = ((insert + nlen) - 1); endif endif if (fill || join) for line in [from..(from + nlen) - 1] this:list_line(who, line); endfor else player:tell("No changes."); endif endif . #51:11 if (!(who = this:loaded(player))) player:tell(this:nothing_loaded_msg()); return; endif if (typeof(e = this:set_readable(who, index("publish", verb) == 1)) == ERR) player:tell(e); elseif (e) player:tell("Your text is now globally readable."); else player:tell("Your text is read protected."); endif . #51:12 if (!(this:ok(who = (player in this.active)) && (typeof(this.texts[who]) == LIST))) player:tell(this:nothing_loaded_msg()); else player:tell("You are editing ", this:working_on(who), "."); player:tell("Your insertion point is ", (this.inserting[who] > length(this.texts[who])) ? "after the last line: next line will be #" | "before line ", this.inserting[who], "."); player:tell(this.changes[who] ? this:change_msg() | this:no_change_msg()); if (this.readable[who]) player:tell("Your text is globally readable."); endif endif . #51:13 if (!this.changes[who = (player in this.active)]) player:tell("No changes to throw away. Editor cleared."); else player:tell("Throwing away session for ", this:working_on(who), "."); endif this:reset_session(who); if (this.exit_on_abort) this:done(); endif . #51:14 if (!(caller in {this, player})) return E_PERM; elseif (!valid(origin = this.original[who = (player in this.active)])) player:tell("I don't know where you came here from."); else player:moveto(origin); if (player.location == this) player:tell("Hmmm... the place you came from doesn't want you back."); else if (msg = this:return_msg()) player.location:announce($string_utils:pronoun_sub(msg)); endif return; endif endif player:tell("You'll have to use 'home' or a teleporter."); . #51:15 "This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'. Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before."; set_task_perms(caller_perms()); if ((c = callers()) && ((c[1][1] != this) || (length(c) > 1))) return pass(@args); endif verb = args[1]; v = 1; vmax = min(length(verb), 5); while ((v <= vmax) && (verb[v] == "subst"[v])) v = (v + 1); endwhile argstr = $code_utils:argstr(verb, args[2]); if (((v > 1) && (v <= length(verb))) && (((vl = verb[v]) < "A") || (vl > "Z"))) argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr); return this:subst(); elseif ("/" == verb[1]) argstr = ((verb + (argstr && " ")) + argstr); return this:find(); else pass(@args); endif . #51:16 return this:ok(who = args[1]) && this.inserting[who]; . #51:17 return this:ok(who = args[1]) && ((((ins = tonum(args[2])) < 1) ? E_INVARG | ((ins <= (max = (length(this.texts[who]) + 1))) || (ins = max))) && (this.inserting[who] = ins)); . #51:18 return this:ok(who = args[1]) && this.changes[who]; . #51:19 return this:ok(who = args[1]) && (((unchanged = (!args[2])) || (this.times[who] = time())) && (this.changes[who] = (!unchanged))); . #51:20 return this:ok(who = args[1]) && this.original[who]; . #51:21 return this:ok(who = args[1]) && (((valid(origin = args[2]) && (origin != this)) || ((origin == $nothing) || E_INVARG)) && (this.original[who] = origin)); . #51:22 return (((who = args[1]) < 1) || (who > length(this.active))) ? E_RANGE | this.readable[who]; . #51:23 return this:ok(who = args[1]) && (this.readable[who] = (!(!args[2]))); . #51:24 return (this:readable(who = (args[1] || (player in this.active))) || this:ok(who)) && this.texts[who]; . #51:25 texts = args[2]; if (!(fuckup = this:ok(who = args[1]))) return fuckup; elseif (typeof(texts) == STR) texts = {texts}; elseif ((typeof(texts) != LIST) || (length(texts) && (typeof(texts[1]) != STR))) return E_TYPE; endif this.texts[who] = texts; this.inserting[who] = (length(texts) + 1); this.changes[who] = 0; this.readable[who] = 0; this.times[who] = time(); . #51:26 "Dummy routine. The child editor should provide something informative"; return this:ok(who = args[1]) && (("something [in " + this.name) + "]"); . #51:27 who = args[1]; if ((who < 1) || (who > length(this.active))) return E_RANGE; elseif ((length(c = callers()) < 2) ? player == this.active[who] | ((c[2][1] == this) || ($perm_utils:controls(c[2][3], this.active[who]) || (c[2][3] == $generic_editor.owner)))) return 1; else return E_PERM; endif . #51:28 return ((who = (args[1] in this.active)) && (typeof(this.texts[who]) == LIST)) && who; . #51:29 if (this:ok(who = args[1])) f = (1 + ((line = args[2]) in {(ins = this.inserting[who]) - 1, ins})); player:tell($string_utils:right(line, 3, " _^"[f]), ":_^"[f], " ", this.texts[who][line]); endif . #51:30 ":insert_line([who,] line or list of lines [,quiet])"; " inserts the given text at the insertion point."; " returns E_NONE if the session has no text loaded yet."; if (typeof(who = args[1]) != NUM) args = {player in this.active, @args}; endif if (!(fuckup = this:ok(who = args[1]))) return fuckup; elseif (typeof(text = this.texts[who]) != LIST) return E_NONE; else if (typeof(lines = args[2]) != LIST) lines = {lines}; endif p = this.active[who]; quiet = ((length(args) >= 3) ? args[3] | p:edit_option("quiet_insert")); insert = this.inserting[who]; this.texts[who] = {@text[1..insert - 1], @lines, @text[insert..length(text)]}; this.inserting[who] = (insert + length(lines)); if (lines) if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif if (!quiet) if (length(lines) != 1) p:tell("Lines ", insert, "-", (insert + length(lines)) - 1, " added."); else p:tell("Line ", insert, " added."); endif endif else p:tell("No lines added."); endif endif . #51:31 ":append_line([who,] string)"; " appends the given string to the line before the insertion point."; " returns E_NONE if the session has no text loaded yet."; if (typeof(who = args[1]) != NUM) args = {player in this.active, @args}; endif if (!(fuckup = this:ok(who = args[1]))) return fuckup; elseif ((append = (this.inserting[who] - 1)) < 1) return this:insert_line(who, {args[2]}); elseif (typeof(text = this.texts[who]) != LIST) return E_NONE; else this.texts[who][append] = (text[append] + args[2]); if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif p = this.active[who]; if (!p:edit_option("quiet_insert")) p:tell("Appended to line ", append, "."); endif endif . #51:32 if (!(fuckup = this:ok(who = args[1]))) return fuckup; elseif ((from = args[2]) >= (to = args[3])) return 0; else nline = ""; for line in ((text = this.texts[who])[from..to]) if (!(english = args[4])) nline = (nline + line); else len = (length(line) + 1); while ((len = (len - 1)) && (line[len] == " ")) endwhile if (len > 0) nline = ((nline + line) + (index(".:", line[len]) ? " " | " ")); endif endif endfor this.texts[who] = {@text[1..from - 1], nline, @text[to + 1..length(text)]}; if ((insert = this.inserting[who]) > from) this.inserting[who] = ((insert <= to) ? from + 1 | ((insert - to) + from)); endif if (!this.changes[who]) this.changes[who] = 1; this.times[who] = time(); endif return to - from; endif . #51:33 "parse_number(who,string,before) interprets string as a line number. In the event that string is `.', `before' tells us which line to use. Return 0 if string is bogus."; if (!(fuckup = this:ok(who = args[1]))) return fuckup; endif last = length(this.texts[who]); ins = (this.inserting[who] - 1); string = args[2]; after = (!args[3]); if (!string) return 0; elseif ("." == string) return ins + after; elseif (!(i = index("_^$", string[slen = length(string)]))) return tonum(string); else start = {ins + 1, ins, last + 1}[i]; n = 1; if ((slen > 1) && (!(n = tonum(string[1..slen - 1])))) return 0; elseif (i % 2) return start - n; else return start + n; endif endif . #51:34 "parse_range(who,default,@args) => {from to rest}"; numargs = length(args); if (!(fuckup = this:ok(who = args[1]))) return fuckup; elseif (!(last = length(this.texts[who]))) return this:no_text_msg(); endif default = args[2]; r = 0; while (default && (LIST != typeof(r = this:parse_range(who, {}, default[1])))) default = listdelete(default, 1); endwhile if (typeof(r) == LIST) from = r[1]; to = r[2]; else from = (to = 0); endif saw_from_to = 0; not_done = 1; a = 2; while (((a = (a + 1)) <= numargs) && not_done) if (args[a] == "from") if ((a == numargs) || (!(from = this:parse_number(who, args[a = (a + 1)], 0)))) return "from ?"; endif saw_from_to = 1; elseif (args[a] == "to") if ((a == numargs) || (!(to = this:parse_number(who, args[a = (a + 1)], 1)))) return "to ?"; endif saw_from_to = 1; elseif (saw_from_to) a = (a - 1); not_done = 0; elseif (i = index(args[a], "-")) from = this:parse_number(who, args[a][1..i - 1], 0); to = this:parse_number(who, args[a][i + 1..length(args[a])], 1); not_done = 0; elseif (f = this:parse_number(who, args[a], 0)) from = f; if ((a == numargs) || (!(to = this:parse_number(who, args[a + 1], 1)))) to = from; else a = (a + 1); endif not_done = 0; else a = (a - 1); not_done = 0; endif endwhile if (from < 1) return tostr("from ", from, "? (out of range)"); elseif (to > last) return tostr("to ", to, "? (out of range)"); elseif (from > to) return tostr("from ", from, " to ", to, "? (backwards range)"); else return {from, to, $string_utils:from_list(args[a..numargs], " ")}; endif . #51:35 "parse_ins(who,string) interprets string as an insertion point, i.e., a position between lines and returns the number of the following line or 0 if bogus."; if (!(fuckup = this:ok(who = args[1]))) return fuckup; endif who = args[1]; last = (length(this.texts[who]) + 1); ins = this.inserting[who]; string = args[2]; if (i = index("-+", string[1])) rest = string[2..length(string)]; return ((n = tonum(rest)) || (rest == "0")) ? {ins - n, ins + n}[i] | E_INVARG; else if (!(j = (index(string, "^") || index(string, "_")))) offset = 0; else offset = ((j == 1) || tonum(string[1..j - 1])); if (!offset) return E_INVARG; elseif (string[j] == "^") offset = (-offset); endif endif rest = string[j + 1..length(string)]; if (i = (rest in {".", "$"})) return offset + {ins, last}[i]; elseif (!(n = tonum(rest))) return E_INVARG; else return (offset + (j && (string[j] == "^"))) + n; endif endif . #51:36 recognized_flags = ((length(args) >= 2) ? args[2] | "gc"); null_subst_msg = ((length(args) >= 3) ? args[3] | "Null substitution?"); cmd = args[1]; if (!cmd) return "/xxx/yyy[/[g][c]] [<range>] expected.."; endif bchar = cmd[1]; cmd = cmd[2..length(cmd)]; fromstr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1]; cmd = cmd[b2 + 1..length(cmd)]; tostr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1]; cmd = cmd[b2 + 1..length(cmd)]; cmdlen = length(cmd); b2 = 0; while (((b2 = (b2 + 1)) <= cmdlen) && index(recognized_flags, cmd[b2])) endwhile return ((fromstr == "") && (tostr == "")) ? null_subst_msg | {fromstr, tostr, cmd[1..b2 - 1], cmd[b2..cmdlen]}; . #51:37 ":invoke(...)"; "to find out what arguments this verb expects,"; "see this editor's parse_invoke verb."; new = args[1]; if ((!(caller in {this, player})) && (!$perm_utils:controls(caller_perms(), player))) "...non-editor/non-player verb trying to send someone to the editor..."; return E_PERM; endif if ((who = this:loaded(player)) && this:changed(who)) if (!new) if (this:suck_in(player)) player:tell("You are working on ", this:working_on(who)); endif return; elseif (player.location == this) player:tell("You are still working on ", this:working_on(who)); if (msg = this:previous_session_msg()) player:tell(msg); endif return; endif "... we're not in the editor and we're about to start something new,"; "... but there's still this pending session..."; player:tell("You were working on ", this:working_on(who)); if (!$command_utils:yes_or_no("Do you wish to delete that session?")) if (this:suck_in(player)) player:tell("Continuing with ", this:working_on(player in this.active)); if (msg = this:previous_session_msg()) player:tell(msg); endif endif return; endif "... note session number may have changed => don't trust `who'"; this:kill_session(player in this.active); endif spec = this:parse_invoke(@args); if (typeof(spec) == LIST) if ((player:edit_option("local") && $object_utils:has_verb(this, "local_editing_info")) && (info = this:local_editing_info(@spec))) this:invoke_local_editor(@info); elseif (this:suck_in(player)) this:init_session(player in this.active, @spec); endif endif . #51:38 "The correct way to move someone into the editor."; if (((loc = (who_obj = args[1]).location) != this) && (caller == this)) this.invoke_task = task_id(); who_obj:moveto(this); if (who_obj.location == this) fork (0) "...forked, just in case loc:announce is broken..."; if (valid(loc) && (msg = this:depart_msg())) loc:announce($string_utils:pronoun_sub(msg)); endif endfork else who_obj:tell("For some reason, I can't move you. (?)"); this:exitfunc(who_obj); endif this.invoke_task = 0; endif return who_obj.location == this; . #51:39 "WIZARDLY"; who_obj = args[1]; from = args[2]; if ($object_utils:isa(from, $generic_editor)) "... never put an editor in .original, ..."; if (w = (who_obj in from.active)) from = from.original[w]; else from = #-1; endif endif if (caller != this) return E_PERM; elseif (who = ((who_obj = args[1]) in this.active)) "... edit in progress here..."; if (valid(from)) this.original[who] = from; endif return -1; else for p in ({{"active", who_obj}, {"original", valid(from) ? from | $nothing}, {"times", time()}, @this.stateprops}) this.(p[1]) = {@this.(p[1]), p[2]}; endfor return length(this.active); endif . #51:40 "WIZARDLY"; if (!(fuckup = this:ok(who = args[1]))) return fuckup; else for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}}) this.(p[1]) = listdelete(this.(p[1]), who); endfor return who; endif . #51:41 "WIZARDLY"; if (!(fuckup = this:ok(who = args[1]))) return fuckup; else for p in (this.stateprops) this.(p[1])[who] = p[2]; endfor this.times[who] = time(); return who; endif . #51:42 "WIZARDLY"; if ((caller != this) && (!caller_perms().wizard)) return E_PERM; else for victim in (this.contents) victim:tell("Sorry, ", this.name, " is going down. Your editing session is hosed."); victim:moveto(((who = (victim in this.active)) && valid(origin = this.original[who])) ? origin | (valid(victim.home) ? victim.home | $player_start)); endfor for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}}) this.(p[1]) = {}; endfor return 1; endif . #51:43 return is_player(who_obj = args[1]) && (who_obj.wizard || pass(@args)); . #51:44 who_obj = args[1]; if (who_obj.wizard && (!(who_obj in this.active))) this:accept(who_obj); endif pass(@args); if (this.invoke_task == task_id()) "Means we're about to load something, so be quiet."; this.invoke_task = 0; elseif (who = this:loaded(who_obj)) who_obj:tell("You are working on ", this:working_on(who), "."); elseif (msg = this:nothing_loaded_msg()) who_obj:tell(msg); endif . #51:45 if (!(who = ((who_obj = args[1]) in this.active))) elseif (this:retain_session_on_exit(who)) if (msg = this:no_littering_msg()) who_obj:tell_lines(msg); endif else this:kill_session(who); endif pass(@args); . #51:46 "@flush <editor>"; "@flush <editor> at <month> <day>"; "@flush <editor> at <weekday>"; "The first form removes all sessions from the editor; the other two forms remove everything older than the given date."; if (!$perm_utils:controls(player, this)) player:tell("Only the owner of the editor can do a ", verb, "."); return; endif if (!prepstr) player:tell("Trashing all sessions."); this:kill_all_sessions(); elseif (prepstr != "at") player:tell("Usage: ", verb, " ", dobjstr, " [at [mon day|weekday]]"); else p = (prepstr in args); if (t = $time_utils:from_day(iobjstr, -1)) elseif (t = $time_utils:from_month(args[p + 1], -1)) if (length(args) > (p + 1)) if (!(n = tonum(args[p + 2]))) player:tell(args[p + 1], " WHAT?"); return; endif t = (t + ((n - 1) * 86400)); endif else player:tell("couldn't parse date"); return; endif for i in [-length(this.active)..-1] if (this.times[-i] < t) player:tell(this.active[-i].name, "(", this.active[-i], ") ", ctime(this.times[-i])); this:kill_session(-i); endif endfor endif . #51:47 if (!$perm_utils:controls(player, this)) player:tell(E_PERM); return; endif if (i = index(dobjstr, "=")) default = dobjstr[i + 1..length(dobjstr)]; prop = dobjstr[1..i - 1]; if (argstr[1 + index(argstr, "=")] == "\"") elseif (default[1] == "#") default = toobj(default); elseif (index("0123456789", default[1])) default = tonum(default); elseif (default == "{}") default = {}; endif else default = 0; prop = dobjstr; endif if (typeof(result = this:set_stateprops(prop, default)) == ERR) player:tell((result == E_RANGE) ? tostr(".", prop, " needs to hold a list of the same length as .active (", length(this.active), ").") | ((result != E_NACC) ? result | (prop + " is already a property on an ancestral editor."))); else player:tell("Property added."); endif . #51:48 if (!$perm_utils:controls(player, this)) player:tell(E_PERM); elseif (typeof(result = this:set_stateprops(dobjstr)) == ERR) player:tell((result != E_NACC) ? result | (dobjstr + " is already a property on an ancestral editor.")); else player:tell("Property removed."); endif . #51:49 if ($perm_utils:controls(caller_perms(), this)) pass(@args); this:kill_all_sessions(); endif . #51:50 if (caller_perms().wizard) pass(); this:kill_all_sessions(); this.help = $editor_help; endif . #51:51 remove = (length(args) < 2); if ((caller != this) && (!$perm_utils:controls(caller_perms(), this))) return E_PERM; elseif (!(length(args) in {1, 2})) return E_ARGS; elseif (typeof(prop = args[1]) != STR) return E_TYPE; elseif (i = $list_utils:iassoc(prop, this.stateprops)) if (!remove) this.stateprops[i] = {prop, args[2]}; elseif ($object_utils:has_property(parent(this), prop)) return E_NACC; else this.stateprops = listdelete(this.stateprops, i); endif elseif (remove) elseif (prop in properties(this)) if (this:_stateprop_length(prop) != length(this.active)) return E_RANGE; endif this.stateprops = {{prop, args[2]}, @this.stateprops}; else return $object_utils:has_property(this, prop) ? E_NACC | E_PROPNF; endif return 0; . #51:52 is_look_self = 1; for c in (callers()) if (is_look_self && (c[2] in {"enterfunc", "confunc"})) return {"", "Do a 'look' to get the list of commands, or 'help' for assistance.", "", @this.description}; elseif (c[2] != "look_self") is_look_self = 0; endif endfor d = {"Commands:", ""}; col = {{}, {}}; for c in [1..2] for cmd in (this.commands2[c]) cmd = this:commands_info(cmd); col[c] = {cmdargs = ($string_utils:left(cmd[1] + " ", 12) + cmd[2]), @col[c]}; endfor endfor i1 = length(col[1]); i2 = length(col[2]); right = 0; while (i1 || i2) if (!((i1 && (length(col[1][i1]) > 35)) || (i2 && (length(col[2][i2]) > 35)))) d = {@d, $string_utils:left(i1 ? col[1][i1] | "", 40) + (i2 ? col[2][i2] | "")}; i1 && (i1 = (i1 - 1)); i2 && (i2 = (i2 - 1)); right = 0; elseif (right && i2) d = {@d, (length(col[2][i2]) > 35) ? $string_utils:right(col[2][i2], 75) | ($string_utils:space(40) + col[2][i2])}; i2 = (i2 - 1); right = 0; elseif (i1) d = {@d, col[1][i1]}; i1 = (i1 - 1); right = 1; else right = 1; endif endwhile return {@d, "", "---- Do `help <cmdname>' for help with a given command. ----", "", " <ins> ::= $ (the end) | [^]n (above line n) | _n (below line n) | . (current)", "<range> ::= <lin> | <lin>-<lin> | from <lin> | to <lin> | from <lin> to <lin>", " <lin> ::= n | [n]$ (n from the end) | [n]_ (n before .) | [n]^ (n after .)", "`help insert' and `help ranges' describe these in detail.", @this.description}; . #51:53 cmd = args[1]; if (pc = $list_utils:assoc(cmd, this.commands)) return pc; elseif (this == $generic_editor) return {cmd, "<<<<<======= Need to add this to .commands"}; else return parent(this):commands_info(cmd); endif . #51:54 who = {@args, player}[2]; objstr = args[1]; origin = this; while ((where = (player in origin.active)) && ($recycler:valid(origin = origin.original[where]) && (origin != this))) if (!$object_utils:isa(origin, $generic_editor)) return origin:match_object(args[1], who); endif endwhile return who:my_match_object(objstr, #-1); . #51:55 who = args[1]; where = {#-1, @this.original}[1 + (who in this.active)]; return strsub(this.who_location_msg, "%L", where:who_location_msg(who)); return $string_utils:pronoun_sub(this.who_location_msg, who, this, where); . #51:56 return this.(verb); . #51:57 return; . #51:58 "fill(string,width[,prefix])"; "tries to cut <string> into substrings of length < <width> along word boundaries. Prefix, if supplied, will be prefixed to the 2nd..last substrings."; if (length(args) < 2) width = (2 + player:linelen()); prefix = ""; else width = (args[2] + 1); prefix = {@args, ""}[3]; endif if (width < (3 + length(prefix))) return E_INVARG; endif string = (("$" + args[1]) + " $"); len = length(string); if (len <= width) last = (len - 1); next = len; else last = rindex(string[1..width], " "); if (last < ((width + 1) / 2)) last = (width + index(string[width + 1..len], " ")); endif next = last; while (string[next = (next + 1)] == " ") endwhile endif while (string[last = (last - 1)] == " ") endwhile ret = {string[2..last]}; width = (width - length(prefix)); minlast = ((width + 1) / 2); while (next < len) string = ("$" + string[next..len]); len = ((len - next) + 2); if (len <= width) last = (len - 1); next = len; else last = rindex(string[1..width], " "); if (last < minlast) last = (width + index(string[width + 1..len], " ")); endif next = last; while (string[next = (next + 1)] == " ") endwhile endif while (string[last = (last - 1)] == " ") endwhile if (last > 1) ret = {@ret, prefix + string[2..last]}; endif endwhile return ret; . #51:59 "This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'. Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before."; if ((caller != this) && (caller_perms() != player)) return E_PERM; endif verb = args[1]; args = args[2]; v = 1; vmax = min(length(verb), 5); while ((v <= vmax) && (verb[v] == "subst"[v])) v = (v + 1); endwhile argstr = $code_utils:argstr(verb, args); if ((v > 1) && ((v <= length(verb)) && (((vl = verb[v]) < "A") || (vl > "Z")))) argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr); this:subst(); return 1; elseif ("/" == verb[1]) argstr = ((verb + (argstr && " ")) + argstr); this:find(); return 1; else return 0; endif . #51:60 return $failed_match; . #51:61 ":get_room([player]) => correct room to match in on invocation."; who = {@args, player}[1]; if (who.location != this) return who.location; else origin = this; while ((where = (player in origin.active)) && (valid(origin = origin.original[where]) && (origin != this))) if (!$object_utils:isa(origin, $generic_editor)) return origin; endif endwhile return this; endif . #51:62 ":invoke_local_editor(name, text, upload)"; "Spits out the magic text that invokes the local editor in the player's client."; "NAME is a good human-readable name for the local editor to use for this particular piece of text."; "TEXT is a string or list of strings, the initial body of the text being edited."; "UPLOAD, a string, is a MOO command that the local editor can use to save the text when the user is done editing. The local editor is going to send that command on a line by itself, followed by the new text lines, followed by a line containing only `.'. The UPLOAD command should therefore call $command_utils:read_lines() to get the new text as a list of strings."; if (caller != this) return; endif name = args[1]; text = args[2]; upload = args[3]; if (typeof(text) == STR) text = {text}; endif notify(player, tostr("#$# edit name: ", name, " upload: ", upload)); ":dump_lines() takes care of the final `.' ..."; for line in ($command_utils:dump_lines(text)) notify(player, line); endfor . #51:63 "+c properties on children cannot necessarily be read, so we need this silliness..."; if (caller != this) return E_PERM; else return length(this.(args[1])); endif . #51:64 txt = this:text(player in this.active); if (typeof(txt) == LIST) player:tell_lines(txt); else player:tell("Text unreadable: ", txt); endif player:tell("--------------------------"); . #51:65 return this:acceptable(who_obj = args[1]) && this:new_session(who_obj, who_obj.location); . #52:0 ":match(string, object-list)"; "Return object in 'object-list' aliased to 'string'."; "Matches on a wide variety of syntax, including:"; " \"5th axe\" -- The fifth object matching \"axe\" in the object list."; " \"where's sai\" -- The only object contained in 'where' matching \"sai\" (possible $ambiguous_match)."; " \"where's second staff\" -- The second object contained in 'where' matching \"staff\"."; " \"my third dagger\" -- The third object in your inventory matching \"dagger\"."; "Ordinal matches are determined according to the match's position in 'object-list' or, if a possessive (such as \"where\" above) is given, then the ordinal is the nth match in that object's inventory."; "In the matching room (#3879@LambdaMOO), the 'object-list' consists of first the player's contents, then the room's, and finally all exits leading from the room."; string = args[1]; olist = args[2]; if (!string) return $nothing; elseif (string == "me") return player; elseif (string == "here") return player.location; elseif (valid(object = $string_utils:literal_object(string))) return object; elseif (valid(object = $string_utils:match(string, olist, "aliases"))) return object; elseif (parsed = this:parse_ordinal_reference(string)) return this:match_nth(parsed[2], olist, parsed[1]); elseif (parsed = this:parse_possessive_reference(string)) whostr = parsed[1]; objstr = parsed[2]; if (valid(whose = this:match(whostr, olist))) return this:match(objstr, whose.contents); else return whose; endif else return object; endif . #52:1 ":match_nth(string, objlist, n)"; "Find the nth object in 'objlist' that matches 'string'."; what = args[1]; where = args[2]; n = args[3]; for v in (where) z = 0; for q in (v.aliases) z = (z || (index(q, what) == 1)); endfor if (z && (!(n = (n - 1)))) return v; endif endfor return $failed_match; . #52:2 "$match_utils:match_verb(verbname, object) => Looks for a command-line style verb named <verbname> on <object> with current values of prepstr, dobjstr, dobj, iobjstr, and iobj. If a match is made, the verb is called and 1 is returned. Otherwise, 0 is returned."; vrb = args[1]; what = args[2]; if (where = $object_utils:has_verb(what, vrb)) if ((vargs = verb_args(where[1], vrb)) != {"this", "none", "this"}) if (((((((vargs[2] == "any") || ((!prepstr) && (vargs[2] == "none"))) || index(("/" + vargs[2]) + "/", ("/" + prepstr) + "/")) && (((vargs[1] == "any") || ((!dobjstr) && (vargs[1] == "none"))) || ((dobj == what) && (vargs[1] == "this")))) && (((vargs[3] == "any") || ((!iobjstr) && (vargs[3] == "none"))) || ((iobj == what) && (vargs[3] == "this")))) && index(verb_info(where[1], vrb)[2], "x")) && verb_code(where[1], vrb)) set_task_perms(caller_perms()); what:(vrb)(@args[3]); return 1; endif endif endif . #52:3 ":match_list(string, object_list) -> List of all matches."; what = args[1]; where = args[2]; r = {}; for v in (where) if (!(v in r)) z = 0; for q in (v.aliases) z = (z || (index(q, what) == 1)); endfor if (z) r = listappend(r, v); endif endif endfor return r; . #52:4 ":parse_ordref(string)"; "Parses strings referring to an 'nth' object."; "=> {NUM n, STR object} Where 'n' is the number the ordinal represents, and 'object' is the rest of the string."; "=> 0 If the given string is not an ordinal reference."; " Example:"; ":parse_ordref(\"second broadsword\") => {2, \"broadsword\"}"; ":parse_ordref(\"second\") => 0"; " Note that there must be more to the string than the ordinal alone."; if (m = match(args[1], ("^" + this.ordinal_regexp) + " +%([^ ].+%)$")) o = substitute("%1", m); n = ((o in this.ordn) || (o in this.ordw)); return n && {n, substitute("%2", m)}; else return 0; endif . #52:5 ":parse_possessive_reference(string)"; "Parses strings in a possessive format."; "=> {STR whose, STR object} Where 'whose' is the possessor of 'object'."; "If the string consists only of a possessive string (ie: \"my\", or \"yduJ's\"), then 'object' will be an empty string."; "=> 0 If the given string is not a possessive reference."; " Example:"; ":parse_possessive_reference(\"joe's cat\") => {\"joe\", \"cat\"}"; ":parse_possessive_reference(\"sis' fish\") => {\"sis\", \"fish\"}"; " Strings are returned as a value suitable for a :match routine, thus 'my' becoming 'me'."; ":parse_possessive_reference(\"my dog\") => {\"me\", \"dog\"}"; string = args[1]; if (m = match(string, "^my *%(.+%)?")) return {"me", substitute("%1", m)}; elseif (m = match(string, "^%([^ ]+s?%)%'s? *%(.+%)?")) return {substitute("%1", m), substitute("%2", m)}; else return 0; endif . #53:0 object = args[1]; prop = args[2]; if (prop in $code_utils.builtin_props) return valid(object); else return !(!property_info(object, prop)); endif . #53:1 what = args[1]; if (what.owner != caller_perms()) set_task_perms(caller_perms()); endif props = (properties(what) || {}); while (valid(what = parent(what))) props = {@properties(what) || {}, @props}; endwhile return props; . #53:2 ":has_verb(OBJ object, STR verbname)"; "Find out if an object has a verb matching the given verbname."; "Returns {location} if so, 0 if not, where location is the object or the ancestor on which the verb is actually defined."; object = args[1]; verbname = args[2]; while (E_VERBNF == (vi = verb_info(object, verbname))) object = parent(object); endwhile return vi ? {object} | 0; . #53:3 "Usage: has_callable_verb(object, verb)"; "See if an object has a verb that can be called by another verb (i.e., that has its x permission bit set)."; "Return {location}, where location is the object that defines the verb, or 0 if the object doesn't have the verb."; object = args[1]; verbname = args[2]; while (valid(object)) if (index(verb_info(object, verbname)[2], "x") && verb_code(object, verbname)) return {object}; endif object = parent(object); endwhile return 0; . #53:4 what = args[1]; if (what.owner != caller_perms()) set_task_perms(caller_perms()); endif verbs = {}; while (valid(what)) verbs = {@verbs(what) || {}, @verbs}; what = parent(what); endwhile return verbs; . #53:5 ":match_verb(OBJ object, STR verb)"; "Find out if an object has a given verb, and some information about it."; "Returns {OBJ location, STR verb} if matched, 0 if not."; "Location is the object on which it is actually defined, verb is a name"; "for the verb which can subsequently be used in verb_info (i.e., no"; "asterisks)."; verbname = strsub(args[2], "*", ""); object = args[1]; while (E_VERBNF == (info = verb_info(object, verbname))) object = parent(object); endwhile return info ? {object, verbname} | 0; . #53:6 ":isa(x,y) == valid(x) && (y==x || y in :ancestors(x))"; what = args[1]; targ = args[2]; while (valid(what)) if (what == targ) return 1; endif what = parent(what); endwhile return 0; . #53:7 "Usage: ancestors(object[, object...])"; "Return a list of all ancestors of the object(s) in args, with no duplicates."; "If called with a single object, the result will be in order ascending up the inheritance hierarchy. If called with multiple objects, it probably won't."; ret = {}; for o in (args) what = o; while (valid(what = parent(what))) ret = setadd(ret, what); endwhile endfor return ret; . #53:8 what = args[1]; kids = children(what); result = {}; for x in (kids) result = {@result, @this:descendants(x)}; endfor return {@kids, @result}; . #53:9 set_task_perms(caller_perms()); what = args[1]; kids = children(what); result = {}; for x in (kids) result = {@result, @this:descendants_suspended(x)}; endfor $command_utils:suspend_if_needed(0); return {@kids, @result}; . #53:10 r = {what = args[1]}; for k in (children(what)) r = {@r, @this:(verb)(k)}; endfor return r; . #53:11 ":branches(object) => list of all descendants of object which have children."; if (kids = children(object = args[1])) s = {object}; for k in (kids) s = {@s, @this:branches(k)}; endfor return s; else return {}; endif . #53:12 ":branches_suspended(object) => descendants of object having children."; "this version calls suspend(0) as needed"; set_task_perms(caller_perms()); if (kids = children(object = args[1])) s = {object}; for k in (kids) $command_utils:suspend_if_needed(0); s = {@s, @this:branches_suspended(k)}; endfor return s; else return {}; endif . #53:13 ":leaves(object) => list of all childless descendents of object"; s = {}; for k in (children(args[1])) s = {@s, @this:leaves(k)}; endfor return s || {args[1]}; . #53:14 ":leaves_suspended(object) => list of all childless descendents of object"; "this versions calls suspend(0) as needed"; set_task_perms(caller_perms()); s = {}; for k in (children(args[1])) $command_utils:suspend_if_needed(0); s = {@s, @this:leaves_suspended(k)}; endfor return s || {args[1]}; . #53:15 "$object_utils:contains(obj1, obj2) -- does obj1 contain obj2?"; ""; "Return true iff obj2 is under obj1 in the containment hierarchy; that is, if obj1 is obj2's location, or its location's location, or ..."; loc = args[1]; what = args[2]; while (valid(what)) what = what.location; if (what == loc) return valid(loc); return 1; endif endwhile return 0; . #53:16 "all_contents(object)"; "Return a list of all objects contained (at some level) by object."; res = {}; for y in (args[1].contents) res = {@res, y, @$object_utils:all_contents(y)}; endfor return res; . #53:17 "findable_properties(object)"; "Return a list of properties on those members of object's ancestor list that are readable or are owned by the caller (or all properties if the caller is a wizard)."; what = args[1]; props = {}; who = caller_perms(); while (what != $nothing) if ((what.r || (who == what.owner)) || who.wizard) props = {@properties(what), @props}; endif what = parent(what); endwhile return props; . #53:18 "owned_properties(what[, who])"; "Return a list of all properties on WHAT owned by WHO."; "Only wizardly verbs can specify WHO; mortal verbs can only search for properties owned by their own owners. For more information, talk to Gary_Severn."; what = (anc = args[1]); who = (((c = caller_perms()).wizard && (length(args) > 1)) ? args[2] | c); props = {}; while (anc != $nothing) for k in (properties(anc)) if (property_info(what, k)[1] == who) props = listappend(props, k); endif endfor anc = parent(anc); endwhile return props; . #53:19 ":property_conflicts(object,newparent)"; "Looks for propertyname conflicts that would keep chparent(object,newparent)"; " from working."; "Returns a list of elements of the form {<propname>, @<objectlist>}"; "where <objectlist> is list of descendents of object defining <propname>."; if (!valid(object = args[1])) return E_INVARG; elseif (!valid(newparent = args[2])) return (newparent == #-1) ? {} | E_INVARG; elseif (!($perm_utils:controls(caller_perms(), object) && (newparent.f || $perm_utils:controls(caller_perms(), newparent)))) "... if you couldn't chparent anyway, you don't need to know..."; return E_PERM; endif "... properties existing on newparent"; "... cannot be present on object or any descendent..."; props = (conflicts = {}); for o in ({object, @$object_utils:descendents_suspended(object)}) for p in (properties(o)) if (property_info(newparent, p)) if (i = (p in props)) conflicts[i] = {@conflicts[i], o}; else props = {@props, p}; conflicts = {@conflicts, {p, o}}; endif endif $command_utils:suspend_if_needed(0); endfor $command_utils:suspend_if_needed(0); endfor return conflicts; . #53:20 ":descendants_with_property_suspended(object,property)"; " => list of descendants of object on which property is defined."; "calls suspend(0) as needed"; object = args[1]; if ((caller == this) || (object.w || $perm_utils:controls(caller_perms(), object))) $command_utils:suspend_if_needed(0); if (property_info(@args)) return {object}; endif r = {}; prop = args[2]; for c in (children(object)) r = {@r, @this:descendants_with_property_suspended(c, prop)}; endfor return r; else return E_PERM; endif . #53:21 "Usage: locations(object)"; "Return a listing of the location hierarchy above object."; ret = {}; what = args[1]; while (valid(what = what.location)) ret = {@ret, what}; endwhile return ret; . #53:22 "Copied from object utilities (#3669):all_properties by Haakon (#2) Mon Dec 28 14:24:36 1992 PST"; what = args[1]; if (what.owner != caller_perms()) set_task_perms(caller_perms()); endif props = (properties(what) || {}); while (valid(what = parent(what))) props = {@properties(what) || {}, @props}; $command_utils:suspend_if_needed(0); endwhile return props; . #53:23 ":connected(object) => true iff object is a connected player."; "equivalent to (object in connected_players()) perhaps with less server overhead"; "use object:is_listening() if you want to allow for puppets and other non-player objects that still 'care' about what's said."; return 1 + connected_seconds(@args); . #53:24 ":isoneof(x,y) = x isa z, for some z in list y"; what = args[1]; targ = args[2]; while (valid(what)) if (what in targ) return 1; endif what = parent(what); endwhile return 0; . #54:0 this.input_string = args[1]; this.input_length = length(args[1]); this.input_index = 1; . #54:1 string = this.input_string; len = this.input_length; i = this.input_index; while ((i <= len) && (string[i] == " ")) i = (i + 1); endwhile if (i > len) return ""; elseif ((ch = string[i]) in {"(", ")", "!", "?"}) this.input_index = (i + 1); return ch; elseif (ch in {"&", "|"}) this.input_index = (i = (i + 1)); if ((i <= len) && (string[i] == ch)) this.input_index = (i + 1); endif return ch + ch; else start = i; while ((i <= len) && (!((ch = string[i]) in {"(", ")", "!", "?", "&", "|"}))) i = (i + 1); endwhile this.input_index = i; i = (i - 1); while (string[i] == " ") i = (i - 1); endwhile return this:canonicalize_spaces(string[start..i]); endif . #54:2 name = args[1]; while (index(name, " ")) name = strsub(name, " ", " "); endwhile return name; . #54:3 this:init_scanner(args[1]); this.player = args[2]; return this:parse_E(); ""; "Grammar for key expressions:"; ""; " E ::= A "; " | E || A "; " | E && A "; " A ::= ( E ) "; " | ! A "; " | object "; " | ? object "; . #54:4 exp = this:parse_A(); if (typeof(exp) != STR) while ((token = this:scan_token()) in {"&&", "||"}) rhs = this:parse_A(); if (typeof(rhs) == STR) return STR; endif exp = {token, exp, rhs}; endwhile endif return exp; . #54:5 token = this:scan_token(); if (token == "(") exp = this:parse_E(); if ((typeof(exp) != STR) && (this:scan_token() != ")")) return "Missing ')'"; else return exp; endif elseif (token == "!") exp = this:parse_A(); if (typeof(exp) == STR) return exp; else return {"!", exp}; endif elseif (token == "?") next = this:scan_token(); if (next in {"(", ")", "!", "&&", "||", "?"}) return ("Missing object-name before '" + token) + "'"; elseif (next == "") return "Missing object-name at end of key expression"; else what = this:match_object(next); if (typeof(what) == OBJ) return {"?", this:match_object(next)}; else return what; endif endif elseif (token in {"&&", "||"}) return ("Missing expression before '" + token) + "'"; elseif (token == "") return "Missing expression at end of key expression"; else return this:match_object(token); endif . #54:6 key = args[1]; who = args[2]; type = typeof(key); if (!(type in {LIST, OBJ})) return 1; elseif (typeof(key) == OBJ) return (who == key) || $object_utils:contains(who, key); endif op = key[1]; if (op == "!") return !this:eval_key(key[2], who); elseif (op == "?") return key[2]:is_unlocked_for(who); elseif (op == "&&") return this:eval_key(key[2], who) && this:eval_key(key[3], who); elseif (op == "||") return this:eval_key(key[2], who) || this:eval_key(key[3], who); else return 1 / 0; endif . #54:7 token = args[1]; if (token == "me") return this.player; elseif (token == "here") if (valid(this.player.location)) return this.player.location; else return ("'here' has no meaning where " + this.player.name) + " is"; endif else what = this.player.location:match_object(token); if (what == $failed_match) return ("Can't find an object named '" + token) + "'"; elseif (what == $ambiguous_match) return ("Multiple objects named '" + token) + "'"; else return what; endif endif . #54:8 key = args[1]; type = typeof(key); if (!(type in {LIST, OBJ})) return "(None.)"; elseif (type == OBJ) if (valid(key)) return tostr(key, "[", key.name, "]"); else return tostr(key); endif else op = key[1]; arg1 = this:unparse_key(key[2]); if (op == "?") return "?" + arg1; elseif (op == "!") if (typeof(key[2]) == LIST) return ("!(" + arg1) + ")"; else return "!" + arg1; endif elseif (op in {"&&", "||"}) other = ((op == "&&") ? "||" | "&&"); lhs = arg1; rhs = this:unparse_key(key[3]); if ((typeof(key[2]) == OBJ) || (key[2][1] != other)) exp = lhs; else exp = (("(" + lhs) + ")"); endif exp = (((exp + " ") + op) + " "); if ((typeof(key[3]) == OBJ) || (key[3][1] != other)) exp = (exp + rhs); else exp = (((exp + "(") + rhs) + ")"); endif return exp; else return 1 / 0; endif endif . #54:9 set_task_perms($no_one); key = args[1]; who = args[2]; type = typeof(key); if (!(type in {LIST, OBJ})) return 1; elseif (typeof(key) == OBJ) return (who == key) || $object_utils:contains(who, key); endif op = key[1]; if (op == "!") return !this:eval_key(key[2], who); elseif (op == "?") return key[2]:is_unlocked_for(who); elseif (op == "&&") return this:eval_key(key[2], who) && this:eval_key(key[3], who); elseif (op == "||") return this:eval_key(key[2], who) || this:eval_key(key[3], who); elseif (op == ".") if ($object_utils:has_property(who, key[2]) && who.(key[2])) return 1; else for thing in ($object_utils:all_contents(who)) if ($object_utils:has_property(thing, key[2]) && thing.(key[2])) return 1; endif endfor endif return 0; elseif (op == ":") if ($object_utils:has_verb(who, key[2]) && who:(key[2])()) return 1; else for thing in ($object_utils:all_contents(who)) if ($object_utils:has_verb(thing, key[2]) && thing:(key[2])()) return 1; endif endfor endif return 0; else return 1 / 0; endif . #54:10 token = this:scan_token(); if (token == "(") exp = this:parse_E(); if ((typeof(exp) != STR) && (this:scan_token() != ")")) return "Missing ')'"; else return exp; endif elseif (token == "!") exp = this:parse_A(); if (typeof(exp) == STR) return exp; else return {"!", exp}; endif elseif (token == "?") next = this:scan_token(); if (next in {":", ".", "(", ")", "!", "&&", "||", "?"}) return ("Missing object-name before '" + token) + "'"; elseif (next == "") return "Missing object-name at end of key expression"; else what = this:match_object(next); if (typeof(what) == OBJ) return {"?", this:match_object(next)}; else return what; endif endif elseif (token in {":", "."}) next = this:scan_token(); if (next in {":", ".", "(", ")", "!", "&&", "||", "?"}) return ("Missing verb-or-property-name before '" + token) + "'"; elseif (next == "") return "Missing verb-or-property-name at end of key expression"; elseif (typeof(next) != STR) return "Non-string verb-or-property-name at end of key expression"; else return {token, next}; endif elseif (token in {"&&", "||"}) return ("Missing expression before '" + token) + "'"; elseif (token == "") return "Missing expression at end of key expression"; else return this:match_object(token); endif . #55:0 result = this:do_burn(); player:tell(result ? this:burn_succeeded_msg() | this:burn_failed_msg()); if (msg = (result ? this:oburn_succeeded_msg() | this:oburn_failed_msg())) player.location:announce(player.name, " ", msg); endif . #55:1 return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | ""; . #55:2 c = callers(); while (c && c[1][3].wizard) c = listdelete(c, 1); endwhile if (c) who = c[1][3]; else who = player; endif if ((this != $letter) && ($perm_utils:controls(who, this) || this:is_readable_by(who))) fork (0) $recycler:_recycle(this); endfork return 1; else return E_PERM; endif . #56:0 ":make(n[,elt]) => a list of n elements, each of which == elt. elt defaults to 0."; if ((n = args[1]) < 0) return E_INVARG; endif ret = {}; build = {elt = {@args, 0}[2]}; while (1) if (n % 2) ret = {@ret, @build}; endif if (n = (n / 2)) build = {@build, @build}; else return ret; endif endwhile . #56:1 ":range([m,]n) => {m,m+1,...,n}"; if (listdelete(args, 1)) else args = {1, @args}; endif ret = {}; for k in [args[1]..args[2]] ret = {@ret, k}; endfor return ret; . #56:2 set_task_perms(caller_perms()); prop = args[2]; if ((len = length(objs = args[1])) > 50) return {@this:map_prop(objs[1..len / 2], prop), @this:map_prop(objs[(len / 2) + 1..len], prop)}; endif strs = {}; for foo in (objs) strs = {@strs, foo.(prop)}; endfor return strs; . #56:3 set_task_perms(caller_perms()); if ((len = length(objs = args[1])) > 50) return {@this:map_verb(@listset(args, objs[1..len / 2], 1)), @this:map_verb(@listset(args, objs[(len / 2) + 1..len], 1))}; endif vrb = args[2]; rest = args[3..length(args)]; strs = {}; for o in (objs) strs = {@strs, o:(vrb)(@rest)}; endfor return strs; . #56:4 "map_arg([n,]object,verb,@args) -- assumes the nth element of args is a list, calls object:verb(@args) with each element of the list substituted in turn, returns the list of results. n defaults to 1."; "map_verb_arg(o,v,{a...},a2,a3,a4,a5)={o:v(a,a2,a3,a4,a5),...}"; "map_verb_arg(4,o,v,a1,a2,a3,{a...},a5)={o:v(a1,a2,a3,a,a5),...}"; set_task_perms(caller_perms()); if (n = args[1]) object = args[2]; verb = args[3]; rest = args[4..length(args)]; else object = n; n = 1; verb = args[2]; rest = args[3..length(args)]; endif results = {}; for a in (rest[n]) results = listappend(results, object:(verb)(@listset(rest, a, n))); endfor return results; . #56:5 ":map_builtin(objectlist,func) applies func to each of the objects in turn and returns the corresponding list of results. This function is mainly here for completeness -- in the vast majority of situations, a simple for loop is better."; set_task_perms(caller_perms()); if (!((builtin = args[2]) in {"tostr", "tonum", "toobj", "typeof", "length", "random", "ctime", "valid", "parent", "children", "properties", "verbs", "is_player", "idle_seconds", "connected_seconds"})) return E_INVARG; endif objs = args[1]; if (length(objs) > 100) return {@this:map_builtin(objs[1..l = (length(objs) / 2)], builtin), @this:map_builtin(objs[l + 1..length(objs)], builtin)}; endif strs = {}; for foo in (objs) strs = {@strs, eval(tostr("return ", builtin, "(", $string_utils:from_value(foo, 1, -1), ");"))[2]}; endfor return strs; . #56:6 "find_insert(sortedlist,key) => index of first element in sortedlist > key"; " sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 1 to length(sortedlist)+1, inclusive."; lst = args[1]; key = args[2]; if ((r = length(lst)) < 25) for l in [1..r] if (lst[l] > key) return l; endif endfor return r + 1; else l = 1; while (r >= l) if (key < lst[i = ((r + l) / 2)]) r = (i - 1); else l = (i + 1); endif endwhile return l; endif . #56:7 "remove_duplicates(list) => list as a set, i.e., all repeated elements removed."; out = {}; for x in (args[1]) out = setadd(out, x); endfor return out; . #56:8 "arrayset(list,value,pos1,...,posn) -- returns list modified such that"; " list[pos1][pos2][...][posn] == value"; if (length(args) > 3) return listset(@listset(args[1..3], this:arrayset(@listset(listdelete(args, 3), args[1][args[3]], 1)), 2)); "... Rog's entry in the Obfuscated MOO-Code Contest..."; else return listset(@args); endif . #56:9 ":setremove_all(set,elt) => set with *all* occurences of elt removed"; set = args[1]; what = args[2]; while (w = (what in set)) set = listdelete(set, w); endwhile return set; . #56:10 "append({a,b,c},{d,e},{},{f,g,h},...) => {a,b,c,d,e,f,g,h}"; if ((n = length(args)) > 50) return {@this:append(@args[1..n / 2]), @this:append(@args[(n / 2) + 1..n])}; endif l = {}; for a in (args) l = {@l, @a}; endfor return l; . #56:11 "reverse(list) => reversed list"; return this:_reverse(@args[1]); . #56:12 ":_reverse(@list) => reversed list"; if ((n = length(args)) > 50) return {@this:_reverse(@args[(n / 2) + 1..n]), @this:_reverse(@args[1..n / 2])}; endif l = {}; for a in (args) l = listinsert(l, a); endfor return l; . #56:13 "compress(list) => list with consecutive repeated elements removed, e.g.,"; "compress({a,b,b,c,b,b,b,d,d,e}) => {a,b,c,b,d,e}"; if (l = args[1]) out = {last = l[1]}; for x in (listdelete(l, 1)) if (x != last) out = listappend(out, x); last = x; endif endfor return out; else return l; endif . #56:14 "sort(list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it. keys defaults to the list itself."; "sort({x1,x3,x2},{1,3,2}) => {x1,x2,x3}"; lst = args[1]; unsorted_keys = ((use_sorted_lst = (length(args) >= 2)) ? args[2] | lst); sorted_lst = (sorted_keys = {}); for e in (unsorted_keys) l = this:find_insert(sorted_keys, e); sorted_keys = listinsert(sorted_keys, e, l); if (use_sorted_lst) sorted_lst = listinsert(sorted_lst, lst[length(sorted_keys)], l); endif endfor return sorted_lst || sorted_keys; . #56:15 ":sort_suspended(interval,list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it. keys defaults to the list itself."; "does suspend(interval) as needed."; set_task_perms(caller_perms()); interval = args[1]; if (typeof(interval) != NUM) return E_ARGS; endif lst = args[2]; unsorted_keys = ((use_sorted_lst = (length(args) >= 3)) ? args[3] | lst); sorted_lst = (sorted_keys = {}); for e in (unsorted_keys) l = this:find_insert(sorted_keys, e); sorted_keys[l..l - 1] = {e}; if (use_sorted_lst) sorted_lst[l..l - 1] = {lst[length(sorted_keys)]}; endif $command_utils:suspend_if_needed(interval); endfor return sorted_lst || sorted_keys; . #56:16 "slice(alist[,index]) returns a list of the index-th elements of the elements of alist, e.g., "; " slice({{\"z\",1},{\"y\",2},{\"x\",5}},2) => {1,2,5}."; "index defaults to 1 and may also be a nonempty list, e.g., "; " slice({{\"z\",1,3},{\"y\",2,4}},{2,1}) => {{1,\"z\"},{2,\"y\"}}"; slice = {}; ind = {@args, 1}[2]; if (typeof(ind) == LIST) for elt in (args[1]) s = {elt[ind[1]]}; for i in (listdelete(ind, 1)) s = {@s, elt[i]}; endfor slice = {@slice, s}; endfor else for elt in (args[1]) slice = {@slice, elt[ind]}; endfor endif return slice; . #56:17 "assoc(target,list[,index]) returns the first element of `list' whose own index-th element is target. Index defaults to 1."; "returns {} if no such element is found"; target = args[1]; indx = {@args, 1}[3]; for t in (args[2]) if (t[indx] == target) "... do this test first since it's the most likely to fail; this needs -d"; if ((typeof(t) == LIST) && (length(t) >= indx)) return t; endif endif endfor return {}; . #56:18 "iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target. Index defaults to 1."; "returns 0 if no such element is found."; target = args[1]; indx = {@args, 1}[3]; i = 1; for lsti in (args[2]) if (lsti[indx] == target) "... do this test first since it's the most likely to fail; this needs -d"; if ((typeof(lsti) == LIST) && (length(lsti) >= indx)) return i; endif endif i = (i + 1); endfor return 0; . #56:19 "iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target. Index defaults to 1."; "returns 0 if no such element is found."; "suspends as needed."; set_task_perms(caller_perms()); target = args[1]; indx = {@args, 1}[3]; i = 1; for lsti in (args[2]) if (lsti[indx] == target) "... do this test first since it's the most likely to fail; this needs -d"; if ((typeof(lsti) == LIST) && (length(lsti) >= indx)) return i; endif endif i = (i + 1); $command_utils:suspend_if_needed(1); endfor return 0; . #56:20 "assoc_prefix(target,list[,index]) returns the first element of `list' whose own index-th element has target as a prefix. Index defaults to 1."; target = args[1]; indx = ((length(args) >= 3) ? args[3] | 1); for t in (args[2]) if ((typeof(t) == LIST) && ((length(t) >= indx) && (index(t[indx], target) == 1))) return t; endif endfor return {}; . #56:21 "iassoc_prefix(target,list[,index]) returns the index of the first element of `list' whose own index-th element has target as a prefix. Index defaults to 1."; target = args[1]; indx = ((length(args) >= 3) ? args[3] | 1); for i in [1..length(lst = args[2])] if ((typeof(lsti = lst[i]) == LIST) && ((length(lsti) >= indx) && (index(lsti[indx], target) == 1))) return i; endif endfor return 0; . #56:22 "iassoc_sorted(target,sortedlist[,i]) => index of last element in sortedlist whose own i-th element is <= target. i defaults to 1."; " sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 0 to length(sortedlist), inclusive."; target = args[1]; indx = {@args, 1}[3]; if ((r = length(lst = args[2])) < 25) for l in [1..r] if (target < lst[l][indx]) return l - 1; endif endfor return r; else l = 0; r = (r + 1); while ((r - 1) > l) if (target < lst[i = ((r + l) / 2)][indx]) r = i; else l = i; endif endwhile return l; endif . #56:23 ":sort_alist(alist[,n]) sorts a list of tuples by n-th (1st) element."; if ((alist_length = length(alist = args[1])) < 25) "use insertion sort on short lists"; return this:sort(alist, this:slice(@args)); endif sort_on = {@args, 1}[2]; left_index = (alist_length / 2); right_index = ((alist_length + 1) / 2); left_sublist = this:sort_alist(alist[1..left_index], sort_on); right_sublist = this:sort_alist(alist[left_index + 1..alist_length], sort_on); "..."; "... merge ..."; "..."; left_key = left_sublist[left_index][sort_on]; right_key = right_sublist[right_index][sort_on]; if (left_key > right_key) merged_list = {}; else "... alist_length >= 25 implies right_index >= 2..."; "... move right_index downward until left_key > right_key..."; r = (right_index - 1); while (left_key <= (right_key = right_sublist[r][sort_on])) if (r = (r - 1)) else return {@left_sublist, @right_sublist}; endif endwhile merged_list = right_sublist[r + 1..right_index]; right_index = r; endif while (l = (left_index - 1)) "... left_key > right_key ..."; "... move left_index downward until left_key <= right_key..."; while ((left_key = left_sublist[l][sort_on]) > right_key) if (l = (l - 1)) else return {@right_sublist[1..right_index], @left_sublist[1..left_index], @merged_list}; endif endwhile merged_list[1..0] = left_sublist[l + 1..left_index]; left_index = l; "... left_key <= right_key ..."; if (r = (right_index - 1)) "... move right_index downward until left_key > right_key..."; while (left_key <= (right_key = right_sublist[r][sort_on])) if (r = (r - 1)) else return {@left_sublist[1..left_index], @right_sublist[1..right_index], @merged_list}; endif endwhile merged_list[1..0] = right_sublist[r + 1..right_index]; right_index = r; else return {@left_sublist[1..left_index], right_sublist[1], @merged_list}; endif endwhile return {@right_sublist[1..right_index], left_sublist[1], @merged_list}; . #56:24 "sort_alist_suspended(interval,alist[,n]) sorts a list of tuples by n-th element. n defaults to 1. Calls suspend(interval) as necessary."; set_task_perms(caller_perms()); "... so it can be killed..."; interval = args[1]; if ((alist_length = length(alist = args[2])) < 10) "insertion sort on short lists"; $command_utils:suspend_if_needed(interval); return this:sort(alist, this:slice(@listdelete(args, 1))); endif "variables specially expanded for the anal-retentive"; sort_on = {@args, 1}[3]; left_index = (alist_length / 2); right_index = ((alist_length + 1) / 2); left_sublist = this:sort_alist_suspended(interval, alist[1..left_index], sort_on); right_sublist = this:sort_alist_suspended(interval, alist[left_index + 1..alist_length], sort_on); left_element = left_sublist[left_index]; right_element = right_sublist[right_index]; merged_list = {}; while (1) $command_utils:suspend_if_needed(interval); if (left_element[sort_on] > right_element[sort_on]) merged_list = {left_element, @merged_list}; if (left_index = (left_index - 1)) left_element = left_sublist[left_index]; else return {@right_sublist[1..right_index], @merged_list}; endif else merged_list = {right_element, @merged_list}; if (right_index = (right_index - 1)) right_element = right_sublist[right_index]; else return {@left_sublist[1..left_index], @merged_list}; endif endif endwhile . #56:25 ":randomly_permute(list) => list with its elements randomly permuted"; " each of the length(list)! possible permutations is equally likely"; plist = {}; for i in [1..length(ulist = args[1])] plist = listinsert(plist, ulist[i], random(i)); endfor return plist; . #56:26 "$list_utils:count(item, list)"; "Returns the number of occurrences of item in list."; if (length(args) != 2) return E_ARGS; elseif (typeof(xlist = args[2]) != LIST) return E_INVARG; endif x = args[1]; counter = 0; for elt in (xlist) if (x == elt) counter = (counter + 1); endif endfor return counter; . #56:27 "Copied from $quinn_utils (#34283):unroll by Quinn (#19845) Mon Mar 8 09:29:03 1993 PST"; ":flatten(LIST list_of_lists) => LIST of all lists in given list `flattened'"; newlist = {}; for elm in (args[1]) if (typeof(elm) == LIST) newlist = {@newlist, @this:flatten(elm)}; else newlist = {@newlist, elm}; endif endfor return newlist; . #56:28 "Copied from APHiD (#33119):longest Sun May 9 21:00:18 1993 PDT"; "$list_utils:longest(<list>)"; "$list_utils:shortest(<list>)"; " - Returns the shortest or longest element in the list. Elements may be either strings or lists."; if (typeof(all = args[1]) != LIST) return E_TYPE; else result = all[1]; for things in (all) if ((typeof(things) != LIST) && (typeof(things) != STR)) return E_TYPE; else result = ((((verb == "longest") && (length(result) < length(things))) || ((verb == "shortest") && (length(result) > length(things)))) ? things | result); endif endfor endif return result; . #56:29 "check_nonstring_tell_lines(lines)"; if (caller_perms().wizard) "don't let a nonwizard mess up our stats"; for line in (args[1]) if (typeof(line) != STR) this.nonstring_tell_lines = listappend(this.nonstring_tell_lines, callers()); return; endif endfor endif . #57:0 "Usage: object_match_failed(object, string)"; "Prints a message if string does not match object. Generally used after object is derived from a :match_object(string)."; match_result = args[1]; string = args[2]; tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell"); if ((index(string, "#") == 1) && ($code_utils:toobj(string) != E_TYPE)) "...avoid the `I don't know which `#-2' you mean' message..."; if (!valid(match_result)) player:(tell)(tostr(string, " does not exist.")); endif return !valid(match_result); elseif (match_result == $nothing) player:(tell)("You must give the name of some object."); elseif (match_result == $failed_match) player:(tell)(tostr("I see no \"", string, "\" here.")); elseif (match_result == $ambiguous_match) player:(tell)(tostr("I don't know which \"", string, "\" you mean.")); elseif (!valid(match_result)) player:(tell)(tostr(match_result, " does not exist.")); else return 0; endif return 1; . #57:1 ":player_match_failed(result,string)"; " is exactly like :object_match_failed(result,string)"; " except that its messages are more suitable for player searches."; ":player_match_result(results,strings)"; " handles a list of results, also presumably from $string_utils:match_player(strings), printing messages to player for *each* of the nonmatching strings. It returns a list, an overall result (true if some string didn't match --- just like player_match_failed), followed by the list players that matched."; ""; "An optional 3rd arg gives an identifying string to prefix to each of the nasty messages."; if (valid(player)) tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell"); plyr = player; else tell = "notify"; plyr = $login; endif "..."; match_results = args[1]; strings = args[2]; cmdid = ({@args, ""}[3] || ""); pmf = (verb == "player_match_failed"); if (typeof(match_results) == OBJ) match_results = {match_results}; strings = {strings}; endif pset = {}; bombed = 0; for i in [1..length(match_results)] if (valid(result = match_results[i])) pset = setadd(pset, match_results[i]); elseif (result == $nothing) "... player_match_result quietly skips over blank strings"; if (pmf) plyr:(tell)("You must give the name of some player."); bombed = 1; endif elseif (result == $failed_match) plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" is not the name of any player.")); bombed = 1; elseif (result == $ambiguous_match) lst = $player_db:find_all(strings[i]); plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), ".")); bombed = 1; else plyr:(tell)(tostr(result, " does not exist.")); bombed = 1; endif endfor return pmf ? bombed | {bombed, @pset}; . #57:2 "$command_utils:read() -- read a line of input from the player and return it"; "Optional argument is a prompt portion to replace `a line of input' in the prompt."; ""; "Returns E_PERM if the current task is not a command task that has never called suspend()."; if (args && (typeof(args[1]) == STR)) prompt = args[1]; else prompt = "a line of input"; endif c = callers(); p = c[length(c)][5]; p:notify(tostr("[Type ", prompt, " or `@abort' to abort the command.]")); ans = read(); if (typeof(ans) == ERR) return ans; elseif ($string_utils:trim(ans) == "@abort") p:notify(">> Command Aborted <<"); kill_task(task_id()); else return ans; endif . #57:3 "$command_utils:read_lines() -- read zero or more lines of input"; ""; "Returns a list of strings, the lines typed by the player. Returns E_PERM if the current task is not a command task that has never called suspend()."; "In order that one may enter arbitrary lines, including \"@abort\" or \".\", if the first character in an input line is `.' and there is some nonwhitespace afterwords, the `.' is dropped and the rest of the line is taken verbatim, so that, e.g., \".@abort\" enters as \"@abort\" and \"..\" enters as \".\"."; c = callers(); p = c[length(c)][5]; p:notify("[Type lines of input; use `.' to end or `@abort' to abort the command.]"); ans = {}; while (1) if (typeof(line = read()) == ERR) return line; elseif ((line[1..min(6, length(line))] == "@abort") && ((tail = line[7..length(line)]) == $string_utils:space(tail))) p:notify(">> Command Aborted <<"); kill_task(task_id()); elseif ((!line) || (line[1] != ".")) ans = {@ans, line}; elseif ((tail = line[2..length(line)]) == $string_utils:space(tail)) return ans; else ans = {@ans, tail}; endif endwhile . #57:4 ":yes-or-no([prompt]) -- prompts the player for a yes or no answer and returns a true value iff the player enters a line of input that is some prefix of \"yes\""; ""; "Returns E_NONE if the player enters a blank line, E_INVARG, if the player enters something that isn't a prefix of \"yes\" or \"no\", and E_PERM if the current task is not a command task that has never called suspend()."; c = callers(); p = c[length(c)][5]; p:notify(tostr(args ? args[1] + " " | "", "[Enter `yes' or `no']")); ans = read(@((caller == p) || $perm_utils:controls(caller_perms(), p)) ? {p} | {}); if (typeof(ans) == ERR) return ans; elseif (ans = $string_utils:trim(ans)) if (ans == "@abort") p:notify(">> Command Aborted <<"); kill_task(task_id()); endif return (index("yes", ans) == 1) || ((index("no", ans) != 1) && E_INVARG); else return E_NONE; endif . #57:5 "$command_utils:read_lines_escape(escapes[,help]) -- read zero or more lines of input"; ""; "Similar to :read_lines() except that help is available and one may specify other escape sequences to terminate the read."; " escapes should be either a string or list of strings; this specifies which inputs other from `.' or `@abort' should terminate the read (... don't use anything beginning with a `.')."; " help should be a string or list of strings to be printed in response to the player typing `?'; the first line of the help text should be a general comment about what the input text should be used for. Successive lines should describe the effects of the alternative escapes."; "Returns {end,list-of-strings-input} where end is the particular line that terminated this input or 0 if input terminated normally with `.'. Returns E_PERM if the current task is not a command task that has never called suspend(). "; "@abort and lines beginning with `.' are treated exactly as with :read_lines()"; c = callers(); p = c[length(c)][5]; escapes = {".", "@abort", @(typeof(args[1]) == LIST) ? args[1] | {args[1]}}; p:notify(tostr("[Type lines of input; `?' for help; end with `", $string_utils:english_list(escapes, "", "' or `", "', `", ""), "'.]")); ans = {}; escapes[1..0] = {"?"}; "... set up the help text..."; help = {@args, "You are currently in a read loop."}[2]; if (typeof(help) != LIST) help = {help}; endif help[2..1] = {"Type `.' on a line by itself to finish.", "Anything else with a leading period is entered with the period removed.", "Type `@abort' to abort the command completely."}; while (typeof(line = read()) != ERR) if ((trimline = $string_utils:trimr(line)) in escapes) if (trimline == ".") return {0, ans}; elseif (trimline == "@abort") p:notify(">> Command Aborted <<"); kill_task(task_id()); elseif (trimline == "?") p:notify_lines(help); else return {trimline, ans}; endif else if (line && (line[1] == ".")) line[1..1] = ""; endif ans = {@ans, line}; endif endwhile return line; . #57:6 "Suspend, using output_delimiters() in case a client needs to keep track"; "of the output of the current command."; "Args are TIME, amount of time to suspend, and optional (misnamed) OUTPUT."; "If given no OUTPUT, just do a suspend."; "If OUTPUT is neither list nor string, suspend and return output_delimiters"; "If OUTPUT is a list, it should be in the output_delimiters() format:"; " {PREFIX, SUFFIX}. Use these to handle that client stuff."; "If OUTPUT is a string, it should be SUFFIX (output_delimiters[2])"; ""; "Proper usage:"; "The first time you want to suspend, use"; " output_delimiters = $command_utils:suspend(time, x);"; "where x is some non-zero number."; "Following, use"; " $command_utils:suspend(time, output_delimiters);"; "To wrap things up, use"; " $command_utils:suspend(time, output_delimiters[2]);"; "You'll probably want time == 0 most of the time."; "Note: Using this from verbs called by other verbs could get pretty weird."; set_task_perms(caller_perms()); time = args[1]; output = ((length(args) == 2) && args[2]); if (!output) suspend(time); else if (typeof(output) == LIST) PREFIX = output[1]; SUFFIX = output[2]; if (PREFIX) player:tell(output[2]); endif suspend(time); if (SUFFIX) player:tell(output[1]); endif elseif (typeof(output) == STR) if (output) player:tell(output); endif else output = output_delimiters(player); suspend(time); if (output != {"", ""}) player:tell(output[1]); endif return output; endif endif . #57:7 "Return true if we're running out of ticks or seconds."; return (seconds_left() < 2) || (ticks_left() < 4000); . #57:8 "Usage: $command_utils:suspend_if_needed(<time>[, @<announcement>])"; "See if we're running out of ticks or seconds, and if so suspend(<time>) and return true. If more than one arg is given, print the remainder with player:tell."; if (this:running_out_of_time()) " && valid(player)) -- taking check out for now "; if (ann = listdelete(args, 1)) player:tell(@ann); endif data = {task_id(), callers()}; this:suspend_database_add(data); set_task_perms(caller_perms()); suspend(args[1]); this:suspend_database_remove(data); return 1; endif . #57:9 ":dump_lines(text) => text `.'-quoted for :read_lines()"; " text is assumed to be a list of strings"; "Returns a corresponding list of strings which, when read via :read_lines, "; "produces the original list of strings (essentially, any strings beginning "; "with a period \".\" have the period doubled)."; "The list returned includes a final \".\""; text = args[1]; newtext = {}; i = (lasti = 0); for line in (text) if (line && (line[1] == ".")) newtext = {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "." + line}; lasti = (i = (i + 1)); else i = (i + 1); endif endfor return {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "."}; . #57:10 ":explain_syntax(here,verb,args)"; verb = args[2]; for x in ({player, args[1], @valid(dobj) ? {dobj} | {}, @valid(iobj) ? {iobj} | {}}) what = x; while (hv = $object_utils:has_verb(what, verb)) what = hv[1]; i = 0; while (0 <= (i = $code_utils:find_verb_named(what, verb, i))) if (evs = $code_utils:explain_verb_syntax(x, verb, @verb_args(what, tostr(i)))) player:tell("Try this instead: ", evs); return 1; endif i = (i + 1); endwhile what = parent(what); endwhile endfor return 0; . #57:11 ":do_huh(verb,args) what :huh should do by default."; set_task_perms(cp = caller_perms()); verb = args[1]; args = args[2]; notify = ($perm_utils:controls(cp, player) ? "notify" | "tell"); if (player:my_huh(verb, args)) "... the player found something funky to do ..."; elseif (caller:here_huh(verb, args)) "... the room found something funky to do ..."; elseif (player:last_huh(verb, args)) "... player's second round found something to do ..."; elseif (dobj == $ambiguous_match) if (iobj == $ambiguous_match) player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" and \"", iobjstr, "\" are both ambiguous names).")); else player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" is an ambiguous name).")); endif elseif (iobj == $ambiguous_match) player:(notify)(tostr("I don't understand that (\"", iobjstr, "\" is an ambiguous name).")); else player:(notify)("I don't understand that."); player:my_explain_syntax(caller, verb, args) || (caller:here_explain_syntax(caller, verb, args) || this:explain_syntax(caller, verb, args)); endif . #57:12 if (caller == this) this.suspend_database = setadd(this.suspend_database, args[1]); endif . #57:13 if (caller == this) this.suspend_database = setremove(this.suspend_database, args[1]); endif . #57:14 if (caller_perms().wizard) q = $list_utils:slice(queued_tasks(), 1); newdb = {}; for x in (this.suspend_database) if (x[1] in q) newdb = {@newdb, x}; endif endfor this.suspend_database = newdb; else return E_PERM; endif . #57:15 "task_info(task id)"; "Return info (the same info supplied by queued_tasks()) about a given task id, or E_INVARG if there's no such task queued."; "WIZARDLY"; set_task_perms(caller_perms()); tasks = queued_tasks(); task_id = args[1]; for task in (tasks) if (task[1] == task_id) return task; endif endfor return E_INVARG; . #57:16 this:suspend_database_cleanup(); who = caller_perms(); for x in (this.suspend_database) if (who.wizard || (x[2][1][3] == who)) player:tell(x[1]); for y in (x[2]) player:tell(" ", $string_utils:print(y)); endfor endif endfor . #57:17 if (caller_perms().wizard) this.suspend_database = {}; endif . #58:0 if ((!player.wizard) || (player != this)) player:notify("Sorry."); return; endif set_task_perms(player); args = setremove(args, "to"); if ((length(args) != 2) || (!args[2])) player:notify(tostr("Usage: ", verb, " <object-or-property-or-verb> <owner>")); return; endif what = args[1]; owner = $string_utils:match_player(args[2]); if ($command_utils:player_match_result(owner, args[2])[1]) elseif (index(what, ".") && (spec = $code_utils:parse_propref(what))) object = this:my_match_object(spec[1]); if (!$command_utils:object_match_failed(object, spec[1])) pname = spec[2]; e = $wiz_utils:set_property_owner(object, pname, owner); if (e == E_NONE) player:notify("+c Property owner set. Did you really want to do that?"); else player:notify(tostr(e && "Property owner set.")); endif endif elseif (spec = $code_utils:parse_verbref(what)) object = this:my_match_object(spec[1]); if (!$command_utils:object_match_failed(object, spec[1])) vname = spec[2]; info = verb_info(object, vname); if (info == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else result = set_verb_info(object, vname, listset(info, owner, 1)); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify("Verb owner set."); endif endif endif else object = this:my_match_object(what); if (!$command_utils:object_match_failed(object, what)) player:notify(tostr($wiz_utils:set_owner(object, owner) && "Object ownership changed.")); endif endif . #58:1 if ((length(args) == 1) && (argstr[1] == "\"")) argstr = args[1]; endif for person in (connected_players()) if (person != player) person:notify(tostr(player.name, " shouts, \"", argstr, "\"")); endif endfor player:notify(tostr("You shout, \"", argstr, "\"")); . #58:2 "@grant <object> to <player>"; "@grants <object> to <player> --- same as @grant but may suspend."; "@transfer <expression> to <player> -- like 'grant', but evalutes a possible list of objects to transfer, and modifies quota."; "Ownership of the object changes as in @chown and :set_owner (i.e., .owner and all c properties change). In addition all verbs and !c properties owned by the original owner change ownership as well. Finally, for !c properties, instances on descendant objects change ownership (as in :set_property_owner)."; if ((!player.wizard) || (player != this)) player:notify("Sorry."); return; endif set_task_perms(player); if ((!iobjstr) || (!dobjstr)) return player:notify(tostr("Usage: ", verb, " <object> to <player>")); endif if ($command_utils:player_match_failed(newowner = $string_utils:match_player(iobjstr), iobjstr)) "...newowner is bogus..."; return; endif if (verb == "@transfer") objlist = player:eval_cmd_string(dobjstr, 0); if (!objlist[1]) player:notify(tostr("Had trouble reading `", dobjstr, "': ")); player:notify_lines(@objlist[2]); return; elseif (typeof(objlist[2]) == OBJ) objlist = objlist[2..2]; elseif (typeof(objlist[2]) != LIST) player:notify(tostr("Value of `", dobjstr, "' is not an object or list: ", $string_utils:print(objlist[2]))); return; else objlist = objlist[2]; endif elseif ($command_utils:object_match_failed(object = this:my_match_object(dobjstr), dobjstr)) "...object is bogus..."; return; else objlist = {object}; endif if ((verb == "@transfer") && (newowner.ownership_quota < length(objlist))) player:tell("Sorry, ", $string_utils:nn(newowner), " doesn't have enough quota."); return; endif suspendok = (verb != "@grant"); player:tell("Transfering ", $string_utils:print(objlist), " to ", $string_utils:nn(newowner)); for object in (objlist) $command_utils:suspend_if_needed(0); same = (object.owner == newowner); for vnum in [0..length(verbs(object)) - 1] verb = tostr(vnum); info = verb_info(object, verb); if (!((info[1] != object.owner) && (valid(info[1]) && is_player(info[1])))) same = (same && (info[1] == newowner)); set_verb_info(object, verb, listset(info, newowner, 1)); endif endfor for prop in (properties(object)) if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2))) suspend(0); endif info = property_info(object, prop); if (!(index(info[2], "c") || (((info[1] != object.owner) && valid(info[1])) && is_player(info[1])))) same = (same && (info[1] == newowner)); $wiz_utils:set_property_owner(object, prop, newowner, suspendok); endif endfor if (suspendok) suspend(0); endif $wiz_utils:set_owner(object, newowner, suspendok); if (same) player:notify(tostr(newowner.name, " already owns everything ", newowner.ps, " is entitled to on ", object.name, ".")); else player:notify(tostr("Ownership changed on ", $string_utils:nn(object), ", verb, properties and descendants' properties.")); endif endfor . #58:3 set_task_perms(player); dobj = $string_utils:match_player(dobjstr); if (dobj == $nothing) player:notify(tostr("Usage: ", verb, " <playername>")); elseif ($command_utils:player_match_result(dobj, dobjstr)[1]) elseif ((dobj.description == $player.description) && (!$command_utils:yes_or_no($string_utils:pronoun_sub("@Programmer %d despite %[dpp] lack of description?")))) player:notify(tostr("Okay, leaving ", dobj.name, " !programmer.")); return; elseif (result = $wiz_utils:set_programmer(dobj)) player:notify(tostr(dobj.name, " is now a programmer. ", dobj.ppc, " quota is currently ", dobj.ownership_quota, ".")); player:notify(tostr(dobj.name, " and the other wizards have been notified.")); if (msg = this:programmer_victim_msg()) dobj:notify(msg); endif if ($object_utils:isa(dobj.location, $room) && (msg = this:programmer_msg())) dobj.location:announce_all_but({dobj}, msg); endif elseif (result == E_NONE) player:notify(tostr(dobj.name, " (", dobj, ") is already a programmer...")); else player:notify(tostr(result)); endif . #58:4 if (!player.wizard) player:notify("Nice try, but permission denied."); return; elseif (args == {}) player:notify(tostr("Continuing with this command will destroy all but the central core of the database. If you're really sure that you want to do this, type '", verb, " ", tonum(o = create(#1)), "' now.")); recycle(o); return; elseif (toobj(tonum(args[1])) != max_object()) player:notify(tostr("Nice try, but you mistyped the self-destruct password. Type '", verb, "' again to get a new password.")); return; elseif (verb_info($wiz, verb)[1] != player) player:notify("Sorry, but you must own this verb in order to use it."); return; endif "----------------------------------------"; player:notify("Blowing away $local..."); $local = #-1; "----------------------------------------"; player:notify("Identifying objects to be saved..."); saved = {#0, player}; saved_props = {}; for p in (properties(#0)) v = #0.(p); if ((typeof(v) == OBJ) && valid(v)) saved = setadd(saved, v); saved_props = {@saved_props, p}; endif endfor for o in (saved) "Also save non-$ objects that are ancestors of $ objects"; "but leave out non-$ player classes"; if (!$object_utils:isa(o, $player)) p = parent(o); while (valid(p)) saved = setadd(saved, p); p = parent(p); endwhile endif endfor $player_class = $player; "----------------------------------------"; player:notify("Killing all queued tasks ..."); for t in (queued_tasks()) kill_task(t[1]); endfor "----------------------------------------"; player:notify("Stripping you of any personal verbs and/or properties ..."); suspend(0); for i in [1..length(verbs(player))] delete_verb(player, "0"); endfor for p in (properties(player)) delete_property(player, p); endfor chparent(player, $wiz); for p in ($object_utils:all_properties(player)) player.(p) = $wiz.(p); endfor player.name = "Wizard"; player.aliases = {"Wizard"}; player.description = ""; player.key = 0; player.ownership_quota = 100; player.password = 0; $gender_utils:set(player, "neuter"); "----------------------------------------"; suspend(0); player:notify("Making you or $hacker the owner of every saved object, verb and property ..."); for i in [1..length(saved)] if ($command_utils:running_out_of_time()) suspend(0); player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ...")); endif o = saved[i]; if (valid(o.owner) && o.owner.wizard) o.owner = player; else o.owner = $hacker; endif old_verbs = {}; for j in [0..length(verbs(o)) - 1] if ((seconds_left() < 2) || (ticks_left() < 2000)) suspend(0); player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ...")); endif vname = tostr(j); info = verb_info(o, vname); if (valid(info[1]) && info[1].wizard) info = listset(info, player, 1); else info = listset(info, $hacker, 1); endif set_verb_info(o, vname, info); if (index(info[3], "(old)")) old_verbs = {vname, @old_verbs}; endif endfor for vname in (old_verbs) delete_verb(o, vname); endfor for p in ($object_utils:all_properties(o)) if ((seconds_left() < 2) || (ticks_left() < 2000)) suspend(0); player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ...")); endif info = property_info(o, p); if (valid(info[1]) && info[1].wizard) info = listset(info, player, 1); else info = listset(info, $hacker, 1); endif set_property_info(o, p, info); endfor endfor "----------------------------------------"; player:notify("Removing all unsaved :recycle and :exitfunc verbs ..."); for i in [0..tonum(max_object())] o = toobj(i); if (i && ((i % 1000) == 0)) player:notify(tostr("... ", o)); endif $command_utils:suspend_if_needed(0); if (valid(o) && (!(o in saved))) for v in ({"recycle", "exitfunc"}) while ((hv = $object_utils:has_verb(o, v)) && (hv[1] == o)) delete_verb(o, v); endwhile endfor endif endfor "----------------------------------------"; player:notify("Recycling unsaved objects ..."); add_property(this, "mcd_pos", 0, {player, "r"}); suspend(0); this:mcd_2(saved, saved_props); . #58:5 if (!player.wizard) player:notify("Sorry."); return; elseif ($code_utils:task_valid($shutdown_task)) player:notify("Shutdown already in progress."); return; endif if (s = match(argstr, "^in +%([0-9]+%) +")) bounds = s[3][1]; delay = tonum(argstr[bounds[1]..bounds[2]]); argstr = argstr[s[2] + 1..length(argstr)]; else delay = 2; endif if (!$command_utils:yes_or_no(tostr("Do you really want to shut down the server in ", delay, " minutes?"))) player:notify("Aborted."); return; endif announce_times = {}; if (delay > 0) while (delay > 0) announce_times = {@announce_times, delay * 60}; delay = (delay / 2); endwhile announce_times = {@announce_times, 30, 10}; $shutdown_time = (time() + announce_times[1]); endif $shutdown_message = tostr(player.name, " (", player, "): ", argstr); $shutdown_task = task_id(); for i in [1..length(announce_times)] msg = tostr("*** The server will be shut down by ", player.name, " (", player, ") in ", $time_utils:english_time(announce_times[i]), ": ", argstr, " ***"); "...use raw notify() since :notify() verb could be broken..."; for p in (connected_players()) notify(p, msg); endfor suspend(announce_times[i] - {@announce_times, 0}[i + 1]); endfor for p in (connected_players()) notify(p, tostr("*** Server shutdown by ", player.name, " (", player, "): ", argstr, " ***")); boot_player(p); endfor suspend(0); $shutdown_task = E_NONE; set_task_perms(player); shutdown(argstr); . #58:6 set_task_perms(player); dump_database(); player:notify("Dumping..."); . #58:7 set_task_perms(player); if (argstr[1] != ":") argstr = (":" + argstr); endif player:notify(tostr("Searching for verbs that appear to call ", argstr, " ...")); player:notify(""); $code_utils:find_verbs_containing(argstr + "("); . #58:8 if (!caller_perms().wizard) return; elseif (!("mcd_pos" in properties(this))) return; endif start = this.mcd_pos; saved = args[1]; saved_props = args[2]; player:notify(tostr("*** Recycling from #", start, " ...")); suspend(0); fork (0) this:mcd_2(saved, saved_props); endfork for i in [start..tonum(max_object())] this.mcd_pos = i; o = toobj(i); if ($command_utils:running_out_of_time()) return; endif if (valid(o) && (!(o in saved))) for x in (o.contents) move(x, #-1); endfor recycle(o); endif endfor delete_property(this, "mcd_pos"); "----------------------------------------"; suspend(0); player:notify("Killing queued tasks ..."); for t in (queued_tasks()) kill_task(t[1]); endfor "----------------------------------------"; player:notify("Compacting object numbers ..."); alist = {}; for p in (saved_props) $command_utils:suspend_if_needed(0); if (pair = $list_utils:assoc(#0.(p), alist)) #0.(p) = pair[2]; elseif (#0.(p) != player) old = #0.(p); #0.(p) = renumber(#0.(p)); alist = {@alist, {old, #0.(p)}}; endif endfor for o in (saved) if (valid(o) && (o != player)) renumber(o); endif endfor reset_max_object(); "----------------------------------------"; player:notify("Performing miscellaneous cleanups ..."); for i in [0..tonum(max_object())] $command_utils:suspend_if_needed(0); o = toobj(i); move(o, ((o == player) || (o == $news)) ? $player_start | #-1); if ($object_utils:has_callable_verb(o, "init_for_core")) o:init_for_core(); endif endfor player:notify("Core database extraction is complete. Type @shutdown to save it."); . #58:9 "@toad[!][!] <player> [blacklist|redlist|graylist] [commentary]"; whostr = args[1]; comment = $string_utils:first_word(argstr)[2]; if (verb == "@toad!!") listname = "redlist"; elseif (verb == "@toad!") listname = "blacklist"; elseif ((ln = {@args, ""}[2]) && (index(listname = $login:listname(ln), ln) == 1)) "...first word of coment is one of the magic words..."; comment = $string_utils:first_word(comment)[2]; else listname = ""; endif if ((!player.wizard) || (player != this)) player:notify("Yeah, right... you wish."); return; elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr)) return; elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who))) player:notify(tostr("Must be a full name or an object number: ", who.name, "(", who, ")")); return; elseif (who == player) player:notify("If you want to toad yourself, you have to do it by hand."); return; endif dobj = who; if (msg = player:toad_victim_msg()) notify(who, msg); endif if ($wiz_utils:rename_all_instances(who, "disfunc", "toad_disfunc")) player:notify(tostr(who, ":disfunc renamed.")); endif if ($wiz_utils:rename_all_instances(who, "recycle", "toad_recycle")) player:notify(tostr(who, ":recycle renamed.")); endif e = $wiz_utils:unset_player(who, $hacker); player:notify(e ? tostr(who.name, "(", who, ") is now a toad.") | tostr(e)); if (e && ($object_utils:isa(who.location, $room) && (msg = player:toad_msg()))) who.location:announce_all_but({who}, msg); endif if (listname && (!$login:(listname + "ed")(cname = $string_utils:connection_hostname(who.last_connect_place)))) $login:(listname + "_add")(cname); player:notify(tostr("Site ", cname, " ", listname, "ed.")); else cname = ""; endif $mail_agent:send_message(player, $toad_log, tostr("@toad ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @cname ? {$string_utils:capitalize(listname + "ed: ") + cname} | {}, @comment ? {comment} | {}}); . #58:10 "@untoad <object> [as namespec]"; "Turns object into a player. Anything that isn't a guest is chowned to itself."; if (!player.wizard) player:notify("Yeah, right... you wish."); elseif (prepstr && (prepstr != "as")) player:notify(tostr("Usage: ", verb, " <object> [as name,alias,alias...]")); elseif ($command_utils:object_match_failed(dobj, dobjstr)) elseif (prepstr && (!(e = $building_utils:set_names(dobj, iobjstr)))) player:notify(tostr("Initial rename failed: ", e)); elseif (e = $wiz_utils:set_player(dobj, g = $object_utils:isa(dobj, $guest))) player:notify(tostr(dobj.name, "(", dobj, ") is now a ", g ? "usable guest." | "player.")); elseif (e == E_INVARG) player:notify(tostr(dobj.name, "(", dobj, ") is not of an appropriate player class.")); player:notify("@chparent it to $player or some descendant."); elseif (e == E_NONE) player:notify(tostr(dobj.name, "(", dobj, ") is already a player.")); elseif (e == E_NACC) player:notify("Wait until $player_db is finished updating..."); elseif (e == E_RECMOVE) player:notify(tostr("The name `", dobj.name, "' is currently unavailable.")); player:notify(tostr("Try again with ", verb, " ", dobj, " as <newname>")); else player:notify(tostr(e)); endif . #58:11 "@quota <player> is <number> [<reason>]"; " changes a player's quota. sends mail to the wizards."; set_task_perms(player); dobj = $string_utils:match_player(dobjstr); if ($command_utils:player_match_result(dobj, dobjstr)[1]) return; elseif (!valid(dobj)) player:notify("Set whose quota?"); return; endif new = tonum(qstr = iobjstr[1..(n = index(iobjstr + " ", " ")) - 1]); reason = (iobjstr[n + 1..length(iobjstr)] || "(none)"); if (tostr(new) != qstr) player:notify(tostr("Set ", dobj.name, "'s quota to what?")); return; endif old = dobj.ownership_quota; result = (dobj.ownership_quota = new); if (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr(dobj.name, "'s quota set to ", new, ".")); endif $mail_agent:send_message(player, $quota_log, tostr("@quota ", dobj.name, " (", dobj, ") ", new, " (from ", old, ")"), tostr("Reason for quota ", ((new - old) < 0) ? "decrease: " | "increase: ", reason, ".")); . #58:12 set_task_perms(player); "The time below is Oct. 1, 1990, roughly the birthdate of the LambdaMOO server."; start = 654768000; now = time(); day = ((24 * 60) * 60); week = (7 * day); month = (30 * day); days_objects = (days_players = {0, 0, 0, 0, 0, 0, 0}); weeks_objects = (weeks_players = {0, 0, 0, 0}); months_objects = (months_players = {}); nonplayer_objects = (invalid_objects = 0); always_objects = (always_players = 0); never_objects = (never_players = 0); numo = 0; if (argstr) if (((!dobjstr) && (prepstr == "with")) && (index("objects", iobjstr) == 1)) with_objects = 1; else player:notify(tostr("Usage: ", verb, " [with objects]")); return; endif else with_objects = 0; players = players(); endif for i in [1..with_objects ? tonum(max_object()) + 1 | length(players)] if (with_objects) o = toobj(i - 1); else o = players[i]; endif if ($command_utils:running_out_of_time()) player:notify(tostr("... ", o)); suspend(0); endif if (valid(o)) numo = (numo + 1); p = (is_player(o) ? o | o.owner); if (!valid(p)) invalid_objects = (invalid_objects + 1); elseif (!$object_utils:isa(p, $player)) nonplayer_objects = (nonplayer_objects + 1); else seconds = (now - p.last_connect_time); days = (seconds / day); weeks = (seconds / week); months = (seconds / month); if (seconds < 0) if (is_player(o)) always_players = (always_players + 1); else always_objects = (always_objects + 1); endif elseif (seconds > (now - start)) if (is_player(o)) never_players = (never_players + 1); else never_objects = (never_objects + 1); endif elseif (months > 0) while (months > length(months_players)) months_players = {@months_players, 0}; months_objects = {@months_objects, 0}; endwhile if (is_player(o)) months_players[months] = (months_players[months] + 1); endif months_objects[months] = (months_objects[months] + 1); elseif (weeks > 0) if (is_player(o)) weeks_players[weeks] = (weeks_players[weeks] + 1); endif weeks_objects[weeks] = (weeks_objects[weeks] + 1); else if (is_player(o)) days_players[days + 1] = (days_players[days + 1] + 1); endif days_objects[days + 1] = (days_objects[days + 1] + 1); endif endif endif endfor player:notify(""); player:notify(tostr("Last connected")); player:notify(tostr("at least this Num. Cumul. Cumul. %", with_objects ? " Num. Cumul. Cumul. %" | "")); player:notify(tostr("long ago players players players ", with_objects ? " objects objects objects" | "")); player:notify(tostr("---------------------------------------------", with_objects ? "--------------------------------" | "")); su = $string_utils; col1 = 14; col2 = 7; col3 = 10; col4 = 9; col5 = 11; col6 = 11; col7 = 10; nump = length(players()); totalp = (totalo = 0); for x in ({{days_players, days_objects, "day", 1}, {weeks_players, weeks_objects, "week", 0}, {months_players, months_objects, "month", 0}}) pcounts = x[1]; ocounts = x[2]; unit = x[3]; offset = x[4]; for i in [1..length(pcounts)] $command_utils:suspend_if_needed(0); j = (i - offset); player:notify(tostr(su:left(tostr(j, " ", unit, (j == 1) ? ":" | "s:"), col1), su:right(pcounts[i], col2), su:right(totalp = (totalp + pcounts[i]), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(ocounts[i], col5), su:right(totalo = (totalo + ocounts[i]), col6), su:right((totalo * 100) / numo, col7), "%") | "")); endfor player:notify(""); endfor player:notify(tostr(su:left("Never:", col1), su:right(never_players, col2), su:right(totalp = (totalp + never_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(never_objects, col5), su:right(totalo = (totalo + never_objects), col6), su:right((totalo * 100) / numo, col7), "%") | "")); player:notify(tostr(su:left("Always:", col1), su:right(always_players, col2), su:right(totalp = (totalp + always_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(always_objects, col5), su:right(totalo = (totalo + always_objects), col6), su:right((totalo * 100) / numo, col7), "%") | "")); with_objects && player:notify(tostr(su:left("Non-player owner:", (((col1 + col2) + col3) + col4) + 1), su:right(nonplayer_objects, col5), su:right(totalo = (totalo + nonplayer_objects), col6), su:right((totalo * 100) / numo, col7), "%")); with_objects && player:notify(tostr(su:left("Invalid owner:", (((col1 + col2) + col3) + col4) + 1), su:right(invalid_objects, col5), su:right(totalo = (totalo + invalid_objects), col6), su:right((totalo * 100) / numo, col7), "%")); player:notify(""); . #58:13 "Auxiliary verb for parsing @kill soon [#-of-seconds] [player | everyone]"; "Args[1] is either # of seconds or player/everyone."; "Args[2], if it exists, is player/everyone, and forces args[1] to have been # of seconds."; "Return value: {# of seconds [default 60] , 1 for all, object for player.}"; set_task_perms(caller_perms()); nargs = length(args); soon = tonum(args[1]); if (nargs > 1) everyone = args[2]; elseif (soon <= 0) everyone = args[1]; else everyone = 0; endif if (everyone == "everyone") everyone = 1; elseif (typeof(everyone) == STR) result = $string_utils:match_player(everyone); if ($command_utils:player_match_failed(result, everyone)) player:notify(tostr("Usage: ", callers()[1][2], " soon [number of seconds] [\"everyone\" | player name]")); return {-1, -1}; else return {soon ? soon | 60, result}; endif endif return {soon ? soon | 60, everyone ? everyone | player}; . #58:14 set_task_perms(player); if (!args) player:notify(tostr("Usage: ", verb, " <pattern>")); return; endif pattern = argstr; regexp = (verb == "@egrepcore"); player:notify(tostr("Searching for core verbs ", regexp ? "matching the regular expression " | "containing the string ", $string_utils:print(pattern), " ...")); player:notify(""); $code_utils:(regexp ? "find_verbs_matching" | "find_verbs_containing")(pattern, #0:core_objects()); . #58:15 "@net-who prints all connected users and hosts."; "@net-who player player player prints specified users and current or most recent connected host."; "@net-who from hoststring prints all players who have connected from that host or host substring. Substring can include *'s, e.g. @net-who from *.foo.edu."; set_task_perms(player); su = $string_utils; if ((prepstr == "from") && dobjstr) player:notify(tostr("Usage: ", verb, " from <host string>")); elseif (((prepstr != "from") || dobjstr) || (!iobjstr)) "Not parsing 'from' here... Instead printing connected/recent users."; if (!(pstrs = args)) unsorted = connected_players(); else unsorted = listdelete($command_utils:player_match_result(su:match_player(pstrs), pstrs), 1); endif if (!unsorted) return; endif $wiz_utils:show_netwho_listing(player, unsorted); else $wiz_utils:show_netwho_from_listing(player, iobjstr); endif . #58:16 "Creates a player."; "Syntax: @make-player name email-address comments...."; "Generates a random password for the player."; if ((!player.wizard) || callers()) return E_PERM; endif return $wiz_utils:do_make_player(@args); . #58:17 if (!player.wizard) player:notify("Sorry."); elseif (!$code_utils:task_valid($shutdown_task)) player:notify("No server shutdown in progress."); $shutdown_task = E_NONE; else "... Reset time so that $login:check_for_shutdown shuts up..."; kill_task($shutdown_task); $shutdown_task = E_NONE; $shutdown_time = (time() - 1); for p in (connected_players()) notify(p, tostr("*** Server shutdown ABORTED by ", player.name, " (", player, ")", argstr && (": " + argstr), " ***")); endfor endif . #58:18 "This is the canonical doing-something-to-somebody message."; "The corresponding property can either be"; " string msg for all occasions"; " list of 2 strings {we-are-there-msg,we-are-elsewhere-msg}"; m = this.(verb); if (typeof(m) != LIST) return $string_utils:pronoun_sub(m); elseif ((this.location == dobj.location) || (length(m) < 2)) return $string_utils:pronoun_sub(m[1]); else return $string_utils:pronoun_sub(m[2]); endif . #58:19 set_task_perms((caller in {this, $generic_editor, $verb_editor, $mail_editor, $note_editor}) ? this.owner | caller_perms()); return move(this, args[1]); . #58:20 "@newt <player> [commentary]"; "turns a player into a newt. It can get better..."; "Installs $wiz_utils:newt_confunc on a user as :confunc. It saves any existing :confunc the user may have as :denewt_confunc. @denewt checks that their :confunc is the same as $wiz_utils:newt_confunc (if not it renames it to :newt_confunc and complains). If so, it deletes it, and renames any :denewt_confunc to :confunc."; "Sends mail to $newt_log giving .all_connect_places and commentary."; whostr = args[1]; comment = $string_utils:first_word(argstr)[2]; if (!player.wizard) player:notify("Yeah, right."); elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr)) return; elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who))) player:notify(tostr("Must be a full name or an object number: ", who.name, "(", who, ")")); return; elseif (who == player) player:notify("If you want to newt yourself, you have to do it by hand."); return; elseif ($wiz_utils:isnewt(who)) player:notify(tostr(who.name, " appears to already be a newt.")); return; else if ($wiz_utils:rename_all_instances(who, "confunc", "denewt_confunc")) player:notify(tostr(who, ":confunc renamed to :denewt_confunc.")); endif add_verb(who, {player, "x", "confunc"}, {"this", "none", "this"}); set_verb_code(who, "confunc", verb_code($wiz_utils, "newt_confunc")); if (msg = player:newt_victim_msg()) notify(who, msg); endif notify(who, $login:newt_registration_string()); boot_player(who); player:notify(tostr(who.name, " (", who, ") has been turned into a newt.")); $mail_agent:send_message(player, $newt_log, tostr("@newt ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @comment ? {comment} | {}}); if ($object_utils:isa(who.location, $room) && (msg = player:newt_msg())) who.location:announce_all_but({who}, msg); endif endif . #58:21 "@denewt <player> [commentary]"; "Renames the player's :confunc to :newt_confunc, then checks that it is is the same as $wiz_utils:newt_confunc, if not complains. If so, it deletes it, and renames any :denewt_confunc to :confunc."; "Sends mail to $newt_log with commentary."; whostr = args[1]; comment = $string_utils:first_word(argstr)[2]; if (!player.wizard) player:notify("Yeah, right."); elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr)) return; else "Should parse email address and register user in some clever way. Ick."; if (!(inf = verb_info(who, "confunc"))) player:notify(tostr(who.name, " does not appear to be a newt.")); else set_verb_info(who, "confunc", {inf[1], inf[2], "newt_confunc"}); wiz = verb_code($wiz_utils, "newt_confunc"); user = verb_code(who, "newt_confunc"); if (wiz == user) delete_verb(who, "newt_confunc"); else player:notify(tostr(who.name, "'s :confunc was not identical to $wiz_utils:newt_confunc. Not automatically rmverbed. Verify and manually @rmverb it.")); endif if (inf = verb_info(who, "denewt_confunc")) set_verb_info(who, "denewt_confunc", {inf[1], inf[2], "confunc"}); endif player:notify(tostr(who.name, " (", who, ") got better.")); $mail_agent:send_message(player, $newt_log, tostr("@denewt ", who.name, " (", who, ")"), comment ? {comment} | {}); endif endif . #58:22 "Registers a player."; "Syntax: @register name email-address [additional commentary]"; "Email-address is stored in $registration_db and on the player object."; if (!player.wizard) return player:tell(E_PERM); endif $wiz_utils:do_register(@args); . #58:23 "@newpassword player is [string]"; "Set's a player's password; omit string to have one randomly generated."; "Offer to email the password."; if (!player.wizard) return E_PERM; endif $wiz_utils:do_new_password(dobjstr, iobjstr); . #58:24 "@log [<string>] enters a comment in the server log."; "If no string is given, you are prompted to enter one or more lines for an extended comment."; set_task_perms(player); whostr = tostr("from ", player.name, " (", player, ")"); if ((!player.wizard) || (player != caller)) player:notify("Yeah, right."); elseif (argstr) server_log(tostr("COMMENT: [", whostr, "] ", argstr)); player:notify("One-line comment logged."); elseif (lines = $command_utils:read_lines()) server_log(tostr("COMMENT: [", whostr, "]")); for l in (lines) server_log(l); endfor server_log(tostr("END_COMMENT.")); player:notify(tostr(length(lines), " lines logged as extended comment.")); endif . #58:25 set_task_perms(player); n = ((dobjstr == "all") ? 0 | $code_utils:tonum(dobjstr || "20")); if (caller != this) player:notify("You lose."); elseif ((n == E_TYPE) && (index("now", dobjstr) != 1)) player:notify(tostr("Usage: ", verb, " <number> (where <number> indicates how many entries to look at in the guest log)")); player:notify(tostr("Usage: ", verb, " now (to see information about currently connected guests only)")); elseif ((!dobjstr) || (index("now", dobjstr) != 1)) $guest_log:last(n); else "*way* too much copied code in here from @who... Sorry. --yduJ"; su = $string_utils; conn = connected_players(); unsorted = {}; for g in (children($guest)) if (g in conn) unsorted = {@unsorted, g}; endif endfor if (!unsorted) player:tell("No guests found."); return; endif footnotes = {}; alist = {}; nwidth = length("Player name"); for u in (unsorted) pref = (u.programmer ? "% " | " "); u.programmer && (footnotes = setadd(footnotes, "prog")); u3 = {tostr(pref, u.name, " (", u, ")"), su:from_seconds(connected_seconds(u)), su:from_seconds(idle_seconds(u)), where = $string_utils:connection_hostname(connection_name(u))}; nwidth = max(length(u3[1]), nwidth); if ($login:blacklisted(where)) where = ("(*) " + where); footnotes = setadd(footnotes, "black"); elseif ($login:graylisted(where)) where = ("(+) " + where); footnotes = setadd(footnotes, "gray"); endif alist = {@alist, u3}; endfor alist = $list_utils:sort_alist_suspended(0, alist, 3); $command_utils:suspend_if_needed(0); headers = {"Player name", "Connected", "Idle Time", "From Where"}; time_width = (length("59 minutes") + 2); before = {0, w1 = (nwidth + 3), w2 = (w1 + time_width), w3 = (w2 + time_width)}; tell1 = (" " + headers[1]); tell2 = (" " + su:space(headers[1], "-")); for j in [2..4] tell1 = (su:left(tell1, before[j]) + headers[j]); tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-")); endfor player:notify(tell1); player:notify(tell2); active = 0; for a in (alist) $command_utils:suspend_if_needed(0); tell1 = a[1]; for j in [2..4] tell1 = (su:left(tell1, before[j]) + tostr(a[j])); endfor player:notify(tell1[1..min(length(tell1), 79)]); endfor if (footnotes) player:notify(""); if ("prog" in footnotes) player:notify(" % == programmer."); endif if ("black" in footnotes) player:notify("(*) == blacklisted site."); endif if ("gray" in footnotes) player:notify("(+) == graylisted site."); endif endif endif . #58:26 if (caller != this) set_task_perms(valid(caller_perms()) ? caller_perms() | player); endif use = this.mail_identity; if (valid(use) && (use != this)) return use:(verb)(@args); else return pass(@args); endif . #58:27 "@[un]blacklist [<site or subnet> [commentary]]"; "@[un]graylist [<site or subnet> [commentary]]"; "@[un]redlist [<site or subnet> [commentary]]"; "@[un]spooflist [<site of subnet> [commentary]]"; set_task_perms(player); if ((player != this) || (!player.wizard)) player:notify("Ummm. no."); return; endif undo = (verb[2..3] == "un"); which = $login:listname(verb[undo ? 4 | 2]); downgrade = {"", "graylist", "blacklist"}[1 + index("br", which[1])]; if (!(fw = $string_utils:first_word(argstr))) "... Just print the list..."; slist = {}; if (s = $login.(which)[1]) slist = {@slist, "--- Subnets ---", @s}; endif if (s = $login.(which)[2]) slist = {@slist, "--- Domains ---", @s}; endif player:notify_lines($string_utils:columnize(slist, 3)); return; endif target = fw[1]; comment = (fw[2] ? {fw[2]} | {}); if (is_literal = $site_db:domain_literal(target)) if (target[l = length(target)] == ".") target = target[1..l - 1]; endif fullname = ("subnet " + target); else if (target[1] == ".") target[1..1] = ""; endif fullname = (("domain `" + target) + "'"); endif rm = {}; entrylist = $login.(which)[1 + (!is_literal)]; if ((!undo) && (target in entrylist)) player:notify(tostr(fullname, " is already ", which, "ed.")); return; endif entrylist = setremove(entrylist, target); confirm = 0; if (is_literal) for s in (entrylist) if ((i = index(s, target + ".")) == 1) "... target is a prefix of s, s should probably go..."; rm = {@rm, s}; elseif (index(target + ".", s + ".") != 1) "... s is not a prefix of target..."; elseif (undo) player:notify(tostr("You will need to un", which, " subnet ", s, " as well.")); elseif (confirm) player:notify(tostr("...Subnet ", s, " already ", which, "ed...")); else player:notify(tostr("Subnet ", s, " already ", which, "ed.")); if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?")))) return; endif endif endfor else for s in (entrylist) if ((i = rindex(s, "." + target)) && (i == (length(s) - length(target)))) "... target is a suffix of s, s should probably go..."; rm = {@rm, s}; elseif ((!(i = rindex("." + target, "." + s))) || (i < ((length(target) - length(s)) + 1))) "... s is not a suffix of target..."; elseif (undo) player:notify(tostr("You will need to un", which, " domain `", s, "' as well.")); elseif (confirm) player:notify(tostr("...Domain `", s, "' already ", which, "ed...")); else player:notify(tostr("Domain `", s, "' already ", which, "ed.")); if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?")))) return; endif endif endfor endif namelist = $string_utils:english_list(rm); downgraded = {}; if (rm) ntries = ((length(rm) == 1) ? "ntry" | "ntries"); if ($command_utils:yes_or_no(tostr("Remove e", ntries, " for ", namelist, "?"))) dg = (undo && (downgrade && $command_utils:yes_or_no(downgrade + " them?"))); for s in (rm) $login:(which + "_remove")(s); dg && ($login:(downgrade + "_add")(s) && (downgraded = {@downgraded, s})); endfor player:notify(tostr("E", ntries, " removed", @dg ? {" and ", downgrade, "ed."} | {"."})); else player:notify(tostr(namelist, " will continue to be ", which, "ed.")); rm = {}; endif endif if (downgraded) comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")}; endif if (!undo) $login:(which + "_add")(target); player:notify(tostr(fullname, " ", which, "ed.")); if (rm) comment[1..0] = {tostr("Subsumes ", which, "ing for ", namelist, ".")}; endif elseif ($login:(which + "_remove")(target)) player:notify(tostr(fullname, " un", which, "ed.")); if (downgrade && $command_utils:yes_or_no(downgrade + " it?")) $login:(downgrade + "_add")(target) && (downgraded = {target, @downgraded}); player:notify(tostr(fullname, " ", downgrade, "ed.")); endif if (downgraded) comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")}; endif if (rm) comment[1..0] = {tostr("Also removed ", namelist, ".")}; endif elseif (rm) player:notify(tostr(fullname, " itself was never actually ", which, "ed.")); comment[1..0] = {tostr("Removed ", namelist, ".")}; else player:notify(tostr(fullname, " was not ", which, "ed before.")); return; endif subject = tostr(undo ? "@un" | "@", which, " ", fullname); $mail_agent:send_message(player, $site_log, subject, comment); "..."; "... make sure we haven't screwed ourselves..."; uhoh = {}; for site in (player.all_connect_places) if (index(site, target) && $login:(which + "ed")(site)) uhoh = {@uhoh, site}; endif endfor if (uhoh) player:notify(tostr("WARNING: ", $string_utils:english_list(uhoh), " are now ", which, "ed!")); endif . #58:28 "Usage: @corify <object> as <propname>"; "Adds <object> to the core, as $<propname>"; "Reminds the wizard to write an :init_for_core verb, if there isn't one already."; if (!player.wizard) player:tell("Sorry, the core is wizardly territory."); endif if (dobj == $failed_match) dobj = player:my_match_object(dobjstr); endif if ($command_utils:object_match_failed(dobj, dobjstr)) return; endif if (!iobjstr) player:tell("Usage: @corify <object> as <propname>"); return; elseif (iobjstr[1] == "$") iobjstr = iobjstr[2..length(iobjstr)]; endif if (typeof(e = add_property(#0, iobjstr, dobj, {player, "r"})) == ERR) player:tell(e); return; endif if (!("init_for_core" in verbs(dobj))) player:tell(dobj:titlec(), " has no :init_for_core verb. Strongly consider adding one before doing anything else."); endif . #58:29 "Usage: @make-guest <guestname>"; "Creates a player called <guestname>_Guest owned by $hacker and a child of $guest."; if (!player.wizard) player:tell("If you think this MOO needs more guests, you should contact a wizard."); return E_PERM; endif if (length(args) != 1) player:tell("Usage: ", verb, " <guest name>"); return; endif guestname = (args[1] + "_Guest"); guestaliases = {guestname, adj = args[1]}; if (!player.wizard) return; elseif ($player_db.frozen) player:tell("Sorry, the player db is frozen, so no players can be made right now. Please try again in a few minutes."); return; elseif (!$player_db:available(guestname)) player:tell("\"", guestname, "\" is not an available name."); return; elseif (!$player_db:available(adj)) player:Tell("\"", adj, "\" is not an available name."); return; else new = create($guest, $hacker); new:set_name(guestname); new:set_aliases(guestaliases); if (!(e = $wiz_utils:set_player(new, 1))) player:Tell("Unable to make ", new.name, " (", new, ") a player."); player:Tell(tostr(e)); else player:Tell("Guest: ", new.name, " (", new, ") made."); new.default_description = {"By definition, guests appear nondescript."}; new.description = new.default_description; new.last_connect_time = $maxint; new.last_disconnect_time = time(); new:set_gender(new.default_gender); move(new, $player_start); player:tell("Now don't forget to @describe ", new, " as something."); endif endif . #59:0 set_task_perms(player); if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif nargs = length(args); usage = tostr("Usage: ", verb, " <object>.<prop-name> [<init_value> [<perms> [<owner>]]]"); if ((nargs < 1) || (!(spec = $code_utils:parse_propref(args[1])))) player:notify(usage); return; endif object = player:my_match_object(spec[1]); name = spec[2]; if ($command_utils:object_match_failed(object, spec[1])) return; endif if (nargs < 2) value = 0; else q = $string_utils:prefix_to_value(argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)]); if (q[1] == 0) player:notify(tostr("Syntax error in initial value: ", q[2])); return; endif value = q[2]; args = {args[1], value, @$string_utils:words(q[1])}; nargs = length(args); endif perms = ((nargs < 3) ? "rc" | args[3]); if (nargs < 4) owner = player; else owner = $string_utils:match_player(args[4]); if ($command_utils:player_match_result(owner, args[4])[1]) return; endif endif if (nargs > 4) player:notify(usage); return; endif e = add_property(object, name, value, {owner, perms}); if (typeof(e) != ERR) player:notify(tostr("Property added with value ", $string_utils:print(object.(name), 1), ".")); elseif (e != E_INVARG) player:notify(tostr(e)); elseif ($object_utils:has_property(object, name)) player:notify(tostr("Property ", object, ".", name, " already exists.")); else for i in [1..length(perms)] if (!index("rcw", perms[i])) player:notify(tostr("Unknown permission bit: ", perms[i])); return; endif endfor "...the only other possibility..."; player:notify("Property is already defined on one or more descendents."); player:notify(tostr("Try @check-prop ", args[1])); endif . #59:1 set_task_perms(player); if (length(args) != 2) player:notify(tostr("Usage: ", verb, " <object-or-property-or-verb> <permissions>")); return; endif what = args[1]; perms = args[2]; if (index(what, ".") && (spec = $code_utils:parse_propref(what))) if (valid(object = player:my_match_object(spec[1]))) pname = spec[2]; info = property_info(object, pname); if (info == E_PROPNF) player:notify("That object does not have that property."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else info[2] = (perms = $perm_utils:apply(info[2], perms)); result = set_property_info(object, pname, info); if (result == E_INVARG) player:notify(tostr("\"", perms, "\" is not a valid permissions string for a property.")); elseif (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr("Property permissions set to \"", perms, "\".")); endif endif return; endif elseif (spec = $code_utils:parse_verbref(what)) if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif if (valid(object = player:my_match_object(spec[1]))) vname = spec[2]; info = verb_info(object, vname); if (info == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(info) == ERR) player:notify(tostr(info)); elseif (!valid(owner = info[1])) player:notify(tostr("That verb is owned by an invalid object (", owner, "); it needs to be @chowned.")); elseif (!is_player(owner)) player:notify(tostr("That verb is owned by a non-player object (", owner.name, ", ", owner, "); it needs to be @chowned.")); else info[2] = (perms = $perm_utils:apply(info[2], perms)); if (index(info, "w")) player:notify("That would allow anyone to change your verb."); elseif ((result = set_verb_info(object, vname, info)) == E_INVARG) player:notify(tostr("\"", perms, "\" is not a valid permissions string for a verb.")); elseif (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr("Verb permissions set to \"", perms, "\".")); endif endif return; endif elseif (valid(object = player:my_match_object(what))) perms = $perm_utils:apply(((object.r ? "r" | "") + (object.w ? "w" | "")) + (object.f ? "f" | ""), perms); r = (w = (f = 0)); for i in [1..length(perms)] if (perms[i] == "r") r = 1; elseif (perms[i] == "w") w = 1; elseif (perms[i] == "f") f = 1; else player:notify(tostr("\"", perms, "\" is not a valid permissions string for an object.")); return; endif endfor if ((((object.r = r) == E_PERM) || ((object.w = w) == E_PERM)) || ((object.f = f) == E_PERM)) player:notify("Permission denied."); else player:notify(tostr("Object permissions set to \"", perms, "\".")); endif return; endif $command_utils:object_match_failed(object, what); . #59:2 if (player != caller) return; endif set_task_perms(player); if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif if (!(args && (spec = $code_utils:parse_verbref(args[1])))) player:notify(tostr(args ? ("\"" + args[1]) + "\"? " | "", "<object>:<verb> expected.")); elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) "...can't find object..."; elseif ((info = verb_args(object, name = spec[2])) == E_VERBNF) player:notify("That object does not have a verb with that name."); elseif (typeof(info) == ERR) player:notify(tostr(info)); elseif (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST) "...arg spec is bogus..."; player:notify(tostr(pas)); elseif (!(newargs = pas[1])) player:notify($string_utils:from_list(info, " ")); elseif (pas[2]) player:notify(tostr("\"", pas[2][1], "\" unexpected.")); else info[2] = info[2][1..index(info[2] + "/", "/") - 1]; info = {@newargs, @info[length(newargs) + 1..length(info)]}; result = set_verb_args(object, name, info); if (result == E_INVARG) player:notify(tostr("\"", info[2], "\" is not a valid preposition (?)")); elseif (typeof(result) == ERR) player:notify(tostr(result)); else player:notify("Verb arguments changed."); endif endif . #59:3 "A MOO-code evaluator. Type `;CODE' or `eval CODE'."; "Calls player:eval_cmd_string to first transform CODE in any way appropriate (e.g., prefixing .eval_env) and then do the actual evaluation. See documentation for this:eval_cmd_string"; "If you set your .eval_time property to 1, you find out how many ticks and seconds you used."; "If eval-d is used, the evaluation is performed as if the debug flag were unset."; if (player != this) player:tell("I don't understand that."); return; endif set_task_perms(player); result = player:eval_cmd_string(argstr, verb != "eval-d"); if (result[1]) player:notify(this:eval_value_to_string(result[2])); if (player.eval_time && (!output_delimiters(player)[2])) player:notify(tostr("[used ", result[3], " tick", (result[3] != 1) ? "s, " | ", ", result[4], " second", (result[4] != 1) ? "s" | "", ".]")); endif else player:notify_lines(result[2]); nerrors = length(result[2]); player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s.")); endif . #59:4 set_task_perms(player); if ((length(args) != 1) || (!(spec = $code_utils:parse_propref(args[1])))) player:notify(tostr("Usage: ", verb, " <object>.<property>")); return; endif object = player:my_match_object(spec[1]); pname = spec[2]; if ($command_utils:object_match_failed(object, spec[1])) return; endif result = delete_property(object, pname); if (result == E_PROPNF) player:notify("That object does not define that property."); elseif (typeof(result) == ERR) player:notify(tostr(result)); else player:notify("Property removed."); endif . #59:5 set_task_perms(player); if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif if (!(args && (spec = $code_utils:parse_verbref(args[1])))) player:notify(tostr("Usage: ", verb, " <object>:<verb-name(s)> [<dobj> [<prep> [<iobj> [<permissions> [<owner>]]]]]")); return; elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) return; endif name = spec[2]; "...Adding another verb of the same name is often a mistake..."; namelist = $string_utils:explode(name); for n in (namelist) if (i = index(n, "*")) n = (n[1..i - 1] + n[i + 1..length(n)]); endif if ((hv = $object_utils:has_verb(object, n)) && (hv[1] == object)) player:notify(tostr("Warning: Verb `", n, "' already defined on that object.")); endif endfor if (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST) player:notify(tostr(pas)); return; endif verbargs = {@pas[1], "none", "none", "none"}[1..3]; rest = pas[2]; if (rest) perms = rest[1]; elseif (verbargs == {"this", "none", "this"}) perms = "rxd"; else perms = "rd"; endif if (length(rest) < 2) owner = player; elseif (length(rest) > 2) player:notify(tostr("\"", rest[3], "\" unexpected.")); return; elseif ($command_utils:player_match_result(owner = $string_utils:match_player(rest[2]), rest[2])[1]) return; elseif (owner == $nothing) player:notify("Verb can't be owned by no one!"); return; endif x = add_verb(object, {owner, perms, name}, verbargs); if (x == E_INVARG) player:notify(tostr(rest ? tostr("\"", perms, "\" is not a valid set of permissions.") | tostr("\"", verbargs[2], "\" is not a valid preposition (?)"))); elseif (typeof(x) == ERR) player:notify(tostr(x)); else player:notify(tostr("Verb added (", length(verbs(object)) - 1, ").")); endif . #59:6 set_task_perms(player); if (!(args && (spec = $code_utils:parse_verbref(args[1])))) player:notify(tostr("Usage: ", verb, " <object>:<verb>")); elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) "...bogus object..."; elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST) player:notify(tostr(argspec)); elseif (argspec[2]) player:notify($string_utils:from_list(argspec[2], " ") + "??"); elseif (length(argspec = argspec[1]) in {1, 2}) player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]); else verbname = spec[2]; if (index(verbname, "*") > 1) verbname = strsub(verbname, "*", ""); endif if ((loc = $code_utils:tonum(verbname)) == E_TYPE) loc = $code_utils:find_last_verb_named(object, verbname); if (argspec) argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]); while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec)) loc = $code_utils:find_last_verb_named(object, verbname, loc); endwhile endif if (loc < 0) player:notify(tostr("That object does not define that verb", argspec ? " with those args." | ".")); return; endif endif info = verb_info(object, tostr(loc)); vargs = verb_args(object, tostr(loc)); result = delete_verb(object, tostr(loc)); if (result == E_VERBNF) player:notify("That object does not define that verb."); elseif (typeof(result) == ERR) player:notify(tostr(result)); elseif (info) player:notify(tostr("Verb ", object, ":", info[3], " (", loc, ") {", $string_utils:from_list(vargs, " "), "} removed.")); else player:notify(tostr("Unreadable verb ", object, ":", loc, " removed.")); endif endif . #59:7 "@list <obj>:<verb> [<dobj> <prep> <iobj>] [with(out) parens|numbers] [ranges]"; set_task_perms(player); pflag = 0; nflag = 1; argspec = {}; range = {}; spec = (args ? $code_utils:parse_verbref(args[1]) | E_INVARG); args = (spec ? listdelete(args, 1) | E_INVARG); while (args) if (args[1] && ((index("without", args[1]) == 1) || (args[1] == "wo"))) "...w,wi,wit,with => 1; wo,witho,withou,without => 0..."; fval = (!index(args[1], "o")); if (index("parentheses", args[2]) == 1) pflag = fval; args = args[3..length(args)]; elseif (index("numbers", args[2]) == 1) nflag = fval; args = args[3..length(args)]; else player:notify(tostr(args[1], " WHAT?")); args = E_INVARG; endif elseif (index("0123456789", args[1][1]) || (index(args[1], "..") == 1)) if (E_INVARG == (s = $seq_utils:from_string(args[1]))) player:notify(tostr("Garbled range: ", args[1])); args = E_INVARG; else range = $seq_utils:union(range, s); args = listdelete(args, 1); endif elseif (argspec) "... second argspec? Not likely ..."; player:notify(tostr(args[1], " unexpected.")); args = E_INVARG; elseif (typeof(pas = $code_utils:parse_argspec(@args)) == LIST) argspec = pas[1]; argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]); args = pas[2]; else "... argspec is bogus ..."; player:notify(tostr(pas)); args = E_INVARG; endif endwhile if (args == E_INVARG) player:notify(tostr("Usage: ", verb, " <object>:<verb> [<dobj> <prep> <iobj>] [with|without parentheses|numbers]")); return; elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) return; endif what = object; if (argspec) vnum = $code_utils:find_verb_named(what, spec[2], 0); while ((vnum < 0) ? valid(what = parent(what)) | (verb_args(what, vname = tostr(vnum)) != argspec)) vnum = $code_utils:find_verb_named(what, spec[2], vnum + 1); endwhile code = ((vnum < 0) ? E_VERBNF | verb_code(what, vname, pflag)); else vname = spec[2]; while (valid(what) && ((code = verb_code(what, vname, pflag)) == E_VERBNF)) what = parent(what); endwhile endif if (code == E_VERBNF) player:notify(tostr("That object does not define that verb", argspec ? " with those args." | ".")); elseif (typeof(code) == ERR) player:notify(tostr(code)); elseif (code == {}) player:notify("That verb has not been programmed."); else if (what != object) player:notify(tostr("Object ", object, " does not define that verb", argspec ? " with those args" | "", ", but its ancestor ", what, " does.")); endif lineseq = {1, length(code) + 1}; range && (lineseq = $seq_utils:intersection(range, lineseq)); if (!lineseq) player:notify("No lines in that range."); return; endif info = verb_info(what, vname); vargs = verb_args(what, vname); if (index(vargs[2], "/")) vargs[2] = tostr("(", vargs[2], ")"); endif player:notify(tostr(what, ":", $string_utils:print(info[3]), " ", $string_utils:from_list(vargs, " "))); for k in [1..length(lineseq) / 2] for i in [lineseq[(2 * k) - 1]..lineseq[2 * k] - 1] if (nflag) player:notify(tostr(" "[1..i < 10], i, ": ", code[i])); else player:notify(code[i]); endif $command_utils:suspend_if_needed(0); endfor endfor endif . #59:8 set_task_perms(player); if (!dobjstr) tasks = queued_tasks(); elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1]) return; elseif (typeof(tasks = $wiz_utils:queued_tasks(dobj)) != LIST) player:notify(tostr(verb, " ", dobj.name, "(", dobj, "): ", tasks)); return; endif if (tasks) su = $string_utils; player:notify("Queue ID Start Time Owner Verb (Line) [This]"); player:notify("-------- ---------- ----- ------------------"); now = time(); for task in (tasks) q_id = task[1]; start = task[2]; time = ((start >= now) ? ctime(start)[5..24] | su:left((start == -1) ? "Reading input ..." | tostr(now - start, " seconds ago..."), 20)); owner = task[5]; owner_name = (valid(owner) ? owner.name | tostr("Dead ", owner)); vloc = task[6]; vname = task[7]; lineno = task[8]; this = task[9]; player:notify(tostr(su:left(tostr(q_id), 10), " ", time, " ", su:left(owner_name, 12), " ", vloc, ":", vname, " (", lineno, ")", (this != vloc) ? tostr(" [", this, "]") | "")); endfor else player:notify("No tasks."); endif . #59:9 "Kills one or more tasks."; "Arguments:"; " object:verb -- kills all tasks which were started from that object and verb."; " all -- kills all tasks owned by invoker"; " all player-name -- wizard variant: kills all tasks owned by player."; " all everyone -- wizard variant: really kills all tasks."; " Integer taskid -- kills the specifically named task."; " soon [integer] -- kills all tasks scheduled to run in the next [integer] seconds, which defaults to 60."; " %integer -- kills all tasks which end in the digits contained in integer."; set_task_perms(player); if (length(args) == 0) player:notify_lines({tostr("Usage: ", verb, " [object]:[verb]"), tostr(" ", verb, " task_id"), tostr(" ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr(" ", verb, " all", player.wizard ? " [everyone|<player name>]" | "")}); return; elseif (taskid = tonum(args[1])) elseif (all = (args[1] == "all")) everyone = 0; realplayer = player; if (player.wizard && (length(args) > 1)) realplayer = $string_utils:match_player(args[2]); everyone = (args[2] == "everyone"); if ((!valid(realplayer)) && (!everyone)) $command_utils:player_match_result(realplayer, args[2]); return; elseif (!everyone) set_task_perms(realplayer); endif endif elseif (soon = (args[1] == "soon")) realplayer = player; if (length(args) > 1) soon = tonum(args[2]); if ((soon <= 0) && (!player.wizard)) player:notify(tostr("Usage: ", verb, " soon [positive-number-of-seconds]")); return; elseif (player.wizard) result = this:kill_aux_wizard_parse(@args[2..length(args)]); soon = result[1]; if (result[1] < 0) "already gave them an error message"; return; elseif (result[2] == 1) everyone = 1; else everyone = 0; set_task_perms(result[2]); realplayer = result[2]; endif endif else soon = 60; everyone = 0; endif elseif (percent = (args[1][1] == "%")) l = length(args[1]); digits = tonum(args[1][2..l]); percent = tonum("1" + "0000000000"[1..l - 1]); elseif (colon = index(argstr, ":")) whatstr = argstr[1..colon - 1]; vrb = argstr[colon + 1..length(argstr)]; if (whatstr) what = player:my_match_object(whatstr); endif else player:notify_lines({tostr("Usage: ", verb, " [object]:[verb]"), tostr(" ", verb, " task_id"), tostr(" ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr(" ", verb, " all", player.wizard ? " [\"everyone\"|<player name>]" | "")}); return; endif "OK, parsed the line, and punted them if it was bogus. This verb could have been a bit shorter at the expense of readability. I think it's getting towards unreadable as is. At this point we've set_task_perms'd, and set up an enormous number of local variables. Evaluate them in the order we set them, and we should never get var not found."; queued_tasks = queued_tasks(); killed = 0; if (taskid) returnval = kill_task(taskid); if (typeof(returnval) == ERR) player:notify(tostr("Invalid task ID ", taskid, ".")); else player:notify(tostr("Killed task ", taskid, ".")); killed = 1; endif elseif (all) for task in (queued_tasks) if (everyone || (realplayer == task[5])) kill_task(task[1]); killed = 1; this:_kill_task_message(task); endif endfor elseif (soon) now = time(); for task in (queued_tasks) if (((task[2] - now) < soon) && ((!player.wizard) || (everyone || (realplayer == task[5])))) kill_task(task[1]); killed = 1; this:_kill_task_message(task); endif endfor elseif (percent) for task in (queued_tasks) if (digits == (task[1] % percent)) kill_task(task[1]); killed = 1; this:_kill_task_message(task); endif endfor elseif ((colon || vrb) || whatstr) for task in (queued_tasks) if ((((((whatstr == "") || (valid(task[6]) && (index(task[6].name, whatstr) == 1))) || (valid(task[9]) && (index(task[9].name, whatstr) == 1))) || (task[9] == what)) || (task[6] == what)) && ((vrb == "") || (index(" " + strsub(task[7], "*", ""), " " + vrb) == 1))) this:_kill_task_message(task); kill_task(task[1]); killed = 1; endif endfor else player:notify("Something is funny; I didn't understand your @kill command. You shouldn't have gotten here. Please send yduJ mail saying you got this message from @kill, and what you had typed to @kill."); endif if (!killed) player:notify("No tasks killed."); endif . #59:10 if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif $verb_editor:invoke(argstr, verb); . #59:11 "Usage: @copy source:verbname to target[:verbname]"; " the target verbname, if not given, defaults to that of the source. If the target verb doesn't already exist, a new verb is installed with the same args, names, code, and permission flags as the source. Otherwise, the existing target's verb code is overwritten and no other changes are made."; "This the poor man's version of multiple inheritance... the main problem is that someone may update the verb you're copying and you'd never know."; set_task_perms(player); if (!player.programmer) player:notify("You need to be a programmer to do this."); player:notify("If you want to become a programmer, talk to a wizard."); return; endif if ((!(from = $code_utils:parse_verbref(dobjstr))) || (!iobjstr)) player:notify(tostr("Usage: ", verb, " obj:verb to obj:verb")); player:notify(tostr(" ", verb, " obj:verb to obj")); player:notify(tostr(" ", verb, " obj:verb to :verb")); return; elseif ($command_utils:object_match_failed(fobj = player:my_match_object(from[1]), from[1])) return; elseif (iobjstr[1] == ":") to = {fobj, iobjstr[2..length(iobjstr)]}; elseif (!(to = $code_utils:parse_verbref(iobjstr))) iobj = player:my_match_object(iobjstr); if ($command_utils:object_match_failed(iobj, iobjstr)) return; endif to = {iobj, from[2]}; elseif ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1])) return; else to[1] = tobj; endif from[1] = fobj; to_firstname = (strsub(to[2][1..index(to[2] + " ", " ") - 1], "*", "") || "*"); if ((!(hv = $object_utils:has_verb(to[1], to_firstname))) || (hv[1] != to[1])) if ((!(info = verb_info(@from))) || (!(vargs = verb_args(@from)))) player:notify(tostr("Retrieving ", from[1], ":", from[2], " --> ", info && vargs)); return; endif if (!player.wizard) info[1] = player; endif if (verb == "@copy-x") "... make sure this is an unusable copy..."; info[2] = strsub(info[2], "x", ""); vargs = {"this", "none", "this"}; endif if (from[2] != to[2]) info[3] = to[2]; endif if (ERR == typeof(e = add_verb(to[1], info, vargs))) player:notify(tostr("Adding ", to[1], ":", to[2], " --> ", e)); return; endif endif code = verb_code(@from); owner = verb_info(@from)[1]; if (owner != player) code = {tostr("\"Copied from ", from[1].name, " (", from[1], "):", from[2], (from[1] == owner) ? " " | tostr(" by ", owner.name, " (", owner, ") "), ctime(), "\";"), @code}; player:notify("Use of @copy is discouraged. Please do not use @copy if you can use inheritance or features instead. Use @copy carefully, and only when absolutely necessary, as it is wasteful of database space."); endif if (ERR == typeof(e = set_verb_code(to[1], to_firstname, code))) player:notify(tostr("Copying ", from[1], ":", from[2], " to ", to[1], ":", to[2], " --> ", e)); else player:notify(tostr(to[1], ":", to[2], " code set.")); endif . #59:12 set_task_perms(caller_perms()); task = args[1]; player:notify(tostr("Killed: ", $string_utils:right(tostr("task ", task[1]), 17), ", verb ", task[6], ":", task[7], ", line ", task[8], (task[9] != task[6]) ? ", this==" + tostr(task[9]) | "")); . #59:13 "This version of @program deals with multiple verbs having the same name."; "... @program <object>:<verbname> <dobj> <prep> <iobj> picks the right one."; if (player != caller) return; endif set_task_perms(player); "..."; "...catch usage errors first..."; "..."; punt = "...set punt to 0 only if everything works out..."; if (!(args && (spec = $code_utils:parse_verbref(args[1])))) player:notify(tostr("Usage: ", verb, " <object>:<verb> [<dobj> <prep> <iobj>]")); elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) "...bogus object..."; elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST) player:notify(tostr(argspec)); elseif (argspec[2]) player:notify($string_utils:from_list(argspec[2], " ") + "??"); elseif (length(argspec = argspec[1]) in {1, 2}) player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]); else punt = 0; verbname = spec[2]; if (index(verbname, "*") > 1) verbname = strsub(verbname, "*", ""); endif endif "..."; "...if we have an argspec, we'll need to reset verbname..."; "..."; if (punt) elseif (argspec) if (!(argspec[2] in {"none", "any"})) argspec[2] = $code_utils:full_prep(argspec[2]); endif loc = $code_utils:find_verb_named(object, verbname); while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec)) loc = $code_utils:find_verb_named(object, verbname, loc + 1); endwhile if (loc < 0) punt = "...can't find it...."; player:notify("That object has no verb matching that name + args."); else verbname = tostr(loc); endif else loc = -1; endif "..."; "...get verb info..."; "..."; if (punt || (!(punt = "...reset punt to TRUE..."))) elseif ((info = verb_info(object, verbname)) == E_VERBNF) player:notify("That object does not have that verb definition."); elseif (typeof(info) == ERR) player:notify(tostr(info)); else punt = 0; aliases = info[3]; if (loc < 0) loc = ((aliases in (verbs(object) || {})) - 1); endif endif "..."; "...read the code..."; "..."; if (punt) player:notify(tostr("Now ignoring code for ", args ? args[1] | "nothing in particular", ".")); $command_utils:read_lines(); player:notify("Verb code ignored."); else player:notify(tostr("Now programming ", object.name, ":", aliases, "(", (loc < 0) ? "??" | loc, ").")); lines = $command_utils:read_lines(); if (result = set_verb_code(object, verbname, lines)) player:notify_lines(result); player:notify(tostr(length(result), " error(s).")); player:notify("Verb not programmed."); elseif (typeof(result) == ERR) player:notify(tostr(result)); player:notify("Verb not programmed."); else player:notify("0 errors."); player:notify("Verb programmed."); endif endif . #59:14 "Usage: @setenv <environment string>"; "Set your .eval_env property. Most useful when eval won't work to set it"; "because your .eval_env contains an error."; set_task_perms(player); if (!argstr) player:notify(tostr("Usage: ", verb, " <environment string>")); return; endif player:notify(tostr("Current eval environment is: ", player.eval_env)); result = player:set_eval_env(argstr); if (typeof(result) == ERR) player:notify(tostr(result)); return; endif player:notify(tostr(".eval_env set to \"", player.eval_env, "\" (", player.eval_ticks, " ticks).")); . #59:15 set_task_perms((caller_perms() == $nothing) ? player | caller_perms()); dobj = $string_utils:match_player(dobjstr); if (!dobjstr) player:notify(tostr("Usage: ", verb, " <player> [from <start>] [to <end>]")); return; elseif ($command_utils:player_match_result(dobj, dobjstr)[1]) return; endif dobjwords = $string_utils:words(dobjstr); if (args[1..length(dobjwords)] == dobjwords) args = args[length(dobjwords) + 1..length(args)]; endif if (!(parse_result = $code_utils:_parse_audit_args(@args))) player:notify(tostr("Usage: ", verb, " player [from <start>] [to <end>]")); return; endif return $building_utils:do_prospectus(dobj, @parse_result); . #59:16 "@display <object>[.[property]]*[,[inherited_property]]*[:[verb]]*[;[inherited_verb]]*"; "null names for properties and verbs are interpreted as meaning all of them."; opivu = {{}, {}, {}, {}, {}}; string = ""; punc = 1; literal = 0; for jj in [1..length(argstr)] j = argstr[jj]; if (literal) string = (string + j); literal = 0; elseif (j == "\\") literal = 1; elseif (y = index(".,:;", j)) opivu[punc] = {@opivu[punc], string}; punc = (1 + y); string = ""; else string = (string + j); endif endfor opivu[punc] = {@opivu[punc], string}; objname = opivu[1][1]; it = this:my_match_object(objname); if ($command_utils:object_match_failed(it, objname)) return; endif readable = ((it.owner == this) || (it.r || this.wizard)); cant = {}; if ("" in opivu[2]) if (readable) prop = properties(it); else prop = {}; cant = setadd(cant, it); endif if (!this:display_option("thisonly")) what = it; while ((!prop) && valid(what = parent(what))) if ((what.owner == this) || (what.r || this.wizard)) prop = properties(what); else cant = setadd(cant, what); endif endwhile endif else prop = opivu[2]; endif if ("" in opivu[3]) inh = {}; for what in ({it, @$object_utils:ancestors(it)}) if (((what.owner == this) || what.r) || this.wizard) inh = {@inh, @properties(what)}; else cant = setadd(cant, what); endif endfor else inh = opivu[3]; endif for q in (inh) if (q in properties(it)) prop = setadd(prop, q); inh = setremove(inh, q); endif endfor vrb = {}; if ("" in opivu[4]) if (readable) vrbs = verbs(it); else vrbs = {}; cant = setadd(cant, it); endif what = it; if (!this:display_option("thisonly")) while ((!vrbs) && valid(what = parent(what))) if ((what.owner == this) || (what.r || this.wizard)) vrbs = verbs(what); else cant = setadd(cant, what); endif endwhile endif for n in [0..length(vrbs) - 1] vrb = setadd(vrb, {what, tostr(n)}); endfor else for w in (opivu[4]) if (y = $object_utils:has_verb(it, w)) vrb = setadd(vrb, {y[1], w}); else this:notify(tostr("No such verb, \"", w, "\"")); endif endfor endif if ("" in opivu[5]) for z in ({it, @$object_utils:ancestors(it)}) if (((this == z.owner) || z.r) || this.wizard) for n in [0..length(verbs(z)) - 1] vrb = setadd(vrb, {z, tostr(n)}); endfor else cant = setadd(cant, z); endif endfor else for w in (opivu[5]) if (typeof(y = $object_utils:has_verb(it, w)) == LIST) vrb = setadd(vrb, {y[1], w}); else this:notify(tostr("No such verb, \"", w, "\"")); endif endfor endif if (({""} in opivu) || (opivu[2..5] == {{}, {}, {}, {}})) this:notify(tostr(it.name, " (", it, ") [ ", it.r ? "readable " | "", it.w ? "writeable " | "", it.f ? "fertile " | "", is_player(it) ? "(player) " | "", it.programmer ? "programmer " | "", it.wizard ? "wizard " | "", "]")); if (it.owner != (is_player(it) ? it | this)) this:notify(tostr(" Owned by ", valid(p = it.owner) ? p.name | "** extinct **", " (", p, ").")); endif this:notify(tostr(" Child of ", valid(p = parent(it)) ? p.name | "** none **", " (", p, ").")); if (it.location != $nothing) this:notify(tostr(" Location ", valid(p = it.location) ? p.name | "** unplace (tell a wizard, fast!) **", " (", p, ").")); endif endif set_task_perms(this.owner); blankargs = (this:display_option("blank_tnt") ? {"this", "none", "this"} | #-1); for b in (vrb) $command_utils:suspend_if_needed(0); where = b[1]; q = b[2]; short = strsub(y = (index(q, " ") ? q[1..y - 1] | q), "*", ""); inf = verb_info(where, short); if ((typeof(inf) == LIST) || (inf == E_PERM)) name = ((typeof(inf) == LIST) ? inf[3] | q); name = (index(name, " ") ? ("\"" + name) + "\"" | name); line = $string_utils:left(tostr($string_utils:right(tostr(where), 6), ":", name, " "), 32); if (inf == E_PERM) line = (line + " ** unreadable **"); else line = ($string_utils:left(tostr(line, inf[1].name, " (", inf[1], ") "), 53) + ((i = (inf[2] in {"x", "xd", "d", "rd"})) ? {" x", " xd", " d", "r d"}[i] | inf[2])); vargs = verb_args(where, short); if (vargs != blankargs) if (this:display_option("shortprep") && (!(vargs[2] in {"any", "none"}))) vargs[2] = $code_utils:short_prep(vargs[2]); endif line = ($string_utils:left(line + " ", 60) + $string_utils:from_list(vargs, " ")); endif endif this:notify(line); elseif (inf == E_VERBNF) this:notify(tostr(inf)); this:notify(tostr(" ** no such verb, \"", short, "\" **")); else this:notify("This shouldn't ever happen. @display is buggy."); endif endfor all = {@prop, @inh}; max = ((length(all) < 4) ? 999 | (this:linelen() - 56)); depth = ((length(all) < 4) ? -1 | 1); truncate_owner_names = (length(all) > 1); for q in (all) $command_utils:suspend_if_needed(0); inf = property_info(it, q); if (inf == E_PROPNF) if (q in $code_utils.builtin_props) this:notify(tostr($string_utils:left("," + q, 25), "Built in property ", (length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y)); else this:notify(tostr(" ** property not found, \"", q, "\" **")); endif else pname = $string_utils:left(tostr((q in properties(it)) ? "." | (is_clear_property(it, q) ? " " | ","), q, " "), 25); if (inf == E_PERM) this:notify(pname + " ** unreadable **"); else oname = inf[1].name; truncate_owner_names && ((length(oname) > 12) && (oname = oname[1..12])); (inf[2][1] != "r") && (inf[2][1..0] = " "); (inf[2][2] != "w") && (inf[2][2..1] = " "); this:notify($string_utils:left(tostr($string_utils:left(tostr(pname, oname, " (", inf[1], ") "), 47), inf[2], " "), 54) + ((length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y)); endif endif endfor if (cant) failed = {}; for k in (cant) failed = listappend(failed, tostr(k.name, " (", k, ")")); endfor this:notify($string_utils:centre(tostr(" no permission to read ", $string_utils:english_list(failed, ", ", " or ", " or "), ". "), 75, "-")); else this:notify($string_utils:centre(" finished ", 75, "-")); endif . #59:17 set_task_perms(player); "Let 'em @kill it."; count = 0; for i in [0..tonum(max_object())] if ($command_utils:running_out_of_time()) player:notify(tostr("Counting... [", count, "/", i - 1, "]")); suspend(0); endif if (valid(toobj(i))) count = (count + 1); endif endfor player:notify(tostr("There are ", count, " valid objects out of ", tonum(max_object()) + 1, " allocated object numbers.")); . #59:18 "@gethelp [<topic>] [from <db or dblist>]"; " Prints the raw text of topic from the appropriate help db."; " With no argument, gets the blank (\"\") topic from wherever it lives"; " Text is printed as a script for changing this help topic "; " (somewhat like @dump...)"; if (!prepstr) topic = argstr; dblist = $code_utils:help_db_list(); elseif (prepstr != "from") player:notify("Usage: ", verb, " [<topic>] [from <db>]"); return; elseif (!(e = $no_one:eval_d(iobjstr = argstr[$string_utils:word_start(argstr)[(prepstr in args) + 1][1]..length(argstr)]))) player:notify(tostr(e)); return; elseif (!e[1]) player:notify_lines(e[2]); return; elseif (!(typeof(dblist = e[2]) in {OBJ, LIST})) player:notify(tostr(iobjstr, " => ", dblist, " -- not an object or a list")); return; else topic = dobjstr; if (typeof(dblist) == OBJ) dblist = {dblist}; endif endif search = $code_utils:help_db_search(topic, dblist); if (!search) player:notify("Topic not found."); elseif (search[1] == $ambiguous_match) player:notify(tostr("Topic `", topic, "' ambiguous: ", $string_utils:english_list(search[2], "none", " or "))); elseif (typeof(text = (db = search[1]):dump_topic(fulltopic = search[2])) == ERR) "...ok...shoot me. This is a -d verb..."; player:notify(tostr("Cannot retrieve `", fulltopic, "' on ", $code_utils:corify_object(db), ": ", text)); else player:notify_lines(text); endif . #59:19 set_task_perms(player); if (prepstr == "in") pattern = dobjstr; objlist = player:eval_cmd_string(iobjstr, 0); if (!objlist[1]) player:notify(tostr("Had trouble reading `", iobjstr, "': ")); player:notify_lines(@objlist[2]); return; elseif (typeof(objlist[2]) == OBJ) objlist = {objlist[2..2]}; elseif (typeof(objlist[2]) != LIST) player:notify(tostr("Value of `", iobjstr, "' is not an object or list: ", $string_utils:print(objlist[2]))); return; else objlist = objlist[2..2]; endif elseif ((prepstr == "from") && (player.wizard && (n = tonum(toobj(iobjstr))))) pattern = dobjstr; objlist = {n}; elseif (args && player.wizard) pattern = argstr; objlist = {}; else player:notify(tostr("Usage: ", verb, " <pattern> ", player.wizard ? "[in {<objectlist>} | from <number>]" | "in {<objectlist>}")); return; endif player:notify(tostr("Searching for verbs ", @prepstr ? {prepstr, " ", iobjstr, " "} | {}, (verb == "@egrep") ? "matching the pattern " | "containing the string ", $string_utils:print(pattern), " ...")); player:notify(""); $code_utils:((verb == "@egrep") ? "find_verbs_matching" | "find_verbs_containing")(pattern, @objlist); . #59:20 set_task_perms(player); if (dobjstr == "") player:notify(tostr("Usage: ", verb, " <object-or-property-or-verb>")); return; endif if (index(dobjstr, ".") && (spec = $code_utils:parse_propref(dobjstr))) if (valid(object = player:my_match_object(spec[1]))) return $code_utils:show_property(object, spec[2]); endif elseif (spec = $code_utils:parse_verbref(dobjstr)) if (valid(object = player:my_match_object(spec[1]))) return $code_utils:show_verbdef(object, spec[2]); endif elseif (((dobjstr[1] == "$") && ((pname = dobjstr[2..length(dobjstr)]) in properties(#0))) && (typeof(#0.(pname)) == OBJ)) if (valid(object = #0.(pname))) return $code_utils:show_object(object); endif elseif ((dobjstr[1] == "$") && (spec = $code_utils:parse_propref(dobjstr))) return $code_utils:show_property(#0, spec[2]); else if (valid(object = player:my_match_object(dobjstr))) return $code_utils:show_object(object); endif endif $command_utils:object_match_failed(object, dobjstr); . #59:21 "@check-prop object.property"; " checks for descendents defining the given property."; set_task_perms(player); if (!(spec = $code_utils:parse_propref(dobjstr))) player:notify(tostr("Usage: ", verb, " <object>.<prop-name>")); elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1])) "...bogus object..."; elseif (!($perm_utils:controls(player, object) || object.w)) player:notify("You can't create a property on that object anyway."); elseif ($object_utils:has_property(object, prop = spec[2])) player:notify("That object already has that property."); elseif (olist = $object_utils:descendants_with_property_suspended(object, prop)) player:notify("The following descendents have this property defined:"); player:notify(" " + $string_utils:from_list(olist, " ")); else player:notify("No property name conflicts found."); endif . #59:22 "set_eval_env(string);"; "Run <string> through eval. If it doesn't compile, return E_INVARG. If it crashes, well, it crashes. If it works okay, set .eval_env to it and set .eval_ticks to the amount of time it took."; set_task_perms(caller_perms()); program = args[1]; value = $code_utils:eval_d(("ticks = ticks_left();" + program) + ";return ticks - ticks_left() - 2;"); if (!value[1]) return E_INVARG; elseif (typeof(value[2]) == ERR) return value[2]; endif ok = (this.eval_env = program); this.eval_ticks = value[2]; if (typeof(ok) == ERR) return ok; else return 1; endif . #59:23 "@clearproperty <obj>.<prop>"; "Set the value of <obj>.<prop> to `clear', making it appear to be the same as the property on its parent."; set_task_perms(player); if (!(l = $code_utils:parse_propref(dobjstr))) player:notify(tostr("Usage: ", verb, " <object>.<property>")); elseif ($command_utils:object_match_failed(dobj = player:my_match_object(l[1]), l[1])) "... bogus object..."; elseif (is_clear_property(dobj, prop = l[2])) player:notify(tostr("Property ", dobj, ".", prop, " is already clear!")); elseif ((result = clear_property(dobj, prop)) == E_INVARG) player:notify(tostr("You can't clear ", dobj, ".", prop, "; none of the ancestors define that property.")); elseif (typeof(result) == ERR) player:notify(tostr(result)); else player:notify(tostr("Property ", dobj, ".", prop, " cleared; value is now ", $string_utils:print(dobj.(prop)), ".")); endif . #59:24 "Syntax: @disown <object> [from <object>]"; "This command is used to remove unwanted children of objects you control. If you control an object, and there is a child of that object you do not want, this command will chparent() the object to its grandparent."; if (prepstr) if (prepstr != "from") player:notify("Usage: ", verb, " <object> [from <object>]"); return; elseif ($command_utils:object_match_failed(iobj = player:my_match_object(iobjstr), iobjstr)) "... from WHAT?.."; return; elseif (valid(dobj = $string_utils:literal_object(dobjstr))) "... literal object number..."; if (parent(dobj) != iobj) player:notify(tostr(dobj, " is not a child of ", iobj.name, " (", iobj, ")")); return; endif elseif ($command_utils:object_match_failed(dobj = $string_utils:match(dobjstr, children(iobj), "name", children(iobj), "aliases"), dobjstr)) "... can't match dobjstr against any children of iobj"; return; endif elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr)) "... can't match dobjstr..."; return; endif victim = dobj; parent = parent(victim); if ($perm_utils:controls(player, victim)) "... why is he using @disown?... probably by mistake..."; player:notify(tostr(victim.name, " (", victim, ") is yours. Use @chparent.")); elseif (!valid(parent)) player:notify(tostr(victim.name, " (", victim, ") is already an orphan.")); elseif (!$perm_utils:controls(player, parent)) player:notify(tostr(parent.name, " (", parent, "), the parent of ", victim.name, " (", victim, "), is not yours.")); elseif (!valid(grandparent = parent(parent))) "... still not sure about this... do we care? --Rog..."; player:notify(tostr(victim.name, " (", victim, ") has no grandparent to take custody.")); else chparent(victim, grandparent); player:notify(tostr(victim.name, " (", victim, ")'s parent is now ", grandparent.name, " (", grandparent, ").")); endif . #59:25 ":eval_cmd_string(string[,debug])"; "Evaluates the string the way this player would normally expect to see it evaluated if it were typed on the command line. debug (defaults to 1) indicates how the debug flag should be set during the evaluation."; " => {@eval_result, ticks, seconds}"; "where eval_result is the result of the actual eval() call."; ""; "For the case where string is an expression, we need to prefix `return ' and append `;' to string before passing it to eval(). However this is not appropriate for statements, where it is assumed an explicit return will be provided somewhere or that the return value is irrelevant. The code below assumes that string is an expression unless it either begins with a semicolon `;' or one of the MOO language statement keywords."; "Next, the substitutions described by this.eval_subs, which should be a list of pairs {string, sub}, are performed on string"; "Finally, this.eval_env is prefixed to the beginning while this.eval_ticks is subtracted from the eventual tick count. This allows string to refer to predefined variables like `here' and `me'."; set_task_perms(caller_perms()); program = (args[1] + ";"); debug = ({@args, 1}[2] ? 33 | 0); if (!match(program, "^ *%(;%|%(if%|fork?%|return%|while%)[^a-z0-9A-Z_]%)")) program = ("return " + program); endif program = tostr(this.eval_env, ";", $code_utils:substitute(program, this.eval_subs)); ticks = (((ticks_left() - 48) - this.eval_ticks) + debug); seconds = seconds_left(); value = (debug ? eval(program) | $code_utils:eval_d(program)); seconds = (seconds - seconds_left()); ticks = (ticks - ticks_left()); return {@value, ticks, seconds}; . #59:26 "@dump something [with [id=...] [noprops] [noverbs] [create]]"; "This spills out all properties and verbs on an object, calling suspend at appropriate intervals."; " id=#nnn -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO)"; " noprops -- don't show properties."; " noverbs -- don't show verbs."; " create -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it."; set_task_perms(player); dobj = player:my_match_object(dobjstr); if ($command_utils:object_match_failed(dobj, dobjstr)) return; endif if (prepstr && (prepstr != "with")) player:notify(tostr("Usage: ", verb, " something [with [id=...] [noprops] [noverbs] [create]]")); return; endif targname = tostr(dobj); options = {"props", "verbs"}; create = 0; if (iobjstr) for o in ($string_utils:explode(iobjstr)) if (index(o, "id=") == 1) targname = o[4..length(o)]; elseif (o in {"noprops", "noverbs"}) options = setremove(options, o[3..length(o)]); elseif (o in {"create"}) create = 1; endif endfor endif if (create) parent = parent(dobj); pstring = tostr(parent); for p in (properties(#0)) if (#0.(p) == parent) pstring = ("$" + p); endif endfor player:notify(tostr("@create ", pstring, " named ", dobj.name, ":", $string_utils:from_list(dobj.aliases, ","))); endif for p in (("props" in options) ? properties(dobj) | {}) pquoted = $string_utils:print(p); info = property_info(dobj, p); value = dobj.(p); if (create) uvalue = ((typeof(value) == LIST) ? "{}" | 0); player:notify(tostr("@prop ", targname, ".", pquoted, " ", uvalue || $string_utils:print_suspended(value), " ", info[2] || "\"\"", (info[1] == dobj.owner) ? "" | tostr(" ", info[1]))); if (uvalue && value) player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value))); endif else if (info[2] != "rc") player:notify(tostr("@chmod ", targname, ".", pquoted, " ", info[2])); endif if (info[1] != dobj.owner) player:notify(tostr("@chown ", targname, ".", pquoted, " ", info[1])); endif player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value))); endif $command_utils:suspend_if_needed(0); endfor for a in (("props" in options) ? $object_utils:ancestors(dobj) | {}) for p in (properties(a)) $command_utils:suspend_if_needed(1); pquoted = $string_utils:print(p); value = dobj.(p); avalue = a.(p); if (typeof(value) == ERR) player:notify(tostr("\"", targname, ".(", pquoted, ") => ", $code_utils:error_name(value), " (", value, ")")); elseif ((typeof(avalue) == ERR) || (value != avalue)) player:notify(tostr(";;", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value))); endif endfor $command_utils:suspend_if_needed(1); endfor if (!("verbs" in options)) player:notify("\"***finished***"); return; endif player:notify(""); v = tostr(0); while ((info = verb_info(dobj, v)) || (info == E_PERM)) if (index(info[3], "(old)") && 0) "Thought about skipping (old) verbs..."; player:tell("Skipping ", dobj, ":\"", info[3], "\"..."); else suspend(1); if (typeof(info) == ERR) player:notify(tostr("\"", dobj, ":", v, " --- ", info, "\";")); else if (i = index(vname = info[3], " ")) vname = vname[1..i - 1]; endif if (vname[1] != "*") vname = strsub(vname, "*", ""); endif args = verb_args(dobj, v); prep = ((args[2] in {"any", "none"}) ? args[2] | $code_utils:short_prep(args[2])); perms = ((info[2] != ((args == {"this", "none", "this"}) ? "rxd" | "rd")) ? info[2] || "\"\"" | ""); if (create) if (info[1] == dobj.owner) tail = (perms ? tostr(" ", perms) | ""); else tail = tostr(" ", perms || info[2], " ", info[1]); endif player:notify(tostr("@verb ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3], tail)); else player:notify(tostr("@args ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3])); if (info[1] != dobj.owner) player:notify(tostr("@chown ", targname, ":", vname, " ", info[1])); endif if (perms) player:notify(tostr("@chmod ", targname, ":", vname, " ", perms)); endif endif if (code = verb_code(dobj, v, 1, 1)) player:notify(tostr("@program ", targname, ":", vname)); for c in (code) player:notify(c); $command_utils:suspend_if_needed(0); endfor player:notify_lines({".", ""}); endif endif endif if (index(tostr(" ", info[3], " "), " * ")) "... we have a * verb. may as well forget trying to list..."; "... the rest; they're invisible. set v to something nonstring."; v = E_TYPE; else v = tostr(tonum(v) + 1); endif $command_utils:suspend_if_needed(0); endwhile player:notify("\"***finished***"); . #59:27 "Copied from Player Class hacked with eval that does substitutions and assorted stuff (#8855):# by Geust (#24442) Sun May 9 20:19:05 1993 PDT"; "#<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string. String is matched in the current room unless one of exit|player|inventory is given."; "If neither .<property>|.parent nor <code> is specified, just return <thing>."; "If .<property> is named, return <thing>.<property>. .parent returns parent(<thing>)."; "If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>."; "For example, the command"; " #JoeFeedback.parent player for tonum(%#)"; "will return 26026 (unless Joe has chparented since writing this)."; set_task_perms(player); if (!(whatstr = verb[2..dot = (min(index(verb + ".", "."), index(verb + ":", ":")) - 1)])) player:notify("Usage: #string [exit|player|inventory]"); return; elseif (!args) what = player:my_match_object(whatstr); elseif (index("exits", args[1]) == 1) what = player.location:match_exit(whatstr); elseif (index("inventory", args[1]) == 1) what = player:match(whatstr); elseif (index("players", args[1]) == 1) what = $string_utils:match_player(whatstr); if ($command_utils:player_match_failed(what, whatstr)) return; endif else what = player:my_match_object(whatstr); endif if ((!valid(what)) && match(whatstr, "^[0-9]+$")) what = toobj(whatstr); endif if ($command_utils:object_match_failed(what, whatstr)) return; endif while (index(verb, ".parent") == (dot + 1)) what = parent(what); dot = (dot + 7); endwhile if (dot >= length(verb)) val = what; elseif ((value = $code_utils:eval_d(tostr("return ", what, verb[dot + 1..length(verb)], ";")))[1]) val = value[2]; else player:notify_lines(value[2]); return; endif if (prepstr) program = strsub(iobjstr + ";", "%#", $string_utils:print(val)); end = 1; "while (\"A\" <= (l = argstr[end]) && l <= \"Z\")"; while (("A" <= (l = program[end])) && (l <= "Z")) end = (end + 1); endwhile if ((program[1] == ";") || (program[1..end - 1] in {"if", "for", "fork", "return", "while"})) program = $code_utils:substitute(program, this.eval_subs); else program = $code_utils:substitute("return " + program, this.eval_subs); endif if ((value = eval(program))[1]) player:notify(this:eval_value_to_string(value[2])); else player:notify_lines(value[2]); nerrors = length(value[2]); player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s.")); endif else player:notify(this:eval_value_to_string(val)); endif . #59:28 set_task_perms(caller_perms()); if (typeof(val = args[1]) == OBJ) return tostr("=> ", val, " ", valid(val) ? ("(" + val.name) + ")" | ((a = $list_utils:assoc(val, {{#-1, "<$nothing>"}, {#-2, "<$ambiguous_match>"}, {#-3, "<$failed_match>"}})) ? a[2] | "<invalid>")); elseif (typeof(val) == ERR) return tostr("=> ", $code_utils:error_name(val), " (", val, ")"); else return tostr("=> ", $string_utils:print(val)); endif . #60:0 ":eval_d(code...) => {compiled?,result}"; "This works exactly like the builtin eval() except that the code is evaluated "; "as if the d flag were unset."; code = {"set_verb_code(this,\"1\",{\"\\\"Do not remove this verb! This is an auxiliary verb for :eval_d().\\\";\"});", "dobj=iobj=this=#-1;", "dobjstr=iobjstr=prepstr=argstr=verb=\"\";", tostr("caller=", caller, ";"), "set_task_perms(caller_perms());", @args}; if (!caller_perms().programmer) return E_PERM; elseif (svc = set_verb_code(this, "1", code)) lines = {}; for line in (svc) if ((index(line, "Line ") == 1) && (n = tonum(line[6..(colon = index(line + ":", ":")) - 1]))) lines = {@lines, tostr("Line ", n - 5, line[colon..length(line)])}; else lines = {@lines, line}; endif endfor return {0, lines}; else set_task_perms(caller_perms()); return {1, this:("1")()}; endif . #60:1 "Do not remove this verb! This is an auxiliary verb for :eval_d()."; . #60:2 ":tonum(number as string) => number"; return match(s = args[1], "^ *[-+]?[0-9]+ *$") ? tonum(s) | E_TYPE; . #60:3 ":toobj(objectid as string) => objectid"; return match(s = args[1], "^ *#[-+]?[0-9]+ *$") ? toobj(s) | E_TYPE; . #60:4 "toerr(n), toerr(\"E_FOO\"), toerr(\"FOO\") => E_FOO."; if (typeof(s = args[1]) != STR) n = (tonum(s) + 1); if (n > length(this.error_list)) return 1; endif elseif (!(n = ((s in this.error_names) || (("E_" + s) in this.error_names)))) return 1; endif return this.error_list[n]; . #60:5 "error_name(E_FOO) => \"E_FOO\""; return this.error_names[tonum(args[1]) + 1]; . #60:6 set_task_perms(caller_perms()); object = args[1]; what = {@args, {"props", "verbs"}}[2]; player:notify(tostr("Object ID: ", object)); player:notify(tostr("Name: ", object.name)); names = {"Parent", "Location", "Owner"}; vals = {parent(object), object.location, object.owner}; for i in [1..length(vals)] if (!valid(vals[i])) val = "*** NONE ***"; else val = (((vals[i].name + " (") + tostr(vals[i])) + ")"); endif player:notify(tostr(names[i], ": "[1..12 - length(names[i])], val)); endfor line = "Flags: "; if (is_player(object)) line = (line + " player"); endif for flag in ({"programmer", "wizard", "r", "w", "f"}) if (object.(flag)) line = ((line + " ") + flag); endif endfor player:notify(line); if (player.programmer && ((player.wizard || (player == object.owner)) || object.r)) if (("verbs" in what) && verbs(object)) player:notify("Verb definitions:"); for v in (verbs(object)) $command_utils:suspend_if_needed(0); player:notify(tostr(" ", v)); endfor endif if ("props" in what) if (properties(object)) player:notify("Property definitions:"); for p in (properties(object)) $command_utils:suspend_if_needed(0); player:notify(tostr(" ", p)); endfor endif all_props = $object_utils:all_properties(object); if (all_props != {}) player:notify("Properties:"); for p in (all_props) $command_utils:suspend_if_needed(0); val = object.(p); if (val == E_PERM) STR = "(Permission denied.)"; else STR = $string_utils:from_value_suspended(val, 1, -1); endif player:notify(tostr(" ", p, ": ", STR)); endfor endif endif elseif (player.programmer) player:notify("** Can't list properties or verbs: permission denied."); endif if (object.contents) player:notify("Contents:"); for o in (object.contents) $command_utils:suspend_if_needed(0); player:notify(tostr(" ", o.name, " (", o, ")")); endfor endif . #60:7 set_task_perms(caller_perms()); object = args[1]; pname = args[2]; if (pname in this.builtin_props) player:notify(tostr(object, ".", pname)); player:notify("Built-in property."); else info = property_info(object, pname); if (typeof(info) == ERR) player:notify(tostr(info)); return; endif owner = info[1]; perms = info[2]; player:notify(tostr(object, ".", pname)); player:notify(tostr("Owner: ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***")); player:notify(tostr("Permissions: ", perms)); endif player:notify(tostr("Value: ", $string_utils:print(object.(pname)))); . #60:8 set_task_perms(caller_perms()); object = args[1]; vname = args[2]; if (!(hv = $object_utils:has_verb(object, vname))) player:notify("That object does not define that verb."); return; elseif (hv[1] != object) player:notify(tostr("Object ", object, " does not define that verb, but its ancestor ", hv[1], " does.")); object = hv[1]; endif info = verb_info(object, vname); if (typeof(info) == ERR) player:notify(tostr(info)); return; endif owner = info[1]; perms = info[2]; names = info[3]; arg_specs = verb_args(object, vname); player:notify(tostr(object, ":", names)); player:notify(tostr("Owner: ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***")); player:notify(tostr("Permissions: ", perms)); player:notify(tostr("Direct Object: ", arg_specs[1])); player:notify(tostr("Preposition: ", arg_specs[2])); player:notify(tostr("Indirect Object: ", arg_specs[3])); . #60:9 if (args[4..5] == {"none", "this"}) return 0; endif thisobj = args[1]; verb = args[2]; adobj = args[3]; aprep = args[4]; aiobj = args[5]; prep_part = ((aprep == "any") ? "to" | this:short_prep(aprep)); ".........`any' => `to' (arbitrary),... `none' => empty string..."; if ((adobj == "this") && (dobj == thisobj)) dobj_part = dobjstr; iobj_part = (((!prep_part) || (aiobj == "none")) ? "" | ((aiobj == "this") ? dobjstr | iobjstr)); elseif ((aiobj == "this") && (iobj == thisobj)) dobj_part = ((adobj == "any") ? dobjstr | ((adobj == "this") ? iobjstr | "")); iobj_part = iobjstr; elseif (!("this" in args[3..5])) dobj_part = ((adobj == "any") ? dobjstr | ""); iobj_part = ((prep_part && (aiobj == "any")) ? iobjstr | ""); else return 0; endif return tostr(verb, dobj_part ? " " + dobj_part | "", prep_part ? " " + prep_part | "", iobj_part ? " " + iobj_part | ""); . #60:10 "returns the permissions of the current verb (either the owner or the result of the most recent set_task_perms())."; return caller_perms(); . #60:11 "returns the object where the current verb is defined."; return callers()[1][4]; . #60:12 ":verb_documentation([object,verbname]) => documentation at beginning of verb code, if any"; "default is the calling verb"; set_task_perms(caller_perms()); if (args) object = args[1]; vname = args[2]; else c = callers()[1]; object = c[4]; vname = c[2]; endif if (typeof(code = verb_code(object, vname)) == ERR) return tostr(code); else doc = {}; for line in (code) if (match(line, "^\"%([^\\\"]%|\\.%)*\";$")) "... now that we're sure `line' is just a string, eval() is safe..."; doc = {@doc, $no_one:eval("; return " + line)[2]}; else return doc; endif endfor return doc; endif . #60:13 ":set_verb_documentation(object,verbname,text)"; " changes documentation at beginning of verb code"; " text is either a string or a list of strings"; " returns a non-1 value if anything bad happens..."; set_task_perms(caller_perms()); if (typeof(code = verb_code(object = args[1], vname = args[2])) == ERR) return code; elseif (typeof(vd = $code_utils:verb_documentation(object, vname)) == ERR) return vd; elseif (!(typeof(text = args[3]) in {LIST, STR})) return E_INVARG; else newdoc = {}; for l in ((typeof(text) == LIST) ? text | {text}) if (typeof(l) != STR) return E_INVARG; endif newdoc = {@newdoc, $string_utils:print(l) + ";"}; endfor if ((ERR == typeof(svc = set_verb_code(object, vname, {@newdoc, @code[length(vd) + 1..length(code)]}))) || svc) "... this shouldn't happen. I'm not setting this code -d just yet..."; return svc; else return 1; endif endif . #60:14 "$code_utils:parse_propref(string)"; "Parses string as a MOO-code property reference, returning {object-string, prop-name-string} for a successful parse and false otherwise. It always returns the right object-string to pass to, for example, this-room:match_object."; s = args[1]; if (dot = index(s, ".")) object = s[1..dot - 1]; prop = s[dot + 1..length(s)]; if ((object == "") || (prop == "")) return 0; elseif (object[1] == "$") object = #0.(object[2..length(object)]); if (typeof(object) != OBJ) return 0; endif object = tostr(object); endif elseif (index(s, "$") == 1) object = "#0"; prop = s[2..length(s)]; else return 0; endif return {object, prop}; . #60:15 "$code_utils:parse_verbref(string)"; "Parses string as a MOO-code verb reference, returning {object-string, verb-name-string} for a successful parse and false otherwise. It always returns the right object-string to pass to, for example, this-room:match_object()."; s = args[1]; if (colon = index(s, ":")) object = s[1..colon - 1]; verbname = s[colon + 1..length(s)]; if (!(object && verbname)) return 0; elseif (object[1] == "$") pname = object[2..length(object)]; if ((!(pname in properties(#0))) || (typeof(object = #0.(pname)) != OBJ)) return 0; endif object = tostr(object); endif return {object, verbname}; else return 0; endif . #60:16 ":parse_arg_spec(@args)"; " attempts to parse the given sequence of args into a verb_arg specification"; "returns {verb_args,remaining_args} if successful."; " e.g., :parse_arg_spec(\"this\",\"in\",\"front\",\"of\",\"any\",\"foo\"..)"; " => {{\"this\",\"in front of\",\"any\"},{\"foo\"..}}"; "returns a string error message if parsing fails."; nargs = length(args); if (nargs < 1) return {{}, {}}; elseif ((ds = args[1]) == "tnt") return {{"this", "none", "this"}, listdelete(args, 1)}; elseif (!(ds in {"this", "any", "none"})) return tostr("\"", ds, "\" is not a valid direct object specifier."); elseif ((nargs < 2) || (args[2] in {"none", "any"})) verbargs = args[1..min(3, nargs)]; rest = args[4..nargs]; elseif (!(gp = $code_utils:get_prep(@args[2..nargs]))[1]) return tostr("\"", args[2], "\" is not a valid preposition."); else verbargs = {ds, @gp[1..min(2, nargs = length(gp))]}; rest = gp[3..nargs]; endif if ((length(verbargs) >= 3) && (!(verbargs[3] in {"this", "any", "none"}))) return tostr("\"", verbargs[3], "\" is not a valid indirect object specifier."); endif return {verbargs, rest}; . #60:17 if (server_version() != this._version) this:_fix_preps(); endif return this.prepositions; . #60:18 ":short_prep(p) => shortest preposition equivalent to p"; "p may be a single word or one of the strings returned by verb_args()."; if (server_version() != this._version) this:_fix_preps(); endif word = args[1]; word = word[1..index(word + "/", "/") - 1]; if (p = (word in this._other_preps)) return this._short_preps[this._other_preps_n[p]]; elseif (word in this._short_preps) return word; else return ""; endif . #60:19 if (server_version() != this._version) this:_fix_preps(); endif prep = args[1]; if (p = (prep in this._short_preps)) return this.prepositions[p]; elseif (p = (prep in this._other_preps)) return this.prepositions[this._other_preps_n[p]]; else return ""; endif . #60:20 ":get_prep(@args) extracts the prepositional phrase from the front of args, returning a list consisting of the preposition (or \"\", if none) followed by the unused args."; ":get_prep(\"in\",\"front\",\"of\",...) => {\"in front of\",...}"; ":get_prep(\"inside\",...) => {\"inside\",...}"; ":get_prep(\"frabulous\",...} => {\"\", \"frabulous\",...}"; prep = ""; allpreps = {@this._short_preps, @this._other_preps}; rest = 1; for i in [1..length(args)] try = ((i == 1) ? args[1] | tostr(try, " ", args[i])); if (try in allpreps) prep = try; rest = (i + 1); endif if (!(try in this._multi_preps)) return {prep, @args[rest..length(args)]}; endif endfor return {prep, @args[rest..length(args)]}; . #60:21 ":_fix_preps() updates the properties on this having to do with prepositions."; "_fix_preps should be called whenever we detect that a new server version has been installed."; orig_args = verb_args(this, verb); multis = (nothers = (others = (shorts = (longs = {})))); i = 0; while (typeof(set_verb_args(this, verb, {"this", tostr(i), "this"})) != ERR) l = verb_args(this, verb)[2]; all = $string_utils:explode(l, "/"); s = all[1]; for p in (listdelete(all, 1)) if (length(p) <= length(s)) s = p; endif endfor for p in (all) while (j = rindex(p, " ")) multis = {p = p[1..j - 1], @multis}; endwhile endfor longs = {@longs, l}; shorts = {@shorts, s}; others = {@others, @setremove(all, s)}; nothers = {@nothers, @$list_utils:make(length(all) - 1, length(shorts))}; i = (i + 1); endwhile set_verb_args(this, verb, orig_args); this.prepositions = longs; this._short_preps = shorts; this._other_preps = others; this._other_preps_n = nothers; this._multi_preps = multis; this._version = server_version(); return; . #60:22 ":find_verb_named(object,name[,n])"; " returns the *number* of the first verb on object matching the given name."; " optional argument n, if given, starts the search with verb n,"; " causing the first n verbs (0..n-1) to be ignored."; " -1 is returned if no verb is found."; " This routine does not find inherited verbs."; object = args[1]; name = args[2]; for i in [{@args, 0}[3]..length(verbs(object)) - 1] verbinfo = verb_info(object, tostr(i)); if (this:verbname_match(verbinfo[3], name)) return i; endif endfor return -1; . #60:23 ":find_verb_named(object,name[,n])"; " returns the *number* of the last verb on object matching the given name."; " optional argument n, if given, starts the search with verb n-1,"; " causing verbs (n..length(verbs(object))) to be ignored."; " -1 is returned if no verb is found."; " This routine does not find inherited verbs."; object = args[1]; name = args[2]; last = {@args, -1}[3]; if (last < 0) last = length(verbs(object)); endif for i in [1..last] verbinfo = verb_info(object, tostr(last - i)); if (this:verbname_match(verbinfo[3], name)) return last - i; endif endfor return -1; . #60:24 ":find_callable_verb_named(object,name[,n])"; " returns the *number* of the first verb on object that matches the given"; " name and has the x flag set."; " optional argument n, if given, starts the search with verb n,"; " causing the first n verbs (0..n-1) to be ignored."; " -1 is returned if no verb is found."; " This routine does not find inherited verbs."; object = args[1]; name = args[2]; for i in [{@args, 0}[3]..length(verbs(object)) - 1] verbinfo = verb_info(object, tostr(i)); if (index(verbinfo[2], "x") && this:verbname_match(verbinfo[3], name)) return i; endif endfor return -1; . #60:25 ":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'"; verblist = ((" " + args[1]) + " "); if (index(verblist, (" " + (name = args[2])) + " ") && (!match(name, "[ *]"))) "Note that if name has a * or a space in it, then it can only match one of the * verbnames"; return 1; else namelen = length(name); while (m = match(verblist, "[^ *]*%(%*%)[^ ]*")) vlast = m[2]; if ((namelen >= (m[3][1][1] - m[1])) && ((!(v = strsub(verblist[m[1]..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1))) return 1; endif verblist = verblist[vlast + 1..length(verblist)]; endwhile endif return 0; . #60:26 "$code_utils:find_verbs_containing(pattern[,object|object-list])"; ""; "Print (to player) the name and owner of every verb in the database whose code contains PATTERN as a substring. Optional second argument limits the search to the specified object or objects."; ""; "Because it searches the entire database, this function may suspend the task several times before returning."; ""; set_task_perms(caller_perms()); "... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her."; pattern = args[1]; where = {@args, 0}[2]; count = 0; if (typeof(where) == NUM) for i in [where..tonum(max_object())] if (valid(o = toobj(i))) count = (count + this:_find_verbs_containing(pattern, o)); endif if ($command_utils:running_out_of_time()) player:notify(tostr("...", o)); suspend(0); endif endfor elseif (typeof(where) == LIST) for o in (where) count = (count + this:_find_verbs_containing(pattern, o)); endfor else "...typeof(where) == OBJ..."; count = this:_find_verbs_containing(pattern, where); endif player:notify(""); player:notify(tostr("Total: ", count, " verbs.")); . #60:27 ":_find_verbs_containing(pattern,object)"; "number of verbs in object with code having a line containing pattern"; "prints verbname and offending line to player"; set_task_perms(caller_perms()); pattern = args[1]; count = 0; verbs = verbs(o = args[2]); if (typeof(verbs) == ERR) player:notify(tostr("verbs(", o, ") => ", verbs)); return 0; endif for vnum in [0..length(verbs) - 1] if (l = this:_grep_verb_code(pattern, o, vname = tostr(vnum))) owner = verb_info(o, vname)[1]; player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]: ", l)); count = (count + 1); endif if ($command_utils:running_out_of_time()) player:notify(tostr("...", o)); suspend(0); endif endfor return count; . #60:28 "$code_utils:find_verbs_matching(pattern[,object|object-list])"; ""; "Print (to player) the name and owner of every verb in the database whose code has a substring matches the regular expression PATTERN. Optional second argument limits the search to the specified object or objects."; ""; "Because it searches the entire database, this function may suspend the task several times before returning."; ""; set_task_perms(caller_perms()); "... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her."; pattern = args[1]; where = {@args, 0}[2]; count = 0; if (typeof(where) == NUM) for i in [where..tonum(max_object())] if (valid(o = toobj(i))) count = (count + this:_find_verbs_matching(pattern, o)); endif if ($command_utils:running_out_of_time()) player:notify(tostr("...", o)); suspend(0); endif endfor elseif (typeof(where) == LIST) for o in (where) count = (count + this:_find_verbs_matching(pattern, o)); endfor else count = this:_find_verbs_matching(pattern, args[2]); endif player:notify(""); player:notify(tostr("Total: ", count, " verbs.")); . #60:29 ":_find_verbs_matching(regexp,object)"; "number of verbs in object with code having a line matching regexp"; "prints verbname and offending line to player"; set_task_perms(caller_perms()); pattern = args[1]; count = 0; verbs = verbs(o = args[2]); if (typeof(verbs) == ERR) player:notify(tostr("verbs(", o, ") => ", verbs)); return 0; endif for vnum in [0..length(verbs) - 1] if (l = this:_egrep_verb_code(pattern, o, vname = tostr(vnum))) owner = verb_info(o, vname)[1]; player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]: ", l)); count = (count + 1); endif if ($command_utils:running_out_of_time()) player:notify(tostr("...", o)); suspend(0); endif endfor return count; . #60:30 ":_grep_verb_code(pattern,object,verbname) => line number or 0"; " returns line number on which pattern occurs in code for object:verbname"; set_task_perms(caller_perms()); pattern = args[1]; for line in (vc = verb_code(@listdelete(args, 1))) if (index(line, pattern)) return line; endif endfor return 0; . #60:31 ":_egrep_verb_code(regexp,object,verbname) => 0 or line number"; " returns line number of first line matching regexp in object:verbname code"; set_task_perms(caller_perms()); pattern = args[1]; for line in (vc = verb_code(@listdelete(args, 1))) if (match(line, pattern)) return line; endif endfor return 0; . #60:32 "Parse [from <start>] [to <end>] [for <name>]."; "Takes a series of strings, most likely @args with dobjstr removed."; "Returns a list {NUM start, NUM end, STR name}, or {} if there is an error."; fail = (length(args) % 2); start = 0; end = tonum(max_object()); match = ""; while (args && (!fail)) prep = args[1]; if (prep == "from") if ((start = player.location:match_object(args[2])) >= #0) start = tonum(start); else start = tonum(args[2]); endif elseif (prep == "to") if ((end = player.location:match_object(args[2])) >= #0) end = tonum(end); else end = tonum(args[2]); endif elseif (prep == "for") match = args[2]; else fail = 1; endif args = args[3..length(args)]; endwhile return fail ? {} | {start, end, match}; . #60:33 olist = {player, @$object_utils:ancestors(player)}; if (valid(player.location)) olist = {@olist, player.location, @$object_utils:ancestors(player.location)}; endif dbs = {}; for o in (olist) h = o.help; if (typeof(h) == OBJ) h = {h}; endif for db in (h) if ((typeof(db) == OBJ) && (valid(db) && (!(db in dbs)))) dbs = {@dbs, db}; endif endfor endfor return {@dbs, $help}; . #60:34 ":help_db_search(string,dblist)"; " searches each of the help db's in dblist for a topic matching string."; " Returns {db,topic} or {$ambiguous_match,{topic...}} or {}"; what = args[1]; dblist = args[2]; topics = {}; help = 1; for db in (dblist) if ({what} == (ts = db:find_topics(what))) return {db, ts[1]}; elseif (ts && (typeof(ts) == LIST)) if (help) help = db; endif for t in (ts) topics = setadd(topics, t); endfor endif endfor if (length(topics) > 1) return {$ambiguous_match, topics}; elseif (topics) return {help, topics[1]}; else return {}; endif . #60:35 ":corify_object(object) => string representing object"; " usually just returns tostr(object), but in the case of objects that have"; " corresponding #0 properties, return the appropriate $-string."; object = args[1]; for p in (properties(#0)) if (#0.(p) == object) return "$" + p; endif endfor return tostr(object); . #60:36 "$code_utils:substitute(string,subs) => new line"; "Subs are a list of lists, {{\"target\",\"sub\"},{...}...}"; "Substitutes targets for subs in a delimited string fashion, avoiding substituting anything inside quotes, e.g. player:tell(\"don't sub here!\")"; s = args[1]; subs = args[2]; lets = "abcdefghijklmnopqrstuvwxyz0123456789"; for x in (subs) len = length(sub = x[1]); delimited = (index(lets, sub[1]) && index(lets, sub[len])); prefix = ""; while (i = index(s, sub)) prefix = (prefix + s[1..i - 1]); if ((((prefix == "") || ((!delimited) || (!index(lets, prefix[length(prefix)])))) && ((!delimited) || (((i + len) > length(s)) || (!index(lets, s[i + len]))))) && (!this:inside_quotes(prefix))) prefix = (prefix + x[2]); else prefix = (prefix + s[i..(i + len) - 1]); endif s = s[i + len..length(s)]; endwhile s = (prefix + s); endfor return s; . #60:37 "See if the end of the string passed as args[1] ends 'inside' a doublequote. Used by $code_utils:substitute."; string = args[1]; quoted = 0; for i in [1..length(string)] if ((string[i] == "\"") && ((!quoted) || (string[i - 1] != "\\"))) quoted = (!quoted); endif endfor return quoted; . #60:38 "verb_or_property(<obj>, <name> [, @<args>])"; "Looks for a callable verb or property named <name> on <obj>."; "If <obj> has a callable verb named <name> then return <obj>:(<name>)(@<args>)."; "If <obj> has a property named <name> then return <obj>.(<name>)."; "Otherwise return E_PROPNF."; "N.B.: a verb returning E_VERBNF will act like an undefined verb."; set_task_perms(caller_perms()); return ((val = args[1]:(args[2])(@args[3..length(args)])) == E_VERBNF) ? args[1].(args[2]) | val; . #60:39 "task_valid(NUM id)"; "Return true iff there is currently a valid task with the given id."; set_task_perms($no_one); id = args[1]; return (id == task_id()) || (E_PERM == kill_task(id)); . #60:40 if (a = $list_utils:assoc(args[1], queued_tasks())) return a[5]; else return E_INVARG; endif . #60:41 ":argstr(verb,args[,argstr]) => what argstr should have been. "; "Recall that the command line is parsed into a sequence of words; `verb' is"; "assigned the first word, `args' is assigned the remaining words, and argstr"; "is assigned a substring of the command line, which *should* be the one"; "starting first nonblank character after the verb, but is instead (because"; "the parser is BROKEN!) the one starting with the first nonblank character"; "after the first space in the line, which is not necessarily after the verb."; "Clearly, if the verb contains spaces --- which can happen if you use"; "backslashes and quotes --- this loses, and argstr will then erroneously"; "have extra junk at the beginning. This verb, given verb, args, and the"; "actual argstr, returns what argstr should have been."; verb = args[1]; argstr = {@args, argstr}[3]; n = length(args = args[2]); if (!index(verb, " ")) return argstr; elseif (!args) return ""; endif "space in verb => two possible cases:"; "(1) first space was not in a quoted string."; " first word of argstr == rest of verb unless verb ended on this space."; if ((nqargs = $string_utils:words(argstr)) == args) return argstr; elseif (((nqn = length(nqargs)) == (n + 1)) && (nqargs[2..nqn] == args)) return argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)]; else "(2) first space was in a quoted string."; " argstr starts with rest of string"; qs = $string_utils:word_start("\"" + argstr); return argstr[qs[(length(qs) - length(args)) + 1][1] - 1..length(argstr)]; endif . #60:42 ":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'"; verblist = ((" " + args[1]) + " "); if (index(verblist, (" " + (name = args[2])) + " ") && (!(index(name, "*") || index(name, " ")))) "Note that if name has a * or a space in it, then it can only match one of the * verbnames"; return 1; else namelen = length(name); while (star = index(verblist, "*")) vstart = (rindex(verblist[1..star], " ") + 1); vlast = ((vstart + index(verblist[vstart..length(verblist)], " ")) - 2); if ((namelen >= (star - vstart)) && ((!(v = strsub(verblist[vstart..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1))) return 1; endif verblist = verblist[vlast + 1..length(verblist)]; endwhile endif return 0; . #60:43 ":show_who_listing(players[,more_players])"; " prints a listing of the indicated players."; " For players in the first list, idle/connected times are shown if the player is logged in, otherwise the last_disconnect_time is shown. For players in the second list, last_disconnect_time is shown, no matter whether the player is logged in."; idles = (itimes = (offs = (otimes = {}))); for p in (args[2]) if (!valid(p)) caller:notify(tostr(p, " <invalid>")); elseif (typeof(t = p.last_disconnect_time) == NUM) if (!(p in offs)) offs = {@offs, p}; otimes = {@otimes, {-t, -t, p}}; endif elseif (is_player(p)) caller:notify(tostr(p.name, " (", p, ") ", (t == E_PROPNF) ? "is not a $player." | "has a garbled .last_disconnect_time.")); else caller:notify(tostr(p.name, " (", p, ") is not a player.")); endif endfor for p in (args[1]) if (p in offs) elseif (!valid(p)) caller:notify(tostr(p, " <invalid>")); elseif (typeof(i = idle_seconds(p)) != ERR) if (!(p in idles)) idles = {@idles, p}; itimes = {@itimes, {i, connected_seconds(p), p}}; endif elseif (typeof(t = p.last_disconnect_time) == NUM) offs = {@offs, p}; otimes = {@otimes, {-t, -t, p}}; elseif (is_player(p)) caller:notify(tostr(p.name, " (", p, ") not logged in.", (t == E_PROPNF) ? " Not a $player." | " Garbled .last_disconnect_time.")); else caller:notify(tostr(p.name, " (", p, ") is not a player.")); endif endfor if (!(idles || offs)) return 0; endif idles = $list_utils:sort_alist(itimes); offs = $list_utils:sort_alist(otimes); "..."; "... calculate widths..."; "..."; headers = {"Player name", @idles ? {"Connected", "Idle time"} | {"Last disconnect time", ""}, "Location"}; total_width = (caller:linelen() || 79); max_name = (total_width / 4); name_width = length(headers[1]); names = (locations = {}); for lst in ({@idles, @offs}) $command_utils:suspend_if_needed(0); p = lst[3]; namestr = tostr(p.name[1..min(max_name, length(p.name))], " (", p, ")"); name_width = max(length(namestr), name_width); names = {@names, namestr}; if (typeof(wlm = p.location:who_location_msg(p)) != STR) wlm = (valid(p.location) ? p.location.name | tostr("** Nowhere ** (", p.location, ")")); endif locations = {@locations, wlm}; endfor time_width = (3 + (offs ? 12 | length("59 minutes"))); before = {0, w1 = (3 + name_width), w2 = (w1 + time_width), w2 + time_width}; "..."; "...print headers..."; "..."; su = $string_utils; tell1 = headers[1]; tell2 = su:space(tell1, "-"); for j in [2..4] tell1 = (su:left(tell1, before[j]) + headers[j]); tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-")); endfor caller:notify(tell1[1..min(length(tell1), total_width)]); caller:notify(tell2[1..min(length(tell2), total_width)]); "..."; "...print lines..."; "..."; active = 0; for i in [1..total = ((ilen = length(idles)) + length(offs))] if (i <= ilen) lst = idles[i]; if (lst[1] < (5 * 60)) active = (active + 1); endif l = {names[i], su:from_seconds(lst[2]), su:from_seconds(lst[1]), locations[i]}; else lct = offs[i - ilen][3].last_connect_time; ldt = offs[i - ilen][3].last_disconnect_time; ctime = (caller:ctime(ldt) || ctime(ldt)); l = {names[i], (lct <= time()) ? ctime | "Never", "", locations[i]}; if ((i == (ilen + 1)) && idles) caller:notify(su:space(before[2]) + "------- Disconnected -------"); endif endif tell1 = l[1]; for j in [2..4] tell1 = (su:left(tell1, before[j]) + l[j]); endfor caller:notify(tell1[1..min(length(tell1), total_width)]); if ($command_utils:running_out_of_time()) now = time(); suspend(0); if ((time() - now) > 10) caller:notify(tostr("Plus ", total - i, " other players (", total, " total; out of time and lag is high).")); return; endif endif endfor "..."; "...epilogue..."; "..."; caller:notify(""); if (total == 1) active_str = (", who has" + ((active == 1) ? "" | " not")); else if (active == total) active_str = ((active == 2) ? "s, both" | "s, all"); elseif (active == 0) active_str = "s, none"; else active_str = tostr("s, ", active); endif active_str = tostr(active_str, " of whom ha", (active == 1) ? "s" | "ve"); endif caller:notify(tostr("Total: ", total, " player", active_str, " been active recently.")); return total; . #60:44 ":_egrep_verb_code(regexp,object,verbname) => list of lines number"; " returns list of all lines matching regexp in object:verbname code"; set_task_perms(caller_perms()); pattern = args[1]; lines = {}; for line in (vc = verb_code(@args[2..3], 1, 0)) if (match(line, pattern)) lines = {@lines, line}; endif endfor return lines; . #60:45 ":_grep_verb_code_all(pattern,object,verbname) => list of lines"; " returns list of lines on which pattern occurs in code for object:verbname"; set_task_perms(caller_perms()); pattern = args[1]; lines = {}; for line in (vc = verb_code(@args[2..3])) if (index(line, pattern)) lines = {@lines, line}; endif endfor return lines; . #60:47 ":verb_usage([object,verbname]) => usage string at beginning of verb code, if any"; "default is the calling verb"; set_task_perms(caller_perms()); if (args) object = args[1]; vname = args[2]; else c = callers()[1]; object = c[4]; vname = c[2]; endif if (typeof(code = verb_code(object, vname)) == ERR) return code; else doc = {}; for line in (code) if (match(line, "^\"%([^\\\"]%|\\.%)*\";$")) "... now that we're sure `line' is just a string, eval() is safe..."; e = $no_one:eval(line)[2]; if (subs = match(e, "^%(Usage: +%)%([^ ]+%)%(.*$%)")) "Server is broken, hence the next three lines:"; if (subs[3][3][1] > subs[3][3][2]) subs[3][3] = {0, -1}; endif indent = (("^%(" + $string_utils:space(length(substitute("%1", subs)))) + " *%)%([^ ]+%)%(.*$%)"); docverb = substitute("%2", subs); if (match(vname, "^[0-9]+$")) vname = docverb; endif doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)}; elseif (subs = match(e, indent)) if (substitute("%2", subs) == docverb) doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)}; else doc = {@doc, e}; endif elseif (indent) return doc; endif else return doc; endif endfor return doc; endif . #61:0 return $player.ownership_quota; . #61:1 return $prog.ownership_quota; . #61:2 text = pass(@args); if ((text != E_PROPNF) || (!valid(object = $string_utils:match_object(what = args[1], player.location)))) return text; elseif (ohelp = ((object = $string_utils:match_object(what, player.location)):help_msg() || object.help_msg)) "...geez. life is simple if we set -d..."; return {tostr(object.name, " (", object, "):"), "----", @(typeof(ohelp) == LIST) ? ohelp | {ohelp}}; else about = $object_utils:has_verb(object, "about"); return {tostr("Sorry, but no help is available on ", object.name, " (", object, ")."), tostr("Try `@examine ", what, "'", @about ? {" or `about ", what, "'"} | {}, ".")}; endif . #61:3 topiclist = pass(@args); if (topiclist || (!args)) return topiclist; elseif (valid(o = $string_utils:match_object(what = args[1], player.location))) return {what}; else return {}; endif . #61:4 text = {}; for db in ($code_utils:help_db_list()) if ($object_utils:has_callable_verb(db, "index")) text = {@text, @db:index({tostr(db.name, " (", db, ")")})}; endif endfor return text; . #61:5 hdr = "Available Help Indices"; text = {"", hdr, $string_utils:space(hdr, "-")}; for db in ($code_utils:help_db_list()) if ($object_utils:isa(db, $generic_help)) for p in (properties(db)) if ((h = db.(p)) && ("*index*" in h)) text = {@text, tostr($string_utils:left(p, 14), " -- ", h[2] || db.name, " (", db, ")")}; endif endfor endif endfor for p in (properties(this)) if (this.(p) && (this.(p)[1] == "*full_index*")) return {@text, "", tostr($string_utils:left(p, 14), " -- ", "EVERYTHING")}; endif endfor return text; . #61:6 wizzes = {#2, @$list_utils:randomly_permute(setremove($object_utils:leaves($wiz), #2))}; numwiz = length(wizzes); hlist = {"ArchWizard:", "Wizard" + ((numwiz == 2) ? ":" | "s:"), @$list_utils:make(max(0, numwiz - 2), "")}; slist = {}; su = $string_utils; for i in [1..numwiz] wiz = wizzes[i]; slist = {@slist, tostr(su:left(hlist[i], 13), su:left(wiz.name, 16), (wpi = wiz.public_identity.name) ? (" (a.k.a. " + wpi) + ")" | "")}; endfor return slist; . #61:7 if (((text = pass(@args)) != E_PROPNF) || ((!valid(object = $string_utils:match_object(what = args[1], player.location))) || (!$object_utils:has_property(object, "help_msg")))) return text; else return {tostr(";;", $code_utils:corify_object(object), ".help_msg = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(text = object.help_msg) == LIST) ? text | {text})}; endif . #62:0 "Return a toad (child of #1, owned by $hacker) from this.contents. Move it to #-1. Recreate as a child of args[1], or of #1 if no args are given. Chown to caller_perms() or args[2] if present."; what = (args ? args[1] | #1); who = ((length(args) == 2) ? args[2] | caller_perms()); if (!(caller_perms().wizard || (who == caller_perms()))) return E_PERM; elseif (!(valid(what) && is_player(who))) return E_INVARG; elseif ((((who != what.owner) && (!what.f)) && (!who.wizard)) && (!caller_perms().wizard)) return E_PERM; endif for potential in (this.contents) if (((potential.owner == $hacker) && (parent(potential) == $garbage)) && (!children(potential))) return this:setup_toad(potential, who, what); endif endfor return E_NONE; . #62:1 "Take the object in args[1], and turn it into a child of #1 owned by $hacker."; item = args[1]; if (!$perm_utils:controls(caller_perms(), item)) $error:raise(E_PERM); endif this:addhist(caller_perms(), item); if (is_player(item)) $wiz_utils:unset_player(item); endif "...recreate can fail (:recycle can crash)..."; this:add_orphan(item); $building_utils:recreate(item, $garbage); this:remove_orphan(item); "..."; $wiz_utils:set_owner(item, $hacker); item.name = tostr("Recyclable ", item); move(item, this); . #62:2 e = set_task_perms(caller_perms()); if (typeof(e) == ERR) return e; else val = this:_recreate(@args); return (val == E_NONE) ? create(@args) | val; endif . #62:3 if (caller == this) h = this.history; if ((len = length(h)) > this.nhist) h = h[len - this.nhist..len]; endif this.history = {@h, args}; endif . #62:4 if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this)) for x in (this.history) pname = (valid(x[1]) ? x[1].name | "A recycled player"); oname = (valid(x[2]) ? x[2].name | "recycled"); player:notify(tostr(pname, " (", x[1], ") recycled ", x[2], " (now ", oname, ")")); endfor else player:notify("Sorry."); endif . #62:5 dobj = (valid(dobj) ? dobj | $string_utils:match_object(dobjstr, player.location)); if (!valid(dobj)) dobj = ((n = tonum(dobjstr)) ? toobj(n) | #-1); endif if (!valid(dobj)) player:tell("Couldn't parse ", dobjstr, " as a valid object number."); elseif (!(dobj in this.contents)) player:tell("Couldn't find ", dobj, " in ", this.name, "."); else if (typeof(emsg = this:setup_toad(dobj, player, #1)) != ERR) dobj:moveto(player); dobj.aliases = {dobj.name = ("Object " + tostr(dobj))}; player:tell("You now have ", dobj, " ready for @recreation."); if (this.announce_removal_msg) player.location:announce($string_utils:pronoun_sub(this.announce_removal_msg)); endif else player:tell(emsg); endif endif . #62:6 "this:setup_toad(objnum,new_owner,parent)"; "Called by :_create and :request."; if (caller != this) return E_PERM; endif potential = args[1]; who = args[2]; what = args[3]; if (who.ownership_quota <= 0) return E_QUOTA; else $wiz_utils:set_owner(potential, who); move(potential, #-1); set_task_perms({@callers(), {#-1, "", player}}[2][3]); "... if :initialize crashes..."; this:add_orphan(potential); $building_utils:recreate(potential, what); this:remove_orphan(potential); "... if we don't get this far, the object stays on the orphan list..."; "... orphan list should be checked periodically..."; return potential; endif . #62:7 if (caller == this) this.orphans = setadd(this.orphans, args[1]); endif . #62:8 if (caller == this) this.orphans = setremove(this.orphans, args[1]); endif . #62:9 "Usage: valid(object)"; "True if object is valid and not $garbage."; return valid(args[1]) && (parent(args[1]) != $garbage); . #62:10 this.orphans = {}; this.history = {}; pass(); . #63:0 return ("Garbage object " + tostr(this)) + "."; . #63:1 player:tell(this:description()); . #63:2 return tostr("Recyclable ", this); . #63:3 return; . #64:0 if (i = (args[1] in {"noinclude", "sender"})) return {{{"include", "all"}[i], !args[2]}}; else return {args}; endif . #64:1 "... we'll take anything..."; raw = args[2]; if (raw == 1) "...+@mail => @mailo=new"; return {args[1], "new"}; else return args[1..2]; endif . #64:2 oname = args[1]; raw = args[2]; if (typeof(raw) == LIST) if (length(raw) > 1) return "Too many arguments."; endif raw = raw[1]; elseif (typeof(raw) == NUM) return {oname, raw && ((oname == "manymsgs") ? 20 | 1)}; endif if ((value = $code_utils:tonum(raw)) == E_TYPE) return tostr("`", raw, "'? Number expected."); endif return {oname, value}; . #64:3 oname = args[1]; raw = args[2]; if (typeof(raw) == STR) raw = $string_utils:explode(raw, ","); elseif (typeof(raw) == NUM) return raw ? "You need to give one or more recipients." | {oname, 0}; endif value = $mail_editor:parse_recipients({}, raw); if (value) return {oname, value}; else return "No valid recipients in list."; endif . #64:4 value = this:get(@args); if (value) return {tostr(value), {tostr("Query when asking for ", value, " or more messages.")}}; else return {0, {"Willing to be spammed with arbitrarily many messages/headers"}}; endif . #64:5 value = this:get(@args); if (value) return {value, {"Sticky folders: mail commands default to whatever", "mail collection the previous successful command looked at."}}; else return {0, {"Teflon folders: mail commands always default to `on me'."}}; endif . #64:6 if (value = this:get(@args)) return {"", {tostr("Default message sequence for @mail: ", (typeof(value) == STR) ? value | $string_utils:from_list(value, " "))}}; else return {0, {"Default message sequence for @mail: last:15"}}; endif . #64:7 if (value = this:get(@args)) return {"", {tostr("Default Reply-to: ", $mail_agent:name_list(@value))}}; else return {0, {"No default Reply-to: field"}}; endif . #64:8 if (o = ((name = args[2]) in {"sender", "noinclude"})) args[2] = {"all", "include"}[o]; return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")}; else return pass(@args); endif . #64:9 "... must be object, list of objects, or false..."; value = args[1]; if (typeof(value) == OBJ) return {{value}}; elseif (!this:istype(value, {{OBJ}})) return $string_utils:capitalize("Object or list of objects expected."); else return {value}; endif . #64:10 if (value = this:get(@args)) return {value, {"Have MOO-mail automatically forwarded to me at", "my registered email-address."}}; else return {value, {"Receive MOO-mail here on the MOO."}}; endif "Last modified Tue Jun 1 02:10:08 1993 EDT by Edison@OpalMOO (#200)."; . #64:11 ":check_netmail(value) => Makes sure the email-address is one that can actually be used by $network:sendmail()."; "The actual value sent is not checked since it can only be a boolean flag. The player's .email_address property is what is checked."; "Possible situations where the address would be unusable are when the address is invalid or we can't connect to the site to send mail."; "Returns a string error message if unusable or {value} otherwise."; if (caller != this) return E_PERM; endif if (args[1] && (reason = $network:email_will_fail(player.email_address))) return tostr("Invalid registered .email_address: ", reason); endif return args; . #67:0 ":get(options,name) => returns the value of the option specified by name"; "i.e., if {name,value} is present in options, return value"; " if name is present, return 1"; " otherwise return 0"; if ((name = args[2]) in (options = args[1])) return 1; elseif (a = $list_utils:assoc(name, options)) return a[2]; else return 0; endif . #67:1 ":set(optionlist,oname,value) => revised optionlist or string error message."; "oname must be the full name of an option in .names or .extras."; "Note that values must not be of type ERR. "; "FALSE (0, blank string, or empty list) is always a legal value."; "If a verb :check_foo is defined on this, it will be used to typecheck any"; "non-false or object-type value supplied as a new value for option `foo'."; ""; " :check_foo(value) => string error message or {value to use}"; ""; "If instead there is a property .check_foo, that will give either the expected "; "type or a list of allowed types."; "Otherwise, the option is taken to be a boolean flag and all non-false, "; "non-object values map to 1."; ""; options = args[1]; if (!(((oname = args[2]) in this.names) || (oname in this.extras))) return "Unknown option: " + oname; elseif (typeof(value = args[3]) == ERR) "... no option should have an error value..."; return "Error value"; elseif ((!value) && (typeof(value) != OBJ)) "... always accept FALSE (0, blankstring, emptylist)..."; elseif ($object_utils:has_callable_verb(this, check = ("check_" + oname))) "... a :check_foo verb exists; use it to typecheck the value..."; if (typeof(c = this:(check)(value)) == STR) return c; endif value = c[1]; elseif ($object_utils:has_property(this, tprop = ("type_" + oname))) "... a .type_foo property exists..."; "... property value should be a type or list of types..."; if (!this:istype(value, t = this.(tprop))) return $string_utils:capitalize(this:desc_type(t) + " value expected."); endif elseif ($object_utils:has_property(this, cprop = ("choices_" + oname))) "... a .choices_foo property exists..."; "... property value should be a list of {value,docstring} pairs..."; if (!$list_utils:assoc(value, c = this.(cprop))) return tostr("Allowed values: ", $string_utils:english_list($list_utils:slice(c, 1), "(??)", " or ")); endif else "... value is considered to be boolean..."; if (!value) "... must be an object. oops."; return tostr("Non-object value expected."); endif value = 1; endif "... We now have oname and a value. However, if oname is one of the extras,"; "... then we need to call :actual to see what it really means."; if (oname in this.names) nvlist = {{oname, value}}; elseif ((typeof(nvlist = this:actual(oname, value)) != LIST) || (!nvlist)) return nvlist || "Not implemented."; endif "... :actual returns a list of pairs..."; for nv in (nvlist) oname = nv[1]; value = nv[2]; if (i = ((oname in options) || $list_utils:iassoc(oname, options))) if ((!value) && (typeof(value) != OBJ)) "value == 0, blank string, empty list"; options[i..i] = {}; elseif (value == 1) options[i] = oname; else options[i] = {oname, value}; endif elseif (value || (typeof(value) == OBJ)) options[1..0] = {(value == 1) ? oname | {oname, value}}; endif endfor return options; . #67:2 ":parse(args[,...]) => {oname [,value]} or string error message"; "additional arguments are fed straight through to :parse_* routines."; " <option> <value> => {option, value}"; " <option>=<value> => {option, value}"; " <option> is <value> => {option, value}"; " +<option> => {option, 1}"; " -<option> => {option, 0}"; " !<option> => {option, 0}"; " <option> => {option}"; if (!(words = args[1])) return ""; endif option = words[1]; words[1..1] = {}; if (flag = (option && index("-+!", option[1]))) option[1..1] = ""; endif if (i = index(option, "=")) rawval = option[i + 1..length(option)]; option = option[1..i - 1]; if (i == 1) "... =bar ..."; return "Blank option name?"; elseif (flag) "... +foo=bar"; return "Don't give a value if you use +, -, or !"; elseif (words) "... foo=bar junk"; return $string_utils:from_list(words, " ") + "??"; endif elseif (!option) return "Blank option name?"; elseif (flag) if (words) "... +foo junk"; return "Don't give a value if you use +, -, or !"; endif rawval = ((flag - 1) % 2); else words && ((words[1] == "is") && (words[1..1] = {})); rawval = words; endif "... do we know about this option?..."; if (!(oname = this:_name(strsub(option, "-", "_")))) return tostr((oname == $failed_match) ? "Unknown" | "Ambiguous", " option: ", option); endif "... determine new value..."; if (!rawval) "... `@option foo is' or `@option foo=' ..."; return (rawval == {}) ? {oname} | {oname, 0}; elseif ($object_utils:has_callable_verb(this, pverb = ("parse_" + oname))) return this:(pverb)(oname, rawval, args[2..length(args)]); elseif ($object_utils:has_property(this, cprop = ("choices_" + oname))) return this:parsechoice(oname, rawval, this.(cprop)); elseif (rawval in {0, "0", {"0"}}) return {oname, 0}; elseif (rawval in {1, "1", {"1"}}) return {oname, 1}; else return tostr("Option is a flag, use `+", option, "' or `-", option, "' (or `!", option, "')"); endif . #67:3 ":_name(string) => full option name corresponding to string "; " => $failed_match or $ambiguous_match as appropriate."; if (((string = args[1]) in this.names) || (string in this.extras)) return string; endif char = (namestr = this._namelist)[1]; if (!(i = index(namestr, char + string))) return $failed_match; elseif (i != rindex(namestr, char + string)) return $ambiguous_match; else j = index(namestr[i + 1..length(namestr)], char); return namestr[i + 1..(i + j) - 1]; endif . #67:4 ":add_name(name[,isextra]) adds name to the list of options recognized."; "name must be a nonempty string and must not contain spaces, -, +, !, or =."; "isextra true means that name isn't an actual option (recognized by :get) but merely a name that the option setting command should recognize to set a particular combination of options. Actual options go in .names; others go in .extras"; name = args[1]; isextra = {@args, 0}[2]; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; elseif ((!name) || match(name, "[-!+= ]")) "...name is blank or contains a forbidden character"; return E_INVARG; elseif (name in this.names) "...name is already in option list"; if (isextra) this.names = setremove(this.names, name); this.extras = setadd(this.extras, name); return 1; else return 0; endif elseif (name in this.extras) if (isextra) return 0; else this.names = setadd(this.names, name); this.extras = setremove(this.extras, name); return 1; endif else char = this._namelist[1]; if (isextra) this.extras = setadd(this.extras, name); else this.names = setadd(this.names, name); endif if (!index(this._namelist, (char + name) + char)) this._namelist = tostr(this._namelist, name, char); endif return 1; endif . #67:5 ":remove_name(name) removes name from the list of options recognized."; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; elseif (!(((name = args[1]) in this.names) || (name in this.extras))) "...hmm... already gone..."; return 0; else char = this._namelist[1]; this._namelist = strsub(this._namelist, (char + name) + char, char); this.names = setremove(this.names, name); this.extras = setremove(this.extras, name); return 1; endif . #67:6 ":show(options,name or list of names)"; " => text describing current value of option and what it means"; name = args[2]; if (typeof(name) == LIST) text = {}; for n in (name) text = {@text, @this:show(@listset(args, n, 2))}; endfor return text; elseif (!((name in this.names) || (name in this.extras))) return {"Unknown option: " + name}; elseif ($object_utils:has_callable_verb(this, sverb = ("show_" + name))) r = this:(sverb)(@args); value = r[1]; desc = r[2]; elseif ($object_utils:has_property(this, sverb) && ((value = this:get(args[1], name)) in {0, 1})) desc = this.(sverb)[value + 1]; if (typeof(desc) == STR) desc = {desc}; endif elseif ($object_utils:has_property(this, cprop = ("choices_" + name))) if (!(value = this:get(args[1], name))) desc = this.(cprop)[1][2]; elseif (!(a = $list_utils:assoc(value, this.(cprop)))) return {(name + " has unexpected value ") + $string_utils:print(value)}; else desc = a[2]; endif elseif (name in this.extras) return {name + " not documented (complain)"}; else value = this:get(args[1], name); desc = {"not documented (complain)"}; if (typeof(value) in {LIST, STR}) desc[1..0] = $string_utils:print(value); value = ""; endif endif if (value in {0, 1}) which = ("-+"[value + 1] + name); elseif ((typeof(value) in {OBJ, STR, NUM}) && (value != "")) which = tostr(" ", name, "=", value); else which = (" " + name); endif show = {$string_utils:left(which, this.namewidth) + desc[1]}; for i in [2..length(desc)] show = {@show, $string_utils:space(this.namewidth) + desc[i]}; endfor return show; . #67:7 ":actual(<name>,<value>) => list of {<name>,<value>} pairs or string errormsg"; " corresponding to what setting option <name> to <value> actually means"; " e.g., :actual(\"unfoo\",1) => {{\"foo\",0}}"; " e.g., :actual(\"g7mode\",1) => {{\"splat\",37},{\"baz\",#3}}"; return "Not implemented."; . #67:8 ":istype(value,types) => whether value is one of the given types"; if ((vtype = typeof(value = args[1])) in (types = args[2])) return 1; elseif (vtype != LIST) return 0; else for t in (types) if ((typeof(t) == LIST) && this:islistof(value, t)) return 1; endif endfor endif return 0; . #67:9 ":islistof(value,types) => whether value (a list) has each element being one of the given types"; types = args[2]; for v in (value = args[1]) if (!this:istype(v, types)) return 0; endif endfor return 1; . #67:10 ":desc_type(types) => string description of types"; nlist = {}; for t in (types = args[1]) if (typeof(t) == LIST) if (length(t) > 1) nlist = {@nlist, tostr("(", this:desc_type(t), ")-list")}; else nlist = {@nlist, tostr(this:desc_type(t), "-list")}; endif elseif (t in {NUM, OBJ, STR, LIST}) nlist = {@nlist, {"number", "object", "string", "?", "list"}[t + 1]}; else return "Bad type list"; endif endfor return $string_utils:english_list(nlist, "nothing", " or "); . #67:11 ":parsechoice(oname,rawval,assoclist)"; which = {}; oname = args[1]; rawval = args[2]; choices = $list_utils:slice(args[3], 1); errmsg = tostr("Allowed values for this flag: ", $string_utils:english_list(choices, "(??)", " or ")); if (typeof(rawval) == LIST) if (length(rawval) > 1) return errmsg; endif rawval = rawval[1]; elseif (typeof(rawval) != STR) return errmsg; endif for c in (choices) if (index(c, rawval) == 1) which = {@which, c}; endif endfor if (!which) return errmsg; elseif (length(which) > 1) return tostr(rawval, " is ambiguous."); else return {oname, which[1]}; endif . #68:0 if (i = (args[1] in {"numbers"})) return {{{"nonumbers"}[i], !args[2]}}; else return {args}; endif . #68:1 if (o = ((name = args[2]) in {"numbers"})) args[2] = {"nonumbers"}[o]; return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")}; else return pass(@args); endif . #69:0 this:(this.names[tonum(args[1]) + 1])(); . #69:1 "... hmmm... don't know how to raise E_NONE..."; return E_NONE; . #69:2 "...raise E_TYPE ..."; 1[2]; . #69:3 "...raise E_DIV ..."; 1 / 0; . #69:4 "...raise E_PERM ..."; this.owner.password; . #69:5 "...raise E_PROPNF ..."; this.a; . #69:6 "...raise E_VERBNF ..."; this:a(); . #69:7 "...raise E_VARNF ..."; a; . #69:8 "...raise E_INVIND ..."; #-1.a; . #69:9 move(this, this); . #69:10 "...raise E_MAXREC ..."; this:(verb)(); . #69:11 "...raise E_RANGE ..."; {}[1]; . #69:12 "...raise E_ARGS ..."; tonum(); . #69:13 "...raise E_NACC ..."; move($hacker, this); . #69:14 "...raise E_INVARG ..."; parent(#-1); . #69:15 set_task_perms($no_one); "...raise E_QUOTA ..."; create($thing); . #69:16 return 0; . #69:17 return this.names[tonum(args[1]) + 1]; . #70:0 if (caller_perms().wizard) pass(); "this:rm_message_seq({1, 1 + this:length_all_msgs()})"; "this:expunge_rmm()"; for p in (properties(this)) $command_utils:suspend_if_needed(0); if (p && (p[1] == " ")) delete_property(this, p); endif endfor this.messages = (this.messages_going = {}); this.mail_forward = {player, this}; this.mail_notify = {player}; for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"}) this.(p) = $mail_recipient.(p); endfor this.moderated = 1; else return E_PERM; endif . #71:0 player:tell_lines(this:description()); player:tell($string_utils:pronoun_sub("%S %<is> moving around from room to room, cleaning up.", this)); . #71:1 "$housekeeper:cleanup([insist]) => clean up player's objects. Argument is 'up' or 'up!' for manually requested cleanups (notify player differently)"; if (caller_perms() != this) return E_PERM; endif for object in (this.clean) x = (object in this.clean); if (this.requestors[x] == player) if (result = this:replace(object, @args)) player:tell(result, "."); endif endif $command_utils:suspend_if_needed(0); endfor player:tell("The housekeeper has finished cleaning up your objects."); . #71:2 "replace the object given to its proper spot (if there is one)."; object = args[1]; insist = ((length(args) > 1) && args[2]); notify(this, tostr("cleaning ", object, " task ", task_id(), " insist ", insist)); i = (object in this.clean); if (!i) return tostr(object, " is not on the ", this.name, "'s cleanup list"); endif place = this.destination[i]; if (!(($recycler:valid(object) && ($recycler:valid(place) || (place == #-1))) && (!(object.location in this.recycle_bins)))) "object no longer valid (recycled or something), remove it."; this.clean = listdelete(this.clean, i); this.requestors = listdelete(this.requestors, i); this.destination = listdelete(this.destination, i); return tostr(object) + " is no longer valid, removed from cleaning list"; endif oldloc = (loc = object.location); if (object.location == place) "already in its place"; return ""; endif requestor = this.requestors[i]; if (insist != "up!") for thing in (object.contents) if (thing:is_listening()) return ((("Not returning " + object.name) + " because ") + thing.name) + " is inside"; endif $command_utils:suspend_if_needed(0); endfor if (valid(loc) && (loc != $limbo)) if (loc:is_listening()) return ((("Not returning " + object.name) + " because ") + loc.name) + " is holding it"; endif for y in (loc:contents()) if ((y != object) && y:is_listening()) return (((("Not returning " + object.name) + " because ") + y.name) + " is in ") + loc.name; endif $command_utils:suspend_if_needed(0); endfor endif endif if (valid(place) && (!place:acceptable(object))) return (place.name + " won't accept ") + object.name; endif requestor:tell("As you requested, the housekeeper tidies ", $string_utils:nn(object), " from ", $string_utils:nn(loc), " to ", $string_utils:nn(place), "."); if ($object_utils:has_verb(loc, "announce_all_but")) loc:announce_all_but({requestor, object}, "At ", requestor.name, "'s request, the ", this.name, " sneaks in, picks up ", object.name, " and hurries off to put ", ($object_utils:has_property(object, "po") && (typeof(object.po) == STR)) ? object.po | "it", " away."); endif this:moveit(object, place, requestor); if ((loc = object.location) == oldloc) return (object.name + " wouldn't go; ") + ((!place:acceptable(object)) ? (" perhaps " + $string_utils:nn(place)) + " won't let it in" | ((" perhaps " + $string_utils:nn(loc)) + " won't let go of it")); endif object:tell("The housekeeper puts you away."); if ($object_utils:isa(loc, $room)) loc:announce_all_but({object}, "At ", requestor.name, "'s request, the housekeeper sneaks in, deposits ", object:title(), " and leaves."); else loc:tell("You notice the housekeeper sneak in, give you ", object:title(), " and leave."); endif return ""; . #71:3 if (args) if (!valid(who = args[1])) return; endif player:tell(who.name, "'s personal cleanup list:"); else who = 0; player:tell("Housekeeper's complete cleanup list:"); endif player:tell("------------------------------------------------------------------"); printed_anything = 0; objs = this.clean; reqs = this.requestors; dest = this.destination; for i in [1..length(objs)] $command_utils:suspend_if_needed(2); req = reqs[i]; ob = objs[i]; place = dest[i]; if (((who == 0) || (req == who)) || (ob.owner == who)) if (!valid(ob)) player:tell($string_utils:left(tostr(ob), 7), $string_utils:left("** recycled **", 50), "(", req.name, ")"); else player:tell($string_utils:left(tostr(ob), 7), $string_utils:left(ob.name, 26), "=>", $string_utils:left(tostr(place), 7), place.name || "nowhere", " (", req.name, ")"); endif printed_anything = 1; endif endfor if (!printed_anything) player:tell("** The housekeeper has nothing in the cleanup list."); endif player:tell("------------------------------------------------------------------"); . #71:4 if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; endif what = args[1]; if ((what < #1) || (!valid(what))) return "invalid object"; endif who = ((length(args) > 1) ? args[2] | player); where = ((length(args) > 2) ? args[3] | what.location); if ($object_utils:isa(who, $guest)) return tostr("Guests can't use the ", this.name, "."); endif if (!is_player(who)) return tostr("Non-players can't use the ", this.name, "."); endif if (!valid(where)) return tostr("The ", this.name, "doesn't know how to find ", where, " in order to put away ", what.name, "."); endif if (is_player(what)) return ("The " + this.name) + " doesn't do players, except to cart them home when they fall asleep."; endif for x in (this.eschews) if ($object_utils:isa(what, x[1])) ok = 0; for y in [3..length(x)] if ($object_utils:isa(what, x[y])) ok = 1; endif endfor if (!ok) return tostr("The ", this.name, " doesn't do ", x[2], "!"); endif endif endfor if ($object_utils:has_callable_verb(where, "litterp") ? where:litterp(what) | ((where in this.public_places) && (!(what in where.residents)))) return tostr("The ", this.name, " won't litter ", where.name, "!"); endif if (i = (what in this.clean)) if ((!this:controls(i, who)) && valid(this.destination[i])) return tostr(this.requestors[i].name, " already asked that ", what.name, " be kept at ", this.destination[i].name, "!"); endif this.requestors[i] = who; this.destination[i] = where; else this.clean = {what, @this.clean}; this.requestors = {who, @this.requestors}; this.destination = {where, @this.destination}; endif return tostr("The ", this.name, " will keep ", what.name, " (", what, ") at ", valid(where) ? ((where.name + " (") + tostr(where)) + ")" | where, "."); . #71:5 if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; endif what = args[1]; who = ((length(args) > 1) ? args[2] | player); if (i = (what in this.clean)) if (!this:controls(i, who)) return tostr("You may remove an object from ", this.name, " list only if you own the object, the place it is kept, or if you placed the original cleaning order."); endif this.clean = listdelete(this.clean, i); this.destination = listdelete(this.destination, i); this.requestors = listdelete(this.requestors, i); return tostr(what.name, " (", what, ") removed from cleanup list."); else return tostr(what.name, " not in cleanup list."); endif . #71:6 "does player control entry I?"; i = args[1]; who = args[2]; if ((who in {this.owner, @this.owners}) || who.wizard) return "Yessir."; endif i = args[1]; cleanable = this.clean[i]; if (this.requestors[i] == who) return "you asked for the previous result, you can change this one."; elseif (((who == cleanable.owner) || (!valid(dest = this.destination[i]))) || (who == dest.owner)) return "you own the object or the place where it is being cleaned to, or the destination is no longer valid."; else return ""; endif . #71:7 "start the housekeeper cleaning continuously. Kill any previous continuous"; "task. Not meant to be called interactively."; if (!$perm_utils:controls(caller_perms(), this)) return E_PERM; endif if (this.task) taskn = this.task; this.task = 0; kill_task(taskn); endif fork taskn (0) while (1) for x in (this.clean) fork (0) this:replace(x); endfork suspend(this.testing ? 2 | this:time()); endfor suspend(5); this:litterbug(); endwhile endfork this.task = taskn; . #71:8 for room in (this.public_places) for thingy in (room.contents) suspend(10); litter = 0; if (((thingy.location == room) && this:is_litter(thingy)) && (!this:is_watching(thingy, #-1))) "if it is litter and no-one is watching"; fork (0) this:send_home(thingy); endfork suspend(0); endif endfor endfor . #71:9 return valid(thing = args[1]) && thing:is_listening(); . #71:10 if (caller != this) return E_PERM; endif litter = args[1]; littering = litter.location; this:ejectit(litter, littering); home = litter.location; if ($object_utils:isa(home, $room)) home:announce_all("The ", this.name, " sneaks in, deposits ", litter:title(), " and leaves."); else home:tell("You notice the ", this.name, " sneak in, give you ", litter:title(), " and leave."); endif if ($object_utils:has_callable_verb(littering, "announce_all_but")) littering:announce_all_but({litter}, "The ", this.name, " sneaks in, picks up ", litter:title(), " and rushes off to put it away."); endif . #71:11 "Wizardly verb to move object with requestor's permission"; if (caller != this) return E_PERM; else set_task_perms(player = args[3]); return args[1]:moveto(args[2]); endif . #71:12 "this:ejectit(object,room): Eject args[1] from args[2]. Callable only by housekeeper's quarters verbs."; if (caller == this) args[2]:eject(args[1]); endif . #71:13 what = args[1]; if (!(where = (what in this.clean))) return 0; else return {this.destination[where], this.requestors[where]}; endif . #71:14 thingy = args[1]; for x in (this.litter) if ($object_utils:isa(thingy, x[1]) && (!$object_utils:isa(thingy, x[2]))) return 1; endif endfor return 0; . #71:15 if (caller_perms().wizard) this.password = "Impossible password to type"; this.litter = {}; this.public_places = {}; this.requestors = {}; this.destination = {}; this.clean = {}; this.eschews = {}; this.recycle_bins = {}; this.cleaning = #-1; this.task = 0; this.owners = {#2}; pass(@args); endif . #71:16 count = 0; for i in (this.requestors) if (i == player) count = (count + 1); endif $command_utils:suspend_if_needed(1); endfor player:tell("Number of items in cleanup list: ", tostr(length(this.clean))); player:tell("Number of items you requested to be tidied: ", tostr(count)); player:tell("Number of requestors: ", tostr(length($list_utils:remove_duplicates(this.requestors)))); player:tell("Time to complete one cleaning circuit: ", $time_utils:english_time(length(this.clean) * this:time())); . #71:17 "return a string status if the hosuekeeper is cleaning this object"; cleanable = args[1]; info = this:is_object_cleaned(cleanable); if (info == 0) return tostr(cleanable.name, " is not cleaned by the ", this.name, "."); else return tostr(cleanable.name, " is kept tidy at ", info[1].name, " (", info[1], ") at ", info[2].name, "'s request."); endif . #71:18 "Returns the amount of time to suspend between objects while continuous cleaning."; "Currently set to try to complete cleaning circuit in one hour, but not exceed one object every 20 seconds."; return max(20, 3600 / length(this.clean)); . #71:19 return caller == this; . #72:0 "Given an email address, return {userid, site}."; "Valid addresses are of the form `userid[@site]'."; "At least for now, if [@site] is left out, site will be returned as blank."; "Should be a default address site, or something, somewhere."; address = args[1]; return (at = index(address, "@")) ? {address[1..at - 1], address[at + 1..length(address)]} | {address, ""}; . #72:1 "given a site, try to figure out what the `local' domain is."; "if site has a @ or a % in it, give up and return E_INVARG."; "blank site is returned as is; try this:local_domain(this.localhost) for the answer you probably want."; site = args[1]; if (index(site, "@") || index(site, "%")) return E_INVARG; elseif (match(site, "^[0-9.]+$")) return E_INVARG; elseif (!site) return ""; elseif (!(dot = rindex(site, "."))) dot = rindex(site = this.site, "."); endif if ((!dot) || (!(dot = rindex(site[1..dot - 1], ".")))) return site; else domain = site[dot + 1..length(site)]; site = site[1..dot - 1]; while (site && (domain in this.large_domains)) if (dot = rindex(site, ".")) domain = tostr(site[dot + 1..length(site)], ".", domain); site = site[1..dot - 1]; else return tostr(site, ".", domain); endif endwhile return domain; endif . #72:2 ":open(address, port, [connect-connection-to])"; "Open a network connection to address/port. If the connect-connection-to is passed, then the connection will be connected to that object when $login gets ahold of it. If not, then the connection is just ignored by $login, i.e. not bothered by it with $welcome_message etc."; "The object specified by connect-connection-to has to be a player (though it need not be a $player)."; "Returns the (initial) connection or an error, as in open_network_connection"; if (!this:trust(caller_perms())) return E_PERM; endif address = args[1]; port = args[2]; if (length(args) < 3) connect_to = $nothing; elseif ((typeof(connect_to = args[3]) == OBJ) && (valid(connect_to) && is_player(connect_to))) else return E_INVARG; endif if (typeof(connection = open_network_connection(address, port)) != ERR) this.open_connections = {@this.open_connections, connection}; if (valid(connect_to)) this.connect_connections_to = {@this.connect_connections_to, {connection, connect_to}}; endif endif return connection; . #72:3 if (!this:trust(caller_perms())) return E_PERM; endif con = args[1]; boot_player(con); this.ignore = setremove(this.ignore, con); $network.open_connections = setremove($network.open_connections, con); if (i = $list_utils:iassoc(con, $network.connect_connections_to)) $network.connect_connections_to = listdelete($network.connect_connections_to, i); endif return 1; . #72:4 "sendmail(to, subject, line1, line2, ...)"; " sends mail to internet address 'to', with given subject."; " It fills in various fields, such as date, from (from player), etc."; " the rest of the arguments are remaining lines of the message, and may begin with additional header fields."; " (must match RFC822 specification)."; "Requires $network.trust to call (no anonymous mail from MOO)."; "Returns 0 if successful, or else error condition or string saying why not."; if (!this:trust(caller_perms())) return E_PERM; endif mooname = this.MOO_name; mooinfo = tostr(mooname, " (", this.site, " ", this.port, ")"); if (reason = this:invalid_email_address(to = args[1])) return reason; endif return this:raw_sendmail(to, "Date: " + ctime(), "From: " + this:return_address_for(player), "To: " + to, "Subject: " + args[2], "X-Mail-Agent: " + mooinfo, @args[3..length(args)]); . #72:5 return (who = args[1]).wizard || (who in this.trusts); . #72:6 if (caller_perms().wizard) pass(@args); this.active = 0; this.reply_address = "moomailreplyto@yourhost"; this.site = "yoursite"; this.postmaster = "postmastername@yourhost"; this.MOO_name = "YourMOO"; this.maildrop = "localhost"; this.port = 7777; this.large_domains = {}; this.trusts = {}; this.open_connections = (this.connect_connections_to = (this.ignore = {})); endif . #72:7 "rawsendmail(to, @lines)"; "sends mail without processing. Returns 0 if successful, or else reason why not."; if (!caller_perms().wizard) return E_PERM; endif if (!this.active) return "Networking is disabled."; endif debugging = this.debugging; address = args[1]; body = listdelete(args, 1); data = {"HELO " + this.site, ("MAIL FROM:<" + this.postmaster) + ">", ("RCPT TO:<" + address) + ">", "DATA"}; blank = 0; for x in (body) $command_utils:suspend_if_needed(0); if (!(blank || match(x, "[a-z0-9-]*: "))) if (x) data = {@data, ""}; endif blank = 1; endif data = {@data, (x == ".") ? "." + x | x}; endfor data = {@data, ".", "QUIT", ""}; suspend(0); target = $network:open(this.maildrop, 25); if (typeof(target) == ERR) return tostr("Cannot open connection to maildrop ", this.maildrop, ": ", target); endif fork (0) for line in (data) $command_utils:suspend_if_needed(0); if (debugging) notify(this.owner, "SEND:" + line); endif notify(target, line); endfor endfork expect = {"2", "2", "2", "2", "3", "2"}; while (expect && (typeof(line = read(target)) != ERR)) if (line) if (debugging) notify(this.owner, "GET: " + line); endif if (!index("23", line[1])) $network:close(target); return line; "error return"; else if (line[1] != expect[1]) expect = {@expect, "2", "2", "2", "2", "2"}; else expect = listdelete(expect, 1); endif endif endif endwhile $network:close(target); return 0; . #72:8 "invalid_email_address(email) -- check to see if email looks like a valid email address. Return reason why not."; address = args[1]; if (!address) return "no email address supplied"; endif if (!(at = rindex(address, "@"))) return ("'" + address) + "' contains no @"; endif name = address[1..at - 1]; host = address[at + 1..length(address)]; if (!match(host, $network.valid_host_regexp)) return tostr("'", host, "' doesn't look like a valid internet host"); endif if (!match(name, $network.valid_email_regexp)) return tostr("'", name, "' doesn't look like a valid user name for internet mail"); endif return ""; . #72:9 return match(args[1], this.valid_host_regexp) ? "" | tostr("'", args[1], "' doesn't look like a valid internet host name"); . #72:10 ":email_will_fail(email-address[, display?]) => Makes sure the email-address is one that can actually be used by $network:sendmail()."; reason = this:invalid_email_address(args[1]); if (reason && {@args, 0}[2]) player:tell("Invalid email address: ", reason); endif return reason; "following is code from OpalMOO, not used here"; "Possible situations where the address would be unusable are when the address is invalid or we can't connect to the site to send mail."; "If <display> is true, error messages are displayed to the player and 1 is returned when address is unuable. If <display> is false and address is unusable, the error message is returned. If the address is usable, 0 is always returned."; if (!this:approved_for_network(caller_perms())) return E_PERM; endif if (!this:valid_email_address(email = args[1])) msg = tostr("Your email address (", email, ") is not a usable account."); elseif ((result = this:verify_email_address(email)) == E_INVARG) msg = tostr("Unable to connect to ", this:parse_address(email)[2], "."); elseif (typeof(result) == STR) msg = tostr("The site ", (parse = this:parse_address(email))[2], " does not recognize ", parse[1], " as a valid account."); else return 0; endif if ({@args, 0}[2]) player:tell(msg); return 1; else return msg; endif "Last modified Tue Jun 15 00:19:01 1993 EDT by Ranma (#200)."; . #72:11 "useful only for players who own objects that they connect with o_n_c"; if (((this:trust(caller_perms()) && valid(x = args[1])) && (x.owner = caller_perms())) && (x.owner != x)) return read(x); else return E_PERM; endif . #72:12 ":is_open(object)"; "return true if the object is somehow connected, false otherwise."; return typeof(idle_seconds(@args)) == NUM; "Relies on test in idle_seconds, and the fact that the verb is !d"; . #72:13 "Peer at an incoming connection. Decide if it should be connected to something, return that object. Called only by #0:do_login_command"; if (caller != #0) return; endif what = args[1]; if (what in this.open_connections) if (ct = $list_utils:iassoc(what, this.connect_connections_to)) this.connect_connections_to = setremove(this.connect_connections_to, ct); return ct[2]; elseif (what in this.ignore) this:close(what); return -1; else this.ignore = setadd(this.ignore, what); return 1; endif else return 0; endif . #72:14 ":return_address_for(player) => string of 'return address'. Currently inbound mail doesn't work, so this is a bogus address."; who = args[1]; return tostr("(", who.name, ") ", tonum(who), "@", this.moo_name, ".moo.mud.org"); . #73:0 ":_make(...) => new node with value {...}"; if (!(caller in {this._mgr, this})) return E_PERM; endif prop = this:_genprop(); add_property(this, prop, args, {$generic_biglist_home.owner, ""}); return prop; . #73:1 ":_kill(node) destroys the given node."; if (!(caller in {this, this._mgr})) return E_PERM; endif delete_property(this, args[1]); . #73:2 return (caller == this._mgr) ? this.(args[1]) | E_PERM; . #73:3 return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM; . #73:4 gp = this._genprop; ngp = ""; for i in [1..length(gp)] if (gp[i] != "z") ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[strcmp(gp[i], "`")]) + gp[i + 1..length(gp)]); return " " + (this._genprop = ngp); endif ngp = (ngp + "a"); endfor return " " + (this._genprop = (ngp + "a")); . #73:5 "this is a dummy. You have to decide what your leaves are going to look like and then write this verb accordingly. It should, given a leaf/list-element, return the corresponding key value. So for an ordinary alist, where all of the leaves are of the form {key,datum}, you want:"; return args[1][1]; . #74:0 all_help = this.help_msg; if (typeof(all_help) == STR) all_help = {all_help}; endif helpless = {}; for vrb in (this.feature_verbs) if (loc = $object_utils:has_verb(this, vrb)) loc = loc[1]; help = $code_utils:verb_documentation(loc, vrb); if (help) all_help = {@all_help, "", tostr(loc, ":", verb_info(loc, vrb)[3]), @help}; else helpless = {@helpless, vrb}; endif endif endfor if (helpless) all_help = {@all_help, "", ("No help found on " + $string_utils:english_list(helpless, "nothing", " or ")) + "."}; endif return {@all_help, "----"}; . #74:1 "Definition from #1"; desc = this:description(); if (desc) player:tell_lines(desc); else player:tell("You see nothing special."); endif player:tell("Please type \"help ", this, "\" for more information."); . #74:2 "Proper usage for the Generic Feature Object:"; ""; "First of all, the Generic Feature Object is constructed with the idea"; "that its children will be @moved to #24300, which is kind of a warehouse"; "for feature objects. If there's enough interest, I'll try to make the"; "stuff that works with that in mind optional."; ""; "Make a short description. This is so I can continue to have looking at"; "#24300 give the descriptions of each of the objects in its .contents."; "The :look_msg automatically includes a pointer to `help <this object>',"; "so you don't have to."; ""; "Put a list of the commands you want people to use in"; "<this object>.feature_verbs. (You need to use the :set_feature_verbs"; "verb to do this.)"; ""; "When someone types `help <this object>', they will be told the comment"; "strings from each of the verbs named in .feature_verbs."; . #74:3 return this in args[1].features; . #74:4 if ($perm_utils:controls(caller_perms(), this) || (caller == this)) return this.feature_ok = args[1]; else return E_PERM; endif . #74:5 "Can't see `get' unless it's in the room; can't see `drop' unless it's in the player. Should possibly go on $thing."; "Should use :contents, but I'm in a hurry."; hidden = pass(@args); if (this.location != args[1]) hidden = setadd(hidden, {$thing, verb_info($thing, "drop")[3], {"this", "none", "none"}}); hidden = setadd(hidden, {$thing, verb_info($thing, "give")[3], {"this", "at/to", "any"}}); endif if (this.location != args[1].location) hidden = setadd(hidden, {$thing, verb_info($thing, "get")[3], {"this", "none", "none"}}); endif return hidden; . #74:6 if ($perm_utils:controls(caller_perms(), this) || (caller == this)) return this.feature_verbs = args[1]; else return E_PERM; endif . #74:7 if ((caller == this) || $perm_utils:controls(caller_perms(), this)) pass(@args); this.feature_verbs = {}; else return E_PERM; endif . #75:0 "Usage: get_now(site, port, message)"; "Returns a list of strings, or an error if we couldn't connect."; host = args[1]; port = args[2]; if (!this:trusted(caller_perms())) return E_PERM; elseif ((!match(host, $network.valid_host_regexp)) && (!match(host, "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+"))) "allow either welformed internet hosts or explicit IP addresses."; return E_INVARG; elseif (((port != 70) && (port != 80)) && (port < 100)) "disallow connections to low number ports; necessary?"; return E_INVARG; endif opentime = time(); con = $network:open(args[1], args[2]); opentime = (time() - opentime); if (typeof(con) == ERR) return con; endif notify(con, args[3]); results = {}; count = this.limit; "perhaps this isn't necessary, but if a gopher source is slowly spewing things, perhaps we don't want to hang forever -- perhaps this should just fork a process to close the connection instead?"; now = time(); timeout = 30; end = "^%.$"; if ((length(args) == 4) && (args[4][1] == "2")) end = "^[2-9]"; endif while ((((typeof(string = read(con)) == STR) && (!match(string, end))) && ((count = (count - 1)) > 0)) && ((now + timeout) > (now = time()))) if (string && (string[1] == ".")) string = string[2..length(string)]; endif results = {@results, string}; endwhile $network:close(con); if (opentime > 0) "This is to keep repeated calls to $network:open to 'slow responding hosts' from totally spamming."; suspend(0); endif return results; . #75:1 "parse gopher result line:"; "return {host, port, tag, label}"; "host/port/tag are what you send to the gopher server to get that line"; "label is <type>/human readable entry"; string = args[1]; tab = index(string, " "); label = string[1..tab - 1]; string = string[tab + 1..length(string)]; tab = index(string, " "); tag = string[1..tab - 1]; string = string[tab + 1..length(string)]; tab = index(string, " "); host = string[1..tab - 1]; string = string[tab + 1..length(string)]; tab = index(string, " "); port = tonum(tab ? string[1..tab - 1] | string); return {host, port, tag, label}; "ignore extra material after port, if any"; . #75:2 "$gopher:show_text(who, start, end, ..node..)"; "like who:notify_lines($gopher:get(..node..)[start..end]), but pipelined"; if (!caller_perms().wizard) return E_PERM; endif who = args[1]; start = args[2]; end = args[3]; args = args[4..length(args)]; con = $network:open(args[1], args[2]); if (typeof(con) == ERR) player:tell("Sorry, can't get this information now."); return; endif notify(con, args[3]); read(con); "initial blank line"; line = 0; sent = 0; end = (end || this.limit); while (((string = read(con)) != ".") && (typeof(string) == STR)) line = (line + 1); if ((line >= start) && ((!end) || (line <= end))) sent = (sent + 1); if (valid(who)) if (string && (string[1] == ".")) string = string[2..length(string)]; endif who:notify(string); else notify(who, string); endif endif endwhile $network:close(con); return sent; . #75:3 type = args[1]; if (type == "1") return "menu"; elseif (type == "?") return "menu?"; elseif (type == "0") return "text"; elseif (type == "7") return "search"; elseif (type == "9") return "binary"; elseif (type == "2") return "phone directory"; elseif (type == "4") return "binhex"; elseif (type == "8") return "telnet"; elseif (type == "I") return "image"; elseif (type == " ") "not actually gopher protocol: used by 'goto'"; return ""; else return "unknown"; endif "not done, need to fill out"; . #75:4 "return a 'nice' string showing the information in a gopher node"; if (typeof(parse = args[1]) == STR) parse = this:parse(parse); endif if (parse[1] == "!") return {"[remembered set]", "", ""}; endif if (length(parse) > 3) label = parse[4]; if (label) type = $gopher:type(label[1]); label = label[2..length(label)]; if (type == "menu") elseif (type == "search") label = ((("<" + parse[3][rindex(parse[3], " ") + 1..length(parse[3])]) + "> ") + label); else label = ((type + ": ") + label); endif else label = "(top)"; endif else label = (parse[3] + " (top)"); endif port = ""; if (parse[2] != 70) port = tostr(" ", parse[2]); endif return {tostr("[", parse[1], port, "]"), label, parse[3]}; . #75:5 "Usage: get(site, port, selection)"; "returns a list of strings, or an error if it couldn't connect. Results are cached."; request = args[1..3]; while ((index = (request in this.cache_requests)) && (this.cache_times[index] > time())) if (typeof(result = this.cache_values[index]) != NUM) return result; endif if ($code_utils:task_valid(result)) "spin, let other process getting same data win, or timeout"; suspend(1); else "well, other process crashed, or terminated, or whatever."; this.cache_times[index] = 0; endif endwhile if (!this:trusted(caller_perms())) return E_PERM; endif while (this.cache_times && (this.cache_times[1] < time())) $command_utils:suspend_if_needed(0); this.cache_times = listdelete(this.cache_times, 1); this.cache_values = listdelete(this.cache_values, 1); this.cache_requests = listdelete(this.cache_requests, 1); "caution: don't want to suspend between test and removal"; endwhile $command_utils:suspend_if_needed(0); this:cache_entry(@request); value = this:get_now(@args); $command_utils:suspend_if_needed(0); index = this:cache_entry(@request); this.cache_times[index] = (time() + ((typeof(value) == ERR) ? 120 | 1800)); this.cache_values[index] = value; return value; . #75:6 if (!this:trusted(caller_perms())) return E_PERM; endif if (!args) this.cache_values = (this.cache_times = (this.cache_requests = {})); elseif (index = (args[1..3] in this.cache_requests)) this.cache_requests = listdelete(this.cache_requests, index); this.cache_times = listdelete(this.cache_times, index); this.cache_values = listdelete(this.cache_values, index); endif . #75:7 "unparse(host, port, tag, label) => string"; host = args[1]; port = args[2]; tag = args[3]; label = args[4]; if (tab = index(tag, " ")) "remove search terms from search nodes"; tag = tag[1..tab - 1]; endif return tostr(label, " ", tag, " ", host, " ", port); . #75:8 "return an explanation for a 'false' $gopher:get result"; value = args[1]; if (value == E_INVARG) return "That gopher server is not reachable or is not responding."; elseif (value == E_QUOTA) return "Gopher connections cannot be made at this time because of system resource limitations!"; elseif (typeof(value) == ERR) return tostr("The gopher request results in an error: ", value); else return "The gopher request has no results."; endif . #75:9 "default -- gopher trusts everybody"; return 1; . #75:10 "_textp(parsed node)"; "Return true iff the parsed info points to a text node."; return index("02", args[1][4][1]); . #75:11 "_mail_text(parsed node)"; "Return the text to be mailed out for the given node."; where = args[1]; if (this:_textp(where)) return $gopher:get(@where); else text = {}; for x in ($gopher:get(@where)) parse = $gopher:parse(x); sel = parse[4]; text = {@text, "Type=" + sel[1], "Name=" + sel[2..length(sel)], "Path=" + parse[3], "Host=" + parse[1], "Port=" + tostr(parse[2]), "#"}; endfor return text; endif . #75:12 if (caller_perms().wizard) this:clear_cache(); pass(@args); endif . #75:13 "Just for debugging -- shows what's in the gopher cache"; req = this.cache_requests; tim = this.cache_times; val = this.cache_values; "save values in case cache changes while printing"; player:tell("size -- expires -- host (port) ------ selector ------------"); for i in [1..length(req)] re = req[i]; host = $string_utils:left(re[1] + ((re[2] == 70) ? "" | tostr(" (", re[2], ")")), 24); expires = $string_utils:right($time_utils:dhms(tim[i] - time()), 8); va = val[i]; if (typeof(va) == LIST) va = length(va); elseif (typeof(va) == ERR) va = $error:name(va); else va = tostr(va); endif selector = re[3]; if (length(selector) > 40) selector = ("..." + selector[length(selector) - 37..length(selector)]); endif player:tell($string_utils:right(va, 8), expires, " ", host, selector); endfor player:tell("--- end cache display -------------------------------------"); . #75:14 "Usage: get_cache(site, port, selection)"; "return current cache"; request = args[1..3]; if (index = (request in this.cache_requests)) if (this.cache_times[index] > now) return this.cache_values[index]; endif endif return 0; . #75:15 if (index = (args in this.cache_requests)) return index; else this.cache_times = {@this.cache_times, time() + 240}; this.cache_values = {@this.cache_values, task_id()}; this.cache_requests = {@this.cache_requests, args}; return length(this.cache_requests); endif . #75:16 return this:description(); . #76:0 ":open()"; "open a network connection to the NNTP server specified by this.host and this.port."; if (caller != this) return E_PERM; endif connexion = $network:open(this.host, this.port); if (typeof(connexion) == ERR) this:log_error("open", connexion); return connexion; endif "the server should always open with a `200 ...' message."; "this snarfs that message, so's it doesn't end up in an article"; line = this:read_line(connexion); if ((!line) || (line[1] != "2")) this:log_error("init", line); return E_INVARG; endif return connexion; . #76:1 ":article(connection,article)"; ":head(connection,article)"; ":body(connection,article)"; if (caller != this) return E_PERM; endif "fetch an article, given a connection and an aritcle ID in one of two forms:"; "either `usenet.group.name article-number', or `<message-id>'"; conn = args[1]; if (typeof(article = this:check_id(args[2])) == ERR) return E_INVARG; endif if (cachecheck = this:check_cache(article, verb)) return cachecheck; endif if (typeof(article) == LIST) this:send_line(conn, "GROUP " + article[1]); line = this:read_line(conn); if (line[1] != "2") this:log_error("group", line); return E_INVARG; endif this:send_line(conn, (verb + " ") + article[2]); line = this:read_line(conn); if (line[1] != "2") this:log_error(verb, line); return E_INVARG; endif text = this:nntp_read(conn); if (typeof(text) == LIST) this:insert_cache(article, verb, text); endif return text; else this:send_line(conn, (verb + " ") + article); line = this:read_line(conn); if (line[1] != "2") this:log_error(verb, line); return E_INVARG; endif text = this:nntp_read(conn); if (typeof(text) == LIST) this:insert_cache(article, verb, text); endif return text; endif . #76:2 "checks to see if the argument (a string) is a valid article indentifier"; "Article identifiers are one of the following forms:"; " <message-id> -- with brackets"; " groupname n -- where groupname is like alt.pea.pickers and n is an artcle number"; " groupname:n -- similar"; "for the first form, the message ID is returned as a string"; "For the other forms, it returns a list {groupname, n}, where groupname is the string and n is the number"; if (match(args[1], "^<.*>$")) "match a single message ID"; return args[1]; elseif (matched = match(args[1], "%([a-zA-Z0-9_-+.]%)+[: ]%([0-9]+%)")) "Match groupname:n"; return {args[1][1..matched[3][1][2]], args[1][matched[3][2][1]..matched[3][2][2]]}; else return E_INVARG; endif . #76:3 "read an NNTP body, body being defined as something that ends with a period on a blank line. expects a connection to read from."; if (caller != this) return E_PERM; endif server = args[1]; article = {}; count = this.line_limit; now = time(); while (((typeof(line = this:read_line(server)) != ERR) && ((count = (count - 1)) > 0)) && ((now + this.timeout) > (now = time()))) if (line && (line[1] == ".")) if (line == ".") return article; endif article = {@article, line[2..length(line)]}; else article = {@article, line}; endif endwhile if (count == 0) while ((line = this:read_line(server)) != ".") endwhile return {@article, "<<Article exceeds maximum length. Truncated.>>"}; elseif (typeof(line) == ERR) return line; else "the connection is losing. throw it away."; this:close(server); return E_INVARG; endif . #76:4 if (caller_perms().wizard) this.host = ""; this.port = 119; this:flush_cache(); this.error_log = {}; this.debug = 0; this.connections = {}; this.in_use = {}; this.connect_max = 0; this.last_groups_update = 100000000; this.newsgroups = {}; this.cache_limit = 10; this.line_limit = 2000; this.timeout = 30; this.distributions = {}; this.expiry = 432000; if (this.expire_task) $code_utils:task_valid(this.expire_task) && kill_task(this.expire_task); this.expire_task = 0; endif this.expire_delay = 172800; pass(@args); endif . #76:5 "quit from the NNTP server and close the passed connection."; if (caller != this) return E_PERM; endif "Use release_connection instead"; this:send_line(args[1], "QUIT"); $network:close(args[1]); this.in_use = setremove(this.in_use, args[1]); . #76:6 ":Fetch_article(article_id)"; ":fetch_body(article_id)"; ":fetch_head(article_id)"; "This function fetches the article referred to by article-id from an NNTP server."; "The article-id may be any of the forms accepted by check_id"; "When fetching headers or complete articles, it will often be useful to pass the header of the article to :fixup_headers(), which will attempt to join multiline headers into single lines"; if (typeof(connection = this:get_connection()) != ERR) text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, args[1]); this:release_connection(connection); return text; else return connection; endif . #76:7 "Update the groups list stored on the NNTP object. This list is used in determining which groups are valid for registration, and should be run regularly."; "This command may take some time to execute."; if (!$perm_utils:controls(player, this)) return E_PERM; endif connection = this:get_connection(); if (typeof(connection) != ERR) notify(connection, "NEWGROUPS " + $time_utils:time_sub(this.timeformat, this.last_groups_update)); line = read(connection); if (line[1] != "2") this:log_error("update", line); return E_TYPE; endif groups = this:nntp_read(connection); this:release_connection(connection); if (typeof(groups) == LIST) for froup in (groups) $command_utils:suspend_if_needed(0); this.newsgroups = {@this.newsgroups, $string_utils:explode(froup)[1]}; endfor player:tell(("Newsgroup update procedure added " + tostr(length(groups))) + " newsgroup(s)"); this.last_groups_update = time(); else player:tell("An error occurred updating the list of newsgroups."); this:log_error("update-read", groups); return groups; endif endif . #76:8 "#33339:fixup_headers({header-text})"; "This function takes the header of an nntp article (as a list of strings) and joins multiline headers into single lines. It does no cleanup on the result, so there may be extra spaces in the output, which is a list of strings."; "this may break if the first line isn't really a header."; result = {}; for line in (args[1]) if (index(line, ":") && index($string_utils.alphabet, $string_utils:lowercase(line[1]))) "hokey, but technically it's the most accurate check we're allowed."; result = {@result, line}; else result[length(result)] = (result[length(result)] + line); endif endfor return result; . #76:9 "$NNTP maintains a list of open, available connections."; "This verb returns a connection from that list, and removes the connection from the list of actives, adding it to a list of in-use connections."; "The maximum number of connections is maintained by this.connect_max."; "If this.connect_max is 0, there is no limit to the number of connections."; "If no connections are available, return E_RANGE."; if (caller != this) return E_PERM; endif if (this.connections) "A connection is available..."; connect = this.connections[1]; this.connections = setremove(this.connections, connect); if (!$network:is_connected(connect)) "The connection is defunct. scrap it and get a new one."; connect = this:open(); endif else "No connection is available. If there's space for it (or we're"; "not enforcing limits,) create a new connection and add it to"; "this.in_use."; if ((!this.connect_max) || (length(this.in_use) < this.connect_max)) connect = this:open(); else "Whoops. can't get a connection."; return E_RANGE; endif endif if (typeof(connect) != ERR) "just in case the connection failed."; this.in_use = {@this.in_use, connect}; endif return connect; . #76:10 "#33339:release_connection(connection)"; "Release_connection frees a connection obtained with get_connection()."; "It is assumed that any connection requested will eventually be released."; if (caller != this) return E_PERM; endif if (args[1] in this.in_use) this.in_use = setremove(this.in_use, args[1]); endif this.connections = {args[1], @this.connections}; . #76:11 ":post(newsgroup(s), subject, lines, distributions)"; "Post an article to news."; "Newsgroup(s) should either be a string or a list of strings."; "Subject should be a string."; "Lines should be a list of strings."; "Distributions should either be a string or a list of strings containing valid distributions."; "returns 0 if successful, otherwise error or error string"; if (!this:posting_ok(caller_perms())) return E_PERM; endif if (typeof(args[1]) == LIST) newsgroups = $string_utils:from_list(args[1], ", "); else newsgroups = args[1]; endif subject = args[2]; body = {}; for line in (args[3]) body = {@body, (line[1] == ".") ? "." + line | line}; endfor if (length(args) == 4) if (typeof(args[4]) == LIST) distribution = $string_utils:from_list(args[4], ", "); else distribution = args[4]; endif else distribution = ""; endif from = $network:return_address_for(player); reply_to = from; path = (($network.moo_name + "!") + player.name); organization = tostr($network.moo_name, ", ", $network.site, " ", $network.port); date = ctime(); "-----"; "Begin conversations with the server:"; player:tell("Connecting to the NNTP server at ", this.host); if (typeof(connect = this:get_connection()) == ERR) player:tell("Failed to connect: ", connect); return connect; endif player:tell("Initiating POST"); this:send_line(connect, "POST"); line = this:read_line(connect); if (line[1..3] == "440") this:release_connection(connect); player:tell("Posting to this site refused: ", line); return E_PERM; endif player:tell("Sending post..."); "send headers"; this:send_line(connect, "Path: " + path); this:send_line(connect, "From: " + from); this:send_line(connect, "Reply-to: " + reply_to); this:send_line(connect, "Newsgroups: " + newsgroups); player:tell("Newsgroups: " + newsgroups); if (distribution) this:send_line(connect, "Distribution: " + distribution); endif this:send_line(connect, "Subject: " + subject); this:send_line(connect, "Date: " + date); this:send_line(connect, "Organization: " + organization); this:send_line(connect, ""); for line in (body) this:send_line(connect, line); endfor this:send_line(connect, "."); line = this:read_line(connect); this:release_connection(connect); if (line[1] == "4") this:log_error(verb, line); return E_INVARG; endif player:tell("NNTP Posting complete."); return 0; . #76:12 return this.posting_allowed && (args[1].wizard || (args[1] in this.posting_ok)); . #76:13 "cache maintenance for NNTP."; "return an item if it's in the cache, {} otherwise."; "args[1] should be an article reference, args[2] one of head, body,"; "or article."; if (tmp = ({args[1], args[2]} in this.cache_requests)) if (tmp != 1) "got a hit. move it to the front of the cache."; this:reorder_cache(tmp); endif return this.cache_values[1]; elseif ((args[2] != "article") && (tmp = ({args[1], "article"} in this.cache_requests))) if (tmp != 1) this:reorder_cache(tmp); endif break = ("" in this.cache_values[1]); if (args[2] == "head") return this.cache_values[1][1..break - 1]; else return this.cache_values[1][break + 1..length(this.cache_values[1])]; endif else return {}; endif . #76:14 "Cache maintenance for NNTP."; "on a hit, we move the item to the head of the cache, so future"; "lookups go faster. hi jay."; this.cache_values = {this.cache_values[args[1]], @setremove(this.cache_values, this.cache_values[args[1]])}; this.cache_requests = {this.cache_requests[args[1]], @setremove(this.cache_requests, this.cache_requests[args[1]])}; this.cache_times = {time(), @setremove(this.cache_times, this.cache_times[args[1]])}; . #76:15 if (caller != this) return E_PERM; endif "Cache maintenance for NNTP"; "Inserts an article into the cache, timestamping it."; "args[1] should be an article identifier, args[2] should be one of"; "head, body, or article, args[3] should be the text."; if ((length(this.cache_requests) == this.cache_limit) && (!this:expire_cache())) "if the cache is full and we can't expire anything, pull off the"; "last (presumably LRU) item."; this.cache_requests = {{args[1], args[2]}, @this.cache_requests[1..length(this.cache_requests) - 1]}; this.cache_values = {args[3], @this.cache_values[1..length(this.cache_values) - 1]}; this.cache_times = {time(), @this.cache_times[1..length(this.cache_times) - 1]}; else this.cache_requests = {{args[1], args[2]}, @this.cache_requests[1..length(this.cache_requests)]}; this.cache_values = {args[3], @this.cache_values[1..length(this.cache_values)]}; this.cache_times = {time(), @this.cache_times[1..length(this.cache_times)]}; endif . #76:16 if (this.debug && (caller == this)) this.error_log = {@this.error_log, {ctime(), @args}}; endif . #76:17 if ((!caller) == this) return E_PERM; endif this.cache_values = (this.cache_times = (this.cache_requests = {})); . #76:18 "called by the expiry task to remove dusty items from the cache."; "returns the number of items it removed."; if (caller != this) return E_PERM; endif expiry = (time() - this.expiry); removed = 0; for item in (this.cache_times) if (expiry > item) ind = (item in this.cache_times); this.cache_values = setremove(this.cache_values, this.cache_values[ind]); this.cache_requests = setremove(this.cache_requests, this.cache_requests[ind]); this.cache_times = setremove(this.cache_times, this.cache_times[ind]); removed = (removed + 1); endif endfor return removed; . #76:19 "Either expire NNTP's caches now, or start or kill the expiration task."; if (!$perm_utils:controls(player, this)) return E_PERM; endif if (length(verb) == 7) player:tell(("Expiry procedure removed " + tostr(this:expire_cache())) + " item(s) from the NNTP cache."); elseif (index(verb, "task")) if (this.expire_task) player:tell("Expire task seems to be already running."); else fork task (0) this:expire_task(); endfork this.expire_task = task; endif else if (!this.expire_task) player:tell("Expire task seems not to be running."); else kill_task(this.expire_task); this.expire_task = 0; endif endif . #76:20 if (caller != this) return E_PERM; endif if (this.cache_values) this:expire_cache(); endif fork task (this.expire_delay) this:expire_task(); endfork this.expire_task = task; . #76:21 ":Fetch_newnews(newsgroups, last-read)"; "Return a list of message-IDs posted to newsgroups since last-read."; "newsgroups is either a string containing a single newsgroup, or a list of strings. last-read is a time."; if (typeof(connection = this:get_connection()) != ERR) text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, @args); this:release_connection(connection); return text; else return connection; endif . #76:22 if (caller != this) return E_PERM; endif "Fetch a list of new message IDs from a newsgroup, given a connection, a set of newsgroups, and a last-this:read_line time."; conn = args[1]; if (typeof(args[2]) == LIST) groups = $string_utils:from_list(args[2], ","); else groups = args[2]; endif last_read = args[3]; this:send_line(conn, (((verb + " ") + groups) + " ") + $time_utils:time_sub(this.timeformat, last_read)); line = this:read_line(conn); if (line[1] != "2") this:log_error("newnews", line); return E_INVARG; endif return this:nntp_read(conn); . #76:23 if (caller != this) return E_PERM; endif value = read(@args); return value; . #76:24 if (caller != this) return E_PERM; endif notify(@args); . #76:25 ":fetch_xhdr(header, messages)"; "return a list of headers associated with the article identifier(s) passed. header is a valid header line, such as 'subject'. 'message' should either be a message-id or a list of article identifiers."; "Note that since may NNTP servers do not properly implement the XHDR command (especially those running on a certain proprietary VAX operating system which Shall Remain Nameless,) this command may be disabled."; if (!this.xhdr_enabled) return E_PERM; endif if (typeof(connection = this:get_connection()) != ERR) if (typeof(args[2]) != LIST) args[1] = {args[1]}; endif text = this:(verb[index(verb, "_") + 1..length(verb)])(connection, @args); this:release_connection(connection); return text; else return connection; endif . #76:26 ":xhdr(connection,header,articles)"; if (caller != this) return E_PERM; endif conn = args[1]; header = args[2]; text = {}; for item in (args[3]) if (typeof(article = this:check_id(item)) == ERR) return E_INVARG; endif if (typeof(article) == LIST) this:send_line(conn, "GROUP " + article[1]); line = this:read_line(conn); if (line[1] != "2") this:log_error("group", line); return E_INVARG; endif this:send_line(conn, (((verb + " ") + header) + " ") + article[2]); line = this:read_line(conn); if (line[1] != "2") this:log_error(verb, line); return E_INVARG; endif result = this:nntp_read(conn); "bit of weirdness here. for no particular reason, the XHDR command prefixes the header line with its message-id or article number."; text = {@text, @result[length(article[2]) + 2..length(result[1])]}; else this:send_line(conn, (((verb + " ") + header) + " ") + article); line = this:read_line(conn); if (line[1] != "2") this:log_error(verb, line); return E_INVARG; endif result = this:nntp_read(conn); "bit of weirdness here. for no particular reason, the XHDR command prefixes the header line with its message-id or article number."; text = {@text, result[1][length(article) + 2..length(result[1])]}; endif endfor return text; . #77:0 "set_gender(newgender) attempts to change this.gender to newgender"; " => E_PERM if you don't own this or aren't its parent"; " => Other return values as from $gender_utils:set."; if (!($perm_utils:controls(caller_perms(), this) || (this == caller))) return E_PERM; else result = $gender_utils:set(this, args[1]); this.gender = ((typeof(result) == STR) ? result | args[1]); return result; endif . #77:1 if (player.wizard || (player == this.owner)) player:tell(this:set_gender(iobjstr) ? "Gender and pronouns set." | "Gender set."); else player:tell("Permission denied."); endif . 0 clocks 0 queued tasks 0 suspended tasks