# RageIRCd v2.0 (bluemoon): Server Configuration File Reference
# -------------------------------------------------------------
#
# $Id: reference.conf.txt,v 1.26.2.2 2005/03/18 20:49:36 amcwilliam Exp $
# (C) 2000-2005 the RageIRCd Development Team, all rights reserved.
#
# This document is up to date as of RageIRCd v2.0 beta-6.
# Inspired by reference.conf in bahamut-1.8.2.
#
# RageIRCd v2.0 server configuration files consist of blocks, each
# containing name-value pairs. It is designed to be easily readable by
# both human and ircd.
#
# A block consists of a block-name, an optional beginning block-variable,
# an opening '{' brace, statements, a closing '}' brace, and a ';'
# semicolon.
#
# A statement consists of a variable name, followed by the variable
# parameter, and ends with a semicolon. Parameters consist of:
# o) Boolean values: on/yes/true/1 OR off/no/false/0
# o) Strings: special characters or whitespace can be surrounded by
# '"' double quotes; escaping is also supported
# o) Numerical values
# o) Times: seconds, or *d*h*m*s (day, hr, min, sec)
# o) Sizes: bytes, *k, *m, or *g (kb, mb, gb)
# o) A comma-separated list of tokens or flags
#
# All elements of the configuration are separated by whitespace, and can
# be packed on one line, or broken up over several lines. Some blocks may
# also a require a parameter between the block-name and opening brace.
#
# A sample block:
# block {
# name value; # Single-value statement
# name "some other value"; # String parameter
# name 123; # Numerical parameter
# name 1d12h30m; # 1 day, 12 hrs, 30 mins
# name 500k; # 500 kb
# name token1,token2,token3; # Token list
# };
#
# The configuration parser also understands the following special
# include directive outside of a block context:
#
# include filename.conf;
#
# All data within a config file will be parsed, unless commented. Comments
# are supported in the following three forms.
/* C style
multi-line
*/
# Shell style single-line
// C++ style single-line
###############################################################################
# ServInfo [MANDATORY]
# This block defines the information about your server.
#
servinfo {
# Required variables
name irc.local; # Server name
description "Located on Earth"; # Short description
identity 1; # Unique server identitiy
ssl_certificate cert.pem; # SSL certificate to use
ssl_private_key key.pem; # SSL private key to use
# Optional variables
default_bind_ip 127.0.0.1; # Default bind IP when connecting
hub no; # Run as a hub server
max_clients 1000; # Max sockets allowed on the server
kline_address admin@irc.local; # Contact re. server-based bans
logs default,error; # What information should be logged
};
#
# The name variable must include at least one '.' dot, and cannot be
# changed through a rehash. The server description can be changed by
# rehash, but will not update across the network unless your server is
# relinked to the network.
#
# The identity variable should be a numerical value, ranging from 1 to
# 4096 inclusive. This identity is used to uniquely identify your server
# across a network on a protocol-level. Standalone servers can ignore this.
#
# The ssl_certificate and ssl_private_key variables are required if you
# have compiled with SSL support, and must specify valid files.
#
# The logs variable is a comma-separated list of all details that should
# be logged by the server. Acceptable flags are:
# o) default: log all misc. information
# o) error: log all server errors
# o) kill: log all KILL information
# o) client: log all client (dis)connections
# o) server: log all server (dis)connections
# o) oper: log all OPER attempts
# o) override: log all SAJOIN, SAKICK, SAMODE commands
###############################################################################
###############################################################################
# Admin [RECOMMENDED]
# This block is used to specify the server administrative information.
#
admin {
# Optional variables
name "KingD"; # Administrator name
description "The Big Cheese"; # Short administrative description
email "joe.bloggs@irc.local"; # How to contact administrator
};
#
# Any combination of the above variables can be used.
###############################################################################
###############################################################################
# Class [RECOMMENDED]
# This block specifies the connection classes to be used by Allow, Oper
# and Link blocks. Note the class name in the block-start.
#
class users {
# Required variables
# Class name specified in block-start.
ping_time 2m; # Idle connection PING frequency
sendq_length 100k; # Send queue/buffer limit
max_clients 1000; # Max. clients allowed in this class
};
#
# The ping_time variable specifies how long to wait before sending a PING
# request to an idle connection.
#
# The sendq_length variable specifies the size of the internal send
# queue/buffer, used when a connection cannot accept large amounts of data
# at once. If the send queue length is exceeded, the connection is dropped.
#
# The max_clients variable sets how many clients can be associated with
# this class via allow blocks. If this limit is reached, further
# connections will be rejected.
#
# A "default" class is also setup during server initialisation, and is
# setup with default values from include/config.h. Unknown class
# references in Allow, Oper and Link blocks will use this default class.
###############################################################################
###############################################################################
# Allow [REQUIRED]
# This block provides information on who and what has authorisation to
# connect to the server, and what class they belong to.
#
allow {
# Required variables
hostname *; # Hostname to accept
ip *; # IP address to accept
class users; # Class to put connection in
# Optional variables
auth {
string "password"; # Password required to connect
type plaintext; # Password encryption type
};
redir_serv alternate.server; # Alternate server to use
redir_port 6667; # Alternate port to use
port 7000; # Only allow on port 7000
spoof_mask i.just@love.spoofing; # [user@]host to spoof to
no_tilde no; # No tilde '~' on username
need_identd no; # Require identd to connect
kline_exempt no; # Exempt from k-line checks?
throttle_exempt no; # Exempt from connect throttling
};
#
# The hostname and ip variables specify the hostname and/or ip address to
# allow connection. If a user@host or user@ip is specified, the clients'
# username will also be checked.
#
# The class variable specifies the class in which to put the connection.
# If no class is specified, the "default" class will be used.
#
# The auth section allows you to password-protect this allow block. In
# order to be authorised by this allow block, a connecting client must
# specify the correct password on connect. See doc/auth.txt for password
# encryption details.
#
# The redir_serv and redir_port variables specify the server and port to
# redirect a client to, should their connection class be full. Both
# variables must be specified for this feature to work.
#
# The port variable allows you to set a specific port to allow users to
# connect on. If this port does not match the users port on connect, the
# block is skipped.
#
# The spoofed_mask variable allows you to spoof either the user@host or
# just the host of all clients matched on this allow block. This is
# free-form, limited only to USERLEN and HOSTLEN as appropriate. The IP
# address of spoofed users will also be hidden if HIDE_SPOOFED_IPS is
# defined in include/config.h at compile time.
#
# The no_tilde variable specifies whether or not the tilde '~' character
# should be prefixed to the username for clients without an identd.
#
# The need_identd variable specifies whether connecting users are required
# to have identd installed. This is checked after allow matching, and the
# client is rejected during registration.
#
# The kline_exempt variable sets whether or not clients using this allow
# block are exempt from k-lines/autokills/zaps. This does not apply to
# wild-user zaps, as they are checked as soon as a connection is established.
#
# The throttle_exempt variable defines whether or not users connecting to
# ircd via this allow block are exempt from connection throttling. This
# will completely remove the users' IP address from the throttle cache.
###############################################################################
###############################################################################
# Oper [RECOMMENDED]
# This block defines your server operators, needed for privileges allowing
# you to maintain your server. Note the oper name in the block-start.
#
#
# The auth section specifies the password that must be used in order to
# use this oper block. See doc/auth.txt for password encryption details.
#
# The from variable specifies the client userhost required in order to use
# the oper block. Hostnames with an user@ portion will cause usernames to
# be matched against too. Up to 15 from variables can be used in any one
# oper block.
#
# The join_on_oper variable, if specified, will force all users who use
# the oper block into the specified channels. Multiple channels can be
# specified by using a comma-separated list.
#
# The no_recvq_throttle variable allows all clients using this oper block
# to set user mode +F, which will skip the 2 second throttle check on all
# data sent to the server.
#
# The can_perform variable is a comma-separated list of tasks that can be
# performed if using this oper block. Acceptable flags are:
# o) rehash: can /REHASH
# o) die: can /DIE
# o) restart: can /RESTART
# o) kline: can /KLINE
# o) unkline: can /UNKLINE
# o) local_routing: can /CONNECT locally
# o) global_routing: can /CONNECT remotely
# o) local_kills: can /KILL local clients
# o) global_kills: can /KILL remote clients
# o) local_notices: can /NOTICE all local clients
# o) global_notices: can /NOTICE all network clients
#
# The can_see variable is a comma-separated list of all information that
# can be seen as a result of using this oper block. Acceptable flags are:
# o) routing: can see server routing notices (and server IPs)
# o) floods: can see flood warning notices
# o) local_cliconn: can see local client connections (user mode +c)
# o) global_cliconn: can see global client connections (user mode +G)
###############################################################################
###############################################################################
# Super [OPTIONAL]
# This block defines all "super" ("U-lined") servers.
#
super {
# Required variables
server "services.irc.local";
server "stats.irc.local";
};
#
# The server variable specifies the server name to be setup as a super
# server. Any clients connecting from these servers (i.e. ChanServ) will
# be considered super clients, and will be allowed to perform network
# tasks without direct privilege (i.e. channel ops).
###############################################################################
###############################################################################
# Link [OPTIONAL]
# This block is used to define server-to-server links. Note the server
# name in the block-start.
#
link irc.server.com {
# Required variables
# Server nams specified in block-start
auth {
string "password"; # Password required to link
type plaintext; # Password encryption type
};
host *; # Hostname or IP allowed to connect
port 7000; # Port on which to establish connection on
class servers; # Class to put the server connection in
# Optional variables
bind_ip 192.168.0.1; # IP address to bind to when connecting
auto_connect yes; # Should we automatically connect?
compressed yes; # Should output to the server be zipped?
encrypted no; # Should traffic be encrypted?
};
#
# The host variable specifies the IP address from which the server will be
# connecting. This can be a resolved hostname if the forward and reverse
# DNS match.
#
# The port variable specifies what port we should connect to the server
# on. Only taken into account if your server is initiating the server
# link.
#
# The auth section specifies the password that the other server must
# specify in order to successfully link. See doc/auth.txt for password
# encryption details.
#
# The bind_ip variable is used to define an alternate IP address to use
# when opening a connection to a new server. This variable will override
# the default_bind_ip variable in the servinfo block. Only applicable when
# your server is initiating the server link.
#
# If the auto_connect variable is enabled, your server will automatically
# attempt to relink to the server in the event of a netsplit. This is done
# at a frequency specified in the general block.
#
# The compressed variable defines whether or not the traffic to the link
# from your server should be compressed (zipped).
#
# The encrypted variable defines whether or not traffic to and from the
# link should be encrypted. This uses RC4 streaming encryption with a
# 1024-bit DH key exchange. Both your server and the remote server must
# have this variable enabled in order to successfully establish an
# encrypted link. Only available on servers compiled with SSL support.
###############################################################################
###############################################################################
# Listen [REQUIRED]
# This block defines what IP and ports your server will accept connections on.
# Note the IP address in the block-start.
#
listen 192.168.0.1 {
# Required variables
# IP address specified in block-start
port 7000 { # Listen on port 7000
# Optional variables
server_only yes; # Only accept servers on this port
};
port 7001; # Listen on port 7001
range 8000-8010; # Listen on ports 8000-8010
range 6660-6669 { # Listen on ports 6660 to 6669
# Optional variables
client_only yes; # Only accept clients on these ports
};
port 6697 { # Listen on port 6697
# Optional variables
secure yes; # Listen for client SSL connections
client_only yes; # Only accept clients on this port
};
};
#
# A listen block should be specified for each IP address you want to bind
# to. The IP address should be specified in the block-start.
#
# Listen blocks contain two variables. The port variable allows you to
# specify a single port to listen on. The range variable allows you to
# specify a range of ports to listen on. All ports must range from 1 to
# 65535 inclusive.
#
# These variables can also be expanded as sections to include optional
# variables, specific to the port or range in question.
#
# The secure variable specifies whether or not to accept client SSL
# connections. Client SSL ports are for secure clients, and cannot accept
# non-SSL clients. Encrypted server connections do not require a secure port.
#
# The client_only and server_only variables, if enabled, will accept only
# client or server connections on this port or range, respectively.
###############################################################################
###############################################################################
# Restrict [OPTIONAL]
# This block specifies what nickname, gcos, channel and file transfer
# restrictions are in place on your server. Note the restriction type in
# the block-start.
#
restrict nick {
# Required variables
# Restriction type specified in block-start
mask "ChanServ"; # Mask to restrict
# Optional variables
reason "Reserved for services"; # Reason for restriction
};
#
# The restriction type should be specified in the block-start, and can be
# either nick, gcos, chan or file to restrict either nicknames, real
# names, channels or file transfers, respectively.
#
# The mask variable defines the nick, gcos, chan or file to restrict.
###############################################################################
###############################################################################
# Kill [OPTIONAL]
# This block is used to specify client connections that should be
# rejected, based on their username, hostname and IP address. Syntax is
# identical to restrict blocks, accept no type should be specified in the
# block-start.
#
kill {
# Required variables
mask *@192.168.0.0/16; # Mask to disallow
# Optional variables
reason "Local clients are not permitted."; # Reason for kill
};
#
# Kill blocks are very flexible as a general client ban mechanism. The
# mask variable can take a number of forms. Namely, hostname, wildcard
# hostname, IP address, wildcard IP address, CIDR mask. Additionally, the
# mask can be prefixed with a user@ portion to disallow only specific
# usernames.
#
# IP address and CIDR bans without usernames are the most powerful form of
# ban, as they are checked as soon as a connection is established. The
# check is performed before any data can be transmitted, and before any
# memory has been allocated to the connection.
#
# IP address and CIDR bans with specific usernames are less powerful, as
# they cannot be checked against until a client connection has begun
# registration. This is because the identd response and client username
# are required.
#
# Finally, host-based bans are checked during client registration when a
# DNS response is received.
###############################################################################
###############################################################################
# Modules [REQUIRED]
# This block is used to define what modules should be loaded when the
# server is started. This block is only required on servers compiled with
# dynamic module support. Not available on Windows builds.
#
modules {
# Optional variables
file custom.so; # Load this specific .so file
path path/to/modules; # Load all .so files in this path
};
#
# The file variable allows you to define a specific module to load.
#
# The path variable allows you to define a directory to load modules from.
#
# It is important to remember how to order your module loading. Single
# files are loaded first, and any specified paths are loaded second.
#
# It is also worth mentioning that these only define where to look for
# modules. On a rehash, the internal lists are updated, but the modules
# are not reloaded. You must perform an additional /rehash modules (or
# execute ircd with the -m switch) to reload modules.
#
# Any number of these variables may be specified.
###############################################################################
###############################################################################
# Network [RECOMMENDED]
# This block allows you to configure network-specific variables.
#
network {
# Required variables
name "MyNet"; # Name of your IRC network
kline_address "kline@my.net"; # Contact address for network bans
max_link_depth 5; # Max. link hops
# Optional variables
services_server "services.my.net"; # Services server name
stats_server "stats.my.net"; # Statistics server name
};
#
# The max_link_depth variable controls how many hops are permitted across
# remote links. For example a max link depth of 2 would only permit for
# remote links connected to your servers uplink. If there were servers
# connected to a server connected to your servers uplink, your link
# would be cancelled.
#
# The services_server and stats_server variables define your Services' and
# Statistical server names for use in the Services' aliases, providing a
# reliable method for direct communication with the likes of ChanServ and
# NickServ. If undefined, Services' aliases will be disabled.
###############################################################################
###############################################################################
# Masking [MANDATORY]
# This block configures user host masking.
#
masking {
# Required variables
mask_key1 012000; # Masking algorithm key 1
mask_key2 013000; # Masking algorithm key 2
mask_key3 014000; # Masking algorithm key 3
# Optional variables
netadmin_mask "netadmin.my.net"; # Network admin masked host
admin_mask "admin.my.net"; # Admin masked host
oper_mask "oper.my.net"; # Oper masked host
user_mask_prefix "my"; # User masked host prefix
};
# The mask_key1, mask_key2 and mask_key3 variables are used to keep your
# user masked host hashes more secure. Using these three keys, each users
# host name is processed and a unique 32-bit hash is created. To help keep
# things secure, these keys must be set to unique numerical values, all
# above 10000. They must be set for your server to start, and should be
# unique across your entire network for user masked hosts to be synchronised.
###############################################################################
###############################################################################
# Flood [MANDATORY]
# This block allows you to configure flood-specific variables.
#
flood {
# Required variables
user_recvq_limit 2k; # How much user data to accept before flood
# Optional variables
knock_delay 2m; # Frequency of channel /KNOCKs allowed
accept_notice_time 5m; # Frequency of "Nick is msging you" notice
antispam_quit_msg_time 2m; # Minimum time online for custom quits
pace_wait_simple 1s; # Min. time between using simple commands
pace_wait_intense 5s; # Min. time between using intense commands
max_connect_count 3; # Throttle connection limit
min_connect_time 15s; # Throttle connection time
throttle_rejected_clients no; # Force-throttle rejected clients
anti_nick_flood yes; # Enable anti-nick change flood protection
anti_away_flood yes; # Enable anti-away flood protection
min_join_part_time 1m; # Min. spambot join/part time
max_join_part_count 15; # Max. spambot join/part count
spambot_squelch_time 3m; # How long to squelch spambots for
increase_oper_recvq no; # Double recvQ limit for opers?
};
#
# The user_recvq_limit variable determines the amount of unprocessed data
# a user may send to the server before their connection is dropped for
# flooding. This variable must be above 512 bytes, or the default will be
# used.
#
# The knock_delay variable determines the minimum amount of time between
# knock requests on a channel.
#
# The accept_notice_time variable determines the minimum amount of time
# between users in private mode are informed of blocked message attempts
# to them.
#
# The antispam_quit_msg_time variable defines the minimum amount of time a
# client must spend connected to the server before they are allowed a
# custom quit message. If they quit before the defined time, their message
# is replaced with "Client Quit".
#
# The pace_wait_simple and pace_wait_intense variables define the minimum
# amount of time a user must give before performing multiple calls to
# functions. The former variable applies to simple functions (admin,
# dalinfo, info, rules, stats, version, whois) and the latter variable
# applies to more CPU intensive commands (links, lusers, map, motd, stats,
# trace, whowas).
#
# The max_connect_count and min_connect_time variables configure the
# connection throttle. The server will limit each IP address to a maximum
# of max_connect_count connections within min_connect_time seconds before
# a throttle is placed on their connection. These variables are only
# recognised on servers compiled with throttle support.
#
# The throttle_rejected_clients variable, if defined, will force a
# throttle on clients that have been previously rejected (i.e. k-lined)
# from the server. This variable is only recognised on servers compiled
# with throttle support.
#
# The min_join_part_time and max_join_part_count variables act like as a
# throttle for JOIN/PART flooding, a sign of a possible spambot. If a
# client joins max_join_part_count channels in a row, but spends less than
# min_join_part_time on each, the client is marked as a spambot.
#
# The spambot_squelch_time variable defines how long to squelch a possible
# spambot for. This means all PRIVMSG, NOTICE and JOIN commands are
# ignored by the server until spambot_squelch_time has elapsed. Setting to
# 0 will disable spambot squelching.
#
# The increase_oper_recvq variable, if enabled, will double the value of the
# user_recvq_limit variable for operators.
###############################################################################
###############################################################################
# General [RECOMMENDED]
# This block allows you to configure general server-specific variables.
#
general {
# Required variables
max_chans_per_user 10; # Max. concurrent channels per user
connauth_timeout 15s; # ConnectAuth timeout value
compression_level 5; # Server-server compression level
ts_delta_warn 30s; # Min. TS delta before sending a warning
ts_delta_max 2m; # Max. TS delta before dropping link
max_bans 45; # Maximum bans, excepts and invex' (per list)
max_watch 128; # Maximum watch entries per user
max_kills 20; # Maximum number of targets per /KILL
max_targets 10; # Maximum number of targets per PRIVMSG/NOTICE
# Optional variables
statsfile_save_freq 15s; # How frequently to write ircd.stats
modes_on_connect x; # Usermodes to set on connect
join_on_connect "#Lobby"; # Channels to force-join on connect
auto_connect_freq 10m; # Frequency of server auto-connects
max_accept 10; # Max /ACCEPTs per user
max_dccallow 5; # Max /DCCALLOWs per user
max_who_replies 200; # Max replies allowed per /WHO
default_kline_time 15m; # Default /KLINE time
short_motd yes; # Show short motd on connect
hide_super_servers yes; # Hide super servers from users
check_identd yes; # Check identd during connect
resolve_hostnames yes; # Resolve DNS during connect
show_headers yes; # Show ConnectAuth headers
failed_oper_notice yes; # Alert on failed oper attempts
custom_channels yes; # Allow users to create new channels
enable_knock yes; # Enable knock command
custom_quit_msgs yes; # Allow custom quit messages
show_cliconn_quit_msgs no; # Show quit messages in client notices
show_invisible_lusers no; # Show invisible users in lusers
flatten_links no; # Flatten links output
enable_map yes; # Enable map command
spy_notices yes; # Enable spy notices
no_oper_accept no; # Don't block oper msgs when +p
enable_netadmins yes; # Enable network admins (+N)
restrict_chan_override yes; # Limit oper channel overrides
allow_fake_channels no; # Allow fake channel names
ignore_remote_motd no; # Ignore remote /MOTD
ignore_remote_rules no; # Ignore remote /RULES
ignore_remote_stats no; # Ignore remote /STATS
no_mixed_versions yes; # No mixed server versions
};
# The max_chans_per_user variable is used to limit the number of channels
# a single user may be a member of. This does not affect opers.
#
# The connauth_timeout variable is used to control how long the ircd will
# keep a ConnectAuth session active before closing any active identd and
# DNS checks, and release the client for connection.
#
# The compression_level variable is used to control how much server-server
# traffic is compressed. This should be a numerical value from 1-9
# inclusive. 1 being lowest and fastest compression, 9 being highest but
# slowest compression.
#
# The ts_delta_warn and ts_delta_max variables are used to specify
# acceptable differences between the time on two servers when linking. The
# former variable denotes the maximum time delta between two servers
# before a TS warning is sent out. The latter variable denotes the maximum
# time delta between two servers before the link is terminated.
#
# The max_bans variable defines how many bans, excepts of invex' may be on
# a single channel list. This variable is required, and the default will
# be used should it be set to an inproper value (i.e. below 10).
#
# The max_watch variable defines how many entries may be on a single users
# WATCH list. This value must be set to a number greater or equal to 10,
# or the default will be used.
#
# The max_kills variable defines the maximum number of targets that can be
# specified in a single /KILL command. Must be greater than or equal to 1,
# otherwise the default value will be used.
#
# The max_targets variable defines the maximum number of targets that can
# be specified in a single PRIVMSG or NOTICE command. This excludes
# duplicate targets, and is limited to a hard target limit defined
# internally. (HARD_TARGET_LIMIT is 64 by default.) Must be at least 1, or
# the default will be used.
#
# The auto_connect_freq variable is used to set the frequency at which
# server auto connects are checked for. See the link::auto_connect variable.
#
# The max_accept variable is used to define how many users a single client
# may have on his or her accept list. A max_accept of 0 means unlimited.
#
# The max_dccallow variable defines how many users a single client may
# have on his or her dcc allow list. A max_dccallow of 0 means unlimited.
#
# The max_who_replies variable defines how many replies should be shown as
# a result of a single /WHO command. (Useful for large networks.) This
# limit does not apply to operators, and can be set to 0 for unlimited
# replies.
#
# The default_kline_time variable is used to set the expiration time for
# temporary k-lines added via the /KLINE command. If set to 0, k-lines
# with no specified time will be written to ircd.conf. If non-zero value
# is below 1 minute, the default value shall be used.
#
# The show_cliconn_quit_msgs variable defines whether or not client quit
# messages are shown in the client connection notices. If disabled, the
# message "Client Quit" will be shown, unless the user had a socket error,
# or was banned from the server.
#
# The flatten_links variable will cause links output to be a flat list of
# servers, rather than a structured topology layout. This will hide network
# routing information from users. At present time, this variable will
# disable the map command too.
#
# The no_oper_accept variable defines whether or not private messages from
# opers are delivered to users in privacy mode.
#
# The restrict_chan_override variable defines how much restriction opers
# have on channels. Under normal circumstances, opers can talk through
# bans that may affect them, or any other channel restrictions such as +m,
# etc. If defined, this variable will remove that override.
#
# The allow_fake_channels variable sets whether or not the server is to
# accept channel names with bold, mirc colour, reverse, underline and hard
# space in. (ASCII 2, 3, 22, 31, 160.)
#
# The ignore_remote_motd, ignore_remote_rules and ignore_remote_stats variables
# define whether to ignore /MOTD, /RULES and /STATS commands from remote
# clients, respectively.
#
# The no_mixed_versions variable, if enabled, will reject direct server
# links that are running a different version of ircd. This will not affect
# links running different point-releases of the same version (i.e. 2.0.0
# and 2.0.1).
###############################################################################
# End of Document.