a73x

597199a9

site: [E] in the tab, and a card for every link

a73x   2026-08-18 18:39

Commit message
site: [E] in the tab, and a card for every link

The anvil favicon is gone. eitri's mark is "[E]", composed at build time
from GohuFont's own glyphs — the light weight in the tab, where its 13x9
ink is the only fit that lands on whole pixels inside a 16px icon. There
is no favicon source file left to drift from the mark, because the mark
is drawn, not traced: the generator reads the font.

Paste an eitri.sh link anywhere and it previews as the page it points
at. Each page ships og:/twitter: metadata and its own 1200x630 card —
mark, wordmark, tagline, then the page's own name under a rule — with
the description taken from the page's opening paragraph, so a preview
says what the page says. Scrapers fetch og:image on its own and resolve
nothing against the page they came from, so the generator has to know
its own address: -base makes those links absolute, and an empty base
keeps a local preview relative.

The tab icon has always inverted with the reader's theme while the page
stayed white; the page now carries the same pair. Text that would
overrun a card, a label the font cannot draw, or a malformed font all
fail the build rather than ship blank.

.githooks/commit-msg
Old New
@@ -0,0 +1,13 @@
1 #!/bin/sh
2 # git-collab-managed-hook: stamps `Patch: <id>` trailers onto commit messages.
3 #
4 # Written by `git-collab init`, which rewrites this file in place —
5 # edits here are not preserved. Safe to delete: it is a convenience,
6 # and merges are recorded by scanning at sync time regardless.
7 #
8 # This must never fail a commit, so the exit status below is discarded
9 # deliberately — do not "fix" it.
10 GIT_COLLAB='/home/xanderle/.local/bin/git-collab'
11 [ -x "$GIT_COLLAB" ] || GIT_COLLAB=git-collab
12 "$GIT_COLLAB" hooks run-commit-msg "$1" >/dev/null 2>&1 || true
13 exit 0
Makefile
Old New
@@ -179,7 +179,7 @@ site:
179 site-check: 179 site-check:
180 @tmp=$$(mktemp -d); trap 'rm -rf "$$tmp"' EXIT; \ 180 @tmp=$$(mktemp -d); trap 'rm -rf "$$tmp"' EXIT; \
181 go run ./cmd/eitri-site -docs docs -site site -out $$tmp && \ 181 go run ./cmd/eitri-site -docs docs -site site -out $$tmp && \
182 for f in index.html style.css openapi.json docs/index.html docs/quickstart/index.html docs/upgrade/index.html dl/index.html; do \ 182 for f in index.html style.css favicon.svg openapi.json docs/index.html docs/quickstart/index.html docs/upgrade/index.html dl/index.html og/home.png og/quickstart.png; do \
183 test -f $$tmp/$$f || { echo "site-check: missing $$f"; exit 1; }; \ 183 test -f $$tmp/$$f || { echo "site-check: missing $$f"; exit 1; }; \
184 done && echo "site-check: ok" 184 done && echo "site-check: ok"
185 185
internal/site/bdf.go
Old New
@@ -0,0 +1,220 @@
1 // bdf.go reads glyph bitmaps out of a BDF bitmap font. The site draws its
2 // mark and link-preview cards from real font pixels rather than hand-traced
3 // paths, so the two stay the same shape; this reader covers only what that
4 // needs — per-rune ink and advances.
5 //
6 // The embedded fonts are GohuFont (font.gohu.org), copyright Hugo Chargois,
7 // licensed under the WTFPL. Their own COMMENT lines carry that notice.
8
9 package site
10
11 import (
12 "bufio"
13 "bytes"
14 _ "embed"
15 "encoding/hex"
16 "fmt"
17 "strconv"
18 "strings"
19 )
20
21 //go:embed gohufont-11.bdf
22 var gohu11 []byte
23
24 //go:embed gohufont-14b.bdf
25 var gohu14b []byte
26
27 // bdfGlyph is one glyph's ink box. pix holds h rows of w pixels, top row
28 // first; xoff/yoff place that box against the drawing origin, with yoff
29 // measured from the baseline (negative reaches below it).
30 type bdfGlyph struct {
31 w, h, xoff, yoff int
32 advance int // DWIDTH: pen movement to the next glyph
33 pix [][]bool
34 }
35
36 // bdfFont is a parsed font: glyphs by rune, plus the line metrics every
37 // caller needs to stack lines without knowing the format.
38 type bdfFont struct {
39 name string
40 glyphs map[rune]bdfGlyph
41 ascent, descent int
42 }
43
44 // lineHeight is the full line box: rows [0,ascent) sit above the baseline,
45 // the rest below.
46 func (f *bdfFont) lineHeight() int { return f.ascent + f.descent }
47
48 // textRun is a horizontal run of ink, in font pixels from the top-left of
49 // the line box. Runs — not single pixels — because both outputs draw
50 // rectangles, and a run is one rect instead of many.
51 type textRun struct{ X, Y, W int }
52
53 // parseBDF reads a BDF font. Fonts are inputs to the build, so anything
54 // malformed or incomplete is an error rather than a silently blank glyph.
55 func parseBDF(src []byte) (*bdfFont, error) {
56 f := &bdfFont{glyphs: map[rune]bdfGlyph{}}
57 var (
58 cur bdfGlyph
59 code = -1
60 haveBBX bool
61 inBitmap bool
62 rows []string
63 ascentOK bool
64 descOK bool
65 )
66 sc := bufio.NewScanner(bytes.NewReader(src))
67 sc.Buffer(make([]byte, 0, 64*1024), 1024*1024)
68 for line := 1; sc.Scan(); line++ {
69 text := strings.TrimRight(sc.Text(), "\r")
70 key, rest, _ := strings.Cut(text, " ")
71 if inBitmap && key != "ENDCHAR" {
72 rows = append(rows, strings.TrimSpace(text))
73 continue
74 }
75 switch key {
76 case "FONT":
77 f.name = strings.TrimSpace(rest)
78 case "FONT_ASCENT", "FONT_DESCENT":
79 n, err := strconv.Atoi(strings.TrimSpace(rest))
80 if err != nil {
81 return nil, fmt.Errorf("line %d: %s: %w", line, key, err)
82 }
83 if key == "FONT_ASCENT" {
84 f.ascent, ascentOK = n, true
85 } else {
86 f.descent, descOK = n, true
87 }
88 case "STARTCHAR":
89 cur, code, haveBBX, rows = bdfGlyph{}, -1, false, nil
90 case "ENCODING":
91 n, err := strconv.Atoi(strings.TrimSpace(rest))
92 if err != nil {
93 return nil, fmt.Errorf("line %d: ENCODING: %w", line, err)
94 }
95 code = n
96 case "DWIDTH":
97 fields := strings.Fields(rest)
98 if len(fields) == 0 {
99 return nil, fmt.Errorf("line %d: DWIDTH: no value", line)
100 }
101 n, err := strconv.Atoi(fields[0])
102 if err != nil {
103 return nil, fmt.Errorf("line %d: DWIDTH: %w", line, err)
104 }
105 cur.advance = n
106 case "BBX":
107 fields := strings.Fields(rest)
108 if len(fields) != 4 {
109 return nil, fmt.Errorf("line %d: BBX: want 4 values, got %d", line, len(fields))
110 }
111 vals := make([]int, 4)
112 for i, s := range fields {
113 n, err := strconv.Atoi(s)
114 if err != nil {
115 return nil, fmt.Errorf("line %d: BBX: %w", line, err)
116 }
117 vals[i] = n
118 }
119 cur.w, cur.h, cur.xoff, cur.yoff = vals[0], vals[1], vals[2], vals[3]
120 haveBBX = true
121 case "BITMAP":
122 if !haveBBX {
123 return nil, fmt.Errorf("line %d: BITMAP before BBX", line)
124 }
125 inBitmap = true
126 case "ENDCHAR":
127 inBitmap = false
128 if code < 0 {
129 return nil, fmt.Errorf("line %d: glyph without ENCODING", line)
130 }
131 pix, err := decodeBitmap(rows, cur.w, cur.h)
132 if err != nil {
133 return nil, fmt.Errorf("line %d: glyph %d: %w", line, code, err)
134 }
135 cur.pix = pix
136 // ISO8859-1 code points are their own runes.
137 f.glyphs[rune(code)] = cur
138 }
139 }
140 if err := sc.Err(); err != nil {
141 return nil, err
142 }
143 switch {
144 case !ascentOK || !descOK:
145 return nil, fmt.Errorf("font %q: missing FONT_ASCENT/FONT_DESCENT", f.name)
146 case len(f.glyphs) == 0:
147 return nil, fmt.Errorf("font %q: no glyphs", f.name)
148 }
149 return f, nil
150 }
151
152 // decodeBitmap turns BDF hex rows into pixels. Each row is padded to whole
153 // bytes, most significant bit leftmost.
154 func decodeBitmap(rows []string, w, h int) ([][]bool, error) {
155 if len(rows) != h {
156 return nil, fmt.Errorf("bitmap has %d rows, BBX says %d", len(rows), h)
157 }
158 stride := (w + 7) / 8
159 pix := make([][]bool, h)
160 for i, row := range rows {
161 raw, err := hex.DecodeString(row)
162 if err != nil {
163 return nil, fmt.Errorf("row %d: %w", i, err)
164 }
165 if len(raw) < stride {
166 return nil, fmt.Errorf("row %d: %d bytes, want %d", i, len(raw), stride)
167 }
168 line := make([]bool, w)
169 for j := range line {
170 line[j] = raw[j/8]>>(7-j%8)&1 == 1
171 }
172 pix[i] = line
173 }
174 return pix, nil
175 }
176
177 // runs lays out s on one line, returning its ink. A rune the font has no
178 // glyph for is an error: a blank in a card title would ship unnoticed.
179 func (f *bdfFont) runs(s string) ([]textRun, error) {
180 var out []textRun
181 x := 0
182 for _, r := range s {
183 g, ok := f.glyphs[r]
184 if !ok {
185 return nil, fmt.Errorf("font %q has no glyph for %q", f.name, r)
186 }
187 for i, row := range g.pix {
188 // Ink box bottom sits yoff above the baseline, which is at
189 // row index ascent; row i counts down from the box's top.
190 y := f.ascent - g.yoff - g.h + i
191 for j := 0; j < len(row); {
192 if !row[j] {
193 j++
194 continue
195 }
196 k := j
197 for k < len(row) && row[k] {
198 k++
199 }
200 out = append(out, textRun{X: x + g.xoff + j, Y: y, W: k - j})
201 j = k
202 }
203 }
204 x += g.advance
205 }
206 return out, nil
207 }
208
209 // width is the advance width of s in font pixels.
210 func (f *bdfFont) width(s string) (int, error) {
211 w := 0
212 for _, r := range s {
213 g, ok := f.glyphs[r]
214 if !ok {
215 return 0, fmt.Errorf("font %q has no glyph for %q", f.name, r)
216 }
217 w += g.advance
218 }
219 return w, nil
220 }
internal/site/bdf_test.go
Old New
@@ -0,0 +1,161 @@
1 package site
2
3 import (
4 "strings"
5 "testing"
6 )
7
8 // bitmapString renders a pixel grid for comparison against a literal, so a
9 // failure prints the glyph rather than a slice of booleans.
10 func bitmapString(pix [][]bool) string {
11 var b strings.Builder
12 for _, row := range pix {
13 for _, on := range row {
14 if on {
15 b.WriteByte('#')
16 } else {
17 b.WriteByte('.')
18 }
19 }
20 b.WriteByte('\n')
21 }
22 return b.String()
23 }
24
25 func TestParseBDFGlyphBitmap(t *testing.T) {
26 f, err := parseBDF(gohu11)
27 if err != nil {
28 t.Fatal(err)
29 }
30 g, ok := f.glyphs['E']
31 if !ok {
32 t.Fatal("no glyph for 'E'")
33 }
34 want := "#####\n#....\n#....\n####.\n#....\n#....\n#....\n#####\n"
35 if got := bitmapString(g.pix); got != want {
36 t.Errorf("glyph 'E':\ngot:\n%swant:\n%s", got, want)
37 }
38 if g.w != 5 || g.h != 8 || g.xoff != 0 || g.yoff != 0 {
39 t.Errorf("BBX = %d %d %d %d, want 5 8 0 0", g.w, g.h, g.xoff, g.yoff)
40 }
41 if g.advance != 6 {
42 t.Errorf("advance = %d, want 6", g.advance)
43 }
44 }
45
46 func TestParseBDFMetrics(t *testing.T) {
47 for _, tc := range []struct {
48 name string
49 src []byte
50 ascent, descent int
51 lineHeight int
52 }{
53 {"gohu11", gohu11, 9, 2, 11},
54 {"gohu14b", gohu14b, 11, 3, 14},
55 } {
56 f, err := parseBDF(tc.src)
57 if err != nil {
58 t.Fatalf("%s: %v", tc.name, err)
59 }
60 if f.ascent != tc.ascent || f.descent != tc.descent {
61 t.Errorf("%s: ascent/descent = %d/%d, want %d/%d",
62 tc.name, f.ascent, f.descent, tc.ascent, tc.descent)
63 }
64 if got := f.lineHeight(); got != tc.lineHeight {
65 t.Errorf("%s: lineHeight = %d, want %d", tc.name, got, tc.lineHeight)
66 }
67 }
68 }
69
70 // The published fonts must cover every character the site can put on a card.
71 func TestParseBDFCoversPrintableASCII(t *testing.T) {
72 for _, src := range [][]byte{gohu11, gohu14b} {
73 f, err := parseBDF(src)
74 if err != nil {
75 t.Fatal(err)
76 }
77 for r := rune(' '); r <= '~'; r++ {
78 if _, ok := f.glyphs[r]; !ok {
79 t.Errorf("%s: no glyph for %q", f.name, r)
80 }
81 }
82 }
83 }
84
85 func TestFontRunsPlacesInkBelowTheBaseline(t *testing.T) {
86 f, err := parseBDF(gohu11)
87 if err != nil {
88 t.Fatal(err)
89 }
90 // 'p' has a descender: its ink must reach past the ascent line, where a
91 // row index equal to the ascent is the first row below the baseline.
92 runs, err := f.runs("p")
93 if err != nil {
94 t.Fatal(err)
95 }
96 var maxY int
97 for _, r := range runs {
98 if r.Y > maxY {
99 maxY = r.Y
100 }
101 }
102 if maxY < f.ascent {
103 t.Errorf("'p' bottom row Y = %d, want >= ascent %d", maxY, f.ascent)
104 }
105 if maxY >= f.lineHeight() {
106 t.Errorf("'p' bottom row Y = %d, past the line box %d", maxY, f.lineHeight())
107 }
108 }
109
110 func TestFontRunsAdvancesEachGlyph(t *testing.T) {
111 f, err := parseBDF(gohu11)
112 if err != nil {
113 t.Fatal(err)
114 }
115 runs, err := f.runs("EE")
116 if err != nil {
117 t.Fatal(err)
118 }
119 var first, second bool
120 for _, r := range runs {
121 switch r.X {
122 case 0:
123 first = true
124 case 6:
125 second = true
126 }
127 }
128 if !first || !second {
129 t.Errorf("want runs at X=0 and X=6 (one advance apart), got %v", runs)
130 }
131 if got, err := f.width("EE"); err != nil || got != 12 {
132 t.Errorf("width(\"EE\") = %d, %v; want 12, nil", got, err)
133 }
134 }
135
136 func TestFontRunsRejectsUnknownRune(t *testing.T) {
137 f, err := parseBDF(gohu11)
138 if err != nil {
139 t.Fatal(err)
140 }
141 if _, err := f.runs("日"); err == nil {
142 t.Error("want an error for a rune the font has no glyph for")
143 }
144 if _, err := f.width("日"); err == nil {
145 t.Error("want an error from width for a rune the font has no glyph for")
146 }
147 }
148
149 func TestParseBDFRejectsBrokenFonts(t *testing.T) {
150 for name, src := range map[string]string{
151 "no glyphs": "STARTFONT 2.1\nFONT_ASCENT 9\nFONT_DESCENT 2\nENDFONT\n",
152 "no ascent": "STARTFONT 2.1\nSTARTCHAR E\nENCODING 69\nDWIDTH 6 0\nBBX 1 1 0 0\nBITMAP\n80\nENDCHAR\nENDFONT\n",
153 "bitmap w/o bbx": "STARTFONT 2.1\nFONT_ASCENT 9\nFONT_DESCENT 2\nSTARTCHAR E\nENCODING 69\nBITMAP\n80\nENDCHAR\nENDFONT\n",
154 "bad hex": "STARTFONT 2.1\nFONT_ASCENT 9\nFONT_DESCENT 2\nSTARTCHAR E\nENCODING 69\nDWIDTH 6 0\nBBX 1 1 0 0\nBITMAP\nzz\nENDCHAR\nENDFONT\n",
155 "short bitmap": "STARTFONT 2.1\nFONT_ASCENT 9\nFONT_DESCENT 2\nSTARTCHAR E\nENCODING 69\nDWIDTH 6 0\nBBX 1 2 0 0\nBITMAP\n80\nENDCHAR\nENDFONT\n",
156 } {
157 if _, err := parseBDF([]byte(src)); err == nil {
158 t.Errorf("%s: want an error, got none", name)
159 }
160 }
161 }
internal/site/cli.go
Old New
@@ -31,10 +31,11 @@ func runBuild(args []string) error {
31 siteDir := fs.String("site", "site", "site directory (index.md, template.html, style.css)") 31 siteDir := fs.String("site", "site", "site directory (index.md, template.html, style.css)")
32 dist := fs.String("dist", "", "optional dist/<version> dir with release artifacts") 32 dist := fs.String("dist", "", "optional dist/<version> dir with release artifacts")
33 out := fs.String("out", "site/dist", "output webroot") 33 out := fs.String("out", "site/dist", "output webroot")
34 base := fs.String("base", "https://eitri.sh", "base URL the site is served from (link previews need absolute URLs; empty for a local preview)")
34 if err := fs.Parse(args); err != nil { 35 if err := fs.Parse(args); err != nil {
35 return err 36 return err
36 } 37 }
37 return Build(Config{DocsDir: *docs, SiteDir: *siteDir, DistDir: *dist, OutDir: *out}) 38 return Build(Config{DocsDir: *docs, SiteDir: *siteDir, DistDir: *dist, OutDir: *out, BaseURL: *base})
38 } 39 }
39 40
40 func runManifest(args []string) error { 41 func runManifest(args []string) error {
internal/site/gohufont-11.bdf
Old New
@@ -0,0 +1,2714 @@
1 STARTFONT 2.1
2 COMMENT "Copyright by Hugo Chargois"
3 COMMENT "Licensed under the WTFPL"
4 FONT -Gohu-GohuFont-Medium-R-Normal--11-80-100-100-C-60-ISO8859-1
5 SIZE 11 100 100
6 FONTBOUNDINGBOX 6 11 0 -2
7 STARTPROPERTIES 30
8 FOUNDRY "Gohu"
9 FAMILY_NAME "GohuFont"
10 WEIGHT_NAME "Medium"
11 SLANT "R"
12 SETWIDTH_NAME "Normal"
13 ADD_STYLE_NAME ""
14 PIXEL_SIZE 11
15 POINT_SIZE 80
16 RESOLUTION_X 100
17 RESOLUTION_Y 100
18 SPACING "C"
19 AVERAGE_WIDTH 60
20 CHARSET_REGISTRY "ISO8859"
21 CHARSET_ENCODING "1"
22 FONTNAME_REGISTRY ""
23 FONT_NAME "GohuFont"
24 FACE_NAME "GohuFont"
25 FONT_VERSION "003.000"
26 FONT_ASCENT 9
27 FONT_DESCENT 2
28 UNDERLINE_POSITION -1
29 UNDERLINE_THICKNESS 1
30 X_HEIGHT 4
31 CAP_HEIGHT 7
32 RAW_ASCENT 818
33 RAW_DESCENT 182
34 NORM_SPACE 6
35 FIGURE_WIDTH 6
36 AVG_LOWERCASE_WIDTH 60
37 AVG_UPPERCASE_WIDTH "60"
38 ENDPROPERTIES
39 CHARS 191
40 STARTCHAR SPACE
41 ENCODING 32
42 SWIDTH 392 0
43 DWIDTH 6 0
44 BBX 0 0 0 0
45 BITMAP
46 ENDCHAR
47 STARTCHAR EXCLAMATION MARK
48 ENCODING 33
49 SWIDTH 392 0
50 DWIDTH 6 0
51 BBX 1 8 2 0
52 BITMAP
53 80
54 80
55 80
56 80
57 80
58 80
59 00
60 80
61 ENDCHAR
62 STARTCHAR QUOTATION MARK
63 ENCODING 34
64 SWIDTH 392 0
65 DWIDTH 6 0
66 BBX 3 3 1 5
67 BITMAP
68 A0
69 A0
70 A0
71 ENDCHAR
72 STARTCHAR NUMBER SIGN
73 ENCODING 35
74 SWIDTH 392 0
75 DWIDTH 6 0
76 BBX 5 7 0 1
77 BITMAP
78 50
79 50
80 F8
81 50
82 F8
83 50
84 50
85 ENDCHAR
86 STARTCHAR DOLLAR SIGN
87 ENCODING 36
88 SWIDTH 392 0
89 DWIDTH 6 0
90 BBX 5 9 0 -1
91 BITMAP
92 20
93 70
94 A8
95 A0
96 70
97 28
98 A8
99 70
100 20
101 ENDCHAR
102 STARTCHAR PERCENT SIGN
103 ENCODING 37
104 SWIDTH 392 0
105 DWIDTH 6 0
106 BBX 5 7 0 0
107 BITMAP
108 48
109 A8
110 50
111 20
112 50
113 A8
114 90
115 ENDCHAR
116 STARTCHAR AMPERSAND
117 ENCODING 38
118 SWIDTH 392 0
119 DWIDTH 6 0
120 BBX 5 7 0 0
121 BITMAP
122 60
123 90
124 A0
125 40
126 A8
127 90
128 68
129 ENDCHAR
130 STARTCHAR APOSTROPHE
131 ENCODING 39
132 SWIDTH 392 0
133 DWIDTH 6 0
134 BBX 1 3 2 5
135 BITMAP
136 80
137 80
138 80
139 ENDCHAR
140 STARTCHAR LEFT PARENTHESIS
141 ENCODING 40
142 SWIDTH 392 0
143 DWIDTH 6 0
144 BBX 3 9 1 -1
145 BITMAP
146 20
147 40
148 40
149 80
150 80
151 80
152 40
153 40
154 20
155 ENDCHAR
156 STARTCHAR RIGHT PARENTHESIS
157 ENCODING 41
158 SWIDTH 392 0
159 DWIDTH 6 0
160 BBX 3 9 1 -1
161 BITMAP
162 80
163 40
164 40
165 20
166 20
167 20
168 40
169 40
170 80
171 ENDCHAR
172 STARTCHAR ASTERISK
173 ENCODING 42
174 SWIDTH 392 0
175 DWIDTH 6 0
176 BBX 5 5 0 1
177 BITMAP
178 20
179 A8
180 70
181 A8
182 20
183 ENDCHAR
184 STARTCHAR PLUS SIGN
185 ENCODING 43
186 SWIDTH 392 0
187 DWIDTH 6 0
188 BBX 5 5 0 1
189 BITMAP
190 20
191 20
192 F8
193 20
194 20
195 ENDCHAR
196 STARTCHAR COMMA
197 ENCODING 44
198 SWIDTH 392 0
199 DWIDTH 6 0
200 BBX 2 4 1 -2
201 BITMAP
202 C0
203 C0
204 40
205 80
206 ENDCHAR
207 STARTCHAR HYPHEN-MINUS
208 ENCODING 45
209 SWIDTH 392 0
210 DWIDTH 6 0
211 BBX 5 1 0 3
212 BITMAP
213 F8
214 ENDCHAR
215 STARTCHAR FULL STOP
216 ENCODING 46
217 SWIDTH 392 0
218 DWIDTH 6 0
219 BBX 2 2 1 0
220 BITMAP
221 C0
222 C0
223 ENDCHAR
224 STARTCHAR SOLIDUS
225 ENCODING 47
226 SWIDTH 392 0
227 DWIDTH 6 0
228 BBX 5 10 0 -2
229 BITMAP
230 08
231 08
232 10
233 10
234 20
235 20
236 40
237 40
238 80
239 80
240 ENDCHAR
241 STARTCHAR DIGIT ZERO
242 ENCODING 48
243 SWIDTH 392 0
244 DWIDTH 6 0
245 BBX 5 7 0 0
246 BITMAP
247 70
248 88
249 98
250 A8
251 C8
252 88
253 70
254 ENDCHAR
255 STARTCHAR DIGIT ONE
256 ENCODING 49
257 SWIDTH 392 0
258 DWIDTH 6 0
259 BBX 3 7 0 0
260 BITMAP
261 20
262 60
263 A0
264 20
265 20
266 20
267 20
268 ENDCHAR
269 STARTCHAR DIGIT TWO
270 ENCODING 50
271 SWIDTH 392 0
272 DWIDTH 6 0
273 BBX 5 7 0 0
274 BITMAP
275 70
276 88
277 08
278 10
279 20
280 40
281 F8
282 ENDCHAR
283 STARTCHAR DIGIT THREE
284 ENCODING 51
285 SWIDTH 392 0
286 DWIDTH 6 0
287 BBX 5 7 0 0
288 BITMAP
289 70
290 88
291 08
292 30
293 08
294 88
295 70
296 ENDCHAR
297 STARTCHAR DIGIT FOUR
298 ENCODING 52
299 SWIDTH 392 0
300 DWIDTH 6 0
301 BBX 5 7 0 0
302 BITMAP
303 10
304 30
305 50
306 90
307 F8
308 10
309 10
310 ENDCHAR
311 STARTCHAR DIGIT FIVE
312 ENCODING 53
313 SWIDTH 392 0
314 DWIDTH 6 0
315 BBX 5 7 0 0
316 BITMAP
317 F8
318 80
319 F0
320 08
321 08
322 88
323 70
324 ENDCHAR
325 STARTCHAR DIGIT SIX
326 ENCODING 54
327 SWIDTH 392 0
328 DWIDTH 6 0
329 BBX 5 7 0 0
330 BITMAP
331 70
332 80
333 F0
334 88
335 88
336 88
337 70
338 ENDCHAR
339 STARTCHAR DIGIT SEVEN
340 ENCODING 55
341 SWIDTH 392 0
342 DWIDTH 6 0
343 BBX 5 7 0 0
344 BITMAP
345 F8
346 08
347 10
348 10
349 20
350 20
351 20
352 ENDCHAR
353 STARTCHAR DIGIT EIGHT
354 ENCODING 56
355 SWIDTH 392 0
356 DWIDTH 6 0
357 BBX 5 7 0 0
358 BITMAP
359 70
360 88
361 88
362 70
363 88
364 88
365 70
366 ENDCHAR
367 STARTCHAR DIGIT NINE
368 ENCODING 57
369 SWIDTH 392 0
370 DWIDTH 6 0
371 BBX 5 7 0 0
372 BITMAP
373 70
374 88
375 88
376 78
377 08
378 08
379 70
380 ENDCHAR
381 STARTCHAR COLON
382 ENCODING 58
383 SWIDTH 392 0
384 DWIDTH 6 0
385 BBX 2 5 2 0
386 BITMAP
387 C0
388 C0
389 00
390 C0
391 C0
392 ENDCHAR
393 STARTCHAR SEMICOLON
394 ENCODING 59
395 SWIDTH 392 0
396 DWIDTH 6 0
397 BBX 2 7 1 -2
398 BITMAP
399 C0
400 C0
401 00
402 C0
403 C0
404 40
405 80
406 ENDCHAR
407 STARTCHAR LESS-THAN SIGN
408 ENCODING 60
409 SWIDTH 392 0
410 DWIDTH 6 0
411 BBX 4 7 1 0
412 BITMAP
413 10
414 20
415 40
416 80
417 40
418 20
419 10
420 ENDCHAR
421 STARTCHAR EQUALS SIGN
422 ENCODING 61
423 SWIDTH 392 0
424 DWIDTH 6 0
425 BBX 5 3 0 2
426 BITMAP
427 F8
428 00
429 F8
430 ENDCHAR
431 STARTCHAR GREATER-THAN SIGN
432 ENCODING 62
433 SWIDTH 392 0
434 DWIDTH 6 0
435 BBX 4 7 1 0
436 BITMAP
437 80
438 40
439 20
440 10
441 20
442 40
443 80
444 ENDCHAR
445 STARTCHAR QUESTION MARK
446 ENCODING 63
447 SWIDTH 392 0
448 DWIDTH 6 0
449 BBX 5 7 0 0
450 BITMAP
451 70
452 88
453 08
454 10
455 20
456 00
457 20
458 ENDCHAR
459 STARTCHAR COMMERCIAL AT
460 ENCODING 64
461 SWIDTH 392 0
462 DWIDTH 6 0
463 BBX 5 7 0 0
464 BITMAP
465 70
466 88
467 B8
468 A8
469 B8
470 80
471 78
472 ENDCHAR
473 STARTCHAR LATIN CAPITAL LETTER A
474 ENCODING 65
475 SWIDTH 392 0
476 DWIDTH 6 0
477 BBX 5 8 0 0
478 BITMAP
479 70
480 88
481 88
482 F8
483 88
484 88
485 88
486 88
487 ENDCHAR
488 STARTCHAR LATIN CAPITAL LETTER B
489 ENCODING 66
490 SWIDTH 392 0
491 DWIDTH 6 0
492 BBX 5 8 0 0
493 BITMAP
494 F0
495 88
496 88
497 F0
498 88
499 88
500 88
501 F0
502 ENDCHAR
503 STARTCHAR LATIN CAPITAL LETTER C
504 ENCODING 67
505 SWIDTH 392 0
506 DWIDTH 6 0
507 BBX 5 8 0 0
508 BITMAP
509 70
510 88
511 80
512 80
513 80
514 80
515 88
516 70
517 ENDCHAR
518 STARTCHAR LATIN CAPITAL LETTER D
519 ENCODING 68
520 SWIDTH 392 0
521 DWIDTH 6 0
522 BBX 5 8 0 0
523 BITMAP
524 F0
525 88
526 88
527 88
528 88
529 88
530 88
531 F0
532 ENDCHAR
533 STARTCHAR LATIN CAPITAL LETTER E
534 ENCODING 69
535 SWIDTH 392 0
536 DWIDTH 6 0
537 BBX 5 8 0 0
538 BITMAP
539 F8
540 80
541 80
542 F0
543 80
544 80
545 80
546 F8
547 ENDCHAR
548 STARTCHAR LATIN CAPITAL LETTER F
549 ENCODING 70
550 SWIDTH 392 0
551 DWIDTH 6 0
552 BBX 5 8 0 0
553 BITMAP
554 F8
555 80
556 80
557 F0
558 80
559 80
560 80
561 80
562 ENDCHAR
563 STARTCHAR LATIN CAPITAL LETTER G
564 ENCODING 71
565 SWIDTH 392 0
566 DWIDTH 6 0
567 BBX 5 8 0 0
568 BITMAP
569 70
570 88
571 80
572 B8
573 88
574 88
575 88
576 70
577 ENDCHAR
578 STARTCHAR LATIN CAPITAL LETTER H
579 ENCODING 72
580 SWIDTH 392 0
581 DWIDTH 6 0
582 BBX 5 8 0 0
583 BITMAP
584 88
585 88
586 88
587 F8
588 88
589 88
590 88
591 88
592 ENDCHAR
593 STARTCHAR LATIN CAPITAL LETTER I
594 ENCODING 73
595 SWIDTH 392 0
596 DWIDTH 6 0
597 BBX 3 8 1 0
598 BITMAP
599 E0
600 40
601 40
602 40
603 40
604 40
605 40
606 E0
607 ENDCHAR
608 STARTCHAR LATIN CAPITAL LETTER J
609 ENCODING 74
610 SWIDTH 392 0
611 DWIDTH 6 0
612 BBX 5 8 0 0
613 BITMAP
614 08
615 08
616 08
617 08
618 08
619 88
620 88
621 70
622 ENDCHAR
623 STARTCHAR LATIN CAPITAL LETTER K
624 ENCODING 75
625 SWIDTH 392 0
626 DWIDTH 6 0
627 BBX 5 8 0 0
628 BITMAP
629 88
630 90
631 A0
632 C0
633 A0
634 90
635 88
636 88
637 ENDCHAR
638 STARTCHAR LATIN CAPITAL LETTER L
639 ENCODING 76
640 SWIDTH 392 0
641 DWIDTH 6 0
642 BBX 5 8 0 0
643 BITMAP
644 80
645 80
646 80
647 80
648 80
649 80
650 80
651 F8
652 ENDCHAR
653 STARTCHAR LATIN CAPITAL LETTER M
654 ENCODING 77
655 SWIDTH 392 0
656 DWIDTH 6 0
657 BBX 5 8 0 0
658 BITMAP
659 88
660 D8
661 A8
662 A8
663 88
664 88
665 88
666 88
667 ENDCHAR
668 STARTCHAR LATIN CAPITAL LETTER N
669 ENCODING 78
670 SWIDTH 392 0
671 DWIDTH 6 0
672 BBX 5 8 0 0
673 BITMAP
674 88
675 C8
676 C8
677 A8
678 A8
679 98
680 98
681 88
682 ENDCHAR
683 STARTCHAR LATIN CAPITAL LETTER O
684 ENCODING 79
685 SWIDTH 392 0
686 DWIDTH 6 0
687 BBX 5 8 0 0
688 BITMAP
689 70
690 88
691 88
692 88
693 88
694 88
695 88
696 70
697 ENDCHAR
698 STARTCHAR LATIN CAPITAL LETTER P
699 ENCODING 80
700 SWIDTH 392 0
701 DWIDTH 6 0
702 BBX 5 8 0 0
703 BITMAP
704 F0
705 88
706 88
707 F0
708 80
709 80
710 80
711 80
712 ENDCHAR
713 STARTCHAR LATIN CAPITAL LETTER Q
714 ENCODING 81
715 SWIDTH 392 0
716 DWIDTH 6 0
717 BBX 5 9 0 -1
718 BITMAP
719 70
720 88
721 88
722 88
723 88
724 A8
725 90
726 68
727 08
728 ENDCHAR
729 STARTCHAR LATIN CAPITAL LETTER R
730 ENCODING 82
731 SWIDTH 392 0
732 DWIDTH 6 0
733 BBX 5 8 0 0
734 BITMAP
735 F0
736 88
737 88
738 F0
739 90
740 88
741 88
742 88
743 ENDCHAR
744 STARTCHAR LATIN CAPITAL LETTER S
745 ENCODING 83
746 SWIDTH 392 0
747 DWIDTH 6 0
748 BBX 5 8 0 0
749 BITMAP
750 70
751 88
752 80
753 70
754 08
755 08
756 88
757 70
758 ENDCHAR
759 STARTCHAR LATIN CAPITAL LETTER T
760 ENCODING 84
761 SWIDTH 392 0
762 DWIDTH 6 0
763 BBX 5 8 0 0
764 BITMAP
765 F8
766 20
767 20
768 20
769 20
770 20
771 20
772 20
773 ENDCHAR
774 STARTCHAR LATIN CAPITAL LETTER U
775 ENCODING 85
776 SWIDTH 392 0
777 DWIDTH 6 0
778 BBX 5 8 0 0
779 BITMAP
780 88
781 88
782 88
783 88
784 88
785 88
786 88
787 70
788 ENDCHAR
789 STARTCHAR LATIN CAPITAL LETTER V
790 ENCODING 86
791 SWIDTH 392 0
792 DWIDTH 6 0
793 BBX 5 8 0 0
794 BITMAP
795 88
796 88
797 88
798 88
799 50
800 50
801 20
802 20
803 ENDCHAR
804 STARTCHAR LATIN CAPITAL LETTER W
805 ENCODING 87
806 SWIDTH 392 0
807 DWIDTH 6 0
808 BBX 5 8 0 0
809 BITMAP
810 88
811 88
812 88
813 A8
814 A8
815 A8
816 50
817 50
818 ENDCHAR
819 STARTCHAR LATIN CAPITAL LETTER X
820 ENCODING 88
821 SWIDTH 392 0
822 DWIDTH 6 0
823 BBX 5 8 0 0
824 BITMAP
825 88
826 88
827 50
828 20
829 50
830 88
831 88
832 88
833 ENDCHAR
834 STARTCHAR LATIN CAPITAL LETTER Y
835 ENCODING 89
836 SWIDTH 392 0
837 DWIDTH 6 0
838 BBX 5 8 0 0
839 BITMAP
840 88
841 88
842 50
843 20
844 20
845 20
846 20
847 20
848 ENDCHAR
849 STARTCHAR LATIN CAPITAL LETTER Z
850 ENCODING 90
851 SWIDTH 392 0
852 DWIDTH 6 0
853 BBX 5 8 0 0
854 BITMAP
855 F8
856 08
857 10
858 20
859 40
860 80
861 80
862 F8
863 ENDCHAR
864 STARTCHAR LEFT SQUARE BRACKET
865 ENCODING 91
866 SWIDTH 392 0
867 DWIDTH 6 0
868 BBX 3 9 2 -1
869 BITMAP
870 E0
871 80
872 80
873 80
874 80
875 80
876 80
877 80
878 E0
879 ENDCHAR
880 STARTCHAR REVERSE SOLIDUS
881 ENCODING 92
882 SWIDTH 392 0
883 DWIDTH 6 0
884 BBX 5 10 1 -2
885 BITMAP
886 80
887 80
888 40
889 40
890 20
891 20
892 10
893 10
894 08
895 08
896 ENDCHAR
897 STARTCHAR RIGHT SQUARE BRACKET
898 ENCODING 93
899 SWIDTH 392 0
900 DWIDTH 6 0
901 BBX 3 9 0 -1
902 BITMAP
903 E0
904 20
905 20
906 20
907 20
908 20
909 20
910 20
911 E0
912 ENDCHAR
913 STARTCHAR CIRCUMFLEX ACCENT
914 ENCODING 94
915 SWIDTH 392 0
916 DWIDTH 6 0
917 BBX 5 3 0 4
918 BITMAP
919 20
920 50
921 88
922 ENDCHAR
923 STARTCHAR LOW LINE
924 ENCODING 95
925 SWIDTH 392 0
926 DWIDTH 6 0
927 BBX 6 1 0 -1
928 BITMAP
929 FC
930 ENDCHAR
931 STARTCHAR GRAVE ACCENT
932 ENCODING 96
933 SWIDTH 392 0
934 DWIDTH 6 0
935 BBX 3 3 1 5
936 BITMAP
937 80
938 40
939 20
940 ENDCHAR
941 STARTCHAR LATIN SMALL LETTER A
942 ENCODING 97
943 SWIDTH 392 0
944 DWIDTH 6 0
945 BBX 5 5 0 0
946 BITMAP
947 70
948 08
949 78
950 88
951 78
952 ENDCHAR
953 STARTCHAR LATIN SMALL LETTER B
954 ENCODING 98
955 SWIDTH 392 0
956 DWIDTH 6 0
957 BBX 5 8 0 0
958 BITMAP
959 80
960 80
961 80
962 B0
963 C8
964 88
965 88
966 F0
967 ENDCHAR
968 STARTCHAR LATIN SMALL LETTER C
969 ENCODING 99
970 SWIDTH 392 0
971 DWIDTH 6 0
972 BBX 5 5 0 0
973 BITMAP
974 78
975 80
976 80
977 80
978 78
979 ENDCHAR
980 STARTCHAR LATIN SMALL LETTER D
981 ENCODING 100
982 SWIDTH 392 0
983 DWIDTH 6 0
984 BBX 5 8 0 0
985 BITMAP
986 08
987 08
988 08
989 78
990 88
991 88
992 98
993 68
994 ENDCHAR
995 STARTCHAR LATIN SMALL LETTER E
996 ENCODING 101
997 SWIDTH 392 0
998 DWIDTH 6 0
999 BBX 5 5 0 0
1000 BITMAP
1001 70
1002 88
1003 F8
1004 80
1005 78
1006 ENDCHAR
1007 STARTCHAR LATIN SMALL LETTER F
1008 ENCODING 102
1009 SWIDTH 392 0
1010 DWIDTH 6 0
1011 BBX 3 8 1 0
1012 BITMAP
1013 60
1014 80
1015 80
1016 E0
1017 80
1018 80
1019 80
1020 80
1021 ENDCHAR
1022 STARTCHAR LATIN SMALL LETTER G
1023 ENCODING 103
1024 SWIDTH 392 0
1025 DWIDTH 6 0
1026 BBX 5 7 0 -2
1027 BITMAP
1028 78
1029 88
1030 88
1031 98
1032 68
1033 08
1034 70
1035 ENDCHAR
1036 STARTCHAR LATIN SMALL LETTER H
1037 ENCODING 104
1038 SWIDTH 392 0
1039 DWIDTH 6 0
1040 BBX 5 8 0 0
1041 BITMAP
1042 80
1043 80
1044 80
1045 B0
1046 C8
1047 88
1048 88
1049 88
1050 ENDCHAR
1051 STARTCHAR LATIN SMALL LETTER I
1052 ENCODING 105
1053 SWIDTH 392 0
1054 DWIDTH 6 0
1055 BBX 3 7 1 0
1056 BITMAP
1057 40
1058 00
1059 C0
1060 40
1061 40
1062 40
1063 60
1064 ENDCHAR
1065 STARTCHAR LATIN SMALL LETTER J
1066 ENCODING 106
1067 SWIDTH 392 0
1068 DWIDTH 6 0
1069 BBX 3 9 0 -2
1070 BITMAP
1071 20
1072 00
1073 60
1074 20
1075 20
1076 20
1077 20
1078 20
1079 C0
1080 ENDCHAR
1081 STARTCHAR LATIN SMALL LETTER K
1082 ENCODING 107
1083 SWIDTH 392 0
1084 DWIDTH 6 0
1085 BBX 5 8 0 0
1086 BITMAP
1087 80
1088 80
1089 80
1090 90
1091 A0
1092 E0
1093 90
1094 88
1095 ENDCHAR
1096 STARTCHAR LATIN SMALL LETTER L
1097 ENCODING 108
1098 SWIDTH 392 0
1099 DWIDTH 6 0
1100 BBX 4 8 1 0
1101 BITMAP
1102 C0
1103 40
1104 40
1105 40
1106 40
1107 40
1108 40
1109 30
1110 ENDCHAR
1111 STARTCHAR LATIN SMALL LETTER M
1112 ENCODING 109
1113 SWIDTH 392 0
1114 DWIDTH 6 0
1115 BBX 5 5 0 0
1116 BITMAP
1117 F0
1118 A8
1119 A8
1120 A8
1121 A8
1122 ENDCHAR
1123 STARTCHAR LATIN SMALL LETTER N
1124 ENCODING 110
1125 SWIDTH 392 0
1126 DWIDTH 6 0
1127 BBX 5 5 0 0
1128 BITMAP
1129 F0
1130 88
1131 88
1132 88
1133 88
1134 ENDCHAR
1135 STARTCHAR LATIN SMALL LETTER O
1136 ENCODING 111
1137 SWIDTH 392 0
1138 DWIDTH 6 0
1139 BBX 5 5 0 0
1140 BITMAP
1141 70
1142 88
1143 88
1144 88
1145 70
1146 ENDCHAR
1147 STARTCHAR LATIN SMALL LETTER P
1148 ENCODING 112
1149 SWIDTH 392 0
1150 DWIDTH 6 0
1151 BBX 5 7 0 -2
1152 BITMAP
1153 B0
1154 C8
1155 88
1156 88
1157 F0
1158 80
1159 80
1160 ENDCHAR
1161 STARTCHAR LATIN SMALL LETTER Q
1162 ENCODING 113
1163 SWIDTH 392 0
1164 DWIDTH 6 0
1165 BBX 5 7 0 -2
1166 BITMAP
1167 78
1168 88
1169 88
1170 98
1171 68
1172 08
1173 08
1174 ENDCHAR
1175 STARTCHAR LATIN SMALL LETTER R
1176 ENCODING 114
1177 SWIDTH 392 0
1178 DWIDTH 6 0
1179 BBX 5 5 0 0
1180 BITMAP
1181 B0
1182 C8
1183 80
1184 80
1185 80
1186 ENDCHAR
1187 STARTCHAR LATIN SMALL LETTER S
1188 ENCODING 115
1189 SWIDTH 392 0
1190 DWIDTH 6 0
1191 BBX 5 5 0 0
1192 BITMAP
1193 70
1194 80
1195 70
1196 08
1197 F0
1198 ENDCHAR
1199 STARTCHAR LATIN SMALL LETTER T
1200 ENCODING 116
1201 SWIDTH 392 0
1202 DWIDTH 6 0
1203 BBX 4 8 0 0
1204 BITMAP
1205 40
1206 40
1207 40
1208 F0
1209 40
1210 40
1211 40
1212 30
1213 ENDCHAR
1214 STARTCHAR LATIN SMALL LETTER U
1215 ENCODING 117
1216 SWIDTH 392 0
1217 DWIDTH 6 0
1218 BBX 5 5 0 0
1219 BITMAP
1220 88
1221 88
1222 88
1223 98
1224 68
1225 ENDCHAR
1226 STARTCHAR LATIN SMALL LETTER V
1227 ENCODING 118
1228 SWIDTH 392 0
1229 DWIDTH 6 0
1230 BBX 5 5 0 0
1231 BITMAP
1232 88
1233 88
1234 50
1235 50
1236 20
1237 ENDCHAR
1238 STARTCHAR LATIN SMALL LETTER W
1239 ENCODING 119
1240 SWIDTH 392 0
1241 DWIDTH 6 0
1242 BBX 5 5 0 0
1243 BITMAP
1244 88
1245 A8
1246 A8
1247 A8
1248 50
1249 ENDCHAR
1250 STARTCHAR LATIN SMALL LETTER X
1251 ENCODING 120
1252 SWIDTH 392 0
1253 DWIDTH 6 0
1254 BBX 5 5 0 0
1255 BITMAP
1256 88
1257 50
1258 20
1259 50
1260 88
1261 ENDCHAR
1262 STARTCHAR LATIN SMALL LETTER Y
1263 ENCODING 121
1264 SWIDTH 392 0
1265 DWIDTH 6 0
1266 BBX 5 7 0 -2
1267 BITMAP
1268 88
1269 88
1270 88
1271 98
1272 68
1273 08
1274 70
1275 ENDCHAR
1276 STARTCHAR LATIN SMALL LETTER Z
1277 ENCODING 122
1278 SWIDTH 392 0
1279 DWIDTH 6 0
1280 BBX 5 5 0 0
1281 BITMAP
1282 F8
1283 10
1284 20
1285 40
1286 F8
1287 ENDCHAR
1288 STARTCHAR LEFT CURLY BRACKET
1289 ENCODING 123
1290 SWIDTH 392 0
1291 DWIDTH 6 0
1292 BBX 6 11 0 -2
1293 BITMAP
1294 18
1295 20
1296 20
1297 20
1298 20
1299 C0
1300 20
1301 20
1302 20
1303 20
1304 18
1305 ENDCHAR
1306 STARTCHAR VERTICAL LINE
1307 ENCODING 124
1308 SWIDTH 392 0
1309 DWIDTH 6 0
1310 BBX 1 9 2 -1
1311 BITMAP
1312 80
1313 80
1314 80
1315 80
1316 80
1317 80
1318 80
1319 80
1320 80
1321 ENDCHAR
1322 STARTCHAR RIGHT CURLY BRACKET
1323 ENCODING 125
1324 SWIDTH 392 0
1325 DWIDTH 6 0
1326 BBX 6 11 0 -2
1327 BITMAP
1328 C0
1329 20
1330 20
1331 20
1332 20
1333 18
1334 20
1335 20
1336 20
1337 20
1338 C0
1339 ENDCHAR
1340 STARTCHAR TILDE
1341 ENCODING 126
1342 SWIDTH 392 0
1343 DWIDTH 6 0
1344 BBX 5 3 0 2
1345 BITMAP
1346 40
1347 A8
1348 10
1349 ENDCHAR
1350 STARTCHAR NO-BREAK SPACE
1351 ENCODING 160
1352 SWIDTH 392 0
1353 DWIDTH 6 0
1354 BBX 0 0 0 0
1355 BITMAP
1356 ENDCHAR
1357 STARTCHAR INVERTED EXCLAMATION MARK
1358 ENCODING 161
1359 SWIDTH 392 0
1360 DWIDTH 6 0
1361 BBX 1 8 2 0
1362 BITMAP
1363 80
1364 00
1365 80
1366 80
1367 80
1368 80
1369 80
1370 80
1371 ENDCHAR
1372 STARTCHAR CENT SIGN
1373 ENCODING 162
1374 SWIDTH 392 0
1375 DWIDTH 6 0
1376 BBX 5 7 0 -1
1377 BITMAP
1378 20
1379 78
1380 A0
1381 A0
1382 A0
1383 78
1384 20
1385 ENDCHAR
1386 STARTCHAR POUND SIGN
1387 ENCODING 163
1388 SWIDTH 392 0
1389 DWIDTH 6 0
1390 BBX 5 8 0 0
1391 BITMAP
1392 30
1393 48
1394 40
1395 40
1396 E0
1397 40
1398 48
1399 B0
1400 ENDCHAR
1401 STARTCHAR CURRENCY SIGN
1402 ENCODING 164
1403 SWIDTH 392 0
1404 DWIDTH 6 0
1405 BBX 5 5 0 0
1406 BITMAP
1407 88
1408 70
1409 50
1410 70
1411 88
1412 ENDCHAR
1413 STARTCHAR YEN SIGN
1414 ENCODING 165
1415 SWIDTH 392 0
1416 DWIDTH 6 0
1417 BBX 5 9 0 -1
1418 BITMAP
1419 88
1420 88
1421 50
1422 20
1423 F8
1424 20
1425 F8
1426 20
1427 20
1428 ENDCHAR
1429 STARTCHAR BROKEN BAR
1430 ENCODING 166
1431 SWIDTH 392 0
1432 DWIDTH 6 0
1433 BBX 1 9 2 -1
1434 BITMAP
1435 80
1436 80
1437 80
1438 80
1439 00
1440 80
1441 80
1442 80
1443 80
1444 ENDCHAR
1445 STARTCHAR SECTION SIGN
1446 ENCODING 167
1447 SWIDTH 392 0
1448 DWIDTH 6 0
1449 BBX 4 9 1 -1
1450 BITMAP
1451 70
1452 80
1453 80
1454 E0
1455 90
1456 70
1457 10
1458 10
1459 E0
1460 ENDCHAR
1461 STARTCHAR DIAERESIS
1462 ENCODING 168
1463 SWIDTH 392 0
1464 DWIDTH 6 0
1465 BBX 3 1 1 7
1466 BITMAP
1467 A0
1468 ENDCHAR
1469 STARTCHAR COPYRIGHT SIGN
1470 ENCODING 169
1471 SWIDTH 392 0
1472 DWIDTH 6 0
1473 BBX 5 7 0 0
1474 BITMAP
1475 70
1476 88
1477 A8
1478 C8
1479 A8
1480 88
1481 70
1482 ENDCHAR
1483 STARTCHAR FEMININE ORDINAL INDICATOR
1484 ENCODING 170
1485 SWIDTH 392 0
1486 DWIDTH 6 0
1487 BBX 4 6 1 1
1488 BITMAP
1489 70
1490 90
1491 B0
1492 50
1493 00
1494 F0
1495 ENDCHAR
1496 STARTCHAR LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
1497 ENCODING 171
1498 SWIDTH 392 0
1499 DWIDTH 6 0
1500 BBX 6 5 0 1
1501 BITMAP
1502 24
1503 48
1504 90
1505 48
1506 24
1507 ENDCHAR
1508 STARTCHAR NOT SIGN
1509 ENCODING 172
1510 SWIDTH 392 0
1511 DWIDTH 6 0
1512 BBX 4 2 1 2
1513 BITMAP
1514 F0
1515 10
1516 ENDCHAR
1517 STARTCHAR SOFT HYPHEN
1518 ENCODING 173
1519 SWIDTH 392 0
1520 DWIDTH 6 0
1521 BBX 4 1 1 3
1522 BITMAP
1523 F0
1524 ENDCHAR
1525 STARTCHAR REGISTERED SIGN
1526 ENCODING 174
1527 SWIDTH 392 0
1528 DWIDTH 6 0
1529 BBX 5 7 0 0
1530 BITMAP
1531 70
1532 88
1533 E8
1534 C8
1535 C8
1536 88
1537 70
1538 ENDCHAR
1539 STARTCHAR MACRON
1540 ENCODING 175
1541 SWIDTH 392 0
1542 DWIDTH 6 0
1543 BBX 5 1 0 7
1544 BITMAP
1545 F8
1546 ENDCHAR
1547 STARTCHAR DEGREE SIGN
1548 ENCODING 176
1549 SWIDTH 392 0
1550 DWIDTH 6 0
1551 BBX 3 3 1 4
1552 BITMAP
1553 40
1554 A0
1555 40
1556 ENDCHAR
1557 STARTCHAR PLUS-MINUS SIGN
1558 ENCODING 177
1559 SWIDTH 392 0
1560 DWIDTH 6 0
1561 BBX 5 6 0 0
1562 BITMAP
1563 20
1564 20
1565 F8
1566 20
1567 20
1568 F8
1569 ENDCHAR
1570 STARTCHAR SUPERSCRIPT TWO
1571 ENCODING 178
1572 SWIDTH 392 0
1573 DWIDTH 6 0
1574 BBX 4 5 1 3
1575 BITMAP
1576 60
1577 90
1578 20
1579 40
1580 F0
1581 ENDCHAR
1582 STARTCHAR SUPERSCRIPT THREE
1583 ENCODING 179
1584 SWIDTH 392 0
1585 DWIDTH 6 0
1586 BBX 4 5 1 3
1587 BITMAP
1588 E0
1589 10
1590 60
1591 10
1592 E0
1593 ENDCHAR
1594 STARTCHAR ACUTE ACCENT
1595 ENCODING 180
1596 SWIDTH 392 0
1597 DWIDTH 6 0
1598 BBX 2 2 2 6
1599 BITMAP
1600 40
1601 80
1602 ENDCHAR
1603 STARTCHAR MICRO SIGN
1604 ENCODING 181
1605 SWIDTH 392 0
1606 DWIDTH 6 0
1607 BBX 5 6 0 -1
1608 BITMAP
1609 88
1610 88
1611 88
1612 C8
1613 B0
1614 80
1615 ENDCHAR
1616 STARTCHAR PILCROW SIGN
1617 ENCODING 182
1618 SWIDTH 392 0
1619 DWIDTH 6 0
1620 BBX 5 7 0 0
1621 BITMAP
1622 78
1623 E8
1624 E8
1625 68
1626 28
1627 28
1628 28
1629 ENDCHAR
1630 STARTCHAR MIDDLE DOT
1631 ENCODING 183
1632 SWIDTH 392 0
1633 DWIDTH 6 0
1634 BBX 1 1 2 3
1635 BITMAP
1636 80
1637 ENDCHAR
1638 STARTCHAR CEDILLA
1639 ENCODING 184
1640 SWIDTH 392 0
1641 DWIDTH 6 0
1642 BBX 2 2 2 -2
1643 BITMAP
1644 40
1645 80
1646 ENDCHAR
1647 STARTCHAR SUPERSCRIPT ONE
1648 ENCODING 185
1649 SWIDTH 392 0
1650 DWIDTH 6 0
1651 BBX 3 5 1 3
1652 BITMAP
1653 40
1654 C0
1655 40
1656 40
1657 E0
1658 ENDCHAR
1659 STARTCHAR MASCULINE ORDINAL INDICATOR
1660 ENCODING 186
1661 SWIDTH 392 0
1662 DWIDTH 6 0
1663 BBX 4 6 1 1
1664 BITMAP
1665 60
1666 90
1667 90
1668 60
1669 00
1670 F0
1671 ENDCHAR
1672 STARTCHAR RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
1673 ENCODING 187
1674 SWIDTH 392 0
1675 DWIDTH 6 0
1676 BBX 6 5 0 1
1677 BITMAP
1678 90
1679 48
1680 24
1681 48
1682 90
1683 ENDCHAR
1684 STARTCHAR VULGAR FRACTION ONE QUARTER
1685 ENCODING 188
1686 SWIDTH 392 0
1687 DWIDTH 6 0
1688 BBX 6 9 0 -1
1689 BITMAP
1690 40
1691 C0
1692 40
1693 40
1694 E4
1695 0C
1696 14
1697 3C
1698 04
1699 ENDCHAR
1700 STARTCHAR VULGAR FRACTION ONE HALF
1701 ENCODING 189
1702 SWIDTH 392 0
1703 DWIDTH 6 0
1704 BBX 6 9 0 -1
1705 BITMAP
1706 40
1707 C0
1708 40
1709 40
1710 E8
1711 14
1712 04
1713 08
1714 1C
1715 ENDCHAR
1716 STARTCHAR VULGAR FRACTION THREE QUARTERS
1717 ENCODING 190
1718 SWIDTH 392 0
1719 DWIDTH 6 0
1720 BBX 5 9 0 -1
1721 BITMAP
1722 C0
1723 20
1724 40
1725 20
1726 C8
1727 18
1728 28
1729 78
1730 08
1731 ENDCHAR
1732 STARTCHAR INVERTED QUESTION MARK
1733 ENCODING 191
1734 SWIDTH 392 0
1735 DWIDTH 6 0
1736 BBX 5 7 0 0
1737 BITMAP
1738 20
1739 00
1740 20
1741 40
1742 80
1743 88
1744 70
1745 ENDCHAR
1746 STARTCHAR LATIN CAPITAL LETTER A WITH GRAVE
1747 ENCODING 192
1748 SWIDTH 392 0
1749 DWIDTH 6 0
1750 BBX 5 9 0 0
1751 BITMAP
1752 40
1753 20
1754 70
1755 88
1756 88
1757 F8
1758 88
1759 88
1760 88
1761 ENDCHAR
1762 STARTCHAR LATIN CAPITAL LETTER A WITH ACUTE
1763 ENCODING 193
1764 SWIDTH 392 0
1765 DWIDTH 6 0
1766 BBX 5 9 0 0
1767 BITMAP
1768 10
1769 20
1770 70
1771 88
1772 88
1773 F8
1774 88
1775 88
1776 88
1777 ENDCHAR
1778 STARTCHAR LATIN CAPITAL LETTER A WITH CIRCUMFLEX
1779 ENCODING 194
1780 SWIDTH 392 0
1781 DWIDTH 6 0
1782 BBX 5 9 0 0
1783 BITMAP
1784 20
1785 50
1786 00
1787 70
1788 88
1789 88
1790 F8
1791 88
1792 88
1793 ENDCHAR
1794 STARTCHAR LATIN CAPITAL LETTER A WITH TILDE
1795 ENCODING 195
1796 SWIDTH 392 0
1797 DWIDTH 6 0
1798 BBX 5 9 0 0
1799 BITMAP
1800 68
1801 B0
1802 00
1803 70
1804 88
1805 88
1806 F8
1807 88
1808 88
1809 ENDCHAR
1810 STARTCHAR LATIN CAPITAL LETTER A WITH DIAERESIS
1811 ENCODING 196
1812 SWIDTH 392 0
1813 DWIDTH 6 0
1814 BBX 5 9 0 0
1815 BITMAP
1816 50
1817 00
1818 70
1819 88
1820 88
1821 F8
1822 88
1823 88
1824 88
1825 ENDCHAR
1826 STARTCHAR LATIN CAPITAL LETTER A WITH RING ABOVE
1827 ENCODING 197
1828 SWIDTH 392 0
1829 DWIDTH 6 0
1830 BBX 5 9 0 0
1831 BITMAP
1832 20
1833 50
1834 20
1835 70
1836 88
1837 88
1838 F8
1839 88
1840 88
1841 ENDCHAR
1842 STARTCHAR LATIN CAPITAL LETTER AE
1843 ENCODING 198
1844 SWIDTH 392 0
1845 DWIDTH 6 0
1846 BBX 5 7 0 0
1847 BITMAP
1848 78
1849 A0
1850 A0
1851 F0
1852 A0
1853 A0
1854 B8
1855 ENDCHAR
1856 STARTCHAR LATIN CAPITAL LETTER C WITH CEDILLA
1857 ENCODING 199
1858 SWIDTH 392 0
1859 DWIDTH 6 0
1860 BBX 5 9 0 -2
1861 BITMAP
1862 70
1863 88
1864 80
1865 80
1866 80
1867 88
1868 70
1869 20
1870 40
1871 ENDCHAR
1872 STARTCHAR LATIN CAPITAL LETTER E WITH GRAVE
1873 ENCODING 200
1874 SWIDTH 392 0
1875 DWIDTH 6 0
1876 BBX 5 9 0 0
1877 BITMAP
1878 40
1879 20
1880 F8
1881 80
1882 80
1883 F0
1884 80
1885 80
1886 F8
1887 ENDCHAR
1888 STARTCHAR LATIN CAPITAL LETTER E WITH ACUTE
1889 ENCODING 201
1890 SWIDTH 392 0
1891 DWIDTH 6 0
1892 BBX 5 9 0 0
1893 BITMAP
1894 10
1895 20
1896 F8
1897 80
1898 80
1899 F0
1900 80
1901 80
1902 F8
1903 ENDCHAR
1904 STARTCHAR LATIN CAPITAL LETTER E WITH CIRCUMFLEX
1905 ENCODING 202
1906 SWIDTH 392 0
1907 DWIDTH 6 0
1908 BBX 5 9 0 0
1909 BITMAP
1910 20
1911 50
1912 F8
1913 80
1914 80
1915 F0
1916 80
1917 80
1918 F8
1919 ENDCHAR
1920 STARTCHAR LATIN CAPITAL LETTER E WITH DIAERESIS
1921 ENCODING 203
1922 SWIDTH 392 0
1923 DWIDTH 6 0
1924 BBX 5 9 0 0
1925 BITMAP
1926 50
1927 00
1928 F8
1929 80
1930 80
1931 F0
1932 80
1933 80
1934 F8
1935 ENDCHAR
1936 STARTCHAR LATIN CAPITAL LETTER I WITH GRAVE
1937 ENCODING 204
1938 SWIDTH 392 0
1939 DWIDTH 6 0
1940 BBX 3 9 1 0
1941 BITMAP
1942 40
1943 20
1944 00
1945 E0
1946 40
1947 40
1948 40
1949 40
1950 E0
1951 ENDCHAR
1952 STARTCHAR LATIN CAPITAL LETTER I WITH ACUTE
1953 ENCODING 205
1954 SWIDTH 392 0
1955 DWIDTH 6 0
1956 BBX 3 9 1 0
1957 BITMAP
1958 40
1959 80
1960 00
1961 E0
1962 40
1963 40
1964 40
1965 40
1966 E0
1967 ENDCHAR
1968 STARTCHAR LATIN CAPITAL LETTER I WITH CIRCUMFLEX
1969 ENCODING 206
1970 SWIDTH 392 0
1971 DWIDTH 6 0
1972 BBX 3 9 1 0
1973 BITMAP
1974 40
1975 A0
1976 00
1977 E0
1978 40
1979 40
1980 40
1981 40
1982 E0
1983 ENDCHAR
1984 STARTCHAR LATIN CAPITAL LETTER I WITH DIAERESIS
1985 ENCODING 207
1986 SWIDTH 392 0
1987 DWIDTH 6 0
1988 BBX 3 9 1 0
1989 BITMAP
1990 A0
1991 00
1992 E0
1993 40
1994 40
1995 40
1996 40
1997 40
1998 E0
1999 ENDCHAR
2000 STARTCHAR LATIN CAPITAL LETTER ETH
2001 ENCODING 208
2002 SWIDTH 392 0
2003 DWIDTH 6 0
2004 BBX 5 7 0 0
2005 BITMAP
2006 70
2007 48
2008 48
2009 E8
2010 48
2011 48
2012 70
2013 ENDCHAR
2014 STARTCHAR LATIN CAPITAL LETTER N WITH TILDE
2015 ENCODING 209
2016 SWIDTH 392 0
2017 DWIDTH 6 0
2018 BBX 5 9 0 0
2019 BITMAP
2020 68
2021 B0
2022 88
2023 C8
2024 A8
2025 98
2026 88
2027 88
2028 88
2029 ENDCHAR
2030 STARTCHAR LATIN CAPITAL LETTER O WITH GRAVE
2031 ENCODING 210
2032 SWIDTH 392 0
2033 DWIDTH 6 0
2034 BBX 5 9 0 0
2035 BITMAP
2036 40
2037 20
2038 70
2039 88
2040 88
2041 88
2042 88
2043 88
2044 70
2045 ENDCHAR
2046 STARTCHAR LATIN CAPITAL LETTER O WITH ACUTE
2047 ENCODING 211
2048 SWIDTH 392 0
2049 DWIDTH 6 0
2050 BBX 5 9 0 0
2051 BITMAP
2052 10
2053 20
2054 70
2055 88
2056 88
2057 88
2058 88
2059 88
2060 70
2061 ENDCHAR
2062 STARTCHAR LATIN CAPITAL LETTER O WITH CIRCUMFLEX
2063 ENCODING 212
2064 SWIDTH 392 0
2065 DWIDTH 6 0
2066 BBX 5 9 0 0
2067 BITMAP
2068 20
2069 50
2070 00
2071 70
2072 88
2073 88
2074 88
2075 88
2076 70
2077 ENDCHAR
2078 STARTCHAR LATIN CAPITAL LETTER O WITH TILDE
2079 ENCODING 213
2080 SWIDTH 392 0
2081 DWIDTH 6 0
2082 BBX 5 9 0 0
2083 BITMAP
2084 68
2085 B0
2086 70
2087 88
2088 88
2089 88
2090 88
2091 88
2092 70
2093 ENDCHAR
2094 STARTCHAR LATIN CAPITAL LETTER O WITH DIAERESIS
2095 ENCODING 214
2096 SWIDTH 392 0
2097 DWIDTH 6 0
2098 BBX 5 9 0 0
2099 BITMAP
2100 50
2101 00
2102 70
2103 88
2104 88
2105 88
2106 88
2107 88
2108 70
2109 ENDCHAR
2110 STARTCHAR MULTIPLICATION SIGN
2111 ENCODING 215
2112 SWIDTH 392 0
2113 DWIDTH 6 0
2114 BBX 5 5 0 1
2115 BITMAP
2116 88
2117 50
2118 20
2119 50
2120 88
2121 ENDCHAR
2122 STARTCHAR LATIN CAPITAL LETTER O WITH STROKE
2123 ENCODING 216
2124 SWIDTH 392 0
2125 DWIDTH 6 0
2126 BBX 6 6 0 1
2127 BITMAP
2128 74
2129 88
2130 98
2131 A8
2132 C8
2133 F0
2134 ENDCHAR
2135 STARTCHAR LATIN CAPITAL LETTER U WITH GRAVE
2136 ENCODING 217
2137 SWIDTH 392 0
2138 DWIDTH 6 0
2139 BBX 5 9 0 0
2140 BITMAP
2141 40
2142 20
2143 88
2144 88
2145 88
2146 88
2147 88
2148 88
2149 70
2150 ENDCHAR
2151 STARTCHAR LATIN CAPITAL LETTER U WITH ACUTE
2152 ENCODING 218
2153 SWIDTH 392 0
2154 DWIDTH 6 0
2155 BBX 5 9 0 0
2156 BITMAP
2157 10
2158 20
2159 88
2160 88
2161 88
2162 88
2163 88
2164 88
2165 70
2166 ENDCHAR
2167 STARTCHAR LATIN CAPITAL LETTER U WITH CIRCUMFLEX
2168 ENCODING 219
2169 SWIDTH 392 0
2170 DWIDTH 6 0
2171 BBX 5 9 0 0
2172 BITMAP
2173 10
2174 20
2175 88
2176 88
2177 88
2178 88
2179 88
2180 88
2181 70
2182 ENDCHAR
2183 STARTCHAR LATIN CAPITAL LETTER U WITH DIAERESIS
2184 ENCODING 220
2185 SWIDTH 392 0
2186 DWIDTH 6 0
2187 BBX 5 9 0 0
2188 BITMAP
2189 50
2190 00
2191 88
2192 88
2193 88
2194 88
2195 88
2196 88
2197 70
2198 ENDCHAR
2199 STARTCHAR LATIN CAPITAL LETTER Y WITH ACUTE
2200 ENCODING 221
2201 SWIDTH 392 0
2202 DWIDTH 6 0
2203 BBX 5 9 0 0
2204 BITMAP
2205 10
2206 20
2207 88
2208 88
2209 88
2210 50
2211 20
2212 20
2213 20
2214 ENDCHAR
2215 STARTCHAR LATIN CAPITAL LETTER THORN
2216 ENCODING 222
2217 SWIDTH 392 0
2218 DWIDTH 6 0
2219 BBX 5 7 0 0
2220 BITMAP
2221 80
2222 F0
2223 88
2224 88
2225 F0
2226 80
2227 80
2228 ENDCHAR
2229 STARTCHAR LATIN SMALL LETTER SHARP S
2230 ENCODING 223
2231 SWIDTH 392 0
2232 DWIDTH 6 0
2233 BBX 5 9 0 -1
2234 BITMAP
2235 30
2236 48
2237 88
2238 90
2239 90
2240 88
2241 88
2242 B0
2243 80
2244 ENDCHAR
2245 STARTCHAR LATIN SMALL LETTER A WITH GRAVE
2246 ENCODING 224
2247 SWIDTH 392 0
2248 DWIDTH 6 0
2249 BBX 5 8 0 0
2250 BITMAP
2251 20
2252 10
2253 00
2254 70
2255 08
2256 78
2257 88
2258 78
2259 ENDCHAR
2260 STARTCHAR LATIN SMALL LETTER A WITH ACUTE
2261 ENCODING 225
2262 SWIDTH 392 0
2263 DWIDTH 6 0
2264 BBX 5 8 0 0
2265 BITMAP
2266 10
2267 20
2268 00
2269 70
2270 08
2271 78
2272 88
2273 78
2274 ENDCHAR
2275 STARTCHAR LATIN SMALL LETTER A WITH CIRCUMFLEX
2276 ENCODING 226
2277 SWIDTH 392 0
2278 DWIDTH 6 0
2279 BBX 5 8 0 0
2280 BITMAP
2281 20
2282 50
2283 00
2284 70
2285 08
2286 78
2287 88
2288 78
2289 ENDCHAR
2290 STARTCHAR LATIN SMALL LETTER A WITH TILDE
2291 ENCODING 227
2292 SWIDTH 392 0
2293 DWIDTH 6 0
2294 BBX 5 8 0 0
2295 BITMAP
2296 68
2297 B0
2298 00
2299 70
2300 08
2301 78
2302 88
2303 78
2304 ENDCHAR
2305 STARTCHAR LATIN SMALL LETTER A WITH DIAERESIS
2306 ENCODING 228
2307 SWIDTH 392 0
2308 DWIDTH 6 0
2309 BBX 5 7 0 0
2310 BITMAP
2311 50
2312 00
2313 70
2314 08
2315 78
2316 88
2317 78
2318 ENDCHAR
2319 STARTCHAR LATIN SMALL LETTER A WITH RING ABOVE
2320 ENCODING 229
2321 SWIDTH 392 0
2322 DWIDTH 6 0
2323 BBX 5 8 0 0
2324 BITMAP
2325 20
2326 50
2327 20
2328 70
2329 08
2330 78
2331 88
2332 78
2333 ENDCHAR
2334 STARTCHAR LATIN SMALL LETTER AE
2335 ENCODING 230
2336 SWIDTH 392 0
2337 DWIDTH 6 0
2338 BBX 5 5 0 0
2339 BITMAP
2340 70
2341 A8
2342 B8
2343 A0
2344 78
2345 ENDCHAR
2346 STARTCHAR LATIN SMALL LETTER C WITH CEDILLA
2347 ENCODING 231
2348 SWIDTH 392 0
2349 DWIDTH 6 0
2350 BBX 5 7 0 -2
2351 BITMAP
2352 78
2353 80
2354 80
2355 80
2356 78
2357 20
2358 40
2359 ENDCHAR
2360 STARTCHAR LATIN SMALL LETTER E WITH GRAVE
2361 ENCODING 232
2362 SWIDTH 392 0
2363 DWIDTH 6 0
2364 BBX 5 8 0 0
2365 BITMAP
2366 40
2367 20
2368 00
2369 70
2370 88
2371 F8
2372 80
2373 78
2374 ENDCHAR
2375 STARTCHAR LATIN SMALL LETTER E WITH ACUTE
2376 ENCODING 233
2377 SWIDTH 392 0
2378 DWIDTH 6 0
2379 BBX 5 8 0 0
2380 BITMAP
2381 10
2382 20
2383 00
2384 70
2385 88
2386 F8
2387 80
2388 78
2389 ENDCHAR
2390 STARTCHAR LATIN SMALL LETTER E WITH CIRCUMFLEX
2391 ENCODING 234
2392 SWIDTH 392 0
2393 DWIDTH 6 0
2394 BBX 5 8 0 0
2395 BITMAP
2396 20
2397 50
2398 00
2399 70
2400 88
2401 F8
2402 80
2403 78
2404 ENDCHAR
2405 STARTCHAR LATIN SMALL LETTER E WITH DIAERESIS
2406 ENCODING 235
2407 SWIDTH 392 0
2408 DWIDTH 6 0
2409 BBX 5 7 0 0
2410 BITMAP
2411 50
2412 00
2413 70
2414 88
2415 F8
2416 80
2417 78
2418 ENDCHAR
2419 STARTCHAR LATIN SMALL LETTER I WITH GRAVE
2420 ENCODING 236
2421 SWIDTH 392 0
2422 DWIDTH 6 0
2423 BBX 2 8 2 0
2424 BITMAP
2425 80
2426 40
2427 00
2428 80
2429 80
2430 80
2431 80
2432 80
2433 ENDCHAR
2434 STARTCHAR LATIN SMALL LETTER I WITH ACUTE
2435 ENCODING 237
2436 SWIDTH 392 0
2437 DWIDTH 6 0
2438 BBX 2 8 1 0
2439 BITMAP
2440 40
2441 80
2442 00
2443 40
2444 40
2445 40
2446 40
2447 40
2448 ENDCHAR
2449 STARTCHAR LATIN SMALL LETTER I WITH CIRCUMFLEX
2450 ENCODING 238
2451 SWIDTH 392 0
2452 DWIDTH 6 0
2453 BBX 3 8 1 0
2454 BITMAP
2455 40
2456 A0
2457 00
2458 40
2459 40
2460 40
2461 40
2462 40
2463 ENDCHAR
2464 STARTCHAR LATIN SMALL LETTER I WITH DIAERESIS
2465 ENCODING 239
2466 SWIDTH 392 0
2467 DWIDTH 6 0
2468 BBX 3 7 1 0
2469 BITMAP
2470 A0
2471 00
2472 40
2473 40
2474 40
2475 40
2476 40
2477 ENDCHAR
2478 STARTCHAR LATIN SMALL LETTER ETH
2479 ENCODING 240
2480 SWIDTH 392 0
2481 DWIDTH 6 0
2482 BBX 5 8 0 0
2483 BITMAP
2484 60
2485 60
2486 10
2487 78
2488 88
2489 88
2490 88
2491 70
2492 ENDCHAR
2493 STARTCHAR LATIN SMALL LETTER N WITH TILDE
2494 ENCODING 241
2495 SWIDTH 392 0
2496 DWIDTH 6 0
2497 BBX 5 8 0 0
2498 BITMAP
2499 50
2500 A0
2501 00
2502 F0
2503 88
2504 88
2505 88
2506 88
2507 ENDCHAR
2508 STARTCHAR LATIN SMALL LETTER O WITH GRAVE
2509 ENCODING 242
2510 SWIDTH 392 0
2511 DWIDTH 6 0
2512 BBX 5 8 0 0
2513 BITMAP
2514 40
2515 20
2516 00
2517 70
2518 88
2519 88
2520 88
2521 70
2522 ENDCHAR
2523 STARTCHAR LATIN SMALL LETTER O WITH ACUTE
2524 ENCODING 243
2525 SWIDTH 392 0
2526 DWIDTH 6 0
2527 BBX 5 8 0 0
2528 BITMAP
2529 10
2530 20
2531 00
2532 70
2533 88
2534 88
2535 88
2536 70
2537 ENDCHAR
2538 STARTCHAR LATIN SMALL LETTER O WITH CIRCUMFLEX
2539 ENCODING 244
2540 SWIDTH 392 0
2541 DWIDTH 6 0
2542 BBX 5 8 0 0
2543 BITMAP
2544 20
2545 50
2546 00
2547 70
2548 88
2549 88
2550 88
2551 70
2552 ENDCHAR
2553 STARTCHAR LATIN SMALL LETTER O WITH TILDE
2554 ENCODING 245
2555 SWIDTH 392 0
2556 DWIDTH 6 0
2557 BBX 5 8 0 0
2558 BITMAP
2559 50
2560 A0
2561 00
2562 70
2563 88
2564 88
2565 88
2566 70
2567 ENDCHAR
2568 STARTCHAR LATIN SMALL LETTER O WITH DIAERESIS
2569 ENCODING 246
2570 SWIDTH 392 0
2571 DWIDTH 6 0
2572 BBX 5 7 0 0
2573 BITMAP
2574 50
2575 00
2576 70
2577 88
2578 88
2579 88
2580 70
2581 ENDCHAR
2582 STARTCHAR DIVISION SIGN
2583 ENCODING 247
2584 SWIDTH 392 0
2585 DWIDTH 6 0
2586 BBX 5 5 0 1
2587 BITMAP
2588 20
2589 00
2590 F8
2591 00
2592 20
2593 ENDCHAR
2594 STARTCHAR LATIN SMALL LETTER O WITH STROKE
2595 ENCODING 248
2596 SWIDTH 392 0
2597 DWIDTH 6 0
2598 BBX 5 5 0 0
2599 BITMAP
2600 70
2601 98
2602 A8
2603 C8
2604 70
2605 ENDCHAR
2606 STARTCHAR LATIN SMALL LETTER U WITH GRAVE
2607 ENCODING 249
2608 SWIDTH 392 0
2609 DWIDTH 6 0
2610 BBX 5 8 0 0
2611 BITMAP
2612 40
2613 20
2614 00
2615 88
2616 88
2617 88
2618 98
2619 68
2620 ENDCHAR
2621 STARTCHAR LATIN SMALL LETTER U WITH ACUTE
2622 ENCODING 250
2623 SWIDTH 392 0
2624 DWIDTH 6 0
2625 BBX 5 8 0 0
2626 BITMAP
2627 10
2628 20
2629 00
2630 88
2631 88
2632 88
2633 98
2634 68
2635 ENDCHAR
2636 STARTCHAR LATIN SMALL LETTER U WITH CIRCUMFLEX
2637 ENCODING 251
2638 SWIDTH 392 0
2639 DWIDTH 6 0
2640 BBX 5 8 0 0
2641 BITMAP
2642 20
2643 50
2644 00
2645 88
2646 88
2647 88
2648 98
2649 68
2650 ENDCHAR
2651 STARTCHAR LATIN SMALL LETTER U WITH DIAERESIS
2652 ENCODING 252
2653 SWIDTH 392 0
2654 DWIDTH 6 0
2655 BBX 5 7 0 0
2656 BITMAP
2657 50
2658 00
2659 88
2660 88
2661 88
2662 98
2663 68
2664 ENDCHAR
2665 STARTCHAR LATIN SMALL LETTER Y WITH ACUTE
2666 ENCODING 253
2667 SWIDTH 392 0
2668 DWIDTH 6 0
2669 BBX 5 10 0 -2
2670 BITMAP
2671 10
2672 20
2673 00
2674 88
2675 88
2676 88
2677 98
2678 68
2679 08
2680 70
2681 ENDCHAR
2682 STARTCHAR LATIN SMALL LETTER THORN
2683 ENCODING 254
2684 SWIDTH 392 0
2685 DWIDTH 6 0
2686 BBX 5 9 0 -2
2687 BITMAP
2688 80
2689 80
2690 F0
2691 88
2692 88
2693 88
2694 F0
2695 80
2696 80
2697 ENDCHAR
2698 STARTCHAR LATIN SMALL LETTER Y WITH DIAERESIS
2699 ENCODING 255
2700 SWIDTH 392 0
2701 DWIDTH 6 0
2702 BBX 5 9 0 -2
2703 BITMAP
2704 50
2705 00
2706 88
2707 88
2708 88
2709 98
2710 68
2711 08
2712 70
2713 ENDCHAR
2714 ENDFONT
internal/site/gohufont-14b.bdf
Old New
@@ -0,0 +1,4052 @@
1 STARTFONT 2.1
2 COMMENT "Copyright by Hugo Chargois"
3 COMMENT "Licensed under the WTFPL"
4 FONT -Gohu-Gohufont-Bold-R-Normal--14-100-100-100-C-80-ISO8859-1
5 SIZE 14 100 100
6 FONTBOUNDINGBOX 8 14 0 -3
7 STARTPROPERTIES 31
8 FOUNDRY "Gohu"
9 FAMILY_NAME "GohuFont"
10 WEIGHT_NAME "Bold"
11 SLANT "R"
12 SETWIDTH_NAME "Normal"
13 ADD_STYLE_NAME ""
14 PIXEL_SIZE 14
15 POINT_SIZE 100
16 RESOLUTION_X 100
17 RESOLUTION_Y 100
18 SPACING "C"
19 AVERAGE_WIDTH 80
20 CHARSET_REGISTRY "ISO8859"
21 CHARSET_ENCODING "1"
22 FONTNAME_REGISTRY ""
23 FONT_NAME "GohuFont"
24 FACE_NAME "GohuFont"
25 FONT_VERSION "001.000"
26 FONT_ASCENT 11
27 FONT_DESCENT 3
28 UNDERLINE_POSITION -1
29 UNDERLINE_THICKNESS 1
30 X_HEIGHT 7
31 CAP_HEIGHT 9
32 RAW_ASCENT 785
33 RAW_DESCENT 215
34 NORM_SPACE 8
35 FIGURE_WIDTH 8
36 AVG_LOWERCASE_WIDTH 80
37 AVG_UPPERCASE_WIDTH "80"
38 _GBDFED_INFO "Edited with gbdfed 1.6."
39 ENDPROPERTIES
40 CHARS 191
41 STARTCHAR space
42 ENCODING 32
43 SWIDTH 411 0
44 DWIDTH 8 0
45 BBX 8 14 0 -3
46 BITMAP
47 00
48 00
49 00
50 00
51 00
52 00
53 00
54 00
55 00
56 00
57 00
58 00
59 00
60 00
61 ENDCHAR
62 STARTCHAR exclam
63 ENCODING 33
64 SWIDTH 411 0
65 DWIDTH 8 0
66 BBX 8 14 0 -3
67 BITMAP
68 00
69 18
70 18
71 18
72 18
73 18
74 18
75 18
76 00
77 18
78 18
79 00
80 00
81 00
82 ENDCHAR
83 STARTCHAR quotedbl
84 ENCODING 34
85 SWIDTH 411 0
86 DWIDTH 8 0
87 BBX 8 14 0 -3
88 BITMAP
89 00
90 36
91 36
92 36
93 00
94 00
95 00
96 00
97 00
98 00
99 00
100 00
101 00
102 00
103 ENDCHAR
104 STARTCHAR numbersign
105 ENCODING 35
106 SWIDTH 411 0
107 DWIDTH 8 0
108 BBX 8 14 0 -3
109 BITMAP
110 00
111 66
112 66
113 66
114 FF
115 66
116 66
117 FF
118 66
119 66
120 66
121 00
122 00
123 00
124 ENDCHAR
125 STARTCHAR dollar
126 ENCODING 36
127 SWIDTH 411 0
128 DWIDTH 8 0
129 BBX 8 14 0 -3
130 BITMAP
131 18
132 18
133 7E
134 DB
135 D8
136 D8
137 7E
138 1B
139 1B
140 DB
141 7E
142 18
143 18
144 00
145 ENDCHAR
146 STARTCHAR percent
147 ENCODING 37
148 SWIDTH 411 0
149 DWIDTH 8 0
150 BBX 8 14 0 -3
151 BITMAP
152 00
153 00
154 76
155 DE
156 7C
157 0C
158 18
159 18
160 30
161 3E
162 7B
163 6E
164 00
165 00
166 ENDCHAR
167 STARTCHAR ampersand
168 ENCODING 38
169 SWIDTH 411 0
170 DWIDTH 8 0
171 BBX 8 14 0 -3
172 BITMAP
173 00
174 1C
175 36
176 36
177 1C
178 38
179 6F
180 66
181 66
182 66
183 3F
184 00
185 00
186 00
187 ENDCHAR
188 STARTCHAR quotesingle
189 ENCODING 39
190 SWIDTH 411 0
191 DWIDTH 8 0
192 BBX 8 14 0 -3
193 BITMAP
194 00
195 18
196 18
197 18
198 18
199 00
200 00
201 00
202 00
203 00
204 00
205 00
206 00
207 00
208 ENDCHAR
209 STARTCHAR parenleft
210 ENCODING 40
211 SWIDTH 411 0
212 DWIDTH 8 0
213 BBX 8 14 0 -3
214 BITMAP
215 00
216 0C
217 18
218 30
219 30
220 60
221 60
222 60
223 60
224 30
225 30
226 18
227 0C
228 00
229 ENDCHAR
230 STARTCHAR parenright
231 ENCODING 41
232 SWIDTH 411 0
233 DWIDTH 8 0
234 BBX 8 14 0 -3
235 BITMAP
236 00
237 30
238 18
239 0C
240 0C
241 06
242 06
243 06
244 06
245 0C
246 0C
247 18
248 30
249 00
250 ENDCHAR
251 STARTCHAR asterisk
252 ENCODING 42
253 SWIDTH 411 0
254 DWIDTH 8 0
255 BBX 8 14 0 -3
256 BITMAP
257 00
258 00
259 00
260 18
261 DB
262 7E
263 3C
264 7E
265 DB
266 18
267 00
268 00
269 00
270 00
271 ENDCHAR
272 STARTCHAR plus
273 ENCODING 43
274 SWIDTH 411 0
275 DWIDTH 8 0
276 BBX 8 14 0 -3
277 BITMAP
278 00
279 00
280 00
281 18
282 18
283 18
284 FF
285 18
286 18
287 18
288 00
289 00
290 00
291 00
292 ENDCHAR
293 STARTCHAR comma
294 ENCODING 44
295 SWIDTH 411 0
296 DWIDTH 8 0
297 BBX 8 14 0 -3
298 BITMAP
299 00
300 00
301 00
302 00
303 00
304 00
305 00
306 00
307 00
308 38
309 38
310 18
311 30
312 00
313 ENDCHAR
314 STARTCHAR hyphen
315 ENCODING 45
316 SWIDTH 411 0
317 DWIDTH 8 0
318 BBX 8 14 0 -3
319 BITMAP
320 00
321 00
322 00
323 00
324 00
325 00
326 7E
327 00
328 00
329 00
330 00
331 00
332 00
333 00
334 ENDCHAR
335 STARTCHAR period
336 ENCODING 46
337 SWIDTH 411 0
338 DWIDTH 8 0
339 BBX 8 14 0 -3
340 BITMAP
341 00
342 00
343 00
344 00
345 00
346 00
347 00
348 00
349 00
350 38
351 38
352 00
353 00
354 00
355 ENDCHAR
356 STARTCHAR slash
357 ENCODING 47
358 SWIDTH 411 0
359 DWIDTH 8 0
360 BBX 8 14 0 -3
361 BITMAP
362 03
363 03
364 06
365 06
366 0C
367 0C
368 18
369 18
370 30
371 30
372 60
373 60
374 00
375 00
376 ENDCHAR
377 STARTCHAR zero
378 ENCODING 48
379 SWIDTH 411 0
380 DWIDTH 8 0
381 BBX 8 14 0 -3
382 BITMAP
383 00
384 00
385 3E
386 63
387 67
388 6F
389 7B
390 73
391 63
392 63
393 3E
394 00
395 00
396 00
397 ENDCHAR
398 STARTCHAR one
399 ENCODING 49
400 SWIDTH 411 0
401 DWIDTH 8 0
402 BBX 8 14 0 -3
403 BITMAP
404 00
405 00
406 0C
407 1C
408 3C
409 6C
410 0C
411 0C
412 0C
413 0C
414 0C
415 00
416 00
417 00
418 ENDCHAR
419 STARTCHAR two
420 ENCODING 50
421 SWIDTH 411 0
422 DWIDTH 8 0
423 BBX 8 14 0 -3
424 BITMAP
425 00
426 00
427 3E
428 63
429 63
430 06
431 0C
432 18
433 30
434 60
435 7F
436 00
437 00
438 00
439 ENDCHAR
440 STARTCHAR three
441 ENCODING 51
442 SWIDTH 411 0
443 DWIDTH 8 0
444 BBX 8 14 0 -3
445 BITMAP
446 00
447 00
448 3E
449 63
450 03
451 03
452 1E
453 03
454 03
455 63
456 3E
457 00
458 00
459 00
460 ENDCHAR
461 STARTCHAR four
462 ENCODING 52
463 SWIDTH 411 0
464 DWIDTH 8 0
465 BBX 8 14 0 -3
466 BITMAP
467 00
468 00
469 06
470 0E
471 1E
472 36
473 66
474 7F
475 06
476 06
477 06
478 00
479 00
480 00
481 ENDCHAR
482 STARTCHAR five
483 ENCODING 53
484 SWIDTH 411 0
485 DWIDTH 8 0
486 BBX 8 14 0 -3
487 BITMAP
488 00
489 00
490 7F
491 60
492 60
493 7E
494 03
495 03
496 03
497 63
498 3E
499 00
500 00
501 00
502 ENDCHAR
503 STARTCHAR six
504 ENCODING 54
505 SWIDTH 411 0
506 DWIDTH 8 0
507 BBX 8 14 0 -3
508 BITMAP
509 00
510 00
511 3E
512 60
513 60
514 7E
515 63
516 63
517 63
518 63
519 3E
520 00
521 00
522 00
523 ENDCHAR
524 STARTCHAR seven
525 ENCODING 55
526 SWIDTH 411 0
527 DWIDTH 8 0
528 BBX 8 14 0 -3
529 BITMAP
530 00
531 00
532 7F
533 03
534 06
535 06
536 0C
537 0C
538 18
539 18
540 18
541 00
542 00
543 00
544 ENDCHAR
545 STARTCHAR eight
546 ENCODING 56
547 SWIDTH 411 0
548 DWIDTH 8 0
549 BBX 8 14 0 -3
550 BITMAP
551 00
552 00
553 3E
554 63
555 63
556 63
557 3E
558 63
559 63
560 63
561 3E
562 00
563 00
564 00
565 ENDCHAR
566 STARTCHAR nine
567 ENCODING 57
568 SWIDTH 411 0
569 DWIDTH 8 0
570 BBX 8 14 0 -3
571 BITMAP
572 00
573 00
574 3E
575 63
576 63
577 63
578 3F
579 03
580 03
581 06
582 3C
583 00
584 00
585 00
586 ENDCHAR
587 STARTCHAR colon
588 ENCODING 58
589 SWIDTH 411 0
590 DWIDTH 8 0
591 BBX 8 14 0 -3
592 BITMAP
593 00
594 00
595 00
596 00
597 1C
598 1C
599 00
600 00
601 00
602 1C
603 1C
604 00
605 00
606 00
607 ENDCHAR
608 STARTCHAR semicolon
609 ENCODING 59
610 SWIDTH 411 0
611 DWIDTH 8 0
612 BBX 8 14 0 -3
613 BITMAP
614 00
615 00
616 00
617 00
618 38
619 38
620 00
621 00
622 00
623 38
624 38
625 18
626 30
627 00
628 ENDCHAR
629 STARTCHAR less
630 ENCODING 60
631 SWIDTH 411 0
632 DWIDTH 8 0
633 BBX 8 14 0 -3
634 BITMAP
635 00
636 00
637 06
638 0C
639 18
640 30
641 60
642 30
643 18
644 0C
645 06
646 00
647 00
648 00
649 ENDCHAR
650 STARTCHAR equal
651 ENCODING 61
652 SWIDTH 411 0
653 DWIDTH 8 0
654 BBX 8 14 0 -3
655 BITMAP
656 00
657 00
658 00
659 00
660 7E
661 00
662 00
663 00
664 7E
665 00
666 00
667 00
668 00
669 00
670 ENDCHAR
671 STARTCHAR greater
672 ENCODING 62
673 SWIDTH 411 0
674 DWIDTH 8 0
675 BBX 8 14 0 -3
676 BITMAP
677 00
678 00
679 60
680 30
681 18
682 0C
683 06
684 0C
685 18
686 30
687 60
688 00
689 00
690 00
691 ENDCHAR
692 STARTCHAR question
693 ENCODING 63
694 SWIDTH 411 0
695 DWIDTH 8 0
696 BBX 8 14 0 -3
697 BITMAP
698 00
699 3E
700 63
701 03
702 03
703 06
704 0C
705 18
706 00
707 18
708 18
709 00
710 00
711 00
712 ENDCHAR
713 STARTCHAR at
714 ENCODING 64
715 SWIDTH 411 0
716 DWIDTH 8 0
717 BBX 8 14 0 -3
718 BITMAP
719 00
720 7E
721 C3
722 DF
723 F3
724 F3
725 F3
726 F7
727 DF
728 C0
729 7F
730 00
731 00
732 00
733 ENDCHAR
734 STARTCHAR A
735 ENCODING 65
736 SWIDTH 411 0
737 DWIDTH 8 0
738 BBX 8 14 0 -3
739 BITMAP
740 00
741 00
742 3E
743 63
744 63
745 63
746 7F
747 63
748 63
749 63
750 63
751 00
752 00
753 00
754 ENDCHAR
755 STARTCHAR B
756 ENCODING 66
757 SWIDTH 411 0
758 DWIDTH 8 0
759 BBX 8 14 0 -3
760 BITMAP
761 00
762 00
763 7E
764 63
765 63
766 63
767 7E
768 63
769 63
770 63
771 7E
772 00
773 00
774 00
775 ENDCHAR
776 STARTCHAR C
777 ENCODING 67
778 SWIDTH 411 0
779 DWIDTH 8 0
780 BBX 8 14 0 -3
781 BITMAP
782 00
783 00
784 3E
785 63
786 60
787 60
788 60
789 60
790 60
791 63
792 3E
793 00
794 00
795 00
796 ENDCHAR
797 STARTCHAR D
798 ENCODING 68
799 SWIDTH 411 0
800 DWIDTH 8 0
801 BBX 8 14 0 -3
802 BITMAP
803 00
804 00
805 7C
806 66
807 63
808 63
809 63
810 63
811 63
812 66
813 7C
814 00
815 00
816 00
817 ENDCHAR
818 STARTCHAR E
819 ENCODING 69
820 SWIDTH 411 0
821 DWIDTH 8 0
822 BBX 8 14 0 -3
823 BITMAP
824 00
825 00
826 7F
827 60
828 60
829 60
830 7C
831 60
832 60
833 60
834 7F
835 00
836 00
837 00
838 ENDCHAR
839 STARTCHAR F
840 ENCODING 70
841 SWIDTH 411 0
842 DWIDTH 8 0
843 BBX 8 14 0 -3
844 BITMAP
845 00
846 00
847 7F
848 60
849 60
850 60
851 7C
852 60
853 60
854 60
855 60
856 00
857 00
858 00
859 ENDCHAR
860 STARTCHAR G
861 ENCODING 71
862 SWIDTH 411 0
863 DWIDTH 8 0
864 BBX 8 14 0 -3
865 BITMAP
866 00
867 00
868 3E
869 63
870 60
871 60
872 6F
873 63
874 63
875 63
876 3E
877 00
878 00
879 00
880 ENDCHAR
881 STARTCHAR H
882 ENCODING 72
883 SWIDTH 411 0
884 DWIDTH 8 0
885 BBX 8 14 0 -3
886 BITMAP
887 00
888 00
889 63
890 63
891 63
892 63
893 7F
894 63
895 63
896 63
897 63
898 00
899 00
900 00
901 ENDCHAR
902 STARTCHAR I
903 ENCODING 73
904 SWIDTH 411 0
905 DWIDTH 8 0
906 BBX 8 14 0 -3
907 BITMAP
908 00
909 00
910 3C
911 18
912 18
913 18
914 18
915 18
916 18
917 18
918 3C
919 00
920 00
921 00
922 ENDCHAR
923 STARTCHAR J
924 ENCODING 74
925 SWIDTH 411 0
926 DWIDTH 8 0
927 BBX 8 14 0 -3
928 BITMAP
929 00
930 00
931 03
932 03
933 03
934 03
935 03
936 03
937 63
938 63
939 3E
940 00
941 00
942 00
943 ENDCHAR
944 STARTCHAR K
945 ENCODING 75
946 SWIDTH 411 0
947 DWIDTH 8 0
948 BBX 8 14 0 -3
949 BITMAP
950 00
951 00
952 63
953 66
954 6C
955 78
956 70
957 78
958 6C
959 66
960 63
961 00
962 00
963 00
964 ENDCHAR
965 STARTCHAR L
966 ENCODING 76
967 SWIDTH 411 0
968 DWIDTH 8 0
969 BBX 8 14 0 -3
970 BITMAP
971 00
972 00
973 60
974 60
975 60
976 60
977 60
978 60
979 60
980 60
981 7F
982 00
983 00
984 00
985 ENDCHAR
986 STARTCHAR M
987 ENCODING 77
988 SWIDTH 411 0
989 DWIDTH 8 0
990 BBX 8 14 0 -3
991 BITMAP
992 00
993 00
994 C3
995 E7
996 FF
997 DB
998 DB
999 C3
1000 C3
1001 C3
1002 C3
1003 00
1004 00
1005 00
1006 ENDCHAR
1007 STARTCHAR N
1008 ENCODING 78
1009 SWIDTH 411 0
1010 DWIDTH 8 0
1011 BBX 8 14 0 -3
1012 BITMAP
1013 00
1014 00
1015 63
1016 73
1017 73
1018 7B
1019 7B
1020 6F
1021 6F
1022 67
1023 67
1024 00
1025 00
1026 00
1027 ENDCHAR
1028 STARTCHAR O
1029 ENCODING 79
1030 SWIDTH 411 0
1031 DWIDTH 8 0
1032 BBX 8 14 0 -3
1033 BITMAP
1034 00
1035 00
1036 3E
1037 63
1038 63
1039 63
1040 63
1041 63
1042 63
1043 63
1044 3E
1045 00
1046 00
1047 00
1048 ENDCHAR
1049 STARTCHAR P
1050 ENCODING 80
1051 SWIDTH 411 0
1052 DWIDTH 8 0
1053 BBX 8 14 0 -3
1054 BITMAP
1055 00
1056 00
1057 7E
1058 63
1059 63
1060 63
1061 7E
1062 60
1063 60
1064 60
1065 60
1066 00
1067 00
1068 00
1069 ENDCHAR
1070 STARTCHAR Q
1071 ENCODING 81
1072 SWIDTH 411 0
1073 DWIDTH 8 0
1074 BBX 8 14 0 -3
1075 BITMAP
1076 00
1077 00
1078 3E
1079 63
1080 63
1081 63
1082 63
1083 6F
1084 6F
1085 66
1086 3F
1087 03
1088 00
1089 00
1090 ENDCHAR
1091 STARTCHAR R
1092 ENCODING 82
1093 SWIDTH 411 0
1094 DWIDTH 8 0
1095 BBX 8 14 0 -3
1096 BITMAP
1097 00
1098 00
1099 7E
1100 63
1101 63
1102 63
1103 7E
1104 6C
1105 66
1106 63
1107 63
1108 00
1109 00
1110 00
1111 ENDCHAR
1112 STARTCHAR S
1113 ENCODING 83
1114 SWIDTH 411 0
1115 DWIDTH 8 0
1116 BBX 8 14 0 -3
1117 BITMAP
1118 00
1119 00
1120 3E
1121 63
1122 60
1123 60
1124 3E
1125 03
1126 03
1127 63
1128 3E
1129 00
1130 00
1131 00
1132 ENDCHAR
1133 STARTCHAR T
1134 ENCODING 84
1135 SWIDTH 411 0
1136 DWIDTH 8 0
1137 BBX 8 14 0 -3
1138 BITMAP
1139 00
1140 00
1141 FF
1142 18
1143 18
1144 18
1145 18
1146 18
1147 18
1148 18
1149 18
1150 00
1151 00
1152 00
1153 ENDCHAR
1154 STARTCHAR U
1155 ENCODING 85
1156 SWIDTH 411 0
1157 DWIDTH 8 0
1158 BBX 8 14 0 -3
1159 BITMAP
1160 00
1161 00
1162 63
1163 63
1164 63
1165 63
1166 63
1167 63
1168 63
1169 63
1170 3E
1171 00
1172 00
1173 00
1174 ENDCHAR
1175 STARTCHAR V
1176 ENCODING 86
1177 SWIDTH 411 0
1178 DWIDTH 8 0
1179 BBX 8 14 0 -3
1180 BITMAP
1181 00
1182 00
1183 63
1184 63
1185 63
1186 63
1187 36
1188 36
1189 36
1190 1C
1191 1C
1192 00
1193 00
1194 00
1195 ENDCHAR
1196 STARTCHAR W
1197 ENCODING 87
1198 SWIDTH 411 0
1199 DWIDTH 8 0
1200 BBX 8 14 0 -3
1201 BITMAP
1202 00
1203 00
1204 C3
1205 C3
1206 DB
1207 DB
1208 DB
1209 FF
1210 66
1211 66
1212 66
1213 00
1214 00
1215 00
1216 ENDCHAR
1217 STARTCHAR X
1218 ENCODING 88
1219 SWIDTH 411 0
1220 DWIDTH 8 0
1221 BBX 8 14 0 -3
1222 BITMAP
1223 00
1224 00
1225 63
1226 63
1227 36
1228 36
1229 1C
1230 36
1231 36
1232 63
1233 63
1234 00
1235 00
1236 00
1237 ENDCHAR
1238 STARTCHAR Y
1239 ENCODING 89
1240 SWIDTH 411 0
1241 DWIDTH 8 0
1242 BBX 8 14 0 -3
1243 BITMAP
1244 00
1245 00
1246 C3
1247 C3
1248 66
1249 66
1250 3C
1251 18
1252 18
1253 18
1254 18
1255 00
1256 00
1257 00
1258 ENDCHAR
1259 STARTCHAR Z
1260 ENCODING 90
1261 SWIDTH 411 0
1262 DWIDTH 8 0
1263 BBX 8 14 0 -3
1264 BITMAP
1265 00
1266 00
1267 7F
1268 03
1269 06
1270 0C
1271 18
1272 30
1273 60
1274 60
1275 7F
1276 00
1277 00
1278 00
1279 ENDCHAR
1280 STARTCHAR bracketleft
1281 ENCODING 91
1282 SWIDTH 411 0
1283 DWIDTH 8 0
1284 BBX 8 14 0 -3
1285 BITMAP
1286 00
1287 1E
1288 18
1289 18
1290 18
1291 18
1292 18
1293 18
1294 18
1295 18
1296 18
1297 1E
1298 00
1299 00
1300 ENDCHAR
1301 STARTCHAR backslash
1302 ENCODING 92
1303 SWIDTH 411 0
1304 DWIDTH 8 0
1305 BBX 8 14 0 -3
1306 BITMAP
1307 60
1308 60
1309 30
1310 30
1311 18
1312 18
1313 0C
1314 0C
1315 06
1316 06
1317 03
1318 03
1319 00
1320 00
1321 ENDCHAR
1322 STARTCHAR bracketright
1323 ENCODING 93
1324 SWIDTH 411 0
1325 DWIDTH 8 0
1326 BBX 8 14 0 -3
1327 BITMAP
1328 00
1329 3C
1330 0C
1331 0C
1332 0C
1333 0C
1334 0C
1335 0C
1336 0C
1337 0C
1338 0C
1339 3C
1340 00
1341 00
1342 ENDCHAR
1343 STARTCHAR asciicircum
1344 ENCODING 94
1345 SWIDTH 411 0
1346 DWIDTH 8 0
1347 BBX 8 14 0 -3
1348 BITMAP
1349 00
1350 18
1351 3C
1352 66
1353 00
1354 00
1355 00
1356 00
1357 00
1358 00
1359 00
1360 00
1361 00
1362 00
1363 ENDCHAR
1364 STARTCHAR underscore
1365 ENCODING 95
1366 SWIDTH 411 0
1367 DWIDTH 8 0
1368 BBX 8 14 0 -3
1369 BITMAP
1370 00
1371 00
1372 00
1373 00
1374 00
1375 00
1376 00
1377 00
1378 00
1379 00
1380 00
1381 FF
1382 00
1383 00
1384 ENDCHAR
1385 STARTCHAR grave
1386 ENCODING 96
1387 SWIDTH 411 0
1388 DWIDTH 8 0
1389 BBX 8 14 0 -3
1390 BITMAP
1391 00
1392 60
1393 30
1394 18
1395 00
1396 00
1397 00
1398 00
1399 00
1400 00
1401 00
1402 00
1403 00
1404 00
1405 ENDCHAR
1406 STARTCHAR a
1407 ENCODING 97
1408 SWIDTH 411 0
1409 DWIDTH 8 0
1410 BBX 8 14 0 -3
1411 BITMAP
1412 00
1413 00
1414 00
1415 00
1416 3E
1417 03
1418 3F
1419 63
1420 63
1421 67
1422 3B
1423 00
1424 00
1425 00
1426 ENDCHAR
1427 STARTCHAR b
1428 ENCODING 98
1429 SWIDTH 411 0
1430 DWIDTH 8 0
1431 BBX 8 14 0 -3
1432 BITMAP
1433 00
1434 60
1435 60
1436 60
1437 6E
1438 73
1439 63
1440 63
1441 63
1442 63
1443 7E
1444 00
1445 00
1446 00
1447 ENDCHAR
1448 STARTCHAR c
1449 ENCODING 99
1450 SWIDTH 411 0
1451 DWIDTH 8 0
1452 BBX 8 14 0 -3
1453 BITMAP
1454 00
1455 00
1456 00
1457 00
1458 3E
1459 63
1460 60
1461 60
1462 60
1463 63
1464 3E
1465 00
1466 00
1467 00
1468 ENDCHAR
1469 STARTCHAR d
1470 ENCODING 100
1471 SWIDTH 411 0
1472 DWIDTH 8 0
1473 BBX 8 14 0 -3
1474 BITMAP
1475 00
1476 03
1477 03
1478 03
1479 3F
1480 63
1481 63
1482 63
1483 63
1484 67
1485 3B
1486 00
1487 00
1488 00
1489 ENDCHAR
1490 STARTCHAR e
1491 ENCODING 101
1492 SWIDTH 411 0
1493 DWIDTH 8 0
1494 BBX 8 14 0 -3
1495 BITMAP
1496 00
1497 00
1498 00
1499 00
1500 3E
1501 63
1502 63
1503 7F
1504 60
1505 60
1506 3F
1507 00
1508 00
1509 00
1510 ENDCHAR
1511 STARTCHAR f
1512 ENCODING 102
1513 SWIDTH 411 0
1514 DWIDTH 8 0
1515 BBX 8 14 0 -3
1516 BITMAP
1517 00
1518 1E
1519 30
1520 30
1521 30
1522 3E
1523 30
1524 30
1525 30
1526 30
1527 30
1528 00
1529 00
1530 00
1531 ENDCHAR
1532 STARTCHAR g
1533 ENCODING 103
1534 SWIDTH 411 0
1535 DWIDTH 8 0
1536 BBX 8 14 0 -3
1537 BITMAP
1538 00
1539 00
1540 00
1541 00
1542 3F
1543 63
1544 63
1545 63
1546 63
1547 67
1548 3B
1549 03
1550 03
1551 3E
1552 ENDCHAR
1553 STARTCHAR h
1554 ENCODING 104
1555 SWIDTH 411 0
1556 DWIDTH 8 0
1557 BBX 8 14 0 -3
1558 BITMAP
1559 00
1560 60
1561 60
1562 60
1563 6E
1564 73
1565 63
1566 63
1567 63
1568 63
1569 63
1570 00
1571 00
1572 00
1573 ENDCHAR
1574 STARTCHAR i
1575 ENCODING 105
1576 SWIDTH 411 0
1577 DWIDTH 8 0
1578 BBX 8 14 0 -3
1579 BITMAP
1580 00
1581 18
1582 18
1583 00
1584 78
1585 18
1586 18
1587 18
1588 18
1589 18
1590 1E
1591 00
1592 00
1593 00
1594 ENDCHAR
1595 STARTCHAR j
1596 ENCODING 106
1597 SWIDTH 411 0
1598 DWIDTH 8 0
1599 BBX 8 14 0 -3
1600 BITMAP
1601 00
1602 0C
1603 0C
1604 00
1605 1C
1606 0C
1607 0C
1608 0C
1609 0C
1610 0C
1611 0C
1612 0C
1613 0C
1614 78
1615 ENDCHAR
1616 STARTCHAR k
1617 ENCODING 107
1618 SWIDTH 411 0
1619 DWIDTH 8 0
1620 BBX 8 14 0 -3
1621 BITMAP
1622 00
1623 60
1624 60
1625 60
1626 60
1627 66
1628 6C
1629 78
1630 6C
1631 66
1632 63
1633 00
1634 00
1635 00
1636 ENDCHAR
1637 STARTCHAR l
1638 ENCODING 108
1639 SWIDTH 411 0
1640 DWIDTH 8 0
1641 BBX 8 14 0 -3
1642 BITMAP
1643 00
1644 38
1645 18
1646 18
1647 18
1648 18
1649 18
1650 18
1651 18
1652 18
1653 0F
1654 00
1655 00
1656 00
1657 ENDCHAR
1658 STARTCHAR m
1659 ENCODING 109
1660 SWIDTH 411 0
1661 DWIDTH 8 0
1662 BBX 8 14 0 -3
1663 BITMAP
1664 00
1665 00
1666 00
1667 00
1668 FE
1669 DB
1670 DB
1671 DB
1672 DB
1673 DB
1674 DB
1675 00
1676 00
1677 00
1678 ENDCHAR
1679 STARTCHAR n
1680 ENCODING 110
1681 SWIDTH 411 0
1682 DWIDTH 8 0
1683 BBX 8 14 0 -3
1684 BITMAP
1685 00
1686 00
1687 00
1688 00
1689 7E
1690 63
1691 63
1692 63
1693 63
1694 63
1695 63
1696 00
1697 00
1698 00
1699 ENDCHAR
1700 STARTCHAR o
1701 ENCODING 111
1702 SWIDTH 411 0
1703 DWIDTH 8 0
1704 BBX 8 14 0 -3
1705 BITMAP
1706 00
1707 00
1708 00
1709 00
1710 3E
1711 63
1712 63
1713 63
1714 63
1715 63
1716 3E
1717 00
1718 00
1719 00
1720 ENDCHAR
1721 STARTCHAR p
1722 ENCODING 112
1723 SWIDTH 411 0
1724 DWIDTH 8 0
1725 BBX 8 14 0 -3
1726 BITMAP
1727 00
1728 00
1729 00
1730 00
1731 6E
1732 73
1733 63
1734 63
1735 63
1736 63
1737 7E
1738 60
1739 60
1740 60
1741 ENDCHAR
1742 STARTCHAR q
1743 ENCODING 113
1744 SWIDTH 411 0
1745 DWIDTH 8 0
1746 BBX 8 14 0 -3
1747 BITMAP
1748 00
1749 00
1750 00
1751 00
1752 3F
1753 63
1754 63
1755 63
1756 63
1757 67
1758 3B
1759 03
1760 03
1761 03
1762 ENDCHAR
1763 STARTCHAR r
1764 ENCODING 114
1765 SWIDTH 411 0
1766 DWIDTH 8 0
1767 BBX 8 14 0 -3
1768 BITMAP
1769 00
1770 00
1771 00
1772 00
1773 6E
1774 73
1775 60
1776 60
1777 60
1778 60
1779 60
1780 00
1781 00
1782 00
1783 ENDCHAR
1784 STARTCHAR s
1785 ENCODING 115
1786 SWIDTH 411 0
1787 DWIDTH 8 0
1788 BBX 8 14 0 -3
1789 BITMAP
1790 00
1791 00
1792 00
1793 00
1794 3E
1795 60
1796 60
1797 3E
1798 03
1799 03
1800 7E
1801 00
1802 00
1803 00
1804 ENDCHAR
1805 STARTCHAR t
1806 ENCODING 116
1807 SWIDTH 411 0
1808 DWIDTH 8 0
1809 BBX 8 14 0 -3
1810 BITMAP
1811 00
1812 18
1813 18
1814 18
1815 3E
1816 18
1817 18
1818 18
1819 18
1820 18
1821 0E
1822 00
1823 00
1824 00
1825 ENDCHAR
1826 STARTCHAR u
1827 ENCODING 117
1828 SWIDTH 411 0
1829 DWIDTH 8 0
1830 BBX 8 14 0 -3
1831 BITMAP
1832 00
1833 00
1834 00
1835 00
1836 63
1837 63
1838 63
1839 63
1840 63
1841 67
1842 3B
1843 00
1844 00
1845 00
1846 ENDCHAR
1847 STARTCHAR v
1848 ENCODING 118
1849 SWIDTH 411 0
1850 DWIDTH 8 0
1851 BBX 8 14 0 -3
1852 BITMAP
1853 00
1854 00
1855 00
1856 00
1857 63
1858 63
1859 63
1860 36
1861 36
1862 1C
1863 1C
1864 00
1865 00
1866 00
1867 ENDCHAR
1868 STARTCHAR w
1869 ENCODING 119
1870 SWIDTH 411 0
1871 DWIDTH 8 0
1872 BBX 8 14 0 -3
1873 BITMAP
1874 00
1875 00
1876 00
1877 00
1878 C3
1879 C3
1880 DB
1881 DB
1882 FF
1883 66
1884 66
1885 00
1886 00
1887 00
1888 ENDCHAR
1889 STARTCHAR x
1890 ENCODING 120
1891 SWIDTH 411 0
1892 DWIDTH 8 0
1893 BBX 8 14 0 -3
1894 BITMAP
1895 00
1896 00
1897 00
1898 00
1899 63
1900 63
1901 36
1902 1C
1903 36
1904 63
1905 63
1906 00
1907 00
1908 00
1909 ENDCHAR
1910 STARTCHAR y
1911 ENCODING 121
1912 SWIDTH 411 0
1913 DWIDTH 8 0
1914 BBX 8 14 0 -3
1915 BITMAP
1916 00
1917 00
1918 00
1919 00
1920 63
1921 63
1922 63
1923 63
1924 63
1925 67
1926 3B
1927 03
1928 03
1929 3E
1930 ENDCHAR
1931 STARTCHAR z
1932 ENCODING 122
1933 SWIDTH 411 0
1934 DWIDTH 8 0
1935 BBX 8 14 0 -3
1936 BITMAP
1937 00
1938 00
1939 00
1940 00
1941 7F
1942 06
1943 0C
1944 18
1945 30
1946 60
1947 7F
1948 00
1949 00
1950 00
1951 ENDCHAR
1952 STARTCHAR braceleft
1953 ENCODING 123
1954 SWIDTH 411 0
1955 DWIDTH 8 0
1956 BBX 8 14 0 -3
1957 BITMAP
1958 00
1959 0F
1960 18
1961 18
1962 18
1963 18
1964 18
1965 F0
1966 18
1967 18
1968 18
1969 18
1970 0F
1971 00
1972 ENDCHAR
1973 STARTCHAR bar
1974 ENCODING 124
1975 SWIDTH 411 0
1976 DWIDTH 8 0
1977 BBX 8 14 0 -3
1978 BITMAP
1979 00
1980 18
1981 18
1982 18
1983 18
1984 18
1985 18
1986 18
1987 18
1988 18
1989 18
1990 18
1991 18
1992 00
1993 ENDCHAR
1994 STARTCHAR braceright
1995 ENCODING 125
1996 SWIDTH 411 0
1997 DWIDTH 8 0
1998 BBX 8 14 0 -3
1999 BITMAP
2000 00
2001 78
2002 0C
2003 0C
2004 0C
2005 0C
2006 0C
2007 07
2008 0C
2009 0C
2010 0C
2011 0C
2012 78
2013 00
2014 ENDCHAR
2015 STARTCHAR asciitilde
2016 ENCODING 126
2017 SWIDTH 411 0
2018 DWIDTH 8 0
2019 BBX 8 14 0 -3
2020 BITMAP
2021 00
2022 00
2023 00
2024 00
2025 00
2026 73
2027 DB
2028 CE
2029 00
2030 00
2031 00
2032 00
2033 00
2034 00
2035 ENDCHAR
2036 STARTCHAR nbspace
2037 ENCODING 160
2038 SWIDTH 411 0
2039 DWIDTH 8 0
2040 BBX 8 14 0 -3
2041 BITMAP
2042 00
2043 00
2044 00
2045 00
2046 00
2047 00
2048 00
2049 00
2050 00
2051 00
2052 00
2053 00
2054 00
2055 00
2056 ENDCHAR
2057 STARTCHAR exclamdown
2058 ENCODING 161
2059 SWIDTH 411 0
2060 DWIDTH 8 0
2061 BBX 8 14 0 -3
2062 BITMAP
2063 00
2064 18
2065 18
2066 00
2067 18
2068 18
2069 18
2070 18
2071 18
2072 18
2073 18
2074 00
2075 00
2076 00
2077 ENDCHAR
2078 STARTCHAR cent
2079 ENCODING 162
2080 SWIDTH 411 0
2081 DWIDTH 8 0
2082 BBX 8 14 0 -3
2083 BITMAP
2084 00
2085 00
2086 18
2087 18
2088 7E
2089 DB
2090 D8
2091 D8
2092 D8
2093 DB
2094 7E
2095 18
2096 18
2097 00
2098 ENDCHAR
2099 STARTCHAR sterling
2100 ENCODING 163
2101 SWIDTH 411 0
2102 DWIDTH 8 0
2103 BBX 8 14 0 -3
2104 BITMAP
2105 00
2106 1C
2107 36
2108 30
2109 30
2110 7C
2111 30
2112 30
2113 30
2114 33
2115 7E
2116 00
2117 00
2118 00
2119 ENDCHAR
2120 STARTCHAR currency
2121 ENCODING 164
2122 SWIDTH 411 0
2123 DWIDTH 8 0
2124 BBX 8 14 0 -3
2125 BITMAP
2126 00
2127 00
2128 00
2129 00
2130 C3
2131 7E
2132 66
2133 66
2134 66
2135 7E
2136 C3
2137 00
2138 00
2139 00
2140 ENDCHAR
2141 STARTCHAR yen
2142 ENCODING 165
2143 SWIDTH 411 0
2144 DWIDTH 8 0
2145 BBX 8 14 0 -3
2146 BITMAP
2147 00
2148 C3
2149 C3
2150 66
2151 3C
2152 18
2153 7E
2154 18
2155 7E
2156 18
2157 18
2158 00
2159 00
2160 00
2161 ENDCHAR
2162 STARTCHAR brokenbar
2163 ENCODING 166
2164 SWIDTH 411 0
2165 DWIDTH 8 0
2166 BBX 8 14 0 -3
2167 BITMAP
2168 00
2169 18
2170 18
2171 18
2172 18
2173 18
2174 00
2175 00
2176 18
2177 18
2178 18
2179 18
2180 18
2181 00
2182 ENDCHAR
2183 STARTCHAR section
2184 ENCODING 167
2185 SWIDTH 411 0
2186 DWIDTH 8 0
2187 BBX 8 14 0 -3
2188 BITMAP
2189 00
2190 3C
2191 66
2192 60
2193 38
2194 6C
2195 66
2196 66
2197 36
2198 1C
2199 06
2200 66
2201 3C
2202 00
2203 ENDCHAR
2204 STARTCHAR dieresis
2205 ENCODING 168
2206 SWIDTH 411 0
2207 DWIDTH 8 0
2208 BBX 8 14 0 -3
2209 BITMAP
2210 00
2211 36
2212 36
2213 00
2214 00
2215 00
2216 00
2217 00
2218 00
2219 00
2220 00
2221 00
2222 00
2223 00
2224 ENDCHAR
2225 STARTCHAR copyright
2226 ENCODING 169
2227 SWIDTH 411 0
2228 DWIDTH 8 0
2229 BBX 8 14 0 -3
2230 BITMAP
2231 00
2232 00
2233 3E
2234 63
2235 DD
2236 F7
2237 F1
2238 F7
2239 DD
2240 63
2241 3E
2242 00
2243 00
2244 00
2245 ENDCHAR
2246 STARTCHAR ordfeminine
2247 ENCODING 170
2248 SWIDTH 411 0
2249 DWIDTH 8 0
2250 BBX 8 14 0 -3
2251 BITMAP
2252 00
2253 3C
2254 06
2255 3E
2256 66
2257 3E
2258 00
2259 7E
2260 00
2261 00
2262 00
2263 00
2264 00
2265 00
2266 ENDCHAR
2267 STARTCHAR guillemotleft
2268 ENCODING 171
2269 SWIDTH 411 0
2270 DWIDTH 8 0
2271 BBX 8 14 0 -3
2272 BITMAP
2273 00
2274 00
2275 00
2276 00
2277 1B
2278 36
2279 6C
2280 D8
2281 6C
2282 36
2283 1B
2284 00
2285 00
2286 00
2287 ENDCHAR
2288 STARTCHAR logicalnot
2289 ENCODING 172
2290 SWIDTH 411 0
2291 DWIDTH 8 0
2292 BBX 8 14 0 -3
2293 BITMAP
2294 00
2295 00
2296 00
2297 00
2298 00
2299 7F
2300 03
2301 03
2302 03
2303 00
2304 00
2305 00
2306 00
2307 00
2308 ENDCHAR
2309 STARTCHAR softhyphen
2310 ENCODING 173
2311 SWIDTH 411 0
2312 DWIDTH 8 0
2313 BBX 8 14 0 -3
2314 BITMAP
2315 00
2316 00
2317 00
2318 00
2319 00
2320 00
2321 00
2322 3E
2323 00
2324 00
2325 00
2326 00
2327 00
2328 00
2329 ENDCHAR
2330 STARTCHAR registered
2331 ENCODING 174
2332 SWIDTH 411 0
2333 DWIDTH 8 0
2334 BBX 8 14 0 -3
2335 BITMAP
2336 00
2337 00
2338 3E
2339 63
2340 FD
2341 F7
2342 FD
2343 FD
2344 F7
2345 63
2346 3E
2347 00
2348 00
2349 00
2350 ENDCHAR
2351 STARTCHAR macron
2352 ENCODING 175
2353 SWIDTH 411 0
2354 DWIDTH 8 0
2355 BBX 8 14 0 -3
2356 BITMAP
2357 00
2358 7F
2359 00
2360 00
2361 00
2362 00
2363 00
2364 00
2365 00
2366 00
2367 00
2368 00
2369 00
2370 00
2371 ENDCHAR
2372 STARTCHAR degree
2373 ENCODING 176
2374 SWIDTH 411 0
2375 DWIDTH 8 0
2376 BBX 8 14 0 -3
2377 BITMAP
2378 00
2379 1C
2380 36
2381 36
2382 1C
2383 00
2384 00
2385 00
2386 00
2387 00
2388 00
2389 00
2390 00
2391 00
2392 ENDCHAR
2393 STARTCHAR plusminus
2394 ENCODING 177
2395 SWIDTH 411 0
2396 DWIDTH 8 0
2397 BBX 8 14 0 -3
2398 BITMAP
2399 00
2400 00
2401 00
2402 00
2403 18
2404 18
2405 7E
2406 18
2407 18
2408 00
2409 7E
2410 00
2411 00
2412 00
2413 ENDCHAR
2414 STARTCHAR twosuperior
2415 ENCODING 178
2416 SWIDTH 411 0
2417 DWIDTH 8 0
2418 BBX 8 14 0 -3
2419 BITMAP
2420 00
2421 1C
2422 36
2423 0C
2424 18
2425 3E
2426 00
2427 00
2428 00
2429 00
2430 00
2431 00
2432 00
2433 00
2434 ENDCHAR
2435 STARTCHAR threesuperior
2436 ENCODING 179
2437 SWIDTH 411 0
2438 DWIDTH 8 0
2439 BBX 8 14 0 -3
2440 BITMAP
2441 00
2442 3C
2443 06
2444 1C
2445 06
2446 3C
2447 00
2448 00
2449 00
2450 00
2451 00
2452 00
2453 00
2454 00
2455 ENDCHAR
2456 STARTCHAR acute
2457 ENCODING 180
2458 SWIDTH 411 0
2459 DWIDTH 8 0
2460 BBX 8 14 0 -3
2461 BITMAP
2462 0C
2463 18
2464 00
2465 00
2466 00
2467 00
2468 00
2469 00
2470 00
2471 00
2472 00
2473 00
2474 00
2475 00
2476 ENDCHAR
2477 STARTCHAR mu
2478 ENCODING 181
2479 SWIDTH 411 0
2480 DWIDTH 8 0
2481 BBX 8 14 0 -3
2482 BITMAP
2483 00
2484 00
2485 00
2486 00
2487 63
2488 63
2489 63
2490 63
2491 63
2492 67
2493 7B
2494 60
2495 60
2496 60
2497 ENDCHAR
2498 STARTCHAR paragraph
2499 ENCODING 182
2500 SWIDTH 411 0
2501 DWIDTH 8 0
2502 BBX 8 14 0 -3
2503 BITMAP
2504 00
2505 7F
2506 FB
2507 FB
2508 FB
2509 FB
2510 7B
2511 1B
2512 1B
2513 1B
2514 1B
2515 00
2516 00
2517 00
2518 ENDCHAR
2519 STARTCHAR periodcentered
2520 ENCODING 183
2521 SWIDTH 411 0
2522 DWIDTH 8 0
2523 BBX 8 14 0 -3
2524 BITMAP
2525 00
2526 00
2527 00
2528 00
2529 00
2530 00
2531 38
2532 38
2533 00
2534 00
2535 00
2536 00
2537 00
2538 00
2539 ENDCHAR
2540 STARTCHAR cedilla
2541 ENCODING 184
2542 SWIDTH 411 0
2543 DWIDTH 8 0
2544 BBX 8 14 0 -3
2545 BITMAP
2546 00
2547 00
2548 00
2549 00
2550 00
2551 00
2552 00
2553 00
2554 00
2555 00
2556 00
2557 18
2558 18
2559 30
2560 ENDCHAR
2561 STARTCHAR onesuperior
2562 ENCODING 185
2563 SWIDTH 411 0
2564 DWIDTH 8 0
2565 BBX 8 14 0 -3
2566 BITMAP
2567 00
2568 18
2569 38
2570 18
2571 18
2572 3C
2573 00
2574 00
2575 00
2576 00
2577 00
2578 00
2579 00
2580 00
2581 ENDCHAR
2582 STARTCHAR ordmasculine
2583 ENCODING 186
2584 SWIDTH 411 0
2585 DWIDTH 8 0
2586 BBX 8 14 0 -3
2587 BITMAP
2588 00
2589 3C
2590 66
2591 66
2592 66
2593 3C
2594 00
2595 7E
2596 00
2597 00
2598 00
2599 00
2600 00
2601 00
2602 ENDCHAR
2603 STARTCHAR guillemotright
2604 ENCODING 187
2605 SWIDTH 411 0
2606 DWIDTH 8 0
2607 BBX 8 14 0 -3
2608 BITMAP
2609 00
2610 00
2611 00
2612 00
2613 D8
2614 6C
2615 36
2616 1B
2617 36
2618 6C
2619 D8
2620 00
2621 00
2622 00
2623 ENDCHAR
2624 STARTCHAR onequarter
2625 ENCODING 188
2626 SWIDTH 411 0
2627 DWIDTH 8 0
2628 BBX 8 14 0 -3
2629 BITMAP
2630 30
2631 70
2632 30
2633 33
2634 36
2635 0C
2636 18
2637 33
2638 67
2639 CF
2640 1F
2641 03
2642 03
2643 00
2644 ENDCHAR
2645 STARTCHAR onehalf
2646 ENCODING 189
2647 SWIDTH 411 0
2648 DWIDTH 8 0
2649 BBX 8 14 0 -3
2650 BITMAP
2651 30
2652 70
2653 30
2654 33
2655 36
2656 0C
2657 18
2658 30
2659 6E
2660 DB
2661 06
2662 0C
2663 1F
2664 00
2665 ENDCHAR
2666 STARTCHAR threequarters
2667 ENCODING 190
2668 SWIDTH 411 0
2669 DWIDTH 8 0
2670 BBX 8 14 0 -3
2671 BITMAP
2672 F0
2673 18
2674 70
2675 1B
2676 F6
2677 0C
2678 18
2679 33
2680 67
2681 CF
2682 1F
2683 03
2684 03
2685 00
2686 ENDCHAR
2687 STARTCHAR question
2688 ENCODING 191
2689 SWIDTH 411 0
2690 DWIDTH 8 0
2691 BBX 8 14 0 -3
2692 BITMAP
2693 00
2694 0C
2695 0C
2696 00
2697 0C
2698 18
2699 30
2700 60
2701 60
2702 63
2703 3E
2704 00
2705 00
2706 00
2707 ENDCHAR
2708 STARTCHAR Agrave
2709 ENCODING 192
2710 SWIDTH 411 0
2711 DWIDTH 8 0
2712 BBX 8 14 0 -3
2713 BITMAP
2714 18
2715 0C
2716 3E
2717 63
2718 63
2719 63
2720 7F
2721 63
2722 63
2723 63
2724 63
2725 00
2726 00
2727 00
2728 ENDCHAR
2729 STARTCHAR Aacute
2730 ENCODING 193
2731 SWIDTH 411 0
2732 DWIDTH 8 0
2733 BBX 8 14 0 -3
2734 BITMAP
2735 0C
2736 18
2737 3E
2738 63
2739 63
2740 63
2741 7F
2742 63
2743 63
2744 63
2745 63
2746 00
2747 00
2748 00
2749 ENDCHAR
2750 STARTCHAR Acircumflex
2751 ENCODING 194
2752 SWIDTH 411 0
2753 DWIDTH 8 0
2754 BBX 8 14 0 -3
2755 BITMAP
2756 1C
2757 36
2758 00
2759 3E
2760 63
2761 63
2762 63
2763 7F
2764 63
2765 63
2766 63
2767 00
2768 00
2769 00
2770 ENDCHAR
2771 STARTCHAR Atilde
2772 ENCODING 195
2773 SWIDTH 411 0
2774 DWIDTH 8 0
2775 BBX 8 14 0 -3
2776 BITMAP
2777 3B
2778 6E
2779 00
2780 3E
2781 63
2782 63
2783 63
2784 7F
2785 63
2786 63
2787 63
2788 00
2789 00
2790 00
2791 ENDCHAR
2792 STARTCHAR Adieresis
2793 ENCODING 196
2794 SWIDTH 411 0
2795 DWIDTH 8 0
2796 BBX 8 14 0 -3
2797 BITMAP
2798 36
2799 36
2800 00
2801 3E
2802 63
2803 63
2804 63
2805 7F
2806 63
2807 63
2808 63
2809 00
2810 00
2811 00
2812 ENDCHAR
2813 STARTCHAR Aring
2814 ENCODING 197
2815 SWIDTH 411 0
2816 DWIDTH 8 0
2817 BBX 8 14 0 -3
2818 BITMAP
2819 1C
2820 36
2821 1C
2822 3E
2823 63
2824 63
2825 63
2826 7F
2827 63
2828 63
2829 63
2830 00
2831 00
2832 00
2833 ENDCHAR
2834 STARTCHAR AE
2835 ENCODING 198
2836 SWIDTH 411 0
2837 DWIDTH 8 0
2838 BBX 8 14 0 -3
2839 BITMAP
2840 00
2841 00
2842 7F
2843 D8
2844 D8
2845 D8
2846 FE
2847 D8
2848 D8
2849 D8
2850 DF
2851 00
2852 00
2853 00
2854 ENDCHAR
2855 STARTCHAR Ccedilla
2856 ENCODING 199
2857 SWIDTH 411 0
2858 DWIDTH 8 0
2859 BBX 8 14 0 -3
2860 BITMAP
2861 00
2862 00
2863 3E
2864 63
2865 60
2866 60
2867 60
2868 60
2869 60
2870 63
2871 3E
2872 18
2873 30
2874 00
2875 ENDCHAR
2876 STARTCHAR Egrave
2877 ENCODING 200
2878 SWIDTH 411 0
2879 DWIDTH 8 0
2880 BBX 8 14 0 -3
2881 BITMAP
2882 18
2883 0C
2884 7F
2885 60
2886 60
2887 60
2888 7C
2889 60
2890 60
2891 60
2892 7F
2893 00
2894 00
2895 00
2896 ENDCHAR
2897 STARTCHAR Eacute
2898 ENCODING 201
2899 SWIDTH 411 0
2900 DWIDTH 8 0
2901 BBX 8 14 0 -3
2902 BITMAP
2903 0C
2904 18
2905 7F
2906 60
2907 60
2908 60
2909 7C
2910 60
2911 60
2912 60
2913 7F
2914 00
2915 00
2916 00
2917 ENDCHAR
2918 STARTCHAR Ecircumflex
2919 ENCODING 202
2920 SWIDTH 411 0
2921 DWIDTH 8 0
2922 BBX 8 14 0 -3
2923 BITMAP
2924 1C
2925 36
2926 00
2927 7F
2928 60
2929 60
2930 7C
2931 60
2932 60
2933 60
2934 7F
2935 00
2936 00
2937 00
2938 ENDCHAR
2939 STARTCHAR Edieresis
2940 ENCODING 203
2941 SWIDTH 411 0
2942 DWIDTH 8 0
2943 BBX 8 14 0 -3
2944 BITMAP
2945 36
2946 36
2947 00
2948 7F
2949 60
2950 60
2951 7C
2952 60
2953 60
2954 60
2955 7F
2956 00
2957 00
2958 00
2959 ENDCHAR
2960 STARTCHAR Igrave
2961 ENCODING 204
2962 SWIDTH 411 0
2963 DWIDTH 8 0
2964 BBX 8 14 0 -3
2965 BITMAP
2966 30
2967 18
2968 00
2969 3C
2970 18
2971 18
2972 18
2973 18
2974 18
2975 18
2976 3C
2977 00
2978 00
2979 00
2980 ENDCHAR
2981 STARTCHAR Iacute
2982 ENCODING 205
2983 SWIDTH 411 0
2984 DWIDTH 8 0
2985 BBX 8 14 0 -3
2986 BITMAP
2987 0C
2988 18
2989 00
2990 3C
2991 18
2992 18
2993 18
2994 18
2995 18
2996 18
2997 3C
2998 00
2999 00
3000 00
3001 ENDCHAR
3002 STARTCHAR Icircumflex
3003 ENCODING 206
3004 SWIDTH 411 0
3005 DWIDTH 8 0
3006 BBX 8 14 0 -3
3007 BITMAP
3008 1C
3009 36
3010 00
3011 3C
3012 18
3013 18
3014 18
3015 18
3016 18
3017 18
3018 3C
3019 00
3020 00
3021 00
3022 ENDCHAR
3023 STARTCHAR Idieresis
3024 ENCODING 207
3025 SWIDTH 411 0
3026 DWIDTH 8 0
3027 BBX 8 14 0 -3
3028 BITMAP
3029 66
3030 66
3031 00
3032 3C
3033 18
3034 18
3035 18
3036 18
3037 18
3038 18
3039 3C
3040 00
3041 00
3042 00
3043 ENDCHAR
3044 STARTCHAR Eth
3045 ENCODING 208
3046 SWIDTH 411 0
3047 DWIDTH 8 0
3048 BBX 8 14 0 -3
3049 BITMAP
3050 00
3051 00
3052 7C
3053 66
3054 63
3055 63
3056 FB
3057 63
3058 63
3059 66
3060 7C
3061 00
3062 00
3063 00
3064 ENDCHAR
3065 STARTCHAR Ntilde
3066 ENCODING 209
3067 SWIDTH 411 0
3068 DWIDTH 8 0
3069 BBX 8 14 0 -3
3070 BITMAP
3071 3B
3072 6E
3073 00
3074 73
3075 73
3076 7B
3077 7B
3078 6F
3079 6F
3080 67
3081 67
3082 00
3083 00
3084 00
3085 ENDCHAR
3086 STARTCHAR Ograve
3087 ENCODING 210
3088 SWIDTH 411 0
3089 DWIDTH 8 0
3090 BBX 8 14 0 -3
3091 BITMAP
3092 18
3093 0C
3094 3E
3095 63
3096 63
3097 63
3098 63
3099 63
3100 63
3101 63
3102 3E
3103 00
3104 00
3105 00
3106 ENDCHAR
3107 STARTCHAR Oacute
3108 ENCODING 211
3109 SWIDTH 411 0
3110 DWIDTH 8 0
3111 BBX 8 14 0 -3
3112 BITMAP
3113 0C
3114 18
3115 3E
3116 63
3117 63
3118 63
3119 63
3120 63
3121 63
3122 63
3123 3E
3124 00
3125 00
3126 00
3127 ENDCHAR
3128 STARTCHAR Ocircumflex
3129 ENCODING 212
3130 SWIDTH 411 0
3131 DWIDTH 8 0
3132 BBX 8 14 0 -3
3133 BITMAP
3134 1C
3135 36
3136 00
3137 3E
3138 63
3139 63
3140 63
3141 63
3142 63
3143 63
3144 3E
3145 00
3146 00
3147 00
3148 ENDCHAR
3149 STARTCHAR Otilde
3150 ENCODING 213
3151 SWIDTH 411 0
3152 DWIDTH 8 0
3153 BBX 8 14 0 -3
3154 BITMAP
3155 3B
3156 6E
3157 00
3158 3E
3159 63
3160 63
3161 63
3162 63
3163 63
3164 63
3165 3E
3166 00
3167 00
3168 00
3169 ENDCHAR
3170 STARTCHAR Odieresis
3171 ENCODING 214
3172 SWIDTH 411 0
3173 DWIDTH 8 0
3174 BBX 8 14 0 -3
3175 BITMAP
3176 36
3177 36
3178 00
3179 3E
3180 63
3181 63
3182 63
3183 63
3184 63
3185 63
3186 3E
3187 00
3188 00
3189 00
3190 ENDCHAR
3191 STARTCHAR multiply
3192 ENCODING 215
3193 SWIDTH 411 0
3194 DWIDTH 8 0
3195 BBX 8 14 0 -3
3196 BITMAP
3197 00
3198 00
3199 00
3200 00
3201 00
3202 63
3203 36
3204 1C
3205 36
3206 63
3207 00
3208 00
3209 00
3210 00
3211 ENDCHAR
3212 STARTCHAR Oslash
3213 ENCODING 216
3214 SWIDTH 411 0
3215 DWIDTH 8 0
3216 BBX 8 14 0 -3
3217 BITMAP
3218 03
3219 3F
3220 66
3221 67
3222 6F
3223 6F
3224 7B
3225 7B
3226 73
3227 33
3228 7E
3229 60
3230 00
3231 00
3232 ENDCHAR
3233 STARTCHAR Ugrave
3234 ENCODING 217
3235 SWIDTH 411 0
3236 DWIDTH 8 0
3237 BBX 8 14 0 -3
3238 BITMAP
3239 18
3240 0C
3241 63
3242 63
3243 63
3244 63
3245 63
3246 63
3247 63
3248 63
3249 3E
3250 00
3251 00
3252 00
3253 ENDCHAR
3254 STARTCHAR Uacute
3255 ENCODING 218
3256 SWIDTH 411 0
3257 DWIDTH 8 0
3258 BBX 8 14 0 -3
3259 BITMAP
3260 0C
3261 18
3262 63
3263 63
3264 63
3265 63
3266 63
3267 63
3268 63
3269 63
3270 3E
3271 00
3272 00
3273 00
3274 ENDCHAR
3275 STARTCHAR Ucircumflex
3276 ENCODING 219
3277 SWIDTH 411 0
3278 DWIDTH 8 0
3279 BBX 8 14 0 -3
3280 BITMAP
3281 1C
3282 36
3283 00
3284 63
3285 63
3286 63
3287 63
3288 63
3289 63
3290 63
3291 3E
3292 00
3293 00
3294 00
3295 ENDCHAR
3296 STARTCHAR Udieresis
3297 ENCODING 220
3298 SWIDTH 411 0
3299 DWIDTH 8 0
3300 BBX 8 14 0 -3
3301 BITMAP
3302 36
3303 36
3304 00
3305 63
3306 63
3307 63
3308 63
3309 63
3310 63
3311 63
3312 3E
3313 00
3314 00
3315 00
3316 ENDCHAR
3317 STARTCHAR Yacute
3318 ENCODING 221
3319 SWIDTH 411 0
3320 DWIDTH 8 0
3321 BBX 8 14 0 -3
3322 BITMAP
3323 0C
3324 18
3325 C3
3326 C3
3327 66
3328 66
3329 3C
3330 18
3331 18
3332 18
3333 18
3334 00
3335 00
3336 00
3337 ENDCHAR
3338 STARTCHAR Thorn
3339 ENCODING 222
3340 SWIDTH 411 0
3341 DWIDTH 8 0
3342 BBX 8 14 0 -3
3343 BITMAP
3344 00
3345 60
3346 60
3347 7E
3348 63
3349 63
3350 63
3351 63
3352 7E
3353 60
3354 60
3355 00
3356 00
3357 00
3358 ENDCHAR
3359 STARTCHAR germandbls
3360 ENCODING 223
3361 SWIDTH 411 0
3362 DWIDTH 8 0
3363 BBX 8 14 0 -3
3364 BITMAP
3365 00
3366 3C
3367 66
3368 66
3369 6C
3370 7E
3371 63
3372 63
3373 63
3374 73
3375 7E
3376 00
3377 00
3378 00
3379 ENDCHAR
3380 STARTCHAR agrave
3381 ENCODING 224
3382 SWIDTH 411 0
3383 DWIDTH 8 0
3384 BBX 8 14 0 -3
3385 BITMAP
3386 00
3387 18
3388 0C
3389 00
3390 3E
3391 03
3392 3F
3393 63
3394 63
3395 67
3396 3B
3397 00
3398 00
3399 00
3400 ENDCHAR
3401 STARTCHAR aacute
3402 ENCODING 225
3403 SWIDTH 411 0
3404 DWIDTH 8 0
3405 BBX 8 14 0 -3
3406 BITMAP
3407 00
3408 0C
3409 18
3410 00
3411 3E
3412 03
3413 3F
3414 63
3415 63
3416 67
3417 3B
3418 00
3419 00
3420 00
3421 ENDCHAR
3422 STARTCHAR acircumflex
3423 ENCODING 226
3424 SWIDTH 411 0
3425 DWIDTH 8 0
3426 BBX 8 14 0 -3
3427 BITMAP
3428 00
3429 1C
3430 36
3431 00
3432 3E
3433 03
3434 3F
3435 63
3436 63
3437 67
3438 3B
3439 00
3440 00
3441 00
3442 ENDCHAR
3443 STARTCHAR atilde
3444 ENCODING 227
3445 SWIDTH 411 0
3446 DWIDTH 8 0
3447 BBX 8 14 0 -3
3448 BITMAP
3449 00
3450 3B
3451 6E
3452 00
3453 3E
3454 03
3455 3F
3456 63
3457 63
3458 67
3459 3B
3460 00
3461 00
3462 00
3463 ENDCHAR
3464 STARTCHAR adieresis
3465 ENCODING 228
3466 SWIDTH 411 0
3467 DWIDTH 8 0
3468 BBX 8 14 0 -3
3469 BITMAP
3470 00
3471 36
3472 36
3473 00
3474 3E
3475 03
3476 3F
3477 63
3478 63
3479 67
3480 3B
3481 00
3482 00
3483 00
3484 ENDCHAR
3485 STARTCHAR aring
3486 ENCODING 229
3487 SWIDTH 411 0
3488 DWIDTH 8 0
3489 BBX 8 14 0 -3
3490 BITMAP
3491 00
3492 1C
3493 36
3494 1C
3495 3E
3496 03
3497 3F
3498 63
3499 63
3500 67
3501 3B
3502 00
3503 00
3504 00
3505 ENDCHAR
3506 STARTCHAR ae
3507 ENCODING 230
3508 SWIDTH 411 0
3509 DWIDTH 8 0
3510 BBX 8 14 0 -3
3511 BITMAP
3512 00
3513 00
3514 00
3515 00
3516 7E
3517 1B
3518 7B
3519 DF
3520 D8
3521 D8
3522 7E
3523 00
3524 00
3525 00
3526 ENDCHAR
3527 STARTCHAR ccedilla
3528 ENCODING 231
3529 SWIDTH 411 0
3530 DWIDTH 8 0
3531 BBX 8 14 0 -3
3532 BITMAP
3533 00
3534 00
3535 00
3536 00
3537 3E
3538 63
3539 60
3540 60
3541 60
3542 63
3543 3E
3544 18
3545 30
3546 00
3547 ENDCHAR
3548 STARTCHAR egrave
3549 ENCODING 232
3550 SWIDTH 411 0
3551 DWIDTH 8 0
3552 BBX 8 14 0 -3
3553 BITMAP
3554 00
3555 18
3556 0C
3557 00
3558 3E
3559 63
3560 63
3561 7F
3562 60
3563 60
3564 3F
3565 00
3566 00
3567 00
3568 ENDCHAR
3569 STARTCHAR eacute
3570 ENCODING 233
3571 SWIDTH 411 0
3572 DWIDTH 8 0
3573 BBX 8 14 0 -3
3574 BITMAP
3575 00
3576 0C
3577 18
3578 00
3579 3E
3580 63
3581 63
3582 7F
3583 60
3584 60
3585 3F
3586 00
3587 00
3588 00
3589 ENDCHAR
3590 STARTCHAR ecircumflex
3591 ENCODING 234
3592 SWIDTH 411 0
3593 DWIDTH 8 0
3594 BBX 8 14 0 -3
3595 BITMAP
3596 00
3597 1C
3598 36
3599 00
3600 3E
3601 63
3602 63
3603 7F
3604 60
3605 60
3606 3F
3607 00
3608 00
3609 00
3610 ENDCHAR
3611 STARTCHAR edieresis
3612 ENCODING 235
3613 SWIDTH 411 0
3614 DWIDTH 8 0
3615 BBX 8 14 0 -3
3616 BITMAP
3617 00
3618 36
3619 36
3620 00
3621 3E
3622 63
3623 63
3624 7F
3625 60
3626 60
3627 3F
3628 00
3629 00
3630 00
3631 ENDCHAR
3632 STARTCHAR igrave
3633 ENCODING 236
3634 SWIDTH 411 0
3635 DWIDTH 8 0
3636 BBX 8 14 0 -3
3637 BITMAP
3638 00
3639 30
3640 18
3641 00
3642 78
3643 18
3644 18
3645 18
3646 18
3647 18
3648 1E
3649 00
3650 00
3651 00
3652 ENDCHAR
3653 STARTCHAR iacute
3654 ENCODING 237
3655 SWIDTH 411 0
3656 DWIDTH 8 0
3657 BBX 8 14 0 -3
3658 BITMAP
3659 00
3660 0C
3661 18
3662 00
3663 78
3664 18
3665 18
3666 18
3667 18
3668 18
3669 1E
3670 00
3671 00
3672 00
3673 ENDCHAR
3674 STARTCHAR icircumflex
3675 ENCODING 238
3676 SWIDTH 411 0
3677 DWIDTH 8 0
3678 BBX 8 14 0 -3
3679 BITMAP
3680 00
3681 38
3682 6C
3683 00
3684 78
3685 18
3686 18
3687 18
3688 18
3689 18
3690 1E
3691 00
3692 00
3693 00
3694 ENDCHAR
3695 STARTCHAR idieresis
3696 ENCODING 239
3697 SWIDTH 411 0
3698 DWIDTH 8 0
3699 BBX 8 14 0 -3
3700 BITMAP
3701 00
3702 6C
3703 6C
3704 00
3705 78
3706 18
3707 18
3708 18
3709 18
3710 18
3711 1E
3712 00
3713 00
3714 00
3715 ENDCHAR
3716 STARTCHAR eth
3717 ENCODING 240
3718 SWIDTH 411 0
3719 DWIDTH 8 0
3720 BBX 8 14 0 -3
3721 BITMAP
3722 00
3723 3C
3724 18
3725 3C
3726 3E
3727 63
3728 63
3729 63
3730 63
3731 63
3732 3E
3733 00
3734 00
3735 00
3736 ENDCHAR
3737 STARTCHAR ntilde
3738 ENCODING 241
3739 SWIDTH 411 0
3740 DWIDTH 8 0
3741 BBX 8 14 0 -3
3742 BITMAP
3743 00
3744 3B
3745 6E
3746 00
3747 7E
3748 63
3749 63
3750 63
3751 63
3752 63
3753 63
3754 00
3755 00
3756 00
3757 ENDCHAR
3758 STARTCHAR ograve
3759 ENCODING 242
3760 SWIDTH 411 0
3761 DWIDTH 8 0
3762 BBX 8 14 0 -3
3763 BITMAP
3764 00
3765 18
3766 0C
3767 00
3768 3E
3769 63
3770 63
3771 63
3772 63
3773 63
3774 3E
3775 00
3776 00
3777 00
3778 ENDCHAR
3779 STARTCHAR oacute
3780 ENCODING 243
3781 SWIDTH 411 0
3782 DWIDTH 8 0
3783 BBX 8 14 0 -3
3784 BITMAP
3785 00
3786 0C
3787 18
3788 00
3789 3E
3790 63
3791 63
3792 63
3793 63
3794 63
3795 3E
3796 00
3797 00
3798 00
3799 ENDCHAR
3800 STARTCHAR ocircumflex
3801 ENCODING 244
3802 SWIDTH 411 0
3803 DWIDTH 8 0
3804 BBX 8 14 0 -3
3805 BITMAP
3806 00
3807 1C
3808 36
3809 00
3810 3E
3811 63
3812 63
3813 63
3814 63
3815 63
3816 3E
3817 00
3818 00
3819 00
3820 ENDCHAR
3821 STARTCHAR otilde
3822 ENCODING 245
3823 SWIDTH 411 0
3824 DWIDTH 8 0
3825 BBX 8 14 0 -3
3826 BITMAP
3827 00
3828 3B
3829 6E
3830 00
3831 3E
3832 63
3833 63
3834 63
3835 63
3836 63
3837 3E
3838 00
3839 00
3840 00
3841 ENDCHAR
3842 STARTCHAR odieresis
3843 ENCODING 246
3844 SWIDTH 411 0
3845 DWIDTH 8 0
3846 BBX 8 14 0 -3
3847 BITMAP
3848 00
3849 36
3850 36
3851 00
3852 3E
3853 63
3854 63
3855 63
3856 63
3857 63
3858 3E
3859 00
3860 00
3861 00
3862 ENDCHAR
3863 STARTCHAR divide
3864 ENCODING 247
3865 SWIDTH 411 0
3866 DWIDTH 8 0
3867 BBX 8 14 0 -3
3868 BITMAP
3869 00
3870 00
3871 00
3872 00
3873 18
3874 18
3875 00
3876 7E
3877 00
3878 18
3879 18
3880 00
3881 00
3882 00
3883 ENDCHAR
3884 STARTCHAR oslash
3885 ENCODING 248
3886 SWIDTH 411 0
3887 DWIDTH 8 0
3888 BBX 8 14 0 -3
3889 BITMAP
3890 00
3891 00
3892 00
3893 03
3894 3E
3895 67
3896 6F
3897 7B
3898 73
3899 63
3900 FE
3901 00
3902 00
3903 00
3904 ENDCHAR
3905 STARTCHAR ugrave
3906 ENCODING 249
3907 SWIDTH 411 0
3908 DWIDTH 8 0
3909 BBX 8 14 0 -3
3910 BITMAP
3911 00
3912 18
3913 0C
3914 00
3915 63
3916 63
3917 63
3918 63
3919 63
3920 67
3921 3F
3922 00
3923 00
3924 00
3925 ENDCHAR
3926 STARTCHAR uacute
3927 ENCODING 250
3928 SWIDTH 411 0
3929 DWIDTH 8 0
3930 BBX 8 14 0 -3
3931 BITMAP
3932 00
3933 0C
3934 18
3935 00
3936 63
3937 63
3938 63
3939 63
3940 63
3941 67
3942 3F
3943 00
3944 00
3945 00
3946 ENDCHAR
3947 STARTCHAR ucircumflex
3948 ENCODING 251
3949 SWIDTH 411 0
3950 DWIDTH 8 0
3951 BBX 8 14 0 -3
3952 BITMAP
3953 00
3954 1C
3955 36
3956 00
3957 63
3958 63
3959 63
3960 63
3961 63
3962 67
3963 3F
3964 00
3965 00
3966 00
3967 ENDCHAR
3968 STARTCHAR udieresis
3969 ENCODING 252
3970 SWIDTH 411 0
3971 DWIDTH 8 0
3972 BBX 8 14 0 -3
3973 BITMAP
3974 00
3975 36
3976 36
3977 00
3978 63
3979 63
3980 63
3981 63
3982 63
3983 67
3984 3F
3985 00
3986 00
3987 00
3988 ENDCHAR
3989 STARTCHAR yacute
3990 ENCODING 253
3991 SWIDTH 411 0
3992 DWIDTH 8 0
3993 BBX 8 14 0 -3
3994 BITMAP
3995 00
3996 0C
3997 18
3998 00
3999 63
4000 63
4001 63
4002 63
4003 63
4004 67
4005 3F
4006 03
4007 03
4008 3E
4009 ENDCHAR
4010 STARTCHAR thorn
4011 ENCODING 254
4012 SWIDTH 411 0
4013 DWIDTH 8 0
4014 BBX 8 14 0 -3
4015 BITMAP
4016 00
4017 60
4018 60
4019 60
4020 7E
4021 63
4022 63
4023 63
4024 63
4025 63
4026 7E
4027 60
4028 60
4029 00
4030 ENDCHAR
4031 STARTCHAR ydieresis
4032 ENCODING 255
4033 SWIDTH 411 0
4034 DWIDTH 8 0
4035 BBX 8 14 0 -3
4036 BITMAP
4037 00
4038 36
4039 36
4040 00
4041 63
4042 63
4043 63
4044 63
4045 63
4046 67
4047 3F
4048 03
4049 03
4050 3E
4051 ENDCHAR
4052 ENDFONT
internal/site/mark.go
Old New
@@ -0,0 +1,158 @@
1 // mark.go composes eitri's mark — "[E]" — from a font's own glyphs and emits
2 // it as SVG twice: padded into a square box for the browser tab, and tight to
3 // its ink for inline use in the page nav. One grid feeds both, and the same
4 // grid draws the link-preview card, so the mark cannot drift between them.
5
6 package site
7
8 import (
9 "fmt"
10 "strings"
11 )
12
13 // markRunes spell the mark. markKern overrides the font's own advance: at
14 // tab size the natural spacing leaves the brackets adrift from the E.
15 const (
16 markRunes = "[E]"
17 markKern = 1
18
19 // faviconBox is the tab icon's edge in grid units — 16, the size the
20 // icon is drawn at, so every unit is exactly one device pixel.
21 faviconBox = 16
22 )
23
24 // Mark colours: ink on light, and its inverse where the reader's browser
25 // asks for dark. The page follows the same pair.
26 const (
27 inkLight = "#1a1a1a"
28 inkDark = "#ececec"
29 )
30
31 // markBitmap composes the mark: each glyph trimmed to its ink, kept on the
32 // font's baseline, joined by markKern blank columns.
33 func markBitmap(f *bdfFont) ([][]bool, error) {
34 type placed struct {
35 pix [][]bool
36 top, bottom int // rows above the baseline of the ink's edges
37 }
38 var glyphs []placed
39 for _, r := range markRunes {
40 g, ok := f.glyphs[r]
41 if !ok {
42 return nil, fmt.Errorf("font %q has no glyph for %q", f.name, r)
43 }
44 pix, last := trimInk(g.pix)
45 if pix == nil {
46 return nil, fmt.Errorf("font %q draws %q blank", f.name, r)
47 }
48 // The ink box's bottom row sits at yoff; trimming blank rows off the
49 // bottom lifts that edge by however many were dropped.
50 bottom := g.yoff + (g.h - 1 - last)
51 glyphs = append(glyphs, placed{pix: pix, top: bottom + len(pix) - 1, bottom: bottom})
52 }
53 top, bottom := glyphs[0].top, glyphs[0].bottom
54 for _, g := range glyphs[1:] {
55 if g.top > top {
56 top = g.top
57 }
58 if g.bottom < bottom {
59 bottom = g.bottom
60 }
61 }
62 height := top - bottom + 1
63 out := make([][]bool, height)
64 for i, g := range glyphs {
65 if i > 0 {
66 for y := range out {
67 out[y] = append(out[y], make([]bool, markKern)...)
68 }
69 }
70 w := len(g.pix[0])
71 lead := top - g.top // blank rows above this glyph's ink
72 for y := 0; y < height; y++ {
73 row := y - lead
74 if row >= 0 && row < len(g.pix) {
75 out[y] = append(out[y], g.pix[row]...)
76 } else {
77 out[y] = append(out[y], make([]bool, w)...)
78 }
79 }
80 }
81 return out, nil
82 }
83
84 // trimInk drops blank rows and columns, returning the ink and the index of
85 // the last inked row of the input (nil if the glyph is blank).
86 func trimInk(pix [][]bool) (ink [][]bool, last int) {
87 first, last := -1, -1
88 left, right := -1, -1
89 for y, row := range pix {
90 for x, on := range row {
91 if !on {
92 continue
93 }
94 if first < 0 {
95 first = y
96 }
97 last = y
98 if left < 0 || x < left {
99 left = x
100 }
101 if x > right {
102 right = x
103 }
104 }
105 }
106 if first < 0 {
107 return nil, -1
108 }
109 ink = make([][]bool, 0, last-first+1)
110 for _, row := range pix[first : last+1] {
111 ink = append(ink, row[left:right+1])
112 }
113 return ink, last
114 }
115
116 // bitmapRuns collapses ink into horizontal runs — one SVG rect or one filled
117 // rectangle each, instead of one per pixel.
118 func bitmapRuns(pix [][]bool) []textRun {
119 var out []textRun
120 for y, row := range pix {
121 for x := 0; x < len(row); {
122 if !row[x] {
123 x++
124 continue
125 }
126 k := x
127 for k < len(row) && row[k] {
128 k++
129 }
130 out = append(out, textRun{X: x, Y: y, W: k - x})
131 x = k
132 }
133 }
134 return out
135 }
136
137 // faviconSVG centres the mark in a square box of box units. The box is the
138 // icon's pixel size, so one grid unit renders as one device pixel and the
139 // bitmap stays crisp instead of being scaled onto half-pixels.
140 func faviconSVG(pix [][]bool, box int) (string, error) {
141 h, w := len(pix), len(pix[0])
142 if w > box || h > box {
143 return "", fmt.Errorf("mark is %dx%d, does not fit a %d box", w, h, box)
144 }
145 ox, oy := (box-w)/2, (box-h)/2
146 var b strings.Builder
147 fmt.Fprintf(&b, `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 %d %d" shape-rendering="crispEdges">`+"\n", box, box)
148 fmt.Fprintf(&b, " <style>\n rect { fill: %s; }\n @media (prefers-color-scheme: dark) { rect { fill: %s; } }\n </style>\n", inkLight, inkDark)
149 writeRects(&b, bitmapRuns(pix), ox, oy)
150 b.WriteString("</svg>\n")
151 return b.String(), nil
152 }
153
154 func writeRects(b *strings.Builder, runs []textRun, ox, oy int) {
155 for _, r := range runs {
156 fmt.Fprintf(b, ` <rect x="%d" y="%d" width="%d" height="1"/>`+"\n", ox+r.X, oy+r.Y, r.W)
157 }
158 }
internal/site/mark_test.go
Old New
@@ -0,0 +1,109 @@
1 package site
2
3 import (
4 "strings"
5 "testing"
6 )
7
8 func TestMarkBitmapFromGohu11(t *testing.T) {
9 f, err := parseBDF(gohu11)
10 if err != nil {
11 t.Fatal(err)
12 }
13 pix, err := markBitmap(f)
14 if err != nil {
15 t.Fatal(err)
16 }
17 want := strings.Join([]string{
18 "###.#####.###",
19 "#...#.......#",
20 "#...#.......#",
21 "#...####....#",
22 "#...#.......#",
23 "#...#.......#",
24 "#...#.......#",
25 "#...#####...#",
26 "###.......###",
27 "",
28 }, "\n")
29 if got := bitmapString(pix); got != want {
30 t.Errorf("mark:\ngot:\n%swant:\n%s", got, want)
31 }
32 }
33
34 func TestMarkBitmapFromGohu14b(t *testing.T) {
35 f, err := parseBDF(gohu14b)
36 if err != nil {
37 t.Fatal(err)
38 }
39 pix, err := markBitmap(f)
40 if err != nil {
41 t.Fatal(err)
42 }
43 want := strings.Join([]string{
44 "####.........####",
45 "##...#######...##",
46 "##...##........##",
47 "##...##........##",
48 "##...##........##",
49 "##...#####.....##",
50 "##...##........##",
51 "##...##........##",
52 "##...##........##",
53 "##...#######...##",
54 "####.........####",
55 "",
56 }, "\n")
57 if got := bitmapString(pix); got != want {
58 t.Errorf("mark:\ngot:\n%swant:\n%s", got, want)
59 }
60 }
61
62 // The tab icon must land on whole device pixels at 16px, so its box is
63 // exactly 16 units — a 15-unit box would scale to 16 and blur.
64 func TestFaviconSVGBoxIsPixelExact(t *testing.T) {
65 f, err := parseBDF(gohu11)
66 if err != nil {
67 t.Fatal(err)
68 }
69 pix, err := markBitmap(f)
70 if err != nil {
71 t.Fatal(err)
72 }
73 svg, err := faviconSVG(pix, 16)
74 if err != nil {
75 t.Fatal(err)
76 }
77 for _, want := range []string{
78 `viewBox="0 0 16 16"`,
79 `shape-rendering="crispEdges"`,
80 "prefers-color-scheme: dark",
81 "#1a1a1a",
82 "#ececec",
83 } {
84 if !strings.Contains(svg, want) {
85 t.Errorf("favicon missing %q:\n%s", want, svg)
86 }
87 }
88 if n := strings.Count(svg, "<rect"); n != len(bitmapRuns(pix)) {
89 t.Errorf("favicon has %d rects, want one per ink run (%d)", n, len(bitmapRuns(pix)))
90 }
91 // Centred: 13x9 ink in a 16 box leaves one blank column at the left.
92 if !strings.Contains(svg, `x="1" y="3"`) {
93 t.Errorf("mark not centred in the box:\n%s", svg)
94 }
95 }
96
97 func TestFaviconSVGRejectsTooSmallABox(t *testing.T) {
98 f, err := parseBDF(gohu14b)
99 if err != nil {
100 t.Fatal(err)
101 }
102 pix, err := markBitmap(f)
103 if err != nil {
104 t.Fatal(err)
105 }
106 if _, err := faviconSVG(pix, 16); err == nil {
107 t.Error("want an error: the 17-wide bold mark does not fit a 16 box")
108 }
109 }
internal/site/og.go
Old New
@@ -0,0 +1,153 @@
1 // og.go draws the link-preview card — the image a chat client or a timeline
2 // shows when someone pastes an eitri.sh link. It is drawn from the same
3 // GohuFont pixels as the mark, at build time, so a card can never disagree
4 // with the site it came from.
5
6 package site
7
8 import (
9 "bytes"
10 "fmt"
11 "image"
12 "image/color"
13 "image/png"
14 )
15
16 // Card geometry, in image pixels. 1200x630 is what every scraper crops to.
17 const (
18 cardW, cardH = 1200, 630
19 cardInset = 110 // left edge of the block
20 cardRuleW = 260
21 cardRuleH = 4
22
23 // Scale factors: how many image pixels one font pixel becomes.
24 scaleMark = 12
25 scaleWordmark = 6
26 scaleTagline = 3
27 scaleLabel = 4
28 )
29
30 // The card's fixed copy. The label under the rule is the page's own.
31 const (
32 cardWordmark = "eitri.sh"
33 cardTagline = "the cloud you already own"
34 )
35
36 // Palette indices: a three-colour card encodes to a few KB.
37 const (
38 cardBG = iota
39 cardFG
40 cardDim
41 )
42
43 var cardPalette = color.Palette{
44 mustParseHex(inkLight), // background: the ink colour, inverted card
45 mustParseHex(inkDark), // foreground
46 color.RGBA{0x8a, 0x8a, 0x8a, 0xff},
47 }
48
49 func mustParseHex(s string) color.RGBA {
50 var r, g, b uint8
51 if _, err := fmt.Sscanf(s, "#%02x%02x%02x", &r, &g, &b); err != nil {
52 panic("site: bad colour " + s)
53 }
54 return color.RGBA{r, g, b, 0xff}
55 }
56
57 // renderCard draws the card for one page. label names the page under the
58 // rule; empty leaves the block at mark, wordmark and tagline — the landing
59 // page needs no label, it is the site.
60 func renderCard(label string) ([]byte, error) {
61 font, err := parseBDF(gohu14b)
62 if err != nil {
63 return nil, err
64 }
65 mark, err := markBitmap(font)
66 if err != nil {
67 return nil, err
68 }
69
70 // Lay the block out first so it can be centred as a whole.
71 type row struct {
72 gap int // space above this row
73 h int
74 draw func(img *image.Paletted, y int) error
75 }
76 line := func(gap int, s string, scale, ink int) row {
77 return row{gap: gap, h: font.lineHeight() * scale, draw: func(img *image.Paletted, y int) error {
78 runs, err := font.runs(s)
79 if err != nil {
80 return err
81 }
82 w, err := font.width(s)
83 if err != nil {
84 return err
85 }
86 // Text that overruns the card would be cropped by the scraper,
87 // silently: fail the build instead.
88 if room := cardW - 2*cardInset; w*scale > room {
89 return fmt.Errorf("%q is %dpx wide at scale %d, past the %dpx the card leaves", s, w*scale, scale, room)
90 }
91 drawRuns(img, runs, cardInset, y, scale, uint8(ink))
92 return nil
93 }}
94 }
95 rows := []row{
96 {h: len(mark) * scaleMark, draw: func(img *image.Paletted, y int) error {
97 drawRuns(img, bitmapRuns(mark), cardInset, y, scaleMark, cardFG)
98 return nil
99 }},
100 line(44, cardWordmark, scaleWordmark, cardFG),
101 line(20, cardTagline, scaleTagline, cardDim),
102 }
103 if label != "" {
104 rows = append(rows,
105 row{gap: 44, h: cardRuleH, draw: func(img *image.Paletted, y int) error {
106 fillRect(img, cardInset, y, cardRuleW, cardRuleH, cardDim)
107 return nil
108 }},
109 line(28, label, scaleLabel, cardFG))
110 }
111
112 total := 0
113 for _, r := range rows {
114 total += r.gap + r.h
115 }
116 if total > cardH {
117 return nil, fmt.Errorf("card block is %dpx tall, taller than the %dpx card", total, cardH)
118 }
119
120 img := image.NewPaletted(image.Rect(0, 0, cardW, cardH), cardPalette)
121 y := (cardH - total) / 2
122 for _, r := range rows {
123 y += r.gap
124 if err := r.draw(img, y); err != nil {
125 return nil, err
126 }
127 y += r.h
128 }
129
130 var buf bytes.Buffer
131 if err := png.Encode(&buf, img); err != nil {
132 return nil, err
133 }
134 return buf.Bytes(), nil
135 }
136
137 // drawRuns paints font-pixel runs at scale, with the run's own origin taken
138 // as (ox, oy) in image pixels.
139 func drawRuns(img *image.Paletted, runs []textRun, ox, oy, scale int, ink uint8) {
140 for _, r := range runs {
141 fillRect(img, ox+r.X*scale, oy+r.Y*scale, r.W*scale, scale, ink)
142 }
143 }
144
145 func fillRect(img *image.Paletted, x, y, w, h int, ink uint8) {
146 for row := y; row < y+h; row++ {
147 for col := x; col < x+w; col++ {
148 if (image.Point{col, row}).In(img.Rect) {
149 img.SetColorIndex(col, row, ink)
150 }
151 }
152 }
153 }
internal/site/og_test.go
Old New
@@ -0,0 +1,104 @@
1 package site
2
3 import (
4 "bytes"
5 "image"
6 "image/png"
7 "strings"
8 "testing"
9 )
10
11 func decodeCard(t *testing.T, label string) image.Image {
12 t.Helper()
13 raw, err := renderCard(label)
14 if err != nil {
15 t.Fatal(err)
16 }
17 img, format, err := image.Decode(bytes.NewReader(raw))
18 if err != nil {
19 t.Fatal(err)
20 }
21 if format != "png" {
22 t.Fatalf("format = %q, want png", format)
23 }
24 return img
25 }
26
27 // Every scraper crops to 1200x630; a card of any other size gets letterboxed.
28 func TestRenderCardIsTheScraperSize(t *testing.T) {
29 got := decodeCard(t, "quickstart").Bounds()
30 if want := image.Rect(0, 0, 1200, 630); got != want {
31 t.Errorf("bounds = %v, want %v", got, want)
32 }
33 }
34
35 func TestRenderCardDrawsInkOnTheBackground(t *testing.T) {
36 img := decodeCard(t, "quickstart")
37 bg := cardPalette[cardBG]
38 if got := img.At(0, 0); got != bg {
39 t.Errorf("corner = %v, want the background %v", got, bg)
40 }
41 var ink int
42 b := img.Bounds()
43 for y := b.Min.Y; y < b.Max.Y; y++ {
44 for x := b.Min.X; x < b.Max.X; x++ {
45 if img.At(x, y) != bg {
46 ink++
47 }
48 }
49 }
50 // The block is mark plus three lines of text: tens of thousands of
51 // pixels. A near-empty card means the font or the layout went missing.
52 if ink < 20000 {
53 t.Errorf("card carries %d ink pixels, want a drawn block", ink)
54 }
55 }
56
57 // The card is per-page, so the label has to reach the image.
58 func TestRenderCardLabelChangesTheImage(t *testing.T) {
59 quickstart, err := renderCard("quickstart")
60 if err != nil {
61 t.Fatal(err)
62 }
63 faq, err := renderCard("faq")
64 if err != nil {
65 t.Fatal(err)
66 }
67 if bytes.Equal(quickstart, faq) {
68 t.Error("two labels produced the same card")
69 }
70 home, err := renderCard("")
71 if err != nil {
72 t.Fatal(err)
73 }
74 if bytes.Equal(home, quickstart) {
75 t.Error("the unlabelled card matches a labelled one")
76 }
77 }
78
79 // A label wider than the card would be cropped by whoever renders it.
80 func TestRenderCardRejectsAnOverlongLabel(t *testing.T) {
81 if _, err := renderCard(strings.Repeat("long ", 12)); err == nil {
82 t.Error("want an error: the label does not fit the card")
83 }
84 }
85
86 func TestRenderCardRejectsUndrawableLabel(t *testing.T) {
87 if _, err := renderCard("日本語"); err == nil {
88 t.Error("want an error: the font has no glyph for these runes")
89 }
90 }
91
92 // A paletted three-colour card should stay small enough to inline anywhere.
93 func TestRenderCardStaysSmall(t *testing.T) {
94 raw, err := renderCard("credential revocation")
95 if err != nil {
96 t.Fatal(err)
97 }
98 if len(raw) > 40_000 {
99 t.Errorf("card is %d bytes, want under 40KB", len(raw))
100 }
101 if _, err := png.Decode(bytes.NewReader(raw)); err != nil {
102 t.Fatal(err)
103 }
104 }
internal/site/render.go
Old New
@@ -81,3 +81,62 @@ func render(src []byte, targets map[string]string) ([]byte, error) {
81 } 81 }
82 return buf.Bytes(), nil 82 return buf.Bytes(), nil
83 } 83 }
84
85 // summaryLimit is how many runes of a page summary survive: enough for the
86 // crawlers that show ~160 characters, short enough that none of them cut a
87 // word off mid-preview.
88 const summaryLimit = 180
89
90 // summary is a page's own opening paragraph, flattened to plain text: the
91 // description a search result or a link preview shows. Headings, lists and
92 // code blocks are skipped — a page describes itself in prose or not at all.
93 func summary(src []byte) string {
94 doc := goldmark.New(goldmark.WithExtensions(extension.GFM)).Parser().Parse(text.NewReader(src))
95 var para *ast.Paragraph
96 for n := doc.FirstChild(); n != nil; n = n.NextSibling() {
97 if p, ok := n.(*ast.Paragraph); ok {
98 para = p
99 break
100 }
101 }
102 if para == nil {
103 return ""
104 }
105 var b strings.Builder
106 _ = ast.Walk(para, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
107 if !entering {
108 return ast.WalkContinue, nil
109 }
110 switch v := n.(type) {
111 case *ast.Text:
112 b.Write(v.Segment.Value(src))
113 if v.SoftLineBreak() || v.HardLineBreak() {
114 b.WriteByte(' ')
115 }
116 case *ast.CodeSpan, *ast.RawHTML:
117 // Rendered inline: take the words, drop the markup.
118 for c := v.FirstChild(); c != nil; c = c.NextSibling() {
119 if t, ok := c.(*ast.Text); ok {
120 b.Write(t.Segment.Value(src))
121 }
122 }
123 return ast.WalkSkipChildren, nil
124 }
125 return ast.WalkContinue, nil
126 })
127 return clamp(strings.Join(strings.Fields(b.String()), " "), summaryLimit)
128 }
129
130 // clamp cuts s to at most limit runes, at the last word boundary, marking the
131 // cut with an ellipsis.
132 func clamp(s string, limit int) string {
133 r := []rune(s)
134 if len(r) <= limit {
135 return s
136 }
137 cut := string(r[:limit])
138 if i := strings.LastIndexByte(cut, ' '); i > 0 {
139 cut = cut[:i]
140 }
141 return strings.TrimRight(cut, " ,;:.") + "…"
142 }
internal/site/render_test.go
Old New
@@ -95,3 +95,46 @@ func TestRenderRewritesImageDestinations(t *testing.T) {
95 t.Errorf("image destination not rewritten:\n%s", got) 95 t.Errorf("image destination not rewritten:\n%s", got)
96 } 96 }
97 } 97 }
98
99 func TestSummaryTakesTheOpeningParagraph(t *testing.T) {
100 md := "# quickstart\n\nZero to a first VM on one host, then a second.\n\nA later paragraph.\n"
101 if got, want := summary([]byte(md)), "Zero to a first VM on one host, then a second."; got != want {
102 t.Errorf("summary = %q, want %q", got, want)
103 }
104 }
105
106 func TestSummaryStripsMarkupAndJoinsLines(t *testing.T) {
107 md := "# t\n\n*The ease* of a [cloud provider](https://x),\nbacked by `what` you own\n"
108 if got, want := summary([]byte(md)), "The ease of a cloud provider, backed by what you own"; got != want {
109 t.Errorf("summary = %q, want %q", got, want)
110 }
111 }
112
113 func TestSummarySkipsNonProseOpeners(t *testing.T) {
114 md := "# t\n\n- a list item\n\n```\ncode\n```\n\nThe real opening line.\n"
115 if got, want := summary([]byte(md)), "The real opening line."; got != want {
116 t.Errorf("summary = %q, want %q", got, want)
117 }
118 }
119
120 // A description longer than the crawlers show is cut at a word boundary, so
121 // no preview ends mid-word.
122 func TestSummaryClampsAtAWordBoundary(t *testing.T) {
123 long := strings.Repeat("alpha bravo charlie delta echo ", 20)
124 got := summary([]byte("# t\n\n" + long))
125 if len([]rune(got)) > summaryLimit+1 {
126 t.Errorf("summary is %d runes, want at most %d plus an ellipsis", len([]rune(got)), summaryLimit)
127 }
128 if !strings.HasSuffix(got, "…") {
129 t.Errorf("clamped summary should end in an ellipsis: %q", got)
130 }
131 if strings.Contains(got, " ") || strings.HasSuffix(strings.TrimSuffix(got, "…"), " ") {
132 t.Errorf("clamped summary has ragged whitespace: %q", got)
133 }
134 }
135
136 func TestSummaryOfProselessDocIsEmpty(t *testing.T) {
137 if got := summary([]byte("# just a heading\n")); got != "" {
138 t.Errorf("summary = %q, want empty", got)
139 }
140 }
internal/site/site.go
Old New
@@ -5,6 +5,7 @@ import (
5 "html/template" 5 "html/template"
6 "os" 6 "os"
7 "path/filepath" 7 "path/filepath"
8 "strings"
8 ) 9 )
9 10
10 // pages is the published doc set: how-to material for people running or using 11 // pages is the published doc set: how-to material for people running or using
@@ -29,12 +30,26 @@ type Config struct {
29 SiteDir string // site/ — index.md, docs.md, template.html, style.css 30 SiteDir string // site/ — index.md, docs.md, template.html, style.css
30 DistDir string // optional dist/<version> with release artifacts; "" renders a docs-only preview 31 DistDir string // optional dist/<version> with release artifacts; "" renders a docs-only preview
31 OutDir string // webroot to emit 32 OutDir string // webroot to emit
33 BaseURL string // where the site is served from; "" leaves preview links relative
34 }
35
36 // abs makes a site path absolute against BaseURL. Link-preview scrapers do
37 // not resolve relative og:image or og:url against the page they fetched, so
38 // a published site must name itself.
39 func (cfg Config) abs(path string) string {
40 if cfg.BaseURL == "" {
41 return path
42 }
43 return strings.TrimSuffix(cfg.BaseURL, "/") + path
32 } 44 }
33 45
34 type pageData struct { 46 type pageData struct {
35 Title string 47 Title string
36 Section string // "home" | "docs" | "dl" — which nav entry is active 48 Section string // "home" | "docs" | "dl" — which nav entry is active
37 Content template.HTML 49 Content template.HTML
50 Description string // the page's own summary, for search and link previews
51 URL string // canonical location
52 Image string // the link-preview card drawn for this page
38 } 53 }
39 54
40 // Build renders the whole site into cfg.OutDir. 55 // Build renders the whole site into cfg.OutDir.
@@ -64,52 +79,94 @@ func Build(cfg Config) error {
64 } 79 }
65 return f.Close() 80 return f.Close()
66 } 81 }
67 renderFile := func(src string) (template.HTML, error) { 82 // renderFile returns a page's HTML and the summary drawn from its own
83 // opening paragraph — one source of truth for what the page is about.
84 renderFile := func(src string) (template.HTML, string, error) {
68 b, err := os.ReadFile(src) 85 b, err := os.ReadFile(src)
69 if err != nil { 86 if err != nil {
70 return "", err 87 return "", "", err
71 } 88 }
72 h, err := render(b, targets) 89 h, err := render(b, targets)
73 if err != nil { 90 if err != nil {
74 return "", fmt.Errorf("%s: %w", src, err) 91 return "", "", fmt.Errorf("%s: %w", src, err)
92 }
93 return template.HTML(h), summary(b), nil
94 }
95
96 // preview draws the page's link-preview card and returns the canonical
97 // URL and image to advertise. label names the page on the card; empty
98 // leaves the landing page unlabelled.
99 preview := func(name, sitePath, label string) (url, image string, err error) {
100 raw, err := renderCard(label)
101 if err != nil {
102 return "", "", fmt.Errorf("card %q: %w", name, err)
103 }
104 dir := filepath.Join(cfg.OutDir, "og")
105 if err := os.MkdirAll(dir, 0o755); err != nil {
106 return "", "", err
107 }
108 if err := os.WriteFile(filepath.Join(dir, name+".png"), raw, 0o644); err != nil {
109 return "", "", err
75 } 110 }
76 return template.HTML(h), nil 111 return cfg.abs(sitePath), cfg.abs("/og/" + name + ".png"), nil
77 } 112 }
78 113
79 // Landing. 114 // Landing.
80 content, err := renderFile(filepath.Join(cfg.SiteDir, "index.md")) 115 content, desc, err := renderFile(filepath.Join(cfg.SiteDir, "index.md"))
81 if err != nil { 116 if err != nil {
82 return err 117 return err
83 } 118 }
84 if err := page(filepath.Join(cfg.OutDir, "index.html"), 119 url, image, err := preview("home", "/", "")
85 pageData{Title: "eitri", Section: "home", Content: content}); err != nil { 120 if err != nil {
121 return err
122 }
123 if err := page(filepath.Join(cfg.OutDir, "index.html"), pageData{
124 Title: "eitri", Section: "home", Content: content,
125 Description: desc, URL: url, Image: image,
126 }); err != nil {
86 return err 127 return err
87 } 128 }
88 129
89 // Docs index (site-owned: the published set is a curated subset of docs/, 130 // Docs index (site-owned: the published set is a curated subset of docs/,
90 // so the repo's own docs/README.md would dangle links here) + one page per 131 // so the repo's own docs/README.md would dangle links here) + one page per
91 // published doc + the roadmap. 132 // published doc + the roadmap.
92 if content, err = renderFile(filepath.Join(cfg.SiteDir, "docs.md")); err != nil { 133 if content, desc, err = renderFile(filepath.Join(cfg.SiteDir, "docs.md")); err != nil {
134 return err
135 }
136 if url, image, err = preview("docs", "/docs/", "docs"); err != nil {
93 return err 137 return err
94 } 138 }
95 if err := page(filepath.Join(cfg.OutDir, "docs", "index.html"), 139 if err := page(filepath.Join(cfg.OutDir, "docs", "index.html"), pageData{
96 pageData{Title: "eitri – docs", Section: "docs", Content: content}); err != nil { 140 Title: "eitri – docs", Section: "docs", Content: content,
141 Description: desc, URL: url, Image: image,
142 }); err != nil {
97 return err 143 return err
98 } 144 }
99 for _, slug := range pages { 145 for _, slug := range pages {
100 if content, err = renderFile(filepath.Join(cfg.DocsDir, slug+".md")); err != nil { 146 if content, desc, err = renderFile(filepath.Join(cfg.DocsDir, slug+".md")); err != nil {
147 return err
148 }
149 label := strings.ReplaceAll(slug, "-", " ")
150 if url, image, err = preview(slug, "/docs/"+slug+"/", label); err != nil {
101 return err 151 return err
102 } 152 }
103 if err := page(filepath.Join(cfg.OutDir, "docs", slug, "index.html"), 153 if err := page(filepath.Join(cfg.OutDir, "docs", slug, "index.html"), pageData{
104 pageData{Title: "eitri – " + slug, Section: "docs", Content: content}); err != nil { 154 Title: "eitri – " + slug, Section: "docs", Content: content,
155 Description: desc, URL: url, Image: image,
156 }); err != nil {
105 return err 157 return err
106 } 158 }
107 } 159 }
108 if content, err = renderFile(filepath.Join(cfg.DocsDir, "..", "ROADMAP.md")); err != nil { 160 if content, desc, err = renderFile(filepath.Join(cfg.DocsDir, "..", "ROADMAP.md")); err != nil {
109 return err 161 return err
110 } 162 }
111 if err := page(filepath.Join(cfg.OutDir, "docs", "roadmap", "index.html"), 163 if url, image, err = preview("roadmap", "/docs/roadmap/", "roadmap"); err != nil {
112 pageData{Title: "eitri – roadmap", Section: "docs", Content: content}); err != nil { 164 return err
165 }
166 if err := page(filepath.Join(cfg.OutDir, "docs", "roadmap", "index.html"), pageData{
167 Title: "eitri – roadmap", Section: "docs", Content: content,
168 Description: desc, URL: url, Image: image,
169 }); err != nil {
113 return err 170 return err
114 } 171 }
115 172
@@ -122,8 +179,13 @@ func Build(cfg Config) error {
122 if err != nil { 179 if err != nil {
123 return err 180 return err
124 } 181 }
125 if err := page(filepath.Join(cfg.OutDir, "dl", "index.html"), 182 if url, image, err = preview("dl", "/dl/", "downloads"); err != nil {
126 pageData{Title: "eitri – downloads", Section: "dl", Content: template.HTML(h)}); err != nil { 183 return err
184 }
185 if err := page(filepath.Join(cfg.OutDir, "dl", "index.html"), pageData{
186 Title: "eitri – downloads", Section: "dl", Content: template.HTML(h),
187 Description: summary([]byte(dlMD)), URL: url, Image: image,
188 }); err != nil {
127 return err 189 return err
128 } 190 }
129 191
@@ -140,17 +202,30 @@ func Build(cfg Config) error {
140 return err 202 return err
141 } 203 }
142 204
143 // The one stylesheet, and the favicon every page's template links. 205 // The one stylesheet.
144 for _, name := range []string{"style.css", "favicon.svg"} { 206 css, err := os.ReadFile(filepath.Join(cfg.SiteDir, "style.css"))
145 b, err := os.ReadFile(filepath.Join(cfg.SiteDir, name)) 207 if err != nil {
146 if err != nil { 208 return err
147 return err 209 }
148 } 210 if err := os.WriteFile(filepath.Join(cfg.OutDir, "style.css"), css, 0o644); err != nil {
149 if err := os.WriteFile(filepath.Join(cfg.OutDir, name), b, 0o644); err != nil { 211 return err
150 return err 212 }
151 } 213
214 // The tab icon, drawn from the font rather than kept as a source file so
215 // it cannot drift from the mark on the page.
216 iconFont, err := parseBDF(gohu11)
217 if err != nil {
218 return err
219 }
220 iconMark, err := markBitmap(iconFont)
221 if err != nil {
222 return err
223 }
224 icon, err := faviconSVG(iconMark, faviconBox)
225 if err != nil {
226 return err
152 } 227 }
153 return nil 228 return os.WriteFile(filepath.Join(cfg.OutDir, "favicon.svg"), []byte(icon), 0o644)
154 } 229 }
155 230
156 // linkTargets maps markdown link destinations (as written in the sources) to 231 // linkTargets maps markdown link destinations (as written in the sources) to
internal/site/site_test.go
Old New
@@ -1,6 +1,8 @@
1 package site 1 package site
2 2
3 import ( 3 import (
4 "image"
5 _ "image/png"
4 "os" 6 "os"
5 "path/filepath" 7 "path/filepath"
6 "strings" 8 "strings"
@@ -38,18 +40,27 @@ func writeFixture(t *testing.T) (string, string, string) {
38 write(filepath.Join(siteDir, "docs.md"), 40 write(filepath.Join(siteDir, "docs.md"),
39 "# docs\n\n- [q](quickstart.md)\n- [r](../ROADMAP.md)\n") 41 "# docs\n\n- [q](quickstart.md)\n- [r](../ROADMAP.md)\n")
40 write(filepath.Join(siteDir, "template.html"), 42 write(filepath.Join(siteDir, "template.html"),
41 `<title>{{.Title}}</title><nav data-s="{{.Section}}"></nav>{{.Content}}`) 43 `<title>{{.Title}}</title><meta name="description" content="{{.Description}}">`+
44 `<meta property="og:url" content="{{.URL}}"><meta property="og:image" content="{{.Image}}">`+
45 `<nav data-s="{{.Section}}"></nav>{{.Content}}`)
42 write(filepath.Join(siteDir, "style.css"), "body{}") 46 write(filepath.Join(siteDir, "style.css"), "body{}")
43 write(filepath.Join(siteDir, "favicon.svg"), "<svg/>")
44 return root, docs, siteDir 47 return root, docs, siteDir
45 } 48 }
46 49
47 // buildTree runs Build over the fixture and returns the output dir. 50 // buildTree runs Build over the fixture and returns the output dir.
48 func buildTree(t *testing.T, distDir string) string { 51 func buildTree(t *testing.T, distDir string) string {
52 return buildTreeAt(t, distDir, testBase)
53 }
54
55 // testBase stands in for the published site's own address.
56 const testBase = "https://eitri.test"
57
58 func buildTreeAt(t *testing.T, distDir, base string) string {
49 t.Helper() 59 t.Helper()
50 root, docs, siteDir := writeFixture(t) 60 root, docs, siteDir := writeFixture(t)
51 out := filepath.Join(root, "out") 61 out := filepath.Join(root, "out")
52 if err := Build(Config{DocsDir: docs, SiteDir: siteDir, DistDir: distDir, OutDir: out}); err != nil { 62 cfg := Config{DocsDir: docs, SiteDir: siteDir, DistDir: distDir, OutDir: out, BaseURL: base}
63 if err := Build(cfg); err != nil {
53 t.Fatal(err) 64 t.Fatal(err)
54 } 65 }
55 return out 66 return out
@@ -158,3 +169,78 @@ func TestBuildFailsOnMissingPublishedDoc(t *testing.T) {
158 t.Fatal("want failure when a published doc is missing") 169 t.Fatal("want failure when a published doc is missing")
159 } 170 }
160 } 171 }
172
173 // The tab icon is generated from the font, not copied from site/: there is no
174 // favicon source file to fall out of step with the mark on the page.
175 func TestBuildGeneratesTheFavicon(t *testing.T) {
176 out := buildTree(t, "")
177 icon := read(t, filepath.Join(out, "favicon.svg"))
178 for _, want := range []string{`viewBox="0 0 16 16"`, "<rect", "prefers-color-scheme: dark"} {
179 if !strings.Contains(icon, want) {
180 t.Errorf("favicon.svg missing %q:\n%s", want, icon)
181 }
182 }
183 }
184
185 // Every page carries its own card, so a pasted docs link previews as that
186 // page rather than as the site.
187 func TestBuildWritesACardPerPage(t *testing.T) {
188 out := buildTree(t, "")
189 names := []string{"home", "docs", "dl", "roadmap"}
190 names = append(names, pages...)
191 for _, name := range names {
192 path := filepath.Join(out, "og", name+".png")
193 f, err := os.Open(path)
194 if err != nil {
195 t.Errorf("no card for %q: %v", name, err)
196 continue
197 }
198 cfg, format, err := image.DecodeConfig(f)
199 f.Close()
200 if err != nil {
201 t.Errorf("%s: %v", path, err)
202 continue
203 }
204 if format != "png" || cfg.Width != 1200 || cfg.Height != 630 {
205 t.Errorf("%s: %s %dx%d, want png 1200x630", path, format, cfg.Width, cfg.Height)
206 }
207 }
208 }
209
210 // Scrapers fetch og:image on its own: a relative path would resolve against
211 // their host, not ours.
212 func TestBuildAdvertisesAbsolutePreviewURLs(t *testing.T) {
213 out := buildTree(t, "")
214 for page, want := range map[string][]string{
215 "index.html": {`content="https://eitri.test/og/home.png"`, `content="https://eitri.test/"`},
216 "docs/quickstart/index.html": {`content="https://eitri.test/og/quickstart.png"`, `content="https://eitri.test/docs/quickstart/"`},
217 "dl/index.html": {`content="https://eitri.test/og/dl.png"`, `content="https://eitri.test/dl/"`},
218 } {
219 html := read(t, filepath.Join(out, page))
220 for _, w := range want {
221 if !strings.Contains(html, w) {
222 t.Errorf("%s missing %s:\n%s", page, w, html)
223 }
224 }
225 }
226 }
227
228 // A local preview has no address to speak of, so its links stay relative.
229 func TestBuildLeavesPreviewLinksRelativeWithoutABase(t *testing.T) {
230 out := buildTreeAt(t, "", "")
231 html := read(t, filepath.Join(out, "index.html"))
232 for _, want := range []string{`content="/og/home.png"`, `content="/"`} {
233 if !strings.Contains(html, want) {
234 t.Errorf("index.html missing %s:\n%s", want, html)
235 }
236 }
237 }
238
239 // The description comes from the page's own opening prose.
240 func TestBuildDescribesEachPageFromItsProse(t *testing.T) {
241 out := buildTree(t, "")
242 html := read(t, filepath.Join(out, "docs", "faq", "index.html"))
243 if !strings.Contains(html, `name="description" content="body"`) {
244 t.Errorf("faq page not described from its prose:\n%s", html)
245 }
246 }
site/favicon.svg
Old New
@@ -1,7 +0,0 @@
1 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2 <style>
3 path { fill: #1a1a1a; }
4 @media (prefers-color-scheme: dark) { path { fill: #ececec; } }
5 </style>
6 <path d="M29 7 H10 C5.5 7 2 8.5 2 10.5 C2 11.5 3.2 12 5 12 H13 V16 C13 18.5 11.5 20 9.5 21 C8.5 21.5 8 22 8 23 V25 H26 V23 C26 22 25.5 21.5 24.5 21 C22.5 20 21 18.5 21 16 V12 H28 C28.6 12 29 11.6 29 11 Z"/>
7 </svg>
site/style.css
Old New
@@ -1,6 +1,11 @@
1 * { margin: 0; padding: 0; box-sizing: border-box; } 1 * { margin: 0; padding: 0; box-sizing: border-box; }
2 2
3 /* The tab icon inverts with the reader's theme; the page follows it. */
4 :root { color-scheme: light dark; }
5
3 body { 6 body {
7 background: #ffffff;
8 color: #1a1a1a;
4 font-family: monospace; 9 font-family: monospace;
5 max-width: 72ch; 10 max-width: 72ch;
6 margin: 0 auto; 11 margin: 0 auto;
@@ -8,6 +13,10 @@ body {
8 line-height: 1.5; 13 line-height: 1.5;
9 } 14 }
10 15
16 @media (prefers-color-scheme: dark) {
17 body { background: #1a1a1a; color: #ececec; }
18 }
19
11 a { color: inherit; } 20 a { color: inherit; }
12 21
13 nav { margin-bottom: 2em; } 22 nav { margin-bottom: 2em; }
site/template.html
Old New
@@ -4,8 +4,22 @@
4 <meta charset="utf-8"> 4 <meta charset="utf-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1"> 5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <title>{{.Title}}</title> 6 <title>{{.Title}}</title>
7 <meta name="description" content="{{.Description}}">
8 <link rel="canonical" href="{{.URL}}">
7 <link rel="stylesheet" href="/style.css"> 9 <link rel="stylesheet" href="/style.css">
8 <link rel="icon" href="/favicon.svg"> 10 <link rel="icon" href="/favicon.svg">
11
12 <!-- What a chat client or a timeline shows when someone pastes the link. -->
13 <meta property="og:type" content="website">
14 <meta property="og:site_name" content="eitri">
15 <meta property="og:title" content="{{.Title}}">
16 <meta property="og:description" content="{{.Description}}">
17 <meta property="og:url" content="{{.URL}}">
18 <meta property="og:image" content="{{.Image}}">
19 <meta property="og:image:width" content="1200">
20 <meta property="og:image:height" content="630">
21 <meta property="og:image:alt" content="[E] eitri.sh — the cloud you already own">
22 <meta name="twitter:card" content="summary_large_image">
9 </head> 23 </head>
10 <body> 24 <body>
11 25
@@ -13,7 +27,7 @@
13 <a href="/"{{if eq .Section "home"}} class="active"{{end}}>home</a> 27 <a href="/"{{if eq .Section "home"}} class="active"{{end}}>home</a>
14 <a href="/docs/"{{if eq .Section "docs"}} class="active"{{end}}>docs</a> 28 <a href="/docs/"{{if eq .Section "docs"}} class="active"{{end}}>docs</a>
15 <a href="/dl/"{{if eq .Section "dl"}} class="active"{{end}}>downloads</a> 29 <a href="/dl/"{{if eq .Section "dl"}} class="active"{{end}}>downloads</a>
16 <a href="https://console.eitri.sh"{{if eq .Section "console"}} class="active"{{end}}>sign in</a> 30 <a href="https://console.eitri.sh">sign in</a>
17 </nav> 31 </nav>
18 32
19 {{.Content}} 33 {{.Content}}