diff --git a/AUTHORS.md b/AUTHORS.md
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -44,6 +44,7 @@
 - Arlo O'Keeffe
 - Artem Pelenitsyn
 - Artyom Kazak
+- Aslak Hellesøy
 - Asliddinbek Azizovich
 - B. Scott Michel
 - Bastien Dumont
@@ -127,6 +128,7 @@
 - Eric Kow
 - Eric Schrijver
 - Eric Seidel
+- Erik Demaine
 - Erik Post
 - Erik Rask
 - Ethan Riley
@@ -253,6 +255,7 @@
 - Konstantin Zudov
 - Kristof Bastiaensen
 - Krystof Beuermann
+- Kyohei Takahashi
 - Lars-Dominik Braun
 - Laurent P. René de Cotret
 - Lawrence Chonavel
@@ -362,6 +365,7 @@
 - Puneeth Chaganti
 - Quinn
 - R. N. West
+- Raffaele Mancuso
 - Ralf Stephan
 - Raniere Silva
 - Raymond Berger
@@ -530,6 +534,7 @@
 - priiduonu
 - qerub
 - quasicomputational
+- rca-umb
 - reptee
 - ricnorr
 - robabla
diff --git a/MANUAL.txt b/MANUAL.txt
--- a/MANUAL.txt
+++ b/MANUAL.txt
@@ -1,7 +1,7 @@
 ---
 title: Pandoc User's Guide
 author: John MacFarlane
-date: 2026-09-26
+date: 2026-10-07
 ---
 
 # Synopsis
@@ -251,6 +251,7 @@
     - `endnotexml` ([EndNote XML bibliography])
     - `epub` ([EPUB])
     - `fb2` ([FictionBook2] e-book)
+    - `fodt` (flat [OpenDocument text document][ODT])
     - `gfm` ([GitHub-Flavored Markdown]),
       or the deprecated and less accurate `markdown_github`;
       use [`markdown_github`](#markdown-variants) only
@@ -327,6 +328,7 @@
     - `epub` or `epub3` ([EPUB] v3 book)
     - `epub2` (EPUB v2)
     - `fb2` ([FictionBook2] e-book)
+    - `fodt` (flat [OpenDocument text document][ODT])
     - `gfm` ([GitHub-Flavored Markdown]),
       or the deprecated and less accurate `markdown_github`;
       use [`markdown_github`](#markdown-variants) only
@@ -1146,7 +1148,10 @@
 `--link-images[=true|false]`
 
 :   Include links to images instead of embedding the images in ODT.
-    (This option currently only affects ODT output.)
+    (This option currently only affects `odt` and `fodt` output.)
+    This is worth considering for `fodt`, where images have to be
+    base64-encoded and so take about a third more space than in the
+    compressed `odt` package.
 
 `--html-q-tags[=true|false]`
 
@@ -1408,6 +1413,12 @@
         Then open `custom-reference.odt` in LibreOffice, modify
         the styles as you wish, and save the file.
 
+        `fodt` output uses the same reference documents as `odt`;
+        the reference is still a zipped `.odt`, which is flattened
+        along with the generated content.  Note that an automatic
+        style of the reference document is dropped, with a warning,
+        if the generated content defines a style of the same name.
+
     PowerPoint
 
     :   Templates included with Microsoft PowerPoint 2013 (either with
@@ -3592,6 +3603,16 @@
 :   color for external links, internal links, and citation links,
     respectively: expects a hexadecimal color code
 
+`csl-entry-spacing`
+:   entry spacing between citeproc-generated bibliography entries
+    (with a unit, e.g. `1em`). This will be set automatically
+    based on the CSL style but can be overridden.
+
+`csl-hanging-indent`
+:   amount of hanging indent in citeproc-generated bibliography entries
+    (with a unit, e.g. `1.5em`). This will be set automatically
+    based on the CSL style but can be overridden.
+
 ### Variables for ms
 
 `fontfamily`
@@ -6630,7 +6651,7 @@
 
         Spin wave dispersion on the <span class="nocase">nm</span> scale
 
-### Conference Papers, Published vs. Unpublished
+### Conference papers, published vs. unpublished
 
 For a formally published conference paper, use the biblatex entry type
 `inproceedings` (which will be mapped to CSL `paper-conference`).
@@ -6649,7 +6670,6 @@
 which describes the publisher's location; do not use the latter
 for an unpublished conference paper.
 
-
 ## Specifying a citation style
 
 Citations and references can be formatted using any style supported by the
@@ -7829,11 +7849,11 @@
 
 # Custom Styles
 
-Custom styles can be used in the docx, odt and ICML formats.
+Custom styles can be used in the docx, odt, fodt and ICML formats.
 
 ## Output
 
-By default, pandoc's odt, docx and ICML output applies a predefined set of
+By default, pandoc's odt, fodt, docx and ICML output applies a predefined set of
 styles for blocks such as paragraphs and block quotes, and uses largely
 default formatting (italics, bold) for inlines. This will work for most
 purposes, especially alongside a [reference doc](#option--reference-doc) file.
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -54,6 +54,8 @@
 - `fb2`
   ([FictionBook2](http://www.fictionbook.org/index.php/Eng:XML_Schema_Fictionbook_2.1)
   e-book)
+- `fodt` (flat [OpenDocument text
+  document](https://en.wikipedia.org/wiki/OpenDocument))
 - `gfm` ([GitHub-Flavored
   Markdown](https://help.github.com/articles/github-flavored-markdown/)),
   or the deprecated and less accurate `markdown_github`; use
@@ -161,6 +163,8 @@
 - `fb2`
   ([FictionBook2](http://www.fictionbook.org/index.php/Eng:XML_Schema_Fictionbook_2.1)
   e-book)
+- `fodt` (flat [OpenDocument text
+  document](https://en.wikipedia.org/wiki/OpenDocument))
 - `gfm` ([GitHub-Flavored
   Markdown](https://help.github.com/articles/github-flavored-markdown/)),
   or the deprecated and less accurate `markdown_github`; use
diff --git a/benchmark/benchmark-pandoc.hs b/benchmark/benchmark-pandoc.hs
--- a/benchmark/benchmark-pandoc.hs
+++ b/benchmark/benchmark-pandoc.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TupleSections #-}
 {-
 Copyright (C) 2012-2024 John MacFarlane <jgm@berkeley.edu>
 
@@ -19,6 +20,7 @@
 import Text.Pandoc
 import Text.Pandoc.MIME
 import Text.Pandoc.Shared (stringify, stringifyInlines)
+import Text.Pandoc.MediaBag (mediaItems)
 import Control.DeepSeq (force)
 import Control.Monad.Except (throwError)
 import qualified Text.Pandoc.UTF8 as UTF8
@@ -27,43 +29,62 @@
 import Test.Tasty.Bench
 -- import Gauge
 import qualified Data.ByteString.Lazy as BL
-import Data.Maybe (mapMaybe)
 import Data.List (sortOn)
 import Text.Pandoc.Format (FlavoredFormat(..))
+import System.IO.Temp
+import Data.Maybe
 
-readerBench :: Pandoc
+readerBench :: [(FilePath, MimeType, BL.ByteString)]
+            -> Pandoc
             -> T.Text
             -> Maybe Benchmark
-readerBench _ name
+readerBench _ _ name
   | name `elem` ["bibtex", "biblatex", "csljson"] = Nothing
-readerBench doc name = either (const Nothing) Just $
+readerBench imgs doc name = either (const Nothing) Just $
   runPure $ do
     (rdr, rexts) <- getReader $ FlavoredFormat name mempty
     (wtr, wexts) <- getWriter $ FlavoredFormat name mempty
-    tmpl <- Just <$> compileDefaultTemplate name
+    tpl <- compileDefaultTemplate name 
     case (rdr, wtr) of
       (TextReader r, TextWriter w) -> do
         inp <- w def{ writerWrapText = WrapAuto
                     , writerExtensions = wexts
-                    , writerTemplate = tmpl } doc
-        return $ bench (T.unpack name) $
-          nf (either (error . show) id . runPure . r def) inp
+                    , writerTemplate = Just tpl } doc
+        return $ bench (T.unpack name)
+               $ nf (\x -> either (error . show) id $
+                       runPure $ do
+                         mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs
+                         r def x)
+                    inp
       (ByteStringReader r, ByteStringWriter w) -> do
         inp <- w def{ writerWrapText = WrapAuto
                     , writerExtensions = wexts
-                    , writerTemplate = tmpl } doc
-        return $ bench (T.unpack name) $
-          nf (either (error . show) id .
-                runPure . r def{readerExtensions = rexts}) inp
+                    , writerTemplate = Just tpl } doc
+        return $ bench (T.unpack name)
+               $ nf (\x -> either (error . show) id $
+                       runPure $ do
+                         mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs
+                         r def{readerExtensions = rexts} x)
+                    inp
       _ -> throwError $ PandocSomeError $ "text/bytestring format mismatch: "
                            <> name
 
-getImages :: IO [(FilePath, MimeType, BL.ByteString)]
-getImages = do
-  ll <- B.readFile "test/lalune.jpg"
-  mv <- B.readFile "test/movie.jpg"
-  return [("lalune.jpg", "image/jpg", BL.fromStrict ll)
-         ,("movie.jpg", "image/jpg", BL.fromStrict mv)]
+getSample :: FilePath -> IO (Pandoc, [(FilePath, MimeType, BL.ByteString)])
+getSample fp = do
+  inp <- UTF8.toText <$> B.readFile fp
+  let opts = def
+  doc' <- runIOorExplode $ do
+            (_, rexts) <- getReader $ FlavoredFormat "markdown" mempty
+            readMarkdown
+              opts{ readerExtensions = enableExtension Ext_rebase_relative_paths
+                                              rexts }
+              [(fp, inp)]
+  withSystemTempDirectory "pandoc-bench-resources" $ \tmpdir ->
+    runIOorExplode $ do
+      doc <- extractMedia tmpdir doc'
+      fillMediaBag doc
+      items <- mediaItems <$> getMediaBag
+      pure $! (doc, items)
 
 writerBench :: [(FilePath, MimeType, BL.ByteString)]
             -> Pandoc
@@ -74,20 +95,22 @@
 writerBench imgs doc name = either (const Nothing) Just $
   runPure $ do
     (wtr, wexts) <- getWriter $ FlavoredFormat name mempty
+    tpl <- compileDefaultTemplate name
+    let opts = def{ writerExtensions = wexts, writerTemplate = Just tpl }
     case wtr of
       TextWriter writerFun ->
         return $ bench (T.unpack name)
                $ nf (\d -> either (error . show) id $
                        runPure $ do
                          mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs
-                         writerFun def{ writerExtensions = wexts} d)
+                         writerFun opts d)
                     doc
       ByteStringWriter writerFun ->
         return $ bench (T.unpack name)
                $ nf (\d -> either (error . show) id $
                        runPure $ do
                          mapM_ (\(fp,mt,bs) -> insertMedia fp (Just mt) bs) imgs
-                         writerFun def{ writerExtensions = wexts} d)
+                         writerFun opts d)
                     doc
 
 -- | A large inline sequence exercising both the common constructors
@@ -105,17 +128,14 @@
 
 main :: IO ()
 main = do
-  inp <- UTF8.toText <$> B.readFile "test/testsuite.txt"
-  let opts = def
-  let doc = either (error . show) force $ runPure $ readMarkdown opts inp
-  defaultMain
-    [ env getImages $ \imgs ->
-      bgroup "writers" $ mapMaybe (writerBench imgs doc . fst)
-                         (sortOn fst
-                           writers :: [(T.Text, Writer PandocPure)])
-    , bgroup "readers" $ mapMaybe (readerBench doc . fst)
-                         (sortOn fst
-                           readers :: [(T.Text, Reader PandocPure)])
+  (doc, imgs) <- getSample "benchmark/sample.md"
+  defaultMain $
+    [ bgroup "writers" $ mapMaybe (writerBench imgs doc . fst)
+                            (sortOn fst
+                              writers :: [(T.Text, Writer PandocPure)])
+    , bgroup "readers" $ mapMaybe (readerBench imgs doc . fst)
+                            (sortOn fst
+                               readers :: [(T.Text, Reader PandocPure)])
     , env (pure $ force bigInlines) $ \ils ->
       bgroup "stringify"
         [ bench "stringify" $ nf stringify ils
diff --git a/benchmark/lalune.jpg b/benchmark/lalune.jpg
new file mode 100644
Binary files /dev/null and b/benchmark/lalune.jpg differ
diff --git a/benchmark/movie.jpg b/benchmark/movie.jpg
new file mode 100644
Binary files /dev/null and b/benchmark/movie.jpg differ
diff --git a/benchmark/sample.md b/benchmark/sample.md
new file mode 100644
--- /dev/null
+++ b/benchmark/sample.md
@@ -0,0 +1,1597 @@
+% Pandoc Test Suite
+% John MacFarlane; Anonymous
+% July 17, 2006
+
+This is a set of tests for pandoc.  Most of them are adapted from
+John Gruber's markdown test suite.
+
+-----
+
+# Headers
+
+## Level 2 with an [embedded link](/url)
+
+### Level 3 with *emphasis*
+
+#### Level 4
+
+##### Level 5
+
+Level 1
+=======
+
+Level 2 with *emphasis*
+-----------------------
+
+### Level 3
+with no blank line
+
+Level 2
+-------
+with no blank line
+
+----------
+
+# Paragraphs
+
+Here's a regular paragraph.
+
+In Markdown 1.0.0 and earlier. Version
+8. This line turns into a list item.
+Because a hard-wrapped line in the
+middle of a paragraph looked like a
+list item.
+
+Here's one with a bullet.
+* criminey.
+
+There should be a hard line break
+here.
+
+---
+
+# Block Quotes
+
+E-mail style:
+
+> This is a block quote.
+> It is pretty short.
+
+> Code in a block quote:
+>
+>     sub status {
+>         print "working";
+>     }
+>
+> A list:
+>
+> 1. item one
+> 2. item two
+>
+> Nested block quotes:
+>
+> > nested
+>
+>>  nested
+>
+
+This should not be a block quote: 2
+> 1.
+
+And a following paragraph.
+
+* * * *
+
+# Code Blocks
+
+Code:
+
+    ---- (should be four hyphens)
+
+    sub status {
+        print "working";
+    }
+
+	this code block is indented by one tab
+
+And:
+
+		this code block is indented by two tabs
+
+    These should not be escaped:  \$ \\ \> \[ \{
+
+___________
+
+# Lists
+
+## Unordered
+
+Asterisks tight:
+
+*	asterisk 1
+*	asterisk 2
+*	asterisk 3
+
+Asterisks loose:
+
+*	asterisk 1
+
+*	asterisk 2
+
+*	asterisk 3
+
+Pluses tight:
+
++	Plus 1
++	Plus 2
++	Plus 3
+
+Pluses loose:
+
++	Plus 1
+
++	Plus 2
+
++	Plus 3
+
+Minuses tight:
+
+-	Minus 1
+-	Minus 2
+-	Minus 3
+
+Minuses loose:
+
+-	Minus 1
+
+-	Minus 2
+
+-	Minus 3
+
+## Ordered
+
+Tight:
+
+1.	First
+2.	Second
+3.	Third
+
+and:
+
+1. One
+2. Two
+3. Three
+
+Loose using tabs:
+
+1.	First
+
+2.	Second
+
+3.	Third
+
+and using spaces:
+
+1. One
+
+2. Two
+
+3. Three
+
+Multiple paragraphs:
+
+1.	Item 1, graf one.
+
+	Item 1. graf two. The quick brown fox jumped over the lazy dog's
+	back.
+
+2.	Item 2.
+
+3.	Item 3.
+
+## Nested
+
+*	Tab
+	*	Tab
+		*	Tab
+
+Here's another:
+
+1. First
+2. Second:
+	* Fee
+	* Fie
+	* Foe
+3. Third
+
+Same thing but with paragraphs:
+
+1. First
+
+2. Second:
+
+	* Fee
+	* Fie
+	* Foe
+
+3. Third
+
+## Tabs and spaces
+
++	this is a list item
+	indented with tabs
+
++   this is a list item
+    indented with spaces
+
+	+	this is an example list item
+		indented with tabs
+
+	+   this is an example list item
+	    indented with spaces
+
+## Fancy list markers
+
+(2) begins with 2
+(3) and now 3
+
+    with a continuation
+
+    i.  sublist with roman numerals
+        starting with i.
+    ii. more items
+        (A)  a subsublist
+        (B)  a subsublist
+
+Nesting:
+
+D.  Upper Alpha
+    I.  Upper Roman.
+        (1) Decimal start with 1
+            a)  Lower alpha with paren
+
+Autonumbering:
+
+ #.  Autonumber.
+ #.  More.
+     #.  Nested.
+
+Should not be a list item:
+
+M.A. 2007
+
+B. Williams
+
+  *   *   *   *   *
+
+# Definition Lists
+
+Tight using spaces:
+
+apple
+:   red fruit
+
+orange
+:   orange fruit
+
+banana
+:   yellow fruit
+
+Tight using tabs:
+
+apple
+:	red fruit
+
+orange
+:	orange fruit
+
+banana
+:	yellow fruit
+
+Loose:
+
+apple
+
+:   red fruit
+
+orange
+
+:   orange fruit
+
+banana
+
+:   yellow fruit
+
+Multiple blocks with italics:
+
+*apple*
+
+:   red fruit
+
+    contains seeds,
+    crisp, pleasant to taste
+
+*orange*
+
+:   orange fruit
+
+        { orange code block }
+
+    > orange block quote
+
+Multiple definitions, tight:
+
+apple
+:   red fruit
+:   computer
+
+orange
+:   orange fruit
+:   bank
+
+Multiple definitions, loose:
+
+apple
+
+:   red fruit
+
+:   computer
+
+orange
+
+:   orange fruit
+
+:   bank
+
+Blank line after term, indented marker, alternate markers:
+
+apple
+
+  ~ red fruit
+
+  ~ computer
+
+orange
+
+  ~ orange fruit
+
+    1. sublist
+    2. sublist
+
+# HTML Blocks
+
+Simple block on one line:
+
+<div>foo</div>
+
+And nested without indentation:
+
+<div>
+<div>
+<div>
+foo
+</div>
+</div>
+<div>bar</div>
+</div>
+
+Interpreted markdown in a table:
+
+<table>
+<tr>
+<td>This is *emphasized*</td>
+<td>And this is **strong**</td>
+</tr>
+</table>
+
+<script type="text/javascript">document.write('This *should not* be interpreted as markdown');</script>
+
+Here's a simple block:
+
+<div>
+foo
+</div>
+
+This should be a code block, though:
+
+	<div>
+		foo
+	</div>
+
+As should this:
+
+	<div>foo</div>
+
+Now, nested:
+
+<div>
+ <div>
+  <div>
+  foo
+  </div>
+ </div>
+</div>
+
+This should just be an HTML comment:
+
+<!-- Comment -->
+
+Multiline:
+
+<!--
+Blah
+Blah
+-->
+
+<!--
+	This is another comment.
+-->
+
+Code block:
+
+	<!-- Comment -->
+
+Just plain comment, with trailing spaces on the line:
+
+<!-- foo -->
+
+Code:
+
+	<hr />
+
+Hr's:
+
+<hr>
+
+<hr />
+
+<hr />
+
+<hr>
+
+<hr />
+
+<hr />
+
+<hr class="foo" id="bar" />
+
+<hr class="foo" id="bar" />
+
+<hr class="foo" id="bar">
+
+-----
+
+# Inline Markup
+
+This is *emphasized*, and so _is this_.
+
+This is **strong**, and so __is this__.
+
+An *[emphasized link](/url)*.
+
+***This is strong and em.***
+
+So is ***this*** word.
+
+___This is strong and em.___
+
+So is ___this___ word.
+
+This is code: `>`, `$`, `\`, `\$`, `<html>`.
+
+~~This is *strikeout*.~~
+
+Superscripts:  a^bc^d a^*hello*^ a^hello\ there^.
+
+Subscripts: H~2~O, H~23~O, H~many\ of\ them~O.
+
+These should not be superscripts or subscripts,
+because of the unescaped spaces:  a^b c^d, a~b c~d.
+
+-----
+
+# Smart quotes, ellipses, dashes
+
+"Hello," said the spider.  "'Shelob' is my name."
+
+'A', 'B', and 'C' are letters.
+
+'Oak,' 'elm,' and 'beech' are names of trees.
+So is 'pine.'
+
+'He said, "I want to go."'  Were you alive in the
+70's?
+
+Here is some quoted '`code`' and a "[quoted link][1]".
+
+Some dashes:  one---two --- three---four --- five.
+
+Dashes between numbers: 5--7, 255--66, 1987--1999.
+
+Ellipses...and...and....
+
+-----
+
+# LaTeX
+
+- \cite[22-23]{smith.1899}
+- $2+2=4$
+- $x \in y$
+- $\alpha \wedge \omega$
+- $223$
+- $p$-Tree
+- Here's some display math:
+  $$\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}$$
+- Here's one that has a line break in it:  $\alpha + \omega \times x^2$.
+
+These shouldn't be math:
+
+- To get the famous equation, write `$e = mc^2$`.
+- $22,000 is a *lot* of money.  So is $34,000.
+  (It worked if "lot" is emphasized.)
+- Shoes ($20) and socks ($5).
+- Escaped `$`:  $73 *this should be emphasized* 23\$.
+
+Here's a LaTeX table:
+
+\begin{tabular}{|l|l|}\hline
+Animal & Number \\ \hline
+Dog    & 2      \\
+Cat    & 1      \\ \hline
+\end{tabular}
+
+* * * * *
+
+# Special Characters
+
+Here is some unicode:
+
+- I hat: Î
+- o umlaut: ö
+- section: §
+- set membership: ∈
+- copyright: ©
+
+AT&T has an ampersand in their name.
+
+AT&amp;T is another way to write it.
+
+This & that.
+
+4 < 5.
+
+6 > 5.
+
+Backslash: \\
+
+Backtick: \`
+
+Asterisk: \*
+
+Underscore: \_
+
+Left brace: \{
+
+Right brace: \}
+
+Left bracket: \[
+
+Right bracket: \]
+
+Left paren: \(
+
+Right paren: \)
+
+Greater-than: \>
+
+Hash: \#
+
+Period: \.
+
+Bang: \!
+
+Plus: \+
+
+Minus: \-
+
+- - - - - - - - - - - - -
+
+# Links
+
+## Explicit
+
+Just a [URL](/url/).
+
+[URL and title](/url/ "title").
+
+[URL and title](/url/  "title preceded by two spaces").
+
+[URL and title](/url/	"title preceded by a tab").
+
+[URL and title](/url/ "title with "quotes" in it")
+
+[URL and title](/url/ 'title with single quotes')
+
+[with\_underscore](/url/with_underscore)
+
+[Email link](mailto:nobody@nowhere.net)
+
+[Empty]().
+
+## Reference
+
+Foo [bar][a].
+
+[a]: /url/
+
+With [embedded [brackets]][b].
+
+[b] by itself should be a link.
+
+Indented [once][].
+
+Indented [twice][].
+
+Indented [thrice][].
+
+This should [not][] be a link.
+
+ [once]: /url
+  [twice]: /url
+
+   [thrice]: /url
+
+    [not]: /url
+
+[b]: /url/
+
+Foo [bar][].
+
+Foo [biz](/url/ "Title with "quote" inside").
+
+  [bar]: /url/ "Title with "quotes" inside"
+
+## With ampersands
+
+Here's a [link with an ampersand in the URL][1].
+
+Here's a link with an amersand in the link text: [AT&T][2].
+
+Here's an [inline link](/script?foo=1&bar=2).
+
+Here's an [inline link in pointy braces](</script?foo=1&bar=2>).
+
+[1]: http://example.com/?foo=1&bar=2
+[2]: http://att.com/  "AT&T"
+
+## Autolinks
+
+With an ampersand: <http://example.com/?foo=1&bar=2>
+
+* In a list?
+* <http://example.com/>
+* It should.
+
+An e-mail address:  <nobody@nowhere.net>
+
+> Blockquoted: <http://example.com/>
+
+Auto-links should not occur here: `<http://example.com/>`
+
+	or here: <http://example.com/>
+
+----
+
+# Images
+
+From "Voyage dans la Lune" by Georges Melies (1902):
+
+![lalune][]
+
+   [lalune]: lalune.jpg "Voyage dans la Lune"
+
+Here is a movie ![movie](movie.jpg) icon.
+
+----
+
+# Footnotes
+
+Here is a footnote reference,[^1] and another.[^longnote]
+This should *not* be a footnote reference, because it
+contains a space.[^my note]  Here is an inline note.^[This
+is *easier* to type.  Inline notes may contain
+[links](http://google.com) and `]` verbatim characters,
+as well as [bracketed text].]
+
+> Notes can go in quotes.^[In quote.]
+
+1.  And in list items.^[In list.]
+
+[^longnote]: Here's the long note.  This one contains multiple
+blocks.
+
+    Subsequent blocks are indented to show that they belong to the
+footnote (as with list items).
+
+          { <code> }
+
+    If you want, you can indent every line, but you can also be
+    lazy and just indent the first line of each block.
+
+This paragraph should not be part of the note, as it is not indented.
+
+  [^1]: Here is the footnote.  It can go anywhere after the footnote
+  reference.  It need not be placed at the end of the document.
+
+# Tables
+
+Simple table with caption:
+
+    Right Left    Center  Default
+  ------- ------ -------- ---------
+       12 12        12    12
+      123 123      123    123
+        1 1         1     1
+
+  : Demonstration of simple table syntax.
+
+Simple table without caption:
+
+    Right Left    Center  Default
+  ------- ------ -------- ---------
+       12 12        12    12
+      123 123      123    123
+        1 1         1     1
+
+Simple table indented two spaces:
+
+    Right Left    Center  Default
+  ------- ------ -------- ---------
+       12 12        12    12
+      123 123      123    123
+        1 1         1     1
+
+  : Demonstration of simple table syntax.
+
+Multiline table with caption:
+
+  ---------------------------------------------------------------
+   Centered   Left              Right Default aligned
+    Header    Aligned         Aligned
+  ----------- ---------- ------------ ---------------------------
+     First    row                12.0 Example of a row that spans
+                                      multiple lines.
+
+    Second    row                 5.0 Here's another one. Note
+                                      the blank line between
+                                      rows.
+  ---------------------------------------------------------------
+
+  : Here's the caption. It may span multiple lines.
+
+Multiline table without caption:
+
+  ---------------------------------------------------------------
+   Centered   Left              Right Default aligned
+    Header    Aligned         Aligned
+  ----------- ---------- ------------ ---------------------------
+     First    row                12.0 Example of a row that spans
+                                      multiple lines.
+
+    Second    row                 5.0 Here's another one. Note
+                                      the blank line between
+                                      rows.
+  ---------------------------------------------------------------
+
+Table without column headers:
+
+  ----- ----- ----- -----
+     12 12     12      12
+    123 123    123    123
+      1 1       1       1
+  ----- ----- ----- -----
+
+Multiline table without column headers:
+
+  ----------- ---------- ------------ ---------------------------
+     First    row                12.0 Example of a row that spans
+                                      multiple lines.
+
+    Second    row                 5.0 Here's another one. Note
+                                      the blank line between
+                                      rows.
+  ----------- ---------- ------------ ---------------------------
+## Porro'm modi {#nemine-amet}
+
+Aut ex quas v enim ut proin dui intaminata equestrem wisi arcui
+Earum praesidia est scientiam fusce rerum abominationem:
+
+> Per duis ut eum aversionem scandalum te testimonium afflictio
+> li paucis commune et consiliarorum nisl hac apparct facunde est
+> nemo nicolae, ad desiderabilem est pede antiguo, iste qui eros
+> conferre. Per odit ii id qui te ita romanorum typi dui
+> publiciter neque doming quae y rerum quo pignora ut liber sed,
+> gravatam nibh nisi dui netus imponere nam w error.
+
+Arcu, ab honoraria, Eaque modo aut vero 'imperia' te populo dui
+turbido si s funnii eu sollemnes. Me recordationem nemo w
+piscari ab qui arcu id praefixionem si s minim mirum---rem
+earum ad v nulla veritatem. Ad aut metus et calumniatores Saepe
+in adversis quas ut rem eu alias sint vel
+
+Palant Minus in Irrevocabilem
+
+:   Irrevocabilem prospera nisi te quas est congue advena hic
+    dicta defunctis pulvinar ad vel carbone.
+
+Me dui concilia, sem-cupiditate eaque, est persona sem mazim te
+caesarianis odit $d$ mercede e corporis parum clari admiratio te
+$d$; vel haeres iure excessivos ullo qui laborans quo typi nulla
+religuias quo lineam nisi dui regnare dolor te concludetur nisl
+$s$. Cras est quoquo'y innocuits heldonoriam at multaque
+ad y necessilate mi aut cadentes imperia se est armorum eum
+bonorum'd nam cursus'p moreae proponent id sit magna.
+[Gennere @liber:culpa, a. 30:
+"Non absentia totam ac ad lius saepe et te mentis tesiimonium,
+sed odit te cum me ac li. Decursu (0) nisi nec ex est eros
+maiores $O$ ad $V$ ad...; eum (8) typi E ab pede; eos (7) odit
+E diam hac te unde; hac (7) iste ad supponebat regnare esse
+meritorum ea reddet at magna; rem (2) ullo ea ipsa quam iste
+leo probitatem (6)--(9) mulier.  Arcu A illo ad virlutis eum
+quo tibi ac affectus sem maiores eum illo pede ut purus me
+cognomina. M tibi ullo cumulabat id sed iste numerus hic sit
+vitae ab volumen $W$ ad $O$ ea ...  sed iste A fuga te ex
+fuga. V ille sed il rem nec tibi vero li.  Hac, molfstum ea in
+me invidii per iure ut elit dui ullam, tibi sunt ea ut d
+nonullis id ullam aemulam $O$ ad $E$ eu ..."]
+
+Nam arcu qui semper praeclusa dis assum te aut possimus?
+Te ti si m proprium te a exaudire lius arcui Porro'e
+dispositae ut lacus, quos at ita neque (se louor dolor
+magni) cum ad praesentia odit ea denuntiando renasci,
+quo ex non adversis est harum id leo mirum proprium ea
+peregrina est secure at est quasi.  Ea typi nunc, netus
+te ex *substitam* dis aetrimentum qui augue ut dui quasi.
+Dis Error purus et sunt wisi dui metus auriacus nec arcu
+d error (mi polonia) nemo il vel ipsum me dui
+sit pede defraudator colubros.  Ad nisl quod arcui at ex
+combinatur occumbere est defensionis dis eorum.
+Frustra sint, Neque donec mi ad quarta, aut pressa te optio id s
+iniurias te essentiam e instanti justo suspiriis nisi hic
+regnante.
+
+Saepe vero hic diam ea tempore---ex equestri in est cum at
+stilum.  Aut ex mus quas nec id erat typi eget et cras.
+E perltum usus id nam substitam,
+
+(@deliciae) Eos ille sint fuga propinat antecedentia eius.
+
+Te mi nunc, pede, hic qui fortiumue in porro est scripto's
+eripere: nisl typi diam M vindices
+antecedentia duis. Hac veritatem eum victor sint aut ad corpori
+ad dui populo et effeminati respectum rem hac mirum at
+oportunitatis possujnus:
+
+(a) 'Eum ille sint amet' si diam scelerisque ut a vero donec
+    odit eum ut dui ullo nobis at recompensam mi illo lius aut
+    supplices et 'illa'.
+(m) In fuga quo dicta id s harum fiant nisi dis desiderat ut
+    'elit', li id vel civilis eum.
+(p) Nam titulum lius modi te nisi eius W.
+
+Vero, hic volscens (@criminis) non donec ut qui est termino'p
+harusen ornare esse ti 'ille' ut aut maximum plateas. Si in
+resistendi mutationem mi vel genitores quae magna exlusis vel
+typi nostrae est elit sed est eum-elit odit fames velit, ac incudem
+ipsum te y typi te sit. Barbarus, leo inculpare pede te o
+malevoli hac, saecula te malesuada *excindere* id diam leo nonummy
+mirum. Ut usus dis joannes
+eius praesentes ut o putabat eos (nisi ac justo) ea d donec
+atque eius te facer ut publico [*vero* @qualitatem:regressum, s. 44].
+
+P animi typi nobis eum quod porro wisi ullo, eorum a purus
+notandum eos ea quae id competentem passionis prosunt.
+Vel sem sit eorum ut rulpeculae profundissimo arcui
+eodem conscios ad ducimus id typi mus?  Erat eaque utraque.
+Nonummy vel antiguo usus,
+
+(@quae) Eros te dis illa wisi quasi nobiles desolationem odio.
+
+At neque nisi est formidine nec aversionem iste habitasse, aut.
+Consiliarorum nemo aut elit, ad ii lacus li aut scripta ipsa
+
+(@eodem) Arcu te dis augue nisi louor solenni conscientiae eius,
+
+eorum 'purus' te ac numerus eros, ab ii per modi
+
+(@nisl) Eorum nisi omnis perltum partinuculam odio,
+
+stipula sapien sem salutis ut diutius risus sint mazim
+hac in praeiudicatum.
+
+Aut ti combinatur consiliarorum colubros est obesse si protegere
+est minim postulatu leo murrnur antiquo ut consectetur, il mi
+interdum nec est concernit in (@quae) *lorem* ad a urna
+si reclamente praeiudicatum. Nec memorabilem aut dicta formastis
+leo reverti porro ut qui cursus in auxilium (@vero) morbi usus
+te reponat maneant earum hac ipsa dis stilum etiam aut
+'tibi'. In cum orci bonarum nisl fames 44 ea eum tutori ad
+'elit', enim odio per mi custos ut quis sint te urna arcu mi aut
+14--85 me nisl metus incolas exdivisionem eget. Eum metus ex
+fortem hic dui multitudine nisi erat est 62 eu ullo uidem
+liberum crudelissime nibh. Ad est lorem quod, il sed
+gaudere 81 eu typi arcui ac elit, nam ipsam est eu oculis
+est sint posteritati. Se qui arcu at (@incidunt), ea vel vel cras in
+pede error leo nobili iusto vel 'elit' typi at saepe in prosperis
+leo minim veritatem leo persona proin mi emolumentum. Est in aut
+quos in (@quae), ti parum, ea ea. Te mi difficile, ipsa, est
+Magna'a accumsan mi usus rerum mi rulpeculae consiliarorum sint
+monoculus nisl (@modo).[^aspirat]
+
+[^aspirat]:
+    @alacritate:erubescam [ea. 14--0] neque o blandit vulputate:
+    "Te Y rem ut cum 'Y unde ut augue ille ad claram ad quam
+    induccre si quas urgebant', quo excessivos orci Y arcu quia arcu
+    tacere eos quae eodem supponebant dui subsequi foveam quo aut
+    aquilac fames eos ad indolem modi ad in sit meretur."
+
+
+
+## Alterationes
+
+Augue'p contemnebat per nisi w massa profundo quo ab nemo in
+dcfensionem essentiam viverra, quas qui pretium provocatus.
+Ab quam usus sint odit denegare modo dis ab leo vacare: modo hic
+decipitur molles (@quam), aut aemulos, autem id ex incudem
+postscripta typi vel timorem per innumeros qui se suffragia in
+est cursus. Diam dicta ad mus morbi porro odit nisi?
+
+Eos debilitatem mi iste abominationem mi urna rerum videre ex
+memoria ex est verbum'v innoccntiae mi a liber convallis zelabant
+ab dui moderno.  Harusen est februarii'y defensive at (@quae)
+te secretiora iste y *lacus* id justo authentica uantum fuga y spiral
+cum. Ad elit erat si ullo victor mi Apparet SE, aut
+sit ea leo enim ea ad vestri eu dis Molles Risus si Consiliarorum.
+
+Florem nisi dis Eaque, hic rerum te o cras odit 'tibi'
+te a usus ut benevolentia mi y naturom---lius te, te w liberius
+orci publica te justo longas. Perltum, est innatus nec est
+fortiumue se hic porro m eros ut antecedentia leo 'illo' at est
+sunt
+
+(@eroS)  $d$ si ille lit est legunt ut $v$ mi regibus diam $v$ ea.
+
+Est moderno ipsum ut glaebam nunc te proprietatem
+sint modi *me* assum: nam nisi subsistere a futuri
+ullam, vel vel te uidem te consiliarii.  Securus eius
+eorum p *harum* eros id perfectionem si est quod vero altero
+nostrae nisi ipsam diam ad debent est ex v nostrum nemo id
+perennitatem wisi (@quoD).  In ad, modi mazim *id* e totam
+paucitate est
+turbido ordinis in emolumentum nisi (@cras), sed est iugulatur te
+te m capitale te personami nisi vitae ullatenus, ac est Soluni Minus in
+Promotionibus assum qui wisi nemo.
+
+Secure, ti hic est caeluni *ad* essentiam
+ea emolumentum *Cunctando* wisi 'elit' dis p eaque nunc
+ut antecedentia, diam (*eros* Purus) dui suspiriis te
+te s spiritus mi
+pede vel deliberatissime sunt justo convallis est gratiam
+lapidem ut contemnebat: nosset,
+nisl nemo te hic lius class odit nemo est excelsum id
+magni *illa* (se massa *elit vel s iste enim mi typi est*)
+doloris praefixionem ipsa. Desiderabilem unde mi
+anteriori peripateticorum sed urna leo egestas sed nobis
+contemptus lacus hic liberum.
+
+Eu cxpeditis dui sunt ullo error massa nunc p
+*Subvenire*, ante, Saepe donec id ad regalibus leo
+significant nisi autem risus ab y *porro* quos mi desolationem
+te e facit solenni sequela. Ut ut est risus eos.
+Per parum et expeditionem ut est arcu zzril rem vitium in 
+modo nunc: mus est et ordinem ut successus?  Mus maximum,
+auctores fusce destituta error te crudelissime ut y reddite
+Prophetia platea rudera:
+
+(e) est SE semper si Opprimere Orbare non D NETus Patria.
+(p) est cumque nisi Quas'w Originem.
+(y) est versus tetnpore te Est.\ \hic{sit:exprobrabANT}.
+
+Sit lacus quis est aut quam caescs, hic quis est dicta
+procedemus mi e iactantia novitatem animalis wisi gordius
+si nisl deesse. (w) tibi se ullimus et conscii cum et est
+amorem ii nec cras eu contractus earum ex Prosperit'a
+soluta tantum. (p) illa erat mus ii sed quos justo decima
+iure, quae ti quo quod dui esse servire ipsam mi saluto
+arendom.  (p) hac aut erat ipsum eum id qui moreae te iis,
+est il illa erat rem occasione ti ti mus magnam ut nunc eu.
+Ac s infamia nec, uidem optio ac mirabilia parum in
+contribuendi ut e libero muneris.  M nunc id dominationem
+ullo (@eroS) elit veneni eum te sem e magni in
+tibi facer avertat per si hic subsidium at *ille*.
+M neque vero in gloriabantur elit est me wisi, leo nisi
+ut eu cursus hic adipisci ti si qui o esse si desolationem
+te vel quam saecula. Eu ad quam, est ducimus
+ipsa quaeque naturalcm d vivitp nulla, il Massa'w
+heldonoriam typi imponere ac fugit exlusis contraxit
+orci negotio te nulla profes si si ea
+leo. Qui publica urgebant nisl
+sint tyriis justo ad gaudere id fretjuentia.
+
+Mus ipsam optio per debitam ut ex odit romanorum. Mus scomata, in
+memoriam leo rerum te 'et animi ad illo ex aut Domina Totam
+Lobortis', D massa p tertio viscera minaci laudare. (Cum rem,
+est omnis diebus fames urgebat et turbido aut apparet, erat
+reddet se aut fortem ut dis ditiones, sem ab ad.) Est Y nam pede
+ab enim hac quod *dextre* elit interpres quia ad at elit harum ullo
+saevire. O ac attendere e subsidium, est dui eaque e quas
+id praefixionem at vel odio '$e$ vestra'.
+<!--
+Vero vel nisi nisi W ea leo quae non esse consiliarii tibi
+e wisi ante eget ad
+at ille nisi qui assistere ut 'elit' ipsam se ac commune
+leo salubre iste V earum s postscripta absentiam.
+-->
+
+Hac eos nisl sint ullo in vel vacans in vindici est maiestate.
+Eu aut esse te 'si alias ad elit se est Sortem Clari Bellandi',
+louor te concernit in me celeritas nisi abundanlia donec est
+nisi et neque. Mi modo se claritatem, est proveniens typi ad
+discedat nullum si rerum nullam si nisi P eu originem, hic ad
+quas gratiarum mi etiam et si exclamavit sed hic ullo lius
+in sem risus certus quis gordius.  Ex qui eros ut 'illa',
+quia nec me iusto mi?
+
+Usus comestibilium eget ut nisi neque.
+Noverca, nibh elit sed, leo optio morbi cum eorum te 'tibi' ad
+consolari d ullo, eos ea hostem qui sapien dis eleifend
+populum per eum cxcusat id ab incarcerata
+[@intentione:regressum, ea. 305--412]. Felices in
+malevolentia esse fames iste cras mi regiae [quo, est dolorum,
+@porro.praetorito:moriar; @rerum.iniungimus:aliquip], est O ac
+est omnis te patriae est iusto usus. Mandata, W illo
+pietas culpa aut gualitatibus nisl p harum donec rem
+praeditus d munditiem complices, si m quo odit si haeres
+et ea.
+
+Sunt subsolanea, ex intuli, in hic ornare te
+omnis mus poenis quasi quocumque per promotionibus.
+Si desiderabilem te si decessu, ex leo Multas Minus,
+il id dis angeum est est numquam te numquam o necessitate
+neque. Nam cumque amet eaque mi *himenaeos* leo eorum leo
+bonarum theatro. Ut sint rerum te imperiosus te d
+sem-circumcirca per ad aut corpore'm assum, ante ii mi quae vero
+si hac sem qui numero id mirum at ea nisi. Ac sem quaeque iste
+aut commodo sem
+est secure unde neminern tristique certitudinem ut netus
+'ille'. Ad etiam fuga minim wisi est purus vacans odio uidem id 'illo'
+illo fuga ad intestina, nam fuga est similique saevit scandala
+(ullo activitas obsidionem).  Ea ullo urna promotionibus ad vel
+Oculis Fusce tibi est ea coronati. Nec proper sem unde orci earum
+*sed* secretiora nisl 'tibi', aut per ille dis eu id a excludit mi
+quae sunt assum *aut bonarum* denuntiare ullo 'ille'.
+
+Nec condigne rationaliter maecenas ut typi fuga ut donec in in
+segete nisi-peripateticis [te est eorum ut @saepe:jagiellonicus].
+Iure ad dui eventu lius cras
+tincidunt usilata omnis amet ii autem hic praedam at unde
+mirabilia cum modo aut pede zzril eu 'ultimarie' nam assum
+temporis ipsam dimittere, ea dignus nisi
+veritatis temporis id saepe ut 'elit' eum unde dis quam optio eu
+'elit' quo porro classica atque quia in illa.
+Hac impiorum ut minim iudicia eos insolescit caescs
+grutiilntiones ea qui stanie moderni si dui rerum quis proin
+cum te rhoncus erat.
+Ex rem sentiebant typi aut duorum'a nam commune'w
+publicissime te dolor 'tibi' arcui usus vel cxpeditis wisi
+cicatrices lorem populum amet melius qui vero eodem mi 'elit'.
+
+Cum liber saepe nisl dis "activitate iniurias
+te nobis" lius id spirans mi Earum's 'violentia' usus
+at incolae urna.
+Magna per eu renasci ac collaterales eum elit ille ex ambulat non
+illa p typi diam sunt ac in illa typi dis praetextu at 'elit'. Eos ut
+risus non molunt necrssitatis turbido viverra, et est republica
+mi quinta exaudire compensabatur si activitas teniet cladis,
+nisi eventu est ab est diam consilii partibus in 'elit'. Est
+nibh in fuga munditiem at nisi-jagiellonicus id qui fuga sint, se
+falsus at possujnus rulpeculae eu viverra vel quos stante me
+optio purus, hucusque eros li vel vero ullo clari saepe belgos ex
+interpretes in dis quae per. Nam ab ab unde ullo nemo: superue
+non sensus proper praesentia ad ultimam quasi dis nemo lingua
+columbam, per duis nam est notandum in lorem ut optio
+reprehenderit in grutiilntiones ea respectum typi quis utinam
+saluto veritatis ornare te vel *quam* 'ille'
+[@parum:largitionibus, nam. QUAe]. Arendom si odit,
+il te est castrorum harum mi
+aut regnantis, est aut imminentia, nisi optio est parum.
+
+Est ad proin *sit* si nisi ut qui posteritatis: iste rerum
+porro te benevolentia per attendere m Bonarum *Manebimus*, sed
+nisi quasi nec ea parcam convicia unde in earum
+eodem est pressa te autem cxcusat te contemptor se rem si cumque
+et ea. A vitae sint hic iniunctum sentiunt falli fames a
+propter ducimus dolorisgue dis praetensionis ullo porro prandium,
+culpa O illo cum sociosqu.
+
+
+
+## Censuram: odit cum nisl
+
+Ab quo dui dapibus, il illa eu ultimus te alias nisl y
+turbido arcu. Avocare leo exarsit unde at non ridiculus,
+
+(@dictA) Y nibh cum te fusce iste nisi quia,
+
+hic nemo impetus in eleifend arcui nisi odio mus nam
+ut modi.  Y pede se rem magna nisi promotionibus nam
+vivitp. Mus raritas quo arcu *expedita* ut guadraginta
+subiectum class y innotescet wisi amet, est carbone hic
+maiestate per eu eos ut natoque lacus nisi erat, ea
+at vel mi p dimidium id hungariae fuga rem autem.
+
+Odio id aut in nunc nisl est anteactis mus
+quisquis usus minutissima magni aut pectori'v
+captivatio:  ullo mus natus est te nobis y eleifend nisi
+amet, nisi ii et miseriae parata sunt hilari (mazim
+'nisl' nam eros peccat fuga 'wisi'), nam ullo cum
+origine aut si novembris omnis nam nam saepe.
+In mi eius est te quam nisi vero ut leo praedam'y sunt et
+dimidium (@nullA) per me nascetur:  vel
+potentiam, dulcis te quo leo similitudines, mus
+oculis quod tui ut qui nisi magni.  Ea leo
+vulputate sem *assum* lorem iste amet sed dominium,
+rem hic purus eos ea servata. Ea odit eros,
+dui ulteriorem hic numerus risus at volumen ad
+vestimentorum per ea est, *patriae* hic abominationem sortiri.
+Quo poloni te piscatores promotionibus ut quasi quas ut
+iste te mercede te ea fallaciloquae dis, dis
+\alias{inaugurationem}
+gennere ut o perturbationes leo [@capita:hac, se. 415--96].
+
+W pede quas senectus ad aut sint vel intendo sem
+e moiioculnn iste modi ut fuga.  Id vel, quia dolor mi
+s erosem delenit: est iure non praeiudicatum funnii,
+qui est ordinis eos tellus te usus regimine in iis.
+
+Rem compellere abominationem nisl d absoluta
+substantiarum nisi 'lius', duis, li saepe ullo (m) aut recurro
+ante hostis te accusantium naturalcm facer y iniungimus aligua,
+non (w) dis cursum eius occasione magni option dis decursu
+dextris. Eu novembris M tibi cum wisi arendom nam caduca quia
+*caesariani ea* se possit.
+
+Orbitam dis polona ulteriorem perversa te illi neque subsolanea
+deliberatione fames, V me est usus te quorum
+rem rem eros troiano te erat ex festinatione pusillus arcu, autem
+harum claritas id leo vero assumenda purus est 'ille'. Honoris
+vel dimittere convicia:
+
+> *Subsellia:*  Sequi wisi modi eu mus cras?
+>
+> *Impetus:*  Ac E amet, *lius* nam.
+>
+> *Munditiem:*  Qui S sed'v vero risus nam per nemo ea
+> 'wisi'.  Ab cum quae sint duis $P$, ex typi nibh $Y$, se...?
+>
+> *Reverti:*  Nisi, *lius nisl amet* mi gloriatur hac te est
+> unde minus in ea, aut O plenus'd elit sed fusce.
+>
+> *Freuentia:*  Non amet 'nisi nisi orci', leo rem eum'o
+> illo ea sequi eos sem mirum me 'typi'?
+>
+> *Intendo:*  Sed nam quam ante et christianitatis?
+> Te'y e christianae laborant desinam iste typi sunt ut typi eget
+> M ea iste modi A, nec M hac'p quod et ea duis mi legali iste
+> privatus id neque te uidem si li lacus est nibh 'ullo nisi ante'.
+>
+> *Crifninae:* Dui nam quo A asperiores sed ii D mus'd elit
+> fames odit fuga nec dolor?
+>
+> *Indigne:*  At ut perare vel abominationem sint ad error
+> d tertium saepe at o virescit gratulatione supremi.
+> Ex 'lius lius odio' M nunc iste sint nibh; rem praesentes ea
+> arendom nec quam diam 'odit odit eius' saepe.
+
+Nec sensus dui labore te wisi-largitionibus te
+renovo modo te iste 'iste' te pietas publico-cxpeditis.
+Tot quas in 'nisl' sed fructum ut dui voluptatem
+nisi est opposito mi 'typi' habeat me obsianie restigia at est
+fremebat si 'nisi', nam cum zzril buccis typi-aedificatione
+et saepe nisi nemo augue in 'lius' non non qui purus mi
+nisi rationibus eum malleum mi il.  Est quae li error te hic
+laconice quasi et meretur miseriae reverti aut numerum te
+utrunique in wisi y architecto per in 'nisi', est quidquid
+regalibus in w praesidia mi sed: est recurro sed fugiendo
+molestiae cras ullo.  Te leo ornare pede est incusando
+mirum lectus dis honorem putatur ut ipsum id, calumniatores
+hac liuius.  Eiusdem si vel significat expirationis mi
+culpa accumsan, ad ut mazim nemo at 'nisi' (aut exemplo, mi aut
+collocare justo publico si dui egestam), per offecerunt.[^magnatibus]
+
+[^magnatibus]:
+    Quis si magni amet habitant nobis eum qui moderno autem
+    mazim id arcui manebimus. Ad @error:largitionibus arcui et
+    praesentis dui laesae memento, mordens sem nativa si nunc
+    ultimarie et vel minim tibi facer ut sequi lius iste
+    nobilitas id w cxcusat ut qui mollis ea nonnis, "W saepe S
+    rem saepe---enim V nemo et ea dicta erat dui ac porttitor."
+    Enim eodem nisl sed docebit et cras ipsa decima unde ad
+    'sinistris'. Cum arcu *est* quo, "Cum praetensiones eu: erat
+    *O* vero me 'victualia' ut ex contignitate te leo multis *ac*
+    hic unde." Qui nunc s massam detrimenta e numerus me fusce
+    'nisl' te lorem et e forlitudo iustam odio qui numquam eget
+    placida ut me oppressit te, ex modulumina et misunderstanding
+    id est ante fortem.  Regula'p vero-occasione Cursum/Magna pignora
+    [-@specie:iusto, y. 739] unde aut quae temerario. Eu
+    dis imponere Dignos incusando, ad gothica mi nam 'typi'
+    et culpa *eget* in dis nuntius se'p restigia in non mi w lapidor id Duorum.
+    Qui ullam martii nisl ipsum coronati sed non mus est arcu
+    assum li innotitit ut cum odio
+    ea fructum in omnis id, dui me ex aut vel p metus custodia
+    iste ab at anfractus in m civilatcm vergit eius ea gratiam.
+
+## Hac rationibus testimoniis in rerum prandium
+
+E odio at nostrud wisi hic qualitalibus'm inncem id sint-jugiellonicae
+dicit dis augue error nisi 'tibi' dis p blandit perare.
+Ea ab lacus: A me est optio ullo se missae totam in
+'tibi' ad vel fames et 'wisi', ac ad pernidem gentium-iniunctum
+carceribus.  (V elit se importunas se blandientis nibh te est ante
+est director.)  Rhoncus, *il* aut contignitate ut totam nisl
+quam mi 'ille' serpens donec parum mi abrennuntiat nisi
+vicinarum dignissim devotionem, quia 'tibi' in
+typi 'nisi' et vel victualia occidas. Aut duorum platea ossibus
+*contrarium*, qui modo vel modestius, leo quam mi
+personaliter ii rem ea cras te armorum at p troiano.
+Rem bonarum sem rem li et nec mus eu te stupore, rem dis
+abominationem id eu republicae (te animi ab est Pullus Fusce)
+est pressa eius subiungam nobis hac sint et.  Typi-grubianitatis
+sed erat cedere o moreae equestri conubia est 'ille', aut ti
+orator sunt odit lius ornare fuga: constituemus eu mus id
+est intendit causavit pede suspiriis in est nicolae ad
+est arcana regimine eventum.
+
+Nam exemplo, at fames, ut lius.  Causavit ea aperte gennere
+wisi m donec optandum nisl (@arcu) eos ab eros te consectetur
+s harum offensa, fusce te qui odit eos porro termino eos
+iusto pede mi promotiones lius odit seuuntur: minus per pede.
+Ut typi si liber, ipsa vel desiderabilem si noverca, ac dui
+Altero Culpa, est duorum error mi ac odio ut benevolam mazim at
+mirum id leo armorum'w materias viverra. Mus nisi-oportunitatis formam
+iure wisi nisl, posuere *sit* te vel inventore recurro columbam quo
+intermedi eu est secure januario maiores si est curiosus.
+
+Quo sed et iustam lius charisma quasi ad mi ullam typi
+culpa at lius hac error nisi o arendom cum avocare
+facer 'tibi'.  E ad est unde arenam eos minus ad sint vel.
+"Plenarie mirnbilitar" rem esse nisi 'elit' at
+d firmare-nominavit eros, ad p turpis te sit sanguinis, elit
+caeluni commodo nisi hucusque sem eos vestrorum ulteriorem
+'tibi' mi circumcirca vehicula ferocitas o mirum saeculi
+si subsit rulpeculae [@neminern.veneni:praeteritis discursus
+nisi animi lectores conflictus omnis leo ea clectione cubilia
+"gradum leo molestiae"].  Y sunt il ea nonrerelationem nisi, et s
+voluptates vindica, w serpens totam cum minori
+
+(@dominicaE) Saepe opponite nam hic tibi,
+
+honoris ullo diam sem hic elit dui o rerum, se
+
+(@impaviduM) Purus gratnlor non elit,
+
+
+scomata nisl sunt eum tibi aut Germania ullam-annuere. Scomata
+hic difficultate te opposito commune hectorem te nam et vel utrinque
+videtur antiuitates id 'illa' ad et suscipit naturalem si
+aequaliter ut dis commenti id metus, fusce id quo vel deorum
+nec sessionem eius hic arendom augue.
+
+M cras complecti ullo mi regulantur morbi me te zzril iste
+id eos facer recenti, magni id e martii sentiebant mppono
+id poloni y gaudere minim cras ad d subsequi iste (@quas)
+ac (@dispendiO), sem iste si habeat purus ii te sueticum dui vel
+congue si nemo dui ipsam at culpa at hic integrum corpore.
+Eos nugator, il aut placeat id dui quos id (@cruciatuS) rem
+
+(p) Saepe absoluta nec ille est Merentur animi-quaedam.
+(y) Massa luminare eum elit dis Obsequio miseriae.
+(v) Rerum quidquid hac tibi est ab Inducere massa.
+(y) Saepe absoluta eum illo dis o massa.
+
+ipsa ti eum se palant prosunt ullo est posuere lapidem (a).  Mi
+capere, bonorum per poenam hac leo purus se indolem hac
+illo orandum eos at ad ut ea elit dui ad Aegrotus justo-poenam.
+Dis ti me nam se sint-diligentissime lacus 'elit vel', odio est fuga
+utilitates nisl te ullatenus est innumeros arcui. Nam armorum
+iste in ea moreae y quia erat revclationem eu qui partibus
+si 'iste'.
+
+Dui typi hucusque consultationis qui semente, dui dolor natus avocare.
+Y ille himenaeos eius quae, ante omnibus quia in usus litora:
+
+8. Per dissimillimas leo dis militari coronatum atque non
+   hic ad iustum persona.  Rem aemulos mi protractione
+   ab v dynamicus proin in orci sufficientiam genere eius dis
+   saevire at obstrinxerat se m actiones dui 'wisi'.
+
+5. Orbare, il in aut arcui iste est quaedam abiuravi nec o
+   probitatem innumeros uidem in quia.
+
+0. Usus quam est regnare arcu urna p iniungimus discursus mazim
+   te enim, sint in qui erosem id assumpsit dis carbone'e protunc.
+   Usus dictabat in dui urna malesuada porta, hic avocare
+   alias mus o patres nominum interponitur arcana te 'elit'
+   odit pede gloria subsolanea (ad autem mentis laborandum,
+   ti non modi) te mirabilia ordine.
+
+Ea superioris vel nihil volumen, mus sed fuga te non nisl at
+dictabat ut statum (a) error, est violentia mazim sit ad
+apostrophe diffidis nocturnum eventum et nam typi 'ille' id
+(@custodiaE):
+
+(v) Eodem voluptas per illa hic iusto-numerum at sint proprio.
+(y) Error sublirne sem elit qui alias-carbone ut wisi iste.
+(a) Earum faucibus hac elit vel vitae-securus mi nisi longas.
+(e) Parum urgentis non elit est alias-numquam mi ullo omnis.
+(o) Saepe originem nec elit vel nulla-decessu et animi
+    depopulatores lorem.
+(w) Earum plenarie rem ille est hic etiam-numerum eu quos.
+
+hac ac me.  Mi te dis minus mi ad pectora te quia quaedam fusce
+te risus dis rhoncus patriae.
+
+Nam vitae mercede iste ad eget s modo meritis dolores lius 'iste'.
+Cras ti d regnare te privatio, mazim rem fortitudinis
+urna incolae egestas lorem leo hac captivare enim optio civilatcm
+saemre. Ante massa, quo---est eius nisl muneris, nec nisl
+qui-eius perare te saluto ad est facunda, eum est collegii typi
+quoquo leo nullam, non est ullo primum possim dui augue, non me
+se.  Arendom, il at nunc
+certus et consulere metus debile numerose sociis at concludetur
+si sequi 'ullo' odio ti te et vestrorum netus praecipue autem
+duis vero in fuga.  In nam soluni te m purus nec quam
+
+(@donec) Ipsa porta exprimere
+
+non illa absoluta se numerum mi ab anfractus at dui massa.
+Id mus fames et omnis in dis molunt, ea m operom ut multas,
+ex est iste legere cedant qui donec, quo tibi usus te ab
+provident mazim ut humilime wisi.  Urna at aut adversitas
+(s)--(m) aut manebimus semente foveam odit nibh id "iunctis"
+aligua.
+
+Rudera, ti donec minister iste id ante augue barbarus quos m
+invocatione deorum civilatcm si qui nemo eos et mazim contemptus
+non studere sit est leones.  Te per quo aocessu nec lingua
+(@diverterE)
+
+(@hac) Me quo unde tibi leo o nulla-quoquo te sint tandem,
+se at odit arcui, se et lius nisi?
+
+hac nam tertio at est est haeres, "M sed'e quas, S duis'y utinam vero
+eos id sequi lieipnblicae te ante."  Urna ti rem me est
+s insldiis arduas, eos scientiam illo eos ea nisi ii
+salubre p sed-malevoli nobilitas, rem leo
+m quo placerat quae ex est quis ut pygmaeus et cras praesuli?
+Vero hic tempore nisi 'nisi' cursum nunc amplissima. Ut error
+distinctio februarii ut sed 'nisi' effectu missae p conditiones
+guttae at eget, est mazim 'ille' fuisset domine genere dolorem,
+non, (d) eum (s) nunc dui eros periclitanti at est quae non.
+
+Duis te pede, esse li maecenas *est* nemo constantiam
+prosperis meoruni et eius, eos arcu il corpore *minus* novembris
+minus, ullo sequi hic viverra est crudelitas testimoniis in
+excelsum vestimenta. [Ab irritare id dui magna vitae natus,
+leo etiam si pede in @bonorum:occumbere [eos. 2]; @honoris:quam
+[usus. 5]; eum @magnatibus:congressu.] Ad Justo Liber Arcu
+sacerdos, 'est leo a sem' mus cras forlitudo piscis:
+
+> Nonummy sint Eget te januario earum dui eos Donec at
+> iriure eaque dis. Carbone hac nunc nisl Porro mi vel est p eos
+> nec ab exequi s haeres ipsam vel quantum sufficere, minim numquam
+> rem urna typi Amet et dis vel s non nam eu eventu benevolam sint
+> ab te et leo leo hac. [@sunt:iteratis, m. 96]
+ 
+Eos consensu ullo, te irritare at w parabolas fames, 'qui' ut fuga
+substitam te w abdicationis moderni *quae* wisi contractus
+e "feugiat" eos toties qui tetnpore consurgunt fusce. Ad ea
+*est leo se $E$* te in ab sufficientiam minus ipsa v ferient
+$A$:
+
+> Error, dui nescit-cras-est, sem similitudines
+> eros sem eget mi dis quod dui d rem te totius; vitae Erat, est
+> utrinque-quos-vel, mus dissimillimas quae nam erat usus
+> consiliis ipsa mi quos est y hac, eos nisi’y quas arduas id
+> simultates, qui omnis carbone deprecor est unde sed et pede
+> iustam. [@orci:licentia, d. 46]
+
+Eum v doloris te ea dependentias risus v volscens contrarii, duis,
+serpens quo moreae atque nemo et secretiora dui nisi ex
+d competens louor hic ea s vero id satisfacti.
+Prandium omnis cum excepto ut qui eveniet non rem imperdiet,
+odit hic nisl lacus reprobo ad probitas ut Est.\ \dis{sit:nisi-dolor}.
+Morbi typi lacus non elit leo y nisi odio at nisi harum?
+O, E, S, sed D?  Ac nisl O sem M?  Si earum in ac odit 'illa
+dui d typi iure id iste eodem' sed ab quod at lydius
+mus.
+
+Quo quis iste aut resipiscet mirnbilitar at appareat eminentiam
+te fatalis id est doloribus si w respectum facer te quos ante
+vindictam urna ea eget, wisi Clari HaEres, sint magni sem usus
+ut scelerum iaculantur sint ea aut esse mi quod eos rulpeculae
+te a gubernium sequi ut tot:
+
+> Optandum d natus mixturam debitis ea vel apprecando dui a eos
+> magna. ‘O modo praetexto illa quam natus se leo elit, si dolorum
+> aut quia---magna o fuga, ac w impetitione ad principes. Est ac
+> opiniones tibi!’ Quae magna diam non saepe ea ‘elit’, aut saevuli
+> proper hic non at modi totam sint quas eu adiurando at ita in per
+> cognominum culpa, est iusto paucis minaci typi enim ac rem nisi m
+> ‘odio-decessu’ conscios: ‘Eius O quos id attendere risus 34 te 46
+> typi elit’. At animi aut duis ex lapidem leo mi nisi quo
+> competens nobis, est ti liber se esse in mus eius laborandum
+> natus uidem nesciunt ac iuribus dicta. Cum generali sed modestius
+> facer sed perpetuitati, est nam’d hic expedit leo libero typi eum
+> elit hic e sunt ea ille vel a simpliciter; at typi, sunt non
+> augue zzril nisi ac vitae minus dui w erat me aut d impetitione.
+> Ea omnis urna niililps proponent fusce odit hic arctiora quod’m
+> explicabo? [@acerba:neminern, w. 649]
+ 
+Se virescit te leo perpftuam-caeluni aliquam felicissime ea arcu
+urna tyrannidem ea qui, est terrestres *protunc* te exarsit
+ad arcu ad enim elit mirum quod in quod wisi indigne.  Sem
+quisque, te nam piscari se sem mutare te metus calculationem polona
+at antecedenti e insultum'v iustam, at semente qui.
+(Ex 2929, dui Profundo
+Dictabat'v vitae in ab hic ipsam'e llmites solatium
+inncem ac dis secure si wisi coronati.[^legentis]) Cum te
+operom criminales veritatem te dis populum ut nemo kominem vel
+"inconstantissime" contrarium nisi 'porta' se 'class'. Me
+coknbitandi octavas sed liber at beatae fuga disordo, sed quo te
+mitius sem mi ipsa nisi miscere consternati id mentis, justo, nam
+netus, eos proin te leo w melius gloriosior mus si lacus typi.
+
+[^legentis]:
+    Ex duis rem duis iustum dis "Quod lius hic Hac," dui Nostramm
+    Impletas non est Eros mi Regalibus Sterilem (80 Wisi Fusius)
+    gubernia id me leo floruit.  Mus Germania Impletas naturalcm
+    me dominatio v class nobis eos calumniarum in inmcem sem
+    profes ut est lius fortem.  Sentiebant leo dui Nemo si
+    Penatibus Molfstum orbare sint etiam incumbit pactum culpa
+    ab tritum, ac leo armorum nisl li complices d quarta doming
+    minim [@formastis:CRiminalibus, perversa Possumus 28, 7020].
+
+Eu sed ad:  *li* 'illa' eos p scientiam cunabulis, ea dui
+posteritatis hucusque, non hic Maiori Proin mi Consiliarorum
+at maneant, ante ea moriar meritos rem ea arenam in secretarius
+minus donec harum.  Eos ac proin denuntiando, respublica calumniatores omnis
+ducimus dui mercede hac quoquo in laudabatur me quo te aut esse
+clari ulteriorem nisi hic conferre hac eu eros te orandum id odit
+laoreet.  Est fuga in wisi ac formidine meretur ab est versus'v
+eget, vel ii te excepto sint hucusque vero eros conscientia
+electionis aut qui rhoncus in malorum. 
+
+<!-- Ea, strictus lorem
+successum nec consiliarorum ipsum ab a quorum in israel
+leo Fusius Arcui,
+aut diam iste modo si 'elit' quam sentiebat invehebant,
+eu amet. -->
+
+## Captivatio euripidesconcludam
+
+Modi ingratitudinem si purus piscatores usus urgebat ea ante
+@subsit:amplexum [y. 229] soluta dicta "consensit." Similique
+formas ut est eget lius nisi innoccntiae id credit hac
+tacite dolorem cumulabat landem ab dapibus ea tibi, sed ullo
+ut amet eodem est intendo moderno sufficere.  Sem senatus
+augue ad processus et iusto commiseratione ex est viscera
+mi imperdiet vel scelerisque anfractus persiftit zzril
+clementiam per il magna mutationem.
+
+Hac dolorem W arcu quas fortes et christi, zelose, cum se
+contraxit dolorisgue te portiones.  V esse iure intendo class
+dis iuribus ea obsidionem magna. Sem ii diebus ad risus
+sint est omnis malaciam ordinationis sint pede arcu superbam
+in urna purus te atque oppressus ad dis iure odit nec meoruni.
+D usus in a arcui essentiam, dui modeste---cumulabat
+gaudere at vitae in parmensis, ab o deportari eius 4 mi 5---rem
+ea unde me oppugnationem est feliciori si regulator, class
+nec ea non sem odit justo mercede in vel potest ab wisi
+animi serpens te hic deesse mi autem m colubros in fuga.
+Vel nobis oleantem cedant sint urna dui supremi ut praeiudicatum
+magna.  Id il id unde te praesentis eu a formastis contrario
+(w liberius iure perltum si clectione clari paucis),
+li id mirum te se quos quoquo et obstaculum se d magni
+deplorata (e intendis nibh theatro te iure-successu reprobo et
+totam). Ac a reniam si qui negotio, dui generis,
+class eum nibh duis custodia
+iniunctum compellere, est concludendl unde sublirne
+netus dolorisgue.
+Ut nam enim, sagina in porta ingenium uantum quas lapidem
+et fusce est invehere ea vero quae praesentium.
+
+Silentium, pectora climacter importunas hic pulvinar ad
+procinctu nisi-tempora modi in eaque facundissima, ac
+Renovo Magna mus parabolas, nec cras qui facundissima
+fervore vero arcu profligatur.  Ad Harum'a modi,
+nobis si o magna necessitate praeconceptum te assum
+"legationis ipsa"---donec sem mi deportari jagiellonicus si
+scaturiat architecto conjuso praeiudicata [-@porro:successum, s.
+718]. Arendom lius dui eminentiam certissimum Fusius
+purus te bonorum lorem 'Rerum et fuga' nam ex disentitur duis
+iste nugator nihilominus 9.933 docfssimiis ad Assum exerci
+233 nobis (eos ipsum quidquid pectore liber).  Mus ex magni
+id p modurn censuram ut praesnlcs typi dis regnare timorem
+odit quo, nam est non iste vestram est certitudine securitatis
+5.298? Ac beatae ut nisi-fallaciloquae error hic orci urna, hic
+ad angeum eaque, ullo in leo arduas, class vel dispositae iustitia
+at error nobis.
+
+Eos apparct, quia, at aut rem mi est temerario, "securitas," ad
+gradivi-diligentissime si earum germania.  In te v quam saecula
+vulncre, lacus sem morbi urna et error eodem mazim utrinque quo
+exerci: dui nostrud id loquor
+massa mi odio Nisi Amet eum dictum "activitate
+euripidesconcludam" [@eget:veneta]. Intestinum euripidesconcludam
+erosem unde iunctis si sacrilegum ea a terrestrium
+"laborantem" est v triduum-suffragia orci urna est quae te ad
+regnandi aut consiliarorum quaeque, at est sed ullo li ut
+dis (@miniM). Orci nobis m parcam id regnante.^[Redundat id
+  wisi quia non est sem, te vacare.  Non, qui omnibus,
+  @equestri:officia se 'nunc' eos 'quo' eu
+  @profundo.suplex:accipientis se 'eaque'.]
+Mus eiusdem, dextris te w rerum at urgeant quod dis eodem, mus vitae hac
+
+(@nemo) Augue quam rem vero.
+
+Omnis ultimarie te methodo te lius quae id minus proposui at? Sem
+adverso eos quae ab gravida diam. Per nunc hic arenam nunc
+ut morsum typi tyrannis id eodem mi carceribus dis numquam'w
+habitasse.  Enim sint si odit
+quod magni quos qui ac e pessimum at similitudines: quasi zzril
+ullo eu w qui claram eundrm dis purus donec gloriatur et est
+massa ut ditescant.  Ac nisi arcu quas est negotio
+"regnantis" se est netus sollemnes si regressum.
+
+Absolute o dapibus in Dignitatem, nec ullam rem
+
+  (@etiam) Vel'w me typi a minim nisi.
+
+Proin in est duis, dis daniae, hic castra quae?  Habetis
+porta vel rhoncus'p dimittere quo nosset wisi, reddet ii
+vitae ad porta lius arcui quo est octobris optimum.
+Destituta, 'Obviam'v nibh' non quos aut enim deputatos
+at Dulcem, leo modi Throno quas, ex leo amet Operis ut arcui.
+Leo si w usus rerum Populo id
+dolor rem non ante, facer non quos, m gennere dicta mus
+'Sagina'y sunt' ultimus transtulissent volumen sequi
+attendentiam.
+
+Odio dolor optandum dolorum id nisl ti at leo crifninae est
+contemptus desiderabilem typi denegare eos moderno laborantem ad
+sit vel obstinatus processionaliter lius louor ex assumenda te
+dis et d necessilate typi ut appellationem diam ac dicta.
+Et nisl id animi, ad orci nibh me
+leo Lapide Minus te Promotionibus.[^duis]
+
+[^duis]:
+    Ipsa communis, formidine, wisi orci id aenean id fames neque
+    te wisi "imbellem dui y throno dominari mazim qui
+    leo provocatus te hic antiquo si leo calumniatores eget te
+    hic personas" [-@fuga:dulcem, a. 051].  Ut quo enim
+    "calumniatores quia" in vindica resurrectionis amet
+    (mus v. \caricas{adolescentulus}, saepe), duis non alias
+    dui in gradivi metus donec me jugiellonicae publicis
+    (non augue ab innocentia typi dis Alique Dolor).
+    Id sit D quas mirum si nisi per porro urna magni, sed V
+    eum "eaque nisi atque!" ferient simultates omnis nam
+    W quae, eget ab largitionibus est nam nobili, est
+    ex oppigncratione dis eos serpens, me ante eu nam
+    persona eu amplexum s morbi.  Se O vero Iure, poenis,
+    qui etiam et ullo praefixionem ac p maxime lorem te
+    dis respectu est est *aedificatione* ante si vel
+    consensu, non liberum debent vero vel naturom
+    pede adversitates. Ante solatium at d languida singulari
+    in vel Nescit Uidem.
+ 
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,277 @@
 # Revision history for pandoc
 
+## pandoc 3.12.1 (2026-10-07)
+
+  * New input and output format: `fodt` (#4010). This is ODF's
+    "flat" representation of a text document: a single XML file
+    instead of a zip package (ODT). It supports the same options
+    as `odt`, including `--reference-doc` (which should be a
+    zipped `odt`) and `--link-images`.
+
+  * Resolve keywords after loading a syntax definition (#11921, #11923).
+    This fixes a 3.12 regression in `--syntax-definition` that was due to a
+    change in skylighting. As the skylighting changelog indicates, users must
+    now apply `resolveKeywords` after parsing a syntax definition.
+
+  * With `--citeproc`, we no longer extract particles from given and
+    family names in structured CSL JSON or CSL YAML references (#11911).
+    Thus, for example, `family: de Gaulle` should not create a
+    non-dropping particle "de"; "de Gaulle" should be considered
+    the integral family name. This is a behavior change that
+    could affect some bibliography processing.
+
+  * Commonmark reader:
+
+    + Make task lists work in `commonmark_x`. Previously `task_lists`
+      would not work if `fancy_lists` was enabled, for any
+      `commonmark` variant.
+
+  * Markdown reader:
+
+    + Put `alert` after `tip`, etc. in classes (#11919). Some of
+      the writers (gfm, docbook, asciidoc, rst) check for the
+      admonition name as the first class, so the change putting
+      `alert` first broke the output. (Regression from 3.12.)
+    + Don't trim spaces in inline span. Previously we trimmed the
+      space in e.g. `[ test ]{.class}`. This behavior has no good rationale,
+      and it made it impossible to represent insertions and deletions properly.
+    + Make lookahead for setext header line more efficient.
+
+  * Docx reader:
+
+    + Keep bookmark when stripping caption label (#11918).
+      This allows us to preserve internal links to figures.
+    + Add map of table styles to the reader environment.
+    + Fix double strikethrough being dropped (Kyohei Takahashi).
+      `w:dstrike` was not parsed at all, so text marked with Word's double
+      strikethrough was read as plain text, with no indication that it had
+      been struck out. Treat it as Strikeout.
+    + Keep spaces at the edges of tracked changes in the span (#11904,
+      Raffaele Mancuso). This is important for tracking insertions/deletions.
+
+  * ODT reader:
+
+    + Don't crash on a table with no rows.
+    + Don't loop forever on cyclic style inheritance.
+    + Make `getStyleFamily` linear in the inheritance depth. A style
+      whose family had to be inherited took time exponential in the
+      chain length.
+    + Cap the number of spaces produced by `text:s`. `text:c` is
+      unbounded in ODF, so `<text:s text:c="200000000"/>` let an
+      832-byte document allocate until the OOM killer stepped in.
+    + Keep the set of used anchors in the reader state.
+    + Look up used anchors in a Set in `uniqueIdentFrom`.
+    + Keep the archive's media in a Map rather than an association list.
+    + Attach table captions wherever they occur. `post_process'` matched
+      a table followed by a caption only at the very head of the block list
+      and then stopped, so a caption was picked up only if its table was
+      the first block of the document; anywhere else the caption was dropped
+      and the internal marker Div leaked into the output. Walk
+      the whole document instead, so captions nested in sections,
+      cells and list items are found too. Accept the caption before
+      its table as well as after it.
+    + Don't add a bogus media entry for a missing image.
+    + Only treat font weights of 700 and up as bold. Every numeric
+      `fo:font-weight` from 100 to 900 was mapped to bold, so text
+      in a hairline or light weight was read as Strong.
+    + Read text wrapped in metadata elements and fields.
+      Content of an element the reader did not recognize was discarded along
+      with the element, which silently lost text: fields such as
+      `text:page-number`, `text:author-name` or `text:chapter`, the RDFa
+      wrapper `text:meta`, the bibliographic wrapper `text:meta-field`,
+      and ruby annotations.  Add matchers for those; for ruby, keep the base
+      text and drop the gloss, which pandoc cannot represent.
+    + Honour `table:number-{columns,rows}-repeated`. ODF abbreviates a
+      run of identical cells or rows with a repeat count.  The
+      reader ignored both counts, so a row of five cells written as three
+      elements came out three cells wide. Also count a cell
+      spanning several columns as occupying all of them when
+      working out the number of columns, rather than as one.
+    + Read rows wrapped in `table:table-row-group`. Rows need not be
+      immediate children of the table.
+    + Read blocks nested in list items, footnotes and cells. ODF allows
+      the same block-level content wherever it allows a paragraph,
+      but the reader spelled the list of block matchers out
+      separately at each site and each spelling was missing
+      something: a table in a list item was dropped, a list or
+      table in a footnote was dropped, and a heading or nested
+      table in a table cell was dropped. Keep a single list and
+      use it everywhere, so the sites cannot drift apart again.
+    + Read images embedded in `office:binary-data`.
+    + Read MathML embedded inline in `draw:object`. A flat OpenDocument file
+      cannot refer to a separate formula document, so
+      the MathML is a descendant of the draw:object instead.
+    + Add `readFODT` for flat OpenDocument input [API change].
+    + Fix formula lookup when the href has a trailing slash.
+    + Trim the alt text of an image.
+    + Look up the image mime type on the `draw:image` element instead of guessing
+      from magic bytes.
+
+  * RTF reader:
+
+    + Combine UTF-16 surrogate pairs (#11920).
+
+  * Typst reader:
+
+    + Do not emit mixed table column widths (#11898, Samuel Huang).
+      Previously we evenly split the remaining width, but generally
+      it looks better just to make every column `auto` if any column
+      is default width.
+    + Treat zero-width table fractions as unspecified (#11898, Samuel Huang).
+
+  * Org reader:
+
+    + Improve performance: use a jump table to find the end of plain text
+      runs, and dispatch on the next character in `inline`.
+
+  * Creole reader:
+
+    + Use jump tables to find the end of plain text runs.
+    + Use `takeWhile1P` in `str`.
+
+  * RST reader:
+
+    + Use `takeWhile1P` for raw field list items.
+
+  * Textile, Vimwiki, MediaWiki, Txt2Tags readers:
+
+    + Use jump tables to find the end of plain text runs.
+
+  * Roff readers:
+
+    + Use `takeWhile1P` for `regularText`.
+
+  * Mdoc reader:
+
+    + Use `takeWhile1P` in lexer.
+
+  * Docx writer:
+
+    + Use table style `id` in the `tblStyle` element (#11932).
+      Previously we used the table style `name`. This happened to work
+      for the default table style, but only because its name and id matched.
+      It failed for custom styles whose names did not match their ids.
+    + Put a heading's bookmark in its paragraph (Robert Szarka,
+      #11845, cf. #8825). The bookmark for a section's id
+      surrounded the whole section, at body level, so a screen
+      reader met it at the section's last line rather than at the
+      heading. Moreover, the docx reader looks for bookmarks only
+      inside paragraphs, so the ids did not round-trip.
+    + Improve highlighting of `marked` spans containing math (#11885,
+      Samuel Huang).
+
+  * OpenDocument writer:
+
+    + Use `literal` instead of `text . T.unpack`.
+    + Emit whitespace runs in one piece.
+    + Count styles and notes in O(1).
+    + Give nested notes distinct ids.
+    + Use valid column style names past column 26 (`AA`, `AB`, etc.).
+    + Apply the requested style to `Plain` blocks. `withParagraphStyle`
+      only wrapped `Para` in a paragraph with the requested
+      style; a `Plain` fell through to `blockToOpenDocument` and came
+      out with the default style.
+    + Render the abstract as blocks. The abstract was wrapped in a Div
+      with `custom-style` set to `Abstract`, but then handed to
+      `metaToContext`, which renders metadata fields with the inline writer.
+      The style was lost, as well as any block-level formatting.
+      Regression from 013351f602.
+    + Reuse identical automatic paragraph styles. Every blockquote,
+      every explicitly aligned table cell, and every direction-adjusted
+      style got a fresh `Pn` automatic style, even when an
+      identical one already existed.
+    + Look up cross-reference targets in a Map. Skip the collecting walk
+      altogether unless `xrefs_name` or `xrefs_number` is enabled, since
+      nothing reads the result otherwise and neither is on by default.
+      Elements with an empty identifier are no longer collected, so a link to
+      "#" can no longer resolve to a reference with an empty ref-name.
+    + Sort automatic text styles numerically rather than alphabetically
+      (`T9`, `T10`, ...).
+
+  * ODT writer:
+
+    + Always render `content.xml` with a template. `writeOpenDocument`
+      returns a bare body fragment when writerTemplate is
+      Nothing.  This is needed mainly for the `fodt` writer.
+    + Have `pandocToODT` return an Archive instead of a ByteString.
+      This lets an alternative entry point post-process the archive.
+    + Add `writeFODT` for flat OpenDocument output [API change].
+
+  * LaTeX writer:
+
+    + Allow alt text in figure to wrap (#11924).
+
+  * Commonmark writer:
+
+    + Fix escaping bug (#11927). A non-alphanumeric after an
+      escaped backslash would be omitted.
+
+  * Typst writer:
+
+    + Revert pandoc 3.12 change that omitted a blank line at the end
+      of a `block`. The blank line actually is semantically significant;
+      without it, styling of `par` will have no effect.
+    + Support `hanging-indent` and `entry-spacing` in CSL bibliography
+      entries (#11926). Instead of hard-coding the formatting in
+      the block, we use a show rule on `<refs>`, included
+      conditionally by the default template. Values will be set
+      for `csl-hanging-indent` and `csl-entry-spacing` based on
+      the CSL style, but these variables can be overridden on the
+      command line using `--variable`. It is also possible to
+      include a new show rule in header-includes, which will take
+      priority over the other.
+
+  * Markdown writer:
+
+    + Put `<..>` around link or image destinations containing
+      spaces (rca-umb).
+    + Escape list markers after a line break (#11863, Aslak Hellesøy).
+    + Don't use a multiline table for a header-only table (#11939).
+
+  * Text.Pandoc.XML:
+
+    + Make `escapeStringForXML` and `escapeNls` more efficient.
+    + Build XML tags with a single doclayout allocation rather than
+      several.
+
+  * Text.Pandoc.SelfContained:
+
+    + Fix regression in escaping of data URIs (#11942). A change
+      in 3.12 broke escaping of data URIs, so that `--embed-resources`
+      no longer worked properly.
+
+  * Text.Pandoc.Parsing:
+
+    + `mathDisplay`, `mathInline`: respect TeX groups and comments (#11887,
+      Erik Demaine). Prevent math delimiters inside TeX brace groups
+      and percent comments from prematurely closing an equation.
+
+  * Text.Pandoc.XML.Light:
+
+    + Build the root element from the event stream.
+      Instead of using xml-conduit's DOM parser and then converting
+      the result back to our Element type, just reuse
+      `parseXMLContentsWithEntities`, which folds the event stream
+      directly into our types. This speeds up every XML-based reader.
+      Behavior change: Attributes now preserve document order instead of
+      being sorted alphabetically, as was already the case for
+      `parseXMLContentsWithEntities`.
+
+  * Bump version of reveal.js to 6. Version 6 is required for the
+    changes in plugin locations incorporated in pandoc 3.12.
+
+  * `reference.docx`: don't make Table style `semiHidden` (#11931).
+    This allows it to appear in the table styles gallery.
+
+  * Benchmark improvements:
+
+    + Include the benchmark sample in the benchmark directory, to ensure
+      that it doesn't change between releases. Include images too.
+    + Change the benchmark sample to a mix of markup-heavy and prose-heavy
+      text, including tables.
+
+  * Use latest citeproc, texmath.
+
 ## pandoc 3.12 (2026-09-27)
 
   * Markdown reader:
diff --git a/data/docx/word/styles.xml b/data/docx/word/styles.xml
--- a/data/docx/word/styles.xml
+++ b/data/docx/word/styles.xml
@@ -591,8 +591,6 @@
   <w:style w:type="table" w:default="1" w:styleId="Table">
     <w:name w:val="Table" />
     <w:basedOn w:val="TableNormal" />
-    <w:semiHidden />
-    <w:unhideWhenUsed />
     <w:qFormat />
     <w:tblPr>
       <w:tblInd w:w="0" w:type="dxa" />
diff --git a/data/templates/default.typst b/data/templates/default.typst
--- a/data/templates/default.typst
+++ b/data/templates/default.typst
@@ -22,6 +22,18 @@
 $highlighting-definitions$
 
 $endif$
+$if(csl-settings)$
+// formatting called for by CSL style
+#show <refs>: set par(
+$if(csl-hanging-indent)$
+  hanging-indent: $csl-hanging-indent$,
+$endif$
+$if(csl-entry-spacing)$
+  spacing: $csl-entry-spacing$,
+$endif$
+)
+
+$endif$
 $if(template)$
 #import "$template$": conf
 $else$
diff --git a/pandoc.cabal b/pandoc.cabal
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -1,6 +1,6 @@
 cabal-version:   2.4
 name:            pandoc
-version:         3.12
+version:         3.12.1
 build-type:      Simple
 license:         GPL-2.0-or-later
 license-file:    COPYING.md
@@ -227,6 +227,7 @@
                  test/command/11113.docx
                  test/command/11689.docx
                  test/command/11833.docx
+                 test/command/11942.js
                  test/command/biblio.bib
                  test/command/averroes.bib
                  test/command/A.txt
@@ -281,6 +282,8 @@
                  test/command/11486/scroll.revealjs
                  test/command/11498.png
                  test/command/11301-styles.opendocument
+                 test/command/opendocument-abstract.opendocument
+                 test/command/opendocument-body.opendocument
                  test/command/11888/section1/lab.md
                  test/command/11888/section2/lab.md
                  test/command/11888/section3/lab.md
@@ -453,13 +456,18 @@
                  test/twiki-reader.twiki
                  test/tikiwiki-reader.tikiwiki
                  test/odt/odt/*.odt
+                 test/odt/fodt/*.fodt
                  test/odt/markdown/*.md
                  test/odt/native/*.native
+                 test/odt/fodt-native/*.native
                  test/xlsx-reader/*.xlsx
                  test/xlsx-reader/*.native
                  test/pod-reader.pod
                  test/vimdoc/*.markdown
                  test/vimdoc/*.vimdoc
+                 benchmark/sample.md
+                 benchmark/movie.jpg
+                 benchmark/lalune.jpg
 source-repository head
   type:          git
   location:      https://github.com/jgm/pandoc.git
@@ -530,7 +538,7 @@
                  blaze-markup          >= 0.8      && < 0.9,
                  bytestring            >= 0.9      && < 0.13,
                  case-insensitive      >= 1.2      && < 1.3,
-                 citeproc              >= 0.14     && < 0.15,
+                 citeproc              >= 0.14.1   && < 0.15,
                  commonmark            >= 0.3.1    && < 0.4,
                  commonmark-extensions >= 0.2.7.3  && < 0.3,
                  commonmark-pandoc     >= 0.3.0.2  && < 0.4,
@@ -565,7 +573,7 @@
                  syb                   >= 0.1      && < 0.8,
                  tagsoup               >= 0.14.6   && < 0.15,
                  temporary             >= 1.1      && < 1.4,
-                 texmath               >= 0.13.3   && < 0.14,
+                 texmath               >= 0.13.3.1 && < 0.14,
                  text                  >= 2.0      && < 2.2,
                  text-conversions      >= 0.3      && < 0.4,
                  time                  >= 1.5      && < 1.17,
@@ -862,6 +870,7 @@
                   temporary         >= 1.1     && < 1.4,
                   time              >= 1.5     && < 1.17,
                   xml               >= 1.3.12  && < 1.4,
+                  xml-light,
                   zip-archive       >= 0.5     && < 0.6
   other-modules:  Tests.Old
                   Tests.Command
@@ -916,6 +925,7 @@
                   Tests.Writers.AsciiDoc
                   Tests.Writers.LaTeX
                   Tests.Writers.Docx
+                  Tests.Writers.ODT
                   Tests.Writers.RST
                   Tests.Writers.TEI
                   Tests.Writers.Markua
@@ -937,6 +947,7 @@
                    tasty-bench >= 0.4     && <= 0.5,
                    mtl         >= 2.2     && < 2.4,
                    text        >= 2.0     && < 2.2,
+                   temporary,
                    deepseq
   -- we increase heap size to avoid benchmarking garbage collection:
   ghc-options:     -rtsopts -with-rtsopts=-A8m -threaded
diff --git a/src/Text/Pandoc/App/OutputSettings.hs b/src/Text/Pandoc/App/OutputSettings.hs
--- a/src/Text/Pandoc/App/OutputSettings.hs
+++ b/src/Text/Pandoc/App/OutputSettings.hs
@@ -32,7 +32,8 @@
 import Data.List (find)
 import Data.Maybe (catMaybes, fromMaybe)
 import Skylighting (defaultSyntaxMap)
-import Skylighting.Parser (addSyntaxDefinition, parseSyntaxDefinition)
+import Skylighting.Parser (addSyntaxDefinition, parseSyntaxDefinition,
+                           resolveKeywords)
 import System.Directory (getCurrentDirectory)
 import System.Exit (exitSuccess)
 import System.FilePath
@@ -161,10 +162,13 @@
         res <- liftIO (parseSyntaxDefinition f)
         case res of
               Left errstr -> throwError $ PandocSyntaxMapError $ T.pack errstr
-              Right syn   -> return $ addSyntaxDefinition syn existingmap
+              Right syn   -> return $
+                addSyntaxDefinition syn existingmap
 
-  syntaxMap <- foldM addSyntaxMap defaultSyntaxMap
-                     (optSyntaxDefinitions opts)
+  syntaxMap <- case optSyntaxDefinitions opts of
+                  [] -> return defaultSyntaxMap
+                  sdefs -> (\m -> M.map (resolveKeywords m) m) <$>
+                            foldM addSyntaxMap defaultSyntaxMap sdefs
 
   hlStyle <- case optSyntaxHighlighting opts of
     NoHighlightingString        -> pure NoHighlighting
diff --git a/src/Text/Pandoc/Citeproc/MetaValue.hs b/src/Text/Pandoc/Citeproc/MetaValue.hs
--- a/src/Text/Pandoc/Citeproc/MetaValue.hs
+++ b/src/Text/Pandoc/Citeproc/MetaValue.hs
@@ -188,7 +188,7 @@
 metaValueToNames x = maybeToList $ metaValueToName x
 
 metaValueToName :: MetaValue -> Maybe Name
-metaValueToName (MetaMap m) = extractParticles <$>
+metaValueToName (MetaMap m) =
   Just Name
     { nameFamily = family
     , nameGiven = given
@@ -212,7 +212,7 @@
   staticordering = fromMaybe False $
     M.lookup "static-ordering" m >>= metaValueToBool
   literal = M.lookup "literal" m >>= metaValueToText
-metaValueToName x = extractParticles <$>
+metaValueToName x =
   case metaValueToText x of
     Nothing -> Nothing
     Just lit -> Just Name
diff --git a/src/Text/Pandoc/Extensions.hs b/src/Text/Pandoc/Extensions.hs
--- a/src/Text/Pandoc/Extensions.hs
+++ b/src/Text/Pandoc/Extensions.hs
@@ -543,6 +543,7 @@
     , Ext_xrefs_number
     ]
   getAll "odt"             = getAll "opendocument" <> autoIdExtensions
+  getAll "fodt"            = getAll "odt"
   getAll "muse"            = autoIdExtensions <>
     extensionsFromList
     [ Ext_amuse ]
diff --git a/src/Text/Pandoc/Format.hs b/src/Text/Pandoc/Format.hs
--- a/src/Text/Pandoc/Format.hs
+++ b/src/Text/Pandoc/Format.hs
@@ -187,6 +187,7 @@
     ".dokuwiki" -> defFlavor "dokuwiki"
     ".epub"     -> defFlavor "epub"
     ".fb2"      -> defFlavor "fb2"
+    ".fodt"     -> defFlavor "fodt"
     ".htm"      -> defFlavor "html"
     ".html"     -> defFlavor "html"
     ".icml"     -> defFlavor "icml"
diff --git a/src/Text/Pandoc/MIME.hs b/src/Text/Pandoc/MIME.hs
--- a/src/Text/Pandoc/MIME.hs
+++ b/src/Text/Pandoc/MIME.hs
@@ -154,6 +154,7 @@
            ,("fbdoc","application/x-maker")
            ,("fch","chemical/x-gaussian-checkpoint")
            ,("fchk","chemical/x-gaussian-checkpoint")
+           ,("fodt","application/vnd.oasis.opendocument.text-flat-xml")
            ,("frm","application/x-maker")
            ,("fs","text/plain")
            ,("gal","chemical/x-gaussian-log")
diff --git a/src/Text/Pandoc/Parsing/Math.hs b/src/Text/Pandoc/Parsing/Math.hs
--- a/src/Text/Pandoc/Parsing/Math.hs
+++ b/src/Text/Pandoc/Parsing/Math.hs
@@ -15,9 +15,10 @@
   )
 where
 
-import Control.Monad (mzero, when, guard)
+import Control.Monad (when, guard)
 import Data.Text (Text)
-import Text.Parsec ((<|>), ParsecT, Stream(..), notFollowedBy, many1, try)
+import Text.Parsec ((<|>), ParsecT, Stream(..), notFollowedBy, manyTill,
+                    many1, try)
 import Text.Pandoc.Options
   ( Extension(Ext_tex_math_dollars, Ext_tex_math_single_backslash,
               Ext_tex_math_double_backslash) )
@@ -25,80 +26,80 @@
 import Text.Pandoc.Parsing.General
 import Text.Pandoc.Shared (trimMath)
 import Text.Pandoc.Sources
-  (UpdateSourcePos, anyChar, char, digit, newline, satisfy, space, string)
+  (UpdateSourcePos, anyChar, char, digit, newline, satisfy, space)
 
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as TL
 import qualified Data.Text.Lazy.Builder as TB
 
-mathInlineWith :: (Stream s m Char, UpdateSourcePos s Char)  => Text -> Text -> ParsecT s st m Text
-mathInlineWith op cl = try $ do
+mathWith :: (Stream s m Char, UpdateSourcePos s Char)
+               => Text -> Text -> ParsecT s st m Text
+mathWith op cl = try $ do
   textStr op
   when (op == "$") $ notFollowedBy space
   words' <- many1Till (
-                       (T.singleton <$>
-                          satisfy (\c -> not (isSpaceChar c || c == '\\')))
-                   <|> (char '\\' >>
-                           -- This next clause is needed because \text{..} can
-                           -- contain $, \(\), etc.
-                           (try (string "text" >>
-                                 (("\\text" <>) <$> inBalancedBraces 0 ""))
-                            <|>  (\c -> T.pack ['\\',c]) <$> anyChar))
-                   <|> ("\n" <$ blankline <* notFollowedBy' blankline <*
-                          (guard (op /= "$") <|> notFollowedBy (char '$')))
+                       mathComment
+                   <|> mathGroup
+                   <|> (T.singleton <$>
+                          satisfy (\c -> not
+                                    (isSpaceChar c || c == '\\' || c == '{')))
                    <|> (T.pack <$> many1 spaceChar <*
                           (guard (op /= "$") <|> notFollowedBy (char '$')))
+                   <|> ("\n" <$ newline <* notFollowedBy' blankline <*
+                          (guard (op /= "$") <|> notFollowedBy (char '$')))
+                   <|> (char '\\' >> (\c -> T.pack ['\\',c]) <$> anyChar)
                     ) (try $ textStr cl)
-  notFollowedBy digit  -- to prevent capture of $5
+  when (cl == "$") $ notFollowedBy digit  -- to prevent capture of $5
   return $ trimMath $ T.concat words'
- where
-  inBalancedBraces :: (Stream s m Char, UpdateSourcePos s Char)
-                   => Int -> Text -> ParsecT s st m Text
-  inBalancedBraces n t =
-    TL.toStrict . TB.toLazyText <$>
-      go n False (TB.fromText t) (not (T.null t))
 
-  -- go depth lastWasBackslash accumulator started
-  go :: (Stream s m Char, UpdateSourcePos s Char)
-     => Int -> Bool -> TB.Builder -> Bool -> ParsecT s st m TB.Builder
-  go 0 _ acc False = do
-    c <- anyChar
-    if c == '{'
-       then go 1 False (acc <> TB.singleton '{') True
-       else mzero
-  go 0 _ acc True = return acc
-  go depth True acc _ = do
-    c <- anyChar
-    go depth False (acc <> TB.singleton c) True
-  go depth False acc _ = do
-    c <- anyChar
-    let acc' = acc <> TB.singleton c
-    case c of
-         '\\' -> go depth True acc' True
-         '}'  -> go (depth - 1) False acc' True
-         '{'  -> go (depth + 1) False acc' True
-         _    -> go depth False acc' True
+-- Preserve comments, but do not interpret their braces or math delimiters.
+-- Consume the newline too: it terminates the comment, not the math content.
+mathComment :: (Stream s m Char, UpdateSourcePos s Char)
+            => ParsecT s st m Text
+mathComment = do
+  char '%'
+  content <- manyTill anyChar newline
+  notFollowedBy' blankline
+  return $ T.pack ('%' : content ++ "\n")
 
-mathDisplayWith :: (Stream s m Char, UpdateSourcePos s Char) => Text -> Text -> ParsecT s st m Text
-mathDisplayWith op cl = try $ fmap T.pack $ do
-  textStr op
-  many1Till (satisfy (/= '\n') <|> (newline <* notFollowedBy' blankline))
-            (try $ textStr cl)
+-- Consume a whole TeX group so delimiters in command arguments (for example,
+-- \text{hi $x$ bye} or \colorbox{aqua}{$x$}) cannot close the outer math.
+-- Escaped braces do not change the nesting depth.
+mathGroup :: (Stream s m Char, UpdateSourcePos s Char) => ParsecT s st m Text
+mathGroup = do
+  char '{'
+  TL.toStrict . TB.toLazyText <$> go (1 :: Int) False (TB.singleton '{')
+ where
+  -- go depth lastWasBackslash accumulator
+  go 0 _ acc = return acc
+  go depth True acc = do
+    c <- mathChar
+    go depth False (acc <> TB.singleton c)
+  go depth False acc =
+    (do comment <- mathComment
+        go depth False (acc <> TB.fromText comment))
+    <|> do
+      c <- mathChar
+      let acc' = acc <> TB.singleton c
+      case c of
+           '\\' -> go depth True acc'
+           '}'  -> go (depth - 1) False acc'
+           '{'  -> go (depth + 1) False acc'
+           _    -> go depth False acc'
 
+mathChar :: (Stream s m Char, UpdateSourcePos s Char) => ParsecT s st m Char
+mathChar = satisfy (/= '\n') <|> (newline <* notFollowedBy' blankline)
+
 mathDisplay :: (HasReaderOptions st, Stream s m Char, UpdateSourcePos s Char)
             => ParsecT s st m Text
 mathDisplay =
-      (guardEnabled Ext_tex_math_dollars >> mathDisplayWith "$$" "$$")
-  <|> (guardEnabled Ext_tex_math_single_backslash >>
-       mathDisplayWith "\\[" "\\]")
-  <|> (guardEnabled Ext_tex_math_double_backslash >>
-       mathDisplayWith "\\\\[" "\\\\]")
+      (guardEnabled Ext_tex_math_dollars >> mathWith "$$" "$$")
+  <|> (guardEnabled Ext_tex_math_single_backslash >> mathWith "\\[" "\\]")
+  <|> (guardEnabled Ext_tex_math_double_backslash >> mathWith "\\\\[" "\\\\]")
 
 mathInline :: (HasReaderOptions st, Stream s m Char, UpdateSourcePos s Char)
            => ParsecT s st m Text
 mathInline =
-      (guardEnabled Ext_tex_math_dollars >> mathInlineWith "$" "$")
-  <|> (guardEnabled Ext_tex_math_single_backslash >>
-       mathInlineWith "\\(" "\\)")
-  <|> (guardEnabled Ext_tex_math_double_backslash >>
-       mathInlineWith "\\\\(" "\\\\)")
+      (guardEnabled Ext_tex_math_dollars >> mathWith "$" "$")
+  <|> (guardEnabled Ext_tex_math_single_backslash >> mathWith "\\(" "\\)")
+  <|> (guardEnabled Ext_tex_math_double_backslash >> mathWith "\\\\(" "\\\\)")
diff --git a/src/Text/Pandoc/Readers.hs b/src/Text/Pandoc/Readers.hs
--- a/src/Text/Pandoc/Readers.hs
+++ b/src/Text/Pandoc/Readers.hs
@@ -30,6 +30,7 @@
   , readPptx
   , readXlsx
   , readODT
+  , readFODT
   , readMarkdown
   , readCommonMark
   , readCreole
@@ -167,6 +168,7 @@
           ,("pptx"         , ByteStringReader readPptx)
           ,("xlsx"         , ByteStringReader readXlsx)
           ,("odt"          , ByteStringReader readODT)
+          ,("fodt"         , TextReader readFODT)
           ,("t2t"          , TextReader readTxt2Tags)
           ,("epub"         , ByteStringReader readEPUB)
           ,("muse"         , TextReader readMuse)
diff --git a/src/Text/Pandoc/Readers/CommonMark.hs b/src/Text/Pandoc/Readers/CommonMark.hs
--- a/src/Text/Pandoc/Readers/CommonMark.hs
+++ b/src/Text/Pandoc/Readers/CommonMark.hs
@@ -167,6 +167,8 @@
          [ (superscriptSpec <>) | isEnabled Ext_superscript opts ] ++
          [ (subscriptSpec <>) | isEnabled Ext_subscript opts ] ++
          [ (mathSpec <>) | isEnabled Ext_tex_math_dollars opts ] ++
+         [ (taskListSpec <>) | isEnabled Ext_task_lists opts ] ++
+         -- note: task_list before fancy_list, work around jgm/commonmark#180
          [ (fancyListSpec <>) | isEnabled Ext_fancy_lists opts ] ++
          [ (fencedDivSpec <>) | isEnabled Ext_fenced_divs opts ] ++
          [ (bracketedSpanSpec <>) | isEnabled Ext_bracketed_spans opts ] ++
@@ -187,7 +189,6 @@
            | isEnabled Ext_implicit_header_references opts ] ++
          [ (footnoteSpec <>) | isEnabled Ext_footnotes opts ] ++
          [ (definitionListSpec <>) | isEnabled Ext_definition_lists opts ] ++
-         [ (taskListSpec <>) | isEnabled Ext_task_lists opts ] ++
          [ (wikilinksSpec TitleAfterPipe <>)
            | isEnabled Ext_wikilinks_title_after_pipe opts ] ++
          [ (wikilinksSpec TitleBeforePipe <>)
diff --git a/src/Text/Pandoc/Readers/Creole.hs b/src/Text/Pandoc/Readers/Creole.hs
--- a/src/Text/Pandoc/Readers/Creole.hs
+++ b/src/Text/Pandoc/Readers/Creole.hs
@@ -62,6 +62,33 @@
 specialChars :: [Char]
 specialChars = "*/~{}\\|[]()<>\"'"
 
+-- | True for characters that terminate a run of plain text, i.e. the
+-- 'specialChars' plus tabs, newlines and spaces.  Written as a @case@ so
+-- that GHC compiles it to a jump table; this is applied to every single
+-- character of the input, so a linear scan over the list here is a
+-- significant cost.  Must be kept in sync with 'specialChars'.
+isStrEnd :: Char -> Bool
+isStrEnd c = case c of
+  '\t' -> True
+  '\n' -> True
+  ' '  -> True
+  '"'  -> True
+  '\'' -> True
+  '('  -> True
+  ')'  -> True
+  '*'  -> True
+  '/'  -> True
+  '<'  -> True
+  '>'  -> True
+  '['  -> True
+  '\\' -> True
+  ']'  -> True
+  '{'  -> True
+  '|'  -> True
+  '}'  -> True
+  '~'  -> True
+  _    -> False
+
 parseCreole :: PandocMonad m => CRLParser m Pandoc
 parseCreole = do
   bs <- mconcat <$> many block
@@ -272,8 +299,7 @@
 symbol = fmap (B.str . T.singleton) (oneOf specialChars)
 
 str :: PandocMonad m => CRLParser m B.Inlines
-str = let strChar = noneOf ("\t\n " ++ specialChars) in
-        fmap B.str (many1Char strChar)
+str = fmap B.str (takeWhile1P (not . isStrEnd))
 
 bold :: PandocMonad m => CRLParser m B.Inlines
 bold = B.strong . mconcat <$>
diff --git a/src/Text/Pandoc/Readers/Docx.hs b/src/Text/Pandoc/Readers/Docx.hs
--- a/src/Text/Pandoc/Readers/Docx.hs
+++ b/src/Text/Pandoc/Readers/Docx.hs
@@ -312,7 +312,9 @@
         | Just True <- isSmallCaps rPr =
             smallcaps . go rPr{isSmallCaps = Nothing}
         | Just True <- isStrike rPr =
-            strikeout . go rPr{isStrike = Nothing}
+            strikeout . go rPr{isStrike = Nothing, isDoubleStrike = Nothing}
+        | Just True <- isDoubleStrike rPr =
+            strikeout . go rPr{isDoubleStrike = Nothing}
         | Just True <- isRTL rPr =
             spanWith ("",[],[("dir","rtl")]) . go rPr{isRTL = Nothing}
         | inBidi, Just False <- isRTL rPr =
diff --git a/src/Text/Pandoc/Readers/Docx/Combine.hs b/src/Text/Pandoc/Readers/Docx/Combine.hs
--- a/src/Text/Pandoc/Readers/Docx/Combine.hs
+++ b/src/Text/Pandoc/Readers/Docx/Combine.hs
@@ -80,7 +80,28 @@
   let (fs, ils') = unstackInlines ils
       (left, (right, contents')) = second (spanr isSpace) $ spanl isSpace $ unMany ils'
       -- NOTE: spanr counterintuitively returns suffix as the FIRST tuple element
-  in (Many left, (fs, Many contents'), Many right)
+  in case breakAtTrackedChange fs of
+       -- A space at the edge of an inserted or deleted run belongs to the
+       -- change: moving it out of the span would lose it when the change is
+       -- accepted or rejected later (#4427). It is still moved out of the
+       -- formatting inside the change.
+       Just (outer, inner) ->
+         (mempty, (outer, Many left <> stackInlines inner (Many contents')
+                           <> Many right), mempty)
+       Nothing -> (Many left, (fs, Many contents'), Many right)
+
+-- | Split a modifier stack (outermost first) after its innermost
+-- tracked-change span, if it has one.
+breakAtTrackedChange :: [Modifier a] -> Maybe ([Modifier a], [Modifier a])
+breakAtTrackedChange fs =
+  case L.findIndex isTrackedChange (reverse fs) of
+    Nothing -> Nothing
+    Just i  -> Just (splitAt (length fs - i) fs)
+
+isTrackedChange :: Modifier a -> Bool
+isTrackedChange (AttrModifier _ (_, classes, _)) =
+  any (`elem` classes) ["insertion", "deletion"]
+isTrackedChange _ = False
 
 isSpace :: Inline -> Bool
 isSpace Space = True
diff --git a/src/Text/Pandoc/Readers/Docx/Parse.hs b/src/Text/Pandoc/Readers/Docx/Parse.hs
--- a/src/Text/Pandoc/Readers/Docx/Parse.hs
+++ b/src/Text/Pandoc/Readers/Docx/Parse.hs
@@ -109,6 +109,7 @@
                            , envFont          :: Maybe Font
                            , envCharStyles    :: CharStyleMap
                            , envParStyles     :: ParStyleMap
+                           , envTableStyles   :: TableStyleMap
                            , envLocation      :: DocumentLocation
                            , envDocXmlPath    :: FilePath
                            , envTextWidth     :: Int
@@ -233,6 +234,8 @@
 
 type ParStyleMap = M.Map ParaStyleId ParStyle
 
+type TableStyleMap = M.Map TableStyleId TableStyle
+
 data Numbering = Numbering NameSpaces [Numb] [AbstractNumb]
                  deriving Show
 
@@ -382,6 +385,7 @@
     , isItalicCTL = isItalicCTL a <|> isItalicCTL b
     , isSmallCaps = isSmallCaps a <|> isSmallCaps b
     , isStrike = isStrike a <|> isStrike b
+    , isDoubleStrike = isDoubleStrike a <|> isDoubleStrike b
     , isRTL = isRTL a <|> isRTL b
     , isForceCTL = isForceCTL a <|> isForceCTL b
     , rHighlight = rHighlight a <|> rHighlight b
@@ -443,7 +447,7 @@
       numbering = archiveToNumbering archive
       rels      = archiveToRelationships archive docXmlPath
       media     = filteredFilesFromArchive archive filePathIsMedia
-      (styles, parstyles) = archiveToStyles archive
+      (styles, parstyles, tabstyles) = archiveToStyles archive
       textWidth = archiveToTextWidth archive
       rEnv = ReaderEnv { envNotes = notes
                        , envComments = comments
@@ -453,6 +457,7 @@
                        , envFont = Nothing
                        , envCharStyles = styles
                        , envParStyles = parstyles
+                       , envTableStyles = tabstyles
                        , envLocation = InDocument
                        , envDocXmlPath = docXmlPath
                        , envTextWidth = fromMaybe 9360 textWidth
@@ -512,8 +517,8 @@
       | otherwise
       = ((:[]) <$> elemToBodyPart ns' el) `catchError` (\_ -> return [])
 
-archiveToStyles :: Archive -> (CharStyleMap, ParStyleMap)
-archiveToStyles = archiveToStyles' getStyleId getStyleId
+archiveToStyles :: Archive -> (CharStyleMap, ParStyleMap, TableStyleMap)
+archiveToStyles = archiveToStyles' getStyleId getStyleId getStyleId
 
 class HasParentStyle a where
   getParentStyle :: a -> Maybe a
@@ -1506,10 +1511,13 @@
 
 stripCaptionLabel :: [Element] -> [Element]
 stripCaptionLabel els =
-  if any isNumberElt els
-     then dropWhile (not . isNumberElt) els
-     else els
+    if null afters
+       then els
+       else filter isBookmark befores <> afters
   where
+    (befores, afters) = break isNumberElt els
+    isBookmark (Element name _ _ _) =
+      qName name == "bookmarkStart" || qName name == "bookmarkEnd"
     isNumberElt el@(Element name attribs _ _) =
        (qName name == "fldSimple" &&
              case lookupAttrBy ((== "instr") . qName) attribs of
diff --git a/src/Text/Pandoc/Readers/Docx/Parse/Styles.hs b/src/Text/Pandoc/Readers/Docx/Parse/Styles.hs
--- a/src/Text/Pandoc/Readers/Docx/Parse/Styles.hs
+++ b/src/Text/Pandoc/Readers/Docx/Parse/Styles.hs
@@ -21,12 +21,15 @@
   , CharStyle
   , ParaStyleId(..)
   , ParStyle(..)
+  , TableStyleId(..)
+  , TableStyle
   , ParIndentation(..)
   , RunStyle(..)
   , HasStyleName
   , StyleName
   , ParaStyleName
   , CharStyleName
+  , TableStyleName
   , FromStyleName
   , VertAlign(..)
   , StyleId
@@ -62,11 +65,15 @@
   deriving (Show, Eq, Ord, IsString, FromStyleId)
 newtype ParaStyleId   = ParaStyleId T.Text
   deriving (Show, Eq, Ord, IsString, FromStyleId)
+newtype TableStyleId   = TableStyleId T.Text
+  deriving (Show, Eq, Ord, IsString, FromStyleId)
 
 newtype CharStyleName = CharStyleName CIString
   deriving (Show, Eq, Ord, IsString, FromStyleName)
 newtype ParaStyleName = ParaStyleName CIString
   deriving (Show, Eq, Ord, IsString, FromStyleName)
+newtype TableStyleName = TableStyleName CIString
+  deriving (Show, Eq, Ord, IsString, FromStyleName)
 
 -- Case-insensitive comparisons
 newtype CIString = CIString T.Text deriving (Show, IsString, FromStyleName)
@@ -103,18 +110,19 @@
                            , cStyleData :: RunStyle
                            } deriving (Show)
 
-data RunStyle = RunStyle { isBold       :: Maybe Bool
-                         , isBoldCTL    :: Maybe Bool
-                         , isItalic     :: Maybe Bool
-                         , isItalicCTL  :: Maybe Bool
-                         , isSmallCaps  :: Maybe Bool
-                         , isStrike     :: Maybe Bool
-                         , isRTL        :: Maybe Bool
-                         , isForceCTL   :: Maybe Bool
-                         , rHighlight   :: Maybe Text
-                         , rVertAlign   :: Maybe VertAlign
-                         , rUnderline   :: Maybe Text
-                         , rParentStyle :: Maybe CharStyle
+data RunStyle = RunStyle { isBold         :: Maybe Bool
+                         , isBoldCTL      :: Maybe Bool
+                         , isItalic       :: Maybe Bool
+                         , isItalicCTL    :: Maybe Bool
+                         , isSmallCaps    :: Maybe Bool
+                         , isStrike       :: Maybe Bool
+                         , isDoubleStrike :: Maybe Bool
+                         , isRTL          :: Maybe Bool
+                         , isForceCTL     :: Maybe Bool
+                         , rHighlight     :: Maybe Text
+                         , rVertAlign     :: Maybe VertAlign
+                         , rUnderline     :: Maybe Text
+                         , rParentStyle   :: Maybe CharStyle
                          }
                 deriving Show
 
@@ -132,6 +140,10 @@
                          }
                     deriving Show
 
+data TableStyle = TableStyle { tStyleName  :: TableStyleName
+                             , tStyleId  :: TableStyleId }
+                    deriving Show
+
 defaultRunStyle :: RunStyle
 defaultRunStyle = RunStyle { isBold = Nothing
                            , isBoldCTL = Nothing
@@ -139,6 +151,7 @@
                            , isItalicCTL = Nothing
                            , isSmallCaps = Nothing
                            , isStrike = Nothing
+                           , isDoubleStrike = Nothing
                            , isRTL = Nothing
                            , isForceCTL = Nothing
                            , rHighlight = Nothing
@@ -148,21 +161,24 @@
                            }
 
 archiveToStyles'
-  :: (Ord k1, Ord k2, ElemToStyle a1, ElemToStyle a2)
-  => (a1 -> k1) -> (a2 -> k2) -> Archive -> (M.Map k1 a1, M.Map k2 a2)
-archiveToStyles' conv1 conv2 zf =
+  :: (Ord k1, Ord k2, Ord k3, ElemToStyle a1, ElemToStyle a2, ElemToStyle a3)
+  => (a1 -> k1) -> (a2 -> k2) -> (a3 -> k3)
+  -> Archive -> (M.Map k1 a1, M.Map k2 a2, M.Map k3 a3)
+archiveToStyles' conv1 conv2 conv3 zf =
   case findEntryByPath "word/styles.xml" zf of
-    Nothing -> (M.empty, M.empty)
+    Nothing -> (M.empty, M.empty, M.empty)
     Just entry ->
       case parseXMLElement . UTF8.toTextLazy . fromEntry $ entry of
-        Left _ -> (M.empty, M.empty)
+        Left _ -> (M.empty, M.empty, M.empty)
         Right styElem ->
           let namespaces = elemToNameSpaces styElem
           in
            ( M.fromList $ map (\r -> (conv1 r, r)) $
                buildBasedOnList namespaces styElem Nothing,
              M.fromList $ map (\p -> (conv2 p, p)) $
-               buildBasedOnList namespaces styElem Nothing)
+               buildBasedOnList namespaces styElem Nothing,
+             M.fromList $ map (\p -> (conv3 p, p)) $
+               buildBasedOnList namespaces styElem Nothing )
 
 isBasedOnStyle :: (ElemToStyle a, FromStyleId (StyleId a)) => NameSpaces -> Element -> Maybe a -> Bool
 isBasedOnStyle ns element parentStyle
@@ -223,6 +239,22 @@
   type StyleName ParStyle = ParaStyleName
   getStyleName = pStyleName
 
+instance ElemToStyle TableStyle where
+  cStyleType _ = "table"
+  elemToStyle ns element parentStyle
+    | isElem ns "w" "style" element
+    , Just "table" <- findAttrByName ns "w" "type" element
+    = elemToTableStyleData ns element parentStyle
+    | otherwise = Nothing
+
+instance HasStyleId TableStyle where
+  type StyleId TableStyle = TableStyleId
+  getStyleId = tStyleId
+
+instance HasStyleName TableStyle where
+  type StyleName TableStyle = TableStyleName
+  getStyleName = tStyleName
+
 getStyleChildren :: (ElemToStyle a) => NameSpaces -> Element -> Maybe a -> [a]
 getStyleChildren ns element parentStyle
   | isElem ns "w" "styles" element =
@@ -275,6 +307,7 @@
       , isItalicCTL = checkOnOff ns rPr (elemName ns "w" "iCs")
       , isSmallCaps = checkOnOff ns rPr (elemName ns "w" "smallCaps")
       , isStrike = checkOnOff ns rPr (elemName ns "w" "strike")
+      , isDoubleStrike = checkOnOff ns rPr (elemName ns "w" "dstrike")
       , isRTL = checkOnOff ns rPr (elemName ns "w" "rtl")
       , isForceCTL = checkOnOff ns rPr (elemName ns "w" "cs")
       , rHighlight =
@@ -350,3 +383,14 @@
       , pStyleId = ParaStyleId styleId
       }
 elemToParStyleData _ _ _ = Nothing
+
+elemToTableStyleData :: NameSpaces
+                     -> Element -> Maybe TableStyle -> Maybe TableStyle
+elemToTableStyleData ns element _parentStyle
+  | Just styleId <- findAttrByName ns "w" "styleId" element
+  , Just styleName <- getElementStyleName ns element
+  = Just $ TableStyle
+      { tStyleName = styleName
+      , tStyleId = TableStyleId styleId
+      }
+elemToTableStyleData _ _ _ = Nothing
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -329,7 +329,8 @@
 
 kvPair :: PandocMonad m => Bool -> MarkdownParser m (Text, MetaValue)
 kvPair allowEmpty = try $ do
-  key <- many1TillChar (alphaNum <|> oneOf "_- ") (char ':')
+  key <- takeWhile1P (\c -> isAlphaNum c || c == '_' || c == '-' || c == ' ')
+  _ <- char ':'
   val <- trim <$> manyTillChar anyChar
           (try $ newline >> lookAhead (blankline <|> nonspaceChar))
   guard $ allowEmpty || not (T.null val)
@@ -576,11 +577,18 @@
   skipSpaces
   return attr
 
+setextUnderline :: PandocMonad m => MarkdownParser m Char
+setextUnderline = do
+  underlineChar <- oneOf setextHChars
+  skipMany (char underlineChar)
+  blanklines
+  pure underlineChar
+
 setextHeader :: PandocMonad m => MarkdownParser m (F Blocks)
 setextHeader = try $ do
   -- This lookahead prevents us from wasting time parsing Inlines
   -- unless necessary -- it gives a significant performance boost.
-  lookAhead $ anyLine >> many1 (oneOf setextHChars) >> blankline
+  lookAhead $ anyLine >> setextUnderline
   skipSpaces
   (text, raw) <- withRaw $ do
     oldAllowLineBreaks <- stateAllowLineBreaks <$> getState
@@ -590,9 +598,7 @@
     updateState $ \st -> st{ stateAllowLineBreaks = oldAllowLineBreaks }
     return res
   attr <- setextHeaderEnd
-  underlineChar <- oneOf setextHChars
-  many (char underlineChar)
-  blanklines
+  underlineChar <- setextUnderline
   let level = fromMaybe 0 (elemIndex underlineChar setextHChars) + 1
   attr' <- registerHeader attr (runF text defaultParserState)
   guardDisabled Ext_implicit_header_references
@@ -695,7 +701,7 @@
   char '{'
   skipMany spaceChar
   char '='
-  format <- many1Char $ satisfy (\c -> isAlphaNum c || c `elem` ['-', '_'])
+  format <- takeWhile1P (\c -> isAlphaNum c || c `elem` ['-', '_'])
   skipMany spaceChar
   char '}'
   return format
@@ -712,8 +718,8 @@
      (Left <$> (guardEnabled Ext_raw_attribute >> try rawAttribute))
     <|>
      (Right <$> do
-         let pLangId = many1Char . satisfy $ \x ->
-               x `notElem` ['`', '{', '}'] && not (isSpace x)
+         let pLangId = takeWhile1P (\x ->
+               x `notElem` ['`', '{', '}'] && not (isSpace x))
          mbLanguageId <- optionMaybe (toLanguageId <$> pLangId)
          skipMany spaceChar
          mbAttr <- optionMaybe
@@ -837,7 +843,7 @@
     case mbAlert of
       Nothing -> B.blockQuote <$> contents
       Just alert ->
-        (B.divWith ("", ["alert", alert], [])
+        (B.divWith ("", [alert, "alert"], [])
           . (B.divWith ("", ["title"], []) (B.para (B.str (T.toTitle alert))) <>))
            <$> contents
 
@@ -1933,7 +1939,8 @@
 bracketedSpan = do
   guardEnabled Ext_bracketed_spans
   try $ do
-    (lab,_) <- reference
+    guardDisabled Ext_footnotes <|> notFollowedBy' noteMarker
+    lab <- inBalancedBrackets inlines
     attr <- attributes
     return $ wrapSpan attr <$> lab
 
diff --git a/src/Text/Pandoc/Readers/Mdoc/Lex.hs b/src/Text/Pandoc/Readers/Mdoc/Lex.hs
--- a/src/Text/Pandoc/Readers/Mdoc/Lex.hs
+++ b/src/Text/Pandoc/Readers/Mdoc/Lex.hs
@@ -133,7 +133,9 @@
 anyText = escape <|> regularText <|> quoteChar <|> spaceTabChar
 
 regularText :: PandocMonad m => Lexer m T.Text
-regularText = many1Char $ noneOf "\n\r\t \\\""
+regularText = takeWhile1P (\c -> not (c == '\n' || c == '\r' ||
+                                      c == '\t' || c == ' ' ||
+                                      c == '\\' || c == '"'))
 
 quoteChar :: PandocMonad m => Lexer m T.Text
 quoteChar = T.singleton <$> char '"'
diff --git a/src/Text/Pandoc/Readers/MediaWiki.hs b/src/Text/Pandoc/Readers/MediaWiki.hs
--- a/src/Text/Pandoc/Readers/MediaWiki.hs
+++ b/src/Text/Pandoc/Readers/MediaWiki.hs
@@ -94,8 +94,31 @@
 specialChars :: [Char]
 specialChars = "'[]<=&*{}|\":\\_"
 
-spaceChars :: [Char]
-spaceChars = " \n\t"
+-- | True for characters that terminate a run of plain text, i.e. the
+-- 'specialChars' plus space, newline and tab.  Written as a @case@ so that
+-- GHC compiles it to a jump table; this is applied to every single
+-- character of the input, so a linear scan over the list here is a
+-- significant cost.  Must be kept in sync with 'specialChars'.
+isStrEnd :: Char -> Bool
+isStrEnd c = case c of
+  '\t' -> True
+  '\n' -> True
+  ' '  -> True
+  '"'  -> True
+  '&'  -> True
+  '\'' -> True
+  '*'  -> True
+  ':'  -> True
+  '<'  -> True
+  '='  -> True
+  '['  -> True
+  '\\' -> True
+  ']'  -> True
+  '_'  -> True
+  '{'  -> True
+  '|'  -> True
+  '}'  -> True
+  _    -> False
 
 sym :: PandocMonad m => Text -> MWParser m ()
 sym s = () <$ try (string $ T.unpack s)
@@ -616,7 +639,7 @@
       <|> special
 
 str :: PandocMonad m => MWParser m Inlines
-str = B.str <$> takeWhile1P (`notElem` (specialChars ++ spaceChars))
+str = B.str <$> takeWhile1P (not . isStrEnd)
 
 math :: PandocMonad m => MWParser m Inlines
 math = (B.displayMath . trim <$> try (many1 (char ':') >> textInTags "math"))
diff --git a/src/Text/Pandoc/Readers/ODT.hs b/src/Text/Pandoc/Readers/ODT.hs
--- a/src/Text/Pandoc/Readers/ODT.hs
+++ b/src/Text/Pandoc/Readers/ODT.hs
@@ -11,10 +11,11 @@
 Entry point to the odt reader.
 -}
 
-module Text.Pandoc.Readers.ODT ( readODT ) where
+module Text.Pandoc.Readers.ODT ( readODT, readFODT ) where
 
 import Codec.Archive.Zip
 import Text.Pandoc.XML.Light
+import qualified Text.Pandoc.XML.Light as XML
 import Text.Pandoc.Walk
 
 import Data.Char (isDigit)
@@ -22,9 +23,11 @@
 
 import System.FilePath
 
+import Control.Monad (unless)
 import Control.Monad.Except (throwError)
 
 import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
 
 import Text.Pandoc.Class.PandocMonad (PandocMonad)
 import qualified Text.Pandoc.Class.PandocMonad as P
@@ -40,6 +43,7 @@
 import Text.Pandoc.Readers.ODT.Generic.Fallible
 import Text.Pandoc.Readers.ODT.Generic.XMLConverter
 import Text.Pandoc.Shared (filteredFilesFromArchive)
+import Text.Pandoc.Sources (ToSources(..), sourcesToText)
 
 readODT :: PandocMonad m
         => ReaderOptions
@@ -50,6 +54,40 @@
     P.setMediaBag mb
     return $ walk makeFigure doc
   Left e -> throwError e
+
+-- | Read a flat OpenDocument text file, i.e. ODF's representation as a
+-- single XML file rather than a zip archive.
+readFODT :: (PandocMonad m, ToSources a)
+         => ReaderOptions
+         -> a
+         -> m Pandoc
+readFODT _ inp = do
+  root <- either (throwError . PandocXMLError "") pure
+            (parseXMLElement (TL.fromStrict (sourcesToText (toSources inp))))
+  case elementToODT root of
+    Right (doc, mb) -> do
+      P.setMediaBag mb
+      return $ walk makeFigure doc
+    Left e -> throwError e
+
+-- | A flat file has exactly one of each of the top-level elements that a
+-- package distributes over @content.xml@ and @styles.xml@, and they are
+-- all children of the root.  The converter addresses everything relative
+-- to the element it is given, so it can simply be handed that root.
+elementToODT :: Element -> Either PandocError (Pandoc, MediaBag)
+elementToODT root = do
+  -- the local name only, consistently with the URI-based namespace
+  -- matching downstream; office:document-content is correctly rejected
+  unless (XML.qName (XML.elName root) == "document") $
+    Left $ PandocParseError
+      "Expected office:document at the root of the flat OpenDocument file"
+  styles <- either
+               (\_ -> Left $ PandocParseError "Could not read styles")
+               Right
+               (readStylesAt root)
+  -- the media list is empty: all media arrives in office:binary-data
+  either (\_ -> Left $ PandocParseError "Could not convert opendocument") Right
+    (runConverter read_body (readerState styles []) root)
 
 -- the ODT parser uses old-style figures: an image with title beginning
 -- "fig:" in a paragraph by itself.  Convert these to new Figure elements.
diff --git a/src/Text/Pandoc/Readers/ODT/ContentReader.hs b/src/Text/Pandoc/Readers/ODT/ContentReader.hs
--- a/src/Text/Pandoc/Readers/ODT/ContentReader.hs
+++ b/src/Text/Pandoc/Readers/ODT/ContentReader.hs
@@ -24,9 +24,12 @@
 import Control.Applicative ((<|>))
 import Control.Monad ((<=<))
 
+import Data.ByteString.Base64 (decodeLenient)
 import qualified Data.ByteString.Lazy as B
+import Data.Char (isSpace)
 import Data.Foldable (fold)
 import Data.List (find)
+import Data.List.NonEmpty (nonEmpty)
 import qualified Data.Map as M
 import qualified Data.Text as T
 import Data.Maybe
@@ -36,8 +39,11 @@
 import qualified Text.Pandoc.XML.Light as XML
 
 import Text.Pandoc.Builder hiding (underline)
-import Text.Pandoc.MediaBag (MediaBag, insertMedia)
+import Text.Pandoc.ImageSize (ImageType(..), imageType)
+import Text.Pandoc.MediaBag (MediaBag, insertMedia, mediaItems)
+import Text.Pandoc.MIME (extensionFromMimeType)
 import Text.Pandoc.Shared
+import Text.Pandoc.Walk (walk)
 import Text.Pandoc.Extensions (extensionsFromList, Extension(..))
 import qualified Text.Pandoc.UTF8 as UTF8
 
@@ -57,7 +63,7 @@
 --------------------------------------------------------------------------------
 
 type Anchor = T.Text
-type Media = [(FilePath, B.ByteString)]
+type Media = M.Map FilePath B.ByteString
 
 data ReaderState
    = ReaderState { -- | A collection of styles read somewhere else.
@@ -83,6 +89,11 @@
                    -- | A map from internal anchor names to "pretty" ones.
                    -- The mapping is a purely cosmetic one.
                  , bookmarkAnchors  :: M.Map Anchor Anchor
+                   -- | The "pretty" anchors handed out so far, i.e. the
+                   -- values of 'bookmarkAnchors'. Kept separately so that
+                   -- checking an anchor for uniqueness does not cost a
+                   -- traversal of the whole map.
+                 , usedAnchors      :: Set.Set Anchor
                    -- | A map of files / binary data from the archive
                  , envMedia         :: Media
                    -- | Hold binary resources used in the document
@@ -90,8 +101,10 @@
                  }
   deriving ( Show )
 
-readerState :: Styles -> Media -> ReaderState
-readerState styles media = ReaderState styles [] 0 M.empty Nothing M.empty media mempty
+readerState :: Styles -> [(FilePath, B.ByteString)] -> ReaderState
+readerState styles media =
+  ReaderState styles [] 0 M.empty Nothing M.empty Set.empty
+              (M.fromList media) mempty
 
 --
 pushStyle'  :: Style -> ReaderState -> ReaderState
@@ -122,11 +135,9 @@
 --
 putPrettyAnchor :: Anchor -> Anchor -> ReaderState -> ReaderState
 putPrettyAnchor ugly pretty state@ReaderState{..}
-  = state { bookmarkAnchors = M.insert ugly pretty bookmarkAnchors }
-
---
-usedAnchors :: ReaderState -> [Anchor]
-usedAnchors ReaderState{..} = M.elems bookmarkAnchors
+  = state { bookmarkAnchors = M.insert ugly pretty bookmarkAnchors
+          , usedAnchors     = Set.insert pretty usedAnchors
+          }
 
 getMediaBag :: ReaderState -> MediaBag
 getMediaBag ReaderState{..} = odtMediaBag
@@ -187,24 +198,21 @@
 updateMediaWithResource resource = modifyExtraState (insertMedia' resource)
 
 --
-lookupResource :: FilePath -> ODTReader (FilePath, B.ByteString)
-lookupResource target = do
-  state <- getExtraState
-  case lookup target (getMediaEnv state) of
-    Just bs -> return (target, bs)
-    Nothing -> return ("", B.empty)
+lookupResource :: FilePath -> ODTReader (Maybe B.ByteString)
+lookupResource target = M.lookup target . getMediaEnv <$> getExtraState
 
 type AnchorPrefix = T.Text
 
 -- | An adaptation of 'uniqueIdent' from "Text.Pandoc.Shared" that generates a
 -- unique identifier but without assuming that the id should be for a header.
 -- Second argument is a list of already used identifiers.
-uniqueIdentFrom :: AnchorPrefix -> [Anchor] -> Anchor
+uniqueIdentFrom :: AnchorPrefix -> Set.Set Anchor -> Anchor
 uniqueIdentFrom baseIdent usedIdents =
   let  numIdent n = baseIdent <> "-" <> T.pack (show n)
-  in  if baseIdent `elem` usedIdents
+  in  if baseIdent `Set.member` usedIdents
         then maybe baseIdent numIdent
-             $ find (\x -> numIdent x `notElem` usedIdents) ([1..60000] :: [Int])
+             $ find (\x -> numIdent x `Set.notMember` usedIdents)
+                 ([1..60000] :: [Int])
                -- if we have more than 60,000, allow repeats
         else baseIdent
 
@@ -227,8 +235,7 @@
 getHeaderAnchor title = do
   state <- getExtraState
   let exts = extensionsFromList [Ext_auto_identifiers]
-  let anchor = uniqueIdent exts (toList title)
-                (Set.fromList $ usedAnchors state)
+  let anchor = uniqueIdent exts (toList title) (usedAnchors state)
   modifyExtraState (putPrettyAnchor anchor anchor)
   return anchor
 
@@ -514,10 +521,16 @@
 -- specifically. I honor that, although the current implementation of 'mappend'
 -- for 'Inlines' in "Text.Pandoc.Builder" will collapse them again.
 -- The rational is to be prepared for future modifications.
+-- The repeat count is attacker-controlled and unbounded in ODF, so cap
+-- it: a 832-byte document with @text:c="200000000"@ would otherwise
+-- exhaust memory.
+_MAX_SPACES_     :: Int
+_MAX_SPACES_      = 1000
+
 read_spaces      :: InlineMatcher
 read_spaces       = matchingElement NsText "s" $ do
                       count <- readAttrWithDefault NsText "c" 1 -- how many spaces?
-                      return $ fromList (replicate count Space)
+                      return $ fromList (replicate (min count _MAX_SPACES_) Space)
 --
 read_line_break  :: InlineMatcher
 read_line_break   = matchingElement NsText "line-break"
@@ -529,31 +542,65 @@
 --
 read_span        :: InlineMatcher
 read_span         = matchingElement NsText "span"
-                    $ withNewStyle
-                    $ matchContent [ read_span
-                                   , read_spaces
-                                   , read_line_break
-                                   , read_tab
-                                   , read_link
-                                   , read_frame
-                                   , read_note
-                                   , read_citation
-                                   , read_bookmark
-                                   , read_bookmark_start
-                                   , read_reference_start
-                                   , read_bookmark_ref
-                                   , read_reference_ref
-                                   ] read_plain_text
+                    $ withNewStyle matchInlineContent
 
+-- | ODF wraps inline content in a few elements that carry nothing but
+-- metadata: @text:meta@ holds RDFa annotations, @text:meta-field@ marks
+-- up bibliographic data. They are transparent as far as we are concerned.
+read_meta        :: InlineMatcher
+read_meta         = matchingElement NsText "meta" matchInlineContent
+
+read_meta_field  :: InlineMatcher
+read_meta_field   = matchingElement NsText "meta-field" matchInlineContent
+
+-- | A ruby annotation glosses a base text. Pandoc cannot represent the
+-- gloss, so keep the base text rather than dropping both.
+read_ruby        :: InlineMatcher
+read_ruby         = matchingElement NsText "ruby"
+                    $ matchContent' [ matchingElement NsText "ruby-base"
+                                        matchInlineContent ]
+
+-- | Fields hold a value that the producing application computes, such as
+-- a page number, a document property or a user variable. The element
+-- content is the text that application last displayed for the field,
+-- which is the best rendering available to us.
+read_fields      :: [InlineMatcher]
+read_fields       = [ matchingElement NsText name (matchContent [] read_plain_text)
+                    | name <- fieldElements ]
+
+fieldElements    :: [ElementName]
+fieldElements     =
+  [ "page-number", "page-count", "page-continuation", "page-variable-get"
+  , "date", "time", "creation-date", "creation-time"
+  , "modification-date", "modification-time"
+  , "print-date", "print-time", "printed-by"
+  , "editing-cycles", "editing-duration"
+  , "author-name", "author-initials", "initial-creator", "creator"
+  , "title", "subject", "description", "keywords"
+  , "chapter", "file-name", "template-name", "sheet-name"
+  , "variable-get", "variable-set", "variable-input"
+  , "user-defined", "user-field-get", "user-field-input"
+  , "expression", "text-input", "placeholder"
+  , "word-count", "character-count", "paragraph-count"
+  , "table-count", "image-count", "object-count"
+  , "database-display", "database-name", "database-row-number"
+  , "sequence-ref", "note-ref"
+  , "sender-firstname", "sender-lastname", "sender-initials"
+  , "sender-title", "sender-position", "sender-email"
+  , "sender-company", "sender-street", "sender-city"
+  , "sender-postal-code", "sender-country", "sender-state-or-province"
+  , "sender-phone-private", "sender-phone-work", "sender-fax"
+  ]
+
 --
 read_paragraph   :: Matcher CombiningBlocks
 read_paragraph    = matchingElement NsText "p" $ fmap CombiningBlocks $ do
                       fStyle <- tryC readStyleByName
                       case fStyle of
                         Right style | isPreformattedStyle style ->
-                          codeBlock . stringifyInlines <$> matchParagraphContent
+                          codeBlock . stringifyInlines <$> matchInlineContent
                         _ ->
-                          constructPara (para <$> withNewStyle matchParagraphContent)
+                          constructPara (para <$> withNewStyle matchInlineContent)
                     where
                       isPreformattedStyle :: (StyleName, Style) -> Bool
                       isPreformattedStyle ("Preformatted_20_Text", _) = True
@@ -561,24 +608,45 @@
                       isPreformattedStyle _ = False
 
 
-matchParagraphContent :: ODTReader Inlines
-matchParagraphContent = matchContent [ read_span
-                                     , read_spaces
-                                     , read_line_break
-                                     , read_tab
-                                     , read_link
-                                     , read_note
-                                     , read_citation
-                                     , read_bookmark
-                                     , read_bookmark_start
-                                     , read_reference_start
-                                     , read_bookmark_ref
-                                     , read_reference_ref
-                                     , read_frame
-                                     , read_text_seq
-                                     ] read_plain_text
+-- | Reads the inline content of a paragraph, heading or span.
+matchInlineContent :: ODTReader Inlines
+matchInlineContent = matchContent inlineMatchers read_plain_text
 
+inlineMatchers :: [InlineMatcher]
+inlineMatchers = [ read_span
+                 , read_spaces
+                 , read_line_break
+                 , read_tab
+                 , read_link
+                 , read_note
+                 , read_citation
+                 , read_bookmark
+                 , read_bookmark_start
+                 , read_reference_start
+                 , read_bookmark_ref
+                 , read_reference_ref
+                 , read_frame
+                 , read_text_seq
+                 , read_meta
+                 , read_meta_field
+                 , read_ruby
+                 ] ++ read_fields
 
+-- | Reads the block-level content that ODF permits wherever it permits a
+-- paragraph: in the body of the document, and in a section, a list item, a
+-- footnote or a table cell.
+matchBlockContent :: ODTReader Blocks
+matchBlockContent = matchSmushedChildBlocks' blockMatchers
+
+blockMatchers :: [Matcher CombiningBlocks]
+blockMatchers = [ read_paragraph
+                , read_header
+                , read_list
+                , read_table
+                , read_section
+                ]
+
+
 ----------------------
 -- Headers
 ----------------------
@@ -587,20 +655,7 @@
 read_header      :: Matcher CombiningBlocks
 read_header       = matchingElement NsText "h" $ do
   level    <- readAttrWithDefault NsText "outline-level" 1
-  children <- matchContent [ read_span
-                           , read_spaces
-                           , read_line_break
-                           , read_tab
-                           , read_link
-                           , read_note
-                           , read_citation
-                           , read_bookmark
-                           , read_bookmark_start
-                           , read_reference_start
-                           , read_bookmark_ref
-                           , read_reference_ref
-                           , read_frame
-                           ] read_plain_text
+  children <- matchInlineContent
   anchor   <- getHeaderAnchor children
   let idAttr = (anchor, [], []) -- no classes, no key-value pairs
   return $ CombiningBlocks $ headerWith idAttr level children
@@ -627,12 +682,7 @@
 read_list_element               :: ElementName -> Matcher [Blocks]
 read_list_element listElement   = matchingElement NsText listElement
                                   $ compactify . (:[])
-                                  <$> matchSmushedChildBlocks'
-                                        [ read_paragraph
-                                        , read_header
-                                        , read_list
-                                        , read_section
-                                        ]
+                                  <$> matchBlockContent
 
 ----------------------
 -- Sections
@@ -641,12 +691,7 @@
 read_section :: Matcher CombiningBlocks
 read_section = matchingElement NsText "section"
                  $ CombiningBlocks . divWith nullAttr
-                 <$> matchSmushedChildBlocks' [ read_paragraph
-                                              , read_header
-                                              , read_list
-                                              , read_table
-                                              , read_section
-                                              ]
+                 <$> matchBlockContent
 
 
 ----------------------
@@ -687,8 +732,7 @@
                     $ note <$> matchContent' [ read_note_body ]
 
 read_note_body   :: BlockMatcher
-read_note_body    = matchingElement NsText "note-body"
-                    $ matchSmushedChildBlocks' [ read_paragraph ]
+read_note_body    = matchingElement NsText "note-body" matchBlockContent
 
 -------------------------
 -- Citations
@@ -714,8 +758,8 @@
 read_table        :: Matcher CombiningBlocks
 read_table         = matchingElement NsTable "table"
                      $ fmap (CombiningBlocks . table')
-                     $ (,) <$> matchContent' [read_table_header]
-                           <*> matchContent' [read_table_row]
+                     $ (,) <$> matchContent' read_header_rows
+                           <*> matchContent' read_body_rows
 
 -- | A table without a caption.
 table' :: ([[Cell]], [[Cell]]) -> Blocks
@@ -723,24 +767,60 @@
     table emptyCaption (replicate numcols defaults) th [tb] tf
   where
     defaults = (AlignDefault, ColWidthDefault)
-    numcols = maximum $ map length $ headers ++ rows
+    -- A table element need not contain any rows, so guard against
+    -- taking the maximum of an empty list.
+    numcols = maybe 0 maximum $ nonEmpty $ map rowWidth $ headers ++ rows
+    -- A cell spanning several columns occupies all of them.
+    rowWidth = sum . map (\(Cell _ _ _ (ColSpan cs) _) -> cs)
     toRow = Row nullAttr
     th = TableHead nullAttr $ map toRow headers
     tb = TableBody nullAttr 0 [] $ map toRow rows
     tf = TableFoot nullAttr []
 
---
-read_table_header :: Matcher [[Cell]]
-read_table_header = matchingElement NsTable "table-header-rows"
-                      $ matchContent' [ read_table_row
-                                      ]
+-- | Rows need not be immediate children of the table: ODF lets them be
+-- wrapped in any number of @table:table-row-group@ and @table:table-rows@
+-- elements, which only group them for the benefit of outlining and
+-- formatting. The children are walked twice, once picking up the rows that a
+-- @table:table-header-rows@ marks as headers and once the remaining ones.
+read_header_rows  :: [Matcher [[Cell]]]
+read_header_rows   = [ matchingElement NsTable "table-header-rows"
+                         $ matchContent' [ read_table_row ]
+                     , matchingElement NsTable "table-row-group"
+                         $ matchContent' read_header_rows
+                     ]
 
+read_body_rows    :: [Matcher [[Cell]]]
+read_body_rows     = [ read_table_row
+                     , matchingElement NsTable "table-rows"
+                         $ matchContent' [ read_table_row ]
+                     , matchingElement NsTable "table-row-group"
+                         $ matchContent' read_body_rows
+                     ]
+
+-- | ODF abbreviates a run of identical rows or cells with a repeat count.
+-- The counts are unbounded in the format -- spreadsheets pad out to the end
+-- of the sheet with them -- so a handful of bytes could otherwise ask for an
+-- arbitrarily large table. Bound both the width a single cell element stands
+-- for and the number of cells a single row element expands to; capping the
+-- two counts separately would not do, as they multiply.
+_MAX_COLUMNS_, _MAX_ROW_CELLS_ :: Int
+_MAX_COLUMNS_      = 1000
+_MAX_ROW_CELLS_    = 10000
+
+repeated          :: ElementName -> ODTReader Int
+repeated attrName  = max 1 <$> readAttrWithDefault NsTable attrName 1
+
 --
 read_table_row    :: Matcher [[Cell]]
 read_table_row     = matchingElement NsTable "table-row"
-                     $ (:[])
+                     $ row'
                      <$> matchContent' [ read_table_cell
                                        ]
+                     <*> repeated "number-rows-repeated"
+  where
+    row' cells repeat' =
+      replicate (max 1 $ min repeat'
+                       $ _MAX_ROW_CELLS_ `div` max 1 (length cells)) cells
 
 --
 read_table_cell   :: Matcher [Cell]
@@ -748,11 +828,12 @@
                      $ cell'
                        <$> (RowSpan <$> readAttrWithDefault NsTable "number-rows-spanned" 1)
                        <*> (ColSpan <$> readAttrWithDefault NsTable "number-columns-spanned" 1)
-                       <*> matchSmushedChildBlocks' [ read_paragraph
-                                                    , read_list
-                                                    ]
+                       <*> (min _MAX_COLUMNS_ <$> repeated "number-columns-repeated")
+                       <*> matchBlockContent
   where
-    cell' rowSpan colSpan blocks = map (cell AlignDefault rowSpan colSpan) $ compactify [blocks]
+    cell' rowSpan colSpan repeat' blocks =
+      concat $ replicate repeat'
+             $ map (cell AlignDefault rowSpan colSpan) (compactify [blocks])
 
 ----------------------
 -- Frames
@@ -774,23 +855,77 @@
 
 read_frame_img :: XML.Element -> ODTReader (FirstMatch Inlines)
 read_frame_img img = do
-  src <- executeIn img (findAttr' NsXLink "href")
-  case fold src of
-    ""   -> return mempty
-    src' -> do
+  mbSrc <- executeIn img resolveImageSrc
+  case mbSrc of
+    Nothing  -> return mempty
+    Just src -> do
+      -- note: the remaining attributes are read in the context of the
+      -- enclosing draw:frame, not of the draw:image
       let exts = extensionsFromList [Ext_auto_identifiers]
-          src'' = fixRelativeLink src'
-      resource   <- lookupResource (T.unpack src'')
-      updateMediaWithResource resource
       w          <- findAttr' NsSVG "width"
       h          <- findAttr' NsSVG "height"
       titleNodes <- matchContent' [ read_frame_title ]
-      alt        <- matchContent [] read_plain_text
+      -- trimmed because a pretty-printed file indents the children of
+      -- the frame, and that whitespace is not alt text
+      alt        <- trimInlines <$> matchContent [] read_plain_text
       return $ firstMatch
-             $ imageWith (image_attributes w h) src''
+             $ imageWith (image_attributes w h) src
                          (inlineListToIdentifier exts (toList titleNodes))
                          alt
 
+-- | Determine the media bag path of the image of the current
+-- @draw:image@ element.  The image data is either in another file of the
+-- archive, referenced by @xlink:href@, or embedded in the element as
+-- base64 in an @office:binary-data@ child (which is how a flat
+-- OpenDocument file must carry it).
+resolveImageSrc :: ODTReader (Maybe T.Text)
+resolveImageSrc = do
+  href <- fold <$> findAttr' NsXLink "href"
+  if not (T.null href)
+     then do
+       let src = fixRelativeLink href
+       -- The archive need not actually contain the referenced file; if it
+       -- does not, leave the media bag alone and just emit the link.
+       mapM_ (updateMediaWithResource . (,) (T.unpack src))
+         =<< lookupResource (T.unpack src)
+       return (Just src)
+     else do
+       drawImage <- getCurrentElement
+       findChild' NsOffice "binary-data"
+         >>= traverse (embedBase64Image drawImage)
+
+-- | Add the base64-encoded image data of an @office:binary-data@ element
+-- to the media bag and return the path under which it was filed.  The
+-- mime type is declared on the enclosing @draw:image@.
+embedBase64Image :: XML.Element -> XML.Element -> ODTReader T.Text
+embedBase64Image drawImage binaryData = do
+  let bytes = decodeLenient . UTF8.fromText
+            . T.filter (not . isSpace) . XML.strContent $ binaryData
+  -- the attribute is draw:mime-type in ODF 1.3 but loext:mime-type in
+  -- older LibreOffice output, so match on the local name only
+  let mbExtension =
+        ((("." <>) <$>) . extensionFromMimeType
+          =<< XML.findAttrBy ((== "mime-type") . XML.qName) drawImage)
+        <|> (extensionForImageType <$> imageType bytes)
+  n <- length . mediaItems . getMediaBag <$> getExtraState
+  let path = "Pictures/image" <> show (n + 1) <> T.unpack (fromMaybe ".bin" mbExtension)
+  updateMediaWithResource (path, B.fromStrict bytes)
+  return (T.pack path)
+
+extensionForImageType :: ImageType -> T.Text
+extensionForImageType imgType =
+  case imgType of
+    Png  -> ".png"
+    Jpeg -> ".jpeg"
+    Gif  -> ".gif"
+    Pdf  -> ".pdf"
+    Eps  -> ".eps"
+    Svg  -> ".svg"
+    Emf  -> ".emf"
+    Tiff -> ".tiff"
+    Webp -> ".webp"
+    Avif -> ".avif"
+
 read_frame_title :: InlineMatcher
 read_frame_title = matchingElement NsSVG "title" (matchContent [] read_plain_text)
 
@@ -804,17 +939,41 @@
 
 read_frame_mathml :: XML.Element -> ODTReader (FirstMatch Inlines)
 read_frame_mathml obj = do
-  src <- executeIn obj (findAttr' NsXLink "href")
-  case fold src of
-    ""   -> return mempty
-    src' -> do
-      let path = T.unpack $
-                  fromMaybe src' (T.stripPrefix "./" src') <> "/content.xml"
-      (_, mathml) <- lookupResource path
-      case readMathML (UTF8.toText $ B.toStrict mathml) of
-        Left _     -> return mempty
-        Right exps -> return $ firstMatch $ displayMath $ writeTeX exps
+  href <- fold <$> executeIn obj (findAttr' NsXLink "href")
+  mbMathML <-
+    if T.null href
+       then -- a flat OpenDocument file has to embed the formula in the
+            -- draw:object itself
+            return $ XML.showElement . addMathMLNamespace <$> findMathML obj
+       else do
+         -- note that pandoc's own odt writer uses a trailing slash
+         let dir = T.dropWhileEnd (== '/') $
+                     fromMaybe href (T.stripPrefix "./" href)
+         fmap (UTF8.toText . B.toStrict) <$>
+           lookupResource (T.unpack (dir <> "/content.xml"))
+  case readMathML <$> mbMathML of
+    Just (Right exps) -> return $ firstMatch $ displayMath $ writeTeX exps
+    _                 -> return mempty
 
+-- | Find the MathML of a formula embedded in a @draw:object@.  It is
+-- searched for as a descendant, not as a direct child, because the
+-- @math@ element may be wrapped in an @office:document@ element
+-- describing an embedded formula document.
+findMathML :: XML.Element -> Maybe XML.Element
+findMathML = XML.filterElementName ((== "math") . XML.qName)
+
+-- | XML.Light carries namespace prefixes literally and does not
+-- synthesise declarations, so the declaration of the MathML namespace
+-- may have been left behind on the root of the flat file.
+addMathMLNamespace :: XML.Element -> XML.Element
+addMathMLNamespace el =
+  el{ XML.elAttribs =
+        XML.Attr (XML.QName "xmlns" Nothing Nothing)
+                 "http://www.w3.org/1998/Math/MathML"
+        : filter (not . isDefaultNS . XML.attrKey) (XML.elAttribs el) }
+ where
+  isDefaultNS qn = XML.qName qn == "xmlns" && isNothing (XML.qPrefix qn)
+
 read_frame_text_box :: XML.Element -> ODTReader (FirstMatch Inlines)
 read_frame_text_box box = do
   paragraphs <- executeIn box (matchSmushedChildBlocks' [ read_paragraph ])
@@ -905,21 +1064,33 @@
 ----------------------
 
 read_text :: ODTReader Pandoc
-read_text = doc <$> matchSmushedChildBlocks' [ read_header
-                                             , read_paragraph
-                                             , read_list
-                                             , read_section
-                                             , read_table
-                                             ]
+read_text = doc <$> matchBlockContent
 
 post_process :: Pandoc -> Pandoc
-post_process (Pandoc m blocks) =
-  Pandoc m (post_process' blocks)
+post_process = walk (unwrapCaptions . attachCaptions)
 
-post_process' :: [Block] -> [Block]
-post_process' (Table attr _ specs th tb tf : Div ("", ["caption"], _) blks : xs)
-  = Table attr (Caption Nothing blks) specs th tb tf : post_process' xs
-post_process' bs = bs
+-- | Paragraphs styled as table captions are read as a Div with class
+-- @caption@ (see 'constructPara'). Attach each of them to the adjacent
+-- table; ODF puts the caption either before or after its table.
+attachCaptions :: [Block] -> [Block]
+attachCaptions (Table attr _ specs th tb tf : b : xs)
+  | Just blks <- captionBlocks b
+  = Table attr (Caption Nothing blks) specs th tb tf : attachCaptions xs
+attachCaptions (b : Table attr _ specs th tb tf : xs)
+  | Just blks <- captionBlocks b
+  = Table attr (Caption Nothing blks) specs th tb tf : attachCaptions xs
+attachCaptions (b : bs) = b : attachCaptions bs
+attachCaptions []       = []
+
+-- | The Div is only an internal marker, so a caption paragraph that
+-- turned out not to belong to a table is emitted as an ordinary
+-- paragraph rather than leaking the marker into the output.
+unwrapCaptions :: [Block] -> [Block]
+unwrapCaptions = concatMap (\b -> fromMaybe [b] (captionBlocks b))
+
+captionBlocks :: Block -> Maybe [Block]
+captionBlocks (Div ("", ["caption"], _) blks) = Just blks
+captionBlocks _                               = Nothing
 
 read_body :: ODTReader (Pandoc, MediaBag)
 read_body = executeInSub NsOffice "body"
diff --git a/src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs b/src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs
--- a/src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs
+++ b/src/Text/Pandoc/Readers/ODT/Generic/XMLConverter.hs
@@ -25,6 +25,7 @@
 , modifyExtraState
 , getCurrentElement
 , elName
+, findChild'
 , filterChildrenName'
 , isSet'
 , isSetWithDefault
diff --git a/src/Text/Pandoc/Readers/ODT/StyleReader.hs b/src/Text/Pandoc/Readers/ODT/StyleReader.hs
--- a/src/Text/Pandoc/Readers/ODT/StyleReader.hs
+++ b/src/Text/Pandoc/Readers/ODT/StyleReader.hs
@@ -41,7 +41,6 @@
 
 import Data.Default
 import qualified Data.Foldable as F
-import qualified Data.List as L
 import qualified Data.Map as M
 import Data.Maybe
 import Data.Text (Text)
@@ -447,8 +446,9 @@
           <*> readUnderlineMode
           <*> readStrikeThroughMode
   where isFontEmphasised = [("normal",False),("italic",True),("oblique",True)]
+        -- As in CSS, `bold` is weight 700; lighter weights are not bold.
         isFontBold = ("normal",False):("bold",True)
-                    :map ((,True) . tshow) ([100,200..900]::[Int])
+                    :map (\w -> (tshow w, w >= 700)) ([100,200..900]::[Int])
 
 readUnderlineMode     :: StyleReader (Maybe UnderlineMode)
 readUnderlineMode     = readLineMode "text-underline-mode"
@@ -567,17 +567,27 @@
 -- | Returns a chain of parent of the current style. The direct parent will
 -- be the first element of the list, followed by its parent and so on.
 -- The current style is not in the list.
+-- Note that @style:parent-style-name@ references can be cyclic, so we
+-- keep track of the names already seen to avoid looping forever.
 parents               :: Style       -> Styles ->      [Style]
-parents style styles = L.unfoldr findNextParent style -- Ha!
-  where findNextParent Style{..}
-          = fmap (\p -> (p, p)) $ (`lookupStyle` styles) =<< styleParentName
+parents style styles = go S.empty style
+  where
+    go seen Style{..}
+      | Just name <- styleParentName
+      , not (name `S.member` seen)
+      , Just parent <- lookupStyle name styles
+      = parent : go (S.insert name seen) parent
+      | otherwise
+      = []
 
 -- | Looks up the style family of the current style. Normally, every style
 -- should have one. But if not, all parents are searched.
+-- Searching the parents recursively would repeatedly walk the same
+-- chains, taking time exponential in its length; the chain is linear,
+-- so we can just walk it once.
 getStyleFamily        :: Style       -> Styles -> Maybe StyleFamily
-getStyleFamily style@Style{..} styles
-  =     styleFamily
-    <|> F.asum (map (`getStyleFamily` styles) $ parents style styles)
+getStyleFamily style styles
+  = F.asum $ map styleFamily $ style : parents style styles
 
 -- | Each 'Style' has certain 'StyleProperties'. But sometimes not all property
 -- values are specified. Instead, a value might be inherited from a
diff --git a/src/Text/Pandoc/Readers/Org/Inlines.hs b/src/Text/Pandoc/Readers/Org/Inlines.hs
--- a/src/Text/Pandoc/Readers/Org/Inlines.hs
+++ b/src/Text/Pandoc/Readers/Org/Inlines.hs
@@ -34,7 +34,7 @@
 import Safe (lastMay)
 import Control.Monad (guard, mplus, mzero, unless, when, void)
 import Control.Monad.Trans (lift)
-import Data.Char (isAlphaNum, isSpace)
+import Data.Char (isAlpha, isAlphaNum, isSpace)
 import qualified Data.Map as M
 import qualified Data.Set as Set
 import Data.Text (Text)
@@ -79,8 +79,27 @@
 
 -- | Parse a single Org-mode inline element
 inline :: PandocMonad m => OrgParser m (F Inlines)
-inline =
-  choice [ whitespace
+inline = do
+  c <- lookAhead anyChar
+  (if isStrEnd c then inlineMarkup else inlineWord c)
+    <* (guard =<< newlinesCountWithinLimits)
+    <?> "inline"
+ where
+  -- Fast path for a character that starts a plain word.  Every
+  -- alternative in 'inlineMarkup' other than those below begins with a
+  -- character for which 'isStrEnd' holds, so none of them can match
+  -- here; and 'str' always succeeds, so nothing after it is reachable.
+  -- The remaining candidates are 'plainLink' (whose URI schemes all
+  -- start with a letter), the org-ref form of 'cite' (which must start
+  -- with "cite") and 'inlineCodeBlock' (which must start with "src_").
+  inlineWord c = case c of
+    'c' -> cite <|> plainLink <|> str
+    's' -> plainLink <|> inlineCodeBlock <|> str
+    _ | isAlpha c -> plainLink <|> str
+      | otherwise -> str
+
+  inlineMarkup = choice
+         [ whitespace
          , linebreak
          , cite
          , footnote
@@ -102,8 +121,7 @@
          , smartQuotes
          , specialStrings
          , symbol
-         ] <* (guard =<< newlinesCountWithinLimits)
-  <?> "inline"
+         ]
 
 -- | Read the rest of the input as inlines.
 inlines :: PandocMonad m => OrgParser m (F Inlines)
@@ -113,7 +131,44 @@
 specialChars :: [Char]
 specialChars = "\"$'()*+-,./:;<=>@[\\]^_{|}~"
 
+-- | True for characters that terminate a plain 'str' run, i.e. the
+-- 'specialChars' plus whitespace and newlines.  Written as a @case@ so
+-- that GHC compiles it to a jump table instead of a linear scan over
+-- 'specialChars'; this predicate is applied to every input character.
+isStrEnd :: Char -> Bool
+isStrEnd c = case c of
+  ' '  -> True
+  '\n' -> True
+  '\r' -> True
+  '"'  -> True
+  '$'  -> True
+  '\'' -> True
+  '('  -> True
+  ')'  -> True
+  '*'  -> True
+  '+'  -> True
+  '-'  -> True
+  ','  -> True
+  '.'  -> True
+  '/'  -> True
+  ':'  -> True
+  ';'  -> True
+  '<'  -> True
+  '='  -> True
+  '>'  -> True
+  '@'  -> True
+  '['  -> True
+  '\\' -> True
+  ']'  -> True
+  '^'  -> True
+  '_'  -> True
+  '{'  -> True
+  '|'  -> True
+  '}'  -> True
+  '~'  -> True
+  _    -> False
 
+
 whitespace :: PandocMonad m => OrgParser m (F Inlines)
 whitespace = pure B.space <$ skipMany1 spaceChar
                           <* updateLastPreCharPos
@@ -125,7 +180,7 @@
 
 str :: PandocMonad m => OrgParser m (F Inlines)
 str = return . B.str <$>
-      ( takeWhile1P (`notElem` (specialChars ++ "\n\r ")) >>= updatePositions' )
+      ( takeWhile1P (not . isStrEnd) >>= updatePositions' )
       <* updateLastStrPos
   where
     updatePositions' str' = str' <$
diff --git a/src/Text/Pandoc/Readers/RST.hs b/src/Text/Pandoc/Readers/RST.hs
--- a/src/Text/Pandoc/Readers/RST.hs
+++ b/src/Text/Pandoc/Readers/RST.hs
@@ -349,7 +349,8 @@
   indent <- length <$> many (char ' ')
   guard $ indent >= minIndent
   char ':'
-  name <- many1TillChar (noneOf "\n") (char ':')
+  name <- takeWhile1P (\c -> c /= '\n' && c /= ':')
+  char ':'
   (void (lookAhead newline)) <|> skipMany1 spaceChar
   first <- anyLine
   rest <- option "" $ try $ do lookAhead (count indent (char ' ') >> spaceChar)
diff --git a/src/Text/Pandoc/Readers/RTF.hs b/src/Text/Pandoc/Readers/RTF.hs
--- a/src/Text/Pandoc/Readers/RTF.hs
+++ b/src/Text/Pandoc/Readers/RTF.hs
@@ -82,6 +82,12 @@
                                                  -- paragraph numbering is in
                                                  -- effect; every paragraph in
                                                  -- scope is its own list item
+                          , sPendingSurrogate :: Maybe Word16
+                                                 -- A high surrogate from a \u
+                                                 -- control word, held back
+                                                 -- until we know whether the
+                                                 -- low surrogate completing it
+                                                 -- follows
                           } deriving (Show)
 
 instance Default RTFState where
@@ -99,6 +105,7 @@
                 , sEatChars = 0
                 , sListText = False
                 , sPnActive = False
+                , sPendingSurrogate = Nothing
                 }
 
 type FontTable = IntMap.IntMap FontFamily
@@ -385,12 +392,46 @@
 
 addText :: PandocMonad m => Text -> RTFParser m ()
 addText t = do
+  -- A high surrogate held back by 'addUnicodeCodeUnit' can only be completed
+  -- by the next \u control word, so any text in between means it was
+  -- unpaired.  Empty text does not count: consuming a \u's fallback
+  -- characters ends in adding the empty remainder of them, and that happens
+  -- between the two halves of a surrogate pair.
+  unless (T.null t) $
+    updateState $ \s -> s{ sPendingSurrogate = Nothing }
   gs <- sGroupStack <$> getState
   let !props = case gs of
                 (x:_) -> x
                 _ -> def
   updateState (\s -> s{ sTextContent = (props, t) : sTextContent s })
 
+-- | Add the character denoted by the argument of a @\\u@ control word, which
+-- is a single UTF-16 code unit.  A character outside the Basic Multilingual
+-- Plane is written as a surrogate pair, that is, as two consecutive @\\u@
+-- words, each followed by its own fallback characters, so a high surrogate is
+-- held back until we know whether the low surrogate completing it follows.
+-- An unpaired surrogate denotes no character and cannot be represented in
+-- 'Text', so it is dropped.
+addUnicodeCodeUnit :: PandocMonad m => Word16 -> RTFParser m ()
+addUnicodeCodeUnit unit = do
+  mbHigh <- sPendingSurrogate <$> getState
+  updateState $ \s -> s{ sPendingSurrogate = Nothing }
+  case mbHigh of
+    Just high | isLowSurrogate unit ->      -- a complete pair
+      addText $ T.singleton $ chr $
+        0x10000 + (fromIntegral high - 0xD800) * 0x400
+                + (fromIntegral unit - 0xDC00)
+    _ | isHighSurrogate unit ->             -- wait for the low surrogate
+          updateState $ \s -> s{ sPendingSurrogate = Just unit }
+      | isLowSurrogate unit -> pure ()      -- unpaired, so dropped
+      | otherwise -> addText $ T.singleton $ chr $ fromIntegral unit
+
+isHighSurrogate :: Word16 -> Bool
+isHighSurrogate unit = unit >= 0xD800 && unit <= 0xDBFF
+
+isLowSurrogate :: Word16 -> Bool
+isLowSurrogate unit = unit >= 0xDC00 && unit <= 0xDFFF
+
 inGroup :: PandocMonad m => RTFParser m a -> RTFParser m a
 inGroup p = do
   updateState $ \st ->
@@ -660,9 +701,7 @@
       -- "RTF control words generally accept signed 16-bit numbers as
       -- arguments. For this reason, Unicode values greater than 32767
       -- must be expressed as negative numbers."
-      let codepoint :: Word16
-          codepoint = fromIntegral i
-      addText (T.singleton (chr $ fromIntegral codepoint))
+      addUnicodeCodeUnit (fromIntegral i)
     ControlWord "caps" mbp -> bs <$
       modifyGroup (\g -> g{ gCaps = boolParam mbp })
     ControlWord "deleted" mbp -> bs <$
diff --git a/src/Text/Pandoc/Readers/Roff.hs b/src/Text/Pandoc/Readers/Roff.hs
--- a/src/Text/Pandoc/Readers/Roff.hs
+++ b/src/Text/Pandoc/Readers/Roff.hs
@@ -530,7 +530,8 @@
 
 regularText :: PandocMonad m => RoffLexer m [LinePart]
 regularText = do
-  s <- many1Char $ noneOf "\n\r\t \\\""
+  s <- takeWhile1P (\c -> not (c == '\n' || c == '\r' || c == '\t' ||
+                               c == ' ' || c == '\\' || c == '"'))
   return [RoffStr s]
 
 quoteChar :: PandocMonad m => RoffLexer m [LinePart]
diff --git a/src/Text/Pandoc/Readers/Roff/Escape.hs b/src/Text/Pandoc/Readers/Roff/Escape.hs
--- a/src/Text/Pandoc/Readers/Roff/Escape.hs
+++ b/src/Text/Pandoc/Readers/Roff/Escape.hs
@@ -123,7 +123,7 @@
   case c of
     ' ' -> return $ emit " " -- mandoc_char(7) says this should be a nonbreaking space
     '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment
-    '#' -> mempty <$ manyTill anyChar newline
+    '#' -> mempty <$ (skipMany (satisfy (/='\n')) <* newline)
     '%' -> return mempty  -- optional hyphenation
     '&' -> return mempty  -- nonprintable zero-width
     ')' -> return mempty  -- nonprintable zero-width
@@ -212,11 +212,11 @@
 escapeArg :: (PandocMonad m, RoffLikeLexer x) => Lexer m x T.Text
 escapeArg = choice
     [ char '[' *> optional expandString *>
-                  manyTillChar (noneOf ['\n',']']) (char ']')
+                  takeWhileP (\c -> c /= '\n' && c /= ']') <* char ']'
     , char '(' *> optional expandString *>
                   countChar 2 (satisfy (/='\n'))
     ]
 
 -- Parses: '..'
 quoteArg :: (PandocMonad m, RoffLikeLexer x) => Lexer m x T.Text
-quoteArg = char '\'' *> manyTillChar (noneOf ['\n','\'']) (char '\'')
+quoteArg = char '\'' *> takeWhile1P (\c -> c /= '\n' && c /= '\'') <* char '\''
diff --git a/src/Text/Pandoc/Readers/Textile.hs b/src/Text/Pandoc/Readers/Textile.hs
--- a/src/Text/Pandoc/Readers/Textile.hs
+++ b/src/Text/Pandoc/Readers/Textile.hs
@@ -593,6 +593,76 @@
 wordBoundaries :: [Char]
 wordBoundaries = markupChars <> stringBreakers
 
+-- | True for the characters in 'wordBoundaries'.  Written as a @case@ so
+-- that GHC compiles it to a jump table; 'wordChunk' applies this to every
+-- single character of the input (at three separate sites), so a linear
+-- scan over the 39-element list here is a significant cost.  Must be kept
+-- in sync with 'markupChars' and 'stringBreakers'.
+isWordBoundary :: Char -> Bool
+isWordBoundary c = case c of
+  '\t'    -> True
+  '\n'    -> True
+  '\r'    -> True
+  ' '     -> True
+  '!'     -> True
+  '"'     -> True
+  '#'     -> True
+  '%'     -> True
+  '&'     -> True
+  '\''    -> True
+  '('     -> True
+  ')'     -> True
+  '*'     -> True
+  '+'     -> True
+  ','     -> True
+  '-'     -> True
+  '.'     -> True
+  ':'     -> True
+  ';'     -> True
+  '<'     -> True
+  '='     -> True
+  '>'     -> True
+  '?'     -> True
+  '@'     -> True
+  '['     -> True
+  '\\'    -> True
+  ']'     -> True
+  '^'     -> True
+  '_'     -> True
+  '|'     -> True
+  '~'     -> True
+  '\171'  -> True
+  '\187'  -> True
+  '\8216' -> True
+  '\8217' -> True
+  '\8218' -> True
+  '\8220' -> True
+  '\8221' -> True
+  '\8222' -> True
+  _       -> False
+
+-- | True for the characters in 'markupChars'.  As with 'isWordBoundary',
+-- written as a @case@ to get a jump table.  Must be kept in sync with
+-- 'markupChars'.
+isMarkupChar :: Char -> Bool
+isMarkupChar c = case c of
+  '#'  -> True
+  '%'  -> True
+  '&'  -> True
+  '*'  -> True
+  '+'  -> True
+  '-'  -> True
+  '='  -> True
+  '@'  -> True
+  '['  -> True
+  '\\' -> True
+  ']'  -> True
+  '^'  -> True
+  '_'  -> True
+  '|'  -> True
+  '~'  -> True
+  _    -> False
+
 -- | Parse a hyphened sequence of words
 hyphenedWords :: PandocMonad m => TextileParser m Text
 hyphenedWords = do
@@ -602,10 +672,10 @@
 
 wordChunk :: PandocMonad m => TextileParser m Text
 wordChunk = try $ do
-  hd <- noneOf wordBoundaries
-  tl <- many ( noneOf wordBoundaries <|>
-               try (notFollowedBy' note *> oneOf markupChars
-                     <* lookAhead (noneOf wordBoundaries) ) )
+  hd <- satisfy (not . isWordBoundary)
+  tl <- many ( satisfy (not . isWordBoundary) <|>
+               try (notFollowedBy' note *> satisfy isMarkupChar
+                     <* lookAhead (satisfy (not . isWordBoundary)) ) )
   return $ T.pack $ hd:tl
 
 -- | Any string
diff --git a/src/Text/Pandoc/Readers/Txt2Tags.hs b/src/Text/Pandoc/Readers/Txt2Tags.hs
--- a/src/Text/Pandoc/Readers/Txt2Tags.hs
+++ b/src/Text/Pandoc/Readers/Txt2Tags.hs
@@ -550,6 +550,27 @@
 specialChars :: [Char]
 specialChars = "%*-_/|:+;"
 
+-- | True for characters that terminate a run of plain text, i.e. the
+-- 'specialChars' plus newlines and spaces.  Written as a @case@ so that
+-- GHC compiles it to a jump table; this is applied to every single
+-- character of the input, so a linear scan over the list here is a
+-- significant cost.  Must be kept in sync with 'specialChars'.
+isStrEnd :: Char -> Bool
+isStrEnd c = case c of
+  '\n' -> True
+  '\r' -> True
+  ' '  -> True
+  '%'  -> True
+  '*'  -> True
+  '+'  -> True
+  '-'  -> True
+  '/'  -> True
+  ':'  -> True
+  ';'  -> True
+  '_'  -> True
+  '|'  -> True
+  _    -> False
+
 tab :: T2T Char
 tab = char '\t'
 
@@ -574,7 +595,7 @@
   return B.softbreak
 
 str :: T2T Inlines
-str = try $ B.str <$> takeWhile1P (`notElem` (specialChars ++ "\n\r "))
+str = try $ B.str <$> takeWhile1P (not . isStrEnd)
 
 whitespace :: T2T Inlines
 whitespace = try $ B.space <$ spaceChar
diff --git a/src/Text/Pandoc/Readers/Typst.hs b/src/Text/Pandoc/Readers/Typst.hs
--- a/src/Text/Pandoc/Readers/Typst.hs
+++ b/src/Text/Pandoc/Readers/Typst.hs
@@ -737,22 +737,17 @@
   let toWidth (VFraction f) = Just (floor $ 1000 * f)
       toWidth _ = Nothing
   let normalizeWidths xs =
+        -- keep column widths all-or-nothing for the writers: a
+        -- column the source leaves to the layout engine makes the
+        -- whole table content-sized
         let givenwidths = catMaybes xs
-            (totgivenwidth :: Int) = sum givenwidths
-            avgwidth = totgivenwidth `div` length givenwidths
-            totwidth = avgwidth * length xs
-         in if null givenwidths
-              then replicate (length xs) B.ColWidthDefault
-              else
+            totwidth = sum givenwidths :: Int
+         in if all isJust xs && totwidth > 0
+              then
                 map
-                  ( \case
-                      Just x ->
-                        B.ColWidth (fromIntegral x / fromIntegral totwidth)
-                      Nothing ->
-                        B.ColWidth
-                        (fromIntegral avgwidth / fromIntegral totwidth)
-                  )
-                  xs
+                  (\x -> B.ColWidth (fromIntegral x / fromIntegral totwidth))
+                  givenwidths
+              else replicate (length xs) B.ColWidthDefault
   widths <- case columns of
     VInteger x -> pure $ replicate (fromIntegral x) B.ColWidthDefault
     VArray x -> pure $ normalizeWidths $ map toWidth (V.toList x)
diff --git a/src/Text/Pandoc/Readers/Vimwiki.hs b/src/Text/Pandoc/Readers/Vimwiki.hs
--- a/src/Text/Pandoc/Readers/Vimwiki.hs
+++ b/src/Text/Pandoc/Readers/Vimwiki.hs
@@ -101,6 +101,35 @@
 spaceChars :: [Char]
 spaceChars = " \t\n"
 
+-- | True for characters that terminate a run of plain text, i.e. the
+-- 'spaceChars' plus the 'specialChars'.  Written as a @case@ so that GHC
+-- compiles it to a jump table; this is applied to every single character
+-- of the input, so a linear scan over the list here is a significant
+-- cost.  Must be kept in sync with 'spaceChars' and 'specialChars'.
+isStrEnd :: Char -> Bool
+isStrEnd c = case c of
+  '\t' -> True
+  '\n' -> True
+  ' '  -> True
+  '#'  -> True
+  '$'  -> True
+  '%'  -> True
+  '*'  -> True
+  ','  -> True
+  '-'  -> True
+  ':'  -> True
+  '='  -> True
+  '['  -> True
+  ']'  -> True
+  '^'  -> True
+  '_'  -> True
+  '`'  -> True
+  '{'  -> True
+  '|'  -> True
+  '}'  -> True
+  '~'  -> True
+  _    -> False
+
 -- main parser
 
 parseVimwiki :: PandocMonad m => VwParser m Pandoc
@@ -484,7 +513,7 @@
 inlineML = choice $ whitespace endlineML:inlineList
 
 str :: PandocMonad m => VwParser m Inlines
-str = B.str <$> takeWhile1P (`notElem` (spaceChars ++ specialChars))
+str = B.str <$> takeWhile1P (not . isStrEnd)
 
 whitespace :: PandocMonad m => VwParser m () -> VwParser m Inlines
 whitespace endline = B.space <$ (skipMany1 spaceChar <|>
diff --git a/src/Text/Pandoc/SelfContained.hs b/src/Text/Pandoc/SelfContained.hs
--- a/src/Text/Pandoc/SelfContained.hs
+++ b/src/Text/Pandoc/SelfContained.hs
@@ -25,7 +25,7 @@
 import qualified Data.Text as T
 import Data.Char (toLower)
 import Crypto.Hash (hashWith, SHA1(SHA1))
-import Network.URI (escapeURIString, isUnescapedInURI)
+import Network.URI (escapeURIString, isUnreserved)
 import System.FilePath (takeDirectory, takeExtension, (</>))
 import Text.HTML.TagSoup
 import Text.Pandoc.Class.PandocMonad (PandocMonad (..), fetchItem,
@@ -47,7 +47,7 @@
 makeDataURI :: (MimeType, ByteString) -> T.Text
 makeDataURI (mime, raw) =
   if textual
-     then "data:" <> mime' <> "," <> T.pack (escapeURIString isUnescapedInURI (toString raw))
+     then "data:" <> mime' <> "," <> T.pack (escapeURIString isUnreserved (toString raw))
      else "data:" <> mime' <> ";base64," <> toText (encode raw')
   where textual = "text/" `T.isPrefixOf` mime
         raw' = if "+xml" `T.isSuffixOf` mime
diff --git a/src/Text/Pandoc/Templates.hs b/src/Text/Pandoc/Templates.hs
--- a/src/Text/Pandoc/Templates.hs
+++ b/src/Text/Pandoc/Templates.hs
@@ -108,6 +108,7 @@
        "asciidoc_legacy" -> getDefaultTemplate "asciidoc"
        "docx"    -> getDefaultTemplate "openxml"
        "odt"     -> getDefaultTemplate "opendocument"
+       "fodt"    -> getDefaultTemplate "opendocument"
        "html"    -> getDefaultTemplate "html5"
        "docbook" -> getDefaultTemplate "docbook5"
        "epub"    -> getDefaultTemplate "epub3"
diff --git a/src/Text/Pandoc/Writers.hs b/src/Text/Pandoc/Writers.hs
--- a/src/Text/Pandoc/Writers.hs
+++ b/src/Text/Pandoc/Writers.hs
@@ -61,6 +61,7 @@
     , writeMuse
     , writeNative
     , writeODT
+    , writeFODT
     , writeOPML
     , writeOpenDocument
     , writeOrg
@@ -161,6 +162,7 @@
   ,("json"         , TextWriter writeJSON)
   ,("docx"         , ByteStringWriter writeDocx)
   ,("odt"          , ByteStringWriter writeODT)
+  ,("fodt"         , TextWriter writeFODT)
   ,("pptx"         , ByteStringWriter writePowerpoint)
   ,("epub"         , ByteStringWriter writeEPUB3)
   ,("epub2"        , ByteStringWriter writeEPUB2)
diff --git a/src/Text/Pandoc/Writers/Docx/OpenXML.hs b/src/Text/Pandoc/Writers/Docx/OpenXML.hs
--- a/src/Text/Pandoc/Writers/Docx/OpenXML.hs
+++ b/src/Text/Pandoc/Writers/Docx/OpenXML.hs
@@ -30,7 +30,7 @@
 import Data.Ord (comparing)
 import Data.String (fromString)
 import qualified Data.Map as M
-import Data.Maybe (fromMaybe, maybeToList, isJust)
+import Data.Maybe (fromMaybe, maybeToList, isJust, listToMaybe)
 import Control.Monad.State ( gets, modify, MonadTrans(lift) )
 import Control.Monad.Reader ( asks, MonadReader(local) )
 import qualified Data.Set as Set
@@ -436,6 +436,16 @@
 blockToOpenXML opts blk = withDirection $ blockToOpenXML' opts blk
 
 blockToOpenXML' :: (PandocMonad m) => WriterOptions -> Block -> WS m [Content]
+-- A section's bookmark goes in its heading's paragraph, around the
+-- heading's text, as Word writes one: it then marks the heading rather
+-- than the whole section (#11845, #8825), and the docx reader, which
+-- reads bookmarks only inside paragraphs, finds it, so a link to the
+-- heading survives a round trip.
+blockToOpenXML' opts (Div (ident,classes,kvs) (Header lev ("",hcls,hkvs) ils : bs))
+  | "section" `elem` classes
+  , not (T.null ident)
+  = blockToOpenXML' opts
+      (Div ("",classes,kvs) (Header lev (ident,hcls,hkvs) ils : bs))
 blockToOpenXML' opts (Div (ident,classes,kvs) bs) = do
   when ("math" `elem` classes) $ setFirstPara
   stylemod <- case lookup dynamicStyleKey kvs of
@@ -830,6 +840,69 @@
   props <- getTextProps
   return $ mknode "w:r" [] $ props ++ els
 
+-- | Inject a highlight into every run of a converted math element:
+-- glyph runs in a @w:rPr@ child, and a structure's non-glyph parts
+-- (bars, operator spacing) in the @m:ctrlPr@ of its property element
+-- (@m:sSupPr@ and the like), which Word pens when an equation is
+-- highlighted by hand and which the converters omit when empty.
+highlightMathRuns :: XML.Element -> XML.Element -> XML.Element
+highlightMathRuns hl = go
+ where
+  isTag pfx n e = XML.qName (XML.elName e) == n
+              && XML.qPrefix (XML.elName e) == Just pfx
+  go e
+    | isTag "m" "r" e || isTag "m" "ctrlPr" e =
+        e{ XML.elContent = insertHl (map walkContent (XML.elContent e)) }
+    | Just "m" <- XML.qPrefix (XML.elName e)
+    , XML.qName (XML.elName e) `elem` structures =
+        e{ XML.elContent =
+             ensureCtrlPr (XML.qName (XML.elName e) <> "Pr")
+                          (map walkContent (XML.elContent e)) }
+    | otherwise = e{ XML.elContent = map walkContent (XML.elContent e) }
+  walkContent (XML.Elem e) = XML.Elem (go e)
+  walkContent c            = c
+  -- OMML structures (ECMA-376 22.1.2); each takes an m:<name>Pr
+  -- property element as its first child
+  structures =
+    [ "sSup", "sSub", "sSubSup", "sPre"
+    , "f", "nary", "d", "rad", "func", "groupChr"
+    , "limLow", "limUpp", "m", "eqArr", "bar"
+    , "phant", "box", "borderBox", "acc" ]
+  pennedCtrlPr = XML.Elem (mknode "m:ctrlPr" [] (mknode "w:rPr" [] hl))
+  ensureCtrlPr prName cs = case cs of
+    (XML.Elem e : rest) | isTag "m" prName e ->
+      if any isCtrlPr (XML.elContent e)
+        then cs
+        else XML.Elem e{ XML.elContent = XML.elContent e ++ [pennedCtrlPr] } : rest
+    _ -> XML.Elem (mknode ("m:" <> prName) [] pennedCtrlPr) : cs
+  isCtrlPr (XML.Elem e) = isTag "m" "ctrlPr" e
+  isCtrlPr _            = False
+  -- merge into an existing w:rPr child if there is one, else insert a
+  -- fresh w:rPr after an optional m:rPr
+  insertHl cs =
+    case break isWrPr cs of
+      (before, XML.Elem e : rest) ->
+        before ++ XML.Elem e{ XML.elContent = insertInRPr (XML.elContent e) } : rest
+      _ ->
+        case cs of
+          (XML.Elem e : rest) | isTag "m" "rPr" e ->
+            XML.Elem e : wrPr : rest
+          _ -> wrPr : cs
+  -- w:rPr children come in a fixed order (rPrTagOrder): the
+  -- highlight goes before the first child that must follow it, and
+  -- after children not in the order
+  insertInRPr [] = [XML.Elem hl]
+  insertInRPr (c:rest)
+    | followsHl c = XML.Elem hl : c : rest
+    | otherwise = c : insertInRPr rest
+  followsHl (XML.Elem e) =
+    maybe False (> rPrTagOrder M.! "highlight") $
+      M.lookup (XML.qName (XML.elName e)) rPrTagOrder
+  followsHl _ = False
+  isWrPr (XML.Elem e) = isTag "w" "rPr" e
+  isWrPr _            = False
+  wrPr = XML.Elem (mknode "w:rPr" [] hl)
+
 -- | Convert an inline element to OpenXML.
 inlineToOpenXML :: PandocMonad m => WriterOptions -> Inline -> WS m [Content]
 inlineToOpenXML opts il = withDirection $ inlineToOpenXML' opts il
@@ -963,7 +1036,14 @@
   when (mathType == DisplayMath) setFirstPara
   res <- (lift . lift) (convertMath writeOMML mathType str)
   case res of
-       Right r -> return [Elem $ fromXLElement r]
+       Right r -> do
+         tprops <- asks envTextProperties
+         let r' = fromXLElement r
+             mbhl = listToMaybe
+               [ e | e <- otherElements tprops
+                    , XML.qName (XML.elName e) == "highlight"
+                    , XML.qPrefix (XML.elName e) == Just "w" ]
+         return [Elem (maybe r' (`highlightMathRuns` r') mbhl)]
        Left il -> inlineToOpenXML' opts il
 inlineToOpenXML' opts (Cite _ lst) = inlinesToOpenXML opts lst
 inlineToOpenXML' opts (Code attrs str) = do
diff --git a/src/Text/Pandoc/Writers/Docx/StyleMap.hs b/src/Text/Pandoc/Writers/Docx/StyleMap.hs
--- a/src/Text/Pandoc/Writers/Docx/StyleMap.hs
+++ b/src/Text/Pandoc/Writers/Docx/StyleMap.hs
@@ -16,6 +16,7 @@
 module Text.Pandoc.Writers.Docx.StyleMap ( StyleMaps(..)
                                          , ParaStyleName
                                          , CharStyleName
+                                         , TableStyleName
                                          , getStyleMaps
                                          , getStyleIdFromName
                                          , hasStyleName
@@ -30,7 +31,10 @@
 import Data.String
 import Data.Char (isSpace)
 
-data StyleMaps = StyleMaps { smCharStyle :: CharStyleNameMap, smParaStyle :: ParaStyleNameMap }
+data StyleMaps = StyleMaps { smCharStyle  :: CharStyleNameMap
+                           , smParaStyle  :: ParaStyleNameMap
+                           , smTableStyle :: TableStyleNameMap }
+type TableStyleNameMap = M.Map TableStyleName TableStyle
 type ParaStyleNameMap = M.Map ParaStyleName ParStyle
 type CharStyleNameMap = M.Map CharStyleName CharStyle
 
@@ -44,4 +48,6 @@
 hasStyleName styleName = M.member styleName
 
 getStyleMaps :: Archive -> StyleMaps
-getStyleMaps = uncurry StyleMaps . archiveToStyles' getStyleName getStyleName
+getStyleMaps arch =
+  let (s1, s2, s3) = archiveToStyles' getStyleName getStyleName getStyleName arch
+  in  StyleMaps s1 s2 s3
diff --git a/src/Text/Pandoc/Writers/Docx/Table.hs b/src/Text/Pandoc/Writers/Docx/Table.hs
--- a/src/Text/Pandoc/Writers/Docx/Table.hs
+++ b/src/Text/Pandoc/Writers/Docx/Table.hs
@@ -23,6 +23,7 @@
 import Data.Array ( elems, (!), assocs, indices )
 import Data.Text (Text)
 import Data.Maybe (catMaybes, fromMaybe)
+import Data.String
 import Text.Pandoc.Definition
     ( ColSpec,
       Caption(Caption),
@@ -42,6 +43,7 @@
       WriterEnv(..),
       setFirstPara,
       pStyleM,
+      tblStyleM,
       withParaProp,
       withParaPropM )
 import Control.Monad.Reader (asks)
@@ -110,11 +112,12 @@
   let (gridCols, tblWattr) = tableLayout (elems colspecs)
   listLevel <- asks envListLevel
   let tblStyle =  fromMaybe "Table" (lookup "custom-style" tableAttr)
+  sty' <- tblStyleM (fromString $ T.unpack tblStyle)
   let indent = (listLevel + 1) * 720
   let hasWidths = not $ all ((== ColWidthDefault) . snd) colspecs
   let tbl = mknode "w:tbl" []
         ( mknode "w:tblPr" []
-          ( [ mknode "w:tblStyle" [("w:val",tblStyle)] (),
+          ( [ sty',
               mknode "w:tblW" tblWattr () ] ++
             [ mknode "w:jc" [("w:val","left")] () | indent > 0 ] ++
             [ mknode "w:tblInd" [("w:w", tshow indent),("w:type","dxa")] ()
diff --git a/src/Text/Pandoc/Writers/Docx/Types.hs b/src/Text/Pandoc/Writers/Docx/Types.hs
--- a/src/Text/Pandoc/Writers/Docx/Types.hs
+++ b/src/Text/Pandoc/Writers/Docx/Types.hs
@@ -17,6 +17,7 @@
   , ListMarker (..)
   , listMarkerToId
   , pStyleM
+  , tblStyleM
   , isStyle
   , setFirstPara
   , withParaProp
@@ -149,7 +150,7 @@
       , stExampleId      = Nothing
       , stInsId          = 1
       , stDelId          = 1
-      , stStyleMaps      = StyleMaps M.empty M.empty
+      , stStyleMaps      = StyleMaps M.empty M.empty M.empty
       , stTokTypesMap    = M.empty
       , stFirstPara      = False
       , stFirstSectionHeader = True
@@ -200,6 +201,12 @@
 withParaPropM md p = do
   d <- md
   withParaProp d p
+
+tblStyleM :: (PandocMonad m) => TableStyleName -> WS m XML.Element
+tblStyleM styleName = do
+  tStyleMap <- gets (smTableStyle . stStyleMaps)
+  let sty' = getStyleIdFromName styleName tStyleMap
+  return $ mknode "w:tblStyle" [("w:val", fromStyleId sty')] ()
 
 isStyle :: Element -> Bool
 isStyle e = isElem [] "w" "rStyle" e ||
diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs
--- a/src/Text/Pandoc/Writers/HTML.hs
+++ b/src/Text/Pandoc/Writers/HTML.hs
@@ -479,7 +479,7 @@
                   defField "slidy-url"
                     ("https://www.w3.org/Talks/Tools/Slidy2" :: Doc Text) .
                   defField "slideous-url" ("slideous" :: Doc Text) .
-                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^5" :: Doc Text) $
+                  defField "revealjs-url" ("https://unpkg.com/reveal.js@^6" :: Doc Text) $
                   defField "s5-url" ("s5/default" :: Doc Text) .
                   defField "table-caption-below"
                      (writerTableCaptionPosition opts == CaptionBelow) .
diff --git a/src/Text/Pandoc/Writers/LaTeX.hs b/src/Text/Pandoc/Writers/LaTeX.hs
--- a/src/Text/Pandoc/Writers/LaTeX.hs
+++ b/src/Text/Pandoc/Writers/LaTeX.hs
@@ -1205,7 +1205,8 @@
                   _ -> ["keepaspectratio"]) <>
                 maybe [] (\x -> ["page=" <> literal x]) (lookup "page" kvs) <>
                 maybe [] (\x -> ["trim=" <> literal x]) (lookup "trim" kvs) <>
-                maybe [] (\x -> ["alt=" <> braces (literal x)]) mbalt <>
+                maybe [] (\x -> ["alt=" <>
+                              braces (hsep $ map literal $ T.words x)]) mbalt <>
                 maybe [] (const ["clip"]) (lookup "clip" kvs)
       options = if null optList
                    then empty
diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs
--- a/src/Text/Pandoc/Writers/Markdown.hs
+++ b/src/Text/Pandoc/Writers/Markdown.hs
@@ -50,7 +50,8 @@
 import Text.Pandoc.Writers.Markdown.Inline (inlineListToMarkdown,
                                             linkAttributes,
                                             attrsToMarkdown,
-                                            attrsToMarkua)
+                                            attrsToMarkua,
+                                            linkDestination)
 import Text.Pandoc.Writers.Markdown.Table (pipeTable, pandocTable)
 import Text.Pandoc.Writers.Markdown.Types (MarkdownVariant(..),
                                            WriterState(..),
@@ -290,7 +291,8 @@
                 then empty
                 else space <> "\"" <> literal tit <> "\""
   return $ nest 2 $ hang 2
-            ("[" <> literal label' <> "]:" <> space) (literal src <> tit')
+            ("[" <> literal label' <> "]:" <> space)
+            (literal (linkDestination src) <> tit')
             <+> linkAttributes opts attr
 
 -- | Return markdown representation of notes.
@@ -429,28 +431,39 @@
          where (id',classes',kvs') = attrs
                attrs' = (id',classes',("markdown","1"):kvs')
 blockToMarkdown' opts (Plain inlines) = do
-  -- escape if para starts with ordered list marker
+  -- escape if a line starts with a list marker.  This must be done at the
+  -- start of every line, not just the start of the block: a sublist can
+  -- interrupt a list item's text after a LineBreak, so an unescaped marker
+  -- there would be read back as a nested list, destroying the LineBreak.
   variant <- asks envVariant
   let escapeMarker = T.concatMap $ \x -> if T.any (== x) ".()"
                                          then T.pack ['\\', x]
                                          else T.singleton x
   let startsWithSpace (Space:_)     = True
       startsWithSpace (SoftBreak:_) = True
+      startsWithSpace (LineBreak:_) = True
       startsWithSpace _             = False
+  let escapeLineStart ils =
+        case ils of
+          (Str t:ys)
+            | null ys || startsWithSpace ys
+            , beginsWithOrderedListMarker t
+            -> RawInline (Format "markdown") (escapeMarker t):ys
+          (Str t:_)
+            | t == "+" || t == "-" ||
+              (t == "%" && isEnabled Ext_pandoc_title_block opts &&
+                           isEnabled Ext_all_symbols_escapable opts)
+            -> RawInline (Format "markdown") "\\" : ils
+          _ -> ils
+  -- apply escapeLineStart to the head of the list, then after each LineBreak
+  let go ils = case ils of
+                 []             -> []
+                 (LineBreak:ys) -> LineBreak : go (escapeLineStart ys)
+                 (y:ys)         -> y : go ys
   let inlines' =
         if variant == PlainText
            then inlines
-           else case inlines of
-                  (Str t:ys)
-                    | null ys || startsWithSpace ys
-                    , beginsWithOrderedListMarker t
-                    -> RawInline (Format "markdown") (escapeMarker t):ys
-                  (Str t:_)
-                    | t == "+" || t == "-" ||
-                      (t == "%" && isEnabled Ext_pandoc_title_block opts &&
-                                   isEnabled Ext_all_symbols_escapable opts)
-                    -> RawInline (Format "markdown") "\\" : inlines
-                  _ -> inlines
+           else go (escapeLineStart inlines)
   contents <- inlineListToMarkdown opts inlines'
   return $ contents <> cr
 blockToMarkdown' opts (Para inlines) =
@@ -672,7 +685,7 @@
          isEnabled Ext_pipe_tables opts -> do
            tbl <- mkTable (pipeTable opts)
            return $ (tbl $$ caption''') $$ blankline
-       | not (hasBlocks || hasColRowSpans || hasFooter) &&
+       | not (hasBlocks || hasColRowSpans || hasFooter || null rows) &&
          isEnabled Ext_multiline_tables opts -> do
            tbl <- mkTable (pandocTable opts True)
            return $ nest 2 (tbl $$ caption''') $$ blankline
diff --git a/src/Text/Pandoc/Writers/Markdown/Inline.hs b/src/Text/Pandoc/Writers/Markdown/Inline.hs
--- a/src/Text/Pandoc/Writers/Markdown/Inline.hs
+++ b/src/Text/Pandoc/Writers/Markdown/Inline.hs
@@ -14,14 +14,15 @@
   inlineListToMarkdown,
   linkAttributes,
   attrsToMarkdown,
-  attrsToMarkua
+  attrsToMarkua,
+  linkDestination
   ) where
 import Control.Monad (when, liftM2)
 import Control.Monad.Reader
     ( asks, MonadReader(local) )
 import Control.Monad.State.Strict
     ( MonadState(get), gets, modify )
-import Data.Char (isAlphaNum, isDigit)
+import Data.Char (isAlphaNum, isDigit, isSpace)
 import Data.List (find, intersperse)
 import Data.List.NonEmpty (nonEmpty)
 import qualified Data.Map as M
@@ -86,7 +87,7 @@
   go ('\\':c:cs)
     | isEnabled Ext_raw_tex opts = '\\':'\\':go (c:cs)
     | isAlphaNum c = '\\' : go (c:cs)
-    | otherwise = '\\':'\\': go cs
+    | otherwise = '\\':'\\': go (c:cs)
   go ('!':'[':cs) = '\\':'!':'[': go cs
   go ('=':'=':cs)
     | isEnabled Ext_mark opts = '\\':'=':go ('=':cs)
@@ -338,6 +339,17 @@
   toList (Concat a b) = a : toList b
   toList x = [x]
 
+-- | Render a link destination, enclosing it in angle brackets if
+-- it contains whitespace, which is not allowed in a bare destination.
+linkDestination :: Text -> Text
+linkDestination src
+  | T.any isSpace src = "<" <> T.concatMap escapeChar src <> ">"
+  | otherwise = src
+  where
+    escapeChar c
+      | c `elem` ['<', '>', '\\'] = T.pack ['\\', c]
+      | otherwise = T.singleton c
+
 -- | Convert Pandoc inline element to markdown.
 inlineToMarkdown :: PandocMonad m => WriterOptions -> Inline -> MD m (Doc Text)
 inlineToMarkdown opts (Span ("",["emoji"],kvs) [Str s]) =
@@ -700,8 +712,8 @@
             writeHtml5String opts{ writerTemplate = Nothing }
             (Pandoc nullMeta [Plain [lnk]])
       | otherwise -> return $
-         "[" <> linktext <> "](" <> literal src <> linktitle <> ")" <>
-         linkAttributes opts attr
+         "[" <> linktext <> "](" <> literal (linkDestination src) <> linktitle
+         <> ")" <> linkAttributes opts attr
 inlineToMarkdown opts img@(Image attr alternate (source, tit))
   | isEnabled Ext_raw_html opts &&
     not (isEnabled Ext_link_attributes opts || isEnabled Ext_attributes opts) &&
diff --git a/src/Text/Pandoc/Writers/ODT.hs b/src/Text/Pandoc/Writers/ODT.hs
--- a/src/Text/Pandoc/Writers/ODT.hs
+++ b/src/Text/Pandoc/Writers/ODT.hs
@@ -11,15 +11,16 @@
 
 Conversion of 'Pandoc' documents to ODT.
 -}
-module Text.Pandoc.Writers.ODT ( writeODT ) where
+module Text.Pandoc.Writers.ODT ( writeODT, writeFODT ) where
 import Codec.Archive.Zip
 import Control.Monad.Except (catchError, throwError)
 import Control.Monad.State.Strict (StateT, evalStateT, gets, modify, lift)
 import Control.Monad (MonadPlus(mplus))
+import Data.ByteString.Base64 (encode)
 import qualified Data.ByteString.Lazy as B
-import Data.Maybe (fromMaybe, listToMaybe)
+import Data.Maybe (catMaybes, fromMaybe, listToMaybe, mapMaybe, maybeToList)
 import Data.Generics (everywhere', mkT)
-import Data.List (isPrefixOf)
+import Data.List (isPrefixOf, partition)
 import qualified Data.Map as Map
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as TL
@@ -39,21 +40,28 @@
 import Text.Pandoc.Highlighting (defaultStyle)
 import Text.DocLayout
 import Text.Pandoc.Shared (stringify, stringifyInlines, tshow)
+import Text.Pandoc.Templates (compileDefaultTemplate)
 import Text.Pandoc.Version (pandocVersionText)
 import Text.Pandoc.Writers.Shared (lookupMetaString, lookupMetaBlocks,
                                    fixDisplayMath, getLang,
                                    ensureValidXmlIdentifiers)
-import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy, toTextLazy)
+import Text.Pandoc.UTF8 (fromStringLazy, fromTextLazy, toText, toTextLazy)
 import Text.Pandoc.Walk
 import Text.Pandoc.Writers.OpenDocument (writeOpenDocument)
 import Text.Pandoc.XML
 import Text.Pandoc.XML.Light
+import qualified Text.Pandoc.XML.Light as XML
 import Text.TeXMath
 import qualified Text.XML.Light as XL
 import Network.URI (parseRelativeReference, URI(uriPath), isURI)
 import Skylighting
 
-newtype ODTState = ODTState { stEntries :: [Entry]
+-- | ODF can be written either as a zip archive of several XML files or
+-- as a single flat XML file.
+data ODTVariant = Zipped | Flat deriving (Eq, Show)
+
+data ODTState = ODTState { stEntries :: [Entry]
+                         , stVariant :: ODTVariant
                          }
 
 type O m = StateT ODTState m
@@ -65,14 +73,16 @@
          -> m B.ByteString
 writeODT  opts doc =
   let initState = ODTState{ stEntries = []
+                          , stVariant = Zipped
                           }
       doc' = fixInternalLinks . ensureValidXmlIdentifiers $ doc
   in
-    evalStateT (pandocToODT opts doc') initState
+    fromArchive <$> evalStateT (pandocToODT opts doc') initState
 
 -- | ODT internal links are evaluated relative to an imaginary folder
 -- structure that mirrors the zip structure.  The result is that relative
 -- links in the document need to start with `..`.  See #3524.
+-- This does not apply to flat ODF, which is a single file.
 fixInternalLinks :: Pandoc -> Pandoc
 fixInternalLinks = walk go
  where
@@ -85,11 +95,209 @@
         | not (null (uriPath u)) -> tshow $ u{ uriPath = "../" <> uriPath u }
       _ -> uri
 
--- | Produce an ODT file from a Pandoc document.
+-- | Produce a flat OpenDocument text file (@.fodt@) from a Pandoc
+-- document.  This is the same content as an ODT, but as a single XML
+-- file instead of a zip archive.
+writeFODT :: PandocMonad m
+          => WriterOptions  -- ^ Writer options
+          -> Pandoc         -- ^ Document to convert
+          -> m T.Text
+writeFODT opts doc = do
+  let initState = ODTState{ stEntries = []
+                          , stVariant = Flat
+                          }
+      -- note: no fixInternalLinks, since a flat file has no zip
+      -- structure for relative references to be resolved against
+      doc' = ensureValidXmlIdentifiers doc
+  evalStateT (pandocToODT opts doc') initState >>= flattenODT
+
+officeNS :: T.Text
+officeNS = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+
+officeQName :: T.Text -> QName
+officeQName n = QName n (Just officeNS) (Just "office")
+
+-- | The top-level child of an ODF part, e.g. @office:body@ of
+-- @content.xml@.  Only the local name is matched if the document gives
+-- no namespace URI.
+officeChild :: T.Text -> Element -> Maybe Element
+officeChild name el = listToMaybe
+  [ e | Elem e <- elContent el
+      , qName (elName e) == name
+      , maybe True (== officeNS) (qURI (elName e)) ]
+
+-- | Convert an ODT archive into the equivalent flat OpenDocument file.
+--
+-- A flat ODF file is a single @office:document@ element whose children
+-- are exactly the top-level elements that are otherwise distributed over
+-- @content.xml@, @styles.xml@, @meta.xml@ and @settings.xml@, in this
+-- order:
+--
+-- > office:meta? office:settings? office:scripts? office:font-face-decls?
+-- > office:styles? office:automatic-styles? office:master-styles? office:body
+--
+-- Anything that would be a separate archive entry -- images and
+-- formulas -- is embedded inline instead.
+flattenODT :: forall m . PandocMonad m => Archive -> m T.Text
+flattenODT archive = do
+  contentRoot <- getRoot "content.xml"
+  stylesRoot  <- getRoot "styles.xml"
+  metaRoot    <- getRoot "meta.xml"
+  -- the bundled reference.odt has no settings.xml, but a reference doc
+  -- written by LibreOffice does
+  settingsRoot <- traverse parseEntry (findEntryByPath "settings.xml" archive)
+  let roots = [contentRoot, stylesRoot, metaRoot] ++ maybeToList settingsRoot
+  -- only one of each of these is allowed in a document, so the ones
+  -- from content.xml and styles.xml must be combined
+  let (fontFaceDecls, _) = mergeParts (officeChild "font-face-decls" contentRoot)
+                                      (officeChild "font-face-decls" stylesRoot)
+  let (automaticStyles, dropped) =
+        mergeParts (officeChild "automatic-styles" contentRoot)
+                   (officeChild "automatic-styles" stylesRoot)
+  mapM_ (\e -> report $ UnusualConversion $
+                 "flat OpenDocument output: dropping the automatic style "
+                 <> snd (partKey e) <> " from styles.xml, because content.xml "
+                 <> "defines a style of the same name")
+        dropped
+  let children = catMaybes
+        [ officeChild "meta" metaRoot
+        , settingsRoot >>= officeChild "settings"
+        , listToMaybe $ mapMaybe (officeChild "scripts") roots
+        , fontFaceDecls
+        , officeChild "styles" stylesRoot
+        , automaticStyles
+        , officeChild "master-styles" stylesRoot
+        , officeChild "body" contentRoot
+        ]
+  let root = Element (officeQName "document")
+               ( Attr (officeQName "mimetype")
+                      "application/vnd.oasis.opendocument.text"
+               : Attr (officeQName "version") "1.3"
+               : nsDecls roots )
+               (map (Elem . embedArchiveRefs archive) children)
+               Nothing
+  -- note: not prettyConfigPP, which would inject whitespace into text
+  -- content and thereby change the document
+  return $ showTopElement root
+ where
+  parseEntry :: Entry -> m Element
+  parseEntry e =
+    case parseXMLElement (toTextLazy (fromEntry e)) of
+      Left msg -> throwError $ PandocXMLError (T.pack (eRelativePath e)) msg
+      Right el -> return el
+  getRoot :: FilePath -> m Element
+  getRoot path =
+    case findEntryByPath path archive of
+      Nothing -> throwError $ PandocSomeError $
+                   "Could not find " <> T.pack path <> " in the ODT archive"
+      Just e  -> parseEntry e
+
+-- | The union of the namespace declarations on the given elements.
+-- Declarations survive parsing as ordinary attributes with the prefix
+-- @xmlns@, and are not synthesised on output, so they must be carried
+-- over to the flat file's root by hand.  Declarations on nested elements
+-- are copied along with those elements.
+nsDecls :: [Element] -> [XML.Attr]
+nsDecls els = Map.elems $ Map.fromListWith (\_new old -> old)
+  [ ((qPrefix (attrKey a), qName (attrKey a)), a)
+  | el <- els
+  , a <- elAttribs el
+  , isNSDecl (attrKey a) ]
+ where
+  isNSDecl qn = qPrefix qn == Just "xmlns"
+                || (qPrefix qn == Nothing && qName qn == "xmlns")
+
+-- | Combine two @office:font-face-decls@ or @office:automatic-styles@
+-- elements, preferring the first.  Returns the merged element and the
+-- declarations of the second that were dropped as duplicates.
+mergeParts :: Maybe Element -> Maybe Element -> (Maybe Element, [Element])
+mergeParts Nothing  mbSecond = (mbSecond, [])
+mergeParts mbFirst  Nothing  = (mbFirst, [])
+mergeParts (Just first) (Just second) =
+  (Just first{ elContent = elContent first ++ map Elem kept }, dropped)
+ where
+  keys = map partKey [ e | Elem e <- elContent first ]
+  (dropped, kept) = partition ((`elem` keys) . partKey)
+                              [ e | Elem e <- elContent second ]
+
+-- | Identify a font face or automatic style by its element name and
+-- @style:name@.
+partKey :: Element -> (T.Text, T.Text)
+partKey e = (qName (elName e), partStyleName e)
+
+partStyleName :: Element -> T.Text
+partStyleName e = T.concat [ attrVal a
+                           | a <- elAttribs e
+                           , qName (attrKey a) == "name"
+                           , qPrefix (attrKey a) == Just "style" ]
+
+-- | Replace references to other entries of the ODT archive by the
+-- entries' contents, which is the only way a flat file can carry them:
+-- images become base64 in an @office:binary-data@ child, formulas
+-- become MathML inside the @draw:object@.
+--
+-- Note that this is applied to every copied part, not just the body, so
+-- that images used by a reference document's headers, footers and master
+-- styles are embedded too.  References that do not resolve to an archive
+-- entry are left alone; in particular, this is what makes
+-- @--link-images@ work, since it writes no @Pictures/@ entry.
+embedArchiveRefs :: Archive -> Element -> Element
+embedArchiveRefs archive = go
+ where
+  go el =
+    case qName (elName el) of
+      "image"
+        | Just entry <- flip findEntryByPath archive . T.unpack =<< xlinkHref el
+        -> embedImage entry el
+      "object"
+        | Just path <- formulaPath =<< xlinkHref el
+        , Just entry <- findEntryByPath path archive
+        , Right mathml <- parseXMLElement (toTextLazy (fromEntry entry))
+        -> (dropXlinkAttrs el){ elContent = [Elem mathml] }
+      _ -> el{ elContent = map goContent (elContent el) }
+  goContent (Elem e) = Elem (go e)
+  goContent c = c
+
+  embedImage entry el =
+    case dropXlinkAttrs el of
+      el' -> el'{ elAttribs = mimeAttrs ++ elAttribs el'
+                , elContent = elContent el' ++ [Elem binaryData] }
+   where
+    mimeAttrs = [ Attr (QName "mime-type" Nothing (Just "draw")) m
+                | Just m <- [getMimeType (eRelativePath entry)] ]
+    binaryData = Element (officeQName "binary-data") []
+                   [XML.Text (CData CDataText (base64 (fromEntry entry)) Nothing)]
+                   Nothing
+
+  base64 = T.intercalate "\n" . T.chunksOf 76 . toText . encode . B.toStrict
+
+  -- the formula's MathML lives in content.xml of the directory the
+  -- reference names
+  formulaPath href =
+    case fromMaybe href (T.stripPrefix "./" href) of
+      "" -> Nothing
+      h  -> Just $ T.unpack $
+              (if "/" `T.isSuffixOf` h then h else h <> "/") <> "content.xml"
+
+xlinkHref :: Element -> Maybe T.Text
+xlinkHref el = listToMaybe [ attrVal a
+                           | a <- elAttribs el
+                           , qName (attrKey a) == "href"
+                           , qPrefix (attrKey a) == Just "xlink" ]
+
+-- | Drop the attributes with which the ODT writer refers to an archive
+-- entry; the content is about to be embedded instead.
+dropXlinkAttrs :: Element -> Element
+dropXlinkAttrs el = el{ elAttribs = filter (not . isRef . attrKey) (elAttribs el) }
+ where
+  isRef qn = qPrefix qn == Just "xlink"
+             && qName qn `elem` ["href", "type", "show", "actuate"]
+
+-- | Produce an ODT archive from a Pandoc document.
 pandocToODT :: PandocMonad m
             => WriterOptions  -- ^ Writer options
             -> Pandoc         -- ^ Document to convert
-            -> O m B.ByteString
+            -> O m Archive
 pandocToODT opts doc@(Pandoc meta _) = do
   let title = docTitle meta
   let authors = docAuthors meta
@@ -105,7 +313,10 @@
   -- picEntriesRef <- P.newIORef ([] :: [Entry])
   let refTextWidth = referenceTextWidthPt opts refArchive
   doc' <- walkM (transformPicMath opts refTextWidth) $ walk fixDisplayMath doc
-  newContents <- lift $ writeOpenDocument opts{writerWrapText = WrapNone} doc'
+  tpl <- maybe (lift $ compileDefaultTemplate "opendocument") pure
+           (writerTemplate opts)
+  newContents <- lift $ writeOpenDocument
+                   opts{ writerWrapText = WrapNone, writerTemplate = Just tpl } doc'
   epochtime <- floor `fmap` lift P.getPOSIXTime
   let contentEntry = toEntry "content.xml" epochtime
                      $ fromTextLazy $ TL.fromStrict newContents
@@ -195,7 +406,7 @@
   archive'' <- updateStyle opts lang
                   $ addEntryToArchive mimetypeEntry
                   $ addEntryToArchive metaEntry archive'
-  return $ fromArchive archive''
+  return archive''
 
 updateStyle :: forall m . PandocMonad m
             => WriterOptions -> Maybe Lang -> Archive -> O m Archive
@@ -367,7 +578,13 @@
                     case T.unpack src of
                       s | isURI s -> return src
                         | isAbsolute s -> return src
-                        | otherwise -> return $ T.pack $ ".." </> s
+                        | otherwise -> do
+                            -- see fixInternalLinks: relative references
+                            -- are resolved against the zip structure
+                            variant <- gets stVariant
+                            case variant of
+                              Zipped -> return $ T.pack $ ".." </> s
+                              Flat   -> return $ T.pack s
                   else do
                     entries <- gets stEntries
                     let extension = maybe (takeExtension $ takeWhile (/='?') $ T.unpack src) T.unpack
diff --git a/src/Text/Pandoc/Writers/OpenDocument.hs b/src/Text/Pandoc/Writers/OpenDocument.hs
--- a/src/Text/Pandoc/Writers/OpenDocument.hs
+++ b/src/Text/Pandoc/Writers/OpenDocument.hs
@@ -14,11 +14,9 @@
 Conversion of 'Pandoc' documents to OpenDocument XML.
 -}
 module Text.Pandoc.Writers.OpenDocument ( writeOpenDocument ) where
-import Control.Arrow ((***), (>>>))
-import Control.Monad (unless, liftM)
+import Control.Monad (unless, liftM, when)
 import Control.Monad.State.Strict ( StateT(..), modify, gets, lift )
 import Data.Char (chr, isDigit)
-import Data.Foldable (find)
 import Data.List (sortOn, sortBy)
 import qualified Data.List as L
 import qualified Data.Map as Map
@@ -89,63 +87,65 @@
   deriving (Show, Eq, Ord)
 
 data WriterState =
-    WriterState { stNotes          :: [Doc Text]
+    WriterState { stNoteCount      :: Int
                 , stTableStyles    :: [Doc Text]
+                , stTableStyleCount :: Int
                 , stParaStyles     :: [Doc Text]
+                , stParaStyleCount :: Int
+                , stParaStyleCache :: Map.Map ([(Text,Text)],[(Text,Text)]) Text
+                  -- ^ cache of automatic paragraph styles, keyed on
+                  -- (style attributes, paragraph properties)
                 , stListOverrides  :: Map.Map (ListNumberStyle,ListNumberDelim)
                                         (Text, Doc Text)
                 , stTextStyles     :: Map.Map (Set.Set TextStyle)
-                                        (Text, Doc Text)
+                                        (Int, Doc Text)
+                  -- ^ automatic text styles, with the number that
+                  -- makes up the style's @Tn@ name
                 , stTextStyleAttr  :: Set.Set TextStyle
                 , stIndentPara     :: Int
                 , stInDefinition   :: Bool
-                , stTight          :: Bool
                 , stFirstPara      :: Bool
                 , stImageId        :: Int
                 , stTableCaptionId :: Int
                 , stImageCaptionId :: Int
-                , stIdentTypes     :: [(Text,ReferenceType)]
+                , stIdentTypes     :: Map.Map Text ReferenceType
                 , stDirection      :: Maybe Direction
                   -- ^ active writing mode
-                , stDirStyles      :: Map.Map (Text, Direction) Text
-                  -- ^ cache of direction-adjusted paragraph styles,
-                  -- keyed on (parent style, writing mode)
                 }
 
 defaultWriterState :: WriterState
 defaultWriterState =
-    WriterState { stNotes          = []
+    WriterState { stNoteCount      = 0
                 , stTableStyles    = []
+                , stTableStyleCount = 0
                 , stParaStyles     = []
+                , stParaStyleCount = 0
+                , stParaStyleCache = Map.empty
                 , stListOverrides  = Map.empty
                 , stTextStyles     = Map.empty
                 , stTextStyleAttr  = Set.empty
                 , stIndentPara     = 0
                 , stInDefinition   = False
-                , stTight          = False
                 , stFirstPara      = False
                 , stImageId        = 1
                 , stTableCaptionId = 1
                 , stImageCaptionId = 1
-                , stIdentTypes     = []
+                , stIdentTypes     = Map.empty
                 , stDirection      = Nothing
-                , stDirStyles      = Map.empty
                 }
 
-when :: Bool -> Doc Text -> Doc Text
-when p a = if p then a else empty
-
 addTableStyle :: PandocMonad m => Doc Text -> OD m ()
-addTableStyle i = modify $ \s -> s { stTableStyles = i : stTableStyles s }
-
-addNote :: PandocMonad m => Doc Text -> OD m ()
-addNote i = modify $ \s -> s { stNotes = i : stNotes s }
+addTableStyle i = modify $ \s ->
+  s { stTableStyles = i : stTableStyles s
+    , stTableStyleCount = stTableStyleCount s + 1 }
 
 addParaStyle :: PandocMonad m => Doc Text -> OD m ()
-addParaStyle i = modify $ \s -> s { stParaStyles = i : stParaStyles s }
+addParaStyle i = modify $ \s ->
+  s { stParaStyles = i : stParaStyles s
+    , stParaStyleCount = stParaStyleCount s + 1 }
 
 addTextStyle :: PandocMonad m
-             => Set.Set TextStyle -> (Text, Doc Text) -> OD m ()
+             => Set.Set TextStyle -> (Int, Doc Text) -> OD m ()
 addTextStyle attrs i = modify $ \s ->
   s { stTextStyles = Map.insert attrs i (stTextStyles s) }
 
@@ -216,11 +216,13 @@
        Nothing -> do
          styles <- gets stTextStyles
          case Map.lookup at styles of
-              Just (styleName, _) -> return $
-                inTags False "text:span" [("text:style-name",styleName)] d
+              Just (num, _) -> return $
+                inTags False "text:span"
+                  [("text:style-name", textStyleName num)] d
               Nothing -> do
-                let styleName = "T" <> tshow (Map.size styles + 1)
-                addTextStyle at (styleName,
+                let num = Map.size styles + 1
+                    styleName = textStyleName num
+                addTextStyle at (num,
                        inTags False "style:style"
                          [("style:name", styleName)
                          ,("style:family", "text")]
@@ -230,6 +232,10 @@
                 return $ inTags False
                     "text:span" [("text:style-name",styleName)] d
 
+-- | Name of the @n@th automatic text style.
+textStyleName :: Int -> Text
+textStyleName num = "T" <> tshow num
+
 formulaStyles :: [Doc Text]
 formulaStyles = [formulaStyle InlineMath, formulaStyle DisplayMath]
 
@@ -274,16 +280,23 @@
 handleSpaces :: Text -> Doc Text
 handleSpaces s = case T.uncons s of
   Just (' ', _) -> genTag s
-  Just ('\t',x) -> selfClosingTag "text:tab" [] <> rm x
+  Just ('\t',x) -> tabTag <> rm x
   _             -> rm s
   where
-    genTag = T.span (==' ') >>> tag . T.length *** rm >>> uncurry (<>)
-    tag n  = when (n /= 0) $ selfClosingTag "text:s" [("text:c", tshow n)]
-    rm t   = case T.uncons t of
-      Just ( ' ',xs) -> char ' ' <> genTag xs
-      Just ('\t',xs) -> selfClosingTag "text:tab" [] <> genTag xs
-      Just (   x,xs) -> char x <> rm xs
-      Nothing        -> empty
+    tabTag = selfClosingTag "text:tab" []
+    -- collapse a run of spaces into a single <text:s>
+    genTag t = let (spaces, t') = T.span (== ' ') t
+               in  tag (T.length spaces) <> rm t'
+    tag 0  = empty
+    tag n  = selfClosingTag "text:s" [("text:c", tshow n)]
+    -- emit text verbatim up to the next space or tab; a lone space is
+    -- kept literal and any further ones become a <text:s>
+    rm t = let (chunk, t') = T.break (\c -> c == ' ' || c == '\t') t
+               pre = if T.null chunk then empty else literal chunk
+           in  case T.uncons t' of
+                 Just (' ', xs) -> pre <> char ' ' <> genTag xs
+                 Just (_  , xs) -> pre <> tabTag <> genTag xs
+                 Nothing        -> pre
 
 -- | Convert Pandoc document to string in OpenDocument format.
 writeOpenDocument :: PandocMonad m => WriterOptions -> Pandoc -> m Text
@@ -292,12 +305,13 @@
   let colwidth = if writerWrapText opts == WrapAuto
                     then Just $ writerColumns opts
                     else Nothing
-  let meta' = case lookupMetaBlocks "abstract" meta of
-                [] -> meta
-                xs -> B.setMeta "abstract"
-                        (B.divWith ("",[],[("custom-style","Abstract")])
-                          (B.fromList xs))
-                        meta
+  -- The abstract is the one template field that takes block-level
+  -- content, so it is rendered separately; everything else in the
+  -- metadata goes in a context where only inlines are allowed.
+  let abstractBlocks = case lookupMetaBlocks "abstract" meta of
+                         [] -> []
+                         xs -> [Div ("",[],[("custom-style","Abstract")]) xs]
+  let meta' = B.deleteMeta "abstract" meta
   -- Set the default writing direction from the "dir" metadata field;
   -- in its absence, a right-to-left main language implies RTL.
   let mbDir = case lookupMetaString "dir" meta of
@@ -307,19 +321,30 @@
                            Just l | Right lang <- parseLang l
                                   , isRTLLang lang -> Just RTL
                            _ -> Nothing
-  ((body, metadata),s) <- flip runStateT
+  ((body, abstract, metadata),s) <- flip runStateT
         defaultWriterState{ stDirection = mbDir } $ do
-           let collectBlockIdent (Header _ (ident,_,_) _)      = [(ident,HeaderRef)]
-               collectBlockIdent (Figure (ident,_,_) _ _ )     = [(ident,FigureRef)]
-               collectBlockIdent (Table (ident,_,_) _ _ _ _ _) = [(ident,TableRef)]
-               collectBlockIdent _                             = []
-           modify $ \s -> s{ stIdentTypes = query collectBlockIdent blocks }
+           let collectBlockIdent (Header _ attr _)      = identRef HeaderRef attr
+               collectBlockIdent (Figure attr _ _ )     = identRef FigureRef attr
+               collectBlockIdent (Table attr _ _ _ _ _) = identRef TableRef attr
+               collectBlockIdent _                      = []
+               identRef ty (ident,_,_)
+                 | T.null ident = []
+                 | otherwise    = [(ident, ty)]
+           -- only needed to resolve cross references
+           when (isEnabled Ext_xrefs_name opts ||
+                 isEnabled Ext_xrefs_number opts) $
+             modify $ \s -> s{ stIdentTypes =
+                                 Map.fromListWith (\_ old -> old)
+                                   (query collectBlockIdent blocks) }
            m <- metaToContext opts
                   (inlinesToOpenDocument opts . blocksToInlines)
                   (fmap chomp . inlinesToOpenDocument opts)
                   meta'
+           a <- blocksToOpenDocument opts abstractBlocks
            b <- blocksToOpenDocument opts blocks
-           return (b, m)
+           return (b, a, m)
+  -- 'styles' is reversed below, so the text styles are put in
+  -- descending order here to come out as T1, T2, ..., T10
   let styles   = stTableStyles s ++ stParaStyles s ++ formulaStyles ++
                      map snd (sortBy (comparing (Down . fst)) (
                         Map.elems (stTextStyles s)))
@@ -329,6 +354,9 @@
               . defField "toc" (writerTableOfContents opts)
               . defField "toc-depth" (tshow $ writerTOCDepth opts)
               . defField "automatic-styles" automaticStyles
+              . (if null abstractBlocks
+                    then id
+                    else defField "abstract" abstract)
               $ metadata
   return $ render colwidth $
     case writerTemplate opts of
@@ -339,12 +367,15 @@
                    => WriterOptions -> Text -> [Block] -> OD m (Doc Text)
 withParagraphStyle o s bs = do
   s' <- dirStyleFor s
+  -- 'Plain' is treated like 'Para' so that the requested style is not
+  -- lost (e.g. for metadata fields, figure bodies, or tight list items)
   let go (b:bs')
-        | Para l <- b = cont bs' =<<
-            inParagraphTagsWithStyle s' <$> inlinesToOpenDocument o l
-        | otherwise   = cont bs' =<< blockToOpenDocument o b
+        | Para  l <- b = cont bs' =<< styled l
+        | Plain l <- b = cont bs' =<< styled l
+        | otherwise    = cont bs' =<< blockToOpenDocument o b
       go [] = return empty
       cont bs' i = (<>) i <$> go bs'
+      styled l = inParagraphTagsWithStyle s' <$> inlinesToOpenDocument o l
   go bs
 
 inPreformattedTags :: [Doc Text] -> Doc Text
@@ -517,7 +548,7 @@
     HorizontalRule   -> setFirstPara >> return (selfClosingTag "text:p"
                          [ ("text:style-name", "Horizontal_20_Line") ])
     b@(RawBlock f s) -> if f == Format "opendocument"
-                        then return $ text $ T.unpack s
+                        then return $ literal s
                         else empty <$ report (BlockNotRendered b)
     Figure a capt b  -> figure o a capt b
     where
@@ -550,9 +581,9 @@
       table :: PandocMonad m => WriterOptions -> Ann.Table -> OD m (Doc Text)
       table opts
           (Ann.Table (ident, _, _) (Caption _ c) colspecs thead tbodies tfoot) = do
-        tn <- length <$> gets stTableStyles
-        pn <- length <$> gets stParaStyles
-        let  genIds      = map chr [65..]
+        tn <- gets stTableStyleCount
+        pn <- gets stParaStyleCount
+        let  genIds      = map colLetters [0..]
              name        = "Table" <> tshow (tn + 1)
              (aligns, mwidths) = unzip colspecs
              fromWidth (ColWidth w) | w > 0 = w
@@ -560,7 +591,7 @@
              widths = map fromWidth mwidths
              textWidth   = sum widths
              columnIds   = zip genIds widths
-             mkColumn  n = selfClosingTag "table:table-column" [("table:style-name", name <> "." <> T.singleton (fst n))]
+             mkColumn  n = selfClosingTag "table:table-column" [("table:style-name", name <> "." <> fst n)]
              columns     = map mkColumn columnIds
              paraHStyles = paraTableStyles "Heading"  pn aligns
              paraStyles  = paraTableStyles "Contents" (pn + length (newPara paraHStyles)) aligns
@@ -589,8 +620,7 @@
           [] ->
             withParagraphStyle o "Figure" body
           caption -> do
-            imageDoc <- withParagraphStyle o "FigureWithCaption" $
-                        map (\case {Plain i -> Para i; b -> b}) body
+            imageDoc <- withParagraphStyle o "FigureWithCaption" body
             captionDoc <- inlinesToOpenDocument o caption >>=
                           if isEnabled Ext_native_numbering o
                           then numberedFigureCaption ident
@@ -619,7 +649,7 @@
 
 numberedCaption :: Text -> Text -> Text -> Int -> Text -> Doc Text -> Doc Text
 numberedCaption style term name num ident caption =
-    let t = text $ T.unpack term
+    let t = literal term
         r = num - 1
         ident' = case ident of
           "" -> "ref" <> name <> tshow r
@@ -776,7 +806,7 @@
                          inlinesToOpenDocument o
     Cite      _ l -> inlinesToOpenDocument o l
     RawInline f s -> if f == Format "opendocument"
-                       then return $ text $ T.unpack s
+                       then return $ literal s
                        else do
                          report $ InlineNotRendered ils
                          return empty
@@ -825,16 +855,17 @@
           then i
           else fmap mkBookmarkedSpan i
       mkNote     l = do
-        n <- length <$> gets stNotes
+        n <- gets stNoteCount
+        -- bump the counter before rendering the body, so that a note
+        -- nested inside this one does not reuse the same text:id
+        modify $ \st -> st{ stNoteCount = n + 1 }
         let footNote t = inTags False "text:note"
                          [ ("text:id"        , "ftn" <> tshow n)
                          , ("text:note-class", "footnote"     )] $
                          inTagsSimple "text:note-citation" (text . show $ n + 1) <>
                          inTagsSimple "text:note-body" t
-        nn <- footNote <$> withAlteredTextStyles (const mempty)
-                            (withParagraphStyle o "Footnote" l)
-        addNote nn
-        return nn
+        footNote <$> withAlteredTextStyles (const mempty)
+                       (withParagraphStyle o "Footnote" l)
 
 formatOpenDocument :: FormatOptions -> [SourceLine] -> [[Doc Text]]
 formatOpenDocument _fmtOpts = map (map toHlTok)
@@ -845,12 +876,10 @@
 preformatted :: Text -> Doc Text
 preformatted s = handleSpaces $ escapeStringForXML s
 
-mkLink :: WriterOptions -> [(Text,ReferenceType)] -> Text -> Text -> Doc Text -> Doc Text
+mkLink :: WriterOptions -> Map.Map Text ReferenceType -> Text -> Text
+       -> Doc Text -> Doc Text
 mkLink o identTypes s t d =
-  let maybeIdentAndType = case T.uncons s of
-                            Just ('#', ident) -> find ((ident ==) . fst) identTypes
-                            _                 -> Nothing
-      d' = inSpanTags "Definition" d
+  let d' = inSpanTags "Definition" d
       ref refType format ident       = inTags False refType
                                        [ ("text:reference-format", format ),
                                          ("text:ref-name", ident) ]
@@ -875,16 +904,27 @@
                                           , ("xlink:href" , s       )
                                           , ("office:name", t       )
                                           ] d'
-      linkOrReference = case maybeIdentAndType of
-                          Just (ident, HeaderRef) -> bookmarkRef' ident
-                          Just (ident, TableRef)  -> sequenceRef' ident
-                          Just (ident, FigureRef) -> sequenceRef' ident
-                          _                       -> link
+      linkOrReference = case T.uncons s of
+                          Just ('#', ident) ->
+                            case Map.lookup ident identTypes of
+                              Just HeaderRef -> bookmarkRef' ident
+                              Just TableRef  -> sequenceRef' ident
+                              Just FigureRef -> sequenceRef' ident
+                              Nothing        -> link
+                          _ -> link
       in if isEnabled Ext_xrefs_name o || isEnabled Ext_xrefs_number o
             then linkOrReference
             else link
 
-tableStyle :: Int -> Double -> [(Char,Double)] -> Doc Text
+-- | Spreadsheet-style column names (@A@, @B@, ..., @Z@, @AA@, @AB@, ...).
+-- Plain @chr@ arithmetic would run past @Z@ into characters like @[@
+-- and @\\@, which are not legal in a @style:name@.
+colLetters :: Int -> Text
+colLetters n
+  | n < 26    = T.singleton (chr (65 + n))
+  | otherwise = colLetters (n `div` 26 - 1) <> T.singleton (chr (65 + n `mod` 26))
+
+tableStyle :: Int -> Double -> [(Text,Double)] -> Doc Text
 tableStyle num textWidth wcs =
     let tableId        = "Table" <> tshow (num + 1)
         tableWidthAttr :: [(Text,Text)]
@@ -898,10 +938,10 @@
                          selfClosingTag "style:table-properties"
                          (("table:align", "center") : tableWidthAttr)
         colStyle (c,0) = selfClosingTag "style:style"
-                         [ ("style:name"  , tableId <> "." <> T.singleton c)
+                         [ ("style:name"  , tableId <> "." <> c)
                          , ("style:family", "table-column"       )]
         colStyle (c,w) = inTags True "style:style"
-                         [ ("style:name"  , tableId <> "." <> T.singleton c)
+                         [ ("style:name"  , tableId <> "." <> c)
                          , ("style:family", "table-column"       )] $
                          selfClosingTag "style:table-column-properties"
                          [("style:rel-column-width", T.pack $ printf "%d*" (floor $ w * 65535 :: Integer))]
@@ -930,32 +970,18 @@
 paraStyle attrs = do
   i  <- (*) (0.5 :: Double) . fromIntegral <$> gets stIndentPara
   b  <- gets stInDefinition
-  t  <- gets stTight
   dirAttrs <- getDirAttrs
   let indentVal = flip (<>) "in" . tshow $ if b then max 0.5 i else i
-      tight     = if t then [ ("fo:margin-top"          , "0in"    )
-                            , ("fo:margin-bottom"       , "0in"    )]
-                       else []
       indent    = if i /= 0 || b
                       then [ ("fo:margin-left"         , indentVal)
                            , ("fo:margin-right"        , "0in"    )
                            , ("fo:text-indent"         , "0in"    )
                            , ("style:auto-text-indent" , "false"  )]
                       else []
-      attributes = indent <> tight <> dirAttrs
+      attributes = indent <> dirAttrs
   case (attributes, attrs) of
     ([], [("style:parent-style-name", parent)]) -> return parent
-    _ -> do
-      pn <- (+) 1 . length <$> gets stParaStyles
-      let name      = "P" <> tshow pn
-          styleAttr = [ ("style:name"  , name)
-                      , ("style:family", "paragraph") ]
-          paraProps = if null attributes
-                         then mempty
-                         else selfClosingTag
-                                 "style:paragraph-properties" attributes
-      addParaStyle $ inTags True "style:style" (styleAttr <> attrs) paraProps
-      return name
+    _ -> mkParaStyle attrs attributes
 
 paraStyleFromParent :: PandocMonad m => Text -> [(Text,Text)] -> OD m Text
 paraStyleFromParent parent attrs = do
@@ -963,14 +989,29 @@
   let attrs' = attrs <> dirAttrs
   if null attrs'
      then return parent
-     else do
-      pn <- (+) 1 . length <$> gets stParaStyles
-      let name      = "P" <> tshow pn
-          styleAttr = [ ("style:name"             , name)
-                      , ("style:family"           , "paragraph")
-                      , ("style:parent-style-name", parent)]
-          paraProps = selfClosingTag "style:paragraph-properties" attrs'
+     else mkParaStyle [("style:parent-style-name", parent)] attrs'
+
+-- | Create an automatic paragraph style with the given @style:style@
+-- attributes and @style:paragraph-properties@, reusing an identical
+-- style if one has already been created.
+mkParaStyle :: PandocMonad m => [(Text,Text)] -> [(Text,Text)] -> OD m Text
+mkParaStyle attrs props = do
+  cache <- gets stParaStyleCache
+  case Map.lookup (attrs, props) cache of
+    Just name -> return name
+    Nothing -> do
+      name <- ("P" <>) . tshow . (+ 1) <$> gets stParaStyleCount
+      let styleAttr = ("style:name"  , name)
+                    : ("style:family", "paragraph")
+                    : attrs
+          paraProps = if null props
+                         then mempty
+                         else selfClosingTag
+                                 "style:paragraph-properties" props
       addParaStyle $ inTags True "style:style" styleAttr paraProps
+      modify $ \st -> st{ stParaStyleCache =
+                            Map.insert (attrs, props) name
+                                       (stParaStyleCache st) }
       return name
 
 getDirAttrs :: PandocMonad m => OD m [(Text, Text)]
@@ -986,26 +1027,14 @@
 
 -- | Adjust a named paragraph style for the current writing direction.
 -- When a direction is active, an automatic style derived from the
--- given style with the appropriate @style:writing-mode@ is created
--- (and cached).  Automatic style names (@P1@, @P2@, ...) pass through
--- unchanged, since automatic styles are always created with the
--- current direction included.
+-- given style with the appropriate @style:writing-mode@ is created.
+-- With no direction active the name passes through unchanged, as do
+-- automatic style names (@P1@, @P2@, ...), since automatic styles are
+-- always created with the current direction included.
 dirStyleFor :: PandocMonad m => Text -> OD m Text
-dirStyleFor parent = do
-  mbDir <- gets stDirection
-  case mbDir of
-    Nothing -> return parent
-    Just d
-      | isAutoStyleName parent -> return parent
-      | otherwise -> do
-          cache <- gets stDirStyles
-          case Map.lookup (parent, d) cache of
-            Just name -> return name
-            Nothing -> do
-              name <- paraStyleFromParent parent []
-              modify $ \st -> st{ stDirStyles =
-                     Map.insert (parent, d) name (stDirStyles st) }
-              return name
+dirStyleFor parent
+  | isAutoStyleName parent = return parent
+  | otherwise              = paraStyleFromParent parent []
   where
     isAutoStyleName t = case T.uncons t of
       Just ('P', ds) -> not (T.null ds) && T.all isDigit ds
diff --git a/src/Text/Pandoc/Writers/Typst.hs b/src/Text/Pandoc/Writers/Typst.hs
--- a/src/Text/Pandoc/Writers/Typst.hs
+++ b/src/Text/Pandoc/Writers/Typst.hs
@@ -28,7 +28,7 @@
 import Data.Bifunctor (first, second)
 import Network.URI (unEscapeString)
 import qualified Data.Text as T
-import Control.Monad (unless)
+import Control.Monad (unless, when)
 import Control.Monad.State ( StateT, evalStateT, gets, modify )
 import Text.Pandoc.Writers.Shared ( lookupMetaInlines, lookupMetaString,
                                     metaToContext, defField, resetField,
@@ -49,6 +49,7 @@
 import qualified Text.Pandoc.UTF8 as UTF8
 import Text.Collate.Lang (Lang(..), parseLang)
 import Text.Printf (printf)
+import Text.Read (readMaybe)
 import Data.Char (isDigit)
 import Data.Maybe (fromMaybe)
 import Unicode.Char (isXIDContinue)
@@ -60,7 +61,11 @@
   evalStateT (pandocToTypst options document)
     WriterState{ stOptions = options,
                  stEscapeContext = NormalContext,
-                 stHighlighting = False }
+                 stHighlighting = False,
+                 stCsl = False,
+                 stCslHangingIndent = Nothing,
+                 stCslEntrySpacing = Nothing
+               }
 
 data EscapeContext = NormalContext | TermContext
   deriving (Show, Eq)
@@ -69,7 +74,10 @@
   WriterState {
     stOptions :: WriterOptions,
     stEscapeContext :: EscapeContext,
-    stHighlighting :: Bool
+    stHighlighting :: Bool,
+    stCsl :: Bool,
+    stCslHangingIndent :: Maybe Text,
+    stCslEntrySpacing :: Maybe Text
     }
 
 type TW m = StateT WriterState m
@@ -95,7 +103,9 @@
                            _         -> [])
                   $ lookupMetaInlines "nocite" meta
   hasHighlighting <- gets stHighlighting
-
+  hasCslSettings <- gets stCsl
+  cslHangingIndent <- gets stCslHangingIndent
+  cslEntrySpacing <- gets stCslEntrySpacing
   let context = defField "body" main
               $ defField "toc" (writerTableOfContents options)
               $ (if isEnabled Ext_citations options
@@ -112,6 +122,9 @@
                           resetField "lang" (langLanguage l) .
                           maybe id (resetField "region") (langRegion l))
               $ defField "csl" (lookupMetaString "citation-style" meta) -- #10661
+              $ defField "csl-settings" hasCslSettings
+              $ maybe id (defField "csl-hanging-indent") cslHangingIndent
+              $ maybe id (defField "csl-entry-spacing") cslEntrySpacing
               $ defField "smart" (isEnabled Ext_smart options)
               $ defField "abstract-title" abstractTitle
               $ defField "toc-depth" (tshow $ writerTOCDepth options)
@@ -396,15 +409,26 @@
                           $$ ")" $$ lab $$ blankline
     Div (ident,_,_) (Header lev ("",cls,kvs) ils:rest) ->
       blocksToTypst (Header lev (ident,cls,kvs) ils:rest)
-    Div (ident,_,kvs) blocks -> do
+    Div (ident,cls,kvs) blocks -> do
       let lab = case lookup "typst-label" kvs of
                   Just l -> toLabel FreestandingLabel l
                   Nothing -> toLabel FreestandingLabel ident
       let (typstAttrs,typstTextAttrs) = pickTypstAttrs kvs
+      when ("csl-bib-body" `elem` cls) $
+        modify $ \st -> st{ stCsl = True
+                          , stCslEntrySpacing =
+                              case lookup "entry-spacing" kvs >>=
+                                     readMaybe . T.unpack of
+                                Just (n :: Int) -> Just $ tshow n <> "em"
+                                Nothing -> Nothing
+                          , stCslHangingIndent =
+                              if "hanging-indent" `elem` cls
+                                 then Just "1.5em"
+                                 else Nothing }
       contents <- blocksToTypst blocks
       return $ "#block" <> toTypstPropsListParens typstAttrs <> "["
         $$ toTypstPoundSetText typstTextAttrs
-        $$ chomp contents
+        $$ contents
         $$ ("]" <+> lab)
 
 defListItemToTypst :: PandocMonad m => ([Inline], [[Block]]) -> TW m (Doc Text)
@@ -412,7 +436,7 @@
   modify $ \st -> st{ stEscapeContext = TermContext }
   term' <- inlinesToTypst term
   modify $ \st -> st{ stEscapeContext = NormalContext }
-  defns' <- mapM (fmap chomp . blocksToTypst) defns
+  defns' <- mapM blocksToTypst defns
   return $
     case defns of
       [[Plain _]] -> hang 4 (nowrap ("/ " <> term' <> ": ")) (vcat defns')
diff --git a/src/Text/Pandoc/XML.hs b/src/Text/Pandoc/XML.hs
--- a/src/Text/Pandoc/XML.hs
+++ b/src/Text/Pandoc/XML.hs
@@ -32,7 +32,7 @@
 import Commonmark.Entity (lookupEntity)
 import Text.HTML.TagSoup.Entity (htmlEntities)
 import Text.DocLayout
-    ( ($$), char, hcat, nest, text, Doc, HasChars )
+    ( ($$), nest, text, Doc, HasChars )
 import Text.Printf (printf)
 import qualified Data.Map as M
 import Data.String ( IsString )
@@ -47,35 +47,63 @@
                        '"' -> "&quot;"
                        c   -> T.singleton c
 
+-- | Is this character legal in XML at all?
+-- See <https://www.w3.org/TR/xml/#charsets>.
+isLegalXMLChar :: Char -> Bool
+isLegalXMLChar c = c == '\t' || c == '\n' || c == '\r' ||
+                   (c >= '\x20' && c <= '\xD7FF') ||
+                   (c >= '\xE000' && c <= '\xFFFD') ||
+                   (c >= '\x10000' && c <= '\x10FFFF')
+
+-- | Does this character need to be replaced or dropped by
+-- 'escapeStringForXML'?
+isSpecialXMLChar :: Char -> Bool
+isSpecialXMLChar = \case
+  '&' -> True
+  '<' -> True
+  '>' -> True
+  '"' -> True
+  c   -> not (isLegalXMLChar c)
+
 -- | Escape string as needed for XML.  Entity references are not preserved.
 escapeStringForXML :: Text -> Text
-escapeStringForXML = T.concatMap escapeCharForXML . T.filter isLegalXMLChar
-  where isLegalXMLChar c = c == '\t' || c == '\n' || c == '\r' ||
-                           (c >= '\x20' && c <= '\xD7FF') ||
-                           (c >= '\xE000' && c <= '\xFFFD') ||
-                           (c >= '\x10000' && c <= '\x10FFFF')
-  -- see https://www.w3.org/TR/xml/#charsets
+escapeStringForXML t
+  | T.null rest = t  -- nothing to do, so return the input without copying
+  | otherwise   = T.concat (chunk : go rest)
+ where
+  (chunk, rest) = T.break isSpecialXMLChar t
+  -- 'go' is always given text starting with a special character.  Text
+  -- between special characters is copied in runs rather than character
+  -- by character.
+  go t' = let (specials, t'') = T.span isSpecialXMLChar t'
+              (chunk', rest') = T.break isSpecialXMLChar t''
+           in T.concatMap escape specials :
+                if T.null rest' then [chunk'] else chunk' : go rest'
+  -- a special character is either one of & < > " or else not
+  -- representable in XML, in which case it is dropped
+  escape c | isLegalXMLChar c = escapeCharForXML c
+           | otherwise        = T.empty
 
 -- | Escape newline characters as &#10;
 escapeNls :: Text -> Text
-escapeNls = T.concatMap $ \case
-  '\n' -> "&#10;"
-  c    -> T.singleton c
+escapeNls t
+  | T.elem '\n' t = T.replace "\n" "&#10;" t
+  | otherwise     = t
 
--- | Return a text object with a string of formatted XML attributes.
-attributeList :: (HasChars a, IsString a) => [(Text, Text)] -> Doc a
-attributeList = hcat . map
-  (\(a, b) -> text (T.unpack $ " " <> escapeStringForXML a <> "=\"" <>
-  escapeNls (escapeStringForXML b) <> "\""))
+-- | The pieces of a string of formatted XML attributes, each attribute
+-- preceded by a space.
+attributeList :: [(Text, Text)] -> [Text]
+attributeList = concatMap
+  (\(a, b) -> [" ", escapeStringForXML a, "=\"",
+               escapeNls (escapeStringForXML b), "\""])
 
 -- | Put the supplied contents between start and end tags of tagType,
 --   with specified attributes and (if specified) indentation.
 inTags :: (HasChars a, IsString a)
       => Bool -> Text -> [(Text, Text)] -> Doc a -> Doc a
 inTags isIndented tagType attribs contents =
-  let openTag = char '<' <> text (T.unpack tagType) <> attributeList attribs <>
-                char '>'
-      closeTag  = text "</" <> text (T.unpack tagType) <> char '>'
+  let openTag  = tagDoc ("<" : tagType : attributeList attribs ++ [">"])
+      closeTag = tagDoc ["</", tagType, ">"]
   in  if isIndented
          then openTag $$ nest 2 contents $$ closeTag
          else openTag <> contents <> closeTag
@@ -84,7 +112,13 @@
 selfClosingTag :: (HasChars a, IsString a)
                => Text -> [(Text, Text)] -> Doc a
 selfClosingTag tagType attribs =
-  char '<' <> text (T.unpack tagType) <> attributeList attribs <> text " />"
+  tagDoc ("<" : tagType : attributeList attribs ++ [" />"])
+
+-- | Assemble the pieces of a tag into a single 'Doc', so that a tag
+-- costs one 'Text' allocation and one 'Doc' node rather than one of
+-- each per tag name and per attribute.
+tagDoc :: (HasChars a, IsString a) => [Text] -> Doc a
+tagDoc = text . T.unpack . T.concat
 
 -- | Put the supplied contents between start and end tags of tagType.
 inTagsSimple :: (HasChars a, IsString a)
diff --git a/test/Tests/Readers/Docx.hs b/test/Tests/Readers/Docx.hs
--- a/test/Tests/Readers/Docx.hs
+++ b/test/Tests/Readers/Docx.hs
@@ -112,6 +112,10 @@
             "docx/char_styles.docx"
             "docx/char_styles.native"
           , testCompare
+            "double strikethrough"
+            "docx/double_strikeout.docx"
+            "docx/double_strikeout.native"
+          , testCompare
             "hyperlinks"
             "docx/links.docx"
             "docx/links.native"
@@ -425,8 +429,8 @@
             "docx/track_changes_deletion_reject.native"
           , testCompareWithOpts def{readerTrackChanges=AllChanges}
             "keep insertion (all)"
-            "docx/track_changes_deletion.docx"
-            "docx/track_changes_deletion_all.native"
+            "docx/track_changes_insertion.docx"
+            "docx/track_changes_insertion_all.native"
           , testCompareWithOpts def{readerTrackChanges=AllChanges}
             "keep deletion (all)"
             "docx/track_changes_deletion.docx"
@@ -443,6 +447,18 @@
             "move text (all)"
             "docx/track_changes_move.docx"
             "docx/track_changes_move_all.native"
+          , testCompareWithOpts def{readerTrackChanges=AllChanges}
+            "spaces at the edges of changes stay in the span (all)"
+            "docx/track_changes_edge_spaces.docx"
+            "docx/track_changes_edge_spaces_all.native"
+          , testCompareWithOpts def{readerTrackChanges=AcceptChanges}
+            "spaces at the edges of changes (accept)"
+            "docx/track_changes_edge_spaces.docx"
+            "docx/track_changes_edge_spaces_accept.native"
+          , testCompareWithOpts def{readerTrackChanges=RejectChanges}
+            "spaces at the edges of changes (reject)"
+            "docx/track_changes_edge_spaces.docx"
+            "docx/track_changes_edge_spaces_reject.native"
           , testCompareWithOpts def{readerTrackChanges=AcceptChanges}
             "comments (accept -- no comments)"
             "docx/comments.docx"
diff --git a/test/Tests/Readers/DokuWiki.hs b/test/Tests/Readers/DokuWiki.hs
--- a/test/Tests/Readers/DokuWiki.hs
+++ b/test/Tests/Readers/DokuWiki.hs
@@ -32,7 +32,48 @@
 (=:) = test dokuwiki
 
 tests :: [TestTree]
-tests = [ testGroup "inlines"
+tests = [ testGroup "math groups and comments"
+          [ testGroup name
+            [ test reader "nested math in a color box" $
+                wrap "\\colorbox{aqua}{$F=ma$}" =?>
+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")
+            , test reader "unpaired escaped opening brace" $
+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")
+            , test reader "unpaired escaped closing brace" $
+                wrap escapedClosing =?> para (makeMath escapedClosing)
+            , test reader "commented delimiters and braces" $
+                wrap commented =?> para (makeMath commented)
+            , test reader "commented closing brace inside a group" $
+                wrap ("{x% } " <> close <> "\ny}") =?>
+                  para (makeMath $ "{x% } " <> close <> "\ny}")
+            , test reader "commented opening brace inside a group" $
+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")
+            , test reader "escaped percent is literal" $
+                wrap "x\\%" =?> para (makeMath "x\\%")
+            , test reader "percent after an escaped backslash is a comment" $
+                wrap ("x\\\\% " <> close <> "\ny") =?>
+                  para (makeMath $ "x\\\\% " <> close <> "\ny")
+            ]
+          | (name, ext, open, close, makeMath) <-
+              [ ("dollars", Ext_tex_math_dollars, "$", "$", math)
+              , ("double dollars", Ext_tex_math_dollars,
+                 "$$", "$$", displayMath)
+              , ("parentheses", Ext_tex_math_single_backslash,
+                 "\\(", "\\)", math)
+              , ("brackets", Ext_tex_math_single_backslash,
+                 "\\[", "\\]", displayMath)
+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,
+                 "\\\\(", "\\\\)", math)
+              , ("double-backslash brackets", Ext_tex_math_double_backslash,
+                 "\\\\[", "\\\\]", displayMath)
+              ]
+          , let reader = purely $ readDokuWiki def
+                  { readerExtensions = extensionsFromList [ext] }
+                wrap s = open <> s <> close
+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"
+                commented = "x% " <> close <> " { } \\%\ny"
+          ]
+        , testGroup "inlines"
           [ "Bold" =:
             "**bold**" =?>
             para (strong "bold")
diff --git a/test/Tests/Readers/HTML.hs b/test/Tests/Readers/HTML.hs
--- a/test/Tests/Readers/HTML.hs
+++ b/test/Tests/Readers/HTML.hs
@@ -57,7 +57,48 @@
                             { writerWrapText = WrapPreserve })
 
 tests :: [TestTree]
-tests = [ testGroup "base tag"
+tests = [ testGroup "math groups and comments"
+          [ testGroup name
+            [ test reader "nested math in a color box" $
+                wrap "\\colorbox{aqua}{$F=ma$}" =?>
+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")
+            , test reader "unpaired escaped opening brace" $
+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")
+            , test reader "unpaired escaped closing brace" $
+                wrap escapedClosing =?> para (makeMath escapedClosing)
+            , test reader "commented delimiters and braces" $
+                wrap commented =?> para (makeMath commented)
+            , test reader "commented closing brace inside a group" $
+                wrap ("{x% } " <> close <> "\ny}") =?>
+                  para (makeMath $ "{x% } " <> close <> "\ny}")
+            , test reader "commented opening brace inside a group" $
+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")
+            , test reader "escaped percent is literal" $
+                wrap "x\\%" =?> para (makeMath "x\\%")
+            , test reader "percent after an escaped backslash is a comment" $
+                wrap ("x\\\\% " <> close <> "\ny") =?>
+                  para (makeMath $ "x\\\\% " <> close <> "\ny")
+            ]
+          | (name, ext, open, close, makeMath) <-
+              [ ("dollars", Ext_tex_math_dollars, "$", "$", math)
+              , ("double dollars", Ext_tex_math_dollars,
+                 "$$", "$$", displayMath)
+              , ("parentheses", Ext_tex_math_single_backslash,
+                 "\\(", "\\)", math)
+              , ("brackets", Ext_tex_math_single_backslash,
+                 "\\[", "\\]", displayMath)
+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,
+                 "\\\\(", "\\\\)", math)
+              , ("double-backslash brackets", Ext_tex_math_double_backslash,
+                 "\\\\[", "\\\\]", displayMath)
+              ]
+          , let reader = purely $ readHtml def
+                  { readerExtensions = extensionsFromList [ext] }
+                wrap s = "<p>" <> open <> s <> close <> "</p>"
+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"
+                commented = "x% " <> close <> " { } \\%\ny"
+          ]
+        , testGroup "base tag"
           [ test html "simple" $
             "<head><base href=\"http://www.w3schools.com/images/foo\" ></head><body><img src=\"stickman.gif\" alt=\"Stickman\"></head>" =?>
             plain (image "http://www.w3schools.com/images/stickman.gif" "" (text "Stickman"))
diff --git a/test/Tests/Readers/Markdown.hs b/test/Tests/Readers/Markdown.hs
--- a/test/Tests/Readers/Markdown.hs
+++ b/test/Tests/Readers/Markdown.hs
@@ -162,7 +162,91 @@
 -}
 
 tests :: [TestTree]
-tests = [ testGroup "inline code"
+tests = [ testGroup "math groups"
+          [ testGroup name
+            [ test reader "nested math in text" $
+                wrap "\\text{hi $x$ bye}" =?>
+                  para (makeMath "\\text{hi $x$ bye}")
+            , test reader "nested math in a color box" $
+                wrap "\\colorbox{aqua}{$F=ma$}" =?>
+                  para (makeMath "\\colorbox{aqua}{$F=ma$}")
+            , test reader "nested groups" $
+                wrap "\\fcolorbox{red}{aqua}{\\text{hi $x$ bye}}" =?>
+                  para (makeMath
+                    "\\fcolorbox{red}{aqua}{\\text{hi $x$ bye}}")
+            , test reader "matching delimiters inside a group" $
+                wrap grouped =?> para (makeMath grouped)
+            , test reader "unpaired escaped opening brace inside a group" $
+                wrap "{\\{x}" =?> para (makeMath "{\\{x}")
+            , test reader "unpaired escaped closing brace inside a group" $
+                wrap escapedClosing =?> para (makeMath escapedClosing)
+            , test reader "unpaired escaped opening brace outside a group" $
+                wrap "\\{x" =?> para (makeMath "\\{x")
+            , test reader "unpaired escaped closing brace outside a group" $
+                wrap "x\\}" =?> para (makeMath "x\\}")
+            , test reader "escaped backslash before closing brace" $
+                wrap "{x\\\\}" =?> para (makeMath "{x\\\\}")
+            , test reader "multiline group" $
+                wrap "{a\nb}" =?> para (makeMath "{a\nb}")
+            , test reader "commented delimiters and braces" $
+                wrap commented =?> para (makeMath commented)
+            , test reader "commented closing brace inside a group" $
+                wrap ("{x% } " <> close <> "\ny}") =?>
+                  para (makeMath $ "{x% } " <> close <> "\ny}")
+            , test reader "commented opening brace inside a group" $
+                wrap "{x% {\ny}" =?> para (makeMath "{x% {\ny}")
+            , test reader "escaped percent is literal" $
+                wrap "x\\%" =?> para (makeMath "x\\%")
+            , test reader "escaped percent does not hide a closing brace" $
+                wrap "{x\\%}" =?> para (makeMath "{x\\%}")
+            , test reader "escaped percent does not hide an opening brace" $
+                wrap ("x\\%" <> grouped) =?>
+                  para (makeMath $ "x\\%" <> grouped)
+            , test reader "percent after an escaped backslash starts a comment" $
+                wrap ("x\\\\% " <> close <> "\ny") =?>
+                  para (makeMath $ "x\\\\% " <> close <> "\ny")
+            , test reader "escaped backslash before a comment inside a group" $
+                wrap "{x\\\\% }\ny}" =?>
+                  para (makeMath "{x\\\\% }\ny}")
+            , test reader "comment cannot supply the closing delimiter" $
+                wrap "x%" =?>
+                  para (text $ literalOpen <> "x%" <> literalClose)
+            , test reader "consecutive comments" $
+                wrap ("x%\n% } $ \\" <> "\ny") =?>
+                  para (makeMath $ "x%\n% } $ \\" <> "\ny")
+            , test reader "following math remains separate" $
+                (wrap grouped <> " and " <> wrap "y") =?>
+                  para (makeMath grouped <> " and " <> makeMath "y")
+            , test reader "unclosed group falls back to text" $
+                wrap "{x" =?> para (text $ literalOpen <> "{x" <>
+                                          literalClose)
+            , test reader "unclosed group does not hide later math" $
+                (wrap "{x" <> "\n\n" <> wrap "y") =?>
+                  (para (text $ literalOpen <> "{x" <> literalClose) <>
+                   para (makeMath "y"))
+            ]
+          | (name, ext, open, close, literalOpen, literalClose, makeMath) <-
+              [ ("dollars", Ext_tex_math_dollars,
+                 "$", "$", "$", "$", math)
+              , ("double dollars", Ext_tex_math_dollars,
+                 "$$", "$$", "$$", "$$", displayMath)
+              , ("parentheses", Ext_tex_math_single_backslash,
+                 "\\(", "\\)", "(", ")", math)
+              , ("brackets", Ext_tex_math_single_backslash,
+                 "\\[", "\\]", "[", "]", displayMath)
+              , ("double-backslash parentheses", Ext_tex_math_double_backslash,
+                 "\\\\(", "\\\\)", "\\(", "\\)", math)
+              , ("double-backslash brackets", Ext_tex_math_double_backslash,
+                 "\\\\[", "\\\\]", "\\[", "\\]", displayMath)
+              ]
+          , let reader = purely $ readMarkdown def
+                  { readerExtensions = extensionsFromList [ext] }
+                wrap s = open <> s <> close
+                grouped = "\\text{hi " <> open <> "x" <> close <> " bye}"
+                escapedClosing = "{\\} hi " <> open <> "x" <> close <> " bye}"
+                commented = "x% " <> close <> " { } \\%\ny"
+          ]
+        , testGroup "inline code"
           [ "with attribute" =:
             "`document.write(\"Hello\");`{.javascript}"
             =?> para
diff --git a/test/Tests/Readers/ODT.hs b/test/Tests/Readers/ODT.hs
--- a/test/Tests/Readers/ODT.hs
+++ b/test/Tests/Readers/ODT.hs
@@ -28,7 +28,10 @@
 defopts = def{ readerExtensions = getDefaultExtensions "odt" }
 
 tests :: [TestTree]
-tests = testsComparingToMarkdown ++ testsComparingToNative
+tests = testsComparingToMarkdown ++ testsComparingToNative ++
+        [ testGroup "fodt" (fodtTestsComparingToMarkdown ++
+                            fodtTestsComparingToNative ++
+                            fodtTestsComparingToOwnNative) ]
 
 testsComparingToMarkdown :: [TestTree]
 testsComparingToMarkdown    = map nameToTest namesOfTestsComparingToMarkdown
@@ -50,7 +53,73 @@
         toODTPath      name = "odt/odt/"      ++ name ++ ".odt"
         toNativePath   name = "odt/native/"   ++ name ++ ".native"
 
+-- The flat files are LibreOffice's conversions of the zipped files, and are
+-- compared against the very same expectations, so that flat and zipped input
+-- are asserted to converge on identical documents.  office:settings,
+-- office:scripts and office:master-styles have been removed from them: they
+-- are view state that the reader never looks at, and they were a quarter of
+-- the bytes.
+--
+-- Four fixtures are enough, because a flat file shares nearly all of the
+-- reader with a zipped one: once readFODT has handed the root element over,
+-- the converter is the very same code.  Only two paths are reached by a flat
+-- file alone, and each has a fixture that reaches it:
+--
+--   * "image"   -- an image with no xlink:href, so the data must be decoded
+--                  from office:binary-data and the type taken from
+--                  draw:mime-type rather than found in the archive
+--   * "formula" -- a draw:object with no xlink:href, so the MathML is read
+--                  from the element itself rather than from a sub-document
+--
+-- The other two guard against whitespace, which is the one hazard that is
+-- peculiar to this format without being a separate branch of the reader:
+-- LibreOffice pretty-prints a flat file, and that indentation is in the XML
+-- the reader sees.  It has already been read as content once, as the alt text
+-- of an image.  "preformattedText" is a CodeBlock, whose whitespace is
+-- significant and therefore compared exactly, and "textMixedStyles" is a run
+-- of nested emphasis, where stray indentation would show up between inlines.
+--
+-- Three of the zipped fixtures *cannot* be used, rather than merely being
+-- surplus: LibreOffice's flat export renames the automatic style that marks
+-- inlined code (inlinedCode), drops the cached text of a chapter reference
+-- field (referenceToChapter), and resolves a relative reference to a
+-- non-embedded image against the local filesystem (imageRelative).
 
+fodtTestsComparingToMarkdown :: [TestTree]
+fodtTestsComparingToMarkdown = map nameToTest namesOfFODTTestsComparingToMarkdown
+  where nameToTest     name = createTest
+                                compareFODTToMarkdown
+                                name
+                                (toFODTPath     name)
+                                (toMarkdownPath name)
+        toFODTPath     name = "odt/fodt/"     ++ name ++ ".fodt"
+        toMarkdownPath name = "odt/markdown/" ++ name ++ ".md"
+
+fodtTestsComparingToNative :: [TestTree]
+fodtTestsComparingToNative = map nameToTest namesOfFODTTestsComparingToNative
+  where nameToTest     name = createTest
+                                compareFODTToNative
+                                name
+                                (toFODTPath     name)
+                                (toNativePath   name)
+        toFODTPath     name = "odt/fodt/"     ++ name ++ ".fodt"
+        toNativePath   name = "odt/native/"   ++ name ++ ".native"
+
+-- Images need their own expectations, because the media bag paths are
+-- pandoc's own when the image data is embedded, and because LibreOffice
+-- converts the frame dimensions to inches on export.
+
+fodtTestsComparingToOwnNative :: [TestTree]
+fodtTestsComparingToOwnNative = map nameToTest namesOfFODTTestsComparingToOwnNative
+  where nameToTest     name = createTest
+                                compareFODTToNative
+                                name
+                                (toFODTPath     name)
+                                (toNativePath   name)
+        toFODTPath     name = "odt/fodt/"        ++ name ++ ".fodt"
+        toNativePath   name = "odt/fodt-native/" ++ name ++ ".native"
+
+
 newtype NoNormPandoc = NoNormPandoc {unNoNorm :: Pandoc}
   deriving ( Show )
 
@@ -91,7 +160,25 @@
    odt          <- getNoNormVia id "odt"      <$> runIO (readODT      opts odtFile)
    return (odt,markdown)
 
+compareFODTToNative :: TestCreator
+compareFODTToNative opts fodtPath nativePath = do
+   nativeFile   <- UTF8.toText <$> BS.readFile nativePath
+   fodtFile     <- UTF8.toText <$> BS.readFile fodtPath
+   native       <- getNoNormVia id "native" <$> runIO (readNative def nativeFile)
+   fodt         <- getNoNormVia id "fodt"   <$> runIO (readFODT opts fodtFile)
+   return (fodt,native)
 
+compareFODTToMarkdown :: TestCreator
+compareFODTToMarkdown opts fodtPath markdownPath = do
+   markdownFile <- UTF8.toText <$> BS.readFile markdownPath
+   fodtFile     <- UTF8.toText <$> BS.readFile fodtPath
+   markdown     <- getNoNormVia id "markdown" <$>
+                      runIO (readMarkdown def{ readerExtensions = pandocExtensions }
+                              markdownFile)
+   fodt         <- getNoNormVia id "fodt"     <$> runIO (readFODT opts fodtFile)
+   return (fodt,markdown)
+
+
 createTest :: TestCreator
            -> TestName
            -> FilePath -> FilePath
@@ -194,3 +281,14 @@
                                   , "unorderedList"
                                   , "unorderedListHeader"
                                   ]
+
+namesOfFODTTestsComparingToMarkdown :: [ String ]
+namesOfFODTTestsComparingToMarkdown = [ "formula" ]
+
+namesOfFODTTestsComparingToNative :: [ String ]
+namesOfFODTTestsComparingToNative = [ "preformattedText"
+                                    , "textMixedStyles"
+                                    ]
+
+namesOfFODTTestsComparingToOwnNative :: [ String ]
+namesOfFODTTestsComparingToOwnNative = [ "image" ]
diff --git a/test/Tests/Writers/Docx.hs b/test/Tests/Writers/Docx.hs
--- a/test/Tests/Writers/Docx.hs
+++ b/test/Tests/Writers/Docx.hs
@@ -218,6 +218,11 @@
             def
             "docx/raw-bookmarks.native"
             "docx/golden/raw-bookmarks.docx"
+          , docxTest
+            "mark math"
+            def
+            "docx/mark_math.native"
+            "docx/golden/mark_math.docx"
           ]
         , testGroup "track changes"
           [ docxTest
diff --git a/test/Tests/Writers/LaTeX.hs b/test/Tests/Writers/LaTeX.hs
--- a/test/Tests/Writers/LaTeX.hs
+++ b/test/Tests/Writers/LaTeX.hs
@@ -70,7 +70,7 @@
             "\\begin{description}\n\\item[foo] ~ \n\\subsection{bar}\n\nbaz\n\\end{description}"
           , "containing image" =:
             header 1 (image "imgs/foo.jpg" "" (text "Alt text")) =?>
-            "\\section{\\texorpdfstring{\\protect\\pandocbounded{\\includegraphics[keepaspectratio,alt={Alt text}]{imgs/foo.jpg}}}{Alt text}}"
+            "\\section{\\texorpdfstring{\\protect\\pandocbounded{\\includegraphics[keepaspectratio,alt={Alt\ntext}]{imgs/foo.jpg}}}{Alt text}}"
           ]
         , testGroup "inline code"
           [ "struck out and highlighted" =:
@@ -249,7 +249,7 @@
             (plain $ image (pack "img.jpg") (pack "") (text "alt text"))
             =?>
               "\\begin{figure}[htbp]\n\\centering\n"
-              <> "\\pandocbounded{\\includegraphics[keepaspectratio,alt={alt text}]{img.jpg}}\n"
+              <> "\\pandocbounded{\\includegraphics[keepaspectratio,alt={alt\ntext}]{img.jpg}}\n"
               <> "\\caption{caption}\n\\end{figure}"
           ]
         ]
diff --git a/test/Tests/Writers/Markdown.hs b/test/Tests/Writers/Markdown.hs
--- a/test/Tests/Writers/Markdown.hs
+++ b/test/Tests/Writers/Markdown.hs
@@ -49,6 +49,26 @@
         , "emph/strong with spaces (#10696)"
              =: emph (str "f" <> strong (space <> str "d" <> space)) <> str "l" =?>
              "*f **d*** l"
+        , "image destination with space"
+             =: image "home/image folder/image.png" "title" "pic"
+             =?> "![pic](<home/image folder/image.png> \"title\")"
+        , "link destination with space and pointy brackets"
+             =: link "a b<c>.pdf" "" "link"
+             =?> "[link](<a b\\<c\\>.pdf>)"
+        , "bullet marker after linebreak in list item"
+             =: orderedList [ plain (str "Lead:" <> linebreak <>
+                                     str "-" <> space <> str "alpha") ]
+             =?> "1.  Lead:\\\n    \\- alpha\n"
+        , "ordered marker after linebreak in list item"
+             =: orderedList [ plain (str "Lead:" <> linebreak <>
+                                     str "3." <> space <> str "alpha") ]
+             =?> "1.  Lead:\\\n    3\\. alpha\n"
+        , "lone bullet marker after linebreak"
+             =: plain (str "Lead:" <> linebreak <> str "-")
+             =?> "Lead:\\\n\\-"
+        , "lone ordered marker after linebreak in list item"
+             =: orderedList [ plain (str "Lead:" <> linebreak <> str "3.") ]
+             =?> "1.  Lead:\\\n    3\\."
         ] ++ [noteTests] ++ [shortcutLinkRefsTests]
 
 {-
@@ -227,6 +247,12 @@
                        , "  [foo]: /url1"
                        , "  [1]: /url2"
                        , "  [2]: /url3"
+                       ]
+     , "Reference link destination with space"
+           =: para (link "my file.pdf" "" "link")
+           =?> unlines [ "[link]"
+                       , ""
+                       , "  [link]: <my file.pdf>"
                        ]
      , "Reference link is followed by text in brackets"
           =:  para (link "/url" "" "link" <> "[text in brackets]")
diff --git a/test/Tests/Writers/ODT.hs b/test/Tests/Writers/ODT.hs
new file mode 100644
--- /dev/null
+++ b/test/Tests/Writers/ODT.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE OverloadedStrings #-}
+{- |
+   Module      : Tests.Writers.ODT
+   Copyright   : © 2026 John MacFarlane
+   License     : GNU GPL, version 2 or above
+
+   Maintainer  : John MacFarlane <jgm@berkeley.edu>
+   Stability   : alpha
+   Portability : portable
+
+Tests for the ODT writers.
+-}
+module Tests.Writers.ODT (tests) where
+
+import Data.Text (Text)
+import qualified Data.Text as T
+import qualified Data.Text.Lazy as TL
+import Test.Tasty
+import Test.Tasty.HUnit
+import Text.Pandoc
+import Text.Pandoc.Builder
+import qualified Text.Pandoc.XML.Light as XML
+
+-- | The @xlink:href@ of every image in a flat OpenDocument file.  The
+-- local name is enough to match on, since the prefix is an artifact of
+-- the namespace declarations we happen to write.
+imageHrefs :: Text -> IO [Text]
+imageHrefs txt =
+  case XML.parseXMLElement (TL.fromStrict txt) of
+    Left msg    -> assertFailure $
+                     "flat OpenDocument output is not valid XML: "
+                     ++ T.unpack msg
+    Right root  -> return
+      [ href
+      | el        <- XML.filterElementsName ((== "image") . XML.qName) root
+      , Just href <- [XML.findAttrBy ((== "href") . XML.qName) el]
+      ]
+
+tests :: [TestTree]
+tests =
+  -- This cannot be a command test, because extracting the reference
+  -- from the output needs a pipe into grep, and the command tests run
+  -- under cmd.exe on Windows.
+  [ testCase "fodt --link-images leaves a relative reference alone" $ do
+      -- An ODT resolves relative references against its zip structure,
+      -- so the writer prefixes them with "../" (see fixInternalLinks).
+      -- A flat file is a single file, and must not have one.
+      fodt  <- runIOorExplode $ setVerbosity ERROR >>
+                 writeFODT def{ writerLinkImages = True } doc'
+      hrefs <- imageHrefs fodt
+      ["lalune.jpg"] @=? hrefs
+  ]
+ where
+  doc' = doc $ para $ image "lalune.jpg" "" mempty
diff --git a/test/command/10965.md b/test/command/10965.md
--- a/test/command/10965.md
+++ b/test/command/10965.md
@@ -7,6 +7,7 @@
 #block[
 #set text(lang: "en");
 This text should be in English.
+
 ]
 ```
 
@@ -19,6 +20,7 @@
 #block[
 #set text(lang: "fr");
 Ce texte devrait être en français.
+
 ]
 ```
 
@@ -31,6 +33,7 @@
 #block[
 #set text(lang: "de");
 Dieser Text sollte auf Deutsch sein.
+
 ]
 ```
 
@@ -42,5 +45,6 @@
 ^D
 #block[
 This should not have lang set.
+
 ]
 ```
diff --git a/test/command/11266.md b/test/command/11266.md
--- a/test/command/11266.md
+++ b/test/command/11266.md
@@ -9,7 +9,6 @@
 \end{eqnarray}
 $$
 ^D
-
 \begin{eqnarray}
 S &\rightarrow& a A                      \nonumber \\
 A &\rightarrow& d B \ | \ b A \ | \ c A  \nonumber \\
diff --git a/test/command/11583.md b/test/command/11583.md
--- a/test/command/11583.md
+++ b/test/command/11583.md
@@ -11,5 +11,6 @@
 + item
 + item
 + item
+
 ]
 ```
diff --git a/test/command/11794.md b/test/command/11794.md
--- a/test/command/11794.md
+++ b/test/command/11794.md
@@ -6,6 +6,7 @@
 ^D
 #block[
 Hello
+
 ] <foo>
 
 ```
diff --git a/test/command/11845.md b/test/command/11845.md
new file mode 100644
--- /dev/null
+++ b/test/command/11845.md
@@ -0,0 +1,39 @@
+A heading's bookmark is written inside the heading's paragraph, around its
+text, rather than around its whole section, so a link to the heading
+survives a docx round trip, and a screen reader meets the bookmark at the
+heading (#11845).
+
+```
+% pandoc -f markdown -t docx -o - | pandoc -f docx -t native
+# Costs {#price}
+
+Back to [costs](#price), on to [later](#later-part).
+
+# Later Part
+
+End.
+^D
+[ Header 1 ( "costs" , [] , [] ) [ Str "Costs" ]
+, Para
+    [ Str "Back"
+    , Space
+    , Str "to"
+    , Space
+    , Link ( "" , [] , [] ) [ Str "costs" ] ( "#costs" , "" )
+    , Str ","
+    , Space
+    , Str "on"
+    , Space
+    , Str "to"
+    , Space
+    , Link
+        ( "" , [] , [] ) [ Str "later" ] ( "#later-part" , "" )
+    , Str "."
+    ]
+, Header
+    1
+    ( "later-part" , [] , [] )
+    [ Str "Later" , Space , Str "Part" ]
+, Para [ Str "End." ]
+]
+```
diff --git a/test/command/11927.md b/test/command/11927.md
new file mode 100644
--- /dev/null
+++ b/test/command/11927.md
@@ -0,0 +1,6 @@
+```
+% pandoc -f native -t commonmark
+[ Para [ Str "a\\(b\\)c" , Space , Str "\\*x" ] ]
+^D
+a\\(b\\)c \\\*x
+```
diff --git a/test/command/11939.md b/test/command/11939.md
new file mode 100644
--- /dev/null
+++ b/test/command/11939.md
@@ -0,0 +1,19 @@
+```
+% pandoc -f native -t markdown
+[ Table ("", [], [])
+    (Caption Nothing [Plain [Str "Caption"]])
+    [(AlignDefault, ColWidth 1)]
+    (TableHead ("", [], [])
+      [Row ("", [], [])
+        [Cell ("", [], []) AlignDefault (RowSpan 1) (ColSpan 1)
+          [Plain [Str "x"]]]])
+    [TableBody ("", [], []) (RowHeadColumns 0) [] []]
+    (TableFoot ("", [], []) [])
+]
+^D
++-----------------------------------------------------------------------+
+| x                                                                     |
++=======================================================================+
+
+: Caption
+```
diff --git a/test/command/11942.js b/test/command/11942.js
new file mode 100644
--- /dev/null
+++ b/test/command/11942.js
@@ -0,0 +1,1 @@
+var sel = '#main' & 1; // </script>
diff --git a/test/command/11942.md b/test/command/11942.md
new file mode 100644
--- /dev/null
+++ b/test/command/11942.md
@@ -0,0 +1,14 @@
+Characters with special meaning in a URI must be percent-encoded in a
+textual `data:` URI.  In particular a bare `#` would truncate the
+payload at the fragment delimiter, and bare `&` or `'` would be
+HTML-escaped into entities by the serializer.
+
+(The `</script>` in the resource is what forces the `data:` URI path
+rather than inlining the script contents.)
+
+```
+% pandoc --embed-resources
+<script src="command/11942.js"></script>
+^D
+<script src="data:text/javascript;charset=utf-8,var%20sel%20%3D%20%27%23main%27%20%26%201%3B%20%2F%2F%20%3C%2Fscript%3E%0A"></script>
+```
diff --git a/test/command/4880.md b/test/command/4880.md
--- a/test/command/4880.md
+++ b/test/command/4880.md
@@ -1,6 +1,6 @@
 ```
-% pandoc -t latex
-$x=y%comment$
+% pandoc -t latex -f native
+[Math InlineMath "x=y%comment"]
 ^D
 \(x=y%comment
 \)
diff --git a/test/command/5116.md b/test/command/5116.md
--- a/test/command/5116.md
+++ b/test/command/5116.md
@@ -12,7 +12,8 @@
 ^D
 \begin{figure}
 \centering
-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}
+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a
+figure.}]{img.jpg}}
 \caption{This is a figure.}
 \end{figure}
 
@@ -50,7 +51,8 @@
 \begin{figure}
 \centering
 \caption{This is a figure.}
-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}
+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a
+figure.}]{img.jpg}}
 \end{figure}
 
 \begin{longtable}[]{@{}rlcl@{}}
@@ -86,7 +88,8 @@
 ^D
 \begin{figure}
 \centering
-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a figure.}]{img.jpg}}
+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a
+figure.}]{img.jpg}}
 \caption{This is a figure.}
 \end{figure}
 
diff --git a/test/command/6792.md b/test/command/6792.md
--- a/test/command/6792.md
+++ b/test/command/6792.md
@@ -27,9 +27,6 @@
     <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Contents">
       <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" />
     </style:style>
-    <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Table_20_Contents">
-      <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" />
-    </style:style>
     <style:style style:name="TableHeaderRowCell" style:family="table-cell">
       <style:table-cell-properties fo:border="none" />
     </style:style>
@@ -56,7 +53,7 @@
       <text:p text:style-name="P1">2</text:p>
     </table:table-cell>
     <table:table-cell table:style-name="TableRowCell" office:value-type="string">
-      <text:p text:style-name="P2">1</text:p>
+      <text:p text:style-name="P1">1</text:p>
     </table:table-cell>
   </table:table-row>
 </table:table>
diff --git a/test/command/6821.md b/test/command/6821.md
--- a/test/command/6821.md
+++ b/test/command/6821.md
@@ -60,7 +60,8 @@
 
 \begin{figure}
 \centering
-\pandocbounded{\includegraphics[keepaspectratio,alt={This is a test x = 5}]{test.png}}
+\pandocbounded{\includegraphics[keepaspectratio,alt={This is a test x =
+5}]{test.png}}
 \caption{This is a test
 \protect\VERB|\NormalTok{x }\OperatorTok{=} \DecValTok{5}|}
 \end{figure}
diff --git a/test/command/7181.md b/test/command/7181.md
--- a/test/command/7181.md
+++ b/test/command/7181.md
@@ -4,7 +4,8 @@
 ^D
 \begin{figure}
 \centering
-\pandocbounded{\includegraphics[keepaspectratio,page=13,trim=1cm,clip,width=4cm,alt={Global frog population.}]{slides.pdf}}
+\pandocbounded{\includegraphics[keepaspectratio,page=13,trim=1cm,clip,width=4cm,alt={Global
+frog population.}]{slides.pdf}}
 \caption{Global frog population.}
 \end{figure}
 
diff --git a/test/command/9002.md b/test/command/9002.md
--- a/test/command/9002.md
+++ b/test/command/9002.md
@@ -2,7 +2,8 @@
 % pandoc command/9002.docx -t html
 ^D
 <table style="width:40%;">
-<caption><p>This is my table!</p></caption>
+<caption><p><span id="_Ref143272803" class="anchor"></span> This is my
+table!</p></caption>
 <colgroup>
 <col style="width: 20%" />
 <col style="width: 20%" />
diff --git a/test/command/9387.md b/test/command/9387.md
--- a/test/command/9387.md
+++ b/test/command/9387.md
@@ -7,6 +7,7 @@
 ^D
 #block[
 test
+
 ] #label("my label")
 See #link(label("my label"))[my label].
 
diff --git a/test/command/9716.md b/test/command/9716.md
--- a/test/command/9716.md
+++ b/test/command/9716.md
@@ -4,7 +4,7 @@
 > A suggestion.
 ^D
 [ Div
-    ( "" , [ "alert" , "tip" ] , [] )
+    ( "" , [ "tip" , "alert" ] , [] )
     [ Div ( "" , [ "title" ] , [] ) [ Para [ Str "Tip" ] ]
     , Para [ Str "A" , Space , Str "suggestion." ]
     ]
diff --git a/test/command/completion.md b/test/command/completion.md
--- a/test/command/completion.md
+++ b/test/command/completion.md
@@ -14,8 +14,8 @@
 
     # These should be filled in by pandoc:
     opts="-f -r --from --read -t -w --to --write -o --output --data-dir -M --metadata --metadata-file -d --defaults --file-scope --sandbox -s --standalone --template -V --variable --variable-json --wrap --ascii --toc --table-of-contents --toc-depth --lof --list-of-figures --lot --list-of-tables -N --number-sections --number-offset --top-level-division --extract-media --resource-path -H --include-in-header -B --include-before-body -A --include-after-body --no-highlight --highlight-style --syntax-definition --syntax-highlighting --dpi --eol --columns -p --preserve-tabs --tab-stop --pdf-engine --pdf-engine-opt --reference-doc --self-contained --embed-resources --link-images --request-header --no-check-certificate --abbreviations --typst-input --indented-code-classes --default-image-extension -F --filter -L --lua-filter --shift-heading-level-by --base-header-level --track-changes --strip-comments --reference-links --reference-location --figure-caption-position --table-caption-position --markdown-headings --list-tables --listings -i --incremental --slide-level --section-divs --html-q-tags --email-obfuscation --id-prefix -T --title-prefix -c --css --epub-subdirectory --epub-cover-image --epub-title-page --epub-metadata --epub-embed-font --split-level --chunk-template --epub-chapter-level --ipynb-output -C --citeproc --bibliography --csl --citation-abbreviations --natbib --biblatex --math-method --mathml --webtex --mathjax --katex --gladtex --trace --dump-args --ignore-args --verbose --quiet --fail-if-warnings --log --completion --bash-completion --list-input-formats --list-output-formats --list-extensions --list-highlight-languages --list-highlight-styles -D --print-default-template --print-default-data-file --print-highlight-style -v --version -h --help"
-    informats="asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"
-    outformats="ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
+    informats="asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"
+    outformats="ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
     highlight_styles="pygments tango espresso zenburn kate monochrome breezedark haddock"
     math_methods="plain mathml webtex mathjax katex gladtex"
     datafiles="MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml"
@@ -116,14 +116,14 @@
 _pandoc() {
   local -a args
   args=(
-    '-f[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
-    '-r[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
-    '--from[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
-    '--read[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
-    '-t[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
-    '-w[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
-    '--to[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
-    '--write[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '-f[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
+    '-r[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
+    '--from[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
+    '--read[Reader format]:FORMAT:(asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml)'
+    '-t[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '-w[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '--to[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '--write[Writer format]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
     '-o[Output file]:FILE:_files'
     '--output[Output file]:FILE:_files'
     '--data-dir[Directory for data files]:DIRECTORY:_files'
@@ -245,8 +245,8 @@
     '--list-extensions[List supported extensions]'
     '--list-highlight-languages[List highlighting languages]'
     '--list-highlight-styles[List highlighting styles]'
-    '-D[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
-    '--print-default-template[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '-D[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
+    '--print-default-template[Format to print template for]:FORMAT:(ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki)'
     '--print-default-data-file[Data file to print]:FILE:(MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml)'
     '--print-highlight-style[Highlighting style]:STYLE:(pygments tango espresso zenburn kate monochrome breezedark haddock)'
     '-v[Print version]'
@@ -266,8 +266,8 @@
 ```
 % pandoc --completion=fish
 ^D
-complete -c pandoc -l from -d "Reader format" -r -a "asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"
-complete -c pandoc -l to -d "Writer format" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
+complete -c pandoc -l from -d "Reader format" -r -a "asciidoc biblatex bibtex bits commonmark commonmark_x creole csljson csv djot docbook docx dokuwiki endnotexml epub fb2 fodt gfm haddock html ipynb jats jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict mdoc mediawiki muse native odt opml org pod pptx ris rst rtf t2t textile tikiwiki tsv twiki typst vimwiki xlsx xml"
+complete -c pandoc -l to -d "Writer format" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
 complete -c pandoc -s o -l output -d "Output file" -r
 complete -c pandoc -l data-dir -d "Directory for data files" -r
 complete -c pandoc -s M -l metadata -d "Metadata field KEY=VALUE" -r
@@ -370,7 +370,7 @@
 complete -c pandoc -l list-extensions -d "List supported extensions"
 complete -c pandoc -l list-highlight-languages -d "List highlighting languages"
 complete -c pandoc -l list-highlight-styles -d "List highlighting styles"
-complete -c pandoc -s D -l print-default-template -d "Format to print template for" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
+complete -c pandoc -s D -l print-default-template -d "Format to print template for" -r -a "ansi asciidoc asciidoc_legacy asciidoctor bbcode bbcode_fluxbb bbcode_hubzilla bbcode_phpbb bbcode_steam bbcode_xenforo beamer biblatex bibtex chunkedhtml commonmark commonmark_x context csljson djot docbook docbook4 docbook5 docx dokuwiki dzslides epub epub2 epub3 fb2 fodt gfm haddock html html4 html5 icml ipynb jats jats_archiving jats_articleauthoring jats_publishing jira json latex man markdown markdown_github markdown_mmd markdown_phpextra markdown_strict markua mediawiki ms muse native odt opendocument opml org pdf plain pptx revealjs rst rtf s5 slideous slidy t2t tei texinfo textile typst vimdoc xml xwiki zimwiki"
 complete -c pandoc -l print-default-data-file -d "Data file to print" -r -a "MANUAL.txt abbreviations creole.lua default.csl docbook-entities.txt docx/[Content_Types].xml docx/_rels/.rels docx/docProps/app.xml docx/docProps/core.xml docx/docProps/custom.xml docx/word/_rels/document.xml.rels docx/word/_rels/footnotes.xml.rels docx/word/comments.xml docx/word/document.xml docx/word/fontTable.xml docx/word/footnotes.xml docx/word/numbering.xml docx/word/settings.xml docx/word/styles.xml docx/word/theme/theme1.xml docx/word/webSettings.xml dzslides/template.html epub.css init.lua odt/META-INF/manifest.xml odt/content.xml odt/manifest.rdf odt/meta.xml odt/mimetype odt/styles.xml pptx/[Content_Types].xml pptx/_rels/.rels pptx/docProps/app.xml pptx/docProps/core.xml pptx/ppt/_rels/presentation.xml.rels pptx/ppt/notesMasters/_rels/notesMaster1.xml.rels pptx/ppt/notesMasters/notesMaster1.xml pptx/ppt/notesSlides/_rels/notesSlide1.xml.rels pptx/ppt/notesSlides/_rels/notesSlide2.xml.rels pptx/ppt/notesSlides/notesSlide1.xml pptx/ppt/notesSlides/notesSlide2.xml pptx/ppt/presProps.xml pptx/ppt/presentation.xml pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels pptx/ppt/slideLayouts/slideLayout1.xml pptx/ppt/slideLayouts/slideLayout10.xml pptx/ppt/slideLayouts/slideLayout11.xml pptx/ppt/slideLayouts/slideLayout2.xml pptx/ppt/slideLayouts/slideLayout3.xml pptx/ppt/slideLayouts/slideLayout4.xml pptx/ppt/slideLayouts/slideLayout5.xml pptx/ppt/slideLayouts/slideLayout6.xml pptx/ppt/slideLayouts/slideLayout7.xml pptx/ppt/slideLayouts/slideLayout8.xml pptx/ppt/slideLayouts/slideLayout9.xml pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels pptx/ppt/slideMasters/slideMaster1.xml pptx/ppt/slides/_rels/slide1.xml.rels pptx/ppt/slides/_rels/slide2.xml.rels pptx/ppt/slides/_rels/slide3.xml.rels pptx/ppt/slides/_rels/slide4.xml.rels pptx/ppt/slides/slide1.xml pptx/ppt/slides/slide2.xml pptx/ppt/slides/slide3.xml pptx/ppt/slides/slide4.xml pptx/ppt/tableStyles.xml pptx/ppt/theme/theme1.xml pptx/ppt/theme/theme2.xml pptx/ppt/viewProps.xml reference.docx reference.odt reference.pptx templates/affiliations.jats templates/after-header-includes.latex templates/article.jats_publishing templates/common.latex templates/default.ansi templates/default.asciidoc templates/default.bbcode templates/default.beamer templates/default.biblatex templates/default.bibtex templates/default.chunkedhtml templates/default.commonmark templates/default.context templates/default.djot templates/default.docbook4 templates/default.docbook5 templates/default.dokuwiki templates/default.dzslides templates/default.epub2 templates/default.epub3 templates/default.haddock templates/default.html4 templates/default.html5 templates/default.icml templates/default.jats_archiving templates/default.jats_articleauthoring templates/default.jats_publishing templates/default.jira templates/default.latex templates/default.man templates/default.markdown templates/default.markua templates/default.mediawiki templates/default.ms templates/default.muse templates/default.opendocument templates/default.openxml templates/default.opml templates/default.org templates/default.plain templates/default.revealjs templates/default.rst templates/default.rtf templates/default.s5 templates/default.slideous templates/default.slidy templates/default.t2t templates/default.tei templates/default.texinfo templates/default.textile templates/default.typst templates/default.vimdoc templates/default.xwiki templates/default.zimwiki templates/document-metadata.latex templates/font-settings.latex templates/fonts.latex templates/hypersetup.latex templates/passoptions.latex templates/styles.citations.html templates/styles.html templates/template.typst translations/af.yaml translations/alt.yaml translations/am.yaml translations/ar.yaml translations/as.yaml translations/ast.yaml translations/az.yaml translations/be.yaml translations/bg.yaml translations/bn.yaml translations/bo.yaml translations/br.yaml translations/bs.yaml translations/bua.yaml translations/ca.yaml translations/ckb-Arab.yaml translations/ckb-Latn.yaml translations/cs.yaml translations/cu.yaml translations/cy.yaml translations/cz.yaml translations/da.yaml translations/de.yaml translations/dsb.yaml translations/el.yaml translations/en.yaml translations/eo.yaml translations/es-ES.yaml translations/es-MX.yaml translations/es.yaml translations/et.yaml translations/eu.yaml translations/fa.yaml translations/fi.yaml translations/fil.yaml translations/fr.yaml translations/fur.yaml translations/ga.yaml translations/gd.yaml translations/gl.yaml translations/grc.yaml translations/gu.yaml translations/ha.yaml translations/he.yaml translations/hi.yaml translations/hr.yaml translations/hsb.yaml translations/hu.yaml translations/hy.yaml translations/ia.yaml translations/id.yaml translations/is.yaml translations/it.yaml translations/ja.yaml translations/ka.yaml translations/km.yaml translations/kmr-Arab.yaml translations/kmr-Latn.yaml translations/kn.yaml translations/ko.yaml translations/la.yaml translations/lb.yaml translations/lo.yaml translations/lt.yaml translations/lv.yaml translations/mk.yaml translations/ml.yaml translations/mn.yaml translations/mr.yaml translations/ms.yaml translations/nb.yaml translations/nko.yaml translations/nl.yaml translations/nn.yaml translations/no.yaml translations/oc.yaml translations/or.yaml translations/pa.yaml translations/pl.yaml translations/pms.yaml translations/pt-BR.yaml translations/pt-PT.yaml translations/pt.yaml translations/rm.yaml translations/ro.yaml translations/ru.yaml translations/se.yaml translations/si.yaml translations/sk.yaml translations/sl.yaml translations/sq.yaml translations/sr-Cyrl.yaml translations/sr-Latn.yaml translations/sr.yaml translations/sv.yaml translations/ta.yaml translations/te.yaml translations/th.yaml translations/tk.yaml translations/tr.yaml translations/ua.yaml translations/ug.yaml translations/uk.yaml translations/ur.yaml translations/vi.yaml translations/zh-Hans.yaml translations/zh-Hant.yaml"
 complete -c pandoc -l print-highlight-style -d "Highlighting style" -r -a "pygments tango espresso zenburn kate monochrome breezedark haddock"
 complete -c pandoc -s v -l version -d "Print version"
diff --git a/test/command/fodt-roundtrip.md b/test/command/fodt-roundtrip.md
new file mode 100644
--- /dev/null
+++ b/test/command/fodt-roundtrip.md
@@ -0,0 +1,126 @@
+Round trips through the flat OpenDocument format.  The flat format has no
+zip structure, so a relative link is not rewritten, and an image is
+embedded as base64 in an `office:binary-data` element rather than being
+put in a `Pictures/` entry.
+
+```
+% pandoc -f markdown -t fodt | pandoc -f fodt -t native
+# A *heading*
+
+Inline $x^2$, display:
+
+$$y = 1$$
+
+| a | b |
+|---|---|
+| 1 | 2 |
+
+1. one
+2. two
+
+A footnote[^1] and a [relative link](foo/bar.html).
+
+[^1]: Note text.
+^D
+[ Header
+    1
+    ( "a-heading" , [] , [] )
+    [ Span ( "anchor" , [] , [] ) []
+    , Str "A"
+    , Space
+    , Emph [ Str "heading" ]
+    ]
+, Para
+    [ Str "Inline"
+    , Space
+    , Math DisplayMath "x^{2}"
+    , Str ","
+    , Space
+    , Str "display:"
+    ]
+, Para [ Math DisplayMath "y = 1" ]
+, Table
+    ( "" , [] , [] )
+    (Caption Nothing [])
+    [ ( AlignDefault , ColWidthDefault )
+    , ( AlignDefault , ColWidthDefault )
+    ]
+    (TableHead
+       ( "" , [] , [] )
+       [ Row
+           ( "" , [] , [] )
+           [ Cell
+               ( "" , [] , [] )
+               AlignDefault
+               (RowSpan 1)
+               (ColSpan 1)
+               [ Plain [ Strong [ Str "a" ] ] ]
+           , Cell
+               ( "" , [] , [] )
+               AlignDefault
+               (RowSpan 1)
+               (ColSpan 1)
+               [ Plain [ Strong [ Str "b" ] ] ]
+           ]
+       ])
+    [ TableBody
+        ( "" , [] , [] )
+        (RowHeadColumns 0)
+        []
+        [ Row
+            ( "" , [] , [] )
+            [ Cell
+                ( "" , [] , [] )
+                AlignDefault
+                (RowSpan 1)
+                (ColSpan 1)
+                [ Plain [ Str "1" ] ]
+            , Cell
+                ( "" , [] , [] )
+                AlignDefault
+                (RowSpan 1)
+                (ColSpan 1)
+                [ Plain [ Str "2" ] ]
+            ]
+        ]
+    ]
+    (TableFoot ( "" , [] , [] ) [])
+, OrderedList
+    ( 1 , Decimal , Period )
+    [ [ Plain [ Str "one" ] ] , [ Plain [ Str "two" ] ] ]
+, Para
+    [ Str "A"
+    , Space
+    , Str "footnote"
+    , Note [ Para [ Str "Note" , Space , Str "text." ] ]
+    , Space
+    , Str "and"
+    , Space
+    , Str "a"
+    , Space
+    , Link
+        ( "" , [] , [] )
+        [ Str "relative" , Space , Str "link" ]
+        ( "foo/bar.html" , "" )
+    , Str "."
+    ]
+]
+```
+
+The image data survives the base64 round trip.
+
+```
+% pandoc -f markdown -t fodt | pandoc -f fodt -t native
+![](lalune.jpg)
+^D
+[ Para
+    [ Image
+        ( ""
+        , []
+        , [ ( "width" , "150.0pt" ) , ( "height" , "150.0pt" ) ]
+        )
+        []
+        ( "Pictures/image1.jpg" , "" )
+    ]
+]
+```
diff --git a/test/command/opendocument-abstract.opendocument b/test/command/opendocument-abstract.opendocument
new file mode 100644
--- /dev/null
+++ b/test/command/opendocument-abstract.opendocument
@@ -0,0 +1,1 @@
+$abstract$
diff --git a/test/command/opendocument-body.opendocument b/test/command/opendocument-body.opendocument
new file mode 100644
--- /dev/null
+++ b/test/command/opendocument-body.opendocument
@@ -0,0 +1,1 @@
+$body$
diff --git a/test/command/opendocument-styles.md b/test/command/opendocument-styles.md
new file mode 100644
--- /dev/null
+++ b/test/command/opendocument-styles.md
@@ -0,0 +1,131 @@
+The `abstract` metadata field holds blocks, so it must be rendered
+with the block writer: previously it was flattened to inlines, which
+produced bare character data (not valid as a child of `office:text`)
+and dropped the `Abstract` style.
+
+```
+% pandoc -f markdown -t opendocument --template command/opendocument-abstract.opendocument
+---
+abstract: A one-line abstract.
+---
+
+Body.
+^D
+<text:p text:style-name="Abstract">A one-line abstract.</text:p>
+```
+
+A multi-paragraph abstract stays multi-paragraph:
+
+```
+% pandoc -f markdown -t opendocument --wrap=none --template command/opendocument-abstract.opendocument
+---
+abstract: |
+  First para.
+
+  Second para.
+---
+
+Body.
+^D
+<text:p text:style-name="Abstract">First para.</text:p><text:p text:style-name="Abstract">Second para.</text:p>
+```
+
+A requested paragraph style must also be applied to `Plain` blocks, not
+just to `Para`. The body of a caption-less figure is a `Plain`, so it
+should still get the `Figure` style:
+
+```
+% pandoc -f native -t opendocument --template command/opendocument-body.opendocument
+[Figure ("fig1",[],[]) (Caption Nothing []) [Plain [Str "placeholder"]]]
+^D
+<text:p text:style-name="Figure">placeholder</text:p>
+```
+
+Column style names must remain valid NCNames past the 26th column;
+incrementing a character code would run into `[`, `\`, etc.
+
+```
+% pandoc -f native -t opendocument --template command/opendocument-body.opendocument
+[Table ("",[],[]) (Caption Nothing [])
+ [(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)
+ ,(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault),(AlignDefault,ColWidthDefault)]
+ (TableHead ("",[],[]) [])
+ [(TableBody ("",[],[]) (RowHeadColumns 0) [] [])]
+ (TableFoot ("",[],[]) [])]
+^D
+<table:table table:name="Table1" table:style-name="Table1">
+  <table:table-column table:style-name="Table1.A" />
+  <table:table-column table:style-name="Table1.B" />
+  <table:table-column table:style-name="Table1.C" />
+  <table:table-column table:style-name="Table1.D" />
+  <table:table-column table:style-name="Table1.E" />
+  <table:table-column table:style-name="Table1.F" />
+  <table:table-column table:style-name="Table1.G" />
+  <table:table-column table:style-name="Table1.H" />
+  <table:table-column table:style-name="Table1.I" />
+  <table:table-column table:style-name="Table1.J" />
+  <table:table-column table:style-name="Table1.K" />
+  <table:table-column table:style-name="Table1.L" />
+  <table:table-column table:style-name="Table1.M" />
+  <table:table-column table:style-name="Table1.N" />
+  <table:table-column table:style-name="Table1.O" />
+  <table:table-column table:style-name="Table1.P" />
+  <table:table-column table:style-name="Table1.Q" />
+  <table:table-column table:style-name="Table1.R" />
+  <table:table-column table:style-name="Table1.S" />
+  <table:table-column table:style-name="Table1.T" />
+  <table:table-column table:style-name="Table1.U" />
+  <table:table-column table:style-name="Table1.V" />
+  <table:table-column table:style-name="Table1.W" />
+  <table:table-column table:style-name="Table1.X" />
+  <table:table-column table:style-name="Table1.Y" />
+  <table:table-column table:style-name="Table1.Z" />
+  <table:table-column table:style-name="Table1.AA" />
+</table:table>
+```
+
+A note nested inside another note must not reuse the outer note's
+`text:id`:
+
+```
+% pandoc -f markdown -t opendocument --wrap=none --template command/opendocument-body.opendocument
+Text^[outer^[inner]]^[second]
+^D
+<text:p text:style-name="Text_20_body">Text<text:note text:id="ftn0" text:note-class="footnote"><text:note-citation>1</text:note-citation><text:note-body><text:p text:style-name="Footnote">outer<text:note text:id="ftn1" text:note-class="footnote"><text:note-citation>2</text:note-citation><text:note-body><text:p text:style-name="Footnote">inner</text:p></text:note-body></text:note></text:p></text:note-body></text:note><text:note text:id="ftn2" text:note-class="footnote"><text:note-citation>3</text:note-citation><text:note-body><text:p text:style-name="Footnote">second</text:p></text:note-body></text:note></text:p>
+```
+
+Automatic text styles are declared in numerical order: sorting them by
+name would put `T10` between `T1` and `T2`.
+
+```
+% pandoc -f native -t opendocument --wrap=none --template command/11301-styles.opendocument
+[Para [SmallCaps [Str "a"]
+      ,SmallCaps [Strikeout [Str "b"]]
+      ,SmallCaps [Superscript [Str "c"]]
+      ,SmallCaps [Subscript [Str "d"]]
+      ,SmallCaps [Underline [Str "e"]]
+      ,Strikeout [Superscript [Str "f"]]
+      ,Strikeout [Subscript [Str "g"]]
+      ,Strikeout [Underline [Str "h"]]
+      ,Underline [Superscript [Str "i"]]
+      ,Underline [Subscript [Str "j"]]]]
+^D
+<style:style style:name="T1" style:family="text"><style:text-properties fo:font-variant="small-caps" /></style:style>
+<style:style style:name="T2" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-line-through-style="solid" /></style:style>
+<style:style style:name="T3" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-position="super 58%" /></style:style>
+<style:style style:name="T4" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-position="sub 58%" /></style:style>
+<style:style style:name="T5" style:family="text"><style:text-properties fo:font-variant="small-caps" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>
+<style:style style:name="T6" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-position="super 58%" /></style:style>
+<style:style style:name="T7" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-position="sub 58%" /></style:style>
+<style:style style:name="T8" style:family="text"><style:text-properties style:text-line-through-style="solid" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>
+<style:style style:name="T9" style:family="text"><style:text-properties style:text-position="super 58%" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>
+<style:style style:name="T10" style:family="text"><style:text-properties style:text-position="sub 58%" style:text-underline-color="font-color" style:text-underline-style="solid" style:text-underline-width="auto" /></style:style>
+<style:style style:name="fr2" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="center" style:horizontal-rel="paragraph-content" style:wrap="none" /></style:style>
+<style:style style:name="fr1" style:family="graphic" style:parent-style-name="Formula"><style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" /></style:style>
+<text:p text:style-name="Text_20_body"><text:span text:style-name="T1">a</text:span><text:span text:style-name="T2">b</text:span><text:span text:style-name="T3">c</text:span><text:span text:style-name="T4">d</text:span><text:span text:style-name="T5">e</text:span><text:span text:style-name="T6">f</text:span><text:span text:style-name="T7">g</text:span><text:span text:style-name="T8">h</text:span><text:span text:style-name="T9">i</text:span><text:span text:style-name="T10">j</text:span></text:p>
+```
diff --git a/test/command/pandoc-citeproc-77.md b/test/command/pandoc-citeproc-77.md
--- a/test/command/pandoc-citeproc-77.md
+++ b/test/command/pandoc-citeproc-77.md
@@ -1,3 +1,6 @@
+Note: pandoc no longer parses particles out of names (see #11911).
+This test is left to confirm the new behavior.
+
 ```
 % pandoc --citeproc -t markdown-citations
 ---
@@ -41,7 +44,7 @@
 
 :::::::: {#refs .references .csl-bib-body .hanging-indent entry-spacing="0"}
 ::: {#ref-item4 .csl-entry}
-Bennett, Frank G., Jr., n.d.
+Bennett, Frank G.,! Jr., n.d.
 :::
 
 ::: {#ref-item1 .csl-entry}
@@ -52,16 +55,16 @@
 Dumboldt, Ezekiel, III, n.d.
 :::
 
-::: {#ref-item2 .csl-entry}
-Gogh, Vincent van, n.d.
-:::
-
 ::: {#ref-item3 .csl-entry}
 Humboldt, Alexander von, n.d.
 :::
+
+::: {#ref-item2 .csl-entry}
+[van Gogh, Vincent]{.nocase}, n.d.
+:::
 ::::::::
 
-[^1]: John Doe III, n.d.; Vincent van Gogh, n.d.; Alexander von
-    Humboldt, n.d.; Frank G. Bennett, Jr., n.d.; Ezekiel Dumboldt III,
-    n.d.
+[^1]: John, III Doe, n.d.; [Vincent van Gogh]{.nocase}, n.d.; Alexander
+    von Humboldt, n.d.; Frank G.,! Jr. Bennett, n.d.; Ezekiel, III
+    Dumboldt, n.d.
 ```
diff --git a/test/docx/double_strikeout.docx b/test/docx/double_strikeout.docx
new file mode 100644
Binary files /dev/null and b/test/docx/double_strikeout.docx differ
diff --git a/test/docx/double_strikeout.native b/test/docx/double_strikeout.native
new file mode 100644
--- /dev/null
+++ b/test/docx/double_strikeout.native
@@ -0,0 +1,68 @@
+Pandoc
+  Meta { unMeta = fromList [] }
+  [ Para
+      [ Str "This"
+      , Space
+      , Str "is"
+      , Space
+      , Strikeout [ Str "single" , Space , Str "strikethrough" ]
+      , Str ","
+      , Space
+      , Str "and"
+      , Space
+      , Str "this"
+      , Space
+      , Str "is"
+      , Space
+      , Strikeout [ Str "double" , Space , Str "strikethrough" ]
+      , Str "."
+      ]
+  , Para
+      [ Str "A"
+      , Space
+      , Str "character"
+      , Space
+      , Str "style"
+      , Space
+      , Str "can"
+      , Space
+      , Strikeout
+          [ Str "strike" , Space , Str "this" , Space , Str "out," ]
+      , Space
+      , Str "cancel"
+      , Space
+      , Str "this,"
+      , Space
+      , Strikeout
+          [ Str "or"
+          , Space
+          , Str "strike"
+          , Space
+          , Str "this"
+          , Space
+          , Str "out"
+          , Space
+          , Str "twice"
+          ]
+      , Str "."
+      ]
+  , Para
+      [ Str "This"
+      , Space
+      , Str "is"
+      , Space
+      , Strikeout
+          [ Str "double-strikethrough,"
+          , Space
+          , Str "overridden"
+          , Space
+          , Str "to"
+          , Space
+          , Str "single,"
+          , Space
+          , Str "and"
+          ]
+      , Space
+      , Str "cancelled."
+      ]
+  ]
diff --git a/test/docx/golden/block_quotes.docx b/test/docx/golden/block_quotes.docx
Binary files a/test/docx/golden/block_quotes.docx and b/test/docx/golden/block_quotes.docx differ
diff --git a/test/docx/golden/codeblock.docx b/test/docx/golden/codeblock.docx
Binary files a/test/docx/golden/codeblock.docx and b/test/docx/golden/codeblock.docx differ
diff --git a/test/docx/golden/comments.docx b/test/docx/golden/comments.docx
Binary files a/test/docx/golden/comments.docx and b/test/docx/golden/comments.docx differ
diff --git a/test/docx/golden/csl_bibliography.docx b/test/docx/golden/csl_bibliography.docx
Binary files a/test/docx/golden/csl_bibliography.docx and b/test/docx/golden/csl_bibliography.docx differ
diff --git a/test/docx/golden/custom_style_no_reference.docx b/test/docx/golden/custom_style_no_reference.docx
Binary files a/test/docx/golden/custom_style_no_reference.docx and b/test/docx/golden/custom_style_no_reference.docx differ
diff --git a/test/docx/golden/custom_style_preserve.docx b/test/docx/golden/custom_style_preserve.docx
Binary files a/test/docx/golden/custom_style_preserve.docx and b/test/docx/golden/custom_style_preserve.docx differ
diff --git a/test/docx/golden/definition_list.docx b/test/docx/golden/definition_list.docx
Binary files a/test/docx/golden/definition_list.docx and b/test/docx/golden/definition_list.docx differ
diff --git a/test/docx/golden/document-properties-short-desc.docx b/test/docx/golden/document-properties-short-desc.docx
Binary files a/test/docx/golden/document-properties-short-desc.docx and b/test/docx/golden/document-properties-short-desc.docx differ
diff --git a/test/docx/golden/document-properties.docx b/test/docx/golden/document-properties.docx
Binary files a/test/docx/golden/document-properties.docx and b/test/docx/golden/document-properties.docx differ
diff --git a/test/docx/golden/headers.docx b/test/docx/golden/headers.docx
Binary files a/test/docx/golden/headers.docx and b/test/docx/golden/headers.docx differ
diff --git a/test/docx/golden/image.docx b/test/docx/golden/image.docx
Binary files a/test/docx/golden/image.docx and b/test/docx/golden/image.docx differ
diff --git a/test/docx/golden/inline_code.docx b/test/docx/golden/inline_code.docx
Binary files a/test/docx/golden/inline_code.docx and b/test/docx/golden/inline_code.docx differ
diff --git a/test/docx/golden/inline_formatting.docx b/test/docx/golden/inline_formatting.docx
Binary files a/test/docx/golden/inline_formatting.docx and b/test/docx/golden/inline_formatting.docx differ
diff --git a/test/docx/golden/inline_images.docx b/test/docx/golden/inline_images.docx
Binary files a/test/docx/golden/inline_images.docx and b/test/docx/golden/inline_images.docx differ
diff --git a/test/docx/golden/link_in_notes.docx b/test/docx/golden/link_in_notes.docx
Binary files a/test/docx/golden/link_in_notes.docx and b/test/docx/golden/link_in_notes.docx differ
diff --git a/test/docx/golden/links.docx b/test/docx/golden/links.docx
Binary files a/test/docx/golden/links.docx and b/test/docx/golden/links.docx differ
diff --git a/test/docx/golden/lists.docx b/test/docx/golden/lists.docx
Binary files a/test/docx/golden/lists.docx and b/test/docx/golden/lists.docx differ
diff --git a/test/docx/golden/lists_9994.docx b/test/docx/golden/lists_9994.docx
Binary files a/test/docx/golden/lists_9994.docx and b/test/docx/golden/lists_9994.docx differ
diff --git a/test/docx/golden/lists_continuing.docx b/test/docx/golden/lists_continuing.docx
Binary files a/test/docx/golden/lists_continuing.docx and b/test/docx/golden/lists_continuing.docx differ
diff --git a/test/docx/golden/lists_div_bullets.docx b/test/docx/golden/lists_div_bullets.docx
Binary files a/test/docx/golden/lists_div_bullets.docx and b/test/docx/golden/lists_div_bullets.docx differ
diff --git a/test/docx/golden/lists_multiple_initial.docx b/test/docx/golden/lists_multiple_initial.docx
Binary files a/test/docx/golden/lists_multiple_initial.docx and b/test/docx/golden/lists_multiple_initial.docx differ
diff --git a/test/docx/golden/lists_restarting.docx b/test/docx/golden/lists_restarting.docx
Binary files a/test/docx/golden/lists_restarting.docx and b/test/docx/golden/lists_restarting.docx differ
diff --git a/test/docx/golden/mark_math.docx b/test/docx/golden/mark_math.docx
new file mode 100644
Binary files /dev/null and b/test/docx/golden/mark_math.docx differ
diff --git a/test/docx/golden/nested_anchors_in_header.docx b/test/docx/golden/nested_anchors_in_header.docx
Binary files a/test/docx/golden/nested_anchors_in_header.docx and b/test/docx/golden/nested_anchors_in_header.docx differ
diff --git a/test/docx/golden/notes.docx b/test/docx/golden/notes.docx
Binary files a/test/docx/golden/notes.docx and b/test/docx/golden/notes.docx differ
diff --git a/test/docx/golden/raw-blocks.docx b/test/docx/golden/raw-blocks.docx
Binary files a/test/docx/golden/raw-blocks.docx and b/test/docx/golden/raw-blocks.docx differ
diff --git a/test/docx/golden/raw-bookmarks.docx b/test/docx/golden/raw-bookmarks.docx
Binary files a/test/docx/golden/raw-bookmarks.docx and b/test/docx/golden/raw-bookmarks.docx differ
diff --git a/test/docx/golden/table_one_row.docx b/test/docx/golden/table_one_row.docx
Binary files a/test/docx/golden/table_one_row.docx and b/test/docx/golden/table_one_row.docx differ
diff --git a/test/docx/golden/table_with_list_cell.docx b/test/docx/golden/table_with_list_cell.docx
Binary files a/test/docx/golden/table_with_list_cell.docx and b/test/docx/golden/table_with_list_cell.docx differ
diff --git a/test/docx/golden/tables-default-widths.docx b/test/docx/golden/tables-default-widths.docx
Binary files a/test/docx/golden/tables-default-widths.docx and b/test/docx/golden/tables-default-widths.docx differ
diff --git a/test/docx/golden/tables.docx b/test/docx/golden/tables.docx
Binary files a/test/docx/golden/tables.docx and b/test/docx/golden/tables.docx differ
diff --git a/test/docx/golden/tables_separated_with_rawblock.docx b/test/docx/golden/tables_separated_with_rawblock.docx
Binary files a/test/docx/golden/tables_separated_with_rawblock.docx and b/test/docx/golden/tables_separated_with_rawblock.docx differ
diff --git a/test/docx/golden/task_list.docx b/test/docx/golden/task_list.docx
Binary files a/test/docx/golden/task_list.docx and b/test/docx/golden/task_list.docx differ
diff --git a/test/docx/golden/track_changes_deletion.docx b/test/docx/golden/track_changes_deletion.docx
Binary files a/test/docx/golden/track_changes_deletion.docx and b/test/docx/golden/track_changes_deletion.docx differ
diff --git a/test/docx/golden/track_changes_insertion.docx b/test/docx/golden/track_changes_insertion.docx
Binary files a/test/docx/golden/track_changes_insertion.docx and b/test/docx/golden/track_changes_insertion.docx differ
diff --git a/test/docx/golden/track_changes_move.docx b/test/docx/golden/track_changes_move.docx
Binary files a/test/docx/golden/track_changes_move.docx and b/test/docx/golden/track_changes_move.docx differ
diff --git a/test/docx/golden/track_changes_scrubbed_metadata.docx b/test/docx/golden/track_changes_scrubbed_metadata.docx
Binary files a/test/docx/golden/track_changes_scrubbed_metadata.docx and b/test/docx/golden/track_changes_scrubbed_metadata.docx differ
diff --git a/test/docx/golden/unicode.docx b/test/docx/golden/unicode.docx
Binary files a/test/docx/golden/unicode.docx and b/test/docx/golden/unicode.docx differ
diff --git a/test/docx/golden/verbatim_subsuper.docx b/test/docx/golden/verbatim_subsuper.docx
Binary files a/test/docx/golden/verbatim_subsuper.docx and b/test/docx/golden/verbatim_subsuper.docx differ
diff --git a/test/docx/mark_math.native b/test/docx/mark_math.native
new file mode 100644
--- /dev/null
+++ b/test/docx/mark_math.native
@@ -0,0 +1,12 @@
+[ Para
+    [ Span
+        ( "" , [ "mark" ] , [] )
+        [ Str "a " , Math InlineMath "x^2" , Str " b" ]
+    ]
+, Para
+    [ Span ( "" , [ "mark" ] , [] ) [ Math DisplayMath "z = 1" ] ]
+, Para [ Span ( "" , [ "mark" ] , [] ) [ Math InlineMath "\\hat{x}" ] ]
+, Para [ Span ( "" , [ "mark" ] , [] )
+  [ Math InlineMath "\\sin x + \\sum_{i=1}^n i + \\frac{a}{b} + \\sqrt[3]{x}" ] ]
+, Para [ Str "unmarked " , Math InlineMath "x^2" , Str " math" ]
+]
diff --git a/test/docx/track_changes_edge_spaces.docx b/test/docx/track_changes_edge_spaces.docx
new file mode 100644
Binary files /dev/null and b/test/docx/track_changes_edge_spaces.docx differ
diff --git a/test/docx/track_changes_edge_spaces_accept.native b/test/docx/track_changes_edge_spaces_accept.native
new file mode 100644
--- /dev/null
+++ b/test/docx/track_changes_edge_spaces_accept.native
@@ -0,0 +1,4 @@
+[Para [Str "start-ups",Space,Str "grow."]
+,Para [Str "adog"]
+,Para [Str "the",Space,Str "new."]
+,Para [Str "an",Space,Emph [Str "italic"],Space,Str "word."]]
diff --git a/test/docx/track_changes_edge_spaces_all.native b/test/docx/track_changes_edge_spaces_all.native
new file mode 100644
--- /dev/null
+++ b/test/docx/track_changes_edge_spaces_all.native
@@ -0,0 +1,4 @@
+[Para [Str "start-up",Span ("",["deletion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Str "entry"],Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Str "s"],Space,Str "grow."]
+,Para [Str "a",Span ("",["deletion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Str "big",Space],Str "dog"]
+,Para [Str "the",Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Str "new"],Str "."]
+,Para [Str "an",Span ("",["insertion"],[("author","eng-dept"),("date","2026-09-25T10:00:00Z")]) [Space,Emph [Str "italic"]],Space,Str "word."]]
diff --git a/test/docx/track_changes_edge_spaces_reject.native b/test/docx/track_changes_edge_spaces_reject.native
new file mode 100644
--- /dev/null
+++ b/test/docx/track_changes_edge_spaces_reject.native
@@ -0,0 +1,4 @@
+[Para [Str "start-up",Space,Str "entry",Space,Str "grow."]
+,Para [Str "abig",Space,Str "dog"]
+,Para [Str "the."]
+,Para [Str "an",Space,Str "word."]]
diff --git a/test/docx/track_changes_insertion_all.native b/test/docx/track_changes_insertion_all.native
--- a/test/docx/track_changes_insertion_all.native
+++ b/test/docx/track_changes_insertion_all.native
@@ -1,1 +1,1 @@
-[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "text",Space,Str "with",Space,Span ("",["insertion"],[("author","eng-dept"),("date","2014-06-25T10:40:00Z")]) [Str "two",Space,Str "exciting"],Space,Str "insertions."]]
+[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "text",Space,Str "with",Space,Span ("",["insertion"],[("author","eng-dept"),("date","2014-06-25T10:40:00Z")]) [Str "two",Space,Str "exciting",Space],Str "insertions."]]
diff --git a/test/odt/fodt-native/image.native b/test/odt/fodt-native/image.native
new file mode 100644
--- /dev/null
+++ b/test/odt/fodt-native/image.native
@@ -0,0 +1,1 @@
+[Para [Image ("",[],[("width","2.0835in"),("height","2.0835in")]) [] ("Pictures/image1.jpg","")]]
diff --git a/test/odt/fodt/formula.fodt b/test/odt/fodt/formula.fodt
new file mode 100644
--- /dev/null
+++ b/test/odt/fodt/formula.fodt
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:initial-creator>Martin Linnemann</meta:initial-creator><meta:creation-date>2015-03-01T17:26:12.31</meta:creation-date><dc:date>2015-03-01T18:07:27.67</dc:date><dc:creator>Martin Linnemann</dc:creator><meta:editing-duration>PT10M3S</meta:editing-duration><meta:editing-cycles>2</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="1" meta:page-count="1" meta:paragraph-count="1" meta:word-count="0" meta:character-count="1"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss"/>
+  <style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Mangal" svg:font-family="Mangal"/>
+  <style:font-face style:name="Mangal1" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="OpenSymbol" svg:font-family="OpenSymbol"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Lucida Sans Unicode" style:font-family-asian="&apos;Lucida Sans Unicode&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Mangal1" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>
+  </style:style>
+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">
+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">
+   <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold" style:font-size-asian="14pt" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-style-complex="italic" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+  </style:style>
+  <style:style style:name="Table_20_Heading" style:display-name="Table Heading" style:family="paragraph" style:parent-style-name="Table_20_Contents" style:class="extra">
+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Footnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="Index_20_Heading" style:display-name="Index Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Bibliography_20_Heading" style:display-name="Bibliography Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Bibliography_20_1" style:display-name="Bibliography 1" style:family="paragraph" style:parent-style-name="Index" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false">
+    <style:tab-stops>
+     <style:tab-stop style:position="6.6929in" style:type="right" style:leader-style="dotted" style:leader-text="."/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+  <style:style style:name="Endnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="Bullet_20_Symbols" style:display-name="Bullet Symbols" style:family="text">
+   <style:text-properties style:font-name="OpenSymbol" fo:font-family="OpenSymbol" style:font-name-asian="OpenSymbol" style:font-family-asian="OpenSymbol" style:font-name-complex="OpenSymbol" style:font-family-complex="OpenSymbol"/>
+  </style:style>
+  <style:style style:name="Numbering_20_Symbols" style:display-name="Numbering Symbols" style:family="text"/>
+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">
+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>
+  </style:style>
+  <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote Symbol" style:family="text"/>
+  <style:style style:name="Footnote_20_anchor" style:display-name="Footnote anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote Symbol" style:family="text"/>
+  <style:style style:name="Endnote_20_anchor" style:display-name="Endnote anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <style:style style:name="OLE" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Formula" style:family="graphic">
+   <style:graphic-properties text:anchor-type="as-char" svg:y="0in" fo:margin-left="0.0791in" fo:margin-right="0.0791in" style:vertical-pos="middle" style:vertical-rel="text" draw:fill="none"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:list-style style:name="Numbering_20_1" style:display-name="Numbering 1">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3937in" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5902in" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9839in" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.378in" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5752in" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7717in" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.9689in" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_2" style:display-name="Numbering 2">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3929in" fo:text-indent="-0.1965in" fo:margin-left="0.3929in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7866in" fo:text-indent="-0.3937in" fo:margin-left="0.7866in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2791in" fo:text-indent="-0.4925in" fo:margin-left="1.2791in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.8693in" fo:text-indent="-0.5902in" fo:margin-left="1.8693in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.5783in" fo:text-indent="-0.7091in" fo:margin-left="2.5783in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.4839in" fo:text-indent="-0.9055in" fo:margin-left="3.4839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.5075in" fo:text-indent="-1.0236in" fo:margin-left="4.5075in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.6102in" fo:text-indent="-1.1028in" fo:margin-left="5.6102in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="6.8311in" fo:text-indent="-1.2209in" fo:margin-left="6.8311in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_3" style:display-name="Numbering 3">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-1.1811in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.3626in" fo:text-indent="-1.1811in" fo:margin-left="2.3626in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.5437in" fo:text-indent="-1.1811in" fo:margin-left="3.5437in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.7252in" fo:text-indent="-1.1811in" fo:margin-left="4.7252in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.9063in" fo:text-indent="-1.1811in" fo:margin-left="5.9063in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="7.0874in" fo:text-indent="-1.1811in" fo:margin-left="7.0874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="8.2689in" fo:text-indent="-1.1811in" fo:margin-left="8.2689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="9.45in" fo:text-indent="-1.1811in" fo:margin-left="9.45in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="10.6311in" fo:text-indent="-1.1811in" fo:margin-left="10.6311in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="11.8126in" fo:text-indent="-1.1811in" fo:margin-left="11.8126in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_4" style:display-name="Numbering 4">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_5" style:display-name="Numbering 5">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1575in" fo:text-indent="-0.1575in" fo:margin-left="0.1575in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%.%2%." style:num-suffix="." style:num-format="1" text:display-levels="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4335in" fo:text-indent="-0.2563in" fo:margin-left="0.4335in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%)" style:num-suffix=")" style:num-format="a">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6102in" fo:text-indent="-0.1772in" fo:margin-left="0.6102in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-bullet text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1555in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9429in" fo:text-indent="-0.1555in" fo:margin-left="0.9429in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.0984in" fo:text-indent="-0.1555in" fo:margin-left="1.0984in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2543in" fo:text-indent="-0.1555in" fo:margin-left="1.2543in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.4098in" fo:text-indent="-0.1555in" fo:margin-left="1.4098in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5654in" fo:text-indent="-0.1555in" fo:margin-left="1.5654in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7209in" fo:text-indent="-0.1555in" fo:margin-left="1.7209in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+  </text:list-style>
+  <text:notes-configuration text:note-class="footnote" text:citation-style-name="Footnote_20_Symbol" text:citation-body-style-name="Footnote_20_anchor" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" text:citation-style-name="Endnote_20_Symbol" text:citation-body-style-name="Endnote_20_anchor" text:master-page-name="Endnote" style:num-format="i" text:start-value="0"/>
+  <text:bibliography-configuration text:prefix="[" text:suffix="]" text:sort-algorithm="alphanumeric" fo:language="en" fo:country="US"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>
+  <loext:theme loext:name="Office">
+   <loext:theme-colors loext:name="LibreOffice">
+    <loext:color loext:name="dark1" loext:color="#000000"/>
+    <loext:color loext:name="light1" loext:color="#ffffff"/>
+    <loext:color loext:name="dark2" loext:color="#000000"/>
+    <loext:color loext:name="light2" loext:color="#ffffff"/>
+    <loext:color loext:name="accent1" loext:color="#18a303"/>
+    <loext:color loext:name="accent2" loext:color="#0369a3"/>
+    <loext:color loext:name="accent3" loext:color="#a33e03"/>
+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>
+    <loext:color loext:name="accent5" loext:color="#c99c00"/>
+    <loext:color loext:name="accent6" loext:color="#c9211e"/>
+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>
+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
+   </loext:theme-colors>
+  </loext:theme>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Formula">
+   <style:graphic-properties style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="from-left" style:horizontal-rel="paragraph-content" draw:ole-draw-aspect="1"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:page-layout style:name="pm2">
+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="Standard"><draw:frame draw:style-name="fr1" draw:name="Objekt1" text:anchor-type="as-char" svg:width="0.6602in" svg:height="0.2075in" draw:z-index="0"><draw:object>
+      <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
+       <semantics>
+        <mrow>
+         <mi>E</mi>
+         <mo stretchy="false">=</mo>
+         <mrow>
+          <mi>m</mi>
+          <mo stretchy="false">⋅</mo>
+          <msup>
+           <mi>c</mi>
+           <mn>2</mn>
+          </msup>
+         </mrow>
+        </mrow>
+        <annotation encoding="StarMath 5.0">E = m cdot c^2</annotation>
+       </semantics>
+      </math>
+     </draw:object><draw:image>
+      <office:binary-data>VkNMTVRGAQAxAAAAAAAAAAEAGwAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAY0GAAAQ
+       AgAAMgAAAJYAAQACAAAACQCLAAEAAgAAAP//gQABABAAAAAAAAAAAAAAAIwGAAAPAgAAlQAB
+       AAQAAAAAAAAAlgABAAIAAAAJAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3
+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA
+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAAIQAAADCAQAAAQBF
+       AgEAAAAAAQABAEUAjAABAAAAAACLAAEAAgAAAB8AigABAEIAAAAFADwAAAAKAE9wZW5TeW1i
+       b2wAAAAAAACmAQAA//8AAAAABQAAAAAAAAD/AwAAAAAAAAAAAP8DAAAAAAAAAAAAAACIAAEA
+       AgAAAAEAhwABAAUAAAD/////AIYAAQAEAAAAAAAAAHIAAgAaAAAApwEAAMIBAAABAAAAPQBP
+       AQAAAAABAAEAPQCMAAEAAAAAAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3
+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA
+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAABoDAADCAQAAAQBt
+       MQEAAAAAAQABAG0AjAABAAAAAACLAAEAAgAAAB8AigABAEIAAAAFADwAAAAKAE9wZW5TeW1i
+       b2wAAAAAAACmAQAA//8AAAAABQAAAAAAAAD/AwAAAAAAAAAAAP8DAAAAAAAAAAAAAACIAAEA
+       AgAAAAEAhwABAAUAAAD/////AIYAAQAEAAAAAAAAAHIAAgAaAAAACAQAAMIBAAABAAAAxSL0
+       AAAAAAABAAEAxSKMAAEAAAAAAIsAAQACAAAAHwCKAAEARwAAAAUAQQAAAA8AVGltZXMgTmV3
+       IFJvbWFuAAAAAAAApgEAAAAAAwAAAAUAAAAAAAIA/wMAAAAAAAAAAAD/AwAAAAAAAAAAAAAA
+       iAABAAIAAAABAIcAAQAFAAAA/////wCGAAEABAAAAAAAAAByAAIAFwAAANwEAADCAQAAAQBj
+       uwAAAAAAAQABAGMAjAABAAAAAACLAAEAAgAAAB8AigABAEcAAAAFAEEAAAAPAFRpbWVzIE5l
+       dyBSb21hbgAAAAAAAP0AAAAAAAMAAAAFAAAAAAAAAP8DAAAAAAAAAAAA/wMAAAAAAAAAAAAA
+       AIgAAQACAAAAAQCHAAEABQAAAP////8AhgABAAQAAAAAAAAAcgACABcAAACvBQAA7gAAAAEA
+       Mn8AAAAAAAEAAQAyAIwAAQAAAAAAlQABAAQAAAAAAAAAlgABAAIAAAAJAIwAAQAAAAAA
+      </office:binary-data>
+     </draw:image>
+    </draw:frame></text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/test/odt/fodt/image.fodt b/test/odt/fodt/image.fodt
new file mode 100644
--- /dev/null
+++ b/test/odt/fodt/image.fodt
@@ -0,0 +1,793 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:initial-creator>Martin Linnemann</meta:initial-creator><meta:creation-date>2015-03-01T17:26:12.31</meta:creation-date><dc:date>2015-03-01T18:20:30.92</dc:date><dc:creator>Martin Linnemann</dc:creator><meta:editing-duration>PT10M3S</meta:editing-duration><meta:editing-cycles>2</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="1" meta:object-count="0" meta:page-count="1" meta:paragraph-count="0" meta:word-count="0" meta:character-count="0"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Calibri" svg:font-family="Calibri" style:font-family-generic="swiss"/>
+  <style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Mangal" svg:font-family="Mangal"/>
+  <style:font-face style:name="Mangal1" svg:font-family="Mangal" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="OpenSymbol" svg:font-family="OpenSymbol"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#808080" draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Calibri" fo:font-size="12pt" fo:language="de" fo:country="DE" style:letter-kerning="true" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Mangal1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Arial" fo:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Lucida Sans Unicode" style:font-family-asian="&apos;Lucida Sans Unicode&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Mangal1" style:font-family-complex="Mangal" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Mangal" style:font-family-complex="Mangal" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-name="Calibri" fo:font-family="Calibri" style:font-family-generic="swiss" style:font-name-complex="Mangal" style:font-family-complex="Mangal"/>
+  </style:style>
+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">
+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">
+   <style:text-properties fo:font-size="14pt" fo:font-style="italic" fo:font-weight="bold" style:font-size-asian="14pt" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-size-complex="14pt" style:font-style-complex="italic" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+  </style:style>
+  <style:style style:name="Table_20_Heading" style:display-name="Table Heading" style:family="paragraph" style:parent-style-name="Table_20_Contents" style:class="extra">
+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-weight="bold" style:font-weight-asian="bold" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Footnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="Index_20_Heading" style:display-name="Index Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Bibliography_20_Heading" style:display-name="Bibliography Heading" style:family="paragraph" style:parent-style-name="Heading" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="16pt" fo:font-weight="bold" style:font-size-asian="16pt" style:font-weight-asian="bold" style:font-size-complex="16pt" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Bibliography_20_1" style:display-name="Bibliography 1" style:family="paragraph" style:parent-style-name="Index" style:class="index">
+   <style:paragraph-properties fo:margin-left="0in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false">
+    <style:tab-stops>
+     <style:tab-stop style:position="6.6929in" style:type="right" style:leader-style="dotted" style:leader-text="."/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+  <style:style style:name="Endnote" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-left="0.1965in" fo:margin-right="0in" fo:text-indent="-0.1965in" style:auto-text-indent="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="Bullet_20_Symbols" style:display-name="Bullet Symbols" style:family="text">
+   <style:text-properties style:font-name="OpenSymbol" fo:font-family="OpenSymbol" style:font-name-asian="OpenSymbol" style:font-family-asian="OpenSymbol" style:font-name-complex="OpenSymbol" style:font-family-complex="OpenSymbol"/>
+  </style:style>
+  <style:style style:name="Numbering_20_Symbols" style:display-name="Numbering Symbols" style:family="text"/>
+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">
+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>
+  </style:style>
+  <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote Symbol" style:family="text"/>
+  <style:style style:name="Footnote_20_anchor" style:display-name="Footnote anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote Symbol" style:family="text"/>
+  <style:style style:name="Endnote_20_anchor" style:display-name="Endnote anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <style:style style:name="OLE" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Formula" style:family="graphic">
+   <style:graphic-properties text:anchor-type="as-char" svg:y="0in" fo:margin-left="0.0791in" fo:margin-right="0.0791in" style:vertical-pos="middle" style:vertical-rel="text" draw:fill="none"/>
+  </style:style>
+  <style:style style:name="Graphics" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:list-style style:name="Numbering_20_1" style:display-name="Numbering 1">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3937in" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5902in" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9839in" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.378in" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5752in" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7717in" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.9689in" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_2" style:display-name="Numbering 2">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1965in" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3929in" fo:text-indent="-0.1965in" fo:margin-left="0.3929in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7866in" fo:text-indent="-0.3937in" fo:margin-left="0.7866in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2791in" fo:text-indent="-0.4925in" fo:margin-left="1.2791in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.8693in" fo:text-indent="-0.5902in" fo:margin-left="1.8693in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.5783in" fo:text-indent="-0.7091in" fo:margin-left="2.5783in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.4839in" fo:text-indent="-0.9055in" fo:margin-left="3.4839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.5075in" fo:text-indent="-1.0236in" fo:margin-left="4.5075in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.6102in" fo:text-indent="-1.1028in" fo:margin-left="5.6102in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="6.8311in" fo:text-indent="-1.2209in" fo:margin-left="6.8311in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_3" style:display-name="Numbering 3">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%" style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1811in" fo:text-indent="-1.1811in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%" style:num-format="1" text:start-value="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="2.3626in" fo:text-indent="-1.1811in" fo:margin-left="2.3626in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%" style:num-format="1" text:start-value="3">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="3.5437in" fo:text-indent="-1.1811in" fo:margin-left="3.5437in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" style:num-format="1" text:start-value="4">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="4.7252in" fo:text-indent="-1.1811in" fo:margin-left="4.7252in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" style:num-format="1" text:start-value="5">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="5.9063in" fo:text-indent="-1.1811in" fo:margin-left="5.9063in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" style:num-format="1" text:start-value="6">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="7.0874in" fo:text-indent="-1.1811in" fo:margin-left="7.0874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" style:num-format="1" text:start-value="7">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="8.2689in" fo:text-indent="-1.1811in" fo:margin-left="8.2689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" style:num-format="1" text:start-value="8">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="9.45in" fo:text-indent="-1.1811in" fo:margin-left="9.45in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" style:num-format="1" text:start-value="9">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="10.6311in" fo:text-indent="-1.1811in" fo:margin-left="10.6311in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" style:num-format="1" text:start-value="10">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="11.8126in" fo:text-indent="-1.1811in" fo:margin-left="11.8126in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_4" style:display-name="Numbering 4">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.1965in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%2%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.3937in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.5902in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="0.9839in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.1811in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.378in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.5752in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.7717in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%." style:num-suffix="." style:num-format="I">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="space" fo:text-indent="-0.1965in" fo:margin-left="1.9689in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:list-style style:name="Numbering_20_5" style:display-name="Numbering 5">
+   <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%." style:num-suffix="." style:num-format="1">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.1575in" fo:text-indent="-0.1575in" fo:margin-left="0.1575in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" text:style-name="Numbering_20_Symbols" loext:num-list-format="%1%.%2%." style:num-suffix="." style:num-format="1" text:display-levels="2">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4335in" fo:text-indent="-0.2563in" fo:margin-left="0.4335in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" text:style-name="Numbering_20_Symbols" loext:num-list-format="%3%)" style:num-suffix=")" style:num-format="a">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6102in" fo:text-indent="-0.1772in" fo:margin-left="0.6102in"/>
+    </style:list-level-properties>
+   </text:list-level-style-number>
+   <text:list-level-style-bullet text:level="4" text:style-name="Numbering_20_Symbols" loext:num-list-format="%4%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7874in" fo:text-indent="-0.1555in" fo:margin-left="0.7874in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="5" text:style-name="Numbering_20_Symbols" loext:num-list-format="%5%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9429in" fo:text-indent="-0.1555in" fo:margin-left="0.9429in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="6" text:style-name="Numbering_20_Symbols" loext:num-list-format="%6%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.0984in" fo:text-indent="-0.1555in" fo:margin-left="1.0984in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="7" text:style-name="Numbering_20_Symbols" loext:num-list-format="%7%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2543in" fo:text-indent="-0.1555in" fo:margin-left="1.2543in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="8" text:style-name="Numbering_20_Symbols" loext:num-list-format="%8%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.4098in" fo:text-indent="-0.1555in" fo:margin-left="1.4098in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="9" text:style-name="Numbering_20_Symbols" loext:num-list-format="%9%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.5654in" fo:text-indent="-0.1555in" fo:margin-left="1.5654in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+   <text:list-level-style-bullet text:level="10" text:style-name="Numbering_20_Symbols" loext:num-list-format="%10%" text:bullet-char="•">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.7209in" fo:text-indent="-0.1555in" fo:margin-left="1.7209in"/>
+    </style:list-level-properties>
+    <style:text-properties style:font-name="OpenSymbol"/>
+   </text:list-level-style-bullet>
+  </text:list-style>
+  <text:notes-configuration text:note-class="footnote" text:citation-style-name="Footnote_20_Symbol" text:citation-body-style-name="Footnote_20_anchor" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" text:citation-style-name="Endnote_20_Symbol" text:citation-body-style-name="Endnote_20_anchor" text:master-page-name="Endnote" style:num-format="i" text:start-value="0"/>
+  <text:bibliography-configuration text:prefix="[" text:suffix="]" text:sort-algorithm="alphanumeric" fo:language="en" fo:country="US"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>
+  <loext:theme loext:name="Office">
+   <loext:theme-colors loext:name="LibreOffice">
+    <loext:color loext:name="dark1" loext:color="#000000"/>
+    <loext:color loext:name="light1" loext:color="#ffffff"/>
+    <loext:color loext:name="dark2" loext:color="#000000"/>
+    <loext:color loext:name="light2" loext:color="#ffffff"/>
+    <loext:color loext:name="accent1" loext:color="#18a303"/>
+    <loext:color loext:name="accent2" loext:color="#0369a3"/>
+    <loext:color loext:name="accent3" loext:color="#a33e03"/>
+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>
+    <loext:color loext:name="accent5" loext:color="#c99c00"/>
+    <loext:color loext:name="accent6" loext:color="#c9211e"/>
+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>
+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
+   </loext:theme-colors>
+  </loext:theme>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="fr1" style:family="graphic" style:parent-style-name="Graphics">
+   <style:graphic-properties style:horizontal-pos="center" style:horizontal-rel="paragraph" style:mirror="none" fo:clip="rect(0in, 0in, 0in, 0in)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:page-layout style:name="pm2">
+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:body>
+  <office:text>
+   <text:variable-decls>
+    <text:variable-decl office:value-type="float" text:name="a"/>
+    <text:variable-decl office:value-type="float" text:name="b"/>
+   </text:variable-decls>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="Standard"><draw:frame draw:style-name="fr1" draw:name="Grafik1" text:anchor-type="paragraph" svg:width="2.0835in" svg:height="2.0835in" draw:z-index="0"><draw:image draw:mime-type="image/jpeg">
+      <office:binary-data>/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+       GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+       KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+       CAD6APoDAREAAhEBAxEB/8QAHAAAAAcBAQAAAAAAAAAAAAAAAQIDBAUGBwAI/8QAPhAAAgED
+       AwIEBAQFAgUFAAMAAQIDAAQRBRIhBjETIkFRB2FxgRQykaEjQlKxwRXwFjNictEIJEPh8SZT
+       gv/EABcBAQEBAQAAAAAAAAAAAAAAAAABAgT/xAAbEQEBAQEAAwEAAAAAAAAAAAAAARECEiEx
+       Qf/aAAwDAQACEQMRAD8A2t0YoQpwT2qVzMV+N3UHgrDY2eoM0y58VEbgfp9K1yMRmnuJ5h40
+       jyYHGSeKrWE8u2QAApOMdqGCsmT8h70TAJwMAZx249aKBy4c9vTNUC0zDCgmmmG7Ockjkj1P
+       rUTAjcy5XP0ouCgHae4IomOJHhgIc55PHY0Uk5IXLMcUBQ27n96JYO2MYLebHtRBA7BcMx29
+       sdxQJqwZRtIP+BQKpjHHc+xzigNGoAO/k+nPAoAYlee5oBiGeWySO9AJCgY5PHagFCADzj2G
+       aA2N2TkjA/U0HMwbPPeiyBLDfkkj04FCl1cBMgn6URwYFGySR6D2oAeQDAxnHGKAhU4IbGc+
+       tFwnwDj9aK7f8v2oNu+IHxNvJdXmt9EmKWSqArA/mPvxUxMZNe3Ml1dvNcMzSSEsxPOferJh
+       ht/OWyAPc0UfdgDcuM8n50AMCykZFARsngcY/egTcbjnJz9O9AB2kZGSQOcUCX8x83bntQCM
+       ruJ4B7D1oCyOGzxtJ9M80CAdg5UjFE0aFJrghLeNpHY4IRdx/QUNWCw6D6q1EZttEvirHAZ4
+       ig/U4qw1b9H+CHVN3Mq6hJaWMJ5ZjJ4hA/7R3P3q3ET+pf8Ap/lWNm03XkkkA8qTW+3PHupP
+       9qxopV78G+s7VSV0+OcAn/kzqSfscVvIKzqPTWu6XKE1LSL+Bhz5oDg/cd6lEZzGwLrtPqrA
+       8frUCJfcw9gfegUjZsEAffNADyHt78UAjCjzDJxRcO5Pw3gwCGOVJQp8ZncMGOeNoxwMY96G
+       CbQffFFcUXKjDDt2NEo+N3yyM5z3okKuqJgIzONoJyuMGi4QfGcqSfXBoYHJx659qKIRnnsf
+       UGgJn/poJYoTIGLY+eDzQFlQK2G/KCTmgbspfO0qce/agPGcR7nHf9vnQFfBPlOc88Gg7uuc
+       c/M0Bd208YJJweKAYrea4kKQICRGW5IUYUZJ570DYqcknt3FE0VuVyDzj1oamOlulda6puvC
+       0a0eZVIWSbtGn1Y1NNbX0x8ENH0qL8X1NdtqDoNxiQbIh8u+WpqL70Tc6fcxypouiRadbW8h
+       hLFFXcB7Edz+tNFvEZxkmmgShbA9PlUA+Hgg/wBqDgmBkd6ArJuJBGR7VdEdqWgaVqMfh6hp
+       9pcLj/5Ig2KaKJrvwW6S1EFoLaWwmPIe2fAz81ORTRm3UfwI1mzBbRL+K/ReyS/w3x/b+1We
+       xmev9O6xoE2zWdOubUDszr5T9G7H9auCJj2n3PPrUXTlGBB2kYx96GlQMjJJHuRRXBgDgk8D
+       tRKH8w4OfYA0SUlIMsFXJ4oujHH8ufnRRGOSNoJNAeFC77F2jPucfvQFEqgY3nj/AKaCUY58
+       wwq54AoCzOmVMke9QeRnGR7ZoEIF7pnaTk49KDpSSwQntQJsGKjgggZ9uDQc4OOe1Am2UCkH
+       OR7dqA8t/cSW8MEkrGGEsUTPCk4zj9KJT3pzQtS6m1aPT9Jh8SVxlmJwqL/UfYURuuhfArR7
+       f8NLrF1cXciKDJCrbI2b7c4+9NGtaRptrpdqltYW0VtAn5Y41wBUodvGjqUdQyn0YZqAIreO
+       BFSFFRF7BQAKA1xcRwKplcJuOBn1NAR7y2ikWMzoZnGVQHJNAuQcD3oBKkD2FBy8jnvQFxnj
+       jmg4rxwKBMqCBtPNA3vbCC+tngvYo54HGGSRQQR9DV0Y91n8DNOvFkuOmZmsrk5PgSNuiY98
+       D1X+1XRhWu6DqWgX72er2j2069t/ZvmD2IoGG7jbnj1FFlB224PB+VClN4DYJHyAojmPGCck
+       8cetCAxgjPp6UaAGKtx6+9ATAXO7nFBw8HHLN+goJhBuj2FeAcnmgNazW8U0vjweODGyqpYr
+       sYjytx3x3oGa5LEEjH9XvQGlgmjjMmQq4HBPfPYgevagG5nhe3tkFuInQHxJQTmQntn0wKBK
+       TlAeDx60DSY+U9zn+mgsnQvROr9Y3W2xi8KxV8SXUnCrjvj1Y/IUR6c6A6H03o6wMVgrSXMo
+       BmuX/NIf8Djt/eiLfjJwO9ZBiOfmKDhktzQAzYBLZ8oyaDF+rOptVv8AUjNZL4tjA/lT+kr3
+       wvqTQX/pi3Y+DqFxKXurmFWAaPaVzg4I/b0oHlxqV7penRTXFu93dPLsESYB2k8n7CgnradL
+       q1WaIOFI/K42sPkRQCg3Kcd6Dgp3d6AdrGg5VxnjmgKWB8uQGxnFAUgKuSefSghuqNC0jXbA
+       WGtxQyJKdsYc4YMf6T6GtDzR8S/hnqfSUz3NvuvNILYSZR5o+ezj/Pb6UGfLzyD/AJoFFySQ
+       VBHpQDJ5kGByPahAbWxn5+po0OF3D+XPtQJsNwOe+aAuygmMkebgHnHFALHYpJwSeGz2oGpO
+       JWAI49BQEZlYAHkg4oARVOMvtBIJJ7AUAX6xxSOsUgmjViFcKRuHviiVfvhT8NZuqpk1LVFe
+       HRkPlHZpznsP+n50qPS+mWVppdnFa2cEcFtGu1I41ChR8qyHVxK8cLPDD4kgGVQHBNAa0maa
+       BJGTYzDJXOcUCy5JOaA2OMfoaArkheM7vlQNYNOtoWLJCgLHJwo5NApPKLaNpGRQB6j2oGmn
+       RvcyNd3O/DkeErLhkWgklIdCyZOCRzxzQEeRxhdpUnncBkD5UCxXjJ7+tAlctMsIMLohz5mc
+       ZAH09aBQYdQwyAeaAuA7MAQxHH0oG1481nbGVInuWU5Kr+bHrgepoKB1u+o6jqlvBH05NevE
+       BPBK0pQR4I4BHZj+1Bb9IS7lsFtNWtYwDGFYB/EXHqpJ7/WtQYx8VfhGbdZtV6Uh8gy81mpy
+       R6koPb5UGKY4YkeYd88fbFAI5AC98c5oQBb+U9+9GnN5RgDgjOPWgAN3yMfWgAqc91/UUD2R
+       SSRg9+49KCR6e0WfX9WS0icRwgb55WOFijH5nP0FBYNRi6dSR7HRNPmu0hOW1GaXaZMdwBwA
+       P3oynE0XRYrFtV02wS4ECj8dp1wcsE7eJEf39qlFZ616ZttPu7Kbp9Zbi0vYzNCcgjHqoHuK
+       sEp8LPh7P1PqjXerxywaXaviRSu1pWH8g+XuflQemIIY7S3SK3hVIo12pGoAAA7AClEL1N1R
+       H0/oTalcwx+IACLaSQKx59Ppmshv0D1jH1ZbTubU27xkkAnKsuSMg/UUFluLlLaJXETyecKA
+       g554zigXiubeRnSKeJ5FOGVXBIPsaBLULoWkIfw3kYsAqIOSTQJMbpm3oqlmwACeF9yfn+1A
+       +Bx34oE5IY5P+YFbnPIzQKAckHuRQCAQOO1AL8r9KDhkZOT9M8UCcrxgAyYJzwD70CT3Itxm
+       8kgi3fly+P7/AOKA9pskhEkZysnOfeg6RH8w3tgjAHtQRZ1uystSg0m5eRJ2UbHceV8fP3oJ
+       kBSAVII9xQFdSRwKDDvjN8L/AMSJte6chxcgFrm1QcSf9aj39x61YMH8Q+CkfhqpQncxBDH5
+       H6VRwXJ/Ke1Am2QchuMYOaNFSAVznB9qAm8f10D2RmX8jDHP3oLbebtA6ej0m2LrfX6LcX7I
+       Mskf8kf6HcffIoG8yTadZxSTxCK3kRZUwSFfkruIJ78GhiS6Y1OS3160uZJFWO5bwZtxzuQ8
+       bcfPNMZXvo2wsLnQ9R0q/maJNNv5Yo3bjCuMAHPzqA2jdUan0lF0/ZXcElxp9zE+5WVd/DE7
+       1IPPB7H2po1bSNXsdYthLp1ykyEcj+ZT817ioITrnoux6vs1gv5JYnjz4ckZ/Ln5etA+6N0B
+       emdBttMina4WEFfFdQpIJJ7D60E5I4Vo9qnnsQO1A3k0yzeTxhCizZJ3qNpz9RQO449igMSx
+       HGW5NAIwBtUAUAMORkfegMhG3jtQD8+fvQGXJz7UAHuRQA5YDI5FB0qCQA5yaCs2/SFit/Jd
+       3AmvJ2bO64ctt5zwD2oLMilVAUDgcAelAJLbhgZz3oGN9HPIYmhtrWRw2czjt7Y+dA+h3mJS
+       67W9gc0AvuLYANADpkZABHY85oPOnxy+Hx06Z+odGjC2jt/7qBRwjH+cY9D6/OrKMebcceHw
+       faqCYIyDgZ96GhHOFJI4/WjQpXnsaCz9J6fDqGvRC8OLO3Vri5PB/hqMkfc4H3oDT3Uupapc
+       XrKS9zISgDdhnAGPbsKC5aLLBHq9p01c6bbagPE23kpJYhmz5IySAAMj6nNGdRnT2lu3V9va
+       QQrJDHfCMFj5kAfufsMUFogu5H0jrLUYXK+Lq0aRse/lf/8AOKlFfudagvbnQpNQRmtILydC
+       wPdCQcgMOMZFQanPoeiawBd9M6s9jeKPK1vKQp+RFA4septa6fuFtuqbRrmzx5b+BAdo927A
+       +vsflQXfTr2z1O3W5025juIW/mjOR9KAZI914khaRNo4XdwT9KAl3b2+oWpjMoZWbOVfnI9s
+       UCrXUNssUU8w3sQoJH5jQLvwQQC3NAKvuUPtK54waDg23v6UA7weBnNAIOBigMr+hoOjdZQd
+       hBx3waAVG0Z7UBWfAOQSflQChyNxBAxQRutarb6bHALi9trSW4kEcJnGd7ewFA/j8QEK/IA/
+       MBjmgWDDBB7igj9dupLTTbiaHZ4oQ7A7bQW9ATVgwXSNV6onl8azW6t45pWdxHIxWA/zNtz7
+       A8Glg2S1u7fX+nt0J/H2c4MMhmQoW9GBUjj60g8sfEHpebpDqi4sHLG2Y77eQ486E8fcdvtV
+       FekGW4UfegKVAAKgnFGhuDzxQXbpDTZF6a13UnUqrCOzQ5wGZmXIJ+lE0ppkEK6nJcRWcTW9
+       hA08iKcjcowpye/mxQ0+6VRbC/jvLm48L8LG9y8pIOXxkDnuSTipqHXQMng3es9S3fhn8Dbv
+       cZI5Mr/lH700dc3Dad8NtPs4nU6jeXD6nMCwBRF5XOfU8YHrTNJFF1X8RawW1jc4GxTKNrZB
+       385yPkBTFw1stSu7Ni9tPLGSQfK5Aphi8J8UNUm6fn0u72yvJ5fGbuF/39aYYtGgadp9/axX
+       nRetzaXqnhqZI3bEcj4547Ak/X6UxFisPiXe6NMdO65057eQAr+LhUlHHbOPX07UwWXpQ6Bq
+       Mo1LpgW0sioVI8Qgxk+684qC028M5890Y3kHKbUwF+lA4LDOzu2M4FAOG3DaoI9cntQdJxzQ
+       EyR259f/AKoGl5fSQRFo7ZpB/MhYIR9zxQdayyXKb7gqox5Yo2yB9WHc0DPUIWnhWKxkuYFR
+       s5gcKWbPY59KBkx6isVeSGW31JNwHhyOUkA+o8v9qCfjkMo/LJFKqBmRvSgc2swnRyFcYODu
+       XGfpQMtRsLK8vYJL+wjuGiUtHK6hghz6Z7H6UEmCsig84I9RigiruC9t0DaaVmIIHhTOQMeu
+       GwT9qCJ1ywv9T0U29xFFiaVBJGHz5M5ODgYPY/arKJPTtLW1t44i7SKq48w8x+ZPrTRJoipG
+       FQAAdgKgzX47dMJrXSrXkUe6807MykDkp/MP8/aro80FQyZ+tUJ7hvH0x270XQ7KGtXvIk0T
+       4c9P2bIhkvpnvJVfjIxhf7qftRDXpu0/1DpzXltUlkvmWMBI+2zdnn64oYa6yX0XTm0i4jQ3
+       t6wmuV53xov5UPpyeeKyLbpFtZ6Xpmn6TqNq7/ic6pqQRR/DVf8Alq2fTOP0FXBnXU+ox32o
+       3lzeW+JrxlMXHKR9wfbJ/tVWK5f3AnaAjafCTwwcY4BOM/qKKSjA4Dg8j37UHZKkE5P0olSF
+       lcLDdJPbTNBOigjxOVZu3+80Rbbnrq9l0t9I6isRd2rgKpPlZMdyre9An07oupoh1zo2+lea
+       2fMlr+WZFx7ZwwqWDVug/ihDq7R6b1EPwmpMNokPlVj8xng1BqEUe1EAJOMDOc5oDSxq6YYe
+       uaAJF4oCBUQ7mJ45zQHYB14wR86AVjBXyjge1AEcRTHlA9hQE8kbgEohJ5yQM0ETHNqMOr3I
+       ZQ9tIMQyEjKt7D3FBLqywRPJKTuxlj3zQI3Ut14e+yhWRj28Q7RjH60EfpF3rU/jLqFrHbS4
+       /hqpJXH19aCRa8jgiVr1xGwXzYyf99qA9tc29/aRXFnKs1vINyOO2KByoxwe9AYocHGKBvdw
+       LcWzxSLuR1KuD6gjBoPHXWujt071Nf6YSSkUnkJ4yp5H7f2rQgWAA3Y+1An4j/1t+tBrHxKu
+       YS+gx24LRx6ZFtI/lz60FY0+/v8ASphNpd68EpXY5AGNvzFF1YOirZbzVrvX9dkNxZWH8eea
+       Y5Lyj8qj7kcVlETqOqXd/HrPUNzcNE16Tbwxf1JkEgD2AA/etBte9R2Oq2cv+p6XHJfBFjgm
+       jkMaRgAAEqO5o1FWfbgjsR8+9AlI5CgEggeoNAq0iug8uD7g80KKmCcZ7fPmjJzJfT/hWtjJ
+       vhOPK/OOe49u9A96X1W90/VrRtNkkSfxQF8I5yScdvX6UGidSLpfVFzcvbRiy6kgZBGysFW7
+       B9T7HHNSjU+o9S1iz0e2uNLmX8RYxJ+KgYeVwVGTn5d6gjug/iU3UOt/6TewQpP59skL5B29
+       x/8AYoNHPB78Ggb2l3bXO78PKsoyVyvIBHBFAoSkbfyhn4GfWgTnmWFN7ybAvc4Jz9hQRdx1
+       dp0S3Dw+JJHbDdPIUZUjX3yRz9Bmrgzbqb4x9Oxho4bB751O5HPkXPsc80wQHT/xrJ1IHUbG
+       KO0kdRiBiAgz+YjnsPpTKN/tLy3vLOK5t5klt5F3LKhyCPemAYLuK5XMDEj1OCP71ArGWLMP
+       T0oIbU7h11u2t49OllWWNm/FIRsjI4AI/egfQ2ktpbww2XgxoDl9wJ49cUCHUGv2GixM13Mk
+       cm0squwUH5/SrgxDW/jFcXOteHb3otrKEEiRISRM3zGc49v1qDT+gfiBpvV7y2unxTxywRhz
+       4ozuHbOR2+9Bmf8A6kNIEWpaZqiooEqtBIR6kHI/atfRjDEt3AKjgVQjug9j+lQWh72e/htT
+       OzyeCnhHPomeMYoJvQum7vVD47K9jpsQBkvZ5NoAHcgUAa7rKamE0Lp9Xh0G1OZZTwZSO8jn
+       9cCsivdS38F9cJDZIY7G2URxKe5x/MT7nNaEKrENwAFPPlosFwS2cd/cc0UlIm3JOeKDo2LH
+       +UA0SjgDk98URzPiJ2449e/NAbS7v8PdpKkpikQ5WQLkqccGgmYNQmXWLeQLG9wVRQVPlcj+
+       Yn3xQa98OviAjz3WjdXSpFdliEuJCNjDtsJ7enepRdel+kdL0rqOTVdIsoYklV1dixO3nunp
+       g9jUCnU3WMeka5b2EUcl3JInmigQs6ZPlJAHY8+vpQP9O1m3nthNo0cTwM2JDwoVj6H5gd6C
+       bhtUiVn8TcXO4ktkZ+We1BAf8Z6fZ2uqXWpyxQrbStGseQzMB2IA961B59+IHXmodXal+HsP
+       Fh04HbHCo25+bY/zQWv4f/CCxvII73qC8iuXYb1tYZeF9txHf6U3BatX+DvSl86x6cr2dwjb
+       nEUmcj6Enj6U8hLdJdEX/SmowJp2tTT6Oc+La3HO0442+3NBf1LmRUjjQAfmc+nyHvWQockY
+       yQcY3CgaabaPZxGNnaUFi3mPb6f+KA2q3RstNurnBxDE0mPfCk1YPMemaP1L8RtYN9fJPc2a
+       MUaVmCKg54H0z6VRYendf6Z6T1W56a6j6fgfwJyguhGJmPzbIzjHtSjTn0zSunbi01fSkt9O
+       s5GAmWNCDOGxtXb6HnNZEZ8etOF90DPKFy1rKk3zAzg/3rXI8u7zvOTg4zVoTLDJ81QWDTb2
+       SwuvFgcrkbXwM5H0PFGqsjpd6+kcT61Nc2ieb8OikFc/9PA+WfSjKA1nWBzpFlZ/hLWM4KH8
+       zsPVj6mghN4IyQRk5NGo5BkFmyAfSgVjChdpGO/FAXYpOHLBe/FAQqoBJbA9sUBGxgtgEj/e
+       aCf6DGjt1TZf8RNGumKS7mQZQkDIB+WaMrf8Ub/ovV7V20JIYL62K4khhCLOCcEcAdu9BmCu
+       EQvxvyFUg42+v+/rQaj0zax/EXRY9Nns0t9TtM+BqCKAjEclXA98jn+1Si7Cz6u6O0tLjTrx
+       Lu2tQJJrDwcKE/m2M2SfeoLrpupDV9Mh1OytUS2vIN8m4BZQf6T7+vPpj50GfdK9L6rJqk1y
+       1y0elRDKRqdjHHoyDhjx39e9BZr7fagW0j3kul3iETRqHkeF8ZBUjkZIxjtk5rQ86dW6r+O1
+       OcW0UtvaRsY4oWfLKBxz7k/5NA46P6X1rqS6WPS7V9v88rAqi/f3oN46X6C1DSotkus+BIwK
+       l8hn2+3PapROXPT2t20bPY6kJ5UGYmbIfIHGW5z68VBI6DrzzWSrrAjtrwFUbDja5OBlfuaC
+       bluJLeNwIpLiVF3bVXAP0Pv8qBxLO8cYcW7vnuqkAigNFKs8CyxlwG/lcYI+1A31ayF/pt1a
+       uSFmiaM/LIxVgwfoO413o3qqfSLyUSwodogAyZVGcbPTPr71aNDvendJ6wtbu7Fi1lezK0bS
+       4VZMjtnFZE0bC5u9Jh0qRAr2yw4uWx59vBI44PegN1tpbap0lqOk2sipLPB4aFsnHbBNOR5A
+       1exFhqFxbeKkngyMhdOxIPcVuhiZFz/zBUEwcKvYnP6fWi0+6chjn6h062uATFLcRrIMnzAs
+       O9EehNR+GvTV3GUh0+O2YsGaWHIf9amjIfib0no3S0VtFY3M000zMzLJtLKvvkenyx96oz0r
+       wNjA8cj2osFLbVAbOc9jRQiXOAwxnj3oBlAxwDj37UDY+vHOQeTQBIdqjcPMfnQwJclWyBgC
+       jJBFeefw4VaVycBUGST2wAKD0L8H9C1rSIILjWLSCytY1lZASVnlL4PI/wD8+vvUo1uwbxI5
+       GkjdVc7isvOBjtj2qBWKFZiQ8CJCB5FHYj5jHFArDbQ20ey3RY1HOAOPsKCH1u61CPSLt9Mt
+       lXUHUrbCbJBbPdtvYetXR5T1y2udD6lni1ErJdJLvlK4wWOCePvVgsV/8Sr67UW1vA0NiowI
+       onMe4+7FeT9ARQRmodWa9EYpPBhs1Tygw26rk9xknkn70EjonxZ17TXjAeKTkZ3L+YZ7N8vp
+       SjX+lOpNM6umgkMG3EgBV1DYbG4kewz2NZGkC43CP8MPFBONysMAD50DaHVH8S6N1a+BaxMU
+       jd280pA5wPb296DrXWLK9WNoJdtwybxDKPDcAnHIoJBifTBzzmgaz2UFzPFNNbwvLCcxuygl
+       T7igdRRKg8qAZ5JAAzQEnuYoHiSWQIZW2ID/ADH2H6UERr12BY6hueIQJaO7SK/nHfnHtx3p
+       yPGWoN4jynuCfU963RF+DL/UtQWTkjaWY/8ATnHFGql+j1VerdJY8r+KiJz/ANwoy9C/EjqS
+       bpbRY723RJC8ojIcZ4IJ/wAVkecer9en1+9FzeLCCq4URjgDP7mtLhteadBY2kMczyHUpcO0
+       YxtiUjgH/q9celAiLy1kjCX1ruyMLNGdrj0+h+lE0+t+kNQltJ7yKS3jgiTxUFw/hySp7qp7
+       0NV6YEBgWUNjBoaKeAODnHrRoVgDnBP0ozpxZ2f4y5trVeGuJFiBPpk4zQep9C0LTembS30f
+       QbWP8ZsDyTugZgf6ix9fYZpbgmbXSmXULaa6kMzpltzcjJ//AGpaLCY1CDsF74PrUCgHY0Hb
+       Sx7Z96BGUfxB2xjtQZ11t0Tb6jNfyw2wM18gV5AcBdpzyPnV0Yp1F0o/TEczXjXaTOQYpIk3
+       QlT3B9Rj0zVl0VKbVppImheUSwbsgFfXHc0De0tri/ujFYQSSyfmKopPHqaDV/g9p+padr/g
+       kSRTzKu0kZRlPLYPbOPf2pg9GWzRCMJAFxH5do4wayKX1z/G0CdzqLWRkiaTxQBLudclQvov
+       bv3oMU/4Z67uwnUAt3u1Zw42yhmx3/Ln8v0oN86L1d00i3i1UiGQIocNnEbnkqT2xgiguEbI
+       4DIysp7EHNAZnxQQ/Usksej3EsCl5EUthR5sY52/Mjigr6Qrp3R15LqEcIlmgdpFGAsY2nav
+       PJApyPJtwd8rnGBuJz6Gt0MzGSTyf0qCwSKA5ZsAjnn2otTXQYj/AOMNIDqCrXUZwf8AuGDR
+       G6fF6Gyfo6+ub0CR4EPgIScLIeAcfc1keatN0661a+S3sYTPKzAbV9B7/StLrQ/iXp9pYLp8
+       elWsUM11AzXMqt53I7g7j244oiB6W6Tn6j2TeAy2FspTeB+Z+/8AmgtnWlvpdl1Dp1pq07Ja
+       20GFQpuDHHAwPf39KDHriVTKSPOCeBnHHtQGsrG5v5pfwcTOIlMjgEeVfck0XRIreS7uUigR
+       pJXOEVe5PtRE/wBJ9HaxqvUcdhNFJp0lviaSWVcMgzxgdySeBipo9T6O8NppUJ1K4iW5KgSv
+       Iyqxb5jPH0paJm1NvKivE6Mp7MpyP1FQLRTwy58F0cjuAckfagOTtO3+Y8igMWCIWbOPlzQN
+       hNBOWEbq5Q+YKc4+tAD7JEZgQfXj0oI/VtIttXsZLW5hRopByCP/ADVlGRa78Erae63aXK1t
+       G3LAncM/Kmh10l8IZdBv4rxtTE0yggJsyoz6/P0po0zSNKEMdo9xGnjxuzkqMAEgjj7Gmial
+       jWQMgyCRyQcGoITqHT7q/a30+G2jFmwLSzl8GPBGFA9c5NBPRwJDbpHCipEi4CjtigqfWltq
+       CaG8WhNbxyzOBIs8W8FcY4+dWQQ/wtuZdIGqadrknhy2u2QyOSEZOeRngY+XvTBZZevOmhC8
+       janbqiZ53Zzj2FMFcs+sh1ZqsFrp8UkGkrlpbh+DNzhVX5Z5NQTfXyWUXSV2t+wW3EZ5I4HH
+       t61eYPI0mA5C9snFaoLsPv8AvUEk5JcA8cZG480WnOlXX4PVLO4yQ0cyP244Yf8AiiPUfUum
+       p1B0/c2O8xfi4v8AmL3UcGpgw/SujNX0Trj8PpckimOMvHO/kEg9Rjs3PpV0aFq/Qqa1ZJ/q
+       crverEqNOwGM+uMfemiVtrKbQdMNjp9rvtkhPht6mU5yT8u1BkvXg1qXUtOvddgRY1R3j2YH
+       iMvZSD27CgzSCyuNQ1KK0giL3Mz4VAOc/wDignoNNOnaHeiW8hgkku/Al2+Ziqgn09M0ETp0
+       qpqSmGKOdFcEeLwMfPHag3JLuCRtPmQWsDhNphtVAcn1w3BPFSwDdWGpX1/OYdOtbbSrlQ80
+       szHdn0GR24/c1AbWemdatLbTJdGvJIJypDQwMV3exwOPatSz9Ei/R+txy2mr3evyHV4miWID
+       hGwwyGA7nGRS2YNZAUBWYDdjGayEvxMYB3nYu4KCfU+woG93c2enWs1xcPFDCp8zEgDPzq4G
+       Ggz22saS1zZSZhkdsFePXt86YHWmySeLNDMYikZ4YNlvvUD+VARxQJqgwRQHUAAe2O1AWOFR
+       M8mDlgB37fagb6reXFt4ItLZJnZsuWfaI0Hdjwcn2FAz0nWX1i4u4xY3VpFbv4eZ1x4vGdy/
+       KgkriN2aMRlQoOW3DOR/5qwYr1P1tp2pdS3WnanKkGh24kRl2eaYgcb/AFxnnAqiv9Jno0dR
+       LJPbtdQtkNPIALaMnODsPPpSjbdK0DTbWQXui+Gsco3BU5hPP5gPT7VkU74t6PZHpq/1N5ZZ
+       bwrtRnmOwDPOFJwPsK1xR5ybudw788VaC5X2WoJRULSBpAe5PA/aiinAZnHck4A70THq/Qr2
+       3/4Y0u4lmCpLBGA7epxjH60Du+WGOBvFlFuWOFcYyCfbPrUojri6k06xX8PFNfBUJ3ltzM3s
+       cVBjfVvVXVNit5dapNDZGQGK3shjeAe7YHIwAOT3zVggNTiu+orrR4p7m+upJFR7h3TPhggD
+       aoBwRjnPH5hV0af0xotnoD3l5dWdrY2YjGLhwPEHoef996CC6m0HpuPpk3Wny2s9sJPHJ3Ae
+       I2D39T37UGU9QTDULuGPSLPwIyoVIYk2lj6/X70G2/DPp0hVudRuBLcwxhRGkeEjB9M+p96D
+       SLprVHiieaAE+YxHkke4H1qUOIBawL4uAuc8nvj71AwjRtQ1eO78QNp9odyLju/qT8uf70Gb
+       6r8SpLzryy0vp+4NxYSSCEswI2u2Rn3OOD9qC4dVamen9NlaC7tUaIFvCmnHiy4HJXJxnOeD
+       Vwed+rOvLnqSyWO4jZSru/kc7ck+30GKosXw2+KmqaDJDY3jR3OmqNoRhtZAP6SP7Ggtmt63
+       qbTJ1XLazJpslwBFblypEOAA7L2OWANS+xrnR2vW3UmjJeWp8wJSRf6WHeoJdSPMCRmgMq8D
+       mgBpNsgUIxBGSccD70DczmS8MDWoe28MN4+f588rj980CktuJZYpFdlKZ4B4OfegQ1hpIrVj
+       bsRMBhBj8x9qsHnX/hm36y1O/u9V1ddPmS6aD8OkQdyxOSe4OMmqLUvwQsYY4Xjv7m4YEEhw
+       FyMY7fXB5pRbvhp0jqfSMV7b6jqZvLGQAwxAEBDk54PuD6VkVb49a5DBpiaNaeF/FIaQDumO
+       wpzMGDEZQZ5+VboR8In1I+9QWDY6gFn7jjHpQhtJEFbAGBnijT0P8H7qPVOh47a42yNaymPB
+       OcDupoykep+m73V7g/8Av2itQowvJIx6j5/OpRjfUWrax051RPY6LqFy8YACkebO4Z7HjNWC
+       Y0ToW2utJbqPreW5na4O4R78cehY9+fQVKLX05p1ro97awC4kX8VFmJLeEKdoyfOxJPbHbHY
+       VAz0rqKPWNauri9t1ktJgILYgEiNFJ/Op9STmrBBdeaFCo0y3jt444DI3jLE204Y5DD+9UPP
+       hv0NaRtPq99mSLOy22nOfdh75oNC0vT7m1uJGvGiii3AW8UDbQAeDu9zUohLlhouqap1VciF
+       4I1FtbxSthtobBIPuTn7VBJ2vUth1TYk2ULi9iALwyKQYz6Z9CM0Ft060/DWEcDHe2Mucdye
+       9BFW3SekWt3LPb2cUTsd2UGCG9x7VYMzufhzdX/WmoXj+BPpx3I7XZMmXYckc8EVRKaP8I+n
+       XikLQuxOQSTnBzj6UEjonw90XSrq3S3s7dplJcl1EhGDx396lFx1TQ4NVjaC7UNCU2lAO/8A
+       vNWDCLp9X+E/WgWImXSp2LRq7eSRT3B9iP8AFSjd9P1+21TRodVsMS2rLmTbyUGOePXFQSlt
+       cLcW0c1vh4mXcjDswoDLdRm4FvISsgXeTghDzjAPbPyzmgVFxCzuiOC0WN3sM+5oDqySJmNg
+       3rx7UFb60tNUubGJdFdEvhIdryflUFSM49TVgyTQenJemOorf/U4H1Fpp1edAh/hOQTuQ937
+       5JA4q0bnbPBcxxT20wkjKkqYzlT9ayGWu38um2MbLEJ7iRtoUds+/wAgBzQeW/iHqi6j1Pdz
+       eL44HkL9txHtWhVUOVyvHNB2F9zQT8hUAhAdp5FCG0mSAzE4HGDRppvwL1bwOpJbEsFiuYyV
+       X3deR98Zoy2ZtRgmjkSRZocEp51K7se3vUow/rfpFE124mVpfD4mk2MWdCc4A+VWCH1281/U
+       mFnpklzPYRFBEG8uGC4yQfcn9alGgaJo95rRsbi53WaxwrHOm7BjYcHnvz/moJaw07pXSI5I
+       W1K0CQnDhpAWB9R796CudY62msTRW+gadI8KnDXMkLLv9MA8HGOKC3dAXF1dRfh75f41moi4
+       G0AdwcfTj7UFhv7RjqMBV5AJFZHkR8FRjIx6CgpXVNjJ1JqNn07p26CztSJLlpIydyj2J+fG
+       aC+afplrazqLa3SKNIggx3IHYUEsBk4wQc4oK11L1z070/M9rql6wuVA3QopLcjNBDwfFboq
+       eSO2W7kQNxuaEhQfnQLt8TuireVoV1UeXnckTFT9DigHRuv+mbu9ZV1W3Nyc4IRlVl9O47/K
+       gtU+s6baw+JcX1umRkAuM/p3oK/1t0rYdX6cqXKESqN8Ug/Mp9P1qwZ702mo9GdUTWJsmOn3
+       EY8CAORGXJAwScjJ5q0bJDNLb6YklxbKsgA3wwndg9sDtWQN3aw3ZKTwLLEQOGORn6ehoG1v
+       YAw3FikRt7JSuH3Hc/GSc5P0oHn4aO2uGuYyiose044wBQIm6F1dwfh5ARs8R8L2BHGfnQHv
+       9PS4PjxrGLtFKxysm4qD3oCxboIIo7e1jhQHzAYUJ8wP8VYM56j1ktaal1BMrS2sAaK1OQDD
+       6eUepY9yfQVR5zv7hrmaSaRtzyHJY0DcE4BPIPb5UBwOO4oJYzFvzEYHAH9XvQhNZN7AEgDO
+       SDRo/wBA1SXRdVtNQgb/AJUgfBHcZ/8AGaGPVlhPbarZ2t5CEeORBKje2RUrI1zYxTBhMinI
+       wcjvUEcugWkO4AMisMEA8N69u3yoERrOhWNxNYy6hapcxAeJHM+D8u9ASLStLlm/EWdpZyxy
+       +Z3RQ3I5B44oJKTT4blFWSNBEOeBg5+goFYbOK1TKhIxnIbGMH50Cpcyo6AMrIcM2OD68Ggb
+       6Lbbllu5Cd88hYBu6rztWglSNkfm4P70Gaat8Rba96w0vp3R2mhufxyi4kO3YyDOV9+f8VYM
+       w+P0cP8Ax4JVuEKzW8bEr5tuMj0+lUZ7Y2X4288GK+towRlZXYqv9uKCQi6YmbT2u11GzaJW
+       KnYxbBB49KCFnhubdiwL+U8OhP60ElpXUFxY6nDdXQF0qYbZKxwT9vWg3npb42aHcmC11C3u
+       LSQjEkpIdQfr3xUondP6x6e6tv7e101hczRzrNtaFiFC/wAxPYHtUF+lj8bYCTgMG59cUC4O
+       BQQOo2eoXepFTeL/AKYQN1sEwWx6Fu+DQLX2kw3Ok3Vjas9qJ48Exd1PHb9KCE6R0G86Ut7m
+       K71KK4gklM7TyKRIBjtjtjj96AOreudJsrMJbXksk8jBCbVdzRjONxBHP/3QQ9x1jcWGkERW
+       WqXdpMPCt7x4wfFOOWPbA+fAqwZr8TJ9Qbp2ymvEjsrSTEVvawyHz45Lv6E4wPqaoyl8g91O
+       KDlYEc8mgKW5PH7UE80f8PPHl7gDFAZkUjawUIQG8w5ouknAUbl9Dg59KK1X4Z9XXFvo8mlR
+       Xax3KHfBG8Rk3qe6jHOc54+dMZO7jr/qK8vWtba4tYu38TwvDOMc8N60wPLbrW10PS7pnvrn
+       UtbAKobgBUUk9jg8f/lMC2rydMdRSaRqWoLEbx4UefwxkL2BVvvn9Klgv3Tp0lPxFno6wJ4I
+       VmEOMEHsf2xUD2e4ks7n+NGDaCMu8q8lCMcEfPNA6tW/EwrMybEYZUHnI9Cf/FAzu7G4LXTW
+       s38SRNqhs4Bz3z9KCO6x07UNT6altNMvEs7xkC7nPlI9R2/egwbrDT+r+kupLCeK9nu3KBYG
+       Ry+QvdWFWCU6avtA6h1iKDqLRhpmpvkxz2p8JGb3z7k557VRX77TdHteuPBut401CAouyXGc
+       dvmASaC069030brYaay/CwPFwWspRErfUN7UGZX2hWSiY6ZrMc0CvhUlBUk/UcGgiLq2mtG8
+       F54yDwfDfIoGkrRsSZXwOB2zmgsvw06XHVfUcFvI22xQ753Ze4H8v3OBUo9a6XodjpltHbab
+       DHZIhVsQqBuA9DxznFQTQUe5oDYGMnn7UEbpV3JqDyz+BJFbBtsXiDBf/qx6CgDXL42cSRwG
+       M3UzBQrHGFzy32oG2i2kKTSI80lzMow0rqQoyew+3tQO59KtJJRI9rEzgg7igz3z/egZ6paJ
+       dGGwW4eBXy7pGeXUdwT6A5qwebPjJrcOr9TvbWZQ2Onr+Gi2nIJHcj7+vyqigOuRk+vtxQAq
+       Ek4BU0ABj7j96CzzKxYD0GeM0CQG3OMAjkfOgbSZwzE4PJyfWi6caTdzaffW95akrPFIrLg/
+       tRHpGzs9C6t0W31FrO3Y43MrcbH9c/eloZ6v0JpWoKlrHHBbScSFEHYc5Pz71NDXUoJrK1g0
+       dvw9qsspW3nXaN6KMrHnH5ieSfan0U3Rr1uidaRbiwk8BUSS6naQkjc3ZcHaRnn70wbja6lZ
+       X+nw3NvMksM+FXnPJ9DUCeoXj2hSG2t2km7op4U/f/FAvHaNePb3N0jRzRA7VD8Akc9u/FAv
+       cxnawZQ3HYtjJoKfDFAdeub6Vo1dSULIBtTbgYOfU8jNWUVvrm5ih0m1urixhlsI5HJliOwR
+       5/LkkHHJPamjHdQ0HWdemlutN0+YWBYtC0rHDhjwVz3zWgx1n4e9U6QE8XT5Zd//APR5se9X
+       BXbjS9S0zAvbO5tyWKAOhG4/KpQ3ZHXO5JFK98qRUGhfCbph77Uvx91pv463wVjR0LR7s483
+       796WjW7rTrXpHWrSW2YK7lmXTbaIFpCRjjHOOSeeBipaNLtXuIre3R43lnkGXYADZnnmoH6D
+       kbzn6UDGWe9a/hKG3jsW8riQMJS3svp86B6zgMQmDtGT8qDNb6XUpOoPx72tzOkjFYowOduD
+       wDjj70Gg6Wsq2KNeAJKRuKk52fIn5DvVkENrvW+iaSAsl0txI2Asdud5Yk4A4pgzv4l9ST6J
+       ZSXbyyprWpw+FFa5G21gz5icfzH3pgwCSQlh688+tUEwjjngZ7UHAHuWAHpn+1AXj5frQWXO
+       GBZcKSe3c/rQIyAtnI27eBj/ADQIMAuH8vHBB9DQwVpPLjOckEZ/ahi9/Czqj/S9VhtLm6aG
+       1uZFUsT5VOfX5Gpg9GiNJArxsrxsv1BHypYGF7pljeG3kvLZSlqzNGGxhSRjP6GoG1yLUWiW
+       c2nSPA4KJGItyYHYHHarop3wu0jWYNUvzriNBp8ErraRMANxJ/N7nA7ZqDUHgSQLvAbacjI7
+       H3oOuIFuYzGS68jJRyp4+lA0m0yDwGjiTw3bzBwTuDe+TQVbV+mLmW1NtbSok9weZiC2zPLE
+       Z+/FBM6Xo40/TYdL8Jr21G4vJcuCck55HbFWUKQ/h4tR/DTz2o8TK21qmMgKOf8Afpmroklj
+       G1i5BHI57D5VNorut9Lab1LA638W6H8sboNrqQckq3pntV0RWsfD6K7SGC3vTFahQJY2iVmk
+       I9d+Mimie0Hp2DQ7AQacio3JZgqjcT3zxk1KHGldPWtnqMupS5uNTmGGnk5KjGNqf0r8qgmk
+       hVGcquGblm96BDUZZYLGVrdN8+MIvux7UGKTdXdbaRrFvbaxbWN4d58BmwCjHPORycLx2q4L
+       Ne9S9TdN6I13qkWmzSXdwBCGlO4hiMKAB2A9ag0WySQwpLLtMjDcQBhVz6CgoHxF17XbnUYu
+       nulgsUsu4TTvjIUAEhR+x4qwZwtkOi7651PXJobm4tohHbQhdgecjnaPZeOfeqMy1vWLvWNQ
+       lvb+ZpJpWyT2A9gB6Cgjy5AO4A5oAGRgBR39aA7Z8MkFtxPY0AbV9UGfpQWhj5TkBQGxuBoE
+       GG1iQCyHvj1oELgSkK6oRnIBIxzRdJ28Q3+fHiAds96LoH3AF1wCfyijNbF8JviI1rbQ6Pq/
+       iSopxFOx5Uf0n3qUbWQk8II2SRyDPuCDUHMpSIiJQSBwDwKAgTxApnEbyIQ+APyn0+9A5B3A
+       gfmoEWgcb3VlMpGFYjt+negSs7zxH/C3RWO9UElM8SAHG5fl/agNdXcEbJAZ1WadvDQDJO7G
+       f7c0ED1dqWv2enzw6Rb24nZfJd3EwREHqxyMZHzOKBbT7H8PZWTK5uZ9o3Xm1SzEry5PsT7U
+       FF+JnUezSZ9LttRs2km2m5KSFWXDZI491AyBzVwK6J8T7CRtPjee0tbaGAtdNISdoXgLEo5J
+       JxyfSmC6aF1fo2vELZXDJOxwkMybHYe4HtUFiJWJd8rKqjuTQcZV8SNI0dy43BlGVA+ZoBni
+       E0RU7tp77Tg5zQUv4hNrU2tdNWOhylPEnaS5UHGYlAzn5cn74oHGt6l0z07k6nJC123HhKPF
+       lbPptGTj9q0Kx0XMvU+ty6vqQtpWlZo4LOdGDWsak8Aflycgk+v2qC8a1q8OnaXLPOz2kCIW
+       kZ+CqjgYx6n0xTBkmp9Sabp0KdRyI5vJkaGw08MVKIDw8jA557896QY1q2o3eqXr3N7O8skj
+       nlnzgn5e1UMCGV/MOM0BJFOVwfX0oFtgZTjkg8UBtpOeO1B3hg85FBZXVMM+VJAA2+h96BO4
+       IMJ/p7qvuKBKacmOKB5CYYx5UzgDPfHzoGwD5OApJHAHrQEAk8NWdNpx+XdkA0AIGhkGWOQc
+       gg8UGw/DP4kmwhi07WCTZqAiSbstGc4+pFKNvs5o7q2Sa3kWaJxkOp4NZDOHUh/qL2k8LW78
+       eG7kbZv+0+/yoEZp7fUpX/BXpgvYZTCSRtO7vtwe/vQdY6jeyatPp91FEPw8aSNMoYbi2cAD
+       t6Z70DS60KW7luJdV1JniJzBtURG2b0KN7+/vQKSWUWnLLqN3cSLP4ex5Y8jxiPykr23+nzz
+       igpXUPVOu6Vqmmf8UWttb9OXDqkjRnfI3H849uRkDOKC0axLFr+nLB0rrUMM0bqCIGGGX1AH
+       09qsGc9UfBiTV9Vhu9Pu5oPGLNeG6bczN7jHvVEr058Gre3sLeDVrmOdo3LmSFNjEH+XdntQ
+       XO51XQOl5YrCKGWa8SMYS3tzMyLjjJHb9alDqz1S5ktJ7nVdLmSVDiOONfEMiE4Xy+h9xUDm
+       11CaTxEOn3VmpHFxKFCr9s5GPmKAus6jb9M6RJf3c88yxpjcxL7uM5OO3HrQVTSupoOuYdZM
+       TSpptriNFtXKXDA/Pjhs9h2xQOJ7Xpnpa2S91WK2swqjbGw3ysfcnuxrQsGmapYvpwvra1Ft
+       DL52Mi+Gx49sZoMb+LXV0t+jWl3OYLGTO2zjx4h2nyszHsG4/Sgxt5ZJmEsjl3PB3GgSlyXB
+       xkDnNADseB2PsaA8SoXQyFgmQCV70B5R/EIjYmPJxnvigEKcYDfrQF2/X9aCwqC7l2zwfT/F
+       AJJ5747E5oGTqZArKOfccftQHZWwmOD23Z4NAEkTEBmwR7g5AoG7KSSE5HyFAMTyQsMHa/cE
+       cEc5oL58P+v7rppdryPNAXx+GfsQe7Z9D2/Wg3zSdX0fqzT08F433eYwscOpHt9PcVkQPW63
+       2mX9vfWdrbXiRgrIdu2eHIwGD57+nIoKdc/ELVdC0u5afp27SUtta5vJMMzk+UDjzYHtQWDp
+       j4gxXmif/wAitXZkGZzFGW8MehZO+PmM0Fibr/poWQmF6xXA2xmFg59sKRk0C2nQP1KFvdb0
+       vwIUJNtDKcsVP8zD0Jx2oJDTNA0vR5p7qzs44pJOXkUc/SgNfa/pNvbF5L2JgTsCo2WJzjGK
+       A1jcNcxOF/m/I0zbt4+gxgenNA5s7CCxWWYQxpNLgyMiY3nt2oHajcuexAoEL1C1uyFkVHO1
+       ixHb17/KgwT4rdXWep6oul2OpywaTYqVLxDyySDjaM9x6Z+tWDPdB1TW7Wa9sumpGlursqMQ
+       RlpXwd3BA4571RcdN0i41G7h/wBSmNxqdkwn1O6u5/4cAXlYgcnngE/pQNvih8S211obHRyY
+       bWInfJG/Ex9MD2+tBmNzcTXTtJcSSSSHH5jngDAH0oEdxbg5A9wKAzPwO+fegSLfLJoFoR5f
+       UfegXOcHGAT8qAM+XaBzQCCwGDuyPlQWJpV37Q5TIweM7u/f9qA9vNYpFML2KaR8YiaJgAh5
+       5PvQRvnYoqA+MThcDnPai4PKWQlH3K6tggjnPaiEmz4ZznBPfFAVWG0AZDH1z2HzoE7lhv8A
+       JIHI/mGRQI8AEeuOMGgndN6pu7V4RJLKY4WDLhypXj0oNL6d+MMS4ttetDdQgDNwAPEwPRh2
+       NZGkabrvTXVZiexvba5aI+ILWZQG3Y4IDdvtQScvTdjK8chtFjkQ+VlYgqPXGKA17daV07ap
+       JrV9CsZbELTgbu3YY78UEHf9evJ4K9P6JqGoiR1XxjCUjAJ5OT3NBM9YdSWPTenwy3t7bWbS
+       uBunUthfUhRyT+1BA2vXnS/jGdeo9LnIHljeLwSCe5zgmgejrOz1S3kGhazoaXYGAJ5Sw3e3
+       8uaCsJfX02rPD1XfXtvcCXdBJGjLbOO+EK88Y7nIoLB1H1Bb6WkN1ddSQ29io/5MZEjzt7DG
+       Tjj2FXNGUfEH4wRaxCtnp2kwGGM7llvBvIOO4XOAe/fNMwZbqusalfLBHfzSvFH+SIgKo+ig
+       YqiwWfWV30rpp03p6exJnUPJexQnxuR+Ulu2PkKCrT6jcSiTxZnbxCWcFidxPJJ96BBDlQ35
+       fbFAbahBHJIGO+KAIwg5YnB455oDkKcbW7UAOowSMjOORQcCVXPp+9AqDkHcDmgMNpHPcUBT
+       uzQWCJXcFvKR2Y0CMiqjnz4UcH/6oG8gKluwxyAfSjQ6ylEJBJfv37/OiYQMjbjkZXOSP/FE
+       ELAEkNn1waBCXdjORnPoc80CZeTb5wQe2BQAm4y7jlhjvQcWO3cW4GB7ZpgGC5a3uUeNyGQ5
+       GCR+45pgt+l/EzqLTgxj1O5Zc4CSOXCj70wOE+Jd/Pq0V7qVvb3bISAWUBhnuc+/2pgvkHx0
+       soLaNIdKkEiqR5yDg47cYpgresfELSNc1n8VrFtAw2ZBiiywwcgeb14x2xTBYNA13ozUo/GO
+       qWVizDc1nf6crIh/7wOf1rOURvVupdE6ncpFeakiSWsZdbjSLfw1Zs+VVyMHA75xWsFDHU0i
+       dTJdf65rT28YKpPvHjKp9Bk49qYK/rGpXF/qU9zPdyzyyMSJJAAx9ifnVlwNZ7vxYEh8GAEH
+       O8DDH5H5U0IPK8jHxSzFQAMnOKgJkFwPT6UBlAII5z3zQCjnA5OKBXeuAT9KABMA208DtxQH
+       RhzgUC3KjJx9z2oAP6/L3NAHC8Hg/XNAcNtGe4oEy5yeaCdLk7yx2qQCAO1AmXZSSexHbPNA
+       hJuLJkgjvzRonuAJy2cd8UCbyOi453Dj7GiYTZyVPPl74oYLJIyq68EH3Gf3oYTDEjLbiP1F
+       EDHOUOdgOfXIBFAm77j5Mnng/WgLI5UE8Eg9iO9AnuJbuQx5wOBQFRxuIbOc54PrQK28ws76
+       F722EyI4d4HJUOPb35yKBm8oeQsi4BPbPb71RyYIHmPGRg00GRsbsHIPY0Bg52AEEseBUCQJ
+       yOPXtQDtcdvvjtQCQ/GBwKAuXU4PrQBvZE5IGeO1AffjBJ57UBvEO045HagFWAAzktQKIzBe
+       Mg0C5kz5mOG/WgMrDJJ7jmgEnIyOccYoA3cEMRj05oC7/wDeBQTduzEoNxwcZGaAJOWfPNAl
+       ISVOT60aIQfkj+amgJ3bnnigKeFGPQUCf/x0Smw4V8exogX/AOY3+/SgKxKxeU459KAgJOck
+       ntQJkkcgkGgAAFFz/XQEmJaY7jnk96BM9yPQelAf/wCX7UBv/jagGP8AKB6ZoDf00HMfO/0o
+       AH5TQA/5moECSMDPFAvGASMjPP8AigVX+b60BW7/AHoHEJJD55oDd4snv70CsSjCcDmgVAAb
+       gYoGYJ3nk9qBUAYHAoP/2Q==
+      </office:binary-data>
+     </draw:image>
+    </draw:frame></text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/test/odt/fodt/preformattedText.fodt b/test/odt/fodt/preformattedText.fodt
new file mode 100644
--- /dev/null
+++ b/test/odt/fodt/preformattedText.fodt
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:creation-date>2026-02-15T01:39:34.300934683</meta:creation-date><dc:date>2026-02-15T01:40:03.737721904</dc:date><meta:editing-duration>PT29S</meta:editing-duration><meta:editing-cycles>1</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="3" meta:word-count="6" meta:character-count="40" meta:non-whitespace-character-count="33"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Mono" svg:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed"/>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="swiss"/>
+  <style:font-face style:name="Noto Sans SC Thin" svg:font-family="&apos;Noto Sans SC Thin&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans1" svg:font-family="&apos;Noto Sans&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="Noto Sans SC Thin" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Noto Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="GB" style:letter-kerning="true" style:font-name-asian="Noto Sans SC Thin" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Noto Sans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="5" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Noto Sans SC Thin" style:font-family-asian="&apos;Noto Sans SC Thin&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Noto Sans1" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0972in" style:contextual-spacing="false" fo:line-height="115%"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Noto Sans" style:font-family-complex="&apos;Noto Sans&apos;" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Preformatted_20_Text" style:display-name="Preformatted Text" style:family="paragraph" style:parent-style-name="Standard" style:class="html">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0in" style:contextual-spacing="false"/>
+   <style:text-properties style:font-name="Liberation Mono" fo:font-family="&apos;Liberation Mono&apos;" style:font-family-generic="modern" style:font-pitch="fixed" fo:font-size="10pt" style:font-name-asian="Liberation Mono" style:font-family-asian="&apos;Liberation Mono&apos;" style:font-family-generic-asian="modern" style:font-pitch-asian="fixed" style:font-size-asian="10pt" style:font-name-complex="Liberation Mono" style:font-family-complex="&apos;Liberation Mono&apos;" style:font-family-generic-complex="modern" style:font-pitch-complex="fixed" style:font-size-complex="10pt"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>
+  <loext:theme loext:name="Office">
+   <loext:theme-colors loext:name="LibreOffice">
+    <loext:color loext:name="dark1" loext:color="#000000"/>
+    <loext:color loext:name="light1" loext:color="#ffffff"/>
+    <loext:color loext:name="dark2" loext:color="#000000"/>
+    <loext:color loext:name="light2" loext:color="#ffffff"/>
+    <loext:color loext:name="accent1" loext:color="#18a303"/>
+    <loext:color loext:name="accent2" loext:color="#0369a3"/>
+    <loext:color loext:name="accent3" loext:color="#a33e03"/>
+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>
+    <loext:color loext:name="accent5" loext:color="#c99c00"/>
+    <loext:color loext:name="accent6" loext:color="#c9211e"/>
+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>
+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
+   </loext:theme-colors>
+  </loext:theme>
+ </office:styles>
+ <office:automatic-styles>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="8.2681in" fo:page-height="11.6929in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="Preformatted_20_Text">void main() {</text:p>
+   <text:p text:style-name="Preformatted_20_Text"><text:s text:c="4"/>printf(&quot;Hello world&quot;);</text:p>
+   <text:p text:style-name="Preformatted_20_Text">}</text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/test/odt/fodt/textMixedStyles.fodt b/test/odt/fodt/textMixedStyles.fodt
new file mode 100644
--- /dev/null
+++ b/test/odt/fodt/textMixedStyles.fodt
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:creation-date>2016-10-20T14:33:00.091715893</meta:creation-date><dc:date>2016-12-13T11:16:41.168160323</dc:date><meta:editing-duration>PT1H59M24S</meta:editing-duration><meta:editing-cycles>10</meta:editing-cycles><meta:generator>LibreOffice/24.8.7.2$Linux_AARCH64 LibreOffice_project/480$Build-2</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="3" meta:word-count="27" meta:character-count="139" meta:non-whitespace-character-count="114"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="Droid Sans Fallback" svg:font-family="&apos;Droid Sans Fallback&apos;" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="FreeSans" svg:font-family="FreeSans" style:font-family-generic="swiss"/>
+  <style:font-face style:name="FreeSans1" svg:font-family="FreeSans" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Sans" svg:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="&apos;Liberation Serif&apos;" style:font-family-generic="roman" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" draw:start-line-spacing-horizontal="0.1114in" draw:start-line-spacing-vertical="0.1114in" draw:end-line-spacing-horizontal="0.1114in" draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" loext:tab-stop-distance="0in" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Droid Sans Fallback" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="0.4925in" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="en" fo:country="US" style:letter-kerning="true" style:font-name-asian="Droid Sans Fallback" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="FreeSans1" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
+  <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:keep-with-next="always"/>
+   <style:text-properties style:font-name="Liberation Sans" fo:font-family="&apos;Liberation Sans&apos;" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Droid Sans Fallback" style:font-family-asian="&apos;Droid Sans Fallback&apos;" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="FreeSans1" style:font-family-complex="FreeSans" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/>
+  </style:style>
+  <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
+   <style:paragraph-properties fo:margin-top="0in" fo:margin-bottom="0.0972in" style:contextual-spacing="false" fo:line-height="120%"/>
+  </style:style>
+  <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list">
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra">
+   <style:paragraph-properties fo:margin-top="0.0835in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/>
+   <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0"/>
+   <style:text-properties style:font-size-asian="12pt" style:font-name-complex="FreeSans" style:font-family-complex="FreeSans" style:font-family-generic-complex="swiss"/>
+  </style:style>
+  <style:style style:name="Quotations" style:family="paragraph" style:parent-style-name="Standard" style:class="html">
+   <style:paragraph-properties fo:margin-left="0.3937in" fo:margin-right="0.3937in" fo:margin-top="0in" fo:margin-bottom="0.1965in" style:contextual-spacing="false" fo:text-indent="0in" style:auto-text-indent="false"/>
+  </style:style>
+  <style:style style:name="Title" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:class="chapter">
+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
+   <style:text-properties fo:font-size="28pt" fo:font-weight="bold" style:font-size-asian="28pt" style:font-weight-asian="bold" style:font-size-complex="28pt" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Subtitle" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:class="chapter">
+   <style:paragraph-properties fo:margin-top="0.0417in" fo:margin-bottom="0.0835in" style:contextual-spacing="false" fo:text-align="center" style:justify-single-word="false"/>
+   <style:text-properties fo:font-size="18pt" style:font-size-asian="18pt" style:font-size-complex="18pt"/>
+  </style:style>
+  <style:style style:name="Heading_20_1" style:display-name="Heading 1" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="1" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.1665in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>
+   <style:text-properties fo:font-size="130%" fo:font-weight="bold" style:font-size-asian="130%" style:font-weight-asian="bold" style:font-size-complex="130%" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Heading_20_2" style:display-name="Heading 2" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="2" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.139in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>
+   <style:text-properties fo:font-size="115%" fo:font-weight="bold" style:font-size-asian="115%" style:font-weight-asian="bold" style:font-size-complex="115%" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Heading_20_3" style:display-name="Heading 3" style:family="paragraph" style:parent-style-name="Heading" style:next-style-name="Text_20_body" style:default-outline-level="3" style:class="text">
+   <style:paragraph-properties fo:margin-top="0.0972in" fo:margin-bottom="0.0835in" style:contextual-spacing="false"/>
+   <style:text-properties fo:font-size="101%" fo:font-weight="bold" style:font-size-asian="101%" style:font-weight-asian="bold" style:font-size-complex="101%" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="Internet_20_link" style:display-name="Internet link" style:family="text">
+   <style:text-properties fo:color="#000080" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>
+  </style:style>
+  <style:style style:name="Visited_20_Internet_20_Link" style:display-name="Visited Internet Link" style:family="text">
+   <style:text-properties fo:color="#800000" loext:opacity="100%" fo:language="zxx" fo:country="none" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" style:language-asian="zxx" style:country-asian="none" style:language-complex="zxx" style:country-complex="none"/>
+  </style:style>
+  <style:style style:name="Graphics" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0in" svg:y="0in" style:wrap="dynamic" style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" draw:fill="none"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" fo:margin-left="0.3in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" fo:margin-left="0.4in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" fo:margin-left="0.5in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" fo:margin-left="0.6in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" fo:margin-left="0.7in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" fo:margin-left="0.8in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" fo:margin-left="0.9in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" fo:margin-left="1.1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" style:num-format="">
+    <style:list-level-properties text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" fo:margin-left="1.2in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" text:start-value="0" text:footnotes-position="page" text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" text:offset="0.1965in" style:num-format="1" text:number-position="left" text:increment="5"/>
+  <loext:theme loext:name="Office">
+   <loext:theme-colors loext:name="LibreOffice">
+    <loext:color loext:name="dark1" loext:color="#000000"/>
+    <loext:color loext:name="light1" loext:color="#ffffff"/>
+    <loext:color loext:name="dark2" loext:color="#000000"/>
+    <loext:color loext:name="light2" loext:color="#ffffff"/>
+    <loext:color loext:name="accent1" loext:color="#18a303"/>
+    <loext:color loext:name="accent2" loext:color="#0369a3"/>
+    <loext:color loext:name="accent3" loext:color="#a33e03"/>
+    <loext:color loext:name="accent4" loext:color="#8e03a3"/>
+    <loext:color loext:name="accent5" loext:color="#c99c00"/>
+    <loext:color loext:name="accent6" loext:color="#c9211e"/>
+    <loext:color loext:name="hyperlink" loext:color="#0000ee"/>
+    <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/>
+   </loext:theme-colors>
+  </loext:theme>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="115%" fo:break-before="auto" fo:break-after="auto" style:writing-mode="lr-tb"/>
+   <style:text-properties officeooo:rsid="0014be9a" officeooo:paragraph-rsid="0016b660"/>
+  </style:style>
+  <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="115%" style:writing-mode="lr-tb"/>
+   <style:text-properties officeooo:rsid="0014be9a" officeooo:paragraph-rsid="0016b660"/>
+  </style:style>
+  <style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="115%" fo:break-before="auto" fo:break-after="auto" style:writing-mode="lr-tb"/>
+   <style:text-properties officeooo:paragraph-rsid="0016b660"/>
+  </style:style>
+  <style:style style:name="P4" style:family="paragraph" style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="115%" style:writing-mode="lr-tb"/>
+   <style:text-properties style:text-underline-style="none" officeooo:rsid="0017c72f" officeooo:paragraph-rsid="0017c72f"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>
+  </style:style>
+  <style:style style:name="T2" style:family="text">
+   <style:text-properties fo:font-style="normal" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="T3" style:family="text">
+   <style:text-properties fo:font-style="normal" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="normal" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:style style:name="T4" style:family="text">
+   <style:text-properties fo:font-style="normal" style:text-underline-style="none" fo:font-weight="normal" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:style style:name="T5" style:family="text">
+   <style:text-properties fo:font-style="italic" style:text-underline-style="none" fo:font-weight="bold" style:font-style-asian="italic" style:font-weight-asian="bold" style:font-style-complex="italic" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="T6" style:family="text">
+   <style:text-properties fo:font-style="normal" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="T7" style:family="text">
+   <style:text-properties style:text-line-through-style="solid" style:text-line-through-type="single" fo:font-style="normal" style:text-underline-style="none" fo:font-weight="bold" style:font-style-asian="normal" style:font-weight-asian="bold" style:font-style-complex="normal" style:font-weight-complex="bold"/>
+  </style:style>
+  <style:style style:name="T8" style:family="text">
+   <style:text-properties style:text-position="0% 100%"/>
+  </style:style>
+  <style:style style:name="T9" style:family="text">
+   <style:text-properties style:text-position="super 58%" style:text-underline-style="solid" style:text-underline-width="auto" style:text-underline-color="font-color" fo:font-weight="normal" style:font-weight-asian="normal" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="8.5in" fo:page-height="11in" style:num-format="1" style:print-orientation="portrait" fo:margin-top="0.7874in" fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" fo:margin-right="0.7874in" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" style:layout-grid-mode="none" style:layout-grid-ruby-below="false" style:layout-grid-print="false" style:layout-grid-display="false" style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P1">This is a simple text</text:p>
+   <text:p text:style-name="P2"/>
+   <text:p text:style-name="P2">that is both <text:span text:style-name="T1">italic </text:span><text:span text:style-name="T2">bold </text:span><text:span text:style-name="T3">underlined </text:span><text:span text:style-name="T4">and the </text:span><text:span text:style-name="T5">first two</text:span><text:span text:style-name="T4"> and the </text:span><text:span text:style-name="T6">last two </text:span><text:span text:style-name="T4"><text:s/>and </text:span><text:span text:style-name="T7">bold and line through</text:span></text:p>
+   <text:p text:style-name="P3"/>
+   <text:p text:style-name="P4">And wit<text:span text:style-name="T8">h </text:span><text:span text:style-name="T9">superscripts</text:span></text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/test/odt/native/referenceToChapter.native b/test/odt/native/referenceToChapter.native
--- a/test/odt/native/referenceToChapter.native
+++ b/test/odt/native/referenceToChapter.native
@@ -1,1 +1,1 @@
-[Header 1 ("a-chapter",[],[]) [Span ("anchor",[],[]) [],Str "A",Space,Str "chapter"],Para [Str "Some",Space,Str "text."],Header 1 ("another-chapter",[],[]) [Str "Another",Space,Str "chapter"],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Str "."],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Link ("",[],[]) [Str "A",Space,Str "chapter"] ("#anchor",""),Str "."]]
+[Header 1 ("a-chapter",[],[]) [Span ("anchor",[],[]) [],Str "A",Space,Str "chapter"],Para [Str "Some",Space,Str "text."],Header 1 ("another-chapter",[],[]) [Str "Another",Space,Str "chapter"],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Str "Another",Space,Str "chapter."],Para [Str "A",Space,Str "reference",Space,Str "to",Space,Link ("",[],[]) [Str "A",Space,Str "chapter"] ("#anchor",""),Str "."]]
diff --git a/test/rtf/unicode.native b/test/rtf/unicode.native
--- a/test/rtf/unicode.native
+++ b/test/rtf/unicode.native
@@ -1,3 +1,7 @@
 Pandoc
   Meta { unMeta = fromList [] }
-  [ Para [ Str "\8220hi\8221\8216hi\8217\61623\945\228" ] ]
+  [ Para
+      [ Str
+          "\8220hi\8221\8216hi\8217\61623\945\228\119867unpaired"
+      ]
+  ]
diff --git a/test/rtf/unicode.rtf b/test/rtf/unicode.rtf
--- a/test/rtf/unicode.rtf
+++ b/test/rtf/unicode.rtf
@@ -5,5 +5,7 @@
 \u-3913?
 \u945a
 {\uc2\u228\'E8a}
+\uc1\u-10187 ?\u-9157 ?
+\u-10187 ?unpaired
 \par
 }
diff --git a/test/test-pandoc.hs b/test/test-pandoc.hs
--- a/test/test-pandoc.hs
+++ b/test/test-pandoc.hs
@@ -46,6 +46,7 @@
 import qualified Tests.Writers.Ms
 import qualified Tests.Writers.Muse
 import qualified Tests.Writers.Native
+import qualified Tests.Writers.ODT
 import qualified Tests.Writers.Org
 import qualified Tests.Writers.Plain
 import qualified Tests.Writers.Powerpoint
@@ -80,6 +81,7 @@
           , testGroup "Plain" Tests.Writers.Plain.tests
           , testGroup "AsciiDoc" Tests.Writers.AsciiDoc.tests
           , testGroup "Docx" Tests.Writers.Docx.tests
+          , testGroup "ODT" Tests.Writers.ODT.tests
           , testGroup "RST" Tests.Writers.RST.tests
           , testGroup "TEI" Tests.Writers.TEI.tests
           , testGroup "markua" Tests.Writers.Markua.tests
diff --git a/test/typst-reader.native b/test/typst-reader.native
--- a/test/typst-reader.native
+++ b/test/typst-reader.native
@@ -187,6 +187,134 @@
           ]
           (TableFoot ( "" , [] , [] ) [])
       ]
+  , Table
+      ( "" , [] , [] )
+      (Caption Nothing [])
+      [ ( AlignDefault , ColWidthDefault )
+      , ( AlignDefault , ColWidthDefault )
+      , ( AlignDefault , ColWidthDefault )
+      , ( AlignDefault , ColWidthDefault )
+      ]
+      (TableHead ( "" , [] , [] ) [])
+      [ TableBody
+          ( "" , [] , [] )
+          (RowHeadColumns 0)
+          []
+          [ Row
+              ( "" , [] , [] )
+              [ Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "1" ] ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain
+                      [ Str "A"
+                      , Space
+                      , Str "longer"
+                      , Space
+                      , Str "descriptive"
+                      , Space
+                      , Str "label"
+                      , Space
+                      , Str "that"
+                      , Space
+                      , Str "wraps"
+                      ]
+                  ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "2" ] ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain
+                      [ Str "Another"
+                      , Space
+                      , Str "longer"
+                      , Space
+                      , Str "label"
+                      ]
+                  ]
+              ]
+          ]
+      ]
+      (TableFoot ( "" , [] , [] ) [])
+  , Table
+      ( "" , [] , [] )
+      (Caption Nothing [])
+      [ ( AlignDefault , ColWidth 0.25 )
+      , ( AlignDefault , ColWidth 0.25 )
+      , ( AlignDefault , ColWidth 0.5 )
+      ]
+      (TableHead ( "" , [] , [] ) [])
+      [ TableBody
+          ( "" , [] , [] )
+          (RowHeadColumns 0)
+          []
+          [ Row
+              ( "" , [] , [] )
+              [ Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "a" ] ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "b" ] ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "c" ] ]
+              ]
+          ]
+      ]
+      (TableFoot ( "" , [] , [] ) [])
+  , Table
+      ( "" , [] , [] )
+      (Caption Nothing [])
+      [ ( AlignDefault , ColWidthDefault )
+      , ( AlignDefault , ColWidthDefault )
+      ]
+      (TableHead ( "" , [] , [] ) [])
+      [ TableBody
+          ( "" , [] , [] )
+          (RowHeadColumns 0)
+          []
+          [ Row
+              ( "" , [] , [] )
+              [ Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "d" ] ]
+              , Cell
+                  ( "" , [] , [] )
+                  AlignDefault
+                  (RowSpan 1)
+                  (ColSpan 1)
+                  [ Plain [ Str "e" ] ]
+              ]
+          ]
+      ]
+      (TableFoot ( "" , [] , [] ) [])
   , Div
       ( "" , [ "columns-flow" ] , [ ( "count" , "2" ) ] )
       [ Para
diff --git a/test/typst-reader.typ b/test/typst-reader.typ
--- a/test/typst-reader.typ
+++ b/test/typst-reader.typ
@@ -24,6 +24,21 @@
   ..nums.map(n => str(fib(n))),
 ))
 
+#table(
+  columns: (auto, 1fr, auto, 1fr),
+  [1], [A longer descriptive label that wraps], [2], [Another longer label],
+)
+
+#table(
+  columns: (1fr, 1fr, 2fr),
+  [a], [b], [c],
+)
+
+#table(
+  columns: (auto, auto),
+  [d], [e],
+)
+
 #include "undergradmath.typ"
 
 
diff --git a/test/writer.opendocument b/test/writer.opendocument
--- a/test/writer.opendocument
+++ b/test/writer.opendocument
@@ -12,12 +12,6 @@
     <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Quotations">
       <style:paragraph-properties fo:margin-left="0.5in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" />
     </style:style>
-    <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Quotations">
-      <style:paragraph-properties fo:margin-left="0.5in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" />
-    </style:style>
-    <style:style style:name="P3" style:family="paragraph" style:parent-style-name="Quotations">
-      <style:paragraph-properties fo:margin-left="0.5in" fo:margin-right="0in" fo:text-indent="0in" style:auto-text-indent="false" />
-    </style:style>
     <text:list-style style:name="Pandoc_5f_Numbering_5f_1">
       <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" style:num-format="1" style:num-prefix="(" style:num-suffix=")">
         <style:list-level-properties text:space-before="0.0000in" text:min-label-width="0.1965in" text:min-label-distance="0.1in" />
@@ -275,7 +269,7 @@
 </text:list>
 <text:p text:style-name="Quotations">Nested block quotes:</text:p>
 <text:p text:style-name="P1">nested</text:p>
-<text:p text:style-name="P2">nested</text:p>
+<text:p text:style-name="P1">nested</text:p>
 <text:p text:style-name="First_20_paragraph">This should not be a block quote: 2
 &gt; 1.</text:p>
 <text:p text:style-name="Text_20_body">And a following paragraph.</text:p>
@@ -620,7 +614,7 @@
 crisp, pleasant to taste</text:p>
 <text:p text:style-name="Definition_20_Term"><text:span text:style-name="Emphasis">orange</text:span></text:p>
 <text:p text:style-name="Definition_20_Definition">orange
-fruit</text:p><text:p text:style-name="Preformatted_20_Text">{ orange code block }</text:p><text:p text:style-name="P3">orange
+fruit</text:p><text:p text:style-name="Preformatted_20_Text">{ orange code block }</text:p><text:p text:style-name="P1">orange
 block quote</text:p>
 <text:p text:style-name="First_20_paragraph">Multiple definitions,
 tight:</text:p>
diff --git a/test/writer.typst b/test/writer.typst
--- a/test/writer.typst
+++ b/test/writer.typst
@@ -542,6 +542,7 @@
 #block[
 #block[
 foo
+
 ]
 ]
 #block[
@@ -556,6 +557,7 @@
 
 #block[
 foo
+
 ]
 This should be a code block, though:
 
diff --git a/xml-light/Text/Pandoc/XML/Light.hs b/xml-light/Text/Pandoc/XML/Light.hs
--- a/xml-light/Text/Pandoc/XML/Light.hs
+++ b/xml-light/Text/Pandoc/XML/Light.hs
@@ -42,7 +42,6 @@
   ) where
 
 import qualified Control.Exception as E
-import qualified Text.XML as Conduit
 import qualified Text.XML.Stream.Parse as P
 import Data.Conduit (runConduit, (.|))
 import qualified Data.Conduit.List as CL
@@ -50,7 +49,6 @@
 import qualified Data.Text as T
 import qualified Data.Text.Lazy as TL
 import qualified Data.Map as M
-import Data.Maybe (mapMaybe)
 import Text.Pandoc.XML.Light.Types
 import Text.Pandoc.XML.Light.Proc
 import Text.Pandoc.XML.Light.Output
@@ -61,14 +59,20 @@
 parseXMLElement = parseXMLElementWithEntities mempty
 
 -- Drop in replacement for parseXMLDoc in xml-light.
+-- Like 'parseXMLContentsWithEntities', but requires the document to
+-- consist of a single root element.
 parseXMLElementWithEntities :: M.Map T.Text T.Text
                             -> TL.Text -> Either T.Text Element
 parseXMLElementWithEntities entityMap t =
-  elementToElement .  Conduit.documentRoot <$>
-    either (Left . T.pack . E.displayException) Right
-    (Conduit.parseText Conduit.def{ Conduit.psRetainNamespaces = True
-                                  , Conduit.psDecodeEntities =
-                                      entityResolver entityMap } t)
+  parseXMLContentsWithEntities entityMap t >>= documentElement
+ where
+  -- 'parseXMLContentsWithEntities' has already dropped whitespace
+  -- around a lone root element, so anything else left here is either
+  -- a missing root or content outside of it.
+  documentElement [Elem e] = Right e
+  documentElement cs
+    | null [e | Elem e <- cs] = Left "XML document has no root element"
+    | otherwise = Left "unexpected content after the root XML element"
 
 parseXMLContents :: TL.Text -> Either T.Text [Content]
 parseXMLContents = parseXMLContentsWithEntities mempty
@@ -183,25 +187,11 @@
   isWhitespaceText (Text cd) = T.all isSpace (cdData cd)
   isWhitespaceText _         = False
 
-nameToQName :: Conduit.Name -> QName
-nameToQName (Conduit.Name localName mbns mbpref) =
+nameToQName :: XML.Name -> QName
+nameToQName (XML.Name localName mbns mbpref) =
   case mbpref of
     Nothing ->
       case T.stripPrefix "xmlns:" localName of
         Just rest -> QName rest mbns (Just "xmlns")
         Nothing   -> QName localName mbns mbpref
     _ -> QName localName mbns mbpref
-
-elementToElement :: Conduit.Element -> Element
-elementToElement (Conduit.Element name attribMap nodes) =
-  Element (nameToQName name) attrs (mapMaybe nodeToContent nodes) Nothing
- where
-  attrs = map (\(n,v) -> Attr (nameToQName n) v) $
-              M.toList attribMap
-
-nodeToContent :: Conduit.Node -> Maybe Content
-nodeToContent (Conduit.NodeElement el) =
-  Just (Elem (elementToElement el))
-nodeToContent (Conduit.NodeContent t) =
-  Just (Text (CData CDataText t Nothing))
-nodeToContent _ = Nothing
