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