b2b88bc58ef9

Initial commit (not finished)
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sat, 11 Jan 2020 13:21:39 -0800
parents
children f402fd0f036b
branches/tags (none)
files dev.conf hgweb.conf templates/atom/bookmarkentry.tmpl templates/atom/bookmarks.tmpl templates/atom/branchentry.tmpl templates/atom/branches.tmpl templates/atom/changelog.tmpl templates/atom/changelogentry.tmpl templates/atom/error.tmpl templates/atom/filelog.tmpl templates/atom/header.tmpl templates/atom/map templates/atom/tagentry.tmpl templates/atom/tags.tmpl templates/json/changelist.tmpl templates/json/graph.tmpl templates/json/map templates/paper/bookmarks.tmpl templates/paper/branches.tmpl templates/paper/changeset.tmpl templates/paper/diffstat.tmpl templates/paper/error.tmpl templates/paper/fileannotate.tmpl templates/paper/filecomparison.tmpl templates/paper/filediff.tmpl templates/paper/filelog.tmpl templates/paper/filelogentry.tmpl templates/paper/filerevision.tmpl templates/paper/footer.tmpl templates/paper/graph.tmpl templates/paper/graphentry.tmpl templates/paper/header.tmpl templates/paper/help.tmpl templates/paper/helptopics.tmpl templates/paper/index.tmpl templates/paper/manifest.tmpl templates/paper/map templates/paper/notfound.tmpl templates/paper/search.tmpl templates/paper/shortlog.tmpl templates/paper/shortlogentry.tmpl templates/paper/tags.tmpl templates/raw/changelog.tmpl templates/raw/changeset.tmpl templates/raw/error.tmpl templates/raw/fileannotate.tmpl templates/raw/filediff.tmpl templates/raw/graph.tmpl templates/raw/graphedge.tmpl templates/raw/graphnode.tmpl templates/raw/index.tmpl templates/raw/logentry.tmpl templates/raw/manifest.tmpl templates/raw/map templates/raw/notfound.tmpl templates/raw/search.tmpl templates/rss/bookmarkentry.tmpl templates/rss/bookmarks.tmpl templates/rss/branchentry.tmpl templates/rss/branches.tmpl templates/rss/changelog.tmpl templates/rss/changelogentry.tmpl templates/rss/error.tmpl templates/rss/filelog.tmpl templates/rss/filelogentry.tmpl templates/rss/header.tmpl templates/rss/map templates/rss/tagentry.tmpl templates/rss/tags.tmpl templates/sjl/bookmarks.tmpl templates/sjl/branchentry.tmpl templates/sjl/branches.tmpl templates/sjl/changeset.tmpl templates/sjl/changesetchild.tmpl templates/sjl/changesetparent.tmpl templates/sjl/changesetparentdiff.tmpl templates/sjl/diffstat.tmpl templates/sjl/direntry.tmpl templates/sjl/error.tmpl templates/sjl/fileannotate.tmpl templates/sjl/filecomparison.tmpl templates/sjl/filediff.tmpl templates/sjl/fileentry.tmpl templates/sjl/filelog.tmpl templates/sjl/filelogentry.tmpl templates/sjl/filerevision.tmpl templates/sjl/footer.tmpl templates/sjl/graph.tmpl templates/sjl/graphentry.tmpl templates/sjl/header.tmpl templates/sjl/help.tmpl templates/sjl/helptopics.tmpl templates/sjl/index.tmpl templates/sjl/manifest.tmpl templates/sjl/map templates/sjl/notfound.tmpl templates/sjl/search.tmpl templates/sjl/shortlog.tmpl templates/sjl/shortlogentry.tmpl templates/sjl/tagentry.tmpl templates/sjl/tags.tmpl templates/static/background.png templates/static/coal-file.png templates/static/coal-folder.png templates/static/feed-icon-14x14.png templates/static/followlines.js templates/static/hgicon.png templates/static/hglogo.png templates/static/mercurial.js templates/static/style-extra-coal.css templates/static/style-gitweb.css templates/static/style-monoblue.css templates/static/style-paper.css templates/static/style-sjl.css templates/static/style.css

Changes

diff -r 000000000000 -r b2b88bc58ef9 dev.conf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dev.conf	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+[paths]
+/ = /home/sjl/repos/*
+
+[web]
+style = sjl
+templates = /home/sjl/templates/
+
+[extensions]
diff -r 000000000000 -r b2b88bc58ef9 hgweb.conf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgweb.conf	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+[paths]
+/ = /home/sjl/repos/*
+
+[web]
+style = sjl
+templates = /home/sjl/templates/
+cache = False
+
+[extensions]
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/bookmarkentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/bookmarkentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+ <entry>
+  <title>{bookmark|escape}</title>
+  <link rel="alternate" href="{urlbase}{url|urlescape}rev/{node|short}"/>
+  <id>{urlbase}{url|urlescape}#bookmark-{node}</id>
+  <updated>{date|rfc3339date}</updated>
+  <published>{date|rfc3339date}</published>
+  <content type="text">{bookmark|strip|escape}</content>
+ </entry>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/bookmarks.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/bookmarks.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,11 @@
+{header}
+ <id>{urlbase}{url|urlescape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-bookmarks"/>
+ <link rel="alternate" href="{urlbase}{url|urlescape}bookmarks"/>
+ <title>{repo|escape}: bookmarks</title>
+ <summary>{repo|escape} bookmark history</summary>
+ <author><name>Mercurial SCM</name></author>
+ {lastchange%feedupdated}
+
+{entries%bookmarkentry}
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/branchentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/branchentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+ <entry>
+  <title>{branch|escape}</title>
+  <link rel="alternate" href="{urlbase}{url|urlescape}rev/{node|short}"/>
+  <id>{urlbase}{url|urlescape}#branch-{node}</id>
+  <updated>{date|rfc3339date}</updated>
+  <published>{date|rfc3339date}</published>
+  <content type="text">{branch|strip|escape}</content>
+ </entry>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/branches.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/branches.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,11 @@
+{header}
+ <id>{urlbase}{url|urlescape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-branches"/>
+ <link rel="alternate" href="{urlbase}{url|urlescape}branches"/>
+ <title>{repo|escape}: branches</title>
+ <summary>{repo|escape} branch history</summary>
+ <author><name>Mercurial SCM</name></author>
+ {latestentry%feedupdated}
+
+ {entries%branchentry}
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/changelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/changelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,10 @@
+{header}
+ <!-- Changelog -->
+ <id>{urlbase}{url|urlescape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-log"/>
+ <link rel="alternate" href="{urlbase}{url|urlescape}"/>
+ <title>{repo|escape} Changelog</title>
+ {latestentry%feedupdated}
+
+{entries%changelogentry}
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/changelogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/changelogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,43 @@
+ <entry>
+  <title>{inbranch%"{if(name, '[{name|escape}] ')}"}{branches%"{if(name, '[{name|escape}] ')}"}{desc|strip|firstline|strip|escape|nonempty}</title>
+  <id>{urlbase}{url|urlescape}#changeset-{node}</id>
+  <link href="{urlbase}{url|urlescape}rev/{node|short}"/>
+  <author>
+   <name>{author|person|escape}</name>
+   <email>{author|email|obfuscate}</email>
+  </author>
+  <updated>{date|rfc3339date}</updated>
+  <published>{date|rfc3339date}</published>
+  <content type="xhtml">
+   <table xmlns="http://www.w3.org/1999/xhtml">
+    <tr>
+     <th style="text-align:left;">changeset</th>
+     <td>{node|short}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">branch</th>
+     <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">bookmark</th>
+     <td>{bookmarks%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">tag</th>
+     <td>{tags%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">user</th>
+     <td>{author|obfuscate}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;vertical-align:top;">description</th>
+     <td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;vertical-align:top;">files</th>
+     <td>{files}</td>
+    </tr>
+   </table>
+  </content>
+ </entry>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/error.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/error.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,17 @@
+{header}
+ <!-- Error -->
+ <id>{urlbase}{url|urlescape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-log"/>
+ <link rel="alternate" href="{urlbase}{url|urlescape}"/>
+ <title>Error</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <entry>
+  <title>Error</title>
+  <id>https://mercurial-scm.org/#error</id>
+  <author>
+    <name>mercurial</name>
+  </author>
+  <updated>1970-01-01T00:00:00+00:00</updated>
+  <content type="text">{error|escape}</content>
+ </entry>
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/filelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/filelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+{header}
+ <id>{urlbase}{url|urlescape}atom-log/tip/{file|escape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-log/tip/{file|urlescape}"/>
+ <title>{repo|escape}: {file|escape} history</title>
+ {latestentry%feedupdated}
+
+{entries%changelogentry}
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/header.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/header.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="{encoding}"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
\ No newline at end of file
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,18 @@
+default = 'changelog'
+feedupdated = '<updated>{date|rfc3339date}</updated>'
+mimetype = 'application/atom+xml; charset={encoding}'
+header = header.tmpl
+changelog = changelog.tmpl
+changelogentry = changelogentry.tmpl
+filelog = filelog.tmpl
+tags = tags.tmpl
+tagentry = tagentry.tmpl
+bookmarks = bookmarks.tmpl
+bookmarkentry = bookmarkentry.tmpl
+branches = branches.tmpl
+branchentry = branchentry.tmpl
+error = error.tmpl
+filedifflink = '{file|escape}<br />'
+fileellipses = '{file|escape}<br />'
+filenodelink = '{file|escape}<br />'
+filenolink = '{file|escape}<br />'
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/tagentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/tagentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+ <entry>
+  <title>{tag|escape}</title>
+  <link rel="alternate" href="{urlbase}{url|urlescape}rev/{node|short}"/>
+  <id>{urlbase}{url|urlescape}#tag-{node}</id>
+  <updated>{date|rfc3339date}</updated>
+  <published>{date|rfc3339date}</published>
+  <content type="text">{tag|strip|escape}</content>
+ </entry>
diff -r 000000000000 -r b2b88bc58ef9 templates/atom/tags.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/atom/tags.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,11 @@
+{header}
+ <id>{urlbase}{url|urlescape}</id>
+ <link rel="self" href="{urlbase}{url|urlescape}atom-tags"/>
+ <link rel="alternate" href="{urlbase}{url|urlescape}tags"/>
+ <title>{repo|escape}: tags</title>
+ <summary>{repo|escape} tag history</summary>
+ <author><name>Mercurial SCM</name></author>
+ {latestentry%feedupdated}
+
+{entriesnotip%tagentry}
+</feed>
diff -r 000000000000 -r b2b88bc58ef9 templates/json/changelist.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/json/changelist.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+\{
+  "node": {node|json},
+  "changeset_count": {changesets|json},
+  "changesets": [{join(entries%changelistentry, ", ")}]
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/json/graph.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/json/graph.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+\{
+  "node": {node|json},
+  "changeset_count": {changesets|json},
+  "changesets": [{join(nodes%graphentry, ", ")}]
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/json/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/json/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,242 @@
+mimetype = 'application/json'
+filerevision = '\{
+  "node": {node|json},
+  "path": {file|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
+  "bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
+  "tags": [{join(tags%changelistentryname, ", ")}],
+  "user": {author|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "phase": {phase|json},
+  "lines": [{join(text%lineentry, ", ")}]
+  }'
+lineentry = '\{
+  "line": {line|json}
+  }'
+search = '\{
+  "node": {node|json},
+  "query": {query|json},
+  "entries": [{join(entries%searchentry, ", ")}]
+  }'
+searchentry = '{changelistentry}'
+# changelog and shortlog are the same web API but with different
+# number of entries.
+changelog = changelist.tmpl
+shortlog = changelist.tmpl
+graph = graph.tmpl
+changelistentry = '\{
+  "node": {node|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
+  "bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
+  "tags": [{join(tags%changelistentryname, ", ")}],
+  "user": {author|utf8|json},
+  "phase": {phase|json},
+  "parents": [{if(allparents, join(allparents%changesetparent, ", "),
+                  join(parent%changesetparent, ", "))}]
+  }'
+graphentry = '\{
+  "node": {node|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
+  "bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
+  "tags": [{join(tags%changelistentryname, ", ")}],
+  "user": {author|utf8|json},
+  "phase": {phase|json},
+  "col": {col|json},
+  "row": {row|json},
+  "color": {color|json},
+  "edges": {edges|json},
+  "parents": [{if(allparents, join(allparents%changesetparent, ", "),
+                  join(parent%changesetparent, ", "))}]
+  }'
+changelistentryname = '{name|utf8|json}'
+changeset = '\{
+  "node": {node|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
+  "bookmarks": [{join(changesetbookmark, ", ")}],
+  "tags": [{join(changesettag, ", ")}],
+  "user": {author|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "phase": {phase|json}
+  }'
+changesetbranch = '{name|utf8|json}'
+changesetbookmark = '{bookmark|utf8|json}'
+changesettag = '{tag|utf8|json}'
+changesetparent = '{node|json}'
+manifest = '\{
+  "node": {node|json},
+  "abspath": {path|json},
+  "directories": [{join(dentries%direntry, ", ")}],
+  "files": [{join(fentries%fileentry, ", ")}],
+  "bookmarks": [{join(bookmarks%name, ", ")}],
+  "tags": [{join(tags%name, ", ")}]
+  }'
+name = '{name|utf8|json}'
+direntry = '\{
+  "abspath": {path|json},
+  "basename": {basename|json},
+  "emptydirs": {emptydirs|json}
+  }'
+fileentry = '\{
+  "abspath": {file|json},
+  "basename": {basename|json},
+  "date": {date|json},
+  "size": {size|json},
+  "flags": {permissions|json}
+  }'
+tags = '\{
+  "node": {node|json},
+  "tags": [{join(entriesnotip%tagentry, ", ")}]
+  }'
+tagentry = '\{
+  "tag": {tag|utf8|json},
+  "node": {node|json},
+  "date": {date|json}
+  }'
+bookmarks = '\{
+  "node": {node|json},
+  "bookmarks": [{join(entries%bookmarkentry, ", ")}]
+  }'
+bookmarkentry = '\{
+  "bookmark": {bookmark|utf8|json},
+  "node": {node|json},
+  "date": {date|json}
+  }'
+branches = '\{
+  "branches": [{join(entries%branchentry, ", ")}]
+  }'
+branchentry = '\{
+  "branch": {branch|utf8|json},
+  "node": {node|json},
+  "date": {date|json},
+  "status": {status|json}
+  }'
+shortlogentry = '{changelistentry}'
+summary = '\{
+  "node": {node|json},
+  "lastchange": {lastchange|json},
+  "bookmarks": [{join(bookmarks%bookmarkentry, ", ")}],
+  "branches": [{join(branches%branchentry, ", ")}],
+  "shortlog": [{join(shortlog%shortlogentry, ", ")}],
+  "tags": [{join(tags%tagentry, ", ")}],
+  "archives": [{join(archives%archiveentry, ", ")}],
+  "labels": {labels|json}
+  }'
+archiveentry = '\{
+  "node": {node|json},
+  "extension": {extension|json},
+  "type": {type|json},
+  "url": {"{urlbase}{url}archive/{node}{extension}"|json}
+  }'
+filediff = '\{
+  "path": {file|json},
+  "node": {node|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "author": {author|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "children": [{join(child%changesetparent, ", ")}],
+  "diff": [{join(diff%diffblock, ", ")}]
+  }'
+diffblock = '\{
+  "blockno": {blockno|json},
+  "lines": [{join(lines, ", ")}]
+  }'
+difflineplus = '\{
+  "t": "+",
+  "n": {lineno|json},
+  "l": {line|json}
+  }'
+difflineminus = '\{
+  "t": "-",
+  "n": {lineno|json},
+  "l": {line|json}
+  }'
+difflineat = '\{
+  "t": "@",
+  "n": {lineno|json},
+  "l": {line|json}
+  }'
+diffline = '\{
+  "t": "",
+  "n": {lineno|json},
+  "l": {line|json}
+  }'
+filecomparison = '\{
+  "path": {file|json},
+  "node": {node|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "author": {author|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "children": [{join(child%changesetparent, ", ")}],
+  "leftnode": {leftnode|json},
+  "rightnode": {rightnode|json},
+  "comparison": [{join(comparison, ", ")}]
+  }'
+comparisonblock = '\{
+  "lines": [{join(lines, ", ")}]
+  }'
+comparisonline = '\{
+  "t": {type|json},
+  "ln": {leftlineno|json},
+  "ll": {leftline|json},
+  "rn": {rightlineno|json},
+  "rl": {rightline|json}
+  }'
+fileannotate = '\{
+  "abspath": {file|json},
+  "node": {node|json},
+  "author": {author|utf8|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "children": [{join(child%changesetparent, ", ")}],
+  "permissions": {permissions|json},
+  "annotate": [{join(annotate%fileannotation, ", ")}]
+  }'
+fileannotation = '\{
+  "node": {node|json},
+  "author": {author|utf8|json},
+  "desc": {desc|utf8|json},
+  "abspath": {file|json},
+  "targetline": {targetline|json},
+  "line": {line|json},
+  "lineno": {lineno|json},
+  "revdate": {revdate|json}
+  }'
+filelog = '\{
+  "entries": [{join(entries%changelistentry, ", ")}]
+  }'
+helptopics = '\{
+  "topics": [{join(topics%helptopicentry, ", ")}],
+  "earlycommands": [{join(earlycommands%helptopicentry, ", ")}],
+  "othercommands": [{join(othercommands%helptopicentry, ", ")}]
+  }'
+helptopicentry = '\{
+  "topic": {topic|utf8|json},
+  "summary": {summary|utf8|json}
+  }'
+help = '\{
+  "topic": {topic|utf8|json},
+  "rawdoc": {doc|utf8|json}
+  }'
+filenodelink = ''
+filenolink = ''
+index = '\{
+  "entries": [{join(entries%indexentry, ", ")}]
+  }'
+indexentry = '\{
+  "name": {name|utf8|json},
+  "description": {description|utf8|json},
+  "contact": {contact|utf8|json},
+  "lastchange": {lastchange|json},
+  "labels": {labels|json}
+  }'
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/bookmarks.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/bookmarks.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,53 @@
+{header}
+<title>{repo|escape}: bookmarks</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li class="active">bookmarks</li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-bookmarks" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>bookmarks</h3>
+
+{searchform}
+
+<table class="bigtable">
+<thead>
+<tr>
+ <th>bookmark</th>
+ <th>node</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries%bookmarkentry}
+</tbody>
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/branches.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/branches.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,53 @@
+{header}
+<title>{repo|escape}: branches</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-branches" title="Atom feed for {repo|escape}: branches" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-branches" title="RSS feed for {repo|escape}: branches" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li class="active">branches</li>
+</ul>
+<ul>
+ <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-branches" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>branches</h3>
+
+{searchform}
+
+<table class="bigtable">
+<thead>
+<tr>
+ <th>branch</th>
+ <th>node</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries % branchentry}
+</tbody>
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/changeset.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/changeset.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,91 @@
+{header}
+<title>{repo|escape}: {node|short}</title>
+</head>
+<body>
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+ <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+ <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+ <li class="active">changeset</li>
+ <li><a href="{url|urlescape}raw-rev/{symrev}{sessionvars%urlparameter}">raw</a></li>
+ <li><a href="{url|urlescape}file/{symrev}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+ {archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ changeset {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+{if(obsolete, '<tr>
+ <th>obsolete</th>
+ <td>{succsandmarkers%obsfateentry}</td>
+</tr>')}
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{ifeq(count(parent), '2', parent%changesetparentdiff, parent%changesetparent)}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%changesetchild}</td>
+</tr>
+<tr>
+ <th class="files">files</th>
+ <td class="files">{files}</td>
+</tr>
+<tr>
+  <th class="diffstat">diffstat</th>
+  <td class="diffstat">
+    {diffsummary}
+    <a id="diffstatexpand" href="javascript:toggleDiffstat()">[<tt>+</tt>]</a>
+    <div id="diffstatdetails" style="display:none;">
+      <a href="javascript:toggleDiffstat()">[<tt>-</tt>]</a>
+      <table class="diffstat-table stripes2">{diffstat}</table>
+    </div>
+  </td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line diff</div>
+<div class="stripes2 diffblocks">
+{diff}
+</div>
+</div>
+
+</div>
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/diffstat.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/diffstat.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+  <tr>
+    <td class="diffstat-file"><a href="#l{fileno}.1">{file|escape}</a></td>
+    <td class="diffstat-total" align="right">{total}</td>
+    <td class="diffstat-graph">
+      <span class="diffstat-add" style="width:{addpct}%;">&nbsp;</span>
+      <span class="diffstat-remove" style="width:{removepct}%;">&nbsp;</span>
+    </td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/error.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/error.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,42 @@
+{header}
+<title>{repo|escape}: error</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>error</h3>
+
+{searchform}
+
+<div class="description">
+<p>
+An error occurred while processing your request:
+</p>
+<p>
+{error|escape}
+</p>
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/fileannotate.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/fileannotate.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,95 @@
+{header}
+<title>{repo|escape}: {file|escape} annotate</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li class="active">annotate</li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ annotate {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+</table>
+
+{diffoptsform}
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    renderDiffOptsForm();
+</script>
+
+<div class="overflow">
+<table class="bigtable">
+<thead>
+<tr>
+ <th class="annotate">rev</th>
+ <th class="line">&nbsp;&nbsp;line source</th>
+</tr>
+</thead>
+<tbody class="stripes2 sourcelines"
+       data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+       data-selectabletag="TR"
+       data-ishead="{ishead}">
+  {annotate%annotateline}
+</tbody>
+</table>
+</div>
+</div>
+</div>
+
+<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/filecomparison.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/filecomparison.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,90 @@
+{header}
+<title>{repo|escape}: {file|escape} comparison</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li class="active">comparison</li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ comparison {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst">   comparison</div>
+<div class="legend">
+  <span class="legendinfo equal">equal</span>
+  <span class="legendinfo delete">deleted</span>
+  <span class="legendinfo insert">inserted</span>
+  <span class="legendinfo replace">replaced</span>
+</div>
+
+<table class="bigtable">
+  <thead class="header">
+    <tr>
+      <th>{leftrev}:{leftnode|short}</th>
+      <th>{rightrev}:{rightnode|short}</th>
+    </tr>
+  </thead>
+  {comparison}
+</table>
+
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/filediff.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/filediff.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,77 @@
+{header}
+<title>{repo|escape}: {file|escape} diff</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li class="active">diff</li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ diff {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line diff</div>
+<div class="stripes2 diffblocks">
+{diff}
+</div>
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/filelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/filelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,83 @@
+{header}
+<title>{repo|escape}: {file|escape} history</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li class="active">file log</li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-log/tip/{file|urlescape}" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ log {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+ {if(linerange,
+' (following lines {linerange}{if(descend, ', descending')} <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">all revisions for this file</a>)')}
+</h3>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}</div>
+
+<table class="bigtable">
+<thead>
+ <tr>
+  <th class="age">age</th>
+  <th class="author">author</th>
+  <th class="description">description</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries%filelogentry}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}
+</div>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/filelogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/filelogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+ <tr>
+  <td class="age">{date|rfc822date}</td>
+  <td class="author">{author|person}</td>
+  <td class="description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}{rename%filelogrename}
+  </td>
+ </tr>
+ {if(patch, '<tr><td colspan="3">{diff}</td></tr>')}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/filerevision.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/filerevision.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,83 @@
+{header}
+<title>{repo|escape}: {node|short} {file|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li class="active">file</li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ view {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line source</div>
+<pre class="sourcelines stripes4 wrap bottomline"
+     data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+     data-selectabletag="SPAN"
+     data-ishead="{ishead}">
+{text%fileline}
+</pre>
+</div>
+
+<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/footer.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/footer.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,4 @@
+{motd}
+
+</body>
+</html>
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/graph.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/graph.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,86 @@
+{header}
+<title>{repo|escape}: revision graph</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}: log" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}: log" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li class="active">graph</li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+ <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-log" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>graph</h3>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navgraph}
+</div>
+
+<noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
+
+<div id="wrapper">
+<canvas id="graph"></canvas>
+<ul id="graphnodes" class="stripes2">{nodes%graphentry}</ul>
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+var data = {jsdata|json};
+var graph = new Graph();
+graph.scale({bg_height});
+graph.render(data);
+</script>
+
+<div class="navigate">
+<a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navgraph}
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    ajaxScrollInit(
+            '{url|urlescape}graph/%next%{graphvars%urlparameter}',
+            '{nextentry%"{node}"}', <!-- NEXTHASH
+            function (htmlText) \{
+                var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                return m ? m[1] : null;
+            },
+            '#wrapper',
+            '<div class="%class%" style="text-align: center;">%text%</div>',
+            'graph'
+    );
+</script>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/graphentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/graphentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+<li data-node="{node|short}">
+ <div class="fg">
+  <span class="desc">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+  </span>
+  {alltags}
+  <div class="info"><span class="age">{date|rfc822date}</span>, by {author|person}</div>
+ </div>
+</li>
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/header.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/header.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<link rel="icon" href="{staticurl|urlescape}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="{staticurl|urlescape}style-paper.css" type="text/css" />
+<script type="text/javascript" src="{staticurl|urlescape}mercurial.js"></script>
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/help.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/help.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,34 @@
+{header}
+<title>Help: {topic}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+ <li class="active"><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>Help: {topic}</h3>
+{searchform}
+<div id="doc">
+{rstdoc(doc, "html")}
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/helptopics.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/helptopics.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,48 @@
+{header}
+<title>Help: {title}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+{if(subindex,
+  '<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>',
+  '<li class="active">help</li>'
+)}
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+{searchform}
+<table class="bigtable">
+<tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
+{topics % helpentry}
+
+{if(earlycommands, '
+<tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+{earlycommands % helpentry}
+')}
+
+{if(othercommands, '
+<tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+{othercommands % helpentry}
+')}
+
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/index.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/index.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,31 @@
+{header}
+<title>Mercurial repositories index</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+</div>
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+
+<table class="bigtable">
+    <thead>
+    <tr>
+        <th><a href="?sort={sort_name}">Name</a></th>
+        <th><a href="?sort={sort_description}">Description</a></th>
+        <th><a href="?sort={sort_contact}">Contact</a></th>
+        <th><a href="?sort={sort_lastchange}">Last modified</a></th>
+        <th>&nbsp;</th>
+        <th>&nbsp;</th>
+    </tr>
+    </thead>
+    <tbody class="stripes2">
+    {entries%indexentry}
+    </tbody>
+</table>
+</div>
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/manifest.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/manifest.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,60 @@
+{header}
+<title>{repo|escape}: {node|short} {path|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li class="active">browse</li>
+</ul>
+<ul>
+{archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ directory {path|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<table class="bigtable">
+<thead>
+<tr>
+  <th class="name">name</th>
+  <th class="size">size</th>
+  <th class="permissions">permissions</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+<tr class="fileline">
+  <td class="name"><a href="{url|urlescape}file/{symrev}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
+  <td class="size"></td>
+  <td class="permissions">drwxr-xr-x</td>
+</tr>
+{dentries%direntry}
+{fentries%fileentry}
+</tbody>
+</table>
+</div>
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,279 @@
+default = 'shortlog'
+
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+
+changelog = shortlog.tmpl
+shortlog = shortlog.tmpl
+shortlogentry = shortlogentry.tmpl
+graph = graph.tmpl
+graphentry = graphentry.tmpl
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '
+  <tr><td>
+    <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
+      {if(basename, '{basename|escape}', '{topic|escape}')}
+    </a>
+  </td><td>
+    {summary|escape}
+  </td></tr>'
+
+naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+diffstatlink = diffstat.tmpl
+diffstatnolink = diffstat.tmpl
+changelogentry = shortlogentry.tmpl
+searchentry = shortlogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+direntry = '
+  <tr class="fileline">
+    <td class="name">
+      <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
+        <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
+      </a>
+      <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
+        {emptydirs|escape}
+      </a>
+    </td>
+    <td class="size"></td>
+    <td class="permissions">drwxr-xr-x</td>
+  </tr>'
+
+fileentry = '
+  <tr class="fileline">
+    <td class="filename">
+      <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
+        <img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
+      </a>
+    </td>
+    <td class="size">{size}</td>
+    <td class="permissions">{permissions|permissions}</td>
+  </tr>'
+
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+filelogentry = filelogentry.tmpl
+
+annotateline = '
+  <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
+    <td class="annotate parity{blockparity}">
+      {if(blockhead,
+          '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+             {rev}
+           </a>')}
+      <div class="annotate-info">
+        <div>
+          <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+            {node|short}</a>
+          {desc|escape|firstline}
+        </div>
+        <div><em>{author|obfuscate}</em></div>
+        <div>parents: {parents%annotateparent}</div>
+        <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
+        <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+      </div>
+    </td>
+    <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
+  </tr>'
+annotateparent = '
+  <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
+diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
+difflineplus = '
+  <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineminus = '
+  <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineat = '
+  <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+diffline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+
+comparisonblock ='
+  <tbody class="block">
+  {lines}
+  </tbody>'
+comparisonline = '
+  <tr id="{lineid}">
+    <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+    <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+  </tr>'
+
+changesetparent = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+
+changesetparentdiff = '
+  {changesetparent}
+  {ifeq(node, basenode, '(current diff)', '({difffrom})')}'
+
+difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
+
+filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
+filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerename = '{file|escape}@'
+filelogrename = '
+  <span class="base">
+    base
+    <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+      {file|escape}@{node|short}
+    </a>
+  </span>'
+fileannotateparent = '
+  <tr>
+    <td class="metatag">parent:</td>
+    <td>
+      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+        {rename%filerename}{node|short}
+      </a>
+    </td>
+  </tr>'
+changesetchild = ' <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
+fileannotatechild = '
+  <tr>
+    <td class="metatag">child:</td>
+    <td>
+      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+tags = tags.tmpl
+tagentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
+        {tag|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
+        {bookmark|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+branches = branches.tmpl
+branchentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
+        {branch|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
+instabilitytag = '<span class="instability">{instability|escape}</span> '
+changelogtag = '<span class="tag">{name|escape}</span> '
+changesettag = '<span class="tag">{tag|escape}</span> '
+changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
+changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
+changelogbranchname = '<span class="branchname">{name|escape}</span> '
+alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
+
+successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
+obsfateverb = '{obsfateverb(successors, markers)}'
+obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
+obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
+
+filediffparent = '
+  <tr>
+    <th class="parent">parent {rev}:</th>
+    <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+  </tr>'
+filediffchild = '
+  <tr>
+    <th class="child">child {rev}:</th>
+    <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+  </td>
+  </tr>'
+
+indexentry = '
+  <tr>
+    <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
+    <td>{description}</td>
+    <td>{contact|obfuscate}</td>
+    <td class="age">{lastchange|rfc822date}</td>
+    <td class="indexlinks">{archives%indexarchiveentry}</td>
+    <td>
+        {if(isdirectory, '',
+            '<a href="{url|urlescape}atom-log" title="subscribe to repository atom feed">
+                <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository atom feed">
+            </a>'
+            )}
+    </td>
+  </tr>\n'
+indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
+index = index.tmpl
+archiveentry = '
+  <li>
+    <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
+  </li>'
+notfound = notfound.tmpl
+error = error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
+breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
+
+searchform = '
+  <form class="search" action="{url|urlescape}log">
+    {sessionvars%hiddenformentry}
+    <p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
+    <div id="hint">{searchhint}</div>
+  </form>'
+searchhint = 'Find changesets by keywords (author, files, the commit message), revision
+  number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
+
+diffoptsform = '
+  <form id="diffopts-form"
+    data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
+    data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
+    data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
+    data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
+    <span>Ignore whitespace changes - </span>
+    <span>Everywhere:</span>
+    <input id="ignorews-checkbox" type="checkbox" />
+    <span>Within whitespace:</span>
+    <input id="ignorewsamount-checkbox" type="checkbox" />
+    <span>At end of lines:</span>
+    <input id="ignorewseol-checkbox" type="checkbox" />
+  </form>'
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/notfound.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/notfound.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,12 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+<body>
+
+<h2>Mercurial repository not found</h2>
+
+The specified repository "{repo|escape}" is unknown, sorry.
+
+Please go back to the <a href="{url|urlescape}">main repository list page</a>.
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/search.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/search.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,64 @@
+{header}
+<title>{repo|escape}: searching for {query|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>searching for '{query|escape}'</h3>
+
+<p>
+Assuming {modedesc}.
+{if(showforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}&forcekw=1">
+Use {showforcekw}</a> instead.')}
+{if(showunforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}">
+Use {showunforcekw}</a> instead.')}
+</p>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+</div>
+
+<table class="bigtable">
+<thead>
+ <tr>
+  <th class="age">age</th>
+  <th class="author">author</th>
+  <th class="description">description</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+</div>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/shortlog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/shortlog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,89 @@
+{header}
+<title>{repo|escape}: log</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li class="active">log</li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+{archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-log" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>log</h3>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+<table class="bigtable">
+<thead>
+ <tr>
+  <th class="age">age</th>
+  <th class="author">author</th>
+  <th class="description">description</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries%shortlogentry}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    ajaxScrollInit(
+            '{url|urlescape}shortlog/%next%{sessionvars%urlparameter}',
+            '{nextentry%"{node}"}', <!-- NEXTHASH
+            function (htmlText) \{
+                var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                return m ? m[1] : null;
+            },
+            '.bigtable > tbody',
+            '<tr class="%class%">\\
+            <td colspan="3" style="text-align: center;">%text%</td>\\
+            </tr>'
+    );
+</script>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/shortlogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/shortlogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+ <tr>
+  <td class="age">{date|rfc822date}</td>
+  <td class="author">{author|person}</td>
+  <td class="description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}
+  </td>
+ </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/paper/tags.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/paper/tags.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,53 @@
+{header}
+<title>{repo|escape}: tags</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-tags" title="Atom feed for {repo|escape}: tags" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-tags" title="RSS feed for {repo|escape}: tags" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li class="active">tags</li>
+<li><a href="{url|urlescape}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-tags" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>tags</h3>
+
+{searchform}
+
+<table class="bigtable">
+<thead>
+<tr>
+ <th>tag</th>
+ <th>node</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries%tagentry}
+</tbody>
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/changelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/changelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+{header}
+# HG changelog
+# Node ID {node}
+
+{entries%changelogentry}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/changeset.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/changeset.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+{header}
+# HG changeset patch
+# User {author}
+# Date {date|hgdate}
+# Node ID {node}
+{parent%changesetparent}
+{desc}
+
+{diff}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/error.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/error.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,2 @@
+{header}
+error: {error}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/fileannotate.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/fileannotate.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+{header}
+{annotate%annotateline}
+{footer}
+
+
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/filediff.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/filediff.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+{header}
+{diff}
+{footer}
+
+
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/graph.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/graph.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+# HG graph
+# Node ID {node}
+# Rows shown {rows}
+
+{nodes%graphnode}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/graphedge.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/graphedge.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,1 @@
+edge:        ({col}, {row}) -> ({nextcol}, {nextrow}) (color {color})
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/graphnode.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/graphnode.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+changeset:   {node|short}
+user:        {author|person}
+date:        {date|age}
+summary:     {desc|firstline|nonempty}
+{branches%branchname}{tags%tagname}{bookmarks%bookmarkname}
+node:        ({col}, {row}) (color {color})
+{edges%graphedge}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/index.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/index.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,2 @@
+{header}
+{entries%indexentry}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/logentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/logentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+changeset:   {node}
+revision:    {rev}
+user:        {author}
+date:        {date|rfc822date}
+summary:     {desc}
+{branches%branchname}{tags%tagname}{bookmarks%bookmarkname}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/manifest.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/manifest.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,3 @@
+{header}
+{dentries%direntry}{fentries%fileentry}
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,42 @@
+default = 'shortlog'
+shortlog = "'raw' is not a browsable style"
+changelog = changelog.tmpl
+changelogentry = logentry.tmpl
+search = search.tmpl
+searchentry = logentry.tmpl
+mimetype = 'text/plain; charset={encoding}'
+header = ''
+footer = ''
+changeset = changeset.tmpl
+difflineplus = '{line}'
+difflineminus = '{line}'
+difflineat = '{line}'
+diffline = '{line}'
+changesetparent = '# Parent  {node}'
+changesetchild = '# Child   {node}'
+filenodelink = ''
+filenolink = ''
+fileline = '{line}'
+diffblock = '{lines}'
+filediff = filediff.tmpl
+fileannotate = fileannotate.tmpl
+annotateline = '{author|user}@{rev}: {line}'
+manifest = manifest.tmpl
+direntry = 'drwxr-xr-x {basename}\n'
+fileentry = '{permissions|permissions} {size} {basename}\n'
+index = index.tmpl
+notfound = notfound.tmpl
+error = error.tmpl
+indexentry = '{url}\n'
+tags = '{entries%tagentry}'
+tagentry = '{tag}	{node}\n'
+bookmarks = '{entries%bookmarkentry}'
+bookmarkentry = '{bookmark}	{node}\n'
+branches = '{entries%branchentry}'
+branchentry = '{branch}	{node}	{status}\n'
+graph = graph.tmpl
+graphnode = graphnode.tmpl
+graphedge = graphedge.tmpl
+bookmarkname = 'bookmark:    {name}\n'
+branchname = 'branch:      {name}\n'
+tagname = 'tag:         {name}\n'
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/notfound.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/notfound.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,2 @@
+{header}
+error: repository {repo} not found
diff -r 000000000000 -r b2b88bc58ef9 templates/raw/search.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/raw/search.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+{header}
+# HG changesets search
+# Node ID {node}
+# Query "{query}"
+# Mode {modedesc}
+
+{entries%changelogentry}
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/bookmarkentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/bookmarkentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+<item>
+    <title>{bookmark|escape}</title>
+    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
+    <description><![CDATA[{bookmark|strip|escape|addbreaks}]]></description>
+    <pubDate>{date|rfc822date}</pubDate>
+</item>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/bookmarks.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/bookmarks.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+    <title>{repo|escape}: bookmarks</title>
+    <description>{repo|escape} bookmark history</description>
+    {entries%bookmarkentry}
+  </channel>
+</rss>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/branchentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/branchentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+<item>
+    <title>{branch|escape}</title>
+    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
+    <description><![CDATA[{branch|strip|escape|addbreaks}]]></description>
+    <pubDate>{date|rfc822date}</pubDate>
+</item>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/branches.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/branches.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+    <title>{repo|escape}: branches</title>
+    <description>{repo|escape} branch history</description>
+    {entries%branchentry}
+  </channel>
+</rss>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/changelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/changelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+    <title>{repo|escape} Changelog</title>
+    <description>{repo|escape} Changelog</description>
+    {entries%changelogentry}
+  </channel>
+</rss>
\ No newline at end of file
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/changelogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/changelogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,41 @@
+<item>
+    <title>{inbranch%"{if(name, '[{name|escape}] ')}"}{branches%"{if(name, '[{name|escape}] ')}"}{desc|strip|firstline|strip|escape}</title>
+    <guid isPermaLink="true">{urlbase}{url|urlescape}rev/{node|short}</guid>
+    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
+    <description>
+    <![CDATA[
+        <table>
+            <tr>
+                <th style="text-align:left;">changeset</th>
+                <td>{node|short}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">branch</th>
+                <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">bookmark</th>
+                <td>{bookmarks%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">tag</th>
+                <td>{tags%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">user</th>
+                <td>{author|obfuscate}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">description</th>
+                <td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">files</th>
+                <td>{files}</td>
+            </tr>
+        </table>
+    ]]>
+    </description>
+    <author>{author|obfuscate}</author>
+    <pubDate>{date|rfc822date}</pubDate>
+</item>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/error.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/error.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,10 @@
+{header}
+    <title>Error</title>
+    <description>Error</description>
+    <item>
+      <title>Error</title>
+      <description>{error|escape}</description>
+      <guid>https://mercurial-scm.org/#error</guid>
+    </item>
+  </channel>
+</rss>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/filelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/filelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+    <title>{repo|escape}: {file|escape} history</title>
+    <description>{file|escape} revision history</description>
+    {entries%filelogentry}
+  </channel>
+</rss>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/filelogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/filelogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+<item>
+    <title>{desc|strip|firstline|strip|escape}</title>
+    <link>{urlbase}{url|urlescape}log/{node|short}/{file|urlescape}</link>
+    <description><![CDATA[{desc|strip|escape|websub|addbreaks|nonempty}]]></description>
+    <author>{author|obfuscate}</author>
+    <pubDate>{date|rfc822date}</pubDate>
+</item>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/header.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/header.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="{encoding}"?>
+<rss version="2.0">
+  <channel>
+    <link>{urlbase}{url|urlescape}</link>
+    <language>en-us</language>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,18 @@
+default = 'changelog'
+mimetype = 'text/xml; charset={encoding}'
+header = header.tmpl
+changelog = changelog.tmpl
+changelogentry = changelogentry.tmpl
+filelog = filelog.tmpl
+filelogentry = filelogentry.tmpl
+tags = tags.tmpl
+tagentry = tagentry.tmpl
+bookmarks = bookmarks.tmpl
+bookmarkentry = bookmarkentry.tmpl
+branches = branches.tmpl
+branchentry = branchentry.tmpl
+error = error.tmpl
+filedifflink = '{file|escape}<br />'
+fileellipses = '{file|escape}<br />'
+filenodelink = '{file|escape}<br />'
+filenolink = '{file|escape}<br />'
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/tagentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/tagentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+<item>
+    <title>{tag|escape}</title>
+    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
+    <description><![CDATA[{tag|strip|escape|addbreaks}]]></description>
+    <pubDate>{date|rfc822date}</pubDate>
+</item>
diff -r 000000000000 -r b2b88bc58ef9 templates/rss/tags.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/rss/tags.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,6 @@
+{header}
+    <title>{repo|escape}: tags</title>
+    <description>{repo|escape} tag history</description>
+    {entriesnotip%tagentry}
+  </channel>
+</rss>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/bookmarks.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/bookmarks.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,50 @@
+{header}
+<title>{repo|escape}: bookmarks</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li class="active">bookmarks</li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-bookmarks" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>bookmarks</h3>
+
+{searchform}
+
+<table class="bigtable">
+<thead>
+<tr>
+ <th>bookmark</th>
+ <th>node</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries%bookmarkentry}
+</tbody>
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/branchentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/branchentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,12 @@
+  <tr class="tagEntry">
+    <td class="branch-name">
+      <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
+        {branch|escape}
+      </a>
+    </td>
+    <td class="branch-hash">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}" class="{status}">
+        {node|short}
+      </a>
+    </td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/branches.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/branches.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,43 @@
+{header}
+<title>branches / {repo|escape} / hg.stevelosh.com</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-branches" title="Atom feed for {repo|escape}: branches" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-branches" title="RSS feed for {repo|escape}: branches" />
+</head>
+<body>
+
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li><a href="{url|urlescape}">log</a></li>
+    <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li class="active"><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    </ul>
+</div>
+
+{searchform}
+
+<h3>Branches</h3>
+
+<table class="smalltable">
+<thead>
+<tr>
+ <th>branch</th>
+ <th>commit</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries % branchentry}
+</tbody>
+</table>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/changeset.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/changeset.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,74 @@
+{header}
+<title>{repo|escape}: {node|short}</title>
+</head>
+<body>
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li><a href="{url|urlescape}">log</a></li>
+    <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    <li></li>
+    </ul>
+</div>
+
+{searchform}
+
+<h3>
+    Commit
+    <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}" class="commit-hash">{node|short}</a>
+    {alltags}
+</h3>
+
+<div class="navigate">
+    <a href="{url|urlescape}raw-rev/{symrev}{sessionvars%urlparameter}">raw</a>
+    <a href="{url|urlescape}file/{symrev}{sessionvars%urlparameter}">browse</a>
+</div>
+
+<pre class="commit-full-description">{desc|strip|escape|websub|nonempty}</pre>
+
+<table class="commit-contents">
+    <tr>
+        <th class="author">author</th>
+        <td class="author">{author|obfuscate}</td>
+    </tr>
+    <tr>
+        <th class="date">date</th>
+        <td class="date age">{date|rfc822date}</td>
+    </tr>
+    {if(obsolete, '<tr>
+    <th>obsolete</th>
+    <td>{succsandmarkers%obsfateentry}</td>
+    </tr>')}
+<tr>
+ <th class="author">parent(s)</th>
+ <td class="author">{ifeq(count(parent), '2', parent%changesetparentdiff, parent%changesetparent)}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%changesetchild}</td>
+</tr>
+<tr>
+ <th class="files">files</th>
+ <td class="files">{files}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line diff</div>
+<div class="stripes2 diffblocks">
+{diff}
+</div>
+</div>
+
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/changesetchild.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/changesetchild.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,1 @@
+<a class="commit-hash" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/changesetparent.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/changesetparent.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,1 @@
+<a class="commit-hash" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> 
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/changesetparentdiff.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/changesetparentdiff.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,2 @@
+{changesetparent}
+{ifeq(node, basenode, '(current diff)', '({difffrom})')}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/diffstat.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/diffstat.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,8 @@
+  <tr>
+    <td class="diffstat-file"><a href="#l{fileno}.1">{file|escape}</a></td>
+    <td class="diffstat-total" align="right">{total}</td>
+    <td class="diffstat-graph">
+      <span class="diffstat-add" style="width:{addpct}%;">&nbsp;</span>
+      <span class="diffstat-remove" style="width:{removepct}%;">&nbsp;</span>
+    </td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/direntry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/direntry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+<tr class="fileline">
+    <td class="name">
+        <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/>
+        <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}/</a><a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
+    </td>
+    <td class="size"></td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/error.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/error.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,38 @@
+{header}
+<title>{repo|escape}: error</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+</div>
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>error</h3>
+
+{searchform}
+
+<div class="description">
+<p>
+An error occurred while processing your request:
+</p>
+<p>
+{error|escape}
+</p>
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/fileannotate.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/fileannotate.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,91 @@
+{header}
+<title>{repo|escape}: {file|escape} annotate</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li class="active">annotate</li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ annotate {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+</table>
+
+{diffoptsform}
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    renderDiffOptsForm();
+</script>
+
+<div class="overflow">
+<table class="bigtable">
+<thead>
+<tr>
+ <th class="annotate">rev</th>
+ <th class="line">&nbsp;&nbsp;line source</th>
+</tr>
+</thead>
+<tbody class="stripes2 sourcelines"
+       data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+       data-selectabletag="TR"
+       data-ishead="{ishead}">
+  {annotate%annotateline}
+</tbody>
+</table>
+</div>
+</div>
+</div>
+
+<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/filecomparison.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/filecomparison.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,86 @@
+{header}
+<title>{repo|escape}: {file|escape} comparison</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li class="active">comparison</li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ comparison {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst">   comparison</div>
+<div class="legend">
+  <span class="legendinfo equal">equal</span>
+  <span class="legendinfo delete">deleted</span>
+  <span class="legendinfo insert">inserted</span>
+  <span class="legendinfo replace">replaced</span>
+</div>
+
+<table class="bigtable">
+  <thead class="header">
+    <tr>
+      <th>{leftrev}:{leftnode|short}</th>
+      <th>{rightrev}:{rightnode|short}</th>
+    </tr>
+  </thead>
+  {comparison}
+</table>
+
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/filediff.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/filediff.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,73 @@
+{header}
+<title>{repo|escape}: {file|escape} diff</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li class="active">diff</li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ diff {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line diff</div>
+<div class="stripes2 diffblocks">
+{diff}
+</div>
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/fileentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/fileentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+<tr class="fileline">
+    <td class="filename">
+        <img src="{staticurl|urlescape}coal-file.png" alt="file"/>
+        <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
+    </td>
+    <td class="size">{size}</td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/filelog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/filelog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,79 @@
+{header}
+<title>{repo|escape}: {file|escape} history</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li class="active">file log</li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+<div class="atom-logo">
+<a href="{url|urlescape}atom-log/tip/{file|urlescape}" title="subscribe to atom feed">
+<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+</a>
+</div>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ log {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+ {if(linerange,
+' (following lines {linerange}{if(descend, ', descending')} <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">all revisions for this file</a>)')}
+</h3>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}</div>
+
+<table class="bigtable">
+<thead>
+ <tr>
+  <th class="age">age</th>
+  <th class="author">author</th>
+  <th class="description">description</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries%filelogentry}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log/{symrev}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}
+</div>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/filelogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/filelogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+ <tr>
+  <td class="age">{date|rfc822date}</td>
+  <td class="author">{author|person}</td>
+  <td class="description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}{rename%filelogrename}
+  </td>
+ </tr>
+ {if(patch, '<tr><td colspan="3">{diff}</td></tr>')}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/filerevision.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/filerevision.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,79 @@
+{header}
+<title>{repo|escape}: {node|short} {file|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li class="active">file</li>
+<li><a href="{url|urlescape}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url|urlescape}diff/{symrev}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url|urlescape}comparison/{symrev}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url|urlescape}raw-file/{symrev}/{file|urlescape}">raw</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>
+ view {file|escape} @ {rev}:<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ {alltags}
+</h3>
+
+{searchform}
+
+<div class="description">{desc|strip|escape|websub|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst linewraptoggle">line wrap: <a class="linewraplink" href="javascript:toggleLinewrap()">on</a></div>
+<div class="sourcefirst"> line source</div>
+<pre class="sourcelines stripes4 wrap bottomline"
+     data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}"
+     data-selectabletag="SPAN"
+     data-ishead="{ishead}">
+{text%fileline}
+</pre>
+</div>
+
+<script type="text/javascript" src="{staticurl|urlescape}followlines.js"></script>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/footer.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/footer.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,4 @@
+{motd}
+
+</body>
+</html>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/graph.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/graph.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,73 @@
+{header}
+<title>{repo|escape}: revision graph</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}: log" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}: log" />
+</head>
+<body>
+
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li><a href="{url|urlescape}">log</a></li>
+    <li class="active"><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    </ul>
+</div>
+
+{searchform}
+
+<h3>Graph</h3>
+
+<div class="navigate">
+<a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+| at revision {rev}: {changenav%navgraph}
+</div>
+
+<noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
+
+<div id="wrapper">
+<canvas id="graph"></canvas>
+<ul id="graphnodes" class="stripes2">{nodes%graphentry}</ul>
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+var data = {jsdata|json};
+var graph = new Graph();
+graph.scale({bg_height});
+graph.render(data);
+</script>
+
+<div class="navigate">
+<a href="{url|urlescape}graph/{symrev}{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}graph/{symrev}{morevars%urlparameter}">more</a>
+| at revision {rev}: {changenav%navgraph}
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    ajaxScrollInit(
+            '{url|urlescape}graph/%next%{graphvars%urlparameter}',
+            '{nextentry%"{node}"}', <!-- NEXTHASH
+            function (htmlText) \{
+                var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                return m ? m[1] : null;
+            },
+            '#wrapper',
+            '<div class="%class%" style="text-align: center;">%text%</div>',
+            'graph'
+    );
+</script>
+
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/graphentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/graphentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,9 @@
+<li data-node="{node|short}">
+ <div class="fg">
+  <span class="desc">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+  </span>
+  {alltags}
+  <div class="info"><span class="age">{date|rfc822date}</span>, by {author|person}</div>
+ </div>
+</li>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/header.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/header.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<link rel="icon" href="{staticurl|urlescape}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="{staticurl|urlescape}style-sjl.css" type="text/css" />
+<script type="text/javascript" src="{staticurl|urlescape}mercurial.js"></script>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/help.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/help.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,33 @@
+{header}
+<title>Help: {topic}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+ <li class="active"><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>Help: {topic}</h3>
+{searchform}
+<div id="doc">
+{rstdoc(doc, "html")}
+</div>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/helptopics.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/helptopics.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,47 @@
+{header}
+<title>Help: {title}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+{if(subindex,
+  '<li><a href="{url|urlescape}help{sessionvars%urlparameter}">help</a></li>',
+  '<li class="active">help</li>'
+)}
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+{searchform}
+<table class="bigtable">
+<tr><td colspan="2"><h2><a name="topics" href="#topics">Topics</a></h2></td></tr>
+{topics % helpentry}
+
+{if(earlycommands, '
+<tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+{earlycommands % helpentry}
+')}
+
+{if(othercommands, '
+<tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+{othercommands % helpentry}
+')}
+
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/index.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/index.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,16 @@
+{header}
+<title>hg.stevelosh.com</title>
+</head>
+<body>
+
+<div class="main">
+    <h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+    <div class="menu"></div>
+
+    <table class="bigtable repos">
+        <tbody class="stripes2">
+        {entries%indexentry}
+        </tbody>
+    </table>
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/manifest.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/manifest.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,48 @@
+{header}
+<title>{path|escape} @ {node|short} / {repo|escape} / hg.stevelosh.com</title>
+</head>
+<body>
+
+<div class="main">
+
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li><a href="{url|urlescape}">log</a></li>
+    <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    </ul>
+</div>
+
+{searchform}
+
+<h3>
+ <a class="path" href="{sessionvars%urlparameter}">{path|escape}</a>
+ @
+ <a class="commit-hash" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+</h3>
+
+
+<table class="bigtable">
+<thead>
+<tr>
+  <th class="name">name</th>
+  <th class="size">size</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+<tr class="fileline">
+  <td class="name"><a href="{url|urlescape}file/{symrev}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
+  <td class="size"></td>
+</tr>
+{dentries%direntry}
+{fentries%fileentry}
+</tbody>
+</table>
+</div>
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/map
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/map	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,223 @@
+default = 'shortlog'
+
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+
+changelog = shortlog.tmpl
+shortlog = shortlog.tmpl
+shortlogentry = shortlogentry.tmpl
+graph = graph.tmpl
+graphentry = graphentry.tmpl
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '
+  <tr><td>
+    <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
+      {if(basename, '{basename|escape}', '{topic|escape}')}
+    </a>
+  </td><td>
+    {summary|escape}
+  </td></tr>'
+
+naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+diffstatlink = diffstat.tmpl
+diffstatnolink = diffstat.tmpl
+changelogentry = shortlogentry.tmpl
+searchentry = shortlogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+direntry = direntry.tmpl
+
+fileentry = fileentry.tmpl
+
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+filelogentry = filelogentry.tmpl
+
+annotateline = '
+  <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
+    <td class="annotate parity{blockparity}">
+      {if(blockhead,
+          '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+             {rev}
+           </a>')}
+      <div class="annotate-info">
+        <div>
+          <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
+            {node|short}</a>
+          {desc|escape|firstline}
+        </div>
+        <div><em>{author|obfuscate}</em></div>
+        <div>parents: {parents%annotateparent}</div>
+        <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
+        <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+      </div>
+    </td>
+    <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
+  </tr>'
+annotateparent = '
+  <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
+diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
+difflineplus = '
+  <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineminus = '
+  <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+difflineat = '
+  <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+diffline = '
+  <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
+
+comparisonblock ='
+  <tbody class="block">
+  {lines}
+  </tbody>'
+comparisonline = '
+  <tr id="{lineid}">
+    <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+    <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+  </tr>'
+
+changesetparent = changesetparent.tmpl
+
+changesetparentdiff = changesetparentdiff.tmpl
+
+difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
+
+filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
+filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerename = '{file|escape}@'
+filelogrename = '
+  <span class="base">
+    base
+    <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+      {file|escape}@{node|short}
+    </a>
+  </span>'
+fileannotateparent = '
+  <tr>
+    <td class="metatag">parent:</td>
+    <td>
+      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+        {rename%filerename}{node|short}
+      </a>
+    </td>
+  </tr>'
+changesetchild = changesetchild.tmpl
+fileannotatechild = '
+  <tr>
+    <td class="metatag">child:</td>
+    <td>
+      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+tags = tags.tmpl
+tagentry = tagentry.tmpl
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+  <tr class="tagEntry">
+    <td>
+      <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
+        {bookmark|escape}
+      </a>
+    </td>
+    <td class="node">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>'
+branches = branches.tmpl
+branchentry = branchentry.tmpl
+
+phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
+obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
+instabilitytag = '<span class="instability">{instability|escape}</span> '
+changelogtag = '<span class="tag">{name|escape}</span> '
+changesettag = '<span class="tag">{tag|escape}</span> '
+changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
+changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
+changelogbranchname = '<span class="branchname">{name|escape}</span> '
+alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
+
+successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
+obsfateverb = '{obsfateverb(successors, markers)}'
+obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
+obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
+
+filediffparent = '
+  <tr>
+    <th class="parent">parent {rev}:</th>
+    <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+  </tr>'
+filediffchild = '
+  <tr>
+    <th class="child">child {rev}:</th>
+    <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+  </td>
+  </tr>'
+
+indexentry = '
+  <tr>
+    <td class="repo-name"><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
+    <td class="repo-description">{description}</td>
+  </tr>\n'
+
+indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
+index = index.tmpl
+archiveentry = '
+  <li>
+    <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
+  </li>'
+notfound = notfound.tmpl
+error = error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
+breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
+
+searchform = '
+  <form class="search" action="{url|urlescape}log">
+    {sessionvars%hiddenformentry}
+    <input name="rev" id="search1" type="text" size="15" value="{query|escape}" placeholder="Search…" />
+  </form>'
+searchhint = 'Find changesets by keywords (author, files, the commit message), revision
+  number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
+
+diffoptsform = '
+  <form id="diffopts-form"
+    data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
+    data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
+    data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
+    data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
+    <span>Ignore whitespace changes - </span>
+    <span>Everywhere:</span>
+    <input id="ignorews-checkbox" type="checkbox" />
+    <span>Within whitespace:</span>
+    <input id="ignorewsamount-checkbox" type="checkbox" />
+    <span>At end of lines:</span>
+    <input id="ignorewseol-checkbox" type="checkbox" />
+  </form>'
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/notfound.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/notfound.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,12 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+<body>
+
+<h2>Mercurial repository not found</h2>
+
+The specified repository "{repo|escape}" is unknown, sorry.
+
+Please go back to the <a href="{url|urlescape}">main repository list page</a>.
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/search.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/search.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,60 @@
+{header}
+<title>{repo|escape}: searching for {query|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a>
+</div>
+<ul>
+<li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url|urlescape}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
+<h3>searching for '{query|escape}'</h3>
+
+<p>
+Assuming {modedesc}.
+{if(showforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}&forcekw=1">
+Use {showforcekw}</a> instead.')}
+{if(showunforcekw, '<a href="{url|urlescape}log?rev={query|urlescape}">
+Use {showunforcekw}</a> instead.')}
+</p>
+
+{searchform}
+
+<div class="navigate">
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+</div>
+
+<table class="bigtable">
+<thead>
+ <tr>
+  <th class="age">age</th>
+  <th class="author">author</th>
+  <th class="description">description</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries}
+</tbody>
+</table>
+
+<div class="navigate">
+<a href="{url|urlescape}log{lessvars%urlparameter}">less</a>
+<a href="{url|urlescape}log{morevars%urlparameter}">more</a>
+</div>
+
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/shortlog.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/shortlog.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,74 @@
+{header}
+<title>{repo|escape} / hg.stevelosh.com</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li class="active"><a href="{url|urlescape}">log</a></li>
+    <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    </ul>
+</div>
+
+{searchform}
+
+<h3>Log</h3>
+
+
+<div class="navigate navigate-top">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">fewer</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| at revision {rev}: {changenav%navshort}
+</div>
+
+<table class="bigtable shortlog">
+<thead>
+ <tr>
+  <th>commit</th>
+  <th>description</th>
+  <th>author</th>
+  <th>date</th>
+ </tr>
+</thead>
+<tbody class="stripes2">
+{entries%shortlogentry}
+</tbody>
+</table>
+
+<div class="navigate navigate-bottom">
+<a href="{url|urlescape}shortlog/{symrev}{lessvars%urlparameter}">fewer</a>
+<a href="{url|urlescape}shortlog/{symrev}{morevars%urlparameter}">more</a>
+| at revision {rev}: {changenav%navshort}
+</div>
+
+<script type="text/javascript"{if(nonce, ' nonce="{nonce}"')}>
+    ajaxScrollInit(
+            '{url|urlescape}shortlog/%next%{sessionvars%urlparameter}',
+            '{nextentry%"{node}"}', <!-- NEXTHASH
+            function (htmlText) \{
+                var m = htmlText.match(/'(\w+)', <!-- NEXTHASH/);
+                return m ? m[1] : null;
+            },
+            '.bigtable > tbody',
+            '<tr class="%class%">\\
+            <td colspan="4" style="text-align: center;">%text%</td>\\
+            </tr>'
+    );
+</script>
+
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/shortlogentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/shortlogentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,11 @@
+ <tr>
+  <td class="commit-hash">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+  </td>
+  <td class="commit-description">
+   <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>
+   {alltags}
+  </td>
+  <td class="author">{author|person}</td>
+  <td class="age">{date|rfc822date}</td>
+ </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/tagentry.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/tagentry.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,13 @@
+
+  <tr class="tagEntry">
+    <td class="tag-name">
+      <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
+        {tag|escape}
+      </a>
+    </td>
+    <td class="tag-hash">
+      <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
+        {node|short}
+      </a>
+    </td>
+  </tr>
diff -r 000000000000 -r b2b88bc58ef9 templates/sjl/tags.tmpl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sjl/tags.tmpl	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,44 @@
+{header}
+<title>{repo|escape}: tags</title>
+<link rel="alternate" type="application/atom+xml"
+   href="{url|urlescape}atom-tags" title="Atom feed for {repo|escape}: tags" />
+<link rel="alternate" type="application/rss+xml"
+   href="{url|urlescape}rss-tags" title="RSS feed for {repo|escape}: tags" />
+</head>
+<body>
+
+<div class="main">
+<h2 class="breadcrumb"><a href="/">hg.stevelosh.com</a> {pathdef%breadcrumb}</h2>
+
+<div class="menu">
+    <ul>
+    <li><a href="{url|urlescape}">log</a></li>
+    <li><a href="{url|urlescape}graph/{symrev}{sessionvars%urlparameter}">graph</a></li>
+    <li class="active"><a href="{url|urlescape}tags{sessionvars%urlparameter}">tags</a></li>
+    <li><a href="{url|urlescape}branches{sessionvars%urlparameter}">branches</a></li>
+    <li><a href="{url|urlescape}rev/{symrev}{sessionvars%urlparameter}">changeset</a></li>
+    <li><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+    {archives%archiveentry}
+    </ul>
+</div>
+
+{searchform}
+
+<h3>Tags</h3>
+
+
+<table class="smalltable">
+<thead>
+<tr>
+ <th>tag</th>
+ <th>commit</th>
+</tr>
+</thead>
+<tbody class="stripes2">
+{entries%tagentry}
+</tbody>
+</table>
+</div>
+</div>
+
+{footer}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/background.png
Binary file templates/static/background.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/coal-file.png
Binary file templates/static/coal-file.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/coal-folder.png
Binary file templates/static/coal-folder.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/feed-icon-14x14.png
Binary file templates/static/feed-icon-14x14.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/followlines.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/followlines.js	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,286 @@
+// followlines.js - JavaScript utilities for followlines UI
+//
+// Copyright 2017 Logilab SA <contact@logilab.fr>
+//
+// This software may be used and distributed according to the terms of the
+// GNU General Public License version 2 or any later version.
+
+//** Install event listeners for line block selection and followlines action */
+document.addEventListener('DOMContentLoaded', function() {
+    var sourcelines = document.getElementsByClassName('sourcelines')[0];
+    if (typeof sourcelines === 'undefined') {
+        return;
+    }
+    // URL to complement with "linerange" query parameter
+    var targetUri = sourcelines.dataset.logurl;
+    if (typeof targetUri === 'undefined') {
+        return;
+    }
+
+    // Tag of children of "sourcelines" element on which to add "line
+    // selection" style.
+    var selectableTag = sourcelines.dataset.selectabletag;
+    if (typeof selectableTag === 'undefined') {
+        return;
+    }
+
+    var isHead = parseInt(sourcelines.dataset.ishead || "0");
+
+    //* position "element" on top-right of cursor */
+    function positionTopRight(element, event) {
+        var x = (event.clientX + 10) + 'px',
+            y = (event.clientY - 20) + 'px';
+        element.style.top = y;
+        element.style.left = x;
+    }
+
+    // retrieve all direct *selectable* children of class="sourcelines"
+    // element
+    var selectableElements = Array.prototype.filter.call(
+        sourcelines.children,
+        function(x) { return x.tagName === selectableTag; });
+
+    var btnTitleStart = 'start following lines history from here';
+    var btnTitleEnd = 'terminate line block selection here';
+
+    //** return a <button> element with +/- spans */
+    function createButton() {
+        var btn = document.createElement('button');
+        btn.title = btnTitleStart;
+        btn.classList.add('btn-followlines');
+        var plusSpan = document.createElement('span');
+        plusSpan.classList.add('followlines-plus');
+        plusSpan.textContent = '+';
+        btn.appendChild(plusSpan);
+        var br = document.createElement('br');
+        btn.appendChild(br);
+        var minusSpan = document.createElement('span');
+        minusSpan.classList.add('followlines-minus');
+        minusSpan.textContent = '−';
+        btn.appendChild(minusSpan);
+        return btn;
+    }
+
+    // extend DOM with CSS class for selection highlight and action buttons
+    var followlinesButtons = [];
+    for (var i = 0; i < selectableElements.length; i++) {
+        selectableElements[i].classList.add('followlines-select');
+        var btn = createButton();
+        followlinesButtons.push(btn);
+        // insert the <button> as child of `selectableElements[i]` unless the
+        // latter has itself a child  with a "followlines-btn-parent" class
+        // (annotate view)
+        var btnSupportElm = selectableElements[i];
+        var childSupportElms = btnSupportElm.getElementsByClassName(
+            'followlines-btn-parent');
+        if ( childSupportElms.length > 0 ) {
+            btnSupportElm = childSupportElms[0];
+        }
+        var refNode = btnSupportElm.children[0]; // node to insert <button> before
+        btnSupportElm.insertBefore(btn, refNode);
+    }
+
+    // ** re-initialize followlines buttons */
+    function resetButtons() {
+        for (var i = 0; i < followlinesButtons.length; i++) {
+            var btn = followlinesButtons[i];
+            btn.title = btnTitleStart;
+            btn.classList.remove('btn-followlines-end');
+            btn.classList.remove('btn-followlines-hidden');
+        }
+    }
+
+    var lineSelectedCSSClass = 'followlines-selected';
+
+    //** add CSS class on selectable elements in `from`-`to` line range */
+    function addSelectedCSSClass(from, to) {
+        for (var i = from; i <= to; i++) {
+            selectableElements[i].classList.add(lineSelectedCSSClass);
+        }
+    }
+
+    //** remove CSS class from previously selected lines */
+    function removeSelectedCSSClass() {
+        var elements = sourcelines.getElementsByClassName(
+            lineSelectedCSSClass);
+        while (elements.length) {
+            elements[0].classList.remove(lineSelectedCSSClass);
+        }
+    }
+
+    // ** return the element of type "selectableTag" parent of `element` */
+    function selectableParent(element) {
+        var parent = element.parentElement;
+        if (parent === null) {
+            return null;
+        }
+        if (element.tagName === selectableTag && parent.isSameNode(sourcelines)) {
+            return element;
+        }
+        return selectableParent(parent);
+    }
+
+    // ** update buttons title and style upon first click */
+    function updateButtons(selectable) {
+        for (var i = 0; i < followlinesButtons.length; i++) {
+            var btn = followlinesButtons[i];
+            btn.title = btnTitleEnd;
+            btn.classList.add('btn-followlines-end');
+        }
+        // on clicked button, change title to "cancel"
+        var clicked = selectable.getElementsByClassName('btn-followlines')[0];
+        clicked.title = 'cancel';
+        clicked.classList.remove('btn-followlines-end');
+    }
+
+    //** add `listener` on "click" event for all `followlinesButtons` */
+    function buttonsAddEventListener(listener) {
+        for (var i = 0; i < followlinesButtons.length; i++) {
+            followlinesButtons[i].addEventListener('click', listener);
+        }
+    }
+
+    //** remove `listener` on "click" event for all `followlinesButtons` */
+    function buttonsRemoveEventListener(listener) {
+        for (var i = 0; i < followlinesButtons.length; i++) {
+            followlinesButtons[i].removeEventListener('click', listener);
+        }
+    }
+
+    //** event handler for "click" on the first line of a block */
+    function lineSelectStart(e) {
+        var startElement = selectableParent(e.target.parentElement);
+        if (startElement === null) {
+            // not a "selectable" element (maybe <a>): abort, keeping event
+            // listener registered for other click with a "selectable" target
+            return;
+        }
+
+        // update button tooltip text and CSS
+        updateButtons(startElement);
+
+        var startId = parseInt(startElement.id.slice(1));
+        startElement.classList.add(lineSelectedCSSClass); // CSS
+
+        // remove this event listener
+        buttonsRemoveEventListener(lineSelectStart);
+
+        //** event handler for "click" on the last line of the block */
+        function lineSelectEnd(e) {
+            var endElement = selectableParent(e.target.parentElement);
+            if (endElement === null) {
+                // not a <span> (maybe <a>): abort, keeping event listener
+                // registered for other click with <span> target
+                return;
+            }
+
+            // remove this event listener
+            buttonsRemoveEventListener(lineSelectEnd);
+
+            // reset button tooltip text
+            resetButtons();
+
+            // compute line range (startId, endId)
+            var endId = parseInt(endElement.id.slice(1));
+            if (endId === startId) {
+                // clicked twice the same line, cancel and reset initial state
+                // (CSS, event listener for selection start)
+                removeSelectedCSSClass();
+                buttonsAddEventListener(lineSelectStart);
+                return;
+            }
+            var inviteElement = endElement;
+            if (endId < startId) {
+                var tmp = endId;
+                endId = startId;
+                startId = tmp;
+                inviteElement = startElement;
+            }
+
+            addSelectedCSSClass(startId - 1, endId -1);  // CSS
+
+            // append the <div id="followlines"> element to last line of the
+            // selection block
+            var divAndButton = followlinesBox(targetUri, startId, endId, isHead);
+            var div = divAndButton[0],
+                button = divAndButton[1];
+            inviteElement.appendChild(div);
+            // set position close to cursor (top-right)
+            positionTopRight(div, e);
+            // hide all buttons
+            for (var i = 0; i < followlinesButtons.length; i++) {
+                followlinesButtons[i].classList.add('btn-followlines-hidden');
+            }
+
+            //** event handler for cancelling selection */
+            function cancel() {
+                // remove invite box
+                div.parentNode.removeChild(div);
+                // restore initial event listeners
+                buttonsAddEventListener(lineSelectStart);
+                buttonsRemoveEventListener(cancel);
+                for (var i = 0; i < followlinesButtons.length; i++) {
+                    followlinesButtons[i].classList.remove('btn-followlines-hidden');
+                }
+                // remove styles on selected lines
+                removeSelectedCSSClass();
+                resetButtons();
+            }
+
+            // bind cancel event to click on <button>
+            button.addEventListener('click', cancel);
+            // as well as on an click on any source line
+            buttonsAddEventListener(cancel);
+        }
+
+        buttonsAddEventListener(lineSelectEnd);
+
+    }
+
+    buttonsAddEventListener(lineSelectStart);
+
+    //** return a <div id="followlines"> and inner cancel <button> elements */
+    function followlinesBox(targetUri, fromline, toline, isHead) {
+        // <div id="followlines">
+        var div = document.createElement('div');
+        div.id = 'followlines';
+
+        //   <div class="followlines-cancel">
+        var buttonDiv = document.createElement('div');
+        buttonDiv.classList.add('followlines-cancel');
+
+        //     <button>x</button>
+        var button = document.createElement('button');
+        button.textContent = 'x';
+        buttonDiv.appendChild(button);
+        div.appendChild(buttonDiv);
+
+        //   <div class="followlines-link">
+        var aDiv = document.createElement('div');
+        aDiv.classList.add('followlines-link');
+        aDiv.textContent = 'follow history of lines ' + fromline + ':' + toline + ':';
+        var linesep = document.createElement('br');
+        aDiv.appendChild(linesep);
+        //     link to "ascending" followlines
+        var aAsc = document.createElement('a');
+        var url = targetUri + '?patch=&linerange=' + fromline + ':' + toline;
+        aAsc.setAttribute('href', url);
+        aAsc.textContent = 'older';
+        aDiv.appendChild(aAsc);
+
+        if (!isHead) {
+            var sep = document.createTextNode(' / ');
+            aDiv.appendChild(sep);
+            //     link to "descending" followlines
+            var aDesc = document.createElement('a');
+            aDesc.setAttribute('href', url + '&descend=');
+            aDesc.textContent = 'newer';
+            aDiv.appendChild(aDesc);
+        }
+
+        div.appendChild(aDiv);
+
+        return [div, button];
+    }
+
+}, false);
diff -r 000000000000 -r b2b88bc58ef9 templates/static/hgicon.png
Binary file templates/static/hgicon.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/hglogo.png
Binary file templates/static/hglogo.png has changed
diff -r 000000000000 -r b2b88bc58ef9 templates/static/mercurial.js
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/mercurial.js	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,556 @@
+// mercurial.js - JavaScript utility functions
+//
+// Rendering of branch DAGs on the client side
+// Display of elapsed time
+// Show or hide diffstat
+//
+// Copyright 2008 Dirkjan Ochtman <dirkjan AT ochtman DOT nl>
+// Copyright 2006 Alexander Schremmer <alex AT alexanderweb DOT de>
+//
+// derived from code written by Scott James Remnant <scott@ubuntu.com>
+// Copyright 2005 Canonical Ltd.
+//
+// This software may be used and distributed according to the terms
+// of the GNU General Public License, incorporated herein by reference.
+
+var colors = [
+	[ 1.0, 0.0, 0.0 ],
+	[ 1.0, 1.0, 0.0 ],
+	[ 0.0, 1.0, 0.0 ],
+	[ 0.0, 1.0, 1.0 ],
+	[ 0.0, 0.0, 1.0 ],
+	[ 1.0, 0.0, 1.0 ]
+];
+
+function Graph() {
+
+	this.canvas = document.getElementById('graph');
+	this.ctx = this.canvas.getContext('2d');
+	this.ctx.strokeStyle = 'rgb(0, 0, 0)';
+	this.ctx.fillStyle = 'rgb(0, 0, 0)';
+	this.bg = [0, 4];
+	this.cell = [2, 0];
+	this.columns = 0;
+
+}
+
+Graph.prototype = {
+	reset: function() {
+		this.bg = [0, 4];
+		this.cell = [2, 0];
+		this.columns = 0;
+	},
+
+	scale: function(height) {
+		this.bg_height = height;
+		this.box_size = Math.floor(this.bg_height / 1.2);
+		this.cell_height = this.box_size;
+	},
+
+	setColor: function(color, bg, fg) {
+
+		// Set the colour.
+		//
+		// If color is a string, expect an hexadecimal RGB
+		// value and apply it unchanged. If color is a number,
+		// pick a distinct colour based on an internal wheel;
+		// the bg parameter provides the value that should be
+		// assigned to the 'zero' colours and the fg parameter
+		// provides the multiplier that should be applied to
+		// the foreground colours.
+		var s;
+		if(typeof color === "string") {
+			s = "#" + color;
+		} else { //typeof color === "number"
+			color %= colors.length;
+			var red = (colors[color][0] * fg) || bg;
+			var green = (colors[color][1] * fg) || bg;
+			var blue = (colors[color][2] * fg) || bg;
+			red = Math.round(red * 255);
+			green = Math.round(green * 255);
+			blue = Math.round(blue * 255);
+			s = 'rgb(' + red + ', ' + green + ', ' + blue + ')';
+		}
+		this.ctx.strokeStyle = s;
+		this.ctx.fillStyle = s;
+		return s;
+
+	},
+
+	edge: function(x0, y0, x1, y1, color, width) {
+
+		this.setColor(color, 0.0, 0.65);
+		if(width >= 0)
+			 this.ctx.lineWidth = width;
+		this.ctx.beginPath();
+		this.ctx.moveTo(x0, y0);
+		this.ctx.lineTo(x1, y1);
+		this.ctx.stroke();
+
+	},
+
+	graphNodeCurrent: function(x, y, radius) {
+		this.ctx.lineWidth = 2;
+		this.ctx.beginPath();
+		this.ctx.arc(x, y, radius * 1.75, 0, Math.PI * 2, true);
+		this.ctx.stroke();
+	},
+
+	graphNodeClosing: function(x, y, radius) {
+		this.ctx.fillRect(x - radius, y - 1.5, radius * 2, 3);
+	},
+
+	graphNodeUnstable: function(x, y, radius) {
+		var x30 = radius * Math.cos(Math.PI / 6);
+		var y30 = radius * Math.sin(Math.PI / 6);
+		this.ctx.lineWidth = 2;
+		this.ctx.beginPath();
+		this.ctx.moveTo(x, y - radius);
+		this.ctx.lineTo(x, y + radius);
+		this.ctx.moveTo(x - x30, y - y30);
+		this.ctx.lineTo(x + x30, y + y30);
+		this.ctx.moveTo(x - x30, y + y30);
+		this.ctx.lineTo(x + x30, y - y30);
+		this.ctx.stroke();
+	},
+
+	graphNodeObsolete: function(x, y, radius) {
+		var p45 = radius * Math.cos(Math.PI / 4);
+		this.ctx.lineWidth = 3;
+		this.ctx.beginPath();
+		this.ctx.moveTo(x - p45, y - p45);
+		this.ctx.lineTo(x + p45, y + p45);
+		this.ctx.moveTo(x - p45, y + p45);
+		this.ctx.lineTo(x + p45, y - p45);
+		this.ctx.stroke();
+	},
+
+	graphNodeNormal: function(x, y, radius) {
+		this.ctx.beginPath();
+		this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+		this.ctx.fill();
+	},
+
+	vertex: function(x, y, radius, color, parity, cur) {
+		this.ctx.save();
+		this.setColor(color, 0.25, 0.75);
+		if (cur.graphnode[0] === '@') {
+			this.graphNodeCurrent(x, y, radius);
+		}
+		switch (cur.graphnode.substr(-1)) {
+			case '_':
+				this.graphNodeClosing(x, y, radius);
+				break;
+			case '*':
+				this.graphNodeUnstable(x, y, radius);
+				break;
+			case 'x':
+				this.graphNodeObsolete(x, y, radius);
+				break;
+			default:
+				this.graphNodeNormal(x, y, radius);
+		}
+		this.ctx.restore();
+
+		var left = (this.bg_height - this.box_size) + (this.columns + 1) * this.box_size;
+		var item = document.querySelector('[data-node="' + cur.node + '"]');
+		if (item) {
+			item.style.paddingLeft = left + 'px';
+		}
+	},
+
+	render: function(data) {
+
+		var i, j, cur, line, start, end, color, x, y, x0, y0, x1, y1, column, radius;
+
+		var cols = 0;
+		for (i = 0; i < data.length; i++) {
+			cur = data[i];
+			for (j = 0; j < cur.edges.length; j++) {
+				line = cur.edges[j];
+				cols = Math.max(cols, line[0], line[1]);
+			}
+		}
+		this.canvas.width = (cols + 1) * this.bg_height;
+		this.canvas.height = (data.length + 1) * this.bg_height - 27;
+
+		for (i = 0; i < data.length; i++) {
+
+			var parity = i % 2;
+			this.cell[1] += this.bg_height;
+			this.bg[1] += this.bg_height;
+
+			cur = data[i];
+			var fold = false;
+
+			var prevWidth = this.ctx.lineWidth;
+			for (j = 0; j < cur.edges.length; j++) {
+
+				line = cur.edges[j];
+				start = line[0];
+				end = line[1];
+				color = line[2];
+				var width = line[3];
+				if(width < 0)
+					 width = prevWidth;
+				var branchcolor = line[4];
+				if(branchcolor)
+					color = branchcolor;
+
+				if (end > this.columns || start > this.columns) {
+					this.columns += 1;
+				}
+
+				if (start === this.columns && start > end) {
+					fold = true;
+				}
+
+				x0 = this.cell[0] + this.box_size * start + this.box_size / 2;
+				y0 = this.bg[1] - this.bg_height / 2;
+				x1 = this.cell[0] + this.box_size * end + this.box_size / 2;
+				y1 = this.bg[1] + this.bg_height / 2;
+
+				this.edge(x0, y0, x1, y1, color, width);
+
+			}
+			this.ctx.lineWidth = prevWidth;
+
+			// Draw the revision node in the right column
+
+			column = cur.vertex[0];
+			color = cur.vertex[1];
+
+			radius = this.box_size / 8;
+			x = this.cell[0] + this.box_size * column + this.box_size / 2;
+			y = this.bg[1] - this.bg_height / 2;
+			this.vertex(x, y, radius, color, parity, cur);
+
+			if (fold) this.columns -= 1;
+
+		}
+
+	}
+
+};
+
+
+function process_dates(parentSelector){
+
+	// derived from code from mercurial/templatefilter.py
+
+	var scales = {
+		'year':  365 * 24 * 60 * 60,
+		'month':  30 * 24 * 60 * 60,
+		'week':    7 * 24 * 60 * 60,
+		'day':    24 * 60 * 60,
+		'hour':   60 * 60,
+		'minute': 60,
+		'second': 1
+	};
+
+	function format(count, string){
+		var ret = count + ' ' + string;
+		if (count > 1){
+			ret = ret + 's';
+		}
+ 		return ret;
+ 	}
+
+	function shortdate(date){
+		var ret = date.getFullYear() + '-';
+		// getMonth() gives a 0-11 result
+		var month = date.getMonth() + 1;
+		if (month <= 9){
+			ret += '0' + month;
+		} else {
+			ret += month;
+		}
+		ret += '-';
+		var day = date.getDate();
+		if (day <= 9){
+			ret += '0' + day;
+		} else {
+			ret += day;
+		}
+		return ret;
+	}
+
+ 	function age(datestr){
+ 		var now = new Date();
+ 		var once = new Date(datestr);
+		if (isNaN(once.getTime())){
+			// parsing error
+			return datestr;
+		}
+
+		var delta = Math.floor((now.getTime() - once.getTime()) / 1000);
+
+		var future = false;
+		if (delta < 0){
+			future = true;
+			delta = -delta;
+			if (delta > (30 * scales.year)){
+				return "in the distant future";
+			}
+		}
+
+		if (delta > (2 * scales.year)){
+			return shortdate(once);
+		}
+
+		for (var unit in scales){
+			if (!scales.hasOwnProperty(unit)) { continue; }
+			var s = scales[unit];
+			var n = Math.floor(delta / s);
+			if ((n >= 2) || (s === 1)){
+				if (future){
+					return format(n, unit) + ' from now';
+				} else {
+					return format(n, unit) + ' ago';
+				}
+			}
+		}
+	}
+
+	var nodes = document.querySelectorAll((parentSelector || '') + ' .age');
+	var dateclass = new RegExp('\\bdate\\b');
+	for (var i=0; i<nodes.length; ++i){
+		var node = nodes[i];
+		var classes = node.className;
+		var agevalue = age(node.textContent);
+		if (dateclass.test(classes)){
+			// We want both: date + (age)
+			node.textContent += ' ('+agevalue+')';
+		} else {
+			node.title = node.textContent;
+			node.textContent = agevalue;
+		}
+	}
+}
+
+function toggleDiffstat() {
+    var curdetails = document.getElementById('diffstatdetails').style.display;
+    var curexpand = curdetails === 'none' ? 'inline' : 'none';
+    document.getElementById('diffstatdetails').style.display = curexpand;
+    document.getElementById('diffstatexpand').style.display = curdetails;
+}
+
+function toggleLinewrap() {
+    function getLinewrap() {
+        var nodes = document.getElementsByClassName('sourcelines');
+        // if there are no such nodes, error is thrown here
+        return nodes[0].classList.contains('wrap');
+    }
+
+    function setLinewrap(enable) {
+        var nodes = document.getElementsByClassName('sourcelines');
+        var i;
+        for (i = 0; i < nodes.length; i++) {
+            if (enable) {
+                nodes[i].classList.add('wrap');
+            } else {
+                nodes[i].classList.remove('wrap');
+            }
+        }
+
+        var links = document.getElementsByClassName('linewraplink');
+        for (i = 0; i < links.length; i++) {
+            links[i].innerHTML = enable ? 'on' : 'off';
+        }
+    }
+
+    setLinewrap(!getLinewrap());
+}
+
+function format(str, replacements) {
+    return str.replace(/%(\w+)%/g, function(match, p1) {
+        return String(replacements[p1]);
+    });
+}
+
+function makeRequest(url, method, onstart, onsuccess, onerror, oncomplete) {
+    var xhr = new XMLHttpRequest();
+    xhr.onreadystatechange = function() {
+        if (xhr.readyState === 4) {
+            try {
+                if (xhr.status === 200) {
+                    onsuccess(xhr.responseText);
+                } else {
+                    throw 'server error';
+                }
+            } catch (e) {
+                onerror(e);
+            } finally {
+                oncomplete();
+            }
+        }
+    };
+
+    xhr.open(method, url);
+    xhr.overrideMimeType("text/xhtml; charset=" + document.characterSet.toLowerCase());
+    xhr.send();
+    onstart();
+    return xhr;
+}
+
+function removeByClassName(className) {
+    var nodes = document.getElementsByClassName(className);
+    while (nodes.length) {
+        nodes[0].parentNode.removeChild(nodes[0]);
+    }
+}
+
+function docFromHTML(html) {
+    var doc = document.implementation.createHTMLDocument('');
+    doc.documentElement.innerHTML = html;
+    return doc;
+}
+
+function appendFormatHTML(element, formatStr, replacements) {
+    element.insertAdjacentHTML('beforeend', format(formatStr, replacements));
+}
+
+function adoptChildren(from, to) {
+    var nodes = from.children;
+    var curClass = 'c' + Date.now();
+    while (nodes.length) {
+        var node = nodes[0];
+        node = document.adoptNode(node);
+        node.classList.add(curClass);
+        to.appendChild(node);
+    }
+    process_dates('.' + curClass);
+}
+
+function ajaxScrollInit(urlFormat,
+                        nextPageVar,
+                        nextPageVarGet,
+                        containerSelector,
+                        messageFormat,
+                        mode) {
+    var updateInitiated = false;
+    var container = document.querySelector(containerSelector);
+
+    function scrollHandler() {
+        if (updateInitiated) {
+            return;
+        }
+
+        var scrollHeight = document.documentElement.scrollHeight;
+        var clientHeight = document.documentElement.clientHeight;
+        var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
+
+        if (scrollHeight - (scrollTop + clientHeight) < 50) {
+            updateInitiated = true;
+            removeByClassName('scroll-loading-error');
+            container.lastElementChild.classList.add('scroll-separator');
+
+            if (!nextPageVar) {
+                var message = {
+                    'class': 'scroll-loading-info',
+                    text: 'No more entries'
+                };
+                appendFormatHTML(container, messageFormat, message);
+                return;
+            }
+
+            makeRequest(
+                format(urlFormat, {next: nextPageVar}),
+                'GET',
+                function onstart() {
+                    var message = {
+                        'class': 'scroll-loading',
+                        text: 'Loading...'
+                    };
+                    appendFormatHTML(container, messageFormat, message);
+                },
+                function onsuccess(htmlText) {
+                    var doc = docFromHTML(htmlText);
+
+                    if (mode === 'graph') {
+                        var graph = window.graph;
+                        var dataStr = htmlText.match(/^\s*var data = (.*);$/m)[1];
+                        var data = JSON.parse(dataStr);
+                        graph.reset();
+                        adoptChildren(doc.querySelector('#graphnodes'), container.querySelector('#graphnodes'));
+                        graph.render(data);
+                    } else {
+                        adoptChildren(doc.querySelector(containerSelector), container);
+                    }
+
+                    nextPageVar = nextPageVarGet(htmlText);
+                },
+                function onerror(errorText) {
+                    var message = {
+                        'class': 'scroll-loading-error',
+                        text: 'Error: ' + errorText
+                    };
+                    appendFormatHTML(container, messageFormat, message);
+                },
+                function oncomplete() {
+                    removeByClassName('scroll-loading');
+                    updateInitiated = false;
+                    scrollHandler();
+                }
+            );
+        }
+    }
+
+    window.addEventListener('scroll', scrollHandler);
+    window.addEventListener('resize', scrollHandler);
+    scrollHandler();
+}
+
+function renderDiffOptsForm() {
+    // We use URLSearchParams for query string manipulation. Old browsers don't
+    // support this API.
+    if (!("URLSearchParams" in window)) {
+        return;
+    }
+
+    var form = document.getElementById("diffopts-form");
+
+    var KEYS = [
+        "ignorews",
+        "ignorewsamount",
+        "ignorewseol",
+        "ignoreblanklines",
+    ];
+
+    var urlParams = new window.URLSearchParams(window.location.search);
+
+    function updateAndRefresh(e) {
+        var checkbox = e.target;
+        var name = checkbox.id.substr(0, checkbox.id.indexOf("-"));
+        urlParams.set(name, checkbox.checked ? "1" : "0");
+        window.location.search = urlParams.toString();
+    }
+
+    var allChecked = form.getAttribute("data-ignorews") === "1";
+
+    for (var i = 0; i < KEYS.length; i++) {
+        var key = KEYS[i];
+
+        var checkbox = document.getElementById(key + "-checkbox");
+        if (!checkbox) {
+            continue;
+        }
+
+        var currentValue = form.getAttribute("data-" + key);
+        checkbox.checked = currentValue !== "0";
+
+        // ignorews implies ignorewsamount and ignorewseol.
+        if (allChecked && (key === "ignorewsamount" || key === "ignorewseol")) {
+            checkbox.checked = true;
+            checkbox.disabled = true;
+        }
+
+        checkbox.addEventListener("change", updateAndRefresh, false);
+    }
+
+    form.style.display = 'block';
+}
+
+document.addEventListener('DOMContentLoaded', function() {
+   process_dates();
+}, false);
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style-extra-coal.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style-extra-coal.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,46 @@
+body {
+    background: black url('background.png') repeat-x;
+}
+
+.container {
+    padding-left: 0;
+    padding-right: 150px;
+}
+
+.main {
+    padding: 2em;
+    border-right: 15px solid black;
+    border-bottom: 15px solid black;
+}
+
+.menu {
+    background: #999;
+    padding: 10px;
+    width: 75px;
+    position: fixed;
+    top: 27px;
+    left: auto;
+    right: 27px;
+}
+
+.menu ul {
+    border-left: 0;
+}
+
+.menu li.active {
+    font-weight: normal;
+    background: black;
+    color: white;
+}
+
+.menu li.active a {
+    color: white;
+}
+
+h3 {
+    margin-top: -.7em;
+}
+
+div.description {
+    border-left-width: 3px;
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style-gitweb.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style-gitweb.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,395 @@
+body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; }
+a { color:#0000cc; }
+a:hover, a:visited, a:active { color:#880000; }
+div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
+div.page_header a:visited { color:#0000cc; }
+div.page_header a:hover { color:#880000; }
+div.page_nav {
+    padding:8px;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+div.page_nav a:visited { color:#0000cc; }
+div.extra_nav {
+    padding: 8px;
+}
+div.extra_nav a:visited {
+    color: #0000cc;
+}
+div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
+div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
+div.page_footer_text { float:left; color:#555555; font-style:italic; }
+div.page_body { padding:8px; }
+div.title, a.title {
+	display:block; padding:6px 8px;
+	font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
+}
+a.title:hover { background-color: #d9d8d1; }
+div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
+div.log_body { padding:8px 8px 8px 150px; }
+.age { white-space:nowrap; }
+span.age { position:relative; float:left; width:142px; font-style:italic; }
+div.log_link {
+	padding:0px 8px;
+	font-size:10px; font-family:sans-serif; font-style:normal;
+	position:relative; float:left; width:136px;
+}
+div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
+a.list { text-decoration:none; color:#000000; }
+a.list:hover { text-decoration:underline; color:#880000; }
+table { padding:8px 4px; }
+th { padding:2px 5px; font-size:12px; text-align:left; }
+.parity0 { background-color:#ffffff; }
+tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
+tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
+pre.sourcelines.stripes > :nth-child(4n+2):hover,
+pre.sourcelines.stripes > :nth-child(4n+4):hover,
+pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
+pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
+td { padding:2px 5px; font-size:12px; vertical-align:top; }
+td.closed { background-color: #99f; }
+td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
+td.indexlinks { white-space: nowrap; }
+td.indexlinks a {
+  padding: 2px 5px; line-height: 10px;
+  border: 1px solid;
+  color: #ffffff; background-color: #7777bb;
+  border-color: #aaaadd #333366 #333366 #aaaadd;
+  font-weight: bold;  text-align: center; text-decoration: none;
+  font-size: 10px;
+}
+td.indexlinks a:hover { background-color: #6666aa; }
+div.pre { font-family:monospace; font-size:12px; white-space:pre; }
+
+.search {
+    margin-right: 8px;
+}
+
+div#hint {
+  position: absolute;
+  display: none;
+  width: 250px;
+  padding: 5px;
+  background: #ffc;
+  border: 1px solid yellow;
+  border-radius: 5px;
+}
+
+#searchform:hover div#hint { display: block; }
+
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev pre { color:#009900; }
+td.annotate {
+  white-space: nowrap;
+}
+div.annotate-info {
+  z-index: 5;
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #d9d8d1;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; text-decoration: underline; }
+td.annotate:hover div.annotate-info { display: inline; }
+
+#diffopts-form {
+  padding-left: 8px;
+  display: none;
+}
+
+.linenr { color:#999999; text-decoration:none }
+div.rss_logo { float: right; white-space: nowrap; }
+div.rss_logo a {
+	padding:3px 6px; line-height:10px;
+	border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
+	color:#ffffff; background-color:#ff6600;
+	font-weight:bold; font-family:sans-serif; font-size:10px;
+	text-align:center; text-decoration:none;
+}
+div.rss_logo a:hover { background-color:#ee5500; }
+pre { margin: 0; }
+span.logtags span {
+	padding: 0px 4px;
+	font-size: 10px;
+	font-weight: normal;
+	border: 1px solid;
+	background-color: #ffaaff;
+	border-color: #ffccff #ff00ee #ff00ee #ffccff;
+}
+span.logtags span.phasetag {
+	background-color: #dfafff;
+	border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
+}
+span.logtags span.obsoletetag {
+	background-color: #dddddd;
+	border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
+}
+span.logtags span.instabilitytag {
+	background-color: #ffb1c0;
+	border-color: #ffbbc8 #ff4476 #ff4476 #ffbbc8;
+}
+span.logtags span.tagtag {
+	background-color: #ffffaa;
+	border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
+}
+span.logtags span.branchtag {
+	background-color: #aaffaa;
+	border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+span.logtags span.inbranchtag {
+	background-color: #d5dde6;
+	border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
+}
+span.logtags span.bookmarktag {
+	background-color: #afdffa;
+	border-color: #ccecff #46ace6 #46ace6 #ccecff;
+}
+span.difflineplus { color:#008800; }
+span.difflineminus { color:#cc0000; }
+span.difflineat { color:#990099; }
+div.diffblocks { counter-reset: lineno; }
+div.diffblock { counter-increment: lineno; }
+pre.sourcelines { position: relative; counter-reset: lineno; }
+pre.sourcelines > span {
+	display: inline-block;
+	box-sizing: border-box;
+	width: 100%;
+	padding: 0 0 0 5em;
+	counter-increment: lineno;
+	vertical-align: top;
+}
+pre.sourcelines > span:before {
+	-moz-user-select: -moz-none;
+	-khtml-user-select: none;
+	-webkit-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+	display: inline-block;
+	margin-left: -6em;
+	width: 4em;
+	color: #999;
+	text-align: right;
+	content: counters(lineno,".");
+	float: left;
+}
+pre.sourcelines > a {
+	display: inline-block;
+	position: absolute;
+	left: 0px;
+	width: 4em;
+	height: 1em;
+}
+tr:target td,
+pre.sourcelines > span:target,
+pre.sourcelines.stripes > span:target {
+	background-color: #bfdfff;
+}
+
+.description {
+    font-family: monospace;
+    white-space: pre;
+}
+
+/* Followlines */
+tbody.sourcelines > tr.followlines-selected,
+pre.sourcelines > span.followlines-selected {
+  background-color: #99C7E9 !important;
+}
+
+div#followlines {
+  background-color: #FFF;
+  border: 1px solid #d9d8d1;
+  padding: 5px;
+  position: fixed;
+}
+
+div.followlines-cancel {
+  text-align: right;
+}
+
+div.followlines-cancel > button {
+  line-height: 80%;
+  padding: 0;
+  border: 0;
+  border-radius: 2px;
+  background-color: inherit;
+  font-weight: bold;
+}
+
+div.followlines-cancel > button:hover {
+  color: #FFFFFF;
+  background-color: #CF1F1F;
+}
+
+div.followlines-link {
+  margin: 2px;
+  margin-top: 4px;
+  font-family: sans-serif;
+}
+
+.btn-followlines {
+  display: none;
+  cursor: pointer;
+  box-sizing: content-box;
+  font-size: 11px;
+  width: 13px;
+  height: 13px;
+  border-radius: 3px;
+  margin: 0px;
+  margin-top: -2px;
+  padding: 0px;
+  background-color: #E5FDE5;
+  border: 1px solid #9BC19B;
+  font-family: monospace;
+  text-align: center;
+  line-height: 5px;
+}
+
+tr .btn-followlines {
+  position: absolute;
+}
+
+span .btn-followlines {
+  float: left;
+}
+
+span.followlines-select .btn-followlines {
+  margin-left: -1.6em;
+}
+
+.btn-followlines:hover {
+  transform: scale(1.1, 1.1);
+}
+
+.btn-followlines .followlines-plus {
+  color: green;
+}
+
+.btn-followlines .followlines-minus {
+  color: red;
+}
+
+.btn-followlines-end {
+  background-color: #ffdcdc;
+}
+
+.sourcelines tr:hover .btn-followlines,
+.sourcelines span.followlines-select:hover > .btn-followlines {
+  display: inline;
+}
+
+.btn-followlines-hidden,
+.sourcelines tr:hover .btn-followlines-hidden {
+  display: none;
+}
+
+/* Graph */
+div#wrapper {
+	position: relative;
+	margin: 0;
+	padding: 0;
+	margin-top: 3px;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.9em;
+	margin: 0;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	padding: 0;
+	margin: 0;
+}
+
+ul#graphnodes li {
+	position: relative;
+	height: 37px;
+	overflow: visible;
+	padding-top: 2px;
+}
+
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+
+ul#graphnodes li .info {
+	font-size: 100%;
+	font-style: italic;
+}
+
+/* Comparison */
+.legend {
+    padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+    border: 1px solid #d9d8d1;
+    font-size: 80%;
+    text-align: center;
+    padding: 0.5%;
+}
+
+.equal {
+    background-color: #ffffff;
+}
+
+.delete {
+    background-color: #faa;
+    color: #333;
+}
+
+.insert {
+    background-color: #ffa;
+}
+
+.replace {
+    background-color: #e8e8e8;
+}
+
+.comparison {
+    overflow-x: auto;
+}
+
+.header th {
+    text-align: center;
+}
+
+.block {
+    border-top: 1px solid #d9d8d1;
+}
+
+.scroll-loading {
+  -webkit-animation: change_color 1s linear 0s infinite alternate;
+  -moz-animation: change_color 1s linear 0s infinite alternate;
+  -o-animation: change_color 1s linear 0s infinite alternate;
+  animation: change_color 1s linear 0s infinite alternate;
+}
+
+@-webkit-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-moz-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-o-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+
+.scroll-loading-error {
+    background-color: #FFCCCC !important;
+}
+
+#doc {
+    margin: 0 8px;
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style-monoblue.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style-monoblue.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,588 @@
+/*** Initial Settings ***/
+* {
+  margin: 0;
+  padding: 0;
+  font-weight: normal;
+  font-style: normal;
+}
+
+html {
+  font-size: 100%;
+  font-family: sans-serif;
+}
+
+body {
+  font-size: 77%;
+  margin: 15px 50px;
+  background: #4B4B4C;
+}
+
+a {
+  color:#0000cc;
+  text-decoration: none;
+}
+/*** end of Initial Settings ***/
+
+
+/** common settings **/
+div#container {
+  background: #FFFFFF;
+  position: relative;
+  color: #666;
+}
+
+div.page-header {
+  padding: 50px 20px 0;
+  background: #006699 top left repeat-x;
+  position: relative;
+}
+  div.page-header h1 {
+    margin: 10px 0 30px;
+    font-size: 1.8em;
+    font-weight: bold;
+    font-family: osaka,'MS P Gothic', Georgia, serif;
+    letter-spacing: 1px;
+    color: #DDD;
+  }
+  div.page-header h1 a {
+    font-weight: bold;
+    color: #FFF;
+  }
+  div.page-header a {
+    text-decoration: none;
+  }
+
+  div.page-header form {
+    float: right;
+    margin-top: -2px;
+  }
+  div.page-header form label {
+    color: #DDD;
+  }
+  div.page-header form input {
+    padding: 2px;
+    border: solid 1px #DDD;
+  }
+  div.page-header form dl {
+    overflow: hidden;
+  }
+  div.page-header form dl dt {
+    font-size: 1.2em;
+  }
+  div.page-header form dl dt,
+  div.page-header form dl dd {
+    margin: 0 0 0 5px;
+    float: left;
+    height: 24px;
+    line-height: 20px;
+  }
+
+  ul.page-nav {
+    margin: 10px 0 0 0;
+    list-style-type: none;
+    overflow: hidden;
+  }
+    ul.page-nav li {
+      margin: 0 2px 0 0;
+      float: left;
+      width: 80px;
+      height: 24px;
+      font-size: 1.1em;
+      line-height: 24px;
+      text-align: center;
+    }
+    ul.page-nav li.current {
+      background: #FFF;
+    }
+    ul.page-nav li a {
+      height: 24px;
+      color: #666;
+      background: #DDD;
+      display: block;
+      text-decoration: none;
+    }
+    ul.page-nav li a:hover {
+      color:#333;
+      background: #FFF;
+    }
+
+ul.submenu {
+  margin: 10px 0 -10px 20px;
+  list-style-type: none;
+}
+ul.submenu li {
+  margin: 0 10px 0 0;
+  font-size: 1.2em;
+  display: inline;
+}
+
+h2 {
+  margin: 20px 0 10px;
+  height: 30px;
+  line-height: 30px;
+  text-indent: 20px;
+  background: #FFF;
+  font-size: 1.2em;
+  border-top: dotted 1px #D5E1E6;
+  font-weight: bold;
+}
+h2.no-link {
+  color:#006699;
+}
+h2.no-border {
+  color: #FFF;
+  background: #006699;
+  border: 0;
+}
+h2 a {
+  font-weight:bold;
+  color:#006699;
+}
+
+div.page-path {
+  text-align: right;
+  padding: 20px 30px 10px 0;
+  border:solid #d9d8d1;
+  border-width:0px 0px 1px;
+  font-size: 1.2em;
+}
+
+div.page-footer {
+  margin: 50px 0 0;
+  position: relative;
+}
+  div.page-footer p {
+    position: relative;
+    padding-left: 20px;
+    bottom: 5px;
+    font-size: 1.2em;
+  }
+
+  ul.rss-logo {
+    position: absolute;
+    top: -10px;
+    right: 20px;
+    height: 20px;
+    list-style-type: none;
+  }
+  ul.rss-logo li {
+    display: inline;
+  }
+  ul.rss-logo li a {
+    padding: 3px 6px;
+    line-height: 10px;
+    border:1px solid;
+    border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
+    color:#ffffff;
+    background-color:#ff6600;
+    font-weight:bold;
+    font-family:sans-serif;
+    font-size:10px;
+    text-align:center;
+    text-decoration:none;
+  }
+  div.rss-logo li a:hover {
+    background-color:#ee5500;
+  }
+
+p.normal {
+  margin: 20px 0 20px 30px;
+  font-size: 1.2em;
+}
+
+table {
+  margin: 10px 0 0 20px;
+  width: 95%;
+  border-collapse: collapse;
+}
+table tr td {
+  font-size: 1.1em;
+}
+table tr td.nowrap {
+  white-space: nowrap;
+}
+table tr td.closed {
+  background-color: #99f;
+}
+/*
+table tr.parity0:hover,
+table tr.parity1:hover {
+  background: #D5E1E6;
+}
+*/
+table tr.parity0,
+table td.annotate.parity0 {
+  background: #F1F6F7;
+}
+table tr.parity1,
+table td.annotate.parity1 {
+  background: #FFFFFF;
+}
+table tr td {
+  padding: 5px 5px;
+}
+table.annotated tr td {
+  padding: 0px 5px;
+}
+
+span.logtags span {
+  padding: 2px 6px;
+  font-weight: normal;
+  font-size: 11px;
+  border: 1px solid;
+  background-color: #ffaaff;
+  border-color: #ffccff #ff00ee #ff00ee #ffccff;
+}
+span.logtags span.phasetag {
+  background-color: #dfafff;
+  border-color: #e2b8ff #ce48ff #ce48ff #e2b8ff;
+}
+span.logtags span.obsoletetag {
+  background-color: #dddddd;
+  border-color: #e4e4e4 #a3a3a3 #a3a3a3 #e4e4e4;
+}
+span.logtags span.instabilitytag {
+  background-color: #ffb1c0;
+  border-color: #ffbbc8 #ff4476 #ff4476 #ffbbc8;
+}
+span.logtags span.tagtag {
+  background-color: #ffffaa;
+  border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
+}
+span.logtags span.branchtag {
+  background-color: #aaffaa;
+  border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+span.logtags span.inbranchtag {
+  background-color: #d5dde6;
+  border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
+}
+span.logtags span.bookmarktag {
+  background-color: #afdffa;
+  border-color: #ccecff #46ace6 #46ace6 #ccecff;
+}
+
+div.diff pre {
+  margin: 10px 0 0 0;
+}
+div.diff pre span {
+  font-family: monospace;
+  white-space: pre;
+  font-size: 1.2em;
+}
+div.diffblocks { counter-reset: lineno; }
+div.diffblock { counter-increment: lineno; }
+span.difflineplus { color:#008800; }
+span.difflineminus { color:#cc0000; }
+span.difflineat { color:#990099; }
+
+pre.sourcelines {
+    position: relative;
+    counter-reset: lineno;
+    font-size: 1.2em;
+}
+pre.sourcelines > span {
+    display: inline-block;
+    box-sizing: border-box;
+    width: 100%;
+    padding: 0 0 0 5em;
+    counter-increment: lineno;
+    vertical-align: top;
+}
+div.source > pre.sourcelines > span {
+    padding: 1px 1px 1px 5em;
+}
+pre.sourcelines > span:before {
+    -moz-user-select: -moz-none;
+    -khtml-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    display: inline-block;
+    margin-left: -5em;
+    width: 4em;
+    color: #999;
+    text-align: right;
+    content: counters(lineno,".");
+    float: left;
+}
+pre.sourcelines > a {
+    display: inline-block;
+    position: absolute;
+    left: 0px;
+    width: 4em;
+    height: 1em;
+    padding: 0.15em;
+}
+pre.sourcelines.stripes > :nth-child(4n+2) { background-color: #F1F6F7; }
+pre.sourcelines.stripes > :nth-child(4n+4) { background-color: #FFFFFF; }
+pre.sourcelines.stripes > :nth-child(4n+2):hover,
+pre.sourcelines.stripes > :nth-child(4n+4):hover,
+pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
+pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color: #D5E1E6; }
+
+tr:target td,
+pre.sourcelines > span:target,
+pre.sourcelines.stripes > span:target {
+    background-color: #bfdfff;
+}
+
+td.source {
+  white-space: pre;
+  margin: 10px 30px 0;
+  font-size: 1.2em;
+  font-family: monospace;
+}
+.linenr {
+  color: #999;
+  text-align: right;
+}
+.lineno {
+  text-align: right;
+}
+.lineno a {
+  color: #999;
+}
+td.linenr {
+  width: 60px;
+}
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev td.source { color:#009900; }
+td.annotate {
+  white-space: nowrap;
+}
+div.annotate-info {
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: solid 1px #CCC;
+  text-align: left;
+  color: #666;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; }
+td.annotate:hover div.annotate-info { display: inline; }
+
+div#powered-by {
+  position: absolute;
+  width: 75px;
+  top: 15px;
+  right: 20px;
+  font-size: 1.2em;
+}
+div#powered-by a {
+  color: #EEE;
+  text-decoration: none;
+}
+div#powered-by a:hover {
+  text-decoration: underline;
+}
+/** end of common settings **/
+
+/** summary **/
+dl.overview {
+  margin: 0 0 0 30px;
+  font-size: 1.1em;
+  overflow: hidden;
+}
+  dl.overview dt,
+  dl.overview dd {
+    margin: 5px 0;
+    float: left;
+  }
+  dl.overview dt {
+    clear: left;
+    font-weight: bold;
+    width: 150px;
+  }
+/** end of summary **/
+
+/** chagelog **/
+h3.changelog {
+  margin: 20px 0 5px 30px;
+  padding: 0 0 2px;
+  font-size: 1.4em;
+  border-bottom: dotted 1px #D5E1E6;
+}
+ul.changelog-entry {
+  margin: 0 0 10px 30px;
+  list-style-type: none;
+  position: relative;
+}
+ul.changelog-entry li span.revdate {
+  font-size: 1.1em;
+}
+ul.changelog-entry li.age {
+  position: absolute;
+  top: -25px;
+  right: 10px;
+  font-size: 1.4em;
+  color: #CCC;
+  font-weight: bold;
+  font-style: italic;
+}
+ul.changelog-entry li span.name {
+  font-size: 1.2em;
+  font-weight: bold;
+}
+ul.changelog-entry li.description {
+  margin: 10px 0 0;
+  font-size: 1.1em;
+}
+/** end of changelog **/
+
+/** file **/
+p.files {
+  margin: 0 0 0 20px;
+  font-size: 2.0em;
+  font-weight: bold;
+}
+/** end of file **/
+
+/** changeset **/
+h3.changeset {
+  margin: 20px 0 5px 20px;
+  padding: 0 0 2px;
+  font-size: 1.6em;
+  border-bottom: dotted 1px #D5E1E6;
+}
+p.changeset-age {
+  position: relative;
+}
+p.changeset-age span {
+  position: absolute;
+  top: -25px;
+  right: 10px;
+  font-size: 1.4em;
+  color: #CCC;
+  font-weight: bold;
+  font-style: italic;
+}
+p.description {
+  margin: 10px 30px 0 30px;
+  padding: 10px;
+  border: solid 1px #CCC;
+  font-size: 1.2em;
+}
+/** end of changeset **/
+
+/** canvas **/
+div#wrapper {
+	position: relative;
+	font-size: 1.1em;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.7em;
+}
+
+ul#graphnodes li.parity0 {
+    background: #F1F6F7;
+}
+
+ul#graphnodes li.parity1 {
+    background: #FFFFFF;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	margin: 0;
+	padding: 0;
+}
+
+ul#graphnodes li {
+	height: 37px;
+	overflow: visible;
+	padding-top: 2px;
+}
+
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+
+ul#graphnodes li .info {
+	margin-top: 2px;
+}
+/** end of canvas **/
+
+/** comparison **/
+.legend {
+    margin-left: 20px;
+    padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+    border: 1px solid #999;
+    font-size: 80%;
+    text-align: center;
+    padding: 0.5%;
+}
+
+.equal {
+    background-color: #ffffff;
+}
+
+.delete {
+    background-color: #faa;
+    color: #333;
+}
+
+.insert {
+    background-color: #ffa;
+}
+
+.replace {
+    background-color: #e8e8e8;
+}
+
+.comparison {
+    overflow-x: auto;
+}
+
+.comparison table td {
+    padding: 0px 5px;
+}
+
+.header th {
+    font-weight: bold;
+}
+
+.block {
+    border-top: 1px solid #999;
+}
+/** end of comparison **/
+
+.breadcrumb a:hover {
+    text-decoration:underline;
+}
+
+.scroll-loading {
+  -webkit-animation: change_color 1s linear 0s infinite alternate;
+  -moz-animation: change_color 1s linear 0s infinite alternate;
+  -o-animation: change_color 1s linear 0s infinite alternate;
+  animation: change_color 1s linear 0s infinite alternate;
+}
+
+@-webkit-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-moz-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-o-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+
+.scroll-loading-error {
+    background-color: #FFCCCC !important;
+}
+
+#doc {
+    margin: 0 30px;
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style-paper.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style-paper.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,549 @@
+body {
+  margin: 0;
+  padding: 0;
+  background: white;
+  color: black;
+  font-family: sans-serif;
+}
+
+.container {
+  padding-left: 115px;
+}
+
+.main {
+  position: relative;
+  background: white;
+  padding: 2em 2em 2em 0;
+}
+
+#.main {
+  width: 98%;
+}
+
+.overflow {
+  width: 100%;
+  overflow: auto;
+}
+
+.menu {
+  width: 90px;
+  margin: 0;
+  font-size: 80%;
+  text-align: left;
+  position: absolute;
+  top: 20px;
+  left: 20px;
+  right: auto;
+}
+
+.menu ul {
+  list-style: none;
+  padding: 0;
+  margin: 10px 0 0 0;
+  border-left: 2px solid #999;
+}
+
+.menu li {
+  margin-bottom: 3px;
+  padding: 2px 4px;
+  background: white;
+  color: black;
+  font-weight: normal;
+}
+
+.menu li.active {
+  font-weight: bold;
+}
+
+.menu img {
+  width: 75px;
+  height: 90px;
+  border: 0;
+}
+
+div.atom-logo {
+  margin-top: 10px;
+}
+
+.atom-logo img{
+  width: 14px;
+  height: 14px;
+  border: 0;
+}
+
+.menu a { color: black; display: block; }
+
+.search {
+  position: absolute;
+  top: .7em;
+  right: 2em;
+}
+
+form.search div#hint {
+  display: none;
+  position: absolute;
+  top: 40px;
+  right: 0px;
+  width: 190px;
+  padding: 5px;
+  background: #ffc;
+  font-size: 70%;
+  border: 1px solid yellow;
+  border-radius: 5px;
+}
+
+form.search:hover div#hint { display: block; }
+
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0,
+.stripes4 > :nth-child(4n+1),
+.stripes2 > :nth-child(2n+1) { background-color: #f0f0f0; }
+.parity1,
+.stripes4 > :nth-child(4n+3),
+.stripes2 > :nth-child(2n+2) { background-color: white; }
+.plusline { color: green; }
+.minusline { color: #dc143c; } /* crimson */
+.atline { color: purple; }
+
+.diffstat-table {
+  margin-top: 1em;
+}
+.diffstat-file {
+  white-space: nowrap;
+  font-size: 90%;
+}
+.diffstat-total {
+  white-space: nowrap;
+  font-size: 90%;
+}
+.diffstat-graph {
+  width: 100%;
+}
+.diffstat-add {
+  background-color: green;
+  float: left;
+}
+.diffstat-remove {
+  background-color: red;
+  float: left;
+}
+
+.navigate {
+  text-align: right;
+  font-size: 60%;
+  margin: 1em 0;
+}
+
+.phase {
+  color: #999;
+  font-size: 70%;
+  border-bottom: 1px dotted #999;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.obsolete {
+  color: #999;
+  font-size: 70%;
+  border-bottom: 1px dashed #999;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.instability {
+  color: #000;
+  font-size: 70%;
+  border-bottom: 1px solid #000;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.tag {
+  color: #999;
+  font-size: 70%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+.branchhead {
+  color: #000;
+  font-size: 80%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+ul#graphnodes .branchhead {
+  font-size: 75%;
+}
+
+.branchname {
+  color: #000;
+  font-size: 60%;
+  font-weight: normal;
+  margin-left: .5em;
+  vertical-align: baseline;
+}
+
+/* Common */
+pre { margin: 0; }
+
+h2 { font-size: 120%; border-bottom: 1px solid #999; }
+h2 a { color: #000; }
+h3 {
+  margin-top: +.7em;
+  font-size: 100%;
+}
+
+/* log and tags tables */
+.bigtable {
+  border-bottom: 1px solid #999;
+  border-collapse: collapse;
+  font-size: 90%;
+  width: 100%;
+  font-weight: normal;
+  text-align: left;
+}
+
+.bigtable td {
+  padding: 1px 4px;
+  vertical-align: top;
+}
+
+.bigtable th {
+  padding: 1px 4px;
+  border-bottom: 1px solid #999;
+}
+.bigtable tr { border: none; }
+.bigtable .age { width: 7em; }
+.bigtable .author { width: 15em; }
+.bigtable .description { }
+.bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
+.bigtable .node { width: 5em; font-family: monospace;}
+.bigtable .permissions { width: 8em; text-align: left;}
+.bigtable .size { width: 5em; text-align: right; }
+.bigtable .annotate { text-align: right; }
+.bigtable td.annotate { font-size: smaller; }
+.bigtable td.source { font-size: inherit; }
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev td.source { color:#009900; }
+td.annotate {
+  white-space: nowrap;
+}
+div.annotate-info {
+  z-index: 5;
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #999;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; }
+td.annotate:hover div.annotate-info { display: inline; }
+
+#diffopts-form {
+  font-size: smaller;
+  color: #424242;
+  padding-bottom: 10px;
+  display: none;
+}
+
+.source, .sourcefirst {
+  font-family: monospace;
+  white-space: pre;
+  padding: 1px 4px;
+  font-size: 90%;
+}
+.sourcefirst { border-bottom: 1px solid #999; font-weight: bold; }
+.source a { color: #999; font-size: smaller; font-family: monospace;}
+.bottomline { border-bottom: 1px solid #999; }
+
+.sourcelines {
+  font-size: 90%;
+  position: relative;
+  counter-reset: lineno;
+}
+
+.wrap > span {
+    white-space: pre-wrap;
+}
+
+.linewraptoggle {
+    float: right;
+}
+
+.diffblocks { counter-reset: lineno; }
+.diffblocks > div { counter-increment: lineno; }
+
+.sourcelines > span {
+  display: inline-block;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 1px 0px 1px 5em;
+  counter-increment: lineno;
+}
+
+.sourcelines > span:before {
+  -moz-user-select: -moz-none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  display: inline-block;
+  margin-left: -6em;
+  width: 4em;
+  font-size: smaller;
+  color: #999;
+  text-align: right;
+  content: counters(lineno, ".");
+  float: left;
+}
+
+.sourcelines > span:target, tr:target td {
+  background-color: #bfdfff;
+}
+
+/* Followlines */
+tbody.sourcelines > tr.followlines-selected,
+pre.sourcelines > span.followlines-selected {
+  background-color: #99C7E9;
+}
+
+div#followlines {
+  background-color: #FFF;
+  border: 1px solid #999;
+  padding: 5px;
+  position: fixed;
+}
+
+div.followlines-cancel {
+  text-align: right;
+}
+
+div.followlines-cancel > button {
+  line-height: 80%;
+  padding: 0;
+  border: 0;
+  border-radius: 2px;
+  background-color: inherit;
+  font-weight: bold;
+}
+
+div.followlines-cancel > button:hover {
+  color: #FFFFFF;
+  background-color: #CF1F1F;
+}
+
+div.followlines-link {
+  margin: 2px;
+  margin-top: 4px;
+  font-family: sans-serif;
+}
+
+.btn-followlines {
+  display: none;
+  cursor: pointer;
+  box-sizing: content-box;
+  font-size: 12px;
+  width: 13px;
+  height: 13px;
+  border-radius: 3px;
+  margin: 0px;
+  margin-top: -2px;
+  padding: 0px;
+  background-color: #E5FDE5;
+  border: 1px solid #9BC19B;
+  font-family: monospace;
+  text-align: center;
+  line-height: 5px;
+}
+
+tr .btn-followlines {
+  position: absolute;
+}
+
+span .btn-followlines {
+  float: left;
+}
+
+span.followlines-select .btn-followlines {
+  margin-left: -1.5em;
+}
+
+.btn-followlines:hover {
+  transform: scale(1.2, 1.2);
+}
+
+.btn-followlines .followlines-plus {
+  color: green;
+}
+
+.btn-followlines .followlines-minus {
+  color: red;
+}
+
+.btn-followlines-end {
+  background-color: #ffdcdc;
+}
+
+.sourcelines tr:hover .btn-followlines,
+.sourcelines span.followlines-select:hover > .btn-followlines {
+  display: inline;
+}
+
+.btn-followlines-hidden,
+.sourcelines tr:hover .btn-followlines-hidden {
+  display: none;
+}
+
+.sourcelines > a {
+    display: inline-block;
+    position: absolute;
+    left: 0px;
+    width: 4em;
+    height: 1em;
+}
+
+.fileline { font-family: monospace; }
+.fileline img { border: 0; }
+
+.tagEntry .closed { color: #99f; }
+
+/* Changeset entry */
+#changesetEntry {
+  border-collapse: collapse;
+  font-size: 90%;
+  width: 100%;
+  margin-bottom: 1em;
+}
+
+#changesetEntry th {
+  padding: 1px 4px;
+  width: 4em;
+  text-align: right;
+  font-weight: normal;
+  color: #999;
+  vertical-align: top;
+}
+
+div.description {
+  border-left: 2px solid #999;
+  margin: 1em 0 1em 0;
+  padding: .3em;
+  white-space: pre;
+  font-family: monospace;
+}
+
+/* Graph */
+div#wrapper {
+	position: relative;
+	border-top: 1px solid black;
+	border-bottom: 1px solid black;
+	margin: 0;
+	padding: 0;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.7em;
+	margin: 0;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	padding: 0;
+	margin: 0;
+}
+
+ul#graphnodes li {
+	height: 39px;
+	overflow: visible;
+}
+
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+
+ul#graphnodes li .info {
+	font-size: 70%;
+}
+
+/* Comparison */
+.legend {
+    padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+    border: 1px solid #999;
+    font-size: 80%;
+    text-align: center;
+    padding: 0.5%;
+}
+
+.equal {
+    background-color: #ffffff;
+}
+
+.delete {
+    background-color: #faa;
+    color: #333;
+}
+
+.insert {
+    background-color: #ffa;
+}
+
+.replace {
+    background-color: #e8e8e8;
+}
+
+.header {
+    text-align: center;
+}
+
+.block {
+    border-top: 1px solid #999;
+}
+
+.breadcrumb {
+    color: gray;
+}
+
+.breadcrumb a {
+    color: blue;
+}
+
+.scroll-loading {
+  -webkit-animation: change_color 1s linear 0s infinite alternate;
+  -moz-animation: change_color 1s linear 0s infinite alternate;
+  -o-animation: change_color 1s linear 0s infinite alternate;
+  animation: change_color 1s linear 0s infinite alternate;
+}
+
+@-webkit-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-moz-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@-o-keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+@keyframes change_color {
+  from { background-color: #A0CEFF; } to {  }
+}
+
+.scroll-loading-error {
+    background-color: #FFCCCC !important;
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style-sjl.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style-sjl.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,292 @@
+html {
+    overflow-y: scroll;
+}
+body {
+  margin: 0;
+  padding: 0;
+  background: white;
+  color: black;
+  font-family: sans-serif;
+  font-size: 14px;
+}
+.main {
+    width: 840px;
+    margin: 24px auto 200px;
+}
+a {
+    color: #e50053;
+    text-decoration: none;
+}
+a:hover {
+    text-decoration: underline;
+}
+
+/* Headers */
+h2 {
+    font-size: 14px;
+    margin-bottom: 6px;
+}
+h3 {
+    font-size: 18px;
+    margin-bottom: 6px;
+}
+
+/* Menu */
+.menu ul {
+    list-style-type: none;
+    margin: 0 0 24px;
+    padding: 0px;
+}
+.menu ul li {
+    display: inline-block;
+    margin-right: 20px;
+}
+
+/* Search form */
+form.search {
+    text-align:right;
+    display: block;
+    width: 200px;
+    float: right;
+}
+form.search input {
+    padding: 0;
+}
+
+table.smalltable {
+    margin: 12px 0px;
+    line-height: 28px;
+    border-collapse: collapse;
+}
+
+table.bigtable {
+    width: 100%;
+    margin: 12px 0px;
+    line-height: 28px;
+    border-collapse: collapse;
+}
+
+.branchhead {
+    color: #333;
+    font-weight: bold;
+    border: 1px solid #ccc;
+    background: #f8f8f8;
+    padding: 1px 3px;
+    border-radius: 4px;
+}
+
+.tag {
+    color: #333;
+    border: 1px solid #ccc;
+    background: #f8f8f8;
+    padding: 1px 3px;
+    border-radius: 4px;
+}
+
+th {
+    text-align: left;
+}
+
+td.repo-name {
+    width: 150px;
+}
+td.age {
+    width: 140px;
+}
+table.shortlog td.author {
+    width: 110px;
+}
+td.commit-description {
+    font-family: monospace;
+}
+td.commit-description a {
+    color: black;
+}
+td.commit-description a:hover {
+    color: #e50053;
+}
+td.commit-hash {
+    width: 120px;
+    font-family: monospace;
+}
+td.branch-name {
+    min-width: 100px;
+}
+td.branch-hash {
+    width: 110px;
+    font-family: monospace;
+}
+td.tag-hash {
+    font-family: monospace;
+}
+td.tag-name {
+    min-width: 100px;
+}
+
+div.navigate a {
+    display: inline-block;
+}
+
+.scroll-loading-info {
+    font-style: italic;
+    background-color: #fafafa;
+    font-size: 14px;
+}
+
+/* Browse */
+.commit-hash {
+    font-family: monospace;
+}
+.path {
+    font-family: monospace;
+}
+tr.fileline {
+    font-family: monospace;
+    border-bottom: 1px solid #eee;
+}
+tr.fileline a {
+    color: black;
+}
+tr.fileline a:hover {
+    color: #e50053;
+}
+.size {
+    /* padding-left: 24px; */
+    text-align: right;
+}
+
+/* Commit */
+pre.commit-full-description {
+    border: 1px solid #ccc;
+    border-radius: 2px;
+    padding: 10px 5px;
+    background: #fafafa;
+}
+table.commit-contents {
+    width: 100%;
+}
+table.commit-contents tr th {
+    width: 100px;
+}
+table.commit-contents tr td {
+    width: auto;
+}
+table.commit-contents td.files a {
+    font-family: monospace;
+    display: block;
+}
+table.commit-contents td.diffstat-file {
+    font-family: monospace;
+}
+
+.sourcelines {
+    overflow-x: auto;
+    margin: 12px 0px 24px;
+    border: 1px solid #ccc;
+    padding: 10px 0px;
+    border-radius: 3px;
+    counter-reset: lineno;
+    position: relative;
+    font-size: 14px;
+    line-height: 18px;
+}
+
+.sourcelines > span {
+  display: inline-block;
+  box-sizing: border-box;
+  width: 100%;
+  padding: 1px 0px 1px 4.5em;
+  counter-increment: lineno;
+}
+
+.sourcelines > span:before {
+  -moz-user-select: -moz-none;
+  -khtml-user-select: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  display: inline-block;
+  margin-left: -6em;
+  width: 4em;
+  font-size: 12px;
+  line-height: 18px;
+  color: #999;
+  text-align: right;
+  content: counters(lineno, ".");
+  float: left;
+  font-weight: normal !important;
+}
+
+.sourcelines > span:target, tr:target td {
+  background-color: #bfdfff;
+}
+
+.sourcelines > a {
+    display: inline-block;
+    position: absolute;
+    left: 0px;
+    width: 4em;
+    height: 1em;
+}
+
+span.minusline {
+    color: #9b0000;
+    background-color: #fff5f5;
+}
+span.plusline {
+    color: green;
+    background-color: #efe;
+}
+span.atline {
+    font-weight: bold;
+    background: #ccc;
+}
+.sourcelines span:nth-of-type(1),
+.sourcelines span:nth-of-type(2)
+{
+    background: none;
+    font-weight: bold;
+}
+.sourcelines span:nth-of-type(2) {
+    border-bottom: 1px solid #ccc;
+    margin-bottom: 10px;
+    padding-bottom: 10px;
+}
+
+/* Graph */
+div#wrapper {
+	position: relative;
+	/* border-top: 1px solid black; */
+	/* border-bottom: 1px solid black; */
+	margin: 24px 0;
+	padding: 0;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.7em;
+	margin: 0;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	padding: 0;
+	margin: 0;
+}
+
+ul#graphnodes li {
+	height: 39px;
+	overflow: visible;
+}
+ul#graphnodes li .desc {
+    font-family: monospace;
+}
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+ul#graphnodes li .info {
+	font-size: 70%;
+        font-style: italic
+}
diff -r 000000000000 -r b2b88bc58ef9 templates/static/style.css
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/static/style.css	Sat Jan 11 13:21:39 2020 -0800
@@ -0,0 +1,117 @@
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0 { background-color: #ddd; color: #000; }
+.parity1 { background-color: #eee; color: #000; }
+.lineno { width: 60px; color: #aaa; font-size: smaller;
+          text-align: right; }
+.plusline { color: green; }
+.minusline { color: red; }
+.atline { color: purple; }
+.annotate { font-size: smaller; text-align: right; padding-right: 1em; }
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev pre { color:#009900; }
+td.annotate {
+  white-space: nowrap;
+}
+div.annotate-info {
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #888;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; }
+td.annotate:hover div.annotate-info { display: inline; }
+.buttons a {
+  background-color: #666;
+  padding: 2pt;
+  color: white;
+  font-family: sans-serif;
+  font-weight: bold;
+}
+.navigate a {
+  background-color: #ccc;
+  padding: 2pt;
+  font-family: sans-serif;
+  color: black;
+}
+
+.metatag {
+  background-color: #888;
+  color: white;
+  text-align: right;
+}
+
+/* Common */
+pre { margin: 0; }
+
+.logo {
+  float: right;
+  clear: right;
+}
+
+/* Changelog/Filelog entries */
+.logEntry { width: 100%; }
+.logEntry .age { width: 15%; }
+.logEntry th.label { width: 16em; }
+.logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
+.logEntry th.age, .logEntry th.firstline { font-weight: bold; }
+.logEntry th.firstline { text-align: left; width: inherit; }
+
+/* Shortlog entries */
+.slogEntry { width: 100%; }
+.slogEntry .age { width: 8em; }
+.slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
+.slogEntry td.author { width: 15em; }
+
+/* Tag entries */
+#tagEntries { list-style: none; margin: 0; padding: 0; }
+#tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
+
+/* Changeset entry */
+#changesetEntry { }
+#changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+#changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
+
+/* File diff view */
+#filediffEntry { }
+#filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+
+/* Graph */
+div#wrapper {
+	position: relative;
+	margin: 0;
+	padding: 0;
+}
+
+canvas {
+	position: absolute;
+	z-index: 5;
+	top: -0.6em;
+	margin: 0;
+}
+
+ul#graphnodes {
+	list-style: none inside none;
+	padding: 0;
+	margin: 0;
+}
+
+ul#graphnodes li {
+	height: 37px;
+	overflow: visible;
+	padding-top: 2px;
+}
+
+ul#graphnodes li .fg {
+	position: absolute;
+	z-index: 10;
+}
+
+ul#graphnodes li .info {
+	font-size: 70%;
+}