mirror of
https://github.com/syncthing/syncthing.git
synced 2025-12-23 22:18:14 -05:00
555 lines
17 KiB
Groff
555 lines
17 KiB
Groff
.\" Man page generated from reStructuredText.
|
||
.
|
||
.
|
||
.nr rst2man-indent-level 0
|
||
.
|
||
.de1 rstReportMargin
|
||
\\$1 \\n[an-margin]
|
||
level \\n[rst2man-indent-level]
|
||
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
-
|
||
\\n[rst2man-indent0]
|
||
\\n[rst2man-indent1]
|
||
\\n[rst2man-indent2]
|
||
..
|
||
.de1 INDENT
|
||
.\" .rstReportMargin pre:
|
||
. RS \\$1
|
||
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
|
||
. nr rst2man-indent-level +1
|
||
.\" .rstReportMargin post:
|
||
..
|
||
.de UNINDENT
|
||
. RE
|
||
.\" indent \\n[an-margin]
|
||
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
.nr rst2man-indent-level -1
|
||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||
..
|
||
.TH "SYNCTHING" "1" "Nov 01, 2025" "v2.0.0" "Syncthing"
|
||
.SH NAME
|
||
syncthing \- Syncthing
|
||
.SH SYNOPSIS
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.EX
|
||
syncthing [serve]
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-allow\-newer\-config] [\-\-audit] [\-\-auditfile=<file|\-|\-\->]
|
||
[\-\-db\-maintenance\-interval=<interval>]
|
||
[\-\-db\-delete\-retention\-interval=<interval>]
|
||
[\-\-gui\-address=<address>] [\-\-gui\-apikey=<key>]
|
||
[\-\-log\-level=<level>] [\-\-log\-file=<filename>]
|
||
[\-\-log\-max\-old\-files=<num>] [\-\-log\-max\-size=<num>]
|
||
[\-\-log\-format\-timestamp=<format>] [\-\-no\-log\-format\-level\-string]
|
||
[\-\-log\-format\-level\-syslog]
|
||
[\-\-no\-browser] [\-\-no\-console]
|
||
[\-\-no\-port\-probing] [\-\-no\-restart] [\-\-no\-upgrade]
|
||
[\-\-paused] [\-\-unpaused]
|
||
[\-\-version] [\-\-help] [\-\-debug\-*]
|
||
|
||
syncthing cli
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-gui\-address=<address>] [\-\-gui\-apikey=<key>]
|
||
[\-\-help]
|
||
<command> [command options...] [arguments...]
|
||
|
||
syncthing browser
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-help]
|
||
|
||
syncthing decrypt (\-\-to=<dir> | \-\-verify\-only)
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-password=<pw>] [\-\-folder\-id=<id>] [\-\-token\-path=<file>]
|
||
[\-\-continue] [\-\-verbose] [\-\-help]
|
||
<path>
|
||
|
||
syncthing device\-id
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-help]
|
||
|
||
syncthing generate
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-gui\-user=<username>] [\-\-gui\-password=<password|\->]
|
||
[\-\-no\-port\-probing]
|
||
[\-\-help]
|
||
|
||
syncthing paths
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-help]
|
||
|
||
syncthing upgrade
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-check\-only] [\-\-from=<url>]
|
||
[\-\-help]
|
||
|
||
syncthing version
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-help]
|
||
|
||
syncthing debug <command>
|
||
[\-\-home=<dir> | \-\-config=<dir> \-\-data=<dir>]
|
||
[\-\-help]
|
||
.EE
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SH DESCRIPTION
|
||
.sp
|
||
Syncthing lets you synchronize your files bidirectionally across multiple
|
||
devices. This means the creation, modification or deletion of files on one
|
||
machine will automatically be replicated to your other devices. We believe your
|
||
data is your data alone and you deserve to choose where it is stored. Therefore
|
||
Syncthing does not upload your data to the cloud but exchanges your data across
|
||
your machines as soon as they are online at the same time.
|
||
.sp
|
||
The \fBsyncthing\fP core application is a command\-line program which usually runs
|
||
in the background and handles the synchronization. It provides a built\-in, HTML
|
||
and JavaScript based user interface to be controlled from a web browser. This
|
||
frontend communicates with the core application through some HTTP APIs, which
|
||
other apps like graphical system integration helpers can use as well, for
|
||
greatest flexibility. A link to reach the GUI and API is printed among the first
|
||
few log messages.
|
||
.SH COMMON OPTIONS
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-home=<dir>, \-H <dir> ($STHOMEDIR)
|
||
Set common configuration and data directory. The default configuration
|
||
directory is \fB$XDG_STATE_HOME/syncthing\fP or
|
||
\fB$HOME/.local/state/syncthing\fP (Unix\-like),
|
||
\fB$HOME/Library/Application Support/Syncthing\fP (Mac) and
|
||
\fB%LOCALAPPDATA%\eSyncthing\fP (Windows).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-config=<dir>, \-C <dir> ($STCONFDIR)
|
||
Set configuration directory. Alternative to \fB\-\-home\fP and must be used
|
||
together with \fB\-\-data\fP\&.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-data=<dir>, \-D <dir> ($STDATADIR)
|
||
Set data (e.g. database) directory. Alternative to \fB\-\-home\fP and must be used
|
||
together with \fB\-\-config\fP\&.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-help, \-h
|
||
Show help text about command line usage. Context\-sensitive depending on the
|
||
given subcommand.
|
||
.UNINDENT
|
||
.SH SERVE OPTIONS
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-allow\-newer\-config ($STALLOWNEWERCONFIG)
|
||
Try loading a config file written by a newer program version, instead of
|
||
failing immediately.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-audit ($STAUDIT)
|
||
Write events to timestamped file \fBaudit\-YYYYMMDD\-HHMMSS.log\fP\&.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-auditfile=<file|\-|\-\-> ($STAUDITFILE)
|
||
Use specified file or stream (\fB\(dq\-\(dq\fP for stdout, \fB\(dq\-\-\(dq\fP for stderr) for
|
||
audit events, rather than the timestamped default file name.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-db\-maintenance\-interval=<interval> ($STDBMAINTENANCEINTERVAL)
|
||
Database maintenance interval – internal database maintenance routines
|
||
run this often. The format is that of a Go duration string (see
|
||
\X'tty: link https://pkg.go.dev/time#ParseDuration'\fI\%https://pkg.go.dev/time#ParseDuration\fP\X'tty: link').
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-db\-delete\-retention\-interval=<interval> ($STDBDELETERETENTIONINTERVAL)
|
||
Database deleted item retention interval – deleted items are forgotten
|
||
from the database after this interval. The format is that of a Go duration
|
||
string (see \X'tty: link https://pkg.go.dev/time#ParseDuration'\fI\%https://pkg.go.dev/time#ParseDuration\fP\X'tty: link').
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-gui\-address=<address> ($STGUIADDRESS)
|
||
Override GUI listen address. Set this to an address (\fB0.0.0.0:8384\fP)
|
||
or a URL (\fBhttp://0.0.0.0:8384\fP). Supported schemes are \fBhttp\fP for
|
||
plain HTTP, \fBhttps\fP for HTTP over TLS, \fBunix\fP for plain Unix sockets
|
||
or \fBunixs\fP for TLS over Unix sockets. A Unix socket could look like this:
|
||
\fBunix:///run/syncthing/syncthing.socket\fP (notice the three slashes: two
|
||
as part of the URL structure, one to specify an absolute path).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-gui\-apikey=<string> ($STGUIAPIKEY)
|
||
Override the API key needed to access the GUI / REST API.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-log\-file=<filename> ($STLOGFILE)
|
||
Set destination filename for logging (use \fB\(dq\-\(dq\fP for stdout, which is the
|
||
default option).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-log\-level=<level> ($STLOGLEVEL)
|
||
Set the log level for all packages. Valid levels are DEBUG, INFO, WARN,
|
||
and ERROR.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-log\-max\-old\-files=<num> ($STLOGMAXOLDFILES)
|
||
Number of old files to keep (zero to keep only current). Applies only when
|
||
log rotation is enabled through \fB\-\-log\-max\-size\fP\&.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-log\-max\-size=<num> ($STLOGMAXSIZE)
|
||
Maximum size in bytes of any log file (zero to disable log rotation).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-log\-format\-timestamp=<format> ($STLOGFORMATTIMESTAMP)
|
||
Format for timestamp, set to empty to disable timestamps. The format is that
|
||
of the Go time formatter (see \X'tty: link https://pkg.go.dev/time#Layout'\fI\%https://pkg.go.dev/time#Layout\fP\X'tty: link').
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-[no\-]log\-format\-level\-string ($STLOGFORMATLEVELSTRING)
|
||
Whether to include level string (e.g. “INF”) in log line.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-[no\-]log\-format\-level\-syslog ($STLOGFORMATLEVELSYSLOG)
|
||
Whether to include level as syslog prefix (e.g. “<6>”) in log line.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-no\-browser ($STNOBROWSER)
|
||
Do not start a browser.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-no\-console ($STNOCONSOLE)
|
||
Hide the console window. (On Windows only)
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-no\-port\-probing ($STNOPORTPROBING)
|
||
Don’t try to find unused random ports for the GUI and listen address when
|
||
generating an initial configuration / starting for the first time.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-no\-restart ($STNORESTART)
|
||
Do not restart Syncthing when it exits. The monitor process will still run
|
||
to handle crashes and writing to logfiles (if configured to).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-no\-upgrade ($STNOUPGRADE)
|
||
Disable automatic upgrades.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-paused ($STPAUSED)
|
||
Start with all devices and folders paused.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-unpaused ($STUNPAUSED)
|
||
Start with all devices and folders unpaused.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-version
|
||
Show the current version information, then exit.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-debug\-*
|
||
Several debug options exist. See \fBsyncthing serve \-\-help\fP for the flags
|
||
that apply to your version.
|
||
.UNINDENT
|
||
.SH DECRYPT OPTIONS
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-to=<dir>
|
||
Destination directory where files should be stored after decryption.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-verify\-only
|
||
Don’t write decrypted files to disk (but verify plaintext hashes).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-password=<pw> ($FOLDER_PASSWORD)
|
||
Folder password for decryption / verification. Can be passed through the
|
||
\fBFOLDER_PASSWORD\fP environment variable instead to avoid recording in a
|
||
shell’s history buffer or sniffing from the running processes list.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-folder\-id=<id>
|
||
Folder ID of the encrypted folder, if it cannot be determined automatically.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-token\-path=<file>
|
||
Path to the token file within the folder (used to determine folder ID).
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-continue
|
||
Continue processing next file in case of error, instead of aborting.
|
||
.UNINDENT
|
||
.SH GENERATE OPTIONS
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-gui\-password=<password|\->
|
||
Specify new GUI authentication password, to update the config file. Read
|
||
from the standard input stream if only a single dash (\fB\-\fP) is given. A
|
||
plaintext password is hashed before writing to the config file, but an
|
||
already bcrypt\-hashed input is stored verbatim. As a special case, giving
|
||
the existing password hash as password will leave it untouched.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-gui\-user=<username>
|
||
Specify new GUI authentication user name, to update the config file.
|
||
.UNINDENT
|
||
.SH UPGRADE OPTIONS
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-check\-only
|
||
Do not upgrade, only indicate whether an upgrade is available.
|
||
.UNINDENT
|
||
.INDENT 0.0
|
||
.TP
|
||
.B \-\-from=<url>
|
||
Upgrade to the Syncthing version available from loading the package at
|
||
the given URL.
|
||
.UNINDENT
|
||
.SH EXIT CODES
|
||
.INDENT 0.0
|
||
.TP
|
||
.B 0
|
||
Success / Shutdown
|
||
.TP
|
||
.B 1
|
||
Error
|
||
.TP
|
||
.B 2
|
||
Upgrade not available
|
||
.TP
|
||
.B 3
|
||
Restarting
|
||
.TP
|
||
.B 4
|
||
Upgrading
|
||
.UNINDENT
|
||
.sp
|
||
Exit codes over 125 are usually returned by the shell/binary loader/default
|
||
signal handler. Exit codes over 128+N on Unix usually represent the signal which
|
||
caused the process to exit. For example, \fB128 + 9 (SIGKILL) = 137\fP\&.
|
||
.SH SUBCOMMANDS
|
||
.sp
|
||
The command line syntax supports different modes of operation through
|
||
several subcommands, specified as the first argument. If omitted, the
|
||
default \fBserve\fP is assumed.
|
||
.sp
|
||
The initial setup of a device ID and default configuration can be called
|
||
explicitly with the \fBgenerate\fP subcommand. It can also update the configured
|
||
GUI authentication credentials, without going through the REST API. An existing
|
||
device certificate is left untouched. If the configuration file already exists,
|
||
it is validated and updated to the latest configuration schema, including adding
|
||
default values for any new options.
|
||
.sp
|
||
The \fBdecrypt\fP subcommand is used in conjunction with untrusted (encrypted)
|
||
devices, see the relevant section on \fI\%decryption\fP for
|
||
details. It does not depend on Syncthing to be running, but works on offline
|
||
data.
|
||
.sp
|
||
To work with the REST API for debugging or automating things in Syncthing, the
|
||
\fBcli\fP subcommand provides easy access to individual features. It basically
|
||
saves the hassle of handling HTTP connections and API authentication.
|
||
.sp
|
||
The available subcommands are grouped into several nested hierarchies and some
|
||
parts dynamically generated from the running Syncthing instance. On every
|
||
level, the \fB\-\-help\fP option lists the available properties, actions and
|
||
commands for the user to discover interactively. The top\-level groups are:
|
||
.INDENT 0.0
|
||
.TP
|
||
.B config
|
||
Access the live configuration in a running instance over the REST API to
|
||
retrieve (get) or update (set) values in a fine\-grained way. The hierarchy
|
||
is based on the same structure as used in the JSON / XML representations.
|
||
.TP
|
||
.B show
|
||
Show system properties and status of a running instance. The output is
|
||
passed on directly from the REST API response and therefore requires parsing
|
||
JSON format.
|
||
.TP
|
||
.B operations
|
||
Control the overall program operation such as restarting or handling
|
||
upgrades, as well as triggering some actions on a per\-folder basis. Can
|
||
also configure the default ignore patterns from a plain text ignore file.
|
||
.TP
|
||
.B errors
|
||
Examine pending error conditions that need attention from the user, or
|
||
acknowledge (clear) them.
|
||
.TP
|
||
.B debug
|
||
Various tools to aid in diagnosing problems or collection information for
|
||
bug reports. Some of these commands access the database directly and can
|
||
therefore only work when Syncthing is not running.
|
||
.TP
|
||
.B \fB\-\fP (a single dash)
|
||
Reads subsequent commands from the standard input stream, without needing to
|
||
call the \fBsyncthing cli\fP command over and over. Exits on any invalid
|
||
command or when EOF (end\-of\-file) is received.
|
||
.UNINDENT
|
||
.SH PROXIES
|
||
.sp
|
||
Syncthing can use a SOCKS, HTTP, or HTTPS proxy to talk to the outside
|
||
world. The proxy is used for outgoing connections only \- it is not possible
|
||
to accept incoming connections through the proxy. The proxy is configured
|
||
through the environment variable \fBall_proxy\fP\&. Somewhat unusually, this
|
||
variable must be named in lower case \- it is not “ALL_PROXY”. For
|
||
example:
|
||
.INDENT 0.0
|
||
.INDENT 3.5
|
||
.sp
|
||
.EX
|
||
$ export all_proxy=socks://192.0.2.42:8081
|
||
.EE
|
||
.UNINDENT
|
||
.UNINDENT
|
||
.SH DEVELOPMENT SETTINGS
|
||
.sp
|
||
The following environment variables modify Syncthing’s behavior in ways that
|
||
are mostly useful for developers. Use with care.
|
||
If you start Syncthing from within service managers like systemd or supervisor,
|
||
path expansion may not be supported.
|
||
.INDENT 0.0
|
||
.TP
|
||
.B STTRACE
|
||
Used to increase the debugging verbosity in specific facilities,
|
||
generally mapping to a Go package. Enter a comma\-separated string of
|
||
facilities to trace: \fBapi,beacon\fP\&. Optionally, a log level can be
|
||
given per facility to specify something other than DEBUG:
|
||
\fBapi:WARN,beacon:ERR\fP, potentially overriding a global \fB\-\-log\-level\fP
|
||
adjustment.
|
||
.sp
|
||
The valid facility strings are listed below; additionally, \fBsyncthing
|
||
serve \-\-help\fP always outputs the most up\-to\-date list.
|
||
.INDENT 7.0
|
||
.TP
|
||
.B api
|
||
REST API
|
||
.TP
|
||
.B beacon
|
||
Multicast and broadcast discovery
|
||
.TP
|
||
.B config
|
||
Configuration loading and saving
|
||
.TP
|
||
.B connections
|
||
Connection handling
|
||
.TP
|
||
.B db/sqlite
|
||
SQLite database
|
||
.TP
|
||
.B dialer
|
||
Dialing connections
|
||
.TP
|
||
.B discover
|
||
Remote device discovery
|
||
.TP
|
||
.B events
|
||
Event generation and logging
|
||
.TP
|
||
.B fs
|
||
Filesystem access
|
||
.TP
|
||
.B main
|
||
Main package
|
||
.TP
|
||
.B model
|
||
The root hub
|
||
.TP
|
||
.B nat
|
||
NAT discovery and port mapping
|
||
.TP
|
||
.B pmp
|
||
NAT\-PMP discovery and port mapping
|
||
.TP
|
||
.B protocol
|
||
The BEP protocol
|
||
.TP
|
||
.B relay/client
|
||
Relay client
|
||
.TP
|
||
.B scanner
|
||
File change detection and hashing
|
||
.TP
|
||
.B stun
|
||
STUN functionality
|
||
.TP
|
||
.B syncthing
|
||
Main run facility
|
||
.TP
|
||
.B upgrade
|
||
Binary upgrades
|
||
.TP
|
||
.B upnp
|
||
UPnP discovery and port mapping
|
||
.TP
|
||
.B ur
|
||
Usage reporting
|
||
.TP
|
||
.B versioner
|
||
File versioning
|
||
.TP
|
||
.B watchaggregator
|
||
Filesystem event watcher
|
||
.UNINDENT
|
||
.TP
|
||
.B STLOCKTHRESHOLD
|
||
Used for debugging internal deadlocks; sets debug sensitivity. Use only
|
||
under direction of a developer.
|
||
.TP
|
||
.B STVERSIONEXTRA
|
||
Add extra information to the version string in logs and the version line
|
||
in the GUI. Can be set to the name of a wrapper or tool controlling
|
||
syncthing to communicate this to the end user.
|
||
.TP
|
||
.B GOMAXPROCS
|
||
Set the maximum number of CPU cores to use. Defaults to all available CPU
|
||
cores.
|
||
.TP
|
||
.B GOGC
|
||
Percentage of heap growth at which to trigger GC. Default is 100. Lower
|
||
numbers keep peak memory usage down, at the price of CPU usage
|
||
(i.e. performance).
|
||
.TP
|
||
.B LOGGER_DISCARD
|
||
Hack to completely disable logging, for example when running benchmarks.
|
||
Set to any nonempty value to use it.
|
||
.UNINDENT
|
||
.SH SEE ALSO
|
||
.sp
|
||
\fBsyncthing\-config(5)\fP, \fBsyncthing\-stignore(5)\fP,
|
||
\fBsyncthing\-device\-ids(7)\fP, \fBsyncthing\-security(7)\fP,
|
||
\fBsyncthing\-networking(7)\fP, \fBsyncthing\-versioning(7)\fP,
|
||
\fBsyncthing\-faq(7)\fP
|
||
.SH AUTHOR
|
||
The Syncthing Authors
|
||
.SH COPYRIGHT
|
||
2014-2025, The Syncthing Authors
|
||
.\" Generated by docutils manpage writer.
|
||
.
|